我有一个内核模块,它从 netfilter hook 读取数据包并使用 sk_buff
访问数据。
我观察到,当数据包以低速到达时,sk_buff->len
表现正常,但当数据包以更高的速率(1Gbps 等)到达时,sk_buff->len
几个数据包开始增加(总是 8 的倍数)。
我正在重放的数据也有碎片包。碎片化的数据包是否附加在相同的 sk_buff
中导致 sk_buff->len
增加?如果是,sk_buff
如何知道堆栈以及在什么时候知道?
有人可以解释为什么会发生这种情况以及如何解决这个问题。对某些文档的任何引用也会有所帮助。
最佳答案
此行为的原因是 GRO(通用接收卸载)。就像 TSO 或 GSO 一样,它是接收端的优化。它在一个大的 skb 缓冲区中附加具有相同 tcp 和 ip header 的数据包,以使内核处理更容易。
关于c - Linux 内核模块 : Socket buffer (sk_buff->len) non-deterministic behaviour,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23812628/