net: spread __net_init, __net_exit
[safe/jmp/linux-2.6] / net / ipv6 / udp.c
index 948e823..34efb35 100644 (file)
@@ -89,7 +89,7 @@ static unsigned int udp6_portaddr_hash(struct net *net,
 
        if (ipv6_addr_any(addr6))
                hash = jhash_1word(0, mix);
-       else if (ipv6_addr_type(addr6) == IPV6_ADDR_MAPPED)
+       else if (ipv6_addr_v4mapped(addr6))
                hash = jhash_1word(addr6->s6_addr32[3], mix);
        else
                hash = jhash2(addr6->s6_addr32, 4, mix);
@@ -100,12 +100,14 @@ static unsigned int udp6_portaddr_hash(struct net *net,
 
 int udp_v6_get_port(struct sock *sk, unsigned short snum)
 {
+       unsigned int hash2_nulladdr =
+               udp6_portaddr_hash(sock_net(sk), &in6addr_any, snum);
+       unsigned int hash2_partial = 
+               udp6_portaddr_hash(sock_net(sk), &inet6_sk(sk)->rcv_saddr, 0);
+
        /* precompute partial secondary hash */
-       udp_sk(sk)->udp_portaddr_hash =
-               udp6_portaddr_hash(sock_net(sk),
-                                  &inet6_sk(sk)->rcv_saddr,
-                                  0);
-       return udp_lib_get_port(sk, snum, ipv6_rcv_saddr_equal);
+       udp_sk(sk)->udp_portaddr_hash = hash2_partial;
+       return udp_lib_get_port(sk, snum, ipv6_rcv_saddr_equal, hash2_nulladdr);
 }
 
 static inline int compute_score(struct sock *sk, struct net *net,
@@ -181,8 +183,6 @@ static inline int compute_score2(struct sock *sk, struct net *net,
        return score;
 }
 
-#define udp_portaddr_for_each_entry_rcu(__sk, node, list) \
-       hlist_nulls_for_each_entry_rcu(__sk, node, list, __sk_common.skc_portaddr_node)
 
 /* called with read_rcu_lock() */
 static struct sock *udp6_lib_lookup2(struct net *net,
@@ -579,14 +579,20 @@ static void flush_stack(struct sock **stack, unsigned int count,
        for (i = 0; i < count; i++) {
                skb1 = (i == final) ? skb : skb_clone(skb, GFP_ATOMIC);
 
+               sk = stack[i];
                if (skb1) {
-                       sk = stack[i];
                        bh_lock_sock(sk);
                        if (!sock_owned_by_user(sk))
                                udpv6_queue_rcv_skb(sk, skb1);
                        else
                                sk_add_backlog(sk, skb1);
                        bh_unlock_sock(sk);
+               } else {
+                       atomic_inc(&sk->sk_drops);
+                       UDP6_INC_STATS_BH(sock_net(sk),
+                                       UDP_MIB_RCVBUFERRORS, IS_UDPLITE(sk));
+                       UDP6_INC_STATS_BH(sock_net(sk),
+                                       UDP_MIB_INERRORS, IS_UDPLITE(sk));
                }
        }
 }
@@ -1390,7 +1396,7 @@ static struct udp_seq_afinfo udp6_seq_afinfo = {
        },
 };
 
-int udp6_proc_init(struct net *net)
+int __net_init udp6_proc_init(struct net *net)
 {
        return udp_proc_register(net, &udp6_seq_afinfo);
 }