📄 ldpmain.c
字号:
void func_protimer7(TimerEventStruc *timerstruct)
{
mplsOAMLdpMessage_t *oammess;
if(timerstruct->extra == MPLS_MIB_LDP_LSR_ATTR)
{
oammess->msgtype = MPLS_MIB_LDP_LSR_ATTR;
oammess->mplsLdpOAMflag = 1;
MPLS_PSEND(MPLS_LDP_OAM_MESSAGE, oammess,sizeof(mplsLdpOAMMessage)+sizeof(unsigned char),mlsmanagePid);
TimerID_oamldp = EXTRA_SET_TIMER(TIMER7_LDPPERIOD,MPLS_TIMER7,MPLS_MIB_LDP_LSR_ATTR);
}
if(timerstruct->extra == MPLS_MIB_LDP_INTERFACE)
{
oammess->msgtype = MPLS_MIB_LDP_INTERFACE;
oammess->mplsLdpOAMflag = 1;
MPLS_PSEND(MPLS_LDP_OAM_MESSAGE, oammess,sizeof(mplsLdpOAMMessage)+sizeof(unsigned char),mlsmanagePid);
TimerID_oamldp = EXTRA_SET_TIMER(TIMER7_LDPPERIOD,MPLS_TIMER7,MPLS_MIB_LDP_INTERFACE);
}
if(timerstruct->extra == MPLS_MIB_LDP_ENTITY)
{
oammess->msgtype = MPLS_MIB_LDP_ENTITY;
oammess->mplsLdpOAMflag = 1;
MPLS_PSEND(MPLS_LDP_OAM_MESSAGE, oammess,sizeof(mplsLdpOAMMessage)+sizeof(unsigned char),mlsmanagePid);
TimerID_oamldp = EXTRA_SET_TIMER(TIMER7_LDPPERIOD,MPLS_TIMER7,MPLS_MIB_LDP_ENTITY);
}
if(timerstruct->extra == MPLS_MIB_LDP_DEF_TRAFFIC)
{
oammess->msgtype = MPLS_MIB_LDP_DEF_TRAFFIC;
oammess->mplsLdpOAMflag = 1;
MPLS_PSEND(MPLS_LDP_OAM_MESSAGE, oammess,sizeof(mplsLdpOAMMessage)+sizeof(unsigned char),mlsmanagePid);
TimerID_oamldp = EXTRA_SET_TIMER(TIMER7_LDPPERIOD,MPLS_TIMER7,MPLS_MIB_LDP_DEF_TRAFFIC);
}
if(timerstruct->extra == MPLS_INTERNAL_PORT_VPI_VCI)
{
oammess->msgtype = MPLS_INTERNAL_PORT_VPI_VCI;
oammess->mplsLdpOAMflag = 1;
MPLS_PSEND(MPLS_LDP_OAM_MESSAGE, oammess,sizeof(mplsLdpOAMMessage)+sizeof(unsigned char),mlsmanagePid);
TimerID_oamldp = EXTRA_SET_TIMER(TIMER7_LDPPERIOD,MPLS_TIMER7,MPLS_INTERNAL_PORT_VPI_VCI);
}
return;
}
/************ 发现过程初始化 *************/
/* modify hy hu.yonghong 2002-7-3*/
void InitHello()
{
unsigned short ii;
/* 从每一个entity包含的配置了MPLS属性的端口发送hello消息 */
for (ii = 0; ii < allEntity.num; ii++)
if(allEntity.entity[ii].adminStatus == 1)
{
SendLdpHello(&allEntity.entity[ii]);
}
#ifdef DEBUG_LDP
#ifdef __BGS10_MPLS_DEBUG
printf("==== Ldp Init hello successful ====");
#endif
#endif
return;
}
/*************************************************************************************/
/* 函数 : void ProcTcpCon(unsigned long peerIpaddr,unsigned long localIpaddr, */
/* unsigned short PeerPort,unsigned short LocalPort,unsigned long eventType) */
/* 功能 : ProcTcpCon */
/* 输入 : peerIpaddr localIpaddr PeerPort LocalPort eventType */
/* 输出 : no */
/* 全局变量 : no */
/* 作者 : */
/* 修改记录 :wengqing 2001/08/30 match session state role substate */
/* */
/*************************************************************************************/
void ProcTcpCon(unsigned long peerIpaddr,unsigned long localIpaddr,unsigned short PeerPort,unsigned short LocalPort,unsigned long eventType)
{
ldpMibSessionIndexReq_t sesIndex_s;
mplsLdpSession_t * session = MPLS_NULL;
TCP_CONNECT_MSG tcpRelMsg;
int rtcode;
sesIndex_s.localIpaddr = localIpaddr;
sesIndex_s.peerIpaddr = peerIpaddr;
sesIndex_s.indexFlag = 3;
session = MibSession(&sesIndex_s, LDP_SEARCH);
if (session == MPLS_NULL)
{
tcpRelMsg.LocalIpaddr = localIpaddr;
tcpRelMsg.PeerIpaddr = peerIpaddr;
tcpRelMsg.PeerPort = PeerPort;
tcpRelMsg.LocalPort = LocalPort;
MPLS_PSEND(TCP_RELEASE_REQ,&tcpRelMsg,sizeof(TCP_CONNECT_MSG),udptcpPid);
// #ifdef __BGS10_MPLS_DEBUG
DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_SESSION,"========ProcTcpCon,MODULE :%d SEND TCP RELEASE SESSION MISMATCH,localIpaddr %x,peerIpaddr %x=======\n",selfLdpPid.module,localIpaddr,peerIpaddr);
printf("========MODULE :%d SEND TCP RELEASE SESSION MISMATCH=======\n",selfLdpPid.module);
// #endif
return;
}
else
{
if((session->state == TCP_RELEASE_AWAITED )&&
(session->subState == REL_IND_AWAIT )&&
(session->role == PASSIVE))
{
/* delete Tcp Timer */
if (session->tmidCon > 0)
{
#ifdef SESSION_DEBUG
#ifdef __BGS10_MPLS_DEBUG
printf("==MODULE:%d DELETE TCP TIMER: tmid:%d==",
selfLdpPid.module,session->tmidCon);
printf("==MODULE:%d ACCEPT CONNECT PASSIVE==",
selfLdpPid.module);
#endif
#endif
MPLS_CLEAR_TIMER(session->tmidCon,ldptime_q,rtcode);
session->tmidCon = 0;
}
else
{
printf("====internal implementation error,session tcp timer %d====",
session->tmidCon);
}
session->state = NONEXISTENT;
session->subState = NONIDLE;
}
if (((session->state == TCP_CONNECT_AWAITED )&& (session->role == ACTIVE))||
((session->state == NONEXISTENT )&&(session->role == PASSIVE)))
{
session->LocalPort = LocalPort;
session->PeerPort = PeerPort;
printf("===MODULE :%d in session table localAddr %x, peerAddr %x, LocalPort %d, PeerPort %d===\n",
selfLdpPid.module,session->localIpaddr,session->peerIpaddr,session->LocalPort,session->PeerPort);
SessionFSM(session, eventType, NULL);
return;
}
else
{
tcpRelMsg.LocalIpaddr = localIpaddr;
tcpRelMsg.PeerIpaddr = peerIpaddr;
tcpRelMsg.PeerPort = PeerPort;
tcpRelMsg.LocalPort = LocalPort;
MPLS_PSEND(TCP_RELEASE_REQ,&tcpRelMsg,sizeof(TCP_CONNECT_MSG),udptcpPid);
#ifdef __BGS10_MPLS_DEBUG
printf("========MODULE :%d SEND TCP RELEASE STATE MISMATCH=======\n",selfLdpPid.module);
#endif
return;
}
}
}
/**************** 处理收到的PROT_TCP连接释放成功消息 *********/
/* modify by hyh 2002-7-5 */
void ProcTcpRel(unsigned long peerIpaddr,unsigned long localIpaddr, unsigned short PeerPort, unsigned short LocalPort, unsigned long eventType)
{
ldpMibSessionIndexReq_t sesIndex_s;
mplsLdpSession_t * session = MPLS_NULL;
sesIndex_s.localIpaddr = localIpaddr;
sesIndex_s.peerIpaddr = peerIpaddr;
sesIndex_s.indexFlag = 3;
session = MibSession(&sesIndex_s, LDP_SEARCH);
if (session == MPLS_NULL)
{
// #ifdef __BGS10_MPLS_DEBUG
DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_SESSION,"=== ProcTcpRel,not in session table, localIpaddr %x, peerIpaddr %x===\n",
sesIndex_s.localIpaddr,sesIndex_s.peerIpaddr);
printf("===== in session table, localIpaddr %d, peerIpaddr %d=====",
sesIndex_s.localIpaddr,sesIndex_s.peerIpaddr = peerIpaddr);
// #endif
return;
}
#ifdef __BGS10_MPLS_DEBUG
// szh mod for add tcp link port, in 2001-7-10 10:17
printf("===== in session table, localport %d, peerport %d=====",
session -> LocalPort,session -> PeerPort);
#endif
if((session -> LocalPort == LocalPort) && (session -> PeerPort == PeerPort))
{
SessionFSM(session, eventType, NULL);
}
else
{
printf("===== tcp link is not match, abort it ======");
}
return;
}
/***********************************************************************/
/* Author Name: wengqing, shizhaohi */
/* Creat Date: 12/20/99 */
/* Version : 1.0 */
/* Function : 处理收到的FEC建立消息 */
/* History : mod add return error code to nms 2001/11/14 szh */
/* mod 2001/11/15 mod add return error code to nms szh */
/* modfiy 2001/11/17 shizhaohui */
/* add response to nms for hop by hop lsp in special condition */
/* 2002.11.07 for no mpls ldp routerid, protection lspidTlv.routerId == 0 */
/************************************************************************/
void FecSetup(FecMsg * fecMsg)
{
mplsLdpCrLsp * pCrfec = MPLS_NULL;
lblmsgTlvExists tlvExist;
MPLS_ASSERT(fecMsg->Fec.TlvExists.flags.lspidTlvExists != 0);
/* 2002.11.07 for no mpls ldp routerid, protection lspidTlv.routerId == 0 */
if(fecMsg->Fec.lspidTlv.routerId == 0)
{
MPLS_ERR_LOG("==== Receive MPLS_FEC_SETUP,OperateType %d,Rouerid = 0,lspid %d ====", fecMsg->OperateType,fecMsg->Fec.lspidTlv.localCrlspId);
DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_CR,"==== Receive MPLS_FEC_SETUP,OperateType %d,Rouerid = 0,lspid %x ====\n", \
fecMsg->OperateType,fecMsg->Fec.lspidTlv.localCrlspId);
MPLS_MEMCPY(&fec_msg,fecMsg,sizeof(FecMsg));
if(fecMsg->OperateType != DELETE_PVC_TYPE)
{
fec_msg.OperateType = RESPONSE_TYPE;
fec_msg.Fec.statusCode = NOROUTE;
}
else
{
fec_msg.OperateType = DELETE_PVC_TYPE;
fec_msg.Fec.statusCode = 0;
}
fecPid.module = selfLdpPid.module;
ASEND(MPLS_FEC_STUDY,&fec_msg,sizeof(FecMsg),fecPid);
}
/* 2002.11.07 for no mpls ldp routerid, protection lspidTlv.routerId == 0 end */
MPLS_CRFECCB_SEARCH(fecMsg->Fec.lspidTlv.routerId,fecMsg->Fec.lspidTlv.localCrlspId,pCrfec); \
tlvExist.mark = 0;
switch(fecMsg->OperateType)
{
MPLS_ERR_LOG("==== Module %d,Receive MPLS_FEC_SETUP,OperateType %d ====", \
selfLdpPid.module,fecMsg->OperateType);
case NEW_TYPE:
if(pCrfec)
{
MPLS_ERR_LOG("==LDP Receive FecMsg Ingress %x, LspId %d, duplicate Request==\n", \
fecMsg->Fec.lspidTlv.routerId,\
fecMsg->Fec.lspidTlv.localCrlspId);
MPLS_ERR_LOG("==cr lsp cb status %d, subStatus %d, lsp type: %d,waitflag: %d ==\n", \
pCrfec->crlspCb.status,\
pCrfec->crlspCb.subStatus,
pCrfec->crlspCb.lspType,
pCrfec->crlspCb.waitflag);
return;
}
else
{
MPLS_CRFECCB_CREATE(fecMsg->Fec.lspidTlv.routerId,\
fecMsg->Fec.lspidTlv.localCrlspId,pCrfec);
if(!pCrfec)
{
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);
DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_CR,"FecSetup,creat crfec fail\n");
}
else
{
/********************************************************/
/* update Crfec control block attribute
*/
/********************************************************/
tlvExist.flags.fecTlvExists = 1;
tlvExist.flags.lspidTlvExists = 1;
pCrfec->crlspCb.nodeType = MPLS_NODE_INGRESS;
pCrfec->crlspCb.lspIndex = MPLS_GET_CRLSP_INDEX;
pCrfec->crlspCb.lspType = LDP_CR_LSP;
pCrfec->crlspCb.status = IDLE;
pCrfec->crlspCb.subStatus = IDLE;
pCrfec->crlspCb.upAtmLabel.module = fecMsg->Fec.sbModule;
pCrfec->crlspCb.upAtmLabel.port = fecMsg->Fec.sbPort;
pCrfec->mplsLdpFecType = fecMsg->Fec.fecElemTypes[0];
setCrFilter(pCrfec,fecMsg);
if(pCrfec->mplsLdpFecType != MPLS_CRLSP_FEC)
{
pCrfec->mplsLdpFecAddrLen = fecMsg->Fec.fecElArray[0].addressEl.preLen;
pCrfec->mplsFecAddr = fecMsg->Fec.fecElArray[0].addressEl.address;
}
if(fecMsg->Fec.TlvExists.flags.erTlvExists == 1)
{
MPLS_MEMCPY(&(pCrfec->erTlv),&(fecMsg->Fec.erTlv), \
sizeof(mplsLdpErTlv_t));
tlvExist.flags.erTlvExists = 1;
}
if(fecMsg->Fec.TlvExists.flags.trafficTlvExists == 1)
{
MPLS_MEMCPY(&(pCrfec->trafficTlv),&(fecMsg->Fec.Traffic), \
sizeof(mplsLdpTrafficTlv_t));
tlvExist.flags.trafficTlvExists = 1;
}
if(fecMsg->Fec.TlvExists.flags.pinningTlvExists == 1)
{
MPLS_MEMCPY(&(pCrfec->pinningTlv),&(fecMsg->Fec.pinningTlv), \
sizeof(mplsLdpPinningTlv_t));
tlvExist.flags.pinningTlvExists = 1;
}
if(fecMsg->Fec.TlvExists.flags.recClassTlvExists == 1)
{
MPLS_MEMCPY(&(pCrfec->resClassTlv),&(fecMsg->Fec.resClassTlv), \
sizeof(mplsLdpResClsTlv_t));
tlvExist.flags.recClassTlvExists = 1;
}
if(fecMsg->Fec.TlvExists.flags.preemptTlvExists == 1)
{
MPLS_MEMCPY(&(pCrfec->preemptTlv),&(fecMsg->Fec.preemptTlv), \
sizeof(mplsLdpPreemptTlv_t));
tlvExist.flags.preemptTlvExists = 1;
}
pCrfec->tlvExists = tlvExist.mark;
ProcFecInquire(fecMsg);
}
}
break;
case LBLABORT_TYPE:
if(pCrfec)
{
/************************************************************/
/* use downstream atm label module and port judge downstream
* lsr label distribution mode;
* because downstream session may be invalid and set to zero
*/
/************************************************************/
if(pCrfec->crlspCb.downAtmLabel.module == 0 && \
pCrfec->crlspCb.downAtmLabel.port == 0)
{
/********************************************************/
/* DU mode
*/
/********************************************************/
/* add into msg link list */
}
else
{
/*sendToFecCrlsp(pCrfec,DELETE_PVC_TYPE,0);*/
if(!((&(pCrfec->crlspCb))->waitflag & 0x1))
LspCBFsm(MPLS_NULL,MPLS_LBLABORT_MSGTYPE,MPLS_NULL, \
LDP_CR_LSP,pCrfec,&(pCrfec->crlspCb));
}
}
break;
case UPDATE_TYPE:
break;
case DELETE_PVC_TYPE:
if(pCrfec)
{
/************************************************************/
/* use downstream atm label module and port judge downstream
* lsr label distribution mode;
* because downstream session may be invalid and set to zero
*/
/************************************************************/
if(pCrfec->crlspCb.downAtmLabel.module == 0 && \
pCrfec->crlspCb.downAtmLabel.port == 0)
{
/********************************************************/
/* DU mode
*/
/********************************************************/
/* add into msg link list */
}
else
{
/*sendToFecCrlsp(pCrfec,DELETE_PVC_TYPE,0);*/
if(!((&(pCrfec->crlspCb))->waitflag & 0x1))
LspCBFsm(MPLS_NULL,UPSTREAM_LOST,MPLS_NULL, \
LDP_CR_LSP,pCrfec,&(pCrfec->crlspCb));
else /* if lspcb is to be deleted,response fec DELETE_PVC_TYPE */
{
fecMsg->OperateType = DELETE_PVC_TYPE;
fecMsg->Fec.statusCode = 0;
fecPid.module = selfLdpPid.module;
ASEND(MPLS_FEC_STUDY,fecMsg,sizeof(FecMsg),fecPid);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -