在Broadcom中提供了自己的消息机制,有两种消息形式:Request/Response and Event(事件)

Request/Response消息:进程之间的通信都是通过smd,所有的消息都是先发送到smd,smd收到信息后,如果消息目的是smd的就做相应的操作,如果不是,就把这个消息route出去

Event messages :对某些事件感兴趣的进程,可以CMS_MSG_REGISTER_EVENT_INTEREST注册此感兴趣事件。事件发生时,将事件信息发送给smd,smd再将事件信息发送给感兴趣的进程。

1. smd与其他进程的通信的实现

smd监听消息

if ((fd = socket(AF_LOCAL, SOCK_STREAM, 0)) < 0)
{
cmsLog_error("Could not create socket");
return fd;
}

/*
* Bind my server address and listen.
*/
memset(&serverAddr, 0, sizeof(serverAddr));
serverAddr.sun_family = AF_LOCAL;
strncpy(serverAddr.sun_path, SMD_MESSAGE_ADDR, sizeof(serverAddr.sun_path));

rc = bind(fd, (struct sockaddr *) &serverAddr, sizeof(serverAddr));
if (rc != 0)
{
cmsLog_error("bind to %s failed, rc=%d errno=%d", SMD_MESSAGE_ADDR, rc, errno);
close(fd);
return -1;
}

rc = listen(fd, SMD_MESSAGE_BACKLOG);
if (rc != 0)
{
cmsLog_error("listen to %s failed, rc=%d errno=%d", SMD_MESSAGE_ADDR, rc, errno);
close(fd);
return -1;
}

其他进程连接到smd:cmsMsg_init

cmsMsg_init具体实现

/*
* Create a unix domain socket.
*/
handle->commFd = socket(AF_LOCAL, SOCK_STREAM, 0);
if (handle->commFd < 0)
{
cmsLog_error("Could not create socket");
cmsMem_free(handle);
return CMSRET_INTERNAL_ERROR;
}

/*
* Set close-on-exec, even though all apps should close their
* fd's before fork and exec.
*/
if ((rc = fcntl(handle->commFd, F_SETFD, FD_CLOEXEC)) != 0)
{
cmsLog_error("set close-on-exec failed, rc=%d errno=%d", rc, errno);
close(handle->commFd);
cmsMem_free(handle);
return CMSRET_INTERNAL_ERROR;
}

/*
* Connect to smd.
*/
memset(&serverAddr, 0, sizeof(serverAddr));
serverAddr.sun_family = AF_LOCAL;
strncpy(serverAddr.sun_path, SMD_MESSAGE_ADDR, sizeof(serverAddr.sun_path));

rc = connect(handle->commFd, (struct sockaddr *) &serverAddr, sizeof(serverAddr));
if (rc != 0)
{
cmsLog_error("connect to %s failed, rc=%d errno=%d", SMD_MESSAGE_ADDR, rc, errno);
close(handle->commFd);
cmsMem_free(handle);
return CMSRET_INTERNAL_ERROR;
}
else
{
cmsLog_debug("commFd=%d connected to smd", handle->commFd);
}

这样就建立了其他进程与smd的连接,阻塞等待事件的发生

/* pend, waiting for one or more fds to become ready */
rv = select(maxFd+1, &readFds, NULL, NULL, &tm);

用cmsMsg_send cmsMsg_receive发送接收信息,事件发生之后,processMessage处理信息

2. 与kernel的通信

底层 atm, dsl, eth 状态发生改变的时候,会发信息给ssk,ssk再把信息发送给smd

/*
* Initialize special socket to kernel for WAN link-up, link-down events.
* The kernel notification mechanism uses the error channel of some existing fd.
* See webmain in cfm/web.
*/
if ((ret = initKernelMonitorFd()) != CMSRET_SUCCESS)

initKernelMonitorFd:

if ((kernelMonitorFd = socket(AF_NETLINK, SOCK_RAW, NETLINK_BRCM_MONITOR)) < 0)
//if ((kernelMonitorFd = socket(AF_NETLINK, SOCK_RAW, NETLINK_UNUSED)) < 0)
{
cmsLog_error("Could not open netlink socket for kernel monitor");
return CMSRET_INTERNAL_ERROR;
}
else
{
cmsLog_debug("kernelMonitorFd=%d", kernelMonitorFd);
}

addr.nl_family = AF_NETLINK;
addr.nl_pid = getpid();
addr.nl_groups = 0;

if (bind(kernelMonitorFd,(struct sockaddr *)&addr,sizeof(addr))<0)
{
cmsLog_error("Could not bind netlink socket for kernel monitor");
close(kernelMonitorFd);
kernelMonitorFd = CMS_INVALID_FD;
return CMSRET_INTERNAL_ERROR;
}

然后将kernelMonitorFd  加入select集中,阻塞n = select(maxFd+1, &readFds, NULL, &errorFds, &tv);

if (FD_ISSET(kernelMonitorFd, &readFds))
{
processKernelMonitor();
}

processKernelMonitor:轮询信息

/* There can be more than one message per recvmsg */
for(nl_msgHdr = (struct nlmsghdr *) buf; NLMSG_OK (nl_msgHdr, (unsigned int)recvLen);
nl_msgHdr = NLMSG_NEXT (nl_msgHdr, recvLen))

3. 事件消息

首先需要注册感兴趣的事件

msg->type = CMS_MSG_REGISTER_EVENT_INTEREST;
msg->flags_request = 1;
msg->flags_response = 0;
msg->flags_event = 0;
msg->wordData = CMS_MSG_DHCP6C_STATE_CHANGED;
if ((ret = cmsMsg_sendAndGetReply(msgHandle, msg)) != CMSRET_SUCCESS)
{

}

当dhcp6c发生改变的时候,发送事件信息到smd

msg->type = CMS_MSG_DHCP6C_STATE_CHANGED;
msg->src = MAKE_SPECIFIC_EID(getpid(), EID_DHCP6C);
msg->dst = EID_SMD;
msg->flags_event = 1;
msg->dataLength = sizeof(Dhcp6cStateChangedMsgBody);

memcpy(dhcp6cBody, &dhcp6cMsgBody, sizeof(Dhcp6cStateChangedMsgBody));

if ((ret = cmsMsg_send(msgHandle, msg)) != CMSRET_SUCCESS)

smd收到事件信息之后,查找感兴趣的进程将信息发送出去

distributeEventMessage

这里CMS_MSG_DHCP6C_STATE_CHANGED是在ssk注册的,所以到ssk,ssk收到信息之后

#ifdef DMP_X_BROADCOM_COM_IPV6_1 /* aka SUPPORT_IPV6 */
case CMS_MSG_DHCP6C_STATE_CHANGED:
processDhcp6cStateChanged(msg);
break;

Broadcom的消息机制的更多相关文章

  1. iOS开发系列--通知与消息机制

    概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣的那么通过通知机制就可以告诉用户此时发生的事情.iOS中通知机制又叫消息机制,其包括两类:一类是本地 ...

  2. Android消息传递之Handler消息机制

    前言: 无论是现在所做的项目还是以前的项目中,都会遇见线程之间通信.组件之间通信,目前统一采用EventBus来做处理,在总结学习EventBus之前,觉得还是需要学习总结一下最初的实现方式,也算是不 ...

  3. Windows消息机制

    Windows的消息系统是由3个部分组成的: · 消息队列.Windows能够为所有的应用程序维护一个消息队列.应用程序必须从消息队列中获取消息,然后分派给某个窗口.· 消息循环.通过这个循环机制应用 ...

  4. OSG消息机制之事件处理概述

    OSG的消息机制包括好多个头文件预定义及多个类. 首先,消息接收相关的类当属osgGA::GUIEventHandler和osgGA::GUIEventAdapter这两个类了.前者处理OSG程序与用 ...

  5. [转]runtime 消息机制

    原文地址:http://www.jianshu.com/p/f6300eb3ec3d 一.关于runtime 之前在项目中有遇到过用runtime解决改变全局字体的问题,所以再一次感受到了runtim ...

  6. IOS 消息机制(NSNotificationCenter)

    消息机制 NSNotificationCenter 一直都在频繁使用,但是却对其原理不是十分了解.今天就花些时间,把消息机制原理重头到尾好好过一遍. iOS 提供了一种 "同步的" ...

  7. Android之消息机制Handler,Looper,Message解析

    PS:由于感冒原因,本篇写的有点没有主干,大家凑合看吧.. 学习内容: 1.MessageQueue,Looper,MessageQueue的作用. 2.子线程向主线程中发送消息 3.主线程向子线程中 ...

  8. Objective-C总Runtime的那点事儿(一)消息机制

    最近在找工作,Objective-C中的Runtime是经常被问到的一个问题,几乎是面试大公司必问的一个问题.当然还有一些其他问题也几乎必问,例 如:RunLoop,Block,内存管理等.其他的问题 ...

  9. Windows消息机制详解

    消息是指什么?      消息系统对于一个win32程序来说十分重要,它是一个程序运行的动力源泉.一个消息,是系统定义的一个32位的值,他唯一的定义了一个事件,向 Windows发出一个通知,告诉应用 ...

随机推荐

  1. 嵌入式C语言-学习书籍推荐(pdf附上百度云链接)

    先推荐学习视频网站: https://www.bilibili.com/video/av22631677?from=search&seid=800092160484173881 书籍只推荐2本 ...

  2. WPF知识点全攻略00- 目录

    知识点目录如下: 1.WPF相对WinFrom的优缺点 2.WPF体系结构 3.XAML 4.XAML页面布局 5.XAML内容控件 6.WPF中的“树” 7.Binding 8.依赖属性 9.附加属 ...

  3. 《BUG创造队》作业8:软件测试与Alpha冲刺(第四天)

    项目 内容 这个作业属于哪个课程 2016级软件工程 这个作业的要求在哪里 实验十二 团队作业8:软件测试与ALPHA冲刺 团队名称 BUG创造队 作业学习目标 (1)掌握软件测试基础技术.(2)学习 ...

  4. java读取nc文件的问题,前端ajax 发送参数进行交互的实例

    1.问题背景: 需要解析nc文件的数据源,获取一个三维数据,并计算器开发值. java 后台处理: 定以一个实例来接收解析的数据并返回给前端. package cn.edu.shou.domain; ...

  5. vue的使用配置

    我的编辑器是webstorm,虽然占内容占资源, 但是用起来很方便, 刚开始接触的时候就是用这个软件,很喜欢. vue的教程 1.http://www.jianshu.com/p/5ba253651c ...

  6. Django考试系统(1)

    好久没更过博客了,菜是原罪.毕业设计快做完了,第一次独立做的项目(考试系统),自己摸索着做的,以前学习的好多东西都用上了,但是也都忘了,完成设计的途中又一步步的捡起来了(不知道现在还记没记得).最近着 ...

  7. java用XSSFWorkbook实现读写Excel

    /** * 读取Excel文件的内容 * @param inputStream excel文件,以InputStream的形式传入 * @param sheetName sheet名字 * @retu ...

  8. PXE自动化安装系统

    准备(以centos7为例) ①关闭防火墙 ②关闭selinux ③dhcp服务设置为静态IP ④安装软件包 http:充当yum源安装包仓库 tftp-server :在它的工作目录存在引导主机的工 ...

  9. 【转】如何在命令行脚本中启动带参数的Windows服务

    我们有一个自己编写的Windows服务,我们希望该服务在启动时可以根据用户输入的参数实现不同的功能. 要实现这样的需求并不是很难,下面这个例子我用来示范如何编写该服务 using System; us ...

  10. metadata的使用以及简单的orm模式

    使用sqllite3和metadata简单的封装了个简单的orm #!/usr/bim/python #-*-coding: utf-8 -*- import threading import sql ...