内核模块:Netfilter挂钩不通过sk_buff提供正确的数据

时间:2014-05-28 06:06:29

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

我有一个linux内核模块需要处理通过netfilter hook接收的数据作为套接字缓冲区。

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

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个字节(初始),其余字节不是我的接口所接收的。用户空间应用程序正在接收在接口上接收的正确数据包内容。

任何人都可以帮助解释我做错了什么。将非常感谢帮助。谢谢。

1 个答案:

答案 0 :(得分:0)

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

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