📄 labelmap.c
字号:
MPLS_SEND_NOTIFY(session,MISSPARAMETER,lblMapMsg->baseMsg.msgId, \
lblMapMsg->baseMsg.flags.flags.msgType);
return;
}
}
else
{
/*********************************************************************/
/* not for some reqest,currently no process for CRLDP attribute change
* directly search Fec link list
*/
/*********************************************************************/
fecCb = MPLS_NULL;
ret = MPLS_FALSE;
/* policy check */
for(loop = 0 ; loop < lblMapMsg->fecTlv.numberFecElements; loop ++)
{
/*
ret = mpls_policy_filter(lblMapMsg->fecTlv.fecElArray[loop].addressEl.address, \
lblMapMsg->fecTlv.fecElArray[loop].addressEl.preLen);
if(ret == MPLS_FALSE)
{
mpls_release_label_map_fec(session,lblMapMsg,loop);
continue;
}
*/
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)
{
if(lblMapMsg->genLblTlvExists != 1)
{
mpls_release_label_map_fec(session,lblMapMsg,loop);
continue;
}
MPLS_FEC_CREATE((lblMapMsg->fecTlv.fecElArray[loop].addressEl.address), \
(lblMapMsg->fecTlv.fecElArray[loop].addressEl.preLen),\
fecCb)
if(fecCb)
{
fecCb->localGenLabel = MPLS_HUNT_GEN_LABEL();
fecCb->owner |= MPLS_OWNER_LDP;
MPLS_DOWNCB_CREATE(session,downCb,fecCb)
if(downCb)
{
downCb->downGenLabel = lblMapMsg->genLblTlv.label;
downCb->downSessionIndex = session->index;
rec_lblmap_tlvpro(session,lblMapMsg,fecCb,downCb,LDP_HOP_LSP);
downCb->downPeerLdpid.lsrAddress = session->peerLdpId.lsrAddress;
downCb->downPeerLdpid.labelSpace = session->peerLdpId.labelSpace;
downCb->state = ESTABLISHED;
}
else
{
MPLS_ERR_LOG("mpls_err_log");
MPLS_FEC_DELETE(fecCb->fec_key.mplsFecAddr,fecCb->fec_key.mplsLdpFecAddrLen,fecCb);
mpls_release_label_map(session,lblMapMsg);
}
}
else
{
/* fec space is full, just discard the mapping */
DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_LSP,"FuncLblMap ,creat fec fail \n");
printf("mpls_err_log,FuncLblMap,create fec error\n");
mpls_release_label_map_fec(session,lblMapMsg,loop);
}
continue;
}
/* search fecCb success */
downCb = MPLS_NULL;
lspCb = MPLS_NULL;
if(lblMapMsg->genLblTlvExists == 1)
{
MPLS_DOWNCB_SEARCH(fecCb,session,downCb)
if(downCb != MPLS_NULL)
{
fecCb->owner |= MPLS_OWNER_LDP;
/* there exist downstream label mapping */
if(downCb->downGenLabel == lblMapMsg->genLblTlv.label)
{
rec_lblmap_tlvpro(session,lblMapMsg,fecCb,downCb,LDP_HOP_LSP);
downCb->downSessionIndex = session->index;
downCb->downPeerLdpid.lsrAddress = session->peerLdpId.lsrAddress;
downCb->downPeerLdpid.labelSpace = session->peerLdpId.labelSpace;
downCb->state = ESTABLISHED;
if(fecCb->owner & MPLS_OWNER_ROUTE)
{
belong_to = MPLS_FALSE;
MPLS_NEXTHOP_SESSION_BELONG(fecCb->nexthopAddr,session,belong_to);
if(belong_to == MPLS_TRUE)
{
if((downCb->waitflag) & 0x20){/* 原有标记整合操作*/
if((downCb->waitflag)& 0x4){ /*原有CLOSE操作 */
downCb->waitflag &= 0xda;
if(!((downCb->waitflag)&0xe0)){
DownCB_locat_adjust(downCb,fecCb,0x2,&FecDelFlag);
}
}
else
{
;/* do nothing ! */
}
}
else
{
wait_downfeclbl_append(downCb,fecCb,LDP_FWD_CREATE);
}
}
}
}
else
{
mpls_release_label_map_fec(session,lblMapMsg,loop);
#if 0
if(fecCb->owner & MPLS_OWNER_ROUTE)
{
belong_to = MPLS_FALSE;
MPLS_NEXTHOP_SESSION_BELONG(fecCb->nexthopAddr,session,belong_to);
if(belong_to == MPLS_TRUE)
{
if((downCb->waitflag) & 0x20){/* 原有标记整合操作*/
if(!((downCb->waitflag)& 0x4)){ /*原有CREAT操作 */
downCb->downGenLabel = lblMapMsg->genLblTlv.label;
}
else
{
MPLS_DOWNCB_CREATE(session,downCb,fecCb)
if(downCb)
{
downCb->downGenLabel = lblMapMsg->genLblTlv.label;
downCb->downSessionIndex = session->index;
rec_lblmap_tlvpro(session,lblMapMsg,fecCb,downCb,LDP_HOP_LSP);
downCb->downPeerLdpid.lsrAddress = session->peerLdpId.lsrAddress;
downCb->downPeerLdpid.labelSpace = session->peerLdpId.labelSpace;
downCb->state = ESTABLISHED;
}
wait_downfeclbl_append(downCb,fecCb,LDP_FWD_CREATE);
}
}
else
{
downCb->downGenLabel = lblMapMsg->genLblTlv.label;
wait_downfeclbl_append(downCb,fecCb,LDP_FWD_CREATE);
}
}
else /* mapping not from next hop */
{
/* need not label process */
if(!((downCb->waitflag) & 0x20))
{
rec_lblmap_tlvpro(session,lblMapMsg,fecCb,downCb,LDP_HOP_LSP);
downCb->downSessionIndex = session->index;
downCb->downPeerLdpid.lsrAddress = session->peerLdpId.lsrAddress;
downCb->downPeerLdpid.labelSpace = session->peerLdpId.labelSpace;
downCb->state = ESTABLISHED;
}
else
{
MPLS_DOWNCB_CREATE(session,downCb,fecCb)
if(downCb)
{
downCb->downGenLabel = lblMapMsg->genLblTlv.label;
downCb->downSessionIndex = session->index;
rec_lblmap_tlvpro(session,lblMapMsg,fecCb,downCb,LDP_HOP_LSP);
downCb->downPeerLdpid.lsrAddress = session->peerLdpId.lsrAddress;
downCb->downPeerLdpid.labelSpace = session->peerLdpId.labelSpace;
downCb->state = ESTABLISHED;
}
else
{
MPLS_ERR_LOG(" downCb souce unavailable ");
}
}
}
}
else /* no route */
{
/* need not label process */
if(!((downCb->waitflag) & 0x20))
{
rec_lblmap_tlvpro(session,lblMapMsg,fecCb,downCb,LDP_HOP_LSP);
downCb->downSessionIndex = session->index;
downCb->downPeerLdpid.lsrAddress = session->peerLdpId.lsrAddress;
downCb->downPeerLdpid.labelSpace = session->peerLdpId.labelSpace;
downCb->state = ESTABLISHED;
}
else
{
MPLS_DOWNCB_CREATE(session,downCb,fecCb)
if(downCb)
{
downCb->downGenLabel = lblMapMsg->genLblTlv.label;
downCb->downSessionIndex = session->index;
rec_lblmap_tlvpro(session,lblMapMsg,fecCb,downCb,LDP_HOP_LSP);
downCb->downPeerLdpid.lsrAddress = session->peerLdpId.lsrAddress;
downCb->downPeerLdpid.labelSpace = session->peerLdpId.labelSpace;
downCb->state = ESTABLISHED;
}
else
{
MPLS_ERR_LOG(" downCb souce unavailable ");
}
}
}
#endif
}
}
else
{
MPLS_DOWNCB_CREATE(session,downCb,fecCb)
if(downCb)
{
fecCb->owner |= MPLS_OWNER_LDP;
downCb->downGenLabel = lblMapMsg->genLblTlv.label;
downCb->downSessionIndex = session->index;
rec_lblmap_tlvpro(session,lblMapMsg,fecCb,downCb,LDP_HOP_LSP);
downCb->downPeerLdpid.lsrAddress = session->peerLdpId.lsrAddress;
downCb->downPeerLdpid.labelSpace = session->peerLdpId.labelSpace;
downCb->state = ESTABLISHED;
if(fecCb->owner & MPLS_OWNER_ROUTE)
{
belong_to = MPLS_FALSE;
MPLS_NEXTHOP_SESSION_BELONG(fecCb->nexthopAddr,session,belong_to);
if(belong_to == MPLS_TRUE)
{
wait_downfeclbl_append(downCb,fecCb,LDP_FWD_CREATE);
}
}
}
else
{
printf("mpls_err_log");;
MPLS_FEC_DELETE(fecCb->fec_key.mplsFecAddr,fecCb->fec_key.mplsLdpFecAddrLen,fecCb);
mpls_release_label_map_fec(session,lblMapMsg);
break;
}
}
}
else
{
MPLS_FEC_SESSION_DOWN_ATM_LABEL(session,lblMapMsg->atmLblTlv,
&lblMapMsg->fecTlv,fecCb,lspCb);
if(lspCb == MPLS_NULL)
{
mpls_release_label_map_fec(session,lblMapMsg,loop);
continue;
}
rec_lblmap_tlvpro(session,lblMapMsg,fecCb,lspCb,LDP_HOP_LSP);
continue;
}
}
}
return;
}
/****************************************************************************/
/* 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 : judge if the cb is crlspcb
* Note : after return, the function should assert the result
* according to other information
* when dynamic crlsp, lspid should exists
*/
/****************************************************************************/
MPLS_BOOL reqCrlsp(mplsLdpCrLsp * crlspCB,mplsLdpFecTlv_t * fecTlv,
mplsLdpSession_t * session,unsigned long msgid,unsigned char lspid)
{
MPLS_BOOL ret = MPLS_FALSE;
crlspCB = MPLS_NULL;
if(fecTlv->fecElemTypes[0] == MPLS_CRLSP_FEC || lspid == 1)
{
ret = MPLS_TRUE;
}
else
{
MPLS_CRFEC_DOWN_SESSION_MSGID(session,msgid,crlspCB);
}
if(crlspCB != MPLS_NULL)
ret = MPLS_TRUE;
return ret;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -