📄 notify.c
字号:
#include "ldpvars.h"
/****************************************************************************/
/* 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 :
* wengqing 2002/12/2 if ingress recv notify,delete from sblist
* wengqing 2003.1.16 modify the method of search to be more efficent
* wengqing 2003.02.26 update lspCb downMsgid and down msg type
* fengjun 2003.12.30 删除未编译代码 */
/****************************************************************************/
void FuncNotify(mplsLdpSession_t * session, void * inputEvent)
{
mplsLdpNotifMsg_t * notifMsg = MPLS_NULL;
mplsLdpSession_t * upsession = MPLS_NULL;
mplsLdpCrLsp * crlspCB = MPLS_NULL;
mplsLdpFecEntry * fecCb = MPLS_NULL;
mplsLdpLspCB * lspCb = MPLS_NULL;
mplsLdpDownCB * downCb = MPLS_NULL;
mpls_sb_list * sb_list;
unsigned short yes;
unsigned short dismode;
unsigned char have = 0;
notifMsg = (mplsLdpNotifMsg_t *)inputEvent;
if (notifMsg->statusTlvExists == 1)
{
#if 1
if(notifMsg->status.msgId == 0)
{
/* does not identify peer message */
if(notifMsg->status.flags.flags.status == LBLRESRCAVA)
{
/* label resource available */
}
else if(notifMsg->status.flags.flags.status == LBLRESRCAVA)
{
/* no definition */
/* resource available */
}
return;
}
/* wengqing 2003.01.06 LBLREQAB reponse to label abort message,
we dont't process, directly discard it
*/
else if(notifMsg->status.flags.flags.status == LBLREQAB)
{
return;
}
#endif
crlspCB = MPLS_NULL;
// MPLS_CRFEC_DOWN_SESSION_MSGID(session,notifMsg->status.msgId,crlspCB)
if(notifMsg->lspidTlvExists == 1)
{
MPLS_CRFECCB_SEARCH(notifMsg->lspidTlv.routerId, \
notifMsg->lspidTlv.localCrlspId,\
crlspCB);
if(crlspCB)
{
have = 1;
if(!((&crlspCB->crlspCb)->waitflag & 0x1))
{
/* wengqing 2003.02.26 update lspCb downMsgid and down msg type */
(&(crlspCB->crlspCb))->msgType = MPLS_NOT_MSGTYPE;
(&(crlspCB->crlspCb))->downMsgid = notifMsg->baseMsg.msgId;
LspCBFsm(session,LDP_DOWNSTREAM_NAK, \
notifMsg,LDP_CR_LSP,crlspCB,&crlspCB->crlspCb);
}
}
else
{
return;
}
}
#if 0
WALK_CRFEC_BEGIN(crlspCB)
if(crlspCB != MPLS_NULL)
{
lspCb = &crlspCB->crlspCb;
if(crlspCB != MPLS_NULL && lspCb != MPLS_NULL)
{
if(notifMsg->lspidTlvExists == 1)
{
yes = MPLS_FALSE;
MPLS_MATCH_CRFEC_LSPID(crlspCB,¬ifMsg->lspidTlv,yes)
if(yes == MPLS_FALSE)
{
/* bad message value */
MPLS_SEND_NOTIFY(session,MALFORMTLVVAL,notifMsg->baseMsg.msgId, \
notifMsg->baseMsg.flags.flags.msgType);
have = 1;
break;
}
}
}
else if(notifMsg->lspidTlvExists == 1)
{
/* bad message value */
have = 1;
MPLS_SEND_NOTIFY(session,MALFORMTLVVAL,notifMsg->baseMsg.msgId, \
notifMsg->baseMsg.flags.flags.msgType);
break;
}
else
{
dismode = 0;
MPLS_SESSION_DISMODE(session,dismode)
if(dismode == DOWNSTREAMONDEMAND)
{
MPLS_CRFEC_SESSION_MSGID(session,
notifMsg->status.msgId,crlspCB);
if(crlspCB != MPLS_NULL )
{
/* 2002.11.06 CRLSPCB Delete from lsp_down_cb_list */
MPLS_REMOVE_FROM_SESSION_DOWN_LSP_LIST(session->lsp_down_cb_list,&(crlspCb->crlspCb))
have = 1;
if(!((&crlspCb->crlspCb)->waitflag & 0x1))
{
/* wengqing 2003.02.26 update lspCb downMsgid and down msg type */
(&(crlspCB->crlspCb))->msgType = MPLS_NOT_MSGTYPE;
(&(crlspCB->crlspCb))->downMsgId = notifMsg->baseMsg.msgId;
LspCBFsm(session,LDP_DOWNSTREAM_NAK, \
notifMsg,LDP_CR_LSP,crlspCB,&crlspCB->crlspCb);
}
break;
}
}
else
{
MPLS_FEC_DOWNCB_SESSION_MSGID(fecCb,downCb,session,
notifMsg->status.msgId);
if(fecCb != MPLS_NULL && downCb != MPLS_NULL)
{
if(downCb->state == RESPONSE_AWAITED)
{
lspCb = MPLS_NULL;
MPLS_DOWNCB_DELETE(fecCb,downCb);
MPLS_WALK_LSP_BEGIN(fecCb,lspCb,t_lspCb)
if(lspCb->nodeType == MPLS_NODE_EGRESS)
{
/* downstream lost */
if(!(lspCb->waitflag & 0x1))
LspCBFsm(session,DOWNSTREAM_LOST,\
MPLS_NULL,LDP_HOP_LSP,fecCb,lspCb);
have = 1;
break;
}
MPLS_WALK_LSP_END(fecEntry,lspCb,t_lspCb)
break;
}
}
}
}
}
WALK_CRFEC_END
#endif
if(have != 0)
return;
/*
WALK_FEC_BEGIN(fecCb)
if(fecCb)
{
*/
fecCb = MPLS_NULL;
lspCb = MPLS_NULL;
MPLS_FEC_LSPCB_DOWN_SESSION_MSGID_PEND(fecCb,lspCb,session,notifMsg->status.msgId,notifMsg->status.msgType)
if(lspCb)
{
/* 2002.10.28 when node is ingress, lspCb don't delete,
so not delete from down session list */
if(lspCb->nodeType != MPLS_NODE_INGRESS)
{
MPLS_REMOVE_FROM_SESSION_DOWN_LSP_LIST(session->lsp_down_cb_list,lspCb)
}
else /*wengqing 2002/12/2 if ingress recv notify,delete from sblist*/
{
sb_list = MPLS_NULL;
MPLS_SB_SEARCH(lspCb->upAtmLabel.module,\
lspCb->upAtmLabel.port,sb_list);
if(!sb_list)
{
MPLS_REMOVE_FROM_SESSION_UP_LSP_LIST(g_up_lsp_list,lspCb);
}
else
{
MPLS_REMOVE_FROM_SESSION_UP_LSP_LIST_A(sb_list->lsp_up_cb_list,lspCb);
if(!(sb_list->lsp_down_cb_list.first ||sb_list->lsp_up_cb_list.first))
MPLS_SB_DELETE(lspCb->upAtmLabel.module,\
lspCb->upAtmLabel.port,sb_list)
}
}
if(!(lspCb->waitflag & 0x1))
{
/* wengqing 2003.02.26 update lspCb downMsgid and down msg type */
lspCb->msgType = MPLS_NOT_MSGTYPE;
lspCb->downMsgid = notifMsg->baseMsg.msgId;
LspCBFsm(session,LDP_DOWNSTREAM_NAK,notifMsg,LDP_HOP_LSP,fecCb,lspCb);
}
return;
}
/*
}
WALK_FEC_END
*/
}
else
{
/* missing parameter */
MPLS_SEND_NOTIFY(session,MISSPARAMETER,notifMsg->baseMsg.msgId, \
notifMsg->baseMsg.flags.flags.msgType);
}
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -