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
。
答案 0 :(得分:1)
问题可能取决于你使用哪个钩子, 你必须记住你的钩子位置与内核路由模块的关系。
让我告诉你这两个例子
如果您使用
NF_IP_LOCAL_OUT
你在钩子中收到的数据包不会在内核中抛出路由模块,因此它没有标题
如果您使用
NF_IP_LOCAL_IN
数据包将抛出路由模块,但路由模块将删除数据包的标头并将其路由到内部进程
答案 1 :(得分:1)
尝试:
而不是struct iphdr *iph = ip_hdr(skb);
,请输入struct iphdr *iph = (struct iphdr *)skb_network_header(skb);