BCM VOIP EPON二层链路状态改变分析



一、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_EPONnetlink通知

                            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,

                                                                                                       &para)

                                                       

                                                        //遍历下一个告警消息

                                                        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连接状态在此更新,应用层程序则可以统一在这里处

         //理链路变化的需求。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值