📄 lblabort.c
字号:
#undef DEF_LDP_VAR
#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
* fengjun 2003.12.30 replace macro MPLS_CRFECCB_DELETE by func ldp_del_lspCB */
/****************************************************************************/
void FuncLblAbort(mplsLdpSession_t * session, void * inputEvent)
{
mplsLdpLblAbortMsg_t * lblAbort = MPLS_NULL;
mplsLdpFecEntry * fecCb = MPLS_NULL;
mplsLdpCrLsp * crlspCb = MPLS_NULL;
mplsLdpUpCB * upCb = MPLS_NULL;
mplsLdpLspCB * lspCb = MPLS_NULL;
mplsLdpDownCB * downCb = MPLS_NULL;
mplsLdpSession_t * downsession = MPLS_NULL;
unsigned short dismode;
unsigned long msgid;
unsigned short preLen;
unsigned short us;
lblAbort = (mplsLdpLblAbortMsg_t *)inputEvent;
if(lblAbort->fecTlvExists == 0 || lblAbort->lblMsgIdTlvExists == 0)
{
MPLS_SEND_NOTIFY(session,MISSPARAMETER,lblAbort->baseMsg.msgId, \
lblAbort->baseMsg.flags.flags.msgType);
return;
}
if( lblAbort->lspidTlvExists == 1 ||lblAbort->fecTlv.fecElemTypes[0] == MPLS_CRLSP_FEC)
{
/* 2002.11.12 for performance */
crlspCb = MPLS_NULL;
if(lblAbort->lspidTlvExists == 1)
{
MPLS_CRFECCB_SEARCH(lblAbort->lspidTlv.routerId, \
lblAbort->lspidTlv.localCrlspId,crlspCb);
}
MPLS_CRFEC_SESSION_MSGID(session,lblAbort->lblMsgIdTlv.msgId,crlspCb);
if(crlspCb != MPLS_NULL)
{
dismode = 0;
MPLS_SESSION_DISTRIBUT_MODE(session,dismode);
if(dismode == DOWNSTREAMONDEMAND)
{
/* currently not judge the abort request msgid,directly send notify:LBLREQAB */
if(crlspCb->crlspCb.status != ESTABLISHED)
{
#if 0
MPLS_SEND_NOTIFY(session,LBLREQAB,lblAbort->baseMsg.msgId, \
lblAbort->baseMsg.flags.flags.msgType);
#endif
mpls_send_abnot(session,LBLREQAB,lblAbort->baseMsg.msgId, \
lblAbort->baseMsg.flags.flags.msgType,
crlspCb->crlspCb.upMsgid);
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_LBLABORT_MSGTYPE,\
lblAbort,LDP_CR_LSP,crlspCb,&crlspCb->crlspCb);
return;
}
else
{
MPLS_DOWN_SESSION_CRLSP(crlspCb,downsession);
if(downsession)
{
MPLS_REMOVE_FROM_SESSION_DOWN_LSP_LIST(downsession->lsp_down_cb_list,&(crlspCb->crlspCb))
}
dismode = 0;
MPLS_SESSION_DISTRIBUT_MODE(session,dismode);
if(dismode == DOWNSTREAMONDEMAND)
{
if(!((&crlspCb->crlspCb)->waitflag & 0x1))
LspCBFsm(session,MPLS_LBLABORT_MSGTYPE,\
lblAbort,LDP_CR_LSP,crlspCb,&crlspCb->crlspCb);
return;
}
else
{
sendtoDownLblAbort(downsession,MPLS_NULL,crlspCb,LDP_CR_LSP);
ldp_del_lspCB((char *)crlspCb,&crlspCb->crlspCb);
}
}
}
}
else
{
crlspCb = MPLS_NULL;
//MPLS_CRFEC_SESSION_MSGID(session,lblAbort->lblMsgIdTlv.msgId,crlspCb);
if(crlspCb != MPLS_NULL)
{
MPLS_REMOVE_FROM_SESSION_UP_LSP_LIST(session->lsp_up_cb_list,&(crlspCb->crlspCb))
crlspCb->crlspCb.upSessionIndex = 0;
dismode = 0;
MPLS_SESSION_DISTRIBUT_MODE(session,dismode);
if(dismode == DOWNSTREAMONDEMAND)
{
if(!((&crlspCb->crlspCb)->waitflag & 0x1))
LspCBFsm(session,MPLS_LBLABORT_MSGTYPE,\
lblAbort,LDP_CR_LSP,crlspCb,&crlspCb->crlspCb);
return;
}
else
{
MPLS_DOWN_SESSION_CRLSP(crlspCb,downsession);
if(downsession)
{
MPLS_REMOVE_FROM_SESSION_DOWN_LSP_LIST(downsession->lsp_down_cb_list,&(crlspCb->crlspCb))
}
dismode = 0;
MPLS_SESSION_DISTRIBUT_MODE(session,dismode);
if(dismode == DOWNSTREAMONDEMAND)
{
if(!((&crlspCb->crlspCb)->waitflag & 0x1))
LspCBFsm(session,MPLS_LBLABORT_MSGTYPE,\
lblAbort,LDP_CR_LSP,crlspCb,&crlspCb->crlspCb);
return;
}
else
{
sendtoDownLblAbort(downsession,MPLS_NULL,crlspCb,LDP_CR_LSP);
ldp_del_lspCB((char *)crlspCb,&crlspCb->crlspCb);
}
}
return;
}
dismode = 0;
MPLS_SESSION_DISTRIBUT_MODE(session,dismode);
if(dismode != DOWNSTREAMONDEMAND)
{
/* for performance, fec search, use the fec element to search directly */
for(us = 0; us < lblAbort->fecTlv.numberFecElements; us ++)
{
/* by hyh */
preLen = lblAbort->fecTlv.fecElemTypes[0] == MPLS_HOSTADR_FEC ? \
32: lblAbort->fecTlv.fecElArray[0].addressEl.preLen;
MPLS_FEC_SEARCH(lblAbort->fecTlv.fecElArray[0].addressEl.address,preLen,fecCb)
if(fecCb)
{
MPLS_FEC_UPCB_SESSION_MSGID(fecCb,upCb,session,
lblAbort->lblMsgIdTlv.msgId);
if(upCb != MPLS_NULL)
{
MPLS_REMOVE_FROM_SESSION_UP_LIST(session->up_cb_list,upCb)
/* currently not judge the abort request msgid,directly send notify:LBLREQAB */
if(upCb->state != ESTABLISHED)
{
#if 0
MPLS_SEND_NOTIFY(session,LBLREQAB,lblAbort->baseMsg.msgId, \
lblAbort->baseMsg.flags.flags.msgType);
#endif
mpls_send_abnot(session,LBLREQAB,lblAbort->baseMsg.msgId, \
lblAbort->baseMsg.flags.flags.msgType,
upCb->msgid);
}
MPLS_UPCB_DELETE(fecCb,upCb);
}
MPLS_PEND_SESSION_DOWN(downsession,downCb,fecCb)
if(downsession != MPLS_NULL)
{
dismode = 0;
MPLS_SESSION_DISTRIBUT_MODE(session,dismode);
if(dismode != DOWNSTREAMONDEMAND)
{
MPLS_REMOVE_FROM_SESSION_DOWN_LIST(session->down_cb_list,downCb)
sendtoDownLblAbort(downsession,downCb,fecCb,LDP_HOP_LSP);
MPLS_DOWNCB_DELETE(fecCb,downCb)
}
else
{
/* search lspcb first!!! hyh */
/* currently not judge the abort request msgid,directly send notify:LBLREQAB */
if(lspCb->status != ESTABLISHED)
{
#if 0
MPLS_SEND_NOTIFY(session,LBLREQAB,lblAbort->baseMsg.msgId, \
lblAbort->baseMsg.flags.flags.msgType);
#endif
mpls_send_abnot(session,LBLREQAB,lblAbort->baseMsg.msgId, \
lblAbort->baseMsg.flags.flags.msgType,
lspCb->upMsgid);
}
MPLS_REMOVE_FROM_SESSION_DOWN_LSP_LIST(downsession->lsp_down_cb_list,lspCb)
if(!(lspCb->waitflag & 0x1))
LspCBFsm(session,MPLS_LBLABORT_MSGTYPE, \
lblAbort,LDP_HOP_LSP,fecCb,lspCb);
return;
}
}
}
}
}
else
{
/* for performance, fec search, use the fec element to search directly */
for(us = 0; us < lblAbort->fecTlv.numberFecElements; us ++)
{
/* by hyh */
preLen = lblAbort->fecTlv.fecElemTypes[0] == MPLS_HOSTADR_FEC ? \
32: lblAbort->fecTlv.fecElArray[0].addressEl.preLen;
MPLS_FEC_SEARCH(lblAbort->fecTlv.fecElArray[0].addressEl.address,preLen,fecCb)
if(fecCb)
{
msgid = lblAbort->lblMsgIdTlv.msgId;
MPLS_FEC_LSPCB_UP_SESSION_MSGID(fecCb,lspCb,session,msgid);
if(lspCb != MPLS_NULL)
{
/* currently not judge the abort request msgid,directly send notify:LBLREQAB */
if(lspCb->status != ESTABLISHED)
{
#if 0
MPLS_SEND_NOTIFY(session,LBLREQAB,lblAbort->baseMsg.msgId, \
lblAbort->baseMsg.flags.flags.msgType);
#endif
printf("==== send abort notify msg for fec %x to %x ====\n",fecCb->fec_key.mplsFecAddr,session->peerIpaddr);
DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_LSP,"==== send abort notify msg for fec %x to %x ====\n",fecCb->fec_key.mplsFecAddr,session->peerIpaddr);
mpls_send_abnot(session,LBLREQAB,lblAbort->baseMsg.msgId, \
lblAbort->baseMsg.flags.flags.msgType, \
lspCb->upMsgid);
}
MPLS_REMOVE_FROM_SESSION_UP_LSP_LIST(session->lsp_up_cb_list,lspCb)
if(!(lspCb->waitflag & 0x1))
LspCBFsm(session,MPLS_LBLABORT_MSGTYPE, \
lblAbort,LDP_HOP_LSP,fecCb,lspCb);
}
}
}
}
}
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -