summaryrefslogtreecommitdiff
path: root/infra/packet_manager/packet_manager.h
blob: 61d5f04e03ea178084cd1e536f865b2eb5d7e805 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#pragma once

#ifdef __cplusplus
extern "C"
{
#endif

#include "stellar/mq.h"
#include "stellar/packet.h"

#define PACKET_QUEUE_MAX (PACKET_STAGE_MAX + 1)

struct packet_manager_stat
{
    uint64_t pkts_ingress;
    uint64_t pkts_egress;
    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
};

// 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
};

struct packet_manager *packet_manager_new(struct mq_schema *mq_schema, uint16_t thread_num);
void packet_manager_free(struct packet_manager *pkt_mgr);

int packet_manager_init(struct packet_manager *pkt_mgr, uint16_t thread_id, struct mq_runtime *mq_rte);
void packet_manager_clean(struct packet_manager *pkt_mgr, uint16_t thread_id);
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);

const char *packet_stage_to_str(enum packet_stage stage);

uint64_t packet_manager_stat_get(struct packet_manager_stat *stat, enum pkt_mgr_stat_type type);

#ifdef __cplusplus
}
#endif