xlhl3 发表于 2015-05-24 12:18

netlink收发消息

最近一直在看netlink相关的代码,一直在想一个问题,希望大家能给点建议。
netlink在内核中的实现,都是先接收到数据之后(netlink_kernel_create(net, NETLINK_ROUTE, RTNLGRP_MAX,
                                   rtnetlink_rcv, &rtnl_mutex, THIS_MODULE);),然后再向用户空间发送消息。

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

镇水铁牛 发表于 2015-05-24 15:42

netlink在内核中的实现,都是先接收到数据之后,然后再向用户空间发送消息
【回复】只有在netlink初始化时,用户态netlink模块会向内核netlink模块通信一次,一般是为传送其pid,后面的交互没有先收后发的限制。

xlhl3 发表于 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


   

nswcfd 发表于 2015-05-25 10:57

本帖最后由 nswcfd 于 2015-05-25 10:57 编辑

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

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

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


   

xlhl3 发表于 2015-05-25 12:08

回复 4# nswcfd
嗯嗯 我正在学习中,希望以后有机会多交流交流呀!~


   
页: [1]
查看完整版本: netlink收发消息