📄 ldpfunc.c
字号:
{
char *pEntry = MPLS_NULL;
LspCBVar->timerid = 0;
if(((LspCBVar->status == IDLE)&&
(LspCBVar->subStatus == BANDWITH_REQ_AWAITED))||
((LspCBVar->status == RESPONSE_AWAITED)&&(LspCBVar->subStatus == IDLE)))
{
/* 用LspCBVar查找Entry */
pEntry = lspcb_search_entry(LspCBVar);
/*重发建立请求*/
if(pEntry) {
LspCBVar->waitflag |= 0x1;
Xcbandwithrel(LspCBVar,pEntry);
/* add by fengjun for guangzhou 0906
return wait_xc_append(LspCBVar,pEntry,0x2);
. add by fengjun for guangzhou 0906 */
}
else
return LDP_FALSE;
}
else
return LDP_FALSE;
}
short RlsBW_noCB(STRUC_AD_MPLS_BANDWIDTH_ACK *bandwithAck)
{
STRUC_MPLS_AD_RLSBW_REQ rlsBwReq;
MPLS_MEMSET(&rlsBwReq,0,sizeof(STRUC_MPLS_AD_RLSBW_REQ));
/*填充请求*/
rlsBwReq.localLspId = bandwithAck->localLspId;
rlsBwReq.IngressId = bandwithAck->IngressId;
rlsBwReq.LspCBNo = bandwithAck->LspCBNo;
rlsBwReq.L_module = bandwithAck->L_module;
rlsBwReq.L_port = bandwithAck->L_port;
rlsBwReq.H_module = bandwithAck->H_module;
rlsBwReq.H_port = bandwithAck->H_port;
rlsBwReq.Connect_struct = VAL_Connectstruct_Type0;
rlsBwReq.ServiceCategory= bandwithAck->ServiceCategory;
/*由于控制块已删,立即将请求加到缓冲队列头,发出去*/
if((mpls_xc_req_replace(&rlsBwReq,RLSBW_REQ))!=REQ_QUEUE_OK)
return LDP_FALSE;
return LDP_TRUE;
}
/* hyh 2003.1.26
* if bandwidth req timeout,send to release it */
short bandwidth_to_release(STRUC_MPLS_AD_BANDWIDTH_REQ *bandwithReq)
{
STRUC_MPLS_AD_RLSBW_REQ rlsBwReq;
MPLS_MEMSET(&rlsBwReq,0,sizeof(STRUC_MPLS_AD_RLSBW_REQ));
/*填充请求*/
rlsBwReq.localLspId = bandwithReq->localLspId;
rlsBwReq.IngressId = bandwithReq->IngressId;
rlsBwReq.LspCBNo = bandwithReq->LspCBNo;
rlsBwReq.L_module = bandwithReq->L_module;
rlsBwReq.L_port = bandwithReq->L_port;
rlsBwReq.H_module = bandwithReq->H_module;
rlsBwReq.H_port = bandwithReq->H_port;
rlsBwReq.Connect_struct = VAL_Connectstruct_Type0;
rlsBwReq.TrafficDescrParam = bandwithReq->TrafficDescrParam;
rlsBwReq.TrafficDescrParam2 = bandwithReq->TrafficDescrParam2;
rlsBwReq.TrafficQosClass = bandwithReq->TrafficQosClass;
rlsBwReq.ServiceCategory= bandwithReq->ServiceCategory;
/*由于控制块已删,立即将请求加到缓冲队列头,发出去*/
if((mpls_xc_req_replace(&rlsBwReq,RLSBW_REQ))!=REQ_QUEUE_OK)
return LDP_FALSE;
return LDP_TRUE;
}
/*释放PVC相关函数*/
short FuncRelPVC(mplsLdpLspCB *LspCBVar, char *pEntry)
{
mplsLdpFecEntry *pFecEntry = MPLS_NULL;
mplsLdpCrLsp *pCrEntry = MPLS_NULL;
STRUC_MPLS_AD_RLSPVC_REQ pvcRelReq;
unsigned short localLspId;
unsigned long LspCBNo;
short rtcode;
MPLS_MEMSET(&pvcRelReq, 0, sizeof(STRUC_MPLS_AD_RLSPVC_REQ));
if((LspCBVar->lspType == LDP_HOP_LSP) && (LspCBVar->index1 != 0))
{
pvcRelReq.IngressId = LspCBVar->index1;
localLspId = LspCBVar->index2;
LspCBNo = 0;
}
else
{
pvcRelReq.IngressId = LspCBVar->lspIndex;
if(LspCBVar->lspType == LDP_HOP_LSP)
{
pFecEntry = (mplsLdpFecEntry *)pEntry;
localLspId = pFecEntry->fec_key.mplsLdpFecAddrLen;
LspCBNo = pFecEntry->fec_key.mplsFecAddr;
}
else
{
pCrEntry = (mplsLdpCrLsp *)pEntry;
localLspId = pCrEntry->crfec_key.locallspid;
LspCBNo = pCrEntry->crfec_key.ingressid;
}
}
/*填充请求*/
pvcRelReq.localLspId = localLspId;
pvcRelReq.LspCBNo = LspCBNo;
pvcRelReq.L_module = LspCBVar->upAtmLabel.module;
pvcRelReq.L_port = LspCBVar->upAtmLabel.port;
pvcRelReq.L_vpi = LspCBVar->upAtmLabel.vpi;
pvcRelReq.L_vci = LspCBVar->upAtmLabel.vci;
pvcRelReq.H_module = LspCBVar->downAtmLabel.module;
pvcRelReq.H_port = LspCBVar->downAtmLabel.port;
pvcRelReq.H_vpi = LspCBVar->downAtmLabel.vpi;
pvcRelReq.H_vci = LspCBVar->downAtmLabel.vci;
pvcRelReq.Connect_struct = VAL_Connectstruct_Type0;
pvcRelReq.Connect_type = (VAL_ConnType_SVCC - 2);
pvcRelReq.reflag = 0; /* 2003-10-21 lixia add */
pvcRelReq.renum = 0;
/*将请求加入缓冲队列*/
rtcode = mpls_xc_req_append(&pvcRelReq,RLSPVC_REQ,NULL,LOC_NO_NEED);
if(rtcode == REQ_QUEUE_OK)
{
if((LspCBVar->resend != 1)) /*如果需要重发request,不删控制块*/
{
if((LspCBVar->lspType == LDP_CR_LSP)&&(LspCBVar->nodeType == MPLS_NODE_INGRESS))
{
sendToFecCrlsp(pCrEntry,DELETE_PVC_TYPE,0);
}
#if 0
ldp_del_lspCB(pEntry,LspCBVar); /*加入成功,直接删除控制块*/
#endif
if(LspCBVar->waitflag & 0xe0)
LspCBVar->waitflag |= 0x1;
else ldp_del_lspCB(pEntry,LspCBVar); /*加入成功,直接删除控制块*/
}
else
{
LspCBVar->subStatus = RELEASE_PVC_REQ_AWAITED;
/*
LspCBVar->upAtmLabel.vpi = 0;
LspCBVar->upAtmLabel.vci = 0;
LspCBVar->downAtmLabel.vpi = 0;
LspCBVar->downAtmLabel.vci = 0;*/
}
return LDP_TRUE;
}
/* else
{
/*缓冲失败,置重发缓冲定时器
MPLS_SET_TIMER(XC_QUE_FULL_RESND_TIME,(void *)ldp_Rlspvc_resend,LspCBVar,ldptime_q,LspCBVar->timerid);
return LDP_FALSE;
}
*/
}
/* 重发缓冲定时器到时,再次向缓冲发送释放PVC请求 */
short ldp_Rlspvc_resend(mplsLdpLspCB *LspCBVar)
{
char *pEntry = MPLS_NULL;
LspCBVar->timerid = 0;
if(((LspCBVar->status == RESPONSE_AWAITED)&&
(LspCBVar->subStatus == CREATE_PVC_REQ_AWAITED))||
((LspCBVar->status == ESTABLISHED)&&(LspCBVar->subStatus == IDLE)))
{
/* 用LspCBVar查找Entry */
pEntry = lspcb_search_entry(LspCBVar);
/*重发建立请求*/
if(pEntry) {
LspCBVar->waitflag |= 0x1;
if(LspCBVar->lspType == LDP_HOP_LSP)
return wait_xc_append(LspCBVar,pEntry,0x3);
else
return CR_wait_xc_append(LspCBVar,pEntry,0x3);
}
else
return LDP_FALSE;
}
else
return LDP_FALSE;
}
short RlsPVC_noCB(STRUC_AD_MPLS_CRPVC_ACK *createPvcAck)
{
STRUC_MPLS_AD_RLSPVC_REQ pvcRelReq;
short rtcode;
MPLS_MEMSET(&pvcRelReq,0,sizeof(STRUC_MPLS_AD_RLSPVC_REQ));
/*填充请求*/
pvcRelReq.localLspId = createPvcAck->localLspId;
pvcRelReq.IngressId = createPvcAck->IngressId;
pvcRelReq.LspCBNo = createPvcAck->LspCBNo;
pvcRelReq.L_module = createPvcAck->L_module;
pvcRelReq.L_port = createPvcAck->L_port;
pvcRelReq.L_vpi = createPvcAck->L_vpi;
pvcRelReq.L_vci = createPvcAck->L_vci;
pvcRelReq.H_module = createPvcAck->H_module;
pvcRelReq.H_port = createPvcAck->H_port;
pvcRelReq.H_vpi = createPvcAck->H_vpi;
pvcRelReq.H_vci = createPvcAck->H_vci;
pvcRelReq.Connect_struct = VAL_Connectstruct_Type0;
pvcRelReq.Connect_type = (VAL_ConnType_SVCC - 2);
/*由于控制块已删,立即将请求加到缓冲队列头发出去*/
if((mpls_xc_req_replace(&pvcRelReq,RLSPVC_REQ))!=REQ_QUEUE_OK)
return LDP_FALSE;
return LDP_TRUE;
}
/* hyh 2003.1.26
* if crpvc req timeout,send to release it */
short crpvc_to_release(STRUC_MPLS_AD_CRPVC_REQ *createPvcReq)
{
STRUC_MPLS_AD_RLSPVC_REQ pvcRelReq;
short rtcode;
MPLS_MEMSET(&pvcRelReq,0,sizeof(STRUC_MPLS_AD_RLSPVC_REQ));
/*填充请求*/
pvcRelReq.localLspId = createPvcReq->localLspId;
pvcRelReq.IngressId = createPvcReq->IngressId;
pvcRelReq.LspCBNo = createPvcReq->LspCBNo;
pvcRelReq.L_module = createPvcReq->L_module;
pvcRelReq.L_port = createPvcReq->L_port;
pvcRelReq.L_vpi = createPvcReq->L_vpi;
pvcRelReq.L_vci = createPvcReq->L_vci;
pvcRelReq.H_module = createPvcReq->H_module;
pvcRelReq.H_port = createPvcReq->H_port;
pvcRelReq.H_vpi = createPvcReq->H_vpi;
pvcRelReq.H_vci = createPvcReq->H_vci;
pvcRelReq.Connect_struct = VAL_Connectstruct_Type0;
pvcRelReq.Connect_type = (VAL_ConnType_SVCC - 2);
/*2003-12-25 lixia add for dele p_s_f*/
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 == pvcRelReq.L_module) && \
(p_s_f->upAtmLabel.port == pvcRelReq.L_port) && \
(p_s_f->downAtmLabel.module == pvcRelReq.H_module) && \
(p_s_f->downAtmLabel.port == pvcRelReq.H_port) && \
(p_s_f->downAtmLabel.vpi == pvcRelReq.H_vpi) && \
(p_s_f->downAtmLabel.vci == pvcRelReq.H_vci) )
break;
}
if(p_s_f)
{
aggr_delete(p_s_f);
}
/*立即将请求加到缓冲队列头发出去*/
if((mpls_xc_req_replace(&pvcRelReq,RLSPVC_REQ))!=REQ_QUEUE_OK)
return LDP_FALSE;
return LDP_TRUE;
}
/*************************************************************************/
/* send label to forward */
/* if MPLS_NODE_EGRESS */
/* send down ATM label */
/* else if MPLS_NODE_INGRESS */
/* send up ATM label */
/* else if MPLS_NODE_INTERM_INGRESS */
/* send up gen label and SB ATM label */
/* else MPLS_NODE_INTERM_EGRESS */
/* send SB ATM label and down gen label */
/*huyonghong 2002/12/2 hop lsp fill default value */
/*************************************************************************/
short ldp_label_forward(void *pEntry, mplsLdpLspCB *LspCBVar,char action_flag)
{
mplsLdpFecEntry *fecEntry;
mplsLdpCrLsp *CrEntry;
mplsLdpFecLabel FecLabel;
mplsLdpDownCB *pDownCB;
lblmsgTlvExists tlvflags;
RoutEntry *Prt;
MPLS_MEMSET(&FecLabel, 0, sizeof(mplsLdpFecLabel));
if(LspCBVar->lspType == LDP_HOP_LSP)
{
fecEntry = (mplsLdpFecEntry *)pEntry;
/* hop lsp fill default value */
FecLabel.ftnFec.mplsLdpFtnMask = 1;
FecLabel.ftnFec.mplsLdpFtnAddrType = MPLS_IPV4;
FecLabel.ftnFec.mplsLdpFtnSourceAddrMin = 0;
FecLabel.ftnFec.mplsLdpFtnSourceAddrMax = 0xffffffff;
FecLabel.ftnFec.mplsLdpFtnDestAddrMin = fecEntry->fec_key.mplsLdpFecAddrLen;
FecLabel.ftnFec.mplsLdpFtnDestAddrMax = fecEntry->fec_key.mplsFecAddr;
FecLabel.ftnFec.mplsLdpFtnSourcePortMin = 0;
FecLabel.ftnFec.mplsLdpFtnSourcePortMax = 0xffff;
FecLabel.ftnFec.mplsLdpFtnDestPortMin = 0;
FecLabel.ftnFec.mplsLdpFtnDestPortMax = 0xffff;
FecLabel.ftnFec.mplsLdpFtnProtocol = ~0;
FecLabel.ftnFec.mplsLdpFtnExp = 63;
FecLabel.metric = 1;
FecLabel.ftnFec.metric = FecLabel.metric;
FecLabel.nexthop = fecEntry->nexthopAddr;
FecLabel.outIfindex = fecEntry->outIfindex;
FecLabel.module = fecEntry->module; /*always 0*/
FecLabel.lspType = LDP_HOP_LSP;
FecLabel.servicetype= UBRService;
FecLabel.pdr = DEFAULT_PDR;
FecLabel.pbs = DEFAULT_PBS;
FecLabel.cdr = 0;
FecLabel.cbs = 0;
FecLabel.ebs = 0;
FecLabel.ftnFec.mplsLdpFtnAction = 2;
FecLabel.needOperSar= 1;
FecLabel.encapmode = encapsulation_mode; /*2004-4-2 lixia mod for encapsulation;*/
if(LspCBVar->nodeType == MPLS_NODE_EGRESS)
{
/* send down ATM label */
FecLabel.xcLabel.upAtmLabel.module = LspCBVar->downAtmLabel.module;
FecLabel.xcLabel.upAtmLabel.port = LspCBVar->downAtmLabel.port;
FecLabel.xcLabel.upAtmLabel.vpi = LspCBVar->downAtmLabel.vpi;
FecLabel.xcLabel.upAtmLabel.vci = LspCBVar->downAtmLabel.vci;
FecLabel.xcLabel.uplabelValid = UP_ATM_VALID; /* */
FecLabel.xcLabel.trans_flag = LDP_REC;
/* MPLS_ERR_LOG("======= FEC EGRESS forward label:module %d,port %d,vpi %d,vci %d",
LspCBVar->downAtmLabel.module,LspCBVar->downAtmLabel.port,
LspCBVar->downAtmLabel.vpi,LspCBVar->downAtmLabel.vci);*/
if(action_flag == LDP_FWD_CREATE)
{
FecLabel.Operaction = 0;
return mpls_feclabel_recv_process(&FecLabel,LspCBVar);
}
else
{
FecLabel.needOperSar = 0;
if(((LspCBVar->index2 == 1) && (LspCBVar->index1 == 0))|| \
((LspCBVar->index2 != 0) && (LspCBVar->index1 != 0)))
FecLabel.needOperSar = 1;
FecLabel.Operaction = 1;
return mpls_feclabel_close_process(&FecLabel,LspCBVar);
}
}
else if(LspCBVar->nodeType == MPLS_NODE_INGRESS)
{
/* send up ATM label */
FecLabel.xcLabel.downAtmLabel.module = LspCBVar->upAtmLabel.module;
FecLabel.xcLabel.downAtmLabel.port = LspCBVar->upAtmLabel.port;
FecLabel.xcLabel.downAtmLabel.vpi = LspCBVar->upAtmLabel.vpi;
FecLabel.xcLabel.downAtmLabel.vci = LspCBVar->upAtmLabel.vci;
FecLabel.xcLabel.downLabelValid = DOWN_A
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -