欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

UDP checksum

程序员文章站 2022-03-05 13:35:30
...

从一个开源系统扒拉下来的。
http://minirighi.sourceforge.net/html/udp_8c-source.html

//! \param buff The UDP packet.
//! \param len The UDP packet length.
//! \param src_addr The IP source address (in network format).
//! \param dest_addr The IP destination address (in network format).
//! \return The result of the checksum.
uint16_t udp_checksum(const void *buff, size_t len, in_addr_t src_addr, in_addr_t dest_addr)
{
        const uint16_t *buf=buff;
        uint16_t *ip_src=(void *)&src_addr, *ip_dst=(void *)&dest_addr;
        uint32_t sum;
        size_t length=len;
  
        // Calculate the sum                                            //
        sum = 0;
        while (len > 1)
        {
                sum += *buf++;
                if (sum & 0x80000000)
                        sum = (sum & 0xFFFF) + (sum >> 16);
                len -= 2;
        }
  
        if ( len & 1 )
                // Add the padding if the packet lenght is odd          //
                sum += *((uint8_t *)buf);
  
        // Add the pseudo-header                                        //
        sum += *(ip_src++);
        sum += *ip_src;
  
        sum += *(ip_dst++);
        sum += *ip_dst;
  
        sum += htons(IPPROTO_UDP);
        sum += htons(length);
  
        // Add the carries                                              //
        while (sum >> 16)
                sum = (sum & 0xFFFF) + (sum >> 16);
  
        // Return the one's complement of sum                           //
        return ( (uint16_t)(~sum)  );
}
 
 
/*
 * 使用方式
 * udph->check = 0;
 * udph->check = udp_checksum(udph, ntohs(udph->len), iph->saddr, iph->daddr);
 */