📄 ldptlv.c
字号:
void * tempcb,
unsigned char cbflag)
{
mplsLdpLblAbortMsg_t * lblAbortMsg;
mplsLdpFecEntry * feclspcb;
mplsLdpCrLsp * crlspcbb;
mplsLdpUpCB * ldpupcb;
mplsLdpLspCB * ldpdodcb;
lblAbortMsg = (mplsLdpLblAbortMsg_t *)lblmessage;
if(cbflag == LDP_HOP_LSP)
{
feclspcb = (mplsLdpFecEntry *)lspcb;
if(session -> labelAdvertisement == 0) /* DU */
{
ldpupcb = (mplsLdpUpCB *)tempcb;
ldpupcb -> msgid = lblAbortMsg -> baseMsg.msgId;
ldpupcb -> upSessionIndex = session -> index;
}
else if(session -> labelAdvertisement == 1) /* DoD */
{
ldpdodcb = (mplsLdpLspCB *)tempcb;
ldpdodcb -> upMsgid = lblAbortMsg -> baseMsg.msgId;
ldpdodcb -> upSessionIndex = session -> index;
}
}
else
{
crlspcbb = (mplsLdpCrLsp *)lspcb;
ldpdodcb = &(crlspcbb -> crlspCb);
ldpdodcb -> upMsgid = lblAbortMsg -> baseMsg.msgId;
ldpdodcb -> upSessionIndex = session -> index;
}
}
/***********************************************************************/
/* FUNCTION NAME : sndlblmsgtlvproc()
/* DESCRIPTION: : send lspcb to label message tlv process
/* INPUT : mplsLdpSession_t * session,
void * lspcb,
unsigned long msgtype
unsigned char cbflag
/* OUTPUT : void
/* AUTHOR/DATE : shi.zhaohui/ 02.06.19
/* GLOBAL : none
/* History : update down msgtype when send msg 2003.1.16
/************************************************************************/
/* only send : lblmessabe isn't null, need tlv process : lblmessage is null ;
cbflag 1: mplsldpfecentry; 2: mplsldpcrlsp */
void sndlblmsgtlvproc(mplsLdpSession_t * session,
void * lspcb,
void * tempcb,
unsigned long msgtype,
unsigned char cbflag)
{
switch(msgtype)
{
case MPLS_LBLREQ_MSGTYPE :
if(session->labelAdvertisement == DOWNSTREAMONDEMAND)
{
((mplsLdpLspCB *)tempcb)->msgType = msgtype;
}
snd_lblreq_tlvpro( session, lspcb, tempcb, cbflag );
break;
case MPLS_LBLMAP_MSGTYPE:
snd_lblmap_tlvpro( session, lspcb, tempcb, cbflag );
break;
case MPLS_LBLREL_MSGTYPE:
if(session->labelAdvertisement == DOWNSTREAMONDEMAND)
{
((mplsLdpLspCB *)tempcb)->msgType = msgtype;
}
snd_lblrel_tlvpro( session, lspcb, tempcb, cbflag );
break;
case MPLS_LBLWITH_MSGTYPE:
snd_lblwith_tlvpro( session, lspcb, tempcb, cbflag );
break;
case MPLS_LBLABORT_MSGTYPE:
if(session->labelAdvertisement == DOWNSTREAMONDEMAND)
{
((mplsLdpLspCB *)tempcb)->msgType = msgtype;
}
snd_lblabort_tlvpro( session, lspcb, tempcb, cbflag );
break;
default : break;
}
}
/***********************************************************************/
/* FUNCTION NAME : snd_lblreq_tlvpro()
/* DESCRIPTION: : send lspcb to label req message tlv process
/* INPUT : mplsLdpSession_t * session,
void * lblmessage,
void * lspcb,
unsigned long msgtype
unsigned char cbflag
/* OUTPUT : void
/* AUTHOR/DATE : shi.zhaohui/ 02.06.19
/* GLOBAL : none
/* History :
/************************************************************************/
void snd_lblreq_tlvpro( mplsLdpSession_t * session,
void * lspcb,
void * tempcb,
unsigned char cbflag)
{
mplsLdpLblReqMsg_t lblReqMsg;
mplsLdpFecEntry *feclspcb;
mplsLdpCrLsp *crlspcbb;
mplsLdpDownCB *ldpdowncb;
mplsLdpAttr *ldpattr;
mplsLdpLspCB *ldpdodcb;
unsigned char routetype;
lblmsgTlvExists tlvexists;
MPLS_MEMSET(&lblReqMsg, 0, sizeof(mplsLdpLblReqMsg_t));
lblReqMsg.baseMsg.flags.flags.msgType = MPLS_LBLREQ_MSGTYPE;
lblReqMsg.baseMsg.flags.flags.uBit = 0;
lblReqMsg.baseMsg.msgId = messageId[LBLREQ_M];
AddMsgId(LBLREQ_M);
lblReqMsg.fecTlvExists = 1;
if(cbflag == LDP_HOP_LSP)
{
feclspcb = (mplsLdpFecEntry *)lspcb;
fectlvtolblmsg(feclspcb -> mplsLdpFecType, feclspcb ->fec_key.mplsLdpFecAddrLen,
feclspcb ->fec_key.mplsFecAddr, &(lblReqMsg.fecTlv));
if(session -> labelAdvertisement == 0) /* DU */
{
ldpdowncb = (mplsLdpDownCB *)tempcb;
ldpdowncb -> msgid = lblReqMsg.baseMsg.msgId;
/* add loop detection */
if(session -> loopDetectionForPV == LOOPDETECT_HOPANDPV)
{
routetype = MPLS_NODE_INGRESS;
cbbtolblreqtlvloopproc(MPLS_NULL, &lblReqMsg, routetype);
}
}
else if(session -> labelAdvertisement == 1) /* DoD */
{
ldpdodcb = (mplsLdpLspCB *)tempcb;
ldpdodcb -> downMsgid = lblReqMsg.baseMsg.msgId;
/* add loop detection */
if(session -> loopDetectionForPV == LOOPDETECT_HOPANDPV)
{
if(ldpdodcb -> nodeType == MPLS_NODE_INTERM_INGRESS)
{
routetype = MPLS_NODE_INGRESS;
}
else
{
routetype = ldpdodcb -> nodeType;
}
cbbtolblreqtlvloopproc(&(ldpdodcb->pAttr), &lblReqMsg, routetype);
}
}
}
else /* cr lsp */
{
crlspcbb = (mplsLdpCrLsp *)lspcb;
ldpdodcb = &(crlspcbb -> crlspCb);
fectlvtolblmsg(crlspcbb -> mplsLdpFecType, crlspcbb -> mplsLdpFecAddrLen,
crlspcbb -> mplsFecAddr, &(lblReqMsg.fecTlv));
/*********************************************************************/
/* label request must have lspid tlv
* wengqing add
*/
/*********************************************************************/
lblReqMsg.lspidTlv.actFlag.flag.res = 0;
lblReqMsg.lspidTlv.actFlag.flag.ActFlag = MPLS_CRLSP_ACTION_INIT;
lblReqMsg.lspidTlv.baseTlv.length = MPLS_LSPIDTLV_FIXLEN;
lblReqMsg.lspidTlv.baseTlv.flags.flags.uBit = 0;
lblReqMsg.lspidTlv.baseTlv.flags.flags.fBit = 0;
lblReqMsg.lspidTlv.baseTlv.flags.flags.type = MPLS_LSPID_TLVTYPE;
lblReqMsg.lspidTlvExists = 1;
/*********************************************************************/
/* wengqing add end
*/
/*********************************************************************/
lblReqMsg.lspidTlv.routerId = crlspcbb ->crfec_key.ingressid ;
lblReqMsg.lspidTlv.localCrlspId = crlspcbb ->crfec_key.locallspid;
ldpdodcb -> downMsgid = lblReqMsg.baseMsg.msgId;
/* loop detection */
if(session -> loopDetectionForPV == LOOPDETECT_HOPANDPV)
{
routetype = ldpdodcb -> nodeType;
cbbtolblreqtlvloopproc(&(ldpdodcb->pAttr), &lblReqMsg, routetype);
}
tlvexists.mark = crlspcbb -> tlvExists;
if(tlvexists.flags.erTlvExists == 1)
{
lblReqMsg.erTlvExists = 1;
MPLS_MEMCPY(&(lblReqMsg.erTlv),&(crlspcbb -> erTlv),sizeof(mplsLdpErTlv_t));
}
if(tlvexists.flags.trafficTlvExists == 1)
{
lblReqMsg.trafficTlvExists = 1;
MPLS_MEMCPY(&(lblReqMsg.trafficTlv),&(crlspcbb -> trafficTlv),
sizeof(mplsLdpTrafficTlv_t)) ;
}
if(tlvexists.flags.pinningTlvExists == 1)
{
lblReqMsg.pinningTlvExists = 1;
MPLS_MEMCPY(&(lblReqMsg.pinningTlv),&(crlspcbb -> pinningTlv),
sizeof(mplsLdpPinningTlv_t)) ;
}
if(tlvexists.flags.recClassTlvExists == 1)
{
lblReqMsg.recClassTlvExists = 1;
MPLS_MEMCPY(&(lblReqMsg.resClassTlv),&(crlspcbb -> resClassTlv),
sizeof(mplsLdpResClsTlv_t));
}
if(tlvexists.flags.preemptTlvExists == 1)
{
lblReqMsg.preemptTlvExists = 1;
MPLS_MEMCPY(&(lblReqMsg.preemptTlv),&(crlspcbb -> preemptTlv),
sizeof(mplsLdpPreemptTlv_t));
}
}
#if 0
SendTcpMsg(session,MPLS_LBLREQ_MSGTYPE,&lblReqMsg);
#endif
Func_lblmsg_wait_proce(session,MPLS_LBLREQ_MSGTYPE,&lblReqMsg);
}
/***********************************************************************/
/* FUNCTION NAME : snd_lblmap_tlvpro()
/* DESCRIPTION: : send lspcb to label map message tlv process
/* INPUT : mplsLdpSession_t * session,
void * lblmessage,
void * lspcb,
unsigned char cbflag
/* OUTPUT : void
/* AUTHOR/DATE : shi.zhaohui/ 02.06.19
/* GLOBAL : none
/* History :
/************************************************************************/
void snd_lblmap_tlvpro(mplsLdpSession_t * session,
void * lspcb,
void * tempcb,
unsigned char cbflag)
{
mplsLdpLblMapMsg_t lblMapMsg;
mplsLdpFecEntry *feclspcb;
mplsLdpCrLsp *crlspcbb;
mplsLdpDownCB *ldpdowncb;
mplsLdpUpCB *ldpupcb;
mplsLdpAttr *ldpattr;
mplsLdpLspCB *ldpdodcb;
unsigned char routetype;
mplsLdpSession_t *downsession = MPLS_NULL;
MPLS_MEMSET(&lblMapMsg, 0, sizeof(mplsLdpLblMapMsg_t));
lblMapMsg.baseMsg.msgId = messageId[LBLMAP_M];
lblMapMsg.baseMsg.flags.flags.uBit = 0;
lblMapMsg.baseMsg.flags.flags.msgType = MPLS_LBLMAP_MSGTYPE;
AddMsgId(LBLMAP_M);
lblMapMsg.fecTlvExists = 1;
if(cbflag == LDP_HOP_LSP)
{
feclspcb = (mplsLdpFecEntry *)lspcb;
fectlvtolblmsg(feclspcb -> mplsLdpFecType, feclspcb ->fec_key.mplsLdpFecAddrLen,
feclspcb ->fec_key.mplsFecAddr, &(lblMapMsg.fecTlv));
if(session -> labelAdvertisement == 0) /* DU */
{
ldpupcb = (mplsLdpUpCB *)tempcb;
lblMapMsg.genLblTlvExists = 1;
genlbltolblmsg(feclspcb->localGenLabel, &(lblMapMsg.genLblTlv));
if(ldpupcb->state == RESPONSE_AWAITED)
{
lblMapMsg.lblMsgIdTlvExists = 1;
reqmsgidtolblmsg(ldpupcb->msgid, &(lblMapMsg.lblMsgIdTlv));
}
ldpupcb -> msgid = lblMapMsg.baseMsg.msgId;
/* loop detection process */
if(session ->loopDetectionForPV == LOOPDETECT_HOPANDPV)
{
MPLS_NEXTHOP_SESSION_SEARCH(feclspcb->nexthopAddr,downsession);
if(downsession != MPLS_NULL)
{
MPLS_DOWNCB_SEARCH(feclspcb,downsession,ldpdowncb);
if(ldpdowncb != MPLS_NULL)
{
sndfeclsp_mapmsg_looptlvproc_du(&(ldpdowncb->pAttr),&lblMapMsg,
feclspcb -> nodeType);
}
else
{
printf("no find down cb !!!! ");
sndfeclsp_mapmsg_looptlvproc_du(MPLS_NULL,&lblMapMsg,
feclspcb -> nodeType);
}
}
else
{
printf(" no find down session !!!!! ");
sndfeclsp_mapmsg_looptlvproc_du(MPLS_NULL,&lblMapMsg,
feclspcb -> nodeType);
}
}
}
else if(session -> labelAdvertisement == 1) /* DoD */
{
ldpdodcb = (mplsLdpLspCB *)tempcb;
lblMapMsg.atmLblTlvExists = 1;
atmlbltolblmsg(ldpdodcb -> upAtmLabel.vpi,
ldpdodcb -> upAtmLabel.vci,
&(lblMapMsg.atmLblTlv));
/*************************************************************/
/* for dod, must add request msgid in mapping
*/
/*************************************************************/
lblMapMsg.lblMsgIdTlvExists = 1;
reqmsgidtolblmsg(ldpdodcb->upMsgid, &(lblMapMsg.lblMsgIdTlv));
/* loop detection */
if(session ->loopDetectionForPV == LOOPDETECT_HOPANDPV)
{
if(ldpdodcb ->nodeType == MPLS_NODE_INTERM_EGRESS)
{
routetype = MPLS_NODE_EGRESS;
}
else
{
routetype = ldpdodcb ->nodeType;
}
sndfeclsp_mapmsg_looptlvproc_dod(&(ldpdodcb->pAttr), &lblMapMsg, routetype);
}
ldpdodcb -> upMsgid = lblMapMsg.baseMsg.msgId;
}
#if 0
SendTcpMsg(session,MPLS_LBLMAP_MSGTYPE,&lblMapMsg);
#endif
Func_lblmsg_wait_proce(session,MPLS_LBLMAP_MSGTYPE,&lblMapMsg);
}
else /* cr lsp */
{
crlspcbb = (mplsLdpCrLsp *)lspcb;
ldpdodcb = &(crlspcbb -> crlspCb);
fectlvtolblmsg(crlspcbb -> mplsLdpFecType, crlspcbb -> mplsLdpFecAddrLen,
crlspcbb -> mplsFecAddr, &(lblMapMsg.fecTlv));
/* crlsp for performance and dynamic crlsp building, we should have lspid tlv */
lblMapMsg.lspidTlvExists = 1;
setmsglspid(crlspcbb,&(lblMapMsg.lspidTlv));
if(session -> labelAdvertisement == 0) /* DU */
{
lblMapMsg.genLblTlvExists = 1;
genlbltolblmsg(ldpdodcb -> upGenLabel, &(lblMapMsg.genLblTlv));
}
else if(session -> labelAdvertisement == 1) /* DoD */
{
lblMapMsg.atmLblTlvExists = 1;
atmlbltolblmsg(ldpdodcb -> upAtmLabel.vpi,
ldpdodcb -> upAtmLabel.vci,
&(lblMapMsg.atmLblTlv));
}
lblMapMsg.lblMsgIdTlvExists = 1;
reqmsgidtolblmsg(ldpdodcb->upMsgid, &(lblMapMsg.lblMsgIdTlv));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -