📄 ldproute.c
字号:
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;
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;
}
else
{
DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_LSP,"SessionUP ,ERR get Down ATM Module & port\n");
MPLS_ERR_LOG("ERR get UP ATM Module & port");
/* should release up atm label */
MPLS_FEC_LSPCB_DELETE(fecCb,lspCb);
return;
}
MPLS_INSERT_INTO_DOWN_LSP_LIST(session->lsp_down_cb_list,lspCb,lspCb);
lspCb->status = IDLE;
lspCb->subStatus = IDLE;
if(!(lspCb->waitflag & 0x1))
LspCBFsm(session,MPLS_ROUTE_ADD,MPLS_NULL,LDP_HOP_LSP,fecCb,lspCb);
}
else
DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_LSP,"SessionUp,creat lspcb fail\n");
#endif
}
else
{
MPLS_ERR_LOG("====Nexthop not belong to Session====");
}
}
}
else
{
if(fecCb->owner & MPLS_OWNER_ROUTE)
{
belong_to = MPLS_FALSE;
MPLS_NEXTHOP_SESSION_BELONG(fecCb->nexthopAddr,session,belong_to);
if(belong_to == MPLS_TRUE)
{
fecCb->nexthopSessionIndex = session->index;
}
MPLS_UPCB_CREATE(fecCb,session,upCb)
if(upCb)
{
upCb->upSessionIndex = session->index;
upCb->upGenLabel = fecCb->localGenLabel;
upCb->upPeerLdpid.lsrAddress = session->peerLdpId.lsrAddress;
upCb->upPeerLdpid.labelSpace = session->peerLdpId.labelSpace;
upCb->state = ESTABLISHED;
wait_uplblmsg_append(upCb,fecCb,MPLS_NULL,MPLS_NULL,MPLS_LBLMAP_MSGTYPE);
}
}
}
}
else
{
printf("mpls_err_log,SessionUp,fec is null\n");
}
WALK_FEC_END
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 : Label release process function
* Note :
*/
/****************************************************************************/
void SessionDown_old(mplsLdpSession_t * session)
{
mplsLdpFecEntry * fecCb = MPLS_NULL;
mplsLdpUpCB * upCb = MPLS_NULL;
mplsLdpLspCB * lspCb = MPLS_NULL;
mplsLdpDownCB * downCb = MPLS_NULL;
mplsLdpCrLsp * crfecCb = MPLS_NULL;
mplsLdpLspCB * crlspCb = MPLS_NULL;
mplsLdpSession_t * t_session = MPLS_NULL;
MPLS_BOOL yes = MPLS_FALSE;
unsigned short dismode;
unsigned short belong_to;
WALK_FEC_BEGIN(fecCb)
if(fecCb)
{
if(fecCb->nexthopSessionIndex == session->index)
fecCb->nexthopSessionIndex = 0;
dismode = 0;
MPLS_SESSION_DISTRIBUT_MODE(session,dismode);
if(dismode != DOWNSTREAMONDEMAND)
{
MPLS_WALK_UP_BEGIN(fecCb,upCb,t_upCb)
if(upCb != MPLS_NULL)
{
yes = MPLS_FALSE;
MPLS_SESSION_MATCH_CB_UP(session,upCb,yes);
if(yes == MPLS_TRUE)
{
Up_Clear_Msg(upCb, fecCb);
#if 0
//MPLS_NEXTHOP_SESSION_SEARCH(fecCb->nexthopAddr,t_session);
MPLS_UPCB_DELETE(fecCb,upCb);
#endif
}
}
else
{
printf("mpls_err_log");
}
MPLS_WALK_UP_END(fecCb,upCb,t_upCb)
MPLS_WALK_DOWN_BEGIN(fecCb,downCb,t_downCb)
if(downCb != MPLS_NULL)
{
yes = MPLS_FALSE;
MPLS_SESSION_MATCH_CB_DOWN(session,downCb,yes);
if(yes == MPLS_TRUE)
{
if(fecCb->owner & MPLS_OWNER_ROUTE)
{
belong_to = MPLS_FALSE;
MPLS_NEXTHOP_SESSION_BELONG(fecCb->nexthopAddr,session,belong_to);
if( belong_to == MPLS_TRUE)
{
downCb->waitflag |=0x1;
wait_downfeclbl_append(downCb,fecCb,LDP_FWD_CLOSE);
}
else
{
if(!(downCb->waitflag & 0xe0))
{
MPLS_DOWNCB_DELETE(fecCb,downCb);
}
else
{
downCb->waitflag |=0x1;
}
}
Down_Clear_Msg(downCb, fecCb);
}
else
{
if(!(downCb->waitflag & 0xe0))
{
Xc_down_append(downCb,fecCb);
#if 0
MPLS_DOWNCB_DELETE(fecCb,downCb);
#endif
}
else
{
downCb->waitflag |=0x1;
}
Down_Clear_Msg(downCb, fecCb);
}
}
}
else
{
printf("mpls_err_log");
}
MPLS_WALK_DOWN_END(fecCb,downCb,t_downCb)
}
else
{
MPLS_WALK_LSP_BEGIN(fecCb,lspCb,t_lspCb)
yes = MPLS_FALSE;
MPLS_SESSION_MATCH_LSPCB_UP(session,lspCb,yes);
if(yes == MPLS_TRUE)
{
if(!(lspCb->waitflag & 0x1))
LspCBFsm(session,UPSTREAM_LOST,MPLS_NULL,LDP_HOP_LSP,fecCb,lspCb);
}
yes = MPLS_FALSE;
MPLS_SESSION_MATCH_LSPCB_DOWN(session,lspCb,yes);
if(yes == MPLS_TRUE)
{
/* downstream lost*/
if(!(lspCb->waitflag & 0x1))
LspCBFsm(session,DOWNSTREAM_LOST,MPLS_NULL,LDP_HOP_LSP,fecCb,lspCb);
}
MPLS_WALK_LSP_END(fecCb,lspCb,t_lspCb)
}
}
else
{
printf("mpls_err_log");
}
WALK_FEC_END
/* CR-LSP 将会后面处理 */
WALK_CRFEC_BEGIN(crfecCb)
if(crfecCb != MPLS_NULL)
{
dismode = 0;
MPLS_SESSION_DISTRIBUT_MODE(session,dismode);
if(dismode == DOWNSTREAMONDEMAND)
{
yes = MPLS_FALSE;
MPLS_SESSION_MATCH_UP(crfecCb,session,yes)
if(yes == MPLS_TRUE)
{
/* upstream lost */
if(!((crlspCb)->waitflag & 0x1))
LspCBFsm(session,UPSTREAM_LOST,MPLS_NULL,LDP_CR_LSP,crfecCb,crlspCb);
}
yes = MPLS_FALSE;
MPLS_SESSION_MATCH_DOWN(crfecCb,session,yes);
if(yes == MPLS_TRUE)
{
/* downstream lost */
if(!(crlspCb->waitflag & 0x1))
LspCBFsm(session,DOWNSTREAM_LOST,MPLS_NULL,LDP_CR_LSP,crfecCb,crlspCb);
}
}
else
{
yes = MPLS_FALSE;
MPLS_SESSION_MATCH_DOWN(crfecCb,session,yes);
if(yes == MPLS_TRUE)
{
dismode = 0;
MPLS_CRFEC_UP_SESSION(crfecCb,t_session);
if(t_session != MPLS_NULL)
{
MPLS_SESSION_DISTRIBUT_MODE(t_session,dismode);
if(dismode == DOWNSTREAMONDEMAND)
{
/* upstream lost */
if(!(crlspCb->waitflag & 0x1))
LspCBFsm(session,UPSTREAM_LOST,MPLS_NULL,LDP_CR_LSP,crfecCb,crlspCb);
}
else
{
if(crfecCb->crlspCb.status == RESPONSE_AWAITED)
{
/* no route */
MPLS_SEND_NOTIFY(session,NOROUTE,0, 0);
}
else if(crfecCb->crlspCb.status == ESTABLISHED)
{
#if 0
sendtoLabelXC(crfecCb,&crfecCb->crlspCb,MPLS_NULL,LDP_FWD_CREATE);
#endif
wait_crlspfeclbl_append(&(crfecCb->crlspCb),crfecCb,LDP_FWD_CREATE);
sendtoUpWithdraw(crfecCb,t_session);
}
ldp_del_lspCB((char *)crfecCb,&crfecCb->crlspCb);
}
}
else
{
/* upstream ATM interface senario, have process */
/* downstream session set to MPLS_NULL */
MPLS_RESET_SESSION(crfecCb);
}
}
}
yes = MPLS_FALSE;
MPLS_SESSION_MATCH_UP(crfecCb,session,yes);
if(yes == MPLS_TRUE)
{
dismode = 0;
MPLS_CRFEC_DOWN_SESSION(crfecCb,t_session);
if(t_session != MPLS_NULL)
{
MPLS_SESSION_DISTRIBUT_MODE(t_session,dismode);
if(dismode == DOWNSTREAMONDEMAND)
{
/* upstream lost */
if(!(crlspCb->waitflag & 0x1))
LspCBFsm(session,UPSTREAM_LOST,MPLS_NULL,LDP_CR_LSP,crfecCb,crlspCb);
}
else
{
if(crfecCb->crlspCb.status == RESPONSE_AWAITED)
{
sendtoDownLblAbort(t_session,&crfecCb->crlspCb,crfecCb,LDP_CR_LSP);
}
else if(crfecCb->crlspCb.status == ESTABLISHED)
{
#if 0
sendtoLabelXC(crfecCb,&crfecCb->crlspCb,MPLS_NULL,LDP_FWD_CLOSE);
#endif
wait_crlspfeclbl_append(&(crfecCb->crlspCb),crfecCb,LDP_FWD_CLOSE);
sendtoDownRelease( crfecCb);
}
ldp_del_lspCB((char *)crfecCb,&crfecCb->crlspCb);
}
}
else
{
/* downstream ATM interface senario, have process */
/* upstream session set to MPLS_NULL */
MPLS_RESET_SESSION(crfecCb);
}
}
}
else
{
printf("mpls_err_log");
}
WALK_CRFEC_END
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 : Label release process function
* Note : when session down add clear fec scan
*/
/****************************************************************************/
void SessionDown(mplsLdpSession_t * session)
{
mpls_fec_search * pSe;
int rtcode;
if(session->lsp_up_cb_list.first)
{
session->lsp_up_cb_list.first->upSessionIndex = 1;
session->lsp_up_cb_list.last->upSessionIndex = 1;
MPLS_INSERT_INTO_UP_LSP_LIST(g_up_lsp_list,
session->lsp_up_cb_list.first, \
session->lsp_up_cb_list.last);
session->lsp_up_cb_list.first = MPLS_NULL;
session->lsp_up_cb_list.last = MPLS_NULL;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -