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

📄 ldpmain.c

📁 路由器协议平台mpls协议的设计与实现源代码。
💻 C
📖 第 1 页 / 共 4 页
字号:
void  func_protimer7(TimerEventStruc *timerstruct)
{
	mplsOAMLdpMessage_t		*oammess;
	
    if(timerstruct->extra == MPLS_MIB_LDP_LSR_ATTR)
    {
        oammess->msgtype = MPLS_MIB_LDP_LSR_ATTR;
        oammess->mplsLdpOAMflag = 1;
        MPLS_PSEND(MPLS_LDP_OAM_MESSAGE, oammess,sizeof(mplsLdpOAMMessage)+sizeof(unsigned char),mlsmanagePid);
        TimerID_oamldp = EXTRA_SET_TIMER(TIMER7_LDPPERIOD,MPLS_TIMER7,MPLS_MIB_LDP_LSR_ATTR);
    }
    if(timerstruct->extra == MPLS_MIB_LDP_INTERFACE)
    {
        oammess->msgtype = MPLS_MIB_LDP_INTERFACE;
        oammess->mplsLdpOAMflag = 1;
        MPLS_PSEND(MPLS_LDP_OAM_MESSAGE, oammess,sizeof(mplsLdpOAMMessage)+sizeof(unsigned char),mlsmanagePid);
        TimerID_oamldp = EXTRA_SET_TIMER(TIMER7_LDPPERIOD,MPLS_TIMER7,MPLS_MIB_LDP_INTERFACE);
    }
    if(timerstruct->extra == MPLS_MIB_LDP_ENTITY)
    {
        oammess->msgtype = MPLS_MIB_LDP_ENTITY;
        oammess->mplsLdpOAMflag = 1;
        MPLS_PSEND(MPLS_LDP_OAM_MESSAGE, oammess,sizeof(mplsLdpOAMMessage)+sizeof(unsigned char),mlsmanagePid);
        TimerID_oamldp = EXTRA_SET_TIMER(TIMER7_LDPPERIOD,MPLS_TIMER7,MPLS_MIB_LDP_ENTITY);
    }
    if(timerstruct->extra == MPLS_MIB_LDP_DEF_TRAFFIC)
    {
        oammess->msgtype = MPLS_MIB_LDP_DEF_TRAFFIC;
        oammess->mplsLdpOAMflag = 1;
        MPLS_PSEND(MPLS_LDP_OAM_MESSAGE, oammess,sizeof(mplsLdpOAMMessage)+sizeof(unsigned char),mlsmanagePid);
        TimerID_oamldp = EXTRA_SET_TIMER(TIMER7_LDPPERIOD,MPLS_TIMER7,MPLS_MIB_LDP_DEF_TRAFFIC);
    }
    if(timerstruct->extra == MPLS_INTERNAL_PORT_VPI_VCI)
    {
        oammess->msgtype = MPLS_INTERNAL_PORT_VPI_VCI;
        oammess->mplsLdpOAMflag = 1;
        MPLS_PSEND(MPLS_LDP_OAM_MESSAGE, oammess,sizeof(mplsLdpOAMMessage)+sizeof(unsigned char),mlsmanagePid);
        TimerID_oamldp = EXTRA_SET_TIMER(TIMER7_LDPPERIOD,MPLS_TIMER7,MPLS_INTERNAL_PORT_VPI_VCI);
    }
    return;
}

/************ 发现过程初始化	*************/
/* modify hy hu.yonghong 2002-7-3*/
void InitHello()
{
	unsigned short ii;
	       		    
	/*  从每一个entity包含的配置了MPLS属性的端口发送hello消息 */		
	for (ii = 0; ii < allEntity.num; ii++)	
	    if(allEntity.entity[ii].adminStatus == 1)    
		{
    		SendLdpHello(&allEntity.entity[ii]);
    }
    #ifdef DEBUG_LDP
        #ifdef __BGS10_MPLS_DEBUG
		    printf("==== Ldp Init hello successful ====");
	    #endif
    #endif
    return;
}


/*************************************************************************************/
/* 函数	  			: void ProcTcpCon(unsigned long peerIpaddr,unsigned long localIpaddr,            */
/*						unsigned short PeerPort,unsigned short LocalPort,unsigned long  eventType)		     */						 
/* 功能				: ProcTcpCon												     */
/* 输入		        : peerIpaddr localIpaddr PeerPort LocalPort    eventType         */                      
/* 输出		        : no                                                             */
/* 全局变量		    : no                                                             */
/* 作者		        :                                                  				 */
/* 修改记录         :wengqing 2001/08/30 match session state role substate           */
/*					                                         					     */
/*************************************************************************************/
void ProcTcpCon(unsigned long peerIpaddr,unsigned long localIpaddr,unsigned short PeerPort,unsigned short LocalPort,unsigned long  eventType)
{
    ldpMibSessionIndexReq_t     sesIndex_s;
    mplsLdpSession_t            * session = MPLS_NULL;
    TCP_CONNECT_MSG		        tcpRelMsg;
    int							rtcode;
    
    sesIndex_s.localIpaddr = localIpaddr; 
	sesIndex_s.peerIpaddr = peerIpaddr;
    sesIndex_s.indexFlag      = 3; 
	session = MibSession(&sesIndex_s, LDP_SEARCH);

    if (session == MPLS_NULL)
    {
        tcpRelMsg.LocalIpaddr  = localIpaddr;
	    tcpRelMsg.PeerIpaddr   = peerIpaddr;
	    tcpRelMsg.PeerPort     = PeerPort;
	    tcpRelMsg.LocalPort    = LocalPort;
	    MPLS_PSEND(TCP_RELEASE_REQ,&tcpRelMsg,sizeof(TCP_CONNECT_MSG),udptcpPid);
	  //  #ifdef __BGS10_MPLS_DEBUG
              DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_SESSION,"========ProcTcpCon,MODULE :%d  SEND TCP RELEASE SESSION MISMATCH,localIpaddr %x,peerIpaddr %x=======\n",selfLdpPid.module,localIpaddr,peerIpaddr);
		    printf("========MODULE :%d  SEND TCP RELEASE SESSION MISMATCH=======\n",selfLdpPid.module);
	  //  #endif            
	    return;
	}
	else
	{
        if((session->state 		==  TCP_RELEASE_AWAITED )&&
        	(session->subState	==	REL_IND_AWAIT )&&
        	(session->role 		==  PASSIVE))
        {
        	/* delete Tcp Timer */
	        if (session->tmidCon > 0)
	    	{
	    		#ifdef SESSION_DEBUG
		            #ifdef __BGS10_MPLS_DEBUG
		        		printf("==MODULE:%d DELETE TCP TIMER: tmid:%d==",
		    		        selfLdpPid.module,session->tmidCon);
		    		    printf("==MODULE:%d ACCEPT CONNECT PASSIVE==",
		    		        selfLdpPid.module);
		    		#endif
	    		#endif
				MPLS_CLEAR_TIMER(session->tmidCon,ldptime_q,rtcode);
	    	    session->tmidCon = 0;
	    	}
	    	else
	    	{ 
	    	    printf("====internal implementation error,session tcp timer %d====",
	    	            session->tmidCon);
	        }
	        session->state 		= NONEXISTENT;
	        session->subState 	= NONIDLE;
        }
        
        if (((session->state == TCP_CONNECT_AWAITED )&& (session->role == ACTIVE))|| 
        	((session->state == NONEXISTENT )&&(session->role == PASSIVE)))
		{
	        session->LocalPort =  LocalPort;
        	session->PeerPort  =  PeerPort; 
		    printf("===MODULE :%d in session table localAddr %x, peerAddr %x, LocalPort %d, PeerPort %d===\n",
		        selfLdpPid.module,session->localIpaddr,session->peerIpaddr,session->LocalPort,session->PeerPort);
		        SessionFSM(session, eventType, NULL);
	    	return; 
    }    
	    else
	    {
	    	tcpRelMsg.LocalIpaddr  = localIpaddr;
		    tcpRelMsg.PeerIpaddr   = peerIpaddr;
		    tcpRelMsg.PeerPort     = PeerPort;
		    tcpRelMsg.LocalPort    = LocalPort;
		    MPLS_PSEND(TCP_RELEASE_REQ,&tcpRelMsg,sizeof(TCP_CONNECT_MSG),udptcpPid);
		    #ifdef __BGS10_MPLS_DEBUG
			    printf("========MODULE :%d  SEND TCP RELEASE STATE MISMATCH=======\n",selfLdpPid.module);
		    #endif
    return;
}    
    }

}    

/****************		处理收到的PROT_TCP连接释放成功消息		*********/
/* modify by hyh 2002-7-5  */
void ProcTcpRel(unsigned long peerIpaddr,unsigned long localIpaddr, unsigned short PeerPort, unsigned short  LocalPort, unsigned long  eventType)
{
    ldpMibSessionIndexReq_t     sesIndex_s;
    mplsLdpSession_t            * session = MPLS_NULL;
    
    sesIndex_s.localIpaddr = localIpaddr;  
	sesIndex_s.peerIpaddr = peerIpaddr;
    sesIndex_s.indexFlag      = 3; 
	session = MibSession(&sesIndex_s, LDP_SEARCH);

    if (session == MPLS_NULL)
    {
       // #ifdef __BGS10_MPLS_DEBUG
        DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_SESSION,"=== ProcTcpRel,not in session table, localIpaddr %x, peerIpaddr %x===\n",
            sesIndex_s.localIpaddr,sesIndex_s.peerIpaddr);
        printf("===== in session table, localIpaddr %d, peerIpaddr %d=====",
            sesIndex_s.localIpaddr,sesIndex_s.peerIpaddr = peerIpaddr);
     //   #endif
        return;
    }
    
    #ifdef __BGS10_MPLS_DEBUG
    // szh mod for add tcp link port, in 2001-7-10 10:17
    printf("===== in session table, localport %d, peerport %d=====",
        session -> LocalPort,session -> PeerPort);
    #endif
    
    if((session -> LocalPort == LocalPort) && (session -> PeerPort == PeerPort))
    {
    SessionFSM(session, eventType, NULL);
    }
    else
    {
        printf("===== tcp link is not match, abort it ======");
    }
    return;
}

/***********************************************************************/     
/*	Author  Name:   wengqing, shizhaohi     						    */          
/*	Creat   Date:	12/20/99										    */
/*	Version		:	1.0                                         	    */          
/*	Function    :	处理收到的FEC建立消息	                            */
/*  History     :   mod add return error code to nms 2001/11/14 szh		*/
/*  mod  2001/11/15  mod add return error code to nms  szh				*/
/*  modfiy         2001/11/17 shizhaohui									*/
/* 	add response to nms for hop by hop lsp in special condition 	        */
/* 2002.11.07 for no mpls ldp routerid, protection lspidTlv.routerId == 0 */
/************************************************************************/          

void FecSetup(FecMsg * fecMsg)
{
	mplsLdpCrLsp			* pCrfec = MPLS_NULL;
	lblmsgTlvExists         tlvExist;
	MPLS_ASSERT(fecMsg->Fec.TlvExists.flags.lspidTlvExists != 0);
	/* 2002.11.07 for no mpls ldp routerid, protection lspidTlv.routerId == 0 */
	if(fecMsg->Fec.lspidTlv.routerId == 0)
	{
	    MPLS_ERR_LOG("==== Receive MPLS_FEC_SETUP,OperateType %d,Rouerid = 0,lspid %d ====", fecMsg->OperateType,fecMsg->Fec.lspidTlv.localCrlspId);	
    	DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_CR,"==== Receive MPLS_FEC_SETUP,OperateType %d,Rouerid = 0,lspid %x ====\n", \
    						fecMsg->OperateType,fecMsg->Fec.lspidTlv.localCrlspId);	
	    MPLS_MEMCPY(&fec_msg,fecMsg,sizeof(FecMsg));
		if(fecMsg->OperateType != DELETE_PVC_TYPE)
		{
    		fec_msg.OperateType     = RESPONSE_TYPE;
    		fec_msg.Fec.statusCode	= NOROUTE;
        }
        else
        {
            fec_msg.OperateType     = DELETE_PVC_TYPE;
    		fec_msg.Fec.statusCode	= 0;
        }
        fecPid.module = selfLdpPid.module;
        ASEND(MPLS_FEC_STUDY,&fec_msg,sizeof(FecMsg),fecPid);
	}
	/* 2002.11.07 for no mpls ldp routerid, protection lspidTlv.routerId == 0 end */
	MPLS_CRFECCB_SEARCH(fecMsg->Fec.lspidTlv.routerId,fecMsg->Fec.lspidTlv.localCrlspId,pCrfec); 										\
    tlvExist.mark = 0;
     switch(fecMsg->OperateType)
    {
    	MPLS_ERR_LOG("==== Module %d,Receive MPLS_FEC_SETUP,OperateType %d ====", \
    						selfLdpPid.module,fecMsg->OperateType);	
    	case NEW_TYPE:      	
        	if(pCrfec)
        	{
        		MPLS_ERR_LOG("==LDP Receive FecMsg Ingress %x, LspId %d, duplicate Request==\n", \
        		             fecMsg->Fec.lspidTlv.routerId,\
							 fecMsg->Fec.lspidTlv.localCrlspId);
							 
			    MPLS_ERR_LOG("==cr lsp cb status  %d, subStatus %d, lsp type: %d,waitflag: %d ==\n", \
        		             pCrfec->crlspCb.status,\
							 pCrfec->crlspCb.subStatus,
							 pCrfec->crlspCb.lspType,
							 pCrfec->crlspCb.waitflag);
        		return;
        	}
        	else
        	{
        		MPLS_CRFECCB_CREATE(fecMsg->Fec.lspidTlv.routerId,\
						fecMsg->Fec.lspidTlv.localCrlspId,pCrfec);
				if(!pCrfec)
				{
					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);
				DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_CR,"FecSetup,creat crfec fail\n");
				}
				else
				{
					/********************************************************/
					/* update Crfec control block attribute
					*/
					/********************************************************/
					tlvExist.flags.fecTlvExists = 1;
					tlvExist.flags.lspidTlvExists = 1;
					pCrfec->crlspCb.nodeType = MPLS_NODE_INGRESS;
					pCrfec->crlspCb.lspIndex = MPLS_GET_CRLSP_INDEX;
					pCrfec->crlspCb.lspType  = LDP_CR_LSP;
					pCrfec->crlspCb.status    = IDLE;
					pCrfec->crlspCb.subStatus    = IDLE;
					pCrfec->crlspCb.upAtmLabel.module = fecMsg->Fec.sbModule;
					pCrfec->crlspCb.upAtmLabel.port   = fecMsg->Fec.sbPort;
					pCrfec->mplsLdpFecType = fecMsg->Fec.fecElemTypes[0];
					setCrFilter(pCrfec,fecMsg);
					if(pCrfec->mplsLdpFecType != MPLS_CRLSP_FEC)
					{
					    pCrfec->mplsLdpFecAddrLen = fecMsg->Fec.fecElArray[0].addressEl.preLen;
					    pCrfec->mplsFecAddr = fecMsg->Fec.fecElArray[0].addressEl.address;
					}
					if(fecMsg->Fec.TlvExists.flags.erTlvExists == 1)
					{
					    MPLS_MEMCPY(&(pCrfec->erTlv),&(fecMsg->Fec.erTlv), \
					            sizeof(mplsLdpErTlv_t));
					    tlvExist.flags.erTlvExists = 1;
					}
				    if(fecMsg->Fec.TlvExists.flags.trafficTlvExists == 1)
					{
					    MPLS_MEMCPY(&(pCrfec->trafficTlv),&(fecMsg->Fec.Traffic), \
					            sizeof(mplsLdpTrafficTlv_t));
					    tlvExist.flags.trafficTlvExists = 1;
					}
					if(fecMsg->Fec.TlvExists.flags.pinningTlvExists == 1)
					{
					    MPLS_MEMCPY(&(pCrfec->pinningTlv),&(fecMsg->Fec.pinningTlv), \
					            sizeof(mplsLdpPinningTlv_t));
					    tlvExist.flags.pinningTlvExists = 1;
					}
					if(fecMsg->Fec.TlvExists.flags.recClassTlvExists == 1)
					{
					    MPLS_MEMCPY(&(pCrfec->resClassTlv),&(fecMsg->Fec.resClassTlv), \
					            sizeof(mplsLdpResClsTlv_t));
					    tlvExist.flags.recClassTlvExists = 1;
					}
					if(fecMsg->Fec.TlvExists.flags.preemptTlvExists == 1)
					{
					    MPLS_MEMCPY(&(pCrfec->preemptTlv),&(fecMsg->Fec.preemptTlv), \
					            sizeof(mplsLdpPreemptTlv_t));
					    tlvExist.flags.preemptTlvExists = 1;
					}
				    pCrfec->tlvExists = tlvExist.mark;
					ProcFecInquire(fecMsg);
				}
        	}
    		break;
    	case LBLABORT_TYPE:
    		if(pCrfec)
	    	{
	    		/************************************************************/
	    		/* use downstream atm label module and port judge downstream
	    		 * lsr label distribution mode;
	    		 * because downstream session may be invalid and set to zero
	    		*/
	    		/************************************************************/
	    		if(pCrfec->crlspCb.downAtmLabel.module == 0 && \
	    		   pCrfec->crlspCb.downAtmLabel.port == 0)
	    		{
					/********************************************************/
					/* DU mode
					*/
					/********************************************************/
					/* add into msg link list */
					
				}
				else
				{
				    /*sendToFecCrlsp(pCrfec,DELETE_PVC_TYPE,0);*/
					if(!((&(pCrfec->crlspCb))->waitflag & 0x1))
					LspCBFsm(MPLS_NULL,MPLS_LBLABORT_MSGTYPE,MPLS_NULL, \
					 		 LDP_CR_LSP,pCrfec,&(pCrfec->crlspCb));
				}
	    	}
    		break;
    	case UPDATE_TYPE:
    		break;
    	case DELETE_PVC_TYPE:
    	    if(pCrfec)
	    	{
	    		/************************************************************/
	    		/* use downstream atm label module and port judge downstream
	    		 * lsr label distribution mode;
	    		 * because downstream session may be invalid and set to zero
	    		*/
	    		/************************************************************/
	    		if(pCrfec->crlspCb.downAtmLabel.module == 0 && \
	    		   pCrfec->crlspCb.downAtmLabel.port == 0)
	    		{
					/********************************************************/
					/* DU mode
					*/
					/********************************************************/
					/* add into msg link list */
					
				}
				else
				{
				    /*sendToFecCrlsp(pCrfec,DELETE_PVC_TYPE,0);*/
					if(!((&(pCrfec->crlspCb))->waitflag & 0x1))
					LspCBFsm(MPLS_NULL,UPSTREAM_LOST,MPLS_NULL, \
					 		 LDP_CR_LSP,pCrfec,&(pCrfec->crlspCb));
   					else /* if lspcb is to be deleted,response fec DELETE_PVC_TYPE */
					{
				        fecMsg->OperateType      = DELETE_PVC_TYPE;
    		            fecMsg->Fec.statusCode	= 0;
			            fecPid.module = selfLdpPid.module;
    		            ASEND(MPLS_FEC_STUDY,fecMsg,sizeof(FecMsg),fecPid);
	                }

				}

⌨️ 快捷键说明

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