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

📄 ldproute.c

📁 技术文件名称:MPLSv1.0软件模块测试规程
💻 C
📖 第 1 页 / 共 5 页
字号:
	if(session->lsp_down_cb_list.first)
	{
		session->lsp_down_cb_list.first->downSessionIndex = 1;
		session->lsp_down_cb_list.last->downSessionIndex = 1;
		MPLS_INSERT_INTO_DOWN_LSP_LIST(g_down_lsp_list,
									 session->lsp_down_cb_list.first, \
									 session->lsp_down_cb_list.last);
		session->lsp_down_cb_list.first = MPLS_NULL;
		session->lsp_down_cb_list.last = MPLS_NULL;
	}
	if(session->up_cb_list.first)
	{
		session->up_cb_list.first->upSessionIndex = 1;
		session->up_cb_list.last->upSessionIndex = 1;
		MPLS_INSERT_INTO_UP_LIST(g_up_list,
									 session->up_cb_list.first, \
									 session->up_cb_list.last);
		session->up_cb_list.first = MPLS_NULL;
		session->up_cb_list.last = MPLS_NULL;
	}
	if(session->down_cb_list.first)
	{
		session->down_cb_list.first->downSessionIndex = 1;
		session->down_cb_list.last->downSessionIndex = 1;
		MPLS_INSERT_INTO_DOWN_LIST(g_down_list,
									 session->down_cb_list.first, \
									 session->down_cb_list.last);
		session->down_cb_list.first = MPLS_NULL;
		session->down_cb_list.last = MPLS_NULL;
	}
		
	#if MPLS_PROTECT
	/*这是一个补丁,设置控制块扫描链开关 */
	if(fec_lspcb_scan.timer == 0)
	{
		/* 没有定时器 */
		fec_lspcb_scan.timer = 1;
		fec_lspcb_scan.stop = 2;
	}
	else
	{
		/* 下次从头扫描 */
		fec_lspcb_scan.stop    = 2;
	}
	#endif
	
	/* clear fec scan */
	for(pSe = g_fec_search_list.first; pSe; pSe = pSe->next)
	{
		if(pSe)
		{
			if(((mplsLdpSession_t *)(pSe->session)) == session)
			{
				if(pSe->tmier != 0)
				{
					MPLS_CLEAR_TIMER(pSe->tmier,ldptime_q,rtcode);
					pSe->tmier = 0;
				}
				MPLS_FEC_SEARCH_DELETE(g_fec_search_list,pSe);
				break;
			}
		}
	}
	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    :   Fei Down Alarm
 *      Note        :   
*/      
/****************************************************************************/
void FeiDown(unsigned short module,unsigned short port,unsigned char alarmType)
{
	mpls_sb_list * sb_alarm;	
	
	if(alarmType == 0)  /* de-alarm */
	    return;
	if( module == 0)
	{
	/* 如果是本模块的告警,不做理会 */
    if(mplsOamLocalPlatformType==MPLS_OAM_PLATFORM_M1000) 
    {
    	port += 4;
        if(port == (selfLdpPid.module+4))	
	        return;
	}
	else
	{
        if(port == selfLdpPid.module)	
	        return;	
	}
    }
	MPLS_SB_SEARCH(module,port,sb_alarm);
	if(sb_alarm)
	{
		if(sb_alarm->lsp_up_cb_list.first)
		{
			sb_alarm->lsp_up_cb_list.first->upSessionIndex =  0;
			sb_alarm->lsp_up_cb_list.last->upSessionIndex =  0;
			MPLS_INSERT_INTO_UP_LSP_LIST(g_up_lsp_list,
										 sb_alarm->lsp_up_cb_list.first, \
										 sb_alarm->lsp_up_cb_list.last);
			sb_alarm->lsp_up_cb_list.first = MPLS_NULL;
			sb_alarm->lsp_up_cb_list.last = MPLS_NULL;
		}
		if(sb_alarm->lsp_down_cb_list.first)
		{
			sb_alarm->lsp_down_cb_list.first->downSessionIndex =  0;
			sb_alarm->lsp_down_cb_list.last->downSessionIndex =  0;
			MPLS_INSERT_INTO_DOWN_LSP_LIST(g_down_lsp_list,
										 sb_alarm->lsp_down_cb_list.first, \
										 sb_alarm->lsp_down_cb_list.last);
			sb_alarm->lsp_down_cb_list.first = MPLS_NULL;
			sb_alarm->lsp_down_cb_list.last = MPLS_NULL;
		}
		MPLS_SB_DELETE(module,port,sb_alarm);
	}
}

/***********************************************************************/
/* FUNCTION NAME  : ldpPolicyFecCheck()                                 */
/* DESCRIPTION:   : 定时到,策略改变重查FEC控制块进行处理               */
/*  INPUT         : void                                				*/
/*  OUTPUT        : void												*/
/*  AUTHOR/DATE   : li.xia/ 2004-2-20                                   */
/*  GLOBAL        : none												*/
/*  NOTE          :  ..                                                 */
/* History        :                                                     */
/************************************************************************/
void ldpPolicyFecCheck()
{
	
    mplsLdpFecEntry    * fecCb = MPLS_NULL;
    unsigned short     i=0;
    mplsLdpLspCB      * lspCb    = MPLS_NULL;
    mplsLdpSession_t   * downSession = MPLS_NULL;
    unsigned long      NetMask;
    unsigned char      matchpolicy;
   /* MPLS_BOOL            belong_to; */

    printf("in ldpPolicyFecCheck()!!!\n");  //lixia
    MPLS_FEC_SEARCH(GlobalSearch.addr,GlobalSearch.addrLen,fecCb)
    if(fecCb == MPLS_NULL)
        fecCb = MPLS_AVL_FIRST(g_fec_avl_tree);
    for(;fecCb;fecCb = MPLS_AVL_NEXT(fecCb->fec_avl_node))
    {
        if (fecCb->pRes & 0x80)
        {
        	printf ("===this fec had been processed before---%x !!===\n",fecCb->fec_key.mplsFecAddr);  //lixia
            continue;
        }
            
        /* wengqing 2003.3.28 判断是否还有要删的块未处理,若有,则定时5s再来检查,
                              没有要删的块才开始新建立 */
        if(g_up_lsp_list.first != MPLS_NULL || g_down_lsp_list.first != MPLS_NULL || fec_lspcb_scan.timer != 0)
        {
            GlobalSearch.addr    = fecCb->fec_key.mplsFecAddr;
            GlobalSearch.addrLen = fecCb->fec_key.mplsLdpFecAddrLen;
            GlobalSearch.tmier = 0;
            printf("policy 1 set delay timer 5s");
            MPLS_SET_TIMER(50,(void *)ldpPolicyFecCheck,(void *)&GlobalSearch,\
                                       ldptime_q,GlobalSearch.tmier);
            if(GlobalSearch.tmier == 0)
            {
                MPLS_ERR_LOG("MPLS_FEC_SEARCH_CREATE SET_TIMER Fail");
                MPLS_MEMSET(&GlobalSearch,0,sizeof(mpls_fec_search)); 
            }
            break;
        }
        if(i >= DISTRIBUT_MODE)
        {
            GlobalSearch.addr    = fecCb->fec_key.mplsFecAddr;
            GlobalSearch.addrLen = fecCb->fec_key.mplsLdpFecAddrLen;
            GlobalSearch.tmier = 0;
            printf(" wait for next time to process \n!");
            MPLS_SET_TIMER(10,(void *)ldpPolicyFecCheck,(void *)&GlobalSearch,\
                                       ldptime_q,GlobalSearch.tmier);
            if(GlobalSearch.tmier == 0)
            {
                MPLS_ERR_LOG("MPLS_FEC_SEARCH_CREATE SET_TIMER Fail");
                MPLS_MEMSET(&GlobalSearch,0,sizeof(mpls_fec_search)); 
            }
            break;
        }
        else
        {
	        NetMask = MPLS_LENGTH2NETMASK(NetMask,fecCb->fec_key.mplsLdpFecAddrLen);
            matchpolicy = mpls_policy_filter(fecCb->fec_key.mplsFecAddr,NetMask,fecCb->nexthopAddr);
            switch (matchpolicy)
            {
                case DENY:              //配置策略为deny
                {
            	    if(!(fecCb->pRes & MPLS_DENY_POLICY))
            	    {
            	        printf("Deny, %x\n",fecCb->fec_key.mplsFecAddr);
            	        i++;
            	        /* 收到deny命令时,原来的fec控制块配置了egress命令,要删掉egress产生的控制块,
            	        改变feccb的pRes和nodeType szh add 2004-2-20 */
            	        if(fecCb->pRes & MPLS_EGRESS_TO_POLICY)
            	        {
            	            fecCb->pRes  &= ~MPLS_EGRESS_TO_POLICY;
            	            fecCb->nodeType = MPLS_NODE_INTERM;
            	            printf("Deny, mod to no geress to, %x\n",fecCb->fec_key.mplsFecAddr);
            	        }
            	        fecCb->pRes |= MPLS_DENY_POLICY;    //dele
            	        MPLS_WALK_LSP_BEGIN(fecCb,lspCb,t_lspCb)
            	        if(lspCb != MPLS_NULL)
            	        {
            	            #ifdef __BGS10_MPLS_DEBUG
            	                MPLS_ERR_LOG("===policy is deny,dele the lspcb===");
            	            #endif
            	            lspCb->pNexthopChange = 1;
            	            if(!(lspCb->waitflag & 0x1))
                	        LspCBFsm(MPLS_NULL,MPLS_ROUTE_DELETE,MPLS_NULL,LDP_HOP_LSP,fecCb,lspCb);
            	            else
            	                MPLS_ERR_LOG("Route lspCb->waitflag %x",lspCb->waitflag);
            	        }
            	        MPLS_WALK_LSP_END(fecCb,lspCb,t_lspCb)
            	    }
            	    else
            	    {
            	    	#ifdef __BGS10_MPLS_DEBUG
            	            MPLS_ERR_LOG("the deny policy has been processed!");
            	        #endif
            	    } 
            	    break;
                }          
                case PERMIT:
                {
            	    if(fecCb->pRes & 0x05)    //原为deny或egress to ,后no掉
            	        i++;
            	    /* 既配了deny又配了egress to命令 szh add 2004-2-19 */    
            	    if((fecCb->pRes & MPLS_DENY_POLICY)&&(fecCb->pRes & MPLS_EGRESS_TO_POLICY))
            	    {
                      /*原配置策略为egress to,后no掉,需改变Fec的nodeType及pRes,删除原来的所有lsp,重建Ingress lsp*/
		                printf("Egress to and deny to no egress to, %x\n",fecCb->fec_key.mplsFecAddr);
		                fecCb->pRes  &= ~0x05;
		                fecCb->nodeType = MPLS_NODE_INTERM;
		                MPLS_WALK_LSP_BEGIN(fecCb,lspCb,t_lspCb)
            	        if(lspCb != MPLS_NULL)
            	        {
            	            #ifdef __BGS10_MPLS_DEBUG
            	                MPLS_ERR_LOG("===policy is no egress to,dele the all old lspcb===");
            	            #endif
            	            lspCb->pNexthopChange = 1;
            	            if(!(lspCb->waitflag & 0x1))
                	        LspCBFsm(MPLS_NULL,MPLS_ROUTE_DELETE,MPLS_NULL,LDP_HOP_LSP,fecCb,lspCb);
            	            else
            	                MPLS_ERR_LOG("Route lspCb->waitflag %x",lspCb->waitflag);
            	        }
            	        MPLS_WALK_LSP_END(fecCb,lspCb,t_lspCb)
            	        /*重建Ingress lsp*/
            	        MPLS_NEXTHOP_SESSION_SEARCH(fecCb->nexthopAddr,downSession);
                        if(downSession)
            	        {
                    	    MPLS_LSPCB_CREATE(fecCb,lspCb); 
			                if(lspCb)
                            {
			                    lspCb->lspIndex = MPLS_GET_LSP_INDEX;
			                    lspCb->lspType = LDP_HOP_LSP;
			                    lspCb->nodeType = MPLS_NODE_INGRESS;
			                    lspCb->downSessionIndex = downSession->index;
			                    lspCb->downifIndex = downSession->ifIndex;
			                    lspCb->downPeerLdpid.lsrAddress = downSession->peerLdpId.lsrAddress;
			                    lspCb->downPeerLdpid.labelSpace = downSession->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;
				                    /* add into down session link list */
			   	                    MPLS_INSERT_INTO_DOWN_LSP_LIST(downSession->lsp_down_cb_list,lspCb,lspCb);
				                    lspCb->status    = IDLE;
				                    lspCb->subStatus = IDLE;
				                    if(!(lspCb->waitflag & 0x1))
				                      LspCBFsm(downSession,MPLS_ROUTE_ADD,MPLS_NULL,LDP_HOP_LSP,fecCb,lspCb);
			                    }
			                    else
			                    {
				                    MPLS_ERR_LOG("ERR get UP ATM Module & port");
				                    /* should release up atm label */
				                    MPLS_FEC_LSPCB_DELETE(fecCb,lspCb);
			                    }
			                }
		                }
                    }
            	    else if(fecCb->pRes & MPLS_DENY_POLICY)   //原配置策略为deny,后no掉,需重建Ingress lsp
            	    {
                        printf("Deny to no deny, %x\n",fecCb->fec_key.mplsFecAddr);
                        fecCb->pRes  &= ~MPLS_DENY_POLICY;
                        MPLS_NEXTHOP_SESSION_SEARCH(fecCb->nexthopAddr,downSession);
                        if(downSession)
                        {
                    	    MPLS_LSPCB_CREATE(fecCb,lspCb); 
			                if(lspCb)
                            {
			                    lspCb->lspIndex = MPLS_GET_LSP_INDEX;
			                    lspCb->lspType = LDP_HOP_LSP;
			                    lspCb->nodeType = MPLS_NODE_INGRESS;
			                    lspCb->downSessionIndex = downSession->index;
			                    lspCb->downifIndex = downSession->ifIndex;
			                    lspCb->downPeerLdpid.lsrAddress = downSession->peerLdpId.lsrAddress;
			                    lspCb->downPeerLdpid.labelSpace = downSession->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;
				                      /* add into down session link list */
				                    MPLS_INSERT_INTO_DOWN_LSP_LIST(downSession->lsp_down_cb_list,lspCb,lspCb);
				                    lspCb->status    = IDLE;
				                    lspCb->subStatus = IDLE;
				                    if(!(lspCb->waitflag & 0x1))
				                       LspCBFsm(downSession,MPLS_ROUTE_ADD,MPLS_NULL,LDP_HOP_LSP,fecCb,lspCb);
			                    }
			                    else
			                    {
				                    MPLS_ERR_LOG("ERR get UP ATM Module & port");
				                    /* should release up atm label */
				                    MPLS_FEC_LSPCB_DELETE(fecCb,lspCb);
			                    }
			                }
		                }
     	            }
                    else if(fecCb->pRes & MPLS_EGRESS_TO_POLICY)
                    {
                        /*原配置策略为egress to,后no掉,需改变Fec的nodeType及pRes,删除原来的所有lsp,重建Ingress lsp*/
		                printf("Egress to to no egress to, %x\n",fecCb->fec_key.mplsFecAddr);
		                fecCb->pRes  &= ~MPLS_EGRESS_TO_POLICY;
		                fecCb->nodeType = MPLS_NODE_INTERM;
		                MPLS_WALK_LSP_BEGIN(fecCb,lspCb,t_lspCb)
            	        if(lspCb != MPLS_NULL)
            	        {
            	            #ifdef __BGS10_MPLS_DEBUG
            	                MPLS_ERR_LOG("===policy is no egress to,dele the all old lspcb===");
            	            #endif
            	            lspCb->pNexthopChange = 1;
            	            if(!(lspCb->waitflag & 0x1))
                	        LspCBFsm(MPLS_NULL,MPLS_ROUTE_DELETE,MPLS_NULL,LDP_HOP_LSP,fecCb,lspCb);
            	            else
            	                MPLS_ERR_LOG("Route lspCb->waitflag %x",lspCb->waitflag);
           

⌨️ 快捷键说明

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