feature: support session manager scan
This commit is contained in:
@@ -7,7 +7,7 @@
|
||||
#include "packet_helper.h"
|
||||
#include "packet_filter.h"
|
||||
#include "snowflake.h"
|
||||
#include "session_def.h"
|
||||
#include "session_private.h"
|
||||
#include "session_utils.h"
|
||||
#include "session_pool.h"
|
||||
#include "session_table.h"
|
||||
@@ -441,11 +441,11 @@ static enum flow_direction identify_direction_by_history(const struct session *s
|
||||
{
|
||||
if (tuple6_cmp(session_get_tuple6(sess), key) == 0)
|
||||
{
|
||||
return session_get_tuple6_direction(sess);
|
||||
return FLOW_DIRECTION_C2S;
|
||||
}
|
||||
else
|
||||
{
|
||||
return (session_get_tuple6_direction(sess) == FLOW_DIRECTION_C2S ? FLOW_DIRECTION_S2C : FLOW_DIRECTION_C2S);
|
||||
return FLOW_DIRECTION_S2C;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -537,13 +537,10 @@ static void session_update(struct session_manager *mgr, struct session *sess, en
|
||||
if (session_get_current_state(sess) == SESSION_STATE_INIT)
|
||||
{
|
||||
session_set_id(sess, snowflake_id_generate(mgr->now_ms / 1000));
|
||||
session_set_tuple6(sess, key);
|
||||
session_set_tuple_direction(sess, dir);
|
||||
|
||||
enum packet_direction pkt_dir = packet_get_direction(pkt);
|
||||
|
||||
if (dir == FLOW_DIRECTION_C2S)
|
||||
{
|
||||
session_set_tuple6(sess, key);
|
||||
if (pkt_dir == PACKET_DIRECTION_OUTGOING) // Internal -> External
|
||||
{
|
||||
session_set_direction(sess, SESSION_DIRECTION_OUTBOUND);
|
||||
@@ -552,9 +549,13 @@ static void session_update(struct session_manager *mgr, struct session *sess, en
|
||||
{
|
||||
session_set_direction(sess, SESSION_DIRECTION_INBOUND);
|
||||
}
|
||||
tuple6_to_str(key, sess->tuple_str, sizeof(sess->tuple_str));
|
||||
}
|
||||
else
|
||||
{
|
||||
struct tuple6 out;
|
||||
tuple6_reverse(key, &out);
|
||||
session_set_tuple6(sess, &out);
|
||||
if (pkt_dir == PACKET_DIRECTION_OUTGOING) // Internal -> External
|
||||
{
|
||||
session_set_direction(sess, SESSION_DIRECTION_INBOUND);
|
||||
@@ -563,9 +564,9 @@ static void session_update(struct session_manager *mgr, struct session *sess, en
|
||||
{
|
||||
session_set_direction(sess, SESSION_DIRECTION_OUTBOUND);
|
||||
}
|
||||
tuple6_to_str(&out, sess->tuple_str, sizeof(sess->tuple_str));
|
||||
}
|
||||
|
||||
tuple6_to_str(key, sess->tuple_str, sizeof(sess->tuple_str));
|
||||
session_set_timestamp(sess, SESSION_TIMESTAMP_START, mgr->now_ms);
|
||||
switch (key->ip_proto)
|
||||
{
|
||||
@@ -1226,3 +1227,115 @@ void session_set_discard(struct session *sess)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static inline uint8_t ipv4_in_range(const struct in_addr *addr, const struct in_addr *start, const struct in_addr *end)
|
||||
{
|
||||
return (memcmp(addr, start, sizeof(struct in_addr)) >= 0 && memcmp(addr, end, sizeof(struct in_addr)) <= 0);
|
||||
}
|
||||
|
||||
static inline uint8_t ipv6_in_range(const struct in6_addr *addr, const struct in6_addr *start, const struct in6_addr *end)
|
||||
{
|
||||
return (memcmp(addr, start, sizeof(struct in6_addr)) >= 0 && memcmp(addr, end, sizeof(struct in6_addr)) <= 0);
|
||||
}
|
||||
|
||||
uint64_t session_manager_scan(const struct session_manager *mgr, const struct session_scan_opts *opts, uint64_t mached_sess_ids[], uint64_t array_size)
|
||||
{
|
||||
uint64_t capacity = 0;
|
||||
uint64_t max_loop = 0;
|
||||
uint64_t mached_sess_num = 0;
|
||||
const struct session *sess = NULL;
|
||||
const struct tuple6 *tuple = NULL;
|
||||
|
||||
if (mgr == NULL || opts == NULL || mached_sess_ids == NULL || array_size == 0)
|
||||
{
|
||||
return mached_sess_num;
|
||||
}
|
||||
if (opts->count == 0)
|
||||
{
|
||||
return mached_sess_num;
|
||||
}
|
||||
capacity = session_pool_capacity_size(mgr->sess_pool);
|
||||
if (opts->cursor >= capacity)
|
||||
{
|
||||
return mached_sess_num;
|
||||
}
|
||||
|
||||
max_loop = MIN(capacity, opts->cursor + opts->count);
|
||||
for (uint64_t i = opts->cursor; i < max_loop; i++)
|
||||
{
|
||||
sess = session_pool_get0(mgr->sess_pool, i);
|
||||
tuple = session_get_tuple6(sess);
|
||||
if (session_get_current_state(sess) == SESSION_STATE_INIT)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if ((opts->flags & SESSION_SCAN_TYPE) && opts->type != session_get_type(sess))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ((opts->flags & SESSION_SCAN_STATE) && opts->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]))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ((opts->flags & SESSION_SCAN_LAST_PKT_TIME) &&
|
||||
(session_get_timestamp(sess, SESSION_TIMESTAMP_LAST) < opts->last_pkt_time_ms[0] ||
|
||||
session_get_timestamp(sess, SESSION_TIMESTAMP_LAST) > opts->last_pkt_time_ms[1]))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ((opts->flags & SESSION_SCAN_SPORT) && opts->src_port != tuple->src_port)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ((opts->flags & SESSION_SCAN_DPORT) && opts->dst_port != tuple->dst_port)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (opts->flags & SESSION_SCAN_SIP)
|
||||
{
|
||||
if (opts->addr_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))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ((opts->addr_family == AF_INET6) && !ipv6_in_range(&tuple->src_addr.v6, &opts->src_addr[0].v6, &opts->src_addr[1].v6))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (opts->flags & SESSION_SCAN_DIP)
|
||||
{
|
||||
if (opts->addr_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))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ((opts->addr_family == AF_INET6) && !ipv6_in_range(&tuple->dst_addr.v6, &opts->dst_addr[0].v6, &opts->dst_addr[1].v6))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
mached_sess_ids[mached_sess_num++] = session_get_id(sess);
|
||||
if (mached_sess_num >= array_size)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
SESSION_LOG_DEBUG("session scan: cursor=%lu, count=%lu, mached_sess_num=%lu", opts->cursor, opts->count, mached_sess_num);
|
||||
return mached_sess_num;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user