add packet type raw and pseudo

This commit is contained in:
luwenpeng
2024-11-13 14:43:38 +08:00
parent 8349a631e1
commit 492a7fb8ea
10 changed files with 65 additions and 52 deletions

View File

@@ -176,6 +176,14 @@ enum packet_action
PACKET_ACTION_DROP = 1, 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); void packet_set_action(struct packet *pkt, enum packet_action action);
enum packet_action packet_get_action(const struct packet *pkt); enum packet_action packet_get_action(const struct packet *pkt);

View File

@@ -71,15 +71,15 @@ enum session_stat
STAT_INJECTED_PACKETS_SUCCESS, STAT_INJECTED_PACKETS_SUCCESS,
STAT_INJECTED_BYTES_SUCCESS, STAT_INJECTED_BYTES_SUCCESS,
// control packet // pseudo packet
STAT_CONTROL_PACKETS_RECEIVED, STAT_PSEUDO_PACKETS_RECEIVED,
STAT_CONTROL_BYTES_RECEIVED, STAT_PSEUDO_BYTES_RECEIVED,
STAT_CONTROL_PACKETS_TRANSMITTED, STAT_PSEUDO_PACKETS_TRANSMITTED,
STAT_CONTROL_BYTES_TRANSMITTED, STAT_PSEUDO_BYTES_TRANSMITTED,
STAT_CONTROL_PACKETS_DROPPED, STAT_PSEUDO_PACKETS_DROPPED,
STAT_CONTROL_BYTES_DROPPED, STAT_PSEUDO_BYTES_DROPPED,
// TCP segment // TCP segment
STAT_TCP_SEGMENTS_RECEIVED, STAT_TCP_SEGMENTS_RECEIVED,

View File

@@ -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_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; enum packet_direction direction = PACKET_DIRECTION_OUTGOING;
if (marsio_buff_get_metadata(mbuff, MR_BUFF_DIR, &direction, sizeof(direction)) == sizeof(direction)) 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"); 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); marsio_buff_set_ctrlbuf(mbuff);
} }

View File

@@ -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); packet_parse(pkt, pcap->data, pcap->len);
memset(&pkt->meta, 0, sizeof(pkt->meta)); memset(&pkt->meta, 0, sizeof(pkt->meta));
packet_set_action(pkt, PACKET_ACTION_FORWARD); packet_set_action(pkt, PACKET_ACTION_FORWARD);
packet_set_type(pkt, PACKET_TYPE_RAW);
packet_set_timeval(pkt, &pcap->ts); packet_set_timeval(pkt, &pcap->ts);
packet_set_origin(pkt, &origin); packet_set_origin(pkt, &origin);

View File

@@ -28,7 +28,6 @@ struct metadata
uint64_t session_id; uint64_t session_id;
uint64_t domain; uint64_t domain;
uint16_t link_id; uint16_t link_id;
bool is_ctrl;
bool is_claim; bool is_claim;
enum packet_direction direction; enum packet_direction direction;
@@ -90,6 +89,7 @@ struct packet
struct packet_queue frag_list; // for defraged packet struct packet_queue frag_list; // for defraged packet
struct metadata meta; struct metadata meta;
enum packet_type type;
struct packet_origin origin; 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); void packet_set_link_id(struct packet *pkt, uint16_t id);
uint16_t packet_get_link_id(const struct packet *pkt); 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); void packet_set_claim(struct packet *pkt, bool claim);
bool packet_is_claim(const struct packet *pkt); 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_set_direction(struct packet *pkt, enum packet_direction dir);
void *packet_get_user_data(struct packet *pkt); void *packet_get_user_data(struct packet *pkt);

View File

@@ -95,16 +95,6 @@ uint16_t packet_get_link_id(const struct packet *pkt)
return pkt->meta.link_id; 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) void packet_set_claim(struct packet *pkt, bool claim)
{ {
pkt->meta.is_claim = claim; pkt->meta.is_claim = claim;
@@ -125,6 +115,16 @@ enum packet_direction packet_get_direction(const struct packet *pkt)
return pkt->meta.direction; 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) void packet_set_action(struct packet *pkt, enum packet_action action)
{ {
pkt->meta.action = action; pkt->meta.action = action;

View File

@@ -105,7 +105,7 @@ static void on_packet_stage(struct packet *pkt, enum packet_stage stage, void *a
static int count = 0; static int count = 0;
EXPECT_TRUE(count == stage); EXPECT_TRUE(count == stage);
EXPECT_TRUE(packet_is_ctrl(pkt)); EXPECT_TRUE(packet_get_type(pkt) == PACKET_TYPE_PSEUDO);
EXPECT_TRUE(args == NULL); EXPECT_TRUE(args == NULL);
count++; count++;
} }
@@ -134,7 +134,7 @@ TEST(PACKET_MANAGER, SUBSCRIBER_PACKET_STAGE)
struct packet pkt; struct packet pkt;
memset(&pkt, 0, sizeof(pkt)); memset(&pkt, 0, sizeof(pkt));
packet_parse(&pkt, (const char *)data, sizeof(data)); 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); struct packet_manager_stat *curr_stat = packet_manager_get_stat(pkt_mgr, thread_id);
check_stat(curr_stat, &init_stat); check_stat(curr_stat, &init_stat);
@@ -174,7 +174,7 @@ static void packet_claimed(struct packet *pkt, void *args)
char *str = (char *)args; char *str = (char *)args;
EXPECT_STREQ(str, "hello"); EXPECT_STREQ(str, "hello");
printf("packet_claimed: with ctx %s\n", str); 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)); EXPECT_TRUE(packet_is_claim(pkt));
free(str); free(str);
} }
@@ -188,7 +188,7 @@ static void claim_packet_success(struct packet *pkt, enum packet_stage stage, vo
static int count = 0; static int count = 0;
EXPECT_TRUE(count == 0); EXPECT_TRUE(count == 0);
EXPECT_TRUE(stage == PACKET_STAGE_PREROUTING); 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_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 EXPECT_TRUE(packet_manager_claim_packet(pkt_mgr, thread_id, pkt, packet_claimed, strdup("hello")) == 0); // claim packet success
count++; count++;
@@ -203,7 +203,7 @@ static void claim_packet_failed(struct packet *pkt, enum packet_stage stage, voi
static int count = 0; static int count = 0;
EXPECT_TRUE(count == 0); EXPECT_TRUE(count == 0);
EXPECT_TRUE(stage == PACKET_STAGE_PREROUTING); 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_is_claim(pkt)); // packet already claim
EXPECT_TRUE(packet_manager_claim_packet(pkt_mgr, thread_id, pkt, NULL, NULL) == -1); // claim packet failed EXPECT_TRUE(packet_manager_claim_packet(pkt_mgr, thread_id, pkt, NULL, NULL) == -1); // claim packet failed
count++; count++;
@@ -239,7 +239,7 @@ TEST(PACKET_MANAGER, CLAIM_PACKET)
struct packet pkt; struct packet pkt;
memset(&pkt, 0, sizeof(pkt)); memset(&pkt, 0, sizeof(pkt));
packet_parse(&pkt, (const char *)data, sizeof(data)); 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); struct packet_manager_stat *curr_stat = packet_manager_get_stat(pkt_mgr, thread_id);
check_stat(curr_stat, &init_stat); check_stat(curr_stat, &init_stat);
@@ -314,7 +314,7 @@ TEST(PACKET_MANAGER, SCHEDULE_PACKET)
struct packet pkt; struct packet pkt;
memset(&pkt, 0, sizeof(pkt)); memset(&pkt, 0, sizeof(pkt));
packet_parse(&pkt, (const char *)data, sizeof(data)); 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); struct packet_manager_stat *curr_stat = packet_manager_get_stat(pkt_mgr, thread_id);
check_stat(curr_stat, &init_stat); 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; struct packet_manager *pkt_mgr = (struct packet_manager *)args;
printf("schedule_claimed_packet: %p\n", pkt); 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)); EXPECT_TRUE(packet_is_claim(pkt));
packet_manager_schedule_packet(pkt_mgr, thread_id, pkt, PACKET_STAGE_POSTROUTING); 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)); printf("on_packet_stage_claim_packet_to_schedule: %s\n", packet_stage_to_str(stage));
static int count = 0; 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)); EXPECT_TRUE(!packet_is_claim(pkt));
if (stage == PACKET_STAGE_PREROUTING) if (stage == PACKET_STAGE_PREROUTING)
{ {
@@ -418,7 +418,7 @@ TEST(PACKET_MANAGER, SCHEDULE_CLAIMED_PACKET)
struct packet pkt; struct packet pkt;
memset(&pkt, 0, sizeof(pkt)); memset(&pkt, 0, sizeof(pkt));
packet_parse(&pkt, (const char *)data, sizeof(data)); 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); struct packet_manager_stat *curr_stat = packet_manager_get_stat(pkt_mgr, thread_id);
check_stat(curr_stat, &init_stat); check_stat(curr_stat, &init_stat);

View File

@@ -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); struct session *sess = session_manager_rte_lookup_session_by_packet(sess_mgr_rte, pkt);
if (sess == NULL) if (sess == NULL)
{ {
if (packet_is_ctrl(pkt)) if (packet_get_type(pkt) == PACKET_TYPE_PSEUDO)
{ {
goto fast_path; goto fast_path;
} }
@@ -154,7 +154,7 @@ static void on_packet_forward(struct packet *pkt, enum packet_stage stage, void
} }
else else
{ {
if (packet_is_ctrl(pkt)) if (packet_get_type(pkt) == PACKET_TYPE_PSEUDO)
{ {
goto ctrl_path; goto ctrl_path;
} }
@@ -226,17 +226,17 @@ static void on_packet_output(struct packet *pkt, enum packet_stage stage, void *
flow = FLOW_TYPE_S2C; 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); uint16_t len = packet_get_raw_len(pkt);
switch (packet_get_action(pkt)) switch (packet_get_action(pkt))
{ {
case PACKET_ACTION_DROP: 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_pseudo ? STAT_PSEUDO_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_BYTES_DROPPED : STAT_RAW_BYTES_DROPPED), len);
break; break;
case PACKET_ACTION_FORWARD: 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_pseudo ? STAT_PSEUDO_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_BYTES_TRANSMITTED : STAT_RAW_BYTES_TRANSMITTED), len);
break; break;
default: default:
assert(0); assert(0);

View File

@@ -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)); 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 // 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_pseudo_packets_received\":%" PRIu64 ",", str[i], session_get_stat(sess, type[i], STAT_PSEUDO_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_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_pseudo_packets_transmitted\":%" PRIu64 ",", str[i], session_get_stat(sess, type[i], STAT_PSEUDO_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_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_pseudo_packets_dropped\":%" PRIu64 ",", str[i], session_get_stat(sess, type[i], STAT_PSEUDO_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_bytes_dropped\":%" PRIu64 ",", str[i], session_get_stat(sess, type[i], STAT_PSEUDO_BYTES_DROPPED));
if (session_get_type(sess) == SESSION_TYPE_TCP) if (session_get_type(sess) == SESSION_TYPE_TCP)
{ {

View File

@@ -212,8 +212,7 @@ static void on_session_message(struct session *sess, enum session_state state, s
return; return;
} }
int is_ctrl = packet_is_ctrl(pkt); int is_pseudo = (packet_get_type(pkt) == PACKET_TYPE_PSEUDO);
char buff[PATH_MAX]; char buff[PATH_MAX];
enum flow_type flow = session_get_flow_type(sess); enum flow_type flow = session_get_flow_type(sess);
assert(flow == FLOW_TYPE_C2S || flow == FLOW_TYPE_S2C); 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 (flow == FLOW_TYPE_C2S)
{ {
if (is_ctrl) if (is_pseudo)
{ {
exdata->c2s_rx_ctrl_pkts++; exdata->c2s_rx_ctrl_pkts++;
exdata->c2s_rx_ctrl_bytes += packet_get_raw_len(pkt); 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 else
{ {
if (is_ctrl) if (is_pseudo)
{ {
exdata->s2c_rx_ctrl_pkts++; exdata->s2c_rx_ctrl_pkts++;
exdata->s2c_rx_ctrl_bytes += packet_get_raw_len(pkt); 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)); memset(buff, 0, sizeof(buff));
session_to_str(sess, 1, buff, sizeof(buff) - 1); 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)); memset(buff, 0, sizeof(buff));
packet_dump_str(pkt, buff, sizeof(buff) - 1); 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); pthread_spin_lock(&dbg->lock);
packet_dump_hex(pkt, dbg->fd); packet_dump_hex(pkt, dbg->fd);