我不知道为什么ip_hdr(skb)返回NULL

时间:2016-11-03 14:10:06

标签: c ip netfilter

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为空,因此saddr = iph->saddr and daddr = iph->daddr错误。

我不知道为什么iph = ip_hdr(skb)会返回NULL

2 个答案:

答案 0 :(得分:1)

问题可能取决于你使用哪个钩子, 你必须记住你的钩子位置与内核路由模块的关系。

让我告诉你这两个例子

  1. 如果您使用

      

    NF_IP_LOCAL_OUT

    你在钩子中收到的数据包不会在内核中抛出路由模块,因此它没有标题

  2. 如果您使用

      

    NF_IP_LOCAL_IN

    数据包将抛出路由模块,但路由模块将删除数据包的标头并将其路由到内部进程

答案 1 :(得分:1)

尝试: 而不是struct iphdr *iph = ip_hdr(skb);,请输入struct iphdr *iph = (struct iphdr *)skb_network_header(skb);