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

📄 ldpfunc.c

📁 技术文件名称:MPLSv1.0软件模块测试规程
💻 C
📖 第 1 页 / 共 5 页
字号:
		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 = BANDWITH_REQ_AWAITED;

	/*填充请求*/
	MPLS_MEMSET(&bandwithReq, 0, sizeof(STRUC_MPLS_AD_BANDWIDTH_REQ));
	if(ldp_fill_bwreq(&bandwithReq,LspCBVar,localLspId,LspCBNo,&Traffic,pEntry)==LDP_FALSE)
		return LDP_FALSE;

	/*将请求加入缓冲队列*/
	LspCBVar->lsp_loc = MPLS_NULL;
	rtcode = mpls_xc_req_append(&bandwithReq,BANDWIDTH_REQ,LspCBVar->lsp_loc,LOC_NEED);
	if(rtcode == REQ_QUEUE_OK)
	{
		/*加入成功,置资源定时器*/
		MPLS_SET_TIMER(XC_RES_TIME,(void *)ldp_bw_timeout,LspCBVar,ldptime_q,LspCBVar->timerid);
		return LDP_TRUE;
	}
	else
	{
		/*缓冲失败,置重发缓冲定时器*/
		#if 0
		MPLS_SET_TIMER(XC_QUE_FULL_RESND_TIME,(void *)ldp_bw_resend,LspCBVar,ldptime_q,LspCBVar->timerid);
		#endif
		return LDP_FALSE;		
	}
}

short ldp_fill_bwreq(STRUC_MPLS_AD_BANDWIDTH_REQ 	*bandwithReq,
						mplsLdpLspCB *LspCBVar, 
						unsigned short localLspId,
						unsigned long LspCBNo, 
						mplsLdpTrafficTlv_t *Traffic,
						char  *pEntry)
{
	short	                    serviceClassValue;

	/*填充请求*/
    bandwithReq->localLspId       = localLspId;
    bandwithReq->IngressId        = LspCBVar->lspIndex;
    bandwithReq->LspCBNo		  = LspCBNo;
    bandwithReq->L_module 		  = LspCBVar->upAtmLabel.module;

    bandwithReq->L_port  		  = LspCBVar->upAtmLabel.port;
    bandwithReq->H_module 		  = LspCBVar->downAtmLabel.module;
    bandwithReq->H_port  		  = LspCBVar->downAtmLabel.port;
	bandwithReq->Connect_struct   = VAL_Connectstruct_Type0;

	bandwithReq->TrafficDescrParam = (unsigned long)(Traffic->pdr.pdr/48);
	bandwithReq->TrafficDescrParam2 = (unsigned long)(Traffic->pbs.pbs/48);
		  /* add 2001.07.09 for bandwidth reserve according to service type
		     UBR    no bandwidth reserve;
		     CBR    pdr bandwidth reserve
		     VBR    scr(cdr) bandwidth reserve
		   */
	serviceClassValue = ServiceClass(Traffic);
	if (serviceClassValue != LDP_FALSE)	
		bandwithReq->ServiceCategory = (unsigned char)(serviceClassValue);
	else 
	{
		if(LspCBVar->nodeType != MPLS_NODE_INGRESS)
		{
			LspCBVar -> errorcode = BWTRAFFICFALSE;
			printf("==== UpLspCbFsm,TRAFFIC PARAM IS FALSE ====");
			SndNotMsg(LspCBVar->upSessionIndex,TRAFPARAUNAVA,LspCBVar->upMsgid,\
			            MPLS_LBLREQ_MSGTYPE);
		}
        /*response to fec ,2002-11-19 hyh */
        if((LspCBVar->lspType == LDP_CR_LSP)&&(LspCBVar->nodeType == MPLS_NODE_INGRESS))
  	    {
            sendToFecCrlsp((mplsLdpCrLsp *)pEntry,RESPONSE_TYPE,TRAFPARAUNAVA);          	
      	}
/*		del_lsp_cb(pEntry,LspCBVar);*/
        /* hyh 2003.3.7 need to delete lspcb */
		if(!((LspCBVar->lspType == LDP_HOP_LSP)&&(LspCBVar->nodeType == MPLS_NODE_INGRESS)))
		{
			if(LspCBVar->waitflag & 0xe0)
	        {
	        	LspCBVar->waitflag |= 0x1;
	        }
	        else
	        {
	        	ldp_del_lspCB(pEntry,LspCBVar);  
	        }        
        }
		return LDP_FALSE;
    } 
	return LDP_TRUE;
	
}

/* 同C010通信有问题,资源定时器超时 */
short ldp_bw_timeout(mplsLdpLspCB *LspCBVar)
{
	char		*pEntry = MPLS_NULL;
    mplsLdpCrLsp    *pCrEntry = MPLS_NULL;
	mpls_sb_list            * sb_list;
	
	MPLS_ERR_LOG("================ ldp resv bandwidth timeout =============");
	LspCBVar->timerid = 0;
	if((LspCBVar->status == IDLE)&&
		(LspCBVar->subStatus == BANDWITH_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->lspType == LDP_HOP_LSP)
        {
	  	if (LspCBVar->nodeType != MPLS_NODE_INGRESS)
	  	{
	      /* 向上游发送notify消息*/
	        LspCBVar -> errorcode = BWPVCTIMEOUT;
	    	printf("==== UpLspCbFsm,RESV BANDWIDTH REQ IS FAIL ====");
	    	SndNotMsg(LspCBVar->upSessionIndex, RESRCUNAVA,LspCBVar->upMsgid,\
		            MPLS_LBLMAP_MSGTYPE);	        
			/* 删除控制块 */
			#if 0
			ldp_del_lspCB(pEntry,LspCBVar);
			#endif
			if(LspCBVar->waitflag & 0xe0)
      	      LspCBVar->waitflag |= 0x1;
      	    else  ldp_del_lspCB(pEntry,LspCBVar);
	  	}
		else
		{
      		/* 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);			
		}
		return LDP_TRUE;
	}
	else
    	{
    	  	if (LspCBVar->nodeType != MPLS_NODE_INGRESS)
    	  	{
    	      /* 向上游发送notify消息*/
    	        LspCBVar -> errorcode = CRLSP_BWTRAFFICFALSE;
    	        DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_CR,"==== UpLspCbFsm,RESV BANDWIDTH REQ IS FAIL ====\n");
    	    	printf("==== UpLspCbFsm,RESV BANDWIDTH REQ IS FAIL ====");
    	    	SndNotMsg(LspCBVar->upSessionIndex, RESRCUNAVA,LspCBVar->upMsgid,\
    		            MPLS_LBLMAP_MSGTYPE);	        
    	  	}
    	  	else
    	  	{    			
                LspCBVar -> errorcode = CRLSP_BWTRAFFICFALSE;
                pCrEntry = (mplsLdpCrLsp *)pEntry;
                MPLS_ERR_LOG("bandwidth timeout return fec response INTERNALERROR");
                sendToFecCrlsp(pCrEntry,RESPONSE_TYPE,INTERNALERROR);
            }		    			
    	    /* 删除控制块 */
    	    if(LspCBVar->waitflag & 0xe0)
	        {
	        	LspCBVar->waitflag |= 0x1;
	        }
	        else
	        {
	        	ldp_del_lspCB(pEntry,LspCBVar);  
	        }
    		return LDP_TRUE;    	    
    	}	
	}
	else
		return LDP_FALSE;
}

/* 重发缓冲定时器到时,再次向缓冲发送预留请求 */
short ldp_bw_resend(mplsLdpLspCB *LspCBVar)
{
	char		*pEntry = MPLS_NULL;
	
	LspCBVar->timerid = 0;
	if((LspCBVar->status == IDLE)&&
		(LspCBVar->subStatus == BANDWITH_REQ_AWAITED))
	{
	/* 用LspCBVar查找Entry */
	pEntry = lspcb_search_entry(LspCBVar);
	/*重发预留请求*/
        if(pEntry){
             if(LspCBVar->lspType == LDP_HOP_LSP)
                return       Xcbandwithreq(LspCBVar,LspCBVar->selffec);
          /*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);   
        	}
	else
            return LDP_FALSE; 
	}
	else
		return LDP_FALSE;
	
}

/*释放预留资源的相关函数*/
short FuncRlsBW(mplsLdpLspCB *LspCBVar, char *pEntry)
{
	mplsLdpFecEntry 			*pFecEntry = MPLS_NULL;
    mplsLdpCrLsp                *pCrEntry = MPLS_NULL;
    
	STRUC_MPLS_AD_RLSBW_REQ     rlsBwReq;
	unsigned short 				localLspId;
	unsigned long 				LspCBNo;
	mplsLdpTrafficTlv_t 		Traffic;
    lblmsgTlvExists         	tlvexists;
	short						rtcode;
	
	MPLS_MEMSET(&Traffic,0,sizeof(mplsLdpTrafficTlv_t));
    MPLS_MEMSET(&rlsBwReq,0,sizeof(STRUC_MPLS_AD_RLSBW_REQ));
    MPLS_MEMSET(&tlvexists,0,sizeof(lblmsgTlvExists));
	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;
		Traffic.pbs.pbs = DEFAULT_PBS;	
	}
	else if(LspCBVar->lspType == LDP_CR_LSP)
	{
        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;			
		}
	}

	/*填充请求*/
	MPLS_MEMSET(&rlsBwReq, 0, sizeof(STRUC_MPLS_AD_RLSBW_REQ));
    rlsBwReq.localLspId     = localLspId;
	rlsBwReq.IngressId      = LspCBVar->lspIndex;
    rlsBwReq.LspCBNo	    = LspCBNo;
		    
    rlsBwReq.L_module       = LspCBVar->downAtmLabel.module;
    rlsBwReq.L_port         = LspCBVar->downAtmLabel.port;
    rlsBwReq.H_module       = LspCBVar->upAtmLabel.module;
    rlsBwReq.H_port         = LspCBVar->upAtmLabel.port;
    rlsBwReq.Connect_struct = VAL_Connectstruct_Type0;
    rlsBwReq.TrafficDescrParam  = (unsigned long)(Traffic.pdr.pdr/48);
    rlsBwReq.TrafficDescrParam2 = (unsigned long)(Traffic.pbs.pbs/48);
    rlsBwReq.ServiceCategory    = (unsigned char)ServiceClass(&Traffic);
	
	/*将请求加入缓冲队列*/
	rtcode = mpls_xc_req_append(&rlsBwReq,RLSBW_REQ,MPLS_NULL,LOC_NO_NEED);
	if(rtcode == REQ_QUEUE_OK)
	{
		if(LspCBVar->resend !=1)
        {
            #if 0
            if((LspCBVar->lspType == LDP_CR_LSP)&&(LspCBVar->nodeType == MPLS_NODE_INGRESS))
            {
                /*sendToFecCrlsp(pCrEntry,DELETE_PVC_TYPE,0);*/
                /* if release bandwidth,it indicates that lsp not setup, by hyh */                
                sendToFecCrlsp(pCrEntry,RESPONSE_TYPE,NOROUTE);
            }
            #endif
			if(LspCBVar->waitflag & 0xe0)
			{
	      	      //LspCBVar->waitflag |= 0x1;
	      	}
	      	else  if(LspCBVar->waitflag & 0x1)
	      	{
	      		ldp_del_lspCB(pEntry,LspCBVar);
	      	}
		}
		return LDP_TRUE;
	}
/*	else
	{
		/*缓冲失败,置重发缓冲定时器/
		MPLS_SET_TIMER(XC_QUE_FULL_RESND_TIME,(void *)ldp_Rlsbw_resend,LspCBVar,ldptime_q,LspCBVar->timerid);
		return LDP_FALSE;		
	}
*/
}
short FuncRlsBW_State3(mplsLdpLspCB *LspCBVar, char *pEntry)
{
	mplsLdpFecEntry 			*pFecEntry = NULL;
	STRUC_MPLS_AD_RLSBW_REQ     rlsBwReq;
	unsigned short 				localLspId;
	unsigned long 				LspCBNo;
	short						rtcode;
	
	if(LspCBVar->lspType == LDP_HOP_LSP)
	{
		pFecEntry  = (mplsLdpFecEntry *)pEntry;
		localLspId = pFecEntry->fec_key.mplsLdpFecAddrLen;
		LspCBNo    = pFecEntry->fec_key.mplsFecAddr;
	}
	else
	{
		localLspId = 0;
		LspCBNo    = 0;
	}

	/*填充请求*/
	MPLS_MEMSET(&rlsBwReq, 0, sizeof(STRUC_MPLS_AD_RLSBW_REQ));
    rlsBwReq.localLspId     = localLspId;
	rlsBwReq.IngressId      = LspCBVar->lspIndex;
    rlsBwReq.LspCBNo	    = LspCBNo;
		    
    rlsBwReq.L_module       = LspCBVar->downAtmLabel.module;
    rlsBwReq.L_port         = LspCBVar->downAtmLabel.port;
    rlsBwReq.H_module       = LspCBVar->upAtmLabel.module;
    rlsBwReq.H_port         = LspCBVar->upAtmLabel.port;
    rlsBwReq.Connect_struct = VAL_Connectstruct_Type0;
	
	/*将请求加入缓冲队列*/
	rtcode = mpls_xc_req_append(&rlsBwReq,RLSBW_REQ,NULL,LOC_NO_NEED);
	return LDP_TRUE;
}


/* 重发缓冲定时器到时,再次向缓冲发送释放预留请求 */
short ldp_Rlsbw_resend(mplsLdpLspCB *LspCBVar)

⌨️ 快捷键说明

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