【问题标题】:Kernel Module: Netfilter hook not providing correct data via sk_buff内核模块:Netfilter 挂钩未通过 sk_buff 提供正确的数据
【发布时间】:2014-07-17 05:21:21
【问题描述】:

我有一个 linux 内核模块,它需要将通过 netfilter 钩子接收到的数据作为套接字缓冲区进行处理。

这就是我在回调中所做的,

unsigned char *eth = skb_mac_header(skb);
int len = skb->len + 14; //Assuming eth is 14 bytes. Neglecting VLAN case. 

for (int j=0; j < len; j++)
{
     printk("%X ", eth[j]);
}

在接收数据包时,我得到正确的长度。但是,某些 UDP 流量的数据包内容只有正确的 48 个字节(初始),其余字节不是我的接口接收的。用户空间应用程序正在接收接口上接收到的正确数据包内容。

谁能帮忙解释一下我做错了什么。帮助将不胜感激。谢谢。

【问题讨论】:

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


    【解决方案1】:

    skb_mac_header(skb) 为您提供指向 mac 标头的指针。它的有效长度是 skb->mac_len。

    如果您需要转储用户数据(有效负载),您可以将每个字符从 skb->data 打印到 skb->tail。以下链接显示了 skb 数据布局:http://vger.kernel.org/~davem/skb_data.html

    【讨论】:

    • 谢谢登基。刚试过。 skb->data 对于我正在测试的数据只有 6 个字节正确。这与 48 个字节相同 - (14 + 20 + 8 个网络标头)。我相信还有别的东西。
    • 可能是netfilter的限制。 NetFilter 可能必须对数据包头进行操作以减少延迟,因此,可能会在接收到完整的数据包数据之前调用挂钩。另一种可能性是碎片化。由于数据包碎片,数据包数据可能尚未完成。
    猜你喜欢
    • 2015-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    相关资源
    最近更新 更多