Door Koekie op 30 november 2006 23:35Het probleem alleen is echter dat iedere keer op een andere
manier word gedeclareerd.Om een voorbeeld te geven op
http://www.netfor2.com/tcpsum.htm zie je de
source dest protocol en
length ook terug komen in de source code.Maar bv bij
http://netweb.usc.edu/csiat/dos/brkill.c is het
gewoon een functie en
komen geen enkele pointers van het iphdr packet in voor.
Een snelle blik op die laatste, onderaan functie init_pkt staat:
pkt.tcphead.th_sum =
tcp_cksum ((u_short *) ADRES_VAN pseudo, 32);
(Ik gebruik ADRES_VAN i.p.v. de ampersand omdat die in dit
forum waarschijnlijk wegvalt). Die
pseudo is een
struct met de volgende members, en deze wordt net voor
bovenstaande aanroep gevuld met gegevens uit het pakket:
u_long saddr;
u_long daddr;
u_char zero;
u_char proto;
u_short len;
struct tcphdr faketcp;
dus daar zitten dus wel degelijk de relevante gegevens uit
de IP header in. N.B. laat je niet verwarren door de regel
een stukje hoger:
pkt.iphdr.ip_sum =
htons (tcp_cksum ((u_short *) ADRES_VAN pkt.iphdr, 20));
De functienaam tcp_cksum is hier misleidend, want hier wordt
de checksum van de
IP -header uitgerekend (zelfde
algoritme).
rfc 1071 staat "An efficient checksum implementation
is critical to good performance.
RFC1071 is uit 1988. Als jij met een moderne Intel/AMD CPU
werkt en geen extreem slechte C-code schrijft zou ik me daar
maar geen zorgen over maken. Wel wordt de boel extreem traag
als je velden weg gaat laten bij de checksum berekening
(alleen pakketten met toevallig een goede checksum komen dan
nog door).
Ten slotte nog een link naar wat oudere pages geschreven
door Vijay Mukhi:
http://www.vijaymukhi.com/vmis/roll.htm; onderaan
http://www.vijaymukhi.com/vmis/ip.htm vind je nog
een checksum routine.