📄 labelmap.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 * , input message;
* Output : void
* Function : Label mapping process function
* Note :
* wengqing 2003.1.16 if the lspcb searched is to be deleted,send release msg downstream
* huyonghong 2003.4.3 策略处理去掉
* fengjun 2003.12.30 replace macro MPLS_CRFECCB_DELETE by func ldp_del_lspCB
* 2004-1-6 lixia add for debug mpls
* 2004-2-12 szh add for established mapping process
/****************************************************************************/
unsigned short hoplspestab=0,crlspestab=0;
void FuncLblMap(mplsLdpSession_t * session, void * inputEvent)
{
mplsLdpLblMapMsg_t * lblMapMsg = MPLS_NULL;
mplsLdpSession_t * upsession = MPLS_NULL;
mplsLdpCrLsp * crlspCB = MPLS_NULL;
mplsLdpFecEntry * fecCb = MPLS_NULL;
mplsLdpLspCB * lspCb = MPLS_NULL;
mplsLdpDownCB * downCb = MPLS_NULL;
mplsLdpUpCB * upCb = MPLS_NULL;
MPLS_BOOL ret;
unsigned short dismode;
unsigned long msgId;
unsigned char exists;
unsigned long label;
unsigned short preLen;
MPLS_BOOL belong_to;
unsigned short loop;
uchar FecDelFlag=0;
lblMapMsg = (mplsLdpLblMapMsg_t *)inputEvent;
if(lblMapMsg->fecTlvExists == 0)
{
MPLS_SEND_NOTIFY(session,MISSPARAMETER,lblMapMsg->baseMsg.msgId, \
lblMapMsg->baseMsg.flags.flags.msgType);
return;
}
if(loopdetcetpro(MPLS_LBLMAP_MSGTYPE,lblMapMsg,session) == LDP_FALSE)
return;
if(lblMapMsg->fecTlv.wcElemExists == 1)
{
/***************************************************/
/* send notification message, unsupported fec family
*/
/***************************************************/
MPLS_SEND_NOTIFY(session,MALFORMTLVVAL,lblMapMsg->baseMsg.msgId, \
lblMapMsg->baseMsg.flags.flags.msgType);
return;
}
if(lblMapMsg->lblMsgIdTlvExists == 1)
{
msgId = lblMapMsg->lblMsgIdTlv.msgId;
/*********************************************************************/
/* for some reqest
*/
/*********************************************************************/
if(lblMapMsg->lspidTlvExists == 1)
{
MPLS_CRFECCB_SEARCH(lblMapMsg->lspidTlv.routerId, \
lblMapMsg->lspidTlv.localCrlspId,\
crlspCB);
if(crlspCB == MPLS_NULL)
{
MPLS_CRFECCB_DELETE(lblMapMsg->lspidTlv.routerId, \
lblMapMsg->lspidTlv.localCrlspId,\
crlspCB);
/*************************************************************/
/* release label
*/
/*************************************************************/
mpls_release_label_map(session,lblMapMsg);
return;
}
}
else
{
MPLS_CRFEC_DOWN_SESSION_MSGID(session,msgId,crlspCB);
if(crlspCB == MPLS_NULL && lblMapMsg->fecTlv.fecElemTypes[0] == MPLS_CRLSP_FEC)
{
ldp_del_lspCB((char *)crlspCB,&(crlspCB->crlspCb));
/*************************************************************/
/* release label
*/
/*************************************************************/
mpls_release_label_map(session,lblMapMsg);
return;
}
}
if(crlspCB)
{
/*************************************************************/
/* judge label type
*/
/*************************************************************/
if(lblMapMsg->atmLblTlvExists == 1)
{
/* add by hyh for agilent test */
if(ldp_atmlabeltlv_test(session,lblMapMsg) == LDP_FALSE)
return;
/* hyh add end */
// byfengjun rec_lblmap_tlvpro(session,lblMapMsg,crlspCB,&crlspCB->crlspCb,LDP_CR_LSP); /* hyh add */
if(!((&crlspCB->crlspCb)->waitflag & 0x1))
{
/* shizhaohui add 2004-2-9 对于在ESTABLISHED状态收到mapping进行特殊处理 */
if((&crlspCB->crlspCb)->status == ESTABLISHED)
{
crlspestab++;
printf("crlsp,ESTAB,rec mapp message.newvpi %d,newvci %d,oldvpi %d,oldvci %d!!",
lblMapMsg -> atmLblTlv.flags.flags.vpi,lblMapMsg -> atmLblTlv.vci,
crlspCB->crlspCb.downAtmLabel.vpi,crlspCB->crlspCb.downAtmLabel.vci);
if((((crlspestab%10)-1)>=0)&&(((crlspestab%10)-1)<=9))
{
g_crspec_label[(crlspestab%10)-1].newvpi = lblMapMsg -> atmLblTlv.flags.flags.vpi;
g_crspec_label[(crlspestab%10)-1].newvci = lblMapMsg -> atmLblTlv.vci;
g_crspec_label[(crlspestab%10)-1].oldvpi = crlspCB->crlspCb.downAtmLabel.vpi;
g_crspec_label[(crlspestab%10)-1].oldvci = crlspCB->crlspCb.downAtmLabel.vci;
}
mpls_release_label_map(session,lblMapMsg);
lblMapMsg -> atmLblTlv.flags.flags.vpi = crlspCB->crlspCb.downAtmLabel.vpi;
lblMapMsg -> atmLblTlv.vci = crlspCB->crlspCb.downAtmLabel.vci;
mpls_release_label_map(session,lblMapMsg);
LspCBFsm(session,MPLS_LBLWITH_MSGTYPE, \
lblMapMsg,LDP_CR_LSP,crlspCB,&crlspCB->crlspCb);
}
else
{
LspCBFsm(session,MPLS_LBLMAP_MSGTYPE, \
lblMapMsg,LDP_CR_LSP,crlspCB,&crlspCB->crlspCb);
}
}
else
mpls_release_label_map(session,lblMapMsg);
}
else if(lblMapMsg->genLblTlvExists == 1)
{
mpls_set_label_gen(crlspCB,lblMapMsg->genLblTlv.label,LDP_CR_LSP);
upsession = MPLS_NULL;
MPLS_CRFEC_UP_SESSION(crlspCB,upsession);
if(upsession !=MPLS_NULL)
{
dismode = 0;
MPLS_SESSION_DISTRIBUT_MODE(upsession,dismode);
if(dismode == DOWNSTREAMONDEMAND)
{
if(!((&crlspCB->crlspCb)->waitflag & 0x1))
LspCBFsm(session,MPLS_LBLMAP_MSGTYPE, \
lblMapMsg,LDP_CR_LSP,crlspCB,&crlspCB->crlspCb);
return;
}
/* up stream DU mode */
label = MPLS_HUNT_GEN_LABEL();
sendtoUpMapping(upsession,&crlspCB->crlspCb,crlspCB,LDP_CR_LSP);
wait_crlspfeclbl_append(&(crlspCB->crlspCb),crlspCB,LDP_FWD_CLOSE);
return;
}
printf("mpls_err_log");
}
else
{
/*************************************************************/
/* send notification message; BAD Message Content
*/
/*************************************************************/
MPLS_SEND_NOTIFY(session,MALFORMTLVVAL,lblMapMsg->baseMsg.msgId, \
lblMapMsg->baseMsg.flags.flags.msgType);
}
return;
}
/* hop fec */
/*************************************************************/
/* judge label type
*/
/*************************************************************/
if(lblMapMsg->atmLblTlvExists == 1)
{
/* add by hyh for agilent test */
if(ldp_atmlabeltlv_test(session,lblMapMsg) == LDP_FALSE)
return;
/* hyh add end */
/* by hyh */
for(loop = 0 ; loop < lblMapMsg->fecTlv.numberFecElements; loop ++)
{
preLen = lblMapMsg->fecTlv.fecElemTypes[loop] == MPLS_HOSTADR_FEC ? \
32: lblMapMsg->fecTlv.fecElArray[loop].addressEl.preLen;
MPLS_FEC_SEARCH(lblMapMsg->fecTlv.fecElArray[loop].addressEl.address,preLen,fecCb)
if(fecCb == MPLS_NULL)
{
/*************************************************************/
/* release label
*/
/*************************************************************/
#if 0
mpls_release_label_map(session,lblMapMsg);
#endif
mpls_release_label_map_fec(session,lblMapMsg,loop);
continue;
}
lspCb = MPLS_NULL;
MPLS_FEC_LSPCB_DOWN_SESSION_MSGID(fecCb,lspCb,session,msgId)
if(lspCb)
{
// rec_lblmap_tlvpro(session,lblMapMsg,fecCb,lspCb,LDP_HOP_LSP); /* add by fengjun */
if(!(lspCb->waitflag & 0x1))
{/* shizhaohui add 2004-2-9 对于在ESTABLISHED状态收到mapping进行特殊处理 */
if(lspCb->status == ESTABLISHED)
{
hoplspestab++;
printf("hoplsp,ESTAB,rec mapp message.newvpi %d,newvci %d,oldvpi %d,oldvci %d!!",
lblMapMsg -> atmLblTlv.flags.flags.vpi,lblMapMsg -> atmLblTlv.vci,
lspCb->downAtmLabel.vpi,lspCb->downAtmLabel.vci);
if((((hoplspestab%10)-1)>=0)&&(((hoplspestab%10)-1)<=9))
{
g_hopspec_label[(hoplspestab%10)-1].newvpi = lblMapMsg -> atmLblTlv.flags.flags.vpi;
g_hopspec_label[(hoplspestab%10)-1].newvci = lblMapMsg -> atmLblTlv.vci;
g_hopspec_label[(hoplspestab%10)-1].oldvpi = lspCb->downAtmLabel.vpi;
g_hopspec_label[(hoplspestab%10)-1].oldvci = lspCb->downAtmLabel.vci;
}
mpls_release_label_map_fec(session,lblMapMsg,loop);
lblMapMsg -> atmLblTlv.flags.flags.vpi = lspCb->downAtmLabel.vpi;
lblMapMsg -> atmLblTlv.vci = lspCb->downAtmLabel.vci;
mpls_release_label_map_fec(session,lblMapMsg,loop);
LspCBFsm(session,MPLS_LBLWITH_MSGTYPE, \
lblMapMsg,LDP_HOP_LSP,fecCb,lspCb);
}
else
{
LspCBFsm(session,MPLS_LBLMAP_MSGTYPE, \
lblMapMsg,LDP_HOP_LSP,fecCb,lspCb);
}
}
else
{
mpls_release_label_map_fec(session,lblMapMsg,loop);
}
}
else
{
#if 0
mpls_release_label_map(session,lblMapMsg);
#endif
mpls_release_label_map_fec(session,lblMapMsg,loop);
continue;
}
}
}
else if(lblMapMsg->genLblTlvExists == 1)
{
for(loop = 0 ; loop < lblMapMsg->fecTlv.numberFecElements; loop ++)
{
preLen = lblMapMsg->fecTlv.fecElemTypes[loop] == MPLS_HOSTADR_FEC ? \
32: lblMapMsg->fecTlv.fecElArray[loop].addressEl.preLen;
MPLS_FEC_SEARCH(lblMapMsg->fecTlv.fecElArray[loop].addressEl.address,preLen,fecCb)
if(fecCb == MPLS_NULL)
{
/*************************************************************/
/* release label
*/
/*************************************************************/
#if 0
mpls_release_label_map(session,lblMapMsg);
#endif
mpls_release_label_map_fec(session,lblMapMsg,loop);
continue;
}
fecCb->owner |= MPLS_OWNER_LDP;
MPLS_FEC_DOWNCB_SESSION_MSGID(fecCb,downCb,session,msgId)
if(downCb)
{
mpls_set_label_gen(downCb,lblMapMsg->genLblTlv.label,LDP_HOP_LSP);
rec_lblmap_tlvpro(session,lblMapMsg,fecCb,downCb,LDP_HOP_LSP);
}
else
{
mpls_release_label_map_fec(session,lblMapMsg,loop);
continue;
}
}
}
else
{
/*************************************************************/
/* send notification message; BAD Message Content
*/
/*************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -