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);
}
- Я предполагаю, что слова состоят из 16-битного слова, а не 8-битного байта (если есть нечетный байт, nword округляется до следующего большого), правильно? Скажем, у ip_hdr всего 27 байтов, тогда nword будет 14 вместо 13, верно?
- Строка sum = (sum >> 16) + (sum & 0xffff) должна добавить перенос, чтобы сделать 16-битное дополнение
- сумма + = (сумма >> 16); Какова цель этого шага? Добавить оставшийся байт? Но оставшийся байт уже был добавлен в цикл?
Спасибо!