netfilter,协议号的问题,附源代码!!!!!!
基督山大树 2014-08-04 06:59:39
static unsigned int hook_fn(unsigned int hooknum,
struct sk_buff *skb,
const struct net_device *in,
const struct net_device *out,
int (*okfn)(struct sk_buff *))
{
if(!skb){
printk(KERN_ALERT"SKB IS NULL\n");
return NF_ACCEPT;
}
spin_lock_irq(&g_lock);
if(skb->protocol==htons(ETH_P_IP))
{
printk(KERN_ALERT"hooknum=%i\n",hooknum);
}
else{
printk(KERN_ALERT"hooknum=%i;protocol=%x[%x];len=%u\n",hooknum,ntohs(skb->protocol),skb->protocol,skb->len);
}
return NF_ACCEPT;
};
struct nf_hook_ops hook_ops[]=
{
{
.hook=hook_fn,
.owner=THIS_MODULE,
.pf=PF_BRIDGE,
.hooknum=NF_IP_PRE_ROUTING,
.priority=NF_IP_PRI_FIRST,
},
{
.hook=hook_fn,
.owner=THIS_MODULE,
.pf=PF_INET,
.hooknum=NF_IP_LOCAL_IN,
.priority=NF_IP_PRI_FIRST+1,
},
{
.hook=hook_fn,
.owner=THIS_MODULE,
.pf=PF_INET,
.hooknum=NF_IP_FORWARD,
.priority=NF_IP_PRI_FIRST+2,
},{
.hook=hook_fn,
.owner=THIS_MODULE,
.pf=PF_INET,
.hooknum=NF_IP_LOCAL_OUT,
.priority=NF_IP_PRI_FIRST+3,
},
{
.hook=hook_fn,
.owner=THIS_MODULE,
.pf=PF_INET,
.hooknum=NF_IP_POST_ROUTING,
.priority=NF_IP_PRI_FIRST+4,
},
};
static __init int net_filter_init(void){
printk(KERN_ALERT"init\n");
spin_lock_init(&g_lock);
return nf_register_hooks((struct nf_hook_ops*)&hook_ops,NF_IP_NUMHOOKS);
}
static __exit void net_filter_exit(void){
nf_unregister_hooks((struct nf_hook_ops*)&hook_ops,NF_IP_NUMHOOKS);
printk(KERN_ALERT"exit\n");
}
module_init(net_filter_init);
module_exit(net_filter_exit);
以上为代码,简简单单几行,可运行的时候不管怎么样skb->protocol==htons(ETH_P_IP)都不为真,也就是无法获得IP包,打印的协议号总是奇奇怪怪的,如下所示:
hooknum=3;protocol=0[0];len=3360257716
hooknum=4;protocol=5fc0[c05f];len=0
hooknum=3;protocol=0[0];len=3360257716
hooknum=1;protocol=7c9[c907];len=3434676224
hooknum=4;protocol=5fc0[c05f];len=0
请问怎么样才能获取IP包,谢谢各位了!