📄 ldplspfsm.c
字号:
bandwithAck->L_port);
if(LspCBVar->lspType == LDP_CR_LSP)
{
if(LspCBVar->nodeType == MPLS_NODE_INGRESS)
{
sendToFecCrlsp(pCrEntry,RESPONSE_TYPE,RESRCUNAVA);
}
else
{
SndNotMsg(LspCBVar->upSessionIndex, RESRCUNAVA,LspCBVar->upMsgid,
MPLS_LBLREQ_MSGTYPE);
}
if(LspCBVar->waitflag & 0xe0)
LspCBVar->waitflag |= 0x1;
else ldp_del_lspCB(pEntry,LspCBVar);
}
else
{
if((LspCBVar->nodeType == MPLS_NODE_INGRESS)||
(LspCBVar->nodeType == MPLS_NODE_INTERM_INGRESS))
{
/* bandwidth reserve fail, delete from UP SB list */
sb_list = MPLS_NULL;
MPLS_SB_SEARCH(LspCBVar->upAtmLabel.module,\
LspCBVar->upAtmLabel.port,sb_list);
if(!sb_list)
{
MPLS_REMOVE_FROM_SESSION_UP_LSP_LIST(g_up_lsp_list,LspCBVar);
}
else
{
MPLS_REMOVE_FROM_SESSION_UP_LSP_LIST_A(sb_list->lsp_up_cb_list,LspCBVar);
if(!(sb_list->lsp_down_cb_list.first ||sb_list->lsp_up_cb_list.first))
MPLS_SB_DELETE(LspCBVar->upAtmLabel.module,\
LspCBVar->upAtmLabel.port,sb_list)
}
/* INGRESS: resend request */
LspCBVar->resend = 1;
resend_time = ldp_get_random(MPLS_RANDOM_TIME_RANGE,abort_time);
MPLS_SET_TIMER(resend_time,(void *)ldp_req_resend,LspCBVar,ldptime_q,LspCBVar->timerid); /* lixia mod 2003-11-6 */
}
else
{
SndNotMsg(LspCBVar->upSessionIndex, INTERNALERROR,LspCBVar->upMsgid,
MPLS_LBLREQ_MSGTYPE);
if(LspCBVar->waitflag & 0xe0)
{
LspCBVar->waitflag |= 0x1;
}
else
{
ldp_del_lspCB(pEntry,LspCBVar);
}
}
}
return LDP_FALSE;
}
/*主状态切为RESPONSE_AWAITED,
子状态切为IDLE*/
LspCBVar->status = RESPONSE_AWAITED;
LspCBVar->subStatus = IDLE;
/* MPLS_NODE_INGRESS:置request重发定时器 */
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
resend_time = ldp_get_random(MPLS_RANDOM_TIME_RANGE,abort_time);
MPLS_SET_TIMER(resend_time,(void *)ldp_req_timout,LspCBVar,ldptime_q,LspCBVar->timerid); /* lixia mod 2003-11-6 */
}
if(LspCBVar->nodeType == MPLS_NODE_INTERM_EGRESS)
{
MPLS_NEXTHOP_SESSION_SEARCH(pFecEntry->nexthopAddr,downSession);
if(downSession)
{
belong = MPLS_FALSE;
MPLS_NEXTHOP_SESSION_DOWN(downSession,pFecEntry,belong);
if(belong == MPLS_TRUE)
{
LspCBFsm(MPLS_NULL,MPLS_LBLMAP_MSGTYPE,\
MPLS_NULL,LDP_HOP_LSP,pFecEntry,LspCBVar);
}
}
else
{
LspCBVar->errorcode = NODOWNSESSION;
MPLS_ERR_LOG("fatal error, MPLS_NODE_INTERM_EGRESS no down session");
notify.status.flags.flags.status = NOROUTE;
notify.status.msgType = MPLS_LBLREQ_MSGTYPE;
LspCBFsm(MPLS_NULL,LDP_DOWNSTREAM_NAK,\
¬ify,LDP_HOP_LSP,pFecEntry,LspCBVar);
}
}
else
{
/*向下游节点发送request*/
if((LspCBVar->lspType) == LDP_HOP_LSP)
wait_lsplblmsg_append(LspCBVar,pEntry,MPLS_NULL,MPLS_NULL,MPLS_LBLREQ_MSGTYPE);
else
CR_wait_lsplblmsg_append(LspCBVar,pEntry,MPLS_NULL,MPLS_NULL,MPLS_LBLREQ_MSGTYPE);
}
return LDP_TRUE;
} /*ProcBandwithAck*/
short ProcLblAbort_status1(void *pEntry, mplsLdpLspCB *LspCBVar,char flag)
{
mplsLdpCrLsp *pCrEntry = MPLS_NULL;
pCrEntry = (mplsLdpCrLsp *)pEntry;
if((LspCBVar->lspType == LDP_CR_LSP)&&(LspCBVar->nodeType == MPLS_NODE_INGRESS))
{
/* sendToFecCrlsp(pCrEntry,DELETE_PVC_TYPE,0);*/
/* if upstream_lost,response fec DELETE_PVC_TYPE,else RESPONSE_TYPE */
if(flag == 0)
{
LspCBVar->errorcode = ABORT1_DELETE1;
sendToFecCrlsp(pCrEntry,DELETE_PVC_TYPE,0);
}
else
{
LspCBVar->errorcode = ABORT1_DELETE2;
sendToFecCrlsp(pCrEntry,RESPONSE_TYPE,SETUPABORT);
}
}
if(LspCBVar->waitflag & 0xe0)
LspCBVar->waitflag |= 0x1;
else ldp_del_lspCB(pEntry,LspCBVar);
return LDP_TRUE;
} /*ProcLblAbort_status1*/
/* for ingress and hop lsp,if get label fail,set timer to resend.hyh 02-12-25 */
/*2003.1.28 Huyonghong 对聚合,判断上游模块和端口,如果不相同,更新到同一模块和端口上*/
short ProcLblMap_status2(void *pEntry, mplsLdpLspCB *LspCBVar, void * inputEvent)
{
/*1.将mapping带的label保存到lspCB*/
/*2.分配上游标记*/
/*3.请求建立PVC(子状态切为CREATE_PVC_REQ_AWAITED)*/
mplsLdpLblMapMsg_t *lblMapMsg;
mplsLdpCrLsp *pCrEntry = NULL;
mplsLdpFecEntry *pFecEntry = NULL;
char negotiate;
int rtcode;
mpls_sb_list * sb_list;
STRUC_MPLS_AD_RLSPVC_REQ pvclabel;
release_pvc_tab_t *rel_pvc = MPLS_NULL;
unsigned long resend_time;
lblMapMsg = (mplsLdpLblMapMsg_t *)inputEvent;
pCrEntry = (mplsLdpCrLsp *)pEntry;
MPLS_MEMSET(&pvclabel, 0, sizeof(STRUC_MPLS_AD_RLSPVC_REQ));
p_s_f = MPLS_NULL; /*2004-5-11 lixia mod for label req fail*/
/* MPLS_NODE_INGRESS取消request重发定时器 */
if((LspCBVar->nodeType == MPLS_NODE_INGRESS)&&(LspCBVar->lspType == LDP_HOP_LSP))
{
if(LspCBVar->timerid>0)
{
MPLS_CLEAR_TIMER(LspCBVar->timerid,ldptime_q,rtcode);
MPLS_ASSERT(rtcode == 1);
if(rtcode)
{
LspCBVar->timerid = 0;
}
}
LspCBVar->resend = 0;
}
/*将mapping带的下游label保存到lspCB*/
if((LspCBVar->nodeType == MPLS_NODE_INGRESS)||
(LspCBVar->nodeType == MPLS_NODE_INTERM)||
(LspCBVar->nodeType == MPLS_NODE_INTERM_INGRESS))
{
if (lblMapMsg->atmLblTlvExists == 1)
{
LspCBVar->downAtmLabel.vpi = (unsigned short)(lblMapMsg->atmLblTlv.flags.flags.vpi);
LspCBVar->downAtmLabel.vci = lblMapMsg->atmLblTlv.vci;
}
}
/********************************************************************/
/* wengqing add
*/
/********************************************************************/
if(LspCBVar->lspType == LDP_HOP_LSP)
{
p_s_f = MPLS_NULL;
for(p_s_f = aggr_body.first; p_s_f; p_s_f = p_s_f->next)
{
if( /*
(p_s_f->upAtmLabel.module == LspCBVar->upAtmLabel.module) && \
(p_s_f->upAtmLabel.port == LspCBVar->upAtmLabel.port ) && \
*/
(p_s_f->downAtmLabel.module == LspCBVar->downAtmLabel.module) && \
(p_s_f->downAtmLabel.port == LspCBVar->downAtmLabel.port ) && \
(p_s_f->downAtmLabel.vpi == LspCBVar->downAtmLabel.vpi) && \
(p_s_f->downAtmLabel.vci == LspCBVar->downAtmLabel.vci )
/*
(p_s_f->nodeType == LspCBVar->nodeType)
*/
)
break;
}
if(p_s_f)
{
/*add for nanjing 2003-11-20 fengjun szh */
if(p_s_f->upAtmLabel.vpi == 0 && p_s_f->upAtmLabel.vci == 0)
{
LspCBVar->errorcode = CRPVCNOTSUCESS;
DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_LSP,"vpi,vci is 0, the first pvc not established !!!!!\n");
printf("vpi,vci is 0, the first pvc not established !!!!! \n");
/* 向上游发送notify消息*/
if (LspCBVar->nodeType != MPLS_NODE_INGRESS)
{
SndNotMsg(LspCBVar->upSessionIndex,INTERNALERROR,LspCBVar->upMsgid,\
MPLS_LBLREQ_MSGTYPE);
}
/* 向下游发送释放消息 */
if(LspCBVar->nodeType != MPLS_NODE_EGRESS)
{
wait_lsplblmsg_append(LspCBVar,pEntry,MPLS_NULL,MPLS_NULL,MPLS_LBLREL_MSGTYPE);
}
if(LspCBVar->nodeType == MPLS_NODE_INGRESS && LspCBVar->lspType == LDP_HOP_LSP)
{
LspCBVar->status = IDLE;
LspCBVar->subStatus = IDLE;
LspCBVar->resend = 1;
LspCBVar->upAtmLabel.vpi = 0; /*2003-10-21 lixia add for ingress node */
LspCBVar->upAtmLabel.vci = 0;
LspCBVar->downAtmLabel.vpi = 0;
LspCBVar->downAtmLabel.vci = 0;
/* pvc create fail, delete from UP SB list */
sb_list = MPLS_NULL;
MPLS_SB_SEARCH(LspCBVar->upAtmLabel.module,\
LspCBVar->upAtmLabel.port,sb_list);
if(!sb_list)
{
MPLS_REMOVE_FROM_SESSION_UP_LSP_LIST(g_up_lsp_list,LspCBVar);
}
else
{
MPLS_REMOVE_FROM_SESSION_UP_LSP_LIST_A(sb_list->lsp_up_cb_list,LspCBVar);
if(!(sb_list->lsp_down_cb_list.first ||sb_list->lsp_up_cb_list.first))
MPLS_SB_DELETE(LspCBVar->upAtmLabel.module,\
LspCBVar->upAtmLabel.port,sb_list)
}
resend_time = ldp_get_random(MPLS_RANDOM_TIME_RANGE,abort_time);
MPLS_SET_TIMER(resend_time,(void *)ldp_req_resend,LspCBVar,ldptime_q,LspCBVar->timerid); /* lixia mod 2003-11-6 */
}
else
{
if(LspCBVar->waitflag & 0xe0)
LspCBVar->waitflag |= 0x1;
else ldp_del_lspCB(pEntry,LspCBVar);
}
return LDP_FALSE;
}
/*add for nanjing end 2003-11-20 fengjun szh */
if((p_s_f->upAtmLabel.module == LspCBVar->upAtmLabel.module) && \
(p_s_f->upAtmLabel.port == LspCBVar->upAtmLabel.port) && \
(p_s_f->nodeType == LspCBVar->nodeType))
{
LspCBVar->downAtmLabel.vpi = p_s_f->downAtmLabel.vpi;
LspCBVar->downAtmLabel.vci = p_s_f->downAtmLabel.vci;
LspCBVar->upAtmLabel.vpi = p_s_f->upAtmLabel.vpi;
LspCBVar->upAtmLabel.vci = p_s_f->upAtmLabel.vci;
p_s_f->refNum ++;
LspCBVar->status = ESTABLISHED;
LspCBVar->subStatus = IDLE;
if(LspCBVar->nodeType == MPLS_NODE_INGRESS)
{
/* if((LspCBVar->upAtmLabel.module != p_s_f->upAtmLabel.module) || \
(LspCBVar->upAtmLabel.port != p_s_f->upAtmLabel.port))
{
LspCBVar->upAtmLabel.module = p_s_f->upAtmLabel.module;
LspCBVar->upAtmLabel.port = p_s_f->upAtmLabel.port;
}
if(LspCBVar->lspType == LDP_HOP_LSP)*/
wait_lspfeclbl_append(LspCBVar,pEntry,LDP_FWD_CREATE);
/* else
CR_wait_lspfeclbl_append(LspCBVar,pEntry,LDP_FWD_CREATE);
*/
}
else
{
// if((LspCBVar->lspType) == LDP_HOP_LSP)
wait_lsplblmsg_append(LspCBVar,pEntry,MPLS_NULL,MPLS_NULL,MPLS_LBLMAP_MSGTYPE);
// else
// CR_wait_lsplblmsg_append(LspCBVar,pEntry,MPLS_NULL,MPLS_NULL,MPLS_LBLMAP_MSGTYPE);
}
/* add by fengjun for guangzhou 0906 ?*/
Xcbandwithrel(LspCBVar,pEntry);
/* add by fengjun for guangzhou 0906
wait_xc_append(LspCBVar,pEntry,0x2);
/* add by fengjun for guangzhou 0906 */
return LDP_TRUE;
}
else
{
if(p_s_f->nodeType == LspCBVar->nodeType )
{
/* Ingress adjust lspCb SB no. */
if(LspCBVar->nodeType == MPLS_NODE_INGRESS )
{
/* delete lspcb from old sb_list */
sb_list = MPLS_NULL;
MPLS_SB_SEARCH(LspCBVar->upAtmLabel.module,\
LspCBVar->upAtmLabel.port,sb_list);
if(!sb_list)
{
MPLS_REMOVE_FROM_SESSION_UP_LSP_LIST(g_up_lsp_list,LspCBVar);
}
else
{
MPLS_REMOVE_FROM_SESSION_UP_LSP_LIST_A(sb_list->lsp_up_cb_list,LspCBVar);
if(!(sb_list->lsp_down_cb_list.first ||sb_list->lsp_up_cb_list.first))
MPLS_SB_DELETE(LspCBVar->upAtmLabel.module,\
LspCBVar->upAtmLabel.port,sb_list)
}
/* refresh lspcb */
LspCBVar->upAtmLabel.module = p_s_f->upAtmLabel.module;
LspCBVar->upAtmLabel.port = p_s_f->upAtmLabel.port;
LspCBVar->upAtmLabel.vpi = p_s_f->upAtmLabel.vpi;
LspCBVar->upAtmLabel.vci = p_s_f->upAtmLabel.vci;
p_s_f->refNum ++;
LspCBVar->status = ESTABLISHED;
LspCBVar->subStatus = IDLE;
wait_lspfeclbl_append(LspCBVar,pEntry,LDP_FWD_CREATE);
/* insert lspcb into new sb_list */
sb_list = MPLS_NULL;
MPLS_SB_SEARCH(LspCBVar->upAtmLabel.module,LspCBVar->upAtmLabel.port,sb_list);
if(!sb_list)
{
MPLS_SB_CREATE(LspCBVar->upAtmLabel.module,LspCBVar->upAtmLabel.port,sb_list)
}
if(sb_list)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -