2016-11-03 2 views
0
static 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*)) 
{  
     int i=0; 
     struct iphdr *iph = ip_hdr(skb); 
     unsigned long saddr = 0 , daddr = 0; 
     unsigned long snet = 0; //dnet =0; 
     int dst_cnt=0 , src_cnt=0; 

     //printk("netfilter called\n"); 

     //down(&sema); 
     Netfilter_Execute++; 

     saddr = iph->saddr; 
     daddr = iph->daddr; 

Когда я запускаю эту программу модуля, Linux выключается и перезагружается. Когда я тестирую программу, iph имеет значение null, поэтому saddr = iph->saddr and daddr = iph->daddr был не прав.Не знаю почему ip_hdr (skb) return NULL

Не знаю почему iph = ip_hdr(skb)NULL.

ответ

1

Проблема может зависеть от того, какой крюк вы используете, вам нужно учитывать, где ваше место крючка связано с модулем маршрутизации ядра.

Позвольте мне показать вам эти 2 примера

  1. Если вы используете

    NF_IP_LOCAL_OUT

    Пакет, который вы получаете в вашем крючке не идет бросить модуль маршрутизации в ядре, поэтому у него не будет заголовка

  2. При использовании

    NF_IP_LOCAL_IN

    Пакет будет идти кидать модуль маршрутизации, но модуль маршрутизации будет удалить заголовок пакета и направить его на внутренний процесс

+0

Я использую NF_INET_PRE_ROUTING –

1

попробуйте: вместо struct iphdr *iph = ip_hdr(skb);, тип struct iphdr *iph = (struct iphdr *)skb_network_header(skb);

Смежные вопросы