net/ipv6/udp: UDP encapsulation: break backlog_rcv into __udpv6_queue_rcv_skb
authorBenjamin LaHaise <bcrl@kvack.org>
Fri, 27 Apr 2012 08:23:21 +0000 (08:23 +0000)
committerDavid S. Miller <davem@davemloft.net>
Sun, 29 Apr 2012 02:21:50 +0000 (22:21 -0400)
This is the first step in reworking the IPv6 UDP code to be structured more
like the IPv4 UDP code.  This patch creates __udpv6_queue_rcv_skb() with
the equivalent sematics to __udp_queue_rcv_skb(), and wires it up to the
backlog_rcv method.

Signed-off-by: Benjamin LaHaise <bcrl@kvack.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv6/udp.c

index d39bbc9e06222d821048e7ced5d2e4b02dac6db1..6c0367ff7be7dc42d49cbef75702a90c9b1923cd 100644 (file)
@@ -496,6 +496,28 @@ out:
        sock_put(sk);
 }
 
+static int __udpv6_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
+{
+       int rc;
+
+       if (!ipv6_addr_any(&inet6_sk(sk)->daddr))
+               sock_rps_save_rxhash(sk, skb);
+
+       rc = sock_queue_rcv_skb(sk, skb);
+       if (rc < 0) {
+               int is_udplite = IS_UDPLITE(sk);
+
+               /* Note that an ENOMEM error is charged twice */
+               if (rc == -ENOMEM)
+                       UDP6_INC_STATS_BH(sock_net(sk),
+                                       UDP_MIB_RCVBUFERRORS, is_udplite);
+               UDP6_INC_STATS_BH(sock_net(sk), UDP_MIB_INERRORS, is_udplite);
+               kfree_skb(skb);
+               return -1;
+       }
+       return 0;
+}
+
 static __inline__ void udpv6_err(struct sk_buff *skb,
                                 struct inet6_skb_parm *opt, u8 type,
                                 u8 code, int offset, __be32 info     )
@@ -503,15 +525,12 @@ static __inline__ void udpv6_err(struct sk_buff *skb,
        __udp6_lib_err(skb, opt, type, code, offset, info, &udp_table);
 }
 
-int udpv6_queue_rcv_skb(struct sock * sk, struct sk_buff *skb)
+int udpv6_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
 {
        struct udp_sock *up = udp_sk(sk);
        int rc;
        int is_udplite = IS_UDPLITE(sk);
 
-       if (!ipv6_addr_any(&inet6_sk(sk)->daddr))
-               sock_rps_save_rxhash(sk, skb);
-
        if (!xfrm6_policy_check(sk, XFRM_POLICY_IN, skb))
                goto drop;
 
@@ -540,19 +559,12 @@ int udpv6_queue_rcv_skb(struct sock * sk, struct sk_buff *skb)
        }
 
        skb_dst_drop(skb);
-       rc = sock_queue_rcv_skb(sk, skb);
-       if (rc < 0) {
-               /* Note that an ENOMEM error is charged twice */
-               if (rc == -ENOMEM)
-                       UDP6_INC_STATS_BH(sock_net(sk),
-                                       UDP_MIB_RCVBUFERRORS, is_udplite);
-               goto drop_no_sk_drops_inc;
-       }
 
-       return 0;
+       rc = __udpv6_queue_rcv_skb(sk, skb);
+
+       return rc;
 drop:
        atomic_inc(&sk->sk_drops);
-drop_no_sk_drops_inc:
        UDP6_INC_STATS_BH(sock_net(sk), UDP_MIB_INERRORS, is_udplite);
        kfree_skb(skb);
        return -1;
@@ -1471,7 +1483,7 @@ struct proto udpv6_prot = {
        .getsockopt        = udpv6_getsockopt,
        .sendmsg           = udpv6_sendmsg,
        .recvmsg           = udpv6_recvmsg,
-       .backlog_rcv       = udpv6_queue_rcv_skb,
+       .backlog_rcv       = __udpv6_queue_rcv_skb,
        .hash              = udp_lib_hash,
        .unhash            = udp_lib_unhash,
        .rehash            = udp_v6_rehash,