Skip to contentSkip to conversation

SNMPv2 udpInDatagrams counter error

PATCH In review Wei Yongjun 2 participants 3 messages Jul 31, 2006 1 message not in the archive

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 SNMPv2 udpInDatagrams counter error

When I send a UDP datagrams with checksum error to target, I found that:
Under IPv6, counter udpInErrors increased, but under IPv4 counter udpInDatagrams increased. I lookup into the source code, and found that, under IPv4 UDP datagrams with checksum error will be delivered to UDP receive queue, but IPv6 does not. IPv4 delivered into UDP receive queue, increased udpInDatagrams, then discard it before delivered to UDP user. RFC said udpInDatagrams is the total number of UDP datagrams delivered to UDP users, so udpInDatagrams should not be increased while UDP datagrams with checksum error received.

Refer to RFC2013:
udpInDatagrams OBJECT-TYPE

      SYNTAX      Counter32
      MAX-ACCESS  read-only
      STATUS      current
      DESCRIPTION
              "The total number of UDP datagrams delivered to UDP
users."
      ::= { udp 1 }

Following is my patch:

net/ipv4/udp.c +1 -1
@@ -1018,7 +1018,7 @@ static int udp_queue_rcv_skb(struct sock
 		/* FALLTHROUGH -- it's a UDP Packet */
 	}
 
-	if (sk->sk_filter && skb->ip_summed != CHECKSUM_UNNECESSARY) {
+	if (skb->ip_summed != CHECKSUM_UNNECESSARY) {
 		if (__udp_checksum_complete(skb)) {
 			UDP_INC_STATS_BH(UDP_MIB_INERRORS);
 			kfree_skb(skb);
#1 lore raw

This has been raised earlier, cf. http://bugzilla.kernel.org/show_bug.cgi?id=6660

Wei Yongjun wrote:

|  When I send a UDP datagrams with checksum error to target, I found that:
|  Under IPv6, counter udpInErrors increased, but under IPv4 counter
|  udpInDatagrams increased. I lookup into the source code, and found that,
|  under IPv4 UDP datagrams with checksum error will be delivered to UDP
|  receive queue, but IPv6 does not. IPv4 delivered into UDP receive queue,
|  increased udpInDatagrams, then discard it before delivered to UDP user.
|  RFC said udpInDatagrams is the total number of UDP datagrams delivered
|  to UDP users, so udpInDatagrams should not be increased while UDP
|  datagrams with checksum error received.
|  
|  Refer to RFC2013:
|    udpInDatagrams OBJECT-TYPE
|        SYNTAX      Counter32
|        MAX-ACCESS  read-only
|        STATUS      current
|        DESCRIPTION
|                "The total number of UDP datagrams delivered to UDP
|  users."
|        ::= { udp 1 }
|  
|  Following is my patch:
|  
|  --- a/net/ipv4/udp.c	2006-07-31 09:33:45.392479344 -0400
|  +++ b/net/ipv4/udp.c	2006-07-31 09:34:26.430240656 -0400
|  @@ -1018,7 +1018,7 @@ static int udp_queue_rcv_skb(struct sock
|   		/* FALLTHROUGH -- it's a UDP Packet */
|   	}
|   
|  -	if (sk->sk_filter && skb->ip_summed != CHECKSUM_UNNECESSARY) {
|  +	if (skb->ip_summed != CHECKSUM_UNNECESSARY) {
|   		if (__udp_checksum_complete(skb)) {
|   			UDP_INC_STATS_BH(UDP_MIB_INERRORS);
|   			kfree_skb(skb);
|  
|  Signed-off-by: Wei Yongjun <[email protected]>
|  
|  
|  -
|  To unsubscribe from this list: send the line "unsubscribe netdev" in
|  the body of a message to [email protected]
|  More majordomo info at  http://vger.kernel.org/majordomo-info.html
|  
|  

A message that is not in the archive (sent off-list or not yet received): 075801c6b47d$08c49350$6004a8c0@WeiYongjun

#3 lore raw

Hi,

|  if (!sk->sk_filter && skb->ip_summed != CHECKSUM_UNNECESSARY) {
|  
|  IPv6 doesn't do this, so I think delete condition 'sk->sk_filter' is better. 
|  Do you think so?

I think the sk->sk_filter is there for a good reason. If you delete it, that routine is forced to always compute UDP checksums, even if the only receiving application is a tcpdump process. I may be wrong here, but I think that deleting the sk_filter statement is not at a good idea.

The other alternatives discussed (afaik) so far were:

1) Move the increment of UDP_MIB_INDATAGRAMS from udp_queue_rcv_skb() to udp_recvmsg() (first patch uploaded to http://bugzilla.kernel.org/show_bug.cgi?id=6660). This was discussed: not a good idea, since in-kernel applications may use the data_ready handler rather than udp_recvmsg().

2) Decrement UDP_MIB_INDATAGRAMS in udp_recvmsg() when the checksum turns out to be wrong (second patch uploaded to above address). This would be a fix to the problem you are stating, it also solves the problem of missing out the data_ready handlers in (1), and was suggested earlier on this mailing list.

-- Gerrit