If a packet is marked as dropped, the packet manager will destroy it and its exdata at the end of the current stage, preventing it from entering the next stage.

This commit is contained in:
luwenpeng
2024-11-21 11:39:34 +08:00
parent b76949b0e4
commit 601af3330d
6 changed files with 251 additions and 75 deletions

View File

@@ -353,6 +353,7 @@ void packet_manager_dispatch(struct packet_manager *pkt_mgr, uint16_t thread_id)
mq_runtime_publish_message(pkt_mgr_rte->mq_rte, pkt_mgr_rte->curr_stage, pkt);
mq_runtime_dispatch(pkt_mgr_rte->mq_rte);
// packet has been claimed and cannot be released
if (packet_is_claim(pkt))
{
if (pkt_mgr_rte->claim_cb)
@@ -365,6 +366,12 @@ void packet_manager_dispatch(struct packet_manager *pkt_mgr, uint16_t thread_id)
continue;
}
if (packet_get_action(pkt) == PACKET_ACTION_DROP)
{
packet_manager_free_packet(pkt_mgr, thread_id, pkt);
continue;
}
TAILQ_INSERT_TAIL(&pkt_mgr_rte->queue[pkt_mgr_rte->curr_stage + 1], pkt, stage_tqe);
pkt_mgr_rte->stat.queue[pkt_mgr_rte->curr_stage + 1].pkts_in++;
}
@@ -424,24 +431,43 @@ void packet_manager_print_stat(struct packet_manager *pkt_mgr, uint16_t thread_i
pkt_mgr_rte->stat.pkts_egress);
for (int i = 0; i < PACKET_QUEUE_MAX; i++)
{
PACKET_MANAGER_LOG_INFO("runtime: %p, %-24s stat => pkts_in: %lu, pkts_out: %lu, pkts_claim: %lu, pkts_schedule: %lu",
PACKET_MANAGER_LOG_INFO("runtime: %p, %-24s stat => "
"pkts_in: %lu, pkts_out: %lu, pkts_claim: %lu, pkts_schedule: %lu, pkts_drop: %lu, "
"pkts_dup_succ: %lu, pkts_dup_fail: %lu, "
"pkts_build_tcp_succ: %lu, pkts_build_tcp_fail: %lu, "
"pkts_build_udp_succ: %lu, pkts_build_udp_fail: %lu, "
"pkts_build_l3_succ: %lu, pkts_build_l3_fail: %lu",
pkt_mgr_rte,
packet_stage_to_str(i),
pkt_mgr_rte->stat.queue[i].pkts_in,
pkt_mgr_rte->stat.queue[i].pkts_out,
pkt_mgr_rte->stat.queue[i].pkts_claim,
pkt_mgr_rte->stat.queue[i].pkts_schedule);
pkt_mgr_rte->stat.queue[i].pkts_schedule,
pkt_mgr_rte->stat.queue[i].pkts_drop,
pkt_mgr_rte->stat.queue[i].pkts_dup_succ,
pkt_mgr_rte->stat.queue[i].pkts_dup_fail,
pkt_mgr_rte->stat.queue[i].pkts_build_tcp_succ,
pkt_mgr_rte->stat.queue[i].pkts_build_tcp_fail,
pkt_mgr_rte->stat.queue[i].pkts_build_udp_succ,
pkt_mgr_rte->stat.queue[i].pkts_build_udp_fail,
pkt_mgr_rte->stat.queue[i].pkts_build_l3_succ,
pkt_mgr_rte->stat.queue[i].pkts_build_l3_fail);
}
}
struct packet *packet_manager_build_tcp_packet(struct packet_manager *pkt_mgr, const struct packet *origin_pkt, uint32_t tcp_seq, uint32_t tcp_ack, uint8_t tcp_flags,
const char *tcp_options, uint16_t tcp_options_len, const char *tcp_payload, uint16_t tcp_payload_len)
struct packet *packet_manager_build_tcp_packet(struct packet_manager *pkt_mgr, uint16_t thread_id, const struct packet *origin_pkt,
uint32_t tcp_seq, uint32_t tcp_ack, uint8_t tcp_flags,
const char *tcp_options, uint16_t tcp_options_len,
const char *tcp_payload, uint16_t tcp_payload_len)
{
struct packet_manager_rte *pkt_mgr_rte = pkt_mgr->rte[thread_id];
struct packet *pkt = packet_build_tcp(origin_pkt, tcp_seq, tcp_ack, tcp_flags, tcp_options, tcp_options_len, tcp_payload, tcp_payload_len);
if (pkt == NULL)
{
pkt_mgr_rte->stat.queue[pkt_mgr_rte->curr_stage].pkts_build_tcp_fail++;
return NULL;
}
pkt_mgr_rte->stat.queue[pkt_mgr_rte->curr_stage].pkts_build_tcp_succ++;
struct exdata_runtime *ex_rte = exdata_runtime_new(pkt_mgr->sche->ex_sche);
packet_set_user_data(pkt, ex_rte);
@@ -449,13 +475,17 @@ struct packet *packet_manager_build_tcp_packet(struct packet_manager *pkt_mgr, c
return pkt;
}
struct packet *packet_manager_build_udp_packet(struct packet_manager *pkt_mgr, const struct packet *origin_pkt, const char *udp_payload, uint16_t udp_payload_len)
struct packet *packet_manager_build_udp_packet(struct packet_manager *pkt_mgr, uint16_t thread_id, const struct packet *origin_pkt,
const char *udp_payload, uint16_t udp_payload_len)
{
struct packet_manager_rte *pkt_mgr_rte = pkt_mgr->rte[thread_id];
struct packet *pkt = packet_build_udp(origin_pkt, udp_payload, udp_payload_len);
if (pkt == NULL)
{
pkt_mgr_rte->stat.queue[pkt_mgr_rte->curr_stage].pkts_build_udp_fail++;
return NULL;
}
pkt_mgr_rte->stat.queue[pkt_mgr_rte->curr_stage].pkts_build_udp_succ++;
struct exdata_runtime *ex_rte = exdata_runtime_new(pkt_mgr->sche->ex_sche);
packet_set_user_data(pkt, ex_rte);
@@ -463,13 +493,17 @@ struct packet *packet_manager_build_udp_packet(struct packet_manager *pkt_mgr, c
return pkt;
}
struct packet *packet_manager_build_l3_packet(struct packet_manager *pkt_mgr, const struct packet *origin_pkt, uint8_t ip_proto, const char *l3_payload, uint16_t l3_payload_len)
struct packet *packet_manager_build_l3_packet(struct packet_manager *pkt_mgr, uint16_t thread_id, const struct packet *origin_pkt,
uint8_t ip_proto, const char *l3_payload, uint16_t l3_payload_len)
{
struct packet_manager_rte *pkt_mgr_rte = pkt_mgr->rte[thread_id];
struct packet *pkt = packet_build_l3(origin_pkt, ip_proto, l3_payload, l3_payload_len);
if (pkt == NULL)
{
pkt_mgr_rte->stat.queue[pkt_mgr_rte->curr_stage].pkts_build_l3_fail++;
return NULL;
}
pkt_mgr_rte->stat.queue[pkt_mgr_rte->curr_stage].pkts_build_l3_succ++;
struct exdata_runtime *ex_rte = exdata_runtime_new(pkt_mgr->sche->ex_sche);
packet_set_user_data(pkt, ex_rte);
@@ -477,13 +511,16 @@ struct packet *packet_manager_build_l3_packet(struct packet_manager *pkt_mgr, co
return pkt;
}
struct packet *packet_manager_dup_packet(struct packet_manager *pkt_mgr, const struct packet *origin_pkt)
struct packet *packet_manager_dup_packet(struct packet_manager *pkt_mgr, uint16_t thread_id, const struct packet *origin_pkt)
{
struct packet_manager_rte *pkt_mgr_rte = pkt_mgr->rte[thread_id];
struct packet *pkt = packet_dup(origin_pkt);
if (pkt == NULL)
{
pkt_mgr_rte->stat.queue[pkt_mgr_rte->curr_stage].pkts_dup_fail++;
return NULL;
}
pkt_mgr_rte->stat.queue[pkt_mgr_rte->curr_stage].pkts_dup_succ++;
struct exdata_runtime *ex_rte = exdata_runtime_new(pkt_mgr->sche->ex_sche);
packet_set_user_data(pkt, ex_rte);
@@ -491,10 +528,13 @@ struct packet *packet_manager_dup_packet(struct packet_manager *pkt_mgr, const s
return pkt;
}
void packet_manager_free_packet(struct packet_manager *pkt_mgr __attribute__((unused)), struct packet *pkt)
void packet_manager_free_packet(struct packet_manager *pkt_mgr, uint16_t thread_id, struct packet *pkt)
{
if (pkt)
{
struct packet_manager_rte *pkt_mgr_rte = pkt_mgr->rte[thread_id];
pkt_mgr_rte->stat.queue[pkt_mgr_rte->curr_stage].pkts_drop++;
struct exdata_runtime *ex_rte = packet_get_user_data(pkt);
exdata_runtime_free(ex_rte);