Делаю так: inline u16 checksum(u8* d, int l, u32 c) { while(l > 1) { c += *(u16*)d; d += 2; l -= 2; } if(l) c += *d;
c = (c >> 16) + (c & 0xffff); c += (c >> 16); u16 ret = ((u16)(~c)); return ret; }
где вызов:
u32 ph = (saddr) & 0xffff) + ( (saddr) >> 16) + ((daddr) & 0xffff) + ((daddr) >> 16) + 0x600 + ((u16)l);
u16 cs = checksum(d, l, ph); u32 saddr и пр. берется из ип хедера. Это для тсп.
для удп: u32 ph = (saddr) & 0xffff) + ( (saddr) >> 16) + ((daddr) & 0xffff) + ((daddr) >> 16) + 0x1100 + ((u16)l);
u16 cs = checksum(d, l, ph);
для ип еще проще: u16 cs = checksum(d, ihl, 0);
Не забываем, что для ип сумма считается только для заголовка.
Сообщение отредактировал ktod - Oct 9 2006, 16:43
--------------------
Ignoramus et Ignorabimus
|