📄 ldptlv.c
字号:
optaltocrlblmapmsg(crlspcbb, &lblMapMsg);
/* loop detection */
if(session ->loopDetectionForPV == LOOPDETECT_HOPANDPV)
{
sndfeclsp_mapmsg_looptlvproc_dod(&(ldpdodcb->pAttr),
&lblMapMsg, ldpdodcb ->nodeType);
}
ldpdodcb -> upMsgid = lblMapMsg.baseMsg.msgId;
#if 0
SendTcpMsg(session,MPLS_LBLMAP_MSGTYPE,&lblMapMsg);
#endif
Func_lblmsg_wait_proce(session,MPLS_LBLMAP_MSGTYPE,&lblMapMsg);
}
}
/***********************************************************************/
/* FUNCTION NAME : snd_lblrel_tlvpro()
/* DESCRIPTION: : send lspcb to label rel message tlv process
/* INPUT : mplsLdpSession_t * session,
void * lspcb,
unsigned char cbflag
/* OUTPUT : void
/* AUTHOR/DATE : shi.zhaohui/ 02.06.19
/* GLOBAL : none
/* History :
/************************************************************************/
void snd_lblrel_tlvpro( mplsLdpSession_t * session,
void * lspcb,
void * tempcb,
unsigned char cbflag)
{
mplsLdpLbl_W_R_Msg_t lblRelMsg;
mplsLdpFecEntry * feclspcb;
mplsLdpCrLsp * crlspcbb;
mplsLdpDownCB * ldpdowncb;
mplsLdpLspCB * ldpdodcb;
MPLS_MEMSET(&lblRelMsg, 0, sizeof(mplsLdpLbl_W_R_Msg_t));
lblRelMsg.baseMsg.msgId = messageId[LBL_W_R_M];
lblRelMsg.baseMsg.flags.flags.msgType = MPLS_LBLREL_MSGTYPE;
lblRelMsg.baseMsg.flags.flags.uBit = 0;
AddMsgId(LBL_W_R_M);
lblRelMsg.fecTlvExists = 1;
if(cbflag == LDP_HOP_LSP)
{
feclspcb = (mplsLdpFecEntry *)lspcb;
fectlvtolblmsg(feclspcb -> mplsLdpFecType,
feclspcb ->fec_key.mplsLdpFecAddrLen,
feclspcb ->fec_key.mplsFecAddr,
&(lblRelMsg.fecTlv));
if(session -> labelAdvertisement == 0)/* DU */
{
/* if have label tlv, encode gen label */
ldpdowncb = (mplsLdpDownCB *)tempcb;
ldpdowncb -> msgid = lblRelMsg.baseMsg.msgId;
if(ldpdowncb -> downGenLabel != 0) /* 0: no label */
{
lblRelMsg.genLblTlvExists = 1;
genlbltolblmsg(ldpdowncb -> downGenLabel , &(lblRelMsg.genLblTlv));
}
}
else if(session -> labelAdvertisement == 1)/* DoD */
{
/* if have label tlv, encode gen label */
ldpdodcb = (mplsLdpLspCB *)tempcb;
ldpdodcb -> downMsgid = lblRelMsg.baseMsg.msgId;
if(!((ldpdodcb -> downAtmLabel.vpi == 0)&&
(ldpdodcb -> downAtmLabel.vci == 0)))
{
lblRelMsg.atmLblTlvExists = 1;
atmlbltolblmsg(ldpdodcb -> downAtmLabel.vpi,
ldpdodcb -> downAtmLabel.vci,
&(lblRelMsg.atmLblTlv));
}
}
}
else /* cr lsp */
{
crlspcbb = (mplsLdpCrLsp *)lspcb;
ldpdodcb = &(crlspcbb -> crlspCb);
ldpdodcb -> downMsgid = lblRelMsg.baseMsg.msgId;
fectlvtolblmsg(crlspcbb -> mplsLdpFecType,
crlspcbb -> mplsLdpFecAddrLen,
crlspcbb -> mplsFecAddr,
&(lblRelMsg.fecTlv));
/* crlsp for performance and dynamic crlsp building, we should have lspid tlv */
lblRelMsg.lspidTlvExists = 1;
setmsglspid(crlspcbb,&(lblRelMsg.lspidTlv));
if(session -> labelAdvertisement == 0)/* DU */
{
/* if have label tlv, encode gen label */
if(ldpdodcb -> downGenLabel != 0) /* 0: no label */
{
lblRelMsg.genLblTlvExists = 1;
genlbltolblmsg(ldpdodcb -> downGenLabel, &(lblRelMsg.genLblTlv));
}
}
else if(session -> labelAdvertisement == 1)/* DoD */
{
/* if have label tlv, encode gen label */
if(!((ldpdodcb -> downAtmLabel.vpi == 0)
&& (ldpdodcb -> downAtmLabel.vci == 0))) /* 0: no label */
{
lblRelMsg.atmLblTlvExists = 1;
atmlbltolblmsg(ldpdodcb -> downAtmLabel.vpi,
ldpdodcb -> downAtmLabel.vci,
&(lblRelMsg.atmLblTlv));
}
}
}
#if 0
SendTcpMsg(session,MPLS_LBLREL_MSGTYPE,&lblRelMsg);
#endif
Func_lblmsg_wait_proce( session, MPLS_LBLREL_MSGTYPE, &lblRelMsg);
}
/***********************************************************************/
/* FUNCTION NAME : snd_lblwith_tlvpro()
/* DESCRIPTION: : send lspcb to label with message tlv process
/* INPUT : mplsLdpSession_t * session,
void * lspcb,
void * tempcb,
unsigned char cbflag
/* OUTPUT : void
/* AUTHOR/DATE : shi.zhaohui/ 02.06.19
/* GLOBAL : none
/* History :
/************************************************************************/
void snd_lblwith_tlvpro( mplsLdpSession_t * session,
void * lspcb,
void * tempcb,
unsigned char cbflag)
{
mplsLdpLbl_W_R_Msg_t lblWithMsg;
mplsLdpFecEntry * feclspcb;
mplsLdpCrLsp * crlspcbb;
mplsLdpUpCB * ldpupcb;
mplsLdpLspCB * ldpdodcb;
MPLS_MEMSET(&lblWithMsg, 0, sizeof(mplsLdpLbl_W_R_Msg_t));
lblWithMsg.baseMsg.msgId = messageId[LBL_W_R_M];
lblWithMsg.baseMsg.flags.flags.msgType = MPLS_LBLWITH_MSGTYPE;
lblWithMsg.baseMsg.flags.flags.uBit = 0;
AddMsgId(LBL_W_R_M);
lblWithMsg.fecTlvExists = 1;
if(cbflag == LDP_HOP_LSP)
{
feclspcb = (mplsLdpFecEntry *)lspcb;
fectlvtolblmsg(feclspcb -> mplsLdpFecType,
feclspcb ->fec_key.mplsLdpFecAddrLen,
feclspcb ->fec_key.mplsFecAddr,
&(lblWithMsg.fecTlv));
if(session -> labelAdvertisement == 0)/* DU */
{
/* if have label tlv, encode gen label */
ldpupcb = (mplsLdpUpCB *)tempcb;
ldpupcb -> msgid = lblWithMsg.baseMsg.msgId;
if(ldpupcb -> upGenLabel != 0) /* 0: no label */
{
lblWithMsg.genLblTlvExists = 1;
genlbltolblmsg(ldpupcb -> upGenLabel , &(lblWithMsg.genLblTlv));
}
}
else if(session -> labelAdvertisement == 1)/* DoD */
{
/* if have label tlv, encode gen label */
ldpdodcb = (mplsLdpLspCB *)tempcb;
ldpdodcb -> upMsgid = lblWithMsg.baseMsg.msgId;
if(!((ldpdodcb -> upAtmLabel.vpi == 0)&&
(ldpdodcb -> upAtmLabel.vci == 0)))
{
lblWithMsg.atmLblTlvExists = 1;
atmlbltolblmsg(ldpdodcb -> upAtmLabel.vpi,
ldpdodcb -> upAtmLabel.vci,
&(lblWithMsg.atmLblTlv));
}
}
}
else /* cr lsp */
{
crlspcbb = (mplsLdpCrLsp *)lspcb;
ldpdodcb = &(crlspcbb -> crlspCb);
ldpdodcb -> upMsgid = lblWithMsg.baseMsg.msgId;
fectlvtolblmsg(crlspcbb -> mplsLdpFecType,
crlspcbb -> mplsLdpFecAddrLen,
crlspcbb -> mplsFecAddr,
&(lblWithMsg.fecTlv));
/* crlsp for performance and dynamic crlsp building, we should have lspid tlv */
lblWithMsg.lspidTlvExists = 1;
setmsglspid(crlspcbb,&(lblWithMsg.lspidTlv));
if(session -> labelAdvertisement == 0)/* DU */
{
/* if have label tlv, encode gen label */
if(ldpdodcb -> upGenLabel != 0) /* 0: no label */
{
lblWithMsg.genLblTlvExists = 1;
genlbltolblmsg(ldpdodcb -> upGenLabel, &(lblWithMsg.genLblTlv));
}
}
else if(session -> labelAdvertisement == 1)/* DoD */
{
/* if have label tlv, encode atm label */
if(!((ldpdodcb -> upAtmLabel.vpi == 0)
&& (ldpdodcb -> upAtmLabel.vci == 0))) /* 0: no label */
{
lblWithMsg.atmLblTlvExists = 1;
atmlbltolblmsg(ldpdodcb -> upAtmLabel.vpi,
ldpdodcb -> upAtmLabel.vci,
&(lblWithMsg.atmLblTlv));
}
}
}
#if 0
SendTcpMsg(session,MPLS_LBLWITH_MSGTYPE,&lblWithMsg);
#endif
Func_lblmsg_wait_proce( session, MPLS_LBLWITH_MSGTYPE, &lblWithMsg);
}
/***********************************************************************/
/* FUNCTION NAME : snd_lblabort_tlvpro()
/* DESCRIPTION: : send lspcb to label with message tlv process
/* INPUT : mplsLdpSession_t * session,
void * lspcb,
void * tempcb,
unsigned char cbflag
/* OUTPUT : void
/* AUTHOR/DATE : shi.zhaohui/ 02.06.19
/* GLOBAL : none
/* History :
/************************************************************************/
void snd_lblabort_tlvpro( mplsLdpSession_t * session,
void * lspcb,
void * tempcb,
unsigned char cbflag)
{
mplsLdpLblAbortMsg_t lblAbortMsg;
mplsLdpFecEntry * feclspcb;
mplsLdpCrLsp * crlspcbb;
mplsLdpDownCB * ldpdowncb;
mplsLdpLspCB * ldpdodcb;
MPLS_MEMSET(&lblAbortMsg, 0, sizeof(mplsLdpLblAbortMsg_t));
lblAbortMsg.baseMsg.msgId = messageId[LBLABORT_M];
lblAbortMsg.baseMsg.flags.flags.msgType = MPLS_LBLABORT_MSGTYPE;
lblAbortMsg.baseMsg.flags.flags.uBit = 0;
AddMsgId(LBLABORT_M);
lblAbortMsg.fecTlvExists = 1;
if(cbflag == LDP_HOP_LSP)
{
feclspcb = (mplsLdpFecEntry *)lspcb;
fectlvtolblmsg(feclspcb -> mplsLdpFecType,
feclspcb ->fec_key.mplsLdpFecAddrLen,
feclspcb ->fec_key.mplsFecAddr,
&(lblAbortMsg.fecTlv));
if(session -> labelAdvertisement == 0)/* DU */
{
/* if have label tlv, encode gen label */
ldpdowncb = (mplsLdpDownCB *)tempcb;
/* if(ldpdowncb->msgid != 0 ) */
{
lblAbortMsg.lblMsgIdTlvExists = 1;
reqmsgidtolblmsg(ldpdowncb->msgid, &(lblAbortMsg.lblMsgIdTlv));
}
ldpdowncb->msgid = lblAbortMsg.baseMsg.msgId;
}
else if(session -> labelAdvertisement == 1)/* DoD */
{
/* if have label tlv, encode gen label */
ldpdodcb = (mplsLdpLspCB *)tempcb;
/* if(ldpdodcb->downMsgid != 0 ) */
{
lblAbortMsg.lblMsgIdTlvExists = 1;
reqmsgidtolblmsg(ldpdodcb->downMsgid, &(lblAbortMsg.lblMsgIdTlv));
}
ldpdodcb->downMsgid = lblAbortMsg.baseMsg.msgId;
}
}
else /* cr lsp */
{
crlspcbb = (mplsLdpCrLsp *)lspcb;
ldpdodcb = &(crlspcbb -> crlspCb);
fectlvtolblmsg(crlspcbb -> mplsLdpFecType,
crlspcbb -> mplsLdpFecAddrLen,
crlspcbb -> mplsFecAddr,
&(lblAbortMsg.fecTlv));
/* crlsp for performance and dynamic crlsp building, we should have lspid tlv */
lblAbortMsg.lspidTlvExists = 1;
setmsglspid(crlspcbb,&(lblAbortMsg.lspidTlv));
/* if(ldpdodcb->downMsgid != 0 ) */
{
lblAbortMsg.lblMsgIdTlvExists = 1;
reqmsgidtolblmsg(ldpdodcb->downMsgid, &(lblAbortMsg.lblMsgIdTlv));
}
ldpdodcb->downMsgid = lblAbortMsg.baseMsg.msgId;
}
# if 0
SendTcpMsg(session,MPLS_LBLABORT_MSGTYPE,&lblAbortMsg);
#endif
Func_lblmsg_wait_proce( session, MPLS_LBLABORT_MSGTYPE, &lblAbortMsg);
}
/* by hyh 02-8-14 */
/* for agilent test */
short ldp_atmlabeltlv_test(mplsLdpSession_t *session,mplsLdpLblMapMsg_t *lblMapMsg)
{
/* 36.tst*/
/* if v bint in atm label == 11,send notification and not propagate mapping */
if(lblMapMsg->atmLblTlv.flags.flags.v == 3)
{
sndnotifymsgproc(session, MALFORMTLVVAL, lblMapMsg -> baseMsg.msgId,
MPLS_LBLMAP_MSGTYPE);
#ifdef DEBUG_LDP
printf("==rec feclsp mapping message, atmlabel v flag error !!! ==");
#endif
return LDP_FALSE;
}
/* 210.tst */
/* if atm label not insistent with negotiated direct,
release it and not propagate mapping */
if((lblMapMsg->atmLblTlv.vci%2 == 1 && session->vcNumeberdType == LDP_ODD)||
(lblMapMsg->atmLblTlv.vci%2 == 0 && session->vcNumeberdType == LDP_EVEN))
{
/*************************************************************/
/* release label
*/
/*************************************************************/
mpls_release_label_map(session,lblMapMsg);
#ifdef DEBUG_LDP
printf("==rec feclsp mapping message, atmlabel vci odd/even not match !!! ==");
#endif
return LDP_FALSE;
}
/* 211.tst */
/* if atm label outside negotiated range,release it and not propagate mapping */
if((lblMapMsg->atmLblTlv.vci < session->LdpLblRng.atmlblrnglist[0].flags.flags.minVci ||
lblMapMsg->atmLblTlv.vci > session->LdpLblRng.atmlblrnglist[0].flags.flags.maxVci)
||(lblMapMsg->atmLblTlv.flags.flags.vpi < session->LdpLblRng.atmlblrnglist[0].flags.flags.minVpi||
lblMapMsg->atmLblTlv.flags.flags.vpi > session->LdpLblRng.atmlblrnglist[0].flags.flags.maxVpi))
{
/*************************************************************/
/* release label
*/
/*************************************************************/
mpls_release_label_map(session,lblMapMsg);
#ifdef DEBUG_LDP
printf("==rec feclsp mapping message, atmlabel out range !!! ==");
#endif
return LDP_FALSE;
}
return LDP_TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -