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

📄 ldpfunc.c

📁 技术文件名称:MPLSv1.0软件模块测试规程
💻 C
📖 第 1 页 / 共 5 页
字号:
		return LDP_TRUE;
	}
	else
	{
		/*缓冲失败,置重发缓冲定时器*/
		MPLS_SET_TIMER(XC_QUE_FULL_RESND_TIME,(void *)ldp_crpvc_resend,LspCBVar,ldptime_q,LspCBVar->timerid);
		return LDP_FALSE;		
	}

}

short ldp_fill_crpvcreq(STRUC_MPLS_AD_CRPVC_REQ 	*createPvcReq,
						mplsLdpLspCB *LspCBVar, 
						unsigned short localLspId,
						unsigned long LspCBNo, 
						mplsLdpTrafficTlv_t *Traffic,
						char    *pEntry)
{
	short	                    serviceClassValue;
	unsigned long				t;

	createPvcReq->localLspId = localLspId;
	createPvcReq->IngressId 	= LspCBVar->lspIndex;
	createPvcReq->LspCBNo 	= LspCBNo;
	
	createPvcReq->L_module 	= LspCBVar->upAtmLabel.module;
	createPvcReq->L_port    = LspCBVar->upAtmLabel.port;
  	createPvcReq->L_vpi 	= LspCBVar->upAtmLabel.vpi;
	createPvcReq->L_vci	 	= LspCBVar->upAtmLabel.vci;
	
	createPvcReq->H_module   = LspCBVar->downAtmLabel.module;
	createPvcReq->H_port 	= LspCBVar->downAtmLabel.port;
	createPvcReq->H_vpi 	= LspCBVar->downAtmLabel.vpi;
	createPvcReq->H_vci 	= LspCBVar->downAtmLabel.vci;

	createPvcReq->Connect_type = (VAL_ConnType_SVCC - 2);	
	
	createPvcReq->L_CPType = VAL_CPType_SegEndPtYes;
	createPvcReq->H_CPType = VAL_CPType_SegEndPtYes;
	createPvcReq->TrafficDescrType = atmNoClpNoScr;
	createPvcReq->TrafficDescrParam1 = (Traffic->pdr.pdr)/48;
	createPvcReq->TrafficDescrParam2 = (Traffic->pbs.pbs)/48; 
	createPvcReq->TrafficDescrParam3 = (Traffic->cdr.cdr)/48; 
	createPvcReq->TrafficDescrParam4 = (Traffic->cbs.cbs)/48; 
	createPvcReq->TrafficDescrParam5 = (Traffic->ebs.ebs)/48; 	                               
		
	serviceClassValue = ServiceClass(Traffic);
	if (serviceClassValue != LDP_FALSE)	
		createPvcReq->ServiceCategory = (unsigned char)(serviceClassValue);
	else 
	{
	    #ifdef MPLS_ERR_PRINT
                DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_LSP,"========  SERVICETYPE ERROR WHEN CREATE PVC =======\n");
				printf("========  SERVICETYPE ERROR WHEN CREATE PVC =======\n");
	    #endif
        /*response to fec ,2002-11-19 hyh */
        if((LspCBVar->lspType == LDP_CR_LSP)&&(LspCBVar->nodeType == MPLS_NODE_INGRESS))
  	    {
            sendToFecCrlsp((mplsLdpCrLsp *)pEntry,RESPONSE_TYPE,TRAFPARAUNAVA);          	
      	}
        /* hyh 2003.3.7 need to delete lspcb */
		if(LspCBVar->nodeType != MPLS_NODE_INGRESS)
		{
			DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_LSP,"==== UpLspCbFsm,TRAFFIC PARAM IS FALSE ====\n");
			printf("==== UpLspCbFsm,TRAFFIC PARAM IS FALSE ====");
			LspCBVar -> errorcode = CRPVCTRAFFICFALSE;
			SndNotMsg(LspCBVar->upSessionIndex,TRAFPARAUNAVA,LspCBVar->upMsgid,\
			            MPLS_LBLREQ_MSGTYPE);
		}
      	if(LspCBVar->nodeType != MPLS_NODE_EGRESS)/*向下游发送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);
        }
        
		if(!((LspCBVar->lspType == LDP_HOP_LSP)&&(LspCBVar->nodeType == MPLS_NODE_INGRESS)))
		{
			if(LspCBVar->waitflag & 0xe0)
	        {
	        	LspCBVar->waitflag |= 0x1;
	        }
	        else
	        {
	        	ldp_del_lspCB(pEntry,LspCBVar);  
	        }        
        }
        /*2003-12-25 lixia add for dele p_s_f*/
        else if((LspCBVar->lspType == LDP_HOP_LSP)&&(LspCBVar->nodeType == MPLS_NODE_INGRESS))
        {
            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);
        }
        
		return LDP_FALSE;
	}
	#ifdef  __INSTALL_V22
	if(createPvcReq->ServiceCategory == UBRService)
	{
		createPvcReq->TrafficDescrParam1 = (Traffic->pdr.pdr)/48;
	    createPvcReq->TrafficDescrParam2 = (Traffic->pbs.pbs)/48; 
	    createPvcReq->TrafficDescrParam5 = 1;
		createPvcReq->TrafficDescrType   = atmNoClpNoScrCdvt;
	}
	else if(createPvcReq->ServiceCategory == CBRService)
	{
		createPvcReq->TrafficDescrParam1 = (Traffic->pdr.pdr)/48;
	    createPvcReq->TrafficDescrParam2 = (Traffic->pbs.pbs)/48; 
	    createPvcReq->TrafficDescrParam5 = 1; 
		createPvcReq->TrafficDescrType   = atmNoClpNoScrCdvt;
	}
	else if(createPvcReq->ServiceCategory == rtVBRService)
	{
	    createPvcReq->TrafficDescrParam1 = (Traffic->pdr.pdr)/48;
	    createPvcReq->TrafficDescrParam2 = (Traffic->cdr.cdr)/48; 
	    createPvcReq->TrafficDescrParam3 = (Traffic->cbs.cbs)/48; 
	    createPvcReq->TrafficDescrParam4 = (Traffic->pbs.pbs)/48;
	    createPvcReq->TrafficDescrParam5 = 1; 
		createPvcReq->TrafficDescrType   = atmNoClpScrCdvt;
	}
	else if(createPvcReq->ServiceCategory == nrtVBRService)
	{
		createPvcReq->TrafficDescrParam1 = (Traffic->pdr.pdr)/48;
	    createPvcReq->TrafficDescrParam2 = (Traffic->cdr.cdr)/48; 
	    createPvcReq->TrafficDescrParam3 = (Traffic->cbs.cbs)/48; 
	    createPvcReq->TrafficDescrParam4 = (Traffic->pbs.pbs)/48;
	    createPvcReq->TrafficDescrParam5 = 1; 
		createPvcReq->TrafficDescrType   = atmNoClpScrCdvt;
	}    
	#else
	if(createPvcReq->ServiceCategory == UBRService)
	{
		createPvcReq->TrafficDescrParam2 = createPvcReq->TrafficDescrParam2*(1E7)/createPvcReq->TrafficDescrParam1;
		createPvcReq->TrafficDescrParam3 = 0;
		createPvcReq->TrafficDescrParam4 = 0;
		createPvcReq->TrafficDescrType   = atmNoClpTaggingNoScr;
	}
	else if(createPvcReq->ServiceCategory == CBRService)
	{
		createPvcReq->TrafficDescrParam2 = createPvcReq->TrafficDescrParam2*(1E7)/createPvcReq->TrafficDescrParam1;
		createPvcReq->TrafficDescrParam3 = 0;
		createPvcReq->TrafficDescrParam4 = 0;
		createPvcReq->TrafficDescrType   = atmNoClpNoScrCdvt;
	}
	else if(createPvcReq->ServiceCategory == rtVBRService)
	{
		t 								= createPvcReq->TrafficDescrParam4;
		createPvcReq->TrafficDescrParam4 = createPvcReq->TrafficDescrParam2*(1E7)/createPvcReq->TrafficDescrParam1;
		createPvcReq->TrafficDescrParam2 = createPvcReq->TrafficDescrParam3;
		createPvcReq->TrafficDescrParam3 = t;
		createPvcReq->TrafficDescrType   = atmClpTaggingScrCdvt;
	}
	else if(createPvcReq->ServiceCategory == nrtVBRService)
	{
		t 								= createPvcReq->TrafficDescrParam4;
		createPvcReq->TrafficDescrParam4 = createPvcReq->TrafficDescrParam2*(1E7)/createPvcReq->TrafficDescrParam1;
		createPvcReq->TrafficDescrParam2 = createPvcReq->TrafficDescrParam3;
		createPvcReq->TrafficDescrParam3 = t;
		createPvcReq->TrafficDescrType   = atmClpTaggingScrCdvt;
	}
	#endif
	createPvcReq->Connect_struct = VAL_Connectstruct_Type0;
	
	if (LspCBVar->nodeType == MPLS_NODE_INGRESS)
	{
		createPvcReq->L_uniflag = UNI_FLAG;
		createPvcReq->H_uniflag = NNI_FLAG;
		/* add by fengjun for guangzhou */
		createPvcReq->flag    = 1;
	}
	else if (LspCBVar->nodeType == MPLS_NODE_EGRESS)
	{
		createPvcReq->L_uniflag = NNI_FLAG;
		createPvcReq->H_uniflag = UNI_FLAG;
		createPvcReq->flag    = 1;
	}
	else 
	{
		createPvcReq->L_uniflag = NNI_FLAG;
		createPvcReq->H_uniflag = NNI_FLAG;
		/* add by fengjun for guangzhou */
		createPvcReq->flag    = 1;
	}
	return LDP_TRUE;
}

/* 同C010通信有问题,资源定时器超时 */
short ldp_crpvc_timeout(mplsLdpLspCB *LspCBVar)
{
	char		    *pEntry = MPLS_NULL;
    mplsLdpCrLsp    *pCrEntry = MPLS_NULL;
    mpls_sb_list            * sb_list;

    DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_LSP,"================ ldp create pvc timeout =============\n");
	MPLS_ERR_LOG("================ ldp create pvc timeout =============index is %x",LspCBVar->lspIndex);
	LspCBVar->timerid = 0;
	/*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$2004-5-17 fengjunjinan*/
	/*if waitflag is 1,the label has been release before*/
	if((LspCBVar->waitflag & 0x1) )
	{
		return  LDP_FALSE;
	    printf("ldp_crpvc_timeout has undel lspcb!!!!!!!!!!!!");
	}
	/*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$2004-5-17 fengjunjinan*/
	if((LspCBVar->status == RESPONSE_AWAITED)&&
		(LspCBVar->subStatus == CREATE_PVC_REQ_AWAITED))
	{
		/* 如果请求仍在缓冲中,则释放消息缓冲中的请求 */
/*		delete_lqe_xcque(LspCBVar->lsp_loc);*/
        delete_lspindex_xcque(LspCBVar->lspIndex);
		
		/* 用LspCBVar查找Entry */
		pEntry = lspcb_search_entry(LspCBVar);
		if(pEntry == MPLS_NULL)
		    return LDP_FALSE;
		/*处理与建立失败相同*/
	  	if (LspCBVar->nodeType != MPLS_NODE_INGRESS)
	  	{
	      /* 向上游发送notify消息*/
            DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_LSP,"==== pvc timeout UpLspCbFsm,CREATE PVC REQ IS FAIL ====\n");
	    	printf("==== UpLspCbFsm,CREATE PVC REQ IS FAIL ====");
	    	LspCBVar -> errorcode = CRPVCTIMEOUT;
	    	SndNotMsg(LspCBVar->upSessionIndex, RESRCUNAVA,LspCBVar->upMsgid,\
		            MPLS_LBLMAP_MSGTYPE);
	  	}
	  	if(LspCBVar->nodeType != MPLS_NODE_EGRESS)/*向下游发送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);
	    }       
	    /*释放本地分配的标记 */
		if(ldp_free_atm_label(pEntry,LspCBVar,FLAG_UPDOWN)==LDP_FALSE)
		{
		    MPLS_ASSERT(0);
		    LspCBVar -> errorcode = CRPVCTIMEOUT_FREELBLFAIL;
            DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_LSP,"ldp_crpvc_timeout,ldp_free_atm_label fail\n");
		    MPLS_ERR_LOG("ldp_free_atm_label fail");
		}
		/* 删除控制块 */

        if((LspCBVar->lspType == LDP_CR_LSP)&&(LspCBVar->nodeType == MPLS_NODE_INGRESS))
        {
            pCrEntry = (mplsLdpCrLsp *)pEntry;
            DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_CR,"PVC timeout return fec response RESRCUNAVA\n");
            MPLS_ERR_LOG("PVC timeout return fec response RESRCUNAVA");
            sendToFecCrlsp(pCrEntry,RESPONSE_TYPE,RESRCUNAVA);
        }		    				

        /* if ingress and hop,don't delete lspcb, hyh 2002-11-15 */
        if((LspCBVar->lspType == LDP_HOP_LSP)&&(LspCBVar->nodeType == MPLS_NODE_INGRESS))
        {
            /* 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)
    		}
            LspCBVar->resend = 1;
      		MPLS_ERR_LOG("========== set timer ldp_req_resend =========");
			MPLS_SET_TIMER(REQ_DELAY,(void *)ldp_req_resend,LspCBVar,ldptime_q,LspCBVar->timerid);			
			/*2003-12-25 lixia add for dele p_s_f*/
			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		/* 删除控制块 */
        {
            if(LspCBVar->waitflag & 0xe0)
      	      LspCBVar->waitflag |= 0x1;
      	    else  ldp_del_lspCB(pEntry,LspCBVar);
		}
		return LDP_TRUE;
	}
	else
		return LDP_FALSE;
}

/* 重发缓冲定时器到时,再次向缓冲发送建立PVC请求 */
short ldp_crpvc_resend(mplsLdpLspCB *LspCBVar)
{
	char		*pEntry = MPLS_NULL;
	int 		rtcode;
	
	LspCBVar->timerid = 0;
	if((LspCBVar->status == RESPONSE_AWAITED)&&
		(LspCBVar->subStatus == CREATE_PVC_REQ_AWAITED))
	{
	/* 用LspCBVar查找Entry */
	pEntry = lspcb_search_entry(LspCBVar);
	/*重发建立请求*/
    	if(pEntry){
           if(LspCBVar->lspType == LDP_HOP_LSP)
              return    wait_xc_append(LspCBVar,pEntry,0x1);
           else
              return    CR_wait_xc_append(LspCBVar,pEntry,0x1);
    	}
    	
    	else
    	    return LDP_FALSE;	
	}
	else
		return LDP_FALSE;
}

/*预留资源的相关函数*/
short FuncResvBW(mplsLdpLspCB *LspCBVar, char *pEntry)
{
	mplsLdpFecEntry 			*pFecEntry = MPLS_NULL;
	mplsLdpCrLsp 				*pCrEntry = MPLS_NULL;
	STRUC_MPLS_AD_BANDWIDTH_REQ 	bandwithReq;
	unsigned short 				localLspId;
	unsigned long 				LspCBNo;
	mplsLdpTrafficTlv_t 		Traffic;
	short                       rtcode;
    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;
		Traffic.pdr.pdr = DEFAULT_PDR;

⌨️ 快捷键说明

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