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);
}

No hay comentarios:

Publicar un comentario