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);
}
- 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?
- La somme de ligne = (somme >> 16) + (somme & 0xffff) est d'ajouter report pour faire le complément 16 bits
- 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
pouvez formater votre code un peu, s'il vous plaît? – WhirlWind
Quelqu'un doit nettoyer cela. :( – Rev316
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