#pragma once #ifdef __cplusplus extern "C" { #endif #include #include "log_internal.h" #include "stellar/mq.h" #include "stellar/packet_manager.h" #define PACKET_MANAGER_LOG_ERROR(format, ...) STELLAR_LOG_ERROR(__thread_local_logger, "packet manager", format, ##__VA_ARGS__) #define PACKET_MANAGER_LOG_DEBUG(format, ...) STELLAR_LOG_DEBUG(__thread_local_logger, "packet manager", format, ##__VA_ARGS__) #define PACKET_MANAGER_LOG_FATAL(format, ...) STELLAR_LOG_FATAL(__thread_local_logger, "packet manager", format, ##__VA_ARGS__) #define PACKET_MANAGER_LOG_INFO(format, ...) STELLAR_LOG_INFO(__thread_local_logger, "packet manager", format, ##__VA_ARGS__) #define PACKET_QUEUE_MAX (PACKET_STAGE_MAX + 1) TAILQ_HEAD(packet_queue, packet); struct packet_manager_stat { struct { uint64_t pkts_ingress; uint64_t pkts_egress; } total; struct { uint64_t pkts_in; // include the packets that are scheduled uint64_t pkts_out; // include the packets that are claimed uint64_t pkts_claim; uint64_t pkts_schedule; } queue[PACKET_QUEUE_MAX]; // the last queue is for sending packets }; struct packet_manager_runtime { enum packet_stage stage; struct packet_queue queue[PACKET_QUEUE_MAX]; void *cb_args; on_packet_claimed_callback *claimed_cb; struct mq_runtime *mq; struct packet_manager_stat stat; }; struct packet_manager_runtime *packet_manager_runtime_new(); void packet_manager_runtime_free(struct packet_manager_runtime *pkt_mgr_rt); void packet_manager_runtime_init(struct packet_manager_runtime *pkt_mgr_rt, struct mq_runtime *mq_rt); void packet_manager_runtime_ingress(struct packet_manager_runtime *pkt_mgr_rt, struct packet *pkt); struct packet *packet_manager_runtime_egress(struct packet_manager_runtime *pkt_mgr_rt); void packet_manager_runtime_dispatch(struct packet_manager_runtime *pkt_mgr_rt); int packet_manager_runtime_claim_packet(struct packet_manager_runtime *pkt_mgr_rt, struct packet *pkt, on_packet_claimed_callback cb, void *args); void packet_manager_runtime_schedule_packet(struct packet_manager_runtime *pkt_mgr_rt, struct packet *pkt, enum packet_stage stage); struct packet_manager_stat *packet_manager_runtime_get_stat(struct packet_manager_runtime *pkt_mgr_rt); void packet_manager_runtime_print_stat(struct packet_manager_runtime *pkt_mgr_rt); const char *packet_stage_to_str(enum packet_stage stage); #ifdef __cplusplus } #endif