커널내에서 skb를 queue로 저장하는 방법

익명 사용자의 이미지

커널내 IP Layer에서 NF_HOOK을 하여서

제가 작성한 모듈에다가 sk_buff를 저장하려고 합니다

커널에서 제공하는 skb_queue_tail함수를 사용해서 enqueue를 하고

특정 알고리즘을 돌려서 만족할 경우 skb_dequeue 함수를 이용해서 dequeue 하도록 모듈을 작성하였는데

모듈을 올리는 순간 컴퓨터가 다운이 되어버립니다.

아래는 간략히 쓴 main_hook함수 내의 코드입니다

unsigned int main_hook(unsigned int hooknum, 
                       struct sk_buff **skb, 
                       const struct net_device *in, 
                       const struct net_device *out, 
                       int (*okfn)(struct sk_buff*))
{
      struct sk_buff *skb_temp;
      struct sk_buff_head *list_temp;
 
      skb_temp=skb_copy((*skb), GFP_ATOMIC);
      skb_queue_tail(list_temp, skb_temp);
 
 
 
      skb_temp=skb_dequeue(list_temp);
 
      return NF_ACCEPT;
}

위와 같이 enqueue한뒤 dequeue하도록 작성하였는데 어디가 문제인지 모르겠습니다

도움 부탁드립니다

wariua의 이미지

list_temp 변수가 초기화 안 돼 있다는 컴파일러 경고가 나지 않던가요? 커널 웁스가 나는 건 가리키는 sk_buff_head 개체 없는 엄한 포인터를 skb_queue_tail()로 전달해서일 겁니다.

"모듈을 올리는 순간" 멎었다는 게 좀 걸리기도 하네요. 기본적으로 들어오는 패킷이 없는 호스트에서라면 초기화 루틴에 문제가 있는 걸 수도 있으니까요. 패닉 메시지의 스택 트레이스가 있다면 문제가 발생한 지점을 좀 더 정확하게 특정할 수 있을 텐데요...

$PWD `date`