summaryrefslogtreecommitdiff
path: root/tunnat
diff options
context:
space:
mode:
authorQiuwen Lu <[email protected]>2019-07-23 10:37:50 +0600
committerQiuwen Lu <[email protected]>2019-07-23 10:37:50 +0600
commitc3e1f674d289754e14bab9f72c71d22a09fd911f (patch)
treebcbb2885ebab9ab832bab738871cb4559c27af49 /tunnat
parentb50c1e9f5b5b116649c9f39b0d187e6922914047 (diff)
增加线路震荡的计数统计,当同一四元组(二元组)从不同线路中接收时记录统计计数。
Diffstat (limited to 'tunnat')
-rw-r--r--tunnat/CMakeLists.txt8
-rw-r--r--tunnat/include/tunnat.h4
-rw-r--r--tunnat/include/tunnel.h10
-rw-r--r--tunnat/src/core.cc4
-rw-r--r--tunnat/src/runtime.cc20
-rw-r--r--tunnat/src/tunnel.cc28
-rw-r--r--tunnat/test/TestSession.cc65
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)