⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 f_comm.c

📁 技术文件名称:MPLSv1.0软件模块测试规程
💻 C
📖 第 1 页 / 共 3 页
字号:

/********************************************************************/          
/*	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 + -