31 #include <sys/types.h>
32 #include <netinet/in.h>
42 uint16_t prot_udp = 17;
43 uint16_t chksum_init = 0;
44 uint16_t udp_len_total = 0;
54 if( len_udp%2 != 0 ) {
62 high = ( src_addr>>16 );
63 sum += ( ( uint32_t ) high + ( uint32_t ) low );
67 high = ( dest_addr>>16 );
68 sum += ( ( uint32_t ) high + ( uint32_t ) low );
71 udp_len_total = len_udp + 8;
72 sum += ( ( uint32_t )prot_udp + ( uint32_t )udp_len_total );
76 sum += ( ( uint32_t )src_port + ( uint32_t ) dest_port );
82 sum += ( ( uint32_t ) udp_len_total + ( uint32_t ) chksum_init );
88 for( i=0; i< ( len_udp - pad ); i+=2 ) {
89 high = ntohs(*(uint16_t *)buff);
91 sum += ( uint32_t ) high;
99 sum += ntohs( * (
unsigned char * ) buff );
104 sum = ( sum & 0xFFFF ) + ( sum >> 16 );
111 return ((uint16_t) htons(sum) );
115 uint16_t
udp_sum_calc2(uint16_t len_udp, uint16_t src_addr[],uint16_t dest_addr[],
bool padding, uint16_t buff[])
117 uint16_t prot_udp=17;
138 for (i=0;i<len_udp+padd;i=i+2){
139 word16 =((buff[i]<<8)&0xFF00)+(buff[i+1]&0xFF);
140 sum = sum + (
unsigned long)word16;
146 word16 =((src_addr[i]<<8)&0xFF00)+(src_addr[i+1]&0xFF);
152 word16 =((dest_addr[i]<<8)&0xFF00)+(dest_addr[i+1]&0xFF);
156 sum = sum + prot_udp + len_udp;
160 sum = (sum & 0xFFFF)+(sum >> 16);
165 return ((uint16_t) sum);
171 int nleft = len, sum = 0;
172 u_short *w = addr, answer = 0;
180 *(u_char *)(&answer) = *(u_char *)w;
184 sum = (sum >> 16) + (sum + 0xffff);
191 unsigned short in_chksum_udp(
unsigned short *h,
unsigned short * d,
int dlen )
194 unsigned short answer=0;
253 *(
unsigned char*)(&answer) = (*(
unsigned char*)d);
257 cksum = (cksum >> 16) + (cksum & 0x0000ffff);
258 cksum += (cksum >> 16);
260 return (
unsigned short)(~cksum);
265 unsigned short in_chksum_tcp(
unsigned short *h,
unsigned short * d,
int dlen )
268 unsigned short answer=0;
334 *(
unsigned char*)(&answer) = (*(
unsigned char*)d);
341 cksum = (cksum >> 16) + (cksum & 0x0000ffff);
342 cksum += (cksum >> 16);
344 return (
unsigned short)(~cksum);
347 unsigned short cksum(
unsigned short *addr,
int len)
351 unsigned short *w = addr;
352 unsigned short answer = 0;
360 *(
unsigned char *) (&answer) = *(
unsigned char *) w;
364 sum = (sum >> 16) + (sum & 0xffff);
365 sum = sum + (sum >> 16);
379 for (i=0;i<len_ip_header;i=i+2){
380 word16 =((buff[i]<<8)&0xFF00)+(buff[i+1]&0xFF);
381 sum = sum + (uint32_t) word16;
386 sum = (sum & 0xFFFF)+(sum >> 16);
391 return ((uint16_t) sum);