IP-Header zusammenbauen



  • hi,

    ich experementiere etwas mit raw-Sockets herum und möchte ein IP-Paket via UDP verschicken. Nun ist aber scheinbar mein errechneter IP-Header murcks, ein Monitoringprogramm sagt mir das der Header 0x000 ist (also nicht gesetzt?). Nun weis ich nicht ob ih falsch rechne und die methode fehlerhaft ist oder ob ich vorher was falsch mache.

    hier mal mein code:

    meine structur(en)

    unsigned int headersize = sizeof(struct ip) + sizeof(struct udphdr);
     unsigned int payload = 512;
     unsigned int packetsize = headersize + payload;
     unsigned char packet[packetsize]; 
     memset(packet,0,packetsize);
    
    /* Systemmitteilen das ich den Header selbst berechne */
     int on=1;
     if (setsockopt(rs, IPPROTO_IP, IP_HDRINCL, (const char* )&on, sizeof(on)) < 0 )
     {
       perror("IP_HDRINCL failed!\n");
       exit(1);
     }
    

    Header zusammen setzen

    /* IP Header zusammenbauen */
      struct ip *iph        = (struct ip*) packet;
     iph->ip_v 		       	= 4; //IPv4
     iph->ip_hl		    	= 5;
     iph->ip_tos           	= 0x0;
     iph->ip_len		  	= sizeof(struct ip) + sizeof(struct udphdr);
     iph->ip_ttl        	= 100;
     iph->ip_p		 		= IPPROTO_UDP;
     iph->ip_src.s_addr 	= inet_addr(SRC_ADR);
     iph->ip_dst.s_addr 	= inet_addr(DST_ADR);
     iph->ip_id 			= htons(random());
     iph->ip_sum 			= ip_sum_calc(iph->ip_hl, (unsigned short*) &iph);
    

    Methode zur Prüfsummenberechnung

    //typedef unsigned short u16;
    //typedef unsigned long u32;
    
    u16 ip_sum_calc(u16 len_ip_header, u16 buff[])
    {
      u16 word16;
      u32 sum=0;
      u16 i;
    
      for (i=0;i<len_ip_header;i=i+2)
      {
        word16 =((buff[i]<<8)&0xFF00)+(buff[i+1]&0xFF);
        sum = sum + (u32) word16;	
      }
    
      //Nimmt von der 32-Bit Summe nur die ersten 16 Bit
      while (sum>>16)
      {
        sum = (sum & 0xFFFF)+(sum >> 16);
      }
    
      sum = ~sum;     //Einerkomplement des Ergebnis
    
      return ((u16) sum);
    }
    

    hab jetzt schon mehrere ip-header prüfsummen funktionen gegoogelt, wobei manche gleiche ergebnise liefern und andere wiederherum abweichen.

    Ich hab jetzt schon vil rumprobiert, aber ich krieg eifnach nicht raus was falsch ist...

    Kann mir wer helfen ?



  • Hast du dich denn an die Spezifikationen gehalten?
    Nach zu lesen ist das in den Links. Auf den Seiten gibt es noch mehr Infos.

    http://www.tecchannel.de/ueberblick/archiv/401866/index5.html
    http://de.wikipedia.org/wiki/IP-Paket
    http://de.wikipedia.org/wiki/User_Datagram_Protocol
    http://de.wikipedia.org/wiki/IPv4


Log in to reply