gpt4 book ai didi

networking - 如何计算非线性 skb/payload 的 TCP/UDP 校验和?

转载 作者:可可西里 更新时间:2023-11-01 02:56:53 25 4
gpt4 key购买 nike

我正在尝试计算正在发送的 skb 上的 TCP/UDP header 校验和。

基本上,有两个函数应该完成所有工作(也在 this stackoverflow questionthis one too 中提到):

  • csum_tcpudp_magic
  • csum_partial

例如,对于 TCP:

  tcph->check = 0;
tcph->check = csum_tcpudp_magic(iph->saddr,
iph->daddr,
tcp_packet_len,
IPPROTO_TCP,
csum_partial((unsigned char *)tcph,
tcp_packet_len,
0));

这工作正常 - 我能够传输 TCP/UDP 数据包并在接收端使用 wireshark 验证校验和。但是,我找不到任何关于碎片化的 SKB 的信息。

当 TCP/UDP 负载碎片化时,这两个“神奇”函数会处理情况吗

此外,TCP/UDP header 可能驻留在 SKB 的非线性部分(也被分段)。

这些函数也会处理这种情况吗

我知道我可以尝试使用更大的数据包,这会导致它们碎片化,但现在错误处理的代价是内核 oops,我不能让系统崩溃。

最佳答案

经过大量挖掘,我明白了这一点。csum_tcpudp_magiccsum_partial 无法使用碎片化的 skb。如果你想用它们来计算 TCP/UDP 校验和,我需要让所有的数据包有效载荷驻留在 skb 的线性部分。

幸运的是,Linux 中有一个实用函数可以做到这一点 - skb_linearize

基本上,流程是:

  if (unlikely(skb_linearize(skb) != 0))
... goto drop - no memory...;

... do whatever you want with data ...
tcph->check = 0;
tcph->check = csum_tcpudp_magic(iph->saddr,
iph->daddr,
tcp_packet_len,
IPPROTO_TCP,
csum_partial((unsigned char *)tcph,
tcp_packet_len,
0));

如果无法进行线性化(性能、内存或其他原因),则您需要“手动”计算校验和。

关于networking - 如何计算非线性 skb/payload 的 TCP/UDP 校验和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23598200/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com