【发布时间】:2018-02-09 16:43:19
【问题描述】:
我正在构建一个 Netfilter 模块,该模块会修改发往特定端口的数据包的 TCP 有效负载。我既不修改 IP 标头也不修改 TCP 标头。收到数据包后,直接在 Netfilter 中的第一个点调用该模块 (NF_INET_PRE_ROUTING)。因此,我必须重新计算每个修改数据包中的 TCP 校验和字段。我已经在这里看到了一些帖子并使用了那里的方法来重新计算 TCP 校验和,但是这些方法都不起作用。以下是我使用的两种方法:
方法一:
tcplen = (skb->len - (iph->ihl << 2)); /* tcplen is the length of the
* skb - the ip-header length */
tcph->check = 0;
tcph->check = csum_tcpudp_magic(iph->saddr, iph->daddr,
tcplen, IPPROTO_TCP,
csum_partial(tcph, tcplen, 0));
skb->ip_summed = CHECKSUM_UNNECESSARY;
方法二:
tcph->check = ~(~tcph->check + ~new_field + new_field);
skb->ip_summed = CHECKSUM_UNNECESSARY;
在这两种情况下,我收到以下错误:
verif_dss_csum csum 错误:0x874a data_seq 2760801057 dss_csum_added 1 溢出 0 次迭代 1
这个问题有什么解决办法吗?我正在为 Linux Kernel 4.4.83 开发我的模块
【问题讨论】:
-
我找不到任何错误。顺便说一句:是
iph->ihloriginal ipheader->len(包括 TCP 标头+有效负载)?第二个想法是填充,但我想csum_partial()会处理这个问题。 -
我发现了错误。它与 TCP 校验和无关。它与 MP-TCP 校验和有关,所以我禁用了它。上面的语法是正确的
标签: c linux tcp linux-kernel netfilter