Skip to content

Commit

Permalink
[UDP]: Defer InDataGrams increment until recvmsg() does checksum
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Wang Chen authored and davem330 committed Jan 28, 2008
1 parent 6859d49 commit cb75994
Show file tree
Hide file tree
Showing 3 changed files with 7 additions and 6 deletions.
2 changes: 1 addition & 1 deletion Documentation/networking/udplite.txt
Original file line number Diff line number Diff line change
Expand Up @@ -236,7 +236,7 @@

This displays UDP-Lite statistics variables, whose meaning is as follows.

InDatagrams: Total number of received datagrams.
InDatagrams: The total number of datagrams delivered to users.

NoPorts: Number of packets received to an unknown port.
These cases are counted separately (not as InErrors).
Expand Down
7 changes: 3 additions & 4 deletions net/ipv4/udp.c
Original file line number Diff line number Diff line change
Expand Up @@ -873,6 +873,8 @@ int udp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
if (err)
goto out_free;

UDP_INC_STATS_USER(UDP_MIB_INDATAGRAMS, is_udplite);

sock_recv_timestamp(msg, sk, skb);

/* Copy the address. */
Expand Down Expand Up @@ -966,10 +968,8 @@ int udp_queue_rcv_skb(struct sock * sk, struct sk_buff *skb)
int ret;

ret = (*up->encap_rcv)(sk, skb);
if (ret <= 0) {
UDP_INC_STATS_BH(UDP_MIB_INDATAGRAMS, up->pcflag);
if (ret <= 0)
return -ret;
}
}

/* FALLTHROUGH -- it's a UDP Packet */
Expand Down Expand Up @@ -1023,7 +1023,6 @@ int udp_queue_rcv_skb(struct sock * sk, struct sk_buff *skb)
goto drop;
}

UDP_INC_STATS_BH(UDP_MIB_INDATAGRAMS, up->pcflag);
return 0;

drop:
Expand Down
4 changes: 3 additions & 1 deletion net/ipv6/udp.c
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,8 @@ int udpv6_recvmsg(struct kiocb *iocb, struct sock *sk,
if (err)
goto out_free;

UDP6_INC_STATS_USER(UDP_MIB_INDATAGRAMS, is_udplite);

sock_recv_timestamp(msg, sk, skb);

/* Copy the address. */
Expand Down Expand Up @@ -292,7 +294,7 @@ int udpv6_queue_rcv_skb(struct sock * sk, struct sk_buff *skb)
UDP6_INC_STATS_BH(UDP_MIB_RCVBUFERRORS, up->pcflag);
goto drop;
}
UDP6_INC_STATS_BH(UDP_MIB_INDATAGRAMS, up->pcflag);

return 0;
drop:
UDP6_INC_STATS_BH(UDP_MIB_INERRORS, up->pcflag);
Expand Down

0 comments on commit cb75994

Please sign in to comment.