阅读:2100回复:1
netlink问题,很奇怪
写了个模块,其中用到了netlink,编译通过,没有错误和警告,可是就是加载不了,只是说操作不被允许,不知道为什么。请大家帮忙看看。谢谢
#include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> #include <linux/types.h> #include <linux/netdevice.h> #include <linux/skbuff.h> #include <linux/netfilter_ipv4.h> #include <linux/inet.h> #include <linux/in.h> #include <linux/ip.h> #include <linux/netlink.h> #include <linux/spinlock.h> #include <asm/semaphore.h> #include <net/sock.h> #include<asm/atomic.h> DECLARE_MUTEX(receive_sem); atomic_t check_configer=ATOMIC_INIT(0); struct netlink_configer_packet { struct nlmsghdr configer_h; int configer; }; static struct sock *nlfd; static struct nf_hook_ops check_tor_ops; static void kernel_receive(struct sock *sk,int len) { do { struct sk_buff *skb; if(down_trylock(&receive_sem)) return; while((skb=skb_dequeue(&sk->sk_receive_queue))!=NULL) { struct netlink_configer_packet *ncp=NULL; if(skb->len>=sizeof(struct netlink_configer_packet)) { ncp=(struct netlink_configer_packet *)skb->data; if((ncp->configer_h.nlmsg_len>=sizeof(struct netlink_configer_packet)) &&(skb->len>=ncp->configer_h.nlmsg_len)) { if(ncp->configer==1986) { atomic_set(&check_configer,1986); } } } kfree_skb(skb); } up(&receive_sem); }while(nlfd && nlfd->sk_receive_queue.qlen); } static unsigned int check_tor_hook(unsigned int hook, struct sk_buff **pskb, const struct net_device *in, const struct net_device *out, int (*okfn)(struct sk_buff *)) { if(atomic_sub_and_test(1986,&check_configer)) return NF_ACCEPT; printk(KERN_EMERG "ONE PACKET!"); return NF_ACCEPT; } static int check_tor_init(void) { nlfd=netlink_kernel_create(NETLINK_ROUTE,0,kernel_receive,THIS_MODULE); if(!nlfd) { printk(KERN_EMERG "CON'T CREAT A NETLINK SOCKET\n"); return -1; } check_tor_ops.hook=check_tor_hook; check_tor_ops.pf=PF_INET; check_tor_ops.hooknum=NF_IP_PRE_ROUTING; check_tor_ops.priority=NF_IP_PRI_FILTER+2; if(nf_register_hook(&check_tor_ops)!=0) printk(KERN_EMERG "THE HOOK CAN'T CREAT\n"); else return 0; } static void check_tor_exit(void) { if(nlfd) { sock_release(nlfd->sk_socket); } nf_unregister_hook(&check_tor_ops); } module_init(check_tor_init); module_exit(check_tor_exit); |
|
沙发#
发布于:2008-01-29 18:18
解决了,是协议的问题,不过还是不清楚,学习中.........
|
|