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

📄 lblabort.c

📁 技术文件名称:MPLSv1.0软件模块测试规程
💻 C
字号:
#undef DEF_LDP_VAR
#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   
* fengjun 2003.12.30  replace macro MPLS_CRFECCB_DELETE by func ldp_del_lspCB    */      
/****************************************************************************/
void FuncLblAbort(mplsLdpSession_t * session, void * inputEvent)
{
	mplsLdpLblAbortMsg_t    *  lblAbort     = MPLS_NULL;
	mplsLdpFecEntry         * fecCb         = MPLS_NULL;
	mplsLdpCrLsp            * crlspCb       = MPLS_NULL; 
	mplsLdpUpCB             * upCb          = MPLS_NULL;
	mplsLdpLspCB            * lspCb         = MPLS_NULL;
	mplsLdpDownCB           * downCb        = MPLS_NULL;
	mplsLdpSession_t        * downsession   = MPLS_NULL;
	unsigned short          dismode;
	unsigned long           msgid;
	unsigned short			preLen;	
    unsigned short          us;
	
	lblAbort = (mplsLdpLblAbortMsg_t *)inputEvent;
	if(lblAbort->fecTlvExists == 0 || lblAbort->lblMsgIdTlvExists == 0)
    {
    	MPLS_SEND_NOTIFY(session,MISSPARAMETER,lblAbort->baseMsg.msgId, \
					lblAbort->baseMsg.flags.flags.msgType);
    	return;
    }
	if( lblAbort->lspidTlvExists == 1 ||lblAbort->fecTlv.fecElemTypes[0] == MPLS_CRLSP_FEC)
	{
		/* 2002.11.12 for performance */
		crlspCb = MPLS_NULL;
		if(lblAbort->lspidTlvExists == 1)
		{
			MPLS_CRFECCB_SEARCH(lblAbort->lspidTlv.routerId, \
    				lblAbort->lspidTlv.localCrlspId,crlspCb);
    	        }
		MPLS_CRFEC_SESSION_MSGID(session,lblAbort->lblMsgIdTlv.msgId,crlspCb);
		if(crlspCb != MPLS_NULL)
		{
			dismode = 0;
			MPLS_SESSION_DISTRIBUT_MODE(session,dismode);
			if(dismode == DOWNSTREAMONDEMAND)
			{
				/* currently not judge the abort request msgid,directly send notify:LBLREQAB */
				if(crlspCb->crlspCb.status != ESTABLISHED)
				{	
                                        #if 0
                                        MPLS_SEND_NOTIFY(session,LBLREQAB,lblAbort->baseMsg.msgId, \
						lblAbort->baseMsg.flags.flags.msgType);
                                        #endif
                    
					mpls_send_abnot(session,LBLREQAB,lblAbort->baseMsg.msgId, \
									lblAbort->baseMsg.flags.flags.msgType,
									crlspCb->crlspCb.upMsgid);
					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_LBLABORT_MSGTYPE,\
						lblAbort,LDP_CR_LSP,crlspCb,&crlspCb->crlspCb);
                                return;
			}
			else
			{
				MPLS_DOWN_SESSION_CRLSP(crlspCb,downsession);
				if(downsession)
				{
					MPLS_REMOVE_FROM_SESSION_DOWN_LSP_LIST(downsession->lsp_down_cb_list,&(crlspCb->crlspCb))
				}
				dismode = 0;
				MPLS_SESSION_DISTRIBUT_MODE(session,dismode);
				if(dismode == DOWNSTREAMONDEMAND)
				{
					if(!((&crlspCb->crlspCb)->waitflag & 0x1))
					LspCBFsm(session,MPLS_LBLABORT_MSGTYPE,\
						lblAbort,LDP_CR_LSP,crlspCb,&crlspCb->crlspCb);
					return;
				}
				else
				{
					sendtoDownLblAbort(downsession,MPLS_NULL,crlspCb,LDP_CR_LSP);
					ldp_del_lspCB((char *)crlspCb,&crlspCb->crlspCb);
				}
			}
		}
	}
	else
	{
		crlspCb = MPLS_NULL;
	    //MPLS_CRFEC_SESSION_MSGID(session,lblAbort->lblMsgIdTlv.msgId,crlspCb);
		if(crlspCb != MPLS_NULL)
		{
			MPLS_REMOVE_FROM_SESSION_UP_LSP_LIST(session->lsp_up_cb_list,&(crlspCb->crlspCb))
			crlspCb->crlspCb.upSessionIndex = 0;
			dismode = 0;
			MPLS_SESSION_DISTRIBUT_MODE(session,dismode);
			if(dismode == DOWNSTREAMONDEMAND)
			{
				if(!((&crlspCb->crlspCb)->waitflag & 0x1))
				LspCBFsm(session,MPLS_LBLABORT_MSGTYPE,\
						lblAbort,LDP_CR_LSP,crlspCb,&crlspCb->crlspCb);
				return;
			}
			else
			{
				MPLS_DOWN_SESSION_CRLSP(crlspCb,downsession);
				if(downsession)
				{
					MPLS_REMOVE_FROM_SESSION_DOWN_LSP_LIST(downsession->lsp_down_cb_list,&(crlspCb->crlspCb))
				}
				dismode = 0;
				MPLS_SESSION_DISTRIBUT_MODE(session,dismode);
				if(dismode == DOWNSTREAMONDEMAND)
				{
					if(!((&crlspCb->crlspCb)->waitflag & 0x1))
					LspCBFsm(session,MPLS_LBLABORT_MSGTYPE,\
						lblAbort,LDP_CR_LSP,crlspCb,&crlspCb->crlspCb);
					return;
				}
				else
				{
					sendtoDownLblAbort(downsession,MPLS_NULL,crlspCb,LDP_CR_LSP);
					ldp_del_lspCB((char *)crlspCb,&crlspCb->crlspCb);
				}
			}
			return;
		}
		dismode = 0;
		MPLS_SESSION_DISTRIBUT_MODE(session,dismode);
		if(dismode != DOWNSTREAMONDEMAND)
		{
			/* for performance, fec search, use the fec element to search directly */
			for(us = 0; us < lblAbort->fecTlv.numberFecElements; us ++)
			{
				/* by hyh */
				preLen = lblAbort->fecTlv.fecElemTypes[0] == MPLS_HOSTADR_FEC ? \
					32: lblAbort->fecTlv.fecElArray[0].addressEl.preLen;
				MPLS_FEC_SEARCH(lblAbort->fecTlv.fecElArray[0].addressEl.address,preLen,fecCb)

			if(fecCb)
			{
				MPLS_FEC_UPCB_SESSION_MSGID(fecCb,upCb,session,
											lblAbort->lblMsgIdTlv.msgId);
				if(upCb != MPLS_NULL)
				{
					MPLS_REMOVE_FROM_SESSION_UP_LIST(session->up_cb_list,upCb)
					/* currently not judge the abort request msgid,directly send notify:LBLREQAB */
					if(upCb->state != ESTABLISHED)
					{	
                                                #if 0
                                                MPLS_SEND_NOTIFY(session,LBLREQAB,lblAbort->baseMsg.msgId, \
							lblAbort->baseMsg.flags.flags.msgType);
                                                #endif
						mpls_send_abnot(session,LBLREQAB,lblAbort->baseMsg.msgId, \
										lblAbort->baseMsg.flags.flags.msgType,
										upCb->msgid);
					}
					MPLS_UPCB_DELETE(fecCb,upCb);
				}
				MPLS_PEND_SESSION_DOWN(downsession,downCb,fecCb)
				if(downsession != MPLS_NULL)
				{
					dismode = 0;
					MPLS_SESSION_DISTRIBUT_MODE(session,dismode);
					if(dismode != DOWNSTREAMONDEMAND)
					{
						MPLS_REMOVE_FROM_SESSION_DOWN_LIST(session->down_cb_list,downCb)
						sendtoDownLblAbort(downsession,downCb,fecCb,LDP_HOP_LSP);
						MPLS_DOWNCB_DELETE(fecCb,downCb)
					}
					else
					{
						/* search lspcb first!!! hyh */
						
						/* currently not judge the abort request msgid,directly send notify:LBLREQAB */
						if(lspCb->status != ESTABLISHED)
						{	
                                                        #if 0
                                                        MPLS_SEND_NOTIFY(session,LBLREQAB,lblAbort->baseMsg.msgId, \
								lblAbort->baseMsg.flags.flags.msgType);
                                                        #endif
							mpls_send_abnot(session,LBLREQAB,lblAbort->baseMsg.msgId, \
											lblAbort->baseMsg.flags.flags.msgType,
											lspCb->upMsgid);
						}
						MPLS_REMOVE_FROM_SESSION_DOWN_LSP_LIST(downsession->lsp_down_cb_list,lspCb)
						if(!(lspCb->waitflag & 0x1))
						LspCBFsm(session,MPLS_LBLABORT_MSGTYPE, \
    				 	 	lblAbort,LDP_HOP_LSP,fecCb,lspCb);
    				 	return;
					}
				}
			}
			}
		}
		else
		{
			/* for performance, fec search, use the fec element to search directly */
			for(us = 0; us < lblAbort->fecTlv.numberFecElements; us ++)
			{
				/* by hyh */
				preLen = lblAbort->fecTlv.fecElemTypes[0] == MPLS_HOSTADR_FEC ? \
					32: lblAbort->fecTlv.fecElArray[0].addressEl.preLen;
				MPLS_FEC_SEARCH(lblAbort->fecTlv.fecElArray[0].addressEl.address,preLen,fecCb)

			if(fecCb)
			{
				msgid = lblAbort->lblMsgIdTlv.msgId;
				MPLS_FEC_LSPCB_UP_SESSION_MSGID(fecCb,lspCb,session,msgid);
				if(lspCb != MPLS_NULL)
				{
					/* currently not judge the abort request msgid,directly send notify:LBLREQAB */
					if(lspCb->status != ESTABLISHED)
					{	
                                                #if 0
                                                MPLS_SEND_NOTIFY(session,LBLREQAB,lblAbort->baseMsg.msgId, \
							lblAbort->baseMsg.flags.flags.msgType);
                                                #endif
                        printf("==== send  abort notify msg for fec %x to %x ====\n",fecCb->fec_key.mplsFecAddr,session->peerIpaddr);
                        DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_LSP,"==== send  abort notify msg for fec %x to %x ====\n",fecCb->fec_key.mplsFecAddr,session->peerIpaddr);
						mpls_send_abnot(session,LBLREQAB,lblAbort->baseMsg.msgId, \
										lblAbort->baseMsg.flags.flags.msgType,	\
										lspCb->upMsgid);
					}
						MPLS_REMOVE_FROM_SESSION_UP_LSP_LIST(session->lsp_up_cb_list,lspCb)	
					if(!(lspCb->waitflag & 0x1))
					LspCBFsm(session,MPLS_LBLABORT_MSGTYPE, \
    				 	 lblAbort,LDP_HOP_LSP,fecCb,lspCb);
				}
			}
			}
		}
	}
	return;
}

⌨️ 快捷键说明

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