免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2938 | 回复: 4

[通信方式] netlink收发消息 [复制链接]

论坛徽章:
0
发表于 2015-05-24 12:18 |显示全部楼层
最近一直在看netlink相关的代码,一直在想一个问题,希望大家能给点建议。
netlink在内核中的实现,都是先接收到数据之后(netlink_kernel_create(net, NETLINK_ROUTE, RTNLGRP_MAX,
                                   rtnetlink_rcv, &rtnl_mutex, THIS_MODULE);),然后再向用户空间发送消息。

使用netlink, 能不能在内核中不接受用户空间的消息,只是当检测到某一状态变化后,向用户空间发送消息?

论坛徽章:
2
寅虎
日期:2014-11-25 21:47:342015小元宵徽章
日期:2015-03-06 15:58:18
发表于 2015-05-24 15:42 |显示全部楼层
netlink在内核中的实现,都是先接收到数据之后,然后再向用户空间发送消息
【回复】只有在netlink初始化时,用户态netlink模块会向内核netlink模块通信一次,一般是为传送其pid,后面的交互没有先收后发的限制。

论坛徽章:
0
发表于 2015-05-24 23:26 |显示全部楼层
回复 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


   

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
发表于 2015-05-25 10:57 |显示全部楼层
本帖最后由 nswcfd 于 2015-05-25 10:57 编辑

回复 1# xlhl3
可以的吧,向iptables的ULOG之类,就是用的组播消息。

==================================

不好意思,原来你已经自己找到答案了。


   

论坛徽章:
0
发表于 2015-05-25 12:08 |显示全部楼层
回复 4# nswcfd
嗯嗯 我正在学习中,希望以后有机会多交流交流呀!~


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP