Question regarding ip checksum code
- by looktt
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); //what does this step do??? add possible left-over
//byte? But isn't it already added in the loop (if
//any)?
return ((unsigned short) ~sum);
}
I assume nwords in the number of 16bits word, not 8bits byte (if there are odd byte, nword is rounded to next large), is it correct?
The line sum = (sum 16) + (sum & 0xffff) is to add carry over to make 16bit complement
sum += (sum 16); What's the purpose of this step? Add left-over byte? How?
Thanks!