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