📄 lblwith.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 :
* wengqing 2002.11.12 add for performance
* wengqing 2003.1.16 only keep the first sendtodown_Release_with
* update lspcb when receive withdraw msg
fengjun 2003.12.30 修改session赋值
*/
/****************************************************************************/
void FuncLblWithdraw(mplsLdpSession_t * session, void * inputEvent)
{
mplsLdpLbl_W_R_Msg_t * lblwith = MPLS_NULL;
mplsLdpFecEntry * fecCb = MPLS_NULL;
mplsLdpCrLsp * crlspCb = MPLS_NULL;
mplsLdpSession_t * upsession = MPLS_NULL;
mplsLdpDownCB * downCb = MPLS_NULL;
mplsLdpLspCB * lspCb = MPLS_NULL;
mpls_sb_list * sb_list;
unsigned short belong_to = MPLS_FALSE;
unsigned short yes = MPLS_FALSE;
unsigned short dismode;
unsigned short preLen;
unsigned short us;
lblwith = (mplsLdpLbl_W_R_Msg_t *)inputEvent;
if(lblwith->fecTlvExists == 0)
{
MPLS_SEND_NOTIFY(session,MISSPARAMETER,lblwith->baseMsg.msgId, \
lblwith->baseMsg.flags.flags.msgType);
return;
}
//sendtodown_Release_with(session,lblwith); 2004-2-2 fengjun dele
if(lblwith->genLblTlvExists == 1)
{
if(lblwith->fecTlv.fecElemTypes[0] == MPLS_CRLSP_FEC || \
lblwith->lspidTlvExists == 1 )
{
/* gen label need not support fec aggregate */
MPLS_CRLSP_SESSION_DOWN_GEN_LABEL(session,lblwith->genLblTlv.label,
&lblwith->fecTlv,crlspCb);
if(crlspCb != MPLS_NULL)
{
MPLS_REMOVE_FROM_SESSION_DOWN_LSP_LIST(session->lsp_down_cb_list,&(crlspCb->crlspCb))
sendtodown_Release_with(session,lblwith);
MPLS_UP_SESSION_CRLSP(crlspCb,upsession);
if(upsession != MPLS_NULL)
{
MPLS_REMOVE_FROM_SESSION_UP_LSP_LIST(upsession->lsp_up_cb_list,&(crlspCb->crlspCb))
dismode = 0;
MPLS_SESSION_DISTRIBUT_MODE(session,dismode);
if(dismode != DOWNSTREAMONDEMAND)
{
sendtoUpWithdraw(crlspCb,upsession);
#if 0
sendtoLabelXC(crlspCb,&crlspCb->crlspCb,MPLS_NULL,LDP_FWD_CLOSE);
#endif
wait_crlspfeclbl_append(&(crlspCb->crlspCb),crlspCb,LDP_FWD_CLOSE);
MPLS_RELEASE_GEN_LABEL(lblwith->genLblTlv.label);
}
else
{
if(!((&crlspCb->crlspCb)->waitflag & 0x1))
LspCBFsm(session,MPLS_LBLWITH_MSGTYPE, \
lblwith,LDP_CR_LSP,crlspCb,&crlspCb->crlspCb);
return;
}
}
else
{
printf("mpls_err_log,FuncLblWithdraw\n");
}
}
}
else if(lblwith->fecTlv.wcElemExists != 1)
{
/* fec list */
preLen = lblwith->fecTlv.fecElemTypes[0] == MPLS_HOSTADR_FEC ? \
32: lblwith->fecTlv.fecElArray[0].addressEl.preLen;
MPLS_FEC_SEARCH(lblwith->fecTlv.fecElArray[0].addressEl.address,preLen,fecCb) /*2004-3-23 lixia add*/
if (fecCb)
{
MPLS_FEC_SESSION_DOWN_GEN_LABEL(session,lblwith->genLblTlv.label,
&lblwith->fecTlv,fecCb,downCb);
if(fecCb != MPLS_NULL && downCb != MPLS_NULL)
{
if(fecCb->owner & MPLS_OWNER_ROUTE)
{
/* next hop label withdraw */
MPLS_NEXTHOP_SESSION_BELONG(fecCb->nexthopAddr,session,belong_to);
if(belong_to == MPLS_TRUE)
{
#if 0 /************fj*************/
sendtoLabelXC(fecCb,MPLS_NULL,downCb,LDP_FWD_CLOSE);
#endif
downCb->waitflag |=0x1;
wait_downfeclbl_append(downCb,fecCb,LDP_FWD_CLOSE);
wait_downlblmsg_append(downCb,fecCb,MPLS_LBLREL_MSGTYPE);
#if 0
MPLS_DOWNCB_DELETE(fecCb,downCb);
#endif
}
else
{
downCb->waitflag |=0x1;
wait_downlblmsg_append(downCb,fecCb,MPLS_LBLREL_MSGTYPE);
/*
MPLS_DOWNCB_DELETE(fecCb,downCb);
*/
}
}
else
{
wait_downlblmsg_append(downCb,fecCb,MPLS_LBLREL_MSGTYPE);
downCb->waitflag |=0x1;
/*
MPLS_DOWNCB_DELETE(fecCb,downCb);
*/
}
}
} /*fec is not null*/
}
else
{
/* wildcard fec */
/* gen label need not support fec aggregate */
MPLS_CRLSP_SESSION_DOWN_GEN_LABEL(session,lblwith->genLblTlv.label,
&lblwith->fecTlv,crlspCb);
if(crlspCb != MPLS_NULL)
{
// sendtodown_Release_with(session,lblwith);
MPLS_UP_SESSION_CRLSP(crlspCb,upsession);
if(upsession != MPLS_NULL)
{
dismode = 0;
MPLS_SESSION_DISTRIBUT_MODE(session,dismode);
if(dismode != DOWNSTREAMONDEMAND)
{
sendtoUpWithdraw(crlspCb,session);
#if 0 /************fj*************/
sendtoLabelXC(crlspCb,&crlspCb->crlspCb,MPLS_NULL,LDP_FWD_CLOSE);
#endif
wait_crlspfeclbl_append(&(crlspCb->crlspCb),crlspCb,LDP_FWD_CLOSE);
MPLS_RELEASE_GEN_LABEL(lblwith->genLblTlv.label);
return;
}
else
{
if(!((&crlspCb->crlspCb)->waitflag & 0x1))
LspCBFsm(session,MPLS_LBLWITH_MSGTYPE, \
lblwith,LDP_CR_LSP,crlspCb,&crlspCb->crlspCb);
return;
}
}
else
{
printf("mpls_err_log,FuncLblWithdraw 2\n");
return;
}
}
WALK_FEC_BEGIN(fecCb)
/* fec list */
MPLS_FEC_SESSION_DOWN_GEN_LABEL(session,lblwith->genLblTlv.label,
&lblwith->fecTlv,fecCb,downCb);
if(fecCb != MPLS_NULL && downCb != MPLS_NULL)
{
if(fecCb->owner && MPLS_OWNER_ROUTE)
{
/* next hop label withdraw */
MPLS_NEXTHOP_SESSION_BELONG(fecCb->nexthopAddr,session,belong_to);
if(belong_to == MPLS_TRUE)
{
#if 0
sendtoLabelXC(fecCb,MPLS_NULL,downCb,LDP_FWD_CLOSE);
#endif
downCb->waitflag |=0x1;
wait_downfeclbl_append(downCb,fecCb,LDP_FWD_CLOSE);
wait_downlblmsg_append(downCb,fecCb,MPLS_LBLREL_MSGTYPE);
}
else
{
wait_downlblmsg_append(downCb,fecCb,MPLS_LBLREL_MSGTYPE);
downCb->waitflag |=0x1;
/*
MPLS_DOWNCB_DELETE(fecCb,downCb);
*/
}
}
else
{
wait_downlblmsg_append(downCb,fecCb,MPLS_LBLREL_MSGTYPE);
downCb->waitflag |=0x1;
/*
MPLS_DOWNCB_DELETE(fecCb,downCb);
*/
}
}
WALK_FEC_END
}
}
else if(lblwith->atmLblTlvExists == 1)
{
if(lblwith->fecTlv.fecElemTypes[0] == MPLS_CRLSP_FEC || \
lblwith->lspidTlvExists == 1 )
{
// sendtodown_Release_with(session,lblwith);
/* gen label need not support fec aggregate */
/* 2002.11.12 for performance */
crlspCb = MPLS_NULL;
if(lblwith->lspidTlvExists == 1)
{
MPLS_CRFECCB_SEARCH(lblwith->lspidTlv.routerId, \
lblwith->lspidTlv.localCrlspId,crlspCb);
}
MPLS_CRLSP_SESSION_DOWN_ATM_LABEL(session,lblwith->atmLblTlv,
&lblwith->fecTlv,crlspCb);
if(crlspCb != MPLS_NULL)
{
/* update lspcb when receive withdraw msg */
MPLS_REMOVE_FROM_SESSION_DOWN_LSP_LIST(session->lsp_down_cb_list,&(crlspCb->crlspCb))
if(!((&crlspCb->crlspCb)->waitflag & 0x1))
{
sendtodown_Release_with(session,lblwith); /* 2004-2-2 fengjun add */
reclblmsgtlvproc(session,lblwith,crlspCb,&(crlspCb->crlspCb),MPLS_LBLWITH_MSGTYPE,LDP_CR_LSP);
LspCBFsm(session,MPLS_LBLWITH_MSGTYPE, \
lblwith,LDP_CR_LSP,crlspCb,&crlspCb->crlspCb);
}
return;
}
}
else if(lblwith->fecTlv.wcElemExists != 1)
{
for(us = 0; us < lblwith->fecTlv.numberFecElements; us ++)
{
/* by hyh */
preLen = lblwith->fecTlv.fecElemTypes[0] == MPLS_HOSTADR_FEC ? \
32: lblwith->fecTlv.fecElArray[0].addressEl.preLen;
MPLS_FEC_SEARCH(lblwith->fecTlv.fecElArray[0].addressEl.address,preLen,fecCb)
if(fecCb)
{
MPLS_FEC_SESSION_DOWN_ATM_LABEL(session,lblwith->atmLblTlv,
&lblwith->fecTlv,fecCb,lspCb)
if(fecCb != MPLS_NULL && lspCb != MPLS_NULL)
{
/* 2002.10.28 when node is ingress, lspCb don't delete,
so not delete from down session list */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -