diff --git a/conf/stellar.toml b/conf/stellar.toml index 906503c..b2e1167 100644 --- a/conf/stellar.toml +++ b/conf/stellar.toml @@ -73,3 +73,5 @@ cli_request_timeout = 3 # second pktdump_task_max_num = 3 +[session_debugger] + enable = 0 # range: [0, 1] \ No newline at end of file diff --git a/include/stellar/packet_tag.h b/include/stellar/packet_tag.h index 16a345b..5b10076 100644 --- a/include/stellar/packet_tag.h +++ b/include/stellar/packet_tag.h @@ -19,18 +19,22 @@ extern "C" #define PKT_TAG_VAL_SESS_NEW 1 << 0 #define PKT_TAG_VAL_SESS_FREE 1 << 1 -#define PKT_TAG_VAL_SESS_FLAG 1 << 2 -#define PKT_TAG_VAL_SESS_TCP_STREAM 1 << 3 -#define PKT_TAG_VAL_SESS_CTRL_MSG 1 << 4 +#define PKT_TAG_VAL_SESS_RAWPKT 1 << 2 +#define PKT_TAG_VAL_SESS_PSEUDOPKT 1 << 3 +#define PKT_TAG_VAL_SESS_FLAG 1 << 4 +#define PKT_TAG_VAL_SESS_TCP_STREAM 1 << 5 +#define PKT_TAG_VAL_SESS_ALL (PKT_TAG_VAL_SESS_NEW | PKT_TAG_VAL_SESS_FREE | PKT_TAG_VAL_SESS_RAWPKT | PKT_TAG_VAL_SESS_PSEUDOPKT | PKT_TAG_VAL_SESS_FLAG | PKT_TAG_VAL_SESS_TCP_STREAM) -#define PKT_TAG_VAL_IPPROTO_TCP 1 << 5 -#define PKT_TAG_VAL_IPPROTO_UDP 1 << 6 -#define PKT_TAG_VAL_IPPROTO_ICMP 1 << 7 +#define PKT_TAG_VAL_IPPROTO_TCP 1 << 10 +#define PKT_TAG_VAL_IPPROTO_UDP 1 << 11 +#define PKT_TAG_VAL_IPPROTO_ICMP 1 << 12 +#define PKT_TAG_VAL_IPPROTO_ALL (PKT_TAG_VAL_IPPROTO_TCP | PKT_TAG_VAL_IPPROTO_UDP | PKT_TAG_VAL_IPPROTO_ICMP) -#define PKT_TAG_VAL_L7PROTO_SSL 1 << 8 -#define PKT_TAG_VAL_L7PROTO_DNS 1 << 9 -#define PKT_TAG_VAL_L7PROTO_HTTP 1 << 10 -#define PKT_TAG_VAL_L7PROTO_QUIC 1 << 11 +#define PKT_TAG_VAL_L7PROTO_SSL 1 << 21 +#define PKT_TAG_VAL_L7PROTO_DNS 1 << 22 +#define PKT_TAG_VAL_L7PROTO_HTTP 1 << 23 +#define PKT_TAG_VAL_L7PROTO_QUIC 1 << 24 +#define PKT_TAG_VAL_L7PROTO_ALL (PKT_TAG_VAL_L7PROTO_SSL | PKT_TAG_VAL_L7PROTO_DNS | PKT_TAG_VAL_L7PROTO_HTTP | PKT_TAG_VAL_L7PROTO_QUIC) #ifdef __cplusplus } diff --git a/include/stellar/session.h b/include/stellar/session.h index 7ae22ad..d45e8ce 100644 --- a/include/stellar/session.h +++ b/include/stellar/session.h @@ -146,14 +146,19 @@ struct session *session_manager_lookup_session_by_packet(struct session_manager struct session *session_manager_lookup_session_by_id(struct session_manager *sess_mgr, uint16_t thread_id, uint64_t sess_id); void session_manager_discard_session(struct session_manager *sess_mgr, uint16_t thread_id, struct session *sess); -void session_manager_on_packet_forward(struct packet *pkt, struct module *mod); -void session_manager_on_packet_output(struct packet *pkt, struct module *mod); - struct module *session_manager_on_init(struct module_manager *mod_mgr); void session_manager_on_exit(struct module_manager *mod_mgr, struct module *mod); struct module *session_manager_on_thread_init(struct module_manager *mod_mgr, int thread_id, struct module *mod); void session_manager_on_thread_exit(struct module_manager *mod_mgr, int thread_id, struct module *mod); +void session_manager_on_packet_forward(struct packet *pkt, struct module *mod); +void session_manager_on_packet_output(struct packet *pkt, struct module *mod); + +#define SESSION_DEBUGGER_MODULE_NAME "session_debugger_module" +struct module *session_debugger_on_init(struct module_manager *mod_mgr); +void session_debugger_on_exit(struct module_manager *mod_mgr, struct module *mod); +void session_debugger_on_packet_forward(struct packet *pkt, struct module *mod); + struct module *session_monitor_on_init(struct module_manager *mod_mgr); void session_monitor_on_exit(struct module_manager *mod_mgr, struct module *mod); diff --git a/infra/packet_manager/packet_manager.c b/infra/packet_manager/packet_manager.c index 2d38a91..a7083fb 100644 --- a/infra/packet_manager/packet_manager.c +++ b/infra/packet_manager/packet_manager.c @@ -255,6 +255,32 @@ struct packet *packet_manager_egress(struct packet_manager *pkt_mgr, uint16_t th } } +static void packet_tag_set_ip_proto(struct packet *pkt) +{ + uint64_t pkt_tag_key_bits = 0; + packet_tag_get(pkt, &pkt_tag_key_bits, NULL); + if (pkt_tag_key_bits & PKT_TAG_KEY_IPPROTO) + { + return; + } + + switch (packet_get_ip_proto(pkt)) + { + case IPPROTO_TCP: + packet_tag_set(pkt, PKT_TAG_KEY_IPPROTO, PKT_TAG_VAL_IPPROTO_TCP); + break; + case IPPROTO_UDP: + packet_tag_set(pkt, PKT_TAG_KEY_IPPROTO, PKT_TAG_VAL_IPPROTO_UDP); + break; + case IPPROTO_ICMP: /* fall through */ + case IPPROTO_ICMPV6: + packet_tag_set(pkt, PKT_TAG_KEY_IPPROTO, PKT_TAG_VAL_IPPROTO_ICMP); + break; + default: + break; + } +} + void packet_manager_dispatch(struct packet_manager *pkt_mgr, uint16_t thread_id) { uint64_t pkt_tag_key_bits = 0; @@ -272,22 +298,7 @@ void packet_manager_dispatch(struct packet_manager *pkt_mgr, uint16_t thread_id) while ((pkt = TAILQ_FIRST(&pkt_mgr_rte->queue[pkt_mgr_rte->curr_stage]))) { packet_set_stage(pkt, pkt_mgr_rte->curr_stage); - switch (packet_get_ip_proto(pkt)) - { - case IPPROTO_TCP: - packet_tag_set(pkt, PKT_TAG_KEY_IPPROTO, PKT_TAG_VAL_IPPROTO_TCP); - break; - case IPPROTO_UDP: - packet_tag_set(pkt, PKT_TAG_KEY_IPPROTO, PKT_TAG_VAL_IPPROTO_UDP); - break; - case IPPROTO_ICMP: /* fall through */ - case IPPROTO_ICMPV6: - packet_tag_set(pkt, PKT_TAG_KEY_IPPROTO, PKT_TAG_VAL_IPPROTO_ICMP); - break; - default: - break; - } - + packet_tag_set_ip_proto(pkt); // schedule packet may not set ip proto tag, so we need to set it here packet_set_claim(pkt, false); pkt_mgr_rte->claim_cb = NULL; pkt_mgr_rte->claim_arg = NULL; diff --git a/infra/packet_manager/packet_utils.c b/infra/packet_manager/packet_utils.c index ce9dc51..32a0170 100644 --- a/infra/packet_manager/packet_utils.c +++ b/infra/packet_manager/packet_utils.c @@ -976,11 +976,15 @@ void packet_tag_set(struct packet *pkt, uint64_t key_bits, uint64_t val_bits) void packet_tag_get(const struct packet *pkt, uint64_t *key_bits, uint64_t *val_bits) { - *key_bits = 0; - *val_bits = 0; + if (key_bits) + { + *key_bits = pkt->tag_key_bits; + } - *key_bits = pkt->tag_key_bits; - *val_bits = pkt->tag_val_bits; + if (val_bits) + { + *val_bits = pkt->tag_val_bits; + } } void packet_set_user_data(struct packet *pkt, void *data) diff --git a/infra/session_manager/CMakeLists.txt b/infra/session_manager/CMakeLists.txt index 044ca6d..acf4746 100644 --- a/infra/session_manager/CMakeLists.txt +++ b/infra/session_manager/CMakeLists.txt @@ -6,6 +6,7 @@ add_library(session_manager session_dabloom.c session_transition.c session_monitor.c + session_debugger.c session_manager.c session_manager_cfg.c session_manager_rte.c diff --git a/test/session_debugger/session_debugger.c b/infra/session_manager/session_debugger.c similarity index 84% rename from test/session_debugger/session_debugger.c rename to infra/session_manager/session_debugger.c index 5121a03..c3bd105 100644 --- a/test/session_debugger/session_debugger.c +++ b/infra/session_manager/session_debugger.c @@ -160,7 +160,7 @@ static void session_debugger_exdata_free(struct session_debugger_exdata *exdata) } } -static void session_debugger_exdata_free_callback(int idx, void *ex_ptr, void *arg) +static void session_debugger_exdata_free_cb(int idx, void *ex_ptr, void *arg) { __attribute__((unused)) struct session_debugger *dbg = (struct session_debugger *)arg; assert(idx == dbg->sess_exdata_idx); @@ -168,9 +168,14 @@ static void session_debugger_exdata_free_callback(int idx, void *ex_ptr, void *a session_debugger_exdata_free((struct session_debugger_exdata *)ex_ptr); } -static void on_session_closed(struct session *sess, void *arg) +static void session_debugger_on_session_new(struct session_debugger *dbg, struct session *sess) +{ + struct session_debugger_exdata *exdata = session_debugger_exdata_new(dbg, sess); + session_set_exdata(sess, dbg->sess_exdata_idx, exdata); +} + +static void session_debugger_on_session_free(struct session_debugger *dbg, struct session *sess) { - struct session_debugger *dbg = (struct session_debugger *)arg; struct session_debugger_exdata *exdata = (struct session_debugger_exdata *)session_get_exdata(sess, dbg->sess_exdata_idx); char buff[PATH_MAX] = {0}; @@ -201,85 +206,12 @@ static void on_session_closed(struct session *sess, void *arg) session_debugger_log(exdata->dbg->fd, "session %lu %s statistics:\n%s", session_get_id(exdata->sess), session_get_readable_addr(exdata->sess), buff); } -static void on_session_message(struct session *sess, enum session_state state, struct packet *pkt, void *arg) +static void session_debugger_on_tcp_payload(struct session_debugger *dbg, struct session *sess, const char *tcp_payload, uint32_t tcp_payload_len) { - struct session_debugger *dbg = (struct session_debugger *)arg; - - if (state == SESSION_STATE_CLOSED) - { - on_session_closed(sess, dbg); - assert(pkt == NULL); - return; - } - - int is_pseudo = (packet_get_type(pkt) == PACKET_TYPE_PSEUDO); - char buff[PATH_MAX]; enum flow_type flow = session_get_flow_type(sess); - assert(flow == FLOW_TYPE_C2S || flow == FLOW_TYPE_S2C); struct session_debugger_exdata *exdata = (struct session_debugger_exdata *)session_get_exdata(sess, dbg->sess_exdata_idx); - if (exdata == NULL) - { - exdata = session_debugger_exdata_new(dbg, sess); - session_set_exdata(sess, dbg->sess_exdata_idx, exdata); - } - - if (flow == FLOW_TYPE_C2S) - { - if (is_pseudo) - { - exdata->c2s_rx_ctrl_pkts++; - exdata->c2s_rx_ctrl_bytes += packet_get_raw_len(pkt); - } - else - { - exdata->c2s_rx_data_pkts++; - exdata->c2s_rx_data_bytes += packet_get_raw_len(pkt); - } - } - else - { - if (is_pseudo) - { - exdata->s2c_rx_ctrl_pkts++; - exdata->s2c_rx_ctrl_bytes += packet_get_raw_len(pkt); - } - else - { - exdata->s2c_rx_data_pkts++; - exdata->s2c_rx_data_bytes += packet_get_raw_len(pkt); - } - } - - memset(buff, 0, sizeof(buff)); - session_to_str(sess, 1, buff, sizeof(buff) - 1); - session_debugger_log(dbg->fd, "on %s %s packet: %s", session_type_to_str(session_get_type(sess)), (is_pseudo ? "pseudo" : "data"), buff); - - memset(buff, 0, sizeof(buff)); - packet_dump_str(pkt, buff, sizeof(buff) - 1); - session_debugger_log(dbg->fd, "rx %s %s packet\n%s", session_type_to_str(session_get_type(sess)), (is_pseudo ? "pseudo" : "data"), buff); - - pthread_spin_lock(&dbg->lock); - packet_dump_hex(pkt, dbg->fd); - pthread_spin_unlock(&dbg->lock); -} - -static void on_tcp_payload_message(struct session *sess, enum session_state state, const char *tcp_payload, uint32_t tcp_payload_len, void *arg) -{ - struct session_debugger *dbg = (struct session_debugger *)arg; - - if (state == SESSION_STATE_CLOSED) - { - assert(tcp_payload == NULL); - assert(tcp_payload_len == 0); - return; - } char buff[PATH_MAX]; - enum flow_type flow = session_get_flow_type(sess); - assert(flow == FLOW_TYPE_C2S || flow == FLOW_TYPE_S2C); - struct session_debugger_exdata *exdata = (struct session_debugger_exdata *)session_get_exdata(sess, dbg->sess_exdata_idx); - assert(exdata); - memset(buff, 0, sizeof(buff)); session_to_str(sess, 1, buff, sizeof(buff) - 1); session_debugger_log(dbg->fd, "on TCP stream: %s", buff); @@ -306,22 +238,12 @@ static void on_tcp_payload_message(struct session *sess, enum session_state stat pthread_spin_unlock(&dbg->lock); } -static void on_udp_payload_message(struct session *sess, enum session_state state, struct packet *pkt, void *arg) +static void session_debugger_on_udp_payload(struct session_debugger *dbg, struct session *sess, struct packet *pkt) { - struct session_debugger *dbg = (struct session_debugger *)arg; - - if (state == SESSION_STATE_CLOSED) - { - assert(pkt == NULL); - return; - } + enum flow_type flow = session_get_flow_type(sess); + struct session_debugger_exdata *exdata = (struct session_debugger_exdata *)session_get_exdata(sess, dbg->sess_exdata_idx); char buff[PATH_MAX]; - enum flow_type flow = session_get_flow_type(sess); - assert(flow == FLOW_TYPE_C2S || flow == FLOW_TYPE_S2C); - struct session_debugger_exdata *exdata = (struct session_debugger_exdata *)session_get_exdata(sess, dbg->sess_exdata_idx); - assert(exdata); - const char *udp_payload = packet_get_payload_data(pkt); uint32_t udp_payload_len = packet_get_payload_len(pkt); if (udp_payload_len == 0) @@ -353,6 +275,100 @@ static void on_udp_payload_message(struct session *sess, enum session_state stat pthread_spin_unlock(&dbg->lock); } +void session_debugger_on_packet_forward(struct packet *pkt, struct module *mod) +{ + struct session_debugger *dbg = module_get_ctx(mod); + assert(dbg); + struct session_manager *sess_mgr = dbg->sess_mgr; + + struct session *sess = packet_exdata_to_session(sess_mgr, pkt); + if (sess == NULL) + { + assert(0); + return; + } + + uint64_t pkt_tag_key = 0; + uint64_t pkt_tag_val = 0; + packet_tag_get(pkt, &pkt_tag_key, &pkt_tag_val); + + if (!(pkt_tag_key & PKT_TAG_KEY_SESS)) + { + assert(0); + return; + } + + if (pkt_tag_val & PKT_TAG_VAL_SESS_FREE) + { + session_debugger_on_session_free(dbg, sess); + return; + } + + if (pkt_tag_val & PKT_TAG_VAL_SESS_NEW) + { + session_debugger_on_session_new(dbg, sess); + } + + struct session_debugger_exdata *exdata = (struct session_debugger_exdata *)session_get_exdata(sess, dbg->sess_exdata_idx); + enum flow_type flow = session_get_flow_type(sess); + assert(flow == FLOW_TYPE_C2S || flow == FLOW_TYPE_S2C); + + int is_pseudo = (packet_get_type(pkt) == PACKET_TYPE_PSEUDO); + if (flow == FLOW_TYPE_C2S) + { + if (is_pseudo) + { + exdata->c2s_rx_ctrl_pkts++; + exdata->c2s_rx_ctrl_bytes += packet_get_raw_len(pkt); + } + else + { + exdata->c2s_rx_data_pkts++; + exdata->c2s_rx_data_bytes += packet_get_raw_len(pkt); + } + } + else + { + if (is_pseudo) + { + exdata->s2c_rx_ctrl_pkts++; + exdata->s2c_rx_ctrl_bytes += packet_get_raw_len(pkt); + } + else + { + exdata->s2c_rx_data_pkts++; + exdata->s2c_rx_data_bytes += packet_get_raw_len(pkt); + } + } + + char buff[PATH_MAX]; + memset(buff, 0, sizeof(buff)); + session_to_str(sess, 1, buff, sizeof(buff) - 1); + session_debugger_log(dbg->fd, "on %s %s packet: %s", session_type_to_str(session_get_type(sess)), (is_pseudo ? "pseudo" : "data"), buff); + + memset(buff, 0, sizeof(buff)); + packet_dump_str(pkt, buff, sizeof(buff) - 1); + session_debugger_log(dbg->fd, "rx %s %s packet\n%s", session_type_to_str(session_get_type(sess)), (is_pseudo ? "pseudo" : "data"), buff); + + pthread_spin_lock(&dbg->lock); + packet_dump_hex(pkt, dbg->fd); + pthread_spin_unlock(&dbg->lock); + + if (session_get_type(sess) == SESSION_TYPE_TCP) + { + struct tcp_segment *seg = packet_exdata_to_tcp_segment(sess_mgr, pkt); + while (seg) + { + session_debugger_on_tcp_payload(dbg, sess, seg->data, seg->len); + seg = seg->next; + } + } + else + { + session_debugger_on_udp_payload(dbg, sess, pkt); + } +} + static void session_debugger_free(struct session_debugger *dbg) { if (dbg) @@ -386,39 +402,13 @@ static struct session_debugger *session_debugger_new(struct session_manager *ses goto error_out; } - dbg->sess_exdata_idx = session_manager_new_session_exdata_index(dbg->sess_mgr, "session_debugger_exdata", session_debugger_exdata_free_callback, dbg); + dbg->sess_exdata_idx = session_manager_new_session_exdata_index(dbg->sess_mgr, "session_debugger_exdata", session_debugger_exdata_free_cb, dbg); if (dbg->sess_exdata_idx == -1) { session_debugger_log(STDERR_FILENO, "new session exdata index failed\n"); goto error_out; } - if (session_manager_subscribe_tcp(sess_mgr, on_session_message, dbg) == -1) - { - session_debugger_log(STDERR_FILENO, "subscribe tcp failed\n"); - goto error_out; - } - if (session_manager_subscribe_udp(sess_mgr, on_session_message, dbg) == -1) - { - session_debugger_log(STDERR_FILENO, "subscribe udp failed\n"); - goto error_out; - } - if (session_manager_subscribe_control_packet(sess_mgr, on_session_message, dbg) == -1) - { - session_debugger_log(STDERR_FILENO, "subscribe control packet failed\n"); - goto error_out; - } - if (session_manager_subscribe_tcp_stream(sess_mgr, on_tcp_payload_message, dbg) == -1) - { - session_debugger_log(STDERR_FILENO, "subscribe tcp stream failed\n"); - goto error_out; - } - if (session_manager_subscribe_udp(sess_mgr, on_udp_payload_message, dbg) == -1) - { - session_debugger_log(STDERR_FILENO, "subscribe udp failed\n"); - goto error_out; - } - return dbg; error_out: @@ -432,12 +422,22 @@ error_out: struct module *session_debugger_on_init(struct module_manager *mod_mgr) { - assert(mod_mgr); - struct module *sess_mgr_mod = module_manager_get_module(mod_mgr, SESSION_MANAGER_MODULE_NAME); - struct session_manager *sess_mgr = module_to_session_manager(sess_mgr_mod); + struct session_manager *sess_mgr = module_to_session_manager(module_manager_get_module(mod_mgr, SESSION_MANAGER_MODULE_NAME)); assert(sess_mgr); struct logger *logger = module_manager_get_logger(mod_mgr); assert(logger); + const char *toml = module_manager_get_toml_path(mod_mgr); + assert(toml); + + uint64_t enable = 0; + if (load_toml_integer_config(toml, "session_debugger.enable", &enable, 0, 1) != 0) + { + return NULL; + } + if (enable == 0) + { + return NULL; + } struct session_debugger *dbg = session_debugger_new(sess_mgr, logger); if (dbg == NULL) @@ -445,13 +445,12 @@ struct module *session_debugger_on_init(struct module_manager *mod_mgr) return NULL; } - struct module *dbg_mod = module_new("session_debugger", NULL); + struct module *dbg_mod = module_new(SESSION_DEBUGGER_MODULE_NAME, dbg); if (dbg_mod == NULL) { session_debugger_free(dbg); return NULL; } - module_set_ctx(dbg_mod, dbg); STELLAR_LOG_FATAL(dbg->logger, "session debugger", "session_debugger init") diff --git a/infra/session_manager/session_manager.c b/infra/session_manager/session_manager.c index bd9184e..3889811 100644 --- a/infra/session_manager/session_manager.c +++ b/infra/session_manager/session_manager.c @@ -81,6 +81,7 @@ static void notify_sess_closed_by_pseudo_pkt(struct session_manager *sess_mgr, i packet_tag_set(pseudo, PKT_TAG_KEY_SESS, PKT_TAG_VAL_SESS_FREE); packet_set_type(pseudo, PACKET_TYPE_PSEUDO); packet_set_action(pseudo, PACKET_ACTION_DROP); + packet_set_exdata(pseudo, sess_mgr->pkt_ex_to_get_sess, sess); packet_set_exdata(pseudo, sess_mgr->pkt_ex_to_free_sess, sess); packet_manager_schedule_packet(pkt_mgr, thread_id, pseudo, PACKET_STAGE_FORWARD); SESSION_MANAGER_LOG_INFO("notify session %lu %s closed by pseudo packet: %p", session_get_id(sess), session_get_readable_addr(sess), pseudo); @@ -145,29 +146,13 @@ void session_manager_on_packet_forward(struct packet *pkt, struct module *mod) * Note: Modifying the system time will affect the timing wheel, impacting session expiration, and TCP reassembly expiration. * Suggestion: After modifying the system time, restart the service to ensure consistent timing. */ - uint64_t now_ms = clock_get_real_time_ms(); - + uint64_t now_ms = 0; struct tuple6 key; - struct session *sess = session_manager_rte_lookup_session_by_packet(sess_mgr_rte, pkt); - if (sess == NULL) + struct session *sess = NULL; + if (packet_get_type(pkt) == PACKET_TYPE_PSEUDO) { - if (packet_get_type(pkt) == PACKET_TYPE_RAW) - { - sess = session_manager_rte_new_session(sess_mgr_rte, pkt, now_ms); - if (sess) - { - session_set_user_data(sess, exdata_runtime_new(sess_mgr->ex_sche)); - packet_tag_set(pkt, PKT_TAG_KEY_SESS, PKT_TAG_VAL_SESS_NEW); - } - } - else - { - // TODO new session by pseudo packet - } - } - else - { - if (packet_get_type(pkt) == PACKET_TYPE_PSEUDO) + sess = packet_exdata_to_session(sess_mgr, pkt); + if (sess || (sess = session_manager_rte_lookup_session_by_packet(sess_mgr_rte, pkt))) { session_set_current_packet(sess, pkt); packet_get_innermost_tuple6(pkt, &key); @@ -183,16 +168,34 @@ void session_manager_on_packet_forward(struct packet *pkt, struct module *mod) sess->stats[FLOW_TYPE_S2C][STAT_PSEUDO_PACKETS_RECEIVED]++; sess->stats[FLOW_TYPE_S2C][STAT_PSEUDO_BYTES_RECEIVED] += packet_get_raw_len(pkt); } - packet_tag_set(pkt, PKT_TAG_KEY_SESS, PKT_TAG_VAL_SESS_CTRL_MSG); + packet_tag_set(pkt, PKT_TAG_KEY_SESS, PKT_TAG_VAL_SESS_PSEUDOPKT); + packet_set_exdata(pkt, sess_mgr->pkt_ex_to_get_sess, sess); } else { - session_manager_rte_update_session(sess_mgr_rte, sess, pkt, now_ms); - packet_tag_set(pkt, PKT_TAG_KEY_SESS, 0); + // TODO new session by pseudo packet + } + } + else + { + now_ms = clock_get_real_time_ms(); + sess = session_manager_rte_lookup_session_by_packet(sess_mgr_rte, pkt); + if (sess || (sess = session_manager_rte_new_session(sess_mgr_rte, pkt, now_ms))) + { + if (session_get_user_data(sess) == NULL) + { + session_set_user_data(sess, exdata_runtime_new(sess_mgr->ex_sche)); + packet_tag_set(pkt, PKT_TAG_KEY_SESS, PKT_TAG_VAL_SESS_NEW); + } + session_manager_rte_update_session(sess_mgr_rte, sess, pkt, now_ms); + packet_tag_set(pkt, PKT_TAG_KEY_SESS, PKT_TAG_VAL_SESS_RAWPKT); + packet_set_exdata(pkt, sess_mgr->pkt_ex_to_get_sess, sess); + } + else + { + // miss sess } } - - packet_set_exdata(pkt, sess_mgr->pkt_ex_to_get_sess, sess); if (sess && session_get_type(sess) == SESSION_TYPE_TCP) { diff --git a/infra/stellar_core.c b/infra/stellar_core.c index e6189e7..306d8ab 100644 --- a/infra/stellar_core.c +++ b/infra/stellar_core.c @@ -132,13 +132,13 @@ static void stellar_thread_join(struct stellar *st) #include "stellar/lpi_plus.h" struct module_hooks mod_hooks[] = { - {monitor_on_init, monitor_on_exit, NULL, NULL}, - {packet_manager_on_init, packet_manager_on_exit, packet_manager_on_thread_init, packet_manager_on_thread_exit}, - {session_manager_on_init, session_manager_on_exit, session_manager_on_thread_init, session_manager_on_thread_exit}, - {session_monitor_on_init, session_monitor_on_exit, NULL, NULL}, - {lpi_plus_init, lpi_plus_exit, NULL, NULL}, - }; - + {monitor_on_init, monitor_on_exit, NULL, NULL}, + {packet_manager_on_init, packet_manager_on_exit, packet_manager_on_thread_init, packet_manager_on_thread_exit}, + {session_manager_on_init, session_manager_on_exit, session_manager_on_thread_init, session_manager_on_thread_exit}, + {session_debugger_on_init, session_debugger_on_exit, NULL, NULL}, + {session_monitor_on_init, session_monitor_on_exit, NULL, NULL}, + {lpi_plus_init, lpi_plus_exit, NULL, NULL}, +}; struct packet_node_spec { @@ -150,36 +150,38 @@ struct packet_node_spec on_packet_callback *cb; }; - struct packet_node_spec packet_nodes[] = { - {SESSION_MANAGER_MODULE_NAME, "session_manager",PACKET_STAGE_FORWARD, PKT_TAG_KEY_IPPROTO, PKT_TAG_VAL_IPPROTO_TCP | PKT_TAG_VAL_IPPROTO_UDP, session_manager_on_packet_forward}, - {SESSION_MANAGER_MODULE_NAME, "session_manager",PACKET_STAGE_OUTPUT, PKT_TAG_KEY_IPPROTO, PKT_TAG_VAL_IPPROTO_TCP | PKT_TAG_VAL_IPPROTO_UDP, session_manager_on_packet_output}, - {LPI_PLUS_MODULE_NAME, "lpi_plus",PACKET_STAGE_FORWARD, PKT_TAG_KEY_IPPROTO, PKT_TAG_VAL_IPPROTO_TCP | PKT_TAG_VAL_IPPROTO_UDP, lpi_plus_on_packet}, + // PACKET_STAGE_FORWARD + {SESSION_MANAGER_MODULE_NAME, "session_manager", PACKET_STAGE_FORWARD, PKT_TAG_KEY_IPPROTO, PKT_TAG_VAL_IPPROTO_TCP | PKT_TAG_VAL_IPPROTO_UDP, session_manager_on_packet_forward}, + {SESSION_DEBUGGER_MODULE_NAME, "session_debugger", PACKET_STAGE_FORWARD, PKT_TAG_KEY_SESS, PKT_TAG_VAL_SESS_ALL, session_debugger_on_packet_forward}, + {LPI_PLUS_MODULE_NAME, "lpi_plus", PACKET_STAGE_FORWARD, PKT_TAG_KEY_IPPROTO, PKT_TAG_VAL_IPPROTO_TCP | PKT_TAG_VAL_IPPROTO_UDP, lpi_plus_on_packet}, + // PACKET_STAGE_OUTPUT + {SESSION_MANAGER_MODULE_NAME, "session_manager", PACKET_STAGE_OUTPUT, PKT_TAG_KEY_IPPROTO, PKT_TAG_VAL_IPPROTO_TCP | PKT_TAG_VAL_IPPROTO_UDP, session_manager_on_packet_output}, }; static int register_packet_node_for_module(struct module_manager *mod_mgr, struct packet_node_spec *specs, size_t n_specs) { struct module *pkt_mgr_mod = module_manager_get_module(mod_mgr, PACKET_MANAGER_MODULE_NAME); - struct packet_manager *pkt_mgr = module_to_packet_manager(pkt_mgr_mod); + struct packet_manager *pkt_mgr = module_to_packet_manager(pkt_mgr_mod); struct module *mod = NULL; - for(size_t i=0; i < n_specs; i++) + for (size_t i = 0; i < n_specs; i++) { - mod= module_manager_get_module(mod_mgr, specs[i].module_name); - if(mod == NULL) + mod = module_manager_get_module(mod_mgr, specs[i].module_name); + if (mod == NULL) { CORE_LOG_FATAL("%s unable to get module %s", __FUNCTION__, specs[i].module_name); continue; } - if(packet_manager_register_node(pkt_mgr, - specs[i].node_name, - specs[i].stage, - specs[i].interested_tag_key_bits, - specs[i].interested_tag_val_bits, - specs[i].cb, - mod)<0) + if (packet_manager_register_node(pkt_mgr, + specs[i].node_name, + specs[i].stage, + specs[i].interested_tag_key_bits, + specs[i].interested_tag_val_bits, + specs[i].cb, + mod) < 0) { CORE_LOG_FATAL("%s failed to register node:%s for module:%s in stage:%d", __FUNCTION__, specs[i].node_name, specs[i].module_name, specs[i].stage); } @@ -221,7 +223,7 @@ struct stellar *stellar_new(const char *toml_file) goto error_out; } - st->mod_mgr = module_manager_new(mod_hooks, count_of(mod_hooks),st->thread_num, toml_file, st->logger); + st->mod_mgr = module_manager_new(mod_hooks, count_of(mod_hooks), st->thread_num, toml_file, st->logger); if (st->mod_mgr == NULL) { CORE_LOG_ERROR("unable to create packet manager"); diff --git a/infra/version.map b/infra/version.map index 4cbe785..2f9cee1 100644 --- a/infra/version.map +++ b/infra/version.map @@ -61,6 +61,9 @@ global: packet_exdata_to_session; packet_exdata_to_tcp_segment; + session_debugger_on_init; + session_debugger_on_exit; + session_monitor_on_init; session_monitor_on_exit; diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index cc3398a..4f7fcac 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,7 +1,7 @@ #add_subdirectory(packet_inject) add_subdirectory(packet_tool) -#add_subdirectory(session_debugger) add_subdirectory(lpi_plus) +#add_subdirectory(lpi_plus) #add_subdirectory(decoders/http) #add_subdirectory(decoders/socks) #add_subdirectory(decoders/stratum) diff --git a/test/session_debugger/CMakeLists.txt b/test/session_debugger/CMakeLists.txt deleted file mode 100644 index a8e6e79..0000000 --- a/test/session_debugger/CMakeLists.txt +++ /dev/null @@ -1,8 +0,0 @@ -# build libsession_debugger.so -add_library(session_debugger SHARED session_debugger.c) -target_link_libraries(session_debugger stellar_lib session_manager packet_manager) -target_include_directories(session_debugger PUBLIC ${CMAKE_SOURCE_DIR}/include/) -target_include_directories(session_debugger PUBLIC ${CMAKE_SOURCE_DIR}/infra) -set_target_properties(session_debugger PROPERTIES LINK_FLAGS "-Wl,--version-script=${CMAKE_CURRENT_LIST_DIR}/version.map") - -file(COPY spec.toml DESTINATION ./) \ No newline at end of file diff --git a/test/session_debugger/spec.toml b/test/session_debugger/spec.toml deleted file mode 100644 index 19a4a9b..0000000 --- a/test/session_debugger/spec.toml +++ /dev/null @@ -1,4 +0,0 @@ -[[module]] -path = "./module/libsession_debugger.so" -init = "session_debugger_on_init" -exit = "session_debugger_on_exit" diff --git a/test/session_debugger/version.map b/test/session_debugger/version.map deleted file mode 100644 index 66edc94..0000000 --- a/test/session_debugger/version.map +++ /dev/null @@ -1,7 +0,0 @@ -LIBSESSION_DEBUGGER { -global: - session_debugger_on_init; - session_debugger_on_exit; - -local: *; -}; \ No newline at end of file