【问题标题】:Linux kernel module: Socket buffer (sk_buff->len) non-deterministic behaviourLinux 内核模块:套接字缓冲区 (sk_buff->len) 非确定性行为
【发布时间】:2014-07-11 20:00:11
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-25
      • 2010-10-03
      • 2011-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多