#pragma once #include #include #include #include #include extern "C" { #include #include #include #include #include } extern unsigned int g_logger_to_stdout; extern unsigned int g_logger_level; extern unsigned int g_eal_inited; extern unsigned int g_keep_running; extern uint8_t g_ctrlzone_id; struct TunnatThreadInstance; #ifndef MR_TUNNAT_DEFAULT_CFG_FILE #define MR_TUNNAT_DEFAULT_CFG_FILE "/etc/mrtunnat.conf" #endif #ifndef MR_TUNNAT_DEFAULT_MNT_FILE #define MR_TUNNAT_DEFAULT_MNT_FILE "/var/run/mrzcpd/mrmonit.tunnat" #endif #ifndef MR_TUNNAT_DEFAULT_APPSYM #define MR_TUNNAT_DEFAULT_APPSYM "tunnat" #endif #ifndef MR_TUNNAT_LCORE_MAX #define MR_TUNNAT_LCORE_MAX 128 #endif #ifndef MR_TUNNAT_DEFAULT_SESSION_MAX #define MR_TUNNAT_DEFAULT_SESSION_MAX 8192 #endif #ifndef MR_TUNNAT_DEFAULT_SESSION_TUPLE4 #define MR_TUNNAT_DEFAULT_SESSION_TUPLE4 0 #endif #ifndef MR_TUNNAT_DEFAULT_SESSION_SLOT_MAX #define MR_TUNNAT_DEFAULT_SESSION_SLOT_MAX 4096 #endif #ifndef MR_TUNNAT_DEFAULT_NR_BURST #define MR_TUNNAT_DEFAULT_NR_BURST 32 #endif #ifndef MR_TUNNAT_DEFAULT_SESSION_EXPIRE_TIME #define MR_TUNNAT_DEFAULT_SESSION_EXPIRE_TIME 0 #endif #ifndef MR_TUNNAT_DEFAULT_IDLE_POLL_THRESHOLD #define MR_TUNNAT_DEFAULT_IDLE_POLL_THRESHOLD 1000000 #endif enum bridge_mode { MR_TUNNAT_BRIDGE_MODE_DISABLE, MR_TUNNAT_BRIDGE_MODE_ONE_ARM, MR_TUNNAT_BRIDGE_MODE_TWO_ARM, }; enum ctrlzone_addrinfo_type { MR_TUNNAT_CTRLZONE_ADDR_INFO_DISABLE, MR_TUNNAT_CTRLZONE_ADDR_INFO_TUNNEL, MR_TUNNAT_CTRLZONE_ADDR_INFO_REAL }; /* 全局句柄 */ struct TunnatInstance { /* 应用名称,用于注册MR4句柄 */ std::string str_appsym{MR_TUNNAT_DEFAULT_APPSYM}; /* MR4应用句柄 */ struct mr_instance * mr_instance{nullptr}; /* 配置文件路径 */ std::string cfgfile{MR_TUNNAT_DEFAULT_CFG_FILE}; /* 状态监测文件路径 */ std::string mntfile{MR_TUNNAT_DEFAULT_MNT_FILE}; /* 运行数据面线程数量 */ unsigned int nr_thread{1}; /* Burst数量 */ unsigned int nr_burst{MR_TUNNAT_DEFAULT_NR_BURST}; /* 运行数据面线程核心掩码 */ cpu_set_t coremask{}; /* IDLE POLL Threshold */ unsigned int idle_threshold{MR_TUNNAT_DEFAULT_IDLE_POLL_THRESHOLD}; /* 会话表使用四元组还是二元组 */ unsigned int sess_tb_order_by_tuple4{MR_TUNNAT_DEFAULT_SESSION_TUPLE4}; /* 会话表最大会话数 */ unsigned int sess_tb_nr_max_sessions{MR_TUNNAT_DEFAULT_SESSION_MAX}; /* 会话表槽数量 */ unsigned int sess_tb_nr_slots{MR_TUNNAT_DEFAULT_SESSION_SLOT_MAX}; /* 会话表日志追踪 */ unsigned int sess_tb_log_change{0}; /* 会话表波动检测 */ unsigned int sess_tb_check_update{0}; /* 会话表超时淘汰时间 */ unsigned int sess_tb_expire_time{MR_TUNNAT_DEFAULT_SESSION_EXPIRE_TIME}; /* 链路信息表最大会话数 */ unsigned int link_info_tb_nr_max_sessions{MR_TUNNAT_DEFAULT_SESSION_MAX}; /* 链路信息表槽数量 */ unsigned int link_info_tb_nr_slots{MR_TUNNAT_DEFAULT_SESSION_SLOT_MAX}; /* 链路信息表超时淘汰时间 */ unsigned int link_info_tb_expire_time{MR_TUNNAT_DEFAULT_SESSION_EXPIRE_TIME}; /* 控制域地址信息类型 */ enum ctrlzone_addrinfo_type ctrlzone_addr_info_type{MR_TUNNAT_CTRLZONE_ADDR_INFO_TUNNEL}; struct _devs { std::string str_devsym; mr_vdev * vdev_handler; mr_sendpath * vdev_sendpath; }; /* 物理设备列表(设备侧)*/ std::vector phydevs; /* 虚拟设备列表(应用侧)*/ std::vector virtdevs; /* 桥接模式 */ enum bridge_mode bridge_mode; /* VLAN Fliping 映射表 */ bool en_vlan_flipping{false}; uint16_t vlan_fliping_map[ETHER_MAX_VLAN_ID + 1]{0}; bool vlan_flipping_map_is_c_router[ETHER_MAX_VLAN_ID + 1]{false}; /* MAC Flipping */ bool mac_flipping[ETHER_MAX_VLAN_ID + 1]{false}; /* 线程运行句柄 */ TunnatThreadInstance * thread_instances[MR_SID_MAX]; /* 是否根据一个方向自动创建另一方向的Tunnel信息 */ bool is_auto_reserve_tunnel{true}; /* 是否向最近使用的隧道注入找不到隧道信息的包 */ bool is_use_recent_tunnel{true}; /* 是否启用链路信息记录表 */ bool is_use_link_info_table{false}; TunnatInstance() = default; ~TunnatInstance() = default; public: static struct TunnatInstance * TunnatInstanceGet(); }; class SessionTable; class TunnatThreadStat { public: enum stat_type_t { /* 统计,输入报文统计 */ TUNNAT_STAT_PKT_INPUT, TUNNAT_STAT_PKT_ENCAP_INPUT, TUNNAT_STAT_PKT_RAW_INPUT, /* 统计,原始报文输入类型 */ TUNNAT_STAT_VXLAN_INPUT, TUNNAT_STAT_QMAC_INPUT, TUNNAT_STAT_VLAN_FLIPING_INPUT, TUNNAT_STAT_BFD_INPUT, TUNNAT_STAT_INNER_ETHER_INPUT, TUNNAT_STAT_INNER_HDLC_INPUT, TUNNAT_STAT_INNER_PPP_INPUT, /* 统计,输出请求类型 */ TUNNAT_STAT_FORWARD_OUTPUT, TUNNAT_STAT_ENCAP_OUTPUT, TUNNAT_STAT_DIRECT_OUTPUT, TUNNAT_STAT_VIRTUAL_LINK_ID_OUTPUT, TUNNAT_STAT_FORWARD_RAW_OUTPUT, TUNNAT_STAT_FORWARD_TUNNEL_OUTPUT, TUNNAT_STAT_NO_SESSION_OUTPUT, /* 统计,会话表表项计数 */ TUNNAT_STAT_SESSION_ADD, TUNNAT_STAT_SESSION_REMOVE, TUNNAT_STAT_SESSION_NEED_UPDATE, /* 统计,关键失败事件 */ TUNNAT_STAT_ENCAP_FAIL_NO_SESSION, TUNNAT_STAT_ENCAP_USE_RECENT_SESSION, TUNNAT_STAT_VIRTUAL_LINK_ID_NO_SESSION, /* VLAN Fliping没有映射 */ TUNNAT_STAT_VLAN_FLIPING_NO_FLIP_MAP, TUNNAT_STAT_VLAN_FLIPING_INVALID_VLAN_ID, /* 最大表项 */ TUNNAT_STAT_MAX }; typedef uint64_t stat_value_t; protected: stat_value_t now_stat_value_[TUNNAT_STAT_MAX]; stat_value_t last_stat_value_[TUNNAT_STAT_MAX]; static __thread TunnatThreadStat * thread_stat_object_; public: TunnatThreadStat() : now_stat_value_{ 0 }, last_stat_value_{ 0 } {} stat_value_t StatValueGet(enum stat_type_t stat_type) { return now_stat_value_[stat_type]; } stat_value_t StatSpeedGet(enum stat_type_t stat_type) { stat_value_t _speed = now_stat_value_[stat_type] - last_stat_value_[stat_type]; last_stat_value_[stat_type] = now_stat_value_[stat_type]; return _speed; } void StatValueSet(enum stat_type_t stat_type, stat_value_t value) { now_stat_value_[stat_type] = value; } void StatValueAdd(enum stat_type_t stat_type, stat_value_t value) { now_stat_value_[stat_type] += value; } static void ThreadStatObjectSet(TunnatThreadStat * th_stat_object) { thread_stat_object_ = th_stat_object; } static TunnatThreadStat * ThreadStatObjectGet() { return thread_stat_object_; } static std::string StrStatType(enum stat_type_t stat_type) { static const char * __str_stat_type[] = { [TUNNAT_STAT_PKT_INPUT] = "TUNNAT_STAT_PKT_INPUT", [TUNNAT_STAT_PKT_ENCAP_INPUT] = "TUNNAT_STAT_PKT_ENCAP_INPUT", [TUNNAT_STAT_PKT_RAW_INPUT] = "TUNNAT_STAT_PKT_RAW_INPUT", [TUNNAT_STAT_VXLAN_INPUT] = "TUNNAT_STAT_VXLAN_INPUT", [TUNNAT_STAT_QMAC_INPUT] = "TUNNAT_STAT_QMAC_INPUT", [TUNNAT_STAT_VLAN_FLIPING_INPUT] = "TUNNAT_STAT_VLAN_FLIPING_INPUT", [TUNNAT_STAT_BFD_INPUT] = "TUNNAT_STAT_BFD_INPUT", [TUNNAT_STAT_INNER_ETHER_INPUT] = "TUNNAT_STAT_INNER_ETHER_INPUT", [TUNNAT_STAT_INNER_HDLC_INPUT] = "TUNNAT_STAT_INNER_HDLC_INPUT", [TUNNAT_STAT_INNER_PPP_INPUT] = "TUNNAT_STAT_INNER_PPP_INPUT", [TUNNAT_STAT_FORWARD_OUTPUT] = "TUNNAT_STAT_FORWARD_OUTPUT", [TUNNAT_STAT_ENCAP_OUTPUT] ="TUNNAT_STAT_ENCAP_OUTPUT", [TUNNAT_STAT_DIRECT_OUTPUT] ="TUNNAT_STAT_DIRECT_OUTPUT", [TUNNAT_STAT_VIRTUAL_LINK_ID_OUTPUT] = "TUNNAT_STAT_VIRTUAL_LINK_ID_OUTPUT", [TUNNAT_STAT_FORWARD_RAW_OUTPUT] = "TUNNAT_STAT_FORWARD_RAW_OUTPUT", [TUNNAT_STAT_FORWARD_TUNNEL_OUTPUT] = "TUNNAT_STAT_FORWARD_TUNNEL_OUTPUT", [TUNNAT_STAT_NO_SESSION_OUTPUT] = "TUNNAT_STAT_NO_SESSION_OUTPUT", [TUNNAT_STAT_SESSION_ADD] = "TUNNAT_STAT_SESSION_ADD", [TUNNAT_STAT_SESSION_REMOVE] = "TUNNAT_STAT_SESSION_REMOVE", [TUNNAT_STAT_SESSION_NEED_UPDATE] = "TUNNAT_STAT_SESSION_NEED_UPDATE", [TUNNAT_STAT_ENCAP_FAIL_NO_SESSION] = "TUNNAT_STAT_ENCAP_FAIL_NO_SESSION", [TUNNAT_STAT_ENCAP_USE_RECENT_SESSION] = "TUNNAT_STAT_ENCAP_USE_RECENT_SESSION", [TUNNAT_STAT_VIRTUAL_LINK_ID_NO_SESSION] = "TUNNAT_STAT_VIRTUAL_LINK_ID_NO_SESSION", [TUNNAT_STAT_VLAN_FLIPING_NO_FLIP_MAP] = "TUNNAT_STAT_VLAN_FLIPING_NO_FLIP_MAP", [TUNNAT_STAT_VLAN_FLIPING_INVALID_VLAN_ID] = "TUNNAT_STAT_VLAN_FLIPING_INVALID_VLAN_ID", [TUNNAT_STAT_MAX] = "TUNNAT_STAT_MAX" }; assert(stat_type < TUNNAT_STAT_MAX); return __str_stat_type[stat_type]; } }; #define TUNNAT_THREAD_STAT_SET(_item, _value) \ do { \ TunnatThreadStat * _stat_object = TunnatThreadStat::ThreadStatObjectGet(); \ _stat_object->StatValueSet(TunnatThreadStat::_item, _value); \ }while(0) #define TUNNAT_THREAD_STAT_ADD(_item, _value) \ do { \ TunnatThreadStat * _stat_object = TunnatThreadStat::ThreadStatObjectGet(); \ _stat_object->StatValueAdd(TunnatThreadStat::_item, _value); \ }while(0) class SessionTable; class LinkInfoTable; struct TunnatThreadInstance { unsigned int thread_id; TunnatInstance * instance; SessionTable * ss_table; LinkInfoTable * link_info_table; TunnatThreadStat * th_stat; TunnelContainerArray * tun_container_array; };