aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/udp.c
diff options
context:
space:
mode:
authorHerbert Xu <herbert@gondor.apana.org.au>2007-12-05 04:53:40 -0500
committerDavid S. Miller <davem@davemloft.net>2008-01-28 17:56:34 -0500
commita59322be07c964e916d15be3df473fb7ba20c41e (patch)
tree16d4caa41c1fd6c3fb907ce792202b157e6c9a1e /net/ipv4/udp.c
parent1781f7f5804e52ee2d35328b129602146a8d8254 (diff)
[UDP]: Only increment counter on first peek/recv
The previous move of the the UDP inDatagrams counter caused each peek of the same packet to be counted separately. This may be undesirable. This patch fixes this by adding a bit to sk_buff to record whether this packet has already been seen through skb_recv_datagram. We then only increment the counter when the packet is seen for the first time. The only dodgy part is the fact that skb_recv_datagram doesn't have a good way of returning this new bit of information. So I've added a new function __skb_recv_datagram that does return this and made skb_recv_datagram a wrapper around it. The plan is to eventually replace all uses of skb_recv_datagram with this new function at which time it can be renamed its proper name. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/udp.c')
-rw-r--r--net/ipv4/udp.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
index 78cfcb4a1b3f..9ed6393c65d9 100644
--- a/net/ipv4/udp.c
+++ b/net/ipv4/udp.c
@@ -827,6 +827,7 @@ int udp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
827 struct sockaddr_in *sin = (struct sockaddr_in *)msg->msg_name; 827 struct sockaddr_in *sin = (struct sockaddr_in *)msg->msg_name;
828 struct sk_buff *skb; 828 struct sk_buff *skb;
829 unsigned int ulen, copied; 829 unsigned int ulen, copied;
830 int peeked;
830 int err; 831 int err;
831 int is_udplite = IS_UDPLITE(sk); 832 int is_udplite = IS_UDPLITE(sk);
832 833
@@ -840,7 +841,8 @@ int udp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
840 return ip_recv_error(sk, msg, len); 841 return ip_recv_error(sk, msg, len);
841 842
842try_again: 843try_again:
843 skb = skb_recv_datagram(sk, flags, noblock, &err); 844 skb = __skb_recv_datagram(sk, flags | (noblock ? MSG_DONTWAIT : 0),
845 &peeked, &err);
844 if (!skb) 846 if (!skb)
845 goto out; 847 goto out;
846 848
@@ -875,7 +877,8 @@ try_again:
875 if (err) 877 if (err)
876 goto out_free; 878 goto out_free;
877 879
878 UDP_INC_STATS_USER(UDP_MIB_INDATAGRAMS, is_udplite); 880 if (!peeked)
881 UDP_INC_STATS_USER(UDP_MIB_INDATAGRAMS, is_udplite);
879 882
880 sock_recv_timestamp(msg, sk, skb); 883 sock_recv_timestamp(msg, sk, skb);
881 884