📄 ldplspfsm.c
字号:
MPLS_INSERT_INTO_UP_LSP_LIST(sb_list->lsp_up_cb_list,LspCBVar,LspCBVar);
}
}
else if(LspCBVar->nodeType == MPLS_NODE_INTERM)
{
/* do it as receiving notify */
LspCBVar->errorcode = MAPSTAT2_ERROR1;
wait_lsplblmsg_append(LspCBVar,pEntry,MPLS_NULL,MPLS_NULL,MPLS_LBLREL_MSGTYPE);
MPLS_MEMSET(&(ldp_snd_msg.notifMsg), 0, sizeof(mplsLdpNotifMsg_t));
ldp_snd_msg.notifMsg.status.flags.flags.status = INTERNALERROR;
ProcDownNAK_23(pEntry,LspCBVar,&(ldp_snd_msg.notifMsg));
}
}
else
{
/* do it as receiving notify */
LspCBVar->errorcode = MAPSTAT2_ERROR2;
wait_lsplblmsg_append(LspCBVar,pEntry,MPLS_NULL,MPLS_NULL,MPLS_LBLREL_MSGTYPE);
MPLS_MEMSET(&(ldp_snd_msg.notifMsg), 0, sizeof(mplsLdpNotifMsg_t));
ldp_snd_msg.notifMsg.status.flags.flags.status = INTERNALERROR;
ProcDownNAK_23(pEntry,LspCBVar,&(ldp_snd_msg.notifMsg));
}
return LDP_TRUE;
}
}
/*add for nanjing 2003-11-20 fengjun szh */
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)
{
if(LspCBVar->nodeType != MPLS_NODE_INGRESS)
{
LspCBVar->errorcode = MALLOCPSFFAIL;
SndNotMsg(LspCBVar->upSessionIndex,INTERNALERROR,LspCBVar->upMsgid,\
MPLS_LBLREQ_MSGTYPE);
}
DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_LSP,"ProcLblMap_status2,malloc p_s_f fail !!!!!\n ");
printf("malloc p_s_f fail !!!!! ");
/* 向下游发送释放消息 */
if(LspCBVar->nodeType != MPLS_NODE_EGRESS)
{
wait_lsplblmsg_append(LspCBVar,pEntry,MPLS_NULL,MPLS_NULL,MPLS_LBLREL_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->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;
pFecEntry =(mplsLdpFecEntry*) pEntry;
/* 2003-11-25 lixia add *//*2003-12-25 lixia mod*/
p_s_f->upAtmLabel.module = LspCBVar->upAtmLabel.module;
p_s_f->upAtmLabel.port = LspCBVar->upAtmLabel.port;
p_s_f->index1 = LspCBVar->lspIndex;
p_s_f->index2 = pFecEntry->fec_key.mplsLdpFecAddrLen;
aggr_insert_tail(p_s_f);
}
/* add for nanjing end 2003-11-20 fengjun szh*/
}
/********************************************************************/
/* wengqing add end
*/
/********************************************************************/
/*分配上游ATM标记,对MPLS_NODE_INTERM_INGRESS或MPLS_NODE_INGRESS来说是上游内部ATM标记,不需要带协商范围*/
if((LspCBVar->nodeType == MPLS_NODE_INGRESS)||(LspCBVar->nodeType == MPLS_NODE_INTERM_INGRESS))
negotiate = 0;
else /*对MPLS_NODE_INTERM或MPLS_NODE_INTERM_EGRESS来说是上游ATM标记,需要带协商范围*/
negotiate = 1;
/*2003-9-23 lixia mod for hunt label*/
while(1)
{
if(ldp_get_atm_label(LspCBVar,FLAG_UP,negotiate) == LDP_FALSE)
{
LspCBVar->errorcode = GETUPLBLFAIL;
DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_LSP,"==== ProcLblMap_status2,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);
if(LspCBVar->nodeType!=MPLS_NODE_INGRESS)
{
SndNotMsg(LspCBVar->upSessionIndex,NOLBLRESRC,LspCBVar->upMsgid,\
MPLS_LBLREQ_MSGTYPE);
}
/*向下游发送RELEASE消息!!!! */
if(LspCBVar->nodeType != MPLS_NODE_EGRESS)
{
if((LspCBVar->lspType == LDP_CR_LSP)&&(LspCBVar->nodeType == MPLS_NODE_INGRESS))
{
sendToFecCrlsp(pCrEntry,RESPONSE_TYPE,NOLBLRESRC);
}
if((LspCBVar->lspType) == LDP_HOP_LSP)
wait_lsplblmsg_append(LspCBVar,pEntry,MPLS_NULL,MPLS_NULL,MPLS_LBLREL_MSGTYPE);
else
CR_wait_lsplblmsg_append(LspCBVar,pEntry,MPLS_NULL,MPLS_NULL,MPLS_LBLREL_MSGTYPE);
}
/* for ingress and hop lsp,if get label fail,set timer to resend.hyh 02-12-25 */
if((LspCBVar->lspType == LDP_HOP_LSP)&&(LspCBVar->nodeType == MPLS_NODE_INGRESS))
{
LspCBVar->resend = 1;
#ifdef __BGS10_MPLS_DEBUG
MPLS_ERR_LOG("======== set timer ldp_req_timout =========");
#endif
resend_time = ldp_get_random(MPLS_RANDOM_TIME_RANGE,abort_time);
MPLS_SET_TIMER(resend_time,(void *)ldp_req_timout,LspCBVar,ldptime_q,LspCBVar->timerid); /* lixia mod 2003-11-6 */
if(p_s_f) /* lixia mod 2003-11-25 */
aggr_delete(p_s_f);
}
else
{
/*请求释放预留的资源*/
LspCBVar->waitflag |= 0x1;
if(LspCBVar->lspType == LDP_HOP_LSP)
{
Xcbandwithrel(LspCBVar,pEntry);
if(p_s_f) /* lixia mod 2003-11-25 */
aggr_delete(p_s_f);
}
/* add by fengjun for guangzhou 0906
wait_xc_append(LspCBVar,pEntry,0x2);
/* add by fengjun for guangzhou 0906 */
else
CR_wait_xc_append(LspCBVar,pEntry,0x2);
}
return LDP_FALSE;
}
else /* 2003-9-23 lixia add */
{
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 ("ingress,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;
}
}
} /* while end */
if(LspCBVar->nodeType == MPLS_NODE_INTERM_EGRESS)
{
/*分配内部下游ATM标记*/
if(ldp_get_atm_label(LspCBVar,FLAG_DOWN,0) == LDP_FALSE)
{
printf("==== Module %d,port %d,LABEL REQ IS FAIL ====\n",
LspCBVar->downAtmLabel.module,LspCBVar->downAtmLabel.port);
LspCBVar ->errorcode = GETDOWNLBLFAIL;
if(LspCBVar->nodeType!=MPLS_NODE_INGRESS)
{
SndNotMsg(LspCBVar->upSessionIndex,NOLBLRESRC,LspCBVar->upMsgid,\
MPLS_LBLREQ_MSGTYPE);
}
/*向下游发送RELEASE消息!!!! */
if((LspCBVar->lspType) == LDP_HOP_LSP)
wait_lsplblmsg_append(LspCBVar,pEntry,MPLS_NULL,MPLS_NULL,MPLS_LBLREL_MSGTYPE);
else
CR_wait_lsplblmsg_append(LspCBVar,pEntry,MPLS_NULL,MPLS_NULL,MPLS_LBLREL_MSGTYPE);
/*释放分配的上游ATM标记*/
ldp_free_atm_label(pEntry,LspCBVar,FLAG_UP);
if((LspCBVar->lspType == LDP_CR_LSP)&&(LspCBVar->nodeType == MPLS_NODE_INGRESS))
{
LspCBVar -> errorcode = CRGETDOWNLBLFAIL;
sendToFecCrlsp(pCrEntry,RESPONSE_TYPE,NOLBLRESRC);
}
if(LspCBVar->waitflag & 0xe0)
LspCBVar->waitflag |= 0x1;
else ldp_del_lspCB(pEntry,LspCBVar);
return LDP_FALSE;
}
}
/*3.请求建立PVC(子状态切为CREATE_PVC_REQ_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);
} /*ProcLblMap_status2*/
short ProcLblAbort_status2(void *pEntry, mplsLdpLspCB *LspCBVar,char flag)
{
/*1.向下游中继abort*/
/*2.判断子状态*/
/*1.1.对IDLE,请求释放预留的资源*/
/*1.2.对CREATE_PVC_REQ_AWAITED,请求释放PVC*/
mplsLdpLblAbortMsg_t *lblAbortMsg;
mplsLdpCrLsp *pCrEntry = MPLS_NULL;
mplsLdpFecEntry *pFecEntry = NULL;
pCrEntry = (mplsLdpCrLsp *)pEntry;
/*判断子状态*/
if(LspCBVar->subStatus == IDLE)
{
/*向下游发abort*/
if(LspCBVar->nodeType != MPLS_NODE_EGRESS)
{
if((LspCBVar->lspType) == LDP_HOP_LSP)
{
pFecEntry = (mplsLdpFecEntry *)pEntry;
printf("backbone send abort mess for fec %x to nexthop %x\n",pFecEntry->fec_key.mplsFecAddr,pFecEntry->nexthopAddr);
DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_LSP,"backbone send abort mess for fec %x to next %x\n",pFecEntry->fec_key.mplsFecAddr,pFecEntry->nexthopAddr);
wait_lsplblmsg_append(LspCBVar,pEntry,MPLS_NULL,MPLS_NULL,MPLS_LBLABORT_MSGTYPE);
}
else
CR_wait_lsplblmsg_append(LspCBVar,pEntry,MPLS_NULL,MPLS_NULL,MPLS_LBLABORT_MSGTYPE);
}
/*对IDLE,请求释放预留的资源*/
LspCBVar->waitflag |= 0x1;
if(LspCBVar->lspType == LDP_HOP_LSP)
return Xcbandwithrel(LspCBVar,pEntry);
/* add by fengjun for guangzhou 0906
return wait_xc_append(LspCBVar,pEntry,0x2);
/* add by fengjun for guangzhou 0906 */
else
{
if(LspCBVar->nodeType == MPLS_NODE_INGRESS)
{
/* if upstream_lost,response fec DELETE_PVC_TYPE,else RESPONSE_TYPE */
if(flag == 0)
{
LspCBVar->errorcode = ABORT2_DELETE1;
sendToFecCrlsp(pCrEntry,DELETE_PVC_TYPE,0);
}
else
{
LspCBVar->errorcode = ABORT2_DELETE2;
sendToFecCrlsp(pCrEntry,RESPONSE_TYPE,SETUPABORT);
}
}
return CR_wait_xc_append(LspCBVar,pEntry,0x2);
}
}
else if(LspCBVar->subStatus == CREATE_PVC_REQ_AWAITED)
{
/*向下游发release*/
if(LspCBVar->nodeType != MPLS_NODE_EGRESS)
{
if((LspCBVar->lspType) == LDP_HOP_LSP)
wait_lsplblmsg_append(LspCBVar,pEntry,MPLS_NULL,MPLS_NULL,MPLS_LBLREL_MSGTYPE);
else
CR_wait_lsplblmsg_append(LspCBVar,pEntry,MPLS_NULL,MPLS_NULL,MPLS_LBLREL_MSGTYPE);
}
/*对CREATE_PVC_REQ_AWAITED,删除控制块*/
/*释放本地分配的标记 */
if((LspCBVar->lspType == LDP_CR_LSP)&&(LspCBVar->nodeType == MPLS_NODE_INGRESS))
{
/*sendToFecCrlsp(pCrEntry,DELETE_PVC_TYPE,0);*/
/* if upstream_lost,response fec DELETE_PVC_TYPE,else RESPONSE_TYPE */
if(flag == 0)
{
LspCBVar->errorcode = ABORT2_DELETE3;
sendToFecCrlsp(pCrEntry,DELETE_PVC_TYPE,0);
}
else
{
LspCBVar->errorcode = ABORT2_DELETE4;
sendToFecCrlsp(pCrEntry,RESPONSE_TYPE,SETUPABORT);
}
}
if(ldp_free_atm_label(pEntry,LspCBVar,FLAG_UPDOWN)==LDP_FALSE)
{
LspCBVar->errorcode = ABORT2_FREELBLFAIL;
DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_LSP,"ProcLblAbort_status2,ldp_free_atm_label fail\n");
MPLS_ERR_LOG("ldp_free_atm_label fail");
}
if(LspCBVar->waitflag & 0xe0)
{
LspCBVar->waitflag |= 0x1;
}
else
{
ldp_del_lspCB(pEntry,LspCBVar);
}
return LDP_TRUE;
}
} /*ProcLblAbort_status2*/
short ProcLblWith_2(void *pEntry, mplsLdpLspCB *LspCBVar)
{
int rtcode;
mplsLdpCrLsp *pCrEntry = MPLS_NULL;
unsigned long resend_time;
/*对非egress,执行:
/*1.请求释放预留的资源(子状态切为RELEASE_BANDWITH_AWAITED)*/
/*2.向下游节点发release*/
pCrEntry = (mplsLdpCrLsp *)pEntry;
if(LspCBVar->subStatus != CREATE_PVC_REQ_AWAITED)
return LDP_FALSE;
/*释放本地分配的标记*/
if(ldp_free_atm_label(pEntry,LspCBVar,FLAG_UPDOWN)==LDP_FALSE)
{
LspCBVar->errorcode = WITHDR2_FREELBLFAIL;
DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_LSP,"ProcLblWith_2,ldp_free_atm_label fail\n");
MPLS_ERR_LOG("ldp_free_atm_label fail");
}
if(((LspCBVar->nodeType == MPLS_NODE_INGRESS)&&(LspCBVar->lspType == LDP_HOP_LSP))||
((LspCBVar->nodeType == MPLS_NODE_INTERM_INGRESS)&&(LspCBVar->lspType == LDP_HOP_LSP)))
{
LspCBVar->resend = 1;
if(LspCBVar->lspType == LDP_HOP_LSP)
wait_xc_append(LspCBVar,pEntry,0x3);
else
CR_wait_xc_append(LspCBVar,pEntry,0x3);
/* 2004-1-7 lixia add */
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) && \
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -