📄 ldplspfsm.c
字号:
LspCBVar->downAtmLabel.port = p_s_f->downAtmLabel.port;
/* insert lspcb into new sb_list */
sb_list = MPLS_NULL;
MPLS_SB_SEARCH(LspCBVar->downAtmLabel.module,LspCBVar->downAtmLabel.port,sb_list);
if(!sb_list)
{
MPLS_SB_CREATE(LspCBVar->downAtmLabel.module,LspCBVar->downAtmLabel.port,sb_list)
}
if(sb_list)
{
MPLS_INSERT_INTO_DOWN_LSP_LIST(sb_list->lsp_down_cb_list,LspCBVar,LspCBVar);
}
}
LspCBVar->downAtmLabel.vpi = p_s_f->downAtmLabel.vpi;
LspCBVar->downAtmLabel.vci = p_s_f->downAtmLabel.vci;
/* create pvc ack success, Egress */
p_s_f->refNum ++;
LspCBVar->status = ESTABLISHED;
LspCBVar->subStatus = IDLE;
if(LspCBVar->lspType == LDP_HOP_LSP)
wait_lspfeclbl_append(LspCBVar,pEntry,LDP_FWD_CREATE);
else
CR_wait_lspfeclbl_append(LspCBVar,pEntry,LDP_FWD_CREATE);
if((LspCBVar->lspType) == LDP_HOP_LSP)
wait_lsplblmsg_append(LspCBVar,pEntry,MPLS_NULL,MPLS_NULL,MPLS_LBLMAP_MSGTYPE);
else
CR_wait_lsplblmsg_append(LspCBVar,pEntry,MPLS_NULL,MPLS_NULL,MPLS_LBLMAP_MSGTYPE);
}
return LDP_TRUE;
}
else
{
p_s_f = MPLS_NULL;
MPLS_MEM_ALLOC(p_s_f,(mpls_ldpFecAggr *),\
sizeof(mpls_ldpFecAggr),mem_mgr[IUMEM_LDP_FEC_AGGR]);
if(!p_s_f)
{
LspCBVar->errorcode = EGRESS_MALLOCPSFFAIL;
SndNotMsg(LspCBVar->upSessionIndex,INTERNALERROR,LspCBVar->upMsgid,\
MPLS_LBLREQ_MSGTYPE);
if(LspCBVar->waitflag & 0xe0)
{
LspCBVar->waitflag |= 0x1;
}
else
{
ldp_del_lspCB(pEntry,LspCBVar);
}
return LDP_FALSE;
}
MPLS_MEMSET(p_s_f,0,sizeof(mpls_ldpFecAggr));
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->nodeType = MPLS_NODE_EGRESS;
if(pFecEntry->owner == MPLS_OWNER_POLICY ||
((pFecEntry->owner &MPLS_OWNER_ROUTE)&&
(pFecEntry->pRes & MPLS_EGRESS_TO_POLICY)))
{
if(LspCBVar->downAtmLabel.module)
module = LspCBVar->downAtmLabel.module;
else
module = LspCBVar->downAtmLabel.port;
p_s_f->nexthop = module;
}
else
{
p_s_f->nexthop = 0xffffffff;
}
#ifdef __BGS10_MPLS_DEBUG
printf("destaddr:%x,nexthop:%x,psfdownmodule:%d,psfdownport:%d.",
pFecEntry->fec_key.mplsFecAddr,p_s_f->nexthop,
p_s_f->downAtmLabel.module,p_s_f->downAtmLabel.port);
#endif
p_s_f->attr.hopcount = LspCBVar->pAttr.hopcount;
p_s_f->attr.len = LspCBVar->pAttr.len;
if(p_s_f->attr.len > 0)
{
rtcode = ldp_pathvector_malloc(&p_s_f->attr,p_s_f->attr.len);
}
if(rtcode == MPLS_TRUE)
{
p_s_f->index1 = LspCBVar->lspIndex;
p_s_f->index2 = pFecEntry->fec_key.mplsLdpFecAddrLen;
MPLS_MEMCPY(p_s_f->attr.pAttr,LspCBVar->pAttr.pAttr,p_s_f->attr.len);
aggr_insert_tail(p_s_f);
}
else
{
/* 2003.3.4 huyonghong directly delete p_s_f attribute */
LspCBVar->errorcode = EGRESS_MALLOCPATHFAIL;
if(p_s_f)
aggr_delete(p_s_f);
SndNotMsg(LspCBVar->upSessionIndex,INTERNALERROR,LspCBVar->upMsgid,\
MPLS_LBLREQ_MSGTYPE);
if(LspCBVar->waitflag & 0xe0)
{
LspCBVar->waitflag |= 0x1;
}
else
{
ldp_del_lspCB(pEntry,LspCBVar);
}
return LDP_FALSE;
}
}
}
/************************************************************/
/* wengqing add end
*/
/************************************************************/
/*分配上游ATM标记*/
/*2003-9-23 lixia mod for hunt label*/
while (1)
{
if(ldp_get_atm_label(LspCBVar,FLAG_UP,1) == LDP_FALSE)
{
/* wengqing 2002.12.12, not process status = IDLE,
here directly delete p_s_f attribute */
LspCBVar->errorcode = EGRESS_UPLBLFAIL;
if(LspCBVar->lspType == LDP_HOP_LSP && aggr_enable != 0 && p_s_f)
aggr_delete(p_s_f);
DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_LSP,"====ProcFecInquireOk, Module %d,port %d,LABEL REQ IS FAIL ====\n",
LspCBVar->upAtmLabel.module,LspCBVar->upAtmLabel.port);
printf("==== Module %d,port %d,LABEL REQ IS FAIL ====\n",
LspCBVar->upAtmLabel.module,LspCBVar->upAtmLabel.port);
SndNotMsg(LspCBVar->upSessionIndex,NOLBLRESRC,LspCBVar->upMsgid,\
MPLS_LBLREQ_MSGTYPE);
if(LspCBVar->waitflag & 0xe0)
LspCBVar->waitflag |= 0x1;
else ldp_del_lspCB(pEntry,LspCBVar);
return LDP_FALSE;
}
else
{
pvclabel.L_module = LspCBVar->upAtmLabel.module;
pvclabel.L_port = LspCBVar->upAtmLabel.port;
pvclabel.L_vpi = LspCBVar->upAtmLabel.vpi;
pvclabel.L_vci = LspCBVar->upAtmLabel.vci;
if ((rel_pvc=mpls_match_in_relpvc_tab(&pvclabel,UP))==MPLS_NULL) /* it is not in the unrelease queue,so use it*/
break;
else
{
#ifdef __BGS10_MPLS_DEBUG
printf ("egress,UP,can't use this unrelease label module %d,port %d,vpi %d,vci %d\n ",pvclabel.L_module,pvclabel.L_port,pvclabel.L_vpi,pvclabel.L_vci);
#endif
rel_pvc->relpvc.reflag = rel_pvc->relpvc.reflag|0x02;
}
}
}
/*分配下游ATM标记*/
/*2003-9-23 lixia mod for hunt label*/
while (1)
{
if(ldp_get_atm_label(LspCBVar,FLAG_DOWN,0) == LDP_FALSE)
{
/* wengqing 2002.12.12, not process status = IDLE,
here directly delete p_s_f attribute */
LspCBVar->errorcode = EGRESS_DOWNLBLFAIL;
if(LspCBVar->lspType == LDP_HOP_LSP && aggr_enable != 0 && p_s_f)
aggr_delete(p_s_f);
DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_LSP,"==== ProcFecInquireOk down,Module %d,port %d,LABEL REQ IS FAIL ====\n",
LspCBVar->downAtmLabel.module,LspCBVar->downAtmLabel.port);
printf("==== Module %d,port %d,LABEL REQ IS FAIL ====\n",
LspCBVar->downAtmLabel.module,LspCBVar->downAtmLabel.port);
SndNotMsg(LspCBVar->upSessionIndex,NOLBLRESRC,LspCBVar->upMsgid,\
MPLS_LBLREQ_MSGTYPE);
ldp_free_atm_label(pEntry,LspCBVar,FLAG_UP);
if(LspCBVar->waitflag & 0xe0)
LspCBVar->waitflag |= 0x1;
else ldp_del_lspCB(pEntry,LspCBVar);
return LDP_FALSE;
}
else
{
pvclabel.H_module = LspCBVar->downAtmLabel.module;
pvclabel.H_port = LspCBVar->downAtmLabel.port;
pvclabel.H_vpi = LspCBVar->downAtmLabel.vpi;
pvclabel.H_vci = LspCBVar->downAtmLabel.vci;
if ((rel_pvc=mpls_match_in_relpvc_tab(&pvclabel,DOWN))==MPLS_NULL) /* it is not in the unrelease queue,so use it*/
break;
else
{
#ifdef __BGS10_MPLS_DEBUG
printf ("egress,DOWN,can't use this unrelease label module %d,port %d,vpi %d,vci %d\n ",pvclabel.H_module,pvclabel.H_port,pvclabel.H_vpi,pvclabel.H_vci);
#endif
rel_pvc->relpvc.reflag = rel_pvc->relpvc.reflag|0x02;
}
}
}
#ifdef __BGS10_MPLS_DEBUG
else
{
printf("====Module %d,port %d,LABEL REQ IS TRUE======\n",
LspCBVar->downAtmLabel.module,LspCBVar->downAtmLabel.port);
}
#endif
/*请求建立PVC(发到缓冲队列),主状态切为RESPONSE_AWAITED,子状态切为CREATE_PVC_REQ_AWAITED*/
LspCBVar->status = RESPONSE_AWAITED;
LspCBVar->subStatus = CREATE_PVC_REQ_AWAITED;
if(LspCBVar->lspType == LDP_HOP_LSP)
return wait_xc_append(LspCBVar,pEntry,0x1);
else
return CR_wait_xc_append(LspCBVar,pEntry,0x1);
}
else
{
/*2.2.非egress:请求预留资源(子状态切为BANDWITH_REQ_AWAITED)*/
LspCBVar->subStatus = BANDWITH_REQ_AWAITED;
if(LspCBVar->lspType == LDP_HOP_LSP)
return Xcbandwithreq(LspCBVar,pEntry);
/*add by fengjun for guangzhou
return wait_xc_append(LspCBVar,pEntry,0x0);
add by fengjun for guangzhou */
else
return CR_wait_xc_append(LspCBVar,pEntry,0x0);
}
} /*ProcFecInquireOk*/
short ProcBandwithAck(void *inputEvent)
{
/*1.如果不成功,发notify,删除lspCB*/
/*2.取到保存的request向下游节点发送*/
/*3.主状态切为RESPONSE_AWAITED,
子状态切为IDLE*/
STRUC_AD_MPLS_BANDWIDTH_ACK *bandwithAck;
mplsLdpFecEntry *pFecEntry = NULL;
mplsLdpCrLsp *pCrEntry = NULL;
mplsLdpLspCB *LspCBVar = NULL;
unsigned char lspType;
char *pEntry;
mplsLdpSession_t *downSession = MPLS_NULL;
unsigned short belong = MPLS_FALSE;
mplsLdpNotifMsg_t notify;
mplsLdpDownCB * downCB;
mpls_sb_list * sb_list;
int rtcode;
unsigned long resend_time;
bandwithAck = (STRUC_AD_MPLS_BANDWIDTH_ACK *)inputEvent;
#ifdef __BGS10_MPLS_DEBUG
MPLS_ERR_LOG("===== ProcBandwithAck LsrAck %d,localLspId %d,IngressId %x,LspCBNo %x =====",
bandwithAck->LsrAck,bandwithAck->localLspId,bandwithAck->IngressId,
bandwithAck->LspCBNo);
#endif
lspType = LDP_LSPTYPE(bandwithAck->IngressId);
if(lspType == LDP_HOP_LSP)
{
pFecEntry = ldp_search_fecentry(bandwithAck->localLspId,
bandwithAck->LspCBNo);
if(pFecEntry == NULL)
{
/*请求释放资源*/
if(bandwithAck->LsrAck == PVC_SUCCESS)
{
return NOLSPCB;
}
return LDP_FALSE;
}
pEntry = (char *)pFecEntry;
LspCBVar = ldp_search_lspcb_from_index(pFecEntry,bandwithAck->IngressId);
if(LspCBVar == NULL)
{
/*请求释放资源*/
if(bandwithAck->LsrAck == PVC_SUCCESS)
{
return NOLSPCB;
}
return LDP_FALSE;
}
else if(LspCBVar->waitflag & 0x1) /* 如果块存在,但已标上待删标志,则按已删处理 */
{
if(bandwithAck->LsrAck == PVC_SUCCESS)
{
return NOLSPCB;
}
return LDP_FALSE;
}
}
else if(lspType == LDP_CR_LSP)
{
pCrEntry = ldp_search_crentry_from_lspindex(bandwithAck->LspCBNo,bandwithAck->localLspId,bandwithAck->IngressId);
if(pCrEntry == NULL)
{
/*请求释放资源*/
if(bandwithAck->LsrAck == PVC_SUCCESS)
{
return NOLSPCB;
}
return LDP_FALSE;
}
pEntry = (char *)pCrEntry;
LspCBVar = &(pCrEntry->crlspCb);
if(LspCBVar->waitflag & 0x1)
{
if(bandwithAck->LsrAck == PVC_SUCCESS)
{
return NOLSPCB;
}
return LDP_FALSE;
}
}
if(LspCBVar->subStatus != BANDWITH_REQ_AWAITED)
{
LspCBVar->errorcode = BWSTATERROR;
return LDP_FALSE;
}
/*取消跟C进程的定时器*/
if(LspCBVar->timerid>0)
{
MPLS_CLEAR_TIMER(LspCBVar->timerid,ldptime_q,rtcode);
MPLS_ASSERT(rtcode == 1);
if(rtcode)
{
LspCBVar->timerid = 0;
}
}
/*1.如果预留不成功,发notify,删除lspCB*/
if (bandwithAck->LsrAck != PVC_SUCCESS)
{
printf("===== ProcBandwithAck LsrAck %d,localLspId %d,IngressId %x,LspCBNo %x =====",
bandwithAck->LsrAck,bandwithAck->localLspId,bandwithAck->IngressId,
bandwithAck->LspCBNo);
LspCBVar->errorcode = BWPVCERROR;
DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_CR,"===== ProcBandwithAck LsrAck %d,localLspId %x,IngressId %x,LspCBNo %x =====\n",
bandwithAck->LsrAck,bandwithAck->localLspId,bandwithAck->IngressId,
bandwithAck->LspCBNo);
DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_CR,"====H_MODULE:%d,H_PORT:%d====\n",
bandwithAck->H_module,
bandwithAck->H_port);
DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_CR,"====L_MODULE:%d,L_PORT:%d====\n",
bandwithAck->L_module,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -