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

📄 fec.c

📁 技术文件名称:MPLSv1.0软件模块测试规程
💻 C
📖 第 1 页 / 共 5 页
字号:
        case MPLS_LSP_ADD:/* ?????*/
            crlspaddpro(&fecmsgstr, in );
            break;

        case MPLS_LSP_DELETE: /* ??????*/
            crlspdelpro(&fecmsgstr, in );
            break;

        default : break;
    }
    return;
}

/***********************************************************************/
/* FUNCTION NAME  : crlspaddpro()	                                    */
/* DESCRIPTION:   : create cr lsp to ldp                                */
/*  INPUT         : msg, in                                				*/
/*  OUTPUT        : void												*/
/*  AUTHOR/DATE   : shi.zhaohui/ 01.12.04                               */
/*  GLOBAL        : none												*/
/*  NOTE          :  ..                                                 */
/* History        : kong.yong weng.qing                                 */
/* 2003-11-18 lixia mod for protect                                     */
/************************************************************************/
void   crlspaddpro(FecMsg *msg,  mplsErLspTable_t *in)
{
    PID		      Receiver;
    unsigned short       delaytime,modCard;
    /*unsigned long         TimerId;*/
    unsigned char	      setupmodule;
    int                     rtnCode=1;

    GET_PID("LDPPROCESS",&Receiver);
    in->validHopNo = SearchErRoute(msg,INGRESS);
    in->nexthop[0] = msg ->Fec.NextHop;
    in->nexthop[1] = msg ->Fec.NextHop;
//    in -> statusCode = msg -> Fec.statusCode;
    /* account setup sb module */
	modCard = accountsbmod(in, MPLS_CR_LSP_TYPE,0xffff);
	
	setupmodule = (unsigned short)(modCard>>8);
  /* if((modCard&0xff)==MPLS_CARDTYPE_LIC10)  */
	if(((modCard&0xff)>=MPLS_CARDTYPE_GEI)&&((modCard&0xff)<=MPLS_GEICARD_END))
    {
        msg->Fec.sbModule = setupmodule;
        msg->Fec.sbPort   = 0;
    }
    else
    {
    	 msg->Fec.sbModule = 0;
		    /*use for sb module to mfu port */
	     msg->Fec.sbPort=(unsigned short)fecModule2Port( setupmodule );
	}
	msg->Fec.RouteType = INGRESS;
	in -> SbModule  = setupmodule;
	Receiver.module = mplsManagerOamPID.module;
	#if 0
	msg -> Fec.in_protocol_type = fecLdpGetCardTypeOnModule(in -> SbModule);
	msg -> Fec.out_protocol_type =
			fecLdpGetCardTypeOnIfIndexAndIpaddr(msg -> Fec.ifIndex,msg -> Fec.NextHop);
	#endif		
	msg->Fec.lspidTlv.routerId = Switcher.LsrId;
	if(in -> FecGetSource&MPLS_FILTER_TUNNEL_REPEATE)
	{
	  /*  msg->Fec.RouteType |=16;    lsp 重新绑定,便于处理 */
	    in-> delFilterNo = in->setFilterNo;
	}
	ASEND(MPLS_FEC_SETUP, msg, sizeof(FecMsg), Receiver);
        in -> ConnStatus = 0;  
	#ifdef __BGS10_MPLS_DEBUG
		printf("==== send cr lsp(lspno %d) setup message to ldp module %d !!!====",
		        msg ->LspNo ,Receiver.module);
	#endif
	if(in -> ReqNum<10)
	    in -> ReqNum++;
	in -> FecGetSource = FECROUTECREATE;
	delaytime = setdelaytime(in -> ReqNum);
    /*TimerId = EXTRA_SET_TIMER(delaytime/2, MPLS_TIMER8, in->lsp_key.localLspId);*/
    if(in->TimerId >0)   /* 2003-11-18 lixia add for protect */
       {
           MPLS_CLEAR_TIMER(in->TimerId, mpls_oam_timer_q, rtnCode);
           in->TimerId = 0;
       }
    MPLS_SET_TIMER(delaytime, (void *)timer8pro, in, mpls_oam_timer_q, in->TimerId);
    /*in -> TimerId = TimerId;*/
}

/***********************************************************************/
/* FUNCTION NAME  : crlspdelpro()	                                    */
/* DESCRIPTION:   : del cr lsp to ldp                                   */
/*  INPUT         : msg, in                                				*/
/*  OUTPUT        : void												*/
/*  AUTHOR/DATE   : shi.zhaohui/ 01.12.04                               */
/*  GLOBAL        : none												*/
/*  NOTE          :  ..                                                 */
/* History        : kong.yong weng.qing                                 */
/************************************************************************/
void   crlspdelpro(FecMsg *msg,  mplsErLspTable_t *in)
{

    switch((in -> ConnStatus)&0x02)  /* pick up up and down */
    {
        case LSP_SET_STATUS_UP :
            lspdelpro_statup(msg,  in, MPLS_CR_LSP_TYPE);
            break;

        default :
            lspdelpro_statdown(msg, in, MPLS_CR_LSP_TYPE);
            break;
    }
    return;
}


/****************************************************************************/
/* FUNCTION NAME  :unsigned short GetIfinexToRouteType(unsigned short Ifindex,unsigned char CardType)*/
/*DESCRIPTION:    :change ifindex to card type                               */
/*                                                                           */
/*  INPUT         :ifindex                                                   */
/*  OUTPUT        :ni                                                        */
/*  AUTHOR/DATE   :Kong.Yong / 2001.7.18                                     */
/*  GLOBAL        :none                                                      */
/*  NOTE          :....                                                      */
/****************************************************************************/
unsigned short GetNiToRouteType(unsigned short ninum)
{
	unsigned short	Loop;

	for(Loop=0;Loop<NI_MAX;Loop++)
	{

		if((nif[Loop].ni_ninum==ninum) &&\
		   (nif[Loop].RowStatus==1))

			return nif[Loop].ni_ifindextype;
	}
	return 0xffff;
};

/****************************************************************************/
/* FUNCTION NAME  :void SearchErRoute(FecMsg *VarIn)                         */
/*DESCRIPTION:    :select next hop for er                                    */
/*  INPUT         :*VarIn                                                    */
/*  OUTPUT        :void                                                      */
/*  AUTHOR/DATE   :shi.zhaohui/ 2001.5.14                                    */
/*  GLOBAL        :none                                                      */
/*  NOTE          :....                                                      */
/*                 szh modfiy search route in net ipaddr 2002-1-28 17:15    */
/*2002.11.4 Hyh  er lsp search route use nifmsak                            */
/* sbp 2002-12-21 dynamic lsp for lic                                       */
/****************************************************************************/
unsigned char SearchErRoute(FecMsg *VarIn,unsigned char nodetype)
{
    short   temp;
    unsigned long   size0,size1;
    RoutEntry  	*Prt;
    ulong       nifmask= 0;
    unsigned char validHopNo=0;

    VarIn->Fec.statusCode = 0;
    
    /* search route when path is dynmaic  sbp 2002-7-26 */
    if(VarIn->Fec.fecElemTypes[0]==MPLS_PREFIX_FEC || VarIn->Fec.fecElemTypes[0]==MPLS_HOSTADR_FEC)
    {
        /* input para is ipaddr liu.xingquan,lihuaa tell szh 2002-11-8 */
    /* 	Prt	=	Mpls_RtGetFrZef(VarIn -> Fec.fecElArray[0].addressEl.address &
                (0xffffffff <<(32- VarIn -> Fec.fecElArray[0].addressEl.preLen))); */
        //Prt	=	Mpls_RtGetFrZef(VarIn -> Fec.fecElArray[0].addressEl.address); 
        //Prt = mpls_match_route(VarIn -> Fec.fecElArray[0].addressEl.address,VarIn -> Fec.fecElArray[0].addressEl.preLen);  
        Prt = mpls_search_route(VarIn -> Fec.fecElArray[0].addressEl.address,VarIn -> Fec.fecElArray[0].addressEl.preLen);     
        if((Prt != NULL) && (Prt->useflag  ==  RTM_IN_USE))
		{
			VarIn->Fec.ifIndex=Prt->Ifindex;
			/* sbp 2002-12-21 dynamic lsp for lic */
            if(( Prt->GateWay & nif[Prt->NumInNif].ni_mask) ==
			   (VarIn -> Fec.fecElArray[0].addressEl.address & nif[Prt->NumInNif].ni_mask))
			{
				VarIn->Fec.NextHop = VarIn -> Fec.fecElArray[0].addressEl.address;
			}
			else
			    VarIn->Fec.NextHop=Prt->GateWay;
			    
			if(VarIn->Fec.NextHop	==	0xffffffff)
			{
				VarIn->Fec.NextHop=0xffffffff;
				VarIn->Fec.statusCode=NOROUTE;
			}
			#if 1
			size0= 32 - VarIn->Fec.fecElArray[0].addressEl.preLen;
            size1= 0xffffffff << size0;
            if((VarIn->Fec.fecElArray[0].addressEl.address & size1) == (Prt->GateWay & size1))
            {
                VarIn->Fec.ifIndex=Prt->Ifindex;
			    VarIn->Fec.NextHop=Prt->GateWay;
			    if(VarIn->Fec.RouteType != INGRESS)
                    VarIn->Fec.RouteType = EGRESS;
			}
			else
				VarIn->Fec.RouteType=BACKBONE;
			#endif
			#if 0
			if(GetNiToRouteType(Prt->NumInNif) ==EDGE)
				VarIn->Fec.RouteType=EGRESS;
			else
				VarIn->Fec.RouteType=BACKBONE;
			#endif
		}
		else
		{ /* no route  */
			VarIn->Fec.NextHop=0xffffffff;
			VarIn->Fec.statusCode=NOROUTE;
		}
        return validHopNo;
    }
    
    if (VarIn->Fec.erTlv.numberErHops == 0)
	{
    	VarIn->Fec.statusCode = BADERTLVERR;
    	VarIn->Fec.NextHop = 0xffffffff;
		return validHopNo;
	}

    //  search first tlv in local
    size0= 32 - VarIn->Fec.erTlv.erHopArray[0].erIpv4.flags.flags.preLen;
    size1= 0xffffffff << size0;

	nifmask = size1;
	temp = searchlocaltlv(VarIn->Fec.erTlv.erHopArray[ 0 ].erIpv4.address,size1,&nifmask);

	if( temp != 0 )  // first tlv is not in local
	{
	    if(VarIn->Fec.erTlv.erHopArray[0].erIpv4.flags.flags.l == 0)  // strict lsp
        {
		    VarIn->Fec.statusCode = BADINITERHOPER;
	        VarIn->Fec.NextHop = 0xffffffff;
	        return validHopNo;
	    }
	    else
	    {
            /*  szh mod 2002-1-28 17:20 */
            /* input para is ipaddr liu.xingquan,lihuaa tell szh 2002-11-8 */
            /*Prt	= Mpls_RtGetFrZef(VarIn->Fec.erTlv.erHopArray[ 0 ].erIpv4.address);*/
            Prt = mpls_match_route(VarIn->Fec.erTlv.erHopArray[ 0 ].erIpv4.address,VarIn->Fec.erTlv.erHopArray[0].erIpv4.flags.flags.preLen);       
            if((Prt != NULL) && (Prt->useflag  ==  RTM_IN_USE))
	        {
	             VarIn->Fec.ifIndex=Prt->Ifindex;
				 VarIn->Fec.NextHop=Prt->GateWay;
				 /* szh mod prt->DestIpMask ->nif[Prt->NumInNif].ni_mask 2002-12-3 */
				 if(( Prt->GateWay & nif[Prt->NumInNif].ni_mask) ==
				   (VarIn->Fec.erTlv.erHopArray[ 0 ].erIpv4.address & nif[Prt->NumInNif].ni_mask))
				 {
				    VarIn->Fec.NextHop = VarIn->Fec.erTlv.erHopArray[ 0 ].erIpv4.address;
				 }
                 if(VarIn->Fec.NextHop == 0xffffffff)
			     {
			          VarIn->Fec.statusCode = BADERTLVERR;
			     }
			     if(VarIn->Fec.RouteType != INGRESS)
	                VarIn->Fec.RouteType = BACKBONE;

	             #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;
			}
			else
            {
            	VarIn->Fec.statusCode = NOROUTE;
 	            VarIn->Fec.NextHop = 0xffffffff;
	            return validHopNo;
	        }
        }
    }
    else   // first tlv is in local
    {
        for(;;)
        {
        	if(nodetype==INGRESS)
                validHopNo++;
            if (VarIn->Fec.erTlv.numberErHops == 1)  // no second tlv
            {
                if(VarIn->Fec.RouteType == INGRESS)
	            {
	                VarIn->Fec.statusCode = BADINITERHOPER;
	                VarIn->Fec.NextHop = 0xffffffff;
	                break;
	            }
	            else
	            {
					temp = searchlocaltlv(VarIn->Fec.erTlv.erHopArray[ 0 ].erIpv4.address,size1,&nifmask);
                    if( temp == 0)
                    {
                        /* szh mod 2002-1-28 17:24 */
                        /* input para is ipaddr liu.xingquan,lihuaa tell szh 2002-11-8 */
                        Prt = mpls_match_route(VarIn->Fec.erTlv.erHopArray[ 0 ].erIpv4.address,VarIn->Fec.erTlv.erHopArray[0].erIpv4.flags.flags.preLen);       
                   /*     Prt	= Mpls_RtGetFrZef(VarIn->Fec.erTlv.erHopArray[ 0 ].erIpv4.address);*/
                        if((Prt != NULL) && (Prt->useflag  ==  RTM_IN_USE))
            			{
						VarIn->Fec.ifIndex=Prt->Ifindex;
				 		VarIn->Fec.NextHop=Prt->GateWay;
                        VarIn->Fec.RouteType = EGRESS;
	            			break;
				        }
				        else
				        {
            				VarIn->Fec.statusCode = NOROUTE;
 	            			VarIn->Fec.NextHop = 0xffffffff;
                        break;
                    }
				       

⌨️ 快捷键说明

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