diff --git a/include/stellar/packet.h b/include/stellar/packet.h index 9e58454..8e9cf54 100644 --- a/include/stellar/packet.h +++ b/include/stellar/packet.h @@ -176,6 +176,14 @@ enum packet_action PACKET_ACTION_DROP = 1, }; +enum packet_type +{ + PACKET_TYPE_RAW = 0, + PACKET_TYPE_PSEUDO = 1, +}; + +enum packet_type packet_get_type(const struct packet *pkt); + void packet_set_action(struct packet *pkt, enum packet_action action); enum packet_action packet_get_action(const struct packet *pkt); diff --git a/include/stellar/session.h b/include/stellar/session.h index 40c339a..68a69c1 100644 --- a/include/stellar/session.h +++ b/include/stellar/session.h @@ -71,15 +71,15 @@ enum session_stat STAT_INJECTED_PACKETS_SUCCESS, STAT_INJECTED_BYTES_SUCCESS, - // control packet - STAT_CONTROL_PACKETS_RECEIVED, - STAT_CONTROL_BYTES_RECEIVED, + // pseudo packet + STAT_PSEUDO_PACKETS_RECEIVED, + STAT_PSEUDO_BYTES_RECEIVED, - STAT_CONTROL_PACKETS_TRANSMITTED, - STAT_CONTROL_BYTES_TRANSMITTED, + STAT_PSEUDO_PACKETS_TRANSMITTED, + STAT_PSEUDO_BYTES_TRANSMITTED, - STAT_CONTROL_PACKETS_DROPPED, - STAT_CONTROL_BYTES_DROPPED, + STAT_PSEUDO_PACKETS_DROPPED, + STAT_PSEUDO_BYTES_DROPPED, // TCP segment STAT_TCP_SEGMENTS_RECEIVED, diff --git a/infra/packet_io/mars_io.c b/infra/packet_io/mars_io.c index 0dcec91..19fd450 100644 --- a/infra/packet_io/mars_io.c +++ b/infra/packet_io/mars_io.c @@ -147,7 +147,14 @@ static void copy_metadata_to_packet(marsio_buff_t *mbuff, struct packet *pkt) PACKET_IO_LOG_ERROR("failed to get link id"); } - packet_set_ctrl(pkt, marsio_buff_is_ctrlbuf(mbuff)); + if (marsio_buff_is_ctrlbuf(mbuff)) + { + packet_set_type(pkt, PACKET_TYPE_PSEUDO); + } + else + { + packet_set_type(pkt, PACKET_TYPE_RAW); + } enum packet_direction direction = PACKET_DIRECTION_OUTGOING; if (marsio_buff_get_metadata(mbuff, MR_BUFF_DIR, &direction, sizeof(direction)) == sizeof(direction)) @@ -201,7 +208,7 @@ static void copy_metadata_to_mbuff(struct packet *pkt, marsio_buff_t *mbuff) PACKET_IO_LOG_ERROR("failed to set link id"); } - if (packet_is_ctrl(pkt)) + if (packet_get_type(pkt) == PACKET_TYPE_PSEUDO) { marsio_buff_set_ctrlbuf(mbuff); } diff --git a/infra/packet_io/pcap_io.c b/infra/packet_io/pcap_io.c index 8d7090f..555b59a 100644 --- a/infra/packet_io/pcap_io.c +++ b/infra/packet_io/pcap_io.c @@ -488,6 +488,7 @@ int pcap_io_recv(void *handle, uint16_t thr_idx, struct packet *pkts[], int nr_p packet_parse(pkt, pcap->data, pcap->len); memset(&pkt->meta, 0, sizeof(pkt->meta)); packet_set_action(pkt, PACKET_ACTION_FORWARD); + packet_set_type(pkt, PACKET_TYPE_RAW); packet_set_timeval(pkt, &pcap->ts); packet_set_origin(pkt, &origin); diff --git a/infra/packet_manager/packet_internal.h b/infra/packet_manager/packet_internal.h index d9b3fe9..d5903dc 100644 --- a/infra/packet_manager/packet_internal.h +++ b/infra/packet_manager/packet_internal.h @@ -28,7 +28,6 @@ struct metadata uint64_t session_id; uint64_t domain; uint16_t link_id; - bool is_ctrl; bool is_claim; enum packet_direction direction; @@ -90,6 +89,7 @@ struct packet struct packet_queue frag_list; // for defraged packet struct metadata meta; + enum packet_type type; struct packet_origin origin; }; @@ -124,12 +124,10 @@ uint64_t packet_get_domain(const struct packet *pkt); void packet_set_link_id(struct packet *pkt, uint16_t id); uint16_t packet_get_link_id(const struct packet *pkt); -void packet_set_ctrl(struct packet *pkt, bool ctrl); -bool packet_is_ctrl(const struct packet *pkt); - void packet_set_claim(struct packet *pkt, bool claim); bool packet_is_claim(const struct packet *pkt); +void packet_set_type(struct packet *pkt, enum packet_type type); void packet_set_direction(struct packet *pkt, enum packet_direction dir); void *packet_get_user_data(struct packet *pkt); diff --git a/infra/packet_manager/packet_utils.c b/infra/packet_manager/packet_utils.c index b853658..5e5e4fe 100644 --- a/infra/packet_manager/packet_utils.c +++ b/infra/packet_manager/packet_utils.c @@ -95,16 +95,6 @@ uint16_t packet_get_link_id(const struct packet *pkt) return pkt->meta.link_id; } -void packet_set_ctrl(struct packet *pkt, bool ctrl) -{ - pkt->meta.is_ctrl = ctrl; -} - -bool packet_is_ctrl(const struct packet *pkt) -{ - return pkt->meta.is_ctrl; -} - void packet_set_claim(struct packet *pkt, bool claim) { pkt->meta.is_claim = claim; @@ -125,6 +115,16 @@ enum packet_direction packet_get_direction(const struct packet *pkt) return pkt->meta.direction; } +enum packet_type packet_get_type(const struct packet *pkt) +{ + return pkt->type; +} + +void packet_set_type(struct packet *pkt, enum packet_type type) +{ + pkt->type = type; +} + void packet_set_action(struct packet *pkt, enum packet_action action) { pkt->meta.action = action; diff --git a/infra/packet_manager/test/gtest_packet_manager.cpp b/infra/packet_manager/test/gtest_packet_manager.cpp index 30abcdb..1f982e1 100644 --- a/infra/packet_manager/test/gtest_packet_manager.cpp +++ b/infra/packet_manager/test/gtest_packet_manager.cpp @@ -105,7 +105,7 @@ static void on_packet_stage(struct packet *pkt, enum packet_stage stage, void *a static int count = 0; EXPECT_TRUE(count == stage); - EXPECT_TRUE(packet_is_ctrl(pkt)); + EXPECT_TRUE(packet_get_type(pkt) == PACKET_TYPE_PSEUDO); EXPECT_TRUE(args == NULL); count++; } @@ -134,7 +134,7 @@ TEST(PACKET_MANAGER, SUBSCRIBER_PACKET_STAGE) struct packet pkt; memset(&pkt, 0, sizeof(pkt)); packet_parse(&pkt, (const char *)data, sizeof(data)); - packet_set_ctrl(&pkt, true); + packet_set_type(&pkt, PACKET_TYPE_PSEUDO); struct packet_manager_stat *curr_stat = packet_manager_get_stat(pkt_mgr, thread_id); check_stat(curr_stat, &init_stat); @@ -174,7 +174,7 @@ static void packet_claimed(struct packet *pkt, void *args) char *str = (char *)args; EXPECT_STREQ(str, "hello"); printf("packet_claimed: with ctx %s\n", str); - EXPECT_TRUE(packet_is_ctrl(pkt)); + EXPECT_TRUE(packet_get_type(pkt) == PACKET_TYPE_PSEUDO); EXPECT_TRUE(packet_is_claim(pkt)); free(str); } @@ -188,7 +188,7 @@ static void claim_packet_success(struct packet *pkt, enum packet_stage stage, vo static int count = 0; EXPECT_TRUE(count == 0); EXPECT_TRUE(stage == PACKET_STAGE_PREROUTING); - EXPECT_TRUE(packet_is_ctrl(pkt)); + EXPECT_TRUE(packet_get_type(pkt) == PACKET_TYPE_PSEUDO); EXPECT_TRUE(!packet_is_claim(pkt)); // packet not claim EXPECT_TRUE(packet_manager_claim_packet(pkt_mgr, thread_id, pkt, packet_claimed, strdup("hello")) == 0); // claim packet success count++; @@ -203,7 +203,7 @@ static void claim_packet_failed(struct packet *pkt, enum packet_stage stage, voi static int count = 0; EXPECT_TRUE(count == 0); EXPECT_TRUE(stage == PACKET_STAGE_PREROUTING); - EXPECT_TRUE(packet_is_ctrl(pkt)); + EXPECT_TRUE(packet_get_type(pkt) == PACKET_TYPE_PSEUDO); EXPECT_TRUE(packet_is_claim(pkt)); // packet already claim EXPECT_TRUE(packet_manager_claim_packet(pkt_mgr, thread_id, pkt, NULL, NULL) == -1); // claim packet failed count++; @@ -239,7 +239,7 @@ TEST(PACKET_MANAGER, CLAIM_PACKET) struct packet pkt; memset(&pkt, 0, sizeof(pkt)); packet_parse(&pkt, (const char *)data, sizeof(data)); - packet_set_ctrl(&pkt, true); + packet_set_type(&pkt, PACKET_TYPE_PSEUDO); struct packet_manager_stat *curr_stat = packet_manager_get_stat(pkt_mgr, thread_id); check_stat(curr_stat, &init_stat); @@ -314,7 +314,7 @@ TEST(PACKET_MANAGER, SCHEDULE_PACKET) struct packet pkt; memset(&pkt, 0, sizeof(pkt)); packet_parse(&pkt, (const char *)data, sizeof(data)); - packet_set_ctrl(&pkt, true); + packet_set_type(&pkt, PACKET_TYPE_PSEUDO); struct packet_manager_stat *curr_stat = packet_manager_get_stat(pkt_mgr, thread_id); check_stat(curr_stat, &init_stat); @@ -362,7 +362,7 @@ static void schedule_claimed_packet(struct packet *pkt, void *args) struct packet_manager *pkt_mgr = (struct packet_manager *)args; printf("schedule_claimed_packet: %p\n", pkt); - EXPECT_TRUE(packet_is_ctrl(pkt)); + EXPECT_TRUE(packet_get_type(pkt) == PACKET_TYPE_PSEUDO); EXPECT_TRUE(packet_is_claim(pkt)); packet_manager_schedule_packet(pkt_mgr, thread_id, pkt, PACKET_STAGE_POSTROUTING); @@ -375,7 +375,7 @@ static void on_packet_stage_claim_packet_to_schedule(struct packet *pkt, enum pa printf("on_packet_stage_claim_packet_to_schedule: %s\n", packet_stage_to_str(stage)); static int count = 0; - EXPECT_TRUE(packet_is_ctrl(pkt)); + EXPECT_TRUE(packet_get_type(pkt) == PACKET_TYPE_PSEUDO); EXPECT_TRUE(!packet_is_claim(pkt)); if (stage == PACKET_STAGE_PREROUTING) { @@ -418,7 +418,7 @@ TEST(PACKET_MANAGER, SCHEDULE_CLAIMED_PACKET) struct packet pkt; memset(&pkt, 0, sizeof(pkt)); packet_parse(&pkt, (const char *)data, sizeof(data)); - packet_set_ctrl(&pkt, true); + packet_set_type(&pkt, PACKET_TYPE_PSEUDO); struct packet_manager_stat *curr_stat = packet_manager_get_stat(pkt_mgr, thread_id); check_stat(curr_stat, &init_stat); diff --git a/infra/session_manager/session_manager.c b/infra/session_manager/session_manager.c index 89496c9..4358a4d 100644 --- a/infra/session_manager/session_manager.c +++ b/infra/session_manager/session_manager.c @@ -136,7 +136,7 @@ static void on_packet_forward(struct packet *pkt, enum packet_stage stage, void struct session *sess = session_manager_rte_lookup_session_by_packet(sess_mgr_rte, pkt); if (sess == NULL) { - if (packet_is_ctrl(pkt)) + if (packet_get_type(pkt) == PACKET_TYPE_PSEUDO) { goto fast_path; } @@ -154,7 +154,7 @@ static void on_packet_forward(struct packet *pkt, enum packet_stage stage, void } else { - if (packet_is_ctrl(pkt)) + if (packet_get_type(pkt) == PACKET_TYPE_PSEUDO) { goto ctrl_path; } @@ -226,17 +226,17 @@ static void on_packet_output(struct packet *pkt, enum packet_stage stage, void * flow = FLOW_TYPE_S2C; } - int is_ctrl = packet_is_ctrl(pkt); + int is_pseudo = (packet_get_type(pkt) == PACKET_TYPE_PSEUDO); uint16_t len = packet_get_raw_len(pkt); switch (packet_get_action(pkt)) { case PACKET_ACTION_DROP: - 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); + session_inc_stat(sess, flow, (is_pseudo ? STAT_PSEUDO_PACKETS_DROPPED : STAT_RAW_PACKETS_DROPPED), 1); + session_inc_stat(sess, flow, (is_pseudo ? STAT_PSEUDO_BYTES_DROPPED : STAT_RAW_BYTES_DROPPED), len); break; case PACKET_ACTION_FORWARD: - 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); + session_inc_stat(sess, flow, (is_pseudo ? STAT_PSEUDO_PACKETS_TRANSMITTED : STAT_RAW_PACKETS_TRANSMITTED), 1); + session_inc_stat(sess, flow, (is_pseudo ? STAT_PSEUDO_BYTES_TRANSMITTED : STAT_RAW_BYTES_TRANSMITTED), len); break; default: assert(0); diff --git a/infra/session_manager/session_utils.c b/infra/session_manager/session_utils.c index c4b60fe..fae6e77 100644 --- a/infra/session_manager/session_utils.c +++ b/infra/session_manager/session_utils.c @@ -412,14 +412,14 @@ int session_to_str(const struct session *sess, int bref, char *buff, int size) used += snprintf(buff + used, size - used, "\"%s_injected_bytes_success\":%" PRIu64 ",", str[i], session_get_stat(sess, type[i], STAT_INJECTED_BYTES_SUCCESS)); // control packets - used += snprintf(buff + used, size - used, "\"%s_control_packets_received\":%" PRIu64 ",", str[i], session_get_stat(sess, type[i], STAT_CONTROL_PACKETS_RECEIVED)); - used += snprintf(buff + used, size - used, "\"%s_control_bytes_received\":%" PRIu64 ",", str[i], session_get_stat(sess, type[i], STAT_CONTROL_BYTES_RECEIVED)); + used += snprintf(buff + used, size - used, "\"%s_pseudo_packets_received\":%" PRIu64 ",", str[i], session_get_stat(sess, type[i], STAT_PSEUDO_PACKETS_RECEIVED)); + used += snprintf(buff + used, size - used, "\"%s_pseudo_bytes_received\":%" PRIu64 ",", str[i], session_get_stat(sess, type[i], STAT_PSEUDO_BYTES_RECEIVED)); - used += snprintf(buff + used, size - used, "\"%s_control_packets_transmitted\":%" PRIu64 ",", str[i], session_get_stat(sess, type[i], STAT_CONTROL_PACKETS_TRANSMITTED)); - used += snprintf(buff + used, size - used, "\"%s_control_bytes_transmitted\":%" PRIu64 ",", str[i], session_get_stat(sess, type[i], STAT_CONTROL_BYTES_TRANSMITTED)); + used += snprintf(buff + used, size - used, "\"%s_pseudo_packets_transmitted\":%" PRIu64 ",", str[i], session_get_stat(sess, type[i], STAT_PSEUDO_PACKETS_TRANSMITTED)); + used += snprintf(buff + used, size - used, "\"%s_pseudo_bytes_transmitted\":%" PRIu64 ",", str[i], session_get_stat(sess, type[i], STAT_PSEUDO_BYTES_TRANSMITTED)); - used += snprintf(buff + used, size - used, "\"%s_control_packets_dropped\":%" PRIu64 ",", str[i], session_get_stat(sess, type[i], STAT_CONTROL_PACKETS_DROPPED)); - used += snprintf(buff + used, size - used, "\"%s_control_bytes_dropped\":%" PRIu64 ",", str[i], session_get_stat(sess, type[i], STAT_CONTROL_BYTES_DROPPED)); + used += snprintf(buff + used, size - used, "\"%s_pseudo_packets_dropped\":%" PRIu64 ",", str[i], session_get_stat(sess, type[i], STAT_PSEUDO_PACKETS_DROPPED)); + used += snprintf(buff + used, size - used, "\"%s_pseudo_bytes_dropped\":%" PRIu64 ",", str[i], session_get_stat(sess, type[i], STAT_PSEUDO_BYTES_DROPPED)); if (session_get_type(sess) == SESSION_TYPE_TCP) { diff --git a/test/session_debugger/session_debugger.c b/test/session_debugger/session_debugger.c index e3a151e..5121a03 100644 --- a/test/session_debugger/session_debugger.c +++ b/test/session_debugger/session_debugger.c @@ -212,8 +212,7 @@ static void on_session_message(struct session *sess, enum session_state state, s return; } - int is_ctrl = packet_is_ctrl(pkt); - + 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); @@ -226,7 +225,7 @@ static void on_session_message(struct session *sess, enum session_state state, s if (flow == FLOW_TYPE_C2S) { - if (is_ctrl) + if (is_pseudo) { exdata->c2s_rx_ctrl_pkts++; exdata->c2s_rx_ctrl_bytes += packet_get_raw_len(pkt); @@ -239,7 +238,7 @@ static void on_session_message(struct session *sess, enum session_state state, s } else { - if (is_ctrl) + if (is_pseudo) { exdata->s2c_rx_ctrl_pkts++; exdata->s2c_rx_ctrl_bytes += packet_get_raw_len(pkt); @@ -253,11 +252,11 @@ static void on_session_message(struct session *sess, enum session_state state, s 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_ctrl ? "ctrl" : "data"), buff); + 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_ctrl ? "ctrl" : "data"), buff); + 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);