Session manager add builtin ex data
This commit is contained in:
@@ -46,12 +46,21 @@ static uint64_t alloc_session_id(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
// TODO
|
||||
struct metadata *packet_get0_metadata(const struct packet *pkt)
|
||||
static void metadata_ex_free_cb(struct session *sess, uint8_t idx, void *ex_ptr, void *arg)
|
||||
{
|
||||
static struct metadata md = {0};
|
||||
return &md;
|
||||
};
|
||||
if (ex_ptr)
|
||||
{
|
||||
metadata_free((struct metadata *)ex_ptr);
|
||||
}
|
||||
}
|
||||
|
||||
static void packet_ex_free_cb(struct session *sess, uint8_t idx, void *ex_ptr, void *arg)
|
||||
{
|
||||
if (ex_ptr)
|
||||
{
|
||||
packet_free((struct packet *)ex_ptr);
|
||||
}
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* session manager counter
|
||||
@@ -269,21 +278,29 @@ static int tcp_need_active(uint64_t state)
|
||||
static void update_session_base(struct session *sess, const struct packet *pkt, enum session_dir curr_dir)
|
||||
{
|
||||
uint64_t len = packet_get_raw_len(pkt);
|
||||
struct metadata *md = packet_get0_metadata(pkt);
|
||||
const struct metadata *md = packet_get0_metadata(pkt);
|
||||
if (curr_dir == SESSION_DIR_C2S)
|
||||
{
|
||||
session_inc_c2s_metrics(sess, 1, len);
|
||||
if (session_get0_c2s_1st_md(sess) == NULL)
|
||||
if (session_get0_ex_data(sess, c2s_1st_md_ex) == NULL)
|
||||
{
|
||||
session_set_c2s_1st_md(sess, md);
|
||||
session_set_ex_data(sess, c2s_1st_md_ex, metadata_dup(md));
|
||||
}
|
||||
if (session_get0_ex_data(sess, c2s_1st_pkt_ex) == NULL)
|
||||
{
|
||||
session_set_ex_data(sess, c2s_1st_pkt_ex, packet_dup(pkt));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
session_inc_s2c_metrics(sess, 1, len);
|
||||
if (session_get0_s2c_1st_md(sess) == NULL)
|
||||
if (session_get0_ex_data(sess, s2c_1st_md_ex) == NULL)
|
||||
{
|
||||
session_set_s2c_1st_md(sess, md);
|
||||
session_set_ex_data(sess, s2c_1st_md_ex, metadata_dup(md));
|
||||
}
|
||||
if (session_get0_ex_data(sess, s2c_1st_pkt_ex) == NULL)
|
||||
{
|
||||
session_set_ex_data(sess, s2c_1st_pkt_ex, packet_dup(pkt));
|
||||
}
|
||||
}
|
||||
session_set_last_time(sess, timestamp_get_msec());
|
||||
@@ -441,7 +458,7 @@ static int handle_udp_new_session(struct session_manager *mgr, struct tuple6 *ke
|
||||
update_session_base(sess, pkt, curr_dir);
|
||||
|
||||
session_manager_trigger_session_event(mgr, sess, SESSION_EVENT_OPENING);
|
||||
session_manager_trigger_session_event(mgr, sess, SESSION_EVENT_ACTIVE);
|
||||
session_manager_trigger_session_event(mgr, sess, SESSION_EVENT_PACKET);
|
||||
session_manager_update_session_timer(mgr, sess, packet_expire_callback, mgr->packet_timeout_ms);
|
||||
|
||||
return 0;
|
||||
@@ -467,7 +484,7 @@ static void handle_tcp_old_session(struct session_manager *mgr, struct tuple6 *k
|
||||
{
|
||||
update_counter_on_active(mgr, sess);
|
||||
session_set_state(sess, SESSION_STATE_ACTIVE);
|
||||
session_manager_trigger_session_event(mgr, sess, SESSION_EVENT_ACTIVE);
|
||||
session_manager_trigger_session_event(mgr, sess, SESSION_EVENT_PACKET);
|
||||
session_manager_update_session_timer(mgr, sess, packet_expire_callback, mgr->packet_timeout_ms);
|
||||
return;
|
||||
}
|
||||
@@ -481,7 +498,7 @@ static void handle_udp_old_session(struct session_manager *mgr, struct tuple6 *k
|
||||
|
||||
update_counter_on_active(mgr, sess);
|
||||
session_set_state(sess, SESSION_STATE_ACTIVE);
|
||||
session_manager_trigger_session_event(mgr, sess, SESSION_EVENT_ACTIVE);
|
||||
session_manager_trigger_session_event(mgr, sess, SESSION_EVENT_PACKET);
|
||||
session_manager_update_session_timer(mgr, sess, packet_expire_callback, mgr->packet_timeout_ms);
|
||||
}
|
||||
|
||||
@@ -565,6 +582,10 @@ struct session_manager *session_manager_create(uint64_t max_session_num)
|
||||
|
||||
tcp_builtin_ex = session_get_ex_new_index("tcp_builtin_ex", NULL, NULL);
|
||||
udp_builtin_ex = session_get_ex_new_index("udp_builtin_ex", NULL, NULL);
|
||||
c2s_1st_md_ex = session_get_ex_new_index("c2s_1st_md_ex", metadata_ex_free_cb, NULL);
|
||||
s2c_1st_md_ex = session_get_ex_new_index("s2c_1st_md_ex", metadata_ex_free_cb, NULL);
|
||||
c2s_1st_pkt_ex = session_get_ex_new_index("c2s_1st_pkt_ex", packet_ex_free_cb, NULL);
|
||||
s2c_1st_pkt_ex = session_get_ex_new_index("s2c_1st_pkt_ex", packet_ex_free_cb, NULL);
|
||||
|
||||
return mgr;
|
||||
|
||||
@@ -616,14 +637,13 @@ struct session *session_manager_find_session(struct session_manager *mgr, const
|
||||
struct session *sess = session_table_find_session(mgr->sess_table, &key);
|
||||
if (sess == NULL)
|
||||
{
|
||||
// if session pool is full, discard oldest session
|
||||
if (session_pool_get_count(mgr->sess_pool) == 1)
|
||||
{
|
||||
struct session *unused_sess = session_table_find_least_recently_unused_session(mgr->sess_table);
|
||||
assert(unused_sess);
|
||||
|
||||
update_counter_on_closing(mgr, unused_sess);
|
||||
session_set_state(unused_sess, SESSION_STATE_DISCARD);
|
||||
session_set_state(unused_sess, SESSION_STATE_CLOSING);
|
||||
session_manager_trigger_session_event(mgr, unused_sess, SESSION_EVENT_CLOSING);
|
||||
session_manager_update_session_timer(mgr, unused_sess, closing_expire_callback, mgr->closing_timeout_ms);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user