📄 ldpfunc.c
字号:
/********************************************************************/
/* Product Name: MPLS PACK 1.0 */
/* Module Name: LDP */
/* File Name: LdpFunc.c */
/* Author Name: hu.yonghong */
/* Creat Date: 2002/6/19 */
/* Version : 1.0 */
/* Function : lspCB FSM function */
/* 2002.11.11 Huyonghong fill the structure to forwarding */
/* 2002.11.19 Huyonghong modify cr response to fec */
/* 2003.1.16 Huyonghong move lspcb substatus change to lspfsm */
/* 2003.1.26 Huyonghong if bandwidth/crpvc req timeout,send to release it */
/* 2003.2.20 huyonghong send tcp msg from Func_lblmsg_wait_proce */
/* 2003.3.4 huyonghong modify path vector memmory manage */
/* 2003.3.11 huyonghong if traffic parameters error,delete ldpCB */
/* 2003.4.3 huyonghong 启用mpls_policy_filter函数 */
/* 2003-7-10 szh mod 在V2.2版本,带给C的流量参数值有变化
/* 2003-8-15 szh mod 在出错时要把申请的pCrfec控制块释放掉,在不是ingress节点时
向上游发通知消息 */
/*2003.9.17 Fengjun 减少和C进程的交互 */
/* 2003-9-23 lixia add for release_pvc queue's memmory process */
/* 2003-11-25 lixia mod ldp_del_lspCB for dele aggrate body */
/* 2003-12-3 szh add avoid memory leak */
/* 2003-12-29 szh lixia mod dele p_s_f */
/* 2003.12.30 lixia 增加session整链插入函数处理 */
/* fengjun 2003.12.30 直接调用宏删除CR控制块不安全,用函数ldp_del_lspCB替代*/
/* 2003.12.30 fengjun 整链插入时,调用MplsInsertIntoupGlobalList和MplsInsertIntodownGlobalList函数*/
/* 2004-1-5 lixia add for debug mpls */
/* 2004-1-5 shizhaohui add for errorcode */
/********************************************************************/
#include "ldpvars.h"
#include "mplsni.h"
unsigned long labelgeterror=0;
extern unsigned long hoptraffpara_pdr, hoptraffpara_pbs;
extern unsigned char encapsulation_mode;
extern RoutEntry *Mpls_RtGetFrZef( IPaddr dest);
extern RoutEntry *mpls_match_route(IPaddr mpls_dest,ulong mpls_mask);
unsigned short LDP_LSPTYPE(unsigned long x)
{
if(x&0x80000000)
return LDP_HOP_LSP;
else
return LDP_CR_LSP;
}
/********************************************************************/
/* Author Name: weng.qing shi.zhaohui sun.baoping */
/* Creat Date: 2001/12/20 */
/* Function : request message to fec message */
/********************************************************************/
void seg_fec_msg(FecMsg * fec_msg, void * msg)
{
mplsLdpLblReqMsg_t *lblReqMsg;
int ii;
lblReqMsg = (mplsLdpLblReqMsg_t *)msg;
if(lblReqMsg->fecTlvExists == 1)
{
MPLS_MEMCPY(fec_msg->Fec.fecElArray,lblReqMsg->fecTlv.fecElArray,
CONTENT_MAX_LENGTH);
for(ii = 0; ii < lblReqMsg->fecTlv.numberFecElements; ii ++)
{
fec_msg->Fec.fecElemTypes[ii] = lblReqMsg->fecTlv.fecElemTypes[ii];
}
fec_msg->Fec.fecElemNum = lblReqMsg->fecTlv.numberFecElements;
}
if(lblReqMsg->lspidTlvExists == 1)
{
fec_msg->Fec.TlvExists.flags.lspidTlvExists = 1;
MPLS_MEMCPY(&fec_msg->Fec.lspidTlv,
&lblReqMsg->lspidTlv,
sizeof(mplsLdpLspIdTlv_t));
}
if(lblReqMsg->erTlvExists == 1)
{
fec_msg->Fec.TlvExists.flags.erTlvExists = 1;
MPLS_MEMCPY(&fec_msg->Fec.erTlv,
&lblReqMsg->erTlv,
sizeof(mplsLdpErTlv_t));
}
if(lblReqMsg->trafficTlvExists == 1)
{
fec_msg->Fec.TlvExists.flags.trafficTlvExists = 1;
MPLS_MEMCPY(&fec_msg->Fec.Traffic,
&lblReqMsg->trafficTlv,
sizeof(mplsLdpTrafficTlv_t));
}
if(lblReqMsg->pinningTlvExists == 1)
{
fec_msg->Fec.TlvExists.flags.pinningTlvExists = 1;
MPLS_MEMCPY(&fec_msg->Fec.pinningTlv,
&lblReqMsg->pinningTlv,
sizeof(mplsLdpPinningTlv_t));
}
if(lblReqMsg->recClassTlvExists == 1)
{
fec_msg->Fec.TlvExists.flags.recClassTlvExists = 1;
MPLS_MEMCPY(&fec_msg->Fec.resClassTlv,
&lblReqMsg->resClassTlv,
sizeof(mplsLdpResClsTlv_t));
}
if(lblReqMsg->preemptTlvExists == 1)
{
fec_msg->Fec.TlvExists.flags.preemptTlvExists = 1;
MPLS_MEMCPY(&fec_msg->Fec.preemptTlv,
&lblReqMsg->preemptTlv,
sizeof(mplsLdpPreemptTlv_t));
}
return;
}
void set_cr_fec_mag(FecMsg * fec_msg, mplsLdpCrLsp * crEntry)
{
int ii;
lblmsgTlvExists tlvflags;
tlvflags.mark = crEntry->tlvExists;
fec_msg->Fec.TlvExists.flags.lspidTlvExists = 1;
fec_msg->Fec.lspidTlv.localCrlspId = crEntry->crfec_key.locallspid;
fec_msg->Fec.lspidTlv.routerId = crEntry->crfec_key.ingressid;
if(tlvflags.flags.erTlvExists == 1)
{
fec_msg->Fec.TlvExists.flags.erTlvExists = 1;
MPLS_MEMCPY(&fec_msg->Fec.erTlv,
&crEntry->erTlv,
sizeof(mplsLdpErTlv_t));
}
if(tlvflags.flags.trafficTlvExists == 1)
{
fec_msg->Fec.TlvExists.flags.trafficTlvExists = 1;
MPLS_MEMCPY(&fec_msg->Fec.Traffic,
&crEntry->trafficTlv,
sizeof(mplsLdpTrafficTlv_t));
}
if(tlvflags.flags.pinningTlvExists == 1)
{
fec_msg->Fec.TlvExists.flags.pinningTlvExists = 1;
MPLS_MEMCPY(&fec_msg->Fec.pinningTlv,
&crEntry->pinningTlv,
sizeof(mplsLdpPinningTlv_t));
}
if(tlvflags.flags.recClassTlvExists == 1)
{
fec_msg->Fec.TlvExists.flags.recClassTlvExists = 1;
MPLS_MEMCPY(&fec_msg->Fec.resClassTlv,
&crEntry->resClassTlv,
sizeof(mplsLdpResClsTlv_t));
}
if(tlvflags.flags.preemptTlvExists == 1)
{
fec_msg->Fec.TlvExists.flags.preemptTlvExists = 1;
MPLS_MEMCPY(&fec_msg->Fec.preemptTlv,
&crEntry->preemptTlv,
sizeof(mplsLdpPreemptTlv_t));
}
return;
}
/********************************************************************/
/* Author Name: weng.qing shi.zhaohui sun.baoping */
/* Creat Date: 2001/12/20 */
/* Function : check label request message source */
/********************************************************************/
short checkMsgSource(mplsLdpLspCB *LspCBVar, FecMsg * fecMsg)
{
ldpMibSessionIndexReq_t sesIndex_s;
mplsLdpSession_t *session = MPLS_NULL;
if(fecMsg->Fec.RouteType != MPLS_NODE_INGRESS)
{
sesIndex_s.sessionIndex = LspCBVar->upSessionIndex;
sesIndex_s.indexFlag = 1;
session = MibSession(&sesIndex_s,LDP_SEARCH);
if (session == MPLS_NULL)
{
#ifdef DEBUG_LDP
#ifdef __BGS10_MPLS_DEBUG
printf("========FEC INQUIRE OK CHECK MSGSRC NO SESSION ==");
#endif
#endif
}
else
{
if(session->nexthopaddr == fecMsg->Fec.NextHop)
{
LspCBVar -> errorcode = CHECKMSGLOOPDETECT;
sndnotifymsgproc(session,LOOPDETECT,LspCBVar->upMsgid,\
MPLS_LBLMAP_MSGTYPE);
return LDP_FALSE;
}
}
}
return LDP_TRUE;
}
/********************************************************************/
/* Author Name: weng.qing shi.zhaohui sun.baoping */
/* Creat Date: 2001/12/20 */
/* Function : check service class or service priority */
/********************************************************************/
short ServiceClass(mplsLdpTrafficTlv_t * trafficTlv)
{
unsigned long param1,param2,param3,param4,param5;
param1 = trafficTlv->pdr.pdr;
param2 = trafficTlv->pbs.pbs;
param3 = trafficTlv->cdr.cdr;
param4 = trafficTlv->cbs.cbs;
param5 = trafficTlv->ebs.ebs;
if ((param1 != 0) && (param2 != 0) && (param3 != 0) && (param4 != 0)\
&& (param3 == param1) && (param4 == param2) && (param5 == 0)\
&& (trafficTlv->freq == VERY_FREQUENT))
return CBRService;
if ((param1 != 0) && (param2 != 0) && (param3 != 0) && (param4 != 0)\
&& (param3 == param1) && (param4 == param2) && (param5 == 0)\
&& (trafficTlv->freq == UNSPECIFIED))
return UBRService;
else
if ((param1 != 0) && (param2 != 0) && (param3 != 0) && (param4 != 0)\
&& (param3 <= param1) && (param4 <= param2) && (param5 == 0)\
&& (trafficTlv->freq == FREQUENT))
return rtVBRService;
else
if ((param1 != 0) && (param2 != 0) && (param3 != 0) && (param4 != 0)\
&& (param3 <= param1) && (param4 <= param2) && (param5 == 0)\
&& (trafficTlv->freq == UNSPECIFIED))
return nrtVBRService;
else
if ((param1 != 0) && (param2 != 0) && (param3 == 0)\
&& (param4 == 0) && (param5 == 0)\
&& (trafficTlv->freq == UNSPECIFIED))
return UBRService;
else
return LDP_FALSE;
}
mplsLdpSession_t *search_session_from_sessindex(unsigned long SessionIndex1)
{
ldpMibSessionIndexReq_t sesIndex;
mplsLdpSession_t *session = MPLS_NULL;
sesIndex.sessionIndex = SessionIndex1;
sesIndex.indexFlag = 1;
session = MibSession(&sesIndex,LDP_SEARCH);
if (session == MPLS_NULL)
{
#ifdef MPLS_ERR_PRINT
DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_LSP,"==== LABEL REQ Session Index FAIL %x====\n",SessionIndex1);
printf("==== LABEL REQ Session Index FAIL====\n");
#endif
return NULL;
}
return session;
}
/* 2003-8-15 szh mod 在出错时要把申请的pCrfec控制块释放掉,在不是ingress节点时
向上游发通知消息 */
/*填路由信息*/
/* fengjun 2003.12.30 直接调用宏删除CR控制块不安全,用函数ldp_del_lspCB替代*/
short ldp_fec2lspCB(mplsLdpLspCB *LspCBVar,FecMsg *fecMsg)
{
mplsLdpSession_t *session = MPLS_NULL;
mplsLdpCrLsp *pCrfec = MPLS_NULL;
if(LspCBVar->lspType == LDP_CR_LSP)
{
if(LspCBVar->nodeType != MPLS_NODE_EGRESS)
{
MPLS_NEXTHOP_SESSION_SEARCH(fecMsg->Fec.NextHop,session);
pCrfec = (mplsLdpCrLsp *)LspCBVar->selffec;
if(session == MPLS_NULL)
{
if( pCrfec->crlspCb.nodeType == MPLS_NODE_INGRESS)
{
LspCBVar->errorcode = CRLSPNODOWNSESSION;
MPLS_MEMCPY(&fec_msg,fecMsg,sizeof(FecMsg));
fec_msg.OperateType = RESPONSE_TYPE;
fec_msg.Fec.statusCode = NOROUTE;
fecPid.module = selfLdpPid.module;
ASEND(MPLS_FEC_STUDY,&fec_msg,sizeof(FecMsg),fecPid);
ldp_del_lspCB((char *)pCrfec,&pCrfec->crlspCb);
}
else
{
/******************************************************/
/* send to up notification message, should check fengjun
/*
/******************************************************/
MPLS_INDEX_TO_SESSION(session,pCrfec->crlspCb.upSessionIndex);
if(session)
{
MPLS_REMOVE_FROM_SESSION_UP_LSP_LIST(session->lsp_up_cb_list,\
&(pCrfec->crlspCb));
MPLS_SEND_NOTIFY(session,NOROUTE,pCrfec->crlspCb.upMsgid, \
MPLS_LBLREQ_MSGTYPE);
}
ldp_del_lspCB((char *)pCrfec,&pCrfec->crlspCb);
}
DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_LSP,"ldp_fec2lspCB session search error %x\n",pCrfec->crlspCb.upSessionIndex);
MPLS_ERR_LOG("ldp_fec2lspCB session search error");
return LDP_FALSE;
}
LspCBVar->downifIndex = session->ifIndex;
LspCBVar->downSessionIndex = session->index;
LspCBVar->downPeerLdpid.lsrAddress = session->peerLdpId.lsrAddress;
LspCBVar->downPeerLdpid.labelSpace = session->peerLdpId.labelSpace;
MPLS_INSERT_INTO_DOWN_LSP_LIST(session->lsp_down_cb_list,\
&(pCrfec->crlspCb),&(pCrfec->crlspCb));
ifindex2mod_req.ifIndex = LspCBVar->downifIndex;
ifindex2mod_req.mpls_protocol_type = MPLS_LABEL_SWITCH_PROTOCOL_ATM;
ifindex2mod_req.mpls_platform = local_platform;
mpls_ifindex2module(&ifindex2mod_req,&ifindex2mod_ack,MPLS_INTERFACE);
if(ifindex2mod_ack.ack == MPLS_SUCCESS)
{
LspCBVar->downAtmLabel.module = ifindex2mod_ack.mod;
LspCBVar->downAtmLabel.port = ifindex2mod_ack.port;
}
else
{
pCrfec = (mplsLdpCrLsp *)LspCBVar->selffec;
if( pCrfec->crlspCb.nodeType == MPLS_NODE_INGRESS)
{
LspCBVar->errorcode = CRLSPSEARCHDOWPORTERR;
MPLS_MEMCPY(&fec_msg,fecMsg,sizeof(FecMsg));
fec_msg.OperateType = RESPONSE_TYPE;
fec_msg.Fec.statusCode = INTERNALERROR;
fecPid.module = selfLdpPid.module;
ASEND(MPLS_FEC_STUDY,&fec_msg,sizeof(FecMsg),fecPid);
MPLS_REMOVE_FROM_SESSION_DOWN_LSP_LIST(session->lsp_down_cb_list,\
&(pCrfec->crlspCb));
ldp_del_lspCB((char *)pCrfec,&pCrfec->crlspCb);
}
else
{
/******************************************************/
/* send to up notification message, should check fengjun
/*
/******************************************************/
MPLS_INDEX_TO_SESSION(session,pCrfec->crlspCb.upSessionIndex);
if(session)
{
MPLS_REMOVE_FROM_SESSION_UP_LSP_LIST(session->lsp_up_cb_list,\
&(pCrfec->crlspCb));
MPLS_SEND_NOTIFY(session,NOROUTE,pCrfec->crlspCb.upMsgid, \
MPLS_LBLREQ_MSGTYPE);
}
MPLS_REMOVE_FROM_SESSION_DOWN_LSP_LIST(session->lsp_down_cb_list,\
&(pCrfec->crlspCb));
ldp_del_lspCB((char *)pCrfec,&pCrfec->crlspCb);
}
DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_LSP,"ldp_fec2lspCB 2 ifindex search error %x\n",pCrfec->crlspCb.upSessionIndex);
MPLS_ERR_LOG("ldp_fec2lspCB ifindex search error");
return LDP_FALSE;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -