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