一、eponapp进程
//OAM任务初始化
TkOamStackInit
//OAM处理调度初始化
OamProcessInit
//事务处理初始化
event_handler_init
// OsAstAlmLinkCtcOamDiscComplete断言事件回调设置
OnuOsAssertHandleSet(OsAstAlmLinkCtcOamDiscComplete,enable_wan_service);
idx = OnuOsAssertMap (id);
//handler = enable_wan_service
osAssertHandle[idx]= handler;
//OsAstAlmLinkCtcOamDiscComplete断言清除事件回调设置
OnuOsAssertClearHandleSet(OsAstAlmLinkCtcOamDiscComplete,
disable_wan_service);
idx= OnuOsAssertMap (id);
//handler = disable_wan_service
osAssertHandleClear[idx]= handler;
//数据接收线程初始化
TkOsDataRxThreadInit(…)
// pFunc = TkDataProcessHandle
TkRxDataDispatchHandle = pFunc;
//创建数据接收线程,线程主任务函数为 TkDataRxThread
TkOsThreadCreate(…, TkDataRxThread)
---------------------------------------------------------------------------------------------------------------------------------
//数据接收线程主任务函数
TkDataRxThread
//启动端口环回检测程序?
rut_sendMsgToSmd(CMS_MSG_START_APP,EID_EPON_OAM_PORT_LOOP_DETECT,……)
//初始化epon监控netlink套接口
initEponStackMonitorFd();
//BCM在内核中创建的私有netlink通知,没有去查内核里面的实现。
eponMonitorFd = socket(AF_NETLINK,SOCK_RAW, NETLINK_BRCM_EPON)
addr.nl_family= AF_NETLINK;
addr.nl_pid= getpid();
addr.nl_groups= 0;
bind(eponMonitorFd,(struct sockaddr*)&addr, sizeof(addr))
while( 1 )
rc= select(max_fd+1, &readFds, NULL, NULL, &tv);
if(rc > 0)
//收到NETLINK_BRCM_EPON的netlink通知
if(FD_ISSET(eponMonitorFd,&readFds))
recvmsg(eponMonitorFd,&msg, 0);
//处理netlink通知消息
TkDataProcessHandle_NetlinkMsg(&msg,recvLen);
nlh =(struct nlmsghdr*)msg->msg_iov->iov_base;
ptr= (NlMsg *)NLMSG_DATA(nlh);
data= (NlMsgData *)&(ptr->data);
//获取告警计数
alarm_count= ptr->hd.count;
while(alarm_count> 0)
//处理当前告警消息
epon_netlink_handle(data);
switch(data->type)
casenl_type_brcm:
//处理BCM私有告警消息
epon_netlink_handle_brcm(data);
switch(data->almid)
//处理链路注册成功/失败的告警消息
caseNlMsgLinkRegSucc:
//epon链路成功
if(data->raise)
//oam链路复位(下面单独分析)
OamLinkReset(data->inst);
//epon链路失败
Else
//oam链路初始化
OamLinkInit(data->inst);
//ctcLinkRecord结构复位
CtcLinkDeregister(link);
//oam链路复位
OamLinkReset(link);
//oam数据复位
linkOamData[link].discState=
OamDiscNoOam;
linkOamData[link].eventSeq= 0;
//调用pon驱动模块触发PON状态变化
//的ioctrl命令,未分析。
WanStateParapara;
para.index= data->inst;
para.enable= FALSE;
eponStack_CfgL2PonState(EponSetOpe,
¶)
//遍历下一个告警消息
data+= sizeof(NlMsgData);
alarm_count--;
//轮询消息队列事件
OsAstMsgQPoll(…)
//从消息队列中获取消息
TkOsMsgReceive (osAstEvtQ);
//处理消息事件
OsAssertEvent(…)
OnuOsAssertClr(…)
if (rec.raise)
//当前仅分析链路断开事件,不走此流程
else
//当前事件标记清除的处理在上面OamLinkReset已经处理,
//所以这里不需要做其它处理。
OnuOsAssertClr(rec.id,rec.inst);
//给ITMS服务器发送告警消息
OsAstEventNotify((AlmCondition)idx,rec.inst, (StatId)rec.stat);
---------------------------------------------------------------------------------------------------------------------------------
OamLinkReset
//oam数据复位
oam= &linkOamData[link];
oam->discState= OamDiscPassiveWait;
oam->loopbackState= OamInfoStateActionDiscard;
oam->maxPduSize= MaxPktSize;
oam->ticksUntilLinkFail= OamAllowedTicksUntilLinkFail;
//keyTimerInfo数据复位
EncryptSetKeyTimeout(link, 0, OuiTeknovus);
//OsAstAlmLinkOamDiscComplete事件清除处理,该事件在oam协商成功时注册的回调,
//这里暂不分析。
OsAstMsgQClr(OsAstAlmLinkOamDiscComplete, link, 0);
//OsAstAlmLinkCtcOamDiscComplete事件清除处理
OsAstMsgQClr(OsAstAlmLinkCtcOamDiscComplete, link, 0);
//事件清除处理
OnuOsAssertClr(id, inst);
//清除事件标记
osAssertDbase[idx] &=~(1UL << inst);
//调用该事件的清除回调函数,当前OsAstAlmLinkCtcOamDiscComplete事件为
//disable_wan_service
(*osAssertHandleClear[idx])(inst);
//关闭wan接口服务
disable_wan_service(inst)
//给SSK发送CMS_MSG_EPON_LINK_STATUS_CHANGED消息,通知
//pon的链路已经断开。
send_notification_to_cms(…)
//将OsAstAlmLinkCtcOamDiscComplete事件发送到消息队列中,该消息队列的
//处理是在TkDataRxThread任务的主循环中处理。
TkOsMsgSend(osAstEvtQ, (TkOsMsg)msg);
二、SSK进程
ssk_main
while(keepLooping)
select(maxFd+1,&readFds, NULL, &errorFds, &tv);
cmsMsg_receive(msgHandle,&msg)
switch(msg->type)
//处理链路转换消息
case CMS_MSG_EPON_LINK_STATUS_CHANGED:
//处理pon链路改变
processEponWanLinkChange(msg);
//更新pon接口配置,将PON接口的状态改变为链路断开
//eponIntfCfg->status = MDMVS_NOLINK,同时在配置修改的回调中将
//对应的接口ifdown
updateEponInterfaceCfg(info,&eponIntfIid, &isChanged);
//更新pon服务状态
updateEponServiceStatus(&eponIntfIid,info);
//获取该接口对应的WAN设备对象
cmsObj_getAncestorFlags(MDMOID_WAN_DEV,
MDMOID_WAN_EPON_INTF,pEponIntfIid, OGF_NO_VALUE_UPDATE, (void **)&wanDev)
//更新WAN连接状态
updateWanConnStatusInSubtreeLocked(pEponIntfIid,FALSE);
//遍历所有静态/DHCP类型WAN连接
while ((ret =cmsObj_getNextInSubTree(MDMOID_WAN_IP_CONN,
parentIidStack, &iidStack,&wanConnObj)) == CMSRET_SUCCESS)
//更新WAN连接状态
updateSingleWanConnStatusLocked(&iidStack,wanConnObj,
isLinkUp);
//遍历所有PPPOE类型WAN连接
while((ret = cmsObj_getNextInSubTree(
MDMOID_WAN_PPP_CONN, parentIidStack, &iidStack, &wanConnObj)) ==CMSRET_SUCCESS)
//更新WAN连接状态
updateSingleWanConnStatusLocked(&iidStack,wanConnObj,
isLinkUp);
---------------------------------------------------------------------------------------------------------------------------------
updateSingleWanConnStatusLocked
//针对链路变化的所有类型WAN连接状态在此更新,应用层程序则可以统一在这里处
//理链路变化的需求。