C 用于接收的napi

C 用于接收的napi,c,linux,linux-kernel,C,Linux,Linux Kernel,我正在尝试编写一个类似于ping的模块。问题是在接收数据包时出现了。代码如下所示: #include<asm/uaccess.h> #include<linux/sched.h> #include<linux/wait.h> #include<linux/netfilter.h> #include<linux/netfilter_ipv4.h> struct net_device *dev; struct sk_buff *skb;

我正在尝试编写一个类似于ping的模块。问题是在接收数据包时出现了。代码如下所示:

#include<asm/uaccess.h>
#include<linux/sched.h>
#include<linux/wait.h>
#include<linux/netfilter.h>
#include<linux/netfilter_ipv4.h>

struct net_device *dev;
struct sk_buff *skb;
struct napi_struct *rnapi;

int rrpoll(struct napi_struct *napi,int budget)
{
   printk(KERN_ALERT"we are HEARRR%s,%d\n",__func__,__LINE__);
   skb = (struct sk_buff *)kmalloc(sizeof(struct sk_buff *),GFP_KERNEL);
   netif_receive_skb(skb);
   kfree(skb);
   return 0;
  }

static int rec_init(void)
{
  dev =  __dev_get_by_name(&init_net,"wlan0");
  rnapi = (struct napi_struct *)kmalloc(sizeof(struct napi_struct *),GFP_KERNEL);
  netif_napi_add(dev,rnapi,&rrpoll,100);
  napi_schedule(rnapi);
  return 0;
  }

static void rec_exit(void)
{
  //napi_complete(rnapi);
    netif_napi_del(rnapi);
}
#包括
#包括
#包括
#包括
#包括
结构网络设备*dev;
结构sk_buff*skb;
结构napi_结构*rnapi;
int rrpoll(结构napi_结构*napi,int预算)
{
printk(内核警报“我们正在接收%s,%d\n”,\uuuu func\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;
skb=(struct sk_buff*)kmalloc(sizeof(struct sk_buff*),GFP_内核);
netif_接收skb(skb);
kfree(skb);
返回0;
}
静态整数rec_init(void)
{
dev=u dev_get_by_name(&init_net,“wlan0”);
rnapi=(struct napi_struct*)kmalloc(sizeof(struct napi_struct*)),GFP_内核;
netif_napi_add(开发、rnapi和rrpoll,100);
国家适应行动计划(rnapi);
返回0;
}
静态无效记录退出(无效)
{
//完成napi(rnapi);
netif_napi_del(rnapi);
}

模块编译和运行时没有任何错误,但整个系统在一段时间后会挂起。

我发现您的示例代码有几个问题:

  • skb应该由alloc_skb()而不是kmalloc分配
  • 在您致电netif_receive_skb后,您不应释放skb。您的代码不再是该skb的所有者,因为您已将其提供给网络堆栈
  • 我没有看到你以任何方式填写skb。也许你只是在简化代码。但是现在,您正在向网络堆栈发送一个未初始化(或者如果使用alloc_skb,已初始化但为空)的skb

  • Michael

    “一段时间后整个系统都会挂起”不足以让任何人告诉你出了什么问题,甚至不足以告诉你是不是你的代码造成了挂起,或者如果是,问题是否出在你发布的代码或其他地方。@JimGarrison我制作了一个新模块,只用于接收任何数据包(只是为了检查)上面的代码……@JimGarrison“一段时间后”意味着每当我安装模块时,它就会挂起,而当模块未安装时,系统不会挂起……许多C代码编译时没有错误,但这并不意味着它是正确的。在这种情况下,我不认为NAPI是你想要使用的。NAPI设计用于在内核和设备驱动程序之间进行操作。看起来您正试图添加一个钩子来处理数据包。我建议改为研究netfilter。