现在的位置: 首页 > 综合 > 正文

netlink笔记(udev)

2017年12月22日 ⁄ 综合 ⁄ 共 691字 ⁄ 字号 评论关闭

在udev应用层进行下面的步抽:

uevent_netlink_sock = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT);
etval = bind(uevent_netlink_sock, (struct sockaddr *) &snl, sizeof(struct sockaddr_nl));

其中snl带了该进程的pid好。

然后就可以通过上面的socket进行发送数据。

但是底层也要有相应的接口:对于上面的
NETLINK_KOBJECT_UEVENT,是我们人为定义的一个数字,和af-inet中的协议号比较象。

使用netlink_kernel_create来创建内核中对应的sock,该函数一般会指定接受函数。

    nfnl = netlink_kernel_create(&init_net, NETLINK_NETFILTER, NFNLGRP_MAX,
                     nfnetlink_rcv, NULL, THIS_MODULE);

和用户空间进行数据通信。


NETLINK_KOBJECT_UEVENT,没有kernel的接受函数,是因为这个协议一般是内核有什么变动,比如添加设备,它只需要向用户空间发送数据就可以了,内核没有接收用户的数据。

kobject_uevent -》kobject_uevent_env-》            netlink_broadcast(uevent_sock, skb, 0, 1, GFP_KERNEL);

send_uevent广播事件到用户空间。调用函数netlink-broadcast

 

 


【上篇】
【下篇】

抱歉!评论已关闭.