c - Linux 内核模块 : Socket buffer (sk_buff->len) non-deterministic behaviour

标签 c linux-kernel kernel linux-device-driver kernel-module

我有一个内核模块,它从 netfilter hook 读取数据包并使用 sk_buff 访问数据。

我观察到,当数据包以低速到达时,sk_buff->len 表现正常,但当数据包以更高的速率(1Gbps 等)到达时,sk_buff->len 几个数据包开始增加(总是 8 的倍数)。

我正在重放的数据也有碎片包。碎片化的数据包是否附加在相同的 sk_buff 中导致 sk_buff->len 增加?如果是,sk_buff 如何知道堆栈以及在什么时候知道?

有人可以解释为什么会发生这种情况以及如何解决这个问题。对某些文档的任何引用也会有所帮助。

最佳答案

此行为的原因是 GRO(通用接收卸载)。就像 TSO 或 GS​​O 一样,它是接收端的优化。它在一个大的 skb 缓冲区中附加具有相同 tcp 和 ip header 的数据包,以使内核处理更容易。

关于c - Linux 内核模块 : Socket buffer (sk_buff->len) non-deterministic behaviour,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23812628/

相关文章:

c++ - 应该始终调用 glfwDestroyWindow 吗?

compiler-errors - “make all” 编译TPlink wm722n驱动出错

c - 没有'\n'的printf()在libev中不起作用

c - 在 C 中打印格式化字符串

multithreading - 识别linux内核模块中的错误

linux - 是否有任何 API 用于从 Linux 中的虚拟地址确定物理地址?

linux-kernel - 内核模块分析器

linux - 预告片在内核黑客俚语中意味着什么?

java - 不需要操作系统的.NET CLR?

c - 无法在 gdb 上调试 lInux