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

📄 f_comm.c

📁 技术文件名称:MPLSv1.0软件模块测试规程
💻 C
📖 第 1 页 / 共 3 页
字号:
					MPLS_NULL,
					ldptime_q,
					tmid);
	#ifdef DEBUG_LDP
		printf("==== LDP set Hello send Timer %d====",tmid);
    	#endif
	return;
}

void ldpSessionSnd()
{
	short i,ses_down;
	unsigned long tmid;
	
	ses_down = 0;
	for(i = 0; i < MPLSLDP_MAX; i++)
	{
/*
		if((MplsLdpSessionEntry[i].RowStatus ==  VAL_RowStatus_active) && \
		   (MplsLdpSessionEntry[i].state ==  OPERATIONAL))
*/
        if(MplsLdpSessionEntry[i].RowStatus ==  VAL_RowStatus_active)
        {
            if(MplsLdpSessionEntry[i].state ==  OPERATIONAL)
    		{
    			MplsLdpSessionEntry[i].keepalive_send_timerid -= LDP_SESSION_CHECK_INTERVAL;
    			if(MplsLdpSessionEntry[i].keepalive_send_timerid <= 0)
    			{
    				SendKeepalMsg((mplsLdpSession_t *)&(MplsLdpSessionEntry[i].entityLdpId));
    			}
    		}
    		ses_down = 1;
    	}
	}
	if(ses_down == 0)   
	{
	    switch_router_id = 0;
	}
	MPLS_SET_TIMER(LDP_SESSION_CHECK_INTERVAL,
					(void *)ldpSessionSnd,
					MPLS_NULL,
					ldptime_q,
					tmid);
	#ifdef DEBUG_LDP
		printf("==== LDP set Session send Timer %d====",tmid);
    #endif
}
/****************************************************************************/
/*      Product Name:   MPLS PACK1.0
 *      Module  Name:   LDP/CR_LDP
 *      File    Name:   f_comm.c
 *      Author  Name:   weng.qing shi.zhaohui hu.yonghong
 *      Creat   Date:   2002-6-18
 *      Version     :   1.0
 *      Input       :   void
 *      Output      :   void
 *      Function    :   priodic lost list scan function
 *      Note        :   
*/      
/****************************************************************************/
void ldpListCheck()
{
	unsigned long 		  tmid,i,status;
	mplsLdpUpCB   		* upCb;
	mplsLdpDownCB 		* downCb;
	mplsLdpLspCB        * lspCb;
	unsigned char         lspType;
	
	if((g_up_lsp_list.first))
	{
		lspCb = g_up_lsp_list.first;
		status = lspCb->upSessionIndex;
		for(i = 0; (lspCb)&&(i < LDP_LIST_CHECK_ITEM_NUM);\
			i++)
		{
			lspType = lspCb->lspType;
			MPLS_REMOVE_FROM_SESSION_UP_LSP_LIST(g_up_lsp_list,lspCb);
                        /* wengqing add for Fei alarm protection */			
                        if(lspCb->upSessionIndex == 1)
			{
				if(!(lspCb->waitflag & 0x1))
				LspCBFsm(MPLS_NULL,UPSTREAM_LOST,MPLS_NULL,lspType, \
				         lspCb->selffec,lspCb);
			}
			else if(lspCb->upSessionIndex == 2)
			{
				if(!(lspCb->waitflag & 0x1))
				LspCBFsm(MPLS_NULL,MPLS_LBLREL_MSGTYPE,MPLS_NULL,lspType, \
				         lspCb->selffec,lspCb);
			}
                        else if(lspCb->upSessionIndex == 0 && lspCb->nodeType == MPLS_NODE_INGRESS)
			{
				lspCb->pNexthopChange = 0;
				if(!(lspCb->waitflag & 0x1))
				LspCBFsm(MPLS_NULL,MPLS_ROUTE_DELETE,MPLS_NULL,lspType, \
				         lspCb->selffec,lspCb);
			}
			else
			{
				MPLS_ASSERT(0);
				/* protection for  upSessionIndex >= 3, have to process lspCb */
				lspCb->upSessionIndex = status = 1;
				if(!(lspCb->waitflag & 0x1))
				LspCBFsm(MPLS_NULL,UPSTREAM_LOST,MPLS_NULL,lspType, \
				         lspCb->selffec,lspCb);
			}
			lspCb = g_up_lsp_list.first;
			if(lspCb)
			{
				if(lspCb->upSessionIndex >= 3)
				{
					lspCb->upSessionIndex = status;
				}
			}
		}
	}
	else if(g_down_lsp_list.first)
	{
		lspCb = g_down_lsp_list.first;
		status = lspCb->downSessionIndex;
		for(i = 0; (lspCb)&&(i < LDP_LIST_CHECK_ITEM_NUM);\
		    i ++)
		{
			lspType = lspCb->lspType;
			MPLS_REMOVE_FROM_SESSION_DOWN_LSP_LIST(g_down_lsp_list,lspCb);
			/* wengqing add for Fei alarm protection */
			if(lspCb->downSessionIndex == 1)
			{
				if(!(lspCb->waitflag & 0x1))
				LspCBFsm(MPLS_NULL,DOWNSTREAM_LOST,MPLS_NULL,lspType, \
				         lspCb->selffec,lspCb);
			}
			else if(lspCb->downSessionIndex == 2)
			{
				if(!(lspCb->waitflag & 0x1))
				LspCBFsm(MPLS_NULL,MPLS_LBLWITH_MSGTYPE,MPLS_NULL,lspType, \
				         lspCb->selffec,lspCb);
			}
			else if(lspCb->downSessionIndex == 0 && lspCb->nodeType == MPLS_NODE_EGRESS)
			{
				lspCb->pNexthopChange = 1;
				if(!(lspCb->waitflag & 0x1))
				LspCBFsm(MPLS_NULL,MPLS_ROUTE_DELETE,MPLS_NULL,lspType, \
				         lspCb->selffec,lspCb);
			}
			else
			{
				MPLS_ASSERT(0);
				/* protection for  downSessionIndex >= 3, have to process lspCb */
				MPLS_ERR_LOG("downSessionIndex %u-->1",lspCb->downSessionIndex);
				lspCb->downSessionIndex = status = 1;
				if(!(lspCb->waitflag & 0x1))
				LspCBFsm(MPLS_NULL,DOWNSTREAM_LOST,MPLS_NULL,lspType, \
				         lspCb->selffec,lspCb);
			}
			lspCb = g_down_lsp_list.first;
			if(lspCb)
			{
				if(lspCb->downSessionIndex >= 3)
				{
					lspCb->downSessionIndex = status;
				}
			}
		}
	}
	else if((g_up_list.first))
	{
		upCb = g_up_list.first;
		status = upCb->upSessionIndex;
		for(i = 0; (upCb)&&(i < LDP_LIST_CHECK_ITEM_NUM);\
		    i ++)
		{
			if(status == 1)
			{
				Up_Clear_Msg(upCb, upCb->selffec);
			}
			else if(status == 2)
			{
				MPLS_UPCB_DELETE(upCb->selffec,upCb);
			}
			MPLS_REMOVE_FROM_SESSION_UP_LIST(g_up_list,upCb);
			upCb = g_up_list.first;
			if(upCb)
			{
				if(upCb->upSessionIndex >= 3)
				{
					upCb->upSessionIndex = status;
				}
			}
		}
	}
	else if((g_down_list.first))
	{
		downCb = g_down_list.first;
		for(i = 0; (lspCb)&&(i < LDP_LIST_CHECK_ITEM_NUM);\
		    i ++)
		{
			MPLS_REMOVE_FROM_SESSION_DOWN_LIST(g_down_list,downCb);
			
			downCb = g_down_list.first;
			
		}
	}
	
	MPLS_SET_TIMER(LDP_LIST_CHECK_INTERVAL,
					(void *)ldpListCheck,
					MPLS_NULL,
					ldptime_q,
					tmid);
	/* 2003.4.23 wengqing 如果链表已全部处理完,进行保护操作 */		
	#if MPLS_PROTECT		
    if((g_up_lsp_list.first == MPLS_NULL)&&(g_down_lsp_list.first == MPLS_NULL)&&(fec_lspcb_scan.timer != 0))
    {
    	ldpFecLspcbScan();
    }
    #endif
    
	#ifdef DEBUG_LDP
		printf("==== LDP set list check Timer %d====",tmid);
    #endif
	return;
}
/****************************************************************************/
/*      Product Name:   MPLS PACK1.0
 *      Module  Name:   LDP/CR_LDP
 *      File    Name:   f_comm.c
 *      Author  Name:   weng.qing shi.zhaohui hu.yonghong
 *      Creat   Date:   2002-6-18
 *      Version     :   1.0
 *      Input       :   mpls_fec_search *pSearch
 *      Output      :   void
 *      Function    :   priodic fec scan function
 *      Note        :   per session scan fec list, add fec add or delete, 
 *                      from head scan again, protection for scan for one fec twice
*/      
/****************************************************************************/
void ldpFecSearchCheck( mpls_fec_search *pSearch )
{
	mplsLdpFecEntry    * fecCb = MPLS_NULL;
	mpls_fec_search	   * pSe = MPLS_NULL;
	unsigned short     i,j;
	unsigned short     dismode;
	mplsLdpSession_t   * session = MPLS_NULL;
	mplsLdpDownCB      * downCb    = MPLS_NULL;
	mplsLdpLspCB      * lspCb    = MPLS_NULL;
	mplsLdpUpCB		   * upCb    = MPLS_NULL;
	MPLS_BOOL            belong_to;

	dismode = 0;
	session = (mplsLdpSession_t *)pSearch->session;
	
	MPLS_SESSION_DISTRIBUT_MODE(session,dismode);
	j = (dismode == DOWNSTREAMONDEMAND) ? 32 : 512;
	if(pSearch->stop == 0)
	{
		MPLS_FEC_SEARCH(pSearch->addr,pSearch->addrLen,fecCb)
		/* protection for route process for no ingress to build */
		if(fecCb == MPLS_NULL)
		{
			fecCb = MPLS_AVL_FIRST(g_fec_avl_tree);
			pSearch->stop = 0;
		}
	}
	else
	{
		fecCb = MPLS_AVL_FIRST(g_fec_avl_tree);
		pSearch->stop = 0;
	}
	i = 0;
	for(;;fecCb = MPLS_AVL_NEXT(fecCb->fec_avl_node))
	{
		if(fecCb == MPLS_NULL)
		{
		    MPLS_FEC_SEARCH_DELETE(g_fec_search_list,pSearch);
		    return;
		}
        /* wengqing 2003.3.28 判断是否还有要删的块未处理,若有,则定时5s再来检查,
                              没有要删的块才开始新建立 */
		if(g_up_lsp_list.first != MPLS_NULL || g_down_lsp_list.first != MPLS_NULL || fec_lspcb_scan.timer != 0)
		{
			pSearch->addr    = fecCb->fec_key.mplsFecAddr;
			pSearch->addrLen = fecCb->fec_key.mplsLdpFecAddrLen;
			pSearch->tmier = 0;
			printf("1 set delay timer 5s");
			MPLS_SET_TIMER(50,(void *)ldpFecSearchCheck,(void *)pSearch,\
			               ldptime_q,pSearch->tmier);
			if(pSearch->tmier == 0)
			{
				DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_LSP,"MPLS_FEC_SEARCH_CREATE SET_TIMER Fail\n");
				MPLS_ERR_LOG("MPLS_FEC_SEARCH_CREATE SET_TIMER Fail");
				MPLS_FEC_SEARCH_DELETE(g_fec_search_list,pSearch);
			}
			break;
		}
		if(++i > j)
		{
			pSearch->addr    = fecCb->fec_key.mplsFecAddr;
			pSearch->addrLen = fecCb->fec_key.mplsLdpFecAddrLen;
			pSearch->tmier = 0;
			MPLS_SET_TIMER(10,(void *)ldpFecSearchCheck,(void *)pSearch,\
			               ldptime_q,pSearch->tmier);
			if(pSearch->tmier == 0)
			{
                DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_LSP,"MPLS_FEC_SEARCH_CREATE 2  SET_TIMER Fail\n");
				MPLS_ERR_LOG("MPLS_FEC_SEARCH_CREATE SET_TIMER Fail");
				MPLS_FEC_SEARCH_DELETE(g_fec_search_list,pSearch);
			}
			break;
		}
		else
		{
			if(fecCb->nexthopSessionIndex == (session->index))
				continue;
			if(dismode == DOWNSTREAMONDEMAND)
			{
				if((fecCb->owner 	& MPLS_OWNER_ROUTE) && \
				   (fecCb->nodeType  != MPLS_NODE_EGRESS) && \
				   (fecCb->nodeType  != MPLS_NODE_PROXY_EGRESS) && (!(fecCb->pRes & MPLS_DENY_POLICY)))
				{
				
					belong_to = MPLS_FALSE;
					MPLS_NEXTHOP_SESSION_BELONG(fecCb->nexthopAddr,session,belong_to);
					if(belong_to == MPLS_TRUE)
					{
						if(fecCb->nexthopSessionIndex)
						{
							MPLS_WALK_DOWN_BEGIN(fecCb,downCb,t_downCb);
							if(downCb != MPLS_NULL && downCb->downSessionIndex == fecCb->nexthopSessionIndex)
							{
								switch(downCb->state)
								{
									case ESTABLISHED:
										if(session)
										{
											if(session->index == downCb->downSessionIndex)
											       wait_downfeclbl_append(downCb,fecCb,LDP_FWD_CLOSE);	       
										}
										break;
									case RESPONSE_AWAITED:
										/* send to up notification: no route */
										downCb->waitflag |=0x1;
										wait_downlblmsg_append(downCb,fecCb,MPLS_LBLABORT_MSGTYPE);
										break;
									default:
										printf("mpls_err_log,ldpFecSearchCheck default");
										break;
								}	
							}
							MPLS_WALK_DOWN_END(fecCb,downCb,t_downCb)
						}
						fecCb->nexthopSessionIndex = session->index;
						MPLS_LSPCB_CREATE(fecCb,lspCb);
						if(lspCb)
						{
							lspCb->lspIndex = MPLS_GET_LSP_INDEX;
							lspCb->lspType = LDP_HOP_LSP;
							lspCb->nodeType = MPLS_NODE_INGRESS;
							lspCb->downSessionIndex = session->index;
							lspCb->downifIndex			=	session->ifIndex;
							lspCb->downPeerLdpid.lsrAddress = session->peerLdpId.lsrAddress;
							lspCb->downPeerLdpid.labelSpace = session->peerLdpId.labelSpace;
							ifindex2mod_req.ifIndex 			= lspCb->downifIndex;
							ifindex2mod_req.mpls_protocol_type	= MPLS_LABEL_SWITCH_PROTOCOL_ATM;

⌨️ 快捷键说明

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