2012-02-12 86 views
4

我想用netfilter钩子来处理简单的数据包检查。C - 不能访问saddr

宣言似乎相当简单:

unsigned int hook_func(unsigned int hooknum, struct sk_buff *skb, 
      const struct net_device *in, 
      const struct net_device *out, int (*okfn)(struct sk_buff *)) 
{ 

    struct iphdr *iph = (struct iphdr *)skb_network_header(skb); 

} 

,我还可以访问网络报头

iph->protocol == IPPROTO_TCP

然而

iph->saddr

失败的协议部分。有什么建议么?我觉得这是我的一个相当简单的错误,但所有的示例如下要么此方法,或者他们只是使用

struct iphdr *iph = ip_hdr(skb);

我得到这两种方法相同的行为。我已经通过skbuff.h查看了任何线索,但没有任何运气。

编辑:

难道这与他们的方式,我访问它做什么?现在调试我只是想打印出来的值用:

printk(KERN_DEBUG "%pI4", iph->saddr);

+0

你有错误信息吗?它是什么? – 2012-02-12 22:09:26

+0

它杀死了机器..我通常只是在我的虚拟机中重置快照。没有编译时错误。内核崩溃后有没有办法获得错误信息? – kevgliss 2012-02-12 22:27:32

回答

2

%pI4需要一个地址,让你在读可能无效的内存。改为使用&iph->saddr

+0

就是这样!谢谢你的收获。 – kevgliss 2012-02-12 23:23:27