mikrocontroller.net

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


Autor: Buns Tsuko (buns)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
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 E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.