aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWang Chen <wangchen@cn.fujitsu.com>2007-12-03 06:33:28 -0500
committerDavid S. Miller <davem@davemloft.net>2008-01-28 17:55:47 -0500
commitcb75994ec311b2cd50e5205efdcc0696abd6675d (patch)
treeeb0fbb65bfe1b896a55ce8b987d6f4f3f4357e98
parent6859d49475d4f32abe640372117e4b687906e6b6 (diff)
[UDP]: Defer InDataGrams increment until recvmsg() does checksum
Thanks dave, herbert, gerrit, andi and other people for your discussion about this problem. UdpInDatagrams can be confusing because it counts packets that might be dropped later. Move UdpInDatagrams into recvmsg() as allowed by the RFC. Signed-off-by: Wang Chen <wangchen@cn.fujitsu.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--Documentation/networking/udplite.txt2
-rw-r--r--net/ipv4/udp.c7
-rw-r--r--net/ipv6/udp.c4
3 files changed, 7 insertions, 6 deletions
diff --git a/Documentation/networking/udplite.txt b/Documentation/networking/udplite.txt
index b6409cab075c..3870f280280b 100644
--- a/Documentation/networking/udplite.txt
+++ b/Documentation/networking/udplite.txt
@@ -236,7 +236,7 @@
236 236
237 This displays UDP-Lite statistics variables, whose meaning is as follows. 237 This displays UDP-Lite statistics variables, whose meaning is as follows.
238 238
239 InDatagrams: Total number of received datagrams. 239 InDatagrams: The total number of datagrams delivered to users.
240 240
241 NoPorts: Number of packets received to an unknown port. 241 NoPorts: Number of packets received to an unknown port.
242 These cases are counted separately (not as InErrors). 242 These cases are counted separately (not as InErrors).
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
index 03c400ca14c5..3465d4ad301b 100644
--- a/net/ipv4/udp.c
+++ b/net/ipv4/udp.c
@@ -873,6 +873,8 @@ try_again:
873 if (err) 873 if (err)
874 goto out_free; 874 goto out_free;
875 875
876 UDP_INC_STATS_USER(UDP_MIB_INDATAGRAMS, is_udplite);
877
876 sock_recv_timestamp(msg, sk, skb); 878 sock_recv_timestamp(msg, sk, skb);
877 879
878 /* Copy the address. */ 880 /* Copy the address. */
@@ -966,10 +968,8 @@ int udp_queue_rcv_skb(struct sock * sk, struct sk_buff *skb)
966 int ret; 968 int ret;
967 969
968 ret = (*up->encap_rcv)(sk, skb); 970 ret = (*up->encap_rcv)(sk, skb);
969 if (ret <= 0) { 971 if (ret <= 0)
970 UDP_INC_STATS_BH(UDP_MIB_INDATAGRAMS, up->pcflag);
971 return -ret; 972 return -ret;
972 }
973 } 973 }
974 974
975 /* FALLTHROUGH -- it's a UDP Packet */ 975 /* FALLTHROUGH -- it's a UDP Packet */
@@ -1023,7 +1023,6 @@ int udp_queue_rcv_skb(struct sock * sk, struct sk_buff *skb)
1023 goto drop; 1023 goto drop;
1024 } 1024 }
1025 1025
1026 UDP_INC_STATS_BH(UDP_MIB_INDATAGRAMS, up->pcflag);
1027 return 0; 1026 return 0;
1028 1027
1029drop: 1028drop:
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c
index ee1cc3f8599f..b0474a618bbe 100644
--- a/net/ipv6/udp.c
+++ b/net/ipv6/udp.c
@@ -164,6 +164,8 @@ try_again:
164 if (err) 164 if (err)
165 goto out_free; 165 goto out_free;
166 166
167 UDP6_INC_STATS_USER(UDP_MIB_INDATAGRAMS, is_udplite);
168
167 sock_recv_timestamp(msg, sk, skb); 169 sock_recv_timestamp(msg, sk, skb);
168 170
169 /* Copy the address. */ 171 /* Copy the address. */
@@ -292,7 +294,7 @@ int udpv6_queue_rcv_skb(struct sock * sk, struct sk_buff *skb)
292 UDP6_INC_STATS_BH(UDP_MIB_RCVBUFERRORS, up->pcflag); 294 UDP6_INC_STATS_BH(UDP_MIB_RCVBUFERRORS, up->pcflag);
293 goto drop; 295 goto drop;
294 } 296 }
295 UDP6_INC_STATS_BH(UDP_MIB_INDATAGRAMS, up->pcflag); 297
296 return 0; 298 return 0;
297drop: 299drop:
298 UDP6_INC_STATS_BH(UDP_MIB_INERRORS, up->pcflag); 300 UDP6_INC_STATS_BH(UDP_MIB_INERRORS, up->pcflag);