summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQiuwen Lu <[email protected]>2017-08-09 11:20:32 +0800
committerQiuwen Lu <[email protected]>2017-08-09 11:20:32 +0800
commit993fce5191273f9482eb4c85d8df7329669249a4 (patch)
tree06083a005e0d1ca57a937a4ca2f9e51000710e51
parent386b4dc8299abc1165eee2aae7fb5a0fe5b51ac2 (diff)
修正TUNNAT网关会话表超时不淘汰等问题v4.2.13-20170809
- 增加从配置文件读取会话表最大表项数、超时时间等功能; - 将FIFO淘汰改为LRU淘汰,增加超时通知回调函数,永远返回1即令其淘汰; - 修改报文处理逻辑,不认识的报文直接转发。
-rw-r--r--tunnat/include/session.h1
-rw-r--r--tunnat/include/tunnat.h4
-rw-r--r--tunnat/src/core.cc32
-rw-r--r--tunnat/src/runtime.cc15
-rw-r--r--tunnat/src/session.cc10
5 files changed, 45 insertions, 17 deletions
diff --git a/tunnat/include/session.h b/tunnat/include/session.h
index 06b9bd2..01353d2 100644
--- a/tunnat/include/session.h
+++ b/tunnat/include/session.h
@@ -42,4 +42,5 @@ protected:
MESA_htable_handle ht_table_;
static int htable_comp_fun_cb(const uchar * key1, uint size1, const uchar * key2, uint size2);
static int htable_free_fun_cb(void *data);
+ static int htable_expire_notify_cb(void *data, int eliminate_type);
}; \ No newline at end of file
diff --git a/tunnat/include/tunnat.h b/tunnat/include/tunnat.h
index e999219..5a2fcfd 100644
--- a/tunnat/include/tunnat.h
+++ b/tunnat/include/tunnat.h
@@ -87,7 +87,7 @@ public:
/* 统计,输出请求类型 */
TUNNAT_STAT_FORWARD_OUTPUT,
TUNNAT_STAT_ENCAP_OUTPUT,
- TUNNAT_STAT_DROP_OUTPUT,
+ TUNNAT_STAT_DIRECT_OUTPUT,
TUNNAT_STAT_FORWARD_RAW_OUTPUT,
TUNNAT_STAT_FORWARD_TUNNEL_OUTPUT,
TUNNAT_STAT_NO_SESSION_OUTPUT,
@@ -159,7 +159,7 @@ public:
[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_DROP_OUTPUT] ="TUNNAT_STAT_DROP_OUTPUT",
+ [TUNNAT_STAT_DIRECT_OUTPUT] ="TUNNAT_STAT_DROP_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",
diff --git a/tunnat/src/core.cc b/tunnat/src/core.cc
index 3b08469..1b6cde8 100644
--- a/tunnat/src/core.cc
+++ b/tunnat/src/core.cc
@@ -157,6 +157,23 @@ int tunnat_devices_setup(TunnatInstance * instance)
return RT_SUCCESS;
}
+int tunnat_session_setup(TunnatInstance * instance)
+{
+ /* 最大会话数 */
+ MESA_load_profile_uint_def(instance->cfgfile.c_str(), "tunnat", "nr_max_sessions",
+ &instance->nr_max_sessions, instance->nr_max_sessions);
+
+ /* Hash表槽数量 */
+ MESA_load_profile_uint_def(instance->cfgfile.c_str(), "tunnat", "nr_slots",
+ &instance->nr_slots, instance->nr_slots);
+
+ /* Hash表超时时间 */
+ MESA_load_profile_uint_def(instance->cfgfile.c_str(), "tunnat", "expire_time",
+ &instance->expire_time, instance->expire_time);
+
+ return RT_SUCCESS;
+}
+
int tunnat_mrinstance_setup(TunnatInstance * instance)
{
// 读CPU运行核心数
@@ -298,14 +315,8 @@ int main(int argc, char * argv[])
goto err_out;
if (tunnat_devices_setup(g_instance) != RT_SUCCESS)
goto err_out;
-
- pthread_t __pid_monit_thread;
- ret = pthread_create(&__pid_monit_thread, NULL, tunnat_monit_thread, g_instance);
- if (ret < 0)
- {
- MR_ERROR("Create monitor thread failed : %s", strerror(errno));
+ if (tunnat_session_setup(g_instance) != RT_SUCCESS)
goto err_out;
- }
for (unsigned int i = 0; i < g_instance->nr_thread; i++)
{
@@ -323,6 +334,13 @@ int main(int argc, char * argv[])
}
}
+ pthread_t __pid_monit_thread;
+ ret = pthread_create(&__pid_monit_thread, NULL, tunnat_monit_thread, g_instance);
+ if (ret < 0)
+ {
+ MR_ERROR("Create monitor thread failed : %s", strerror(errno));
+ goto err_out;
+ }
/* 采用NOTIFY方式启动,通知操作系统完成了初始化 */
if (__check_is_notify()) sd_notify(0, "READY=1");
diff --git a/tunnat/src/runtime.cc b/tunnat/src/runtime.cc
index 98ff52d..8edc2cf 100644
--- a/tunnat/src/runtime.cc
+++ b/tunnat/src/runtime.cc
@@ -241,9 +241,9 @@ static int __virt_to_phy_pkt_encap(TunnatInstance * instance, TunnatThreadInstan
assert(ctrlzone != NULL);
- /* 封装标记,内外层都不封装,直接转发到设备,可能是保活包 */
+ /* 封装标记,内外层都不封装 */
if (!((ctrlzone->action & TUNNAT_CZ_ACTION_ENCAP_INNER) &&
- (ctrlzone->action & TUNNAT_CZ_ACTION_ENCAP_OUTER))) return RT_SUCCESS;
+ (ctrlzone->action & TUNNAT_CZ_ACTION_ENCAP_OUTER))) return RT_ERR;
#if MR_TUNNAT_USE_PHONY_ETHER_HEADER
@@ -347,8 +347,8 @@ static void __virt_to_phy_one_device(TunnatInstance * instance, TunnatThreadInst
marsio_buff_t * no_session_bufs[MR_BURST_MAX];
unsigned int nr_no_session_bufs = 0;
- marsio_buff_t * drop_bufs[MR_BURST_MAX];
- unsigned int nr_drop_bufs = 0;
+ marsio_buff_t * direct_bufs[MR_BURST_MAX];
+ unsigned int nr_direct_bufs = 0;
for (int i = 0; i < nr_mbufs; i++)
{
@@ -370,17 +370,18 @@ static void __virt_to_phy_one_device(TunnatInstance * instance, TunnatThreadInst
continue;
}
- drop_bufs[nr_drop_bufs++] = mbufs[i];
+ /* 其他情况,比如保活包,直接转发到专用设备 */
+ direct_bufs[nr_direct_bufs++] = mbufs[i];
}
marsio_send_burst(phy_device_hand->vdev_sendpath, tid, fwd_mbufs, nr_fwd_mbufs);
marsio_send_burst(phy_device_hand->vdev_sendpath, tid, encap_bufs, nr_encap_bufs);
marsio_send_burst(phy_device_hand->vdev_sendpath, tid, no_session_bufs, nr_no_session_bufs);
- marsio_buff_free(instance->mr_instance, drop_bufs, nr_drop_bufs, MARSIO_SOCKET_ID_ANY, tid);
+ marsio_send_burst(phy_device_hand->vdev_sendpath, tid, direct_bufs, nr_direct_bufs);
TUNNAT_THREAD_STAT_ADD(TUNNAT_STAT_FORWARD_OUTPUT, nr_fwd_mbufs);
TUNNAT_THREAD_STAT_ADD(TUNNAT_STAT_ENCAP_OUTPUT, nr_encap_bufs);
- TUNNAT_THREAD_STAT_ADD(TUNNAT_STAT_DROP_OUTPUT, nr_drop_bufs);
+ TUNNAT_THREAD_STAT_ADD(TUNNAT_STAT_DIRECT_OUTPUT, nr_direct_bufs);
TUNNAT_THREAD_STAT_ADD(TUNNAT_STAT_NO_SESSION_OUTPUT, nr_no_session_bufs);
return;
diff --git a/tunnat/src/session.cc b/tunnat/src/session.cc
index 9cff949..c927acf 100644
--- a/tunnat/src/session.cc
+++ b/tunnat/src/session.cc
@@ -68,7 +68,7 @@ int SessionTable::Init(unsigned int nr_max_sessions, unsigned int nr_slots, unsi
opt_int = 0;
MESA_htable_set_opt(htable, MHO_SCREEN_PRINT_CTRL, &opt_int, sizeof(int));
- opt_int = HASH_ELIMINATE_ALGO_FIFO;
+ opt_int = HASH_ELIMINATE_ALGO_LRU;
MESA_htable_set_opt(htable, MHO_ELIMIMINATE_TYPE, &opt_int, sizeof(int));
void * fn_cmp_cb = (void *)htable_comp_fun_cb;
@@ -77,6 +77,9 @@ int SessionTable::Init(unsigned int nr_max_sessions, unsigned int nr_slots, unsi
void * fn_data_free_cb = (void *)htable_free_fun_cb;
MESA_htable_set_opt(htable, MHO_CBFUN_DATA_FREE, fn_data_free_cb, sizeof(fn_data_free_cb));
+ void * fn_expire_notify_cb = (void *)htable_expire_notify_cb;
+ MESA_htable_set_opt(htable, MHO_CBFUN_DATA_EXPIRE_NOTIFY, fn_expire_notify_cb, sizeof(fn_expire_notify_cb));
+
int ret = MESA_htable_mature(htable);
if (ret < 0)
{
@@ -106,4 +109,9 @@ int SessionTable::htable_free_fun_cb(void * data)
TUNNAT_THREAD_STAT_ADD(TUNNAT_STAT_SESSION_REMOVE, 1);
delete ss_entry;
return 0;
+}
+
+int SessionTable::htable_expire_notify_cb(void *data, int eliminate_type)
+{
+ return 1;
} \ No newline at end of file