📄 ldplspfsm.c
字号:
/********************************************************************/
/* Product Name: MPLS PACK 1.0 */
/* Module Name: LDP */
/* File Name: Ldplspfsm.c */
/* Author Name: hu.yonghong */
/* Creat Date: 2002/6/19 */
/* Version : 1.0 */
/* Function : lspCB FSM */
/* History : hyh 2002-11-19 modify cr response to fec */
/* huyonghong 2002/12/2 when request timeout,when abort, not delete from SB list,
delete from the up SB list */
/* huyonghong 2002/12/16 判断是否真正的路由删除,有路由,表明不是真正的路由删除,要重发request; */
/* Huyonghong 2002.12.28 ldp在业务板down时把close消息发给转发 */
/* Huyonghong 2003.1.16 add judge resend in notify process */
/* add subStatus change */
/*2003.1.28 Huyonghong 对聚合,ingress判断上游模块和端口,如果不相同,更新到同一模块和端口上*/
/* 对聚合,egress判断下游模块和端口,如果不相同,更新到同一模块和端口上*/
/* 2003.2.16 huyonghong route delete and established,send label close to forwarding module */
/* 2003.3.4 huyonghong modify path vector memmory manage */
/* 2003.4.3 wengqing 当存在FEC聚合时,同一FEC可能使用同一标记,Label Release无法区分,此处为了防止这种情况,
加以防止;当存在相同路径向量时,不接纳新的Label Request*/
/* 2003.4.10 Huyonghong 保护多块时,防止建立不起来 */
/* 2003.4.23 wengqing 增加保护,如果ldpcb的链表乱掉,将该链表加入到待删除链中 */
/* 2003.5.29 huyonghong 在ProcFecInquireOk增加保护的地方,如果链表乱掉处理后直接返回,否则都要执行
MPLS_ROUTE_DELETE操作 */
/* 2003-7-29 shizhaohui 增加LSP建路落地点在SGBC等板子上的处理,聚合增加判断
nexthop字段 */
/*2003.9.17 Fengjun 减少和C进程的交互 */
/* 2003-9-23 lixia add ProcReleasePvcAck */
/* 2003-11-6 lixia change the time of REQ_RESEND_TIME to random time */
/* 2003-11-20 lixia mod ProcCreatePvcAck to show detail unsuccessful established pvc information of unsuccessful
/* 2003-11-21 szh fengjun 在backbone,ingress时,先建立p_s_f,再向C进程发建立PVC消息,
以减少出现堆积LSP控制块的可能性 */
/* 2003-11-25 lixia mod ProcLblMap_status2 for aggrate */
/* 2003-12-9 fengjun,szh mod 防止sb_list插入链表两次
/* 2003-12-29 szh lixia mod dele p_s_f */
/* 2003.12.30 fengjun 整链插入时,调用MplsInsertIntoupGlobalList和MplsInsertIntodownGlobalList函数*/
/* 2003-12-10 lixia add for debug mpls */
/* 2004-1-5 shizhaohui add for errorcode */
/********************************************************************/
#include "ldpvars.h"
extern mpls_label_busy_flags local_label_busy_flags; /* 2003-10-22 lixia add */
extern unsigned short abort_time; /*2004-9-29 lixia add for set abort timer*/
short LspCBFsm(mplsLdpSession_t *session,
unsigned short eventType,
void *inputEvent,
unsigned char lspType,
void *pEntry,
mplsLdpLspCB *LspCBVar)
{
FecMsg *pfec_msg;
mplsLdpLblMapMsg_t * lblMapMsg = MPLS_NULL;
switch(LspCBVar->status)
{
case IDLE:
switch(eventType)
{
case MPLS_LBLREQ_MSGTYPE:
#ifdef __BGS10_MPLS_DEBUG
printf("==== LspCbFsm,IDLE,MPLS_LBLREQ_MSGTYPE ====");
#endif
ProcLblReq_status1(session,pEntry,LspCBVar,inputEvent);
break;
case MPLS_LBLABORT_MSGTYPE:
#ifdef __BGS10_MPLS_DEBUG
printf("==== LspCbFsm,IDLE,MPLS_LBLABORT_MSGTYPE ====");
#endif
ProcLblAbort_status1(pEntry,LspCBVar,1);
break;
case MPLS_FEC_SETUP:
#ifdef __BGS10_MPLS_DEBUG
printf("==== LspCbFsm,IDLE,MPLS_FEC_INQUIRE_OK ====");
#endif
pfec_msg = (FecMsg *)inputEvent;
if(pfec_msg->OperateType == INQUIRE_TYPE)
ProcFecInquireOk(inputEvent);
break;
case UPSTREAM_LOST:
#ifdef __BGS10_MPLS_DEBUG
printf("==== LspCbFsm,IDLE,UPSTREAM_LOST ====");
#endif
/* 处理同LDP Abort消息 */
ProcLblAbort_status1(pEntry,LspCBVar,0);
break;
case DOWNSTREAM_LOST:
#ifdef __BGS10_DEBUG
printf("==== LspCBFsm,IDLE,DOWNSTREAM_LOST=====");
#endif
/* 处理同LDP Abort消息 */
ProcLblAbort_status1(pEntry,LspCBVar,1);
break;
case MPLS_ROUTE_ADD:
#ifdef __BGS10_MPLS_DEBUG
printf("==== LspCbFsm,IDLE,MPLS_ROUTE_ADD ====");
#endif
ProcRouteAdd_status1(pEntry,LspCBVar);
break;
case MPLS_ROUTE_DELETE:
#ifdef __BGS10_MPLS_DEBUG
printf("==== LspCbFsm,IDLE,MPLS_ROUTE_DELETE ====");
#endif
ProcRouteDel_status123(pEntry,LspCBVar);
break;
default:
#ifdef __BGS10_MPLS_DEBUG
printf("==== LspCbFsm,IDLE,default ====");
#endif
break;
}
break;
case RESPONSE_AWAITED:
switch(eventType)
{
case MPLS_LBLMAP_MSGTYPE:
#ifdef __BGS10_MPLS_DEBUG
printf("==== LspCBFsm,RESPONSE_AWAITED,MPLS_LBLMAP_MSGTYPE=====");
#endif
lblMapMsg = (mplsLdpLblMapMsg_t *)inputEvent;
if(LspCBVar->lspType == LDP_HOP_LSP)
rec_lblmap_tlvpro(session,lblMapMsg,pEntry,LspCBVar,LDP_HOP_LSP); /* fengjun add */
else
rec_lblmap_tlvpro(session,lblMapMsg,pEntry,LspCBVar,LDP_CR_LSP); /* fengjun add */
ProcLblMap_status2(pEntry,LspCBVar,inputEvent);
break;
case MPLS_LBLABORT_MSGTYPE:
#ifdef __BGS10_MPLS_DEBUG
printf("==== LspCbFsm,RESPONSE_AWAITED,MPLS_LBLABORT_MSGTYPE ====");
#endif
ProcLblAbort_status2(pEntry,LspCBVar,1);
break;
case UPSTREAM_LOST:
#ifdef __BGS10_MPLS_DEBUG
printf("==== LspCbFsm,RESPONSE_AWAITED,UPSTREAM_LOST====");
#endif
/* 处理同LDP Abort消息 */
ProcLblAbort_status2(pEntry,LspCBVar,0);
break;
case DOWNSTREAM_LOST:
#ifdef __BGS10_MPLS_DEBUG
printf("==== LspCBFsm,RESPONSE_AWAITED,DOWNSTREAM_LOST=====");
#endif
ProcDownLost_23(pEntry,LspCBVar);
break;
case LDP_DOWNSTREAM_NAK:
#ifdef __BGS10_MPLS_DEBUG
printf("==== LspCBFsm,RESPONSE_AWAITED,LDP_DOWNSTREAM_NAK====");
#endif
ProcDownNAK_23(pEntry,LspCBVar,inputEvent);
break;
case MPLS_LBLWITH_MSGTYPE:
#ifdef __BGS10_MPLS_DEBUG
printf("==== LspCBFsm,RESPONSE_AWAITED,MPLS_LBLWITH_MSGTYPE=====");
#endif
ProcLblWith_2(pEntry,LspCBVar);
break;
case MPLS_ROUTE_DELETE:
#ifdef __BGS10_MPLS_DEBUG
printf("==== LspCbFsm,IDLE,ROUTE_DELETE ====");
#endif
ProcRouteDel_status123(pEntry,LspCBVar);
break;
default:
#ifdef __BGS10_MPLS_DEBUG
printf("==== LspCbFsm,RESPONSE_AWAITED,default====");
#endif
break;
} /* end of switch(eventType) */
break;
case ESTABLISHED:
switch(eventType)
{
case MPLS_LBLMAP_MSGTYPE:
#ifdef __BGS10_MPLS_DEBUG
printf("==== LspCBFsm,ESTABLISHED,MPLS_LBLMAP_MSGTYPE=====");
#endif
lblMapMsg = (mplsLdpLblMapMsg_t *)inputEvent;
if(LspCBVar->lspType == LDP_HOP_LSP)
rec_lblmap_tlvpro(session,lblMapMsg,pEntry,LspCBVar,LDP_HOP_LSP); /* fengjun add */
else
rec_lblmap_tlvpro(session,lblMapMsg,pEntry,LspCBVar,LDP_CR_LSP); /* fengjun add */
ProcLblMap_status3(pEntry,LspCBVar,inputEvent);
break;
case MPLS_LBLREL_MSGTYPE:
#ifdef __BGS10_MPLS_DEBUG
printf("==== LspCbFsm,ESTABLISHED,MPLS_LBLREL_MSGTYPE====");
#endif
ProcLblRel_status3(pEntry,LspCBVar,inputEvent,MPLS_LBLREL_MSGTYPE);
break;
case MPLS_LBLWITH_MSGTYPE:
#ifdef __BGS10_MPLS_DEBUG
printf("==== DownLspCBFsm,ESTABLISHED,MPLS_LBLWITH_MSGTYPE=====");
#endif
ProcLblWith_3(pEntry,LspCBVar);
break;
case UPSTREAM_LOST:
#ifdef __BGS10_MPLS_DEBUG
printf("==== LspCbFsm,ESTABLISHED,UPSTREAM_LOST====");
#endif
/* 处理同LDP Release消息的处理 */
ProcLblRel_status3(pEntry,LspCBVar,inputEvent,UPSTREAM_LOST);
break;
case DOWNSTREAM_LOST:
#ifdef __BGS10_MPLS_DEBUG
printf("==== LspCBFsm,ESTABLISHED,DOWNSTREAM_LOST=====");
#endif
/* 处理同LDP Release消息的处理 */
ProcDownLost_23(pEntry,LspCBVar);
break;
case LDP_DOWNSTREAM_NAK:
#ifdef __BGS10_MPLS_DEBUG
printf("==== LspCBFsm,ESTABLISHED,LDP_DOWNSTREAM_NAK====");
#endif
ProcDownNAK_23(pEntry,LspCBVar,inputEvent);
break;
case MPLS_ROUTE_DELETE:
#ifdef __BGS10_MPLS_DEBUG
printf("==== LspCbFsm,ESTABLISHED,MPLS_ROUTE_DELETE ====");
#endif
ProcRouteDel_status123(pEntry,LspCBVar);
break;
default:
#ifdef __BGS10_MPLS_DEBUG
printf("==== LspCbFsm,ESTABLISHED,default====");
#endif
break;
} /* end of switch(eventType) */
break;
case RELEASE_AWAITED:
switch(eventType)
{
case MPLS_LBLREL_MSGTYPE:
#ifdef __BGS10_MPLS_DEBUG
printf("==== LspCbFsm,RELEASE_AWAITED,MPLS_LBLREL_MSGTYPE====");
#endif
ProcLblRel_status4(pEntry,LspCBVar);
break;
case MPLS_LBLABORT_MSGTYPE:
#ifdef __BGS10_MPLS_DEBUG
printf("==== LspCbFsm,RELEASE_AWAITED,MPLS_LBLABORT_MSGTYPE====");
#endif
ProcLblRel_status4(pEntry,LspCBVar);
break;
case UPSTREAM_LOST:
#ifdef __BGS10_MPLS_DEBUG
printf("==== LspCbFsm,RELEASE_AWAITED,UPSTREAM_LOST====");
#endif
ProcLblRel_status4(pEntry,LspCBVar);
break;
case DOWNSTREAM_LOST:
#ifdef __BGS10_MPLS_DEBUG
printf("==== LspCbFsm,RELEASE_AWAITED,DOWNSTREAM_LOST====");
#endif
ProcDownLost_4(pEntry,LspCBVar);
break;
case MPLS_ROUTE_DELETE:
#ifdef __BGS10_MPLS_DEBUG
printf("==== LspCbFsm,RELEASE_AWAITED,MPLS_ROUTE_DELETE====");
#endif
ProcDownLost_4(pEntry,LspCBVar);
break;
default:
#ifdef __BGS10_MPLS_DEBUG
printf("==== LspCbFsm,RELEASE_AWAITED,default====");
#endif
break;
} /* end of switch(eventType) */
break;
default:
break;
} /* end of switch(upLspCBVar.status) */
return LDP_TRUE;
}
/* 2003-11-6 lixia add for get random time */
unsigned long ldp_get_random(unsigned short range,unsigned short start)
{
unsigned long date, time, ticks;
tm_get(&date, &time, &ticks);
ticks = (ticks % (range+1)) + start; /* Random number from start to start+range */
return (ticks*10);
}
/*add by fengjun for guangzhou */
short Xcbandwithrel(mplsLdpLspCB *LspCBVar,void *pEntry)
{
if(LspCBVar->resend !=1)
{
if(LspCBVar->waitflag & 0xe0)
{
//LspCBVar->waitflag |= 0x1;
}
else if(LspCBVar->waitflag & 0x1)
{
ldp_del_lspCB(pEntry,LspCBVar);
}
}
return LDP_TRUE;
}
short Xcbandwithreq(mplsLdpLspCB *LspCBVar,void *pEntry)
{
unsigned long resend_time;
if(LspCBVar->waitflag & 0x1)
return LDP_FALSE;
LspCBVar->status = RESPONSE_AWAITED;
LspCBVar->subStatus = IDLE;
if(((LspCBVar->nodeType == MPLS_NODE_INGRESS)&&(LspCBVar->lspType == LDP_HOP_LSP))||
((LspCBVar->nodeType == MPLS_NODE_INTERM_INGRESS)&&(LspCBVar->lspType == LDP_HOP_LSP)))
{
LspCBVar->resend = 1;
#ifdef __BGS10_MPLS_DEBUG
MPLS_ERR_LOG("======== set timer ldp_req_timout =========");
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -