www.mikrocontroller.net

Forum: PC Hard- und Software raw socket - tcp checksum

Autor: Buns Tsuko (buns)
Datum: 14.05.2008 15:47

Hallo,

Ich habe den folgenden Code geschrieben. Mein tcp checksum ist nicht
korrekt, obwohl ip checksum richtig ist. Ich kann den Fehler gerade
nicht finden. ich bedanke mich für euere Hilfe
#include....
#define MSG_LENGTH 1024


struct hdr{
struct iphdr ip;
struct tcphdr tcp;
char Data[MSG_LENGTH];

};

int main(){
  
  struct hdr paket;
  
  struct pseudohdr Pseudo;
 
  struct sockaddr_in addr;
 
  int rawsock;
 
  const int on=1;
 
  int se;
  
  /**
   *create a raw socket
   *
   *transport protokol: TCP Protokol
   */
  rawsock = create_socket(AF_INET, SOCK_RAW, IPPROTO_TCP);
  printf("create a Raw Socket\n");
  /**
   *set a socket option 
   */
  if(setsockopt(rawsock, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)) < 0){
    perror("setsockopt()");
    exit(1);
  }
  /**
   *initialize paket
   */
  memset(&paket, 0, sizeof(struct hdr));
  /**
   *create IP Header
   */
  ....

  paket.ip.check = compute_checksum((uint16*)&paket.ip, sizeof(struct iphdr));///checksum
  /**
   *create TCP Header
  
   */
 ....

  /**
   *create Pseudo Header for computing TCP checksum
   *(quelle rfc 793)
   */
  Pseudo.saddr = paket.ip.saddr;
  Pseudo.daddr = paket.ip.daddr;
  Pseudo.reserved = 0;
  Pseudo.protocol = paket.ip.protocol;
  Pseudo.tcp_seg_len = htons(sizeof(struct tcphdr));
  bcopy((char*)&paket.tcp, (char*)&Pseudo.tcp, sizeof(struct tcphdr));
 
  
  printf("give your Data:\t");
  fgets(paket.Data, MSG_LENGTH, stdin);

  bcopy((char*)&paket.Data, (char*)&Pseudo.buf, MSG_LENGTH);


  paket.tcp.check = compute_checksum((uint16*)&Pseudo, MSG_LENGTH +
             sizeof(struct tcphdr) + sizeof(struct pseudohdr));

  /**
   *now the paket is sent
   */

    se = sendto(rawsock, &paket, sizeof(struct hdr), 0, 
    (struct sockaddr*)&addr, sizeof(struct sockaddr_in));
   
  printf("the paket is sent\n");
  printf("Sent %d byte paket to %s\n",paket.ip.tot_len, DES_IP);
  

  close_socket(rawsock);

  return 0;
}
/**
 *hier ist checksum
 */
uint16
compute_checksum(uint16 *ptr,
     int byte){
  register int sum=0;
  u_short odd_byte=0;
  /**
   *we add sequential 16 bit words to a 32 bit accumulator(sum)
   *
   *and at the end, fold back all the carry bit from the top 16 bits
   *into the lower 16 bits
   */
  while(byte >1){
    sum += *ptr++;
    byte -=2;
  }
  /**
   *mod up and add byte, if necessary
   */
  if(byte ==1){
    *((u_char*)&odd_byte) = *(u_char*)ptr;
    sum += odd_byte;
  }
  /**
   *add back carry outs from top 16 bits to low 16 bits
   */
  sum = (sum >> 16) + (sum & 0xffff);///add hight to low
  sum += (sum >>16);///add carry
  odd_byte =~sum;
  return (odd_byte);
}


MFG

Buns
Autor: NoL (Gast)
Datum: 23.05.2008 18:59

Hi,

es ist aus deinem Quelltext nicht ganz ersichtlich, aber achtest du
darauf das sich der Speicherbereich des tcphdr und deiner Daten nicht
überschreiben? Bzw das zu Pseudo.tcp und Pseudo.buf vorher reservierst
und diese bereiche auch direkt aneinander grenzen? Ich sitze auch gerade
an dem Problem. Bei mir lags daran das die Speicherbereiche nciht direkt
nebeneinander waren. Dein Algorithmus sieht gut aus.

MfG NoL

Antwort schreiben

Die Angabe einer Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
  • Aussagekräftigen Betreff wählen
  • Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
  • JPEG-Dateien (.jpg) nur für Fotos und Scans verwenden
  • Schaltpläne, Screenshots usw. als PNG oder GIF anhängen

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel






webmaster@mikrocontroller.netImpressumWerbung auf Mikrocontroller.net