2010-04-05 5 views
3
unsigned short /* this function generates header checksums */ 
csum (unsigned short *buf, int nwords) 
{ 
    unsigned long sum; 
    for (sum = 0; nwords > 0; nwords--) // add words(16bits) together 
    { 
     sum += *buf++; 
    } 
    sum = (sum >> 16) + (sum & 0xffff); //add carry over 
    sum += (sum >> 16);     //MY question: what exactly does this step do??? add possible left-over 
             //byte? But hasn't it already been added in the loop (if 
             //any)? 
    return ((unsigned short) ~sum); 
} 
  1. Je suppose nwords dans le nombre de mot 16bits, pas octet 8bits (s'il y a octet impair, nword est arrondie au grand), est-il exact? Say ip_hdr a 27 octets totalement, alors nword sera 14 au lieu de 13, non?
  2. La somme de ligne = (somme >> 16) + (somme & 0xffff) est d'ajouter report pour faire le complément 16 bits
  3. somme + = (somme >> 16); Quel est le but de cette étape? Ajouter un octet de gauche? Mais l'octet de gauche a déjà été ajouté dans la boucle?

Merci!Question concernant le code de contrôle ip

+0

pouvez formater votre code un peu, s'il vous plaît? – WhirlWind

+0

Quelqu'un doit nettoyer cela. :( – Rev316

+0

Un 'ip_hdr' ne peut pas avoir 27 octets, il doit être un multiple de 4 octets, et doit avoir entre 20 et 60 octets -' (4 * ip_hdr-> ip_ihl) 'car' ip_ihl' est un champ de quatre bits – Alnitak

Répondre

0

Vous avez raison. L'étape 3 condense la somme, une longueur de 32 bits, en un court non signé de 16 bits, qui est la longueur de la somme de contrôle. C'est à des fins de performance, permettant de calculer la somme de contrôle sans dépassement de suivi jusqu'à la fin. Il le fait à la fois à l'étape 2 et à l'étape 3, car il a peut-être débordé à partir de l'étape 2. Il renvoie ensuite uniquement les 16 bits de somme inférieurs inversés.

Ceci est un peu plus clair: http://www.sysnet.ucsd.edu/~cfleizac/iptcphdr.html

+0

Les hypothèses ici sont que la longueur d'un long est de 32 bits et la longueur d'un court est de 16 bits, mais il existe des plates-formes où aucun n'est vrai –

+0

vrai, mais ce n'est pas un code indépendant de la plate-forme C'est dans le noyau, où vous savez quelles sont les tailles, donc c'est une hypothèse raisonnable – WhirlWind

+0

Vous pouvez voir la source BSD utilise des déclarations "non portables" similaires: http://fxr.watson.org/fxr/source /netinet/in_cksum.c – WhirlWind