UDP计算校验和

  1. static unsigned short checksum(unsigned short *pwbuffer,uint32_t size)  
  2. {  
  3.     unsigned long cksum=0;  
  4.     while(size > 1){  
  5.         cksum+=*pwbuffer++;  
  6.         size-=sizeof(uint16_t);  
  7.     }  
  8.     if(size){  
  9.         cksum+=*(uint8_t*)pwbuffer;  
  10.     }  
  11.     cksum=(cksum>>16)+(cksum&0xffff);  
  12.     cksum+=(cksum >> 16);  
  13.     return (unsigned short)(~cksum);  
  14. }  
  15. static unsigned int inline   
  16. udp_checksum(unsigned long saddr,  
  17.              unsigned long daddr,  
  18.              unsigned short *buffer,  
  19.              int size)  
  20. {  
  21.     unsigned char rawBuf[1024];  
  22.     struct pseudo_hdr  
  23.     {  
  24.         struct in_addr  src;  
  25.         struct in_addr  dst;  
  26.         uint8_t         mbz;  
  27.         uint8_t         proto;  
  28.         uint16_t        len;  
  29.     } __attribute__((__packed__));  
  30.     unsigned long sum = 0;  
  31.     struct pseudo_hdr *ph;  
  32.     int ph_len = sizeof(struct pseudo_hdr);  
  33.     ph = (struct pseudo_hdr *)rawBuf;  
  34.     ph->src.s_addr = saddr;  
  35.     ph->dst.s_addr = daddr;  
  36.     ph->mbz = 0;  
  37.     ph->proto = IPPROTO_UDP;  
  38.     ph->len = htons(size); //这里的长度为udp header + payload 的总和  
  39.     //buffer = udpheader + payload,  size = sizeof(udpheader + payload)  
  40.     memcpy(rawBuf + ph_len, buffer, size);   
  41.     //ph_len + size 是虚假头长+UDP长+payload长。来计算checksum  
  42.     sum = checksum((unsigned short*)rawBuf,ph_len+size);  
  43.     return(sum);  
  44. }  

你可能感兴趣的:(UDP计算校验和)