免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4604 | 回复: 7
打印 上一主题 下一主题

请教一个2.6.32下面使用netlink从内核向用户空间广播消息的编程问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-05 10:59 |只看该作者 |倒序浏览
需要在2.6.32下面使用netlink从内核向用户空间广播消息,
看过多个netlink的实例,移植到2.6.32上,由于NETLINK_CB和skb的定义不同了,
因此都需要修改,最终还是能够成功编译,但是,这些实例多数都是从用户空间发起通信,
然后从内核里面响应,再发回到(单播或者广播)用户空间,而我需要的是内核向用户空间广播消息,
倒是看到了一个实例,就是http://www.diybl.com/course/6_sy ... 20071226/94120.html里面的,提到了广播的问题,如下:

>>>>>>>>>>>>>>>>>>引用的 华丽的分割线 开始>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

两个应用程序在监听同一个netlink广播组.内核模块发送一个netlink消息给这个广播组,所用的应用程序都收到它,代码如下:
#include <sys/socket.h>
#include <linux/netlink.h>
#define MAX_PAYLOAD 1024  /* maximum payload size*/
struct sockaddr_nl src_addr, dest_addr;
struct nlmsghdr *nlh = NULL;
struct iovec iov;
int sock_fd;
void main() ...{
sock_fd=socket(PF_NETLINK, SOCK_RAW, NETLINK_TEST);
memset(&src_addr, 0, sizeof(local_addr));
src_addr.nl_family = AF_NETLINK;      
src_addr.nl_pid = getpid();  /**//* self pid */
/**//* interested in group 1<<0 */  
src_addr.nl_groups = 1;
bind(sock_fd, (struct sockaddr*)&src_addr,
      sizeof(src_addr));
memset(&dest_addr, 0, sizeof(dest_addr));
nlh = (struct nlmsghdr *)malloc(
                          NLMSG_SPACE(MAX_PAYLOAD));
memset(nlh, 0, NLMSG_SPACE(MAX_PAYLOAD));      
   
iov.iov_base = (void *)nlh;
iov.iov_len = NLMSG_SPACE(MAX_PAYLOAD);
msg.msg_name = (void *)&dest_addr;
msg.msg_namelen = sizeof(dest_addr);
msg.msg_iov = &iov;
msg.msg_iovlen = 1;
printf("Waiting for message from kernel ");
/**//* Read message from kernel */
recvmsg(fd, &msg, 0);
printf(" Received message payload: %s ",
        NLMSG_DATA(nlh));
close(sock_fd);
}  
内核代码:





#define MAX_PAYLOAD 1024
struct sock *nl_sk = NULL;
void netlink_test() ...{
sturct sk_buff *skb = NULL;
struct nlmsghdr *nlh;
int err;
nl_sk = netlink_kernel_create(NETLINK_TEST,
                               nl_data_ready);
skb=alloc_skb(NLMSG_SPACE(MAX_PAYLOAD),GFP_KERNEL);
nlh = (struct nlmsghdr *)skb->data;
nlh->nlmsg_len = NLMSG_SPACE(MAX_PAYLOAD);
nlh->nlmsg_pid = 0;  /**//* from kernel */
nlh->nlmsg_flags = 0;
strcpy(NLMSG_DATA(nlh), "Greeting from kernel!");
/**//* sender is in group 1<<0 */
NETLINK_CB(skb).groups = 1;
NETLINK_CB(skb).pid = 0;  /**//* from kernel */
NETLINK_CB(skb).dst_pid = 0;  /**//* multicast */
/**//* to mcast group 1<<0 */
NETLINK_CB(skb).dst_groups = 1;
/**//*multicast the message to all listening processes*/
netlink_broadcast(nl_sk, skb, 0, 1, GFP_KERNEL);
sock_release(nl_sk->socket);
}  
我们运行用户程序:


./nl_recv &
Waiting for message from kernel
./nl_recv &
Waiting for message from kernel

然后我们加载内核模块到内核空间,会看到如下信息::

Received message payload: Greeting from kernel!
Received message payload: Greeting from kernel!

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>引用的华丽的分割线 结束>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

这个我修改移植到2.6.32上,由于版本不同,必须修改netlink_kernel_create的参数,删除了NETLINK_CB(skb).dst_pid,
但是运行的时候,却没有得到预期的广播效果。

请教,问题在哪里呢?
内核是我重新编译配置过的,是否有内核选项需要额外注意呢?

谢谢!!




论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
2 [报告]
发表于 2012-03-05 13:32 |只看该作者
回复 1# chiwq

你的内核态程序已经是按照 2.6.32 的接口修改过了吧

   

论坛徽章:
0
3 [报告]
发表于 2012-03-05 14:46 |只看该作者
回复 2# Godbach


    是的,不知道那个dst_pid一般是如何替代的,反正32里面是不认的

论坛徽章:
0
4 [报告]
发表于 2013-05-01 19:26 |只看该作者
楼主,这个问题解决没?我现在也需要用到netlink内核广播消息,但是按照接口改了实现不了啊?

论坛徽章:
0
5 [报告]
发表于 2016-07-19 15:40 |只看该作者
楼主,这都几年了,这个问题解决没,最近也碰到这个问题了,想请教

论坛徽章:
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
6 [报告]
发表于 2016-07-20 12:36 |只看该作者
没仔细看,就是内核实现变了,user space的API应该还是稳定的语义呀?

论坛徽章:
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
7 [报告]
发表于 2016-07-20 12:40 |只看该作者
逻辑上netlink_broadcast跟skb->NETLINK_CB没有任何关系吧?

论坛徽章:
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
8 [报告]
发表于 2016-07-20 13:17 |只看该作者
貌似唯一的作用是recvmsg的时候填充msg_name里的sockaddr_nl->dst_group。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP