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

📄 ldplspfsm.c

📁 技术文件名称:MPLSv1.0软件模块测试规程
💻 C
📖 第 1 页 / 共 5 页
字号:
							MPLS_INSERT_INTO_UP_LSP_LIST(sb_list->lsp_up_cb_list,LspCBVar,LspCBVar);
						}
					}
					else if(LspCBVar->nodeType == MPLS_NODE_INTERM)
					{
						/* do it as receiving notify */
						LspCBVar->errorcode = MAPSTAT2_ERROR1;
						wait_lsplblmsg_append(LspCBVar,pEntry,MPLS_NULL,MPLS_NULL,MPLS_LBLREL_MSGTYPE);
		      	    	MPLS_MEMSET(&(ldp_snd_msg.notifMsg), 0, sizeof(mplsLdpNotifMsg_t));
    		  	    	ldp_snd_msg.notifMsg.status.flags.flags.status = INTERNALERROR;
      	    			ProcDownNAK_23(pEntry,LspCBVar,&(ldp_snd_msg.notifMsg));
					}
				}
				else
				{
					/* do it as receiving notify */
					LspCBVar->errorcode = MAPSTAT2_ERROR2;
					wait_lsplblmsg_append(LspCBVar,pEntry,MPLS_NULL,MPLS_NULL,MPLS_LBLREL_MSGTYPE);
	      	    	MPLS_MEMSET(&(ldp_snd_msg.notifMsg), 0, sizeof(mplsLdpNotifMsg_t));
		  	    	ldp_snd_msg.notifMsg.status.flags.flags.status = INTERNALERROR;
  	    			ProcDownNAK_23(pEntry,LspCBVar,&(ldp_snd_msg.notifMsg));
				}
				return LDP_TRUE;
			}
		}
		/*add for nanjing 2003-11-20 fengjun szh */
		else
		{
			p_s_f = MPLS_NULL;
            MPLS_MEM_ALLOC(p_s_f,(mpls_ldpFecAggr *),\
					sizeof(mpls_ldpFecAggr),mem_mgr[IUMEM_LDP_FEC_AGGR]);
		    if(!p_s_f)
			{
				if(LspCBVar->nodeType != MPLS_NODE_INGRESS)
				{
                    LspCBVar->errorcode = MALLOCPSFFAIL;
				    SndNotMsg(LspCBVar->upSessionIndex,INTERNALERROR,LspCBVar->upMsgid,\
			        	    MPLS_LBLREQ_MSGTYPE);
			    }    	    
			    DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_LSP,"ProcLblMap_status2,malloc p_s_f fail !!!!!\n "); 
			    printf("malloc p_s_f fail !!!!! ");    	    
			     /* 向下游发送释放消息 */   	    
			    if(LspCBVar->nodeType != MPLS_NODE_EGRESS)
	      	    {
                   wait_lsplblmsg_append(LspCBVar,pEntry,MPLS_NULL,MPLS_NULL,MPLS_LBLREL_MSGTYPE);  
                } 
				if(LspCBVar->waitflag & 0xe0)
		        {
		        	LspCBVar->waitflag |= 0x1;
		        }
		        else
		        {
		        	ldp_del_lspCB(pEntry,LspCBVar);  
		        }    			
				return LDP_FALSE;
			}			
			MPLS_MEMSET(p_s_f,0,sizeof(mpls_ldpFecAggr));
			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;
		    pFecEntry =(mplsLdpFecEntry*) pEntry;
			
			/* 2003-11-25 lixia add *//*2003-12-25 lixia mod*/
			p_s_f->upAtmLabel.module   = LspCBVar->upAtmLabel.module;
			p_s_f->upAtmLabel.port     = LspCBVar->upAtmLabel.port;
			p_s_f->index1 = LspCBVar->lspIndex;
			p_s_f->index2 = pFecEntry->fec_key.mplsLdpFecAddrLen;
			aggr_insert_tail(p_s_f);
			

		}
		/* add for nanjing  end 2003-11-20 fengjun szh*/
	}
	/********************************************************************/
	/* wengqing add end
	*/
	/********************************************************************/

	/*分配上游ATM标记,对MPLS_NODE_INTERM_INGRESS或MPLS_NODE_INGRESS来说是上游内部ATM标记,不需要带协商范围*/
	if((LspCBVar->nodeType == MPLS_NODE_INGRESS)||(LspCBVar->nodeType == MPLS_NODE_INTERM_INGRESS))
		negotiate = 0;
	else /*对MPLS_NODE_INTERM或MPLS_NODE_INTERM_EGRESS来说是上游ATM标记,需要带协商范围*/
		negotiate = 1;
	/*2003-9-23 lixia mod for hunt label*/
	while(1)
	{  
	if(ldp_get_atm_label(LspCBVar,FLAG_UP,negotiate) == LDP_FALSE)
	{
        LspCBVar->errorcode = GETUPLBLFAIL;
        DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_LSP,"==== ProcLblMap_status2,Module %d,port %d,LABEL REQ IS FAIL ====\n",
		              LspCBVar->upAtmLabel.module,LspCBVar->upAtmLabel.port);
		printf("==== Module %d,port %d,LABEL REQ IS FAIL ====\n",
		              LspCBVar->upAtmLabel.module,LspCBVar->upAtmLabel.port);
	  	if(LspCBVar->nodeType!=MPLS_NODE_INGRESS)
	  	{
	    	SndNotMsg(LspCBVar->upSessionIndex,NOLBLRESRC,LspCBVar->upMsgid,\
	        	    MPLS_LBLREQ_MSGTYPE);
	  	}
		/*向下游发送RELEASE消息!!!! */
      	if(LspCBVar->nodeType != MPLS_NODE_EGRESS)
		{
		if((LspCBVar->lspType == LDP_CR_LSP)&&(LspCBVar->nodeType == MPLS_NODE_INGRESS))
                {
                     sendToFecCrlsp(pCrEntry,RESPONSE_TYPE,NOLBLRESRC);
                }	
                		
		if((LspCBVar->lspType) == LDP_HOP_LSP)
                     wait_lsplblmsg_append(LspCBVar,pEntry,MPLS_NULL,MPLS_NULL,MPLS_LBLREL_MSGTYPE);
	        else 
	             CR_wait_lsplblmsg_append(LspCBVar,pEntry,MPLS_NULL,MPLS_NULL,MPLS_LBLREL_MSGTYPE);
                }
		        /* for ingress and hop lsp,if get label fail,set timer to resend.hyh 02-12-25 */
        if((LspCBVar->lspType == LDP_HOP_LSP)&&(LspCBVar->nodeType == MPLS_NODE_INGRESS))
        {
        	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(p_s_f)   /* lixia mod 2003-11-25 */
        	    aggr_delete(p_s_f);
        }
        else
        {
	        /*请求释放预留的资源*/
      	      LspCBVar->waitflag |= 0x1;      	     
            if(LspCBVar->lspType == LDP_HOP_LSP)
            {    
                Xcbandwithrel(LspCBVar,pEntry);
                if(p_s_f)  /* lixia mod 2003-11-25 */
        		    aggr_delete(p_s_f);
            }
  /* add by fengjun for guangzhou 0906 
                wait_xc_append(LspCBVar,pEntry,0x2);
             /* add by fengjun for guangzhou 0906 */
	        else
	            CR_wait_xc_append(LspCBVar,pEntry,0x2);
		
        }

		return LDP_FALSE;
	}
	else       /* 2003-9-23 lixia add */
	{
		pvclabel.L_module    = LspCBVar->upAtmLabel.module;
		pvclabel.L_port      = LspCBVar->upAtmLabel.port;
		pvclabel.L_vpi       = LspCBVar->upAtmLabel.vpi;
		pvclabel.L_vci       = LspCBVar->upAtmLabel.vci;
		if ((rel_pvc=mpls_match_in_relpvc_tab(&pvclabel,UP))==MPLS_NULL)    /* it is not in the unrelease queue,so use it*/
		    break;
		else
			{
				#ifdef __BGS10_MPLS_DEBUG
					printf ("ingress,UP,can't use this unrelease label module %d,port %d,vpi %d,vci %d\n ",pvclabel.L_module,pvclabel.L_port,pvclabel.L_vpi,pvclabel.L_vci );
				#endif			
			    rel_pvc->relpvc.reflag = rel_pvc->relpvc.reflag |0x02;
			}
	  } 
	}  /* while end */ 
	if(LspCBVar->nodeType == MPLS_NODE_INTERM_EGRESS)
	{
		/*分配内部下游ATM标记*/
		if(ldp_get_atm_label(LspCBVar,FLAG_DOWN,0) == LDP_FALSE)
		{
			printf("==== Module %d,port %d,LABEL REQ IS FAIL ====\n",
			            LspCBVar->downAtmLabel.module,LspCBVar->downAtmLabel.port);
			LspCBVar ->errorcode = GETDOWNLBLFAIL;            
		  	if(LspCBVar->nodeType!=MPLS_NODE_INGRESS)
		  	{
		    	SndNotMsg(LspCBVar->upSessionIndex,NOLBLRESRC,LspCBVar->upMsgid,\
		        	    MPLS_LBLREQ_MSGTYPE);
		  	}
			/*向下游发送RELEASE消息!!!! */
			
			if((LspCBVar->lspType) == LDP_HOP_LSP)
		            wait_lsplblmsg_append(LspCBVar,pEntry,MPLS_NULL,MPLS_NULL,MPLS_LBLREL_MSGTYPE);
	                else 
	                    CR_wait_lsplblmsg_append(LspCBVar,pEntry,MPLS_NULL,MPLS_NULL,MPLS_LBLREL_MSGTYPE);
			
			/*释放分配的上游ATM标记*/
			ldp_free_atm_label(pEntry,LspCBVar,FLAG_UP);
            if((LspCBVar->lspType == LDP_CR_LSP)&&(LspCBVar->nodeType == MPLS_NODE_INGRESS))
            {
                LspCBVar -> errorcode = CRGETDOWNLBLFAIL;
                sendToFecCrlsp(pCrEntry,RESPONSE_TYPE,NOLBLRESRC);
            }		    			
			if(LspCBVar->waitflag & 0xe0)
      	      LspCBVar->waitflag |= 0x1;
      	    else  ldp_del_lspCB(pEntry,LspCBVar);
			return LDP_FALSE;
		}
	}
    
	/*3.请求建立PVC(子状态切为CREATE_PVC_REQ_AWAITED)*/
	LspCBVar->subStatus = CREATE_PVC_REQ_AWAITED;

	if(LspCBVar->lspType == LDP_HOP_LSP)
             return wait_xc_append(LspCBVar,pEntry,0x1);
        else
             return    CR_wait_xc_append(LspCBVar,pEntry,0x1);

} /*ProcLblMap_status2*/

short ProcLblAbort_status2(void *pEntry, mplsLdpLspCB *LspCBVar,char flag)
{
	/*1.向下游中继abort*/
	/*2.判断子状态*/
		/*1.1.对IDLE,请求释放预留的资源*/
		/*1.2.对CREATE_PVC_REQ_AWAITED,请求释放PVC*/
	
    mplsLdpLblAbortMsg_t  	*lblAbortMsg;
	mplsLdpCrLsp            *pCrEntry = MPLS_NULL;
	mplsLdpFecEntry		*pFecEntry = NULL;	
    
    pCrEntry = (mplsLdpCrLsp *)pEntry;
             
	/*判断子状态*/
	if(LspCBVar->subStatus == IDLE)
	{
	    /*向下游发abort*/
	    if(LspCBVar->nodeType != MPLS_NODE_EGRESS)
	    {
	    if((LspCBVar->lspType) == LDP_HOP_LSP)
        {
             pFecEntry = (mplsLdpFecEntry *)pEntry;
            printf("backbone send abort mess for fec %x to nexthop %x\n",pFecEntry->fec_key.mplsFecAddr,pFecEntry->nexthopAddr);
            DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_LSP,"backbone send abort mess for fec %x to next %x\n",pFecEntry->fec_key.mplsFecAddr,pFecEntry->nexthopAddr);
                 wait_lsplblmsg_append(LspCBVar,pEntry,MPLS_NULL,MPLS_NULL,MPLS_LBLABORT_MSGTYPE);
        }
	    else 
	        CR_wait_lsplblmsg_append(LspCBVar,pEntry,MPLS_NULL,MPLS_NULL,MPLS_LBLABORT_MSGTYPE);
        }
		/*对IDLE,请求释放预留的资源*/
		LspCBVar->waitflag |= 0x1;
               if(LspCBVar->lspType == LDP_HOP_LSP)
       	            
       	     return       Xcbandwithrel(LspCBVar,pEntry);
  /* add by fengjun for guangzhou 0906 
       	            return wait_xc_append(LspCBVar,pEntry,0x2);
             /* add by fengjun for guangzhou 0906 */
       	            
	       else
		{    
            if(LspCBVar->nodeType == MPLS_NODE_INGRESS)
            {
                /* if upstream_lost,response fec DELETE_PVC_TYPE,else RESPONSE_TYPE */
                if(flag == 0)
                {
                    LspCBVar->errorcode = ABORT2_DELETE1;
                    sendToFecCrlsp(pCrEntry,DELETE_PVC_TYPE,0);
                }    
                else
                {
                    LspCBVar->errorcode = ABORT2_DELETE2;
                    sendToFecCrlsp(pCrEntry,RESPONSE_TYPE,SETUPABORT);
                }
            }
		    return CR_wait_xc_append(LspCBVar,pEntry,0x2);
        }
		
	}
	else if(LspCBVar->subStatus == CREATE_PVC_REQ_AWAITED)
	{
    	    /*向下游发release*/
	    if(LspCBVar->nodeType != MPLS_NODE_EGRESS)
	    {
	    if((LspCBVar->lspType) == LDP_HOP_LSP)
                 wait_lsplblmsg_append(LspCBVar,pEntry,MPLS_NULL,MPLS_NULL,MPLS_LBLREL_MSGTYPE);
	    else 
	        CR_wait_lsplblmsg_append(LspCBVar,pEntry,MPLS_NULL,MPLS_NULL,MPLS_LBLREL_MSGTYPE);
	    }
	/*对CREATE_PVC_REQ_AWAITED,删除控制块*/
	    /*释放本地分配的标记 */
        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 = ABORT2_DELETE3;
                sendToFecCrlsp(pCrEntry,DELETE_PVC_TYPE,0);
            }    
            else
            {
                LspCBVar->errorcode = ABORT2_DELETE4;
                sendToFecCrlsp(pCrEntry,RESPONSE_TYPE,SETUPABORT);
    	    }
    	}
		if(ldp_free_atm_label(pEntry,LspCBVar,FLAG_UPDOWN)==LDP_FALSE)
		{
            LspCBVar->errorcode = ABORT2_FREELBLFAIL;
		    DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_LSP,"ProcLblAbort_status2,ldp_free_atm_label fail\n");
		    MPLS_ERR_LOG("ldp_free_atm_label fail");
        }
		if(LspCBVar->waitflag & 0xe0)
        {
        	LspCBVar->waitflag |= 0x1;
        }
        else
        {
        	ldp_del_lspCB(pEntry,LspCBVar);  
        }
		return LDP_TRUE;	
	}
				
} /*ProcLblAbort_status2*/

short ProcLblWith_2(void *pEntry, mplsLdpLspCB *LspCBVar)
{
	int 		rtcode;
 	mplsLdpCrLsp            *pCrEntry = MPLS_NULL;
	unsigned long resend_time;
	/*对非egress,执行:
	/*1.请求释放预留的资源(子状态切为RELEASE_BANDWITH_AWAITED)*/
	/*2.向下游节点发release*/
    pCrEntry = (mplsLdpCrLsp *)pEntry;

	if(LspCBVar->subStatus != CREATE_PVC_REQ_AWAITED)
		return LDP_FALSE;

    /*释放本地分配的标记*/
	if(ldp_free_atm_label(pEntry,LspCBVar,FLAG_UPDOWN)==LDP_FALSE)
	{
        LspCBVar->errorcode = WITHDR2_FREELBLFAIL;
        DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_LSP,"ProcLblWith_2,ldp_free_atm_label fail\n");	
		MPLS_ERR_LOG("ldp_free_atm_label fail");
    }

	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;

                if(LspCBVar->lspType == LDP_HOP_LSP)
                     wait_xc_append(LspCBVar,pEntry,0x3);
                else
                     CR_wait_xc_append(LspCBVar,pEntry,0x3);

        /* 2004-1-7 lixia add */             
        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) && \
		

⌨️ 快捷键说明

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