2024-09-13 18:03:05 +08:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
|
extern "C"
|
|
|
|
|
{
|
|
|
|
|
#endif
|
|
|
|
|
|
2024-09-20 16:56:05 +08:00
|
|
|
#include "stellar/mq.h"
|
2024-10-25 13:19:58 +08:00
|
|
|
#include "stellar/packet.h"
|
2024-09-13 18:03:05 +08:00
|
|
|
|
2024-10-23 10:01:20 +08:00
|
|
|
#define PACKET_QUEUE_MAX (PACKET_STAGE_MAX + 1)
|
|
|
|
|
|
|
|
|
|
struct packet_manager_stat
|
|
|
|
|
{
|
2024-10-31 18:26:21 +08:00
|
|
|
uint64_t pkts_ingress;
|
|
|
|
|
uint64_t pkts_egress;
|
2024-10-23 10:01:20 +08:00
|
|
|
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
|
|
|
|
|
};
|
|
|
|
|
|
2024-10-31 18:26:21 +08:00
|
|
|
// 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)
|
|
|
|
|
|
|
|
|
|
enum pkt_mgr_stat_type
|
|
|
|
|
{
|
|
|
|
|
#define XX(type, name, val) type,
|
|
|
|
|
PKT_MGR_STAT_MAP(XX)
|
|
|
|
|
#undef XX
|
|
|
|
|
PKT_MGR_STAT_MAX
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
__attribute__((unused)) static const char pkt_mgr_stat_str[PKT_MGR_STAT_MAX][64] =
|
|
|
|
|
{
|
|
|
|
|
#define XX(type, name, val) #name,
|
|
|
|
|
PKT_MGR_STAT_MAP(XX)
|
|
|
|
|
#undef XX
|
|
|
|
|
};
|
|
|
|
|
|
2024-10-23 10:10:20 +08:00
|
|
|
struct packet_manager *packet_manager_new(struct mq_schema *mq_schema, uint16_t thread_num);
|
2024-09-19 17:26:34 +08:00
|
|
|
void packet_manager_free(struct packet_manager *pkt_mgr);
|
|
|
|
|
|
2024-10-31 18:26:21 +08:00
|
|
|
int packet_manager_init(struct packet_manager *pkt_mgr, uint16_t thread_id, struct mq_runtime *mq_rte);
|
2024-10-23 10:10:20 +08:00
|
|
|
void packet_manager_clean(struct packet_manager *pkt_mgr, uint16_t thread_id);
|
2024-09-19 17:26:34 +08:00
|
|
|
void packet_manager_ingress(struct packet_manager *pkt_mgr, uint16_t thread_id, struct packet *pkt);
|
|
|
|
|
struct packet *packet_manager_egress(struct packet_manager *pkt_mgr, uint16_t thread_id);
|
|
|
|
|
void packet_manager_dispatch(struct packet_manager *pkt_mgr, uint16_t thread_id);
|
|
|
|
|
struct packet_manager_stat *packet_manager_get_stat(struct packet_manager *pkt_mgr, uint16_t thread_id);
|
|
|
|
|
void packet_manager_print_stat(struct packet_manager *pkt_mgr, uint16_t thread_id);
|
|
|
|
|
|
2024-10-23 10:01:20 +08:00
|
|
|
const char *packet_stage_to_str(enum packet_stage stage);
|
|
|
|
|
|
2024-10-31 18:26:21 +08:00
|
|
|
uint64_t packet_manager_stat_get(struct packet_manager_stat *stat, enum pkt_mgr_stat_type type);
|
|
|
|
|
|
2024-09-13 18:03:05 +08:00
|
|
|
#ifdef __cplusplus
|
|
|
|
|
}
|
|
|
|
|
#endif
|