Solyaris #7: FreeBSD specialities

| | Comments (0) | TrackBacks (0)
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!

0 TrackBacks

Listed below are links to blogs that reference this entry: Solyaris #7: FreeBSD specialities.

TrackBack URL for this entry: http://www.broken.ch/mt/mt-tb.cgi/16

Leave a comment

About this Entry

This page contains a single entry by dobin published on November 2, 2008 5:45 PM.

Moviezz was the previous entry in this blog.

Moviezz is the next entry in this blog.

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

Pages