netfilter内核态与用户态 通信 之 sockopt
用户态与内核态交互通信的方法不止一种,sockopt是比较方便的一个,写法也简单.缺点就是使用 copy_from_user()/copy_to_user()完成内核和用户的通信, 效率其实不高, 多用在传递控制 选项 信息,不适合做大量的数据传输
用户态函数:发送:int setsockopt ( int sockfd, int proto, int cmd, void *data, int datelen);接收:int getsockopt(int sockfd, int proto, int cmd, void *data, int datalen)第一个参数是socket描述符;第二个参数proto是sock协议,IP RAW的就用SOL_SOCKET/SOL_IP等,TCP/UDP socket的可用SOL_SOCKET/SOL_IP/SOL_TCP/SOL_UDP等,即高层的socket是都可以使用低层socket的命令字 的,IPPROTO_IP;第三个参数cmd是操作命令字,由自己定义;第四个参数是数据缓冲区起始位置指针,set操作时是将缓冲区数据写入内核,get的时候是将内核中的数 据读入该缓冲区;第五个参数数据长度
内核态函数注册:nf_register_sockopt(struct nf_sockopt_ops *sockops)解除:nf_unregister_sockopt(struct nf_sockopt_ops *sockops)
结构体 nf_sockopt_ops test_sockops
附上我修改网友的程序内核态的module.c[root@root socket]# make //编译make -C /lib/modules/2.6.31.5-127.fc12.i686.PAE/build SUBDIRS=/root/study/c_study/socket modules make[1]: Entering directory `/usr/src/kernels/2.6.31.5-127.fc12.i686.PAE' CC [M] /root/study/c_study/socket/module.o LD [M] /root/study/c_study/socket/socketopt.o Building modules, stage 2. MODPOST 1 modules CC /root/study/c_study/socket/socketopt.mod.o LD [M] /root/study/c_study/socket/socketopt.komake[1]: Leaving directory `/usr/src/kernels/2.6.31.5-127.fc12.i686.PAE'gcc -o user user.c[root@root socket]# [root@root socket]# make insmod //加载insmod socketopt.ko[root@root socket]# [root@root socket]# lsmod //查看加载成功Module Size Used bysocketopt 1968 0 sunrpc 158388 1 [root@root socket]# dmesg -c //清楚以前的系统信息[root@root socket]# ./user //运行用户态setsockopt: ret = 0. msg = ----------user------------getsockopt: ret = 0. msg = --------kernel---------[root@root socket]# dmesg //查看最新生成的日志sockopt: recv_msg()recv_msg: umsg = ----------user------------. ret = 0sockopt: send_msg()send_msg: umsg = --------kernel---------. ret = 0. success