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:
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user