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

📄 labelrel.c

📁 技术文件名称:MPLSv1.0软件模块测试规程
💻 C
字号:
#include "ldpvars.h"
/****************************************************************************/
/*      Product Name:   MPLS PACK1.0
 *      Module  Name:   LDP/CR_LDP
 *      File    Name:   ldppdu.h
 *      Author  Name:   weng.qing shi.zhaohui hu.yonghong
 *      Creat   Date:   2002-6-18
 *      Version     :   1.0
 *      Input       :   mplsLdpSession_t *, inbound seesion pointer;
 *                      void             *, inputEvent;
 *      Output      :   void
 *      Function    :   Label release process function
 *      Note        :   
 *     2002.12.3  Huyonghong add search crfecbc    
 *     2003.12.30 fengjun replace macro MPLS_CRFECCB_DELETE by func ldp_del_lspCB   */      
 /*     2003-12-10 lixia add for debug mpls                  */
/****************************************************************************/
void FuncLblRel(mplsLdpSession_t * session, void * inputEvent)
{
	mplsLdpLbl_W_R_Msg_t    * lblrel        = MPLS_NULL;
	mplsLdpSession_t        * downsession   = MPLS_NULL;
	mplsLdpFecEntry         * fecCb         = MPLS_NULL;
	mplsLdpCrLsp            * crlspCb       = MPLS_NULL; 
	mplsLdpLspCB            * lspCb         = MPLS_NULL; 
	mplsLdpUpCB             * upCb          = MPLS_NULL;
	mplsLdpDownCB           * downCb        = MPLS_NULL;
	unsigned short          dismode;
	unsigned char           contin;
	unsigned short          us;
    unsigned short			preLen;
    	
	lblrel     =  (mplsLdpLbl_W_R_Msg_t *)inputEvent;
	if(lblrel->fecTlvExists == 0)
    {
    	MPLS_SEND_NOTIFY(session,MISSPARAMETER,lblrel->baseMsg.msgId, \
					lblrel->baseMsg.flags.flags.msgType);
    	return;
    }
	if(lblrel->genLblTlvExists == 1)
	{
		/* gen label need not support fec aggregate */
		MPLS_CRLSP_SESSION_UP_GEN_LABEL(session,lblrel->genLblTlv.label,
		                         &lblrel->fecTlv,crlspCb);
		if(crlspCb != MPLS_NULL)
		{
			MPLS_DOWN_SESSION_CRLSP(crlspCb,downsession);
			if(downsession != MPLS_NULL)
			{
				dismode = 0;
				MPLS_SESSION_DISTRIBUT_MODE(session,dismode);
				if(dismode == DOWNSTREAMONDEMAND)
				{
					MPLS_REMOVE_FROM_SESSION_UP_LSP_LIST(session->lsp_up_cb_list,&(crlspCb->crlspCb))
					crlspCb->crlspCb.upSessionIndex = 0;
					if(!((&crlspCb->crlspCb)->waitflag & 0x1))
					LspCBFsm(session,MPLS_LBLREL_MSGTYPE, \
    				 	 lblrel,LDP_CR_LSP,crlspCb,&crlspCb->crlspCb);
					return;
				}
				else
				{
					/* downstream session not present */
					sendtoDownRelease(crlspCb);
					#if 0 /******************fj*******************/
					sendtoLabelXC(crlspCb,&crlspCb->crlspCb,MPLS_NULL,LDP_FWD_CLOSE);
                    #endif
                    wait_crlspfeclbl_append(&(crlspCb->crlspCb),crlspCb,LDP_FWD_CLOSE);
					MPLS_RELEASE_GENLABEL(lblrel->genLblTlv.label);
					ldp_del_lspCB((char *)crlspCb,&(crlspCb->crlspCb));
					return;
				}
				/* here return, because crlsp no aggregate */
			}
			printf("mpls_err_log,FuncLblRel");
			return;
		}
		
		MPLS_FEC_SESSION_UP_GEN_LABEL(session,lblrel->genLblTlv.label,\
										&lblrel->fecTlv,fecCb,upCb);
		if(fecCb != MPLS_NULL && upCb != MPLS_NULL)
		{
			/* directly delete the gen label upCb, if there is no other 
			   upCb, then LDP_FWD_CLOSE the Label XC
			*/
			MPLS_REMOVE_FROM_SESSION_UP_LIST(session->up_cb_list,upCb)
			MPLS_UPCB_DELETE(fecCb,upCb);
		}
		/* add by hyh */
#if 0
		MPLS_WALK_DOWN_BEGIN(fecCb,downCb,t_downCb)
		if(fecCb != MPLS_NULL && downCb != MPLS_NULL)
		{
			if(downCb->nexthopAddr == fecCb->nexthopAddr)
			{
				sendtoDownRelease_Fec(fecCb,downCb);
				return;
			}
		}
		MPLS_WALK_DOWN_END(fecCb,downCb,t_downCb)
#endif
		/* hyh add end */
	}
	else if(lblrel->atmLblTlvExists == 1)
	{
		/* crlsp atm label need not support fec aggregate */
		/* 2002.11.12 for performance */
		crlspCb = MPLS_NULL;
		if(lblrel->fecTlv.fecElemTypes[0] == MPLS_CRLSP_FEC || \
		   lblrel->lspidTlvExists == 1 )
		{
			if(lblrel->lspidTlvExists == 1)
			{
    			MPLS_CRFECCB_SEARCH(lblrel->lspidTlv.routerId, \
        				lblrel->lspidTlv.localCrlspId,crlspCb);
        	}
        	
		MPLS_CRLSP_SESSION_UP_ATM_LABEL(session,(lblrel->atmLblTlv),
		                         (&lblrel->fecTlv),crlspCb);
		if(crlspCb != MPLS_NULL)
		{
			MPLS_REMOVE_FROM_SESSION_UP_LSP_LIST(session->lsp_up_cb_list,&(crlspCb->crlspCb))
			crlspCb->crlspCb.upSessionIndex = 0;
			if(!((&crlspCb->crlspCb)->waitflag & 0x1))
			LspCBFsm(session,MPLS_LBLREL_MSGTYPE, \
    				 	 lblrel,LDP_CR_LSP,crlspCb,&crlspCb->crlspCb);
    	  }
			return;
		}
		if(lblrel->fecTlv.wcElemExists == 1)
		{
			WALK_FEC_BEGIN(fecCb)
			MPLS_FEC_SESSION_UP_ATM_LABEL(session,lblrel->atmLblTlv,
				                       &lblrel->fecTlv,fecCb,lspCb);
			if(fecCb != MPLS_NULL && lspCb != MPLS_NULL)
			{
				MPLS_REMOVE_FROM_SESSION_UP_LSP_LIST(session->lsp_up_cb_list,&(crlspCb->crlspCb))
				(crlspCb->crlspCb).upSessionIndex = 0;
				if(!(lspCb->waitflag & 0x1))
				LspCBFsm(session,MPLS_LBLREL_MSGTYPE,lblrel,LDP_CR_LSP,fecCb,lspCb);
			}
			WALK_FEC_END
		}
		else
		{
			for(us = 0; us < lblrel->fecTlv.numberFecElements; us ++)
			{
				/* by hyh */
				preLen = lblrel->fecTlv.fecElemTypes[0] == MPLS_HOSTADR_FEC ? \
					32: lblrel->fecTlv.fecElArray[0].addressEl.preLen;
				
				MPLS_FEC_SEARCH(lblrel->fecTlv.fecElArray[0].addressEl.address,preLen,fecCb)
				if(fecCb)
				{
					MPLS_FEC_SESSION_UP_ATM_LABEL(session,lblrel->atmLblTlv,
						                       &lblrel->fecTlv,fecCb,lspCb);
					if(lspCb != MPLS_NULL)
					{
						MPLS_REMOVE_FROM_SESSION_UP_LSP_LIST(session->lsp_up_cb_list,lspCb)
						lspCb->upSessionIndex = 0;
						if(!(lspCb->waitflag & 0x1))
						LspCBFsm(session,MPLS_LBLREL_MSGTYPE,lblrel,LDP_HOP_LSP,fecCb,lspCb);
					}
					else
					{
						DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_LSP,"FuncLblRel,Label Release,can't find fec %x\n",\
						   lblrel->fecTlv.fecElArray[0].addressEl.address);
					    MPLS_ERR_LOG("Label Release %x,",\
						   lblrel->fecTlv.fecElArray[0].addressEl.address);
					    return;
					}
					
				}
				else
				{
                    DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_LSP,"FuncLblRel,Label Release,can't find fec %x\n",\
						lblrel->fecTlv.fecElArray[0].addressEl.address);
					MPLS_ERR_LOG("Label Release %x,",\
						lblrel->fecTlv.fecElArray[0].addressEl.address);
					return;
				}
			}
		}
	}
	else
	{
		if(lblrel->fecTlv.wcElemExists == 1)
		{
			/******************************************************/
			/* wengqing add for session link list
			*/
			/******************************************************/
			if(session->lsp_up_cb_list.first)
			{
				session->lsp_up_cb_list.first->upSessionIndex = 2;
				session->lsp_up_cb_list.last->upSessionIndex  = 2;
				MPLS_INSERT_INTO_UP_LSP_LIST(g_up_lsp_list,
											 session->lsp_up_cb_list.first, \
											 session->lsp_up_cb_list.last);
				
				session->lsp_up_cb_list.first =MPLS_NULL;
				session->lsp_up_cb_list.last =MPLS_NULL;
											 
			}
			if(session->up_cb_list.first)
			{
				session->up_cb_list.first->upSessionIndex = 2;
				session->up_cb_list.last->upSessionIndex  = 2;
				MPLS_INSERT_INTO_UP_LIST(g_up_list,
											 session->up_cb_list.first, \
											 session->up_cb_list.last);
											 
	            session->up_cb_list.first =MPLS_NULL;
				session->up_cb_list.last =MPLS_NULL;
			}
			return;
			/******************************************************/
			/* wengqing add for session link list end
			*/
			/******************************************************/
			
			WALK_FEC_BEGIN(fecCb)
			MPLS_WALK_UP_BEGIN(fecCb,upCb,t_upCb);
			if(fecCb != MPLS_NULL && upCb != MPLS_NULL)
			{
				/* genLblTlvExists ==0 genLblTlv.label ???hyh */
				if(upCb->upSessionIndex == session->index)
				{
					MPLS_UPCB_DELETE(fecCb,upCb);
				}
			}
			MPLS_WALK_UP_END(fecCb,upCb,t_upCb)
			
			/* add by hyh */
#if 0
			MPLS_WALK_DOWN_BEGIN(fecCb,downCb,t_downCb)
			if(fecCb != MPLS_NULL && downCb != MPLS_NULL)
			{
				if(downCb->nexthopAddr == fecCb->nexthopAddr)
				{
					sendtoDownRelease_Fec(fecCb,downCb);
					return;
				}
			}	
			MPLS_WALK_DOWN_END(fecCb,downCb,t_downCb)
#endif
			/* hyh add end */

			MPLS_WALK_LSP_BEGIN(fecCb,lspCb,t_lspCb)
			if(lspCb)
			{
				if(((lspCb->nodeType == MPLS_NODE_INTERM) || \
				  (lspCb->nodeType == MPLS_NODE_INTERM_INGRESS)|| \
				  (lspCb->nodeType == MPLS_NODE_EGRESS))&& \
				  (lspCb->upSessionIndex == session->index))
				{
					if(!(lspCb->waitflag & 0x1))
					LspCBFsm(session,MPLS_LBLREL_MSGTYPE,lblrel,LDP_HOP_LSP,fecCb,lspCb);
				}
			}
			MPLS_WALK_LSP_END(fecCb,lspCb,t_lspCb)
			WALK_FEC_END
		}
		else
		{
			/* no label TLV, currently no process???hyh */ 
			for(us = 0; us < lblrel->fecTlv.numberFecElements; us ++)
			{
				/* by hyh */
				preLen = lblrel->fecTlv.fecElemTypes[0] == MPLS_HOSTADR_FEC ? \
					32: lblrel->fecTlv.fecElArray[0].addressEl.preLen;
				
				MPLS_FEC_SEARCH(lblrel->fecTlv.fecElArray[0].addressEl.address,preLen,fecCb)
				if(fecCb)
				{
				MPLS_WALK_UP_BEGIN(fecCb,upCb,t_upCb);
				if(fecCb != MPLS_NULL && upCb != MPLS_NULL)
				{
						if(upCb->upSessionIndex == session->index)
						{
							MPLS_UPCB_DELETE(fecCb,upCb);
						}
				}
				MPLS_WALK_UP_END(fecCb,upCb,t_upCb)
					MPLS_WALK_LSP_BEGIN(fecCb,lspCb,t_lspCb)
					if(lspCb)
					{
						if(((lspCb->nodeType == MPLS_NODE_INTERM) || \
						  (lspCb->nodeType == MPLS_NODE_INTERM_INGRESS))&& \
						  (lspCb->upSessionIndex == session->index))
						{
							if(!(lspCb->waitflag & 0x1))
							LspCBFsm(session,MPLS_LBLREL_MSGTYPE,lblrel,\
									 LDP_HOP_LSP,fecCb,lspCb);
						}
					}
					MPLS_WALK_LSP_END(fecCb,lspCb,t_lspCb)
				}
			}
		}
	}
	return;
}

⌨️ 快捷键说明

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