Subject: Re: [RFC][BUG-FIX] the problem of checksum checking in UDP protocol

From: Shan Wei <[email-masked]>
Date: Mon, 28 Jun 2010 18:49:36 +0800

Eric Dumazet wrote, at 06/26/2010 01:28 PM:
>> (This patch is not complete, it's just for my idea.)
>> diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c
>> index 1dd1aff..47f7e86 100644
>> --- a/net/ipv6/udp.c
>> +++ b/net/ipv6/udp.c
>> @@ -723,6 +723,10 @@ int __udp6_lib_rcv(struct sk_buff *skb, struct udp_table *udptable,
>>                 if (ulen < skb->len) {
>>                         if (pskb_trim_rcsum(skb, ulen))
>>                                 goto short_packet;
>> +
>> +                       if (skb_csum_unnecessary(skb))
>> +                               skb->ip_summed = CHECKSUM_NONE;
>> +
>>                         saddr = &ipv6_hdr(skb)->saddr;
>>                         daddr = &ipv6_hdr(skb)->daddr;
>>                         uh = udp_hdr(skb);
>>
> 
> I really dont know if this fix is the right one.
> 
> pskb_trim_rcsum() already contains a check. Should this check be changed
> to include yours ?

Oh..... I don't think so.
pskb_trim_rcsum() is also used when IPv4/IPv6 protocol receiving packets
and reassembling fragments. IP protocol does the right check and should
trust CHECKSUM_UNNECESSARY flag that drivers set, So we no need to 
change IP protocol.
If we add the skb_csum_unnecessary(skb) check into pskb_trim_rcsum() and
reset ip_summed with CHECKSUM_NONE, the checksum check that NIC hardward 
has done is wasted.

Only for UDP protocol over IPv4/IPv6, and length parameter is lower than
skb->len, We reset ip_summed with CHECKSUM_NONE.

-- 
Best Regards
-----
Shan Wei