📄 fec.c
字号:
/* ****************************************************************** */
/* Product Name:MPLS */
/* Modul Name: PROTOCOL File Name : fec.c */
/* Creat Date: 01.12.03 Author : shi.zhaohui */
/* Version: 1.0 */
/* History: kong.yong */
/* weng.qing */
/* szh modfiy search route in net ipaddr 2002-1-28 17:15 */
/* deal with alarm sbp 2002-1-14 */
/* hop lsp priority should be 5, sbp 2002-2-9 */
/* 2002.11.4 Hyh v2.1.3b search er lsp route */
/* szh 2002-11-8 mod SearchErRoute(FecMsg *VarIn) */
/* szh 2002-11-8 mod RtGetFrZef( )->*Mpls_RtGetFrZef( ) */
/*2002.11.28 sbp 处理HOP ADDRESS 与hop no 的关系*/
/* sbp 2002-12-6 处理路由动荡和LSP备份 */
/* sbp 2002-12-18 simplify the time out process */
/* sbp 2002-12-18 处理ETHIF板的相关数据 */
/* sbp 2002-12-21 dynamic lsp for lic */
/* sbp 2002-12-25 alarm and request data */
/* sbp 2002-12-27 正确连接链表及对nh=dst的完善 */
/* sbp 2003-1-9 内存管理整理 */
/* sbp 2003-1-16 同一优先级同一目的地只能建10调TUNNEL */
/* sbp 2003-1-21 修改tunnel状态处理*/
/* sbp 2003-2-11 模块瞬断,告警处理 */
/* sbp 2003-2-17 修改LSP起点和落地点的算法 */
/* sbp 2003-2-22 修改链表处理 */
/* sbp 2003-3-20 判断目的地址和下一跳地址是否存在 */
/* sbp 2003-3-24 连表严格判断 */
/* sbp 2003-5-13 LDP瞬断不处理 */
/* 2003.6.24 Wengqing 增加对M2K的支持 */
/* szh 2003-6-25 mod 定时时间由10秒改成5秒 */
/* 2003-7-10 szh mod 对于M2000来说,大于8号模块的业务板要减1 */
/* 2003-7-29 shizhaohui 修改查询模块号函数以及对于类似GEI等板类型的板子模块和
端口需要特殊处理
/* 2003-8-7 szhmod M2000上大于8的模块号特殊处理
/* 2003-8-13 szh mod GEI等板类型的告警要与LIC告警区分开
/* 2003-9-3 szh mod 在查找路由的函数中用MplsPortDataTable1代替MplsPortDataTable
/* 2003-9-8 szh mod searchlocalmod(),针对ethi口和光口的ifindex可能重复进行处理
/* 2003-9-18 szh mod alarm process
/* 2003-11-18 lixia mod timer8pro,crtofecmsg,mplsLspAddLink,crlspaddpro for protect timer
/* 2003-12-3 lixia mod fecAlarm_Timepro for dele info of unavailable board
/* 2003-12-10 lixia mod for debug mpls
/* 2004-9-17 lixia mod changeAlarm2ModuleAlarm,修改对瞬断的处理。
/**********************************************************************/
#include "mplslsp.h"
#include "mplstype1.h"
#include "fec.h"
#include "sbmessg.h"
#include "mplspara.h"
#include "mplsni.h"
#include "ldpvars.h"
/* In 2.1.3b this value is 256, in 2.2 it is 1024 :2003-5-23 11:03:xgxu */
#ifdef __INSTALL_V22
#define SB_MAX_IFINDEX_NUM 1024
#else
#define SB_MAX_IFINDEX_NUM 256
#endif
static unsigned char nexthop_change_enable=0;
#define SETUP_FIRST_TIMEOUT 600
#define SETUP_SECOND_TIMEOUT 900
#define SETUP_THIRD_TIMEOUT 1200
#define RTE_TUNNEL_TIMEOUT 1
#define NEXTHOP_DELAY_TIME 200 /* 20s*/
#define MPLS_ROUTE_MAX 1000
#define MPLS_LSP_HASH_TABLE_SIZE 256
mpls_SwitchAttribute Switcher;
MPLS_REQ fecLspRte;
unsigned short rteIndex=0;
FecMsg fecmsgstr;
lsp_sb_t lspSb[OAM_MYSBOARD_MAX];
extern unsigned char mplsOamLocalPlatformType;
extern struct_netifTable nif[ NI_MAX ];
extern mplsFecFilterAdvertiseLbls_t mplsFecFilterAdvEntry;
extern mplsLspSetup_t mplsLspSetupEntry;
extern PID mplsManagerOamPID;
extern struct mpls_timeout_q *mpls_oam_timer_q;
extern RoutEntry *Mpls_RtGetFrZef( IPaddr dest);
extern RoutEntry *mpls_match_route(IPaddr mpls_dest,ulong mpls_mask);
extern RoutEntry *mpls_search_route(IPaddr mpls_dest,ulong mpls_mask);
extern void mplsAlarmNiData();
extern unsigned char fecLdpGetCardTypeOnModule(unsigned char module);
extern unsigned char fecLdpGetCardTypeOnIfIndexAndIpaddr(unsigned short ifIndex,unsigned long ipaddr);
extern short mplsQosFilterNoBindingAddorDelete(unsigned short filterNo,unsigned short lspNo, unsigned char operaType);
extern mplsPort_t MplsPortDataTable1;
void changeAlarm2ModuleAlarm(FM_MIBCTL_Struc **AlarmMsg,unsigned char platform); /* for alarm sbp 2002-1-14 */
void rteaddlsppro(unsigned long addr, unsigned long netmask);
void rtedellsppro(unsigned long addr, unsigned long netmask);
void rteaddfecfilterpro(unsigned long addr, unsigned long netmask);
int GetNetIfidx( unsigned long LocalIpaddr );
unsigned char masktoprelen(unsigned long netmask);
void rtechanfecpro(ROUTEMESSAGE_UPDATE *in);
unsigned char findlspstr( void *in, void **out, FecMsg *msgstr, unsigned char lsptype);
void delhoplsppro(FecMsg *in);
void delcrlsppro(FecMsg *in);
void delpro(FecMsg *in);
void studycrlsppro(FecMsg *in);
void studyhoplsppro(FecMsg *in);
void studypro(FecMsg *in);
void responsepro(FecMsg *in);
void inquirertepro(FecMsg *in);
void fectoldppro(FecMsg *in);
unsigned short setdelaytime( unsigned short delayno);
void crtofecmsg(mplsErLspTable_t *in, FecMsg *out);
void hoptofecmsg(mplsHopLspTable_t *in, FecMsg *out);
void timer8pro(mplsErLspTable_t *);
short jugetopoborder(unsigned long Ipaddress, unsigned long size);
short searchlocaltlv(unsigned long Ipaddress, unsigned long size, ulong *nif_mask);
unsigned char SearchErRoute(FecMsg *VarIn,unsigned char nodetype);
unsigned short GetNiToRouteType(unsigned short ninum);
void crlspdelpro(FecMsg *msg, mplsErLspTable_t *in);
void crlspaddpro(FecMsg *msg, mplsErLspTable_t *in);
void crlsppro(mplsErLspTable_t *in, unsigned char opertype);
void lspdelspecpro(FecMsg *msg, void *in, unsigned char lsptype);
void lspdelpro_statdown(FecMsg *msg, void *in, unsigned char lsptype);
void lspdelpro_statup(FecMsg *msg, void *in, unsigned char lsptype);
void fectolsppro(void *in, unsigned char opertype, unsigned char lsptype);
void lspnumpro(unsigned char module, unsigned char type);
void crsetupvaluepro(FecMsg *out, mplsErLspTable_t *in);
unsigned char nodetypechanpro2(unsigned short type);
void findcrlspstr(void *in, void *out, unsigned long addr, unsigned long netmask);
void rtedelcrlspuppro(mplsErLspTable_t *in,unsigned char operType);
void nexthopchanproc(void *in, unsigned char type);
void timer7pro(mplsErLspTable_t *);
void mplsTimer2Proc(MPLS_REQ *in);
unsigned short accountsbmod(void *in, unsigned char type, unsigned short ifindex);
unsigned short ldp_accountsbmod(FecMsg *in, unsigned short ifindex);
unsigned char mplsFecLspRteProcess(unsigned char oper, unsigned char msgType, void *data);
unsigned char mplsFecResetLspRte();
void fectocrlspnexthopchanpro(mplsErLspTable_t *in);
/*void fecAlarmPro(FM_MIBCTL_Struc *alarmmsg ); for alarm sbp 2002-1-14 */
void mplsFecLspRteInit(); /* init fec lsp and route buffer sbp 2002-6-25 */
uchar mplsLspAddLink(mplsErLspTable_t *crlspstr,uchar reason,uchar opertype);
unsigned char mplsLspJudgeDuplicate(unsigned char operType,lsptag_t *lspData);
unsigned char mplsFecReleaseBuf();
void LdpToFec(void *in);
void tunnelDelaypro(mplsErLspTable_t *in);
void crLspListSbOper(mplsErLspTable_t *lspPtr,unsigned char opertype);
void RteLsppro_ex(unsigned long addr, unsigned long netmask,unsigned long nexthop,unsigned char opertpye);
void RteTunnelPro_ValidHop(mplsErLspTable_t *in);
void RteTunnelPro_Dest(mplsErLspTable_t *in);
void RteTunnel_Timepro();
void crLspListNhOper(mplsErLspTable_t *lspPtr,unsigned char opertype);
void mplsLspAddrPushLink(mplsErLspTable_t *lspPtr,unsigned char valid,unsigned char lspType);
void mplsLspListDel(mplsErLspTable_t *in);
unsigned long RteTunnelTimerId=0;
unsigned char alarm_judgecardtype( unsigned char module);
void testMplsTimer3Pro();
#if _MPLS_DEBUG
static unsigned short cr_lsp_num_test=0;
extern unsigned long mplsDebug[50];
#endif
PROTO_MEM_MGR MPLS_OAM_MEM[MAX_OAM_UTIL_MEM_TYPES];
mplsFecAlarm_t fecAlarm[OAM_MYSBOARD_MAX]; /* sbp 2003-4-29 */
unsigned long alarmDataReqTimerId=0;
/* memory initilize sbp 2002-12-16 */
unsigned short mplsFecMemInit()
{
MPLS_OAM_MEM[IUMEM_OAM_TUNNEL].alloc_type = ALLOC_TYPE_FROM_MMQ;
MPLS_OAM_MEM[IUMEM_OAM_TUNNEL].mmq_max = LSP_MAX_NUMBER;
MPLS_OAM_MEM[IUMEM_OAM_TUNNEL].mmq_size = sizeof(mplsErLspTable_t);
if(MPLS_INIT_MMGR(MPLS_OAM_MEM[IUMEM_OAM_TUNNEL]) != LSP_MAX_NUMBER)
{
DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_LSP,"mpls_err_log LSP_MAX_NUMBER\n ");
printf("mpls_err_log LSP_MAX_NUMBER ");
return(MPLS_FALSE);
}
MPLS_OAM_MEM[IUMEM_OAM_FILTER].alloc_type = ALLOC_TYPE_FROM_MMQ;
MPLS_OAM_MEM[IUMEM_OAM_FILTER].mmq_max = FILTER_MAX_NUM;
MPLS_OAM_MEM[IUMEM_OAM_FILTER].mmq_size = sizeof(QosMulitFieldFilter_t);
if(MPLS_INIT_MMGR(MPLS_OAM_MEM[IUMEM_OAM_FILTER]) != FILTER_MAX_NUM)
{
DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_LSP,"mpls_err_log FILTER_MAX_NUM\n ");
printf("mpls_err_log FILTER_MAX_NUM ");
return(MPLS_FALSE);
}
MPLS_OAM_MEM[IUMEM_OAM_LSP_LIST].alloc_type = ALLOC_TYPE_FROM_MMQ;
MPLS_OAM_MEM[IUMEM_OAM_LSP_LIST].mmq_max = 4*LSP_MAX_NUMBER;
MPLS_OAM_MEM[IUMEM_OAM_LSP_LIST].mmq_size = sizeof(lsp_nh_t);
if(MPLS_INIT_MMGR(MPLS_OAM_MEM[IUMEM_OAM_LSP_LIST]) != (4*LSP_MAX_NUMBER))
{
DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_LSP,"mpls_err_log 2*FILTER_MAX_NUM\n ");
printf("mpls_err_log 2*FILTER_MAX_NUM ");
return(MPLS_FALSE);
}
MPLS_OAM_MEM[IUMEM_OAM_32byte].alloc_type = ALLOC_TYPE_FROM_MMQ;
MPLS_OAM_MEM[IUMEM_OAM_32byte].mmq_max = 4*LSP_MAX_NUMBER;
MPLS_OAM_MEM[IUMEM_OAM_32byte].mmq_size = 32*sizeof(unsigned char);
if(MPLS_INIT_MMGR(MPLS_OAM_MEM[IUMEM_OAM_32byte]) != 4*LSP_MAX_NUMBER)
{
DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_LSP,"mpls_err_log 4*LSP_MAX_NUMBER\n ");
printf("mpls_err_log LSP_MAX_NUMBER ");
return(MPLS_FALSE);
}
/* sbp 2003-1-14 only 10 lsps to the same dst with prio */
MPLS_OAM_MEM[IUMEM_OAM_LSP_PRIO].alloc_type = ALLOC_TYPE_FROM_MMQ;
MPLS_OAM_MEM[IUMEM_OAM_LSP_PRIO].mmq_max = LSP_MAX_NUMBER;
MPLS_OAM_MEM[IUMEM_OAM_LSP_PRIO].mmq_size = sizeof(lsp_prio_t);
if(MPLS_INIT_MMGR(MPLS_OAM_MEM[IUMEM_OAM_LSP_PRIO]) != LSP_MAX_NUMBER)
{
DEBUG_OUT(DEBUG_OWNER_MPLS, DEBUG_LEVEL_MPLS_LSP,"mpls_err_log PRIO LSP_MAX_NUMBER\n ");
printf("mpls_err_log LSP_MAX_NUMBER ");
return(MPLS_FALSE);
}
memset(fecAlarm,0,OAM_MYSBOARD_MAX*sizeof(mplsFecAlarm_t)); /* sbp 2003-4-29 */
return MPLS_TRUE;
}
/***********************************************************************/
/* FUNCTION NAME : fectolsppro() */
/* DESCRIPTION: : create or delete lsp to ldp */
/* INPUT : *in, opertype,lsptype */
/* OUTPUT : void */
/* AUTHOR/DATE : shi.zhaohui/ 01.12.04 */
/* GLOBAL : none */
/* NOTE : .. */
/* History : kong.yong weng.qing */
/************************************************************************/
void fectolsppro(void *in, unsigned char opertype, unsigned char lsptype)
{
mplsErLspTable_t *erlspstr;
switch(lsptype)
{
case MPLS_CR_LSP_TYPE:
erlspstr = (mplsErLspTable_t *)in;
crlsppro(erlspstr, opertype);
break;
default : break;
}
return;
}
/************************************************************************/
/* FUNCTION NAME : mpls_compare_string() */
/* DESCRIPTION: : compare string */
/************************************************************************/
unsigned char mpls_compare_string( char * s, char * t)
{
char a,b;
while (*s && *t)
{
a = *s; b = *t;
if (islower(b))
b = toupper(b);
if (a != b)
return FALSE;
s++;
t++;
}
return TRUE;
}
/************************************************************************/
/* FUNCTION NAME : searchlocalmod() */
/* DESCRIPTION: : search local module,return module No. and card type */
/* high unsigned char: module No. , low unsigned char: card type */
/* INPUT : Ipaddress, size */
/* OUTPUT : module No. and card type */
/* AUTHOR/DATE : shi.zhaohui / 01.12.04 */
/* GLOBAL : none */
/* NOTE : .. */
/* sbp 2002-6-29 modify to return card type, too */
/* sbp 2002-12-21 simplify the function and asure lsp setup right */
/* sbp 2003-2-17 修改LSP起点和落地点的算法 */
/* 2003-7-9 szh 增加对M2000业务板>8模块的处理
/************************************************************************/
unsigned short searchlocalmod(unsigned long Ipaddress, unsigned short ifindex)
{
unsigned short i,t,m,n;
unsigned char module = 255;
unsigned char cardType = 255;
char str[4];
unsigned short invalid = 1;
unsigned short samod = 0;
memset(str,0,4*sizeof(char));
/* eth lic gei */
for(i = 0 ; i < NI_MAX; i++)
{
memcpy(str,nif[i].ni_name,4*sizeof(char));
if((nif[i].RowStatus == MPLS_VAL_RowStatus_active)
&&((mpls_compare_string("ETH",str))||
(mpls_compare_string("LIC",str))||
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -