feature: add session monitor, support 'show session id/all/info' command

This commit is contained in:
luwenpeng
2024-11-07 19:12:51 +08:00
parent 50a841919d
commit d0a8685914
10 changed files with 1418 additions and 232 deletions

View File

@@ -1,11 +1,11 @@
#include <assert.h>
#include "packet_helper.h"
#include "packet_filter.h"
#include "packet_dabloom.h"
#include "session_pool.h"
#include "session_table.h"
#include "session_timer.h"
#include "session_filter.h"
#include "session_dabloom.h"
#include "session_internal.h"
#include "session_transition.h"
#include "session_manager_log.h"
@@ -26,8 +26,8 @@ struct session_manager_rte
struct session_table *udp_table;
struct session_timer *sess_timer;
struct packet_filter *dup_pkt_filter;
struct session_filter *evc_sess_filter;
struct packet_dabloom *dup_pkt_dab;
struct session_dabloom *evc_sess_dab;
struct session_manager_cfg cfg;
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)
{
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++;
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);
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_BYTES_BYPASS, packet_get_raw_len(pkt));
@@ -463,7 +463,7 @@ static int session_manager_rte_bypass_duplicated_packet(struct session_manager_r
}
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;
}
}
@@ -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);
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_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)
{
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);
@@ -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)
{
sess_mgr_rte->evc_sess_filter = session_filter_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.error_rate, now_ms);
if (sess_mgr_rte->evc_sess_filter == NULL)
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.error_rate, now_ms);
if (sess_mgr_rte->evc_sess_dab == NULL)
{
goto error;
}
}
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->cfg.duplicated_packet_bloom_filter.time_window_ms,
sess_mgr_rte->cfg.duplicated_packet_bloom_filter.error_rate, now_ms);
if (sess_mgr_rte->dup_pkt_filter == NULL)
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.error_rate, now_ms);
if (sess_mgr_rte->dup_pkt_dab == NULL)
{
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)
{
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)
{
packet_filter_free(sess_mgr_rte->dup_pkt_filter);
packet_dabloom_free(sess_mgr_rte->dup_pkt_dab);
}
snowflake_free(sess_mgr_rte->sf);
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;
}
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 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 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;
}
if (opts->count == 0)
if (filter->count == 0)
{
return mached_sess_num;
}
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;
}
max_loop = MIN(capacity, opts->cursor + opts->count);
for (uint64_t i = opts->cursor; i < max_loop; i++)
max_loop = MIN(capacity, filter->cursor + filter->count);
for (uint64_t i = filter->cursor; i < max_loop; i++)
{
sess = session_pool_get0(sess_mgr_rte->sess_pool, i);
tuple = session_get_tuple6(sess);
@@ -1145,60 +1145,56 @@ uint64_t session_manager_rte_scan_session(struct session_manager_rte *sess_mgr_r
continue;
}
if ((opts->flags & SESSION_SCAN_TYPE) && opts->type != session_get_type(sess))
if (filter->type && filter->type != session_get_type(sess))
{
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;
}
if ((opts->flags & SESSION_SCAN_CREATE_TIME) &&
(session_get_timestamp(sess, SESSION_TIMESTAMP_START) < opts->create_time_ms[0] ||
session_get_timestamp(sess, SESSION_TIMESTAMP_START) > opts->create_time_ms[1]))
if (filter->sess_created_ts_in_ms && session_get_timestamp(sess, SESSION_TIMESTAMP_START) < filter->sess_created_ts_in_ms)
{
continue;
}
if ((opts->flags & SESSION_SCAN_LASPKT_TIME) &&
(session_get_timestamp(sess, SESSION_TIMESTAMP_LAST) < opts->laspkt_time_ms[0] ||
session_get_timestamp(sess, SESSION_TIMESTAMP_LAST) > opts->laspkt_time_ms[1]))
if (filter->pkt_received_ts_in_ms && session_get_timestamp(sess, SESSION_TIMESTAMP_LAST) < filter->pkt_received_ts_in_ms)
{
continue;
}
if ((opts->flags & SESSION_SCAN_SPORT) && opts->src_port != tuple->src_port)
if (filter->src_port && filter->src_port != tuple->src_port)
{
continue;
}
if ((opts->flags & SESSION_SCAN_DPORT) && opts->dst_port != tuple->dst_port)
if (filter->dst_port && filter->dst_port != tuple->dst_port)
{
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;
}
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;
}
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;
}
}
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;
}
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;
}
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;
}
@@ -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;
}
@@ -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)
{
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);
}
}