贴出这段源码,正好了解一下如果一个数据包中只有一个字段(不超过2 bytes)被修改,如何重新快速计算校验和的。
位于include/net/ip.h, 内核版本是2.4.22.
/* The function in 2.2 was invalid, producing wrong result for
* check=0xFEFF. It was noticed by Arthur Skawina _year_ ago. --ANK(000625) */
static inline
int ip_decrease_ttl(struct iphdr *iph)
{ u32 check = iph->check;
check += __constant_htons(0x0100);
iph->check = check + (check>=0xFFFF);
return --iph->ttl;
}
|
不过根据注释,在check=0xFEFF的时候,根据此种方法计算会得出错误结果。
偶分析的情况应该是,check=0xFEFF时,如果修改TTL,使其减1. 那么经过
check += __constant_htons(0x0100)
计算出来的check=0xFFFF.
从理论上讲,用二进制补码得出的校验和的值是不会为0xFFFF的。可能作者指的是这个意思。
因此,作者加上了这样一行代码
iph->check = check + (check>=0xFFFF);
这样就保证了采用这种方式计算校验和的时候,不会出现0xFFFF的情况,而应该时0x0000了。
阅读(2058) | 评论(0) | 转发(0) |