📄 f_comm.c
字号:
MPLS_NULL,
ldptime_q,
tmid);
#ifdef DEBUG_LDP
printf("==== LDP set Hello send Timer %d====",tmid);
#endif
return;
}
void ldpSessionSnd()
{
short i,ses_down;
unsigned long tmid;
ses_down = 0;
for(i = 0; i < MPLSLDP_MAX; i++)
{
/*
if((MplsLdpSessionEntry[i].RowStatus == VAL_RowStatus_active) && \
(MplsLdpSessionEntry[i].state == OPERATIONAL))
*/
if(MplsLdpSessionEntry[i].RowStatus == VAL_RowStatus_active)
{
if(MplsLdpSessionEntry[i].state == OPERATIONAL)
{
MplsLdpSessionEntry[i].keepalive_send_timerid -= LDP_SESSION_CHECK_INTERVAL;
if(MplsLdpSessionEntry[i].keepalive_send_timerid <= 0)
{
SendKeepalMsg((mplsLdpSession_t *)&(MplsLdpSessionEntry[i].entityLdpId));
}
}
ses_down = 1;
}
}
if(ses_down == 0)
{
switch_router_id = 0;
}
MPLS_SET_TIMER(LDP_SESSION_CHECK_INTERVAL,
(void *)ldpSessionSnd,
MPLS_NULL,
ldptime_q,
tmid);
#ifdef DEBUG_LDP
printf("==== LDP set Session send Timer %d====",tmid);
#endif
}
/****************************************************************************/
/* Product Name: MPLS PACK1.0
* Module Name: LDP/CR_LDP
* File Name: f_comm.c
* Author Name: weng.qing shi.zhaohui hu.yonghong
* Creat Date: 2002-6-18
* Version : 1.0
* Input : void
* Output : void
* Function : priodic lost list scan function
* Note :
*/
/****************************************************************************/
void ldpListCheck()
{
unsigned long tmid,i,status;
mplsLdpUpCB * upCb;
mplsLdpDownCB * downCb;
mplsLdpLspCB * lspCb;
unsigned char lspType;
if((g_up_lsp_list.first))
{
lspCb = g_up_lsp_list.first;
status = lspCb->upSessionIndex;
for(i = 0; (lspCb)&&(i < LDP_LIST_CHECK_ITEM_NUM);\
i++)
{
lspType = lspCb->lspType;
MPLS_REMOVE_FROM_SESSION_UP_LSP_LIST(g_up_lsp_list,lspCb);
/* wengqing add for Fei alarm protection */
if(lspCb->upSessionIndex == 1)
{
if(!(lspCb->waitflag & 0x1))
LspCBFsm(MPLS_NULL,UPSTREAM_LOST,MPLS_NULL,lspType, \
lspCb->selffec,lspCb);
}
else if(lspCb->upSessionIndex == 2)
{
if(!(lspCb->waitflag & 0x1))
LspCBFsm(MPLS_NULL,MPLS_LBLREL_MSGTYPE,MPLS_NULL,lspType, \
lspCb->selffec,lspCb);
}
else if(lspCb->upSessionIndex == 0 && lspCb->nodeType == MPLS_NODE_INGRESS)
{
lspCb->pNexthopChange = 0;
if(!(lspCb->waitflag & 0x1))
LspCBFsm(MPLS_NULL,MPLS_ROUTE_DELETE,MPLS_NULL,lspType, \
lspCb->selffec,lspCb);
}
else
{
MPLS_ASSERT(0);
/* protection for upSessionIndex >= 3, have to process lspCb */
lspCb->upSessionIndex = status = 1;
if(!(lspCb->waitflag & 0x1))
LspCBFsm(MPLS_NULL,UPSTREAM_LOST,MPLS_NULL,lspType, \
lspCb->selffec,lspCb);
}
lspCb = g_up_lsp_list.first;
if(lspCb)
{
if(lspCb->upSessionIndex >= 3)
{
lspCb->upSessionIndex = status;
}
}
}
}
else if(g_down_lsp_list.first)
{
lspCb = g_down_lsp_list.first;
status = lspCb->downSessionIndex;
for(i = 0; (lspCb)&&(i < LDP_LIST_CHECK_ITEM_NUM);\
i ++)
{
lspType = lspCb->lspType;
MPLS_REMOVE_FROM_SESSION_DOWN_LSP_LIST(g_down_lsp_list,lspCb);
/* wengqing add for Fei alarm protection */
if(lspCb->downSessionIndex == 1)
{
if(!(lspCb->waitflag & 0x1))
LspCBFsm(MPLS_NULL,DOWNSTREAM_LOST,MPLS_NULL,lspType, \
lspCb->selffec,lspCb);
}
else if(lspCb->downSessionIndex == 2)
{
if(!(lspCb->waitflag & 0x1))
LspCBFsm(MPLS_NULL,MPLS_LBLWITH_MSGTYPE,MPLS_NULL,lspType, \
lspCb->selffec,lspCb);
}
else if(lspCb->downSessionIndex == 0 && lspCb->nodeType == MPLS_NODE_EGRESS)
{
lspCb->pNexthopChange = 1;
if(!(lspCb->waitflag & 0x1))
LspCBFsm(MPLS_NULL,MPLS_ROUTE_DELETE,MPLS_NULL,lspType, \
lspCb->selffec,lspCb);
}
else
{
MPLS_ASSERT(0);
/* protection for downSessionIndex >= 3, have to process lspCb */
MPLS_ERR_LOG("downSessionIndex %u-->1",lspCb->downSessionIndex);
lspCb->downSessionIndex = status = 1;
if(!(lspCb->waitflag & 0x1))
LspCBFsm(MPLS_NULL,DOWNSTREAM_LOST,MPLS_NULL,lspType, \
lspCb->selffec,lspCb);
}
lspCb = g_down_lsp_list.first;
if(lspCb)
{
if(lspCb->downSessionIndex >= 3)
{
lspCb->downSessionIndex = status;
}
}
}
}
else if((g_up_list.first))
{
upCb = g_up_list.first;
status = upCb->upSessionIndex;
for(i = 0; (upCb)&&(i < LDP_LIST_CHECK_ITEM_NUM);\
i ++)
{
if(status == 1)
{
Up_Clear_Msg(upCb, upCb->selffec);
}
else if(status == 2)
{
MPLS_UPCB_DELETE(upCb->selffec,upCb);
}
MPLS_REMOVE_FROM_SESSION_UP_LIST(g_up_list,upCb);
upCb = g_up_list.first;
if(upCb)
{
if(upCb->upSessionIndex >= 3)
{
upCb->upSessionIndex = status;
}
}
}
}
else if((g_down_list.first))
{
downCb = g_down_list.first;
for(i = 0; (lspCb)&&(i < LDP_LIST_CHECK_ITEM_NUM);\
i ++)
{
MPLS_REMOVE_FROM_SESSION_DOWN_LIST(g_down_list,downCb);
downCb = g_down_list.first;
}
}
MPLS_SET_TIMER(LDP_LIST_CHECK_INTERVAL,
(void *)ldpListCheck,
MPLS_NULL,
ldptime_q,
tmid);
/* 2003.4.23 wengqing 如果链表已全部处理完,进行保护操作 */
#if MPLS_PROTECT
if((g_up_lsp_list.first == MPLS_NULL)&&(g_down_lsp_list.first == MPLS_NULL)&&(fec_lspcb_scan.timer != 0))
{
ldpFecLspcbScan();
}
#endif
#ifdef DEBUG_LDP
printf("==== LDP set list check Timer %d====",tmid);
#endif
return;
}
/****************************************************************************/
/* Product Name: MPLS PACK1.0
* Module Name: LDP/CR_LDP
* File Name: f_comm.c
* Author Name: weng.qing shi.zhaohui hu.yonghong
* Creat Date: 2002-6-18
* Version : 1.0
* Input : mpls_fec_search *pSearch
* Output : void
* Function : priodic fec scan function
* Note : per session scan fec list, add fec add or delete,
* from head scan again, protection for scan for one fec twice
*/
/****************************************************************************/
void ldpFecSearchCheck( mpls_fec_search *pSearch )
{
mplsLdpFecEntry * fecCb = MPLS_NULL;
mpls_fec_search * pSe = MPLS_NULL;
unsigned short i,j;
unsigned short dismode;
mplsLdpSession_t * session = MPLS_NULL;
mplsLdpDownCB * downCb = MPLS_NULL;
mplsLdpLspCB * lspCb = MPLS_NULL;
mplsLdpUpCB * upCb = MPLS_NULL;
MPLS_BOOL belong_to;
dismode = 0;
session = (mplsLdpSession_t *)pSearch->session;
MPLS_SESSION_DISTRIBUT_MODE(session,dismode);
j = (dismode == DOWNSTREAMONDEMAND) ? 32 : 512;
if(pSearch->stop == 0)
{
MPLS_FEC_SEARCH(pSearch->addr,pSearch->addrLen,fecCb)
/* protection for route process for no ingress to build */
if(fecCb == MPLS_NULL)
{
fecCb = MPLS_AVL_FIRST(g_fec_avl_tree);
pSearch->stop = 0;
}
}
else
{
fecCb = MPLS_AVL_FIRST(g_fec_avl_tree);
pSearch->stop = 0;
}
i = 0;
for(;;fecCb = MPLS_AVL_NEXT(fecCb->fec_avl_node))
{
if(fecCb == MPLS_NULL)
{
MPLS_FEC_SEARCH_DELETE(g_fec_search_list,pSearch);
return;
}
/* 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)
{
pSearch->addr = fecCb->fec_key.mplsFecAddr;
pSearch->addrLen = fecCb->fec_key.mplsLdpFecAddrLen;
pSearch->tmier = 0;
printf("1 set delay timer 5s");
MPLS_SET_TIMER(50,(void *)ldpFecSearchCheck,(void *)pSearch,\
ldptime_q,pSearch->tmier);
if(pSearch->tmier == 0)
{
DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_LSP,"MPLS_FEC_SEARCH_CREATE SET_TIMER Fail\n");
MPLS_ERR_LOG("MPLS_FEC_SEARCH_CREATE SET_TIMER Fail");
MPLS_FEC_SEARCH_DELETE(g_fec_search_list,pSearch);
}
break;
}
if(++i > j)
{
pSearch->addr = fecCb->fec_key.mplsFecAddr;
pSearch->addrLen = fecCb->fec_key.mplsLdpFecAddrLen;
pSearch->tmier = 0;
MPLS_SET_TIMER(10,(void *)ldpFecSearchCheck,(void *)pSearch,\
ldptime_q,pSearch->tmier);
if(pSearch->tmier == 0)
{
DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_LSP,"MPLS_FEC_SEARCH_CREATE 2 SET_TIMER Fail\n");
MPLS_ERR_LOG("MPLS_FEC_SEARCH_CREATE SET_TIMER Fail");
MPLS_FEC_SEARCH_DELETE(g_fec_search_list,pSearch);
}
break;
}
else
{
if(fecCb->nexthopSessionIndex == (session->index))
continue;
if(dismode == DOWNSTREAMONDEMAND)
{
if((fecCb->owner & MPLS_OWNER_ROUTE) && \
(fecCb->nodeType != MPLS_NODE_EGRESS) && \
(fecCb->nodeType != MPLS_NODE_PROXY_EGRESS) && (!(fecCb->pRes & MPLS_DENY_POLICY)))
{
belong_to = MPLS_FALSE;
MPLS_NEXTHOP_SESSION_BELONG(fecCb->nexthopAddr,session,belong_to);
if(belong_to == MPLS_TRUE)
{
if(fecCb->nexthopSessionIndex)
{
MPLS_WALK_DOWN_BEGIN(fecCb,downCb,t_downCb);
if(downCb != MPLS_NULL && downCb->downSessionIndex == fecCb->nexthopSessionIndex)
{
switch(downCb->state)
{
case ESTABLISHED:
if(session)
{
if(session->index == downCb->downSessionIndex)
wait_downfeclbl_append(downCb,fecCb,LDP_FWD_CLOSE);
}
break;
case RESPONSE_AWAITED:
/* send to up notification: no route */
downCb->waitflag |=0x1;
wait_downlblmsg_append(downCb,fecCb,MPLS_LBLABORT_MSGTYPE);
break;
default:
printf("mpls_err_log,ldpFecSearchCheck default");
break;
}
}
MPLS_WALK_DOWN_END(fecCb,downCb,t_downCb)
}
fecCb->nexthopSessionIndex = session->index;
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 = session->index;
lspCb->downifIndex = session->ifIndex;
lspCb->downPeerLdpid.lsrAddress = session->peerLdpId.lsrAddress;
lspCb->downPeerLdpid.labelSpace = session->peerLdpId.labelSpace;
ifindex2mod_req.ifIndex = lspCb->downifIndex;
ifindex2mod_req.mpls_protocol_type = MPLS_LABEL_SWITCH_PROTOCOL_ATM;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -