Apres plusieurs essais j'ai trouvé ce qu'il faut, cependant j'ai un autre problème :
Pour un paquet udp, le checksum se calcule grâce à une pseudo en-tête ip qui contient l'ip source et destination un zéro, le protocol supérieur utilisé et la taille du paquet udp,
j'ai écrit un fonction qui permet de le calculer à partir d'un paquet udp sans données (c'est un peu le bordel lol) mais c'est juste pour l'essai :
unsafe static void Main(string[] args)
{
byte[] packet=new byte[]{15000>>8,15000&0xff,14000>>8,14000&0xff};
// [ port source (16 bits), port dest (16 bits) ]
byte[] pseudo_h=new byte[]{192,168,0,1,192,168,0,2,0,11,0,8};
// [ Ip1, Ip2, 0, proto (udp= 11), UdpLen (16 bits)
byte[] test=new byte[packet.Length+pseudo_h.Length];
Array.Copy(pseudo_h,0,test,0,pseudo_h.Length);
Array.Copy(packet,0,test,pseudo_h.Length,packet.Length);
// Pour afficher le tableau en hexa
for(int j=0; j < test.Length;j++)
{
Console.Write("{0:x} ",test[j]);
}
int i=test.Length-1;
long chksum=0;
fixed(byte* b=test)
{
while(i>0)
{
ushort us=(ushort)((((ushort)*(b+i-1))<<8)+((ushort)*(b+i)));
i=i-2;
chksum +=us;
}
if(i==0)
chksum+=(ushort)(test[0]);
}
chksum = (chksum >> 16)+(chksum & 0xffff);
chksum += chksum >> 16;
chksum = ~chksum;
Console.WriteLine("Valeur du checksum : {0:x}",((ushort)chksum));
}
je n'arrivais pas à trouvé comment utiliser un pointeur de type ushort avec un tableau de byte, donc j'ai utilisé un pointeur byte.
Cette fontion me renvoi un valeur de 0x0D50, la vraie valeur du checksum devrait être 0x0D42. Il doit manquer une donnée... Si queulqu'un pourrait m'aider plz 