sábado, 22 de febrero de 2014
TCP Checksum
unsigned short tcp_checksum (int count, unsigned short * addr,unsigned long ip_src,unsigned int ip_dst)
{
unsigned long sum = 0;
unsigned long sum2 = 0;
int k=0;
int count2;
count2=count;
count=count>>8;
// printf("\nCount =%i \n",count);
while (count > 1) {
// printf("\n%04x ",htons(*addr ));
sum += htons(*addr++);
count -= 2;
}
// Add left-over byte, if any
if (count > 0)
sum += * (unsigned char *) htons(addr);
//printf("Pseudoheader\n");
sum += htons(ip_dst) & 0x00ffff;//printf("\n%04x ",htons(ip_dst) );
sum += htons(ip_dst>>16) ; //printf("\n%04x ",htons(ip_dst>>16) );
sum += htons(ip_src) & 0x00ffff; //printf("\n%04x ",htons(ip_src) );
sum += htons(ip_src>>16) ; //printf("\n%04x ",htons(ip_src>>16) );
sum += 0x6; //printf("\n%04x ",0x6 );
sum += htons(pacsize+count2);
//printf("\n%04x ",htons(pacsize+count2));
while (sum >> 16)
sum = (sum & 0xffff) + (sum >> 16);
return (unsigned short )(htons(~sum));
}
unsigned short checksum (int count, unsigned short * addr) {
unsigned long sum = 0;
count=count>>8;
// printf("Count =%x \n",count);
while (count > 1) {
// printf("%x ",(*addr<<8 &0xff00 ));
sum += *addr++;
count -= 2;
}
// Add left-over byte, if any
if (count > 0)
sum += * (unsigned char *) addr;
if (sum >> 16)
sum = (sum & 0xffff) + (sum >> 16);
/*while (sum >> 16)
sum = (sum & 0xffff) + (sum >> 16);*/
return (unsigned short )(~sum);
}
Suscribirse a:
Enviar comentarios (Atom)
No hay comentarios:
Publicar un comentario