]> Pileus Git - ~andy/linux/blobdiff - net/ipv6/af_inet6.c
ipv6: make lookups simpler and faster
[~andy/linux] / net / ipv6 / af_inet6.c
index 136fe55c1a471c72a959fbb33add244416fc93f6..a2cb07cd385032a0e4212d351c32950729eb1e8b 100644 (file)
@@ -364,7 +364,7 @@ int inet6_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
        inet->inet_rcv_saddr = v4addr;
        inet->inet_saddr = v4addr;
 
-       np->rcv_saddr = addr->sin6_addr;
+       sk->sk_v6_rcv_saddr = addr->sin6_addr;
 
        if (!(addr_type & IPV6_ADDR_MULTICAST))
                np->saddr = addr->sin6_addr;
@@ -461,14 +461,14 @@ int inet6_getname(struct socket *sock, struct sockaddr *uaddr,
                    peer == 1)
                        return -ENOTCONN;
                sin->sin6_port = inet->inet_dport;
-               sin->sin6_addr = np->daddr;
+               sin->sin6_addr = sk->sk_v6_daddr;
                if (np->sndflow)
                        sin->sin6_flowinfo = np->flow_label;
        } else {
-               if (ipv6_addr_any(&np->rcv_saddr))
+               if (ipv6_addr_any(&sk->sk_v6_rcv_saddr))
                        sin->sin6_addr = np->saddr;
                else
-                       sin->sin6_addr = np->rcv_saddr;
+                       sin->sin6_addr = sk->sk_v6_rcv_saddr;
 
                sin->sin6_port = inet->inet_sport;
        }
@@ -655,7 +655,7 @@ int inet6_sk_rebuild_header(struct sock *sk)
 
                memset(&fl6, 0, sizeof(fl6));
                fl6.flowi6_proto = sk->sk_protocol;
-               fl6.daddr = np->daddr;
+               fl6.daddr = sk->sk_v6_daddr;
                fl6.saddr = np->saddr;
                fl6.flowlabel = np->flow_label;
                fl6.flowi6_oif = sk->sk_bound_dev_if;
@@ -915,6 +915,9 @@ static int __init inet6_init(void)
        err = ip6_route_init();
        if (err)
                goto ip6_route_fail;
+       err = ndisc_late_init();
+       if (err)
+               goto ndisc_late_fail;
        err = ip6_flowlabel_init();
        if (err)
                goto ip6_flowlabel_fail;
@@ -981,6 +984,8 @@ ipv6_exthdrs_fail:
 addrconf_fail:
        ip6_flowlabel_cleanup();
 ip6_flowlabel_fail:
+       ndisc_late_cleanup();
+ndisc_late_fail:
        ip6_route_cleanup();
 ip6_route_fail:
 #ifdef CONFIG_PROC_FS
@@ -1023,51 +1028,4 @@ out_unregister_tcp_proto:
 }
 module_init(inet6_init);
 
-static void __exit inet6_exit(void)
-{
-       if (disable_ipv6_mod)
-               return;
-
-       /* First of all disallow new sockets creation. */
-       sock_unregister(PF_INET6);
-       /* Disallow any further netlink messages */
-       rtnl_unregister_all(PF_INET6);
-
-       udpv6_exit();
-       udplitev6_exit();
-       tcpv6_exit();
-
-       /* Cleanup code parts. */
-       ipv6_packet_cleanup();
-       ipv6_frag_exit();
-       ipv6_exthdrs_exit();
-       addrconf_cleanup();
-       ip6_flowlabel_cleanup();
-       ip6_route_cleanup();
-#ifdef CONFIG_PROC_FS
-
-       /* Cleanup code parts. */
-       if6_proc_exit();
-       ipv6_misc_proc_exit();
-       udplite6_proc_exit();
-       raw6_proc_exit();
-#endif
-       ipv6_netfilter_fini();
-       ipv6_stub = NULL;
-       igmp6_cleanup();
-       ndisc_cleanup();
-       ip6_mr_cleanup();
-       icmpv6_cleanup();
-       rawv6_exit();
-
-       unregister_pernet_subsys(&inet6_net_ops);
-       proto_unregister(&rawv6_prot);
-       proto_unregister(&udplitev6_prot);
-       proto_unregister(&udpv6_prot);
-       proto_unregister(&tcpv6_prot);
-
-       rcu_barrier(); /* Wait for completion of call_rcu()'s */
-}
-module_exit(inet6_exit);
-
 MODULE_ALIAS_NETPROTO(PF_INET6);