diff --git a/include/stellar/packet.h b/include/stellar/packet.h index ec49227..2760261 100644 --- a/include/stellar/packet.h +++ b/include/stellar/packet.h @@ -219,16 +219,16 @@ void packet_manager_schedule_packet(struct packet_manager *pkt_mgr, uint16_t thr * tcp_ack: the acknowledgment number of the new TCP packet (in host byte order) * tcp_options_len: the length of the options (must be a multiple of 4) */ -struct packet *packet_manager_build_tcp_packet(struct packet_manager *pkt_mgr, const struct packet *origin_pkt, +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 *packet_manager_build_udp_packet(struct packet_manager *pkt_mgr, const struct packet *origin_pkt, +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 *packet_manager_build_l3_packet(struct packet_manager *pkt_mgr, const struct packet *origin_pkt, +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 *packet_manager_dup_packet(struct packet_manager *pkt_mgr, const struct packet *origin_pkt); -void packet_manager_free_packet(struct packet_manager *pkt_mgr, struct packet *pkt); +struct packet *packet_manager_dup_packet(struct packet_manager *pkt_mgr, uint16_t thread_id, const struct packet *origin_pkt); +void packet_manager_free_packet(struct packet_manager *pkt_mgr, uint16_t thread_id, struct packet *pkt); #ifdef __cplusplus } diff --git a/infra/packet_manager/packet_manager.c b/infra/packet_manager/packet_manager.c index e776a85..d71c986 100644 --- a/infra/packet_manager/packet_manager.c +++ b/infra/packet_manager/packet_manager.c @@ -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); diff --git a/infra/packet_manager/packet_manager.h b/infra/packet_manager/packet_manager.h index 61d5f04..46e0fa7 100644 --- a/infra/packet_manager/packet_manager.h +++ b/infra/packet_manager/packet_manager.h @@ -20,38 +20,92 @@ struct packet_manager_stat uint64_t pkts_out; // include the packets that are claimed uint64_t pkts_claim; uint64_t pkts_schedule; + uint64_t pkts_drop; + uint64_t pkts_dup_succ; + uint64_t pkts_dup_fail; + uint64_t pkts_build_tcp_succ; + uint64_t pkts_build_tcp_fail; + uint64_t pkts_build_udp_succ; + uint64_t pkts_build_udp_fail; + uint64_t pkts_build_l3_succ; + uint64_t pkts_build_l3_fail; } queue[PACKET_QUEUE_MAX]; // the last queue is for sending packets }; // XX(type, name, val) -#define PKT_MGR_STAT_MAP(XX) \ - XX(PKT_MGR_STAT_PKTS_INGRESS, pkts_ingress, pkts_ingress) \ - XX(PKT_MGR_STAT_PKTS_EGRESS, pkts_egress, pkts_egress) \ - /* PREROUTING */ \ - XX(PKT_MGR_STAT_PKTS_IN_ON_PREROUTING, pkts_in_on_prerouting, queue[PACKET_STAGE_PREROUTING].pkts_in) \ - XX(PKT_MGR_STAT_PKTS_OUT_ON_PREROUTING, pkts_out_on_prerouting, queue[PACKET_STAGE_PREROUTING].pkts_out) \ - XX(PKT_MGR_STAT_PKTS_CLAIM_ON_PREROUTING, pkts_claim_on_prerouting, queue[PACKET_STAGE_PREROUTING].pkts_claim) \ - XX(PKT_MGR_STAT_PKTS_SCHEDULE_ON_PREROUTING, pkts_schedule_on_prerouting, queue[PACKET_STAGE_PREROUTING].pkts_schedule) \ - /* INPUT */ \ - XX(PKT_MGR_STAT_PKTS_IN_ON_INPUT, pkts_in_on_input, queue[PACKET_STAGE_INPUT].pkts_in) \ - XX(PKT_MGR_STAT_PKTS_OUT_ON_INPUT, pkts_out_on_input, queue[PACKET_STAGE_INPUT].pkts_out) \ - XX(PKT_MGR_STAT_PKTS_CLAIM_ON_INPUT, pkts_claim_on_input, queue[PACKET_STAGE_INPUT].pkts_claim) \ - XX(PKT_MGR_STAT_PKTS_SCHEDULE_ON_INPUT, pkts_schedule_on_input, queue[PACKET_STAGE_INPUT].pkts_schedule) \ - /* FORWARD */ \ - XX(PKT_MGR_STAT_PKTS_IN_ON_FORWARD, pkts_in_on_forward, queue[PACKET_STAGE_FORWARD].pkts_in) \ - XX(PKT_MGR_STAT_PKTS_OUT_ON_FORWARD, pkts_out_on_forward, queue[PACKET_STAGE_FORWARD].pkts_out) \ - XX(PKT_MGR_STAT_PKTS_CLAIM_ON_FORWARD, pkts_claim_on_forward, queue[PACKET_STAGE_FORWARD].pkts_claim) \ - XX(PKT_MGR_STAT_PKTS_SCHEDULE_ON_FORWARD, pkts_schedule_on_forward, queue[PACKET_STAGE_FORWARD].pkts_schedule) \ - /* OUTPUT */ \ - XX(PKT_MGR_STAT_PKTS_IN_ON_OUTPUT, pkts_in_on_output, queue[PACKET_STAGE_OUTPUT].pkts_in) \ - XX(PKT_MGR_STAT_PKTS_OUT_ON_OUTPUT, pkts_out_on_output, queue[PACKET_STAGE_OUTPUT].pkts_out) \ - XX(PKT_MGR_STAT_PKTS_CLAIM_ON_OUTPUT, pkts_claim_on_output, queue[PACKET_STAGE_OUTPUT].pkts_claim) \ - XX(PKT_MGR_STAT_PKTS_SCHEDULE_ON_OUTPUT, pkts_schedule_on_output, queue[PACKET_STAGE_OUTPUT].pkts_schedule) \ - /* POSTROUTING */ \ - XX(PKT_MGR_STAT_PKTS_IN_ON_POSTROUTING, pkts_in_on_postrouting, queue[PACKET_STAGE_POSTROUTING].pkts_in) \ - XX(PKT_MGR_STAT_PKTS_OUT_ON_POSTROUTING, pkts_out_on_postrouting, queue[PACKET_STAGE_POSTROUTING].pkts_out) \ - XX(PKT_MGR_STAT_PKTS_CLAIM_ON_POSTROUTING, pkts_claim_on_postrouting, queue[PACKET_STAGE_POSTROUTING].pkts_claim) \ - XX(PKT_MGR_STAT_PKTS_SCHEDULE_ON_POSTROUTING, pkts_schedule_on_postrouting, queue[PACKET_STAGE_POSTROUTING].pkts_schedule) +#define PKT_MGR_STAT_MAP(XX) \ + XX(PKT_MGR_STAT_PKTS_INGRESS, pkts_ingress, pkts_ingress) \ + XX(PKT_MGR_STAT_PKTS_EGRESS, pkts_egress, pkts_egress) \ + /* PREROUTING */ \ + XX(PKT_MGR_STAT_PKTS_IN_ON_PREROUTING, pkts_in_on_prerouting, queue[PACKET_STAGE_PREROUTING].pkts_in) \ + XX(PKT_MGR_STAT_PKTS_OUT_ON_PREROUTING, pkts_out_on_prerouting, queue[PACKET_STAGE_PREROUTING].pkts_out) \ + XX(PKT_MGR_STAT_PKTS_CLAIM_ON_PREROUTING, pkts_claim_on_prerouting, queue[PACKET_STAGE_PREROUTING].pkts_claim) \ + XX(PKT_MGR_STAT_PKTS_SCHEDULE_ON_PREROUTING, pkts_schedule_on_prerouting, queue[PACKET_STAGE_PREROUTING].pkts_schedule) \ + XX(PKT_MGR_STAT_PKTS_DROP_ON_PREROUTING, pkts_drop_on_prerouting, queue[PACKET_STAGE_PREROUTING].pkts_drop) \ + XX(PKT_MGR_STAT_PKTS_DUP_SUCC_ON_PREROUTING, pkts_dup_succ_on_prerouting, queue[PACKET_STAGE_PREROUTING].pkts_dup_succ) \ + XX(PKT_MGR_STAT_PKTS_DUP_FAIL_ON_PREROUTING, pkts_dup_fail_on_prerouting, queue[PACKET_STAGE_PREROUTING].pkts_dup_fail) \ + XX(PKT_MGR_STAT_PKTS_BUILD_TCP_SUCC_ON_PREROUTING, pkts_build_tcp_succ_on_prerouting, queue[PACKET_STAGE_PREROUTING].pkts_build_tcp_succ) \ + XX(PKT_MGR_STAT_PKTS_BUILD_TCP_FAIL_ON_PREROUTING, pkts_build_tcp_fail_on_prerouting, queue[PACKET_STAGE_PREROUTING].pkts_build_tcp_fail) \ + XX(PKT_MGR_STAT_PKTS_BUILD_UDP_SUCC_ON_PREROUTING, pkts_build_udp_succ_on_prerouting, queue[PACKET_STAGE_PREROUTING].pkts_build_udp_succ) \ + XX(PKT_MGR_STAT_PKTS_BUILD_UDP_FAIL_ON_PREROUTING, pkts_build_udp_fail_on_prerouting, queue[PACKET_STAGE_PREROUTING].pkts_build_udp_fail) \ + XX(PKT_MGR_STAT_PKTS_BUILD_L3_SUCC_ON_PREROUTING, pkts_build_l3_succ_on_prerouting, queue[PACKET_STAGE_PREROUTING].pkts_build_l3_succ) \ + XX(PKT_MGR_STAT_PKTS_BUILD_L3_FAIL_ON_PREROUTING, pkts_build_l3_fail_on_prerouting, queue[PACKET_STAGE_PREROUTING].pkts_build_l3_fail) \ + /* INPUT */ \ + XX(PKT_MGR_STAT_PKTS_IN_ON_INPUT, pkts_in_on_input, queue[PACKET_STAGE_INPUT].pkts_in) \ + XX(PKT_MGR_STAT_PKTS_OUT_ON_INPUT, pkts_out_on_input, queue[PACKET_STAGE_INPUT].pkts_out) \ + XX(PKT_MGR_STAT_PKTS_CLAIM_ON_INPUT, pkts_claim_on_input, queue[PACKET_STAGE_INPUT].pkts_claim) \ + XX(PKT_MGR_STAT_PKTS_SCHEDULE_ON_INPUT, pkts_schedule_on_input, queue[PACKET_STAGE_INPUT].pkts_schedule) \ + XX(PKT_MGR_STAT_PKTS_DROP_ON_INPUT, pkts_drop_on_input, queue[PACKET_STAGE_INPUT].pkts_drop) \ + XX(PKT_MGR_STAT_PKTS_DUP_SUCC_ON_INPUT, pkts_dup_succ_on_input, queue[PACKET_STAGE_INPUT].pkts_dup_succ) \ + XX(PKT_MGR_STAT_PKTS_DUP_FAIL_ON_INPUT, pkts_dup_fail_on_input, queue[PACKET_STAGE_INPUT].pkts_dup_fail) \ + XX(PKT_MGR_STAT_PKTS_BUILD_TCP_SUCC_ON_INPUT, pkts_build_tcp_succ_on_input, queue[PACKET_STAGE_INPUT].pkts_build_tcp_succ) \ + XX(PKT_MGR_STAT_PKTS_BUILD_TCP_FAIL_ON_INPUT, pkts_build_tcp_fail_on_input, queue[PACKET_STAGE_INPUT].pkts_build_tcp_fail) \ + XX(PKT_MGR_STAT_PKTS_BUILD_UDP_SUCC_ON_INPUT, pkts_build_udp_succ_on_input, queue[PACKET_STAGE_INPUT].pkts_build_udp_succ) \ + XX(PKT_MGR_STAT_PKTS_BUILD_UDP_FAIL_ON_INPUT, pkts_build_udp_fail_on_input, queue[PACKET_STAGE_INPUT].pkts_build_udp_fail) \ + XX(PKT_MGR_STAT_PKTS_BUILD_L3_SUCC_ON_INPUT, pkts_build_l3_succ_on_input, queue[PACKET_STAGE_INPUT].pkts_build_l3_succ) \ + XX(PKT_MGR_STAT_PKTS_BUILD_L3_FAIL_ON_INPUT, pkts_build_l3_fail_on_input, queue[PACKET_STAGE_INPUT].pkts_build_l3_fail) \ + /* FORWARD */ \ + XX(PKT_MGR_STAT_PKTS_IN_ON_FORWARD, pkts_in_on_forward, queue[PACKET_STAGE_FORWARD].pkts_in) \ + XX(PKT_MGR_STAT_PKTS_OUT_ON_FORWARD, pkts_out_on_forward, queue[PACKET_STAGE_FORWARD].pkts_out) \ + XX(PKT_MGR_STAT_PKTS_CLAIM_ON_FORWARD, pkts_claim_on_forward, queue[PACKET_STAGE_FORWARD].pkts_claim) \ + XX(PKT_MGR_STAT_PKTS_SCHEDULE_ON_FORWARD, pkts_schedule_on_forward, queue[PACKET_STAGE_FORWARD].pkts_schedule) \ + XX(PKT_MGR_STAT_PKTS_DROP_ON_FORWARD, pkts_drop_on_forward, queue[PACKET_STAGE_FORWARD].pkts_drop) \ + XX(PKT_MGR_STAT_PKTS_DUP_SUCC_ON_FORWARD, pkts_dup_succ_on_forward, queue[PACKET_STAGE_FORWARD].pkts_dup_succ) \ + XX(PKT_MGR_STAT_PKTS_DUP_FAIL_ON_FORWARD, pkts_dup_fail_on_forward, queue[PACKET_STAGE_FORWARD].pkts_dup_fail) \ + XX(PKT_MGR_STAT_PKTS_BUILD_TCP_SUCC_ON_FORWARD, pkts_build_tcp_succ_on_forward, queue[PACKET_STAGE_FORWARD].pkts_build_tcp_succ) \ + XX(PKT_MGR_STAT_PKTS_BUILD_TCP_FAIL_ON_FORWARD, pkts_build_tcp_fail_on_forward, queue[PACKET_STAGE_FORWARD].pkts_build_tcp_fail) \ + XX(PKT_MGR_STAT_PKTS_BUILD_UDP_SUCC_ON_FORWARD, pkts_build_udp_succ_on_forward, queue[PACKET_STAGE_FORWARD].pkts_build_udp_succ) \ + XX(PKT_MGR_STAT_PKTS_BUILD_UDP_FAIL_ON_FORWARD, pkts_build_udp_fail_on_forward, queue[PACKET_STAGE_FORWARD].pkts_build_udp_fail) \ + XX(PKT_MGR_STAT_PKTS_BUILD_L3_SUCC_ON_FORWARD, pkts_build_l3_succ_on_forward, queue[PACKET_STAGE_FORWARD].pkts_build_l3_succ) \ + XX(PKT_MGR_STAT_PKTS_BUILD_L3_FAIL_ON_FORWARD, pkts_build_l3_fail_on_forward, queue[PACKET_STAGE_FORWARD].pkts_build_l3_fail) \ + /* OUTPUT */ \ + XX(PKT_MGR_STAT_PKTS_IN_ON_OUTPUT, pkts_in_on_output, queue[PACKET_STAGE_OUTPUT].pkts_in) \ + XX(PKT_MGR_STAT_PKTS_OUT_ON_OUTPUT, pkts_out_on_output, queue[PACKET_STAGE_OUTPUT].pkts_out) \ + XX(PKT_MGR_STAT_PKTS_CLAIM_ON_OUTPUT, pkts_claim_on_output, queue[PACKET_STAGE_OUTPUT].pkts_claim) \ + XX(PKT_MGR_STAT_PKTS_SCHEDULE_ON_OUTPUT, pkts_schedule_on_output, queue[PACKET_STAGE_OUTPUT].pkts_schedule) \ + XX(PKT_MGR_STAT_PKTS_DROP_ON_OUTPUT, pkts_drop_on_output, queue[PACKET_STAGE_OUTPUT].pkts_drop) \ + XX(PKT_MGR_STAT_PKTS_DUP_SUCC_ON_OUTPUT, pkts_dup_succ_on_output, queue[PACKET_STAGE_OUTPUT].pkts_dup_succ) \ + XX(PKT_MGR_STAT_PKTS_DUP_FAIL_ON_OUTPUT, pkts_dup_fail_on_output, queue[PACKET_STAGE_OUTPUT].pkts_dup_fail) \ + XX(PKT_MGR_STAT_PKTS_BUILD_TCP_SUCC_ON_OUTPUT, pkts_build_tcp_succ_on_output, queue[PACKET_STAGE_OUTPUT].pkts_build_tcp_succ) \ + XX(PKT_MGR_STAT_PKTS_BUILD_TCP_FAIL_ON_OUTPUT, pkts_build_tcp_fail_on_output, queue[PACKET_STAGE_OUTPUT].pkts_build_tcp_fail) \ + XX(PKT_MGR_STAT_PKTS_BUILD_UDP_SUCC_ON_OUTPUT, pkts_build_udp_succ_on_output, queue[PACKET_STAGE_OUTPUT].pkts_build_udp_succ) \ + XX(PKT_MGR_STAT_PKTS_BUILD_UDP_FAIL_ON_OUTPUT, pkts_build_udp_fail_on_output, queue[PACKET_STAGE_OUTPUT].pkts_build_udp_fail) \ + XX(PKT_MGR_STAT_PKTS_BUILD_L3_SUCC_ON_OUTPUT, pkts_build_l3_succ_on_output, queue[PACKET_STAGE_OUTPUT].pkts_build_l3_succ) \ + XX(PKT_MGR_STAT_PKTS_BUILD_L3_FAIL_ON_OUTPUT, pkts_build_l3_fail_on_output, queue[PACKET_STAGE_OUTPUT].pkts_build_l3_fail) \ + /* POSTROUTING */ \ + XX(PKT_MGR_STAT_PKTS_IN_ON_POSTROUTING, pkts_in_on_postrouting, queue[PACKET_STAGE_POSTROUTING].pkts_in) \ + XX(PKT_MGR_STAT_PKTS_OUT_ON_POSTROUTING, pkts_out_on_postrouting, queue[PACKET_STAGE_POSTROUTING].pkts_out) \ + XX(PKT_MGR_STAT_PKTS_CLAIM_ON_POSTROUTING, pkts_claim_on_postrouting, queue[PACKET_STAGE_POSTROUTING].pkts_claim) \ + XX(PKT_MGR_STAT_PKTS_SCHEDULE_ON_POSTROUTING, pkts_schedule_on_postrouting, queue[PACKET_STAGE_POSTROUTING].pkts_schedule) \ + XX(PKT_MGR_STAT_PKTS_DROP_ON_POSTROUTING, pkts_drop_on_postrouting, queue[PACKET_STAGE_POSTROUTING].pkts_drop) \ + XX(PKT_MGR_STAT_PKTS_DUP_SUCC_ON_POSTROUTING, pkts_dup_succ_on_postrouting, queue[PACKET_STAGE_POSTROUTING].pkts_dup_succ) \ + XX(PKT_MGR_STAT_PKTS_DUP_FAIL_ON_POSTROUTING, pkts_dup_fail_on_postrouting, queue[PACKET_STAGE_POSTROUTING].pkts_dup_fail) \ + XX(PKT_MGR_STAT_PKTS_BUILD_TCP_SUCC_ON_POSTROUTING, pkts_build_tcp_succ_on_postrouting, queue[PACKET_STAGE_POSTROUTING].pkts_build_tcp_succ) \ + XX(PKT_MGR_STAT_PKTS_BUILD_TCP_FAIL_ON_POSTROUTING, pkts_build_tcp_fail_on_postrouting, queue[PACKET_STAGE_POSTROUTING].pkts_build_tcp_fail) \ + XX(PKT_MGR_STAT_PKTS_BUILD_UDP_SUCC_ON_POSTROUTING, pkts_build_udp_succ_on_postrouting, queue[PACKET_STAGE_POSTROUTING].pkts_build_udp_succ) \ + XX(PKT_MGR_STAT_PKTS_BUILD_UDP_FAIL_ON_POSTROUTING, pkts_build_udp_fail_on_postrouting, queue[PACKET_STAGE_POSTROUTING].pkts_build_udp_fail) \ + XX(PKT_MGR_STAT_PKTS_BUILD_L3_SUCC_ON_POSTROUTING, pkts_build_l3_succ_on_postrouting, queue[PACKET_STAGE_POSTROUTING].pkts_build_l3_succ) \ + XX(PKT_MGR_STAT_PKTS_BUILD_L3_FAIL_ON_POSTROUTING, pkts_build_l3_fail_on_postrouting, queue[PACKET_STAGE_POSTROUTING].pkts_build_l3_fail) enum pkt_mgr_stat_type { diff --git a/infra/packet_manager/test/gtest_packet_manager.cpp b/infra/packet_manager/test/gtest_packet_manager.cpp index 1f982e1..1be35d4 100644 --- a/infra/packet_manager/test/gtest_packet_manager.cpp +++ b/infra/packet_manager/test/gtest_packet_manager.cpp @@ -78,8 +78,23 @@ static void check_stat(struct packet_manager_stat *curr_stat, struct packet_mana { EXPECT_TRUE(curr_stat->queue[i].pkts_in == expect_stat->queue[i].pkts_in); EXPECT_TRUE(curr_stat->queue[i].pkts_out == expect_stat->queue[i].pkts_out); + EXPECT_TRUE(curr_stat->queue[i].pkts_claim == expect_stat->queue[i].pkts_claim); EXPECT_TRUE(curr_stat->queue[i].pkts_schedule == expect_stat->queue[i].pkts_schedule); + + EXPECT_TRUE(curr_stat->queue[i].pkts_drop == expect_stat->queue[i].pkts_drop); + + EXPECT_TRUE(curr_stat->queue[i].pkts_dup_succ == expect_stat->queue[i].pkts_dup_succ); + EXPECT_TRUE(curr_stat->queue[i].pkts_dup_fail == expect_stat->queue[i].pkts_dup_fail); + + EXPECT_TRUE(curr_stat->queue[i].pkts_build_tcp_succ == expect_stat->queue[i].pkts_build_tcp_succ); + EXPECT_TRUE(curr_stat->queue[i].pkts_build_tcp_fail == expect_stat->queue[i].pkts_build_tcp_fail); + + EXPECT_TRUE(curr_stat->queue[i].pkts_build_udp_succ == expect_stat->queue[i].pkts_build_udp_succ); + EXPECT_TRUE(curr_stat->queue[i].pkts_build_udp_fail == expect_stat->queue[i].pkts_build_udp_fail); + + EXPECT_TRUE(curr_stat->queue[i].pkts_build_l3_succ == expect_stat->queue[i].pkts_build_l3_succ); + EXPECT_TRUE(curr_stat->queue[i].pkts_build_l3_fail == expect_stat->queue[i].pkts_build_l3_fail); } } @@ -146,12 +161,86 @@ TEST(PACKET_MANAGER, SUBSCRIBER_PACKET_STAGE) .pkts_ingress = 1, .pkts_egress = 1, .queue = { - [PACKET_STAGE_PREROUTING] = {.pkts_in = 1, .pkts_out = 1, .pkts_claim = 0, .pkts_schedule = 0}, - [PACKET_STAGE_INPUT] = {.pkts_in = 1, .pkts_out = 1, .pkts_claim = 0, .pkts_schedule = 0}, - [PACKET_STAGE_FORWARD] = {.pkts_in = 1, .pkts_out = 1, .pkts_claim = 0, .pkts_schedule = 0}, - [PACKET_STAGE_OUTPUT] = {.pkts_in = 1, .pkts_out = 1, .pkts_claim = 0, .pkts_schedule = 0}, - [PACKET_STAGE_POSTROUTING] = {.pkts_in = 1, .pkts_out = 1, .pkts_claim = 0, .pkts_schedule = 0}, - [PACKET_STAGE_MAX] = {.pkts_in = 1, .pkts_out = 1, .pkts_claim = 0, .pkts_schedule = 0}, + [PACKET_STAGE_PREROUTING] = {.pkts_in = 1, .pkts_out = 1, .pkts_claim = 0, .pkts_schedule = 0, .pkts_drop = 0, .pkts_dup_succ = 0, .pkts_dup_fail = 0, .pkts_build_tcp_succ = 0, .pkts_build_tcp_fail = 0, .pkts_build_udp_succ = 0, .pkts_build_udp_fail = 0, .pkts_build_l3_succ = 0, .pkts_build_l3_fail = 0}, + [PACKET_STAGE_INPUT] = {.pkts_in = 1, .pkts_out = 1, .pkts_claim = 0, .pkts_schedule = 0, .pkts_drop = 0, .pkts_dup_succ = 0, .pkts_dup_fail = 0, .pkts_build_tcp_succ = 0, .pkts_build_tcp_fail = 0, .pkts_build_udp_succ = 0, .pkts_build_udp_fail = 0, .pkts_build_l3_succ = 0, .pkts_build_l3_fail = 0}, + [PACKET_STAGE_FORWARD] = {.pkts_in = 1, .pkts_out = 1, .pkts_claim = 0, .pkts_schedule = 0, .pkts_drop = 0, .pkts_dup_succ = 0, .pkts_dup_fail = 0, .pkts_build_tcp_succ = 0, .pkts_build_tcp_fail = 0, .pkts_build_udp_succ = 0, .pkts_build_udp_fail = 0, .pkts_build_l3_succ = 0, .pkts_build_l3_fail = 0}, + [PACKET_STAGE_OUTPUT] = {.pkts_in = 1, .pkts_out = 1, .pkts_claim = 0, .pkts_schedule = 0, .pkts_drop = 0, .pkts_dup_succ = 0, .pkts_dup_fail = 0, .pkts_build_tcp_succ = 0, .pkts_build_tcp_fail = 0, .pkts_build_udp_succ = 0, .pkts_build_udp_fail = 0, .pkts_build_l3_succ = 0, .pkts_build_l3_fail = 0}, + [PACKET_STAGE_POSTROUTING] = {.pkts_in = 1, .pkts_out = 1, .pkts_claim = 0, .pkts_schedule = 0, .pkts_drop = 0, .pkts_dup_succ = 0, .pkts_dup_fail = 0, .pkts_build_tcp_succ = 0, .pkts_build_tcp_fail = 0, .pkts_build_udp_succ = 0, .pkts_build_udp_fail = 0, .pkts_build_l3_succ = 0, .pkts_build_l3_fail = 0}, + [PACKET_STAGE_MAX] = {.pkts_in = 1, .pkts_out = 1, .pkts_claim = 0, .pkts_schedule = 0, .pkts_drop = 0, .pkts_dup_succ = 0, .pkts_dup_fail = 0, .pkts_build_tcp_succ = 0, .pkts_build_tcp_fail = 0, .pkts_build_udp_succ = 0, .pkts_build_udp_fail = 0, .pkts_build_l3_succ = 0, .pkts_build_l3_fail = 0}, + }, + }; + check_stat(curr_stat, &expect_stat); + + // per-thread free + packet_manager_clean(pkt_mgr, thread_id); + + // module free + packet_manager_free(pkt_mgr); + + // global free + mq_runtime_free(mq_rt); + mq_schema_free(mq_schema); +} +#endif + +#if 1 +static void on_forward_stage_drop_packet(struct packet *pkt, enum packet_stage stage, void *args) +{ + printf("on_packet_stage: %s\n", packet_stage_to_str(stage)); + + static int count = 0; + EXPECT_TRUE(count == stage); + EXPECT_TRUE(packet_get_type(pkt) == PACKET_TYPE_PSEUDO); + EXPECT_TRUE(args == NULL); + count++; + + if (stage == PACKET_STAGE_FORWARD) + { + packet_set_action(pkt, PACKET_ACTION_DROP); + } +} + +TEST(PACKET_MANAGER, DROP_PACKET) +{ + // global init + struct mq_schema *mq_schema = mq_schema_new(); + EXPECT_TRUE(mq_schema); + struct mq_runtime *mq_rt = mq_runtime_new(mq_schema); + EXPECT_TRUE(mq_rt); + + // module init + struct packet_manager *pkt_mgr = packet_manager_new(mq_schema, 1); + EXPECT_TRUE(pkt_mgr); + EXPECT_TRUE(packet_manager_subscribe(pkt_mgr, PACKET_STAGE_PREROUTING, on_forward_stage_drop_packet, NULL) == 0); + EXPECT_TRUE(packet_manager_subscribe(pkt_mgr, PACKET_STAGE_INPUT, on_forward_stage_drop_packet, NULL) == 0); + EXPECT_TRUE(packet_manager_subscribe(pkt_mgr, PACKET_STAGE_FORWARD, on_forward_stage_drop_packet, NULL) == 0); + EXPECT_TRUE(packet_manager_subscribe(pkt_mgr, PACKET_STAGE_OUTPUT, on_forward_stage_drop_packet, NULL) == 0); + EXPECT_TRUE(packet_manager_subscribe(pkt_mgr, PACKET_STAGE_POSTROUTING, on_forward_stage_drop_packet, NULL) == 0); + + // per-thread init + packet_manager_init(pkt_mgr, thread_id, mq_rt); + + // per-thread run + struct packet pkt; + memset(&pkt, 0, sizeof(pkt)); + packet_parse(&pkt, (const char *)data, sizeof(data)); + 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); + packet_manager_ingress(pkt_mgr, thread_id, &pkt); + packet_manager_dispatch(pkt_mgr, thread_id); + EXPECT_TRUE(packet_manager_egress(pkt_mgr, thread_id) == NULL); + struct packet_manager_stat expect_stat = { + .pkts_ingress = 1, + .pkts_egress = 0, + .queue = { + [PACKET_STAGE_PREROUTING] = {.pkts_in = 1, .pkts_out = 1, .pkts_claim = 0, .pkts_schedule = 0, .pkts_drop = 0, .pkts_dup_succ = 0, .pkts_dup_fail = 0, .pkts_build_tcp_succ = 0, .pkts_build_tcp_fail = 0, .pkts_build_udp_succ = 0, .pkts_build_udp_fail = 0, .pkts_build_l3_succ = 0, .pkts_build_l3_fail = 0}, + [PACKET_STAGE_INPUT] = {.pkts_in = 1, .pkts_out = 1, .pkts_claim = 0, .pkts_schedule = 0, .pkts_drop = 0, .pkts_dup_succ = 0, .pkts_dup_fail = 0, .pkts_build_tcp_succ = 0, .pkts_build_tcp_fail = 0, .pkts_build_udp_succ = 0, .pkts_build_udp_fail = 0, .pkts_build_l3_succ = 0, .pkts_build_l3_fail = 0}, + [PACKET_STAGE_FORWARD] = {.pkts_in = 1, .pkts_out = 1, .pkts_claim = 0, .pkts_schedule = 0, .pkts_drop = 1, .pkts_dup_succ = 0, .pkts_dup_fail = 0, .pkts_build_tcp_succ = 0, .pkts_build_tcp_fail = 0, .pkts_build_udp_succ = 0, .pkts_build_udp_fail = 0, .pkts_build_l3_succ = 0, .pkts_build_l3_fail = 0}, + [PACKET_STAGE_OUTPUT] = {.pkts_in = 0, .pkts_out = 0, .pkts_claim = 0, .pkts_schedule = 0, .pkts_drop = 0, .pkts_dup_succ = 0, .pkts_dup_fail = 0, .pkts_build_tcp_succ = 0, .pkts_build_tcp_fail = 0, .pkts_build_udp_succ = 0, .pkts_build_udp_fail = 0, .pkts_build_l3_succ = 0, .pkts_build_l3_fail = 0}, + [PACKET_STAGE_POSTROUTING] = {.pkts_in = 0, .pkts_out = 0, .pkts_claim = 0, .pkts_schedule = 0, .pkts_drop = 0, .pkts_dup_succ = 0, .pkts_dup_fail = 0, .pkts_build_tcp_succ = 0, .pkts_build_tcp_fail = 0, .pkts_build_udp_succ = 0, .pkts_build_udp_fail = 0, .pkts_build_l3_succ = 0, .pkts_build_l3_fail = 0}, + [PACKET_STAGE_MAX] = {.pkts_in = 0, .pkts_out = 0, .pkts_claim = 0, .pkts_schedule = 0, .pkts_drop = 0, .pkts_dup_succ = 0, .pkts_dup_fail = 0, .pkts_build_tcp_succ = 0, .pkts_build_tcp_fail = 0, .pkts_build_udp_succ = 0, .pkts_build_udp_fail = 0, .pkts_build_l3_succ = 0, .pkts_build_l3_fail = 0}, }, }; check_stat(curr_stat, &expect_stat); @@ -250,12 +339,12 @@ TEST(PACKET_MANAGER, CLAIM_PACKET) .pkts_ingress = 1, .pkts_egress = 0, .queue = { - [PACKET_STAGE_PREROUTING] = {.pkts_in = 1, .pkts_out = 1, .pkts_claim = 1, .pkts_schedule = 0}, - [PACKET_STAGE_INPUT] = {.pkts_in = 0, .pkts_out = 0, .pkts_claim = 0, .pkts_schedule = 0}, - [PACKET_STAGE_FORWARD] = {.pkts_in = 0, .pkts_out = 0, .pkts_claim = 0, .pkts_schedule = 0}, - [PACKET_STAGE_OUTPUT] = {.pkts_in = 0, .pkts_out = 0, .pkts_claim = 0, .pkts_schedule = 0}, - [PACKET_STAGE_POSTROUTING] = {.pkts_in = 0, .pkts_out = 0, .pkts_claim = 0, .pkts_schedule = 0}, - [PACKET_STAGE_MAX] = {.pkts_in = 0, .pkts_out = 0, .pkts_claim = 0, .pkts_schedule = 0}, + [PACKET_STAGE_PREROUTING] = {.pkts_in = 1, .pkts_out = 1, .pkts_claim = 1, .pkts_schedule = 0, .pkts_drop = 0, .pkts_dup_succ = 0, .pkts_dup_fail = 0, .pkts_build_tcp_succ = 0, .pkts_build_tcp_fail = 0, .pkts_build_udp_succ = 0, .pkts_build_udp_fail = 0, .pkts_build_l3_succ = 0, .pkts_build_l3_fail = 0}, + [PACKET_STAGE_INPUT] = {.pkts_in = 0, .pkts_out = 0, .pkts_claim = 0, .pkts_schedule = 0, .pkts_drop = 0, .pkts_dup_succ = 0, .pkts_dup_fail = 0, .pkts_build_tcp_succ = 0, .pkts_build_tcp_fail = 0, .pkts_build_udp_succ = 0, .pkts_build_udp_fail = 0, .pkts_build_l3_succ = 0, .pkts_build_l3_fail = 0}, + [PACKET_STAGE_FORWARD] = {.pkts_in = 0, .pkts_out = 0, .pkts_claim = 0, .pkts_schedule = 0, .pkts_drop = 0, .pkts_dup_succ = 0, .pkts_dup_fail = 0, .pkts_build_tcp_succ = 0, .pkts_build_tcp_fail = 0, .pkts_build_udp_succ = 0, .pkts_build_udp_fail = 0, .pkts_build_l3_succ = 0, .pkts_build_l3_fail = 0}, + [PACKET_STAGE_OUTPUT] = {.pkts_in = 0, .pkts_out = 0, .pkts_claim = 0, .pkts_schedule = 0, .pkts_drop = 0, .pkts_dup_succ = 0, .pkts_dup_fail = 0, .pkts_build_tcp_succ = 0, .pkts_build_tcp_fail = 0, .pkts_build_udp_succ = 0, .pkts_build_udp_fail = 0, .pkts_build_l3_succ = 0, .pkts_build_l3_fail = 0}, + [PACKET_STAGE_POSTROUTING] = {.pkts_in = 0, .pkts_out = 0, .pkts_claim = 0, .pkts_schedule = 0, .pkts_drop = 0, .pkts_dup_succ = 0, .pkts_dup_fail = 0, .pkts_build_tcp_succ = 0, .pkts_build_tcp_fail = 0, .pkts_build_udp_succ = 0, .pkts_build_udp_fail = 0, .pkts_build_l3_succ = 0, .pkts_build_l3_fail = 0}, + [PACKET_STAGE_MAX] = {.pkts_in = 0, .pkts_out = 0, .pkts_claim = 0, .pkts_schedule = 0, .pkts_drop = 0, .pkts_dup_succ = 0, .pkts_dup_fail = 0, .pkts_build_tcp_succ = 0, .pkts_build_tcp_fail = 0, .pkts_build_udp_succ = 0, .pkts_build_udp_fail = 0, .pkts_build_l3_succ = 0, .pkts_build_l3_fail = 0}, }, }; check_stat(curr_stat, &expect_stat); @@ -334,12 +423,12 @@ TEST(PACKET_MANAGER, SCHEDULE_PACKET) .pkts_ingress = 1, .pkts_egress = 5, .queue = { - [PACKET_STAGE_PREROUTING] = {.pkts_in = 1, .pkts_out = 1, .pkts_claim = 0, .pkts_schedule = 0}, - [PACKET_STAGE_INPUT] = {.pkts_in = 2, .pkts_out = 2, .pkts_claim = 0, .pkts_schedule = 1}, - [PACKET_STAGE_FORWARD] = {.pkts_in = 3, .pkts_out = 3, .pkts_claim = 0, .pkts_schedule = 1}, - [PACKET_STAGE_OUTPUT] = {.pkts_in = 4, .pkts_out = 4, .pkts_claim = 0, .pkts_schedule = 1}, - [PACKET_STAGE_POSTROUTING] = {.pkts_in = 5, .pkts_out = 5, .pkts_claim = 0, .pkts_schedule = 1}, - [PACKET_STAGE_MAX] = {.pkts_in = 5, .pkts_out = 5, .pkts_claim = 0, .pkts_schedule = 0}, + [PACKET_STAGE_PREROUTING] = {.pkts_in = 1, .pkts_out = 1, .pkts_claim = 0, .pkts_schedule = 0, .pkts_drop = 0, .pkts_dup_succ = 0, .pkts_dup_fail = 0, .pkts_build_tcp_succ = 0, .pkts_build_tcp_fail = 0, .pkts_build_udp_succ = 0, .pkts_build_udp_fail = 0, .pkts_build_l3_succ = 0, .pkts_build_l3_fail = 0}, + [PACKET_STAGE_INPUT] = {.pkts_in = 2, .pkts_out = 2, .pkts_claim = 0, .pkts_schedule = 1, .pkts_drop = 0, .pkts_dup_succ = 0, .pkts_dup_fail = 0, .pkts_build_tcp_succ = 0, .pkts_build_tcp_fail = 0, .pkts_build_udp_succ = 0, .pkts_build_udp_fail = 0, .pkts_build_l3_succ = 0, .pkts_build_l3_fail = 0}, + [PACKET_STAGE_FORWARD] = {.pkts_in = 3, .pkts_out = 3, .pkts_claim = 0, .pkts_schedule = 1, .pkts_drop = 0, .pkts_dup_succ = 0, .pkts_dup_fail = 0, .pkts_build_tcp_succ = 0, .pkts_build_tcp_fail = 0, .pkts_build_udp_succ = 0, .pkts_build_udp_fail = 0, .pkts_build_l3_succ = 0, .pkts_build_l3_fail = 0}, + [PACKET_STAGE_OUTPUT] = {.pkts_in = 4, .pkts_out = 4, .pkts_claim = 0, .pkts_schedule = 1, .pkts_drop = 0, .pkts_dup_succ = 0, .pkts_dup_fail = 0, .pkts_build_tcp_succ = 0, .pkts_build_tcp_fail = 0, .pkts_build_udp_succ = 0, .pkts_build_udp_fail = 0, .pkts_build_l3_succ = 0, .pkts_build_l3_fail = 0}, + [PACKET_STAGE_POSTROUTING] = {.pkts_in = 5, .pkts_out = 5, .pkts_claim = 0, .pkts_schedule = 1, .pkts_drop = 0, .pkts_dup_succ = 0, .pkts_dup_fail = 0, .pkts_build_tcp_succ = 0, .pkts_build_tcp_fail = 0, .pkts_build_udp_succ = 0, .pkts_build_udp_fail = 0, .pkts_build_l3_succ = 0, .pkts_build_l3_fail = 0}, + [PACKET_STAGE_MAX] = {.pkts_in = 5, .pkts_out = 5, .pkts_claim = 0, .pkts_schedule = 0, .pkts_drop = 0, .pkts_dup_succ = 0, .pkts_dup_fail = 0, .pkts_build_tcp_succ = 0, .pkts_build_tcp_fail = 0, .pkts_build_udp_succ = 0, .pkts_build_udp_fail = 0, .pkts_build_l3_succ = 0, .pkts_build_l3_fail = 0}, }, }; check_stat(curr_stat, &expect_stat); @@ -429,12 +518,12 @@ TEST(PACKET_MANAGER, SCHEDULE_CLAIMED_PACKET) .pkts_ingress = 1, .pkts_egress = 1, .queue = { - [PACKET_STAGE_PREROUTING] = {.pkts_in = 1, .pkts_out = 1, .pkts_claim = 1, .pkts_schedule = 0}, - [PACKET_STAGE_INPUT] = {.pkts_in = 0, .pkts_out = 0, .pkts_claim = 0, .pkts_schedule = 0}, - [PACKET_STAGE_FORWARD] = {.pkts_in = 0, .pkts_out = 0, .pkts_claim = 0, .pkts_schedule = 0}, - [PACKET_STAGE_OUTPUT] = {.pkts_in = 0, .pkts_out = 0, .pkts_claim = 0, .pkts_schedule = 0}, - [PACKET_STAGE_POSTROUTING] = {.pkts_in = 1, .pkts_out = 1, .pkts_claim = 0, .pkts_schedule = 1}, - [PACKET_STAGE_MAX] = {.pkts_in = 1, .pkts_out = 1, .pkts_claim = 0, .pkts_schedule = 0}, + [PACKET_STAGE_PREROUTING] = {.pkts_in = 1, .pkts_out = 1, .pkts_claim = 1, .pkts_schedule = 0, .pkts_drop = 0, .pkts_dup_succ = 0, .pkts_dup_fail = 0, .pkts_build_tcp_succ = 0, .pkts_build_tcp_fail = 0, .pkts_build_udp_succ = 0, .pkts_build_udp_fail = 0, .pkts_build_l3_succ = 0, .pkts_build_l3_fail = 0}, + [PACKET_STAGE_INPUT] = {.pkts_in = 0, .pkts_out = 0, .pkts_claim = 0, .pkts_schedule = 0, .pkts_drop = 0, .pkts_dup_succ = 0, .pkts_dup_fail = 0, .pkts_build_tcp_succ = 0, .pkts_build_tcp_fail = 0, .pkts_build_udp_succ = 0, .pkts_build_udp_fail = 0, .pkts_build_l3_succ = 0, .pkts_build_l3_fail = 0}, + [PACKET_STAGE_FORWARD] = {.pkts_in = 0, .pkts_out = 0, .pkts_claim = 0, .pkts_schedule = 0, .pkts_drop = 0, .pkts_dup_succ = 0, .pkts_dup_fail = 0, .pkts_build_tcp_succ = 0, .pkts_build_tcp_fail = 0, .pkts_build_udp_succ = 0, .pkts_build_udp_fail = 0, .pkts_build_l3_succ = 0, .pkts_build_l3_fail = 0}, + [PACKET_STAGE_OUTPUT] = {.pkts_in = 0, .pkts_out = 0, .pkts_claim = 0, .pkts_schedule = 0, .pkts_drop = 0, .pkts_dup_succ = 0, .pkts_dup_fail = 0, .pkts_build_tcp_succ = 0, .pkts_build_tcp_fail = 0, .pkts_build_udp_succ = 0, .pkts_build_udp_fail = 0, .pkts_build_l3_succ = 0, .pkts_build_l3_fail = 0}, + [PACKET_STAGE_POSTROUTING] = {.pkts_in = 1, .pkts_out = 1, .pkts_claim = 0, .pkts_schedule = 1, .pkts_drop = 0, .pkts_dup_succ = 0, .pkts_dup_fail = 0, .pkts_build_tcp_succ = 0, .pkts_build_tcp_fail = 0, .pkts_build_udp_succ = 0, .pkts_build_udp_fail = 0, .pkts_build_l3_succ = 0, .pkts_build_l3_fail = 0}, + [PACKET_STAGE_MAX] = {.pkts_in = 1, .pkts_out = 1, .pkts_claim = 0, .pkts_schedule = 0, .pkts_drop = 0, .pkts_dup_succ = 0, .pkts_dup_fail = 0, .pkts_build_tcp_succ = 0, .pkts_build_tcp_fail = 0, .pkts_build_udp_succ = 0, .pkts_build_udp_fail = 0, .pkts_build_l3_succ = 0, .pkts_build_l3_fail = 0}, }, }; check_stat(curr_stat, &expect_stat); diff --git a/infra/session_manager/session_manager.c b/infra/session_manager/session_manager.c index da6935b..e48efee 100644 --- a/infra/session_manager/session_manager.c +++ b/infra/session_manager/session_manager.c @@ -62,11 +62,11 @@ static void notify_sess_closed_by_pseudo_pkt(struct session_manager *sess_mgr, i if (session_get_first_packet(sess, FLOW_TYPE_C2S)) { - pseudo = packet_manager_dup_packet(pkt_mgr, session_get_first_packet(sess, FLOW_TYPE_C2S)); + pseudo = packet_manager_dup_packet(pkt_mgr, thread_id, session_get_first_packet(sess, FLOW_TYPE_C2S)); } else { - pseudo = packet_manager_dup_packet(pkt_mgr, session_get_first_packet(sess, FLOW_TYPE_S2C)); + pseudo = packet_manager_dup_packet(pkt_mgr, thread_id, session_get_first_packet(sess, FLOW_TYPE_S2C)); } assert(pseudo); diff --git a/infra/stellar_core.c b/infra/stellar_core.c index 6272241..362dfda 100644 --- a/infra/stellar_core.c +++ b/infra/stellar_core.c @@ -76,14 +76,7 @@ static void *worker_thread(void *arg) packet_manager_dispatch(pkt_mgr, thread_id); while ((pkt = packet_manager_egress(pkt_mgr, thread_id))) { - if (packet_get_action(pkt) == PACKET_ACTION_DROP) - { - packet_io_drop(pkt_io, thread_id, &pkt, 1); - } - else - { - packet_io_send(pkt_io, thread_id, &pkt, 1); - } + packet_io_send(pkt_io, thread_id, &pkt, 1); } packet_io_clean(pkt_io, thread_id);