📄 labelrel.c
字号:
#include "ldpvars.h"
/****************************************************************************/
/* Product Name: MPLS PACK1.0
* Module Name: LDP/CR_LDP
* File Name: ldppdu.h
* Author Name: weng.qing shi.zhaohui hu.yonghong
* Creat Date: 2002-6-18
* Version : 1.0
* Input : mplsLdpSession_t *, inbound seesion pointer;
* void *, inputEvent;
* Output : void
* Function : Label release process function
* Note :
* 2002.12.3 Huyonghong add search crfecbc
* 2003.12.30 fengjun replace macro MPLS_CRFECCB_DELETE by func ldp_del_lspCB */
/* 2003-12-10 lixia add for debug mpls */
/****************************************************************************/
void FuncLblRel(mplsLdpSession_t * session, void * inputEvent)
{
mplsLdpLbl_W_R_Msg_t * lblrel = MPLS_NULL;
mplsLdpSession_t * downsession = MPLS_NULL;
mplsLdpFecEntry * fecCb = MPLS_NULL;
mplsLdpCrLsp * crlspCb = MPLS_NULL;
mplsLdpLspCB * lspCb = MPLS_NULL;
mplsLdpUpCB * upCb = MPLS_NULL;
mplsLdpDownCB * downCb = MPLS_NULL;
unsigned short dismode;
unsigned char contin;
unsigned short us;
unsigned short preLen;
lblrel = (mplsLdpLbl_W_R_Msg_t *)inputEvent;
if(lblrel->fecTlvExists == 0)
{
MPLS_SEND_NOTIFY(session,MISSPARAMETER,lblrel->baseMsg.msgId, \
lblrel->baseMsg.flags.flags.msgType);
return;
}
if(lblrel->genLblTlvExists == 1)
{
/* gen label need not support fec aggregate */
MPLS_CRLSP_SESSION_UP_GEN_LABEL(session,lblrel->genLblTlv.label,
&lblrel->fecTlv,crlspCb);
if(crlspCb != MPLS_NULL)
{
MPLS_DOWN_SESSION_CRLSP(crlspCb,downsession);
if(downsession != MPLS_NULL)
{
dismode = 0;
MPLS_SESSION_DISTRIBUT_MODE(session,dismode);
if(dismode == DOWNSTREAMONDEMAND)
{
MPLS_REMOVE_FROM_SESSION_UP_LSP_LIST(session->lsp_up_cb_list,&(crlspCb->crlspCb))
crlspCb->crlspCb.upSessionIndex = 0;
if(!((&crlspCb->crlspCb)->waitflag & 0x1))
LspCBFsm(session,MPLS_LBLREL_MSGTYPE, \
lblrel,LDP_CR_LSP,crlspCb,&crlspCb->crlspCb);
return;
}
else
{
/* downstream session not present */
sendtoDownRelease(crlspCb);
#if 0 /******************fj*******************/
sendtoLabelXC(crlspCb,&crlspCb->crlspCb,MPLS_NULL,LDP_FWD_CLOSE);
#endif
wait_crlspfeclbl_append(&(crlspCb->crlspCb),crlspCb,LDP_FWD_CLOSE);
MPLS_RELEASE_GENLABEL(lblrel->genLblTlv.label);
ldp_del_lspCB((char *)crlspCb,&(crlspCb->crlspCb));
return;
}
/* here return, because crlsp no aggregate */
}
printf("mpls_err_log,FuncLblRel");
return;
}
MPLS_FEC_SESSION_UP_GEN_LABEL(session,lblrel->genLblTlv.label,\
&lblrel->fecTlv,fecCb,upCb);
if(fecCb != MPLS_NULL && upCb != MPLS_NULL)
{
/* directly delete the gen label upCb, if there is no other
upCb, then LDP_FWD_CLOSE the Label XC
*/
MPLS_REMOVE_FROM_SESSION_UP_LIST(session->up_cb_list,upCb)
MPLS_UPCB_DELETE(fecCb,upCb);
}
/* add by hyh */
#if 0
MPLS_WALK_DOWN_BEGIN(fecCb,downCb,t_downCb)
if(fecCb != MPLS_NULL && downCb != MPLS_NULL)
{
if(downCb->nexthopAddr == fecCb->nexthopAddr)
{
sendtoDownRelease_Fec(fecCb,downCb);
return;
}
}
MPLS_WALK_DOWN_END(fecCb,downCb,t_downCb)
#endif
/* hyh add end */
}
else if(lblrel->atmLblTlvExists == 1)
{
/* crlsp atm label need not support fec aggregate */
/* 2002.11.12 for performance */
crlspCb = MPLS_NULL;
if(lblrel->fecTlv.fecElemTypes[0] == MPLS_CRLSP_FEC || \
lblrel->lspidTlvExists == 1 )
{
if(lblrel->lspidTlvExists == 1)
{
MPLS_CRFECCB_SEARCH(lblrel->lspidTlv.routerId, \
lblrel->lspidTlv.localCrlspId,crlspCb);
}
MPLS_CRLSP_SESSION_UP_ATM_LABEL(session,(lblrel->atmLblTlv),
(&lblrel->fecTlv),crlspCb);
if(crlspCb != MPLS_NULL)
{
MPLS_REMOVE_FROM_SESSION_UP_LSP_LIST(session->lsp_up_cb_list,&(crlspCb->crlspCb))
crlspCb->crlspCb.upSessionIndex = 0;
if(!((&crlspCb->crlspCb)->waitflag & 0x1))
LspCBFsm(session,MPLS_LBLREL_MSGTYPE, \
lblrel,LDP_CR_LSP,crlspCb,&crlspCb->crlspCb);
}
return;
}
if(lblrel->fecTlv.wcElemExists == 1)
{
WALK_FEC_BEGIN(fecCb)
MPLS_FEC_SESSION_UP_ATM_LABEL(session,lblrel->atmLblTlv,
&lblrel->fecTlv,fecCb,lspCb);
if(fecCb != MPLS_NULL && lspCb != MPLS_NULL)
{
MPLS_REMOVE_FROM_SESSION_UP_LSP_LIST(session->lsp_up_cb_list,&(crlspCb->crlspCb))
(crlspCb->crlspCb).upSessionIndex = 0;
if(!(lspCb->waitflag & 0x1))
LspCBFsm(session,MPLS_LBLREL_MSGTYPE,lblrel,LDP_CR_LSP,fecCb,lspCb);
}
WALK_FEC_END
}
else
{
for(us = 0; us < lblrel->fecTlv.numberFecElements; us ++)
{
/* by hyh */
preLen = lblrel->fecTlv.fecElemTypes[0] == MPLS_HOSTADR_FEC ? \
32: lblrel->fecTlv.fecElArray[0].addressEl.preLen;
MPLS_FEC_SEARCH(lblrel->fecTlv.fecElArray[0].addressEl.address,preLen,fecCb)
if(fecCb)
{
MPLS_FEC_SESSION_UP_ATM_LABEL(session,lblrel->atmLblTlv,
&lblrel->fecTlv,fecCb,lspCb);
if(lspCb != MPLS_NULL)
{
MPLS_REMOVE_FROM_SESSION_UP_LSP_LIST(session->lsp_up_cb_list,lspCb)
lspCb->upSessionIndex = 0;
if(!(lspCb->waitflag & 0x1))
LspCBFsm(session,MPLS_LBLREL_MSGTYPE,lblrel,LDP_HOP_LSP,fecCb,lspCb);
}
else
{
DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_LSP,"FuncLblRel,Label Release,can't find fec %x\n",\
lblrel->fecTlv.fecElArray[0].addressEl.address);
MPLS_ERR_LOG("Label Release %x,",\
lblrel->fecTlv.fecElArray[0].addressEl.address);
return;
}
}
else
{
DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_LSP,"FuncLblRel,Label Release,can't find fec %x\n",\
lblrel->fecTlv.fecElArray[0].addressEl.address);
MPLS_ERR_LOG("Label Release %x,",\
lblrel->fecTlv.fecElArray[0].addressEl.address);
return;
}
}
}
}
else
{
if(lblrel->fecTlv.wcElemExists == 1)
{
/******************************************************/
/* wengqing add for session link list
*/
/******************************************************/
if(session->lsp_up_cb_list.first)
{
session->lsp_up_cb_list.first->upSessionIndex = 2;
session->lsp_up_cb_list.last->upSessionIndex = 2;
MPLS_INSERT_INTO_UP_LSP_LIST(g_up_lsp_list,
session->lsp_up_cb_list.first, \
session->lsp_up_cb_list.last);
session->lsp_up_cb_list.first =MPLS_NULL;
session->lsp_up_cb_list.last =MPLS_NULL;
}
if(session->up_cb_list.first)
{
session->up_cb_list.first->upSessionIndex = 2;
session->up_cb_list.last->upSessionIndex = 2;
MPLS_INSERT_INTO_UP_LIST(g_up_list,
session->up_cb_list.first, \
session->up_cb_list.last);
session->up_cb_list.first =MPLS_NULL;
session->up_cb_list.last =MPLS_NULL;
}
return;
/******************************************************/
/* wengqing add for session link list end
*/
/******************************************************/
WALK_FEC_BEGIN(fecCb)
MPLS_WALK_UP_BEGIN(fecCb,upCb,t_upCb);
if(fecCb != MPLS_NULL && upCb != MPLS_NULL)
{
/* genLblTlvExists ==0 genLblTlv.label ???hyh */
if(upCb->upSessionIndex == session->index)
{
MPLS_UPCB_DELETE(fecCb,upCb);
}
}
MPLS_WALK_UP_END(fecCb,upCb,t_upCb)
/* add by hyh */
#if 0
MPLS_WALK_DOWN_BEGIN(fecCb,downCb,t_downCb)
if(fecCb != MPLS_NULL && downCb != MPLS_NULL)
{
if(downCb->nexthopAddr == fecCb->nexthopAddr)
{
sendtoDownRelease_Fec(fecCb,downCb);
return;
}
}
MPLS_WALK_DOWN_END(fecCb,downCb,t_downCb)
#endif
/* hyh add end */
MPLS_WALK_LSP_BEGIN(fecCb,lspCb,t_lspCb)
if(lspCb)
{
if(((lspCb->nodeType == MPLS_NODE_INTERM) || \
(lspCb->nodeType == MPLS_NODE_INTERM_INGRESS)|| \
(lspCb->nodeType == MPLS_NODE_EGRESS))&& \
(lspCb->upSessionIndex == session->index))
{
if(!(lspCb->waitflag & 0x1))
LspCBFsm(session,MPLS_LBLREL_MSGTYPE,lblrel,LDP_HOP_LSP,fecCb,lspCb);
}
}
MPLS_WALK_LSP_END(fecCb,lspCb,t_lspCb)
WALK_FEC_END
}
else
{
/* no label TLV, currently no process???hyh */
for(us = 0; us < lblrel->fecTlv.numberFecElements; us ++)
{
/* by hyh */
preLen = lblrel->fecTlv.fecElemTypes[0] == MPLS_HOSTADR_FEC ? \
32: lblrel->fecTlv.fecElArray[0].addressEl.preLen;
MPLS_FEC_SEARCH(lblrel->fecTlv.fecElArray[0].addressEl.address,preLen,fecCb)
if(fecCb)
{
MPLS_WALK_UP_BEGIN(fecCb,upCb,t_upCb);
if(fecCb != MPLS_NULL && upCb != MPLS_NULL)
{
if(upCb->upSessionIndex == session->index)
{
MPLS_UPCB_DELETE(fecCb,upCb);
}
}
MPLS_WALK_UP_END(fecCb,upCb,t_upCb)
MPLS_WALK_LSP_BEGIN(fecCb,lspCb,t_lspCb)
if(lspCb)
{
if(((lspCb->nodeType == MPLS_NODE_INTERM) || \
(lspCb->nodeType == MPLS_NODE_INTERM_INGRESS))&& \
(lspCb->upSessionIndex == session->index))
{
if(!(lspCb->waitflag & 0x1))
LspCBFsm(session,MPLS_LBLREL_MSGTYPE,lblrel,\
LDP_HOP_LSP,fecCb,lspCb);
}
}
MPLS_WALK_LSP_END(fecCb,lspCb,t_lspCb)
}
}
}
}
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -