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

📄 ldpfunc.c

📁 技术文件名称:MPLSv1.0软件模块测试规程
💻 C
📖 第 1 页 / 共 5 页
字号:
{
	char		*pEntry = MPLS_NULL;
	
	LspCBVar->timerid = 0;
	if(((LspCBVar->status == IDLE)&&
		(LspCBVar->subStatus == BANDWITH_REQ_AWAITED))||
		((LspCBVar->status == RESPONSE_AWAITED)&&(LspCBVar->subStatus == IDLE)))
	{
	/* 用LspCBVar查找Entry */
	pEntry = lspcb_search_entry(LspCBVar);
	/*重发建立请求*/
    	if(pEntry)	{
	         LspCBVar->waitflag |= 0x1;	
	         Xcbandwithrel(LspCBVar,pEntry);
  /* add by fengjun for guangzhou 0906 
             return    wait_xc_append(LspCBVar,pEntry,0x2);
.             add by fengjun for guangzhou 0906 */
        }
        else
            return LDP_FALSE;	
}
	else
		return LDP_FALSE;
}

short RlsBW_noCB(STRUC_AD_MPLS_BANDWIDTH_ACK *bandwithAck)
{
	STRUC_MPLS_AD_RLSBW_REQ     rlsBwReq;
	
    MPLS_MEMSET(&rlsBwReq,0,sizeof(STRUC_MPLS_AD_RLSBW_REQ));
	/*填充请求*/
    rlsBwReq.localLspId     = bandwithAck->localLspId;
	rlsBwReq.IngressId      = bandwithAck->IngressId;
    rlsBwReq.LspCBNo	    = bandwithAck->LspCBNo;
		    
    rlsBwReq.L_module       = bandwithAck->L_module;
    rlsBwReq.L_port         = bandwithAck->L_port;
    rlsBwReq.H_module       = bandwithAck->H_module;
    rlsBwReq.H_port         = bandwithAck->H_port;
    rlsBwReq.Connect_struct = VAL_Connectstruct_Type0;
	rlsBwReq.ServiceCategory= bandwithAck->ServiceCategory;
	
	/*由于控制块已删,立即将请求加到缓冲队列头,发出去*/
	if((mpls_xc_req_replace(&rlsBwReq,RLSBW_REQ))!=REQ_QUEUE_OK)
		return LDP_FALSE;
	return LDP_TRUE;

}

/* hyh 2003.1.26 
 * if bandwidth req timeout,send to release it */
short bandwidth_to_release(STRUC_MPLS_AD_BANDWIDTH_REQ *bandwithReq)
{
	STRUC_MPLS_AD_RLSBW_REQ     rlsBwReq;
	
    MPLS_MEMSET(&rlsBwReq,0,sizeof(STRUC_MPLS_AD_RLSBW_REQ));
	/*填充请求*/
    rlsBwReq.localLspId     = bandwithReq->localLspId;
	rlsBwReq.IngressId      = bandwithReq->IngressId;
    rlsBwReq.LspCBNo	    = bandwithReq->LspCBNo;
		    
    rlsBwReq.L_module       = bandwithReq->L_module;
    rlsBwReq.L_port         = bandwithReq->L_port;
    rlsBwReq.H_module       = bandwithReq->H_module;
    rlsBwReq.H_port         = bandwithReq->H_port;
    rlsBwReq.Connect_struct = VAL_Connectstruct_Type0;
    rlsBwReq.TrafficDescrParam = bandwithReq->TrafficDescrParam;
    rlsBwReq.TrafficDescrParam2 = bandwithReq->TrafficDescrParam2;
    rlsBwReq.TrafficQosClass = bandwithReq->TrafficQosClass;
	rlsBwReq.ServiceCategory= bandwithReq->ServiceCategory;
	
	/*由于控制块已删,立即将请求加到缓冲队列头,发出去*/
	if((mpls_xc_req_replace(&rlsBwReq,RLSBW_REQ))!=REQ_QUEUE_OK)
		return LDP_FALSE;
	return LDP_TRUE;

}

/*释放PVC相关函数*/
short FuncRelPVC(mplsLdpLspCB *LspCBVar, char *pEntry)
{
	mplsLdpFecEntry 			*pFecEntry = MPLS_NULL;
    mplsLdpCrLsp                *pCrEntry = MPLS_NULL;
	STRUC_MPLS_AD_RLSPVC_REQ    pvcRelReq;
	unsigned short 				localLspId;
	unsigned long 				LspCBNo;
	short       				rtcode;

	MPLS_MEMSET(&pvcRelReq, 0, sizeof(STRUC_MPLS_AD_RLSPVC_REQ));
	if((LspCBVar->lspType == LDP_HOP_LSP) && (LspCBVar->index1 != 0))
	{
		pvcRelReq.IngressId = LspCBVar->index1;
		localLspId          = LspCBVar->index2;
		LspCBNo             = 0;
	}
	else
	{
		pvcRelReq.IngressId      = LspCBVar->lspIndex;
		if(LspCBVar->lspType == LDP_HOP_LSP)
		{
			pFecEntry  = (mplsLdpFecEntry *)pEntry;
			localLspId = pFecEntry->fec_key.mplsLdpFecAddrLen;
			LspCBNo    = pFecEntry->fec_key.mplsFecAddr;
		}
		else
		{
	        pCrEntry = (mplsLdpCrLsp *)pEntry;
			localLspId = pCrEntry->crfec_key.locallspid;
			LspCBNo    = pCrEntry->crfec_key.ingressid;
		}
	}			
	/*填充请求*/
	pvcRelReq.localLspId     = localLspId;
	pvcRelReq.LspCBNo        = LspCBNo;

	pvcRelReq.L_module       = LspCBVar->upAtmLabel.module;
	pvcRelReq.L_port         = LspCBVar->upAtmLabel.port;
	pvcRelReq.L_vpi          = LspCBVar->upAtmLabel.vpi;
	pvcRelReq.L_vci          = LspCBVar->upAtmLabel.vci;
    pvcRelReq.H_module  	 = LspCBVar->downAtmLabel.module;
    pvcRelReq.H_port    	 = LspCBVar->downAtmLabel.port;
	pvcRelReq.H_vpi     	 = LspCBVar->downAtmLabel.vpi;
	pvcRelReq.H_vci     	 = LspCBVar->downAtmLabel.vci;
 	pvcRelReq.Connect_struct = VAL_Connectstruct_Type0;
	pvcRelReq.Connect_type   = (VAL_ConnType_SVCC - 2);
	pvcRelReq.reflag = 0;         /* 2003-10-21 lixia add */
	pvcRelReq.renum = 0;
    		
	/*将请求加入缓冲队列*/
	rtcode = mpls_xc_req_append(&pvcRelReq,RLSPVC_REQ,NULL,LOC_NO_NEED);
	if(rtcode == REQ_QUEUE_OK)
	{
		if((LspCBVar->resend != 1))	/*如果需要重发request,不删控制块*/
		{
            if((LspCBVar->lspType == LDP_CR_LSP)&&(LspCBVar->nodeType == MPLS_NODE_INGRESS))
            {
                sendToFecCrlsp(pCrEntry,DELETE_PVC_TYPE,0);
            }
            #if 0
			ldp_del_lspCB(pEntry,LspCBVar);		/*加入成功,直接删除控制块*/
		    #endif
		    if(LspCBVar->waitflag & 0xe0)
      	      LspCBVar->waitflag |= 0x1;
      	    else  ldp_del_lspCB(pEntry,LspCBVar);		/*加入成功,直接删除控制块*/
        }		
        else
		{
			LspCBVar->subStatus = RELEASE_PVC_REQ_AWAITED;
/*
			LspCBVar->upAtmLabel.vpi = 0;
			LspCBVar->upAtmLabel.vci = 0;
			LspCBVar->downAtmLabel.vpi = 0;
			LspCBVar->downAtmLabel.vci = 0;*/
		}
		return LDP_TRUE;
	}
/*	else
	{
		/*缓冲失败,置重发缓冲定时器
		MPLS_SET_TIMER(XC_QUE_FULL_RESND_TIME,(void *)ldp_Rlspvc_resend,LspCBVar,ldptime_q,LspCBVar->timerid);
		return LDP_FALSE;		
	}
*/
}	


/* 重发缓冲定时器到时,再次向缓冲发送释放PVC请求 */
short ldp_Rlspvc_resend(mplsLdpLspCB *LspCBVar)
{
	char		*pEntry = MPLS_NULL;

	LspCBVar->timerid = 0;
	if(((LspCBVar->status == RESPONSE_AWAITED)&&
		(LspCBVar->subStatus == CREATE_PVC_REQ_AWAITED))||
		((LspCBVar->status == ESTABLISHED)&&(LspCBVar->subStatus == IDLE)))
	{
		/* 用LspCBVar查找Entry */
		pEntry = lspcb_search_entry(LspCBVar);
		/*重发建立请求*/
    	if(pEntry)	{
    		LspCBVar->waitflag |= 0x1;
	        if(LspCBVar->lspType == LDP_HOP_LSP)
                     return    wait_xc_append(LspCBVar,pEntry,0x3);
                else
                     return    CR_wait_xc_append(LspCBVar,pEntry,0x3);

       }
        else
            return LDP_FALSE;
}
	else 
		return LDP_FALSE;
}

short RlsPVC_noCB(STRUC_AD_MPLS_CRPVC_ACK	*createPvcAck)
{
	STRUC_MPLS_AD_RLSPVC_REQ        pvcRelReq;
	short       rtcode;

    MPLS_MEMSET(&pvcRelReq,0,sizeof(STRUC_MPLS_AD_RLSPVC_REQ));
	/*填充请求*/
	pvcRelReq.localLspId     = createPvcAck->localLspId;
	pvcRelReq.IngressId      = createPvcAck->IngressId;
	pvcRelReq.LspCBNo        = createPvcAck->LspCBNo;

	pvcRelReq.L_module       = createPvcAck->L_module;
	pvcRelReq.L_port         = createPvcAck->L_port;
	pvcRelReq.L_vpi          = createPvcAck->L_vpi;
	pvcRelReq.L_vci          = createPvcAck->L_vci;
    pvcRelReq.H_module  	 = createPvcAck->H_module;
    pvcRelReq.H_port    	 = createPvcAck->H_port;
	pvcRelReq.H_vpi     	 = createPvcAck->H_vpi;
	pvcRelReq.H_vci     	 = createPvcAck->H_vci;
 	pvcRelReq.Connect_struct = VAL_Connectstruct_Type0;
	pvcRelReq.Connect_type   = (VAL_ConnType_SVCC - 2);
    		
	/*由于控制块已删,立即将请求加到缓冲队列头发出去*/
	if((mpls_xc_req_replace(&pvcRelReq,RLSPVC_REQ))!=REQ_QUEUE_OK)
		return LDP_FALSE;
	return LDP_TRUE;

}

/* hyh 2003.1.26 
 * if crpvc req timeout,send to release it */
short crpvc_to_release(STRUC_MPLS_AD_CRPVC_REQ	*createPvcReq)
{
	STRUC_MPLS_AD_RLSPVC_REQ        pvcRelReq;
	short       rtcode;

    MPLS_MEMSET(&pvcRelReq,0,sizeof(STRUC_MPLS_AD_RLSPVC_REQ));
	/*填充请求*/
	pvcRelReq.localLspId     = createPvcReq->localLspId;
	pvcRelReq.IngressId      = createPvcReq->IngressId;
	pvcRelReq.LspCBNo        = createPvcReq->LspCBNo;

	pvcRelReq.L_module       = createPvcReq->L_module;
	pvcRelReq.L_port         = createPvcReq->L_port;
	pvcRelReq.L_vpi          = createPvcReq->L_vpi;
	pvcRelReq.L_vci          = createPvcReq->L_vci;
    pvcRelReq.H_module  	 = createPvcReq->H_module;
    pvcRelReq.H_port    	 = createPvcReq->H_port;
	pvcRelReq.H_vpi     	 = createPvcReq->H_vpi;
	pvcRelReq.H_vci     	 = createPvcReq->H_vci;
 	pvcRelReq.Connect_struct = VAL_Connectstruct_Type0;
	pvcRelReq.Connect_type   = (VAL_ConnType_SVCC - 2);
    		
	/*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 == pvcRelReq.L_module) && \
				    (p_s_f->upAtmLabel.port   == pvcRelReq.L_port) && \
				    (p_s_f->downAtmLabel.module == pvcRelReq.H_module) && \
				    (p_s_f->downAtmLabel.port   == pvcRelReq.H_port) && \
				    (p_s_f->downAtmLabel.vpi == pvcRelReq.H_vpi) && \
				    (p_s_f->downAtmLabel.vci   == pvcRelReq.H_vci) )
				    break;
				    
	}
	if(p_s_f)
	{
	    aggr_delete(p_s_f);
	}	
    		
	/*立即将请求加到缓冲队列头发出去*/
	if((mpls_xc_req_replace(&pvcRelReq,RLSPVC_REQ))!=REQ_QUEUE_OK)
		return LDP_FALSE;
	return LDP_TRUE;

}

/*************************************************************************/
/* send label to forward                                                 */
/* if MPLS_NODE_EGRESS                                                             */
/*     send down ATM label                                               */
/* else if MPLS_NODE_INGRESS                                                       */
/*     send up ATM label                                                 */
/* else if MPLS_NODE_INTERM_INGRESS                                                */
/*     send up gen label and SB ATM label                                */
/* else MPLS_NODE_INTERM_EGRESS                                                    */
/*     send SB ATM label and down gen label                              */
/*huyonghong 2002/12/2 hop lsp fill default value */
/*************************************************************************/
short ldp_label_forward(void *pEntry, mplsLdpLspCB *LspCBVar,char action_flag)
{
	mplsLdpFecEntry		*fecEntry;
	mplsLdpCrLsp		*CrEntry;
	mplsLdpFecLabel		FecLabel;
	mplsLdpDownCB		*pDownCB;
	lblmsgTlvExists     tlvflags;
	RoutEntry  	*Prt;
		
	MPLS_MEMSET(&FecLabel, 0, sizeof(mplsLdpFecLabel));
	if(LspCBVar->lspType == LDP_HOP_LSP)
	{
		fecEntry = (mplsLdpFecEntry *)pEntry;
		/* hop lsp fill default value */
		FecLabel.ftnFec.mplsLdpFtnMask = 1;
		FecLabel.ftnFec.mplsLdpFtnAddrType = MPLS_IPV4;
		FecLabel.ftnFec.mplsLdpFtnSourceAddrMin = 0;
		FecLabel.ftnFec.mplsLdpFtnSourceAddrMax = 0xffffffff;
		FecLabel.ftnFec.mplsLdpFtnDestAddrMin = fecEntry->fec_key.mplsLdpFecAddrLen;
		FecLabel.ftnFec.mplsLdpFtnDestAddrMax   = fecEntry->fec_key.mplsFecAddr;
		FecLabel.ftnFec.mplsLdpFtnSourcePortMin = 0;
		FecLabel.ftnFec.mplsLdpFtnSourcePortMax = 0xffff;
		FecLabel.ftnFec.mplsLdpFtnDestPortMin   = 0;
		FecLabel.ftnFec.mplsLdpFtnDestPortMax   = 0xffff;
		FecLabel.ftnFec.mplsLdpFtnProtocol      = ~0;
		FecLabel.ftnFec.mplsLdpFtnExp         = 63;
		FecLabel.metric                       = 1;
		FecLabel.ftnFec.metric                = FecLabel.metric;
	    FecLabel.nexthop    = fecEntry->nexthopAddr;
	    FecLabel.outIfindex = fecEntry->outIfindex;
	    FecLabel.module     = fecEntry->module;   /*always 0*/
		FecLabel.lspType    = LDP_HOP_LSP;
		FecLabel.servicetype= UBRService;
		FecLabel.pdr		= DEFAULT_PDR;
		FecLabel.pbs		= DEFAULT_PBS;
		FecLabel.cdr = 0;
		FecLabel.cbs = 0;
		FecLabel.ebs = 0;
		FecLabel.ftnFec.mplsLdpFtnAction		= 2;	
		FecLabel.needOperSar= 1;
		FecLabel.encapmode = encapsulation_mode;    /*2004-4-2 lixia mod for encapsulation;*/
		
		if(LspCBVar->nodeType == MPLS_NODE_EGRESS)
		{
	    	/* send down ATM label */
		    FecLabel.xcLabel.upAtmLabel.module = LspCBVar->downAtmLabel.module;
		    FecLabel.xcLabel.upAtmLabel.port = LspCBVar->downAtmLabel.port;
		    FecLabel.xcLabel.upAtmLabel.vpi  = LspCBVar->downAtmLabel.vpi;
		    FecLabel.xcLabel.upAtmLabel.vci  = LspCBVar->downAtmLabel.vci;
		    FecLabel.xcLabel.uplabelValid    = UP_ATM_VALID;	/*  */
		    FecLabel.xcLabel.trans_flag		 = LDP_REC;
/*		    MPLS_ERR_LOG("======= FEC EGRESS forward label:module %d,port %d,vpi %d,vci %d",
		    		LspCBVar->downAtmLabel.module,LspCBVar->downAtmLabel.port,
		    		LspCBVar->downAtmLabel.vpi,LspCBVar->downAtmLabel.vci);*/
	    	if(action_flag == LDP_FWD_CREATE)
			{
			    FecLabel.Operaction = 0;
				return mpls_feclabel_recv_process(&FecLabel,LspCBVar);
			}	
			else
			{
			    FecLabel.needOperSar = 0;
			    if(((LspCBVar->index2 == 1) && (LspCBVar->index1 == 0))|| \
			      ((LspCBVar->index2 != 0) && (LspCBVar->index1 != 0)))
			        FecLabel.needOperSar = 1;
			    FecLabel.Operaction = 1;
				return mpls_feclabel_close_process(&FecLabel,LspCBVar);
			}
		}
		else if(LspCBVar->nodeType == MPLS_NODE_INGRESS)	
		{
	    	/* send up ATM label */
		    FecLabel.xcLabel.downAtmLabel.module = LspCBVar->upAtmLabel.module;
		    FecLabel.xcLabel.downAtmLabel.port = LspCBVar->upAtmLabel.port;
		    FecLabel.xcLabel.downAtmLabel.vpi  = LspCBVar->upAtmLabel.vpi;
		    FecLabel.xcLabel.downAtmLabel.vci  = LspCBVar->upAtmLabel.vci;
		    FecLabel.xcLabel.downLabelValid    = DOWN_A

⌨️ 快捷键说明

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