Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 内核模块:Netfilter挂钩未通过sk_buff提供正确的数据_Linux_Linux Kernel_Kernel_Linux Device Driver_Kernel Module - Fatal编程技术网

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

Linux 内核模块:Netfilter挂钩未通过sk_buff提供正确的数据,linux,linux-kernel,kernel,linux-device-driver,kernel-module,Linux,Linux Kernel,Kernel,Linux Device Driver,Kernel Module,我有一个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]); } 在接收数

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


谁能帮我解释一下我做错了什么。非常感谢您的帮助。谢谢

skb_mac_headerskb为您提供指向mac头的指针。其有效长度为skb->mac_len


如果需要转储用户数据负载,可以将每个字符从skb->data打印到skb->tail。以下链接显示skb数据布局:。

谢谢Denkie。我试过了。skb->数据只有6个字节适合我测试的数据。这与48字节-14+20+8的网络头相同。我相信还有其他原因。这可能是netfilter的局限性。NetFilter可能必须对数据包报头进行操作以减少延迟,因此,可以在接收到完整的数据包数据之前调用钩子。另一种可能性是分裂。由于数据包碎片,数据包数据可能尚未完成。