首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于接收的napi

用于接收的napi
EN

Stack Overflow用户
提问于 2012-02-17 02:29:27
回答 1查看 884关注 0票数 0

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

代码语言:javascript
复制
#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);
}

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-11 02:40:45

我在你的示例代码中发现了一些问题:

kmalloc

  • skb应该由alloc_skb()而不是kmalloc

  • 分配。在调用netif_receive_skb之后,您不应该释放skb。你的代码不再是那个skb的所有者,因为你已经把它交给了网络堆栈。

  • ,我不认为你会以任何方式填充skb。也许你只是在简化代码。但就像现在一样,您正在向网络堆栈发送一个未初始化(或如果您使用alloc_skb,已初始化但为空)的skb。

迈克尔

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9316940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档