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

📄 ldplspfsm.c

📁 技术文件名称:MPLSv1.0软件模块测试规程
💻 C
📖 第 1 页 / 共 5 页
字号:
/********************************************************************/
/*	Product Name:	MPLS PACK 1.0 									*/
/*	Module  Name:	LDP    											*/
/*	File    Name:   Ldplspfsm.c										*/
/*	Author  Name: 	hu.yonghong     								*/
/*	Creat   Date:	2002/6/19                                       */
/*	Version		:	1.0                                             */
/*	Function    :	lspCB FSM       				                */
/*  History     :   hyh 2002-11-19 modify cr response to fec        */ 
/* huyonghong 2002/12/2 when request timeout,when abort, not delete from SB list, 
                        delete from the up SB list */
/* huyonghong 2002/12/16 判断是否真正的路由删除,有路由,表明不是真正的路由删除,要重发request; */
/* Huyonghong 2002.12.28 ldp在业务板down时把close消息发给转发                           */
/* Huyonghong 2003.1.16 add judge resend in notify process          */ 
/*                      add subStatus change                        */
/*2003.1.28 Huyonghong 对聚合,ingress判断上游模块和端口,如果不相同,更新到同一模块和端口上*/
/*                      对聚合,egress判断下游模块和端口,如果不相同,更新到同一模块和端口上*/
/* 2003.2.16 huyonghong route delete and established,send label close to forwarding module */
/* 2003.3.4 huyonghong modify path vector memmory manage */
/* 2003.4.3 wengqing 当存在FEC聚合时,同一FEC可能使用同一标记,Label Release无法区分,此处为了防止这种情况,
    加以防止;当存在相同路径向量时,不接纳新的Label Request*/   
/* 2003.4.10 Huyonghong  保护多块时,防止建立不起来                     */	
/* 2003.4.23 wengqing 增加保护,如果ldpcb的链表乱掉,将该链表加入到待删除链中 */
/* 2003.5.29 huyonghong 在ProcFecInquireOk增加保护的地方,如果链表乱掉处理后直接返回,否则都要执行
                        MPLS_ROUTE_DELETE操作 */
/* 2003-7-29 shizhaohui 增加LSP建路落地点在SGBC等板子上的处理,聚合增加判断
   nexthop字段                                                       */
/*2003.9.17  Fengjun 减少和C进程的交互                               */
/* 2003-9-23 lixia add ProcReleasePvcAck        */
/* 2003-11-6 lixia change the time of REQ_RESEND_TIME to random time */
/* 2003-11-20 lixia mod ProcCreatePvcAck to show detail unsuccessful established pvc information of unsuccessful
/* 2003-11-21 szh fengjun 在backbone,ingress时,先建立p_s_f,再向C进程发建立PVC消息,
以减少出现堆积LSP控制块的可能性                         */
/* 2003-11-25 lixia mod ProcLblMap_status2 for aggrate */
/* 2003-12-9 fengjun,szh mod 防止sb_list插入链表两次
/* 2003-12-29 szh lixia mod dele p_s_f  */
/* 2003.12.30 fengjun 整链插入时,调用MplsInsertIntoupGlobalList和MplsInsertIntodownGlobalList函数*/

/* 2003-12-10 lixia add for debug mpls                 */
/* 2004-1-5  shizhaohui add for errorcode                 */
/********************************************************************/
#include "ldpvars.h"
extern mpls_label_busy_flags			local_label_busy_flags; /* 2003-10-22 lixia add */
extern unsigned short abort_time;    /*2004-9-29 lixia add for set abort timer*/
short LspCBFsm(mplsLdpSession_t *session,
				unsigned short 	eventType,
				void   			*inputEvent,
				unsigned char  	lspType,
				void   			*pEntry,
				mplsLdpLspCB 	*LspCBVar)
{
	FecMsg       	*pfec_msg;
	mplsLdpLblMapMsg_t 	* 	lblMapMsg = MPLS_NULL;

	switch(LspCBVar->status)
	{
		case IDLE:
			switch(eventType)
   		 	{				
				case MPLS_LBLREQ_MSGTYPE:
					#ifdef __BGS10_MPLS_DEBUG
						printf("==== LspCbFsm,IDLE,MPLS_LBLREQ_MSGTYPE ====");
					#endif	
					ProcLblReq_status1(session,pEntry,LspCBVar,inputEvent);				
					break;
					
                case MPLS_LBLABORT_MSGTYPE: 
				    #ifdef __BGS10_MPLS_DEBUG
						printf("==== LspCbFsm,IDLE,MPLS_LBLABORT_MSGTYPE ====");
					#endif	            
				    ProcLblAbort_status1(pEntry,LspCBVar,1);
					break;
								
				case MPLS_FEC_SETUP:				
					#ifdef __BGS10_MPLS_DEBUG
						printf("==== LspCbFsm,IDLE,MPLS_FEC_INQUIRE_OK ====");
					#endif
					pfec_msg = (FecMsg *)inputEvent;
					if(pfec_msg->OperateType == INQUIRE_TYPE)
					  	ProcFecInquireOk(inputEvent);
          			break;
				case UPSTREAM_LOST:                     
                     #ifdef __BGS10_MPLS_DEBUG
						printf("==== LspCbFsm,IDLE,UPSTREAM_LOST ====");
					#endif
                    /*   处理同LDP  Abort消息     */
					ProcLblAbort_status1(pEntry,LspCBVar,0);
					break;
				case DOWNSTREAM_LOST:
					#ifdef __BGS10_DEBUG
						printf("==== LspCBFsm,IDLE,DOWNSTREAM_LOST=====");
					#endif
					/*   处理同LDP  Abort消息     */
					ProcLblAbort_status1(pEntry,LspCBVar,1);
                    break;

				case MPLS_ROUTE_ADD:
                     #ifdef __BGS10_MPLS_DEBUG
						printf("==== LspCbFsm,IDLE,MPLS_ROUTE_ADD ====");
					#endif
					ProcRouteAdd_status1(pEntry,LspCBVar);
					break;

				case MPLS_ROUTE_DELETE:
                     #ifdef __BGS10_MPLS_DEBUG
						printf("==== LspCbFsm,IDLE,MPLS_ROUTE_DELETE ====");
					#endif
					ProcRouteDel_status123(pEntry,LspCBVar);
					break;

				default:	
					#ifdef __BGS10_MPLS_DEBUG
						printf("==== LspCbFsm,IDLE,default ====");
					#endif	
					break;
     		}
			break;

		case RESPONSE_AWAITED:
       	    switch(eventType)
			{	
			    case MPLS_LBLMAP_MSGTYPE: 					
					#ifdef __BGS10_MPLS_DEBUG
						printf("==== LspCBFsm,RESPONSE_AWAITED,MPLS_LBLMAP_MSGTYPE=====");
					#endif	            
					lblMapMsg = (mplsLdpLblMapMsg_t *)inputEvent;
					if(LspCBVar->lspType == LDP_HOP_LSP) 
					   rec_lblmap_tlvpro(session,lblMapMsg,pEntry,LspCBVar,LDP_HOP_LSP); /* fengjun add */ 
					else
					   rec_lblmap_tlvpro(session,lblMapMsg,pEntry,LspCBVar,LDP_CR_LSP); /* fengjun add */   
					ProcLblMap_status2(pEntry,LspCBVar,inputEvent);
					break;

                case MPLS_LBLABORT_MSGTYPE: 				    
				    #ifdef __BGS10_MPLS_DEBUG
						printf("==== LspCbFsm,RESPONSE_AWAITED,MPLS_LBLABORT_MSGTYPE ====");
					#endif	            
				    ProcLblAbort_status2(pEntry,LspCBVar,1);
					break;
              
				case UPSTREAM_LOST:                     
                     #ifdef __BGS10_MPLS_DEBUG
						printf("==== LspCbFsm,RESPONSE_AWAITED,UPSTREAM_LOST====");
					#endif
                    /* 处理同LDP Abort消息 */
					ProcLblAbort_status2(pEntry,LspCBVar,0);
					break;
				
				case DOWNSTREAM_LOST:
					#ifdef __BGS10_MPLS_DEBUG
						printf("==== LspCBFsm,RESPONSE_AWAITED,DOWNSTREAM_LOST=====");
					#endif
					ProcDownLost_23(pEntry,LspCBVar);
                    break;

				case LDP_DOWNSTREAM_NAK:                	
                	#ifdef __BGS10_MPLS_DEBUG
						printf("==== LspCBFsm,RESPONSE_AWAITED,LDP_DOWNSTREAM_NAK====");
					#endif
                	ProcDownNAK_23(pEntry,LspCBVar,inputEvent);
                	break;

				case MPLS_LBLWITH_MSGTYPE:
				    #ifdef __BGS10_MPLS_DEBUG
						printf("==== LspCBFsm,RESPONSE_AWAITED,MPLS_LBLWITH_MSGTYPE=====");
					#endif	
				    ProcLblWith_2(pEntry,LspCBVar);
                    break;                                

				case MPLS_ROUTE_DELETE:
                     #ifdef __BGS10_MPLS_DEBUG
						printf("==== LspCbFsm,IDLE,ROUTE_DELETE ====");
					#endif
					ProcRouteDel_status123(pEntry,LspCBVar);
					break;

				default:
					#ifdef __BGS10_MPLS_DEBUG
						printf("==== LspCbFsm,RESPONSE_AWAITED,default====");
					#endif
					break;
			} /* end of switch(eventType) */
			break;

		case ESTABLISHED:
       	    switch(eventType)
			{				    
				case MPLS_LBLMAP_MSGTYPE: 
					#ifdef __BGS10_MPLS_DEBUG
						printf("==== LspCBFsm,ESTABLISHED,MPLS_LBLMAP_MSGTYPE=====");
					#endif	            
					lblMapMsg = (mplsLdpLblMapMsg_t *)inputEvent;
					if(LspCBVar->lspType == LDP_HOP_LSP) 
					   rec_lblmap_tlvpro(session,lblMapMsg,pEntry,LspCBVar,LDP_HOP_LSP); /* fengjun add */ 
					else
					   rec_lblmap_tlvpro(session,lblMapMsg,pEntry,LspCBVar,LDP_CR_LSP); /* fengjun add */             
					ProcLblMap_status3(pEntry,LspCBVar,inputEvent);
					break;

                case MPLS_LBLREL_MSGTYPE: 
                	#ifdef __BGS10_MPLS_DEBUG
						printf("==== LspCbFsm,ESTABLISHED,MPLS_LBLREL_MSGTYPE====");
					#endif		    				
				    ProcLblRel_status3(pEntry,LspCBVar,inputEvent,MPLS_LBLREL_MSGTYPE);
				    break;
				     				    				    
				case MPLS_LBLWITH_MSGTYPE:			    
				    #ifdef __BGS10_MPLS_DEBUG
						printf("==== DownLspCBFsm,ESTABLISHED,MPLS_LBLWITH_MSGTYPE=====");
					#endif	
				    ProcLblWith_3(pEntry,LspCBVar);
                    break;                                
		
				case UPSTREAM_LOST: 
					#ifdef __BGS10_MPLS_DEBUG
						printf("==== LspCbFsm,ESTABLISHED,UPSTREAM_LOST====");
					#endif
				    /*  处理同LDP Release消息的处理   */
				    ProcLblRel_status3(pEntry,LspCBVar,inputEvent,UPSTREAM_LOST);
				    break;
				
				case DOWNSTREAM_LOST:
					#ifdef __BGS10_MPLS_DEBUG
						printf("==== LspCBFsm,ESTABLISHED,DOWNSTREAM_LOST=====");
					#endif
				    /*  处理同LDP Release消息的处理   */
					ProcDownLost_23(pEntry,LspCBVar);
                    break;

				case LDP_DOWNSTREAM_NAK:                	
                	#ifdef __BGS10_MPLS_DEBUG
						printf("==== LspCBFsm,ESTABLISHED,LDP_DOWNSTREAM_NAK====");
					#endif
                	ProcDownNAK_23(pEntry,LspCBVar,inputEvent);
                	break;
				
				case MPLS_ROUTE_DELETE:
                     #ifdef __BGS10_MPLS_DEBUG
						printf("==== LspCbFsm,ESTABLISHED,MPLS_ROUTE_DELETE ====");
					#endif
					ProcRouteDel_status123(pEntry,LspCBVar);
					break;

				default:
					#ifdef __BGS10_MPLS_DEBUG
						printf("==== LspCbFsm,ESTABLISHED,default====");
					#endif
					break;					
			} /* end of switch(eventType) */
			break;

		case RELEASE_AWAITED:
			switch(eventType)
			{	
            	case MPLS_LBLREL_MSGTYPE: 				    
				    #ifdef __BGS10_MPLS_DEBUG
						printf("==== LspCbFsm,RELEASE_AWAITED,MPLS_LBLREL_MSGTYPE====");
					#endif
				    ProcLblRel_status4(pEntry,LspCBVar);
				    break;								
				
				case MPLS_LBLABORT_MSGTYPE: 
				    #ifdef __BGS10_MPLS_DEBUG
						printf("==== LspCbFsm,RELEASE_AWAITED,MPLS_LBLABORT_MSGTYPE====");
					#endif
				    ProcLblRel_status4(pEntry,LspCBVar);
				    break;								
				
				case UPSTREAM_LOST:
				    #ifdef __BGS10_MPLS_DEBUG
						printf("==== LspCbFsm,RELEASE_AWAITED,UPSTREAM_LOST====");
					#endif
				    ProcLblRel_status4(pEntry,LspCBVar);
				    break;								

				case DOWNSTREAM_LOST:
				    #ifdef __BGS10_MPLS_DEBUG
						printf("==== LspCbFsm,RELEASE_AWAITED,DOWNSTREAM_LOST====");
					#endif
				    ProcDownLost_4(pEntry,LspCBVar);
				    break;								
				
				case MPLS_ROUTE_DELETE:
				    #ifdef __BGS10_MPLS_DEBUG
						printf("==== LspCbFsm,RELEASE_AWAITED,MPLS_ROUTE_DELETE====");
					#endif
				    ProcDownLost_4(pEntry,LspCBVar);
				    break;								

				default:
					#ifdef __BGS10_MPLS_DEBUG
						printf("==== LspCbFsm,RELEASE_AWAITED,default====");
					#endif
					break;
			} /* end of switch(eventType) */
			break;

		default:
			break;
	} /* end of switch(upLspCBVar.status) */

	return LDP_TRUE;
}

/* 2003-11-6 lixia add for get random time */
unsigned long ldp_get_random(unsigned short range,unsigned short start)
{
	unsigned long date, time, ticks;
	tm_get(&date, &time, &ticks);
    ticks = (ticks % (range+1)) + start;            /* Random number from start to start+range  */
    return (ticks*10);
}

/*add by fengjun for guangzhou */
short Xcbandwithrel(mplsLdpLspCB *LspCBVar,void *pEntry)
{
	
		if(LspCBVar->resend !=1)
        {
            
			if(LspCBVar->waitflag & 0xe0)
			{
	      	      //LspCBVar->waitflag |= 0x1;
	      	}
	      	else  if(LspCBVar->waitflag & 0x1)
	      	{
	      		ldp_del_lspCB(pEntry,LspCBVar);
	      	}
		}
		return LDP_TRUE;
	
}


short Xcbandwithreq(mplsLdpLspCB *LspCBVar,void *pEntry)
{
	unsigned long resend_time;
	if(LspCBVar->waitflag & 0x1)		
		return LDP_FALSE;			
		
	LspCBVar->status    = RESPONSE_AWAITED;
	LspCBVar->subStatus = IDLE;
	if(((LspCBVar->nodeType == MPLS_NODE_INGRESS)&&(LspCBVar->lspType == LDP_HOP_LSP))||
	    ((LspCBVar->nodeType == MPLS_NODE_INTERM_INGRESS)&&(LspCBVar->lspType == LDP_HOP_LSP)))
	{
		LspCBVar->resend = 1;
		#ifdef __BGS10_MPLS_DEBUG
		MPLS_ERR_LOG("======== set timer ldp_req_timout =========");
        #endif

⌨️ 快捷键说明

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