diff options
| author | Qiuwen Lu <[email protected]> | 2017-08-09 11:20:32 +0800 |
|---|---|---|
| committer | Qiuwen Lu <[email protected]> | 2017-08-09 11:20:32 +0800 |
| commit | 993fce5191273f9482eb4c85d8df7329669249a4 (patch) | |
| tree | 06083a005e0d1ca57a937a4ca2f9e51000710e51 | |
| parent | 386b4dc8299abc1165eee2aae7fb5a0fe5b51ac2 (diff) | |
修正TUNNAT网关会话表超时不淘汰等问题v4.2.13-20170809
- 增加从配置文件读取会话表最大表项数、超时时间等功能;
- 将FIFO淘汰改为LRU淘汰,增加超时通知回调函数,永远返回1即令其淘汰;
- 修改报文处理逻辑,不认识的报文直接转发。
| -rw-r--r-- | tunnat/include/session.h | 1 | ||||
| -rw-r--r-- | tunnat/include/tunnat.h | 4 | ||||
| -rw-r--r-- | tunnat/src/core.cc | 32 | ||||
| -rw-r--r-- | tunnat/src/runtime.cc | 15 | ||||
| -rw-r--r-- | tunnat/src/session.cc | 10 |
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 |
