Networking dev_queue_xmit随机返回带有tun/tap设备的NET_xmit_CN

Networking dev_queue_xmit随机返回带有tun/tap设备的NET_xmit_CN,networking,linux-kernel,kernel-module,netfilter,tun,Networking,Linux Kernel,Kernel Module,Netfilter,Tun,我有一个用户空间程序,它构造自己的数据包(App、UDP、IP)并write()s将其发送到TUN设备。这个数据包被我自己的Netfilter模块截获,它检查它收到的数据包是否是我们想要处理的数据包。然后,我的Netfilter模块将skb_clone()原始的skb,并创建一个响应数据包,我用一些数据填充该数据包以返回到用户空间程序。要发送响应,我使用dev\u queue\u xmit()。它随机返回NET\u XMIT\u CN,即使我刚刚创建了一个新的TUN设备,并且没有其他流量通过。如

我有一个用户空间程序,它构造自己的数据包(App、UDP、IP)并
write()
s将其发送到TUN设备。这个数据包被我自己的Netfilter模块截获,它检查它收到的数据包是否是我们想要处理的数据包。然后,我的Netfilter模块将
skb_clone()
原始的
skb
,并创建一个响应数据包,我用一些数据填充该数据包以返回到用户空间程序。要发送响应,我使用
dev\u queue\u xmit()
。它随机返回
NET\u XMIT\u CN
,即使我刚刚创建了一个新的TUN设备,并且没有其他流量通过。如果我继续执行用户空间程序(向TUN设备发送新的数据包),最终TUN设备将响应,但不会一致。我似乎无法找到它为何表现得如此不稳定

本质上,我使用TUN设备作为一种机制,从用户空间到内核空间进行通信,反之亦然

以下是我的用户空间应用程序:

tun_fd=tun_alloc(dev_name);
数据包=…/*构造请求*/
nwrite=写入(tun\u fd,packet,packet\u len);
...
未签字的登记簿[1500];
接收到的int=0;
而(!已收到){
nread=读取(tun_fd,recv_buf,1500);
...
}
...
关闭(tun_fd);
这是我的Netfilter模块:

静态结构nf\u hook\u ops nfho;
静态int\u init my\u hook(void)
{
nfho.hook=hook_func;
nfho.hooknum=0;
nfho.hook=PF_INET;
nfho.hook=NF_IP_PRI_FIRST;
nf_寄存器_挂钩(&nfho);
}
unsigned int hook_func(void*priv,struct sk_buff*skb,const struct nf_hook_state*state)
{
结构sk_buff*clone_skb=skb_clone(skb,GFP_内核):
...
/*
*检查包裹是否是给我们的。
*检查IP和UDP标头等
*如果是,解析请求,将响应克隆放在一起
*/
...
如果((err=dev\u queue\u xmit(clone\u skb))!=0){
printk(…)
/*它要么返回0(成功),要么返回2,表示净*/
}
归还被盗的NFU;
}
我似乎无法理解这种行为。我是否误用了TUN设备?有比这更简单的方法吗

请让我知道我是否应该提供任何额外的细节或澄清一些事情