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

📄 fec.c

📁 技术文件名称:MPLSv1.0软件模块测试规程
💻 C
📖 第 1 页 / 共 5 页
字号:
                    }
                    else
                    {
                        VarIn->Fec.statusCode = BADINITERHOPER;
	                    VarIn->Fec.NextHop = 0xffffffff;
	                    break;
	                }
	            }
	        }
	        else   // has second tlv
	        {
	            size0= 32 - VarIn->Fec.erTlv.erHopArray[1].erIpv4.flags.flags.preLen;
			    size1= 0xffffffff << size0;
			    nifmask = size1;
                temp = searchlocaltlv(VarIn->Fec.erTlv.erHopArray[ 1 ].erIpv4.address,size1,&nifmask);
                if( temp == 0)  // second tlv is local
                {
                    memcpy(&(VarIn->Fec.erTlv.erHopArray[ 0 ]),&(VarIn->Fec.erTlv.erHopArray[ 1 ]),\
						   sizeof(mplsLdpErHop_t)*(MPLS_MAX_ER_HOPS-1));
					MPLS_MEMSET(&VarIn->Fec.erTlv.erHopArray[ MPLS_MAX_ER_HOPS-1 ].erIpv4.baseTlv.flags.mark,\
						   0,sizeof(union mplsLdpErHop_u));
					memcpy(&(VarIn->Fec.erTlv.erHopTypes[ 0 ]),&(VarIn->Fec.erTlv.erHopTypes[ 1 ]),(sizeof(unsigned short)*(MPLS_MAX_ER_HOPS-1)));
					VarIn->Fec.erTlv.numberErHops--;
				}
                else
                {
                	/* szh mod in 2002-1-28 17:25 */
                	/* input para is ipaddr liu.xingquan,lihuaa tell szh 2002-11-8 */
                	/*Prt	= Mpls_RtGetFrZef(VarIn->Fec.erTlv.erHopArray[ 1 ].erIpv4.address);*/
                	Prt = mpls_match_route(VarIn->Fec.erTlv.erHopArray[ 1 ].erIpv4.address,VarIn->Fec.erTlv.erHopArray[1].erIpv4.flags.flags.preLen);
                    temp = jugetopoborder(VarIn->Fec.erTlv.erHopArray[ 1 ].erIpv4.address, nifmask);
                    if( temp  == 0 )  // topology border
                    {
                        memcpy(&(VarIn->Fec.erTlv.erHopArray[ 0 ]),&(VarIn->Fec.erTlv.erHopArray[ 1 ]),\
						   sizeof(mplsLdpErHop_t)*(MPLS_MAX_ER_HOPS-1));
					    MPLS_MEMSET(&VarIn->Fec.erTlv.erHopArray[ MPLS_MAX_ER_HOPS-1 ].erIpv4.baseTlv.flags.mark,\
						   0,sizeof(union mplsLdpErHop_u));
					    memcpy(&(VarIn->Fec.erTlv.erHopTypes[ 0 ]),&(VarIn->Fec.erTlv.erHopTypes[ 1 ]),(sizeof(unsigned short)*(MPLS_MAX_ER_HOPS-1)));
					    VarIn->Fec.erTlv.numberErHops--;
                        if(Prt != NULL)
    					VarIn->Fec.ifIndex = Prt->Ifindex;
    					VarIn->Fec.NextHop = VarIn->Fec.erTlv.erHopArray[ 0 ].erIpv4.address;
    					if(VarIn->Fec.RouteType != INGRESS)
	                        VarIn->Fec.RouteType = BACKBONE;
    					break;
    				}
    				else  // not topology border
    				{
    				    /* search have nexthop */
    				    if((Prt != NULL) && (Prt->useflag  ==  RTM_IN_USE)&&(Prt->GateWay != 0xffffffff))
			            {
    				        memcpy(&(VarIn->Fec.erTlv.erHopArray[ 0 ]),&(VarIn->Fec.erTlv.erHopArray[ 1 ]),\
						        sizeof(mplsLdpErHop_t)*(MPLS_MAX_ER_HOPS-1));
					        MPLS_MEMSET(&VarIn->Fec.erTlv.erHopArray[ MPLS_MAX_ER_HOPS-1 ].erIpv4.baseTlv.flags.mark,\
						        0,sizeof(union mplsLdpErHop_u));
					        memcpy(&(VarIn->Fec.erTlv.erHopTypes[ 0 ]),&(VarIn->Fec.erTlv.erHopTypes[ 1 ]),(sizeof(unsigned short)*(MPLS_MAX_ER_HOPS-1)));
					        VarIn->Fec.erTlv.numberErHops--;

			                VarIn->Fec.ifIndex=Prt->Ifindex;
    					    VarIn->Fec.NextHop=Prt->GateWay;
    					    if(VarIn->Fec.RouteType != INGRESS)
	                            VarIn->Fec.RouteType = BACKBONE;
    					    break;
    					}
    					else /* have no nexthop */
    					{
    					    if (VarIn->Fec.erTlv.erHopArray[1].erIpv4.flags.flags.l == 0)  /* strict  */
                        {
                            VarIn->Fec.statusCode = BADSTRICNERR;
            	            VarIn->Fec.NextHop = 0xffffffff;
            	            break;
            	        }
            	            if (VarIn->Fec.erTlv.erHopArray[1].erIpv4.flags.flags.l == 1)  /* loose  */
            				{
            				    VarIn->Fec.statusCode = BADLOOSNERR;
            	                VarIn->Fec.NextHop = 0xffffffff;
                                break;
                            }
            			}
            		}
                }
            }
        }
    }
    #ifdef __BGS10_MPLS_DEBUG
      printf(" ===== search next hop : %x, routeType : %d, ifindex : %d, =====",
                VarIn->Fec.NextHop,VarIn->Fec.RouteType,VarIn->Fec.ifIndex);
    #endif
    return validHopNo;
}

/****************************************************************************/
/* FUNCTION NAME  :void searchlocaltlv(unsigned long Ipaddress, unsigned long   size)        */
/*DESCRIPTION:    :search local IP                                           */
/*  INPUT         :unsigned long Ipaddress, unsigned long   size                            */
/*  OUTPUT        :short                                                     */
/*  AUTHOR/DATE   :shi.zhaohui/ 2001.7.27                                    */
/*  GLOBAL        :none                                                      */
/*  NOTE          :add judge host IP..                                       */
/* szh mod for add judge dest(ethi) address 2002-1-12 16:52					*/
/****************************************************************************/
short  searchlocaltlv(unsigned long Ipaddress, unsigned long   size, ulong *nif_mask)
{
    short  i, temp = -1;

    if(size == 0xffffffff)
    {
        for(i = 0 ; i < NI_MAX; i++)
        {
            if(nif[i].RowStatus == MPLS_VAL_RowStatus_active)
            {
                if(nif[i].ni_ip == Ipaddress)
                {
                    temp = 0;
                    *nif_mask=nif[i].ni_mask;
                    break;
                }
            }
        }               
    }
    else
    {
        for(i = 0 ; i < NI_MAX; i++)
        {
            if(nif[i].RowStatus == MPLS_VAL_RowStatus_active)
            {
                if(nif[i].ni_mask == size)
                {
                    if((nif[i].ni_ip & nif[i].ni_mask) == (Ipaddress & size))
                    {
                        temp = 0;
                        *nif_mask=size;
                        break;
                    }
                }
            }
        }            
    }
    return temp;
}

/****************************************************************************/
/* FUNCTION NAME  :void jugetopoborder() 							        */
/*DESCRIPTION:    :judge topo border                                        */
/*  INPUT         :unsigned long Ipaddress, unsigned long   size                            */
/*  OUTPUT        :short                                                    */
/*  AUTHOR/DATE   :shi.zhaohui/ 2001.7.27                                   */
/*  GLOBAL        :none                                                     */
/*  NOTE          :add judge aim IP..                                       */
/****************************************************************************/
short  jugetopoborder(unsigned long    Ipaddress, unsigned long size)
{
    short  i,temp = -1;
   /* for ipmask ==32  */
    if(size == 0xffffffff)
    {
        for(i = 0 ; i < NI_MAX; i++)
        {
            if(nif[i].RowStatus == MPLS_VAL_RowStatus_active)
            {
                if((Ipaddress & nif[i].ni_mask) == (nif[i].ni_ip & nif[i].ni_mask))
                {
                    temp = 0;
                    break;
                }
            }
        }               
    }
    else
    {
    for(i = 0 ; i < NI_MAX; i++)
    {
            if(nif[i].RowStatus == MPLS_VAL_RowStatus_active)
        {
            if((Ipaddress & size ) == (nif[i].ni_ip & nif[i].ni_mask))
            {
                temp = 0;
                break;
            }
        }
    }
    }
    return temp;
}


/***********************************************************************/
/* FUNCTION NAME  : timer7pro()	                                        */
/* DESCRIPTION:   : next hop change process                			    */
/*  INPUT         : in      			                				*/
/*  OUTPUT        : NULL												*/
/*  AUTHOR/DATE   : shi.zhaohui/ 01.12.04                               */
/*  GLOBAL        : none												*/
/*  NOTE          :  ..                                                 */
/* History        : kong.yong weng.qing                                 */
/************************************************************************/
void   timer7pro1(TimerEventStruc *in)
{
    mplsErLspTable_t        *erlspstr;
    unsigned char           lspflag;
    LSP_KEY                 lsp_key;

	memset(&lsp_key, 0, sizeof(LSP_KEY));
	lsp_key.localLspId = (unsigned short)(in -> extra);
	lsp_key.IngressId = Switcher.LsrId;
	erlspstr = (mplsErLspTable_t *)MPLS_AVL_FIND(lspConfigTree, &lsp_key);
	if(!erlspstr)
	{
       // #ifdef __BGS10_MPLS_DEBUG
            DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_CR,"timer7pro process, no find lsp !!!\n ");
        	printf(" timer7pro process, no find lsp !!! ");
      //  #endif
		return;
	}
    mplsLspNoDelLsp(&erlspstr->lsp_key, MPLS_CR_LSP_TYPE);
}

/*这里有问题:hop和er都调用此回调函数,结构不一致!!!*/
void   timer7pro(mplsErLspTable_t *lsp)
{
	MPLS_ASSERT(lsp);
	lsp->hopchanTimerId = 0;     /* hyh */
    mplsLspNoDelLsp(&lsp->lsp_key, MPLS_CR_LSP_TYPE);
}
/***********************************************************************/
/* FUNCTION NAME  : timer8pro()	                                        */
/* DESCRIPTION:   : timeout process                      			    */
/*  INPUT         : in      			                				*/
/*  OUTPUT        : NULL												*/
/*  AUTHOR/DATE   : shi.zhaohui/ 01.12.04                               */
/*  GLOBAL        : none												*/
/*  NOTE          :  ..                                                 */
/* History        : kong.yong weng.qing                                 */
/* 2003-11-18 lixia mod for protect                                     */
/************************************************************************/
void    timer8pro(mplsErLspTable_t *in)
{
    mplsErLspTable_t        *erlspstr;

	MPLS_ASSERT(in);
    /*MPLS_MEMSET(&fecmsgstr, 0, sizeof(FecMsg));*/
    
    erlspstr = in;
    
    /* 2003-11-18 lixia add for protect */
    if(erlspstr ->TimerId ==0)
    {
        DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_CR,"error: timer8pro timerId is 0!!\n ");
        printf("error:timerId is 0!!\n");
        return;
    }
    /* add end */
    
    erlspstr -> statusCode = TIMEOUTERROR;

    if((erlspstr -> ConnStatus & LSP_SET_DOWN_ROUTER_DELETE)||
       (erlspstr -> ConnStatus & LSP_SET_UP_ROUTER_DELETE))
            erlspstr -> ConnStatus = LSP_SET_STATUS_ABORT;
    erlspstr ->TimerId = 0;
        mplsLspAddLink(erlspstr,LSP_OPER_TIMEOVER,MPLS_LSP_ADD);
       /* crtofecmsg(erlspstr, &fecmsgstr); */
}

void  tunnelDelaypro(mplsErLspTable_t *in)
{
    mplsErLspTable_t        *erlspstr;

	MPLS_ASSERT(in);
    /*MPLS_MEMSET(&fecmsgstr, 0, sizeof(FecMsg));*/
    
    erlspstr = in;
   
    erlspstr ->TimerId = 0;
    mplsLspAddLink(erlspstr,LSP_OPER_OAM,MPLS_LSP_ADD);
       /* crtofecmsg(erlspstr, &fecmsgstr); */
}

/***********************************************************************/
/* FUNCTION NAME  : mplsLspListDel(()	                               */
/* DESCRIPTION:   : deal lsp list                                      */
/*  AUTHOR/DATE   : sbp 2002-12-6                                       */
/*  GLOBAL        : none												*/
/* sbp 2002-12-27 正确连接链表                                          */
/************************************************************************/
void mplsLspListDel(mplsErLspTable_t *in)
{
    mplsErLspTable_t        *erlspstr1;
    erlspstr1  = in;
    if(erlspstr1)
    {
    	/*
    	if(erlspstr1->cr_lsp_list.sbFront)
    	{
    	    erlspstr1->cr_lsp_list.sbFront->cr_lsp_list.sbNext
    	           = erlspstr1->cr_lsp_list.sbNext;
    	}
    	else
    	    lspSb[erlspstr1->SbModule-1].next = erlspstr1->cr_lsp_list.sbNext;
    	if(erlspstr1->cr_lsp_list.sbNext)
    	{
    	    erlspstr1->cr_lsp_list.sbNext->cr_lsp_list.sbFront
    	           = erlspstr1->cr_lsp_list.sbFront;
    	}
    	erlspstr1->cr_lsp_list.sbFront = MPLS_NULL;
    	erlspstr1->cr_lsp_list.sbNext  = MPLS_NULL;
    	*/
    	
    	if(erlspstr1->cr_lsp_list.dstFront)
    	{
    	   erlspstr1->cr_lsp_list.dstFront->cr_lsp_list.dstNext 
    	           = erlsp

⌨️ 快捷键说明

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