diff options
| author | Qiuwen Lu <[email protected]> | 2019-07-23 10:37:50 +0600 |
|---|---|---|
| committer | Qiuwen Lu <[email protected]> | 2019-07-23 10:37:50 +0600 |
| commit | c3e1f674d289754e14bab9f72c71d22a09fd911f (patch) | |
| tree | bcbb2885ebab9ab832bab738871cb4559c27af49 /tunnat | |
| parent | b50c1e9f5b5b116649c9f39b0d187e6922914047 (diff) | |
增加线路震荡的计数统计,当同一四元组(二元组)从不同线路中接收时记录统计计数。
Diffstat (limited to 'tunnat')
| -rw-r--r-- | tunnat/CMakeLists.txt | 8 | ||||
| -rw-r--r-- | tunnat/include/tunnat.h | 4 | ||||
| -rw-r--r-- | tunnat/include/tunnel.h | 10 | ||||
| -rw-r--r-- | tunnat/src/core.cc | 4 | ||||
| -rw-r--r-- | tunnat/src/runtime.cc | 20 | ||||
| -rw-r--r-- | tunnat/src/tunnel.cc | 28 | ||||
| -rw-r--r-- | tunnat/test/TestSession.cc | 65 |
7 files changed, 104 insertions, 35 deletions
diff --git a/tunnat/CMakeLists.txt b/tunnat/CMakeLists.txt index 748f18a..0b9eca0 100644 --- a/tunnat/CMakeLists.txt +++ b/tunnat/CMakeLists.txt @@ -17,7 +17,7 @@ target_include_directories(mrtunnat PRIVATE include) install(TARGETS mrtunnat RUNTIME DESTINATION bin COMPONENT Program) # test -#add_executable(TestSession test/TestSession.cc src/session.cc src/tunnel.cc) -#target_link_libraries(TestSession gtest infra ${SYSTEMD_LIBRARIES} ${DPDK_LIBRARY}) -#target_link_libraries(TestSession MESA_htable_static MESA_prof_load_static) -#target_include_directories(TestSession PRIVATE include) +add_executable(TestSession test/TestSession.cc src/session.cc src/tunnel.cc) +target_link_libraries(TestSession gtest infra ${SYSTEMD_LIBRARIES} ${DPDK_LIBRARY}) +target_link_libraries(TestSession MESA_htable_static MESA_prof_load_static) +target_include_directories(TestSession PRIVATE include) diff --git a/tunnat/include/tunnat.h b/tunnat/include/tunnat.h index 61726de..b7408d0 100644 --- a/tunnat/include/tunnat.h +++ b/tunnat/include/tunnat.h @@ -93,6 +93,8 @@ struct TunnatInstance 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}; @@ -171,6 +173,7 @@ public: /* 统计,会话表表项计数 */ 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, @@ -250,6 +253,7 @@ public: [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", diff --git a/tunnat/include/tunnel.h b/tunnat/include/tunnel.h index 576e876..fcd7aba 100644 --- a/tunnat/include/tunnel.h +++ b/tunnat/include/tunnel.h @@ -193,6 +193,8 @@ public: size_t ToHashKey(char * out_hashkey, size_t sz_hash_key) const override { return 0; } cJSON * ToJSON() const override { return nullptr; } + bool operator==(const TunVlanFlipping & rhs); + public: static int PacketForwardModify(const char * pkt, unsigned int pkt_len); static int MbufMetaForwardModify(marsio_buff_t * mbuf); @@ -347,7 +349,7 @@ public: protected: TunVxlan tun_vxlan_object_; TunQMac tun_qmac_object_; - TunVlanFlipping tun_vlan_bridge_object_; + TunVlanFlipping tun_vlan_flipping_object; TunInnerEther tun_inner_ether_; TunInnerHDLC tun_inner_hdlc_; TunInnerPPP tun_inner_ppp_; @@ -362,7 +364,7 @@ public: TunnelContainer(const TunnelContainer & orin) : tun_vxlan_object_(orin.tun_vxlan_object_), tun_qmac_object_(orin.tun_qmac_object_), - tun_vlan_bridge_object_(orin.tun_vlan_bridge_object_), + tun_vlan_flipping_object(orin.tun_vlan_flipping_object), tun_inner_ether_(orin.tun_inner_ether_), tun_inner_hdlc_(orin.tun_inner_hdlc_), tun_inner_ppp_(orin.tun_inner_ppp_), @@ -376,7 +378,7 @@ public: { this->tun_vxlan_object_ = orin.tun_vxlan_object_; this->tun_qmac_object_ = orin.tun_qmac_object_; - this->tun_vlan_bridge_object_ = orin.tun_vlan_bridge_object_; + this->tun_vlan_flipping_object = orin.tun_vlan_flipping_object; this->tun_inner_ether_ = orin.tun_inner_ether_; this->tun_inner_hdlc_ = orin.tun_inner_hdlc_; this->tun_inner_ppp_ = orin.tun_inner_ppp_; @@ -388,6 +390,8 @@ public: } bool operator==(const TunnelContainer & rhs); + bool operator!=(const TunnelContainer & rhs) { return !operator==(rhs); }; + virtual size_t ToHashKey(char * out_hashkey, size_t sz_hash_key) const { return tun_object_->ToHashKey(out_hashkey, sz_hash_key); diff --git a/tunnat/src/core.cc b/tunnat/src/core.cc index 3ca7cfb..1f9bf11 100644 --- a/tunnat/src/core.cc +++ b/tunnat/src/core.cc @@ -207,6 +207,10 @@ int tunnat_session_setup(TunnatInstance * instance) MESA_load_profile_uint_def(instance->cfgfile.c_str(), "tunnat", "trace_ss_table_change", &instance->sess_tb_log_change, instance->sess_tb_log_change); + /* 检测流量迁移 */ + MESA_load_profile_uint_def(instance->cfgfile.c_str(), "tunnat", "check_ss_update", + &instance->sess_tb_check_update, instance->sess_tb_check_update); + /* 链路信息表 */ MESA_load_profile_uint_def(instance->cfgfile.c_str(), "tunnat", "link_info_nr_max_sessions", &instance->link_info_tb_nr_max_sessions, instance->link_info_tb_nr_max_sessions); diff --git a/tunnat/src/runtime.cc b/tunnat/src/runtime.cc index 139b69d..8f5363a 100644 --- a/tunnat/src/runtime.cc +++ b/tunnat/src/runtime.cc @@ -113,6 +113,21 @@ static void __phy_to_virt_link_info_check(TunnatInstance * instance, TunnatThrea ctrlzone->virtual_link_id = link_id; } +static int __phy_to_virt_session_update_check(TunnatInstance * instance, TunnatThreadInstance * th_instance, + TunnelContainerArray & tun_array, SessionEntry * ss_entry) +{ + /* Only check if outer tunnel is changed */ + auto & outer_tunnel_in_ss = ss_entry->tun_array.GetOuterTunContainer(); + auto & outer_tunnel_in_tun = tun_array.GetOuterTunContainer(); + + if (outer_tunnel_in_ss != outer_tunnel_in_tun) + { + TUNNAT_THREAD_STAT_ADD(TUNNAT_STAT_SESSION_NEED_UPDATE, 1); + } + + return 0; +} + static int __phy_to_virt_session_check(TunnatInstance * instance, TunnatThreadInstance * th_instance, marsio_buff_t * mbuf, TunnelContainerArray & tun_array) { @@ -136,6 +151,11 @@ static int __phy_to_virt_session_check(TunnatInstance * instance, TunnatThreadIn if (ss_entry != nullptr) { + if (instance->sess_tb_check_update) + { + __phy_to_virt_session_update_check(instance, th_instance, tun_array, ss_entry); + } + return RT_SUCCESS; } diff --git a/tunnat/src/tunnel.cc b/tunnat/src/tunnel.cc index 8ffde2b..ab3f366 100644 --- a/tunnat/src/tunnel.cc +++ b/tunnat/src/tunnel.cc @@ -455,6 +455,11 @@ uint16_t TunVlanFlipping::vlan_flipping_map_lookup(uint16_t le_vlan_id) return result; } +bool TunVlanFlipping::operator==(const TunVlanFlipping & rhs) +{ + return vlan_id_ == rhs.vlan_id_ && vlan_id_map_ == rhs.vlan_id_map_; +} + extern "C" { #include <ldbc.h> @@ -652,7 +657,7 @@ int TunnelContainer::PacketParse(const char * pkt, unsigned int pkt_len, break; case TUNNEL_TYPE_VLAN_FLIPPING: - ret = tun_vlan_bridge_object_.PacketParse(pkt, pkt_len); + ret = tun_vlan_flipping_object.PacketParse(pkt, pkt_len); break; case TUNNEL_TYPE_ETHER: @@ -684,7 +689,7 @@ int TunnelContainer::PacketParse(const char * pkt, unsigned int pkt_len, goto out; guess: - ret = tun_vlan_bridge_object_.PacketParse(pkt, pkt_len); + ret = tun_vlan_flipping_object.PacketParse(pkt, pkt_len); if (ret >= 0) { this_layer_type = TUNNEL_TYPE_VLAN_FLIPPING; @@ -718,7 +723,7 @@ Tunnel * TunnelContainer::tun_object_get() { case TUNNEL_TYPE_G_VXLAN:return &tun_vxlan_object_; case TUNNEL_TYPE_G_MAC_IN_MAC:return &tun_qmac_object_; - case TUNNEL_TYPE_VLAN_FLIPPING: return &tun_vlan_bridge_object_; + case TUNNEL_TYPE_VLAN_FLIPPING: return &tun_vlan_flipping_object; case TUNNEL_TYPE_ETHER:return &tun_inner_ether_; case TUNNEL_TYPE_PPP:return &tun_inner_ppp_; case TUNNEL_TYPE_HDLC:return &tun_inner_hdlc_; @@ -792,7 +797,11 @@ void TunnelContainer::ReverseAddress() bool TunnelContainer::operator==(const TunnelContainer &rhs) { - if(this_layer_type != rhs.this_layer_type) return false; + if (this_layer_type != rhs.this_layer_type) + { + return false; + } + switch (this_layer_type) { case TUNNEL_TYPE_G_VXLAN: @@ -803,7 +812,12 @@ bool TunnelContainer::operator==(const TunnelContainer &rhs) { return tun_inner_ether_ == rhs.tun_inner_ether_; } - default: assert(0); + case TUNNEL_TYPE_VLAN_FLIPPING: + { + return tun_vlan_flipping_object == rhs.tun_vlan_flipping_object; + } + + default:assert(0); } return false; @@ -815,13 +829,13 @@ void TunnelContainer::MbufMetaPreParse(marsio_buff_t * mbuf, tunnel_type tunnel_ { case TUNNEL_TYPE_UNKNOWN: goto guess; - case TUNNEL_TYPE_VLAN_FLIPPING:tun_vlan_bridge_object_.MbufMetaPreParse(mbuf); + case TUNNEL_TYPE_VLAN_FLIPPING:tun_vlan_flipping_object.MbufMetaPreParse(mbuf); break; default: return; } guess: - tun_vlan_bridge_object_.MbufMetaPreParse(mbuf); + tun_vlan_flipping_object.MbufMetaPreParse(mbuf); return; } diff --git a/tunnat/test/TestSession.cc b/tunnat/test/TestSession.cc index 422f532..a2ca3be 100644 --- a/tunnat/test/TestSession.cc +++ b/tunnat/test/TestSession.cc @@ -8,10 +8,12 @@ unsigned int g_keep_running = 1; uint8_t g_ctrlzone_id = 0; __thread TunnatThreadStat * TunnatThreadStat::thread_stat_object_; +struct TunnatInstance g_test_tunnat_instance; struct TunnatInstance * TunnatInstance::TunnatInstanceGet() { - return nullptr; + g_test_tunnat_instance.sess_tb_log_change = 1; + return &g_test_tunnat_instance; } class TestSessionEnv : public testing::Environment @@ -31,23 +33,38 @@ public: } }; -int SessionKeyGenerate(SessionKey & key,enum SessionKeyType type) +SessionKey SessionKeyGenerateTuple2(enum SessionKeyType type) { - key.type=type; - switch(type) - { - case SESSION_KEY_TYPE_IPV4: - key.address_as_v4_.s_in_addr.s_addr = rand(); - key.address_as_v4_.d_in_addr.s_addr = rand(); - break; - case KEY_TYPE_IPV6: - break; - default: - assert(0); - break; - } - - return 0; + switch(type) + { + case SESSION_KEY_TYPE_IPV4: + { + struct in_addr s_addr{(unsigned int)rand()}; + struct in_addr d_addr{(unsigned int)rand()}; + in_port_t s_port{(unsigned short)rand()}; + in_port_t d_port{(unsigned short)rand()}; + + return SessionKey(s_addr, d_addr, s_port, d_port); + } + case SESSION_KEY_TYPE_IPV6: + { + struct in6_addr s_addr; + struct in6_addr d_addr; + + for(unsigned int i = 0; i < 16; i++) + { + s_addr.s6_addr[i] = (uint8_t)rand(); + d_addr.s6_addr[i] = (uint8_t)rand(); + } + + in_port_t s_port{(unsigned short)rand()}; + in_port_t d_port{(unsigned short)rand()}; + + return SessionKey(s_addr, d_addr, s_port, d_port); + } + } + + assert(0); } TEST(TunnatSession, TunnatSessionRandomAddQuery) @@ -61,14 +78,20 @@ TEST(TunnatSession, TunnatSessionRandomAddQuery) ASSERT_EQ(ss_table->Init(nr_session, nr_slots, expire_time), 0); std::vector<SessionKey> vec_test_keys; - SessionKey __test_keys; SessionEntry __test_entry; for (int i = 0; i < rd_keys; i++) { - SessionKeyGenerate(__test_keys,SESSION_KEY_TYPE_IPV4); - ss_table->Add(__test_keys, __test_entry); - vec_test_keys.push_back(__test_keys); + SessionKey ss_key = SessionKeyGenerateTuple2(SESSION_KEY_TYPE_IPV4); + ss_table->Add(ss_key, __test_entry); + vec_test_keys.push_back(ss_key); + } + + for(int i = 0; i < rd_keys; i++) + { + SessionKey ss_key = SessionKeyGenerateTuple2(SESSION_KEY_TYPE_IPV6); + ss_table->Add(ss_key, __test_entry); + vec_test_keys.push_back(ss_key); } for (auto & _key : vec_test_keys) |
