📄 f_comm.c
字号:
/********************************************************************/
/* Product Name: ZXB10 */
/* Module Name: A075 */
/* File Name: F_comm.c */
/* Author Name: Jing Xiaoyuan, Li Jianping */
/* Creat Date: 12/20/99 */
/* Version : 1.0 */
/* Function : 函数文件,集合了本进程中的公共函数 */
/* wengqing 2002.12.09 modify algorithm of get/release lspindex */
/* wengqing 2003.3.28 ldpFecSearchCheck时判断是否还有要删的块未处理,*/
/* 若有,则定时5s再来检查,没有要删的块才开始新建立 */
/* wengqing 2003.4.10 protection for route process for no ingress to build */
/* 2003.4.23 wengqing ldpListCheck中如果链表已全部处理完,进行保护操作 */
/* 2003.06.09 shizhaohui 增加APC类型的单板 */
/* 2003-9-2 szh mod 修改ldp_rel_index,ldp_get_index()函数
/* 2004-1-6 lixia mod for debug mpls
/********************************************************************/
#include "ldpvars.h"
/********************************************************************/
/* */
/* 1. 普通公共函数 */
/* */
/********************************************************************/
/* global function */
int fec_key_compare(void *key1, void *key2)
{
int rc = 0;
mpls_fec_key *test1_key1;
mpls_fec_key *test1_key2;
MPLS_ASSERT(key1 != NULL);
MPLS_ASSERT(key2 != NULL);
test1_key1 = (mpls_fec_key *)key1;
test1_key2 = (mpls_fec_key *)key2;
if(test1_key1->mplsFecAddr < test1_key2->mplsFecAddr)
rc = -1;
else if(test1_key1->mplsFecAddr > test1_key2->mplsFecAddr)
rc = 1;
else {
if(test1_key1->mplsLdpFecAddrLen < test1_key2->mplsLdpFecAddrLen)
rc = -1;
else if(test1_key1->mplsLdpFecAddrLen > test1_key2->mplsLdpFecAddrLen)
rc = 1;
}
return rc;
}
int crfec_key_compare(void *key1, void *key2)
{
int rc = 0;
mpls_crfec_key *test1_key1;
mpls_crfec_key *test1_key2;
MPLS_ASSERT(key1 != NULL);
MPLS_ASSERT(key2 != NULL);
test1_key1 = (mpls_crfec_key *)key1;
test1_key2 = (mpls_crfec_key *)key2;
if(test1_key1->ingressid < test1_key2->ingressid)
rc = -1;
else if(test1_key1->ingressid > test1_key2->ingressid)
rc = 1;
else {
if(test1_key1->locallspid < test1_key2->locallspid)
rc = -1;
else if(test1_key1->locallspid > test1_key2->locallspid)
rc = 1;
}
return rc;
}
int address_key_compare(void * test_key1, void * test_key2)
{
int rc = 0;
if(test_key1 < test_key2)
rc = -1;
else if(test_key1 > test_key2 )
rc = 1;
return rc;
}
/* global function */
int sb_key_compare(void *key1, void *key2)
{
int rc = 0;
mpls_sb_key *test1_key1;
mpls_sb_key *test1_key2;
MPLS_ASSERT(key1 != NULL);
MPLS_ASSERT(key2 != NULL);
test1_key1 = (mpls_sb_key *)key1;
test1_key2 = (mpls_sb_key *)key2;
if(test1_key1->module < test1_key2->module)
rc = -1;
else if(test1_key1->module > test1_key2->module)
rc = 1;
else {
if(test1_key1->port < test1_key2->port)
rc = -1;
else if(test1_key1->port > test1_key2->port)
rc = 1;
}
return rc;
}
/* 消息的MsgId的加1操作 */
void AddMsgId(unsigned char ii)
{
if (messageId[ii] == 4294967295)
messageId[ii] = 1;
else
messageId[ii]++;
return;
}
unsigned short FuncErLblreq(mplsLdpLblReqMsg_t * lblReqMsg, FecMsg * fecMsg)
{
unsigned short ii,lenTmp;
lenTmp = 0;
if (lblReqMsg->erTlvExists == 1)
{
#ifdef __BGS10_MPLS_DEBUG
printf("==== Module %d,UpLspCbFsm,BUILD ERLBLREQ====",selfLdpPid.module);
#endif
/* 1. 处理erTlv */
memcpy(&(lblReqMsg->erTlv), &(fecMsg->Fec.erTlv), sizeof(mplsLdpErTlv_t));
lblReqMsg->erTlvExists = 1;
lblReqMsg->erTlv.baseTlv.flags.flags.uBit = 0;
lblReqMsg->erTlv.baseTlv.flags.flags.fBit = 0;
lblReqMsg->erTlv.baseTlv.flags.flags.type = MPLS_ER_TLVTYPE;
for (ii = 0; ii < lblReqMsg->erTlv.numberErHops; ii++)
{
if (lblReqMsg->erTlv.erHopTypes[ii] == MPLS_ERHOP_IPV4_TLVTYPE)
{
lblReqMsg->erTlv.erHopArray[ii].erIpv4.baseTlv.flags.flags.uBit = 0;
lblReqMsg->erTlv.erHopArray[ii].erIpv4.baseTlv.flags.flags.fBit = 0;
lblReqMsg->erTlv.erHopArray[ii].erIpv4.baseTlv.flags.flags.type = MPLS_ERHOP_IPV4_TLVTYPE;
lblReqMsg->erTlv.erHopArray[ii].erIpv4.baseTlv.length = MPLS_ERHOP_IPV4_FIXLEN;
lenTmp += (MPLS_ERHOP_IPV4_FIXLEN + MPLS_TLVFIXLEN);
}
if (lblReqMsg->erTlv.erHopTypes[ii] == MPLS_ERHOP_IPV6_TLVTYPE)
{
lblReqMsg->erTlv.erHopArray[ii].erIpv4.baseTlv.flags.flags.uBit = 0;
lblReqMsg->erTlv.erHopArray[ii].erIpv4.baseTlv.flags.flags.fBit = 0;
lblReqMsg->erTlv.erHopArray[ii].erIpv4.baseTlv.flags.flags.type = MPLS_ERHOP_IPV6_TLVTYPE;
lblReqMsg->erTlv.erHopArray[ii].erIpv4.baseTlv.length = MPLS_ERHOP_IPV6_FIXLEN;
lenTmp += (MPLS_ERHOP_IPV6_FIXLEN + MPLS_TLVFIXLEN);
}
if (lblReqMsg->erTlv.erHopTypes[ii] == MPLS_ERHOP_AS_TLVTYPE)
{
lblReqMsg->erTlv.erHopArray[ii].erIpv4.baseTlv.flags.flags.uBit = 0;
lblReqMsg->erTlv.erHopArray[ii].erIpv4.baseTlv.flags.flags.fBit = 0;
lblReqMsg->erTlv.erHopArray[ii].erIpv4.baseTlv.flags.flags.type = MPLS_ERHOP_AS_TLVTYPE;
lblReqMsg->erTlv.erHopArray[ii].erIpv4.baseTlv.length = MPLS_ERHOP_AS_FIXLEN;
lenTmp += (MPLS_ERHOP_AS_FIXLEN + MPLS_TLVFIXLEN);
}
if (lblReqMsg->erTlv.erHopTypes[ii] == MPLS_ERHOP_LSPID_TLVTYPE)
{
lblReqMsg->erTlv.erHopArray[ii].erIpv4.baseTlv.flags.flags.uBit = 0;
lblReqMsg->erTlv.erHopArray[ii].erIpv4.baseTlv.flags.flags.fBit = 0;
lblReqMsg->erTlv.erHopArray[ii].erIpv4.baseTlv.flags.flags.type = MPLS_ERHOP_LSPID_TLVTYPE;
lblReqMsg->erTlv.erHopArray[ii].erIpv4.baseTlv.length = MPLS_ERHOP_LSPID_FIXLEN;
lenTmp += (MPLS_ERHOP_LSPID_FIXLEN + MPLS_TLVFIXLEN);
}
}
lblReqMsg->erTlv.baseTlv.length = lenTmp;
}
return (unsigned short)(lenTmp);
}
/********************************************************************/
/* */
/* 2. 对各种LDP消息初始化 */
/* */
/********************************************************************/
void InitHelloMsg(mplsLdpHelloMsg_t * helloMsg)
{
helloMsg->baseMsg.flags.flags.msgType = MPLS_HELLO_MSGTYPE;
helloMsg->baseMsg.flags.flags.uBit = 0;
helloMsg->baseMsg.msgLength = 0; /* 2001/09/05 iniit msgLength =0 */
/*helloMsg->baseMsg.msgId = 0; */
helloMsg->chpTlvExists = 1;
helloMsg->chp.baseTlv.flags.flags.uBit = 0;
helloMsg->chp.baseTlv.flags.flags.fBit = 0;
helloMsg->chp.baseTlv.flags.flags.type = MPLS_CHP_TLVTYPE;
helloMsg->chp.baseTlv.length = MPLS_CHPFIXLEN;
/* helloMsg->chp.holdTime = DIRECT_HELLO_TIME; */
helloMsg->chp.flags.flags.target = 0; /* 目前不考虑target Hello*/
helloMsg->chp.flags.flags.request = 0;
helloMsg->chp.flags.flags.res = 0; /*保留位*/
helloMsg->trAdrTlvExists = 0;
helloMsg->csnTlvExists = 0;
helloMsg->trAdr.baseTlv.flags.flags.uBit = 0;
helloMsg->trAdr.baseTlv.flags.flags.fBit = 0;
helloMsg->trAdr.baseTlv.flags.flags.type = MPLS_IPV4_TRADR_TLVTYPE;
helloMsg->trAdr.baseTlv.length = MPLS_IPV4_TRADRFIXLEN;
helloMsg->csn.baseTlv.flags.flags.uBit = 0;
helloMsg->csn.baseTlv.flags.flags.fBit = 0;
helloMsg->csn.baseTlv.flags.flags.type = MPLS_CSN_TLVTYPE;
helloMsg->csn.baseTlv.length = MPLS_CSNFIXLEN;
return;
}
void InitInitMsg(mplsLdpInitMsg_t * initMsg)
{
initMsg->baseMsg.flags.flags.msgType = MPLS_INIT_MSGTYPE;
initMsg->baseMsg.flags.flags.uBit = 0;
initMsg->baseMsg.msgLength = 0;
initMsg->cspExists = 1;
initMsg->csp.baseTlv.flags.flags.uBit = 0;
initMsg->csp.baseTlv.flags.flags.fBit = 0;
initMsg->csp.baseTlv.flags.flags.type = MPLS_CSP_TLVTYPE;
initMsg->csp.baseTlv.length = MPLS_CSPFIXLEN;
initMsg->csp.flags.flags.res = 0;
initMsg->aspExists = 0;
initMsg->asp.baseTlv.flags.flags.uBit = 0;
initMsg->asp.baseTlv.flags.flags.fBit = 0;
initMsg->asp.baseTlv.flags.flags.type = MPLS_ASP_TLVTYPE;
initMsg->asp.baseTlv.length = MPLS_ASPFIXLEN + 8;
initMsg->asp.flags.flags.res = 0;
initMsg->fspExists = 0;
initMsg->unknownNo = 0;
}
void InitNotifMsg(mplsLdpNotifMsg_t * notifMsg)
{
notifMsg->baseMsg.flags.flags.msgType = MPLS_NOT_MSGTYPE;
notifMsg->baseMsg.flags.flags.uBit = 0;
notifMsg->baseMsg.msgLength = 0;
/*notifMsg->baseMsg.msgId = 0; */
notifMsg->statusTlvExists = 1;
notifMsg->status.baseTlv.flags.flags.uBit = 0;
notifMsg->status.baseTlv.flags.flags.fBit = 0;
notifMsg->status.baseTlv.flags.flags.type = MPLS_NOT_ST_TLVTYPE;
notifMsg->status.baseTlv.length = MPLS_STATUSFIXLEN;
/*notifMsg->status.flags.flags.error = 1; */
/*notifMsg->status.flags.flags.forward = 1; */
notifMsg->exStatusTlvExists = 0;
notifMsg->retPduTlvExists = 0;
notifMsg->retMsgTlvExists = 0;
notifMsg->lspidTlvExists = 0;
notifMsg->lblMsgIdTlvExists = 0;
notifMsg->unknownNo = 0;
}
void InitkeepalMsg(mplsLdpKeepAlMsg_t * keepalMsg)
{
keepalMsg->baseMsg.flags.flags.msgType = MPLS_KEEPAL_MSGTYPE;
keepalMsg->baseMsg.flags.flags.uBit = 0;
keepalMsg->baseMsg.msgLength = 0 ;
/*notifMsg->baseMsg.msgId = 0; */
}
/* flag 中存放的是消息类型 */
void InitAdrMsg(mplsLdpAdrMsg_t * adrMsg,unsigned long flag)
{
adrMsg->baseMsg.flags.flags.msgType = flag;
adrMsg->baseMsg.flags.flags.uBit = 0;
adrMsg->baseMsg.msgLength = 0;
adrMsg->adrListTlvExists = 1;
adrMsg->addressList.baseTlv.flags.flags.uBit = 0;
adrMsg->addressList.baseTlv.flags.flags.fBit = 0;
adrMsg->addressList.baseTlv.flags.flags.type = MPLS_ADDRLIST_TLVTYPE;
/* adrMsg->addressList.baseTlv.length = 0; /* 初始值 */
adrMsg->addressList.addrFamily = IP;
adrMsg->unknownNo = 0;
}
/********************************************************************/
/* */
/* 3. 发送LDP消息 */
/* */
/********************************************************************/
short bCheckLabelRng(mplsLdpSession_t * session, mplsLdpAtmLblTlv_t * pAtmLabel)
{
unsigned short ii;
short bRet = LDP_TRUE;
if((( session->vcNumeberdType == LDP_EVEN )&&(pAtmLabel->vci % 2 == 0)) ||
(( session->vcNumeberdType == LDP_ODD )&&(pAtmLabel->vci % 2 != 0)))
{
bRet = LDP_FALSE;
return bRet;
}
for(ii = 0; ii < session->lblRngNum; ii++)
{
/* if( (pAtmLabel->vci < session->lblRngList[ii].flags.flags.minVci) ||
(pAtmLabel->vci > session->lblRngList[ii].flags.flags.maxVci) ||
(pAtmLabel->flags.flags.vpi < session->lblRngList[ii].flags.flags.minVpi) ||
(pAtmLabel->flags.flags.vpi > session->lblRngList[ii].flags.flags.maxVpi))
*/ if( (pAtmLabel->vci < session->LdpLblRng.atmlblrnglist[ii].flags.flags.minVci) ||
(pAtmLabel->vci > session->LdpLblRng.atmlblrnglist[ii].flags.flags.maxVci) ||
(pAtmLabel->flags.flags.vpi < session->LdpLblRng.atmlblrnglist[ii].flags.flags.minVpi) ||
(pAtmLabel->flags.flags.vpi > session->LdpLblRng.atmlblrnglist[ii].flags.flags.maxVpi))
{
bRet = LDP_FALSE;
break;
}
}
return bRet;
}
void ldpHelloSnd()
{
unsigned short ii;
unsigned long tmid;
for (ii = 0; ii < allEntity.num; ii++)
{
if(allEntity.entity[ii].adminStatus == 1)
{
allEntity.entity[ii].hellotmd -= LDP_HELLO_CHECK_INTERVAL;
if(allEntity.entity[ii].hellotmd <= 0)
{
SendLdpHello(&allEntity.entity[ii]);
}
}
}
MPLS_SET_TIMER(LDP_HELLO_CHECK_INTERVAL,
(void *)ldpHelloSnd,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -