📄 ldproute.c
字号:
if(session->lsp_down_cb_list.first)
{
session->lsp_down_cb_list.first->downSessionIndex = 1;
session->lsp_down_cb_list.last->downSessionIndex = 1;
MPLS_INSERT_INTO_DOWN_LSP_LIST(g_down_lsp_list,
session->lsp_down_cb_list.first, \
session->lsp_down_cb_list.last);
session->lsp_down_cb_list.first = MPLS_NULL;
session->lsp_down_cb_list.last = MPLS_NULL;
}
if(session->up_cb_list.first)
{
session->up_cb_list.first->upSessionIndex = 1;
session->up_cb_list.last->upSessionIndex = 1;
MPLS_INSERT_INTO_UP_LIST(g_up_list,
session->up_cb_list.first, \
session->up_cb_list.last);
session->up_cb_list.first = MPLS_NULL;
session->up_cb_list.last = MPLS_NULL;
}
if(session->down_cb_list.first)
{
session->down_cb_list.first->downSessionIndex = 1;
session->down_cb_list.last->downSessionIndex = 1;
MPLS_INSERT_INTO_DOWN_LIST(g_down_list,
session->down_cb_list.first, \
session->down_cb_list.last);
session->down_cb_list.first = MPLS_NULL;
session->down_cb_list.last = MPLS_NULL;
}
#if MPLS_PROTECT
/*这是一个补丁,设置控制块扫描链开关 */
if(fec_lspcb_scan.timer == 0)
{
/* 没有定时器 */
fec_lspcb_scan.timer = 1;
fec_lspcb_scan.stop = 2;
}
else
{
/* 下次从头扫描 */
fec_lspcb_scan.stop = 2;
}
#endif
/* clear fec scan */
for(pSe = g_fec_search_list.first; pSe; pSe = pSe->next)
{
if(pSe)
{
if(((mplsLdpSession_t *)(pSe->session)) == session)
{
if(pSe->tmier != 0)
{
MPLS_CLEAR_TIMER(pSe->tmier,ldptime_q,rtcode);
pSe->tmier = 0;
}
MPLS_FEC_SEARCH_DELETE(g_fec_search_list,pSe);
break;
}
}
}
mpls_clear_lblmsgreq(session);
MPLS_ERR_LOG("==== mpls_clear_lblmsgreq ====");
return;
}
/****************************************************************************/
/* Product Name: MPLS PACK1.0
* Module Name: LDP/CR_LDP
* File Name: ldppdu.h
* Author Name: weng.qing shi.zhaohui hu.yonghong
* Creat Date: 2002-6-18
* Version : 1.0
* Input : mplsLdpSession_t *, inbound seesion pointer;
* void *, inputEvent;
* Output : void
* Function : Fei Down Alarm
* Note :
*/
/****************************************************************************/
void FeiDown(unsigned short module,unsigned short port,unsigned char alarmType)
{
mpls_sb_list * sb_alarm;
if(alarmType == 0) /* de-alarm */
return;
if( module == 0)
{
/* 如果是本模块的告警,不做理会 */
if(mplsOamLocalPlatformType==MPLS_OAM_PLATFORM_M1000)
{
port += 4;
if(port == (selfLdpPid.module+4))
return;
}
else
{
if(port == selfLdpPid.module)
return;
}
}
MPLS_SB_SEARCH(module,port,sb_alarm);
if(sb_alarm)
{
if(sb_alarm->lsp_up_cb_list.first)
{
sb_alarm->lsp_up_cb_list.first->upSessionIndex = 0;
sb_alarm->lsp_up_cb_list.last->upSessionIndex = 0;
MPLS_INSERT_INTO_UP_LSP_LIST(g_up_lsp_list,
sb_alarm->lsp_up_cb_list.first, \
sb_alarm->lsp_up_cb_list.last);
sb_alarm->lsp_up_cb_list.first = MPLS_NULL;
sb_alarm->lsp_up_cb_list.last = MPLS_NULL;
}
if(sb_alarm->lsp_down_cb_list.first)
{
sb_alarm->lsp_down_cb_list.first->downSessionIndex = 0;
sb_alarm->lsp_down_cb_list.last->downSessionIndex = 0;
MPLS_INSERT_INTO_DOWN_LSP_LIST(g_down_lsp_list,
sb_alarm->lsp_down_cb_list.first, \
sb_alarm->lsp_down_cb_list.last);
sb_alarm->lsp_down_cb_list.first = MPLS_NULL;
sb_alarm->lsp_down_cb_list.last = MPLS_NULL;
}
MPLS_SB_DELETE(module,port,sb_alarm);
}
}
/***********************************************************************/
/* FUNCTION NAME : ldpPolicyFecCheck() */
/* DESCRIPTION: : 定时到,策略改变重查FEC控制块进行处理 */
/* INPUT : void */
/* OUTPUT : void */
/* AUTHOR/DATE : li.xia/ 2004-2-20 */
/* GLOBAL : none */
/* NOTE : .. */
/* History : */
/************************************************************************/
void ldpPolicyFecCheck()
{
mplsLdpFecEntry * fecCb = MPLS_NULL;
unsigned short i=0;
mplsLdpLspCB * lspCb = MPLS_NULL;
mplsLdpSession_t * downSession = MPLS_NULL;
unsigned long NetMask;
unsigned char matchpolicy;
/* MPLS_BOOL belong_to; */
printf("in ldpPolicyFecCheck()!!!\n"); //lixia
MPLS_FEC_SEARCH(GlobalSearch.addr,GlobalSearch.addrLen,fecCb)
if(fecCb == MPLS_NULL)
fecCb = MPLS_AVL_FIRST(g_fec_avl_tree);
for(;fecCb;fecCb = MPLS_AVL_NEXT(fecCb->fec_avl_node))
{
if (fecCb->pRes & 0x80)
{
printf ("===this fec had been processed before---%x !!===\n",fecCb->fec_key.mplsFecAddr); //lixia
continue;
}
/* wengqing 2003.3.28 判断是否还有要删的块未处理,若有,则定时5s再来检查,
没有要删的块才开始新建立 */
if(g_up_lsp_list.first != MPLS_NULL || g_down_lsp_list.first != MPLS_NULL || fec_lspcb_scan.timer != 0)
{
GlobalSearch.addr = fecCb->fec_key.mplsFecAddr;
GlobalSearch.addrLen = fecCb->fec_key.mplsLdpFecAddrLen;
GlobalSearch.tmier = 0;
printf("policy 1 set delay timer 5s");
MPLS_SET_TIMER(50,(void *)ldpPolicyFecCheck,(void *)&GlobalSearch,\
ldptime_q,GlobalSearch.tmier);
if(GlobalSearch.tmier == 0)
{
MPLS_ERR_LOG("MPLS_FEC_SEARCH_CREATE SET_TIMER Fail");
MPLS_MEMSET(&GlobalSearch,0,sizeof(mpls_fec_search));
}
break;
}
if(i >= DISTRIBUT_MODE)
{
GlobalSearch.addr = fecCb->fec_key.mplsFecAddr;
GlobalSearch.addrLen = fecCb->fec_key.mplsLdpFecAddrLen;
GlobalSearch.tmier = 0;
printf(" wait for next time to process \n!");
MPLS_SET_TIMER(10,(void *)ldpPolicyFecCheck,(void *)&GlobalSearch,\
ldptime_q,GlobalSearch.tmier);
if(GlobalSearch.tmier == 0)
{
MPLS_ERR_LOG("MPLS_FEC_SEARCH_CREATE SET_TIMER Fail");
MPLS_MEMSET(&GlobalSearch,0,sizeof(mpls_fec_search));
}
break;
}
else
{
NetMask = MPLS_LENGTH2NETMASK(NetMask,fecCb->fec_key.mplsLdpFecAddrLen);
matchpolicy = mpls_policy_filter(fecCb->fec_key.mplsFecAddr,NetMask,fecCb->nexthopAddr);
switch (matchpolicy)
{
case DENY: //配置策略为deny
{
if(!(fecCb->pRes & MPLS_DENY_POLICY))
{
printf("Deny, %x\n",fecCb->fec_key.mplsFecAddr);
i++;
/* 收到deny命令时,原来的fec控制块配置了egress命令,要删掉egress产生的控制块,
改变feccb的pRes和nodeType szh add 2004-2-20 */
if(fecCb->pRes & MPLS_EGRESS_TO_POLICY)
{
fecCb->pRes &= ~MPLS_EGRESS_TO_POLICY;
fecCb->nodeType = MPLS_NODE_INTERM;
printf("Deny, mod to no geress to, %x\n",fecCb->fec_key.mplsFecAddr);
}
fecCb->pRes |= MPLS_DENY_POLICY; //dele
MPLS_WALK_LSP_BEGIN(fecCb,lspCb,t_lspCb)
if(lspCb != MPLS_NULL)
{
#ifdef __BGS10_MPLS_DEBUG
MPLS_ERR_LOG("===policy is deny,dele the lspcb===");
#endif
lspCb->pNexthopChange = 1;
if(!(lspCb->waitflag & 0x1))
LspCBFsm(MPLS_NULL,MPLS_ROUTE_DELETE,MPLS_NULL,LDP_HOP_LSP,fecCb,lspCb);
else
MPLS_ERR_LOG("Route lspCb->waitflag %x",lspCb->waitflag);
}
MPLS_WALK_LSP_END(fecCb,lspCb,t_lspCb)
}
else
{
#ifdef __BGS10_MPLS_DEBUG
MPLS_ERR_LOG("the deny policy has been processed!");
#endif
}
break;
}
case PERMIT:
{
if(fecCb->pRes & 0x05) //原为deny或egress to ,后no掉
i++;
/* 既配了deny又配了egress to命令 szh add 2004-2-19 */
if((fecCb->pRes & MPLS_DENY_POLICY)&&(fecCb->pRes & MPLS_EGRESS_TO_POLICY))
{
/*原配置策略为egress to,后no掉,需改变Fec的nodeType及pRes,删除原来的所有lsp,重建Ingress lsp*/
printf("Egress to and deny to no egress to, %x\n",fecCb->fec_key.mplsFecAddr);
fecCb->pRes &= ~0x05;
fecCb->nodeType = MPLS_NODE_INTERM;
MPLS_WALK_LSP_BEGIN(fecCb,lspCb,t_lspCb)
if(lspCb != MPLS_NULL)
{
#ifdef __BGS10_MPLS_DEBUG
MPLS_ERR_LOG("===policy is no egress to,dele the all old lspcb===");
#endif
lspCb->pNexthopChange = 1;
if(!(lspCb->waitflag & 0x1))
LspCBFsm(MPLS_NULL,MPLS_ROUTE_DELETE,MPLS_NULL,LDP_HOP_LSP,fecCb,lspCb);
else
MPLS_ERR_LOG("Route lspCb->waitflag %x",lspCb->waitflag);
}
MPLS_WALK_LSP_END(fecCb,lspCb,t_lspCb)
/*重建Ingress lsp*/
MPLS_NEXTHOP_SESSION_SEARCH(fecCb->nexthopAddr,downSession);
if(downSession)
{
MPLS_LSPCB_CREATE(fecCb,lspCb);
if(lspCb)
{
lspCb->lspIndex = MPLS_GET_LSP_INDEX;
lspCb->lspType = LDP_HOP_LSP;
lspCb->nodeType = MPLS_NODE_INGRESS;
lspCb->downSessionIndex = downSession->index;
lspCb->downifIndex = downSession->ifIndex;
lspCb->downPeerLdpid.lsrAddress = downSession->peerLdpId.lsrAddress;
lspCb->downPeerLdpid.labelSpace = downSession->peerLdpId.labelSpace;
ifindex2mod_req.ifIndex = lspCb->downifIndex;
ifindex2mod_req.mpls_protocol_type = MPLS_LABEL_SWITCH_PROTOCOL_ATM;
ifindex2mod_req.mpls_platform = local_platform;
mpls_ifindex2module(&ifindex2mod_req,&ifindex2mod_ack,MPLS_INTERFACE);
if(ifindex2mod_ack.ack == MPLS_SUCCESS)
{
lspCb->downAtmLabel.module = ifindex2mod_ack.mod;
lspCb->downAtmLabel.port = ifindex2mod_ack.port;
/* add into down session link list */
MPLS_INSERT_INTO_DOWN_LSP_LIST(downSession->lsp_down_cb_list,lspCb,lspCb);
lspCb->status = IDLE;
lspCb->subStatus = IDLE;
if(!(lspCb->waitflag & 0x1))
LspCBFsm(downSession,MPLS_ROUTE_ADD,MPLS_NULL,LDP_HOP_LSP,fecCb,lspCb);
}
else
{
MPLS_ERR_LOG("ERR get UP ATM Module & port");
/* should release up atm label */
MPLS_FEC_LSPCB_DELETE(fecCb,lspCb);
}
}
}
}
else if(fecCb->pRes & MPLS_DENY_POLICY) //原配置策略为deny,后no掉,需重建Ingress lsp
{
printf("Deny to no deny, %x\n",fecCb->fec_key.mplsFecAddr);
fecCb->pRes &= ~MPLS_DENY_POLICY;
MPLS_NEXTHOP_SESSION_SEARCH(fecCb->nexthopAddr,downSession);
if(downSession)
{
MPLS_LSPCB_CREATE(fecCb,lspCb);
if(lspCb)
{
lspCb->lspIndex = MPLS_GET_LSP_INDEX;
lspCb->lspType = LDP_HOP_LSP;
lspCb->nodeType = MPLS_NODE_INGRESS;
lspCb->downSessionIndex = downSession->index;
lspCb->downifIndex = downSession->ifIndex;
lspCb->downPeerLdpid.lsrAddress = downSession->peerLdpId.lsrAddress;
lspCb->downPeerLdpid.labelSpace = downSession->peerLdpId.labelSpace;
ifindex2mod_req.ifIndex = lspCb->downifIndex;
ifindex2mod_req.mpls_protocol_type = MPLS_LABEL_SWITCH_PROTOCOL_ATM;
ifindex2mod_req.mpls_platform = local_platform;
mpls_ifindex2module(&ifindex2mod_req,&ifindex2mod_ack,MPLS_INTERFACE);
if(ifindex2mod_ack.ack == MPLS_SUCCESS)
{
lspCb->downAtmLabel.module = ifindex2mod_ack.mod;
lspCb->downAtmLabel.port = ifindex2mod_ack.port;
/* add into down session link list */
MPLS_INSERT_INTO_DOWN_LSP_LIST(downSession->lsp_down_cb_list,lspCb,lspCb);
lspCb->status = IDLE;
lspCb->subStatus = IDLE;
if(!(lspCb->waitflag & 0x1))
LspCBFsm(downSession,MPLS_ROUTE_ADD,MPLS_NULL,LDP_HOP_LSP,fecCb,lspCb);
}
else
{
MPLS_ERR_LOG("ERR get UP ATM Module & port");
/* should release up atm label */
MPLS_FEC_LSPCB_DELETE(fecCb,lspCb);
}
}
}
}
else if(fecCb->pRes & MPLS_EGRESS_TO_POLICY)
{
/*原配置策略为egress to,后no掉,需改变Fec的nodeType及pRes,删除原来的所有lsp,重建Ingress lsp*/
printf("Egress to to no egress to, %x\n",fecCb->fec_key.mplsFecAddr);
fecCb->pRes &= ~MPLS_EGRESS_TO_POLICY;
fecCb->nodeType = MPLS_NODE_INTERM;
MPLS_WALK_LSP_BEGIN(fecCb,lspCb,t_lspCb)
if(lspCb != MPLS_NULL)
{
#ifdef __BGS10_MPLS_DEBUG
MPLS_ERR_LOG("===policy is no egress to,dele the all old lspcb===");
#endif
lspCb->pNexthopChange = 1;
if(!(lspCb->waitflag & 0x1))
LspCBFsm(MPLS_NULL,MPLS_ROUTE_DELETE,MPLS_NULL,LDP_HOP_LSP,fecCb,lspCb);
else
MPLS_ERR_LOG("Route lspCb->waitflag %x",lspCb->waitflag);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -