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(.....);