Linux内核模块:套接字缓冲区(sk_buff-> len)非确定性行为

时间:2014-05-22 16:38:30

标签: 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如何知道堆栈以及在什么时候?

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

1 个答案:

答案 0 :(得分:0)

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