⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fec.c

📁 技术文件名称:MPLSv1.0软件模块测试规程
💻 C
📖 第 1 页 / 共 5 页
字号:
/* ****************************************************************** */
/* 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 + -