ide: use DIV_ROUND_UP
[safe/jmp/linux-2.6] / net / sctp / ipv6.c
index 1937be5..e45e44c 100644 (file)
@@ -110,8 +110,9 @@ static int sctp_inet6addr_event(struct notifier_block *this, unsigned long ev,
                spin_lock_bh(&sctp_local_addr_lock);
                list_for_each_entry_safe(addr, temp,
                                        &sctp_local_addr_list, list) {
-                       if (ipv6_addr_equal(&addr->a.v6.sin6_addr,
-                                            &ifa->addr)) {
+                       if (addr->a.sa.sa_family == AF_INET6 &&
+                                       ipv6_addr_equal(&addr->a.v6.sin6_addr,
+                                               &ifa->addr)) {
                                found = 1;
                                addr->valid = 0;
                                list_del_rcu(&addr->list);
@@ -316,7 +317,9 @@ static void sctp_v6_get_saddr(struct sctp_association *asoc,
 
        if (!asoc) {
                ipv6_dev_get_saddr(dst ? ip6_dst_idev(dst)->dev : NULL,
-                                  &daddr->v6.sin6_addr, &saddr->v6.sin6_addr);
+                                  &daddr->v6.sin6_addr,
+                                  inet6_sk(asoc->base.sk)->srcprefs,
+                                  &saddr->v6.sin6_addr);
                SCTP_DEBUG_PRINTK("saddr from ipv6_get_saddr: " NIP6_FMT "\n",
                                  NIP6(saddr->v6.sin6_addr));
                return;
@@ -634,7 +637,7 @@ static struct sock *sctp_v6_create_accept_sk(struct sock *sk,
        struct ipv6_pinfo *newnp, *np = inet6_sk(sk);
        struct sctp6_sock *newsctp6sk;
 
-       newsk = sk_alloc(sk->sk_net, PF_INET6, GFP_KERNEL, sk->sk_prot);
+       newsk = sk_alloc(sock_net(sk), PF_INET6, GFP_KERNEL, sk->sk_prot);
        if (!newsk)
                goto out;
 
@@ -1015,15 +1018,24 @@ static struct sctp_pf sctp_pf_inet6 = {
 };
 
 /* Initialize IPv6 support and register with socket layer.  */
-int sctp_v6_init(void)
+void sctp_v6_pf_init(void)
 {
-       int rc;
-
        /* Register the SCTP specific PF_INET6 functions. */
        sctp_register_pf(&sctp_pf_inet6, PF_INET6);
 
        /* Register the SCTP specific AF_INET6 functions. */
        sctp_register_af(&sctp_af_inet6);
+}
+
+void sctp_v6_pf_exit(void)
+{
+       list_del(&sctp_af_inet6.list);
+}
+
+/* Initialize IPv6 support and register with socket layer.  */
+int sctp_v6_protosw_init(void)
+{
+       int rc;
 
        rc = proto_register(&sctpv6_prot, 1);
        if (rc)
@@ -1036,6 +1048,14 @@ int sctp_v6_init(void)
        return 0;
 }
 
+void sctp_v6_protosw_exit(void)
+{
+       inet6_unregister_protosw(&sctpv6_seqpacket_protosw);
+       inet6_unregister_protosw(&sctpv6_stream_protosw);
+       proto_unregister(&sctpv6_prot);
+}
+
+
 /* Register with inet6 layer. */
 int sctp_v6_add_protocol(void)
 {
@@ -1048,15 +1068,6 @@ int sctp_v6_add_protocol(void)
        return 0;
 }
 
-/* IPv6 specific exit support. */
-void sctp_v6_exit(void)
-{
-       inet6_unregister_protosw(&sctpv6_seqpacket_protosw);
-       inet6_unregister_protosw(&sctpv6_stream_protosw);
-       proto_unregister(&sctpv6_prot);
-       list_del(&sctp_af_inet6.list);
-}
-
 /* Unregister with inet6 layer. */
 void sctp_v6_del_protocol(void)
 {