feature: session mananger publish ctrl message; Enhance session debugger module
This commit is contained in:
@@ -54,7 +54,7 @@ struct session
|
||||
UT_hash_handle hh1;
|
||||
UT_hash_handle hh2;
|
||||
UT_hash_handle hh3;
|
||||
struct tuple6 tuple;
|
||||
struct tuple6 tuple; // FLOW_TYPE_C2S tuple
|
||||
char tuple_str[TUPLE6_STR_SIZE];
|
||||
struct sids sids[MAX_FLOW_TYPE];
|
||||
struct route_ctx route_ctx[MAX_FLOW_TYPE];
|
||||
|
||||
@@ -106,10 +106,16 @@ static void on_packet_forward(enum packet_stage stage, struct packet *pkt, void
|
||||
*/
|
||||
uint64_t now_ms = clock_get_real_time_ms();
|
||||
|
||||
struct tuple6 key;
|
||||
struct tcp_segment *seg = NULL;
|
||||
struct session *sess = session_manager_runtime_lookup_session_by_packet(sess_mgr_rt, pkt);
|
||||
if (sess == NULL)
|
||||
{
|
||||
if (packet_is_ctrl(pkt))
|
||||
{
|
||||
goto fast_path;
|
||||
}
|
||||
|
||||
sess = session_manager_runtime_new_session(sess_mgr_rt, pkt, now_ms);
|
||||
if (sess == NULL)
|
||||
{
|
||||
@@ -123,6 +129,11 @@ static void on_packet_forward(enum packet_stage stage, struct packet *pkt, void
|
||||
}
|
||||
else
|
||||
{
|
||||
if (packet_is_ctrl(pkt))
|
||||
{
|
||||
goto ctrl_path;
|
||||
}
|
||||
|
||||
if (session_manager_runtime_update_session(sess_mgr_rt, sess, pkt, now_ms) == -1)
|
||||
{
|
||||
goto fast_path;
|
||||
@@ -133,6 +144,21 @@ static void on_packet_forward(enum packet_stage stage, struct packet *pkt, void
|
||||
}
|
||||
}
|
||||
|
||||
ctrl_path:
|
||||
session_set_current_packet(sess, pkt);
|
||||
packet_get_innermost_tuple6(pkt, &key);
|
||||
if (tuple6_cmp(session_get_tuple6(sess), &key) == 0)
|
||||
{
|
||||
session_set_flow_type(sess, FLOW_TYPE_C2S);
|
||||
}
|
||||
else
|
||||
{
|
||||
session_set_flow_type(sess, FLOW_TYPE_S2C);
|
||||
}
|
||||
packet_set_exdata(pkt, sess_mgr->schema->pkt_exdata_idx, sess);
|
||||
mq_runtime_publish_message(mq_rt, sess_mgr->schema->topic_id_ctrl_pkt, sess);
|
||||
return;
|
||||
|
||||
slow_path:
|
||||
if (session_get_type(sess) == SESSION_TYPE_TCP)
|
||||
{
|
||||
@@ -146,11 +172,12 @@ slow_path:
|
||||
{
|
||||
mq_runtime_publish_message(mq_rt, sess_mgr->schema->topic_id_udp, sess);
|
||||
}
|
||||
|
||||
packet_set_exdata(pkt, sess_mgr->schema->pkt_exdata_idx, sess);
|
||||
return;
|
||||
|
||||
fast_path:
|
||||
packet_set_exdata(pkt, sess_mgr->schema->pkt_exdata_idx, NULL);
|
||||
return;
|
||||
}
|
||||
|
||||
static void on_packet_output(enum packet_stage stage, struct packet *pkt, void *args)
|
||||
@@ -163,18 +190,29 @@ static void on_packet_output(enum packet_stage stage, struct packet *pkt, void *
|
||||
struct session *sess = (struct session *)packet_get_exdata(pkt, sess_mgr->schema->pkt_exdata_idx);
|
||||
if (sess)
|
||||
{
|
||||
enum flow_type type = session_get_flow_type(sess);
|
||||
struct tuple6 key;
|
||||
enum flow_type flow = FLOW_TYPE_NONE;
|
||||
packet_get_innermost_tuple6(pkt, &key);
|
||||
if (tuple6_cmp(session_get_tuple6(sess), &key) == 0)
|
||||
{
|
||||
flow = FLOW_TYPE_C2S;
|
||||
}
|
||||
else
|
||||
{
|
||||
flow = FLOW_TYPE_S2C;
|
||||
}
|
||||
|
||||
int is_ctrl = packet_is_ctrl(pkt);
|
||||
uint16_t len = packet_get_raw_len(pkt);
|
||||
switch (packet_get_action(pkt))
|
||||
{
|
||||
case PACKET_ACTION_DROP:
|
||||
session_inc_stat(sess, type, (is_ctrl ? STAT_CONTROL_PACKETS_DROPPED : STAT_RAW_PACKETS_DROPPED), 1);
|
||||
session_inc_stat(sess, type, (is_ctrl ? STAT_CONTROL_BYTES_DROPPED : STAT_RAW_BYTES_DROPPED), len);
|
||||
session_inc_stat(sess, flow, (is_ctrl ? STAT_CONTROL_PACKETS_DROPPED : STAT_RAW_PACKETS_DROPPED), 1);
|
||||
session_inc_stat(sess, flow, (is_ctrl ? STAT_CONTROL_BYTES_DROPPED : STAT_RAW_BYTES_DROPPED), len);
|
||||
break;
|
||||
case PACKET_ACTION_FORWARD:
|
||||
session_inc_stat(sess, type, (is_ctrl ? STAT_CONTROL_PACKETS_TRANSMITTED : STAT_RAW_PACKETS_TRANSMITTED), 1);
|
||||
session_inc_stat(sess, type, (is_ctrl ? STAT_CONTROL_BYTES_TRANSMITTED : STAT_RAW_BYTES_TRANSMITTED), len);
|
||||
session_inc_stat(sess, flow, (is_ctrl ? STAT_CONTROL_PACKETS_TRANSMITTED : STAT_RAW_PACKETS_TRANSMITTED), 1);
|
||||
session_inc_stat(sess, flow, (is_ctrl ? STAT_CONTROL_BYTES_TRANSMITTED : STAT_RAW_BYTES_TRANSMITTED), len);
|
||||
break;
|
||||
default:
|
||||
assert(0);
|
||||
|
||||
@@ -1102,6 +1102,7 @@ void session_manager_runtime_free_session(struct session_manager_runtime *sess_m
|
||||
session_set_current_state(sess, SESSION_STATE_INIT);
|
||||
session_set_current_packet(sess, NULL);
|
||||
session_set_flow_type(sess, FLOW_TYPE_NONE);
|
||||
session_init(sess);
|
||||
session_pool_push(sess_mgr_rt->sess_pool, sess);
|
||||
sess = NULL;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user