Müssen ein Werkzeug schreiben, wo ich das gesamte ICMPv6-Paket erstellen muss. Ich kann nicht scheinen, den Code zu bekommen, um korrekte ICMPv6 Prüfsumme zu erzeugen. Ich habe versucht, die checksum(void * buffer, int bytes)
Funktion aus den folgendenKann die ICMPV6-Prüfsumme nicht bekommen
Calculating checksum of ICMPv6 Packet in C
Ich habe einen wireshark-Capture, dass ich die Prüfsumme zu verifizieren verwenden. Der ursprüngliche Paketinhalt sieht aus wie
0000 33 33 00 00 00 01 38 ea a7 89 be 59 86 dd 60 00 0010 00 00 00 20 3a ff fe 80 00 00 00 00 00 00 88 c5 0020 75 41 aa 0c 58 ee ff 02 00 00 00 00 00 00 00 00 0030 00 00 00 00 00 01 88 00 b8 cc 20 00 00 00 fe 80 0040 00 00 00 00 00 00 88 c5 75 41 aa 0c 58 ee 02 01 0050 38 ea a7 89 be 59
Die richtigen Prüfsumme ofcourse aus dem Paket 0xb8cc
ist. Das obige Paket ist das gesamte IPv6-Paket, aber der relevante Inhalt des Pakets beginnt mit der Quelladresse, die fe 80 00 00 00 00 00 00 88 c5 75 41 aa 0c 58 ee
ist. Der ICMPv6-Header beginnt bei 88 00
.
Ich denke, dass die Checksummenfunktion aus dem obigen Link korrekt sein kann, aber der Puffer, den ich zur Berechnung der Prüfsumme aufbaut, ist wahrscheinlich falsch. Im Anschluss an den RFCs konstruierte I der Puffer durch Quelle addr Verketten, dest addr, Paketlänge (32 = 00 20), Next-Header (58 = 3a), Rest von ICMPv6 Paket, das mir den Endpuffer von
uint8_t packet[] = { 0xfe , 0x80 ,0x00 , 0x00 ,0x00 , 0x00 ,0x00 , 0x00 , 0x88 , 0xc5 ,0x75 , 0x41 ,0xaa , 0x0c ,0x58 , 0xee, 0xff , 0x02 ,0x00 , 0x00 ,0x00 , 0x00 ,0x00 , 0x00, 0x00 , 0x00 ,0x00 , 0x00 ,0x00 , 0x00 ,0x00 , 0x01, 0x00 , 0x20 ,0x3a , 0x88 ,0x00 , 0x00 ,0x00 , 0x20 , 0x00 ,0x00 , 0x00 ,0xfe , 0x80 ,0x00 , 0x00 , 0x00 , 0x00 ,0x00 , 0x00 ,0x88 , 0xc5 ,0x75 , 0x41 , 0xaa , 0x0c ,0x58 , 0xee ,0x02 , 0x01 ,0x38 , 0xea , 0xa7 , 0x89 ,0xbe , 0x59 };
gibt Ich rufe die Prüfsummenfunktion als
fprintf (stdout, "% x \ n", ~ Prüfsumme (Paket, sizeof (Paket)));
aber Prüfsummenwert, den ich bekomme, ist ffffd174
. Vernachlässigend die ersten 2 Bytes, bekomme ich 7510.
Irgendwelche Ideen, was ich falsch mache? Ich denke, dass es ein Endian-Problem in der Prüfsummenfunktion geben könnte, aber ich habe auch den Pseudo-Header falsch konstruiert.