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

📄 ldproute.c

📁 技术文件名称:MPLSv1.0软件模块测试规程
💻 C
📖 第 1 页 / 共 5 页
字号:
						lspCb->lspType = LDP_HOP_LSP;
						lspCb->nodeType = MPLS_NODE_INGRESS;
						lspCb->downSessionIndex = session->index;
						lspCb->downifIndex			=	session->ifIndex;
						lspCb->downPeerLdpid.lsrAddress = session->peerLdpId.lsrAddress;
						lspCb->downPeerLdpid.labelSpace = session->peerLdpId.labelSpace;
						ifindex2mod_req.ifIndex 			= lspCb->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)
						{
							lspCb->downAtmLabel.module = ifindex2mod_ack.mod;
							lspCb->downAtmLabel.port   = ifindex2mod_ack.port;
						}
						else
						{
                            DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_LSP,"SessionUP ,ERR get Down ATM Module & port\n");
							MPLS_ERR_LOG("ERR get UP ATM Module & port");
							/* should release up atm label */
							MPLS_FEC_LSPCB_DELETE(fecCb,lspCb);
							return;
						}
						MPLS_INSERT_INTO_DOWN_LSP_LIST(session->lsp_down_cb_list,lspCb,lspCb);
						lspCb->status    = IDLE;
						lspCb->subStatus = IDLE;
						if(!(lspCb->waitflag & 0x1))
						LspCBFsm(session,MPLS_ROUTE_ADD,MPLS_NULL,LDP_HOP_LSP,fecCb,lspCb);
					}
					else
					    DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_LSP,"SessionUp,creat lspcb fail\n");
					#endif
				}
				else
				{
				    MPLS_ERR_LOG("====Nexthop not belong to Session====");
				}
			}
		}
		else
		{
            if(fecCb->owner & MPLS_OWNER_ROUTE)
            {	
			belong_to = MPLS_FALSE;
			MPLS_NEXTHOP_SESSION_BELONG(fecCb->nexthopAddr,session,belong_to);
			if(belong_to == MPLS_TRUE)
			{
				fecCb->nexthopSessionIndex = session->index;
			}         
            									
			MPLS_UPCB_CREATE(fecCb,session,upCb)
			
			if(upCb)
			{
					upCb->upSessionIndex = session->index;
					upCb->upGenLabel     = fecCb->localGenLabel;
					upCb->upPeerLdpid.lsrAddress = session->peerLdpId.lsrAddress;
					upCb->upPeerLdpid.labelSpace = session->peerLdpId.labelSpace;
					upCb->state = ESTABLISHED;
					wait_uplblmsg_append(upCb,fecCb,MPLS_NULL,MPLS_NULL,MPLS_LBLMAP_MSGTYPE);
			}
}
		}
	}
	else
	{
		printf("mpls_err_log,SessionUp,fec is null\n");
	}
	WALK_FEC_END
	
	return;
}

/****************************************************************************/
/*      Product Name:   MPLS PACK1.0
 *      Module  Name:   LDP/CR_LDP
 *      File    Name:   ldppdu.h
 *      Author  Name:   weng.qing shi.zhaohui hu.yonghong
 *      Creat   Date:   2002-6-18
 *      Version     :   1.0
 *      Input       :   mplsLdpSession_t *, inbound seesion pointer;
 *                      void             *, inputEvent;
 *      Output      :   void
 *      Function    :   Label release process function
 *      Note        :   
*/      
/****************************************************************************/
void SessionDown_old(mplsLdpSession_t * session)
{
	mplsLdpFecEntry    * fecCb     = MPLS_NULL;
	mplsLdpUpCB        * upCb      = MPLS_NULL;
	mplsLdpLspCB       * lspCb     = MPLS_NULL;
	mplsLdpDownCB      * downCb    = MPLS_NULL;
	mplsLdpCrLsp       * crfecCb   = MPLS_NULL;
	mplsLdpLspCB       * crlspCb   = MPLS_NULL;
	mplsLdpSession_t   * t_session = MPLS_NULL;
	MPLS_BOOL            yes       = MPLS_FALSE;
	unsigned short       dismode;
	unsigned short       belong_to;
	
	WALK_FEC_BEGIN(fecCb)
	if(fecCb)
	{
		if(fecCb->nexthopSessionIndex == session->index)
			fecCb->nexthopSessionIndex = 0;
		dismode = 0;
		MPLS_SESSION_DISTRIBUT_MODE(session,dismode);
		if(dismode != DOWNSTREAMONDEMAND)
		{
			MPLS_WALK_UP_BEGIN(fecCb,upCb,t_upCb)
			if(upCb != MPLS_NULL)
			{
				yes = MPLS_FALSE;
				MPLS_SESSION_MATCH_CB_UP(session,upCb,yes);
				if(yes == MPLS_TRUE)
				{
					Up_Clear_Msg(upCb, fecCb);
					#if 0
					//MPLS_NEXTHOP_SESSION_SEARCH(fecCb->nexthopAddr,t_session);
					MPLS_UPCB_DELETE(fecCb,upCb);
					#endif
				}
			}
			else
			{
				printf("mpls_err_log");
			}
			MPLS_WALK_UP_END(fecCb,upCb,t_upCb)
			MPLS_WALK_DOWN_BEGIN(fecCb,downCb,t_downCb)
			if(downCb != MPLS_NULL)
			{
				yes = MPLS_FALSE;
				MPLS_SESSION_MATCH_CB_DOWN(session,downCb,yes);
				if(yes == MPLS_TRUE)
				{
					if(fecCb->owner & MPLS_OWNER_ROUTE)
					{
						belong_to = MPLS_FALSE;
					    MPLS_NEXTHOP_SESSION_BELONG(fecCb->nexthopAddr,session,belong_to);
					    if( belong_to == MPLS_TRUE)
					    {
	                    	downCb->waitflag |=0x1;
	                    	wait_downfeclbl_append(downCb,fecCb,LDP_FWD_CLOSE);
	                    	
						}
						else
						{
							if(!(downCb->waitflag & 0xe0))
							{
								MPLS_DOWNCB_DELETE(fecCb,downCb);
							}
							else
							{
								downCb->waitflag |=0x1;
							}
						}
						Down_Clear_Msg(downCb, fecCb);
					}
					else
					{
						if(!(downCb->waitflag & 0xe0))
						{
							Xc_down_append(downCb,fecCb);
							#if 0
							MPLS_DOWNCB_DELETE(fecCb,downCb);
							#endif
						}
						else
						{
							downCb->waitflag |=0x1;
						}
						Down_Clear_Msg(downCb, fecCb);
					}
				}
			}
			else
			{
				printf("mpls_err_log");
			}
			MPLS_WALK_DOWN_END(fecCb,downCb,t_downCb)
		}
		else
		{
			MPLS_WALK_LSP_BEGIN(fecCb,lspCb,t_lspCb)
			yes = MPLS_FALSE;
			MPLS_SESSION_MATCH_LSPCB_UP(session,lspCb,yes);
			if(yes == MPLS_TRUE)
			{
				if(!(lspCb->waitflag & 0x1))
				LspCBFsm(session,UPSTREAM_LOST,MPLS_NULL,LDP_HOP_LSP,fecCb,lspCb);
			}
			yes = MPLS_FALSE;
			MPLS_SESSION_MATCH_LSPCB_DOWN(session,lspCb,yes);
			if(yes == MPLS_TRUE)
			{
				/* downstream lost*/
				if(!(lspCb->waitflag & 0x1))
				LspCBFsm(session,DOWNSTREAM_LOST,MPLS_NULL,LDP_HOP_LSP,fecCb,lspCb);
			}
			MPLS_WALK_LSP_END(fecCb,lspCb,t_lspCb)
		}
	}
	else
	{
		printf("mpls_err_log");
	}
	WALK_FEC_END
	
/*   CR-LSP 将会后面处理  */	
	WALK_CRFEC_BEGIN(crfecCb)
	if(crfecCb != MPLS_NULL)
	{
		dismode = 0;
		MPLS_SESSION_DISTRIBUT_MODE(session,dismode);
		if(dismode == DOWNSTREAMONDEMAND)
		{
			yes = MPLS_FALSE;
			MPLS_SESSION_MATCH_UP(crfecCb,session,yes)
			if(yes == MPLS_TRUE)
			{
				/*  upstream lost */
				if(!((crlspCb)->waitflag & 0x1))
				LspCBFsm(session,UPSTREAM_LOST,MPLS_NULL,LDP_CR_LSP,crfecCb,crlspCb);
			}
			yes = MPLS_FALSE;
			MPLS_SESSION_MATCH_DOWN(crfecCb,session,yes);
			if(yes == MPLS_TRUE)
			{
				/* downstream lost */
				if(!(crlspCb->waitflag & 0x1))
				LspCBFsm(session,DOWNSTREAM_LOST,MPLS_NULL,LDP_CR_LSP,crfecCb,crlspCb);
			}
		}
		else
		{
			yes = MPLS_FALSE;
			MPLS_SESSION_MATCH_DOWN(crfecCb,session,yes);
			if(yes == MPLS_TRUE)
			{
				dismode = 0;
				MPLS_CRFEC_UP_SESSION(crfecCb,t_session);
				if(t_session != MPLS_NULL)
				{
					MPLS_SESSION_DISTRIBUT_MODE(t_session,dismode);
					if(dismode == DOWNSTREAMONDEMAND)
					{
						/*  upstream lost */
						if(!(crlspCb->waitflag & 0x1))
						LspCBFsm(session,UPSTREAM_LOST,MPLS_NULL,LDP_CR_LSP,crfecCb,crlspCb);
					}
					else
					{
						if(crfecCb->crlspCb.status == RESPONSE_AWAITED)
						{
							/* no route */
							MPLS_SEND_NOTIFY(session,NOROUTE,0, 0);
						}
						else if(crfecCb->crlspCb.status == ESTABLISHED)
						{
							
                                                 #if 0
							sendtoLabelXC(crfecCb,&crfecCb->crlspCb,MPLS_NULL,LDP_FWD_CREATE);
                                                #endif
                            wait_crlspfeclbl_append(&(crfecCb->crlspCb),crfecCb,LDP_FWD_CREATE);
							sendtoUpWithdraw(crfecCb,t_session);
						}
						ldp_del_lspCB((char *)crfecCb,&crfecCb->crlspCb);
					}
				}
				else
				{
					/* upstream ATM interface senario, have process */
					/* downstream session set to MPLS_NULL */
					MPLS_RESET_SESSION(crfecCb);
				}
			}
		}
		
		yes = MPLS_FALSE;
		MPLS_SESSION_MATCH_UP(crfecCb,session,yes);
		if(yes == MPLS_TRUE)
		{
			dismode = 0;
			MPLS_CRFEC_DOWN_SESSION(crfecCb,t_session);
			if(t_session != MPLS_NULL)
			{
				MPLS_SESSION_DISTRIBUT_MODE(t_session,dismode);
				if(dismode == DOWNSTREAMONDEMAND)
				{
					/* upstream lost */
					if(!(crlspCb->waitflag & 0x1))
					LspCBFsm(session,UPSTREAM_LOST,MPLS_NULL,LDP_CR_LSP,crfecCb,crlspCb);
				}
				else
				{
					if(crfecCb->crlspCb.status == RESPONSE_AWAITED)
					{
						sendtoDownLblAbort(t_session,&crfecCb->crlspCb,crfecCb,LDP_CR_LSP);
					}
					else if(crfecCb->crlspCb.status == ESTABLISHED)
					{
						
						 #if 0
						sendtoLabelXC(crfecCb,&crfecCb->crlspCb,MPLS_NULL,LDP_FWD_CLOSE);
                                                #endif
                        wait_crlspfeclbl_append(&(crfecCb->crlspCb),crfecCb,LDP_FWD_CLOSE);
						
						
						sendtoDownRelease( crfecCb);
					}
					ldp_del_lspCB((char *)crfecCb,&crfecCb->crlspCb);
				}
			}
			else
			{
				/* downstream ATM interface senario, have process */
				/* upstream session set to MPLS_NULL */
				MPLS_RESET_SESSION(crfecCb);
			}
		}	
	}
	else
	{
		printf("mpls_err_log");
	}
	WALK_CRFEC_END
	
	mpls_clear_lblmsgreq(session);
	MPLS_ERR_LOG("==== mpls_clear_lblmsgreq ====");
	return;
}

/****************************************************************************/
/*      Product Name:   MPLS PACK1.0
 *      Module  Name:   LDP/CR_LDP
 *      File    Name:   ldppdu.h
 *      Author  Name:   weng.qing shi.zhaohui hu.yonghong
 *      Creat   Date:   2002-6-18
 *      Version     :   1.0
 *      Input       :   mplsLdpSession_t *, inbound seesion pointer;
 *                      void             *, inputEvent;
 *      Output      :   void
 *      Function    :   Label release process function
 *      Note        :   when session down add clear fec scan 
*/      
/****************************************************************************/
void SessionDown(mplsLdpSession_t * session)
{
	mpls_fec_search	   * pSe;
	int rtcode;
	
	if(session->lsp_up_cb_list.first)
	{
		session->lsp_up_cb_list.first->upSessionIndex = 1;
		session->lsp_up_cb_list.last->upSessionIndex = 1;
		MPLS_INSERT_INTO_UP_LSP_LIST(g_up_lsp_list,
									 session->lsp_up_cb_list.first, \
									 session->lsp_up_cb_list.last);
		session->lsp_up_cb_list.first = MPLS_NULL;
		session->lsp_up_cb_list.last = MPLS_NULL;
	}

⌨️ 快捷键说明

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