feature: add session monitor, support 'show session id/all/info' command
This commit is contained in:
@@ -72,6 +72,11 @@
|
|||||||
cli_request_timeout = 3 # second
|
cli_request_timeout = 3 # second
|
||||||
pktdump_task_max_num = 3
|
pktdump_task_max_num = 3
|
||||||
|
|
||||||
|
[[module]]
|
||||||
|
path = ""
|
||||||
|
init = "monitor_on_init"
|
||||||
|
exit = "monitor_on_exit"
|
||||||
|
|
||||||
[[module]]
|
[[module]]
|
||||||
path = ""
|
path = ""
|
||||||
init = "packet_manager_on_init"
|
init = "packet_manager_on_init"
|
||||||
@@ -88,5 +93,5 @@
|
|||||||
|
|
||||||
[[module]]
|
[[module]]
|
||||||
path = ""
|
path = ""
|
||||||
init="monitor_on_init"
|
init = "session_monitor_on_init"
|
||||||
exit="monitor_on_exit"
|
exit = "session_monitor_on_exit"
|
||||||
|
|||||||
@@ -3,8 +3,9 @@ add_library(session_manager
|
|||||||
session_pool.c
|
session_pool.c
|
||||||
session_table.c
|
session_table.c
|
||||||
session_timer.c
|
session_timer.c
|
||||||
session_filter.c
|
session_dabloom.c
|
||||||
session_transition.c
|
session_transition.c
|
||||||
|
session_monitor.c
|
||||||
session_manager.c
|
session_manager.c
|
||||||
session_manager_cfg.c
|
session_manager_cfg.c
|
||||||
session_manager_rte.c
|
session_manager_rte.c
|
||||||
@@ -13,6 +14,6 @@ add_library(session_manager
|
|||||||
target_include_directories(session_manager PUBLIC ${CMAKE_CURRENT_LIST_DIR})
|
target_include_directories(session_manager PUBLIC ${CMAKE_CURRENT_LIST_DIR})
|
||||||
target_include_directories(session_manager PUBLIC ${CMAKE_SOURCE_DIR}/infra/)
|
target_include_directories(session_manager PUBLIC ${CMAKE_SOURCE_DIR}/infra/)
|
||||||
target_include_directories(session_manager PUBLIC ${CMAKE_SOURCE_DIR}/include)
|
target_include_directories(session_manager PUBLIC ${CMAKE_SOURCE_DIR}/include)
|
||||||
target_link_libraries(session_manager timeout packet_manager tcp_reassembly mq exdata fieldstat4)
|
target_link_libraries(session_manager timeout packet_manager tcp_reassembly mq exdata fieldstat4 monitor)
|
||||||
|
|
||||||
add_subdirectory(test)
|
add_subdirectory(test)
|
||||||
@@ -598,10 +598,15 @@ void session_manager_on_thread_exit(struct module_manager *mod_mgr, int thread_i
|
|||||||
session_manager_clean(sess_mgr, thread_id);
|
session_manager_clean(sess_mgr, thread_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
// temp add for show session command
|
struct session_manager_rte *session_manager_get_rte(struct session_manager *sess_mgr, uint16_t thread_id)
|
||||||
struct session_manager_rte *session_manager_get_runtime(struct session_manager *sess_mgr, uint16_t thread_id)
|
|
||||||
{
|
{
|
||||||
assert(sess_mgr);
|
assert(sess_mgr);
|
||||||
assert(thread_id < sess_mgr->cfg->thread_num);
|
assert(thread_id < sess_mgr->cfg->thread_num);
|
||||||
return sess_mgr->rte[thread_id];
|
return sess_mgr->rte[thread_id];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct session_manager_cfg *session_manager_get_cfg(struct session_manager *sess_mgr)
|
||||||
|
{
|
||||||
|
assert(sess_mgr);
|
||||||
|
return sess_mgr->cfg;
|
||||||
|
}
|
||||||
16
infra/session_manager/session_manager.h
Normal file
16
infra/session_manager/session_manager.h
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
struct session_manager;
|
||||||
|
struct session_manager_rte *session_manager_get_rte(struct session_manager *sess_mgr, uint16_t thread_id);
|
||||||
|
struct session_manager_cfg *session_manager_get_cfg(struct session_manager *sess_mgr);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
@@ -36,9 +36,9 @@ struct session_manager_cfg *session_manager_cfg_new(const char *toml_file)
|
|||||||
ret += load_toml_integer_config(toml_file, "session_manager.tcp_timeout_ms.handshake", &sess_mgr_cfg->tcp_timeout_ms.handshake, 1, 60000);
|
ret += load_toml_integer_config(toml_file, "session_manager.tcp_timeout_ms.handshake", &sess_mgr_cfg->tcp_timeout_ms.handshake, 1, 60000);
|
||||||
ret += load_toml_integer_config(toml_file, "session_manager.tcp_timeout_ms.data", &sess_mgr_cfg->tcp_timeout_ms.data, 1, 15999999000);
|
ret += load_toml_integer_config(toml_file, "session_manager.tcp_timeout_ms.data", &sess_mgr_cfg->tcp_timeout_ms.data, 1, 15999999000);
|
||||||
ret += load_toml_integer_config(toml_file, "session_manager.tcp_timeout_ms.half_closed", &sess_mgr_cfg->tcp_timeout_ms.half_closed, 1, 604800000);
|
ret += load_toml_integer_config(toml_file, "session_manager.tcp_timeout_ms.half_closed", &sess_mgr_cfg->tcp_timeout_ms.half_closed, 1, 604800000);
|
||||||
ret += load_toml_integer_config(toml_file, "session_manager.tcp_timeout_ms.time_wait", &sess_mgr_cfg->tcp_timeout_ms.time_wait, 1, 60000);
|
ret += load_toml_integer_config(toml_file, "session_manager.tcp_timeout_ms.time_wait", &sess_mgr_cfg->tcp_timeout_ms.time_wait, 1, 600000);
|
||||||
ret += load_toml_integer_config(toml_file, "session_manager.tcp_timeout_ms.discard_default", &sess_mgr_cfg->tcp_timeout_ms.discard_default, 1, 15999999000);
|
ret += load_toml_integer_config(toml_file, "session_manager.tcp_timeout_ms.discard_default", &sess_mgr_cfg->tcp_timeout_ms.discard_default, 1, 15999999000);
|
||||||
ret += load_toml_integer_config(toml_file, "session_manager.tcp_timeout_ms.unverified_rst", &sess_mgr_cfg->tcp_timeout_ms.unverified_rst, 1, 60000);
|
ret += load_toml_integer_config(toml_file, "session_manager.tcp_timeout_ms.unverified_rst", &sess_mgr_cfg->tcp_timeout_ms.unverified_rst, 1, 600000);
|
||||||
|
|
||||||
// UDP timeout
|
// UDP timeout
|
||||||
ret += load_toml_integer_config(toml_file, "session_manager.udp_timeout_ms.data", &sess_mgr_cfg->udp_timeout_ms.data, 1, 15999999000);
|
ret += load_toml_integer_config(toml_file, "session_manager.udp_timeout_ms.data", &sess_mgr_cfg->udp_timeout_ms.data, 1, 15999999000);
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
#include "packet_helper.h"
|
#include "packet_helper.h"
|
||||||
#include "packet_filter.h"
|
#include "packet_dabloom.h"
|
||||||
#include "session_pool.h"
|
#include "session_pool.h"
|
||||||
#include "session_table.h"
|
#include "session_table.h"
|
||||||
#include "session_timer.h"
|
#include "session_timer.h"
|
||||||
#include "session_filter.h"
|
#include "session_dabloom.h"
|
||||||
#include "session_internal.h"
|
#include "session_internal.h"
|
||||||
#include "session_transition.h"
|
#include "session_transition.h"
|
||||||
#include "session_manager_log.h"
|
#include "session_manager_log.h"
|
||||||
@@ -26,8 +26,8 @@ struct session_manager_rte
|
|||||||
struct session_table *udp_table;
|
struct session_table *udp_table;
|
||||||
struct session_timer *sess_timer;
|
struct session_timer *sess_timer;
|
||||||
|
|
||||||
struct packet_filter *dup_pkt_filter;
|
struct packet_dabloom *dup_pkt_dab;
|
||||||
struct session_filter *evc_sess_filter;
|
struct session_dabloom *evc_sess_dab;
|
||||||
|
|
||||||
struct session_manager_cfg cfg;
|
struct session_manager_cfg cfg;
|
||||||
struct session_manager_stat stat;
|
struct session_manager_stat stat;
|
||||||
@@ -420,7 +420,7 @@ static int session_manager_rte_bypass_packet_on_udp_table_limit(struct session_m
|
|||||||
|
|
||||||
static int session_manager_rte_bypass_packet_on_session_evicted(struct session_manager_rte *sess_mgr_rte, const struct tuple6 *key)
|
static int session_manager_rte_bypass_packet_on_session_evicted(struct session_manager_rte *sess_mgr_rte, const struct tuple6 *key)
|
||||||
{
|
{
|
||||||
if (sess_mgr_rte->cfg.evicted_session_bloom_filter.enable && session_filter_lookup(sess_mgr_rte->evc_sess_filter, key, sess_mgr_rte->now_ms))
|
if (sess_mgr_rte->cfg.evicted_session_bloom_filter.enable && session_dabloom_lookup(sess_mgr_rte->evc_sess_dab, key, sess_mgr_rte->now_ms))
|
||||||
{
|
{
|
||||||
sess_mgr_rte->stat.udp_pkts_bypass_session_evicted++;
|
sess_mgr_rte->stat.udp_pkts_bypass_session_evicted++;
|
||||||
return 1;
|
return 1;
|
||||||
@@ -439,7 +439,7 @@ static int session_manager_rte_bypass_duplicated_packet(struct session_manager_r
|
|||||||
enum flow_type type = identify_flow_type_by_history(sess, key);
|
enum flow_type type = identify_flow_type_by_history(sess, key);
|
||||||
if (session_get_stat(sess, type, STAT_RAW_PACKETS_RECEIVED) < 3 || session_has_duplicate_traffic(sess))
|
if (session_get_stat(sess, type, STAT_RAW_PACKETS_RECEIVED) < 3 || session_has_duplicate_traffic(sess))
|
||||||
{
|
{
|
||||||
if (packet_filter_lookup(sess_mgr_rte->dup_pkt_filter, pkt, sess_mgr_rte->now_ms))
|
if (packet_dabloom_lookup(sess_mgr_rte->dup_pkt_dab, pkt, sess_mgr_rte->now_ms))
|
||||||
{
|
{
|
||||||
session_inc_stat(sess, type, STAT_DUPLICATE_PACKETS_BYPASS, 1);
|
session_inc_stat(sess, type, STAT_DUPLICATE_PACKETS_BYPASS, 1);
|
||||||
session_inc_stat(sess, type, STAT_DUPLICATE_BYTES_BYPASS, packet_get_raw_len(pkt));
|
session_inc_stat(sess, type, STAT_DUPLICATE_BYTES_BYPASS, packet_get_raw_len(pkt));
|
||||||
@@ -463,7 +463,7 @@ static int session_manager_rte_bypass_duplicated_packet(struct session_manager_r
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
packet_filter_add(sess_mgr_rte->dup_pkt_filter, pkt, sess_mgr_rte->now_ms);
|
packet_dabloom_add(sess_mgr_rte->dup_pkt_dab, pkt, sess_mgr_rte->now_ms);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -514,7 +514,7 @@ static void session_manager_rte_evicte_session(struct session_manager_rte *sess_
|
|||||||
session_table_del(sess_mgr_rte->udp_table, sess);
|
session_table_del(sess_mgr_rte->udp_table, sess);
|
||||||
if (sess_mgr_rte->cfg.evicted_session_bloom_filter.enable)
|
if (sess_mgr_rte->cfg.evicted_session_bloom_filter.enable)
|
||||||
{
|
{
|
||||||
session_filter_add(sess_mgr_rte->evc_sess_filter, session_get_tuple6(sess), sess_mgr_rte->now_ms);
|
session_dabloom_add(sess_mgr_rte->evc_sess_dab, session_get_tuple6(sess), sess_mgr_rte->now_ms);
|
||||||
}
|
}
|
||||||
SESS_MGR_STAT_UPDATE(&sess_mgr_rte->stat, curr_state, next_state, udp);
|
SESS_MGR_STAT_UPDATE(&sess_mgr_rte->stat, curr_state, next_state, udp);
|
||||||
sess_mgr_rte->stat.udp_sess_evicted++;
|
sess_mgr_rte->stat.udp_sess_evicted++;
|
||||||
@@ -609,7 +609,7 @@ static struct session *session_manager_rte_new_tcp_session(struct session_manage
|
|||||||
|
|
||||||
if (sess_mgr_rte->cfg.duplicated_packet_bloom_filter.enable)
|
if (sess_mgr_rte->cfg.duplicated_packet_bloom_filter.enable)
|
||||||
{
|
{
|
||||||
packet_filter_add(sess_mgr_rte->dup_pkt_filter, pkt, sess_mgr_rte->now_ms);
|
packet_dabloom_add(sess_mgr_rte->dup_pkt_dab, pkt, sess_mgr_rte->now_ms);
|
||||||
}
|
}
|
||||||
|
|
||||||
SESS_MGR_STAT_INC(&sess_mgr_rte->stat, next_state, tcp);
|
SESS_MGR_STAT_INC(&sess_mgr_rte->stat, next_state, tcp);
|
||||||
@@ -783,20 +783,20 @@ struct session_manager_rte *session_manager_rte_new(const struct session_manager
|
|||||||
}
|
}
|
||||||
if (sess_mgr_rte->cfg.evicted_session_bloom_filter.enable)
|
if (sess_mgr_rte->cfg.evicted_session_bloom_filter.enable)
|
||||||
{
|
{
|
||||||
sess_mgr_rte->evc_sess_filter = session_filter_new(sess_mgr_rte->cfg.evicted_session_bloom_filter.capacity,
|
sess_mgr_rte->evc_sess_dab = session_dabloom_new(sess_mgr_rte->cfg.evicted_session_bloom_filter.capacity,
|
||||||
sess_mgr_rte->cfg.evicted_session_bloom_filter.time_window_ms,
|
sess_mgr_rte->cfg.evicted_session_bloom_filter.time_window_ms,
|
||||||
sess_mgr_rte->cfg.evicted_session_bloom_filter.error_rate, now_ms);
|
sess_mgr_rte->cfg.evicted_session_bloom_filter.error_rate, now_ms);
|
||||||
if (sess_mgr_rte->evc_sess_filter == NULL)
|
if (sess_mgr_rte->evc_sess_dab == NULL)
|
||||||
{
|
{
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (sess_mgr_rte->cfg.duplicated_packet_bloom_filter.enable)
|
if (sess_mgr_rte->cfg.duplicated_packet_bloom_filter.enable)
|
||||||
{
|
{
|
||||||
sess_mgr_rte->dup_pkt_filter = packet_filter_new(sess_mgr_rte->cfg.duplicated_packet_bloom_filter.capacity,
|
sess_mgr_rte->dup_pkt_dab = packet_dabloom_new(sess_mgr_rte->cfg.duplicated_packet_bloom_filter.capacity,
|
||||||
sess_mgr_rte->cfg.duplicated_packet_bloom_filter.time_window_ms,
|
sess_mgr_rte->cfg.duplicated_packet_bloom_filter.time_window_ms,
|
||||||
sess_mgr_rte->cfg.duplicated_packet_bloom_filter.error_rate, now_ms);
|
sess_mgr_rte->cfg.duplicated_packet_bloom_filter.error_rate, now_ms);
|
||||||
if (sess_mgr_rte->dup_pkt_filter == NULL)
|
if (sess_mgr_rte->dup_pkt_dab == NULL)
|
||||||
{
|
{
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
@@ -842,11 +842,11 @@ void session_manager_rte_free(struct session_manager_rte *sess_mgr_rte)
|
|||||||
}
|
}
|
||||||
if (sess_mgr_rte->cfg.evicted_session_bloom_filter.enable)
|
if (sess_mgr_rte->cfg.evicted_session_bloom_filter.enable)
|
||||||
{
|
{
|
||||||
session_filter_free(sess_mgr_rte->evc_sess_filter);
|
session_dabloom_free(sess_mgr_rte->evc_sess_dab);
|
||||||
}
|
}
|
||||||
if (sess_mgr_rte->cfg.duplicated_packet_bloom_filter.enable)
|
if (sess_mgr_rte->cfg.duplicated_packet_bloom_filter.enable)
|
||||||
{
|
{
|
||||||
packet_filter_free(sess_mgr_rte->dup_pkt_filter);
|
packet_dabloom_free(sess_mgr_rte->dup_pkt_dab);
|
||||||
}
|
}
|
||||||
snowflake_free(sess_mgr_rte->sf);
|
snowflake_free(sess_mgr_rte->sf);
|
||||||
session_timer_free(sess_mgr_rte->sess_timer);
|
session_timer_free(sess_mgr_rte->sess_timer);
|
||||||
@@ -1113,7 +1113,7 @@ uint64_t session_manager_rte_clean_session(struct session_manager_rte *sess_mgr_
|
|||||||
return cleaned_sess_num;
|
return cleaned_sess_num;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t session_manager_rte_scan_session(struct session_manager_rte *sess_mgr_rte, const struct session_scan_opts *opts, uint64_t mached_sess_id[], uint64_t array_size)
|
uint64_t session_manager_rte_scan_session(struct session_manager_rte *sess_mgr_rte, const struct session_filter *filter, uint64_t mached_sess_id[], uint64_t array_size)
|
||||||
{
|
{
|
||||||
uint64_t capacity = 0;
|
uint64_t capacity = 0;
|
||||||
uint64_t max_loop = 0;
|
uint64_t max_loop = 0;
|
||||||
@@ -1121,22 +1121,22 @@ uint64_t session_manager_rte_scan_session(struct session_manager_rte *sess_mgr_r
|
|||||||
const struct session *sess = NULL;
|
const struct session *sess = NULL;
|
||||||
const struct tuple6 *tuple = NULL;
|
const struct tuple6 *tuple = NULL;
|
||||||
|
|
||||||
if (sess_mgr_rte == NULL || opts == NULL || mached_sess_id == NULL || array_size == 0)
|
if (sess_mgr_rte == NULL || filter == NULL || mached_sess_id == NULL || array_size == 0)
|
||||||
{
|
{
|
||||||
return mached_sess_num;
|
return mached_sess_num;
|
||||||
}
|
}
|
||||||
if (opts->count == 0)
|
if (filter->count == 0)
|
||||||
{
|
{
|
||||||
return mached_sess_num;
|
return mached_sess_num;
|
||||||
}
|
}
|
||||||
capacity = sess_mgr_rte->cfg.tcp_session_max + sess_mgr_rte->cfg.udp_session_max;
|
capacity = sess_mgr_rte->cfg.tcp_session_max + sess_mgr_rte->cfg.udp_session_max;
|
||||||
if (opts->cursor >= capacity)
|
if (filter->cursor >= capacity)
|
||||||
{
|
{
|
||||||
return mached_sess_num;
|
return mached_sess_num;
|
||||||
}
|
}
|
||||||
|
|
||||||
max_loop = MIN(capacity, opts->cursor + opts->count);
|
max_loop = MIN(capacity, filter->cursor + filter->count);
|
||||||
for (uint64_t i = opts->cursor; i < max_loop; i++)
|
for (uint64_t i = filter->cursor; i < max_loop; i++)
|
||||||
{
|
{
|
||||||
sess = session_pool_get0(sess_mgr_rte->sess_pool, i);
|
sess = session_pool_get0(sess_mgr_rte->sess_pool, i);
|
||||||
tuple = session_get_tuple6(sess);
|
tuple = session_get_tuple6(sess);
|
||||||
@@ -1145,60 +1145,56 @@ uint64_t session_manager_rte_scan_session(struct session_manager_rte *sess_mgr_r
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((opts->flags & SESSION_SCAN_TYPE) && opts->type != session_get_type(sess))
|
if (filter->type && filter->type != session_get_type(sess))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if ((opts->flags & SESSION_SCAN_STATE) && opts->state != session_get_current_state(sess))
|
if (filter->state && filter->state != session_get_current_state(sess))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if ((opts->flags & SESSION_SCAN_CREATE_TIME) &&
|
if (filter->sess_created_ts_in_ms && session_get_timestamp(sess, SESSION_TIMESTAMP_START) < filter->sess_created_ts_in_ms)
|
||||||
(session_get_timestamp(sess, SESSION_TIMESTAMP_START) < opts->create_time_ms[0] ||
|
|
||||||
session_get_timestamp(sess, SESSION_TIMESTAMP_START) > opts->create_time_ms[1]))
|
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if ((opts->flags & SESSION_SCAN_LASPKT_TIME) &&
|
if (filter->pkt_received_ts_in_ms && session_get_timestamp(sess, SESSION_TIMESTAMP_LAST) < filter->pkt_received_ts_in_ms)
|
||||||
(session_get_timestamp(sess, SESSION_TIMESTAMP_LAST) < opts->laspkt_time_ms[0] ||
|
|
||||||
session_get_timestamp(sess, SESSION_TIMESTAMP_LAST) > opts->laspkt_time_ms[1]))
|
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if ((opts->flags & SESSION_SCAN_SPORT) && opts->src_port != tuple->src_port)
|
if (filter->src_port && filter->src_port != tuple->src_port)
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if ((opts->flags & SESSION_SCAN_DPORT) && opts->dst_port != tuple->dst_port)
|
if (filter->dst_port && filter->dst_port != tuple->dst_port)
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (opts->flags & SESSION_SCAN_SIP)
|
if (filter->src_family)
|
||||||
{
|
{
|
||||||
if (opts->addr_family != tuple->addr_family)
|
if (filter->src_family != tuple->addr_family)
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if ((opts->addr_family == AF_INET) && !ipv4_in_range(&tuple->src_addr.v4, &opts->src_addr[0].v4, &opts->src_addr[1].v4))
|
if ((filter->src_family == AF_INET) && !ipv4_in_range(&tuple->src_addr.v4, &filter->src_addr_range[0].v4, &filter->src_addr_range[1].v4))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if ((opts->addr_family == AF_INET6) && !ipv6_in_range(&tuple->src_addr.v6, &opts->src_addr[0].v6, &opts->src_addr[1].v6))
|
if ((filter->src_family == AF_INET6) && !ipv6_in_range(&tuple->src_addr.v6, &filter->src_addr_range[0].v6, &filter->src_addr_range[1].v6))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (opts->flags & SESSION_SCAN_DIP)
|
if (filter->dst_family)
|
||||||
{
|
{
|
||||||
if (opts->addr_family != tuple->addr_family)
|
if (filter->dst_family != tuple->addr_family)
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if ((opts->addr_family == AF_INET) && !ipv4_in_range(&tuple->dst_addr.v4, &opts->dst_addr[0].v4, &opts->dst_addr[1].v4))
|
if ((filter->dst_family == AF_INET) && !ipv4_in_range(&tuple->dst_addr.v4, &filter->dst_addr_range[0].v4, &filter->dst_addr_range[1].v4))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if ((opts->addr_family == AF_INET6) && !ipv6_in_range(&tuple->dst_addr.v6, &opts->dst_addr[0].v6, &opts->dst_addr[1].v6))
|
if ((filter->dst_family == AF_INET6) && !ipv6_in_range(&tuple->dst_addr.v6, &filter->dst_addr_range[0].v6, &filter->dst_addr_range[1].v6))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -1211,7 +1207,7 @@ uint64_t session_manager_rte_scan_session(struct session_manager_rte *sess_mgr_r
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SESSION_MANAGER_LOG_DEBUG("session scan => cursor: %lu, count: %lu, mached_sess_num: %lu", opts->cursor, opts->count, mached_sess_num);
|
SESSION_MANAGER_LOG_INFO("session scan => cursor: %lu, count: %lu, mached_sess_num: %lu", filter->cursor, filter->count, mached_sess_num);
|
||||||
return mached_sess_num;
|
return mached_sess_num;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1219,7 +1215,7 @@ void session_manager_rte_record_duplicated_packet(struct session_manager_rte *se
|
|||||||
{
|
{
|
||||||
if (sess_mgr_rte->cfg.duplicated_packet_bloom_filter.enable)
|
if (sess_mgr_rte->cfg.duplicated_packet_bloom_filter.enable)
|
||||||
{
|
{
|
||||||
packet_filter_add(sess_mgr_rte->dup_pkt_filter, pkt, sess_mgr_rte->now_ms);
|
packet_dabloom_add(sess_mgr_rte->dup_pkt_dab, pkt, sess_mgr_rte->now_ms);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,37 +9,24 @@ extern "C"
|
|||||||
#include "stellar/session.h"
|
#include "stellar/session.h"
|
||||||
#include "session_manager_cfg.h"
|
#include "session_manager_cfg.h"
|
||||||
|
|
||||||
enum session_scan_flags
|
struct session_filter
|
||||||
{
|
{
|
||||||
SESSION_SCAN_TYPE = 1 << 0,
|
uint64_t cursor;
|
||||||
SESSION_SCAN_STATE = 1 << 1,
|
uint64_t count;
|
||||||
SESSION_SCAN_SIP = 1 << 2,
|
uint64_t limit;
|
||||||
SESSION_SCAN_DIP = 1 << 3,
|
|
||||||
SESSION_SCAN_SPORT = 1 << 4,
|
|
||||||
SESSION_SCAN_DPORT = 1 << 5,
|
|
||||||
SESSION_SCAN_CREATE_TIME = 1 << 6,
|
|
||||||
SESSION_SCAN_LASPKT_TIME = 1 << 7,
|
|
||||||
};
|
|
||||||
|
|
||||||
struct session_scan_opts
|
|
||||||
{
|
|
||||||
// required
|
|
||||||
uint32_t flags;
|
|
||||||
uint32_t cursor;
|
|
||||||
uint32_t count;
|
|
||||||
|
|
||||||
// optional
|
|
||||||
enum session_type type;
|
enum session_type type;
|
||||||
enum session_state state;
|
enum session_state state;
|
||||||
|
|
||||||
uint32_t addr_family; // AF_INET or AF_INET6
|
uint32_t src_family; // AF_INET or AF_INET6
|
||||||
union ip_address src_addr[2]; // network byte order
|
uint32_t dst_family; // AF_INET or AF_INET6
|
||||||
union ip_address dst_addr[2]; // network byte order
|
union ip_address src_addr_range[2]; // network byte order
|
||||||
|
union ip_address dst_addr_range[2]; // network byte order
|
||||||
uint16_t src_port; // network byte order
|
uint16_t src_port; // network byte order
|
||||||
uint16_t dst_port; // network byte order
|
uint16_t dst_port; // network byte order
|
||||||
|
|
||||||
uint64_t create_time_ms[2]; // session create time range
|
uint64_t sess_created_ts_in_ms;
|
||||||
uint64_t laspkt_time_ms[2]; // last packet time range
|
uint64_t pkt_received_ts_in_ms;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct session_manager_rte;
|
struct session_manager_rte;
|
||||||
@@ -57,7 +44,7 @@ struct session *session_manager_rte_get_expired_session(struct session_manager_r
|
|||||||
struct session *session_manager_rte_get_evicted_session(struct session_manager_rte *sess_mgr_rte);
|
struct session *session_manager_rte_get_evicted_session(struct session_manager_rte *sess_mgr_rte);
|
||||||
|
|
||||||
uint64_t session_manager_rte_clean_session(struct session_manager_rte *sess_mgr_rte, uint64_t now_ms, struct session *cleaned_sess_ptr[], uint64_t array_size);
|
uint64_t session_manager_rte_clean_session(struct session_manager_rte *sess_mgr_rte, uint64_t now_ms, struct session *cleaned_sess_ptr[], uint64_t array_size);
|
||||||
uint64_t session_manager_rte_scan_session(struct session_manager_rte *sess_mgr_rte, const struct session_scan_opts *opts, uint64_t mached_sess_id[], uint64_t array_size);
|
uint64_t session_manager_rte_scan_session(struct session_manager_rte *sess_mgr_rte, const struct session_filter *filter, uint64_t mached_sess_id[], uint64_t array_size);
|
||||||
|
|
||||||
void session_manager_rte_record_duplicated_packet(struct session_manager_rte *sess_mgr_rte, const struct packet *pkt);
|
void session_manager_rte_record_duplicated_packet(struct session_manager_rte *sess_mgr_rte, const struct packet *pkt);
|
||||||
|
|
||||||
|
|||||||
1064
infra/session_manager/session_monitor.c
Normal file
1064
infra/session_manager/session_monitor.c
Normal file
File diff suppressed because it is too large
Load Diff
@@ -108,224 +108,333 @@ TEST(SESS_MGR_SCAN, OPTS)
|
|||||||
sess = session_manager_rte_new_session(sess_mgr_rte, &pkt, 4);
|
sess = session_manager_rte_new_session(sess_mgr_rte, &pkt, 4);
|
||||||
EXPECT_TRUE(sess);
|
EXPECT_TRUE(sess);
|
||||||
|
|
||||||
struct session_scan_opts scan = {};
|
struct session_filter filter = {};
|
||||||
// scan.flags = SESSION_SCAN_TYPE | SESSION_SCAN_STATE | SESSION_SCAN_SIP | SESSION_SCAN_DIP | SESSION_SCAN_SPORT | SESSION_SCAN_DPORT | SESSION_SCAN_CREATE_TIME | SESSION_SCAN_LASPKT_TIME;
|
|
||||||
scan.cursor = 0;
|
|
||||||
scan.count = 1460;
|
|
||||||
|
|
||||||
scan.laspkt_time_ms[0] = 0;
|
/**************************************************************************
|
||||||
scan.laspkt_time_ms[1] = UINT64_MAX;
|
* scan session type
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
// SESSION_SCAN_TYPE
|
// TCP
|
||||||
scan.flags = SESSION_SCAN_TYPE;
|
memset(&filter, 0, sizeof(filter));
|
||||||
|
filter.cursor = 0;
|
||||||
|
filter.count = 1460;
|
||||||
|
filter.type = SESSION_TYPE_TCP;
|
||||||
|
|
||||||
scan.type = SESSION_TYPE_TCP;
|
mached_sess_num = session_manager_rte_scan_session(sess_mgr_rte, &filter, mached_sess_id, sizeof(mached_sess_id) / sizeof(mached_sess_id[0]));
|
||||||
mached_sess_num = session_manager_rte_scan_session(sess_mgr_rte, &scan, mached_sess_id, sizeof(mached_sess_id) / sizeof(mached_sess_id[0]));
|
|
||||||
EXPECT_TRUE(mached_sess_num == 3);
|
EXPECT_TRUE(mached_sess_num == 3);
|
||||||
mached_session_print("SESSION_SCAN_TYPE: (TCP)", sess_mgr_rte, mached_sess_id, mached_sess_num);
|
mached_session_print("scan session type: TCP", sess_mgr_rte, mached_sess_id, mached_sess_num);
|
||||||
|
|
||||||
scan.type = SESSION_TYPE_UDP;
|
// UDP
|
||||||
mached_sess_num = session_manager_rte_scan_session(sess_mgr_rte, &scan, mached_sess_id, sizeof(mached_sess_id) / sizeof(mached_sess_id[0]));
|
memset(&filter, 0, sizeof(filter));
|
||||||
|
filter.cursor = 0;
|
||||||
|
filter.count = 1460;
|
||||||
|
filter.type = SESSION_TYPE_UDP;
|
||||||
|
|
||||||
|
mached_sess_num = session_manager_rte_scan_session(sess_mgr_rte, &filter, mached_sess_id, sizeof(mached_sess_id) / sizeof(mached_sess_id[0]));
|
||||||
EXPECT_TRUE(mached_sess_num == 1);
|
EXPECT_TRUE(mached_sess_num == 1);
|
||||||
mached_session_print("SESSION_SCAN_TYPE: (UDP)", sess_mgr_rte, mached_sess_id, mached_sess_num);
|
mached_session_print("scan session type: UDP", sess_mgr_rte, mached_sess_id, mached_sess_num);
|
||||||
|
|
||||||
// SESSION_SCAN_STATE
|
/**************************************************************************
|
||||||
scan.flags = SESSION_SCAN_STATE;
|
* scan session state
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
scan.state = SESSION_STATE_OPENING;
|
// OPENING
|
||||||
mached_sess_num = session_manager_rte_scan_session(sess_mgr_rte, &scan, mached_sess_id, sizeof(mached_sess_id) / sizeof(mached_sess_id[0]));
|
memset(&filter, 0, sizeof(filter));
|
||||||
|
filter.cursor = 0;
|
||||||
|
filter.count = 1460;
|
||||||
|
filter.state = SESSION_STATE_OPENING;
|
||||||
|
|
||||||
|
mached_sess_num = session_manager_rte_scan_session(sess_mgr_rte, &filter, mached_sess_id, sizeof(mached_sess_id) / sizeof(mached_sess_id[0]));
|
||||||
EXPECT_TRUE(mached_sess_num == 4);
|
EXPECT_TRUE(mached_sess_num == 4);
|
||||||
mached_session_print("SESSION_SCAN_STATE: (OPENING)", sess_mgr_rte, mached_sess_id, mached_sess_num);
|
mached_session_print("scan session state: OPENING", sess_mgr_rte, mached_sess_id, mached_sess_num);
|
||||||
|
|
||||||
scan.state = SESSION_STATE_ACTIVE;
|
// ACTIVE
|
||||||
mached_sess_num = session_manager_rte_scan_session(sess_mgr_rte, &scan, mached_sess_id, sizeof(mached_sess_id) / sizeof(mached_sess_id[0]));
|
memset(&filter, 0, sizeof(filter));
|
||||||
|
filter.cursor = 0;
|
||||||
|
filter.count = 1460;
|
||||||
|
filter.state = SESSION_STATE_ACTIVE;
|
||||||
|
|
||||||
|
mached_sess_num = session_manager_rte_scan_session(sess_mgr_rte, &filter, mached_sess_id, sizeof(mached_sess_id) / sizeof(mached_sess_id[0]));
|
||||||
EXPECT_TRUE(mached_sess_num == 0);
|
EXPECT_TRUE(mached_sess_num == 0);
|
||||||
mached_session_print("SESSION_SCAN_STATE: (ACTIVE)", sess_mgr_rte, mached_sess_id, mached_sess_num);
|
mached_session_print("scan session state: ACTIVE", sess_mgr_rte, mached_sess_id, mached_sess_num);
|
||||||
|
|
||||||
scan.state = SESSION_STATE_CLOSING;
|
// CLOSING
|
||||||
mached_sess_num = session_manager_rte_scan_session(sess_mgr_rte, &scan, mached_sess_id, sizeof(mached_sess_id) / sizeof(mached_sess_id[0]));
|
memset(&filter, 0, sizeof(filter));
|
||||||
|
filter.cursor = 0;
|
||||||
|
filter.count = 1460;
|
||||||
|
filter.state = SESSION_STATE_CLOSING;
|
||||||
|
|
||||||
|
mached_sess_num = session_manager_rte_scan_session(sess_mgr_rte, &filter, mached_sess_id, sizeof(mached_sess_id) / sizeof(mached_sess_id[0]));
|
||||||
EXPECT_TRUE(mached_sess_num == 0);
|
EXPECT_TRUE(mached_sess_num == 0);
|
||||||
mached_session_print("SESSION_SCAN_STATE: (CLOSING)", sess_mgr_rte, mached_sess_id, mached_sess_num);
|
mached_session_print("scan session state: CLOSING", sess_mgr_rte, mached_sess_id, mached_sess_num);
|
||||||
|
|
||||||
scan.state = SESSION_STATE_DISCARD;
|
// DISCARD
|
||||||
mached_sess_num = session_manager_rte_scan_session(sess_mgr_rte, &scan, mached_sess_id, sizeof(mached_sess_id) / sizeof(mached_sess_id[0]));
|
memset(&filter, 0, sizeof(filter));
|
||||||
|
filter.cursor = 0;
|
||||||
|
filter.count = 1460;
|
||||||
|
filter.state = SESSION_STATE_DISCARD;
|
||||||
|
|
||||||
|
mached_sess_num = session_manager_rte_scan_session(sess_mgr_rte, &filter, mached_sess_id, sizeof(mached_sess_id) / sizeof(mached_sess_id[0]));
|
||||||
EXPECT_TRUE(mached_sess_num == 0);
|
EXPECT_TRUE(mached_sess_num == 0);
|
||||||
mached_session_print("SESSION_SCAN_STATE: (DISCARD)", sess_mgr_rte, mached_sess_id, mached_sess_num);
|
mached_session_print("scan session state: DISCARD", sess_mgr_rte, mached_sess_id, mached_sess_num);
|
||||||
|
|
||||||
scan.state = SESSION_STATE_CLOSED;
|
// CLOSED
|
||||||
mached_sess_num = session_manager_rte_scan_session(sess_mgr_rte, &scan, mached_sess_id, sizeof(mached_sess_id) / sizeof(mached_sess_id[0]));
|
memset(&filter, 0, sizeof(filter));
|
||||||
|
filter.cursor = 0;
|
||||||
|
filter.count = 1460;
|
||||||
|
filter.state = SESSION_STATE_CLOSED;
|
||||||
|
|
||||||
|
mached_sess_num = session_manager_rte_scan_session(sess_mgr_rte, &filter, mached_sess_id, sizeof(mached_sess_id) / sizeof(mached_sess_id[0]));
|
||||||
EXPECT_TRUE(mached_sess_num == 0);
|
EXPECT_TRUE(mached_sess_num == 0);
|
||||||
mached_session_print("SESSION_SCAN_STATE: (CLOSED)", sess_mgr_rte, mached_sess_id, mached_sess_num);
|
mached_session_print("scan session state: CLOSED", sess_mgr_rte, mached_sess_id, mached_sess_num);
|
||||||
|
|
||||||
// SESSION_SCAN_SIP
|
/**************************************************************************
|
||||||
scan.flags = SESSION_SCAN_SIP;
|
* scan source address
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
scan.addr_family = AF_INET;
|
// IPv4
|
||||||
scan.src_addr[0].v4 = v4_src_addr1;
|
memset(&filter, 0, sizeof(filter));
|
||||||
scan.src_addr[1].v4 = v4_src_addr1;
|
filter.cursor = 0;
|
||||||
mached_sess_num = session_manager_rte_scan_session(sess_mgr_rte, &scan, mached_sess_id, sizeof(mached_sess_id) / sizeof(mached_sess_id[0]));
|
filter.count = 1460;
|
||||||
|
filter.src_family = AF_INET;
|
||||||
|
filter.src_addr_range[0].v4 = v4_src_addr1;
|
||||||
|
filter.src_addr_range[1].v4 = v4_src_addr1;
|
||||||
|
|
||||||
|
mached_sess_num = session_manager_rte_scan_session(sess_mgr_rte, &filter, mached_sess_id, sizeof(mached_sess_id) / sizeof(mached_sess_id[0]));
|
||||||
EXPECT_TRUE(mached_sess_num == 1);
|
EXPECT_TRUE(mached_sess_num == 1);
|
||||||
mached_session_print("SESSION_SCAN_SIP: (IPv4)", sess_mgr_rte, mached_sess_id, mached_sess_num);
|
mached_session_print("scan source address: IPv4", sess_mgr_rte, mached_sess_id, mached_sess_num);
|
||||||
|
|
||||||
scan.addr_family = AF_INET;
|
// IPv4 subnet
|
||||||
scan.src_addr[0].v4 = v4_src_subnet_beg;
|
memset(&filter, 0, sizeof(filter));
|
||||||
scan.src_addr[1].v4 = v4_src_subnet_end;
|
filter.cursor = 0;
|
||||||
mached_sess_num = session_manager_rte_scan_session(sess_mgr_rte, &scan, mached_sess_id, sizeof(mached_sess_id) / sizeof(mached_sess_id[0]));
|
filter.count = 1460;
|
||||||
|
filter.src_family = AF_INET;
|
||||||
|
filter.src_addr_range[0].v4 = v4_src_subnet_beg;
|
||||||
|
filter.src_addr_range[1].v4 = v4_src_subnet_end;
|
||||||
|
|
||||||
|
mached_sess_num = session_manager_rte_scan_session(sess_mgr_rte, &filter, mached_sess_id, sizeof(mached_sess_id) / sizeof(mached_sess_id[0]));
|
||||||
EXPECT_TRUE(mached_sess_num == 3);
|
EXPECT_TRUE(mached_sess_num == 3);
|
||||||
mached_session_print("SESSION_SCAN_SIP: (IPv4 SUBNET)", sess_mgr_rte, mached_sess_id, mached_sess_num);
|
mached_session_print("scan source address: IPv4 subnet", sess_mgr_rte, mached_sess_id, mached_sess_num);
|
||||||
|
|
||||||
scan.addr_family = AF_INET;
|
// IPv4 min max
|
||||||
scan.src_addr[0].v4 = v4_min_addr;
|
memset(&filter, 0, sizeof(filter));
|
||||||
scan.src_addr[1].v4 = v4_max_addr;
|
filter.cursor = 0;
|
||||||
mached_sess_num = session_manager_rte_scan_session(sess_mgr_rte, &scan, mached_sess_id, sizeof(mached_sess_id) / sizeof(mached_sess_id[0]));
|
filter.count = 1460;
|
||||||
|
filter.src_family = AF_INET;
|
||||||
|
filter.src_addr_range[0].v4 = v4_min_addr;
|
||||||
|
filter.src_addr_range[1].v4 = v4_max_addr;
|
||||||
|
|
||||||
|
mached_sess_num = session_manager_rte_scan_session(sess_mgr_rte, &filter, mached_sess_id, sizeof(mached_sess_id) / sizeof(mached_sess_id[0]));
|
||||||
EXPECT_TRUE(mached_sess_num == 3);
|
EXPECT_TRUE(mached_sess_num == 3);
|
||||||
mached_session_print("SESSION_SCAN_SIP: (IPv4 MIN MAX)", sess_mgr_rte, mached_sess_id, mached_sess_num);
|
mached_session_print("scan source address: IPv4 min max", sess_mgr_rte, mached_sess_id, mached_sess_num);
|
||||||
|
|
||||||
scan.addr_family = AF_INET6;
|
// IPv6
|
||||||
memcpy(&scan.src_addr[0].v6, &v6_src_addr, sizeof(v6_src_addr));
|
memset(&filter, 0, sizeof(filter));
|
||||||
memcpy(&scan.src_addr[1].v6, &v6_src_addr, sizeof(v6_src_addr));
|
filter.cursor = 0;
|
||||||
mached_sess_num = session_manager_rte_scan_session(sess_mgr_rte, &scan, mached_sess_id, sizeof(mached_sess_id) / sizeof(mached_sess_id[0]));
|
filter.count = 1460;
|
||||||
|
filter.src_family = AF_INET6;
|
||||||
|
memcpy(&filter.src_addr_range[0].v6, &v6_src_addr, sizeof(v6_src_addr));
|
||||||
|
memcpy(&filter.src_addr_range[1].v6, &v6_src_addr, sizeof(v6_src_addr));
|
||||||
|
|
||||||
|
mached_sess_num = session_manager_rte_scan_session(sess_mgr_rte, &filter, mached_sess_id, sizeof(mached_sess_id) / sizeof(mached_sess_id[0]));
|
||||||
EXPECT_TRUE(mached_sess_num == 1);
|
EXPECT_TRUE(mached_sess_num == 1);
|
||||||
mached_session_print("SESSION_SCAN_SIP: (IPv6)", sess_mgr_rte, mached_sess_id, mached_sess_num);
|
mached_session_print("scan source address: IPv6", sess_mgr_rte, mached_sess_id, mached_sess_num);
|
||||||
|
|
||||||
scan.addr_family = AF_INET6;
|
// IPv6 subnet
|
||||||
memcpy(&scan.src_addr[0].v6, &v6_src_subnet_beg, sizeof(v6_src_subnet_beg));
|
memset(&filter, 0, sizeof(filter));
|
||||||
memcpy(&scan.src_addr[1].v6, &v6_src_subnet_end, sizeof(v6_src_subnet_end));
|
filter.cursor = 0;
|
||||||
mached_sess_num = session_manager_rte_scan_session(sess_mgr_rte, &scan, mached_sess_id, sizeof(mached_sess_id) / sizeof(mached_sess_id[0]));
|
filter.count = 1460;
|
||||||
|
filter.src_family = AF_INET6;
|
||||||
|
memcpy(&filter.src_addr_range[0].v6, &v6_src_subnet_beg, sizeof(v6_src_subnet_beg));
|
||||||
|
memcpy(&filter.src_addr_range[1].v6, &v6_src_subnet_end, sizeof(v6_src_subnet_end));
|
||||||
|
|
||||||
|
mached_sess_num = session_manager_rte_scan_session(sess_mgr_rte, &filter, mached_sess_id, sizeof(mached_sess_id) / sizeof(mached_sess_id[0]));
|
||||||
EXPECT_TRUE(mached_sess_num == 1);
|
EXPECT_TRUE(mached_sess_num == 1);
|
||||||
mached_session_print("SESSION_SCAN_SIP: (IPv6 SUBNET)", sess_mgr_rte, mached_sess_id, mached_sess_num);
|
mached_session_print("scan source address: IPv6 subnet", sess_mgr_rte, mached_sess_id, mached_sess_num);
|
||||||
|
|
||||||
scan.addr_family = AF_INET6;
|
// IPv6 min max
|
||||||
memcpy(&scan.src_addr[0].v6, &v6_min_addr, sizeof(v6_min_addr));
|
memset(&filter, 0, sizeof(filter));
|
||||||
memcpy(&scan.src_addr[1].v6, &v6_max_addr, sizeof(v6_max_addr));
|
filter.cursor = 0;
|
||||||
mached_sess_num = session_manager_rte_scan_session(sess_mgr_rte, &scan, mached_sess_id, sizeof(mached_sess_id) / sizeof(mached_sess_id[0]));
|
filter.count = 1460;
|
||||||
|
filter.src_family = AF_INET6;
|
||||||
|
memcpy(&filter.src_addr_range[0].v6, &v6_min_addr, sizeof(v6_min_addr));
|
||||||
|
memcpy(&filter.src_addr_range[1].v6, &v6_max_addr, sizeof(v6_max_addr));
|
||||||
|
|
||||||
|
mached_sess_num = session_manager_rte_scan_session(sess_mgr_rte, &filter, mached_sess_id, sizeof(mached_sess_id) / sizeof(mached_sess_id[0]));
|
||||||
EXPECT_TRUE(mached_sess_num == 1);
|
EXPECT_TRUE(mached_sess_num == 1);
|
||||||
mached_session_print("SESSION_SCAN_SIP: (IPv6 MIN MAX)", sess_mgr_rte, mached_sess_id, mached_sess_num);
|
mached_session_print("scan source address: IPv6 min max", sess_mgr_rte, mached_sess_id, mached_sess_num);
|
||||||
|
|
||||||
// SESSION_SCAN_DIP
|
/**************************************************************************
|
||||||
scan.flags = SESSION_SCAN_DIP;
|
* scan destination address
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
scan.addr_family = AF_INET;
|
// IPv4
|
||||||
scan.dst_addr[0].v4 = v4_dst_addr;
|
memset(&filter, 0, sizeof(filter));
|
||||||
scan.dst_addr[1].v4 = v4_dst_addr;
|
filter.cursor = 0;
|
||||||
mached_sess_num = session_manager_rte_scan_session(sess_mgr_rte, &scan, mached_sess_id, sizeof(mached_sess_id) / sizeof(mached_sess_id[0]));
|
filter.count = 1460;
|
||||||
|
filter.dst_family = AF_INET;
|
||||||
|
filter.dst_addr_range[0].v4 = v4_dst_addr;
|
||||||
|
filter.dst_addr_range[1].v4 = v4_dst_addr;
|
||||||
|
|
||||||
|
mached_sess_num = session_manager_rte_scan_session(sess_mgr_rte, &filter, mached_sess_id, sizeof(mached_sess_id) / sizeof(mached_sess_id[0]));
|
||||||
EXPECT_TRUE(mached_sess_num == 3);
|
EXPECT_TRUE(mached_sess_num == 3);
|
||||||
mached_session_print("SESSION_SCAN_DIP: (IPv4)", sess_mgr_rte, mached_sess_id, mached_sess_num);
|
mached_session_print("scan destination address: IPv4", sess_mgr_rte, mached_sess_id, mached_sess_num);
|
||||||
|
|
||||||
scan.addr_family = AF_INET;
|
// IPv4 subnet
|
||||||
scan.dst_addr[0].v4 = v4_dst_subnet_beg;
|
memset(&filter, 0, sizeof(filter));
|
||||||
scan.dst_addr[1].v4 = v4_dst_subnet_end;
|
filter.cursor = 0;
|
||||||
mached_sess_num = session_manager_rte_scan_session(sess_mgr_rte, &scan, mached_sess_id, sizeof(mached_sess_id) / sizeof(mached_sess_id[0]));
|
filter.count = 1460;
|
||||||
|
filter.dst_family = AF_INET;
|
||||||
|
filter.dst_addr_range[0].v4 = v4_dst_subnet_beg;
|
||||||
|
filter.dst_addr_range[1].v4 = v4_dst_subnet_end;
|
||||||
|
|
||||||
|
mached_sess_num = session_manager_rte_scan_session(sess_mgr_rte, &filter, mached_sess_id, sizeof(mached_sess_id) / sizeof(mached_sess_id[0]));
|
||||||
EXPECT_TRUE(mached_sess_num == 3);
|
EXPECT_TRUE(mached_sess_num == 3);
|
||||||
mached_session_print("SESSION_SCAN_DIP: (IPv4 SUBNET)", sess_mgr_rte, mached_sess_id, mached_sess_num);
|
mached_session_print("scan destination address: IPv4 subnet", sess_mgr_rte, mached_sess_id, mached_sess_num);
|
||||||
|
|
||||||
scan.addr_family = AF_INET;
|
// IPv4 min max
|
||||||
scan.dst_addr[0].v4 = v4_min_addr;
|
memset(&filter, 0, sizeof(filter));
|
||||||
scan.dst_addr[1].v4 = v4_max_addr;
|
filter.cursor = 0;
|
||||||
mached_sess_num = session_manager_rte_scan_session(sess_mgr_rte, &scan, mached_sess_id, sizeof(mached_sess_id) / sizeof(mached_sess_id[0]));
|
filter.count = 1460;
|
||||||
|
filter.dst_family = AF_INET;
|
||||||
|
filter.dst_addr_range[0].v4 = v4_min_addr;
|
||||||
|
filter.dst_addr_range[1].v4 = v4_max_addr;
|
||||||
|
|
||||||
|
mached_sess_num = session_manager_rte_scan_session(sess_mgr_rte, &filter, mached_sess_id, sizeof(mached_sess_id) / sizeof(mached_sess_id[0]));
|
||||||
EXPECT_TRUE(mached_sess_num == 3);
|
EXPECT_TRUE(mached_sess_num == 3);
|
||||||
mached_session_print("SESSION_SCAN_DIP: (IPv4 MIN MAX)", sess_mgr_rte, mached_sess_id, mached_sess_num);
|
mached_session_print("scan destination address: IPv4 min max", sess_mgr_rte, mached_sess_id, mached_sess_num);
|
||||||
|
|
||||||
scan.addr_family = AF_INET6;
|
// IPv6
|
||||||
memcpy(&scan.dst_addr[0].v6, &v6_dst_addr, sizeof(v6_dst_addr));
|
memset(&filter, 0, sizeof(filter));
|
||||||
memcpy(&scan.dst_addr[1].v6, &v6_dst_addr, sizeof(v6_dst_addr));
|
filter.cursor = 0;
|
||||||
mached_sess_num = session_manager_rte_scan_session(sess_mgr_rte, &scan, mached_sess_id, sizeof(mached_sess_id) / sizeof(mached_sess_id[0]));
|
filter.count = 1460;
|
||||||
|
filter.dst_family = AF_INET6;
|
||||||
|
memcpy(&filter.dst_addr_range[0].v6, &v6_dst_addr, sizeof(v6_dst_addr));
|
||||||
|
memcpy(&filter.dst_addr_range[1].v6, &v6_dst_addr, sizeof(v6_dst_addr));
|
||||||
|
|
||||||
|
mached_sess_num = session_manager_rte_scan_session(sess_mgr_rte, &filter, mached_sess_id, sizeof(mached_sess_id) / sizeof(mached_sess_id[0]));
|
||||||
EXPECT_TRUE(mached_sess_num == 1);
|
EXPECT_TRUE(mached_sess_num == 1);
|
||||||
mached_session_print("SESSION_SCAN_DIP: (IPv6)", sess_mgr_rte, mached_sess_id, mached_sess_num);
|
mached_session_print("scan destination address: IPv6", sess_mgr_rte, mached_sess_id, mached_sess_num);
|
||||||
|
|
||||||
scan.addr_family = AF_INET6;
|
// IPv6 subnet
|
||||||
memcpy(&scan.dst_addr[0].v6, &v6_dst_subnet_beg, sizeof(v6_dst_subnet_beg));
|
memset(&filter, 0, sizeof(filter));
|
||||||
memcpy(&scan.dst_addr[1].v6, &v6_dst_subnet_end, sizeof(v6_dst_subnet_end));
|
filter.cursor = 0;
|
||||||
mached_sess_num = session_manager_rte_scan_session(sess_mgr_rte, &scan, mached_sess_id, sizeof(mached_sess_id) / sizeof(mached_sess_id[0]));
|
filter.count = 1460;
|
||||||
|
filter.dst_family = AF_INET6;
|
||||||
|
memcpy(&filter.dst_addr_range[0].v6, &v6_dst_subnet_beg, sizeof(v6_dst_subnet_beg));
|
||||||
|
memcpy(&filter.dst_addr_range[1].v6, &v6_dst_subnet_end, sizeof(v6_dst_subnet_end));
|
||||||
|
|
||||||
|
mached_sess_num = session_manager_rte_scan_session(sess_mgr_rte, &filter, mached_sess_id, sizeof(mached_sess_id) / sizeof(mached_sess_id[0]));
|
||||||
EXPECT_TRUE(mached_sess_num == 1);
|
EXPECT_TRUE(mached_sess_num == 1);
|
||||||
mached_session_print("SESSION_SCAN_DIP: (IPv6 SUBNET)", sess_mgr_rte, mached_sess_id, mached_sess_num);
|
mached_session_print("scan destination address: IPv6 subnet", sess_mgr_rte, mached_sess_id, mached_sess_num);
|
||||||
|
|
||||||
scan.addr_family = AF_INET6;
|
// IPv6 min max
|
||||||
memcpy(&scan.dst_addr[0].v6, &v6_min_addr, sizeof(v6_min_addr));
|
memset(&filter, 0, sizeof(filter));
|
||||||
memcpy(&scan.dst_addr[1].v6, &v6_max_addr, sizeof(v6_max_addr));
|
filter.cursor = 0;
|
||||||
mached_sess_num = session_manager_rte_scan_session(sess_mgr_rte, &scan, mached_sess_id, sizeof(mached_sess_id) / sizeof(mached_sess_id[0]));
|
filter.count = 1460;
|
||||||
|
filter.dst_family = AF_INET6;
|
||||||
|
memcpy(&filter.dst_addr_range[0].v6, &v6_min_addr, sizeof(v6_min_addr));
|
||||||
|
memcpy(&filter.dst_addr_range[1].v6, &v6_max_addr, sizeof(v6_max_addr));
|
||||||
|
|
||||||
|
mached_sess_num = session_manager_rte_scan_session(sess_mgr_rte, &filter, mached_sess_id, sizeof(mached_sess_id) / sizeof(mached_sess_id[0]));
|
||||||
EXPECT_TRUE(mached_sess_num == 1);
|
EXPECT_TRUE(mached_sess_num == 1);
|
||||||
mached_session_print("SESSION_SCAN_DIP: (IPv6 MIN MAX)", sess_mgr_rte, mached_sess_id, mached_sess_num);
|
mached_session_print("scan destination address: IPv6 min max", sess_mgr_rte, mached_sess_id, mached_sess_num);
|
||||||
|
|
||||||
// SESSION_SCAN_SPORT
|
/**************************************************************************
|
||||||
scan.flags = SESSION_SCAN_SPORT;
|
* scan source port
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
scan.src_port = htons(60111);
|
// hit
|
||||||
mached_sess_num = session_manager_rte_scan_session(sess_mgr_rte, &scan, mached_sess_id, sizeof(mached_sess_id) / sizeof(mached_sess_id[0]));
|
memset(&filter, 0, sizeof(filter));
|
||||||
|
filter.cursor = 0;
|
||||||
|
filter.count = 1460;
|
||||||
|
filter.src_port = htons(60111);
|
||||||
|
|
||||||
|
mached_sess_num = session_manager_rte_scan_session(sess_mgr_rte, &filter, mached_sess_id, sizeof(mached_sess_id) / sizeof(mached_sess_id[0]));
|
||||||
EXPECT_TRUE(mached_sess_num == 3);
|
EXPECT_TRUE(mached_sess_num == 3);
|
||||||
mached_session_print("SESSION_SCAN_SPORT: (HIT)", sess_mgr_rte, mached_sess_id, mached_sess_num);
|
mached_session_print("scan source port: hit", sess_mgr_rte, mached_sess_id, mached_sess_num);
|
||||||
|
|
||||||
scan.src_port = htons(60110);
|
// miss
|
||||||
mached_sess_num = session_manager_rte_scan_session(sess_mgr_rte, &scan, mached_sess_id, sizeof(mached_sess_id) / sizeof(mached_sess_id[0]));
|
memset(&filter, 0, sizeof(filter));
|
||||||
|
filter.cursor = 0;
|
||||||
|
filter.count = 1460;
|
||||||
|
filter.src_port = htons(60110);
|
||||||
|
|
||||||
|
mached_sess_num = session_manager_rte_scan_session(sess_mgr_rte, &filter, mached_sess_id, sizeof(mached_sess_id) / sizeof(mached_sess_id[0]));
|
||||||
EXPECT_TRUE(mached_sess_num == 0);
|
EXPECT_TRUE(mached_sess_num == 0);
|
||||||
mached_session_print("SESSION_SCAN_SPORT: (MISS)", sess_mgr_rte, mached_sess_id, mached_sess_num);
|
mached_session_print("scan source port: miss", sess_mgr_rte, mached_sess_id, mached_sess_num);
|
||||||
|
|
||||||
// SESSION_SCAN_DPORT
|
/**************************************************************************
|
||||||
scan.flags = SESSION_SCAN_DPORT;
|
* scan destination port
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
scan.dst_port = htons(80);
|
// hit
|
||||||
mached_sess_num = session_manager_rte_scan_session(sess_mgr_rte, &scan, mached_sess_id, sizeof(mached_sess_id) / sizeof(mached_sess_id[0]));
|
memset(&filter, 0, sizeof(filter));
|
||||||
|
filter.cursor = 0;
|
||||||
|
filter.count = 1460;
|
||||||
|
filter.dst_port = htons(80);
|
||||||
|
|
||||||
|
mached_sess_num = session_manager_rte_scan_session(sess_mgr_rte, &filter, mached_sess_id, sizeof(mached_sess_id) / sizeof(mached_sess_id[0]));
|
||||||
EXPECT_TRUE(mached_sess_num == 3);
|
EXPECT_TRUE(mached_sess_num == 3);
|
||||||
mached_session_print("SESSION_SCAN_DPORT: (HIT)", sess_mgr_rte, mached_sess_id, mached_sess_num);
|
mached_session_print("scan destination port: hit", sess_mgr_rte, mached_sess_id, mached_sess_num);
|
||||||
|
|
||||||
scan.dst_port = htons(81);
|
// miss
|
||||||
mached_sess_num = session_manager_rte_scan_session(sess_mgr_rte, &scan, mached_sess_id, sizeof(mached_sess_id) / sizeof(mached_sess_id[0]));
|
memset(&filter, 0, sizeof(filter));
|
||||||
|
filter.cursor = 0;
|
||||||
|
filter.count = 1460;
|
||||||
|
filter.dst_port = htons(81);
|
||||||
|
|
||||||
|
mached_sess_num = session_manager_rte_scan_session(sess_mgr_rte, &filter, mached_sess_id, sizeof(mached_sess_id) / sizeof(mached_sess_id[0]));
|
||||||
EXPECT_TRUE(mached_sess_num == 0);
|
EXPECT_TRUE(mached_sess_num == 0);
|
||||||
mached_session_print("SESSION_SCAN_DPORT: (MISS)", sess_mgr_rte, mached_sess_id, mached_sess_num);
|
mached_session_print("scan destination port: miss", sess_mgr_rte, mached_sess_id, mached_sess_num);
|
||||||
|
|
||||||
// SESSION_SCAN_CREATE_TIME
|
/**************************************************************************
|
||||||
scan.flags = SESSION_SCAN_CREATE_TIME;
|
* scan session create time
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
scan.create_time_ms[0] = 0;
|
// hit
|
||||||
scan.create_time_ms[1] = UINT64_MAX;
|
memset(&filter, 0, sizeof(filter));
|
||||||
mached_sess_num = session_manager_rte_scan_session(sess_mgr_rte, &scan, mached_sess_id, sizeof(mached_sess_id) / sizeof(mached_sess_id[0]));
|
filter.cursor = 0;
|
||||||
|
filter.count = 1460;
|
||||||
|
filter.sess_created_ts_in_ms = 1;
|
||||||
|
|
||||||
|
mached_sess_num = session_manager_rte_scan_session(sess_mgr_rte, &filter, mached_sess_id, sizeof(mached_sess_id) / sizeof(mached_sess_id[0]));
|
||||||
EXPECT_TRUE(mached_sess_num == 4);
|
EXPECT_TRUE(mached_sess_num == 4);
|
||||||
mached_session_print("SESSION_SCAN_CREATE_TIME: (HIT)", sess_mgr_rte, mached_sess_id, mached_sess_num);
|
mached_session_print("scan session create time: hit", sess_mgr_rte, mached_sess_id, mached_sess_num);
|
||||||
|
|
||||||
scan.create_time_ms[0] = 1;
|
// miss
|
||||||
scan.create_time_ms[1] = 2;
|
memset(&filter, 0, sizeof(filter));
|
||||||
mached_sess_num = session_manager_rte_scan_session(sess_mgr_rte, &scan, mached_sess_id, sizeof(mached_sess_id) / sizeof(mached_sess_id[0]));
|
filter.cursor = 0;
|
||||||
EXPECT_TRUE(mached_sess_num == 2);
|
filter.count = 1460;
|
||||||
mached_session_print("SESSION_SCAN_CREATE_TIME: (HIT)", sess_mgr_rte, mached_sess_id, mached_sess_num);
|
filter.sess_created_ts_in_ms = 5;
|
||||||
|
|
||||||
scan.create_time_ms[0] = 0;
|
mached_sess_num = session_manager_rte_scan_session(sess_mgr_rte, &filter, mached_sess_id, sizeof(mached_sess_id) / sizeof(mached_sess_id[0]));
|
||||||
scan.create_time_ms[1] = 0;
|
|
||||||
mached_sess_num = session_manager_rte_scan_session(sess_mgr_rte, &scan, mached_sess_id, sizeof(mached_sess_id) / sizeof(mached_sess_id[0]));
|
|
||||||
EXPECT_TRUE(mached_sess_num == 0);
|
EXPECT_TRUE(mached_sess_num == 0);
|
||||||
mached_session_print("SESSION_SCAN_CREATE_TIME: (MISS)", sess_mgr_rte, mached_sess_id, mached_sess_num);
|
mached_session_print("scan session create time: miss", sess_mgr_rte, mached_sess_id, mached_sess_num);
|
||||||
|
|
||||||
scan.create_time_ms[0] = UINT64_MAX;
|
/**************************************************************************
|
||||||
scan.create_time_ms[1] = UINT64_MAX;
|
* scan last packet receive time
|
||||||
mached_sess_num = session_manager_rte_scan_session(sess_mgr_rte, &scan, mached_sess_id, sizeof(mached_sess_id) / sizeof(mached_sess_id[0]));
|
**************************************************************************/
|
||||||
EXPECT_TRUE(mached_sess_num == 0);
|
|
||||||
mached_session_print("SESSION_SCAN_CREATE_TIME: (MISS)", sess_mgr_rte, mached_sess_id, mached_sess_num);
|
|
||||||
|
|
||||||
// SESSION_SCAN_LASPKT_TIME
|
// hit
|
||||||
scan.flags = SESSION_SCAN_LASPKT_TIME;
|
memset(&filter, 0, sizeof(filter));
|
||||||
|
filter.cursor = 0;
|
||||||
|
filter.count = 1460;
|
||||||
|
filter.pkt_received_ts_in_ms = 1;
|
||||||
|
|
||||||
scan.laspkt_time_ms[0] = 0;
|
mached_sess_num = session_manager_rte_scan_session(sess_mgr_rte, &filter, mached_sess_id, sizeof(mached_sess_id) / sizeof(mached_sess_id[0]));
|
||||||
scan.laspkt_time_ms[1] = UINT64_MAX;
|
|
||||||
mached_sess_num = session_manager_rte_scan_session(sess_mgr_rte, &scan, mached_sess_id, sizeof(mached_sess_id) / sizeof(mached_sess_id[0]));
|
|
||||||
EXPECT_TRUE(mached_sess_num == 4);
|
EXPECT_TRUE(mached_sess_num == 4);
|
||||||
mached_session_print("SESSION_SCAN_LASPKT_TIME: (HIT)", sess_mgr_rte, mached_sess_id, mached_sess_num);
|
mached_session_print("scan last packet receive time: hit", sess_mgr_rte, mached_sess_id, mached_sess_num);
|
||||||
|
|
||||||
scan.laspkt_time_ms[0] = 1;
|
// miss
|
||||||
scan.laspkt_time_ms[1] = 2;
|
memset(&filter, 0, sizeof(filter));
|
||||||
mached_sess_num = session_manager_rte_scan_session(sess_mgr_rte, &scan, mached_sess_id, sizeof(mached_sess_id) / sizeof(mached_sess_id[0]));
|
filter.cursor = 0;
|
||||||
EXPECT_TRUE(mached_sess_num == 2);
|
filter.count = 1460;
|
||||||
mached_session_print("SESSION_SCAN_LASPKT_TIME: (HIT)", sess_mgr_rte, mached_sess_id, mached_sess_num);
|
filter.pkt_received_ts_in_ms = 5;
|
||||||
|
|
||||||
scan.laspkt_time_ms[0] = 0;
|
mached_sess_num = session_manager_rte_scan_session(sess_mgr_rte, &filter, mached_sess_id, sizeof(mached_sess_id) / sizeof(mached_sess_id[0]));
|
||||||
scan.laspkt_time_ms[1] = 0;
|
|
||||||
mached_sess_num = session_manager_rte_scan_session(sess_mgr_rte, &scan, mached_sess_id, sizeof(mached_sess_id) / sizeof(mached_sess_id[0]));
|
|
||||||
EXPECT_TRUE(mached_sess_num == 0);
|
EXPECT_TRUE(mached_sess_num == 0);
|
||||||
mached_session_print("SESSION_SCAN_LASPKT_TIME: (MISS)", sess_mgr_rte, mached_sess_id, mached_sess_num);
|
mached_session_print("scan last packet receive time: miss", sess_mgr_rte, mached_sess_id, mached_sess_num);
|
||||||
|
|
||||||
scan.laspkt_time_ms[0] = UINT64_MAX;
|
|
||||||
scan.laspkt_time_ms[1] = UINT64_MAX;
|
|
||||||
mached_sess_num = session_manager_rte_scan_session(sess_mgr_rte, &scan, mached_sess_id, sizeof(mached_sess_id) / sizeof(mached_sess_id[0]));
|
|
||||||
EXPECT_TRUE(mached_sess_num == 0);
|
|
||||||
mached_session_print("SESSION_SCAN_LASPKT_TIME: (MISS)", sess_mgr_rte, mached_sess_id, mached_sess_num);
|
|
||||||
|
|
||||||
session_manager_rte_free(sess_mgr_rte);
|
session_manager_rte_free(sess_mgr_rte);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -50,6 +50,9 @@ global:
|
|||||||
session_manager_subscribe_control_packet;
|
session_manager_subscribe_control_packet;
|
||||||
session_manager_subscribe_tcp_stream;
|
session_manager_subscribe_tcp_stream;
|
||||||
|
|
||||||
|
session_monitor_on_init;
|
||||||
|
session_monitor_on_exit;
|
||||||
|
|
||||||
exdata_*;
|
exdata_*;
|
||||||
mq_*;
|
mq_*;
|
||||||
module_*;
|
module_*;
|
||||||
|
|||||||
Reference in New Issue
Block a user