📄 mplsfun.c
字号:
mpls_filter_key *lsp_key2;
MPLS_ASSERT(key1 != NULL);
MPLS_ASSERT(key2 != NULL);
lsp_key1 = (mpls_filter_key *)key1;
lsp_key2 = (mpls_filter_key *)key2;
if(lsp_key1->filterNo < lsp_key2->filterNo)
rc = -1;
else if(lsp_key1->filterNo > lsp_key2->filterNo)
rc = 1;
return rc;
}
int lsp_key_compare(void *key1, void *key2)
{
int rc = 0;
LSP_KEY *lsp_key1;
LSP_KEY *lsp_key2;
MPLS_ASSERT(key1 != NULL);
MPLS_ASSERT(key2 != NULL);
lsp_key1 = (LSP_KEY *)key1;
lsp_key2 = (LSP_KEY *)key2;
if(lsp_key1->localLspId < lsp_key2->localLspId)
rc = -1;
else if(lsp_key1->localLspId > lsp_key2->localLspId)
rc = 1;
/* hyh modify 2002-11-7 cr-lsp key only ues localLspId */
/* else
{
if(lsp_key1->IngressId < lsp_key2->IngressId)
rc = -1;
else if(lsp_key1->IngressId > lsp_key2->IngressId)
rc = 1;
}
*/
return rc;
}
/*****************************************************************************************
* FUNCTION NAME : lsp_prio_dst_compare()
* DESCRIPTION: : compare prio and dst
* INPUT : none
* AUTHOR/DATE : sbp 2003-1-14
**********************************************************************/
int lsp_prio_dst_compare(void *key1, void *key2)
{
int rc = 0;
LSP_PRIO_KEY *lsp_key1;
LSP_PRIO_KEY *lsp_key2;
MPLS_ASSERT(key1 != NULL);
MPLS_ASSERT(key2 != NULL);
lsp_key1 = (LSP_PRIO_KEY *)key1;
lsp_key2 = (LSP_PRIO_KEY *)key2;
if(lsp_key1->dst < lsp_key2->dst)
rc = -1;
else if(lsp_key1->dst > lsp_key2->dst)
rc = 1;
else
{
if(lsp_key1->metric < lsp_key2->metric)
rc = -1;
else if(lsp_key1->metric > lsp_key2->metric)
rc = 1;
}
return rc;
}
/*********************************************************************************
* 函 数 名: mplsInitwhole()
* 功 能: 初始化MPLSMANAGE进程。
* 输 入: 无
* 输 出: 无
* 返 回: 无
* 全局变量: mplsInterfaceConfEntry 、MplsPortDataTable1
* 修改记录:
- 修改日期 版本 修 改 人 修改原因及内容
=========================================================
- 2001-8-14 2.1.2 孙保平 创建
sbp 2002-6-15 initialize the ldp protocol data
*********************************************************************************/
void mplsInitwhole()
{
ushort num;
SELF(&mplsManagerOamPID);
num = MPLS_LDP_INTERFACE_MAX;
MPLS_MEMSET(&mplsLsrAttrEntry,0,sizeof(mplsLsrAttr_t)); /*初始化LSRID*/
MPLS_MEMSET(mplsInterfaceConfEntry,0,num*sizeof(MplsInterfaceConfTable_t));/*端口配置*/
MPLS_MEMSET(mplsTrafficParamEntry,0,num*sizeof(MplsTrafficParamTable_t)); /*流量配置*/
MPLS_MEMSET(mplsLdpEntityEntry,0,num*sizeof(MplsLdpEntityTable_t)); /*实体配置*/
MPLS_MEMSET(mplsLdpEntityAtmParamsEntry,0,num*sizeof(MplsLdpEntityAtmParamsTable_t)); /*ATM参数配置*/
MPLS_MEMSET(mplsLdpEntityConfAtmLabelRangeEntry,0,num*sizeof(MplsLdpEntityConfAtmLabelRangeTable_t)); /*ATM标签范围配置*/
MPLS_MEMSET(mplsLdpEntityStatsEntry,0,num*sizeof(mplsLdpEntityStatsTable_t)); /*LDP 参数配置*/
MPLS_MEMSET(mplsLdpPeerEntry,0,num*sizeof(mplsLdpPeerTable_t)); /*LDP 参数配置*/
MPLS_MEMSET(mplsLdpHelloAdjacencyEntry,0,num*sizeof(mplsLdpHelloAdjacencyTable_t)); /*LDP 参数配置*/
MPLS_MEMSET(mplsLdpSessionEntry,0,num*sizeof(MplsLdpSessionTable_t)); /*LDP 参数配置*/
MPLS_MEMSET(mplsLdpSessionStatsEntry,0,num*sizeof(mplsLdpSessionStatsTable_t)); /*LDP 参数配置*/
MPLS_MEMSET(mplsForwardingEntry,0,num*sizeof(forwardingtable_t)); /*LDP 参数配置*/
MPLS_MEMSET(mplsLdpEntityParamEntry,0,num*sizeof(mplsldpparamtable_t)); /*LDP 参数配置*/
MPLS_MEMSET(mplsIfTransportAddressEntry,0,num*sizeof(if_transport_table_t)); /*LDP 参数配置*/
MPLS_MEMSET(mplsLibEntry,0,num*sizeof(libtable_t)); /*LDP 参数配置*/
MPLS_MEMSET(mplsLdpDiscoveryEntry,0,num*sizeof(mplsLdpDiscovery_t)); /*LDP 参数配置*/
MPLS_MEMSET(mplsAtmLdpCapEntry,0,num*sizeof(mplsAtmLdpCapability_t)); /*ATM CAPABILITY 配置*/
MPLS_MEMSET(mplsLdpAtmSessionEntry,0,num*sizeof(mplsLdpAtmSessionTable_t)); /*ATM SESSION */
MPLS_MEMSET(mplsLdpSessionPeerAddressEntry,0,num*sizeof(mplsLdpSessionPeerAddressTable_t)); /* SESSION PEER ADDRESS*/
MPLS_MEMSET(mplsLdpEntityConfGenericLabelRangeEntry,0,num*sizeof(MplsLdpEntityConfGenericLabelRangeTable_t)); /* 通用标签配置*/
MPLS_MEMSET(mplsLdpGeneralSessionEntry,0,num*sizeof(mplsLdpGeneralSessionTable_t)); /*GENERAL SESSION*/
/*MPLS_MEMSET(&mplsFecFilterEntry,0,sizeof(mplsFecFilterAll_t)); fec filter
mplsFecFilterEntry.mplsFecFilterInfo[0].listNo =1;
mplsFecFilterEntry.num = 1;
mplsFecFilterEntry.allFilterFlag = MPLS_FEC_FILTER_DISABLE_ALL;*/
MPLS_AVL_INIT_TREE(lspConfigTree, lsp_key_compare);
MPLS_AVL_INIT_TREE(lspNhTree, fec_key_compare);
MPLS_AVL_INIT_TREE(lspNhTreeTemp, fec_key_compare);
MPLS_AVL_INIT_TREE(mplsFilterTree, filter_key_compare);
MPLS_AVL_INIT_TREE(mplsLspPrioTree, lsp_prio_dst_compare);
/* Initialize a OAM timer queue */
MPLS_TIMER_INIT(mpls_oam_timer_q);
MPLS_MEMSET(&mplsFecFilterAdvEntry,0,sizeof(mplsFecFilterAdvertiseLbls_t)); /*mpls fec filter advertise label table */
mplsFecFilterAdvEntry.advFlag = MPLS_NOT_ADVERTISE_LBLS;
mplsFecFilterHead=mplsFecFilterPF=mplsFecFilterPN
= (mplsFecFilterAll_t *)malloc(sizeof(mplsFecFilterAll_t));
MPLS_MEMSET(mplsFecFilterHead,0,sizeof(mplsFecFilterAll_t));
mplsFecFilterHead->next = MPLS_NULL;
mplsFecFilterHead->FecFilter->next = MPLS_NULL;
MPLS_MEMSET(&TimeSave,0,8*2); /* 分别和8个记时器相对应 */
MPLS_MEMSET(&operArray,0,8);
MPLS_MEMSET(&arrayLen,0,MPLS_DATA_ARRAY_MAX*2);
MPLS_MEMSET(&mplsOamTimer,0,sizeof(mplsOamTimer_t));
for(num=0; num<=MPLS_MAX_MODULE_NUM;num++)
{
mplsOamTimer.timerId[timerNo(num,OAM_TIMER_MPLS_LSRID_TABLE)] = timerNo(num,OAM_TIMER_MPLS_LSRID_TABLE);
mplsOamTimer.timerId[timerNo(num,OAM_TIMER_MPLS_INTERFACE_TABLE)] = timerNo(num,OAM_TIMER_MPLS_INTERFACE_TABLE);
mplsOamTimer.timerId[timerNo(num,OAM_TIMER_MPLS_ENTITY_TABLE)] = timerNo(num,OAM_TIMER_MPLS_ENTITY_TABLE);
mplsOamTimer.timerId[timerNo(num,OAM_TIMER_MPLS_CONFIG_TABLE)] = timerNo(num,OAM_TIMER_MPLS_CONFIG_TABLE);
}
MPLS_MEMSET(&FilterNo,0,FILTER_MAX_NUM*sizeof(FilterLspId_t));
MPLS_MEMSET(&mplsLspSetupEntry,0,sizeof(mplsLspSetup_t));
/*
for(num=1; num<FILTER_MAX_NUM-1; num++)
{
FilterNo[num].front = num-1;
FilterNo[num].next = num+1;
}
FilterNo[FILTER_MAX_NUM-1].next=0;
currentFilterNo = 1;
*/
mplsFecLspRteInit();
mplsLdpParamInit(); /* initialize the ldp protocol data */
mplsFecMemInit();
#if _MPLS_DEBUG
MPLS_MEMSET(mplsDebug,0,50*sizeof(unsigned long));
#endif
/* szh, 2002-8-24 initialize label vpi/vci*/
MPLS_MEMSET(&local_label_busy_flags, 0,sizeof(mpls_label_busy_flags));
MPLS_MEMSET(mplsIfConf,0,sizeof(mplsIfConf_t)*MPLS_MAX_BOARD);
MPLS_MEMSET(&mplsIpIf,0,sizeof(interface_name_t));
mplsOamGetMem();
}
void mpls2LdpBoardType(ushort eventType,PID * sPid,uchar opera)
{
PID sendPid;
ushort num;
ushort numFnd; /* 0: 模块没有配置、1:模块已配置*/
ushort iNum;
uchar timer_number;
MIB_MPLSCONFIG_ACK boardData;
/* mplsOAMLdpMessage_t MessData; */
MPLS_MEMSET(&boardData,0,sizeof(MIB_MPLSCONFIG_ACK));
MPLS_MEMSET(&lspData,0,sizeof(mplsOAMLdpMessage_t));
sendPid = *sPid;
numFnd = 0;
num = MplsPortDataTable1.num;
for(iNum=0; iNum<num; iNum++)
{
if(sendPid.module==MplsPortDataTable1.mplsModule[iNum].module)
{
MPLS_MEMCPY(&boardData,&MplsPortDataTable1.mplsModule[iNum].cardType,sizeof(MIB_MPLSCONFIG_ACK));
numFnd = 1;
break;
}
}
if(numFnd==1)
{
MPLS_MEMCPY(&lspData.data.configData,&boardData,sizeof(MIB_MPLSCONFIG_ACK));
/*
MessData.data.configData = boardData;*/
lspData.mplsLdpOAMflag = opera;
lspData.msgtype = MPLS_MIB_LDP_CONFIG;
ASEND(eventType,&lspData,sizeof(MIB_MPLSCONFIG_ACK)+40,sendPid);
}
else
{
MPLS_MEMCPY(&lspData.data.configData,&boardData,sizeof(MIB_MPLSCONFIG_ACK));
/* MessData.data.configData = boardData; */
lspData.msgtype = MPLS_MIB_LDP_CONFIG;
lspData.mplsLdpOAMflag = opera;
ASEND(eventType,&lspData,sizeof(MIB_MPLSCONFIG_ACK)+40,sendPid);
}
/*mplsOamTimer.timerId[timerNo(sendPid.module,OAM_TIMER_MPLS_CONFIG_TO_LDP_TABLE)] =
EXTRA_SET_TIMER(MPLS_OAM_LDP_CONFIG_TIMER, MPLS_TIMER1, timerNo(sendPid.module,OAM_TIMER_MPLS_CONFIG_TO_LDP_TABLE));*/
timer_number = timerNo(sendPid.module,OAM_TIMER_MPLS_CONFIG_TO_LDP_TABLE);
MPLS_SET_TIMER(MPLS_OAM_LDP_CONFIG_TIMER,
(void *)timer1proOAM,
(void *)OAM_TIMER_MPLS_CONFIG_TO_LDP_TABLE,
mpls_oam_timer_q,
mplsOamTimer.timerId[timer_number]);
}
/* session peer address recieve*/
#if 0/*
void mplsSessionPeerAddrRecv(PID *sPid, MIB_LDP_SESSION_PEERADDR_REQ *data)
{
PID *sendPid;
ushort num;
ushort num1;
ushort num2;
MIB_LDP_SESSION_PEERADDR_REQ SesPeerAddrData;
MIB_LDP_SESSION_PEERADDR_ACK SesPeerAddrAck;
sendPid = sPid;
helloData = *data;
num = arrayLen[NOSESSIONPEER];
if(SesPeerAddrData.operateType==1)
{
mplsLdpSessionPeerAddressEntry[num].entityLdpId = SesPeerAddrData.req.set.ldpId;
mplsLdpSessionPeerAddressEntry[num].entityindex = SesPeerAddrData.req.set.index;
#if 0
mplsLdpSessionPeerAddressEntry[num].peerLdpId = SesPeerAddrData.req.set.peerLdpId;
#endif
mplsLdpSessionPeerAddressEntry[num].peeraddressindex = SesPeerAddrData.req.set.sessionIndex;
mplsLdpSessionPeerAddressEntry[num].peernexthopaddresstype
= (uchar)SesPeerAddrData.req.set.nextHopAddressType;
mplsLdpSessionPeerAddressEntry[num].peernexthopaddress = SesPeerAddrData.req.set.nextHopAddress;
mplsLdpSessionPeerAddressEntry[num].ifName.module = sendPid.module;
/* connect 在收到session消息时填 */
arrayLen[NOSESSIONPEER]++;
}
else if(SesPeerAddrData.operateType==2)
{ ;}
else
{
for(num2=num1; num2<num-1; num2++)
{
if(mplsLdpSessionPeerAddressEntry[num2].entityindex == helloData.req.del.index &&
mplsLdpSessionPeerAddressEntry[num2].ifName.module == sendPid.module)
{
mplsLdpSessionPeerAddressEntry[num2]=mplsLdpSessionPeerAddressEntry[num2+1];
}
MPLS_MEMSET(mplsLdpSessionPeerAddressEntry[num2],0,sizeof(mplsLdpSessionPeerAddressTable_t));
arrayLen[NOSESSIONPEER]--;
break;
}
}
SesPeerAddrAck.result = 1;
ASEND(MPLS_MIB_LDP_SESSION_PEERADDR,&SesPeerAddrAck,sizeof(MIB_LDP_SESSION_PEERADDR_ACK),sendPid);
} */
#endif
/*********************************************************************************
* 函 数 名: mplsHelloRecv()
* 功 能: 接收HELLO数据
* 输 入: sPid: 发送方的PID
* data: 接收的数据
* 输 出: 无
* 返 回: 无
* 全局变量: mplsInterfaceConfEntry 、MplsPortDataTable1
* 修改记录:
- 修改日期 版本 修 改 人 修改原因及内容
=========================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -