📄 ldpfunc.c
字号:
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 = BANDWITH_REQ_AWAITED;
/*填充请求*/
MPLS_MEMSET(&bandwithReq, 0, sizeof(STRUC_MPLS_AD_BANDWIDTH_REQ));
if(ldp_fill_bwreq(&bandwithReq,LspCBVar,localLspId,LspCBNo,&Traffic,pEntry)==LDP_FALSE)
return LDP_FALSE;
/*将请求加入缓冲队列*/
LspCBVar->lsp_loc = MPLS_NULL;
rtcode = mpls_xc_req_append(&bandwithReq,BANDWIDTH_REQ,LspCBVar->lsp_loc,LOC_NEED);
if(rtcode == REQ_QUEUE_OK)
{
/*加入成功,置资源定时器*/
MPLS_SET_TIMER(XC_RES_TIME,(void *)ldp_bw_timeout,LspCBVar,ldptime_q,LspCBVar->timerid);
return LDP_TRUE;
}
else
{
/*缓冲失败,置重发缓冲定时器*/
#if 0
MPLS_SET_TIMER(XC_QUE_FULL_RESND_TIME,(void *)ldp_bw_resend,LspCBVar,ldptime_q,LspCBVar->timerid);
#endif
return LDP_FALSE;
}
}
short ldp_fill_bwreq(STRUC_MPLS_AD_BANDWIDTH_REQ *bandwithReq,
mplsLdpLspCB *LspCBVar,
unsigned short localLspId,
unsigned long LspCBNo,
mplsLdpTrafficTlv_t *Traffic,
char *pEntry)
{
short serviceClassValue;
/*填充请求*/
bandwithReq->localLspId = localLspId;
bandwithReq->IngressId = LspCBVar->lspIndex;
bandwithReq->LspCBNo = LspCBNo;
bandwithReq->L_module = LspCBVar->upAtmLabel.module;
bandwithReq->L_port = LspCBVar->upAtmLabel.port;
bandwithReq->H_module = LspCBVar->downAtmLabel.module;
bandwithReq->H_port = LspCBVar->downAtmLabel.port;
bandwithReq->Connect_struct = VAL_Connectstruct_Type0;
bandwithReq->TrafficDescrParam = (unsigned long)(Traffic->pdr.pdr/48);
bandwithReq->TrafficDescrParam2 = (unsigned long)(Traffic->pbs.pbs/48);
/* add 2001.07.09 for bandwidth reserve according to service type
UBR no bandwidth reserve;
CBR pdr bandwidth reserve
VBR scr(cdr) bandwidth reserve
*/
serviceClassValue = ServiceClass(Traffic);
if (serviceClassValue != LDP_FALSE)
bandwithReq->ServiceCategory = (unsigned char)(serviceClassValue);
else
{
if(LspCBVar->nodeType != MPLS_NODE_INGRESS)
{
LspCBVar -> errorcode = BWTRAFFICFALSE;
printf("==== UpLspCbFsm,TRAFFIC PARAM IS FALSE ====");
SndNotMsg(LspCBVar->upSessionIndex,TRAFPARAUNAVA,LspCBVar->upMsgid,\
MPLS_LBLREQ_MSGTYPE);
}
/*response to fec ,2002-11-19 hyh */
if((LspCBVar->lspType == LDP_CR_LSP)&&(LspCBVar->nodeType == MPLS_NODE_INGRESS))
{
sendToFecCrlsp((mplsLdpCrLsp *)pEntry,RESPONSE_TYPE,TRAFPARAUNAVA);
}
/* del_lsp_cb(pEntry,LspCBVar);*/
/* hyh 2003.3.7 need to delete lspcb */
if(!((LspCBVar->lspType == LDP_HOP_LSP)&&(LspCBVar->nodeType == MPLS_NODE_INGRESS)))
{
if(LspCBVar->waitflag & 0xe0)
{
LspCBVar->waitflag |= 0x1;
}
else
{
ldp_del_lspCB(pEntry,LspCBVar);
}
}
return LDP_FALSE;
}
return LDP_TRUE;
}
/* 同C010通信有问题,资源定时器超时 */
short ldp_bw_timeout(mplsLdpLspCB *LspCBVar)
{
char *pEntry = MPLS_NULL;
mplsLdpCrLsp *pCrEntry = MPLS_NULL;
mpls_sb_list * sb_list;
MPLS_ERR_LOG("================ ldp resv bandwidth timeout =============");
LspCBVar->timerid = 0;
if((LspCBVar->status == IDLE)&&
(LspCBVar->subStatus == BANDWITH_REQ_AWAITED))
{
/* 如果请求仍在缓冲中,则释放消息缓冲中的请求 */
/* delete_lqe_xcque(LspCBVar->lsp_loc);*/
delete_lspindex_xcque(LspCBVar->lspIndex);
/* 用LspCBVar查找Entry */
pEntry = lspcb_search_entry(LspCBVar);
if(pEntry == MPLS_NULL)
return LDP_FALSE;
/*处理与预留失败相同*/
if(LspCBVar->lspType == LDP_HOP_LSP)
{
if (LspCBVar->nodeType != MPLS_NODE_INGRESS)
{
/* 向上游发送notify消息*/
LspCBVar -> errorcode = BWPVCTIMEOUT;
printf("==== UpLspCbFsm,RESV BANDWIDTH REQ IS FAIL ====");
SndNotMsg(LspCBVar->upSessionIndex, RESRCUNAVA,LspCBVar->upMsgid,\
MPLS_LBLMAP_MSGTYPE);
/* 删除控制块 */
#if 0
ldp_del_lspCB(pEntry,LspCBVar);
#endif
if(LspCBVar->waitflag & 0xe0)
LspCBVar->waitflag |= 0x1;
else ldp_del_lspCB(pEntry,LspCBVar);
}
else
{
/* pvc create fail, delete from UP SB list */
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)
}
LspCBVar->resend = 1;
MPLS_ERR_LOG("========== set timer ldp_req_resend =========");
MPLS_SET_TIMER(REQ_DELAY,(void *)ldp_req_resend,LspCBVar,ldptime_q,LspCBVar->timerid);
}
return LDP_TRUE;
}
else
{
if (LspCBVar->nodeType != MPLS_NODE_INGRESS)
{
/* 向上游发送notify消息*/
LspCBVar -> errorcode = CRLSP_BWTRAFFICFALSE;
DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_CR,"==== UpLspCbFsm,RESV BANDWIDTH REQ IS FAIL ====\n");
printf("==== UpLspCbFsm,RESV BANDWIDTH REQ IS FAIL ====");
SndNotMsg(LspCBVar->upSessionIndex, RESRCUNAVA,LspCBVar->upMsgid,\
MPLS_LBLMAP_MSGTYPE);
}
else
{
LspCBVar -> errorcode = CRLSP_BWTRAFFICFALSE;
pCrEntry = (mplsLdpCrLsp *)pEntry;
MPLS_ERR_LOG("bandwidth timeout return fec response INTERNALERROR");
sendToFecCrlsp(pCrEntry,RESPONSE_TYPE,INTERNALERROR);
}
/* 删除控制块 */
if(LspCBVar->waitflag & 0xe0)
{
LspCBVar->waitflag |= 0x1;
}
else
{
ldp_del_lspCB(pEntry,LspCBVar);
}
return LDP_TRUE;
}
}
else
return LDP_FALSE;
}
/* 重发缓冲定时器到时,再次向缓冲发送预留请求 */
short ldp_bw_resend(mplsLdpLspCB *LspCBVar)
{
char *pEntry = MPLS_NULL;
LspCBVar->timerid = 0;
if((LspCBVar->status == IDLE)&&
(LspCBVar->subStatus == BANDWITH_REQ_AWAITED))
{
/* 用LspCBVar查找Entry */
pEntry = lspcb_search_entry(LspCBVar);
/*重发预留请求*/
if(pEntry){
if(LspCBVar->lspType == LDP_HOP_LSP)
return Xcbandwithreq(LspCBVar,LspCBVar->selffec);
/*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);
}
else
return LDP_FALSE;
}
else
return LDP_FALSE;
}
/*释放预留资源的相关函数*/
short FuncRlsBW(mplsLdpLspCB *LspCBVar, char *pEntry)
{
mplsLdpFecEntry *pFecEntry = MPLS_NULL;
mplsLdpCrLsp *pCrEntry = MPLS_NULL;
STRUC_MPLS_AD_RLSBW_REQ rlsBwReq;
unsigned short localLspId;
unsigned long LspCBNo;
mplsLdpTrafficTlv_t Traffic;
lblmsgTlvExists tlvexists;
short rtcode;
MPLS_MEMSET(&Traffic,0,sizeof(mplsLdpTrafficTlv_t));
MPLS_MEMSET(&rlsBwReq,0,sizeof(STRUC_MPLS_AD_RLSBW_REQ));
MPLS_MEMSET(&tlvexists,0,sizeof(lblmsgTlvExists));
if(LspCBVar->lspType == LDP_HOP_LSP)
{
pFecEntry = (mplsLdpFecEntry *)pEntry;
localLspId = pFecEntry->fec_key.mplsLdpFecAddrLen;
LspCBNo = pFecEntry->fec_key.mplsFecAddr;
Traffic.freq = UNSPECIFIED;
Traffic.pdr.pdr = DEFAULT_PDR;
Traffic.pbs.pbs = DEFAULT_PBS;
}
else if(LspCBVar->lspType == LDP_CR_LSP)
{
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;
}
}
/*填充请求*/
MPLS_MEMSET(&rlsBwReq, 0, sizeof(STRUC_MPLS_AD_RLSBW_REQ));
rlsBwReq.localLspId = localLspId;
rlsBwReq.IngressId = LspCBVar->lspIndex;
rlsBwReq.LspCBNo = LspCBNo;
rlsBwReq.L_module = LspCBVar->downAtmLabel.module;
rlsBwReq.L_port = LspCBVar->downAtmLabel.port;
rlsBwReq.H_module = LspCBVar->upAtmLabel.module;
rlsBwReq.H_port = LspCBVar->upAtmLabel.port;
rlsBwReq.Connect_struct = VAL_Connectstruct_Type0;
rlsBwReq.TrafficDescrParam = (unsigned long)(Traffic.pdr.pdr/48);
rlsBwReq.TrafficDescrParam2 = (unsigned long)(Traffic.pbs.pbs/48);
rlsBwReq.ServiceCategory = (unsigned char)ServiceClass(&Traffic);
/*将请求加入缓冲队列*/
rtcode = mpls_xc_req_append(&rlsBwReq,RLSBW_REQ,MPLS_NULL,LOC_NO_NEED);
if(rtcode == REQ_QUEUE_OK)
{
if(LspCBVar->resend !=1)
{
#if 0
if((LspCBVar->lspType == LDP_CR_LSP)&&(LspCBVar->nodeType == MPLS_NODE_INGRESS))
{
/*sendToFecCrlsp(pCrEntry,DELETE_PVC_TYPE,0);*/
/* if release bandwidth,it indicates that lsp not setup, by hyh */
sendToFecCrlsp(pCrEntry,RESPONSE_TYPE,NOROUTE);
}
#endif
if(LspCBVar->waitflag & 0xe0)
{
//LspCBVar->waitflag |= 0x1;
}
else if(LspCBVar->waitflag & 0x1)
{
ldp_del_lspCB(pEntry,LspCBVar);
}
}
return LDP_TRUE;
}
/* else
{
/*缓冲失败,置重发缓冲定时器/
MPLS_SET_TIMER(XC_QUE_FULL_RESND_TIME,(void *)ldp_Rlsbw_resend,LspCBVar,ldptime_q,LspCBVar->timerid);
return LDP_FALSE;
}
*/
}
short FuncRlsBW_State3(mplsLdpLspCB *LspCBVar, char *pEntry)
{
mplsLdpFecEntry *pFecEntry = NULL;
STRUC_MPLS_AD_RLSBW_REQ rlsBwReq;
unsigned short localLspId;
unsigned long LspCBNo;
short rtcode;
if(LspCBVar->lspType == LDP_HOP_LSP)
{
pFecEntry = (mplsLdpFecEntry *)pEntry;
localLspId = pFecEntry->fec_key.mplsLdpFecAddrLen;
LspCBNo = pFecEntry->fec_key.mplsFecAddr;
}
else
{
localLspId = 0;
LspCBNo = 0;
}
/*填充请求*/
MPLS_MEMSET(&rlsBwReq, 0, sizeof(STRUC_MPLS_AD_RLSBW_REQ));
rlsBwReq.localLspId = localLspId;
rlsBwReq.IngressId = LspCBVar->lspIndex;
rlsBwReq.LspCBNo = LspCBNo;
rlsBwReq.L_module = LspCBVar->downAtmLabel.module;
rlsBwReq.L_port = LspCBVar->downAtmLabel.port;
rlsBwReq.H_module = LspCBVar->upAtmLabel.module;
rlsBwReq.H_port = LspCBVar->upAtmLabel.port;
rlsBwReq.Connect_struct = VAL_Connectstruct_Type0;
/*将请求加入缓冲队列*/
rtcode = mpls_xc_req_append(&rlsBwReq,RLSBW_REQ,NULL,LOC_NO_NEED);
return LDP_TRUE;
}
/* 重发缓冲定时器到时,再次向缓冲发送释放预留请求 */
short ldp_Rlsbw_resend(mplsLdpLspCB *LspCBVar)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -