文章随机晒最新文章关照最多的

jiayi Rss

Linux内核netlink_broadcast()广播自定义消息

| Posted in kernel |

31

最近在写路由协议,中间要用netlink进行内核态与用户态的通信,因为对netlink广播一直有点模糊,所以借这个机会上手练练。我的内核版本为2.6.25

netlink分内核API与用户API,这里我们主要介绍广播消息时用到的内核API,其中主要用到 netlink_kernel_create()netlink_broadcast()

netlink_kernel_create()从2.6.22开始有了较大变化,jiayi因此吃了苦头,所以先介绍它 --!

  • struct sock *netlink_kernel_create(struct net *net,
                          int unit,unsigned int groups,
                          void (*input)(struct sk_buff *skb),
                          struct mutex *cb_mutex,
                          struct module *module);

与之前相比,此函数增加了 net 与 cb_mutex 两个指针,那调用时直接把NULL丢给它们能行么?没错,我开始就这么干的,编译没问题,运行也丝毫看不出破绽,可调用netlink_broadcast()时,总是出错。开始以为netlink_broadcast()这步有问题,调了多半天,越调越乱。。最后决定从头一步一步调,在内核代码树中随手看了调用 netlink_kernel_create() 的代码,发现问题出在了net这个参数上。内核代码不约而同的将&init_net付给了net,再顺着找,init_net定义在net/core/net_namespace.c,声明在include/net/net_namespace.h。所以正确的调用形式为

  • netlink_kernel_create(&init_net, NETLINK_MY, group, callback_func, NULL, THIS_MODULE);

再说说netlink_broadcast(),它的用法与大多数文章介绍的没啥出入,使用的一个非常非常好的例子在drivers/connector/connector.c的cn_netlink_send()中,在其中学到了netlink_has_listeners()这个函数,非常好用哦~

Write a comment

You must be logged in to post a comment.