[UDP]: Restore missing inDatagrams increments
authorHerbert Xu <herbert@gondor.apana.org.au>
Tue, 11 Dec 2007 19:30:32 +0000 (11:30 -0800)
committerDavid S. Miller <davem@davemloft.net>
Mon, 28 Jan 2008 22:56:33 +0000 (14:56 -0800)
The previous move of the the UDP inDatagrams counter caused the
counting of encapsulated packets, SUNRPC data (as opposed to call)
packets and RXRPC packets to go missing.

This patch restores all of these.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/ipv6.h
include/net/udp.h
include/net/udplite.h
net/ipv4/udp.c
net/ipv6/proc.c
net/ipv6/udp.c
net/rxrpc/ar-input.c
net/sunrpc/xprtsock.c

index e90f9625cb1b211bb591fc2d02513d1ec85aba79..a84f3f697a34c759ece221f1ed0496049d400b9f 100644 (file)
@@ -164,15 +164,6 @@ DECLARE_SNMP_STAT(struct icmpv6msg_mib, icmpv6msg_statistics);
 #define ICMP6MSGIN_INC_STATS_USER(idev, field) \
        _DEVINC(icmpv6msg, _USER, idev, field)
 
-DECLARE_SNMP_STAT(struct udp_mib, udp_stats_in6);
-DECLARE_SNMP_STAT(struct udp_mib, udplite_stats_in6);
-#define UDP6_INC_STATS_BH(field, is_udplite)                         do  {  \
-       if (is_udplite) SNMP_INC_STATS_BH(udplite_stats_in6, field);         \
-       else            SNMP_INC_STATS_BH(udp_stats_in6, field);    } while(0)
-#define UDP6_INC_STATS_USER(field, is_udplite)                        do {    \
-       if (is_udplite) SNMP_INC_STATS_USER(udplite_stats_in6, field);         \
-       else            SNMP_INC_STATS_USER(udp_stats_in6, field);    } while(0)
-
 struct ip6_ra_chain
 {
        struct ip6_ra_chain     *next;
index 98755ebaf163cfe788b4117167cfeaf1a861f269..98cb09ca3a27e548c108d63f986a4b2084139145 100644 (file)
@@ -139,6 +139,12 @@ extern int         udp_lib_setsockopt(struct sock *sk, int level, int optname,
                                   int (*push_pending_frames)(struct sock *));
 
 DECLARE_SNMP_STAT(struct udp_mib, udp_statistics);
+DECLARE_SNMP_STAT(struct udp_mib, udp_stats_in6);
+
+/* UDP-Lite does not have a standardized MIB yet, so we inherit from UDP */
+DECLARE_SNMP_STAT(struct udp_mib, udplite_statistics);
+DECLARE_SNMP_STAT(struct udp_mib, udplite_stats_in6);
+
 /*
  *     SNMP statistics for UDP and UDP-Lite
  */
@@ -149,6 +155,25 @@ DECLARE_SNMP_STAT(struct udp_mib, udp_statistics);
        if (is_udplite) SNMP_INC_STATS_BH(udplite_statistics, field);         \
        else            SNMP_INC_STATS_BH(udp_statistics, field);    }  while(0)
 
+#define UDP6_INC_STATS_BH(field, is_udplite)                         do  {  \
+       if (is_udplite) SNMP_INC_STATS_BH(udplite_stats_in6, field);         \
+       else            SNMP_INC_STATS_BH(udp_stats_in6, field);    } while(0)
+#define UDP6_INC_STATS_USER(field, is_udplite)                        do {    \
+       if (is_udplite) SNMP_INC_STATS_USER(udplite_stats_in6, field);         \
+       else            SNMP_INC_STATS_USER(udp_stats_in6, field);    } while(0)
+
+#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
+#define UDPX_INC_STATS_BH(sk, field) \
+       do { \
+               if ((sk)->sk_family == AF_INET) \
+                       UDP_INC_STATS_BH(field, 0); \
+               else \
+                       UDP6_INC_STATS_BH(field, 0); \
+       } while (0);
+#else
+#define UDPX_INC_STATS_BH(sk, field) UDP_INC_STATS_BH(field, 0)
+#endif
+
 /* /proc */
 struct udp_seq_afinfo {
        struct module           *owner;
index 635b0eafca95d256e789edb0323cbb8aef759f4f..b76b2e377af4540bc8336328f55485d87a26947b 100644 (file)
@@ -13,9 +13,6 @@
 extern struct proto            udplite_prot;
 extern struct hlist_head       udplite_hash[UDP_HTABLE_SIZE];
 
-/* UDP-Lite does not have a standardized MIB yet, so we inherit from UDP */
-DECLARE_SNMP_STAT(struct udp_mib, udplite_statistics);
-
 /*
  *     Checksum computation is all in software, hence simpler getfrag.
  */
index f50de5d5218ddce45c578f6f05a78de5e13ea8c0..78cfcb4a1b3fc0d69718392b6252c816fe445b6c 100644 (file)
  */
 
 DEFINE_SNMP_STAT(struct udp_mib, udp_statistics) __read_mostly;
+EXPORT_SYMBOL(udp_statistics);
 
 struct hlist_head udp_hash[UDP_HTABLE_SIZE];
 DEFINE_RWLOCK(udp_hash_lock);
@@ -969,8 +970,11 @@ int udp_queue_rcv_skb(struct sock * sk, struct sk_buff *skb)
                        int ret;
 
                        ret = (*up->encap_rcv)(sk, skb);
-                       if (ret <= 0)
+                       if (ret <= 0) {
+                               UDP_INC_STATS_BH(UDP_MIB_INDATAGRAMS,
+                                                is_udplite);
                                return -ret;
+                       }
                }
 
                /* FALLTHROUGH -- it's a UDP Packet */
index 44937616057e77fb8d5fc61272ad7f1a30f9a8d2..41e9980b3e0ebbb8612cc8d177a7b7a9059bbee0 100644 (file)
@@ -27,6 +27,7 @@
 #include <net/ip.h>
 #include <net/sock.h>
 #include <net/tcp.h>
+#include <net/udp.h>
 #include <net/transp_v6.h>
 #include <net/ipv6.h>
 
index 87bccec9882a4f8a4dad00d18897b09f1b088b71..36bdcd2e1b52ccfc8ff8d294e35d88a8c4e36277 100644 (file)
@@ -34,6 +34,7 @@
 #include <linux/ipv6.h>
 #include <linux/icmpv6.h>
 #include <linux/init.h>
+#include <linux/module.h>
 #include <linux/skbuff.h>
 #include <asm/uaccess.h>
 
@@ -51,6 +52,7 @@
 #include "udp_impl.h"
 
 DEFINE_SNMP_STAT(struct udp_mib, udp_stats_in6) __read_mostly;
+EXPORT_SYMBOL(udp_stats_in6);
 
 static inline int udp_v6_get_port(struct sock *sk, unsigned short snum)
 {
index 91b5bbb003e26b53496cfda72b687e009487e9ba..f446d9b9925fe950b574ca085f704a7d017b1ba3 100644 (file)
@@ -20,6 +20,7 @@
 #include <net/sock.h>
 #include <net/af_rxrpc.h>
 #include <net/ip.h>
+#include <net/udp.h>
 #include "ar-internal.h"
 
 unsigned long rxrpc_ack_timeout = 1;
@@ -707,10 +708,13 @@ void rxrpc_data_ready(struct sock *sk, int count)
        if (skb_checksum_complete(skb)) {
                rxrpc_free_skb(skb);
                rxrpc_put_local(local);
+               UDP_INC_STATS_BH(UDP_MIB_INERRORS, 0);
                _leave(" [CSUM failed]");
                return;
        }
 
+       UDP_INC_STATS_BH(UDP_MIB_INDATAGRAMS, 0);
+
        /* the socket buffer we have is owned by UDP, with UDP's data all over
         * it, but we really want our own */
        skb_orphan(skb);
index 2f630a512ab753f7e2df18a42a2abb02f04893ba..6fa52f44de0fd1b43f8630ae7d50ef0805be06a1 100644 (file)
@@ -838,8 +838,12 @@ static void xs_udp_data_ready(struct sock *sk, int len)
                copied = repsize;
 
        /* Suck it into the iovec, verify checksum if not done by hw. */
-       if (csum_partial_copy_to_xdr(&rovr->rq_private_buf, skb))
+       if (csum_partial_copy_to_xdr(&rovr->rq_private_buf, skb)) {
+               UDPX_INC_STATS_BH(sk, UDP_MIB_INERRORS);
                goto out_unlock;
+       }
+
+       UDPX_INC_STATS_BH(sk, UDP_MIB_INDATAGRAMS);
 
        /* Something worked... */
        dst_confirm(skb->dst);