- 论坛徽章:
- 0
|
通过ipq在用户态里修改了数据包,需要重新计算校验和。
1)有没有可以在用户态使用的现成的库函数?
2)在网上搜了一下,发现都是使用short指针计算的,
from TCP/IP Illustrated II
unsigned short cksum(struct ip *ip, int len)
{
long sum = 0; // assume 32 bit long, 16 bit short
while (len > 1)
{
sum += *((unsigned short *) ip)++;
if (sum & 0x80000000) // if high-order bit set, fold
sum = (sum & 0xFFFF) + (sum >> 16);
len -= 2;
}
if (len)
sum += (unsigned short) *(unsigned char *) ip;
while (sum >> 16)
sum = (sum & 0xFFFF) + (sum >> 16);
return ~sum;
}
那么如题,是否需要关心字节顺序?
按照同样的算法,不同主机序的机器计算出来的cheksum应该是不一样的吧?
此外,checksum本身就是一个short,填充在包头的时候是否需要换成网络顺序?
3) 如果使用netlink_queue的话,是否还需要重新计算checksum
因为在nfqnl_mangle里看到了e->skb->ip_summed = CHECKSUM_NONE,
不知道内核是否会根据该标志重新计算checksum?
4) 顺便问一下,ipq/netlink_queue机制本身是否存在并行的可能性? |
|