Hallo,
ich habe mal wieder ein Problem mit UDP Packeten.
1. Gibt es eigentlich ein vernünftiges Buch zur Socket insbesondere RAW
Socket Programmierung? Ich habe jetzt diverse Tutorials hinter mir, mit dem
Ergebnis das der Grossteil extrem viele Fehler enthält.
2. Mein eigentliches Problem liegt bei der Berechnung von UDP Checksummen
wenn ich mit RAW Sockets arbeite. Ich bekomme es einfach nicht hin das die Checksumme
im UDP Header korrekt berechnet ist, die im IP Header hingegen ist immer richtig berechnet,
die Funktion müsste also richtig sein.
Zur Theorie:
UDP Checksummen berechnen sich aus der Source IP, der Destination IP,
des verwendeten Protocols, der Gesamtlänge des UDP Packets, dem
UDP Header und den UDP Daten. Dafür wird ein Pseudoheader angelegt der diese Daten
enthält, daraus wird die Checksumme berechnet.
Hier mal ein paar Codeschnipsel:
---code---
#define SIZE 1024
char datagram[SIZE];
//mein Gesamtpacket
struct iphdr *ip=(struct iphdr*) datagram;
//der IP Header
struct udphdr *udp = (struct udphdr*) (datagram + sizeof(struct iphdr));
//der UDP Header
char *data = datagram + sizeof(struct iphdr) +sizeof(struct udphdr);
//Daten des UDP Packets
[...]
//mein Pseudoheader
struct pseudohdr
{
unsigned int saddr; //Source
unsigned int daddr; //Destination
unsigned char zero; //Platzhalter
unsigned char protocol; //Protokoll
unsigned short len; //Länge
struct udphdr phudp; //UDP Header
char *phudp_data; //UDP Daten
};
struct pseudohdr *ph = (struct pseudohdr *) malloc(sizeof (struct pseudohdr));
ph->saddr=ip->saddr;
ph->daddr=ip->daddr;
ph->zero=0;
ph->protocol=IPPROTO_UDP;
ph->len=udp->len;
ph->phudp=*udp; // Liegt hier der Fehler?
ph->phudp_data=data; //Oder hier??
//Wir berechnen die Checksumme
udp->check = csum((unsigned short *)ph,sizeof(struct pseudohdr));
//Unsere Funktion zur Berechnung der Checksumme.
//Diese Funktion habe ich aus Mixters Tutorial
// "A brief programming tutorial in C for raw sockets"
unsigned short csum (unsigned short *buf, int nwords)
{
unsigned long sum;
for (sum = 0; nwords > 0; nwords--)
sum += *buf++;
sum = (sum >> 16) + (sum & 0xffff);
sum += (sum >> 16);
return ~sum;
}
---code---
Kann mir jemand helfen? Was mache ich falsch? Ich vermute das der Fehler
bei mir an der Übergabe der Addresse der Daten an den Pseudoheader liegt?
Oder? Wie könnte ich es sonst machen?
Verzweifelt grüßend,
Martin
--
"Given enough eyeballs, all bugs are shallow."