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

📄 ldpfunc.c

📁 技术文件名称:MPLSv1.0软件模块测试规程
💻 C
📖 第 1 页 / 共 5 页
字号:
    	else
    	{
    	    LspCBVar->downAtmLabel.module = fecMsg->Fec.sbModule;
		    LspCBVar->downAtmLabel.port   = fecMsg->Fec.sbPort;		
    	}
    	return LDP_TRUE;			
	}

	/*取到上下游业务板相关接口,填到LspCB中*/
	if((LspCBVar->nodeType == MPLS_NODE_INTERM_INGRESS)||(LspCBVar->nodeType == MPLS_NODE_INGRESS))
	{
		LspCBVar->upAtmLabel.module = fecMsg->Fec.sbModule;
		LspCBVar->upAtmLabel.port   = fecMsg->Fec.sbPort;
	}
	else if((LspCBVar->nodeType == MPLS_NODE_INTERM_EGRESS)||(LspCBVar->nodeType == MPLS_NODE_EGRESS))
	{
		LspCBVar->downAtmLabel.module = fecMsg->Fec.sbModule;
		LspCBVar->downAtmLabel.port   = fecMsg->Fec.sbPort;		
	}
	
  	return LDP_TRUE;

}
/* wengqing */
/* wengqing delete if 2002/12/2 */
/* 2003-11-25 lixia mod for dele aggrate body */
/* 2004-5-25 fengjun mod condition for p_s_f->nexthop  */
void ldp_del_lspCB(char *pEntry,mplsLdpLspCB *LspCBVar)
{
	mplsLdpFecEntry		*pFecEntry = MPLS_NULL;
	mplsLdpCrLsp		*pCrEntry;
	mplsLdpLspCB 		*pLspCBtemp;
	mplsLdpSession_t    *ses;
	mpls_sb_list        * sb_list;
	int rtcode;
	unsigned long       nexthop;
	
	/*如果还有定时器,删除定时器*/
	if(LspCBVar->timerid > 0)
	{
		MPLS_CLEAR_TIMER(LspCBVar->timerid,ldptime_q,rtcode);
	    MPLS_ASSERT(rtcode == 1);
	    if(rtcode)
	    {
	        LspCBVar->timerid = 0;
	    }    
	}    
	
	if(LspCBVar->lspType == LDP_CR_LSP)
	{
		pCrEntry = (mplsLdpCrLsp *)pEntry;
		
		ses = MPLS_NULL;
/*
		if(LspCBVar->up_lsp_session_list.prev || LspCBVar->up_lsp_session_list.next)
		{
*/
		    if(LspCBVar->nodeType != MPLS_NODE_INGRESS)
		    {
    			MPLS_INDEX_TO_SESSION(ses,LspCBVar->upSessionIndex)
    			if(ses)
    			{
    				MPLS_REMOVE_FROM_SESSION_UP_LSP_LIST(ses->lsp_up_cb_list,LspCBVar)
    			}
    			else
    			{
    				MPLS_REMOVE_FROM_SESSION_UP_LSP_LIST(g_up_lsp_list,LspCBVar)
    			}
    		}
    		else
    		{
    		    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)
        		}
    		}
/*
		}
*/
		ses = MPLS_NULL;
/*
		if(LspCBVar->down_lsp_session_list.prev || LspCBVar->down_lsp_session_list.next)
		{
*/
		    if(LspCBVar->nodeType != MPLS_NODE_EGRESS)
		    {
    			MPLS_INDEX_TO_SESSION(ses,LspCBVar->downSessionIndex)
    			if(ses)
    			{
    				MPLS_REMOVE_FROM_SESSION_DOWN_LSP_LIST(ses->lsp_down_cb_list,LspCBVar)
    			}
    			else
    			{
    				MPLS_REMOVE_FROM_SESSION_DOWN_LSP_LIST(g_down_lsp_list,LspCBVar)
    			}
    		}
    		else
    		{
    		    sb_list = MPLS_NULL;
		        MPLS_SB_SEARCH(LspCBVar->downAtmLabel.module,\
		                    LspCBVar->downAtmLabel.port,sb_list);
        		if(!sb_list)
        		{
        			MPLS_REMOVE_FROM_SESSION_DOWN_LSP_LIST(g_down_lsp_list,LspCBVar)
        		}
        		else
        		{
        		    MPLS_REMOVE_FROM_SESSION_DOWN_LSP_LIST_A(sb_list->lsp_down_cb_list,LspCBVar)
        		    if(!(sb_list->lsp_down_cb_list.first ||sb_list->lsp_up_cb_list.first))
        		        MPLS_SB_DELETE(LspCBVar->downAtmLabel.module,\
		                    LspCBVar->downAtmLabel.port,sb_list)
        		}
    		}
/*
		}
*/
    /* 释放为path vector分配的空间 hyh 2003.3.3 */ 
    if(LspCBVar->pAttr.pAttr != MPLS_NULL)
    {
        ldp_pathvector_free(&(LspCBVar->pAttr));
    }		
	
		MPLS_CRFECCB_DELETE(pCrEntry->crfec_key.ingressid,	\
							pCrEntry->crfec_key.locallspid, \
							pCrEntry)
		return;
	}
	else
	{
		pFecEntry = (mplsLdpFecEntry *)pEntry;
		ses = MPLS_NULL;
/*
		if(LspCBVar->up_lsp_session_list.prev || LspCBVar->up_lsp_session_list.next)
		{
*/
		    if(LspCBVar->nodeType != MPLS_NODE_INGRESS)
		    {
    			MPLS_INDEX_TO_SESSION(ses,LspCBVar->upSessionIndex)
    			if(ses)
    			{
    				MPLS_REMOVE_FROM_SESSION_UP_LSP_LIST(ses->lsp_up_cb_list,LspCBVar)
    			}
    			else
    			{
    				MPLS_REMOVE_FROM_SESSION_UP_LSP_LIST(g_up_lsp_list,LspCBVar)
    			}
    		}
    		else
    		{
    		    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)
        		}
    		}
/*
		}
*/
		ses = MPLS_NULL;
/*
		if(LspCBVar->down_lsp_session_list.prev || LspCBVar->down_lsp_session_list.next)
		{
*/
		    if(LspCBVar->nodeType != MPLS_NODE_EGRESS)
		    {
    			MPLS_INDEX_TO_SESSION(ses,LspCBVar->downSessionIndex)
    			if(ses)
    			{
    				MPLS_REMOVE_FROM_SESSION_DOWN_LSP_LIST(ses->lsp_down_cb_list,LspCBVar)
    			}
    			else
    			{
    				MPLS_REMOVE_FROM_SESSION_DOWN_LSP_LIST(g_down_lsp_list,LspCBVar)
    			}
    		}
    		else
    		{
    		    sb_list = MPLS_NULL;
		        MPLS_SB_SEARCH(LspCBVar->downAtmLabel.module,\
		                    LspCBVar->downAtmLabel.port,sb_list);
        		if(!sb_list)
        		{
        			MPLS_REMOVE_FROM_SESSION_DOWN_LSP_LIST(g_down_lsp_list,LspCBVar)
        		}
        		else
        		{
        		    MPLS_REMOVE_FROM_SESSION_DOWN_LSP_LIST_A(sb_list->lsp_down_cb_list,LspCBVar)
        		    if(!(sb_list->lsp_down_cb_list.first ||sb_list->lsp_up_cb_list.first))
        		        MPLS_SB_DELETE(LspCBVar->downAtmLabel.module,\
		                    LspCBVar->downAtmLabel.port,sb_list)
        		}
    		}
/*
		}
*/
		#if 1
        /* not create pvc,please delete aggr_body *//*2003-11-25 lixia mod condition for Ingress and Interm node */
        if((LspCBVar->nodeType == MPLS_NODE_EGRESS)&&(LspCBVar->status == RESPONSE_AWAITED)&&(LspCBVar->subStatus == CREATE_PVC_REQ_AWAITED))
        {
           if(pFecEntry->owner == MPLS_OWNER_POLICY ||
			      ((pFecEntry->owner &MPLS_OWNER_ROUTE)&&
			      (pFecEntry->pRes & MPLS_EGRESS_TO_POLICY)))
			    {
			        if(LspCBVar->downAtmLabel.module)
			            nexthop = LspCBVar->downAtmLabel.module;
			        else
			            nexthop = LspCBVar->downAtmLabel.port;
			    }
			    else
			    {
				    nexthop = 0xffffffff;
			    }
            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->attr.hopcount     == LspCBVar->pAttr.hopcount)    && \
				    (p_s_f->attr.len          == LspCBVar->pAttr.len)         && \
				    (p_s_f->nexthop          == nexthop)         && \
				    (!MPLS_MEMCMP(p_s_f->attr.pAttr,LspCBVar->pAttr.pAttr,LspCBVar->pAttr.len))
				    )
				    break;
			}
			if(p_s_f)
			{
			    aggr_delete(p_s_f);
			}		
		/*	else
			    printf("when CREATE_PVC_REQ_AWAITED nodetype %d dele p_s_f fail\n",LspCBVar->nodeType); */	
    }
    /*2003-12-25 lixia add for dele p_s_f*/
    else if((LspCBVar->nodeType != MPLS_NODE_EGRESS)&&(LspCBVar->status == RESPONSE_AWAITED)&&(LspCBVar->subStatus == CREATE_PVC_REQ_AWAITED))
    {
        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) )
	/*		    (p_s_f->attr.hopcount     == LspCBVar->pAttr.hopcount)    && \  */
				    break;
				    
			}
			if(p_s_f)
			{
			    aggr_delete(p_s_f);
			}	
		/*	else
			    printf("when CREATE_PVC_REQ_AWAITED nodetype %d dele p_s_f fail\n",LspCBVar->nodeType);  */	
    }
#endif
  
    
    
    /* 释放为path vector分配的空间 hyh 2003.3.3 */ 
    if(LspCBVar->pAttr.pAttr != MPLS_NULL)
    {
        ldp_pathvector_free(&(LspCBVar->pAttr));
    }		
	    
		MPLS_FEC_LSPCB_DELETE(pFecEntry,LspCBVar)
		/* for fec no route delete fec */
		if(!((pFecEntry->up_cb_list).first||    \
		    (pFecEntry->down_cb_list).first||   \
		    (pFecEntry->lsp_cb_list).first||    \
		     pFecEntry->owner))
		{
   	        MPLS_FEC_DELETE((pFecEntry->fec_key).mplsFecAddr,\
   	          (pFecEntry->fec_key).mplsLdpFecAddrLen,pFecEntry);		
   	    }
	}
	return;	
}

/*建立PVC相关函数*/
short FuncCreatePvc(mplsLdpLspCB *LspCBVar, char *pEntry)
{
	mplsLdpFecEntry 			*pFecEntry = MPLS_NULL;
	mplsLdpCrLsp 				*pCrEntry = MPLS_NULL;
	STRUC_MPLS_AD_CRPVC_REQ 	createPvcReq;
	short						rtcode;
	unsigned short 				localLspId;
	unsigned long 				LspCBNo;
	mplsLdpTrafficTlv_t 		Traffic;
    lblmsgTlvExists         	tlvexists;
	
	MPLS_MEMSET(&Traffic,0,sizeof(mplsLdpTrafficTlv_t));
	if(LspCBVar->lspType == LDP_HOP_LSP)
	{
		pFecEntry  = (mplsLdpFecEntry *)pEntry;
		localLspId = pFecEntry->fec_key.mplsLdpFecAddrLen;
		LspCBNo    = pFecEntry->fec_key.mplsFecAddr;
		Traffic.freq = UNSPECIFIED;
		/* szh temp add 2003-11-15 hop traffic can config */
		if((hoptraffpara_pdr !=0)&&(hoptraffpara_pbs !=0))
		{
		    Traffic.pdr.pdr = hoptraffpara_pdr * 48;
		    Traffic.pbs.pbs = hoptraffpara_pbs * 48;    
		}
		else
		{    
		    Traffic.pdr.pdr = DEFAULT_PDR;
		    Traffic.pbs.pbs = DEFAULT_PBS;
		}    
	}
	else
	{
		pCrEntry = (mplsLdpCrLsp *)pEntry;
		localLspId = pCrEntry->crfec_key.locallspid;
		LspCBNo    = pCrEntry->crfec_key.ingressid;
		tlvexists.mark = pCrEntry->tlvExists;
		if(tlvexists.flags.trafficTlvExists == 1)
			MPLS_MEMCPY(&Traffic,&pCrEntry->trafficTlv,sizeof(mplsLdpTrafficTlv_t));
		else
		{
			Traffic.freq = UNSPECIFIED;
			Traffic.pdr.pdr = DEFAULT_PDR;
			Traffic.pbs.pbs = DEFAULT_PBS;			
		}
	}
	
//	LspCBVar->subStatus = CREATE_PVC_REQ_AWAITED;

	/*填充请求*/
	MPLS_MEMSET(&createPvcReq, 0, sizeof(STRUC_MPLS_AD_CRPVC_REQ));
	if(ldp_fill_crpvcreq(&createPvcReq,LspCBVar,localLspId,LspCBNo,&Traffic,pEntry)==LDP_FALSE)
		return LDP_FALSE;
	
	/*将请求加入缓冲队列*/
	LspCBVar->lsp_loc = MPLS_NULL;
	rtcode = mpls_xc_req_append(&createPvcReq,CRPVC_REQ,LspCBVar->lsp_loc,LOC_NEED);
	if(rtcode == REQ_QUEUE_OK)
	{
		/*加入成功,置资源定时器*/
		MPLS_SET_TIMER(XC_RES_TIME,(void *)ldp_crpvc_timeout,LspCBVar,ldptime_q,LspCBVar->timerid);

⌨️ 快捷键说明

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