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

📄 ldplspfsm.c

📁 技术文件名称:MPLSv1.0软件模块测试规程
💻 C
📖 第 1 页 / 共 5 页
字号:
				    bandwithAck->L_port);
        if(LspCBVar->lspType == LDP_CR_LSP)
        {
    	    if(LspCBVar->nodeType == MPLS_NODE_INGRESS)
      	    {
                sendToFecCrlsp(pCrEntry,RESPONSE_TYPE,RESRCUNAVA);          	
          	}
          	else
	  	    {
	        	SndNotMsg(LspCBVar->upSessionIndex, RESRCUNAVA,LspCBVar->upMsgid,
	        	            MPLS_LBLREQ_MSGTYPE);
            }	            
      	    if(LspCBVar->waitflag & 0xe0)
      	      LspCBVar->waitflag |= 0x1;
      	    else  ldp_del_lspCB(pEntry,LspCBVar);
      	}
        else
        {
    	    if((LspCBVar->nodeType == MPLS_NODE_INGRESS)||
    	        (LspCBVar->nodeType == MPLS_NODE_INTERM_INGRESS))
	      	{
	          	/* bandwidth reserve fail, delete from UP SB list */
        		sb_list = MPLS_NULL;
    	        MPLS_SB_SEARCH(LspCBVar->upAtmLabel.module,\
    	                    LspCBVar->upAtmLabel.port,sb_list);
        		if(!sb_list)
        		{
        			MPLS_REMOVE_FROM_SESSION_UP_LSP_LIST(g_up_lsp_list,LspCBVar);
        		}
        		else
        		{
        		    MPLS_REMOVE_FROM_SESSION_UP_LSP_LIST_A(sb_list->lsp_up_cb_list,LspCBVar);
        		    if(!(sb_list->lsp_down_cb_list.first ||sb_list->lsp_up_cb_list.first))
        		        MPLS_SB_DELETE(LspCBVar->upAtmLabel.module,\
    	                    LspCBVar->upAtmLabel.port,sb_list)
        		}
	          		/* INGRESS: resend request */
	      		LspCBVar->resend = 1;
                        resend_time = ldp_get_random(MPLS_RANDOM_TIME_RANGE,abort_time);
			MPLS_SET_TIMER(resend_time,(void *)ldp_req_resend,LspCBVar,ldptime_q,LspCBVar->timerid);  /* lixia mod 2003-11-6 */
			}
          	else   
      	    {
            	SndNotMsg(LspCBVar->upSessionIndex, INTERNALERROR,LspCBVar->upMsgid,
            	            MPLS_LBLREQ_MSGTYPE);
          		if(LspCBVar->waitflag & 0xe0)
		        {
		        	LspCBVar->waitflag |= 0x1;
		        }
		        else
		        {
		        	ldp_del_lspCB(pEntry,LspCBVar);  
		        }            
          	}
    	}	
        return LDP_FALSE;
	}   

	/*主状态切为RESPONSE_AWAITED,
	  子状态切为IDLE*/
	LspCBVar->status    = RESPONSE_AWAITED;
	LspCBVar->subStatus = IDLE;

	/* MPLS_NODE_INGRESS:置request重发定时器 */
	if(((LspCBVar->nodeType == MPLS_NODE_INGRESS)&&(LspCBVar->lspType == LDP_HOP_LSP))||
	    ((LspCBVar->nodeType == MPLS_NODE_INTERM_INGRESS)&&(LspCBVar->lspType == LDP_HOP_LSP)))
	{
		LspCBVar->resend = 1;
		#ifdef __BGS10_MPLS_DEBUG
		MPLS_ERR_LOG("======== set timer ldp_req_timout =========");
        #endif
        resend_time = ldp_get_random(MPLS_RANDOM_TIME_RANGE,abort_time);
	MPLS_SET_TIMER(resend_time,(void *)ldp_req_timout,LspCBVar,ldptime_q,LspCBVar->timerid);  /* lixia mod 2003-11-6 */

	}
	if(LspCBVar->nodeType == MPLS_NODE_INTERM_EGRESS)
	{
		MPLS_NEXTHOP_SESSION_SEARCH(pFecEntry->nexthopAddr,downSession);
		if(downSession)
		{
			belong = MPLS_FALSE;
			MPLS_NEXTHOP_SESSION_DOWN(downSession,pFecEntry,belong);
			if(belong == MPLS_TRUE)
			{
				LspCBFsm(MPLS_NULL,MPLS_LBLMAP_MSGTYPE,\
						 MPLS_NULL,LDP_HOP_LSP,pFecEntry,LspCBVar);
			}
		}
		else
		{
			LspCBVar->errorcode = NODOWNSESSION;
			MPLS_ERR_LOG("fatal error, MPLS_NODE_INTERM_EGRESS no down session");
			notify.status.flags.flags.status = NOROUTE;
			notify.status.msgType = MPLS_LBLREQ_MSGTYPE;
			LspCBFsm(MPLS_NULL,LDP_DOWNSTREAM_NAK,\
						 &notify,LDP_HOP_LSP,pFecEntry,LspCBVar);
		}
	}
	else
	{
		/*向下游节点发送request*/
		if((LspCBVar->lspType) == LDP_HOP_LSP)
	            wait_lsplblmsg_append(LspCBVar,pEntry,MPLS_NULL,MPLS_NULL,MPLS_LBLREQ_MSGTYPE);
	        else 
	            CR_wait_lsplblmsg_append(LspCBVar,pEntry,MPLS_NULL,MPLS_NULL,MPLS_LBLREQ_MSGTYPE);
	}

	return LDP_TRUE;	
	
} /*ProcBandwithAck*/

short ProcLblAbort_status1(void *pEntry, mplsLdpLspCB *LspCBVar,char flag)
{
    mplsLdpCrLsp        *pCrEntry = MPLS_NULL;
    pCrEntry = (mplsLdpCrLsp *)pEntry;
    if((LspCBVar->lspType == LDP_CR_LSP)&&(LspCBVar->nodeType == MPLS_NODE_INGRESS))
    {
       /* sendToFecCrlsp(pCrEntry,DELETE_PVC_TYPE,0);*/
        /* if upstream_lost,response fec DELETE_PVC_TYPE,else RESPONSE_TYPE */
        if(flag == 0)
        {
            LspCBVar->errorcode = ABORT1_DELETE1;
        sendToFecCrlsp(pCrEntry,DELETE_PVC_TYPE,0);
        }    
        else
        {
            LspCBVar->errorcode = ABORT1_DELETE2;
            sendToFecCrlsp(pCrEntry,RESPONSE_TYPE,SETUPABORT);
        }
    }
	if(LspCBVar->waitflag & 0xe0)
      	      LspCBVar->waitflag |= 0x1;
    else  ldp_del_lspCB(pEntry,LspCBVar);
	return LDP_TRUE;
	
} /*ProcLblAbort_status1*/

/* for ingress and hop lsp,if get label fail,set timer to resend.hyh 02-12-25 */
/*2003.1.28 Huyonghong 对聚合,判断上游模块和端口,如果不相同,更新到同一模块和端口上*/
short ProcLblMap_status2(void *pEntry, mplsLdpLspCB *LspCBVar, void * inputEvent)
{
	/*1.将mapping带的label保存到lspCB*/
	/*2.分配上游标记*/
	/*3.请求建立PVC(子状态切为CREATE_PVC_REQ_AWAITED)*/
    
    mplsLdpLblMapMsg_t 		*lblMapMsg;
	mplsLdpCrLsp			*pCrEntry = NULL;	
	mplsLdpFecEntry		*pFecEntry = NULL;	
	char                     negotiate;
	int						 rtcode;
	mpls_sb_list            * sb_list;
	STRUC_MPLS_AD_RLSPVC_REQ  pvclabel;
	release_pvc_tab_t   *rel_pvc = MPLS_NULL;
	unsigned long  resend_time;
	
    lblMapMsg = (mplsLdpLblMapMsg_t *)inputEvent;
    pCrEntry = (mplsLdpCrLsp *)pEntry;

    MPLS_MEMSET(&pvclabel, 0, sizeof(STRUC_MPLS_AD_RLSPVC_REQ));
    p_s_f = MPLS_NULL;   /*2004-5-11 lixia mod for label req fail*/

	/* MPLS_NODE_INGRESS取消request重发定时器 */
	if((LspCBVar->nodeType == MPLS_NODE_INGRESS)&&(LspCBVar->lspType == LDP_HOP_LSP))
	{
		if(LspCBVar->timerid>0)
        {
		MPLS_CLEAR_TIMER(LspCBVar->timerid,ldptime_q,rtcode);
    		MPLS_ASSERT(rtcode == 1);
    		if(rtcode)
    		{
		LspCBVar->timerid = 0;
    		}
		}
		LspCBVar->resend  = 0;
	}
	/*将mapping带的下游label保存到lspCB*/
	if((LspCBVar->nodeType == MPLS_NODE_INGRESS)||
		(LspCBVar->nodeType == MPLS_NODE_INTERM)||
		(LspCBVar->nodeType == MPLS_NODE_INTERM_INGRESS))
	{
	    if (lblMapMsg->atmLblTlvExists == 1)
	    {
	        LspCBVar->downAtmLabel.vpi  = (unsigned short)(lblMapMsg->atmLblTlv.flags.flags.vpi);
	        LspCBVar->downAtmLabel.vci  = lblMapMsg->atmLblTlv.vci;
		}
	}
        	
	/********************************************************************/
	/* wengqing add
	*/
	/********************************************************************/
	if(LspCBVar->lspType == LDP_HOP_LSP)
	{
		p_s_f = MPLS_NULL;
		for(p_s_f = aggr_body.first; p_s_f; p_s_f = p_s_f->next)
		{
			if( /*
				(p_s_f->upAtmLabel.module == LspCBVar->upAtmLabel.module)     && \
			    (p_s_f->upAtmLabel.port   == LspCBVar->upAtmLabel.port  )     && \
			    */
			    (p_s_f->downAtmLabel.module == LspCBVar->downAtmLabel.module) && \
			    (p_s_f->downAtmLabel.port   == LspCBVar->downAtmLabel.port  ) && \
			    (p_s_f->downAtmLabel.vpi == LspCBVar->downAtmLabel.vpi)       && \
			    (p_s_f->downAtmLabel.vci   == LspCBVar->downAtmLabel.vci  ) 
			    /*
			    (p_s_f->nodeType          == LspCBVar->nodeType)
			    */
			    )
			    break;
		}
		if(p_s_f)
		{
			/*add for nanjing 2003-11-20 fengjun szh */
			if(p_s_f->upAtmLabel.vpi == 0 && p_s_f->upAtmLabel.vci == 0)
			{
			    LspCBVar->errorcode = CRPVCNOTSUCESS;
			    DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_LSP,"vpi,vci is 0, the first pvc not established !!!!!\n");
			    printf("vpi,vci is 0, the first pvc not established !!!!! \n");
			    /* 向上游发送notify消息*/
				if (LspCBVar->nodeType != MPLS_NODE_INGRESS)
				{
				    SndNotMsg(LspCBVar->upSessionIndex,INTERNALERROR,LspCBVar->upMsgid,\
			        	    MPLS_LBLREQ_MSGTYPE);
			        
			    }
			    /* 向下游发送释放消息 */    	   
			    if(LspCBVar->nodeType != MPLS_NODE_EGRESS)
	      	    {
                   wait_lsplblmsg_append(LspCBVar,pEntry,MPLS_NULL,MPLS_NULL,MPLS_LBLREL_MSGTYPE);  
                }
                if(LspCBVar->nodeType == MPLS_NODE_INGRESS && LspCBVar->lspType == LDP_HOP_LSP)
                {
                    LspCBVar->status = IDLE;
	                LspCBVar->subStatus = IDLE;
    		        LspCBVar->resend = 1;
    	            LspCBVar->upAtmLabel.vpi = 0;  /*2003-10-21 lixia add for ingress node */
	                LspCBVar->upAtmLabel.vci = 0;
	                LspCBVar->downAtmLabel.vpi = 0;
	                LspCBVar->downAtmLabel.vci = 0;
    		
            		/* pvc create fail, delete from UP SB list */
    	        	sb_list = MPLS_NULL;
	                MPLS_SB_SEARCH(LspCBVar->upAtmLabel.module,\
	                               LspCBVar->upAtmLabel.port,sb_list);
    		        if(!sb_list)
    		        {
    			        MPLS_REMOVE_FROM_SESSION_UP_LSP_LIST(g_up_lsp_list,LspCBVar);
    		        }
    		        else
    		        {
    		            MPLS_REMOVE_FROM_SESSION_UP_LSP_LIST_A(sb_list->lsp_up_cb_list,LspCBVar);
    		            if(!(sb_list->lsp_down_cb_list.first ||sb_list->lsp_up_cb_list.first))
    		                 MPLS_SB_DELETE(LspCBVar->upAtmLabel.module,\
	                         LspCBVar->upAtmLabel.port,sb_list)
    		        }
    		        resend_time = ldp_get_random(MPLS_RANDOM_TIME_RANGE,abort_time);
    		        MPLS_SET_TIMER(resend_time,(void *)ldp_req_resend,LspCBVar,ldptime_q,LspCBVar->timerid);    /* lixia mod 2003-11-6 */       
                }
                else
                {		    			
      	            if(LspCBVar->waitflag & 0xe0)
      	                LspCBVar->waitflag |= 0x1;
      	            else  ldp_del_lspCB(pEntry,LspCBVar);
                }
      	        return LDP_FALSE;
			}
			/*add for nanjing end 2003-11-20 fengjun szh */
			
			if((p_s_f->upAtmLabel.module == LspCBVar->upAtmLabel.module)     && \
			    (p_s_f->upAtmLabel.port   == LspCBVar->upAtmLabel.port)     && \
			    (p_s_f->nodeType          == LspCBVar->nodeType))
			{
				LspCBVar->downAtmLabel.vpi  = p_s_f->downAtmLabel.vpi;
		        LspCBVar->downAtmLabel.vci  = p_s_f->downAtmLabel.vci;
		        LspCBVar->upAtmLabel.vpi  = p_s_f->upAtmLabel.vpi;
		        LspCBVar->upAtmLabel.vci  = p_s_f->upAtmLabel.vci;
		        p_s_f->refNum ++;
				LspCBVar->status = ESTABLISHED;
				LspCBVar->subStatus = IDLE;
				if(LspCBVar->nodeType == MPLS_NODE_INGRESS)
				{
/*					if((LspCBVar->upAtmLabel.module != p_s_f->upAtmLabel.module) || \
					  (LspCBVar->upAtmLabel.port != p_s_f->upAtmLabel.port))
					{
						LspCBVar->upAtmLabel.module = p_s_f->upAtmLabel.module;
						LspCBVar->upAtmLabel.port = p_s_f->upAtmLabel.port;
					}
					if(LspCBVar->lspType == LDP_HOP_LSP)*/
                                            wait_lspfeclbl_append(LspCBVar,pEntry,LDP_FWD_CREATE);
/*                    else
                                            CR_wait_lspfeclbl_append(LspCBVar,pEntry,LDP_FWD_CREATE);
*/
				}
				else
                                {
//                    if((LspCBVar->lspType) == LDP_HOP_LSP)
				wait_lsplblmsg_append(LspCBVar,pEntry,MPLS_NULL,MPLS_NULL,MPLS_LBLMAP_MSGTYPE);
//	                else 
//	                    CR_wait_lsplblmsg_append(LspCBVar,pEntry,MPLS_NULL,MPLS_NULL,MPLS_LBLMAP_MSGTYPE);
                                }
	/* add by fengjun for guangzhou 0906 ?*/
				
				Xcbandwithrel(LspCBVar,pEntry);
  /* add by fengjun for guangzhou 0906 
				wait_xc_append(LspCBVar,pEntry,0x2);
             /* add by fengjun for guangzhou 0906 */
				return LDP_TRUE;
		}
			else
			{
				
				if(p_s_f->nodeType == LspCBVar->nodeType )
				{
					/* Ingress adjust lspCb SB no. */
					if(LspCBVar->nodeType == MPLS_NODE_INGRESS )
					{
						/* delete lspcb from old sb_list */
						sb_list = MPLS_NULL;
		    	        MPLS_SB_SEARCH(LspCBVar->upAtmLabel.module,\
		    	                    LspCBVar->upAtmLabel.port,sb_list);
		        		if(!sb_list)
		        		{
		        			MPLS_REMOVE_FROM_SESSION_UP_LSP_LIST(g_up_lsp_list,LspCBVar);
		        		}
		        		else
		        		{
		        		    MPLS_REMOVE_FROM_SESSION_UP_LSP_LIST_A(sb_list->lsp_up_cb_list,LspCBVar);
		        		    if(!(sb_list->lsp_down_cb_list.first ||sb_list->lsp_up_cb_list.first))
		        		        MPLS_SB_DELETE(LspCBVar->upAtmLabel.module,\
		    	                    LspCBVar->upAtmLabel.port,sb_list)
	}
		        		/* refresh lspcb */
		        		LspCBVar->upAtmLabel.module = p_s_f->upAtmLabel.module;
						LspCBVar->upAtmLabel.port = p_s_f->upAtmLabel.port;
		    	        LspCBVar->upAtmLabel.vpi  = p_s_f->upAtmLabel.vpi;
        		        LspCBVar->upAtmLabel.vci  = p_s_f->upAtmLabel.vci;
                        p_s_f->refNum ++;
		    			LspCBVar->status = ESTABLISHED;
         				LspCBVar->subStatus = IDLE;
						wait_lspfeclbl_append(LspCBVar,pEntry,LDP_FWD_CREATE);
						/* insert lspcb into new sb_list */
						sb_list = MPLS_NULL;
						MPLS_SB_SEARCH(LspCBVar->upAtmLabel.module,LspCBVar->upAtmLabel.port,sb_list);
						if(!sb_list)
						{
							MPLS_SB_CREATE(LspCBVar->upAtmLabel.module,LspCBVar->upAtmLabel.port,sb_list)
						}
						if(sb_list)
						{

⌨️ 快捷键说明

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