我有一个内核模块,它从netfilter hook读取数据包并使用sk_buff
来访问数据。
我观察到的是,当数据包速度很慢时,sk_buff->len
表现正常,但当数据包以更高的速率(1Gbps等)到达时,少数数据包的sk_buff->len
开始增加(总是多个数据包) 8)。
我正在重播的数据也包含碎片数据包。是否碎片包被附加在同一sk_buff
中导致sk_buff->len
增加?如果是,sk_buff
如何知道堆栈以及在什么时候?
有人可以解释为什么会发生这种情况以及如何解决这个问题。对某些文档的任何引用也会有所帮助。
答案 0 :(得分:0)
此行为的原因是GRO(通用接收卸载)。这是接收端的优化,就像TSO或GSO一样。它在一个大的skb缓冲区中附加具有相同tcp和ip头的数据包,以使内核处理更容易。