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