2012-02-16 2 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를 네트워킹 스택에 보냅니다.

마이클

관련 문제