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);
}
- 8ビットバイトではなく、16ビットワードの数のnwordsを想定しています(奇数バイトがある場合、nwordは次の大きな値に丸められます)、それは正しいですか?ip_hdr が全部で 27 バイトだとすると、nword は 13 ではなく 14 になりますよね?
- 行 sum = (sum >> 16) + (sum & 0xffff) は、キャリーオーバーを追加して 16 ビットの補数にすることです。
- 合計 += (合計 >> 16); このステップの目的は何ですか? 残りのバイトを追加しますか? しかし、残りのバイトはすでにループに追加されていますか?
ありがとう!