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

📄 mplsfun.c

📁 技术文件名称:MPLSv1.0软件模块测试规程
💻 C
📖 第 1 页 / 共 5 页
字号:
	mpls_filter_key *lsp_key2;
	
	MPLS_ASSERT(key1 != NULL);
	MPLS_ASSERT(key2 != NULL);
	
	lsp_key1 = (mpls_filter_key *)key1;
	lsp_key2 = (mpls_filter_key *)key2;
	
	if(lsp_key1->filterNo < lsp_key2->filterNo)
		rc = -1;
	else if(lsp_key1->filterNo > lsp_key2->filterNo)
		rc = 1;

	return rc;
}

int lsp_key_compare(void *key1, void *key2)
{
	int rc = 0;	
	LSP_KEY *lsp_key1;
	LSP_KEY *lsp_key2;
	
	MPLS_ASSERT(key1 != NULL);
	MPLS_ASSERT(key2 != NULL);
	
	lsp_key1 = (LSP_KEY *)key1;
	lsp_key2 = (LSP_KEY *)key2;
	
	if(lsp_key1->localLspId < lsp_key2->localLspId)
		rc = -1;
	else if(lsp_key1->localLspId > lsp_key2->localLspId)
		rc = 1;
/* hyh modify 2002-11-7 cr-lsp key only ues localLspId */
/*	else
	{
		if(lsp_key1->IngressId < lsp_key2->IngressId)
			rc = -1;
		else if(lsp_key1->IngressId > lsp_key2->IngressId)
			rc = 1;
	}
*/	
	return rc;
}

/*****************************************************************************************
 * FUNCTION NAME  : lsp_prio_dst_compare() 
 * DESCRIPTION:   : compare prio and dst
 *  INPUT         : none
 *  AUTHOR/DATE   : sbp 2003-1-14 
 **********************************************************************/
int lsp_prio_dst_compare(void *key1, void *key2)
{
	int rc = 0;	
	LSP_PRIO_KEY *lsp_key1;
	LSP_PRIO_KEY *lsp_key2;
	
	MPLS_ASSERT(key1 != NULL);
	MPLS_ASSERT(key2 != NULL);
	
	lsp_key1 = (LSP_PRIO_KEY *)key1;
	lsp_key2 = (LSP_PRIO_KEY *)key2;
	
	if(lsp_key1->dst < lsp_key2->dst)
		rc = -1;
	else if(lsp_key1->dst > lsp_key2->dst)
		rc = 1;
	else
	{
		if(lsp_key1->metric < lsp_key2->metric)
			rc = -1;
		else if(lsp_key1->metric > lsp_key2->metric)
			rc = 1;
	}
	
	return rc;
}

/*********************************************************************************
 * 函 数 名: mplsInitwhole() 
 * 功    能: 初始化MPLSMANAGE进程。                                                
 * 输    入: 无             
 * 输    出: 无
 * 返    回: 无               
 * 全局变量: mplsInterfaceConfEntry 、MplsPortDataTable1   
 * 修改记录:
   -  修改日期       版本      修 改 人       修改原因及内容
 =========================================================
   -  2001-8-14      2.1.2      孙保平            创建         
      sbp 2002-6-15  initialize the ldp protocol data 
 *********************************************************************************/
void mplsInitwhole()
{
	ushort   num;
	
	SELF(&mplsManagerOamPID);
	
	num      =  MPLS_LDP_INTERFACE_MAX;
	
	MPLS_MEMSET(&mplsLsrAttrEntry,0,sizeof(mplsLsrAttr_t));  /*初始化LSRID*/
	MPLS_MEMSET(mplsInterfaceConfEntry,0,num*sizeof(MplsInterfaceConfTable_t));/*端口配置*/
	MPLS_MEMSET(mplsTrafficParamEntry,0,num*sizeof(MplsTrafficParamTable_t));  /*流量配置*/
	MPLS_MEMSET(mplsLdpEntityEntry,0,num*sizeof(MplsLdpEntityTable_t));      /*实体配置*/
	MPLS_MEMSET(mplsLdpEntityAtmParamsEntry,0,num*sizeof(MplsLdpEntityAtmParamsTable_t)); /*ATM参数配置*/
	MPLS_MEMSET(mplsLdpEntityConfAtmLabelRangeEntry,0,num*sizeof(MplsLdpEntityConfAtmLabelRangeTable_t)); /*ATM标签范围配置*/
	MPLS_MEMSET(mplsLdpEntityStatsEntry,0,num*sizeof(mplsLdpEntityStatsTable_t));  /*LDP 参数配置*/
	MPLS_MEMSET(mplsLdpPeerEntry,0,num*sizeof(mplsLdpPeerTable_t));  /*LDP 参数配置*/
	MPLS_MEMSET(mplsLdpHelloAdjacencyEntry,0,num*sizeof(mplsLdpHelloAdjacencyTable_t));  /*LDP 参数配置*/
	MPLS_MEMSET(mplsLdpSessionEntry,0,num*sizeof(MplsLdpSessionTable_t));  /*LDP 参数配置*/
	MPLS_MEMSET(mplsLdpSessionStatsEntry,0,num*sizeof(mplsLdpSessionStatsTable_t));  /*LDP 参数配置*/
	MPLS_MEMSET(mplsForwardingEntry,0,num*sizeof(forwardingtable_t));  /*LDP 参数配置*/
	MPLS_MEMSET(mplsLdpEntityParamEntry,0,num*sizeof(mplsldpparamtable_t));  /*LDP 参数配置*/
	MPLS_MEMSET(mplsIfTransportAddressEntry,0,num*sizeof(if_transport_table_t));  /*LDP 参数配置*/
	MPLS_MEMSET(mplsLibEntry,0,num*sizeof(libtable_t));  /*LDP 参数配置*/
	MPLS_MEMSET(mplsLdpDiscoveryEntry,0,num*sizeof(mplsLdpDiscovery_t));  /*LDP 参数配置*/
	MPLS_MEMSET(mplsAtmLdpCapEntry,0,num*sizeof(mplsAtmLdpCapability_t));      /*ATM CAPABILITY 配置*/
	MPLS_MEMSET(mplsLdpAtmSessionEntry,0,num*sizeof(mplsLdpAtmSessionTable_t)); /*ATM SESSION */
	MPLS_MEMSET(mplsLdpSessionPeerAddressEntry,0,num*sizeof(mplsLdpSessionPeerAddressTable_t)); /* SESSION PEER ADDRESS*/
	MPLS_MEMSET(mplsLdpEntityConfGenericLabelRangeEntry,0,num*sizeof(MplsLdpEntityConfGenericLabelRangeTable_t));      /* 通用标签配置*/
	MPLS_MEMSET(mplsLdpGeneralSessionEntry,0,num*sizeof(mplsLdpGeneralSessionTable_t));      /*GENERAL SESSION*/
	
	/*MPLS_MEMSET(&mplsFecFilterEntry,0,sizeof(mplsFecFilterAll_t));      fec filter 
	mplsFecFilterEntry.mplsFecFilterInfo[0].listNo   =1;
	mplsFecFilterEntry.num = 1;
	mplsFecFilterEntry.allFilterFlag = MPLS_FEC_FILTER_DISABLE_ALL;*/
	
	MPLS_AVL_INIT_TREE(lspConfigTree, lsp_key_compare);
	MPLS_AVL_INIT_TREE(lspNhTree, fec_key_compare);
    MPLS_AVL_INIT_TREE(lspNhTreeTemp, fec_key_compare);
    MPLS_AVL_INIT_TREE(mplsFilterTree, filter_key_compare);
    MPLS_AVL_INIT_TREE(mplsLspPrioTree, lsp_prio_dst_compare);
	/* Initialize a OAM timer queue */
	MPLS_TIMER_INIT(mpls_oam_timer_q);

	MPLS_MEMSET(&mplsFecFilterAdvEntry,0,sizeof(mplsFecFilterAdvertiseLbls_t));      /*mpls fec filter advertise label table */
	mplsFecFilterAdvEntry.advFlag = MPLS_NOT_ADVERTISE_LBLS;
	
	mplsFecFilterHead=mplsFecFilterPF=mplsFecFilterPN
	                 = (mplsFecFilterAll_t *)malloc(sizeof(mplsFecFilterAll_t));	
	MPLS_MEMSET(mplsFecFilterHead,0,sizeof(mplsFecFilterAll_t));
	mplsFecFilterHead->next = MPLS_NULL;
	mplsFecFilterHead->FecFilter->next = MPLS_NULL;
	
	MPLS_MEMSET(&TimeSave,0,8*2);  /* 分别和8个记时器相对应 */
    MPLS_MEMSET(&operArray,0,8);
	MPLS_MEMSET(&arrayLen,0,MPLS_DATA_ARRAY_MAX*2);
	
	MPLS_MEMSET(&mplsOamTimer,0,sizeof(mplsOamTimer_t)); 
	for(num=0; num<=MPLS_MAX_MODULE_NUM;num++)
	{    
	   mplsOamTimer.timerId[timerNo(num,OAM_TIMER_MPLS_LSRID_TABLE)]     = timerNo(num,OAM_TIMER_MPLS_LSRID_TABLE);
	   mplsOamTimer.timerId[timerNo(num,OAM_TIMER_MPLS_INTERFACE_TABLE)] = timerNo(num,OAM_TIMER_MPLS_INTERFACE_TABLE);
	   mplsOamTimer.timerId[timerNo(num,OAM_TIMER_MPLS_ENTITY_TABLE)]    = timerNo(num,OAM_TIMER_MPLS_ENTITY_TABLE);
	   mplsOamTimer.timerId[timerNo(num,OAM_TIMER_MPLS_CONFIG_TABLE)]    = timerNo(num,OAM_TIMER_MPLS_CONFIG_TABLE);
	}
	
	MPLS_MEMSET(&FilterNo,0,FILTER_MAX_NUM*sizeof(FilterLspId_t));
	
	MPLS_MEMSET(&mplsLspSetupEntry,0,sizeof(mplsLspSetup_t));
	/*
	for(num=1; num<FILTER_MAX_NUM-1; num++)
	{
	   FilterNo[num].front = num-1;
	   FilterNo[num].next  = num+1;
	}
	FilterNo[FILTER_MAX_NUM-1].next=0;
	currentFilterNo  = 1;
	*/
	
	mplsFecLspRteInit();
		
	mplsLdpParamInit(); /* initialize the ldp protocol data */
	
	mplsFecMemInit();
	
	#if _MPLS_DEBUG
	MPLS_MEMSET(mplsDebug,0,50*sizeof(unsigned long));
	#endif
	/* szh, 2002-8-24 initialize label vpi/vci*/
	MPLS_MEMSET(&local_label_busy_flags, 0,sizeof(mpls_label_busy_flags));
	MPLS_MEMSET(mplsIfConf,0,sizeof(mplsIfConf_t)*MPLS_MAX_BOARD);
	MPLS_MEMSET(&mplsIpIf,0,sizeof(interface_name_t));
	mplsOamGetMem();
}

void mpls2LdpBoardType(ushort eventType,PID * sPid,uchar opera)
{
     PID                  sendPid;
     ushort               num;
     ushort               numFnd;       /* 0:   模块没有配置、1:模块已配置*/
     ushort               iNum;
     uchar                timer_number;
     MIB_MPLSCONFIG_ACK   boardData;
/*     mplsOAMLdpMessage_t  MessData;  */
     MPLS_MEMSET(&boardData,0,sizeof(MIB_MPLSCONFIG_ACK));
     MPLS_MEMSET(&lspData,0,sizeof(mplsOAMLdpMessage_t));
     sendPid = *sPid;
     
     numFnd  = 0;
     num     = MplsPortDataTable1.num;
     
     for(iNum=0; iNum<num; iNum++)  
     {
     	 if(sendPid.module==MplsPortDataTable1.mplsModule[iNum].module)
     	 {
     	    
     	     MPLS_MEMCPY(&boardData,&MplsPortDataTable1.mplsModule[iNum].cardType,sizeof(MIB_MPLSCONFIG_ACK));
     	     numFnd = 1;
     	     
     	     break;
     	 }
     }
     
     
     if(numFnd==1)
     {
         MPLS_MEMCPY(&lspData.data.configData,&boardData,sizeof(MIB_MPLSCONFIG_ACK));  
    	   /*	 
         MessData.data.configData = boardData;*/
         lspData.mplsLdpOAMflag  = opera;
         lspData.msgtype = MPLS_MIB_LDP_CONFIG;
         ASEND(eventType,&lspData,sizeof(MIB_MPLSCONFIG_ACK)+40,sendPid);
     }
     else
     {
        MPLS_MEMCPY(&lspData.data.configData,&boardData,sizeof(MIB_MPLSCONFIG_ACK));
/*     	MessData.data.configData = boardData;  */
        lspData.msgtype = MPLS_MIB_LDP_CONFIG;
        lspData.mplsLdpOAMflag  = opera;
        ASEND(eventType,&lspData,sizeof(MIB_MPLSCONFIG_ACK)+40,sendPid);
     }
     
     /*mplsOamTimer.timerId[timerNo(sendPid.module,OAM_TIMER_MPLS_CONFIG_TO_LDP_TABLE)] = 
	       EXTRA_SET_TIMER(MPLS_OAM_LDP_CONFIG_TIMER, MPLS_TIMER1, timerNo(sendPid.module,OAM_TIMER_MPLS_CONFIG_TO_LDP_TABLE));*/
	 timer_number = timerNo(sendPid.module,OAM_TIMER_MPLS_CONFIG_TO_LDP_TABLE);
	 MPLS_SET_TIMER(MPLS_OAM_LDP_CONFIG_TIMER, 
	               (void *)timer1proOAM, 
	               (void *)OAM_TIMER_MPLS_CONFIG_TO_LDP_TABLE,
	               mpls_oam_timer_q,
	               mplsOamTimer.timerId[timer_number]);
}



/* session peer address recieve*/


#if 0/*
void mplsSessionPeerAddrRecv(PID *sPid, MIB_LDP_SESSION_PEERADDR_REQ *data)
{
	PID                  *sendPid;
	ushort               num;
	ushort               num1;
	ushort               num2;
	
	MIB_LDP_SESSION_PEERADDR_REQ     SesPeerAddrData;
	MIB_LDP_SESSION_PEERADDR_ACK     SesPeerAddrAck;
	
	sendPid       = sPid;
	helloData     = *data;
	num           = arrayLen[NOSESSIONPEER];
	if(SesPeerAddrData.operateType==1)
	{
	    mplsLdpSessionPeerAddressEntry[num].entityLdpId     = SesPeerAddrData.req.set.ldpId;
	    mplsLdpSessionPeerAddressEntry[num].entityindex     = SesPeerAddrData.req.set.index;
	    #if 0
	    mplsLdpSessionPeerAddressEntry[num].peerLdpId         = SesPeerAddrData.req.set.peerLdpId;
	    #endif
	    mplsLdpSessionPeerAddressEntry[num].peeraddressindex  = SesPeerAddrData.req.set.sessionIndex;
	    mplsLdpSessionPeerAddressEntry[num].peernexthopaddresstype  
	                                                    = (uchar)SesPeerAddrData.req.set.nextHopAddressType;
	    mplsLdpSessionPeerAddressEntry[num].peernexthopaddress = SesPeerAddrData.req.set.nextHopAddress;
	    mplsLdpSessionPeerAddressEntry[num].ifName.module   = sendPid.module;
	    /* connect 在收到session消息时填 */
	    arrayLen[NOSESSIONPEER]++;
	}
	else if(SesPeerAddrData.operateType==2)
	{ ;}
	else
	{
	    for(num2=num1; num2<num-1; num2++)
	    {
	       if(mplsLdpSessionPeerAddressEntry[num2].entityindex == helloData.req.del.index &&
	          mplsLdpSessionPeerAddressEntry[num2].ifName.module == sendPid.module)
	       {
	           mplsLdpSessionPeerAddressEntry[num2]=mplsLdpSessionPeerAddressEntry[num2+1];
	       } 
	       
	       MPLS_MEMSET(mplsLdpSessionPeerAddressEntry[num2],0,sizeof(mplsLdpSessionPeerAddressTable_t));
	      arrayLen[NOSESSIONPEER]--;
	      break;
	    }
    }
    
    SesPeerAddrAck.result = 1;
    ASEND(MPLS_MIB_LDP_SESSION_PEERADDR,&SesPeerAddrAck,sizeof(MIB_LDP_SESSION_PEERADDR_ACK),sendPid);
} */
#endif

/*********************************************************************************
 * 函 数 名: mplsHelloRecv() 
 * 功    能: 接收HELLO数据                                                
 * 输    入: sPid:   发送方的PID
 *            data:   接收的数据          
 * 输    出: 无
 * 返    回: 无               
 * 全局变量: mplsInterfaceConfEntry 、MplsPortDataTable1   
 * 修改记录:
   -  修改日期       版本      修 改 人       修改原因及内容
 =========================================================

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -