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