Tenho essa struct para representar o cabecalho tcp e mais em baixo tenho a funcao de checksum.
struct tcphdr {
unsigned short porta_origem;
unsigned short porta_destino;
unsigned int numero_sequencia;
unsigned int numero_reconhecimento;
unsigned char comprimento_cabecalho;
unsigned char flags;
unsigned short janela;
unsigned short checksum;
unsigned short pont_urgente;
};
long inchksum (unsigned char *ptr, unsigned len)
{
register long sum = 0;
register const WORD *wrd = (const WORD*) ptr;
register long slen = (long)len;
while (slen > 1)
{
sum += *wrd++;
slen -= 2;
}
if (slen > 0) sum += *(const BYTE*)wrd;
while (sum >> 16) sum = (sum & 0xFFFF) + (sum >> 16);
return sum;
}
...
unsigned char pacote[1024];
ip = (struct iphdr *) pacote;
tcp = (struct tcphdr *) (pacote + sizeof(struct iphdr));
data = (char *) (pacote + (sizeof(struct iphdr)+ sizeof(struct tcphdr)));
...
Estou usando chamando a funcao de checksum apos setar todos os campos do cabecalho tcp inclusive o campo checksum como 0.
...
inchksum((unsigned char *)tcp,sizeof(struct tcphdr) + datasize);
...
sendo que datasize são dados adicionais ao cabecalho, que eu adiciono usando o ponteiro data. O cabecalho ip q nao estou citando está calculando o checksum de forma correta, e estou usando essa mesma forma.
O que pode estar errado?