Bonjour à tous,

Alors voilà je fais de la redirection de trame. Le problème est que lorsque je change l'ip de destination du cou le CRC doit aussi changer cependant je n'arrive pas à le recalculer il me manque quelque chose donc voici les étapes que je réalise :

1) Capture de la trame :

FF FF FF FF FF FF 00 16 E6 5A 5F 94 08 00 45 00
00 5C 60 E7 00 00 80 11
00 00 C0 A8 00 E9 C0 A8
00 65
22 B9 22 B9 00 48 00 00
FF FF 00 01 00 40
EC C3 00 00 00 00 0C FF 00 00 00 00 00 34 0D 24
34 7C 40 B8 18 FA 66 00 00 00 E4 6C 1D DA DD 00
35 7C 00 00 00 00 01 00 00 00 FF FF FF FF FF FF
FF FF 00 00 00 00 01 00 00 00

En rouge est le header IP (d'aprés ethereal)
En orange le CRC du header IP(d'aprés ethereal)
En bleu est le header UDP (Toujours d'aprés ethereal)
En vert le CRC du header UDP (Toujours d'aprés ethereal)


2) Fonction utilisé pour calculer le CRC:

unsigned short CRC(unsigned short *data, int taille)
{
unsigned long checksum=0;
while(taille>1)
{
checksum=checksum+*data++;
taille=taille-sizeof(unsigned short);
}

if(taille)
checksum=checksum+*(unsigned char*)data;

checksum=(checksum>>16)+(checksum&0xffff);
checksum=checksum+(checksum>>16);

return (unsigned short)(~checksum);
}

Cette fonction est donné sur de nombreux site donc je ne doute pas de sont résultat ! (J'ai fait un simple copié collé)

3) Comment je calcul (C'est là ou doit être l'erreur )

Dans un premier temps je met les CRC à 0 comme indiqué par la RFC (Dans la trame données je les est mis à 0)
Puis ensuite j'appelle ma fonction comme ceci :
CRC(Trame + 14, 20) //Trame + 14 pour avoir le header ip
// 20 Parce que mon header est de 20
Et là la fonction me retourne un résultat qui n'est pas celui de ethereal ...

Ou est mon erreur ?

Merci d'avance et horriblement désolé pour les fautes d'orthographe ...