📄 fec.c
字号:
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 + -