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

📄 labelmap.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 *            , input message;
 *      Output      :   void
 *      Function    :   Label mapping process function
 *      Note        :   
 * wengqing 2003.1.16 if the lspcb searched is to be deleted,send release msg downstream      
 * huyonghong 2003.4.3 策略处理去掉
 * fengjun 2003.12.30  replace macro MPLS_CRFECCB_DELETE by func ldp_del_lspCB
 * 2004-1-6 lixia add for debug mpls
 * 2004-2-12 szh add for established mapping  process
/****************************************************************************/
unsigned short hoplspestab=0,crlspestab=0;
void FuncLblMap(mplsLdpSession_t * session, void * inputEvent)
{
	mplsLdpLblMapMsg_t 	* 	lblMapMsg = MPLS_NULL;
	mplsLdpSession_t    *   upsession = MPLS_NULL;
	mplsLdpCrLsp        *   crlspCB   = MPLS_NULL;
	mplsLdpFecEntry     *   fecCb     = MPLS_NULL;
	mplsLdpLspCB        *   lspCb     = MPLS_NULL;
	mplsLdpDownCB       *   downCb    = MPLS_NULL;
	mplsLdpUpCB       *     upCb      = MPLS_NULL;
	MPLS_BOOL               ret;
	unsigned short          dismode;
	unsigned long           msgId;
	unsigned char          exists;
	unsigned long           label;
    unsigned short			preLen;
    MPLS_BOOL            belong_to;
    unsigned short       loop;
    uchar           FecDelFlag=0;
	
	lblMapMsg = (mplsLdpLblMapMsg_t *)inputEvent;
	if(lblMapMsg->fecTlvExists == 0)
    {
	    MPLS_SEND_NOTIFY(session,MISSPARAMETER,lblMapMsg->baseMsg.msgId, \
				lblMapMsg->baseMsg.flags.flags.msgType);
	    return;
    }
	if(loopdetcetpro(MPLS_LBLMAP_MSGTYPE,lblMapMsg,session) == LDP_FALSE)
		return;
	if(lblMapMsg->fecTlv.wcElemExists == 1)
    {
    	/***************************************************/
    	/* send notification message, unsupported fec family
	    */
	    /***************************************************/
		MPLS_SEND_NOTIFY(session,MALFORMTLVVAL,lblMapMsg->baseMsg.msgId, \
					lblMapMsg->baseMsg.flags.flags.msgType);
	    return;
    }
	
	if(lblMapMsg->lblMsgIdTlvExists == 1)
	{
		msgId = lblMapMsg->lblMsgIdTlv.msgId;
		/*********************************************************************/
		/* for some reqest
		*/
		/*********************************************************************/
		if(lblMapMsg->lspidTlvExists == 1)
		{
		    MPLS_CRFECCB_SEARCH(lblMapMsg->lspidTlv.routerId, \
    		                    lblMapMsg->lspidTlv.localCrlspId,\
    		                    crlspCB);
			if(crlspCB == MPLS_NULL)
			{
					MPLS_CRFECCB_DELETE(lblMapMsg->lspidTlv.routerId, \
    		                    lblMapMsg->lspidTlv.localCrlspId,\
    		                    crlspCB);
		        /*************************************************************/
				/* release label
				*/
				/*************************************************************/
				mpls_release_label_map(session,lblMapMsg);
				return;
    	    }
		}
		else
		{
            MPLS_CRFEC_DOWN_SESSION_MSGID(session,msgId,crlspCB);
            if(crlspCB == MPLS_NULL && lblMapMsg->fecTlv.fecElemTypes[0] == MPLS_CRLSP_FEC)
			{
                ldp_del_lspCB((char *)crlspCB,&(crlspCB->crlspCb));
				/*************************************************************/
				/* release label
				*/
				/*************************************************************/
				mpls_release_label_map(session,lblMapMsg);
				return;
			}
        }
        if(crlspCB)
        {
			/*************************************************************/
			/* judge label type
			*/
			/*************************************************************/
			if(lblMapMsg->atmLblTlvExists == 1)
			{
				/* add by hyh for agilent test */
				if(ldp_atmlabeltlv_test(session,lblMapMsg) == LDP_FALSE)
		           	return;
                /* hyh add end */
   // byfengjun    rec_lblmap_tlvpro(session,lblMapMsg,crlspCB,&crlspCB->crlspCb,LDP_CR_LSP); /* hyh add */
				if(!((&crlspCB->crlspCb)->waitflag & 0x1))
				{
				    /* shizhaohui add 2004-2-9 对于在ESTABLISHED状态收到mapping进行特殊处理 */
				    if((&crlspCB->crlspCb)->status == ESTABLISHED)
				    {
				        crlspestab++;
				        printf("crlsp,ESTAB,rec mapp message.newvpi %d,newvci %d,oldvpi %d,oldvci %d!!",
				            lblMapMsg -> atmLblTlv.flags.flags.vpi,lblMapMsg -> atmLblTlv.vci,
				            crlspCB->crlspCb.downAtmLabel.vpi,crlspCB->crlspCb.downAtmLabel.vci);            
				        if((((crlspestab%10)-1)>=0)&&(((crlspestab%10)-1)<=9))
				        {
				          g_crspec_label[(crlspestab%10)-1].newvpi = lblMapMsg -> atmLblTlv.flags.flags.vpi;
				          g_crspec_label[(crlspestab%10)-1].newvci = lblMapMsg -> atmLblTlv.vci;
				          g_crspec_label[(crlspestab%10)-1].oldvpi = crlspCB->crlspCb.downAtmLabel.vpi;
				          g_crspec_label[(crlspestab%10)-1].oldvci = crlspCB->crlspCb.downAtmLabel.vci;
				        }  
					mpls_release_label_map(session,lblMapMsg);
					lblMapMsg -> atmLblTlv.flags.flags.vpi = crlspCB->crlspCb.downAtmLabel.vpi;
                    lblMapMsg -> atmLblTlv.vci = crlspCB->crlspCb.downAtmLabel.vci;      
					mpls_release_label_map(session,lblMapMsg);
					LspCBFsm(session,MPLS_LBLWITH_MSGTYPE, \
		    				    lblMapMsg,LDP_CR_LSP,crlspCB,&crlspCB->crlspCb);	
				   }
				   else
				   { 
				LspCBFsm(session,MPLS_LBLMAP_MSGTYPE, \
    				 lblMapMsg,LDP_CR_LSP,crlspCB,&crlspCB->crlspCb);
    				   }   
    				}      
    			else
    				mpls_release_label_map(session,lblMapMsg);
			}
			else if(lblMapMsg->genLblTlvExists == 1)
			{
				mpls_set_label_gen(crlspCB,lblMapMsg->genLblTlv.label,LDP_CR_LSP);
				upsession = MPLS_NULL;
				MPLS_CRFEC_UP_SESSION(crlspCB,upsession);
				if(upsession !=MPLS_NULL)
				{
					dismode = 0;
					MPLS_SESSION_DISTRIBUT_MODE(upsession,dismode);
					if(dismode == DOWNSTREAMONDEMAND)
					{
						if(!((&crlspCB->crlspCb)->waitflag & 0x1))
						LspCBFsm(session,MPLS_LBLMAP_MSGTYPE, \
    				 		lblMapMsg,LDP_CR_LSP,crlspCB,&crlspCB->crlspCb);
						return;
					}
					/* up stream DU mode */
					label = MPLS_HUNT_GEN_LABEL();
					sendtoUpMapping(upsession,&crlspCB->crlspCb,crlspCB,LDP_CR_LSP);
                    wait_crlspfeclbl_append(&(crlspCB->crlspCb),crlspCB,LDP_FWD_CLOSE);
					return;
				}
				printf("mpls_err_log");
			}
			else
			{
				/*************************************************************/
				/* send notification message; BAD Message Content
				*/
				/*************************************************************/
				MPLS_SEND_NOTIFY(session,MALFORMTLVVAL,lblMapMsg->baseMsg.msgId, \
					lblMapMsg->baseMsg.flags.flags.msgType);
			}			
			return;			
		}
		/* hop fec */
		/*************************************************************/
		/* judge label type
		*/
		/*************************************************************/
		if(lblMapMsg->atmLblTlvExists == 1)
		{
			/* add by hyh for agilent test */
			if(ldp_atmlabeltlv_test(session,lblMapMsg) == LDP_FALSE)
				return;
            /* hyh add end */
			
			/* by hyh */
			for(loop = 0 ; loop < lblMapMsg->fecTlv.numberFecElements; loop ++)
			{
				preLen = lblMapMsg->fecTlv.fecElemTypes[loop] == MPLS_HOSTADR_FEC ? \
							32: lblMapMsg->fecTlv.fecElArray[loop].addressEl.preLen;
				MPLS_FEC_SEARCH(lblMapMsg->fecTlv.fecElArray[loop].addressEl.address,preLen,fecCb)
				if(fecCb == MPLS_NULL)
				{
					/*************************************************************/
					/* release label
					*/
					/*************************************************************/
					#if 0
					mpls_release_label_map(session,lblMapMsg);
					#endif
					mpls_release_label_map_fec(session,lblMapMsg,loop);
					continue;
				}
				lspCb = MPLS_NULL;
				MPLS_FEC_LSPCB_DOWN_SESSION_MSGID(fecCb,lspCb,session,msgId)
				if(lspCb)
				{
     // rec_lblmap_tlvpro(session,lblMapMsg,fecCb,lspCb,LDP_HOP_LSP); /* add by fengjun */
					if(!(lspCb->waitflag & 0x1))
				     {/* shizhaohui add 2004-2-9 对于在ESTABLISHED状态收到mapping进行特殊处理 */
					    if(lspCb->status == ESTABLISHED)
					    {
					        hoplspestab++;
					        printf("hoplsp,ESTAB,rec mapp message.newvpi %d,newvci %d,oldvpi %d,oldvci %d!!",
				            lblMapMsg -> atmLblTlv.flags.flags.vpi,lblMapMsg -> atmLblTlv.vci,
				            lspCb->downAtmLabel.vpi,lspCb->downAtmLabel.vci);           
				            if((((hoplspestab%10)-1)>=0)&&(((hoplspestab%10)-1)<=9))
				            {
				              g_hopspec_label[(hoplspestab%10)-1].newvpi = lblMapMsg -> atmLblTlv.flags.flags.vpi;
				              g_hopspec_label[(hoplspestab%10)-1].newvci = lblMapMsg -> atmLblTlv.vci;
				              g_hopspec_label[(hoplspestab%10)-1].oldvpi = lspCb->downAtmLabel.vpi;
				              g_hopspec_label[(hoplspestab%10)-1].oldvci = lspCb->downAtmLabel.vci;
				            }          
					        mpls_release_label_map_fec(session,lblMapMsg,loop);
					        lblMapMsg -> atmLblTlv.flags.flags.vpi = lspCb->downAtmLabel.vpi;
                            lblMapMsg -> atmLblTlv.vci = lspCb->downAtmLabel.vci;    
					        mpls_release_label_map_fec(session,lblMapMsg,loop);
					        LspCBFsm(session,MPLS_LBLWITH_MSGTYPE, \
		    				    lblMapMsg,LDP_HOP_LSP,fecCb,lspCb);	
					    }
					    else
					{
					LspCBFsm(session,MPLS_LBLMAP_MSGTYPE, \
		    				 lblMapMsg,LDP_HOP_LSP,fecCb,lspCb);
		    	}
		    	             }
		    	else
		    	{
			    		mpls_release_label_map_fec(session,lblMapMsg,loop);	
		    		}
		    	}
		    	else
		    	{
		    		#if 0
					mpls_release_label_map(session,lblMapMsg);
					#endif
					mpls_release_label_map_fec(session,lblMapMsg,loop);
					continue;
		    	}
	    	}		
		}
		else if(lblMapMsg->genLblTlvExists == 1)
		{
			for(loop = 0 ; loop < lblMapMsg->fecTlv.numberFecElements; loop ++)
			{
				preLen = lblMapMsg->fecTlv.fecElemTypes[loop] == MPLS_HOSTADR_FEC ? \
							32: lblMapMsg->fecTlv.fecElArray[loop].addressEl.preLen;
				MPLS_FEC_SEARCH(lblMapMsg->fecTlv.fecElArray[loop].addressEl.address,preLen,fecCb)
				if(fecCb == MPLS_NULL)
				{
					/*************************************************************/
					/* release label
					*/
					/*************************************************************/
					#if 0
					mpls_release_label_map(session,lblMapMsg);
					#endif
					mpls_release_label_map_fec(session,lblMapMsg,loop);
					continue;
				}
				fecCb->owner  |= MPLS_OWNER_LDP;
				MPLS_FEC_DOWNCB_SESSION_MSGID(fecCb,downCb,session,msgId)
				if(downCb)
				{
					mpls_set_label_gen(downCb,lblMapMsg->genLblTlv.label,LDP_HOP_LSP);
					rec_lblmap_tlvpro(session,lblMapMsg,fecCb,downCb,LDP_HOP_LSP);
				}
				else
				{
					mpls_release_label_map_fec(session,lblMapMsg,loop);
					continue;
				}
			}
		}
		else
		{
			/*************************************************************/
			/* send notification message; BAD Message Content
			*/
			/*************************************************************/

⌨️ 快捷键说明

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