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:
Danke liebe FreeBSD Kernel Entwickler für das undokumentierte verhalten, einfach IP Header Werte mitten in deren verarbeitung zu verändern!
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 {Nach dem RFC ist die Total Length so definiert:
...
u_short ip_len; /* total length */
...
}
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.Total Length: 16 Bit breit. Gibt die Länge des gesamten Pakets (inkl. Kopfdaten) in Bytes an
Danke liebe FreeBSD Kernel Entwickler für das undokumentierte verhalten, einfach IP Header Werte mitten in deren verarbeitung zu verändern!
Leave a comment