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

📄 lblwith.c

📁 技术文件名称:MPLSv1.0软件模块测试规程
💻 C
📖 第 1 页 / 共 2 页
字号:
#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        :   
* wengqing 2002.11.12 add for performance 
* wengqing 2003.1.16  only keep the first sendtodown_Release_with
*                     update lspcb when receive withdraw msg  
  fengjun  2003.12.30 修改session赋值
*/      
/****************************************************************************/
void FuncLblWithdraw(mplsLdpSession_t * session, void * inputEvent)
{
	mplsLdpLbl_W_R_Msg_t    * lblwith       = MPLS_NULL;
	mplsLdpFecEntry         * fecCb         = MPLS_NULL;
	mplsLdpCrLsp            * crlspCb       = MPLS_NULL; 
	mplsLdpSession_t        * upsession     = MPLS_NULL;
	mplsLdpDownCB           * downCb        = MPLS_NULL;
	mplsLdpLspCB            * lspCb         = MPLS_NULL;
	mpls_sb_list            * sb_list;
	unsigned short            belong_to     = MPLS_FALSE;
	unsigned short          yes 			= MPLS_FALSE;
	unsigned short          dismode;
    unsigned short			preLen;	
    unsigned short          us;
    
	lblwith = (mplsLdpLbl_W_R_Msg_t *)inputEvent;
	if(lblwith->fecTlvExists == 0)
    {
    	MPLS_SEND_NOTIFY(session,MISSPARAMETER,lblwith->baseMsg.msgId, \
					lblwith->baseMsg.flags.flags.msgType);
    	return;
    }
	//sendtodown_Release_with(session,lblwith);  2004-2-2 fengjun dele
	
	if(lblwith->genLblTlvExists == 1)
	{
		if(lblwith->fecTlv.fecElemTypes[0] == MPLS_CRLSP_FEC || \
		   lblwith->lspidTlvExists == 1 )
		{
			/* gen label need not support fec aggregate */
			MPLS_CRLSP_SESSION_DOWN_GEN_LABEL(session,lblwith->genLblTlv.label,
		                             &lblwith->fecTlv,crlspCb);
		    if(crlspCb != MPLS_NULL)
		    {
		    	MPLS_REMOVE_FROM_SESSION_DOWN_LSP_LIST(session->lsp_down_cb_list,&(crlspCb->crlspCb))
		    	sendtodown_Release_with(session,lblwith);
		    	MPLS_UP_SESSION_CRLSP(crlspCb,upsession);
		    	if(upsession != MPLS_NULL)
		    	{
		    		MPLS_REMOVE_FROM_SESSION_UP_LSP_LIST(upsession->lsp_up_cb_list,&(crlspCb->crlspCb))
			    	dismode = 0;
					MPLS_SESSION_DISTRIBUT_MODE(session,dismode);
					if(dismode != DOWNSTREAMONDEMAND)
					{
						sendtoUpWithdraw(crlspCb,upsession);
                                          #if 0
						sendtoLabelXC(crlspCb,&crlspCb->crlspCb,MPLS_NULL,LDP_FWD_CLOSE);
						#endif
						wait_crlspfeclbl_append(&(crlspCb->crlspCb),crlspCb,LDP_FWD_CLOSE);
						MPLS_RELEASE_GEN_LABEL(lblwith->genLblTlv.label);
					}
					else
					{
						if(!((&crlspCb->crlspCb)->waitflag & 0x1))
						LspCBFsm(session,MPLS_LBLWITH_MSGTYPE, \
    				 		lblwith,LDP_CR_LSP,crlspCb,&crlspCb->crlspCb);
						return;
					}
				}
				else
				{
					printf("mpls_err_log,FuncLblWithdraw\n");
				}
		    }
		}
		else if(lblwith->fecTlv.wcElemExists != 1)
		{
			/* fec list */
			preLen = lblwith->fecTlv.fecElemTypes[0] == MPLS_HOSTADR_FEC ? \
					32: lblwith->fecTlv.fecElArray[0].addressEl.preLen;
			MPLS_FEC_SEARCH(lblwith->fecTlv.fecElArray[0].addressEl.address,preLen,fecCb)  /*2004-3-23 lixia add*/
			if (fecCb)
			{
			MPLS_FEC_SESSION_DOWN_GEN_LABEL(session,lblwith->genLblTlv.label,
		                             &lblwith->fecTlv,fecCb,downCb);
		    if(fecCb != MPLS_NULL && downCb != MPLS_NULL)
		    {
		    	if(fecCb->owner & MPLS_OWNER_ROUTE)
		    	{
		    		/* next hop label withdraw */
		    		MPLS_NEXTHOP_SESSION_BELONG(fecCb->nexthopAddr,session,belong_to);
		    		if(belong_to == MPLS_TRUE)
		    		{
                                   #if 0  /************fj*************/
		    			sendtoLabelXC(fecCb,MPLS_NULL,downCb,LDP_FWD_CLOSE);
                                   #endif
                                   downCb->waitflag |=0x1;
                                   wait_downfeclbl_append(downCb,fecCb,LDP_FWD_CLOSE);
                                   wait_downlblmsg_append(downCb,fecCb,MPLS_LBLREL_MSGTYPE);
                                   #if 0
		    			MPLS_DOWNCB_DELETE(fecCb,downCb);
                                   #endif
		    		}
		    		else
		    		{
                                        downCb->waitflag |=0x1;
		    			wait_downlblmsg_append(downCb,fecCb,MPLS_LBLREL_MSGTYPE);
		    			/*
		    			MPLS_DOWNCB_DELETE(fecCb,downCb);
		    			*/
		    		}
		    	}
		    	else
		    	{
		    		wait_downlblmsg_append(downCb,fecCb,MPLS_LBLREL_MSGTYPE);
	    			downCb->waitflag |=0x1;
	    			/*
	    			MPLS_DOWNCB_DELETE(fecCb,downCb);
	    			*/
		    	}
		    }		    
		    }	/*fec is not null*/
		}
		else
		{
			/* wildcard fec */
			/* gen label need not support fec aggregate */
			MPLS_CRLSP_SESSION_DOWN_GEN_LABEL(session,lblwith->genLblTlv.label,
		                             &lblwith->fecTlv,crlspCb);
		    if(crlspCb != MPLS_NULL)
		    {
//		    	sendtodown_Release_with(session,lblwith);
		    	MPLS_UP_SESSION_CRLSP(crlspCb,upsession);
		    	if(upsession != MPLS_NULL)
		    	{
			    	dismode = 0;
					MPLS_SESSION_DISTRIBUT_MODE(session,dismode);
					if(dismode != DOWNSTREAMONDEMAND)
					{
						sendtoUpWithdraw(crlspCb,session);
						
                                   #if 0  /************fj*************/
						sendtoLabelXC(crlspCb,&crlspCb->crlspCb,MPLS_NULL,LDP_FWD_CLOSE);
                                   #endif
                                   wait_crlspfeclbl_append(&(crlspCb->crlspCb),crlspCb,LDP_FWD_CLOSE);
						MPLS_RELEASE_GEN_LABEL(lblwith->genLblTlv.label);
						return;
					}
					else
					{
						if(!((&crlspCb->crlspCb)->waitflag & 0x1))
						LspCBFsm(session,MPLS_LBLWITH_MSGTYPE, \
    				 		lblwith,LDP_CR_LSP,crlspCb,&crlspCb->crlspCb);
						return;
					}
				}
				else
				{
					printf("mpls_err_log,FuncLblWithdraw 2\n");
					return;
				}
		    }
		    WALK_FEC_BEGIN(fecCb)
		    /* fec list */
			MPLS_FEC_SESSION_DOWN_GEN_LABEL(session,lblwith->genLblTlv.label,
		                             &lblwith->fecTlv,fecCb,downCb);
		    if(fecCb != MPLS_NULL && downCb != MPLS_NULL)
		    {
		    	if(fecCb->owner && MPLS_OWNER_ROUTE)
		    	{
		    		/* next hop label withdraw */
		    		MPLS_NEXTHOP_SESSION_BELONG(fecCb->nexthopAddr,session,belong_to);
		    		if(belong_to == MPLS_TRUE)
		    		{
                                   #if 0
		    			sendtoLabelXC(fecCb,MPLS_NULL,downCb,LDP_FWD_CLOSE);
                                   #endif
                                   downCb->waitflag |=0x1;
                                   wait_downfeclbl_append(downCb,fecCb,LDP_FWD_CLOSE);
								   wait_downlblmsg_append(downCb,fecCb,MPLS_LBLREL_MSGTYPE);
		    		}
		    		else
		    		{
		    			wait_downlblmsg_append(downCb,fecCb,MPLS_LBLREL_MSGTYPE);
		    			downCb->waitflag |=0x1;
		    			/*
		    			MPLS_DOWNCB_DELETE(fecCb,downCb);
		    			*/
		    		}
		    	}
		    	else
		    	{
		    		wait_downlblmsg_append(downCb,fecCb,MPLS_LBLREL_MSGTYPE);
	    			downCb->waitflag |=0x1;
	    			/*
	    			MPLS_DOWNCB_DELETE(fecCb,downCb);
	    			*/
		    	}
		    }
		    WALK_FEC_END
		}
	}
	else if(lblwith->atmLblTlvExists == 1)
	{
		if(lblwith->fecTlv.fecElemTypes[0] == MPLS_CRLSP_FEC || \
		   lblwith->lspidTlvExists == 1 )
		{
//			sendtodown_Release_with(session,lblwith);
			/* gen label need not support fec aggregate */
			/* 2002.11.12 for performance */
			crlspCb = MPLS_NULL;
			if(lblwith->lspidTlvExists == 1)
			{
    			MPLS_CRFECCB_SEARCH(lblwith->lspidTlv.routerId, \
        				lblwith->lspidTlv.localCrlspId,crlspCb);
        	        }
			MPLS_CRLSP_SESSION_DOWN_ATM_LABEL(session,lblwith->atmLblTlv,
		                             &lblwith->fecTlv,crlspCb);
		    if(crlspCb != MPLS_NULL)
		    {
		    	/* update lspcb when receive withdraw msg */
		    	MPLS_REMOVE_FROM_SESSION_DOWN_LSP_LIST(session->lsp_down_cb_list,&(crlspCb->crlspCb))
		    	if(!((&crlspCb->crlspCb)->waitflag & 0x1))
		    {
		        sendtodown_Release_with(session,lblwith); /* 2004-2-2 fengjun add */
		        reclblmsgtlvproc(session,lblwith,crlspCb,&(crlspCb->crlspCb),MPLS_LBLWITH_MSGTYPE,LDP_CR_LSP);
		    	LspCBFsm(session,MPLS_LBLWITH_MSGTYPE, \
    				 		lblwith,LDP_CR_LSP,crlspCb,&crlspCb->crlspCb);
    		    }
				return;
		    }
		}
		else if(lblwith->fecTlv.wcElemExists != 1)
		{
			for(us = 0; us < lblwith->fecTlv.numberFecElements; us ++)
			{
				/* by hyh */
				preLen = lblwith->fecTlv.fecElemTypes[0] == MPLS_HOSTADR_FEC ? \
					32: lblwith->fecTlv.fecElArray[0].addressEl.preLen;
				
				MPLS_FEC_SEARCH(lblwith->fecTlv.fecElArray[0].addressEl.address,preLen,fecCb)
				if(fecCb)
				{
			MPLS_FEC_SESSION_DOWN_ATM_LABEL(session,lblwith->atmLblTlv,
		                             &lblwith->fecTlv,fecCb,lspCb)
		    if(fecCb != MPLS_NULL && lspCb != MPLS_NULL)
		    {
        		        /* 2002.10.28 when node is ingress, lspCb don't delete, 
        		           so not delete from down session list */

⌨️ 快捷键说明

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