2012-02-16 5 views
0

私はpingに似たモジュールを作成しようとしています。パケットを受信する際に問題が発生しています。コードは次のとおりです。napiが受信に使用されました

#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); 
} 

モジュールはコンパイルされ、エラーなく実行されますが、しばらくしてからシステム全体がハングアップします。

+0

「システム全体は、いくつかの時間後にハング」問題かどうか、誰が間違って何を伝えるために、またはあなたのコードがハングアップする責任がある、またはそれがある場合にあってもために不十分ですあなたが投稿したコードまたは他の場所にあります。 –

+0

@JimGarrison私はちょうどチェック用のパケットとそのコードを受信するための新しいモジュールを作った....... – karan421

+0

@JimGarrison「ある時間の後に」とは、モジュールをインストールした後、システムがインストールされていないときにシステムが動作しない..... – karan421

答えて

2

は、私はあなたのサンプルコードでの問題のカップルを参照してください。

  1. SKBはalloc_skbによって割り当てられるべき()
  2. をkmallocのないあなたがnetif_receive_skbを呼び出した後、あなたはSKBを解放しないでください。あなたのコードはあなたがネットワークスタックに与えたので、もはやそのskbの所有者ではありません。
  3. 私はあなたがどんな方法でskbを埋めるのを見ません。たぶんコードを単純化しているだけかもしれません。しかし、今のように、あなたは初期化されていない(または、alloc_skb、初期化されているが空の)skbをネットワーキングスタックに送ります。

マイケル

関連する問題