netlink收发消息
最近一直在看netlink相关的代码,一直在想一个问题,希望大家能给点建议。netlink在内核中的实现,都是先接收到数据之后(netlink_kernel_create(net, NETLINK_ROUTE, RTNLGRP_MAX,
rtnetlink_rcv, &rtnl_mutex, THIS_MODULE);),然后再向用户空间发送消息。
使用netlink, 能不能在内核中不接受用户空间的消息,只是当检测到某一状态变化后,向用户空间发送消息? netlink在内核中的实现,都是先接收到数据之后,然后再向用户空间发送消息
【回复】只有在netlink初始化时,用户态netlink模块会向内核netlink模块通信一次,一般是为传送其pid,后面的交互没有先收后发的限制。 回复 2# 镇水铁牛
今天看内核代码的时候发现,如果使用的是广播(netlink_broadcast)的话,那就不需要先接收用户空间的消息,而是内核直接广播消息给用户空间。
以下是摘自/lib/kobject_uevent.c中的部分代码实现:
int kobject_uevent_env(struct kobject *kobj, enum kobject_action action,
char *envp_ext[])
{
......
/* send netlink message */
if (uevent_sock) {
struct sk_buff *skb;
size_t len;
/* allocate message with the maximum possible size */
len = strlen(action_string) + strlen(devpath) + 2;
skb = alloc_skb(len + env->buflen, GFP_KERNEL);
if (skb) {
char *scratch;
/* add header */
scratch = skb_put(skb, len);
sprintf(scratch, "%s@%s", action_string, devpath);
/* copy keys to our continuous event payload buffer */
for (i = 0; i < env->envp_idx; i++) {
len = strlen(env->envp) + 1;
scratch = skb_put(skb, len);
strcpy(scratch, env->envp);
}
NETLINK_CB(skb).dst_group = 1;
netlink_broadcast(uevent_sock, skb, 0, 1, GFP_KERNEL);
}
}
......
return retval;
}
static int __init kobject_uevent_init(void)
{
uevent_sock = netlink_kernel_create(&init_net, NETLINK_KOBJECT_UEVENT,
1, NULL, NULL, THIS_MODULE);
if (!uevent_sock) {
printk(KERN_ERR
"kobject_uevent: unable to create netlink socket!\n");
return -ENODEV;
}
return 0;
}
使用的是NETLINK_KOBJECT_UEVENT, 广播组编号为1
本帖最后由 nswcfd 于 2015-05-25 10:57 编辑
回复 1# xlhl3
可以的吧,向iptables的ULOG之类,就是用的组播消息。
==================================
不好意思,原来你已经自己找到答案了。:)
回复 4# nswcfd
嗯嗯 我正在学习中,希望以后有机会多交流交流呀!~
页:
[1]