optimize session manager config

This commit is contained in:
luwenpeng
2024-08-30 18:33:41 +08:00
parent d1d5e6e09e
commit 82cb1eaeeb
26 changed files with 632 additions and 1319 deletions

View File

@@ -1,67 +1,65 @@
[snowflake]
snowflake_base = 1 # [0, 31]
snowflake_offset = 2 # [0, 127]
snowflake_base = 1 # [0, 31]
snowflake_offset = 2 # [0, 127]
[packet_io]
mode = "pcapfile" # pcapfile, pcaplist, marsio
app_symbol = "stellar"
dev_symbol = "nf_0_fw"
pcap_path = "/tmp/test.pcap"
nr_worker_thread = 1 # range: [1, 256]
cpu_mask = [5, 6, 7, 8, 9, 10, 11, 12]
idle_yield_interval_ms = 900 # range: [0, 60000] (ms)
mode = "pcapfile" # pcapfile, pcaplist, marsio
app_symbol = "stellar"
dev_symbol = "nf_0_fw"
pcap_path = "/tmp/test.pcap"
nr_worker_thread = 1 # range: [1, 256]
cpu_mask = [5, 6, 7, 8, 9, 10, 11, 12]
idle_yield_interval_ms = 900 # range: [0, 60000] (ms)
[ip_reassembly]
enable = 1
bucket_entries = 32 # range: [1, 4294967295] (must be power of 2)
bucket_num = 1024 # range: [1, 4294967295]
enable = 1
bucket_entries = 32 # range: [1, 4294967295] (must be power of 2)
bucket_num = 1024 # range: [1, 4294967295]
ip_frag_timeout_ms = 10000 # range: [1, 60000] (ms)
ip_frag_expire_polling_interval_ms = 0 # range: [0, 60000] (ms)
ip_frag_expire_polling_limit = 1024 # range: [1, 1024]
ip_frag_timeout_ms = 10000 # range: [1, 60000] (ms)
ip_frag_expire_polling_interval_ms = 0 # range: [0, 60000] (ms)
ip_frag_expire_polling_limit = 1024 # range: [1, 1024]
[session_manager]
# max session number
max_tcp_session_num = 50000
max_udp_session_num = 50000
tcp_session_max = 50000
udp_session_max = 50000
# session overload evict
tcp_overload_evict_old_sess = 1 # 1: evict old session, 0: bypass new session
udp_overload_evict_old_sess = 1 # 1: evict old session, 0: bypass new session
evict_old_on_tcp_table_limit = 1 # range: [0, 1]
evict_old_on_udp_table_limit = 1 # range: [0, 1]
# TCP timeout
tcp_init_timeout_ms = 5000 # range: [1, 60000] (ms)
tcp_handshake_timeout_ms = 5000 # range: [1, 60000] (ms)
tcp_data_timeout_ms = 5000 # range: [1, 15999999000] (ms)
tcp_half_closed_timeout_ms = 5000 # range: [1, 604800000] (ms)
tcp_time_wait_timeout_ms = 5000 # range: [1, 600000] (ms)
tcp_discard_timeout_ms = 10000 # range: [1, 15999999000] (ms)
tcp_unverified_rst_timeout_ms = 5000 # range: [1, 600000] (ms)
# UDP timeout
udp_data_timeout_ms = 5000 # range: [1, 15999999000] (ms)
udp_discard_timeout_ms = 5000 # range: [1, 15999999000] (ms)
expire_period_ms = 0 # range: [0, 60000] (ms)
expire_batch_max = 1024 # range: [1, 1024]
# limit
session_expire_polling_interval_ms = 0 # range: [0, 60000] (ms)
session_expire_polling_limit = 1024 # range: [1, 1024]
[session_manager.tcp_timeout_ms]
init = 5000 # range: [1, 60000] (ms)
handshake = 5000 # range: [1, 60000] (ms)
data = 5000 # range: [1, 15999999000] (ms)
half_closed = 5000 # range: [1, 604800000] (ms)
time_wait = 5000 # range: [1, 600000] (ms)
discard_default = 10000 # range: [1, 15999999000] (ms)
unverified_rst = 5000 # range: [1, 600000] (ms)
# duplicate packet filter
duplicated_packet_filter_enable = 1
duplicated_packet_filter_capacity = 1000000 # range: [1, 4294967295]
duplicated_packet_filter_timeout_ms = 10000 # range: [1, 60000] (ms)
duplicated_packet_filter_error_rate = 0.00001 # range: [0.0, 1.0]
[session_manager.udp_timeout_ms]
data = 5000 # range: [1, 15999999000] (ms)
discard_default = 5000 # range: [1, 15999999000] (ms)
# evicted session filter
evicted_session_filter_enable = 1
evicted_session_filter_capacity = 1000000 # range: [1, 4294967295]
evicted_session_filter_timeout_ms = 10000 # range: [1, 60000] (ms)
evicted_session_filter_error_rate = 0.00001 # range: [0.0, 1.0]
[session_manager.duplicated_packet_bloom_filter]
enable = 1
capacity = 1000000 # range: [1, 4294967295]
time_window_ms = 10000 # range: [1, 60000] (ms)
error_rate = 0.00001 # range: [0.0, 1.0]
# TCP reassembly (Per direction)
tcp_reassembly_enable = 1
tcp_reassembly_max_timeout_ms = 10000 # range: [1, 60000] (ms)
tcp_reassembly_max_segments = 256 # range: [2, 4096]
[session_manager.evicted_session_bloom_filter]
enable = 1 # range: [0, 1]
capacity = 1000000 # range: [1, 4294967295]
time_window_ms = 10000 # range: [1, 60000] (ms)
error_rate = 0.00001 # range: [0.0, 1.0]
[session_manager.tcp_reassembly]
enable = 1 # range: [0, 1]
timeout_ms = 10000 # range: [1, 60000] (ms)
buffered_segments_max = 256 # range: [2, 4096] per flow
[schedule]
merge_stat_interval = 500 # range: [1, 60000] (ms)
output_stat_interval = 2000 # range: [1, 60000] (ms)
merge_stat_interval = 500 # range: [1, 60000] (ms)
output_stat_interval = 2000 # range: [1, 60000] (ms)

View File

@@ -5,9 +5,15 @@ extern "C"
{
#endif
#include <stdint.h>
#include <stdio.h>
#include <time.h>
#include <errno.h>
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include "toml.h"
#include "log_private.h"
#define RX_BURST_MAX 32
#define MAX_THREAD_NUM 256 // limit by snowflake
@@ -97,6 +103,136 @@ static inline void hexdump_to_fd(int fd, uint32_t idx, const char *data, uint16_
}
}
// key: "a.b.c"
static inline const char *get_toml_value_from_hierarchical_key(toml_table_t *root, const char *key)
{
toml_table_t *table = root;
char *saveptr;
char *dup_key = strdup(key);
char *token = strtok_r(dup_key, ".", &saveptr);
while (token != NULL)
{
table = toml_table_in(table, token);
if (table == NULL)
{
free(dup_key);
return NULL;
}
if (strchr(saveptr, '.') == NULL)
{
const char *val = toml_raw_in(table, saveptr);
free(dup_key);
return val;
}
token = strtok_r(NULL, ".", &saveptr);
}
free(dup_key);
return toml_raw_in(root, key);
}
static inline int load_and_validate_toml_integer_config(const char *toml_file, const char *key, uint64_t *val, uint64_t min, uint64_t max)
{
int ret = -1;
char errbuf[200];
const char *ptr = NULL;
FILE *fp = NULL;
toml_table_t *root = NULL;
fp = fopen(toml_file, "r");
if (fp == NULL)
{
STELLAR_LOG_ERROR(__thread_local_logger, "config", "config file %s open failed, %s", toml_file, strerror(errno));
return -1;
}
root = toml_parse_file(fp, errbuf, sizeof(errbuf));
if (root == NULL)
{
STELLAR_LOG_ERROR(__thread_local_logger, "config", "config file %s parse failed, %s", toml_file, errbuf);
goto error_out;
}
ptr = get_toml_value_from_hierarchical_key(root, key);
if (ptr == NULL)
{
STELLAR_LOG_ERROR(__thread_local_logger, "config", "config file missing %s", key);
goto error_out;
}
*val = atoll(ptr);
if ((*val) < min || (*val) > max)
{
STELLAR_LOG_ERROR(__thread_local_logger, "config", "invalid %s: %lu, supported range: [%lu, %lu]", key, *val, min, max);
goto error_out;
}
ret = 0;
error_out:
if (root != NULL)
{
toml_free(root);
}
if (fp)
{
fclose(fp);
}
return ret;
}
static inline int load_and_validate_toml_double_config(const char *toml_file, const char *key, double *val, double min, double max)
{
int ret = -1;
char errbuf[200];
const char *ptr = NULL;
FILE *fp = NULL;
toml_table_t *root = NULL;
fp = fopen(toml_file, "r");
if (fp == NULL)
{
STELLAR_LOG_ERROR(__thread_local_logger, "config", "config file %s open failed, %s", toml_file, strerror(errno));
return -1;
}
root = toml_parse_file(fp, errbuf, sizeof(errbuf));
if (root == NULL)
{
STELLAR_LOG_ERROR(__thread_local_logger, "config", "config file %s parse failed, %s", toml_file, errbuf);
goto error_out;
}
ptr = get_toml_value_from_hierarchical_key(root, key);
if (ptr == NULL)
{
STELLAR_LOG_ERROR(__thread_local_logger, "config", "config file missing %s", key);
goto error_out;
}
*val = atof(ptr);
if ((*val) < min || (*val) > max)
{
STELLAR_LOG_ERROR(__thread_local_logger, "config", "invalid %s: %f, supported range: [%f, %f]", key, *val, min, max);
goto error_out;
}
ret = 0;
error_out:
if (root != NULL)
{
toml_free(root);
}
if (fp)
{
fclose(fp);
}
return ret;
}
#ifdef __cplusplus
}
#endif

View File

@@ -4,10 +4,9 @@
#include <sys/queue.h>
#include <assert.h>
#include "toml.h"
#include "utils.h"
#include "checksum.h"
#include "crc32_hash.h"
#include "log_private.h"
#include "ip_reassembly.h"
#include "packet_parser.h"
#include "packet_helper.h"
@@ -726,84 +725,6 @@ error_out_overlap:
* Public API
******************************************************************************/
#define PARSE_AND_CHECK_NUM(table, key, val, min, max) \
do \
{ \
const char *ptr = toml_raw_in(table, (key)); \
if (ptr == NULL) \
{ \
IP_REASSEMBLE_ERROR("config file missing ip_reassembly.%s", (key)); \
goto error_out; \
} \
(val) = atoll(ptr); \
if ((val) < (min) || (val) > (max)) \
{ \
IP_REASSEMBLE_ERROR("invalid ip_reassembly.%s: %lu, supported range: [%lu, %lu]", (key), (val), (min), (max)); \
goto error_out; \
} \
} while (0)
int ip_reassembly_config_load(struct ip_reassembly_config *cfg, const char *toml_file)
{
int ret = -1;
char errbuf[200];
FILE *fp = NULL;
toml_table_t *root = NULL;
toml_table_t *table = NULL;
uint64_t zero = 0; // make compiler happy
fp = fopen(toml_file, "r");
if (fp == NULL)
{
IP_REASSEMBLE_ERROR("config file %s open failed, %s", toml_file, strerror(errno));
goto error_out;
}
root = toml_parse_file(fp, errbuf, sizeof(errbuf));
if (root == NULL)
{
IP_REASSEMBLE_ERROR("config file %s parse failed, %s", toml_file, errbuf);
goto error_out;
}
table = toml_table_in(root, "ip_reassembly");
if (table == NULL)
{
IP_REASSEMBLE_ERROR("config file %s missing ip_reassembly", toml_file);
goto error_out;
}
PARSE_AND_CHECK_NUM(table, "enable", cfg->enable, zero, 1);
if (cfg->enable)
{
PARSE_AND_CHECK_NUM(table, "bucket_entries", cfg->bucket_entries, 1, 4294967295);
PARSE_AND_CHECK_NUM(table, "bucket_num", cfg->bucket_num, 1, 4294967295);
PARSE_AND_CHECK_NUM(table, "ip_frag_timeout_ms", cfg->ip_frag_timeout_ms, 1, 60000);
PARSE_AND_CHECK_NUM(table, "ip_frag_expire_polling_interval_ms", cfg->ip_frag_expire_polling_interval_ms, zero, 60000);
PARSE_AND_CHECK_NUM(table, "ip_frag_expire_polling_limit", cfg->ip_frag_expire_polling_limit, 1, 1024);
if (is_power_of_2(cfg->bucket_entries) == 0)
{
IP_REASSEMBLE_ERROR("invalid ip_reassembly.bucket_entries: %lu, must be power of 2", cfg->bucket_entries);
goto error_out;
}
}
ret = 0;
error_out:
if (root)
{
toml_free(root);
}
if (fp)
{
fclose(fp);
}
return ret;
}
struct ip_reassembly_config *ip_reassembly_config_new(const char *toml_file)
{
if (toml_file == NULL)
@@ -817,7 +738,20 @@ struct ip_reassembly_config *ip_reassembly_config_new(const char *toml_file)
return NULL;
}
if (ip_reassembly_config_load(cfg, toml_file) == -1)
int ret = 0;
ret += load_and_validate_toml_integer_config(toml_file, "ip_reassembly.enable", (uint64_t *)&cfg->enable, 0, 1);
ret += load_and_validate_toml_integer_config(toml_file, "ip_reassembly.bucket_entries", (uint64_t *)&cfg->bucket_entries, 1, 4294967295);
ret += load_and_validate_toml_integer_config(toml_file, "ip_reassembly.bucket_num", (uint64_t *)&cfg->bucket_num, 1, 4294967295);
ret += load_and_validate_toml_integer_config(toml_file, "ip_reassembly.ip_frag_timeout_ms", (uint64_t *)&cfg->ip_frag_timeout_ms, 1, 60000);
ret += load_and_validate_toml_integer_config(toml_file, "ip_reassembly.ip_frag_expire_polling_interval_ms", (uint64_t *)&cfg->ip_frag_expire_polling_interval_ms, 0, 60000);
ret += load_and_validate_toml_integer_config(toml_file, "ip_reassembly.ip_frag_expire_polling_limit", (uint64_t *)&cfg->ip_frag_expire_polling_limit, 1, 1024);
if (is_power_of_2(cfg->bucket_entries) == 0)
{
IP_REASSEMBLE_ERROR("invalid ip_reassembly.bucket_entries: %lu, must be power of 2", cfg->bucket_entries);
ret += -1;
}
if (ret != 0)
{
ip_reassembly_config_free(cfg);
return NULL;

View File

@@ -32,7 +32,7 @@ int packet_io_config_load(struct packet_io_config *cfg, const char *toml_file)
int ret = -1;
const char *ptr;
char *ptr_mode = NULL;
char *ptr_dumpfile_path = NULL;
char *ptr_pcap_path = NULL;
char *ptr_app_symbol = NULL;
char *ptr_dev_symbol = NULL;
char errbuf[200];
@@ -89,12 +89,12 @@ int packet_io_config_load(struct packet_io_config *cfg, const char *toml_file)
if (cfg->mode == PACKET_IO_PCAPFILE || cfg->mode == PACKET_IO_PCAPLIST)
{
ptr = toml_raw_in(table, "pcap_path");
if (ptr == NULL || toml_rtos(ptr, &ptr_dumpfile_path) != 0)
if (ptr == NULL || toml_rtos(ptr, &ptr_pcap_path) != 0)
{
PACKET_IO_LOG_ERROR("config file missing packet_io.pcap_path");
goto error_out;
}
strcpy(cfg->pcap_path, ptr_dumpfile_path);
strcpy(cfg->pcap_path, ptr_pcap_path);
}
else
{
@@ -164,9 +164,9 @@ error_out:
{
free(ptr_mode);
}
if (ptr_dumpfile_path)
if (ptr_pcap_path)
{
free(ptr_dumpfile_path);
free(ptr_pcap_path);
}
if (ptr_app_symbol)
{

View File

@@ -4,8 +4,6 @@
#include <errno.h>
#include "utils.h"
#include "toml.h"
#include "log_private.h"
#include "packet_helper.h"
#include "packet_filter.h"
#include "session_private.h"
@@ -141,13 +139,13 @@ static void tcp_clean(struct session_manager *mgr, struct session *sess)
static int tcp_init(struct session_manager *mgr, struct session *sess)
{
if (!mgr->cfg.tcp_reassembly_enable)
if (!mgr->cfg.tcp_reassembly.enable)
{
return 0;
}
sess->tcp_halfs[FLOW_DIRECTION_C2S].assembler = tcp_reassembly_new(mgr->cfg.tcp_reassembly_max_timeout_ms, mgr->cfg.tcp_reassembly_max_segments);
sess->tcp_halfs[FLOW_DIRECTION_S2C].assembler = tcp_reassembly_new(mgr->cfg.tcp_reassembly_max_timeout_ms, mgr->cfg.tcp_reassembly_max_segments);
sess->tcp_halfs[FLOW_DIRECTION_C2S].assembler = tcp_reassembly_new(mgr->cfg.tcp_reassembly.timeout_ms, mgr->cfg.tcp_reassembly.buffered_segments_max);
sess->tcp_halfs[FLOW_DIRECTION_S2C].assembler = tcp_reassembly_new(mgr->cfg.tcp_reassembly.timeout_ms, mgr->cfg.tcp_reassembly.buffered_segments_max);
if (sess->tcp_halfs[FLOW_DIRECTION_C2S].assembler == NULL || sess->tcp_halfs[FLOW_DIRECTION_S2C].assembler == NULL)
{
tcp_clean(mgr, sess);
@@ -180,7 +178,7 @@ static void tcp_update(struct session_manager *mgr, struct session *sess, enum f
half->ack = tcp_hdr_get_ack(hdr);
half->len = tcp_layer->pld_len;
if (!mgr->cfg.tcp_reassembly_enable)
if (!mgr->cfg.tcp_reassembly.enable)
{
if (len)
{
@@ -330,7 +328,7 @@ static enum flow_direction identify_direction_by_history(const struct session *s
// on new session
static int tcp_overload_bypass(struct session_manager *mgr, const struct tuple6 *key)
{
if (key->ip_proto == IPPROTO_TCP && mgr->stat.tcp_sess_used >= mgr->cfg.max_tcp_session_num)
if (key->ip_proto == IPPROTO_TCP && mgr->stat.tcp_sess_used >= mgr->cfg.tcp_session_max)
{
mgr->stat.tcp_pkts_bypass_table_full++;
return 1;
@@ -340,7 +338,7 @@ static int tcp_overload_bypass(struct session_manager *mgr, const struct tuple6
static int udp_overload_bypass(struct session_manager *mgr, const struct tuple6 *key)
{
if (key->ip_proto == IPPROTO_UDP && mgr->stat.udp_sess_used >= mgr->cfg.max_udp_session_num)
if (key->ip_proto == IPPROTO_UDP && mgr->stat.udp_sess_used >= mgr->cfg.udp_session_max)
{
mgr->stat.udp_pkts_bypass_table_full++;
return 1;
@@ -350,7 +348,7 @@ static int udp_overload_bypass(struct session_manager *mgr, const struct tuple6
static int evicted_session_bypass(struct session_manager *mgr, const struct tuple6 *key)
{
if (mgr->cfg.evicted_session_filter_enable && session_filter_lookup(mgr->evicte_sess_filter, key, mgr->now_ms))
if (mgr->cfg.evicted_session_bloom_filter.enable && session_filter_lookup(mgr->evicte_sess_filter, key, mgr->now_ms))
{
mgr->stat.udp_pkts_bypass_session_evicted++;
return 1;
@@ -362,7 +360,7 @@ static int evicted_session_bypass(struct session_manager *mgr, const struct tupl
// on update session
static int duplicated_packet_bypass(struct session_manager *mgr, struct session *sess, const struct packet *pkt, const struct tuple6 *key)
{
if (mgr->cfg.duplicated_packet_filter_enable == 0)
if (mgr->cfg.duplicated_packet_bloom_filter.enable == 0)
{
return 0;
}
@@ -517,7 +515,7 @@ static void session_manager_evicte_session(struct session_manager *mgr, struct s
case SESSION_TYPE_UDP:
SESSION_LOG_DEBUG("evicte udp old session: %lu", session_get_id(sess));
session_table_del(mgr->udp_sess_table, sess);
if (mgr->cfg.evicted_session_filter_enable)
if (mgr->cfg.evicted_session_bloom_filter.enable)
{
session_filter_add(mgr->evicte_sess_filter, session_get_tuple6(sess), mgr->now_ms);
}
@@ -574,7 +572,7 @@ static struct session *session_manager_new_tcp_session(struct session_manager *m
}
// tcp table full evict old session
if (mgr->cfg.tcp_overload_evict_old_sess && mgr->stat.tcp_sess_used >= mgr->cfg.max_tcp_session_num - EVICTE_SESSION_BURST)
if (mgr->cfg.evict_old_on_tcp_table_limit && mgr->stat.tcp_sess_used >= mgr->cfg.tcp_session_max - EVICTE_SESSION_BURST)
{
struct session *evic_sess = session_table_find_lru(mgr->tcp_sess_table);
session_manager_evicte_session(mgr, evic_sess, LRU_EVICT);
@@ -603,11 +601,11 @@ static struct session *session_manager_new_tcp_session(struct session_manager *m
}
tcp_update(mgr, sess, dir, tcp_layer);
uint64_t timeout = (flags & TH_ACK) ? mgr->cfg.tcp_handshake_timeout_ms : mgr->cfg.tcp_init_timeout_ms;
uint64_t timeout = (flags & TH_ACK) ? mgr->cfg.tcp_timeout_ms.handshake : mgr->cfg.tcp_timeout_ms.init;
session_timer_update(mgr->sess_timer, sess, mgr->now_ms + timeout);
session_table_add(mgr->tcp_sess_table, sess);
if (mgr->cfg.duplicated_packet_filter_enable)
if (mgr->cfg.duplicated_packet_bloom_filter.enable)
{
packet_filter_add(mgr->dup_pkt_filter, pkt, mgr->now_ms);
}
@@ -622,7 +620,7 @@ static struct session *session_manager_new_tcp_session(struct session_manager *m
static struct session *session_manager_new_udp_session(struct session_manager *mgr, const struct packet *pkt, const struct tuple6 *key)
{
// udp table full evict old session
if (mgr->cfg.udp_overload_evict_old_sess && mgr->stat.udp_sess_used >= mgr->cfg.max_udp_session_num - EVICTE_SESSION_BURST)
if (mgr->cfg.evict_old_on_udp_table_limit && mgr->stat.udp_sess_used >= mgr->cfg.udp_session_max - EVICTE_SESSION_BURST)
{
struct session *evic_sess = session_table_find_lru(mgr->udp_sess_table);
session_manager_evicte_session(mgr, evic_sess, LRU_EVICT);
@@ -643,7 +641,7 @@ static struct session *session_manager_new_udp_session(struct session_manager *m
session_update(mgr, sess, next_state, pkt, key, dir);
session_transition_log(sess, SESSION_STATE_INIT, next_state, UDP_DATA);
session_timer_update(mgr->sess_timer, sess, mgr->now_ms + mgr->cfg.udp_data_timeout_ms);
session_timer_update(mgr->sess_timer, sess, mgr->now_ms + mgr->cfg.udp_timeout_ms.data);
session_table_add(mgr->udp_sess_table, sess);
SESS_MGR_STAT_INC(&mgr->stat, next_state, udp);
@@ -698,34 +696,34 @@ static int session_manager_update_tcp_session(struct session_manager *mgr, struc
case SESSION_STATE_OPENING:
if (flags & TH_SYN)
{
timeout = (flags & TH_ACK) ? mgr->cfg.tcp_handshake_timeout_ms : mgr->cfg.tcp_init_timeout_ms;
timeout = (flags & TH_ACK) ? mgr->cfg.tcp_timeout_ms.handshake : mgr->cfg.tcp_timeout_ms.init;
}
else
{
timeout = mgr->cfg.tcp_data_timeout_ms;
timeout = mgr->cfg.tcp_timeout_ms.data;
}
break;
case SESSION_STATE_ACTIVE:
timeout = mgr->cfg.tcp_data_timeout_ms;
timeout = mgr->cfg.tcp_timeout_ms.data;
break;
case SESSION_STATE_CLOSING:
if (flags & TH_FIN)
{
timeout = (peer->history & TH_FIN) ? mgr->cfg.tcp_time_wait_timeout_ms : mgr->cfg.tcp_half_closed_timeout_ms;
timeout = (peer->history & TH_FIN) ? mgr->cfg.tcp_timeout_ms.time_wait : mgr->cfg.tcp_timeout_ms.half_closed;
}
else if (flags & TH_RST)
{
// if fin is received, the expected sequence number should be increased by 1
uint32_t expected = (peer->history & TH_FIN) ? peer->ack + 1 : peer->ack;
timeout = (expected == curr->seq) ? mgr->cfg.tcp_time_wait_timeout_ms : mgr->cfg.tcp_unverified_rst_timeout_ms;
timeout = (expected == curr->seq) ? mgr->cfg.tcp_timeout_ms.time_wait : mgr->cfg.tcp_timeout_ms.unverified_rst;
}
else
{
timeout = mgr->cfg.tcp_data_timeout_ms;
timeout = mgr->cfg.tcp_timeout_ms.data;
}
break;
case SESSION_STATE_DISCARD:
timeout = mgr->cfg.tcp_discard_timeout_ms;
timeout = mgr->cfg.tcp_timeout_ms.discard_default;
break;
default:
assert(0);
@@ -748,11 +746,11 @@ static int session_manager_update_udp_session(struct session_manager *mgr, struc
if (session_get_current_state(sess) == SESSION_STATE_DISCARD)
{
session_timer_update(mgr->sess_timer, sess, mgr->now_ms + mgr->cfg.udp_discard_timeout_ms);
session_timer_update(mgr->sess_timer, sess, mgr->now_ms + mgr->cfg.udp_timeout_ms.discard_default);
}
else
{
session_timer_update(mgr->sess_timer, sess, mgr->now_ms + mgr->cfg.udp_data_timeout_ms);
session_timer_update(mgr->sess_timer, sess, mgr->now_ms + mgr->cfg.udp_timeout_ms.data);
}
SESS_MGR_STAT_UPDATE(&mgr->stat, curr_state, next_state, udp);
@@ -774,127 +772,6 @@ static inline uint8_t ipv6_in_range(const struct in6_addr *addr, const struct in
* session manager public API
******************************************************************************/
#define PARSE_AND_CHECK_NUM(table, key, val, min, max) \
do \
{ \
const char *ptr = toml_raw_in(table, (key)); \
if (ptr == NULL) \
{ \
SESSION_LOG_ERROR("config file missing session_manager.%s", (key)); \
goto error_out; \
} \
(val) = atoll(ptr); \
if ((val) < (min) || (val) > (max)) \
{ \
SESSION_LOG_ERROR("invalid session_manager.%s: %lu, supported range: [%lu, %lu]", (key), (val), (min), (max)); \
goto error_out; \
} \
} while (0)
#define PARSE_AND_CHECK_DOUBLE(table, key, val, min, max) \
do \
{ \
const char *ptr = toml_raw_in(table, (key)); \
if (ptr == NULL) \
{ \
SESSION_LOG_ERROR("config file missing session_manager.%s", (key)); \
goto error_out; \
} \
(val) = atof(ptr); \
if ((val) < (min) || (val) > (max)) \
{ \
SESSION_LOG_ERROR("invalid session_manager.%s: %lu, supported range: [%f, %f]", (key), (val), (min), (max)); \
goto error_out; \
} \
} while (0)
int session_manager_config_load(struct session_manager_config *cfg, const char *toml_file)
{
int ret = -1;
char errbuf[200];
FILE *fp = NULL;
toml_table_t *root = NULL;
toml_table_t *table = NULL;
uint64_t zero = 0; // make compiler happy
fp = fopen(toml_file, "r");
if (fp == NULL)
{
SESSION_LOG_ERROR("config file %s open failed, %s", toml_file, strerror(errno));
goto error_out;
}
root = toml_parse_file(fp, errbuf, sizeof(errbuf));
if (root == NULL)
{
SESSION_LOG_ERROR("config file %s parse failed, %s", toml_file, errbuf);
goto error_out;
}
table = toml_table_in(root, "session_manager");
if (table == NULL)
{
SESSION_LOG_ERROR("config file %s missing session_manager", toml_file);
goto error_out;
}
// max session number
PARSE_AND_CHECK_NUM(table, "max_tcp_session_num", cfg->max_tcp_session_num, EVICTE_SESSION_BURST * 2, UINT64_MAX);
PARSE_AND_CHECK_NUM(table, "max_udp_session_num", cfg->max_udp_session_num, EVICTE_SESSION_BURST * 2, UINT64_MAX);
// session overload
PARSE_AND_CHECK_NUM(table, "tcp_overload_evict_old_sess", cfg->tcp_overload_evict_old_sess, zero, 1);
PARSE_AND_CHECK_NUM(table, "udp_overload_evict_old_sess", cfg->udp_overload_evict_old_sess, zero, 1);
// TCP timeout
PARSE_AND_CHECK_NUM(table, "tcp_init_timeout_ms", cfg->tcp_init_timeout_ms, 1, 60000);
PARSE_AND_CHECK_NUM(table, "tcp_handshake_timeout_ms", cfg->tcp_handshake_timeout_ms, 1, 60000);
PARSE_AND_CHECK_NUM(table, "tcp_data_timeout_ms", cfg->tcp_data_timeout_ms, 1, 15999999000);
PARSE_AND_CHECK_NUM(table, "tcp_half_closed_timeout_ms", cfg->tcp_half_closed_timeout_ms, 1, 604800000);
PARSE_AND_CHECK_NUM(table, "tcp_time_wait_timeout_ms", cfg->tcp_time_wait_timeout_ms, 1, 60000);
PARSE_AND_CHECK_NUM(table, "tcp_discard_timeout_ms", cfg->tcp_discard_timeout_ms, 1, 15999999000);
PARSE_AND_CHECK_NUM(table, "tcp_unverified_rst_timeout_ms", cfg->tcp_unverified_rst_timeout_ms, 1, 60000);
// UDP timeout
PARSE_AND_CHECK_NUM(table, "udp_data_timeout_ms", cfg->udp_data_timeout_ms, 1, 15999999000);
PARSE_AND_CHECK_NUM(table, "udp_discard_timeout_ms", cfg->udp_discard_timeout_ms, 1, 15999999000);
// limit
PARSE_AND_CHECK_NUM(table, "session_expire_polling_interval_ms", cfg->session_expire_polling_interval_ms, zero, 60000);
PARSE_AND_CHECK_NUM(table, "session_expire_polling_limit", cfg->session_expire_polling_limit, 1, 1024);
// duplicated packet filter
PARSE_AND_CHECK_NUM(table, "duplicated_packet_filter_enable", cfg->duplicated_packet_filter_enable, zero, 1);
PARSE_AND_CHECK_NUM(table, "duplicated_packet_filter_capacity", cfg->duplicated_packet_filter_capacity, 1, 4294967295);
PARSE_AND_CHECK_NUM(table, "duplicated_packet_filter_timeout_ms", cfg->duplicated_packet_filter_timeout_ms, 1, 60000);
PARSE_AND_CHECK_DOUBLE(table, "duplicated_packet_filter_error_rate", cfg->duplicated_packet_filter_error_rate, 0.0, 1.0);
// eviction session filter
PARSE_AND_CHECK_NUM(table, "evicted_session_filter_enable", cfg->evicted_session_filter_enable, zero, 1);
PARSE_AND_CHECK_NUM(table, "evicted_session_filter_capacity", cfg->evicted_session_filter_capacity, 1, 4294967295);
PARSE_AND_CHECK_NUM(table, "evicted_session_filter_timeout_ms", cfg->evicted_session_filter_timeout_ms, 1, 60000);
PARSE_AND_CHECK_DOUBLE(table, "evicted_session_filter_error_rate", cfg->evicted_session_filter_error_rate, 0.0, 1.0);
// TCP reassembly
PARSE_AND_CHECK_NUM(table, "tcp_reassembly_enable", cfg->tcp_reassembly_enable, zero, 1);
PARSE_AND_CHECK_NUM(table, "tcp_reassembly_max_timeout_ms", cfg->tcp_reassembly_max_timeout_ms, 1, 60000);
PARSE_AND_CHECK_NUM(table, "tcp_reassembly_max_segments", cfg->tcp_reassembly_max_segments, 1, 512);
ret = 0;
error_out:
if (root)
{
toml_free(root);
}
if (fp)
{
fclose(fp);
}
return ret;
}
struct session_manager_config *session_manager_config_new(const char *toml_file)
{
if (toml_file == NULL)
@@ -908,7 +785,42 @@ struct session_manager_config *session_manager_config_new(const char *toml_file)
return NULL;
}
if (session_manager_config_load(cfg, toml_file) == -1)
int ret = 0;
ret += load_and_validate_toml_integer_config(toml_file, "session_manager.tcp_session_max", (uint64_t *)&cfg->tcp_session_max, EVICTE_SESSION_BURST * 2, UINT64_MAX);
ret += load_and_validate_toml_integer_config(toml_file, "session_manager.udp_session_max", (uint64_t *)&cfg->udp_session_max, EVICTE_SESSION_BURST * 2, UINT64_MAX);
ret += load_and_validate_toml_integer_config(toml_file, "session_manager.evict_old_on_tcp_table_limit", (uint64_t *)&cfg->evict_old_on_tcp_table_limit, 0, 1);
ret += load_and_validate_toml_integer_config(toml_file, "session_manager.evict_old_on_udp_table_limit", (uint64_t *)&cfg->evict_old_on_udp_table_limit, 0, 1);
ret += load_and_validate_toml_integer_config(toml_file, "session_manager.expire_period_ms", (uint64_t *)&cfg->expire_period_ms, 0, 60000);
ret += load_and_validate_toml_integer_config(toml_file, "session_manager.expire_batch_max", (uint64_t *)&cfg->expire_batch_max, 1, 1024);
ret += load_and_validate_toml_integer_config(toml_file, "session_manager.tcp_timeout_ms.init", (uint64_t *)&cfg->tcp_timeout_ms.init, 1, 60000);
ret += load_and_validate_toml_integer_config(toml_file, "session_manager.tcp_timeout_ms.handshake", (uint64_t *)&cfg->tcp_timeout_ms.handshake, 1, 60000);
ret += load_and_validate_toml_integer_config(toml_file, "session_manager.tcp_timeout_ms.data", (uint64_t *)&cfg->tcp_timeout_ms.data, 1, 15999999000);
ret += load_and_validate_toml_integer_config(toml_file, "session_manager.tcp_timeout_ms.half_closed", (uint64_t *)&cfg->tcp_timeout_ms.half_closed, 1, 604800000);
ret += load_and_validate_toml_integer_config(toml_file, "session_manager.tcp_timeout_ms.time_wait", (uint64_t *)&cfg->tcp_timeout_ms.time_wait, 1, 60000);
ret += load_and_validate_toml_integer_config(toml_file, "session_manager.tcp_timeout_ms.discard_default", (uint64_t *)&cfg->tcp_timeout_ms.discard_default, 1, 15999999000);
ret += load_and_validate_toml_integer_config(toml_file, "session_manager.tcp_timeout_ms.unverified_rst", (uint64_t *)&cfg->tcp_timeout_ms.unverified_rst, 1, 60000);
ret += load_and_validate_toml_integer_config(toml_file, "session_manager.udp_timeout_ms.data", (uint64_t *)&cfg->udp_timeout_ms.data, 1, 15999999000);
ret += load_and_validate_toml_integer_config(toml_file, "session_manager.udp_timeout_ms.discard_default", (uint64_t *)&cfg->udp_timeout_ms.discard_default, 1, 15999999000);
ret += load_and_validate_toml_integer_config(toml_file, "session_manager.duplicated_packet_bloom_filter.enable", (uint64_t *)&cfg->duplicated_packet_bloom_filter.enable, 0, 1);
ret += load_and_validate_toml_integer_config(toml_file, "session_manager.duplicated_packet_bloom_filter.capacity", (uint64_t *)&cfg->duplicated_packet_bloom_filter.capacity, 1, 4294967295);
ret += load_and_validate_toml_integer_config(toml_file, "session_manager.duplicated_packet_bloom_filter.time_window_ms", (uint64_t *)&cfg->duplicated_packet_bloom_filter.time_window_ms, 1, 60000);
ret += load_and_validate_toml_double_config(toml_file, "session_manager.duplicated_packet_bloom_filter.error_rate", (double *)&cfg->duplicated_packet_bloom_filter.error_rate, 0.0, 1.0);
ret += load_and_validate_toml_integer_config(toml_file, "session_manager.evicted_session_bloom_filter.enable", (uint64_t *)&cfg->evicted_session_bloom_filter.enable, 0, 1);
ret += load_and_validate_toml_integer_config(toml_file, "session_manager.evicted_session_bloom_filter.capacity", (uint64_t *)&cfg->evicted_session_bloom_filter.capacity, 1, 4294967295);
ret += load_and_validate_toml_integer_config(toml_file, "session_manager.evicted_session_bloom_filter.time_window_ms", (uint64_t *)&cfg->evicted_session_bloom_filter.time_window_ms, 1, 60000);
ret += load_and_validate_toml_double_config(toml_file, "session_manager.evicted_session_bloom_filter.error_rate", (double *)&cfg->evicted_session_bloom_filter.error_rate, 0.0, 1.0);
ret += load_and_validate_toml_integer_config(toml_file, "session_manager.tcp_reassembly.enable", (uint64_t *)&cfg->tcp_reassembly.enable, 0, 1);
ret += load_and_validate_toml_integer_config(toml_file, "session_manager.tcp_reassembly.timeout_ms", (uint64_t *)&cfg->tcp_reassembly.timeout_ms, 1, 60000);
ret += load_and_validate_toml_integer_config(toml_file, "session_manager.tcp_reassembly.buffered_segments_max", (uint64_t *)&cfg->tcp_reassembly.buffered_segments_max, 1, 512);
if (ret != 0)
{
session_manager_config_free(cfg);
return NULL;
@@ -931,46 +843,46 @@ void session_manager_config_print(struct session_manager_config *cfg)
if (cfg)
{
// max session number
SESSION_LOG_INFO("session_manager.max_tcp_session_num : %lu", cfg->max_tcp_session_num);
SESSION_LOG_INFO("session_manager.max_udp_session_num : %lu", cfg->max_udp_session_num);
SESSION_LOG_INFO("session_manager.tcp_session_max : %lu", cfg->tcp_session_max);
SESSION_LOG_INFO("session_manager.udp_session_max : %lu", cfg->udp_session_max);
// session overload
SESSION_LOG_INFO("session_manager.tcp_overload_evict_old_sess : %d", cfg->tcp_overload_evict_old_sess);
SESSION_LOG_INFO("session_manager.udp_overload_evict_old_sess : %d", cfg->udp_overload_evict_old_sess);
SESSION_LOG_INFO("session_manager.evict_old_on_tcp_table_limit : %d", cfg->evict_old_on_tcp_table_limit);
SESSION_LOG_INFO("session_manager.evict_old_on_udp_table_limit : %d", cfg->evict_old_on_udp_table_limit);
// TCP timeout
SESSION_LOG_INFO("session_manager.tcp_init_timeout_ms : %lu", cfg->tcp_init_timeout_ms);
SESSION_LOG_INFO("session_manager.tcp_handshake_timeout_ms : %lu", cfg->tcp_handshake_timeout_ms);
SESSION_LOG_INFO("session_manager.tcp_data_timeout_ms : %lu", cfg->tcp_data_timeout_ms);
SESSION_LOG_INFO("session_manager.tcp_half_closed_timeout_ms : %lu", cfg->tcp_half_closed_timeout_ms);
SESSION_LOG_INFO("session_manager.tcp_time_wait_timeout_ms : %lu", cfg->tcp_time_wait_timeout_ms);
SESSION_LOG_INFO("session_manager.tcp_discard_timeout_ms : %lu", cfg->tcp_discard_timeout_ms);
SESSION_LOG_INFO("session_manager.tcp_unverified_rst_timeout_ms : %lu", cfg->tcp_unverified_rst_timeout_ms);
SESSION_LOG_INFO("session_manager.tcp_timeout_ms.init : %lu", cfg->tcp_timeout_ms.init);
SESSION_LOG_INFO("session_manager.tcp_timeout_ms.handshake : %lu", cfg->tcp_timeout_ms.handshake);
SESSION_LOG_INFO("session_manager.tcp_timeout_ms.data : %lu", cfg->tcp_timeout_ms.data);
SESSION_LOG_INFO("session_manager.tcp_timeout_ms.half_closed : %lu", cfg->tcp_timeout_ms.half_closed);
SESSION_LOG_INFO("session_manager.tcp_timeout_ms.time_wait : %lu", cfg->tcp_timeout_ms.time_wait);
SESSION_LOG_INFO("session_manager.tcp_timeout_ms.discard_default : %lu", cfg->tcp_timeout_ms.discard_default);
SESSION_LOG_INFO("session_manager.tcp_timeout_ms.unverified_rst : %lu", cfg->tcp_timeout_ms.unverified_rst);
// UDP timeout
SESSION_LOG_INFO("session_manager.udp_data_timeout_ms : %lu", cfg->udp_data_timeout_ms);
SESSION_LOG_INFO("session_manager.udp_discard_timeout_ms : %lu", cfg->udp_discard_timeout_ms);
SESSION_LOG_INFO("session_manager.udp_timeout_ms.data : %lu", cfg->udp_timeout_ms.data);
SESSION_LOG_INFO("session_manager.udp_timeout_ms.discard_default : %lu", cfg->udp_timeout_ms.discard_default);
// limit
SESSION_LOG_INFO("session_manager.session_expire_polling_interval_ms : %lu", cfg->session_expire_polling_interval_ms);
SESSION_LOG_INFO("session_manager.session_expire_polling_limit : %lu", cfg->session_expire_polling_limit);
SESSION_LOG_INFO("session_manager.expire_period_ms : %lu", cfg->expire_period_ms);
SESSION_LOG_INFO("session_manager.expire_batch_max : %lu", cfg->expire_batch_max);
// duplicated packet filter
SESSION_LOG_INFO("session_manager.duplicated_packet_filter_enable : %d", cfg->duplicated_packet_filter_enable);
SESSION_LOG_INFO("session_manager.duplicated_packet_filter_capacity : %lu", cfg->duplicated_packet_filter_capacity);
SESSION_LOG_INFO("session_manager.duplicated_packet_filter_timeout_ms : %lu", cfg->duplicated_packet_filter_timeout_ms);
SESSION_LOG_INFO("session_manager.duplicated_packet_filter_error_rate : %f", cfg->duplicated_packet_filter_error_rate);
SESSION_LOG_INFO("session_manager.duplicated_packet_bloom_filter.enable : %d", cfg->duplicated_packet_bloom_filter.enable);
SESSION_LOG_INFO("session_manager.duplicated_packet_bloom_filter.capacity : %lu", cfg->duplicated_packet_bloom_filter.capacity);
SESSION_LOG_INFO("session_manager.duplicated_packet_bloom_filter.time_window_ms : %lu", cfg->duplicated_packet_bloom_filter.time_window_ms);
SESSION_LOG_INFO("session_manager.duplicated_packet_bloom_filter.error_rate : %f", cfg->duplicated_packet_bloom_filter.error_rate);
// eviction session filter
SESSION_LOG_INFO("session_manager.evicted_session_filter_enable : %d", cfg->evicted_session_filter_enable);
SESSION_LOG_INFO("session_manager.evicted_session_filter_capacity : %lu", cfg->evicted_session_filter_capacity);
SESSION_LOG_INFO("session_manager.evicted_session_filter_timeout_ms : %lu", cfg->evicted_session_filter_timeout_ms);
SESSION_LOG_INFO("session_manager.evicted_session_filter_error_rate : %f", cfg->evicted_session_filter_error_rate);
SESSION_LOG_INFO("session_manager.evicted_session_bloom_filter.enable : %d", cfg->evicted_session_bloom_filter.enable);
SESSION_LOG_INFO("session_manager.evicted_session_bloom_filter.capacity : %lu", cfg->evicted_session_bloom_filter.capacity);
SESSION_LOG_INFO("session_manager.evicted_session_bloom_filter.time_window_ms : %lu", cfg->evicted_session_bloom_filter.time_window_ms);
SESSION_LOG_INFO("session_manager.evicted_session_bloom_filter.error_rate : %f", cfg->evicted_session_bloom_filter.error_rate);
// TCP reassembly
SESSION_LOG_INFO("session_manager.tcp_reassembly_enable : %d", cfg->tcp_reassembly_enable);
SESSION_LOG_INFO("session_manager.tcp_reassembly_max_timeout_ms : %lu", cfg->tcp_reassembly_max_timeout_ms);
SESSION_LOG_INFO("session_manager.tcp_reassembly_max_segments : %lu", cfg->tcp_reassembly_max_segments);
SESSION_LOG_INFO("session_manager.tcp_reassembly.enable : %d", cfg->tcp_reassembly.enable);
SESSION_LOG_INFO("session_manager.tcp_reassembly.timeout_ms : %lu", cfg->tcp_reassembly.timeout_ms);
SESSION_LOG_INFO("session_manager.tcp_reassembly.buffered_segments_max : %lu", cfg->tcp_reassembly.buffered_segments_max);
}
}
@@ -983,7 +895,7 @@ struct session_manager *session_manager_new(const struct session_manager_config
}
memcpy(&mgr->cfg, cfg, sizeof(struct session_manager_config));
mgr->sess_pool = session_pool_new(mgr->cfg.max_tcp_session_num + mgr->cfg.max_udp_session_num);
mgr->sess_pool = session_pool_new(mgr->cfg.tcp_session_max + mgr->cfg.udp_session_max);
mgr->tcp_sess_table = session_table_new();
mgr->udp_sess_table = session_table_new();
mgr->sess_timer = session_timer_new(now_ms);
@@ -991,21 +903,21 @@ struct session_manager *session_manager_new(const struct session_manager_config
{
goto error;
}
if (mgr->cfg.evicted_session_filter_enable)
if (mgr->cfg.evicted_session_bloom_filter.enable)
{
mgr->evicte_sess_filter = session_filter_new(mgr->cfg.evicted_session_filter_capacity,
mgr->cfg.evicted_session_filter_timeout_ms,
mgr->cfg.evicted_session_filter_error_rate, now_ms);
mgr->evicte_sess_filter = session_filter_new(mgr->cfg.evicted_session_bloom_filter.capacity,
mgr->cfg.evicted_session_bloom_filter.time_window_ms,
mgr->cfg.evicted_session_bloom_filter.error_rate, now_ms);
if (mgr->evicte_sess_filter == NULL)
{
goto error;
}
}
if (mgr->cfg.duplicated_packet_filter_enable)
if (mgr->cfg.duplicated_packet_bloom_filter.enable)
{
mgr->dup_pkt_filter = packet_filter_new(mgr->cfg.duplicated_packet_filter_capacity,
mgr->cfg.duplicated_packet_filter_timeout_ms,
mgr->cfg.duplicated_packet_filter_error_rate, now_ms);
mgr->dup_pkt_filter = packet_filter_new(mgr->cfg.duplicated_packet_bloom_filter.capacity,
mgr->cfg.duplicated_packet_bloom_filter.time_window_ms,
mgr->cfg.duplicated_packet_bloom_filter.error_rate, now_ms);
if (mgr->dup_pkt_filter == NULL)
{
goto error;
@@ -1046,11 +958,11 @@ void session_manager_free(struct session_manager *mgr)
{
session_manager_free_session(mgr, sess);
}
if (mgr->cfg.evicted_session_filter_enable)
if (mgr->cfg.evicted_session_bloom_filter.enable)
{
session_filter_free(mgr->evicte_sess_filter);
}
if (mgr->cfg.duplicated_packet_filter_enable)
if (mgr->cfg.duplicated_packet_bloom_filter.enable)
{
packet_filter_free(mgr->dup_pkt_filter);
}
@@ -1070,7 +982,7 @@ void session_manager_set_session_id_generator(struct session_manager *mgr, sessi
void session_manager_record_duplicated_packet(struct session_manager *mgr, const struct packet *pkt)
{
if (mgr->cfg.duplicated_packet_filter_enable)
if (mgr->cfg.duplicated_packet_bloom_filter.enable)
{
packet_filter_add(mgr->dup_pkt_filter, pkt, mgr->now_ms);
}
@@ -1255,10 +1167,10 @@ struct session *session_manager_get_expired_session(struct session_manager *mgr,
switch (session_get_type(sess))
{
case SESSION_TYPE_TCP:
session_timer_update(mgr->sess_timer, sess, now_ms + mgr->cfg.tcp_data_timeout_ms);
session_timer_update(mgr->sess_timer, sess, now_ms + mgr->cfg.tcp_timeout_ms.data);
break;
case SESSION_TYPE_UDP:
session_timer_update(mgr->sess_timer, sess, now_ms + mgr->cfg.udp_data_timeout_ms);
session_timer_update(mgr->sess_timer, sess, now_ms + mgr->cfg.udp_timeout_ms.data);
break;
default:
assert(0);
@@ -1294,7 +1206,7 @@ uint64_t session_manager_clean_session(struct session_manager *mgr, uint64_t now
uint64_t expired_sess_num = 0;
uint8_t expired_sess_canbe_clean = 0;
if (now_ms - mgr->last_clean_expired_sess_ts >= mgr->cfg.session_expire_polling_interval_ms)
if (now_ms - mgr->last_clean_expired_sess_ts >= mgr->cfg.expire_period_ms)
{
expired_sess_canbe_clean = 1;
}
@@ -1310,7 +1222,7 @@ uint64_t session_manager_clean_session(struct session_manager *mgr, uint64_t now
// then clean expired session
else
{
if (expired_sess_canbe_clean && expired_sess_num < mgr->cfg.session_expire_polling_limit)
if (expired_sess_canbe_clean && expired_sess_num < mgr->cfg.expire_batch_max)
{
mgr->last_clean_expired_sess_ts = now_ms;
sess = session_manager_get_expired_session(mgr, now_ms);
@@ -1356,11 +1268,11 @@ void session_set_discard(struct session *sess)
switch (type)
{
case SESSION_TYPE_TCP:
session_timer_update(mgr->sess_timer, sess, mgr->now_ms + mgr->cfg.tcp_discard_timeout_ms);
session_timer_update(mgr->sess_timer, sess, mgr->now_ms + mgr->cfg.tcp_timeout_ms.discard_default);
SESS_MGR_STAT_UPDATE(&mgr->stat, curr_state, next_state, tcp);
break;
case SESSION_TYPE_UDP:
session_timer_update(mgr->sess_timer, sess, mgr->now_ms + mgr->cfg.udp_discard_timeout_ms);
session_timer_update(mgr->sess_timer, sess, mgr->now_ms + mgr->cfg.udp_timeout_ms.discard_default);
SESS_MGR_STAT_UPDATE(&mgr->stat, curr_state, next_state, udp);
break;
default:

View File

@@ -10,46 +10,54 @@ extern "C"
struct session_manager_config
{
// max session number
uint64_t max_tcp_session_num;
uint64_t max_udp_session_num;
uint64_t tcp_session_max;
uint64_t udp_session_max;
// session overload
uint8_t tcp_overload_evict_old_sess; // 1: evict old session, 0: bypass new session
uint8_t udp_overload_evict_old_sess; // 1: evict old session, 0: bypass new session
uint8_t evict_old_on_tcp_table_limit; // range: [0, 1]
uint8_t evict_old_on_udp_table_limit; // range: [0, 1]
// TCP timeout
uint64_t tcp_init_timeout_ms; // range: [1, 60000] (ms)
uint64_t tcp_handshake_timeout_ms; // range: [1, 60000] (ms)
uint64_t tcp_data_timeout_ms; // range: [1, 15999999000] (ms)
uint64_t tcp_half_closed_timeout_ms; // range: [1, 604800000] (ms)
uint64_t tcp_time_wait_timeout_ms; // range: [1, 600000] (ms)
uint64_t tcp_discard_timeout_ms; // range: [1, 15999999000] (ms)
uint64_t tcp_unverified_rst_timeout_ms; // range: [1, 600000] (ms)
// UDP timeout
uint64_t udp_data_timeout_ms; // range: [1, 15999999000] (ms)
uint64_t udp_discard_timeout_ms; // range: [1, 15999999000] (ms)
uint64_t expire_period_ms; // range: [0, 60000] (ms)
uint64_t expire_batch_max; // range: [1, 1024]
// limit
uint64_t session_expire_polling_interval_ms; // range: [0, 60000] (ms)
uint64_t session_expire_polling_limit; // range: [1, 1024]
struct
{
uint64_t init; // range: [1, 60000] (ms)
uint64_t handshake; // range: [1, 60000] (ms)
uint64_t data; // range: [1, 15999999000] (ms)
uint64_t half_closed; // range: [1, 604800000] (ms)
uint64_t time_wait; // range: [1, 600000] (ms)
uint64_t discard_default; // range: [1, 15999999000] (ms)
uint64_t unverified_rst; // range: [1, 600000] (ms)
} tcp_timeout_ms;
// duplicate packet filter
uint8_t duplicated_packet_filter_enable;
uint32_t duplicated_packet_filter_capacity; // range: [1, 4294967295]
uint32_t duplicated_packet_filter_timeout_ms; // range: [1, 60000] (ms)
double duplicated_packet_filter_error_rate; // range: [0.0, 1.0]
struct
{
uint64_t data; // range: [1, 15999999000] (ms)
uint64_t discard_default; // range: [1, 15999999000] (ms)
} udp_timeout_ms;
// evicted session filter
uint8_t evicted_session_filter_enable;
uint32_t evicted_session_filter_capacity; // range: [1, 4294967295]
uint32_t evicted_session_filter_timeout_ms; // range: [1, 60000] (ms)
double evicted_session_filter_error_rate; // range: [0.0, 1.0]
struct
{
uint8_t enable; // range: [0, 1]
uint32_t capacity; // range: [1, 4294967295]
uint32_t time_window_ms; // range: [1, 60000] (ms)
double error_rate; // range: [0.0, 1.0]
} duplicated_packet_bloom_filter;
// TCP reassembly
uint8_t tcp_reassembly_enable;
uint32_t tcp_reassembly_max_timeout_ms; // range: [1, 60000] (ms)
uint32_t tcp_reassembly_max_segments; // range: [2, 512]
struct
{
uint8_t enable; // range: [0, 1]
uint32_t capacity; // range: [1, 4294967295]
uint32_t time_window_ms; // range: [1, 60000] (ms)
double error_rate; // range: [0.0, 1.0]
} evicted_session_bloom_filter;
struct
{
uint8_t enable; // range: [0, 1]
uint32_t timeout_ms; // range: [1, 60000] (ms)
uint32_t buffered_segments_max; // range: [2, 512]
} tcp_reassembly;
};
struct __attribute__((aligned(64))) session_manager_stat

View File

@@ -0,0 +1,65 @@
#pragma once
#ifdef __cplusplus
extern "C"
{
#endif
#include "session_manager.h"
static struct session_manager_config cfg = {
.tcp_session_max = 256,
.udp_session_max = 256,
.evict_old_on_tcp_table_limit = 1,
.evict_old_on_udp_table_limit = 1,
.expire_period_ms = 0,
.expire_batch_max = 1024,
.tcp_timeout_ms =
{
.init = 1,
.handshake = 2,
.data = 3,
.half_closed = 4,
.time_wait = 5,
.discard_default = 6,
.unverified_rst = 7,
},
.udp_timeout_ms =
{
.data = 8,
.discard_default = 0,
},
.duplicated_packet_bloom_filter =
{
.enable = 1,
.capacity = 1000,
.time_window_ms = 10,
.error_rate = 0.0001,
},
.evicted_session_bloom_filter =
{
.enable = 1,
.capacity = 1000,
.time_window_ms = 10,
.error_rate = 0.0001,
},
.tcp_reassembly =
{
.enable = 1,
.timeout_ms = 1000,
.buffered_segments_max = 16,
},
};
#ifdef __cplusplus
}
#endif

View File

@@ -4,51 +4,7 @@
#include "packet_private.h"
#include "packet_parser.h"
#include "session_private.h"
#include "session_manager.h"
struct session_manager_config cfg = {
// max session number
.max_tcp_session_num = 256,
.max_udp_session_num = 256,
// session overload
.tcp_overload_evict_old_sess = 1, // 1: evict old session, 0: bypass new session
.udp_overload_evict_old_sess = 1, // 1: evict old session, 0: bypass new session
// tcp timeout
.tcp_init_timeout_ms = 1,
.tcp_handshake_timeout_ms = 2,
.tcp_data_timeout_ms = 3,
.tcp_half_closed_timeout_ms = 4,
.tcp_time_wait_timeout_ms = 5,
.tcp_discard_timeout_ms = 6,
.tcp_unverified_rst_timeout_ms = 7,
// udp timeout
.udp_data_timeout_ms = 8,
.udp_discard_timeout_ms = 0,
// limit
.session_expire_polling_interval_ms = 0,
.session_expire_polling_limit = 1024,
// duplicate packet filter
.duplicated_packet_filter_enable = 1,
.duplicated_packet_filter_capacity = 1000,
.duplicated_packet_filter_timeout_ms = 10,
.duplicated_packet_filter_error_rate = 0.0001,
// evicted session filter
.evicted_session_filter_enable = 1,
.evicted_session_filter_capacity = 1000,
.evicted_session_filter_timeout_ms = 10,
.evicted_session_filter_error_rate = 0.0001,
// TCP Reassembly
.tcp_reassembly_enable = 1,
.tcp_reassembly_max_timeout_ms = 60000,
.tcp_reassembly_max_segments = 16,
};
#include "default_config.h"
static uint64_t session_id_generator(uint64_t now_ms __attribute__((unused)))
{
@@ -406,8 +362,8 @@ TEST(CASE, TCP_FAST_OPEN)
EXPECT_TRUE(stat->tcp_sess_closing == 0);
// expire session
EXPECT_TRUE(session_manager_get_expired_session(mgr, 1 + cfg.tcp_init_timeout_ms) == NULL); // opening -> closing
sess = session_manager_get_expired_session(mgr, 1 + cfg.tcp_init_timeout_ms + cfg.tcp_data_timeout_ms); // closing -> closed
EXPECT_TRUE(session_manager_get_expired_session(mgr, 1 + cfg.tcp_timeout_ms.init) == NULL); // opening -> closing
sess = session_manager_get_expired_session(mgr, 1 + cfg.tcp_timeout_ms.init + cfg.tcp_timeout_ms.data); // closing -> closed
EXPECT_TRUE(sess);
EXPECT_TRUE(session_get_current_state(sess) == SESSION_STATE_CLOSED);
EXPECT_TRUE(session_get_closing_reason(sess) == CLOSING_BY_TIMEOUT);

View File

@@ -3,53 +3,9 @@
#include "packet_private.h"
#include "packet_parser.h"
#include "session_private.h"
#include "session_manager.h"
#include "default_config.h"
#include "test_packets.h"
struct session_manager_config cfg = {
// max session number
.max_tcp_session_num = 256,
.max_udp_session_num = 256,
// session overload
.tcp_overload_evict_old_sess = 1, // 1: evict old session, 0: bypass new session
.udp_overload_evict_old_sess = 1, // 1: evict old session, 0: bypass new session
// tcp timeout
.tcp_init_timeout_ms = 1,
.tcp_handshake_timeout_ms = 2,
.tcp_data_timeout_ms = 3,
.tcp_half_closed_timeout_ms = 4,
.tcp_time_wait_timeout_ms = 5,
.tcp_discard_timeout_ms = 6,
.tcp_unverified_rst_timeout_ms = 7,
// udp timeout
.udp_data_timeout_ms = 8,
.udp_discard_timeout_ms = 0,
// limit
.session_expire_polling_interval_ms = 0,
.session_expire_polling_limit = 1024,
// duplicate packet filter
.duplicated_packet_filter_enable = 1,
.duplicated_packet_filter_capacity = 1000,
.duplicated_packet_filter_timeout_ms = 10,
.duplicated_packet_filter_error_rate = 0.0001,
// evicted session filter
.evicted_session_filter_enable = 1,
.evicted_session_filter_capacity = 1000,
.evicted_session_filter_timeout_ms = 10,
.evicted_session_filter_error_rate = 0.0001,
// TCP Reassembly
.tcp_reassembly_enable = 1,
.tcp_reassembly_max_timeout_ms = 60000,
.tcp_reassembly_max_segments = 16,
};
static uint64_t session_id_generator(uint64_t now_ms __attribute__((unused)))
{
static uint64_t count = 0;
@@ -292,7 +248,7 @@ TEST(TCP_DUPKT_FILTER_DISABLE, SYN_DUP)
struct session_manager_stat *stat = NULL;
struct session_manager_config _cfg;
memcpy(&_cfg, &cfg, sizeof(struct session_manager_config));
_cfg.duplicated_packet_filter_enable = 0;
_cfg.duplicated_packet_bloom_filter.enable = 0;
mgr = session_manager_new(&_cfg, 1);
EXPECT_TRUE(mgr != NULL);
@@ -343,7 +299,7 @@ TEST(TCP_DUPKT_FILTER_DISABLE, SYNACK_DUP)
struct session_manager_stat *stat = NULL;
struct session_manager_config _cfg;
memcpy(&_cfg, &cfg, sizeof(struct session_manager_config));
_cfg.duplicated_packet_filter_enable = 0;
_cfg.duplicated_packet_bloom_filter.enable = 0;
mgr = session_manager_new(&_cfg, 1);
EXPECT_TRUE(mgr != NULL);

View File

@@ -4,53 +4,9 @@
#include "packet_private.h"
#include "packet_parser.h"
#include "session_private.h"
#include "session_manager.h"
#include "default_config.h"
#include "test_packets.h"
struct session_manager_config cfg = {
// max session number
.max_tcp_session_num = RX_BURST_MAX * 2,
.max_udp_session_num = RX_BURST_MAX * 2,
// session overload
.tcp_overload_evict_old_sess = 1, // 1: evict old session, 0: bypass new session
.udp_overload_evict_old_sess = 1, // 1: evict old session, 0: bypass new session
// tcp timeout
.tcp_init_timeout_ms = 1,
.tcp_handshake_timeout_ms = 2,
.tcp_data_timeout_ms = 3,
.tcp_half_closed_timeout_ms = 4,
.tcp_time_wait_timeout_ms = 5,
.tcp_discard_timeout_ms = 6,
.tcp_unverified_rst_timeout_ms = 7,
// udp timeout
.udp_data_timeout_ms = 8,
.udp_discard_timeout_ms = 0,
// limit
.session_expire_polling_interval_ms = 0,
.session_expire_polling_limit = 1024,
// duplicate packet filter
.duplicated_packet_filter_enable = 1,
.duplicated_packet_filter_capacity = 1000,
.duplicated_packet_filter_timeout_ms = 10,
.duplicated_packet_filter_error_rate = 0.0001,
// evicted session filter
.evicted_session_filter_enable = 1,
.evicted_session_filter_capacity = 1000,
.evicted_session_filter_timeout_ms = 10,
.evicted_session_filter_error_rate = 0.0001,
// TCP Reassembly
.tcp_reassembly_enable = 1,
.tcp_reassembly_max_timeout_ms = 60000,
.tcp_reassembly_max_segments = 16,
};
static uint64_t session_id_generator(uint64_t now_ms __attribute__((unused)))
{
static uint64_t count = 0;
@@ -71,8 +27,12 @@ TEST(TCP_OVERLOAD, EVICT_OLD_SESS)
struct packet pkt;
struct session_manager *mgr = NULL;
struct session_manager_stat *stat = NULL;
struct session_manager_config _cfg;
memcpy(&_cfg, &cfg, sizeof(struct session_manager_config));
_cfg.tcp_session_max = RX_BURST_MAX * 2;
_cfg.udp_session_max = RX_BURST_MAX * 2;
mgr = session_manager_new(&cfg, 1);
mgr = session_manager_new(&_cfg, 1);
EXPECT_TRUE(mgr != NULL);
session_manager_set_session_id_generator(mgr, session_id_generator);
@@ -83,15 +43,15 @@ TEST(TCP_OVERLOAD, EVICT_OLD_SESS)
printf("<= Packet Parse: done\n\n");
// new session
for (uint32_t i = 0; i < cfg.max_tcp_session_num; i++)
for (uint32_t i = 0; i < _cfg.tcp_session_max; i++)
{
packet_set_ip_src_addr(&pkt, i);
EXPECT_TRUE(session_manager_new_session(mgr, &pkt, 1));
}
printf("=> Session Manager: after add %lu new sessions\n", cfg.max_tcp_session_num);
printf("=> Session Manager: after add %lu new sessions\n", _cfg.tcp_session_max);
stat = session_manager_stat(mgr);
EXPECT_TRUE(stat);
EXPECT_TRUE(stat->tcp_sess_used == cfg.max_tcp_session_num);
EXPECT_TRUE(stat->tcp_sess_used == _cfg.tcp_session_max);
EXPECT_TRUE(stat->tcp_sess_opening == RX_BURST_MAX);
EXPECT_TRUE(stat->tcp_sess_active == 0);
EXPECT_TRUE(stat->tcp_sess_closing == 0);
@@ -112,7 +72,9 @@ TEST(TCP_OVERLOAD, EVICT_NEW_SESS)
struct session_manager_stat *stat = NULL;
struct session_manager_config _cfg;
memcpy(&_cfg, &cfg, sizeof(struct session_manager_config));
_cfg.tcp_overload_evict_old_sess = 0;
_cfg.tcp_session_max = RX_BURST_MAX * 2;
_cfg.udp_session_max = RX_BURST_MAX * 2;
_cfg.evict_old_on_tcp_table_limit = 0;
mgr = session_manager_new(&_cfg, 1);
EXPECT_TRUE(mgr != NULL);
@@ -125,16 +87,16 @@ TEST(TCP_OVERLOAD, EVICT_NEW_SESS)
printf("<= Packet Parse: done\n\n");
// new session
for (uint32_t i = 0; i < cfg.max_tcp_session_num; i++)
for (uint32_t i = 0; i < _cfg.tcp_session_max; i++)
{
packet_set_ip_src_addr(&pkt, i);
EXPECT_TRUE(session_manager_new_session(mgr, &pkt, 1));
}
printf("=> Session Manager: after add %lu new sessions\n", cfg.max_tcp_session_num);
printf("=> Session Manager: after add %lu new sessions\n", _cfg.tcp_session_max);
stat = session_manager_stat(mgr);
EXPECT_TRUE(stat);
EXPECT_TRUE(stat->tcp_sess_used == cfg.max_tcp_session_num);
EXPECT_TRUE(stat->tcp_sess_opening == cfg.max_tcp_session_num);
EXPECT_TRUE(stat->tcp_sess_used == _cfg.tcp_session_max);
EXPECT_TRUE(stat->tcp_sess_opening == _cfg.tcp_session_max);
EXPECT_TRUE(stat->tcp_sess_active == 0);
EXPECT_TRUE(stat->tcp_sess_closing == 0);
EXPECT_TRUE(stat->tcp_sess_closed == 0);
@@ -145,15 +107,15 @@ TEST(TCP_OVERLOAD, EVICT_NEW_SESS)
// table full, evict new session
for (uint32_t i = 0; i < RX_BURST_MAX; i++)
{
packet_set_ip_src_addr(&pkt, cfg.max_tcp_session_num + i);
packet_set_ip_src_addr(&pkt, _cfg.tcp_session_max + i);
EXPECT_TRUE(session_manager_lookup_session_by_packet(mgr, &pkt) == NULL);
EXPECT_TRUE(session_manager_new_session(mgr, &pkt, 1) == NULL);
}
printf("=> Session Manager: after evicte new session\n");
stat = session_manager_stat(mgr);
EXPECT_TRUE(stat);
EXPECT_TRUE(stat->tcp_sess_used == cfg.max_tcp_session_num);
EXPECT_TRUE(stat->tcp_sess_opening == cfg.max_tcp_session_num);
EXPECT_TRUE(stat->tcp_sess_used == _cfg.tcp_session_max);
EXPECT_TRUE(stat->tcp_sess_opening == _cfg.tcp_session_max);
EXPECT_TRUE(stat->tcp_sess_active == 0);
EXPECT_TRUE(stat->tcp_sess_closing == 0);
EXPECT_TRUE(stat->tcp_sess_closed == 0);

View File

@@ -4,53 +4,9 @@
#include "packet_private.h"
#include "packet_parser.h"
#include "session_private.h"
#include "session_manager.h"
#include "default_config.h"
#include "test_packets.h"
struct session_manager_config cfg = {
// max session number
.max_tcp_session_num = RX_BURST_MAX * 2,
.max_udp_session_num = RX_BURST_MAX * 2,
// session overload
.tcp_overload_evict_old_sess = 1, // 1: evict old session, 0: bypass new session
.udp_overload_evict_old_sess = 1, // 1: evict old session, 0: bypass new session
// tcp timeout
.tcp_init_timeout_ms = 1,
.tcp_handshake_timeout_ms = 2,
.tcp_data_timeout_ms = 3,
.tcp_half_closed_timeout_ms = 4,
.tcp_time_wait_timeout_ms = 5,
.tcp_discard_timeout_ms = 6,
.tcp_unverified_rst_timeout_ms = 7,
// udp timeout
.udp_data_timeout_ms = 8,
.udp_discard_timeout_ms = 0,
// limit
.session_expire_polling_interval_ms = 0,
.session_expire_polling_limit = 1024,
// duplicate packet filter
.duplicated_packet_filter_enable = 1,
.duplicated_packet_filter_capacity = 1000,
.duplicated_packet_filter_timeout_ms = 10,
.duplicated_packet_filter_error_rate = 0.0001,
// evicted session filter
.evicted_session_filter_enable = 1,
.evicted_session_filter_capacity = 1000,
.evicted_session_filter_timeout_ms = 10,
.evicted_session_filter_error_rate = 0.0001,
// TCP Reassembly
.tcp_reassembly_enable = 1,
.tcp_reassembly_max_timeout_ms = 60000,
.tcp_reassembly_max_segments = 16,
};
static uint64_t session_id_generator(uint64_t now_ms __attribute__((unused)))
{
static uint64_t count = 0;
@@ -72,8 +28,12 @@ TEST(UDP_OVERLOAD, EVICT_OLD_SESS)
struct session *sess = NULL;
struct session_manager *mgr = NULL;
struct session_manager_stat *stat = NULL;
struct session_manager_config _cfg;
memcpy(&_cfg, &cfg, sizeof(struct session_manager_config));
_cfg.tcp_session_max = RX_BURST_MAX * 2;
_cfg.udp_session_max = RX_BURST_MAX * 2;
mgr = session_manager_new(&cfg, 1);
mgr = session_manager_new(&_cfg, 1);
EXPECT_TRUE(mgr != NULL);
session_manager_set_session_id_generator(mgr, session_id_generator);
@@ -84,15 +44,15 @@ TEST(UDP_OVERLOAD, EVICT_OLD_SESS)
printf("<= Packet Parse: done\n\n");
// new session
for (uint32_t i = 0; i < cfg.max_udp_session_num; i++)
for (uint32_t i = 0; i < _cfg.udp_session_max; i++)
{
packet_set_ip_src_addr(&pkt, i);
EXPECT_TRUE(session_manager_new_session(mgr, &pkt, 1));
}
printf("=> Session Manager: after add %lu new sessions\n", cfg.max_udp_session_num);
printf("=> Session Manager: after add %lu new sessions\n", _cfg.udp_session_max);
stat = session_manager_stat(mgr);
EXPECT_TRUE(stat);
EXPECT_TRUE(stat->udp_sess_used == cfg.max_udp_session_num);
EXPECT_TRUE(stat->udp_sess_used == _cfg.udp_session_max);
EXPECT_TRUE(stat->udp_sess_opening == RX_BURST_MAX);
EXPECT_TRUE(stat->udp_sess_active == 0);
EXPECT_TRUE(stat->udp_sess_closing == 0);
@@ -136,7 +96,7 @@ TEST(UDP_OVERLOAD, EVICT_OLD_SESS)
// evicted session timeout
packet_set_ip_src_addr(&pkt, 0);
EXPECT_TRUE(session_manager_lookup_session_by_packet(mgr, &pkt) == NULL);
EXPECT_TRUE(session_manager_new_session(mgr, &pkt, 1 + cfg.evicted_session_filter_timeout_ms));
EXPECT_TRUE(session_manager_new_session(mgr, &pkt, 1 + _cfg.evicted_session_bloom_filter.time_window_ms));
printf("=> Session Manager: after evicted session timeout\n");
stat = session_manager_stat(mgr);
EXPECT_TRUE(stat);
@@ -161,7 +121,9 @@ TEST(UDP_OVERLOAD, EVICT_NEW_SESS)
struct session_manager_stat *stat = NULL;
struct session_manager_config _cfg;
memcpy(&_cfg, &cfg, sizeof(struct session_manager_config));
_cfg.udp_overload_evict_old_sess = 0;
_cfg.tcp_session_max = RX_BURST_MAX * 2;
_cfg.udp_session_max = RX_BURST_MAX * 2;
_cfg.evict_old_on_udp_table_limit = 0;
mgr = session_manager_new(&_cfg, 1);
EXPECT_TRUE(mgr != NULL);
@@ -174,16 +136,16 @@ TEST(UDP_OVERLOAD, EVICT_NEW_SESS)
printf("<= Packet Parse: done\n\n");
// new session
for (uint32_t i = 0; i < cfg.max_udp_session_num; i++)
for (uint32_t i = 0; i < _cfg.udp_session_max; i++)
{
packet_set_ip_src_addr(&pkt, i);
EXPECT_TRUE(session_manager_new_session(mgr, &pkt, 1));
}
printf("=> Session Manager: after add %lu new sessions\n", cfg.max_udp_session_num);
printf("=> Session Manager: after add %lu new sessions\n", _cfg.udp_session_max);
stat = session_manager_stat(mgr);
EXPECT_TRUE(stat);
EXPECT_TRUE(stat->udp_sess_used == cfg.max_udp_session_num);
EXPECT_TRUE(stat->udp_sess_opening == cfg.max_udp_session_num);
EXPECT_TRUE(stat->udp_sess_used == _cfg.udp_session_max);
EXPECT_TRUE(stat->udp_sess_opening == _cfg.udp_session_max);
EXPECT_TRUE(stat->udp_sess_active == 0);
EXPECT_TRUE(stat->udp_sess_closing == 0);
EXPECT_TRUE(stat->udp_sess_closed == 0);
@@ -197,15 +159,15 @@ TEST(UDP_OVERLOAD, EVICT_NEW_SESS)
// table full, evict new session
for (uint32_t i = 0; i < RX_BURST_MAX; i++)
{
packet_set_ip_src_addr(&pkt, cfg.max_udp_session_num + i);
packet_set_ip_src_addr(&pkt, _cfg.udp_session_max + i);
EXPECT_TRUE(session_manager_lookup_session_by_packet(mgr, &pkt) == NULL);
EXPECT_TRUE(session_manager_new_session(mgr, &pkt, 1) == NULL);
}
printf("=> Session Manager: after readd %d evicted session\n", RX_BURST_MAX);
stat = session_manager_stat(mgr);
EXPECT_TRUE(stat);
EXPECT_TRUE(stat->udp_sess_used == cfg.max_udp_session_num);
EXPECT_TRUE(stat->udp_sess_opening == cfg.max_udp_session_num);
EXPECT_TRUE(stat->udp_sess_used == _cfg.udp_session_max);
EXPECT_TRUE(stat->udp_sess_opening == _cfg.udp_session_max);
EXPECT_TRUE(stat->udp_sess_active == 0);
EXPECT_TRUE(stat->udp_sess_closing == 0);
EXPECT_TRUE(stat->udp_sess_closed == 0);

View File

@@ -1,55 +1,11 @@
#include <gtest/gtest.h>
#include "session_private.h"
#include "session_manager.h"
#include "packet_private.h"
#include "packet_parser.h"
#include "default_config.h"
#include "test_packets.h"
struct session_manager_config cfg = {
// max session number
.max_tcp_session_num = 256,
.max_udp_session_num = 256,
// session overload
.tcp_overload_evict_old_sess = 1, // 1: evict old session, 0: bypass new session
.udp_overload_evict_old_sess = 1, // 1: evict old session, 0: bypass new session
// tcp timeout
.tcp_init_timeout_ms = 1,
.tcp_handshake_timeout_ms = 2,
.tcp_data_timeout_ms = 3,
.tcp_half_closed_timeout_ms = 4,
.tcp_time_wait_timeout_ms = 5,
.tcp_discard_timeout_ms = 6,
.tcp_unverified_rst_timeout_ms = 7,
// udp timeout
.udp_data_timeout_ms = 8,
.udp_discard_timeout_ms = 0,
// limit
.session_expire_polling_interval_ms = 0,
.session_expire_polling_limit = 1024,
// duplicate packet filter
.duplicated_packet_filter_enable = 1,
.duplicated_packet_filter_capacity = 1000,
.duplicated_packet_filter_timeout_ms = 10,
.duplicated_packet_filter_error_rate = 0.0001,
// evicted session filter
.evicted_session_filter_enable = 1,
.evicted_session_filter_capacity = 1000,
.evicted_session_filter_timeout_ms = 10,
.evicted_session_filter_error_rate = 0.0001,
// TCP Reassembly
.tcp_reassembly_enable = 1,
.tcp_reassembly_max_timeout_ms = 60000,
.tcp_reassembly_max_segments = 16,
};
static uint64_t session_id_generator(uint64_t now_ms __attribute__((unused)))
{
static uint64_t count = 0;

View File

@@ -3,53 +3,9 @@
#include "packet_private.h"
#include "packet_parser.h"
#include "session_private.h"
#include "session_manager.h"
#include "default_config.h"
#include "test_packets.h"
struct session_manager_config cfg = {
// max session number
.max_tcp_session_num = 256,
.max_udp_session_num = 256,
// session overload
.tcp_overload_evict_old_sess = 1, // 1: evict old session, 0: bypass new session
.udp_overload_evict_old_sess = 1, // 1: evict old session, 0: bypass new session
// tcp timeout
.tcp_init_timeout_ms = 1,
.tcp_handshake_timeout_ms = 2,
.tcp_data_timeout_ms = 3,
.tcp_half_closed_timeout_ms = 4,
.tcp_time_wait_timeout_ms = 5,
.tcp_discard_timeout_ms = 6,
.tcp_unverified_rst_timeout_ms = 7,
// udp timeout
.udp_data_timeout_ms = 8,
.udp_discard_timeout_ms = 0,
// limit
.session_expire_polling_interval_ms = 0,
.session_expire_polling_limit = 1024,
// duplicate packet filter
.duplicated_packet_filter_enable = 1,
.duplicated_packet_filter_capacity = 1000,
.duplicated_packet_filter_timeout_ms = 10,
.duplicated_packet_filter_error_rate = 0.0001,
// evicted session filter
.evicted_session_filter_enable = 1,
.evicted_session_filter_capacity = 1000,
.evicted_session_filter_timeout_ms = 10,
.evicted_session_filter_error_rate = 0.0001,
// TCP Reassembly
.tcp_reassembly_enable = 1,
.tcp_reassembly_max_timeout_ms = 60000,
.tcp_reassembly_max_segments = 16,
};
static uint64_t session_id_generator(uint64_t now_ms __attribute__((unused)))
{
static uint64_t count = 0;
@@ -249,8 +205,8 @@ TEST(SESS_MGR_TCP_REASSEMBLY, OUT_OF_ORDER)
session_free_tcp_segment(sess, seg);
// expire session
EXPECT_TRUE(session_manager_get_expired_session(mgr, 7 + cfg.tcp_data_timeout_ms) == NULL); // active -> closing
sess = session_manager_get_expired_session(mgr, 7 + cfg.tcp_data_timeout_ms + cfg.tcp_data_timeout_ms); // closing -> closed
EXPECT_TRUE(session_manager_get_expired_session(mgr, 7 + cfg.tcp_timeout_ms.data) == NULL); // active -> closing
sess = session_manager_get_expired_session(mgr, 7 + cfg.tcp_timeout_ms.data + cfg.tcp_timeout_ms.data); // closing -> closed
EXPECT_TRUE(sess);
EXPECT_TRUE(session_get_current_state(sess) == SESSION_STATE_CLOSED);
EXPECT_TRUE(session_get_closing_reason(sess) == CLOSING_BY_TIMEOUT);
@@ -343,8 +299,8 @@ TEST(SESS_MGR_TCP_REASSEMBLY, SEQ_WRAPAROUND)
session_free_tcp_segment(sess, seg);
// expire session
EXPECT_TRUE(session_manager_get_expired_session(mgr, 4 + cfg.tcp_data_timeout_ms) == NULL); // active -> closing
sess = session_manager_get_expired_session(mgr, 4 + cfg.tcp_data_timeout_ms + cfg.tcp_data_timeout_ms); // closing -> closed
EXPECT_TRUE(session_manager_get_expired_session(mgr, 4 + cfg.tcp_timeout_ms.data) == NULL); // active -> closing
sess = session_manager_get_expired_session(mgr, 4 + cfg.tcp_timeout_ms.data + cfg.tcp_timeout_ms.data); // closing -> closed
EXPECT_TRUE(sess);
EXPECT_TRUE(session_get_current_state(sess) == SESSION_STATE_CLOSED);
EXPECT_TRUE(session_get_closing_reason(sess) == CLOSING_BY_TIMEOUT);

View File

@@ -5,53 +5,9 @@
#include "packet_private.h"
#include "packet_parser.h"
#include "session_private.h"
#include "session_manager.h"
#include "default_config.h"
#include "test_packets.h"
struct session_manager_config cfg = {
// max session number
.max_tcp_session_num = 256,
.max_udp_session_num = 256,
// session overload
.tcp_overload_evict_old_sess = 1, // 1: evict old session, 0: bypass new session
.udp_overload_evict_old_sess = 1, // 1: evict old session, 0: bypass new session
// tcp timeout
.tcp_init_timeout_ms = 1,
.tcp_handshake_timeout_ms = 2,
.tcp_data_timeout_ms = 3,
.tcp_half_closed_timeout_ms = 4,
.tcp_time_wait_timeout_ms = 5,
.tcp_discard_timeout_ms = 6,
.tcp_unverified_rst_timeout_ms = 7,
// udp timeout
.udp_data_timeout_ms = 8,
.udp_discard_timeout_ms = 0,
// limit
.session_expire_polling_interval_ms = 0,
.session_expire_polling_limit = 1024,
// duplicate packet filter
.duplicated_packet_filter_enable = 1,
.duplicated_packet_filter_capacity = 1000,
.duplicated_packet_filter_timeout_ms = 10,
.duplicated_packet_filter_error_rate = 0.0001,
// evicted session filter
.evicted_session_filter_enable = 1,
.evicted_session_filter_capacity = 1000,
.evicted_session_filter_timeout_ms = 10,
.evicted_session_filter_error_rate = 0.0001,
// TCP Reassembly
.tcp_reassembly_enable = 1,
.tcp_reassembly_max_timeout_ms = 60000,
.tcp_reassembly_max_segments = 16,
};
static uint64_t session_id_generator(uint64_t now_ms __attribute__((unused)))
{
static uint64_t count = 0;
@@ -159,7 +115,7 @@ TEST(TCP_ACTIVE_TO_CLOSING, BY_FIN_FIN)
EXPECT_TRUE(stat->tcp_sess_closing == 1);
// expire session
sess = session_manager_get_expired_session(mgr, 3 + cfg.tcp_time_wait_timeout_ms);
sess = session_manager_get_expired_session(mgr, 3 + cfg.tcp_timeout_ms.time_wait);
EXPECT_TRUE(sess);
EXPECT_TRUE(session_get_current_state(sess) == SESSION_STATE_CLOSED);
EXPECT_TRUE(session_get_closing_reason(sess) == CLOSING_BY_CLIENT_FIN);
@@ -245,7 +201,7 @@ TEST(TCP_ACTIVE_TO_CLOSING, BY_C2S_RST)
EXPECT_TRUE(stat->tcp_sess_closing == 1);
// expire session
sess = session_manager_get_expired_session(mgr, 3 + cfg.tcp_unverified_rst_timeout_ms);
sess = session_manager_get_expired_session(mgr, 3 + cfg.tcp_timeout_ms.unverified_rst);
EXPECT_TRUE(sess);
EXPECT_TRUE(session_get_current_state(sess) == SESSION_STATE_CLOSED);
EXPECT_TRUE(session_get_closing_reason(sess) == CLOSING_BY_CLIENT_RST);
@@ -331,7 +287,7 @@ TEST(TCP_ACTIVE_TO_CLOSING, BY_S2C_RST)
EXPECT_TRUE(stat->tcp_sess_closing == 1);
// expire session
sess = session_manager_get_expired_session(mgr, 3 + cfg.tcp_unverified_rst_timeout_ms);
sess = session_manager_get_expired_session(mgr, 3 + cfg.tcp_timeout_ms.unverified_rst);
EXPECT_TRUE(sess);
EXPECT_TRUE(session_get_current_state(sess) == SESSION_STATE_CLOSED);
EXPECT_TRUE(session_get_closing_reason(sess) == CLOSING_BY_SERVER_RST);
@@ -378,8 +334,8 @@ TEST(TCP_ACTIVE_TO_CLOSING, BY_DATA_TIMEOUT)
EXPECT_TRUE(stat->tcp_sess_closing == 0);
// expire session
EXPECT_TRUE(session_manager_get_expired_session(mgr, 2 + cfg.tcp_data_timeout_ms) == NULL);
sess = session_manager_get_expired_session(mgr, 2 + cfg.tcp_data_timeout_ms + cfg.tcp_data_timeout_ms);
EXPECT_TRUE(session_manager_get_expired_session(mgr, 2 + cfg.tcp_timeout_ms.data) == NULL);
sess = session_manager_get_expired_session(mgr, 2 + cfg.tcp_timeout_ms.data + cfg.tcp_timeout_ms.data);
EXPECT_TRUE(sess);
EXPECT_TRUE(session_get_current_state(sess) == SESSION_STATE_CLOSED);
EXPECT_TRUE(session_get_closing_reason(sess) == CLOSING_BY_TIMEOUT);
@@ -459,7 +415,7 @@ TEST(TCP_ACTIVE_TO_CLOSING, BY_C2S_HALF_CLOSED_TIMEOUT)
EXPECT_TRUE(stat->tcp_sess_closing == 1);
// expire session
sess = session_manager_get_expired_session(mgr, 3 + cfg.tcp_half_closed_timeout_ms);
sess = session_manager_get_expired_session(mgr, 3 + cfg.tcp_timeout_ms.half_closed);
EXPECT_TRUE(sess);
EXPECT_TRUE(session_get_current_state(sess) == SESSION_STATE_CLOSED);
EXPECT_TRUE(session_get_closing_reason(sess) == CLOSING_BY_CLIENT_FIN);
@@ -539,7 +495,7 @@ TEST(TCP_ACTIVE_TO_CLOSING, BY_S2C_HALF_CLOSED_TIMEOUT)
EXPECT_TRUE(stat->tcp_sess_closing == 1);
// expire session
sess = session_manager_get_expired_session(mgr, 3 + cfg.tcp_half_closed_timeout_ms);
sess = session_manager_get_expired_session(mgr, 3 + cfg.tcp_timeout_ms.half_closed);
EXPECT_TRUE(sess);
EXPECT_TRUE(session_get_current_state(sess) == SESSION_STATE_CLOSED);
EXPECT_TRUE(session_get_closing_reason(sess) == CLOSING_BY_SERVER_FIN);

View File

@@ -5,53 +5,9 @@
#include "packet_private.h"
#include "packet_parser.h"
#include "session_private.h"
#include "session_manager.h"
#include "default_config.h"
#include "test_packets.h"
struct session_manager_config cfg = {
// max session number
.max_tcp_session_num = 256,
.max_udp_session_num = 256,
// session overload
.tcp_overload_evict_old_sess = 1, // 1: evict old session, 0: bypass new session
.udp_overload_evict_old_sess = 1, // 1: evict old session, 0: bypass new session
// tcp timeout
.tcp_init_timeout_ms = 1,
.tcp_handshake_timeout_ms = 2,
.tcp_data_timeout_ms = 3,
.tcp_half_closed_timeout_ms = 4,
.tcp_time_wait_timeout_ms = 5,
.tcp_discard_timeout_ms = 6,
.tcp_unverified_rst_timeout_ms = 7,
// udp timeout
.udp_data_timeout_ms = 8,
.udp_discard_timeout_ms = 0,
// limit
.session_expire_polling_interval_ms = 0,
.session_expire_polling_limit = 1024,
// duplicate packet filter
.duplicated_packet_filter_enable = 1,
.duplicated_packet_filter_capacity = 1000,
.duplicated_packet_filter_timeout_ms = 10,
.duplicated_packet_filter_error_rate = 0.0001,
// evicted session filter
.evicted_session_filter_enable = 1,
.evicted_session_filter_capacity = 1000,
.evicted_session_filter_timeout_ms = 10,
.evicted_session_filter_error_rate = 0.0001,
// TCP Reassembly
.tcp_reassembly_enable = 1,
.tcp_reassembly_max_timeout_ms = 60000,
.tcp_reassembly_max_segments = 16,
};
static uint64_t session_id_generator(uint64_t now_ms __attribute__((unused)))
{
static uint64_t count = 0;
@@ -115,8 +71,8 @@ TEST(TCP_INIT_TO_OPENING, BY_SYN)
EXPECT_TRUE(stat->tcp_sess_closing == 0);
// expire session
EXPECT_TRUE(session_manager_get_expired_session(mgr, 1 + cfg.tcp_init_timeout_ms) == NULL); // opening -> closing
sess = session_manager_get_expired_session(mgr, 1 + cfg.tcp_init_timeout_ms + cfg.tcp_data_timeout_ms); // closing -> closed
EXPECT_TRUE(session_manager_get_expired_session(mgr, 1 + cfg.tcp_timeout_ms.init) == NULL); // opening -> closing
sess = session_manager_get_expired_session(mgr, 1 + cfg.tcp_timeout_ms.init + cfg.tcp_timeout_ms.data); // closing -> closed
EXPECT_TRUE(sess);
EXPECT_TRUE(session_get_current_state(sess) == SESSION_STATE_CLOSED);
EXPECT_TRUE(session_get_closing_reason(sess) == CLOSING_BY_TIMEOUT);
@@ -193,8 +149,8 @@ TEST(TCP_INIT_TO_OPENING, BY_SYNACK)
EXPECT_TRUE(stat->tcp_sess_closing == 0);
// expire session
EXPECT_TRUE(session_manager_get_expired_session(mgr, 1 + cfg.tcp_handshake_timeout_ms) == NULL);
sess = session_manager_get_expired_session(mgr, 1 + cfg.tcp_handshake_timeout_ms + cfg.tcp_data_timeout_ms);
EXPECT_TRUE(session_manager_get_expired_session(mgr, 1 + cfg.tcp_timeout_ms.handshake) == NULL);
sess = session_manager_get_expired_session(mgr, 1 + cfg.tcp_timeout_ms.handshake + cfg.tcp_timeout_ms.data);
EXPECT_TRUE(sess);
EXPECT_TRUE(session_get_current_state(sess) == SESSION_STATE_CLOSED);
EXPECT_TRUE(session_get_closing_reason(sess) == CLOSING_BY_TIMEOUT);
@@ -283,8 +239,8 @@ TEST(TCP_INIT_TO_OPENING, BY_SYN_SYNACK)
EXPECT_TRUE(stat->tcp_sess_closing == 0);
// expire session
EXPECT_TRUE(session_manager_get_expired_session(mgr, 2 + cfg.tcp_handshake_timeout_ms) == NULL);
sess = session_manager_get_expired_session(mgr, 2 + cfg.tcp_handshake_timeout_ms + cfg.tcp_data_timeout_ms);
EXPECT_TRUE(session_manager_get_expired_session(mgr, 2 + cfg.tcp_timeout_ms.handshake) == NULL);
sess = session_manager_get_expired_session(mgr, 2 + cfg.tcp_timeout_ms.handshake + cfg.tcp_timeout_ms.data);
EXPECT_TRUE(sess);
EXPECT_TRUE(session_get_current_state(sess) == SESSION_STATE_CLOSED);
EXPECT_TRUE(session_get_closing_reason(sess) == CLOSING_BY_TIMEOUT);
@@ -385,8 +341,8 @@ TEST(TCP_INIT_TO_OPENING, BY_SYN_SYNACK_ACK)
EXPECT_TRUE(stat->tcp_sess_closing == 0);
// expire session
EXPECT_TRUE(session_manager_get_expired_session(mgr, 3 + cfg.tcp_data_timeout_ms) == NULL);
sess = session_manager_get_expired_session(mgr, 3 + cfg.tcp_data_timeout_ms + cfg.tcp_data_timeout_ms);
EXPECT_TRUE(session_manager_get_expired_session(mgr, 3 + cfg.tcp_timeout_ms.data) == NULL);
sess = session_manager_get_expired_session(mgr, 3 + cfg.tcp_timeout_ms.data + cfg.tcp_timeout_ms.data);
EXPECT_TRUE(sess);
EXPECT_TRUE(session_get_current_state(sess) == SESSION_STATE_CLOSED);
EXPECT_TRUE(session_get_closing_reason(sess) == CLOSING_BY_TIMEOUT);
@@ -482,8 +438,8 @@ TEST(TCP_INIT_TO_OPENING, BY_SYN_RETRANSMISSION)
EXPECT_TRUE(stat->tcp_sess_closing == 0);
// expire session
EXPECT_TRUE(session_manager_get_expired_session(mgr, 2 + cfg.tcp_init_timeout_ms) == NULL);
sess = session_manager_get_expired_session(mgr, 2 + cfg.tcp_init_timeout_ms + cfg.tcp_data_timeout_ms);
EXPECT_TRUE(session_manager_get_expired_session(mgr, 2 + cfg.tcp_timeout_ms.init) == NULL);
sess = session_manager_get_expired_session(mgr, 2 + cfg.tcp_timeout_ms.init + cfg.tcp_timeout_ms.data);
EXPECT_TRUE(sess);
EXPECT_TRUE(session_get_current_state(sess) == SESSION_STATE_CLOSED);
EXPECT_TRUE(session_get_closing_reason(sess) == CLOSING_BY_TIMEOUT);
@@ -580,8 +536,8 @@ TEST(TCP_INIT_TO_OPENING, BY_SYNACK_RETRANSMISSION)
EXPECT_TRUE(stat->tcp_sess_closing == 0);
// expire session
EXPECT_TRUE(session_manager_get_expired_session(mgr, 2 + cfg.tcp_handshake_timeout_ms) == NULL);
sess = session_manager_get_expired_session(mgr, 2 + cfg.tcp_handshake_timeout_ms + cfg.tcp_data_timeout_ms);
EXPECT_TRUE(session_manager_get_expired_session(mgr, 2 + cfg.tcp_timeout_ms.handshake) == NULL);
sess = session_manager_get_expired_session(mgr, 2 + cfg.tcp_timeout_ms.handshake + cfg.tcp_timeout_ms.data);
EXPECT_TRUE(sess);
EXPECT_TRUE(session_get_current_state(sess) == SESSION_STATE_CLOSED);
EXPECT_TRUE(session_get_closing_reason(sess) == CLOSING_BY_TIMEOUT);
@@ -670,8 +626,8 @@ TEST(TCP_INIT_TO_OPENING, BY_C2S_ASMMETRIC)
EXPECT_TRUE(stat->tcp_sess_closing == 0);
// expire session
EXPECT_TRUE(session_manager_get_expired_session(mgr, 2 + cfg.tcp_data_timeout_ms) == NULL);
sess = session_manager_get_expired_session(mgr, 2 + cfg.tcp_data_timeout_ms + cfg.tcp_data_timeout_ms);
EXPECT_TRUE(session_manager_get_expired_session(mgr, 2 + cfg.tcp_timeout_ms.data) == NULL);
sess = session_manager_get_expired_session(mgr, 2 + cfg.tcp_timeout_ms.data + cfg.tcp_timeout_ms.data);
EXPECT_TRUE(sess);
EXPECT_TRUE(session_get_current_state(sess) == SESSION_STATE_CLOSED);
EXPECT_TRUE(session_get_closing_reason(sess) == CLOSING_BY_TIMEOUT);
@@ -760,8 +716,8 @@ TEST(TCP_INIT_TO_OPENING, BY_S2C_ASMMETRIC)
EXPECT_TRUE(stat->tcp_sess_closing == 0);
// expire session
EXPECT_TRUE(session_manager_get_expired_session(mgr, 2 + cfg.tcp_data_timeout_ms) == NULL);
sess = session_manager_get_expired_session(mgr, 2 + cfg.tcp_data_timeout_ms + cfg.tcp_data_timeout_ms);
EXPECT_TRUE(session_manager_get_expired_session(mgr, 2 + cfg.tcp_timeout_ms.data) == NULL);
sess = session_manager_get_expired_session(mgr, 2 + cfg.tcp_timeout_ms.data + cfg.tcp_timeout_ms.data);
EXPECT_TRUE(sess);
EXPECT_TRUE(session_get_current_state(sess) == SESSION_STATE_CLOSED);
EXPECT_TRUE(session_get_closing_reason(sess) == CLOSING_BY_TIMEOUT);

View File

@@ -5,53 +5,9 @@
#include "packet_private.h"
#include "packet_parser.h"
#include "session_private.h"
#include "session_manager.h"
#include "default_config.h"
#include "test_packets.h"
struct session_manager_config cfg = {
// max session number
.max_tcp_session_num = 256,
.max_udp_session_num = 256,
// session overload
.tcp_overload_evict_old_sess = 1, // 1: evict old session, 0: bypass new session
.udp_overload_evict_old_sess = 1, // 1: evict old session, 0: bypass new session
// tcp timeout
.tcp_init_timeout_ms = 1,
.tcp_handshake_timeout_ms = 2,
.tcp_data_timeout_ms = 3,
.tcp_half_closed_timeout_ms = 4,
.tcp_time_wait_timeout_ms = 5,
.tcp_discard_timeout_ms = 6,
.tcp_unverified_rst_timeout_ms = 7,
// udp timeout
.udp_data_timeout_ms = 8,
.udp_discard_timeout_ms = 0,
// limit
.session_expire_polling_interval_ms = 0,
.session_expire_polling_limit = 1024,
// duplicate packet filter
.duplicated_packet_filter_enable = 1,
.duplicated_packet_filter_capacity = 1000,
.duplicated_packet_filter_timeout_ms = 10,
.duplicated_packet_filter_error_rate = 0.0001,
// evicted session filter
.evicted_session_filter_enable = 1,
.evicted_session_filter_capacity = 1000,
.evicted_session_filter_timeout_ms = 10,
.evicted_session_filter_error_rate = 0.0001,
// TCP Reassembly
.tcp_reassembly_enable = 1,
.tcp_reassembly_max_timeout_ms = 60000,
.tcp_reassembly_max_segments = 16,
};
static uint64_t session_id_generator(uint64_t now_ms __attribute__((unused)))
{
static uint64_t count = 0;
@@ -421,7 +377,7 @@ TEST(TCP_INIT_TO_OPENING_TO_ACTIVE_TO_CLOSING_TO_CLOSED, TEST)
EXPECT_TRUE(stat->tcp_sess_closing == 1);
// expire session
sess = session_manager_get_expired_session(mgr, 11 + cfg.tcp_time_wait_timeout_ms);
sess = session_manager_get_expired_session(mgr, 11 + cfg.tcp_timeout_ms.time_wait);
EXPECT_TRUE(sess);
EXPECT_TRUE(session_get_current_state(sess) == SESSION_STATE_CLOSED);
EXPECT_TRUE(session_get_closing_reason(sess) == CLOSING_BY_CLIENT_FIN);

View File

@@ -5,53 +5,9 @@
#include "packet_private.h"
#include "packet_parser.h"
#include "session_private.h"
#include "session_manager.h"
#include "default_config.h"
#include "test_packets.h"
struct session_manager_config cfg = {
// max session number
.max_tcp_session_num = 256,
.max_udp_session_num = 256,
// session overload
.tcp_overload_evict_old_sess = 1, // 1: evict old session, 0: bypass new session
.udp_overload_evict_old_sess = 1, // 1: evict old session, 0: bypass new session
// tcp timeout
.tcp_init_timeout_ms = 1,
.tcp_handshake_timeout_ms = 2,
.tcp_data_timeout_ms = 3,
.tcp_half_closed_timeout_ms = 4,
.tcp_time_wait_timeout_ms = 5,
.tcp_discard_timeout_ms = 6,
.tcp_unverified_rst_timeout_ms = 7,
// udp timeout
.udp_data_timeout_ms = 8,
.udp_discard_timeout_ms = 0,
// limit
.session_expire_polling_interval_ms = 0,
.session_expire_polling_limit = 1024,
// duplicate packet filter
.duplicated_packet_filter_enable = 1,
.duplicated_packet_filter_capacity = 1000,
.duplicated_packet_filter_timeout_ms = 10,
.duplicated_packet_filter_error_rate = 0.0001,
// evicted session filter
.evicted_session_filter_enable = 1,
.evicted_session_filter_capacity = 1000,
.evicted_session_filter_timeout_ms = 10,
.evicted_session_filter_error_rate = 0.0001,
// TCP Reassembly
.tcp_reassembly_enable = 1,
.tcp_reassembly_max_timeout_ms = 60000,
.tcp_reassembly_max_segments = 16,
};
static uint64_t session_id_generator(uint64_t now_ms __attribute__((unused)))
{
static uint64_t count = 0;
@@ -127,8 +83,8 @@ TEST(TCP_OPENING_TO_ACTIVE, BY_SYN_C2S_DATA)
EXPECT_TRUE(stat->tcp_sess_closing == 0);
// expire session
EXPECT_TRUE(session_manager_get_expired_session(mgr, 2 + cfg.tcp_data_timeout_ms) == NULL);
sess = session_manager_get_expired_session(mgr, 2 + cfg.tcp_data_timeout_ms + cfg.tcp_data_timeout_ms);
EXPECT_TRUE(session_manager_get_expired_session(mgr, 2 + cfg.tcp_timeout_ms.data) == NULL);
sess = session_manager_get_expired_session(mgr, 2 + cfg.tcp_timeout_ms.data + cfg.tcp_timeout_ms.data);
EXPECT_TRUE(sess);
EXPECT_TRUE(session_get_current_state(sess) == SESSION_STATE_CLOSED);
EXPECT_TRUE(session_get_closing_reason(sess) == CLOSING_BY_TIMEOUT);
@@ -217,8 +173,8 @@ TEST(TCP_OPENING_TO_ACTIVE, BY_SYNACK_S2C_DATA)
EXPECT_TRUE(stat->tcp_sess_closing == 0);
// expire session
EXPECT_TRUE(session_manager_get_expired_session(mgr, 2 + cfg.tcp_data_timeout_ms) == NULL);
sess = session_manager_get_expired_session(mgr, 2 + cfg.tcp_data_timeout_ms + cfg.tcp_data_timeout_ms);
EXPECT_TRUE(session_manager_get_expired_session(mgr, 2 + cfg.tcp_timeout_ms.data) == NULL);
sess = session_manager_get_expired_session(mgr, 2 + cfg.tcp_timeout_ms.data + cfg.tcp_timeout_ms.data);
EXPECT_TRUE(sess);
EXPECT_TRUE(session_get_current_state(sess) == SESSION_STATE_CLOSED);
EXPECT_TRUE(session_get_closing_reason(sess) == CLOSING_BY_TIMEOUT);

View File

@@ -5,53 +5,9 @@
#include "packet_private.h"
#include "packet_parser.h"
#include "session_private.h"
#include "session_manager.h"
#include "default_config.h"
#include "test_packets.h"
struct session_manager_config cfg = {
// max session number
.max_tcp_session_num = 256,
.max_udp_session_num = 256,
// session overload
.tcp_overload_evict_old_sess = 1, // 1: evict old session, 0: bypass new session
.udp_overload_evict_old_sess = 1, // 1: evict old session, 0: bypass new session
// tcp timeout
.tcp_init_timeout_ms = 1,
.tcp_handshake_timeout_ms = 2,
.tcp_data_timeout_ms = 3,
.tcp_half_closed_timeout_ms = 4,
.tcp_time_wait_timeout_ms = 5,
.tcp_discard_timeout_ms = 6,
.tcp_unverified_rst_timeout_ms = 7,
// udp timeout
.udp_data_timeout_ms = 8,
.udp_discard_timeout_ms = 0,
// limit
.session_expire_polling_interval_ms = 0,
.session_expire_polling_limit = 1024,
// duplicate packet filter
.duplicated_packet_filter_enable = 1,
.duplicated_packet_filter_capacity = 1000,
.duplicated_packet_filter_timeout_ms = 10,
.duplicated_packet_filter_error_rate = 0.0001,
// evicted session filter
.evicted_session_filter_enable = 1,
.evicted_session_filter_capacity = 1000,
.evicted_session_filter_timeout_ms = 10,
.evicted_session_filter_error_rate = 0.0001,
// TCP Reassembly
.tcp_reassembly_enable = 1,
.tcp_reassembly_max_timeout_ms = 60000,
.tcp_reassembly_max_segments = 16,
};
static uint64_t session_id_generator(uint64_t now_ms __attribute__((unused)))
{
static uint64_t count = 0;
@@ -139,7 +95,7 @@ TEST(TCP_OPENING_TO_CLOSING, BY_FIN_FIN)
EXPECT_TRUE(stat->tcp_sess_closing == 1);
// expire session
sess = session_manager_get_expired_session(mgr, 3 + cfg.tcp_time_wait_timeout_ms);
sess = session_manager_get_expired_session(mgr, 3 + cfg.tcp_timeout_ms.time_wait);
EXPECT_TRUE(sess);
EXPECT_TRUE(session_get_current_state(sess) == SESSION_STATE_CLOSED);
EXPECT_TRUE(session_get_closing_reason(sess) == CLOSING_BY_CLIENT_FIN);
@@ -234,7 +190,7 @@ TEST(TCP_OPENING_TO_CLOSING, BY_C2S_RST)
EXPECT_TRUE(stat->tcp_sess_closing == 1);
// expire session
sess = session_manager_get_expired_session(mgr, 2 + cfg.tcp_unverified_rst_timeout_ms);
sess = session_manager_get_expired_session(mgr, 2 + cfg.tcp_timeout_ms.unverified_rst);
EXPECT_TRUE(sess);
EXPECT_TRUE(session_get_current_state(sess) == SESSION_STATE_CLOSED);
EXPECT_TRUE(session_get_closing_reason(sess) == CLOSING_BY_CLIENT_RST);
@@ -329,7 +285,7 @@ TEST(TCP_OPENING_TO_CLOSING, BY_S2C_RST)
EXPECT_TRUE(stat->tcp_sess_closing == 1);
// expire session
sess = session_manager_get_expired_session(mgr, 2 + cfg.tcp_unverified_rst_timeout_ms);
sess = session_manager_get_expired_session(mgr, 2 + cfg.tcp_timeout_ms.unverified_rst);
EXPECT_TRUE(sess);
EXPECT_TRUE(session_get_current_state(sess) == SESSION_STATE_CLOSED);
EXPECT_TRUE(session_get_closing_reason(sess) == CLOSING_BY_SERVER_RST);
@@ -386,8 +342,8 @@ TEST(TCP_OPENING_TO_CLOSING, BY_INIT_TIMEOUT)
EXPECT_TRUE(stat->tcp_sess_closing == 0);
// expire session
EXPECT_TRUE(session_manager_get_expired_session(mgr, 1 + cfg.tcp_init_timeout_ms) == NULL);
sess = session_manager_get_expired_session(mgr, 1 + cfg.tcp_init_timeout_ms + cfg.tcp_data_timeout_ms);
EXPECT_TRUE(session_manager_get_expired_session(mgr, 1 + cfg.tcp_timeout_ms.init) == NULL);
sess = session_manager_get_expired_session(mgr, 1 + cfg.tcp_timeout_ms.init + cfg.tcp_timeout_ms.data);
EXPECT_TRUE(sess);
EXPECT_TRUE(session_get_current_state(sess) == SESSION_STATE_CLOSED);
EXPECT_TRUE(session_get_closing_reason(sess) == CLOSING_BY_TIMEOUT);
@@ -476,8 +432,8 @@ TEST(TCP_OPENING_TO_CLOSING, BY_HANDSHAKE_TIMEOUT)
EXPECT_TRUE(stat->tcp_sess_closing == 0);
// expire session
EXPECT_TRUE(session_manager_get_expired_session(mgr, 2 + cfg.tcp_handshake_timeout_ms) == NULL);
sess = session_manager_get_expired_session(mgr, 2 + cfg.tcp_handshake_timeout_ms + cfg.tcp_data_timeout_ms);
EXPECT_TRUE(session_manager_get_expired_session(mgr, 2 + cfg.tcp_timeout_ms.handshake) == NULL);
sess = session_manager_get_expired_session(mgr, 2 + cfg.tcp_timeout_ms.handshake + cfg.tcp_timeout_ms.data);
EXPECT_TRUE(sess);
EXPECT_TRUE(session_get_current_state(sess) == SESSION_STATE_CLOSED);
EXPECT_TRUE(session_get_closing_reason(sess) == CLOSING_BY_TIMEOUT);
@@ -578,8 +534,8 @@ TEST(TCP_OPENING_TO_CLOSING, BY_DATA_TIMEOUT)
EXPECT_TRUE(stat->tcp_sess_closing == 0);
// expire session
EXPECT_TRUE(session_manager_get_expired_session(mgr, 3 + cfg.tcp_data_timeout_ms) == NULL);
sess = session_manager_get_expired_session(mgr, 3 + cfg.tcp_data_timeout_ms + cfg.tcp_data_timeout_ms);
EXPECT_TRUE(session_manager_get_expired_session(mgr, 3 + cfg.tcp_timeout_ms.data) == NULL);
sess = session_manager_get_expired_session(mgr, 3 + cfg.tcp_timeout_ms.data + cfg.tcp_timeout_ms.data);
EXPECT_TRUE(sess);
EXPECT_TRUE(session_get_current_state(sess) == SESSION_STATE_CLOSED);
EXPECT_TRUE(session_get_closing_reason(sess) == CLOSING_BY_TIMEOUT);
@@ -668,7 +624,7 @@ TEST(TCP_OPENING_TO_CLOSING, BY_C2S_HALF_FIN)
EXPECT_TRUE(stat->tcp_sess_closing == 1);
// expire session
sess = session_manager_get_expired_session(mgr, 2 + cfg.tcp_half_closed_timeout_ms);
sess = session_manager_get_expired_session(mgr, 2 + cfg.tcp_timeout_ms.half_closed);
EXPECT_TRUE(sess);
EXPECT_TRUE(session_get_current_state(sess) == SESSION_STATE_CLOSED);
EXPECT_TRUE(session_get_closing_reason(sess) == CLOSING_BY_CLIENT_FIN);
@@ -757,7 +713,7 @@ TEST(TCP_OPENING_TO_CLOSING, BY_S2C_HALF_FIN)
EXPECT_TRUE(stat->tcp_sess_closing == 1);
// expire session
sess = session_manager_get_expired_session(mgr, 2 + cfg.tcp_half_closed_timeout_ms);
sess = session_manager_get_expired_session(mgr, 2 + cfg.tcp_timeout_ms.half_closed);
EXPECT_TRUE(sess);
EXPECT_TRUE(session_get_current_state(sess) == SESSION_STATE_CLOSED);
EXPECT_TRUE(session_get_closing_reason(sess) == CLOSING_BY_SERVER_FIN);

View File

@@ -5,53 +5,9 @@
#include "packet_private.h"
#include "packet_parser.h"
#include "session_private.h"
#include "session_manager.h"
#include "default_config.h"
#include "test_packets.h"
struct session_manager_config cfg = {
// max session number
.max_tcp_session_num = 256,
.max_udp_session_num = 256,
// session overload
.tcp_overload_evict_old_sess = 1, // 1: evict old session, 0: bypass new session
.udp_overload_evict_old_sess = 1, // 1: evict old session, 0: bypass new session
// tcp timeout
.tcp_init_timeout_ms = 1,
.tcp_handshake_timeout_ms = 2,
.tcp_data_timeout_ms = 3,
.tcp_half_closed_timeout_ms = 4,
.tcp_time_wait_timeout_ms = 5,
.tcp_discard_timeout_ms = 6,
.tcp_unverified_rst_timeout_ms = 7,
// udp timeout
.udp_data_timeout_ms = 8,
.udp_discard_timeout_ms = 0,
// limit
.session_expire_polling_interval_ms = 0,
.session_expire_polling_limit = 1024,
// duplicate packet filter
.duplicated_packet_filter_enable = 1,
.duplicated_packet_filter_capacity = 1000,
.duplicated_packet_filter_timeout_ms = 10,
.duplicated_packet_filter_error_rate = 0.0001,
// evicted session filter
.evicted_session_filter_enable = 1,
.evicted_session_filter_capacity = 1000,
.evicted_session_filter_timeout_ms = 10,
.evicted_session_filter_error_rate = 0.0001,
// TCP Reassembly
.tcp_reassembly_enable = 1,
.tcp_reassembly_max_timeout_ms = 60000,
.tcp_reassembly_max_segments = 16,
};
static uint64_t session_id_generator(uint64_t now_ms __attribute__((unused)))
{
static uint64_t count = 0;
@@ -141,8 +97,8 @@ TEST(UDP_INIT_TO_OPENING_TO_ACTIVE_TO_CLOSING, TEST)
EXPECT_TRUE(stat->udp_sess_closing == 0);
// expire session
EXPECT_TRUE(session_manager_get_expired_session(mgr, 2 + cfg.udp_data_timeout_ms) == NULL); // active -> closing
sess = session_manager_get_expired_session(mgr, 2 + cfg.udp_data_timeout_ms + cfg.udp_data_timeout_ms); // closing -> closed
EXPECT_TRUE(session_manager_get_expired_session(mgr, 2 + cfg.udp_timeout_ms.data) == NULL); // active -> closing
sess = session_manager_get_expired_session(mgr, 2 + cfg.udp_timeout_ms.data + cfg.udp_timeout_ms.data); // closing -> closed
EXPECT_TRUE(sess);
EXPECT_TRUE(session_get_current_state(sess) == SESSION_STATE_CLOSED);
EXPECT_TRUE(session_get_closing_reason(sess) == CLOSING_BY_TIMEOUT);

View File

@@ -5,53 +5,9 @@
#include "packet_private.h"
#include "packet_parser.h"
#include "session_private.h"
#include "session_manager.h"
#include "default_config.h"
#include "test_packets.h"
struct session_manager_config cfg = {
// max session number
.max_tcp_session_num = 256,
.max_udp_session_num = 256,
// session overload
.tcp_overload_evict_old_sess = 1, // 1: evict old session, 0: bypass new session
.udp_overload_evict_old_sess = 1, // 1: evict old session, 0: bypass new session
// tcp timeout
.tcp_init_timeout_ms = 1,
.tcp_handshake_timeout_ms = 2,
.tcp_data_timeout_ms = 3,
.tcp_half_closed_timeout_ms = 4,
.tcp_time_wait_timeout_ms = 5,
.tcp_discard_timeout_ms = 6,
.tcp_unverified_rst_timeout_ms = 7,
// udp timeout
.udp_data_timeout_ms = 8,
.udp_discard_timeout_ms = 0,
// limit
.session_expire_polling_interval_ms = 0,
.session_expire_polling_limit = 1024,
// duplicate packet filter
.duplicated_packet_filter_enable = 1,
.duplicated_packet_filter_capacity = 1000,
.duplicated_packet_filter_timeout_ms = 10,
.duplicated_packet_filter_error_rate = 0.0001,
// evicted session filter
.evicted_session_filter_enable = 1,
.evicted_session_filter_capacity = 1000,
.evicted_session_filter_timeout_ms = 10,
.evicted_session_filter_error_rate = 0.0001,
// TCP Reassembly
.tcp_reassembly_enable = 1,
.tcp_reassembly_max_timeout_ms = 60000,
.tcp_reassembly_max_segments = 16,
};
static uint64_t session_id_generator(uint64_t now_ms __attribute__((unused)))
{
static uint64_t count = 0;
@@ -116,8 +72,8 @@ TEST(UDP_INIT_TO_OPENING_TO_CLOSING, BY_C2S)
EXPECT_TRUE(stat->udp_sess_closing == 0);
// expire session
EXPECT_TRUE(session_manager_get_expired_session(mgr, 1 + cfg.udp_data_timeout_ms) == NULL); // opening -> closing
sess = session_manager_get_expired_session(mgr, 1 + cfg.udp_data_timeout_ms + cfg.udp_data_timeout_ms); // closing -> closed
EXPECT_TRUE(session_manager_get_expired_session(mgr, 1 + cfg.udp_timeout_ms.data) == NULL); // opening -> closing
sess = session_manager_get_expired_session(mgr, 1 + cfg.udp_timeout_ms.data + cfg.udp_timeout_ms.data); // closing -> closed
EXPECT_TRUE(sess);
EXPECT_TRUE(session_get_current_state(sess) == SESSION_STATE_CLOSED);
EXPECT_TRUE(session_get_closing_reason(sess) == CLOSING_BY_TIMEOUT);
@@ -195,8 +151,8 @@ TEST(UDP_INIT_TO_OPENING_TO_CLOSING, BY_S2C)
EXPECT_TRUE(stat->udp_sess_closing == 0);
// expire session
EXPECT_TRUE(session_manager_get_expired_session(mgr, 1 + cfg.udp_data_timeout_ms) == NULL); // opening -> closing
sess = session_manager_get_expired_session(mgr, 1 + cfg.udp_data_timeout_ms + cfg.udp_data_timeout_ms); // closing -> closed
EXPECT_TRUE(session_manager_get_expired_session(mgr, 1 + cfg.udp_timeout_ms.data) == NULL); // opening -> closing
sess = session_manager_get_expired_session(mgr, 1 + cfg.udp_timeout_ms.data + cfg.udp_timeout_ms.data); // closing -> closed
EXPECT_TRUE(sess);
EXPECT_TRUE(session_get_current_state(sess) == SESSION_STATE_CLOSED);

View File

@@ -4,53 +4,9 @@
#include "packet_private.h"
#include "packet_parser.h"
#include "session_private.h"
#include "session_manager.h"
#include "default_config.h"
#include "test_packets.h"
struct session_manager_config cfg = {
// max session number
.max_tcp_session_num = 256,
.max_udp_session_num = 256,
// session overload
.tcp_overload_evict_old_sess = 1, // 1: evict old session, 0: bypass new session
.udp_overload_evict_old_sess = 1, // 1: evict old session, 0: bypass new session
// tcp timeout
.tcp_init_timeout_ms = 1,
.tcp_handshake_timeout_ms = 2,
.tcp_data_timeout_ms = 3,
.tcp_half_closed_timeout_ms = 4,
.tcp_time_wait_timeout_ms = 5,
.tcp_discard_timeout_ms = 6,
.tcp_unverified_rst_timeout_ms = 7,
// udp timeout
.udp_data_timeout_ms = 8,
.udp_discard_timeout_ms = 0,
// limit
.session_expire_polling_interval_ms = 0,
.session_expire_polling_limit = 1024,
// duplicate packet filter
.duplicated_packet_filter_enable = 1,
.duplicated_packet_filter_capacity = 1000,
.duplicated_packet_filter_timeout_ms = 10,
.duplicated_packet_filter_error_rate = 0.0001,
// evicted session filter
.evicted_session_filter_enable = 1,
.evicted_session_filter_capacity = 1000,
.evicted_session_filter_timeout_ms = 10,
.evicted_session_filter_error_rate = 0.0001,
// TCP Reassembly
.tcp_reassembly_enable = 1,
.tcp_reassembly_max_timeout_ms = 60000,
.tcp_reassembly_max_segments = 16,
};
static uint64_t session_id_generator(uint64_t now_ms __attribute__((unused)))
{
static uint64_t count = 0;
@@ -93,8 +49,8 @@ TEST(TIMEOUT, TCP_TIMEOUT_DATA)
EXPECT_TRUE(session_manager_update_session(mgr, sess, &pkt, 2) == 0);
// expire session
EXPECT_TRUE(session_manager_get_expired_session(mgr, 2 + cfg.tcp_data_timeout_ms) == NULL);
sess = session_manager_get_expired_session(mgr, 2 + cfg.tcp_data_timeout_ms + cfg.tcp_data_timeout_ms);
EXPECT_TRUE(session_manager_get_expired_session(mgr, 2 + cfg.tcp_timeout_ms.data) == NULL);
sess = session_manager_get_expired_session(mgr, 2 + cfg.tcp_timeout_ms.data + cfg.tcp_timeout_ms.data);
EXPECT_TRUE(sess);
EXPECT_TRUE(session_get_current_state(sess) == SESSION_STATE_CLOSED);
EXPECT_TRUE(session_get_closing_reason(sess) == CLOSING_BY_TIMEOUT);

View File

@@ -4,53 +4,9 @@
#include "packet_private.h"
#include "packet_parser.h"
#include "session_private.h"
#include "session_manager.h"
#include "default_config.h"
#include "test_packets.h"
struct session_manager_config cfg = {
// max session number
.max_tcp_session_num = 256,
.max_udp_session_num = 256,
// session overload
.tcp_overload_evict_old_sess = 1, // 1: evict old session, 0: bypass new session
.udp_overload_evict_old_sess = 1, // 1: evict old session, 0: bypass new session
// tcp timeout
.tcp_init_timeout_ms = 1,
.tcp_handshake_timeout_ms = 2,
.tcp_data_timeout_ms = 3,
.tcp_half_closed_timeout_ms = 4,
.tcp_time_wait_timeout_ms = 5,
.tcp_discard_timeout_ms = 6,
.tcp_unverified_rst_timeout_ms = 7,
// udp timeout
.udp_data_timeout_ms = 8,
.udp_discard_timeout_ms = 0,
// limit
.session_expire_polling_interval_ms = 0,
.session_expire_polling_limit = 1024,
// duplicate packet filter
.duplicated_packet_filter_enable = 1,
.duplicated_packet_filter_capacity = 1000,
.duplicated_packet_filter_timeout_ms = 10,
.duplicated_packet_filter_error_rate = 0.0001,
// evicted session filter
.evicted_session_filter_enable = 1,
.evicted_session_filter_capacity = 1000,
.evicted_session_filter_timeout_ms = 10,
.evicted_session_filter_error_rate = 0.0001,
// TCP Reassembly
.tcp_reassembly_enable = 1,
.tcp_reassembly_max_timeout_ms = 60000,
.tcp_reassembly_max_segments = 16,
};
static uint64_t session_id_generator(uint64_t now_ms __attribute__((unused)))
{
static uint64_t count = 0;
@@ -81,8 +37,8 @@ TEST(TIMEOUT, TCP_TIMEOUT_HANDSHAKE)
EXPECT_TRUE(sess);
// expire session
EXPECT_TRUE(session_manager_get_expired_session(mgr, 1 + cfg.tcp_handshake_timeout_ms) == NULL);
sess = session_manager_get_expired_session(mgr, 1 + cfg.tcp_handshake_timeout_ms + cfg.tcp_data_timeout_ms);
EXPECT_TRUE(session_manager_get_expired_session(mgr, 1 + cfg.tcp_timeout_ms.handshake) == NULL);
sess = session_manager_get_expired_session(mgr, 1 + cfg.tcp_timeout_ms.handshake + cfg.tcp_timeout_ms.data);
EXPECT_TRUE(sess);
EXPECT_TRUE(session_get_current_state(sess) == SESSION_STATE_CLOSED);
EXPECT_TRUE(session_get_closing_reason(sess) == CLOSING_BY_TIMEOUT);

View File

@@ -4,53 +4,9 @@
#include "packet_private.h"
#include "packet_parser.h"
#include "session_private.h"
#include "session_manager.h"
#include "default_config.h"
#include "test_packets.h"
struct session_manager_config cfg = {
// max session number
.max_tcp_session_num = 256,
.max_udp_session_num = 256,
// session overload
.tcp_overload_evict_old_sess = 1, // 1: evict old session, 0: bypass new session
.udp_overload_evict_old_sess = 1, // 1: evict old session, 0: bypass new session
// tcp timeout
.tcp_init_timeout_ms = 1,
.tcp_handshake_timeout_ms = 2,
.tcp_data_timeout_ms = 3,
.tcp_half_closed_timeout_ms = 4,
.tcp_time_wait_timeout_ms = 5,
.tcp_discard_timeout_ms = 6,
.tcp_unverified_rst_timeout_ms = 7,
// udp timeout
.udp_data_timeout_ms = 8,
.udp_discard_timeout_ms = 0,
// limit
.session_expire_polling_interval_ms = 0,
.session_expire_polling_limit = 1024,
// duplicate packet filter
.duplicated_packet_filter_enable = 1,
.duplicated_packet_filter_capacity = 1000,
.duplicated_packet_filter_timeout_ms = 10,
.duplicated_packet_filter_error_rate = 0.0001,
// evicted session filter
.evicted_session_filter_enable = 1,
.evicted_session_filter_capacity = 1000,
.evicted_session_filter_timeout_ms = 10,
.evicted_session_filter_error_rate = 0.0001,
// TCP Reassembly
.tcp_reassembly_enable = 1,
.tcp_reassembly_max_timeout_ms = 60000,
.tcp_reassembly_max_segments = 16,
};
static uint64_t session_id_generator(uint64_t now_ms __attribute__((unused)))
{
static uint64_t count = 0;
@@ -81,8 +37,8 @@ TEST(TIMEOUT, TCP_TIMEOUT_INIT)
EXPECT_TRUE(sess);
// expire session
EXPECT_TRUE(session_manager_get_expired_session(mgr, 1 + cfg.tcp_init_timeout_ms) == NULL); // opening -> closing
sess = session_manager_get_expired_session(mgr, 1 + cfg.tcp_init_timeout_ms + cfg.tcp_data_timeout_ms); // closing -> closed
EXPECT_TRUE(session_manager_get_expired_session(mgr, 1 + cfg.tcp_timeout_ms.init) == NULL); // opening -> closing
sess = session_manager_get_expired_session(mgr, 1 + cfg.tcp_timeout_ms.init + cfg.tcp_timeout_ms.data); // closing -> closed
EXPECT_TRUE(sess);
EXPECT_TRUE(session_get_current_state(sess) == SESSION_STATE_CLOSED);
EXPECT_TRUE(session_get_closing_reason(sess) == CLOSING_BY_TIMEOUT);

View File

@@ -4,53 +4,9 @@
#include "packet_private.h"
#include "packet_parser.h"
#include "session_private.h"
#include "session_manager.h"
#include "default_config.h"
#include "test_packets.h"
struct session_manager_config cfg = {
// max session number
.max_tcp_session_num = 256,
.max_udp_session_num = 256,
// session overload
.tcp_overload_evict_old_sess = 1, // 1: evict old session, 0: bypass new session
.udp_overload_evict_old_sess = 1, // 1: evict old session, 0: bypass new session
// tcp timeout
.tcp_init_timeout_ms = 1,
.tcp_handshake_timeout_ms = 2,
.tcp_data_timeout_ms = 3,
.tcp_half_closed_timeout_ms = 4,
.tcp_time_wait_timeout_ms = 5,
.tcp_discard_timeout_ms = 6,
.tcp_unverified_rst_timeout_ms = 7,
// udp timeout
.udp_data_timeout_ms = 8,
.udp_discard_timeout_ms = 0,
// limit
.session_expire_polling_interval_ms = 0,
.session_expire_polling_limit = 1024,
// duplicate packet filter
.duplicated_packet_filter_enable = 1,
.duplicated_packet_filter_capacity = 1000,
.duplicated_packet_filter_timeout_ms = 10,
.duplicated_packet_filter_error_rate = 0.0001,
// evicted session filter
.evicted_session_filter_enable = 1,
.evicted_session_filter_capacity = 1000,
.evicted_session_filter_timeout_ms = 10,
.evicted_session_filter_error_rate = 0.0001,
// TCP Reassembly
.tcp_reassembly_enable = 1,
.tcp_reassembly_max_timeout_ms = 60000,
.tcp_reassembly_max_segments = 16,
};
static uint64_t session_id_generator(uint64_t now_ms __attribute__((unused)))
{
static uint64_t count = 0;
@@ -81,8 +37,8 @@ TEST(TIMEOUT, UDP_TIMEOUT_DATA1)
EXPECT_TRUE(sess);
// expire session
EXPECT_TRUE(session_manager_get_expired_session(mgr, 1 + cfg.udp_data_timeout_ms) == NULL); // opening -> closing
sess = session_manager_get_expired_session(mgr, 1 + cfg.udp_data_timeout_ms + cfg.udp_data_timeout_ms); // closing -> closed
EXPECT_TRUE(session_manager_get_expired_session(mgr, 1 + cfg.udp_timeout_ms.data) == NULL); // opening -> closing
sess = session_manager_get_expired_session(mgr, 1 + cfg.udp_timeout_ms.data + cfg.udp_timeout_ms.data); // closing -> closed
EXPECT_TRUE(sess);
EXPECT_TRUE(session_get_current_state(sess) == SESSION_STATE_CLOSED);
EXPECT_TRUE(session_get_closing_reason(sess) == CLOSING_BY_TIMEOUT);
@@ -130,8 +86,8 @@ TEST(TIMEOUT, UDP_TIMEOUT_DATA2)
EXPECT_TRUE(session_manager_update_session(mgr, sess, &pkt, 2) == 0);
// expire session
EXPECT_TRUE(session_manager_get_expired_session(mgr, 2 + cfg.udp_data_timeout_ms) == NULL); // active -> closing
sess = session_manager_get_expired_session(mgr, 2 + cfg.udp_data_timeout_ms + cfg.udp_data_timeout_ms); // closing -> closed
EXPECT_TRUE(session_manager_get_expired_session(mgr, 2 + cfg.udp_timeout_ms.data) == NULL); // active -> closing
sess = session_manager_get_expired_session(mgr, 2 + cfg.udp_timeout_ms.data + cfg.udp_timeout_ms.data); // closing -> closed
EXPECT_TRUE(sess);
EXPECT_TRUE(session_get_current_state(sess) == SESSION_STATE_CLOSED);
EXPECT_TRUE(session_get_closing_reason(sess) == CLOSING_BY_TIMEOUT);

View File

@@ -1,67 +1,65 @@
[snowflake]
snowflake_base = 1 # [0, 31]
snowflake_offset = 2 # [0, 127]
snowflake_base = 1 # [0, 31]
snowflake_offset = 2 # [0, 127]
[packet_io]
mode = "pcapfile" # pcapfile, pcaplist, marsio
app_symbol = "stellar"
dev_symbol = "nf_0_fw"
pcap_path = "./pcap/test.pcap"
nr_worker_thread = 1 # range: [1, 256]
cpu_mask = [5, 6, 7, 8, 9, 10, 11, 12]
idle_yield_interval_ms = 900 # range: [0, 60000] (ms)
mode = "pcapfile" # pcapfile, pcaplist, marsio
app_symbol = "stellar"
dev_symbol = "nf_0_fw"
pcap_path = "./pcap/test.pcap"
nr_worker_thread = 1 # range: [1, 256]
cpu_mask = [5, 6, 7, 8, 9, 10, 11, 12]
idle_yield_interval_ms = 900 # range: [0, 60000] (ms)
[ip_reassembly]
enable = 1
bucket_entries = 32 # range: [1, 4294967295] (must be power of 2)
bucket_num = 1024 # range: [1, 4294967295]
enable = 1
bucket_entries = 32 # range: [1, 4294967295] (must be power of 2)
bucket_num = 1024 # range: [1, 4294967295]
ip_frag_timeout_ms = 10000 # range: [1, 60000] (ms)
ip_frag_expire_polling_interval_ms = 0 # range: [0, 60000] (ms)
ip_frag_expire_polling_limit = 1024 # range: [1, 1024]
ip_frag_timeout_ms = 10000 # range: [1, 60000] (ms)
ip_frag_expire_polling_interval_ms = 0 # range: [0, 60000] (ms)
ip_frag_expire_polling_limit = 1024 # range: [1, 1024]
[session_manager]
# max session number
max_tcp_session_num = 50000
max_udp_session_num = 50000
tcp_session_max = 50000
udp_session_max = 50000
# session overload evict
tcp_overload_evict_old_sess = 1 # 1: evict old session, 0: bypass new session
udp_overload_evict_old_sess = 1 # 1: evict old session, 0: bypass new session
evict_old_on_tcp_table_limit = 1 # range: [0, 1]
evict_old_on_udp_table_limit = 1 # range: [0, 1]
# TCP timeout
tcp_init_timeout_ms = 50 # range: [1, 60000] (ms)
tcp_handshake_timeout_ms = 50 # range: [1, 60000] (ms)
tcp_data_timeout_ms = 50 # range: [1, 15999999000] (ms)
tcp_half_closed_timeout_ms = 50 # range: [1, 604800000] (ms)
tcp_time_wait_timeout_ms = 50 # range: [1, 600000] (ms)
tcp_discard_timeout_ms = 10 # range: [1, 15999999000] (ms)
tcp_unverified_rst_timeout_ms = 50 # range: [1, 600000] (ms)
# UDP timeout
udp_data_timeout_ms = 50 # range: [1, 15999999000] (ms)
udp_discard_timeout_ms = 50 # range: [1, 15999999000] (ms)
expire_period_ms = 0 # range: [0, 60000] (ms)
expire_batch_max = 1024 # range: [1, 1024]
# limit
session_expire_polling_interval_ms = 0 # range: [0, 60000] (ms)
session_expire_polling_limit = 1024 # range: [1, 1024]
[session_manager.tcp_timeout_ms]
init = 5000 # range: [1, 60000] (ms)
handshake = 5000 # range: [1, 60000] (ms)
data = 5000 # range: [1, 15999999000] (ms)
half_closed = 5000 # range: [1, 604800000] (ms)
time_wait = 5000 # range: [1, 600000] (ms)
discard_default = 10000 # range: [1, 15999999000] (ms)
unverified_rst = 5000 # range: [1, 600000] (ms)
# duplicate packet filter
duplicated_packet_filter_enable = 1
duplicated_packet_filter_capacity = 1000000 # range: [1, 4294967295]
duplicated_packet_filter_timeout_ms = 10000 # range: [1, 60000] (ms)
duplicated_packet_filter_error_rate = 0.00001 # range: [0.0, 1.0]
[session_manager.udp_timeout_ms]
data = 5000 # range: [1, 15999999000] (ms)
discard_default = 5000 # range: [1, 15999999000] (ms)
# evicted session filter
evicted_session_filter_enable = 1
evicted_session_filter_capacity = 1000000 # range: [1, 4294967295]
evicted_session_filter_timeout_ms = 10000 # range: [1, 60000] (ms)
evicted_session_filter_error_rate = 0.00001 # range: [0.0, 1.0]
[session_manager.duplicated_packet_bloom_filter]
enable = 1
capacity = 1000000 # range: [1, 4294967295]
time_window_ms = 10000 # range: [1, 60000] (ms)
error_rate = 0.00001 # range: [0.0, 1.0]
# TCP reassembly (Per direction)
tcp_reassembly_enable = 1
tcp_reassembly_max_timeout_ms = 10000 # range: [1, 60000] (ms)
tcp_reassembly_max_segments = 256 # range: [2, 4096]
[session_manager.evicted_session_bloom_filter]
enable = 1 # range: [0, 1]
capacity = 1000000 # range: [1, 4294967295]
time_window_ms = 10000 # range: [1, 60000] (ms)
error_rate = 0.00001 # range: [0.0, 1.0]
[session_manager.tcp_reassembly]
enable = 1 # range: [0, 1]
timeout_ms = 10000 # range: [1, 60000] (ms)
buffered_segments_max = 256 # range: [2, 4096] per flow
[schedule]
merge_stat_interval = 50 # range: [1, 60000] (ms)
output_stat_interval = 10 # range: [1, 60000] (ms)
merge_stat_interval = 500 # range: [1, 60000] (ms)
output_stat_interval = 2000 # range: [1, 60000] (ms)

View File

@@ -1,67 +1,65 @@
[snowflake]
snowflake_base = 1 # [0, 31]
snowflake_offset = 2 # [0, 127]
snowflake_base = 1 # [0, 31]
snowflake_offset = 2 # [0, 127]
[packet_io]
mode = "pcapfile" # pcapfile, pcaplist, marsio
app_symbol = "stellar"
dev_symbol = "nf_0_fw"
pcap_path = "/tmp/test.pcap"
nr_worker_thread = 1 # range: [1, 256]
cpu_mask = [5]
idle_yield_interval_ms = 900 # range: [0, 60000] (ms)
mode = "pcapfile" # pcapfile, pcaplist, marsio
app_symbol = "stellar"
dev_symbol = "nf_0_fw"
pcap_path = "/tmp/test.pcap"
nr_worker_thread = 1 # range: [1, 256]
cpu_mask = [5, 6, 7, 8, 9, 10, 11, 12]
idle_yield_interval_ms = 900 # range: [0, 60000] (ms)
[ip_reassembly]
enable = 1
bucket_entries = 32 # range: [1, 4294967295] (must be power of 2)
bucket_num = 1024 # range: [1, 4294967295]
enable = 1
bucket_entries = 32 # range: [1, 4294967295] (must be power of 2)
bucket_num = 1024 # range: [1, 4294967295]
ip_frag_timeout_ms = 10000 # range: [1, 60000] (ms)
ip_frag_expire_polling_interval_ms = 0 # range: [0, 60000] (ms)
ip_frag_expire_polling_limit = 1024 # range: [1, 1024]
ip_frag_timeout_ms = 10000 # range: [1, 60000] (ms)
ip_frag_expire_polling_interval_ms = 0 # range: [0, 60000] (ms)
ip_frag_expire_polling_limit = 1024 # range: [1, 1024]
[session_manager]
# max session number
max_tcp_session_num = 50000
max_udp_session_num = 50000
tcp_session_max = 50000
udp_session_max = 50000
# session overload evict
tcp_overload_evict_old_sess = 1 # 1: evict old session, 0: bypass new session
udp_overload_evict_old_sess = 1 # 1: evict old session, 0: bypass new session
evict_old_on_tcp_table_limit = 1 # range: [0, 1]
evict_old_on_udp_table_limit = 1 # range: [0, 1]
# TCP timeout
tcp_init_timeout_ms = 50 # range: [1, 60000] (ms)
tcp_handshake_timeout_ms = 50 # range: [1, 60000] (ms)
tcp_data_timeout_ms = 50 # range: [1, 15999999000] (ms)
tcp_half_closed_timeout_ms = 50 # range: [1, 604800000] (ms)
tcp_time_wait_timeout_ms = 50 # range: [1, 600000] (ms)
tcp_discard_timeout_ms = 50 # range: [1, 15999999000] (ms)
tcp_unverified_rst_timeout_ms = 50 # range: [1, 600000] (ms)
# UDP timeout
udp_data_timeout_ms = 50 # range: [1, 15999999000] (ms)
udp_discard_timeout_ms = 50 # range: [1, 15999999000] (ms)
expire_period_ms = 0 # range: [0, 60000] (ms)
expire_batch_max = 1024 # range: [1, 1024]
# limit
session_expire_polling_interval_ms = 0 # range: [0, 60000] (ms)
session_expire_polling_limit = 1024 # range: [1, 1024]
[session_manager.tcp_timeout_ms]
init = 5000 # range: [1, 60000] (ms)
handshake = 5000 # range: [1, 60000] (ms)
data = 5000 # range: [1, 15999999000] (ms)
half_closed = 5000 # range: [1, 604800000] (ms)
time_wait = 5000 # range: [1, 600000] (ms)
discard_default = 10000 # range: [1, 15999999000] (ms)
unverified_rst = 5000 # range: [1, 600000] (ms)
# duplicate packet filter
duplicated_packet_filter_enable = 1
duplicated_packet_filter_capacity = 1000000 # range: [1, 4294967295]
duplicated_packet_filter_timeout_ms = 100 # range: [1, 60000] (ms)
duplicated_packet_filter_error_rate = 0.00001 # range: [0.0, 1.0]
[session_manager.udp_timeout_ms]
data = 5000 # range: [1, 15999999000] (ms)
discard_default = 5000 # range: [1, 15999999000] (ms)
# evicted session filter
evicted_session_filter_enable = 1
evicted_session_filter_capacity = 1000000 # range: [1, 4294967295]
evicted_session_filter_timeout_ms = 100 # range: [1, 60000] (ms)
evicted_session_filter_error_rate = 0.00001 # range: [0.0, 1.0]
[session_manager.duplicated_packet_bloom_filter]
enable = 1
capacity = 1000000 # range: [1, 4294967295]
time_window_ms = 10000 # range: [1, 60000] (ms)
error_rate = 0.00001 # range: [0.0, 1.0]
# TCP reassembly (Per direction)
tcp_reassembly_enable = 1
tcp_reassembly_max_timeout_ms = 10000 # range: [1, 60000] (ms)
tcp_reassembly_max_segments = 128 # range: [2, 4096]
[session_manager.evicted_session_bloom_filter]
enable = 1 # range: [0, 1]
capacity = 1000000 # range: [1, 4294967295]
time_window_ms = 10000 # range: [1, 60000] (ms)
error_rate = 0.00001 # range: [0.0, 1.0]
[session_manager.tcp_reassembly]
enable = 1 # range: [0, 1]
timeout_ms = 10000 # range: [1, 60000] (ms)
buffered_segments_max = 256 # range: [2, 4096] per flow
[schedule]
merge_stat_interval = 50 # range: [1, 60000] (ms)
output_stat_interval = 2000 # range: [1, 60000] (ms)
merge_stat_interval = 500 # range: [1, 60000] (ms)
output_stat_interval = 2000 # range: [1, 60000] (ms)