📄 ldptlv.c
字号:
/********************************************************************/
/* Product Name: mpls pack1.0 */
/* Module Name: protocol */
/* File Name: ldptlv.c */
/* Author Name: shi.zhaohui */
/* Creat Date: 06/21/2002 */
/* Version : 1.0 */
/* Function : ldp label message tlv process */
/* History : */
/* 2002.12.3 Huyonghong crlsp for performance and dynamic crlsp */
/* building, we should have lspid tlv */
/* 2003.3.4 huyonghong modify path vector memmory manage */
/* 2003-12-10 lixia mod for debug mpls */
/********************************************************************/
#include "ldpvars.h"
/***********************************************************************/
/* FUNCTION NAME : sndnotifymsgproc()
/* DESCRIPTION: : send notify message process
/* INPUT : mplsLdpSession_t * session,
unsigned long statuscode,
unsigned long msgid,
unsigned long msgtype
/* OUTPUT : void
/* AUTHOR/DATE : shi.zhaohui/ 02.06.19
/* GLOBAL : none
/* History :
/************************************************************************/
void sndnotifymsgproc(mplsLdpSession_t * session, unsigned long statuscode,
unsigned long msgid, unsigned long msgtype)
{
mplsLdpNotifMsg_t notifMsg;
MPLS_MEMSET(¬ifMsg, 0, sizeof(mplsLdpNotifMsg_t));
/* conform error Notify message */
BuildNotifMsg(¬ifMsg,statuscode,msgid,msgtype);
if(statuscode != SHUT_DOWN)
{
processldpstats(statuscode, session);
}
DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_LSP,"==== send notify msg to %x,status code = %x ====\n",session->peerIpaddr,statuscode);
MPLS_ERR_LOG("==== notify msg,status code = %d ====",statuscode);
#if 0
SendTcpMsg(session,MPLS_NOT_MSGTYPE,¬ifMsg);
#endif
Func_lblmsg_wait_proce(session,MPLS_NOT_MSGTYPE,¬ifMsg);
return ;
}
/* add by hyh 02-8-13 */
/* when receive abort msg,should respond notification msg with msg id tlv */
void mpls_send_abnot(mplsLdpSession_t * session, unsigned long statuscode,
unsigned long msgid, unsigned long msgtype,unsigned long tlvMsgid)
{
mplsLdpNotifMsg_t notifMsg;
MPLS_MEMSET(¬ifMsg, 0, sizeof(mplsLdpNotifMsg_t));
/* conform error Notify message */
BuildNotifMsg(¬ifMsg,statuscode,msgid,msgtype);
notifMsg.baseMsg.msgId = messageId[NOT_M];
AddMsgId(NOT_M);
notifMsg.status.flags.flags.error = 0;
notifMsg.baseMsg.flags.flags.msgType = MPLS_NOT_MSGTYPE;
notifMsg.baseMsg.flags.flags.uBit = 0;
notifMsg.baseMsg.msgLength = 0;
notifMsg.statusTlvExists = 1;
notifMsg.status.baseTlv.flags.flags.uBit = 0;
notifMsg.status.baseTlv.flags.flags.fBit = 1;
notifMsg.status.baseTlv.flags.flags.type = MPLS_NOT_ST_TLVTYPE;
notifMsg.status.baseTlv.length = MPLS_STATUSFIXLEN;
notifMsg.status.flags.flags.forward = 1;
notifMsg.status.flags.flags.status = statuscode;
notifMsg.status.msgId = msgid;
notifMsg.status.msgType = msgtype;
notifMsg.lblMsgIdTlvExists = 1;
notifMsg.lblMsgIdTlv.baseTlv.flags.flags.uBit = 0;
notifMsg.lblMsgIdTlv.baseTlv.flags.flags.fBit = 0;
notifMsg.lblMsgIdTlv.baseTlv.flags.flags.type = MPLS_REQMSGID_TLVTYPE;
notifMsg.lblMsgIdTlv.baseTlv.length = MPLS_MSGIDFIXLEN;
notifMsg.lblMsgIdTlv.msgId = tlvMsgid;
notifMsg.exStatusTlvExists = 0;
notifMsg.retPduTlvExists = 0;
notifMsg.retMsgTlvExists = 0;
notifMsg.lspidTlvExists = 0;
notifMsg.unknownNo = 0;
if(statuscode != SHUT_DOWN)
{
processldpstats(statuscode, session);
}
MPLS_ERR_LOG("==== notify msg,status code = %d ====",statuscode);
#if 0
SendTcpMsg(session,MPLS_NOT_MSGTYPE,¬ifMsg);
#endif
Func_lblmsg_wait_proce(session,MPLS_NOT_MSGTYPE,¬ifMsg);
return ;
}
/***********************************************************************/
/* FUNCTION NAME : reclblmsgtlvproc()
/* DESCRIPTION: : receive label message tlv pro to lspcb
/* INPUT : mplsLdpSession_t * session,
void * lblmessage,
void * lspcb,
unsigned long msgtype
/* OUTPUT : void
/* AUTHOR/DATE : shi.zhaohui/ 02.06.19
/* GLOBAL : none
/* History :
/************************************************************************/
/* cbflag 1: mplsldpfecentry; 2: mplsldpcrlsp */
void reclblmsgtlvproc(mplsLdpSession_t * session,
void * lblmessage,
void * lspcb,
void * tempcb,
unsigned long msgtype,
unsigned char cbflag)
{
switch(msgtype)
{
case MPLS_LBLREQ_MSGTYPE :
rec_lblreq_tlvpro( session, lblmessage, lspcb, tempcb, cbflag );
break;
case MPLS_LBLMAP_MSGTYPE:
rec_lblmap_tlvpro( session, lblmessage, lspcb, tempcb, cbflag );
break;
case MPLS_LBLREL_MSGTYPE:
rec_lblrel_tlvpro( session, lblmessage, lspcb, tempcb, cbflag );
break;
case MPLS_LBLWITH_MSGTYPE:
rec_lblwith_tlvpro( session, lblmessage, lspcb, tempcb, cbflag );
break;
case MPLS_LBLABORT_MSGTYPE:
rec_lblabort_tlvpro( session, lblmessage, lspcb, tempcb, cbflag );
break;
default : break;
}
}
/***********************************************************************/
/* FUNCTION NAME : rec_lblreq_tlvpro()
/* DESCRIPTION: : receive label req message tlv pro to lspcb
/* INPUT : mplsLdpSession_t * session,
void * lblmessage,
void * lspcb,
unsigned char cbflag
/* OUTPUT : void
/* AUTHOR/DATE : shi.zhaohui/ 02.06.19
/* GLOBAL : none
/* History :
/************************************************************************/
void rec_lblreq_tlvpro(mplsLdpSession_t * session,
void * lblmessage,
void * lspcb,
void * tempcb,
unsigned char cbflag)
{
mplsLdpLblReqMsg_t *lblReqMsg;
mplsLdpFecEntry *feclspcb;
mplsLdpCrLsp *crlspcbb;
mplsLdpUpCB *ldpupcb;
mplsLdpLspCB *ldpdodcb;
lblmsgTlvExists tlvexists;
lblReqMsg = (mplsLdpLblReqMsg_t *)lblmessage;
if(cbflag == LDP_HOP_LSP)
{
feclspcb = (mplsLdpFecEntry *)lspcb;
// lblreqtofectypemsg(lblReqMsg, feclspcb, LDP_HOP_LSP);
if(session -> labelAdvertisement == 0) /* DU */
{
ldpupcb = (mplsLdpUpCB *)tempcb;
ldpupcb -> msgid = lblReqMsg->baseMsg.msgId;
ldpupcb -> upSessionIndex = session -> index;
if(session -> loopDetectionForPV == LOOPDETECT_HOPANDPV)
{
lblreqtocbbloopproc(lblReqMsg, &(ldpupcb->pAttr));
}
}
else if(session -> labelAdvertisement == 1) /* DoD */
{
ldpdodcb = (mplsLdpLspCB *)tempcb;
ldpdodcb -> upMsgid = lblReqMsg->baseMsg.msgId;
ldpdodcb -> upSessionIndex = session -> index;
if(session -> loopDetectionForPV == LOOPDETECT_HOPANDPV)
{
lblreqtocbbloopproc(lblReqMsg, &(ldpdodcb->pAttr));
}
}
}
else /* cr lsp */
{
crlspcbb = (mplsLdpCrLsp *)lspcb;
// lblreqtofectypemsg(lblReqMsg, feclspcb, LDP_CR_LSP);
crlspcbb -> crfec_key.ingressid = lblReqMsg -> lspidTlv.routerId;
crlspcbb -> crfec_key.locallspid = lblReqMsg -> lspidTlv.localCrlspId;
crlspcbb -> crlspCb.upSessionIndex = session -> index;
crlspcbb -> crlspCb.upMsgid = lblReqMsg->baseMsg.msgId;
ldpdodcb = &(crlspcbb -> crlspCb);
if(session -> loopDetectionForPV == LOOPDETECT_HOPANDPV)
{
lblreqtocbbloopproc(lblReqMsg, &(ldpdodcb->pAttr));
}
tlvexists.flags.fecTlvExists = lblReqMsg -> fecTlvExists;
tlvexists.flags.hopCountTlvExists = lblReqMsg -> hopCountTlvExists;
tlvexists.flags.pathVecTlvExists = lblReqMsg -> pathVecTlvExists;
tlvexists.flags.lspidTlvExists = lblReqMsg -> lspidTlvExists;
tlvexists.flags.erTlvExists = lblReqMsg -> erTlvExists;
tlvexists.flags.trafficTlvExists = lblReqMsg -> trafficTlvExists;
tlvexists.flags.pinningTlvExists = lblReqMsg -> pinningTlvExists;
tlvexists.flags.recClassTlvExists = lblReqMsg -> recClassTlvExists;
tlvexists.flags.preemptTlvExists = lblReqMsg -> preemptTlvExists;
crlspcbb -> tlvExists = tlvexists.mark;
if(lblReqMsg->erTlvExists == 1)
{
MPLS_MEMCPY(&(crlspcbb -> erTlv),&(lblReqMsg->erTlv),sizeof(mplsLdpErTlv_t));
}
else
{
MPLS_MEMSET(&(crlspcbb -> erTlv), 0, sizeof(mplsLdpErTlv_t));
}
if(lblReqMsg->trafficTlvExists == 1)
{
MPLS_MEMCPY(&(crlspcbb -> trafficTlv),&(lblReqMsg->trafficTlv),
sizeof(mplsLdpTrafficTlv_t));
}
else
{
MPLS_MEMSET(&(crlspcbb -> trafficTlv), 0, sizeof(mplsLdpTrafficTlv_t));
}
if(lblReqMsg->pinningTlvExists == 1)
{
MPLS_MEMCPY(&(crlspcbb -> pinningTlv),&(lblReqMsg->pinningTlv),
sizeof(mplsLdpPinningTlv_t));
}
else
{
MPLS_MEMSET(&(crlspcbb -> pinningTlv), 0, sizeof(mplsLdpPinningTlv_t));
}
if(lblReqMsg->recClassTlvExists == 1)
{
MPLS_MEMCPY(&(crlspcbb -> resClassTlv),&(lblReqMsg->resClassTlv),
sizeof(mplsLdpResClsTlv_t));
}
else
{
MPLS_MEMSET(&(crlspcbb -> resClassTlv), 0, sizeof(mplsLdpResClsTlv_t));
}
if(lblReqMsg->preemptTlvExists == 1)
{
MPLS_MEMCPY(&(crlspcbb -> preemptTlv),&(lblReqMsg->preemptTlv),
sizeof(mplsLdpPreemptTlv_t));
}
else
{
MPLS_MEMSET(&(crlspcbb -> preemptTlv), 0, sizeof(mplsLdpPreemptTlv_t));
}
}
}
/***********************************************************************/
/* FUNCTION NAME : rec_lblmap_tlvpro()
/* DESCRIPTION: : receive label map message tlv pro to lspcb
/* INPUT : mplsLdpSession_t * session,
void * lblmessage,
void * lspcb,
unsigned char cbflag
/* OUTPUT : void
/* AUTHOR/DATE : shi.zhaohui/ 02.06.19
/* GLOBAL : none
/* History :
/************************************************************************/
void rec_lblmap_tlvpro(mplsLdpSession_t * session,
void * lblmessage,
void * lspcb,
void * tempcb,
unsigned char cbflag)
{
mplsLdpLblMapMsg_t *lblMapMsg;
mplsLdpFecEntry *feclspcb;
mplsLdpCrLsp *crlspcbb;
mplsLdpDownCB *ldpdowncb;
mplsLdpAttr *ldpattr;
mplsLdpLspCB *ldpdodcb;
unsigned char attrchan;
mplsLdpUpCB *searchupcb;
mplsLdpSession_t *session1 = MPLS_NULL;
MIB_LDP_SESSION_ACK sesAck1;
ldpMibSessionIndexReq_t sesIndex_s;
lblmsgTlvExists tlvexists;
/* update down msgtype when receive mapping 2003.1.16 */
if(session->labelAdvertisement == DOWNSTREAMONDEMAND)
{
((mplsLdpLspCB *)tempcb)->msgType = MPLS_LBLMAP_MSGTYPE;
}
MPLS_MEMSET(&sesIndex_s, 0, sizeof(ldpMibSessionIndexReq_t));
/* no need fec tlv process */
lblMapMsg = &(ldp_snd_msg.lblMapMsg);
MPLS_MEMCPY(lblMapMsg,lblmessage,sizeof(mplsLdpLblMapMsg_t));
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 */
{
ldpdowncb = (mplsLdpDownCB *)tempcb;
ldpdowncb -> msgid = lblMapMsg -> baseMsg.msgId;
ldpdowncb -> downSessionIndex = session -> index;
if(lblMapMsg -> genLblTlvExists == 1)
{
ldpdowncb -> downGenLabel = lblMapMsg -> genLblTlv.label;
}
else
{
/* send notify message */
sndnotifymsgproc(session, NOLBLRESRC, lblMapMsg -> baseMsg.msgId,
MPLS_LBLMAP_MSGTYPE);
#ifdef DEBUG_LDP
printf("==rec feclsp mapping message, encode genlabel error !!! ==");
#endif
return;
}
if(session -> loopDetectionForPV == LOOPDETECT_HOPANDPV)
{
attrchan = recfeclsp_mapmsg_looptlvproc_du(lblMapMsg,&(ldpdowncb->pAttr),
ldpdowncb -> state);
if(attrchan == 1 && session->index == feclspcb->nexthopSessionIndex) /* attr change, send mapping message */
{
searchupcb = MPLS_NULL;
MPLS_WALK_UP_BEGIN(feclspcb,searchupcb,t_upCb);
if(searchupcb != MPLS_NULL)
{
if(session->index != searchupcb -> upSessionIndex)
{
sesIndex_s.sessionIndex = searchupcb -> upSessionIndex;
sesIndex_s.indexFlag = 1;
session1 = (mplsLdpSession_t *)MibSession(&sesIndex_s, LDP_SEARCH);
if (session1 != MPLS_NULL)
{
genlbltolblmsg(feclspcb->localGenLabel, &(lblMapMsg->genLblTlv));
#if 0
SendTcpMsg(session1,MPLS_LBLMAP_MSGTYPE,&lblMapMsg);
#endif
Func_lblmsg_wait_proce(session1,MPLS_LBLMAP_MSGTYPE,lblMapMsg);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -