напи используется для получения - PullRequest
0 голосов
/ 16 февраля 2012

Я пытаюсь написать модуль, похожий на 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 Ответ

2 голосов
/ 10 марта 2012

Я вижу пару проблем с вашим примером кода:

  1. skb должен быть выделен alloc_skb (), а не kmalloc
  2. после вызова netif_receive_skb, вы не должны освобождатьSKB.Ваш код больше не является владельцем этого skb, поскольку вы передали его в сетевой стек.
  3. Я не вижу, чтобы вы заполняли skb каким-либо образом.Может быть, вы просто упрощаете код.Но, как и сейчас, вы отправляете неинициализированный (или используете инициализированный, но пустой alloc_skb) skb в сетевой стек.

Майкл

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...