📄 ldpmain.c
字号:
/************************************************************************/
/* Product Name: ZXB10 */
/* Module Name: A075 */
/* File Name: Ldpmain.c */
/* Author Name: Jing Xiaoyuan, Li Jianping */
/* Creat Date: 12/20/99 */
/* Version : 1.0 */
/* Function : Ldp主进程文件,先定义了与LDP协议有关的所有全局变 */
/* 量,本进程收到的所有外部消息的处理函数,和主函数 */
/* History : 2001.8.30 WengQing add process for TCP Message */
/* delete process to timer 7 & 8 */
/* modify TCP_CON_IND process function */
/* hu.yonghong 2002-7-3 mod timer for mplspack1.0 */
/* 2002.11.07 for no mpls ldp routerid, protection lspidTlv.routerId == 0 */
/* 2003.1.26 wengqing change set timer1 */
/* 2003.6.24 Wengqing 增加对M2K的支持 */
/* 2003-7-29 shizhaohui增加对于HOP LSP建立时对FEC进程传过来nexthop的判断处理 */
/* 2003.12.30 fengjun 增加对全局待删除session链的初始化操作 */
/* 2003.12.30 直接调用CR控制快删除宏是不安全操作,改掉删除函数 */
/* 2004-1-6 lixia add for debug mpls */
/************************************************************************/
#define DEF_LDP_VAR
#include "ldpvars.h"
#undef DEF_LDP_VAR
extern void initldpdynmib( );
void func_GetInitCfg(mplsOAMLdpMessage_t *oammess);
void setlocallabel();
/********************************************************************/
/* */
/* 1.本文件中使用的公共子函数 */
/* */
/********************************************************************/
// wengqing 2001/03/21 LDP online modification
#ifdef ENABLE_LDP_ONLINE
short processLdpOnline(mplsOAMLdpMessage_t *oammess)
{
short value, i,ii;
switch(oammess->msgtype)
{
case MPLS_MIB_LDP_DEF_TRAFFIC:
if(oammess->data.trafficParamData.num != 0)
{
def_value.valid = 1;
def_value.defTraffic.freq = oammess->data.trafficParamData.paraData.freq;
def_value.defTraffic.pdr.pdr = oammess->data.trafficParamData.paraData.pdr;
def_value.defTraffic.pbs.pbs = oammess->data.trafficParamData.paraData.pbs;
def_value.defTraffic.cdr.cdr = oammess->data.trafficParamData.paraData.cdr;
def_value.defTraffic.cbs.cbs = oammess->data.trafficParamData.paraData.cbs;
def_value.defTraffic.ebs.ebs = oammess->data.trafficParamData.paraData.ebs;
def_value.defTraffic.weight = oammess->data.trafficParamData.paraData.weight;
def_value.defTraffic.flags.mark = oammess->data.trafficParamData.paraData.flag;
def_value.defTraffic.res = 0;
}
else
{
def_value.valid = 1;
def_value.defTraffic.freq = UNSPECIFIED;
def_value.defTraffic.pdr.pdr = 300000.0*48;
def_value.defTraffic.pbs.pbs = 180000.0*48;
}
value = MPLS_MIB_LDP_DEF_TRAFFIC;
break;
case MPLS_INTERNAL_PORT_VPI_VCI:
if(oammess->data.VpiVciData.num != 0)
{
def_value.inLabel.maxvpi =
oammess->data.VpiVciData.internalVpData.atmfAtmLayerMaxSvccVpi;
def_value.inLabel.minvpi = 0;
def_value.inLabel.maxvci =
(1 << oammess->data.VpiVciData.internalVpData.atmInterfaceMaxActiveVciBits)-1;
def_value.inLabel.minvci =
oammess->data.VpiVciData.internalVpData.atmfAtmLayerMinSvccVci;
#ifdef __BGS10_MPLS_DEBUG
printf("==== Get maxvpi %d, maxvci %d, minvpi %d, minvci %d====",
def_value.inLabel.maxvpi,def_value.inLabel.maxvci,
def_value.inLabel.minvpi,def_value.inLabel.minvci);
#endif
}
else
{
printf("no internal vpi vci");
}
value = MPLS_INTERNAL_PORT_VPI_VCI;
break;
case MPLS_MIB_LDP_LSR_ATTR:
if(oammess->data.lsrData.num != 0)
{
memcpy(&lsrAttr,&(oammess->data.lsrData),sizeof(lsrAttr));
switch (oammess->data.lsrData.PlatformType)
{
case 49: //1
local_platform = MPLS_PLATFORM_BX;
break;
case 50: //2
local_platform = MPLS_PLATFORM_AX;
break;
case 51: //3
local_platform = MPLS_PLATFORM_M1000;
break;
case 52: //3
local_platform = MPLS_PLATFORM_M2000;
break;
default:
local_platform = MPLS_PLATFORM_ROS;
break;
}
printf(" local_platform %d ",local_platform);
}
else
{
memset(&lsrAttr,0,sizeof(lsrAttr));
}
value = MPLS_MIB_LDP_LSR_ATTR;
break;
case MPLS_MIB_LDP_INTERFACE:
if(oammess->msgtype == MPLS_MIB_LDP_INTERFACE)
ldp_set_ifdata_oam(oammess); /* by hyh 02-7-17 */
value = MPLS_MIB_LDP_INTERFACE;
break;
case MPLS_MIB_LDP_ENTITY:
if(oammess->msgtype == MPLS_MIB_LDP_ENTITY)
ldp_set_entitydata_oam(oammess); /* by hyh 02-7-17 */
value = MPLS_MIB_LDP_ENTITY;
break;
case MPLS_MIB_LDP_CONFIG:
memcpy(&LdpConfigData,&(oammess->data.configData),
oammess->data.configData.num*sizeof(mplsPortData_t)+3*sizeof(unsigned char));
#ifdef DEBUG_LDP
#ifdef __BGS10_MPLS_DEBUG
printf("==== Module %d Get configdata successful.====",
selfLdpPid.module);
#endif
#endif
value = MPLS_MIB_LDP_CONFIG;
break;
case MPLS_CONTROL_MODE_AGGREGATE:
aggr_enable = oammess->data.CtrAggrData.aggregate;
value = MPLS_CONTROL_MODE_AGGREGATE;
break;
default: break;
}
return value;
}
#endif
/* wengqing 2001/03/21 LDP online modification end */
/* 2003.12.30 fengjun 增加对全局待删除session链的初始化操作 */
/********************************************************************/
/* */
/* 2.只被某一个case状态函数调用的子函数 */
/* */
/********************************************************************/
/******** 初始化全局变量 **********/
void InitWholeVariable()
{
unsigned char ii;
unsigned long tmid;
rt_change = 0;
/* 初始化扫描链 */
#if MPLS_PROTECT
lspcb_scan = 0;
fec_lspcb_scan.timer = 0;
fec_lspcb_scan.addr = 0;
fec_lspcb_scan.addrLen = 0;
fec_lspcb_scan.stop = 0;
#endif
HelloIndex = mplsINDEX_MAX;
SessionIndex = mplsINDEX_MAX;
PeerIndex = mplsINDEX_MAX;
SessPeerIndex = mplsINDEX_MAX;
ppp1 = ppp2 = ppp3=ppp4=ppp5=ppp10 = ppp11 = ppp12 = 0;
XC2=XC3=XC4=XC5=XC6=XC7=XC8=0;
cur_crreq_num = 0;
for (ii=0 ; ii< LDP_MESSAGE_MAXNUM; ii++)
messageId[ii] = 1;
MPLS_MEMSET(&def_value,0,sizeof(def_ldp_value));
def_value.valid = 1;
def_value.defTraffic.freq = UNSPECIFIED;
def_value.defTraffic.pdr.pdr = 300000.0*48;
def_value.defTraffic.pbs.pbs = 180000.0*48;
/* add by hyh 2002-7-2 */
MPLS_TIMER_INIT(ldptime_q);
mpls_init_queue();
/* end */
/* global initialization function */
MPLS_AVL_INIT_TREE(g_fec_avl_tree, fec_key_compare);
MPLS_AVL_INIT_TREE(g_crfec_avl_tree, crfec_key_compare);
MPLS_AVL_INIT_TREE(g_local_address_avl_tree, address_key_compare);
MPLS_AVL_INIT_TREE(g_sb_avl_tree, sb_key_compare);
MPLS_MEMSET(&ldpIndex,0,sizeof(mpls_ldpIndex));
aggr_init();
if(mpls_LdpMemInit()==MPLS_FALSE)
{
printf("mpls_err_log,mpls_LdpMemInit()==MPLS_FALSE");
mpls_LdpMemBlockFree();
return;
}
MPLS_SET_TIMER(LDP_HELLO_CHECK_INTERVAL,
(void *)ldpHelloSnd,
MPLS_NULL,
ldptime_q,
tmid);
#ifdef DEBUG_LDP
printf("==== LDP set Hello send Timer %d====",tmid);
#endif
MPLS_SET_TIMER(LDP_SESSION_CHECK_INTERVAL,
(void *)ldpSessionSnd,
MPLS_NULL,
ldptime_q,
tmid);
#ifdef DEBUG_LDP
printf("==== LDP set Session send Timer %d====",tmid);
#endif
MPLS_SET_TIMER(LDP_LIST_CHECK_INTERVAL,
(void *)ldpListCheck,
MPLS_NULL,
ldptime_q,
tmid);
#ifdef DEBUG_LDP
printf("==== LDP set list check Timer %d====",tmid);
#endif
MPLS_MEMSET(&g_up_list, 0, sizeof(mpls_up_list));
MPLS_MEMSET(&g_down_list, 0, sizeof(mpls_down_list));
MPLS_MEMSET(&g_up_lsp_list, 0, sizeof(mpls_lsp_list));
MPLS_MEMSET(&g_down_lsp_list, 0, sizeof(mpls_lsp_list));
MPLS_MEMSET(&g_fec_search_list, 0, sizeof(mpls_fec_search_list));
return;
}
/******* 获取初始配置 *********/
void func_GetInitCfg(mplsOAMLdpMessage_t *oammess)
{
short i;
switch(oammess->msgtype)
{
case MPLS_MIB_LDP_LSR_ATTR:
{
if(oammess->data.lsrData.num != 0)
{
switch (oammess->data.lsrData.PlatformType)
{
case 49:
local_platform = MPLS_PLATFORM_BX;
break;
case 50:
local_platform = MPLS_PLATFORM_AX;
break;
case 51:
local_platform = MPLS_PLATFORM_M1000;
break;
case 52:
local_platform = MPLS_PLATFORM_M2000;
break;
default:
local_platform = MPLS_PLATFORM_ROS;
break;
}
printf(" local_platform %d ",local_platform);
memcpy(&lsrAttr,&(oammess->data.lsrData),sizeof(oammess->data.lsrData));
}
else
{
memset(&lsrAttr,0,sizeof(lsrAttr));
}
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);
}
break;
case MPLS_MIB_LDP_INTERFACE:
{
ldp_set_ifdata_oam(oammess); /* by hyh 02-7-17 */
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);
}
break;
case MPLS_MIB_LDP_ENTITY:
{
ldp_set_entitydata_oam(oammess); /* by hyh 02-7-17 */
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);
}
break;
case MPLS_MIB_LDP_DEF_TRAFFIC:
{
if(oammess->data.trafficParamData.num != 0)
{
def_value.valid = 1;
def_value.defTraffic.freq = oammess->data.trafficParamData.paraData.freq;
def_value.defTraffic.pdr.pdr = oammess->data.trafficParamData.paraData.pdr;
def_value.defTraffic.pbs.pbs = oammess->data.trafficParamData.paraData.pbs;
def_value.defTraffic.cdr.cdr = oammess->data.trafficParamData.paraData.cdr;
def_value.defTraffic.cbs.cbs = oammess->data.trafficParamData.paraData.cbs;
def_value.defTraffic.ebs.ebs = oammess->data.trafficParamData.paraData.ebs;
def_value.defTraffic.weight = oammess->data.trafficParamData.paraData.weight;
def_value.defTraffic.flags.mark = oammess->data.trafficParamData.paraData.flag;
def_value.defTraffic.res = 0;
}
else
{
def_value.valid = 1;
def_value.defTraffic.freq = UNSPECIFIED;
def_value.defTraffic.pdr.pdr = 300000.0*48;
def_value.defTraffic.pbs.pbs = 180000.0*48;
}
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);
}
break;
case MPLS_INTERNAL_PORT_VPI_VCI:
{
if(oammess->data.VpiVciData.num != 0)
{
def_value.inLabel.maxvpi =
oammess->data.VpiVciData.internalVpData.atmfAtmLayerMaxSvccVpi;
def_value.inLabel.minvpi = 0;
def_value.inLabel.maxvci =
(1 << oammess->data.VpiVciData.internalVpData.atmInterfaceMaxActiveVciBits)-1;
def_value.inLabel.minvci =
oammess->data.VpiVciData.internalVpData.atmfAtmLayerMinSvccVci;
#ifdef __BGS10_MPLS_DEBUG
printf("==== Get maxvpi %d, maxvci %d, minvpi %d, minvci %d====",
def_value.inLabel.maxvpi,def_value.inLabel.maxvci,
def_value.inLabel.minvpi,def_value.inLabel.minvci);
#endif
}
else
{
printf("no internal vpi vci");
}
oammess->msgtype = MPLS_MIB_LDP_CONFIG;
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_CONFIG);
}
break;
case MPLS_MIB_LDP_CONFIG:
{
memcpy(&LdpConfigData,&(oammess->data.configData),
oammess->data.configData.num*sizeof(mplsPortData_t)+3*sizeof(unsigned char));
#ifdef DEBUG_LDP
#ifdef __BGS10_MPLS_DEBUG
printf("==== Module %d Get configdata successful.====",
selfLdpPid.module);
#endif
#endif
}
break;
default : break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -