Bug in UDPIPEncap?
Eddie Kohler
kohler at aciri.org
Thu Aug 2 16:59:44 EDT 2001
Julio,
Never mind. We found the bug: we forgot to zero the UDP checksum field
before calculating the checksum. (Duh!)
A patch is attached. It has also been checked in to CVS.
love,
ed
diff -c -r1.9 -r1.10
*** elements/tcpudp/udpipencap.cc 2001/07/24 01:16:53 1.9
--- elements/tcpudp/udpipencap.cc 2001/08/02 22:58:21 1.10
***************
*** 118,132 ****
// set up UDP header
udp->uh_sport = htons(_sport);
udp->uh_dport = htons(_dport);
! unsigned short len = p->length() - sizeof(click_ip);
udp->uh_ulen = htons(len);
if (_cksum) {
unsigned csum = ~click_in_cksum((unsigned char *)udp, len) & 0xFFFF;
#ifdef __KERNEL__
udp->uh_sum = csum_tcpudp_magic(_saddr.s_addr, _daddr.s_addr,
len, IP_PROTO_UDP, csum);
#else
! unsigned short *words = (unsigned short *)&ip->ip_src;
csum += words[0];
csum += words[1];
csum += words[2];
--- 118,133 ----
// set up UDP header
udp->uh_sport = htons(_sport);
udp->uh_dport = htons(_dport);
! uint16_t len = p->length() - sizeof(click_ip);
udp->uh_ulen = htons(len);
+ udp->uh_sum = 0;
if (_cksum) {
unsigned csum = ~click_in_cksum((unsigned char *)udp, len) & 0xFFFF;
#ifdef __KERNEL__
udp->uh_sum = csum_tcpudp_magic(_saddr.s_addr, _daddr.s_addr,
len, IP_PROTO_UDP, csum);
#else
! const uint16_t *words = (const uint16_t *)&ip->ip_src;
csum += words[0];
csum += words[1];
csum += words[2];
***************
*** 137,145 ****
csum = (csum & 0xFFFF) + (csum >> 16);
udp->uh_sum = ~csum & 0xFFFF;
#endif
! } else
! udp->uh_sum = 0;
!
return p;
}
--- 138,145 ----
csum = (csum & 0xFFFF) + (csum >> 16);
udp->uh_sum = ~csum & 0xFFFF;
#endif
! }
!
return p;
}
More information about the click
mailing list