aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/net/ipv6.h9
-rw-r--r--include/net/udp.h25
-rw-r--r--include/net/udplite.h3
-rw-r--r--net/ipv4/udp.c6
-rw-r--r--net/ipv6/proc.c1
-rw-r--r--net/ipv6/udp.c2
-rw-r--r--net/rxrpc/ar-input.c4
-rw-r--r--net/sunrpc/xprtsock.c6
8 files changed, 42 insertions, 14 deletions
diff --git a/include/net/ipv6.h b/include/net/ipv6.h
index e90f9625cb1b..a84f3f697a34 100644
--- a/include/net/ipv6.h
+++ b/include/net/ipv6.h
@@ -164,15 +164,6 @@ DECLARE_SNMP_STAT(struct icmpv6msg_mib, icmpv6msg_statistics);
164#define ICMP6MSGIN_INC_STATS_USER(idev, field) \ 164#define ICMP6MSGIN_INC_STATS_USER(idev, field) \
165 _DEVINC(icmpv6msg, _USER, idev, field) 165 _DEVINC(icmpv6msg, _USER, idev, field)
166 166
167DECLARE_SNMP_STAT(struct udp_mib, udp_stats_in6);
168DECLARE_SNMP_STAT(struct udp_mib, udplite_stats_in6);
169#define UDP6_INC_STATS_BH(field, is_udplite) do { \
170 if (is_udplite) SNMP_INC_STATS_BH(udplite_stats_in6, field); \
171 else SNMP_INC_STATS_BH(udp_stats_in6, field); } while(0)
172#define UDP6_INC_STATS_USER(field, is_udplite) do { \
173 if (is_udplite) SNMP_INC_STATS_USER(udplite_stats_in6, field); \
174 else SNMP_INC_STATS_USER(udp_stats_in6, field); } while(0)
175
176struct ip6_ra_chain 167struct ip6_ra_chain
177{ 168{
178 struct ip6_ra_chain *next; 169 struct ip6_ra_chain *next;
diff --git a/include/net/udp.h b/include/net/udp.h
index 98755ebaf163..98cb09ca3a27 100644
--- a/include/net/udp.h
+++ b/include/net/udp.h
@@ -139,6 +139,12 @@ extern int udp_lib_setsockopt(struct sock *sk, int level, int optname,
139 int (*push_pending_frames)(struct sock *)); 139 int (*push_pending_frames)(struct sock *));
140 140
141DECLARE_SNMP_STAT(struct udp_mib, udp_statistics); 141DECLARE_SNMP_STAT(struct udp_mib, udp_statistics);
142DECLARE_SNMP_STAT(struct udp_mib, udp_stats_in6);
143
144/* UDP-Lite does not have a standardized MIB yet, so we inherit from UDP */
145DECLARE_SNMP_STAT(struct udp_mib, udplite_statistics);
146DECLARE_SNMP_STAT(struct udp_mib, udplite_stats_in6);
147
142/* 148/*
143 * SNMP statistics for UDP and UDP-Lite 149 * SNMP statistics for UDP and UDP-Lite
144 */ 150 */
@@ -149,6 +155,25 @@ DECLARE_SNMP_STAT(struct udp_mib, udp_statistics);
149 if (is_udplite) SNMP_INC_STATS_BH(udplite_statistics, field); \ 155 if (is_udplite) SNMP_INC_STATS_BH(udplite_statistics, field); \
150 else SNMP_INC_STATS_BH(udp_statistics, field); } while(0) 156 else SNMP_INC_STATS_BH(udp_statistics, field); } while(0)
151 157
158#define UDP6_INC_STATS_BH(field, is_udplite) do { \
159 if (is_udplite) SNMP_INC_STATS_BH(udplite_stats_in6, field); \
160 else SNMP_INC_STATS_BH(udp_stats_in6, field); } while(0)
161#define UDP6_INC_STATS_USER(field, is_udplite) do { \
162 if (is_udplite) SNMP_INC_STATS_USER(udplite_stats_in6, field); \
163 else SNMP_INC_STATS_USER(udp_stats_in6, field); } while(0)
164
165#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
166#define UDPX_INC_STATS_BH(sk, field) \
167 do { \
168 if ((sk)->sk_family == AF_INET) \
169 UDP_INC_STATS_BH(field, 0); \
170 else \
171 UDP6_INC_STATS_BH(field, 0); \
172 } while (0);
173#else
174#define UDPX_INC_STATS_BH(sk, field) UDP_INC_STATS_BH(field, 0)
175#endif
176
152/* /proc */ 177/* /proc */
153struct udp_seq_afinfo { 178struct udp_seq_afinfo {
154 struct module *owner; 179 struct module *owner;
diff --git a/include/net/udplite.h b/include/net/udplite.h
index 635b0eafca95..b76b2e377af4 100644
--- a/include/net/udplite.h
+++ b/include/net/udplite.h
@@ -13,9 +13,6 @@
13extern struct proto udplite_prot; 13extern struct proto udplite_prot;
14extern struct hlist_head udplite_hash[UDP_HTABLE_SIZE]; 14extern struct hlist_head udplite_hash[UDP_HTABLE_SIZE];
15 15
16/* UDP-Lite does not have a standardized MIB yet, so we inherit from UDP */
17DECLARE_SNMP_STAT(struct udp_mib, udplite_statistics);
18
19/* 16/*
20 * Checksum computation is all in software, hence simpler getfrag. 17 * Checksum computation is all in software, hence simpler getfrag.
21 */ 18 */
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
index f50de5d5218d..78cfcb4a1b3f 100644
--- a/net/ipv4/udp.c
+++ b/net/ipv4/udp.c
@@ -110,6 +110,7 @@
110 */ 110 */
111 111
112DEFINE_SNMP_STAT(struct udp_mib, udp_statistics) __read_mostly; 112DEFINE_SNMP_STAT(struct udp_mib, udp_statistics) __read_mostly;
113EXPORT_SYMBOL(udp_statistics);
113 114
114struct hlist_head udp_hash[UDP_HTABLE_SIZE]; 115struct hlist_head udp_hash[UDP_HTABLE_SIZE];
115DEFINE_RWLOCK(udp_hash_lock); 116DEFINE_RWLOCK(udp_hash_lock);
@@ -969,8 +970,11 @@ int udp_queue_rcv_skb(struct sock * sk, struct sk_buff *skb)
969 int ret; 970 int ret;
970 971
971 ret = (*up->encap_rcv)(sk, skb); 972 ret = (*up->encap_rcv)(sk, skb);
972 if (ret <= 0) 973 if (ret <= 0) {
974 UDP_INC_STATS_BH(UDP_MIB_INDATAGRAMS,
975 is_udplite);
973 return -ret; 976 return -ret;
977 }
974 } 978 }
975 979
976 /* FALLTHROUGH -- it's a UDP Packet */ 980 /* FALLTHROUGH -- it's a UDP Packet */
diff --git a/net/ipv6/proc.c b/net/ipv6/proc.c
index 44937616057e..41e9980b3e0e 100644
--- a/net/ipv6/proc.c
+++ b/net/ipv6/proc.c
@@ -27,6 +27,7 @@
27#include <net/ip.h> 27#include <net/ip.h>
28#include <net/sock.h> 28#include <net/sock.h>
29#include <net/tcp.h> 29#include <net/tcp.h>
30#include <net/udp.h>
30#include <net/transp_v6.h> 31#include <net/transp_v6.h>
31#include <net/ipv6.h> 32#include <net/ipv6.h>
32 33
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c
index 87bccec9882a..36bdcd2e1b52 100644
--- a/net/ipv6/udp.c
+++ b/net/ipv6/udp.c
@@ -34,6 +34,7 @@
34#include <linux/ipv6.h> 34#include <linux/ipv6.h>
35#include <linux/icmpv6.h> 35#include <linux/icmpv6.h>
36#include <linux/init.h> 36#include <linux/init.h>
37#include <linux/module.h>
37#include <linux/skbuff.h> 38#include <linux/skbuff.h>
38#include <asm/uaccess.h> 39#include <asm/uaccess.h>
39 40
@@ -51,6 +52,7 @@
51#include "udp_impl.h" 52#include "udp_impl.h"
52 53
53DEFINE_SNMP_STAT(struct udp_mib, udp_stats_in6) __read_mostly; 54DEFINE_SNMP_STAT(struct udp_mib, udp_stats_in6) __read_mostly;
55EXPORT_SYMBOL(udp_stats_in6);
54 56
55static inline int udp_v6_get_port(struct sock *sk, unsigned short snum) 57static inline int udp_v6_get_port(struct sock *sk, unsigned short snum)
56{ 58{
diff --git a/net/rxrpc/ar-input.c b/net/rxrpc/ar-input.c
index 91b5bbb003e2..f446d9b9925f 100644
--- a/net/rxrpc/ar-input.c
+++ b/net/rxrpc/ar-input.c
@@ -20,6 +20,7 @@
20#include <net/sock.h> 20#include <net/sock.h>
21#include <net/af_rxrpc.h> 21#include <net/af_rxrpc.h>
22#include <net/ip.h> 22#include <net/ip.h>
23#include <net/udp.h>
23#include "ar-internal.h" 24#include "ar-internal.h"
24 25
25unsigned long rxrpc_ack_timeout = 1; 26unsigned long rxrpc_ack_timeout = 1;
@@ -707,10 +708,13 @@ void rxrpc_data_ready(struct sock *sk, int count)
707 if (skb_checksum_complete(skb)) { 708 if (skb_checksum_complete(skb)) {
708 rxrpc_free_skb(skb); 709 rxrpc_free_skb(skb);
709 rxrpc_put_local(local); 710 rxrpc_put_local(local);
711 UDP_INC_STATS_BH(UDP_MIB_INERRORS, 0);
710 _leave(" [CSUM failed]"); 712 _leave(" [CSUM failed]");
711 return; 713 return;
712 } 714 }
713 715
716 UDP_INC_STATS_BH(UDP_MIB_INDATAGRAMS, 0);
717
714 /* the socket buffer we have is owned by UDP, with UDP's data all over 718 /* the socket buffer we have is owned by UDP, with UDP's data all over
715 * it, but we really want our own */ 719 * it, but we really want our own */
716 skb_orphan(skb); 720 skb_orphan(skb);
diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c
index 2f630a512ab7..6fa52f44de0f 100644
--- a/net/sunrpc/xprtsock.c
+++ b/net/sunrpc/xprtsock.c
@@ -838,8 +838,12 @@ static void xs_udp_data_ready(struct sock *sk, int len)
838 copied = repsize; 838 copied = repsize;
839 839
840 /* Suck it into the iovec, verify checksum if not done by hw. */ 840 /* Suck it into the iovec, verify checksum if not done by hw. */
841 if (csum_partial_copy_to_xdr(&rovr->rq_private_buf, skb)) 841 if (csum_partial_copy_to_xdr(&rovr->rq_private_buf, skb)) {
842 UDPX_INC_STATS_BH(sk, UDP_MIB_INERRORS);
842 goto out_unlock; 843 goto out_unlock;
844 }
845
846 UDPX_INC_STATS_BH(sk, UDP_MIB_INDATAGRAMS);
843 847
844 /* Something worked... */ 848 /* Something worked... */
845 dst_confirm(skb->dst); 849 dst_confirm(skb->dst);