Solyaris: November 2008 Archives

Ich habe endlich wieder mal Zeit gefunden, daran weiterzuprogrammieren, und diese dann prompt auch wegen einer FreeBSD Eigenheit verpulvert.

Beim Cleanup des ICMP Channels hatte ich seltsame Bugs. In der Funktion, die die ICMP Packete verarbeitet, brauchte ich die Länge des Packetes, welches in ip->ip_len steht:

von /usr/src/sys/netinet/ip.h:
struct ip {
   ...
   u_short ip_len; /* total length */
   ...
}
Nach dem RFC ist die Total Length so definiert:

Total Length: 16 Bit breit. Gibt die Länge des gesamten Pakets (inkl. Kopfdaten) in Bytes an

Also inklusiv des IP Headers. Wie ich aber schmerzhaft herausfinden sollte, ist beim Aufruf von icmp_input() ip->ip_len nur noch die grösse des IP Payloads, ohne länge des IP Headers. Das gleiche bei udp_input(). Das scheint aber eine Ausnahme zu sein, denn für icmp_send() muss ip->ip_len wieder den standardkonformen Wert beinhalten.

Danke liebe FreeBSD Kernel Entwickler für das undokumentierte verhalten, einfach IP Header Werte mitten in deren verarbeitung zu verändern!

About this Archive

This page is a archive of entries in the Solyaris category from November 2008.

Solyaris: September 2008 is the previous archive.

Solyaris: March 2009 is the next archive.

Find recent content on the main index or look in the archives to find all content.

Pages