Checksumme eines IP-Headers ermitteln
-
hi,
ich hab hier eine funktion zur berechnung einer ip-header checksumme. leider tut es da irgendwas nicht so ganz, ich krieg immer segmentation faults wenn ich meine prüfsummen-routine aufrufe.
hat jemand eine idee woran das liegen kann? die prüfsumme wird ja nur über den header ermittelt. deswegen subtrahiere ich die payload, aber dennoch schein ich in der routine irgendwann ins leere zu greifen.
kann mir wer helfen oder hat nen tipp für mich ?
unsigned short ip_sum_calc(unsigned short len_ip_header, unsigned short buff[]) { unsigned short word16; unsigned long sum=0; unsigned short i // make 16 bit words out of every two adjacent 8 bit words in the packet // and add them up for (i=0;i<len_ip_header;i=i+2){ word16 =((buff[i]<<8)&0xFF00)+(buff[i+1]&0xFF); sum = sum + (unsigned long) word16; } // take only 16 bits out of the 32 bit sum and add up the carries while (sum>>16) sum = (sum & 0xFFFF)+(sum >> 16); // one's complement the result sum = ~sum; return ((unsigned short) sum); } //------------schnippel------------------ unsigned int headersize = sizeof(struct ip) + sizeof(struct udphdr); unsigned int payload = 4096; unsigned int packetsize = headersize + payload; unsigned char packet[packetsize]; memset(packet,0,packetsize); struct ip *iph = (struct ip*) packet; struct udphdr *udp = (struct udphdr *) packet + sizeof(struct ip); //---------------schnippel--------------- printf("Checksumme berechnen, Headersize: %i\n", (iph->ip_len - payload)); iph->ip_sum = ip_sum_calc ( (iph->ip_len - payload), (unsigned short*) packet);