netfilter提供了nf_register_sockopt()和nf_unregister_sockopt()来动态登记或取消sockopt命令字;打开一个网络socket后可以使用set/getsockopt(2)可实现用户空间与内核的通信,本质和ioctl差不多,区别在于set/getsockopt不用新建设备,直接利用系统已有的socket类型就可以进行,可用setsockopt函数向内核写数据,用getsockopt向内核读数据
module
c:#include#include#include#include#include#include#include#defineSOCKET_OPS_BASE128#defineSOCKET_OPS_SET(SOCKET_OPS_BASE)#defineSOCKET_OPS_GET(SOCKET_OPS_BASE)#defineSOCKET_OPS_MAX(SOCKET_OPS_BASE+1)#defineKMSG"amessagefromkernel"#defineKMSG_LENsizeof("amessagefromkernel")MODULE_LICENSE("GPL");staticintrecv_msg(structsock*sk,intcmd,void__user*user,unsignedintlen){intret=0;printk(KERN_INFO"sockopt:recv_msg()\n");if(cmd==SOCKET_OPS_SET){charumsg[64];intlen=sizeof(char)*64;memset(umsg,0,len);ret=copy_from_user(umsg,user,len);printk("recv_msg:umsg=%s
ret=%d\n",umsg,re