📄 fec.c
字号:
/***********************************************************************/
/* FUNCTION NAME : lspdelspecpro() */
/* DESCRIPTION: : del lsp to ldp( lsp down) */
/* INPUT : msg, in */
/* OUTPUT : void */
/* AUTHOR/DATE : shi.zhaohui/ 01.12.04 */
/* GLOBAL : none */
/* NOTE : .. */
/* History : kong.yong weng.qing */
/************************************************************************/
void lspdelspecpro(FecMsg *msg, void *in, unsigned char lsptype)
{
mplsErLspTable_t *erlspstr;
unsigned char temp;
PID Receiver;
int rtnCode=1;
GET_PID("LDPPROCESS",&Receiver);
if(lsptype == MPLS_CR_LSP_TYPE)
{
erlspstr = (mplsErLspTable_t *)in;
temp = (erlspstr -> ConnStatus & LSP_SET_STATUS_ABORT);
if(temp == 0)
{
/*use for sb module to mfu port */
msg->Fec.sbPort=(unsigned short)fecModule2Port( erlspstr -> SbModule );
msg->Fec.sbPort = erlspstr -> SbModule ;
msg->Fec.RouteType = INGRESS;
msg->OperateType = LBLABORT_TYPE;
Receiver.module = mplsManagerOamPID.module ;
msg->Fec.lspidTlv.routerId = Switcher.LsrId;
ASEND(MPLS_FEC_SETUP, msg, sizeof(FecMsg), Receiver);
/*EXTRA_KILL_TIMER(erlspstr -> TimerId);*/
if(erlspstr->TimerId)
MPLS_CLEAR_TIMER(erlspstr->TimerId, mpls_oam_timer_q, rtnCode);
erlspstr->TimerId = 0;
MPLS_ASSERT(rtnCode==1);
//lspnumpro(erlspstr -> SbModule , MPLS_LSP_DELETE);
mplsQosFilterNoBindingAddorDelete(erlspstr-> delFilterNo,erlspstr->lsp_key.localLspId,
MPLS_OAM_DEL_BY_LSP);
/* 删除绑定,拆除tunnel */
if(erlspstr->FecGetSource&MPLS_FILTER_TUNNEL_DELETE)
{
erlspstr->statusCode = TUNNELFILTERERROR;
erlspstr -> ConnStatus = LSP_SET_STATUS_DOWN;
erlspstr->FecGetSource = FECROUTECREATE;
erlspstr-> delFilterNo = 0;
}
else
mplsLspNoDelLsp(&erlspstr->lsp_key, lsptype);/* after lblabort, del er lsp*/
#ifdef __BGS10_MPLS_DEBUG
printf("==== telnet send delete cr lsp,lspno : %d, fec send lblabort message to ldp module : %d(status:down)!!!====",
erlspstr->lsp_key.localLspId,Receiver.module);
#endif
}
else
{
/*EXTRA_KILL_TIMER(erlspstr -> TimerId);*/
if(erlspstr->TimerId)
MPLS_CLEAR_TIMER(erlspstr->TimerId, mpls_oam_timer_q, rtnCode);
erlspstr->TimerId = 0;
MPLS_ASSERT(rtnCode==1);
// lspnumpro(erlspstr -> SbModule , MPLS_LSP_DELETE);
mplsQosFilterNoBindingAddorDelete(erlspstr-> delFilterNo,erlspstr->lsp_key.localLspId,
MPLS_OAM_DEL_BY_LSP);
/* 删除绑定,拆除tunnel */
if(erlspstr->FecGetSource&MPLS_FILTER_TUNNEL_DELETE)
{
erlspstr->statusCode = TUNNELFILTERERROR;
erlspstr -> ConnStatus = LSP_SET_STATUS_DOWN;
erlspstr->FecGetSource = FECROUTECREATE;
erlspstr-> delFilterNo = 0;
}
else
mplsLspNoDelLsp(&erlspstr->lsp_key, lsptype);
}
}
}
/***********************************************************************/
/* FUNCTION NAME : nodetypechanpro() */
/* DESCRIPTION: : erhop type change */
/* INPUT : type */
/* OUTPUT : unsigned short */
/* AUTHOR/DATE : shi.zhaohui/ 01.12.04 */
/* GLOBAL : none */
/* NOTE : .. */
/* History : kong.yong weng.qing */
/************************************************************************/
unsigned short nodetypechanpro(unsigned char type)
{
switch(type)
{
case NODE_TYPE_ERHOP_IPV4:
return MPLS_ERHOP_IPV4_TLVTYPE;
break;
case NODE_TYPE_ERHOP_IPV6:
return MPLS_ERHOP_IPV6_TLVTYPE;
break;
case NODE_TYPE_ERHOP_AS:
return MPLS_ERHOP_AS_TLVTYPE;
break;
case NODE_TYPE_ERHOP_LSPID:
return MPLS_ERHOP_LSPID_TLVTYPE;
break;
default :
return 0;
break;
}
}
unsigned char nodetypechanpro2(unsigned short type)
{
switch(type)
{
case MPLS_ERHOP_IPV4_TLVTYPE:
return NODE_TYPE_ERHOP_IPV4;
break;
case MPLS_ERHOP_IPV6_TLVTYPE:
return NODE_TYPE_ERHOP_IPV6;
break;
case MPLS_ERHOP_AS_TLVTYPE:
return NODE_TYPE_ERHOP_AS;
break;
case MPLS_ERHOP_LSPID_TLVTYPE:
return NODE_TYPE_ERHOP_LSPID;
break;
default :
return 0;
break;
}
}
/***********************************************************************/
/* FUNCTION NAME : crsetupvaluepro() */
/* DESCRIPTION: : cr lsp value */
/* INPUT : FecMsg *out, mplsErLspTable_t *in */
/* OUTPUT : void */
/* AUTHOR/DATE : shi.zhaohui/ 01.12.04 */
/* GLOBAL : none */
/* NOTE : .. */
/* History : kong.yong weng.qing */
/*2002.11.28 sbp 处理HOP ADDRESS 与hop no 的关系*/
/************************************************************************/
void crsetupvaluepro(FecMsg *out, mplsErLspTable_t *in)
{
unsigned short loop,loop1;
QosMulitFieldFilter_t *qosstr;
out ->LspNo = in->lsp_key.localLspId;
out ->Fec.TlvExists.flags = in -> tlvExist;
if(out ->Fec.TlvExists.flags.lspidTlvExists == 1)
{
out ->Fec.lspidTlv.localCrlspId = in->lsp_key.localLspId;
out ->Fec.lspidTlv.routerId = Switcher.LsrId;
out ->Fec.lspidTlv.actFlag.flag.res = 0;
out ->Fec.lspidTlv.actFlag.flag.ActFlag = MPLS_CRLSP_ACTION_INIT;
out ->Fec.lspidTlv.baseTlv.length = MPLS_LSPIDTLV_FIXLEN;
out ->Fec.lspidTlv.baseTlv.flags.flags.uBit = 0;
out ->Fec.lspidTlv.baseTlv.flags.flags.fBit = 0;
out ->Fec.lspidTlv.baseTlv.flags.flags.type = MPLS_LSPID_TLVTYPE;
}
if(out ->Fec.TlvExists.flags.fecTlvExists == 1)
{
/* out ->Fec.fecElArray[0].crlspEl.type = in -> ErlspFecElemType; */
out ->Fec.fecElemNum = 1;
for(loop = 0; loop < out ->Fec.fecElemNum; loop++)
{
out ->Fec.fecElemTypes[loop] = in -> ErlspFecElemType;
out ->Fec.fecElArray[loop].crlspEl.type = in -> ErlspFecElemType;
out ->Fec.fecElArray[loop].addressEl.address =
in -> FecTlv[loop].ipaddr&in -> FecTlv[loop].ipmask;
out ->Fec.fecElArray[loop].addressEl.preLen =
masktoprelen(in -> FecTlv[loop].ipmask);
}
}
if(out ->Fec.TlvExists.flags.trafficTlvExists == 1)
{
out ->Fec.Traffic.baseTlv.length = MPLS_TRAFFICPARAMLENGTH * 6;
out ->Fec.Traffic.baseTlv.flags.flags.uBit = 0;
out ->Fec.Traffic.baseTlv.flags.flags.fBit = 0;
out ->Fec.Traffic.baseTlv.flags.flags.type = MPLS_TRAFFIC_TLVTYPE;
}
/* get traffic para */
if(in -> tlvExist.trafficTlvExists == 0)
{
out ->Fec.Traffic.flags.mark = Switcher.MplsTraff[ 0 ].flag;
out ->Fec.Traffic.freq = Switcher.MplsTraff[ 0 ].freq; /*UNSPECIFIED */
out ->Fec.Traffic.res=0;
out ->Fec.Traffic.weight = Switcher.MplsTraff[ 0 ].weight;
out ->Fec.Traffic.pdr.pdr=(float)((unsigned long)(Switcher.MplsTraff[ 0 ].pdr)*48);
out ->Fec.Traffic.pbs.pbs=(float)((unsigned long)(Switcher.MplsTraff[ 0 ].pbs)*48);
out ->Fec.Traffic.cdr.cdr=(float)((unsigned long)(Switcher.MplsTraff[ 0 ].cdr)*48);
out ->Fec.Traffic.cbs.cbs=(float)((unsigned long)(Switcher.MplsTraff[ 0 ].cbs)*48);
out ->Fec.Traffic.ebs.ebs=(float)((unsigned long)(Switcher.MplsTraff[ 0 ].ebs)*48);
}
else
{
out ->Fec.Traffic.flags.mark = in -> traffic.ErlspFlag;
out ->Fec.Traffic.freq = in -> traffic.ErlspFreq; /*UNSPECIFIED */
out ->Fec.Traffic.res=0;
out ->Fec.Traffic.weight = in -> traffic.ErlspWeight;
out ->Fec.Traffic.pdr.pdr=(float)((unsigned long)(in -> traffic.ErlspPdr)*48);
out ->Fec.Traffic.pbs.pbs=(float)((unsigned long)(in -> traffic.ErlspPbs)*48);
out ->Fec.Traffic.cdr.cdr=(float)((unsigned long)(in -> traffic.ErLspCdr)*48);
out ->Fec.Traffic.cbs.cbs=(float)((unsigned long)(in -> traffic.ErlspCbs)*48);
out ->Fec.Traffic.ebs.ebs=(float)((unsigned long)(in -> traffic.ErlspEbs)*48);
}
if(out ->Fec.TlvExists.flags.erTlvExists == 1)
{
out ->Fec.erTlv.numberErHops = in -> ErlspNumberErHops;
out ->Fec.erTlv.baseTlv.length = out ->Fec.erTlv.numberErHops
*(MPLS_ERHOP_IPV4_FIXLEN+4);
out ->Fec.erTlv.baseTlv.flags.flags.uBit = 0;
out ->Fec.erTlv.baseTlv.flags.flags.fBit = 0;
out ->Fec.erTlv.baseTlv.flags.flags.type = MPLS_ER_TLVTYPE;
loop = 0;
loop1 = 0;
while(loop<in -> ErlspNumberErHops)
{
if(in -> ErAddress[loop1].addr==0)
{
loop1++;
}
else
{
out ->Fec.erTlv.erHopTypes[loop] =
nodetypechanpro(in -> ErAddress[loop1].nodeType);
out ->Fec.erTlv.erHopArray[loop].erIpv4.address =
in -> ErAddress[loop1].addr;
out ->Fec.erTlv.erHopArray[loop].erIpv4.flags.flags.l =
in -> ErAddress[loop1].routeType;
out ->Fec.erTlv.erHopArray[loop].erIpv4.flags.flags.preLen=
in -> ErAddress[loop1].mask.addrLen;
out ->Fec.erTlv.erHopArray[loop].erIpv4.flags.flags.res = 0;
out ->Fec.erTlv.erHopArray[loop].erIpv4.baseTlv.length =
MPLS_ERHOP_IPV4_FIXLEN;
out ->Fec.erTlv.erHopArray[loop].erIpv4.baseTlv.flags.flags.uBit = 0;
out ->Fec.erTlv.erHopArray[loop].erIpv4.baseTlv.flags.flags.fBit = 0;
out ->Fec.erTlv.erHopArray[loop].erIpv4.baseTlv.flags.flags.type =
MPLS_ERHOP_IPV4_TLVTYPE;
loop++;
loop1++;
}
}
}
if(out ->Fec.TlvExists.flags.pinningTlvExists == 1)
{
out ->Fec.pinningTlv.flags.flags.pBit = in -> ErlspPinFlag;
out ->Fec.pinningTlv.flags.flags.res = 0;
out ->Fec.pinningTlv.baseTlv.length = 4;
out ->Fec.pinningTlv.baseTlv.flags.flags.uBit = 0;
out ->Fec.pinningTlv.baseTlv.flags.flags.fBit = 0;
out ->Fec.pinningTlv.baseTlv.flags.flags.type = MPLS_PINNING_TLVTYPE;
}
if(out ->Fec.TlvExists.flags.recClassTlvExists == 1)
{
out ->Fec.resClassTlv.rsCls = in -> ErlspRsCls;
out ->Fec.resClassTlv.baseTlv.length = 4;
out ->Fec.resClassTlv.baseTlv.flags.flags.uBit = 0;
out ->Fec.resClassTlv.baseTlv.flags.flags.fBit = 0;
out ->Fec.resClassTlv.baseTlv.flags.flags.type = MPLS_RESCLASS_TLVTYPE;
}
out ->Fec.preemptTlv.res = 0;
out ->Fec.preemptTlv.setPrio = in -> preempt.ErlspSetPrio;
out ->Fec.preemptTlv.holdPrio = in -> preempt.ErlspHoldPrio;
out ->Fec.preemptTlv.baseTlv.length = MPLS_PREEMPTTLV_FIXLEN;
out ->Fec.preemptTlv.baseTlv.flags.flags.uBit = 0;
out ->Fec.preemptTlv.baseTlv.flags.flags.fBit = 0;
out ->Fec.preemptTlv.baseTlv.flags.flags.type = MPLS_PREEMPT_TLVTYPE;
out ->Fec.loadShare = in ->loadbalance;
out ->Fec.pathType = in ->lspType; /* dynamic, explicit */
out ->Fec.metric = in ->metric;
loop = mplsQosFilterNoGetPtr(in -> delFilterNo,&((unsigned long *)qosstr));
if(loop == MPLS_OAM_CMD_SUCCESS)
{
out ->Fec.qosfilterstr = *qosstr;
}
else
{
MPLS_MEMSET(&(out ->Fec.qosfilterstr), 0, sizeof(QosMulitFieldFilter_t));
}
}
/***********************************************************************/
/* FUNCTION NAME : crlsppro() */
/* DESCRIPTION: : create or delete cr lsp to ldp */
/* INPUT : hoplspstr, opertype */
/* OUTPUT : void */
/* AUTHOR/DATE : shi.zhaohui/ 01.12.04 */
/* GLOBAL : none */
/* NOTE : .. */
/* History : kong.yong weng.qing */
/************************************************************************/
void crlsppro(mplsErLspTable_t *in, unsigned char opertype)
{
MPLS_MEMSET(&fecmsgstr, 0, sizeof(FecMsg));
fecmsgstr.OperateType = opertype;
crsetupvaluepro(&fecmsgstr, in);
switch(opertype)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -