napi用于接收

时间:2012-02-16 18:29:27

标签: 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;
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);
}

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

1 个答案:

答案 0 :(得分:2)

我发现您的示例代码存在一些问题:

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