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

📄 ldpfunc.c

📁 技术文件名称:MPLSv1.0软件模块测试规程
💻 C
📖 第 1 页 / 共 5 页
字号:
/********************************************************************/          
/*	Product Name:	MPLS PACK 1.0 									*/                                      	          
/*	Module  Name:	LDP    											*/						     
/*	File    Name:   LdpFunc.c										*/					        	                
/*	Author  Name: 	hu.yonghong     								*/                   
/*	Creat   Date:	2002/6/19                                       */ 
/*	Version		:	1.0                                             */            
/*	Function    :	lspCB FSM function				                */
/* 2002.11.11 Huyonghong fill the structure to forwarding            */
/* 2002.11.19 Huyonghong modify cr response to fec                  */ 
/* 2003.1.16 Huyonghong move lspcb substatus change to lspfsm       */
/* 2003.1.26 Huyonghong if bandwidth/crpvc req timeout,send to release it */
/* 2003.2.20 huyonghong send tcp msg from Func_lblmsg_wait_proce */
/* 2003.3.4 huyonghong modify path vector memmory manage */
/* 2003.3.11 huyonghong if traffic parameters error,delete ldpCB */
/* 2003.4.3 huyonghong 启用mpls_policy_filter函数 */
/* 2003-7-10 szh mod 在V2.2版本,带给C的流量参数值有变化
/* 2003-8-15 szh mod 在出错时要把申请的pCrfec控制块释放掉,在不是ingress节点时
   向上游发通知消息                                              */
/*2003.9.17  Fengjun 减少和C进程的交互                               */
/* 2003-9-23 lixia add for release_pvc queue's memmory process */
/* 2003-11-25 lixia mod ldp_del_lspCB for dele aggrate body    */
/* 2003-12-3 szh add avoid memory leak */
/* 2003-12-29 szh lixia mod dele p_s_f  */
/* 2003.12.30 lixia 增加session整链插入函数处理 */
/* fengjun 2003.12.30 直接调用宏删除CR控制块不安全,用函数ldp_del_lspCB替代*/
/* 2003.12.30 fengjun 整链插入时,调用MplsInsertIntoupGlobalList和MplsInsertIntodownGlobalList函数*/
/* 2004-1-5 lixia add for debug mpls */
/* 2004-1-5  shizhaohui add for errorcode                 */
/********************************************************************/

#include "ldpvars.h"
#include "mplsni.h"

unsigned long labelgeterror=0;
extern unsigned long hoptraffpara_pdr, hoptraffpara_pbs;
extern unsigned char encapsulation_mode;
extern RoutEntry *Mpls_RtGetFrZef( IPaddr dest);
extern RoutEntry *mpls_match_route(IPaddr mpls_dest,ulong mpls_mask);
unsigned short LDP_LSPTYPE(unsigned long x)
{
	if(x&0x80000000)
		return LDP_HOP_LSP;
	else
		return LDP_CR_LSP;
}

/********************************************************************/
/*	Author  Name: weng.qing  shi.zhaohui  sun.baoping               */
/*	Creat   Date:	2001/12/20                                      */
/*	Function    :	request message to fec message                  */
/********************************************************************/

void seg_fec_msg(FecMsg * fec_msg, void * msg)
{
	mplsLdpLblReqMsg_t 	*lblReqMsg;
	int                 ii;
	
	lblReqMsg		=	(mplsLdpLblReqMsg_t *)msg;
	if(lblReqMsg->fecTlvExists == 1)
	{
		MPLS_MEMCPY(fec_msg->Fec.fecElArray,lblReqMsg->fecTlv.fecElArray,
           			CONTENT_MAX_LENGTH);
	    for(ii = 0; ii < lblReqMsg->fecTlv.numberFecElements; ii ++)
	    {
	      fec_msg->Fec.fecElemTypes[ii] = lblReqMsg->fecTlv.fecElemTypes[ii];
	    }
	    fec_msg->Fec.fecElemNum = lblReqMsg->fecTlv.numberFecElements;
	}
	if(lblReqMsg->lspidTlvExists == 1)
	{
		fec_msg->Fec.TlvExists.flags.lspidTlvExists	=	1;
		MPLS_MEMCPY(&fec_msg->Fec.lspidTlv,
								&lblReqMsg->lspidTlv,
								sizeof(mplsLdpLspIdTlv_t));
	}
	if(lblReqMsg->erTlvExists == 1)
	{
		fec_msg->Fec.TlvExists.flags.erTlvExists	=	1;
		MPLS_MEMCPY(&fec_msg->Fec.erTlv,
								&lblReqMsg->erTlv,
								sizeof(mplsLdpErTlv_t));
	}
	if(lblReqMsg->trafficTlvExists == 1)
	{
		fec_msg->Fec.TlvExists.flags.trafficTlvExists	=	1;
		MPLS_MEMCPY(&fec_msg->Fec.Traffic,
								&lblReqMsg->trafficTlv,
								sizeof(mplsLdpTrafficTlv_t));
	}
	if(lblReqMsg->pinningTlvExists == 1)
	{
		fec_msg->Fec.TlvExists.flags.pinningTlvExists	=	1;
		MPLS_MEMCPY(&fec_msg->Fec.pinningTlv,
								&lblReqMsg->pinningTlv,
								sizeof(mplsLdpPinningTlv_t));
	}
	if(lblReqMsg->recClassTlvExists == 1)
	{
		fec_msg->Fec.TlvExists.flags.recClassTlvExists	=	1;
		MPLS_MEMCPY(&fec_msg->Fec.resClassTlv,
								&lblReqMsg->resClassTlv,
								sizeof(mplsLdpResClsTlv_t));
	}
	if(lblReqMsg->preemptTlvExists == 1)
	{
		fec_msg->Fec.TlvExists.flags.preemptTlvExists	=	1;
		MPLS_MEMCPY(&fec_msg->Fec.preemptTlv,
								&lblReqMsg->preemptTlv,
								sizeof(mplsLdpPreemptTlv_t));
	}
	return;
}

void set_cr_fec_mag(FecMsg * fec_msg, mplsLdpCrLsp * crEntry)
{
	int                 ii;
	lblmsgTlvExists    tlvflags;
	
	tlvflags.mark      = crEntry->tlvExists;
	
	fec_msg->Fec.TlvExists.flags.lspidTlvExists	=	1;
	fec_msg->Fec.lspidTlv.localCrlspId = crEntry->crfec_key.locallspid;
	fec_msg->Fec.lspidTlv.routerId = crEntry->crfec_key.ingressid;
	
	if(tlvflags.flags.erTlvExists == 1)
	{
		fec_msg->Fec.TlvExists.flags.erTlvExists	=	1;
		MPLS_MEMCPY(&fec_msg->Fec.erTlv,
								&crEntry->erTlv,
								sizeof(mplsLdpErTlv_t));
	}
	if(tlvflags.flags.trafficTlvExists == 1)
	{
		fec_msg->Fec.TlvExists.flags.trafficTlvExists	=	1;
		MPLS_MEMCPY(&fec_msg->Fec.Traffic,
								&crEntry->trafficTlv,
								sizeof(mplsLdpTrafficTlv_t));
	}
	if(tlvflags.flags.pinningTlvExists == 1)
	{
		fec_msg->Fec.TlvExists.flags.pinningTlvExists	=	1;
		MPLS_MEMCPY(&fec_msg->Fec.pinningTlv,
								&crEntry->pinningTlv,
								sizeof(mplsLdpPinningTlv_t));
	}
	if(tlvflags.flags.recClassTlvExists == 1)
	{
		fec_msg->Fec.TlvExists.flags.recClassTlvExists	=	1;
		MPLS_MEMCPY(&fec_msg->Fec.resClassTlv,
								&crEntry->resClassTlv,
								sizeof(mplsLdpResClsTlv_t));
	}
	if(tlvflags.flags.preemptTlvExists == 1)
	{
		fec_msg->Fec.TlvExists.flags.preemptTlvExists	=	1;
		MPLS_MEMCPY(&fec_msg->Fec.preemptTlv,
								&crEntry->preemptTlv,
								sizeof(mplsLdpPreemptTlv_t));
	}
	return;
}
/********************************************************************/
/*	Author  Name: weng.qing  shi.zhaohui  sun.baoping               */
/*	Creat   Date:	2001/12/20                                      */
/*	Function    :	check label request message source              */
/********************************************************************/
short checkMsgSource(mplsLdpLspCB *LspCBVar, FecMsg * fecMsg)
{
	ldpMibSessionIndexReq_t     sesIndex_s;
  	mplsLdpSession_t            *session = MPLS_NULL;

    if(fecMsg->Fec.RouteType != MPLS_NODE_INGRESS)
    {
		sesIndex_s.sessionIndex = LspCBVar->upSessionIndex;
	    sesIndex_s.indexFlag  	= 1;
	    session = MibSession(&sesIndex_s,LDP_SEARCH);
	    if (session == MPLS_NULL)
	    {
	    	#ifdef DEBUG_LDP
			    #ifdef __BGS10_MPLS_DEBUG
					printf("========FEC INQUIRE OK CHECK MSGSRC NO SESSION ==");
			    #endif
			  #endif
	    }
	    else
	    {
		    if(session->nexthopaddr == fecMsg->Fec.NextHop)
		    {
		    	LspCBVar -> errorcode = CHECKMSGLOOPDETECT;
		    	sndnotifymsgproc(session,LOOPDETECT,LspCBVar->upMsgid,\
					         MPLS_LBLMAP_MSGTYPE);
			    return LDP_FALSE;
		    }
	    }
	}
	return LDP_TRUE;
}
/********************************************************************/
/*	Author  Name: weng.qing  shi.zhaohui  sun.baoping               */
/*	Creat   Date:	2001/12/20                                      */
/*	Function    :	check service class or service priority         */
/********************************************************************/
short ServiceClass(mplsLdpTrafficTlv_t * trafficTlv)
{
	unsigned long param1,param2,param3,param4,param5;
	
	param1 = trafficTlv->pdr.pdr;
	param2 = trafficTlv->pbs.pbs;
	param3 = trafficTlv->cdr.cdr;
	param4 = trafficTlv->cbs.cbs;
	param5 = trafficTlv->ebs.ebs;

	if ((param1 != 0) && (param2 != 0) && (param3 != 0) && (param4 != 0)\
		&& (param3 == param1) && (param4 == param2) && (param5 == 0)\
		&& (trafficTlv->freq == VERY_FREQUENT)) 
		return CBRService;
	if ((param1 != 0) && (param2 != 0) && (param3 != 0) && (param4 != 0)\
		&& (param3 == param1) && (param4 == param2) && (param5 == 0)\
		&& (trafficTlv->freq == UNSPECIFIED)) 
		return UBRService;
	else
	if ((param1 != 0) && (param2 != 0) && (param3 != 0) && (param4 != 0)\
		&& (param3 <= param1) && (param4 <= param2) && (param5 == 0)\
		&& (trafficTlv->freq == FREQUENT)) 
		return rtVBRService;
	else
	if ((param1 != 0) && (param2 != 0) && (param3 != 0) && (param4 != 0)\
	    && (param3 <= param1) && (param4 <= param2) && (param5 == 0)\
		&& (trafficTlv->freq == UNSPECIFIED)) 
		return nrtVBRService;
	else
	if ((param1 != 0) && (param2 != 0) && (param3 == 0)\
		&& (param4 == 0) && (param5 == 0)\
		&& (trafficTlv->freq == UNSPECIFIED)) 
		return UBRService;
	else
		return LDP_FALSE;
}

mplsLdpSession_t *search_session_from_sessindex(unsigned long SessionIndex1)
{
  	ldpMibSessionIndexReq_t		sesIndex;
  	mplsLdpSession_t            *session = MPLS_NULL;

    sesIndex.sessionIndex   = SessionIndex1;
    sesIndex.indexFlag  	= 1;
    session = MibSession(&sesIndex,LDP_SEARCH);
    if (session == MPLS_NULL) 
    {
        #ifdef MPLS_ERR_PRINT
                DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_LSP,"==== LABEL REQ Session Index FAIL %x====\n",SessionIndex1);
			    printf("==== LABEL REQ Session Index FAIL====\n");
		    #endif 
      	return NULL;
    }
	return session;
	
}

/* 2003-8-15 szh mod 在出错时要把申请的pCrfec控制块释放掉,在不是ingress节点时
   向上游发通知消息 */
/*填路由信息*/
/* fengjun 2003.12.30 直接调用宏删除CR控制块不安全,用函数ldp_del_lspCB替代*/
short ldp_fec2lspCB(mplsLdpLspCB *LspCBVar,FecMsg *fecMsg)
{
	mplsLdpSession_t 		  *session = MPLS_NULL;
	mplsLdpCrLsp		      *pCrfec = MPLS_NULL;
	
	if(LspCBVar->lspType == LDP_CR_LSP)
	{
	    if(LspCBVar->nodeType != MPLS_NODE_EGRESS)
	    {
		MPLS_NEXTHOP_SESSION_SEARCH(fecMsg->Fec.NextHop,session);
		pCrfec = (mplsLdpCrLsp *)LspCBVar->selffec;
		if(session == MPLS_NULL)
		{
			    if( pCrfec->crlspCb.nodeType == MPLS_NODE_INGRESS)
    	        {
    		    LspCBVar->errorcode = CRLSPNODOWNSESSION;
    	    	    MPLS_MEMCPY(&fec_msg,fecMsg,sizeof(FecMsg));
			        fec_msg.OperateType     = RESPONSE_TYPE;
			        fec_msg.Fec.statusCode	= NOROUTE;
			        fecPid.module = selfLdpPid.module;
    	            ASEND(MPLS_FEC_STUDY,&fec_msg,sizeof(FecMsg),fecPid);  
    	            ldp_del_lspCB((char *)pCrfec,&pCrfec->crlspCb);
    	        }
    	        else
    	        {
    	          /******************************************************/
    	          /* send to up notification message, should check fengjun
    	         /*
    	         /******************************************************/
    	           MPLS_INDEX_TO_SESSION(session,pCrfec->crlspCb.upSessionIndex);
    	           if(session)
    	           {
    	               MPLS_REMOVE_FROM_SESSION_UP_LSP_LIST(session->lsp_up_cb_list,\
    	    		        	&(pCrfec->crlspCb));
    	               MPLS_SEND_NOTIFY(session,NOROUTE,pCrfec->crlspCb.upMsgid, \
			                   MPLS_LBLREQ_MSGTYPE);
			       }        
		           ldp_del_lspCB((char *)pCrfec,&pCrfec->crlspCb);
    	        }
            DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_LSP,"ldp_fec2lspCB session search error %x\n",pCrfec->crlspCb.upSessionIndex);
			MPLS_ERR_LOG("ldp_fec2lspCB session search error");
			return LDP_FALSE;
		}
		LspCBVar->downifIndex = session->ifIndex;
		LspCBVar->downSessionIndex = session->index;
		LspCBVar->downPeerLdpid.lsrAddress = session->peerLdpId.lsrAddress;
		LspCBVar->downPeerLdpid.labelSpace = session->peerLdpId.labelSpace;
                MPLS_INSERT_INTO_DOWN_LSP_LIST(session->lsp_down_cb_list,\
    		            &(pCrfec->crlspCb),&(pCrfec->crlspCb));
		
		ifindex2mod_req.ifIndex 	= LspCBVar->downifIndex;
		ifindex2mod_req.mpls_protocol_type = MPLS_LABEL_SWITCH_PROTOCOL_ATM;
		ifindex2mod_req.mpls_platform      = local_platform;
		mpls_ifindex2module(&ifindex2mod_req,&ifindex2mod_ack,MPLS_INTERFACE);
		if(ifindex2mod_ack.ack == MPLS_SUCCESS)
		{
			LspCBVar->downAtmLabel.module = ifindex2mod_ack.mod;
			LspCBVar->downAtmLabel.port   = ifindex2mod_ack.port;
		}
		else 
		    {
			    pCrfec = (mplsLdpCrLsp *)LspCBVar->selffec;
			    if( pCrfec->crlspCb.nodeType == MPLS_NODE_INGRESS)
    	        {
    	    	    LspCBVar->errorcode = CRLSPSEARCHDOWPORTERR;
    	    	    MPLS_MEMCPY(&fec_msg,fecMsg,sizeof(FecMsg));
			        fec_msg.OperateType     = RESPONSE_TYPE;
			        fec_msg.Fec.statusCode	= INTERNALERROR;
			        fecPid.module = selfLdpPid.module;
    	            ASEND(MPLS_FEC_STUDY,&fec_msg,sizeof(FecMsg),fecPid);  
                    MPLS_REMOVE_FROM_SESSION_DOWN_LSP_LIST(session->lsp_down_cb_list,\
    	    		        	&(pCrfec->crlspCb));   
    	            ldp_del_lspCB((char *)pCrfec,&pCrfec->crlspCb);
    	        }
    	        else
    	        {
    	           /******************************************************/
    	           /* send to up notification message, should check fengjun
    	          /*
    	          /******************************************************/
    	           MPLS_INDEX_TO_SESSION(session,pCrfec->crlspCb.upSessionIndex);
    	           if(session)
    	           {
    	               MPLS_REMOVE_FROM_SESSION_UP_LSP_LIST(session->lsp_up_cb_list,\
    	    		    	&(pCrfec->crlspCb));
    	               MPLS_SEND_NOTIFY(session,NOROUTE,pCrfec->crlspCb.upMsgid, \
			                MPLS_LBLREQ_MSGTYPE);
			       }        
                       MPLS_REMOVE_FROM_SESSION_DOWN_LSP_LIST(session->lsp_down_cb_list,\
    	    	        	&(pCrfec->crlspCb)); 
		           ldp_del_lspCB((char *)pCrfec,&pCrfec->crlspCb);
    	        }
                DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_LSP,"ldp_fec2lspCB 2 ifindex search error %x\n",pCrfec->crlspCb.upSessionIndex);         
    	        MPLS_ERR_LOG("ldp_fec2lspCB ifindex search error");         
			    return LDP_FALSE;				
		    }	
	    }

⌨️ 快捷键说明

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