📄 tlv_comm.c
字号:
/********************************************************************/
/* Product Name: mpls pack1.0
/* Module Name: ldp, ldp_cr
/* File Name: tlv_comm.c
/* Author Name: shi.zhaohui
/* Creat Date: 06/29/2002
/* Version : 1.0
/* Function : ldp label message tlv process
/* History :
/* szh mod 2003-10-20 减少LDP向A041发送的消息改成函数调用 */
/********************************************************************/
#undef DEF_LDP_VAR
#include "ldpvars.h"
/***********************************************************************/
/* FUNCTION NAME : lblreqtofectypemsg()
/* DESCRIPTION: : fec tlv pro from label request message
/* INPUT : mplsLdpLblReqMsg_t *lblReqMsg,
void lspcb,
uchar flag
/* OUTPUT : void
/* AUTHOR/DATE : shi.zhaohui/ 02.06.19
/* GLOBAL : none
/* History :
/************************************************************************/
void lblreqtofectypemsg(mplsLdpLblReqMsg_t *lblReqMsg, void *lspcb, unsigned char flag )
{
mplsLdpFecEntry *feclspcb;
mplsLdpCrLsp *crlspcbb;
switch(flag)
{
case LDP_HOP_LSP :
feclspcb = (mplsLdpFecEntry *)lspcb;
feclspcb -> mplsLdpFecType = lblReqMsg->fecTlv.fecElemTypes[0];
if(lblReqMsg->fecTlv.fecElArray[0].addressEl.type == MPLS_HOSTADR_FEC)
{
feclspcb ->fec_key.mplsLdpFecAddrLen = 32;
}
else
{
feclspcb ->fec_key.mplsLdpFecAddrLen = \
lblReqMsg->fecTlv.fecElArray[0].addressEl.preLen;
}
feclspcb ->fec_key.mplsFecAddr = lblReqMsg->fecTlv.fecElArray[0].addressEl.address;
feclspcb -> mplsFecAddrFamily = 1;
break;
case LDP_CR_LSP :
crlspcbb = (mplsLdpCrLsp *)lspcb;
if(lblReqMsg->fecTlv.fecElemTypes[0] == MPLS_CRLSP_FEC)
{
crlspcbb -> mplsLdpFecType = MPLS_CRLSP_FEC;
crlspcbb -> mplsLdpFecAddrLen = 0;
crlspcbb -> mplsFecAddr = 0;
}
else
{
crlspcbb -> mplsLdpFecType = lblReqMsg->fecTlv.fecElemTypes[0];
if(lblReqMsg->fecTlv.fecElArray[0].addressEl.type == MPLS_HOSTADR_FEC)
{
crlspcbb ->mplsLdpFecAddrLen = 32;
}
else
{
crlspcbb ->mplsLdpFecAddrLen = \
lblReqMsg->fecTlv.fecElArray[0].addressEl.preLen;
}
crlspcbb -> mplsFecAddr = lblReqMsg->fecTlv.fecElArray[0].addressEl.address;
}
break;
default : break;
}
}
/***********************************************************************/
/* FUNCTION NAME : BuildNotifMsg()
/* DESCRIPTION: : conform notify message
/* INPUT : mplsLdpNotifMsg_t * notifMsg,
unsigned long statuscode,
unsigned long msgid,
unsigned short msgtype
/* OUTPUT : void
/* AUTHOR/DATE : shi.zhaohui/ 02.06.19
/* GLOBAL : none
/* History :
/************************************************************************/
void BuildNotifMsg(mplsLdpNotifMsg_t * notifMsg,unsigned long statuscode,
unsigned long msgid, unsigned short msgtype)
{
notifMsg->baseMsg.msgId = messageId[NOT_M];
AddMsgId(NOT_M);
switch (statuscode)
{
case MIB_SUCCESS:
case UNKNOWNMSGTYP:
case UNKNOWNTLV:
case LOOPDETECT:
case NOROUTE:
case UNKNOWNFEC:
case NOLBLRESRC:
case LBLRESRCAVA:
case LBLREQAB:
case BADERTLVERR:
case BADSTRICNERR:
case BADLOOSNERR:
case BADINITERHOPER:
case RESRCUNAVA:
case TRAFPARAUNAVA:
case SETUPABORT:
case MISSPARAMETER:
case INTERNALERROR:
notifMsg->status.flags.flags.error = 0;
break;
default:
notifMsg->status.flags.flags.error = 1;
break;
}
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->exStatusTlvExists = 0;
notifMsg->retPduTlvExists = 0;
notifMsg->retMsgTlvExists = 0;
notifMsg->lspidTlvExists = 0;
notifMsg->lblMsgIdTlvExists = 0;
notifMsg->unknownNo = 0;
notifMsg->status.flags.flags.forward = 1;
notifMsg->status.flags.flags.status = statuscode;
notifMsg->status.msgId = msgid;
notifMsg->status.msgType = msgtype;
}
/***********************************************************************/
/* FUNCTION NAME : optaltocrlblmapmsg()
/* DESCRIPTION: : optional tlv process for cr lsp mapping message
/* INPUT : mplsLdpLspCB *lspcb,
mplsLdpLblMapMsg_t *lblMapMsg
/* OUTPUT : void
/* AUTHOR/DATE : shi.zhaohui/ 02.06.19
/* GLOBAL : none
/* History :
/************************************************************************/
void optaltocrlblmapmsg(mplsLdpCrLsp *lspcb, mplsLdpLblMapMsg_t *lblMapMsg)
{
lblmsgTlvExists tlvexists;
tlvexists.mark = lspcb -> tlvExists;
lblMapMsg -> lspidTlvExists = 1;
lblMapMsg -> lspidTlv.localCrlspId = lspcb ->crfec_key.locallspid;
lblMapMsg -> lspidTlv.routerId = lspcb ->crfec_key.ingressid;
lblMapMsg -> lspidTlv.baseTlv.flags.flags.uBit = 0;
lblMapMsg -> lspidTlv.baseTlv.flags.flags.fBit = 0;
lblMapMsg -> lspidTlv.baseTlv.flags.flags.type = MPLS_LSPID_TLVTYPE;
lblMapMsg -> lspidTlv.baseTlv.length = MPLS_LSPIDTLV_FIXLEN;
if(tlvexists.flags.trafficTlvExists == 1)
{
lblMapMsg ->trafficTlvExists = 1;
MPLS_MEMCPY(&(lblMapMsg -> trafficTlv),&(lspcb -> trafficTlv),
sizeof(mplsLdpTrafficTlv_t));
}
else
{
lblMapMsg ->trafficTlvExists = 0;
}
}
/***********************************************************************/
/* FUNCTION NAME : setmsglspid()
/* DESCRIPTION: : set cr lspcb lspid tlv to lspid tlv
/* INPUT : mplsLdpCrLsp *lspcb,
mplsLdpLspIdTlv_t *lspidTlv
/* OUTPUT : void
/* AUTHOR/DATE : shi.zhaohui/ 02.06.19
/* GLOBAL : none
/* History :
/************************************************************************/
void setmsglspid(mplsLdpCrLsp *lspcb, mplsLdpLspIdTlv_t *lspidTlv)
{
lspidTlv->actFlag.flag.res = 0;
lspidTlv->actFlag.flag.ActFlag = MPLS_CRLSP_ACTION_INIT;
lspidTlv->localCrlspId = lspcb ->crfec_key.locallspid;
lspidTlv->routerId = lspcb ->crfec_key.ingressid;
lspidTlv->baseTlv.flags.flags.uBit = 0;
lspidTlv->baseTlv.flags.flags.fBit = 0;
lspidTlv->baseTlv.flags.flags.type = MPLS_LSPID_TLVTYPE;
lspidTlv->baseTlv.length = MPLS_LSPIDTLV_FIXLEN;
}
/***********************************************************************/
/* FUNCTION NAME : reqmsgidtolblmsg()
/* DESCRIPTION: : lbl request msg's msgid process for mapping message
/* INPUT : unsigned long reqmsgid,
mplsLdpLblMsgIdTlv_t *lblMsgIdTlv
/* OUTPUT : void
/* AUTHOR/DATE : shi.zhaohui/ 02.06.19
/* GLOBAL : none
/* History :
/************************************************************************/
void reqmsgidtolblmsg(unsigned long reqmsgid, mplsLdpLblMsgIdTlv_t *lblMsgIdTlv)
{
lblMsgIdTlv->baseTlv.flags.flags.uBit = 0;
lblMsgIdTlv->baseTlv.flags.flags.fBit = 0;
lblMsgIdTlv->baseTlv.flags.flags.type = MPLS_REQMSGID_TLVTYPE;
lblMsgIdTlv->baseTlv.length = MPLS_MSGIDFIXLEN;
lblMsgIdTlv->msgId = reqmsgid;
}
/***********************************************************************/
/* FUNCTION NAME : genlbltolblmsg()
/* DESCRIPTION: : general label proecss
/* INPUT : unsigned long genlabel,
mplsLdpGenLblTlv_s *genLblTlv
/* OUTPUT : void
/* AUTHOR/DATE : shi.zhaohui/ 02.06.19
/* GLOBAL : none
/* History :
/************************************************************************/
void genlbltolblmsg(unsigned long genlabel, mplsLdpGenLblTlv_t *genLblTlv)
{
genLblTlv->baseTlv.flags.flags.uBit = 0;
genLblTlv->baseTlv.flags.flags.fBit = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -