Netlink是一种进程间通信的机制,是socket套接子的一种。他可以用于和内核进程之间进行通信,功能类似于系统调用和ioctl等。
Linux内核为我们提供了现成的API,让我们可以方便的与内核进行通信。接下来记录Netlink的创建过程:
准备工作:
1)确定新的Netlink协议类型(例:NEW_TYPE)
2)如果使用组播的话,定义组播地址 (单播就不用)
3)封装自己的数据结构
4)定义所需的消息类型。
应用层:
1.首先创建一个套接子:
fd = socket(AF_NETLINK,SOCK_DGRAM,NEW_TYPE);
第二个参数也可以使用SOCK_RAW
2.绑定套接子:
bind(fd,);
3.现在就可以接收和发送数据了
sendmsg()
recvmsg()
也可以使用其他的API,如recvfrom,recv。
内核层:
1.创建netlink:
netlink_kernel_create();&init_net, NEW_TYPE, 0,recv_skb_function,NULL,THIS_MODULE);
参数含义:
第一个:不太明白是什么意思。
第二个:内核会创建一个新的协议类型。
第三个:应该是和组播相关的设置 <32是一样的。
第四个:用于接受数据的回调函数
第五个:?
第六个:?
内核提供的API,只要参数无误就一条语句就创建好netlink了。
不同的版本这个函数的参数是有差异的,我使用的是2.6.32,对于不同版本的接口具体还是通过查看内核源码来了解的。推荐使用http://lxr.free-electrons.com阅读,还是很方便的。
2.构造接收和发送函数
void recv_skb_function(struct sk_buff * skb);
int send_msg_function(.....);