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

📄 ldplspfsm.c

📁 技术文件名称:MPLSv1.0软件模块测试规程
💻 C
📖 第 1 页 / 共 5 页
字号:
						LspCBVar->downAtmLabel.port = p_s_f->downAtmLabel.port;
						/* insert lspcb into new sb_list */
						sb_list = MPLS_NULL;
						MPLS_SB_SEARCH(LspCBVar->downAtmLabel.module,LspCBVar->downAtmLabel.port,sb_list);
						if(!sb_list)
						{
							MPLS_SB_CREATE(LspCBVar->downAtmLabel.module,LspCBVar->downAtmLabel.port,sb_list)
						}
						if(sb_list)
						{
							MPLS_INSERT_INTO_DOWN_LSP_LIST(sb_list->lsp_down_cb_list,LspCBVar,LspCBVar);
						}
					}
					
					LspCBVar->downAtmLabel.vpi = p_s_f->downAtmLabel.vpi;
					LspCBVar->downAtmLabel.vci = p_s_f->downAtmLabel.vci;
					/* create pvc ack success, Egress */
					p_s_f->refNum ++;
					LspCBVar->status = ESTABLISHED;
					LspCBVar->subStatus = IDLE;
					 if(LspCBVar->lspType == LDP_HOP_LSP)
                                            wait_lspfeclbl_append(LspCBVar,pEntry,LDP_FWD_CREATE);
                                    else
                                            CR_wait_lspfeclbl_append(LspCBVar,pEntry,LDP_FWD_CREATE);

                                   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);
 
				}
				return LDP_TRUE;
			}
			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)
				{
					LspCBVar->errorcode = EGRESS_MALLOCPSFFAIL;
					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;
				}
				MPLS_MEMSET(p_s_f,0,sizeof(mpls_ldpFecAggr));
				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->nodeType            = MPLS_NODE_EGRESS;
				
				if(pFecEntry->owner == MPLS_OWNER_POLICY ||
			      ((pFecEntry->owner &MPLS_OWNER_ROUTE)&&
			      (pFecEntry->pRes & MPLS_EGRESS_TO_POLICY)))
			    {
				   if(LspCBVar->downAtmLabel.module)
			            module = LspCBVar->downAtmLabel.module;
			        else
			            module = LspCBVar->downAtmLabel.port;
				    p_s_f->nexthop = module;
			    }
			    else
			    {
				    p_s_f->nexthop = 0xffffffff;
			    }
			    #ifdef __BGS10_MPLS_DEBUG
			    printf("destaddr:%x,nexthop:%x,psfdownmodule:%d,psfdownport:%d.",
			           pFecEntry->fec_key.mplsFecAddr,p_s_f->nexthop,
			           p_s_f->downAtmLabel.module,p_s_f->downAtmLabel.port);
			    #endif       
				p_s_f->attr.hopcount       = LspCBVar->pAttr.hopcount;
				p_s_f->attr.len            = LspCBVar->pAttr.len;
				if(p_s_f->attr.len > 0)
			 	{
                                      rtcode = ldp_pathvector_malloc(&p_s_f->attr,p_s_f->attr.len);
				}
		                if(rtcode == MPLS_TRUE)
				{
					p_s_f->index1 = LspCBVar->lspIndex;
					p_s_f->index2 = pFecEntry->fec_key.mplsLdpFecAddrLen;
					MPLS_MEMCPY(p_s_f->attr.pAttr,LspCBVar->pAttr.pAttr,p_s_f->attr.len);
					aggr_insert_tail(p_s_f);
				}
				else
				{
        			/* 2003.3.4 huyonghong directly delete p_s_f attribute */
        			LspCBVar->errorcode = EGRESS_MALLOCPATHFAIL;
        			if(p_s_f)
        				aggr_delete(p_s_f);

					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;
				}
			}
		}
		/************************************************************/
		/* wengqing add end
		*/
		/************************************************************/
		
		/*分配上游ATM标记*/
		/*2003-9-23 lixia mod for hunt label*/
	while (1)
	{ 
		if(ldp_get_atm_label(LspCBVar,FLAG_UP,1) == LDP_FALSE)
		{
			/* wengqing 2002.12.12, not process status = IDLE, 
			   here directly delete p_s_f attribute */
			LspCBVar->errorcode = EGRESS_UPLBLFAIL;   
			if(LspCBVar->lspType == LDP_HOP_LSP && aggr_enable != 0 && p_s_f)
				aggr_delete(p_s_f);
			DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_LSP,"====ProcFecInquireOk, 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);
	    	SndNotMsg(LspCBVar->upSessionIndex,NOLBLRESRC,LspCBVar->upMsgid,\
		        	    MPLS_LBLREQ_MSGTYPE);
			if(LspCBVar->waitflag & 0xe0)
      	      LspCBVar->waitflag |= 0x1;
      	    else  ldp_del_lspCB(pEntry,LspCBVar);
			return LDP_FALSE;
		}
			else
			{
				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 ("egress,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;
				}
			}
	}
		/*分配下游ATM标记*/
		/*2003-9-23 lixia mod for hunt label*/
	while (1)
	{ 
		if(ldp_get_atm_label(LspCBVar,FLAG_DOWN,0) == LDP_FALSE)
		{
			/* wengqing 2002.12.12, not process status = IDLE, 
			   here directly delete p_s_f attribute */
			LspCBVar->errorcode = EGRESS_DOWNLBLFAIL;   
			if(LspCBVar->lspType == LDP_HOP_LSP && aggr_enable != 0 && p_s_f)
				aggr_delete(p_s_f);
			DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_LSP,"==== ProcFecInquireOk down,Module %d,port %d,LABEL REQ IS FAIL ====\n",
			            LspCBVar->downAtmLabel.module,LspCBVar->downAtmLabel.port);
			printf("==== Module %d,port %d,LABEL REQ IS FAIL ====\n",
			            LspCBVar->downAtmLabel.module,LspCBVar->downAtmLabel.port);
	    	SndNotMsg(LspCBVar->upSessionIndex,NOLBLRESRC,LspCBVar->upMsgid,\
		        	    MPLS_LBLREQ_MSGTYPE);
			ldp_free_atm_label(pEntry,LspCBVar,FLAG_UP);
			if(LspCBVar->waitflag & 0xe0)
      	      LspCBVar->waitflag |= 0x1;
      	    else  ldp_del_lspCB(pEntry,LspCBVar);
			return LDP_FALSE;
		}
		else
		{
    		pvclabel.H_module  	 = LspCBVar->downAtmLabel.module;
   	 		pvclabel.H_port    	 = LspCBVar->downAtmLabel.port;
			pvclabel.H_vpi     	 = LspCBVar->downAtmLabel.vpi;
			pvclabel.H_vci     	 = LspCBVar->downAtmLabel.vci;
			if ((rel_pvc=mpls_match_in_relpvc_tab(&pvclabel,DOWN))==MPLS_NULL)    /* it is not in the unrelease queue,so use it*/
				break;
			else
			{
				#ifdef __BGS10_MPLS_DEBUG
							printf ("egress,DOWN,can't use this unrelease label module %d,port %d,vpi %d,vci %d\n ",pvclabel.H_module,pvclabel.H_port,pvclabel.H_vpi,pvclabel.H_vci);
				#endif			
				        rel_pvc->relpvc.reflag = rel_pvc->relpvc.reflag|0x02;		
			}
		}
	}
		#ifdef __BGS10_MPLS_DEBUG
		else
		{
			printf("====Module %d,port %d,LABEL REQ IS TRUE======\n",
             LspCBVar->downAtmLabel.module,LspCBVar->downAtmLabel.port);
        }     
        #endif
        /*请求建立PVC(发到缓冲队列),主状态切为RESPONSE_AWAITED,子状态切为CREATE_PVC_REQ_AWAITED*/
		LspCBVar->status = RESPONSE_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);

	}
	else
	{
		/*2.2.非egress:请求预留资源(子状态切为BANDWITH_REQ_AWAITED)*/
        LspCBVar->subStatus = BANDWITH_REQ_AWAITED;
        
            if(LspCBVar->lspType == LDP_HOP_LSP)
                      return       Xcbandwithreq(LspCBVar,pEntry);
          /*add by fengjun for guangzhou 
                return wait_xc_append(LspCBVar,pEntry,0x0);
            add by fengjun for guangzhou */
	    else
		return CR_wait_xc_append(LspCBVar,pEntry,0x0);
             
	}
	
} /*ProcFecInquireOk*/



short ProcBandwithAck(void *inputEvent)
{
	/*1.如果不成功,发notify,删除lspCB*/
	/*2.取到保存的request向下游节点发送*/
	/*3.主状态切为RESPONSE_AWAITED,
	  子状态切为IDLE*/
	STRUC_AD_MPLS_BANDWIDTH_ACK		*bandwithAck;
	mplsLdpFecEntry		*pFecEntry = NULL;
	mplsLdpCrLsp		*pCrEntry = NULL;
	mplsLdpLspCB 		*LspCBVar = NULL;
	unsigned char       lspType;
	char				*pEntry;
	mplsLdpSession_t    *downSession = MPLS_NULL;
	unsigned short      belong = MPLS_FALSE;
	mplsLdpNotifMsg_t   notify;
	mplsLdpDownCB       * downCB;
	mpls_sb_list        * sb_list;
	int			rtcode;
	unsigned long resend_time;
	
	bandwithAck	= (STRUC_AD_MPLS_BANDWIDTH_ACK *)inputEvent;
	#ifdef __BGS10_MPLS_DEBUG
	MPLS_ERR_LOG("===== ProcBandwithAck LsrAck %d,localLspId %d,IngressId %x,LspCBNo %x =====",
		bandwithAck->LsrAck,bandwithAck->localLspId,bandwithAck->IngressId,
		bandwithAck->LspCBNo);
	#endif
	lspType = LDP_LSPTYPE(bandwithAck->IngressId); 
	if(lspType == LDP_HOP_LSP)
	{
		pFecEntry = ldp_search_fecentry(bandwithAck->localLspId,
										bandwithAck->LspCBNo);
		if(pFecEntry == NULL)
		{
			/*请求释放资源*/
			if(bandwithAck->LsrAck == PVC_SUCCESS)
			{    
			    return NOLSPCB;
			}    
			return LDP_FALSE;
		}
		pEntry = (char *)pFecEntry;
		LspCBVar = ldp_search_lspcb_from_index(pFecEntry,bandwithAck->IngressId);
		if(LspCBVar == NULL)
		{
			/*请求释放资源*/
			if(bandwithAck->LsrAck == PVC_SUCCESS)
			{    
			    return NOLSPCB;
			}    
			return LDP_FALSE;
		}
		else if(LspCBVar->waitflag & 0x1)	/* 如果块存在,但已标上待删标志,则按已删处理 */
		{
			if(bandwithAck->LsrAck == PVC_SUCCESS)
    		{	
    		    return NOLSPCB;
    		}
			return LDP_FALSE;		    
		}

	}
	else if(lspType == LDP_CR_LSP)
	{
		pCrEntry = ldp_search_crentry_from_lspindex(bandwithAck->LspCBNo,bandwithAck->localLspId,bandwithAck->IngressId);
		if(pCrEntry == NULL)
		{
			/*请求释放资源*/
			if(bandwithAck->LsrAck == PVC_SUCCESS)
			{    
			    return NOLSPCB;
			}    
			return LDP_FALSE;
		}
		pEntry = (char *)pCrEntry;
		LspCBVar = &(pCrEntry->crlspCb);
		if(LspCBVar->waitflag & 0x1)
		{
			if(bandwithAck->LsrAck == PVC_SUCCESS)
    		{	
    		    return NOLSPCB;
    		}
			return LDP_FALSE;		    
		}
	}

	if(LspCBVar->subStatus != BANDWITH_REQ_AWAITED)
	{
		LspCBVar->errorcode = BWSTATERROR;
		return LDP_FALSE;
	}	
		
	/*取消跟C进程的定时器*/
	if(LspCBVar->timerid>0)
    {
	MPLS_CLEAR_TIMER(LspCBVar->timerid,ldptime_q,rtcode);
    	MPLS_ASSERT(rtcode == 1);
        if(rtcode)
    	{
	LspCBVar->timerid = 0;
        }
	}    
	/*1.如果预留不成功,发notify,删除lspCB*/
	if (bandwithAck->LsrAck != PVC_SUCCESS)
	{
	    printf("===== ProcBandwithAck LsrAck %d,localLspId %d,IngressId %x,LspCBNo %x =====",
		    bandwithAck->LsrAck,bandwithAck->localLspId,bandwithAck->IngressId,
		    bandwithAck->LspCBNo);
        LspCBVar->errorcode = BWPVCERROR;
        DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_CR,"===== ProcBandwithAck LsrAck %d,localLspId %x,IngressId %x,LspCBNo %x =====\n",
		    bandwithAck->LsrAck,bandwithAck->localLspId,bandwithAck->IngressId,
		    bandwithAck->LspCBNo);
        DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_CR,"====H_MODULE:%d,H_PORT:%d====\n",
				    bandwithAck->H_module,
				    bandwithAck->H_port);
	    DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_CR,"====L_MODULE:%d,L_PORT:%d====\n",
				    bandwithAck->L_module,

⌨️ 快捷键说明

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