📄 ldpfunc.c
字号:
else
{
LspCBVar->downAtmLabel.module = fecMsg->Fec.sbModule;
LspCBVar->downAtmLabel.port = fecMsg->Fec.sbPort;
}
return LDP_TRUE;
}
/*取到上下游业务板相关接口,填到LspCB中*/
if((LspCBVar->nodeType == MPLS_NODE_INTERM_INGRESS)||(LspCBVar->nodeType == MPLS_NODE_INGRESS))
{
LspCBVar->upAtmLabel.module = fecMsg->Fec.sbModule;
LspCBVar->upAtmLabel.port = fecMsg->Fec.sbPort;
}
else if((LspCBVar->nodeType == MPLS_NODE_INTERM_EGRESS)||(LspCBVar->nodeType == MPLS_NODE_EGRESS))
{
LspCBVar->downAtmLabel.module = fecMsg->Fec.sbModule;
LspCBVar->downAtmLabel.port = fecMsg->Fec.sbPort;
}
return LDP_TRUE;
}
/* wengqing */
/* wengqing delete if 2002/12/2 */
/* 2003-11-25 lixia mod for dele aggrate body */
/* 2004-5-25 fengjun mod condition for p_s_f->nexthop */
void ldp_del_lspCB(char *pEntry,mplsLdpLspCB *LspCBVar)
{
mplsLdpFecEntry *pFecEntry = MPLS_NULL;
mplsLdpCrLsp *pCrEntry;
mplsLdpLspCB *pLspCBtemp;
mplsLdpSession_t *ses;
mpls_sb_list * sb_list;
int rtcode;
unsigned long nexthop;
/*如果还有定时器,删除定时器*/
if(LspCBVar->timerid > 0)
{
MPLS_CLEAR_TIMER(LspCBVar->timerid,ldptime_q,rtcode);
MPLS_ASSERT(rtcode == 1);
if(rtcode)
{
LspCBVar->timerid = 0;
}
}
if(LspCBVar->lspType == LDP_CR_LSP)
{
pCrEntry = (mplsLdpCrLsp *)pEntry;
ses = MPLS_NULL;
/*
if(LspCBVar->up_lsp_session_list.prev || LspCBVar->up_lsp_session_list.next)
{
*/
if(LspCBVar->nodeType != MPLS_NODE_INGRESS)
{
MPLS_INDEX_TO_SESSION(ses,LspCBVar->upSessionIndex)
if(ses)
{
MPLS_REMOVE_FROM_SESSION_UP_LSP_LIST(ses->lsp_up_cb_list,LspCBVar)
}
else
{
MPLS_REMOVE_FROM_SESSION_UP_LSP_LIST(g_up_lsp_list,LspCBVar)
}
}
else
{
sb_list = MPLS_NULL;
MPLS_SB_SEARCH(LspCBVar->upAtmLabel.module,\
LspCBVar->upAtmLabel.port,sb_list);
if(!sb_list)
{
MPLS_REMOVE_FROM_SESSION_UP_LSP_LIST(g_up_lsp_list,LspCBVar)
}
else
{
MPLS_REMOVE_FROM_SESSION_UP_LSP_LIST_A(sb_list->lsp_up_cb_list,LspCBVar)
if(!(sb_list->lsp_down_cb_list.first ||sb_list->lsp_up_cb_list.first))
MPLS_SB_DELETE(LspCBVar->upAtmLabel.module,\
LspCBVar->upAtmLabel.port,sb_list)
}
}
/*
}
*/
ses = MPLS_NULL;
/*
if(LspCBVar->down_lsp_session_list.prev || LspCBVar->down_lsp_session_list.next)
{
*/
if(LspCBVar->nodeType != MPLS_NODE_EGRESS)
{
MPLS_INDEX_TO_SESSION(ses,LspCBVar->downSessionIndex)
if(ses)
{
MPLS_REMOVE_FROM_SESSION_DOWN_LSP_LIST(ses->lsp_down_cb_list,LspCBVar)
}
else
{
MPLS_REMOVE_FROM_SESSION_DOWN_LSP_LIST(g_down_lsp_list,LspCBVar)
}
}
else
{
sb_list = MPLS_NULL;
MPLS_SB_SEARCH(LspCBVar->downAtmLabel.module,\
LspCBVar->downAtmLabel.port,sb_list);
if(!sb_list)
{
MPLS_REMOVE_FROM_SESSION_DOWN_LSP_LIST(g_down_lsp_list,LspCBVar)
}
else
{
MPLS_REMOVE_FROM_SESSION_DOWN_LSP_LIST_A(sb_list->lsp_down_cb_list,LspCBVar)
if(!(sb_list->lsp_down_cb_list.first ||sb_list->lsp_up_cb_list.first))
MPLS_SB_DELETE(LspCBVar->downAtmLabel.module,\
LspCBVar->downAtmLabel.port,sb_list)
}
}
/*
}
*/
/* 释放为path vector分配的空间 hyh 2003.3.3 */
if(LspCBVar->pAttr.pAttr != MPLS_NULL)
{
ldp_pathvector_free(&(LspCBVar->pAttr));
}
MPLS_CRFECCB_DELETE(pCrEntry->crfec_key.ingressid, \
pCrEntry->crfec_key.locallspid, \
pCrEntry)
return;
}
else
{
pFecEntry = (mplsLdpFecEntry *)pEntry;
ses = MPLS_NULL;
/*
if(LspCBVar->up_lsp_session_list.prev || LspCBVar->up_lsp_session_list.next)
{
*/
if(LspCBVar->nodeType != MPLS_NODE_INGRESS)
{
MPLS_INDEX_TO_SESSION(ses,LspCBVar->upSessionIndex)
if(ses)
{
MPLS_REMOVE_FROM_SESSION_UP_LSP_LIST(ses->lsp_up_cb_list,LspCBVar)
}
else
{
MPLS_REMOVE_FROM_SESSION_UP_LSP_LIST(g_up_lsp_list,LspCBVar)
}
}
else
{
sb_list = MPLS_NULL;
MPLS_SB_SEARCH(LspCBVar->upAtmLabel.module,\
LspCBVar->upAtmLabel.port,sb_list);
if(!sb_list)
{
MPLS_REMOVE_FROM_SESSION_UP_LSP_LIST(g_up_lsp_list,LspCBVar)
}
else
{
MPLS_REMOVE_FROM_SESSION_UP_LSP_LIST_A(sb_list->lsp_up_cb_list,LspCBVar)
if(!(sb_list->lsp_down_cb_list.first ||sb_list->lsp_up_cb_list.first))
MPLS_SB_DELETE(LspCBVar->upAtmLabel.module,\
LspCBVar->upAtmLabel.port,sb_list)
}
}
/*
}
*/
ses = MPLS_NULL;
/*
if(LspCBVar->down_lsp_session_list.prev || LspCBVar->down_lsp_session_list.next)
{
*/
if(LspCBVar->nodeType != MPLS_NODE_EGRESS)
{
MPLS_INDEX_TO_SESSION(ses,LspCBVar->downSessionIndex)
if(ses)
{
MPLS_REMOVE_FROM_SESSION_DOWN_LSP_LIST(ses->lsp_down_cb_list,LspCBVar)
}
else
{
MPLS_REMOVE_FROM_SESSION_DOWN_LSP_LIST(g_down_lsp_list,LspCBVar)
}
}
else
{
sb_list = MPLS_NULL;
MPLS_SB_SEARCH(LspCBVar->downAtmLabel.module,\
LspCBVar->downAtmLabel.port,sb_list);
if(!sb_list)
{
MPLS_REMOVE_FROM_SESSION_DOWN_LSP_LIST(g_down_lsp_list,LspCBVar)
}
else
{
MPLS_REMOVE_FROM_SESSION_DOWN_LSP_LIST_A(sb_list->lsp_down_cb_list,LspCBVar)
if(!(sb_list->lsp_down_cb_list.first ||sb_list->lsp_up_cb_list.first))
MPLS_SB_DELETE(LspCBVar->downAtmLabel.module,\
LspCBVar->downAtmLabel.port,sb_list)
}
}
/*
}
*/
#if 1
/* not create pvc,please delete aggr_body *//*2003-11-25 lixia mod condition for Ingress and Interm node */
if((LspCBVar->nodeType == MPLS_NODE_EGRESS)&&(LspCBVar->status == RESPONSE_AWAITED)&&(LspCBVar->subStatus == CREATE_PVC_REQ_AWAITED))
{
if(pFecEntry->owner == MPLS_OWNER_POLICY ||
((pFecEntry->owner &MPLS_OWNER_ROUTE)&&
(pFecEntry->pRes & MPLS_EGRESS_TO_POLICY)))
{
if(LspCBVar->downAtmLabel.module)
nexthop = LspCBVar->downAtmLabel.module;
else
nexthop = LspCBVar->downAtmLabel.port;
}
else
{
nexthop = 0xffffffff;
}
p_s_f = MPLS_NULL;
for(p_s_f = aggr_body.first; p_s_f; p_s_f = p_s_f->next)
{
if( (p_s_f->upAtmLabel.module == LspCBVar->upAtmLabel.module) && \
(p_s_f->upAtmLabel.port == LspCBVar->upAtmLabel.port) && \
(p_s_f->downAtmLabel.module == LspCBVar->downAtmLabel.module) && \
(p_s_f->downAtmLabel.port == LspCBVar->downAtmLabel.port) && \
(p_s_f->attr.hopcount == LspCBVar->pAttr.hopcount) && \
(p_s_f->attr.len == LspCBVar->pAttr.len) && \
(p_s_f->nexthop == nexthop) && \
(!MPLS_MEMCMP(p_s_f->attr.pAttr,LspCBVar->pAttr.pAttr,LspCBVar->pAttr.len))
)
break;
}
if(p_s_f)
{
aggr_delete(p_s_f);
}
/* else
printf("when CREATE_PVC_REQ_AWAITED nodetype %d dele p_s_f fail\n",LspCBVar->nodeType); */
}
/*2003-12-25 lixia add for dele p_s_f*/
else if((LspCBVar->nodeType != MPLS_NODE_EGRESS)&&(LspCBVar->status == RESPONSE_AWAITED)&&(LspCBVar->subStatus == CREATE_PVC_REQ_AWAITED))
{
p_s_f = MPLS_NULL;
for(p_s_f = aggr_body.first; p_s_f; p_s_f = p_s_f->next)
{
if( (p_s_f->upAtmLabel.module == LspCBVar->upAtmLabel.module) && \
(p_s_f->upAtmLabel.port == LspCBVar->upAtmLabel.port) && \
(p_s_f->downAtmLabel.module == LspCBVar->downAtmLabel.module) && \
(p_s_f->downAtmLabel.port == LspCBVar->downAtmLabel.port) && \
(p_s_f->downAtmLabel.vpi == LspCBVar->downAtmLabel.vpi) && \
(p_s_f->downAtmLabel.vci == LspCBVar->downAtmLabel.vci) && \
(p_s_f->nodeType == LspCBVar->nodeType) )
/* (p_s_f->attr.hopcount == LspCBVar->pAttr.hopcount) && \ */
break;
}
if(p_s_f)
{
aggr_delete(p_s_f);
}
/* else
printf("when CREATE_PVC_REQ_AWAITED nodetype %d dele p_s_f fail\n",LspCBVar->nodeType); */
}
#endif
/* 释放为path vector分配的空间 hyh 2003.3.3 */
if(LspCBVar->pAttr.pAttr != MPLS_NULL)
{
ldp_pathvector_free(&(LspCBVar->pAttr));
}
MPLS_FEC_LSPCB_DELETE(pFecEntry,LspCBVar)
/* for fec no route delete fec */
if(!((pFecEntry->up_cb_list).first|| \
(pFecEntry->down_cb_list).first|| \
(pFecEntry->lsp_cb_list).first|| \
pFecEntry->owner))
{
MPLS_FEC_DELETE((pFecEntry->fec_key).mplsFecAddr,\
(pFecEntry->fec_key).mplsLdpFecAddrLen,pFecEntry);
}
}
return;
}
/*建立PVC相关函数*/
short FuncCreatePvc(mplsLdpLspCB *LspCBVar, char *pEntry)
{
mplsLdpFecEntry *pFecEntry = MPLS_NULL;
mplsLdpCrLsp *pCrEntry = MPLS_NULL;
STRUC_MPLS_AD_CRPVC_REQ createPvcReq;
short rtcode;
unsigned short localLspId;
unsigned long LspCBNo;
mplsLdpTrafficTlv_t Traffic;
lblmsgTlvExists tlvexists;
MPLS_MEMSET(&Traffic,0,sizeof(mplsLdpTrafficTlv_t));
if(LspCBVar->lspType == LDP_HOP_LSP)
{
pFecEntry = (mplsLdpFecEntry *)pEntry;
localLspId = pFecEntry->fec_key.mplsLdpFecAddrLen;
LspCBNo = pFecEntry->fec_key.mplsFecAddr;
Traffic.freq = UNSPECIFIED;
/* szh temp add 2003-11-15 hop traffic can config */
if((hoptraffpara_pdr !=0)&&(hoptraffpara_pbs !=0))
{
Traffic.pdr.pdr = hoptraffpara_pdr * 48;
Traffic.pbs.pbs = hoptraffpara_pbs * 48;
}
else
{
Traffic.pdr.pdr = DEFAULT_PDR;
Traffic.pbs.pbs = DEFAULT_PBS;
}
}
else
{
pCrEntry = (mplsLdpCrLsp *)pEntry;
localLspId = pCrEntry->crfec_key.locallspid;
LspCBNo = pCrEntry->crfec_key.ingressid;
tlvexists.mark = pCrEntry->tlvExists;
if(tlvexists.flags.trafficTlvExists == 1)
MPLS_MEMCPY(&Traffic,&pCrEntry->trafficTlv,sizeof(mplsLdpTrafficTlv_t));
else
{
Traffic.freq = UNSPECIFIED;
Traffic.pdr.pdr = DEFAULT_PDR;
Traffic.pbs.pbs = DEFAULT_PBS;
}
}
// LspCBVar->subStatus = CREATE_PVC_REQ_AWAITED;
/*填充请求*/
MPLS_MEMSET(&createPvcReq, 0, sizeof(STRUC_MPLS_AD_CRPVC_REQ));
if(ldp_fill_crpvcreq(&createPvcReq,LspCBVar,localLspId,LspCBNo,&Traffic,pEntry)==LDP_FALSE)
return LDP_FALSE;
/*将请求加入缓冲队列*/
LspCBVar->lsp_loc = MPLS_NULL;
rtcode = mpls_xc_req_append(&createPvcReq,CRPVC_REQ,LspCBVar->lsp_loc,LOC_NEED);
if(rtcode == REQ_QUEUE_OK)
{
/*加入成功,置资源定时器*/
MPLS_SET_TIMER(XC_RES_TIME,(void *)ldp_crpvc_timeout,LspCBVar,ldptime_q,LspCBVar->timerid);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -