examples/ipsec-secgw: move global array from header
[dpdk.git] / examples / ipsec-secgw / ipsec-secgw.h
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright (C) 2020 Marvell International Ltd.
3  */
4 #ifndef _IPSEC_SECGW_H_
5 #define _IPSEC_SECGW_H_
6
7 #include <stdbool.h>
8
9 #ifndef STATS_INTERVAL
10 #define STATS_INTERVAL 0
11 #endif
12
13 #define NB_SOCKETS 4
14
15 #define MAX_PKT_BURST 32
16
17 #define RTE_LOGTYPE_IPSEC RTE_LOGTYPE_USER1
18
19 #if RTE_BYTE_ORDER != RTE_LITTLE_ENDIAN
20 #define __BYTES_TO_UINT64(a, b, c, d, e, f, g, h) \
21         (((uint64_t)((a) & 0xff) << 56) | \
22         ((uint64_t)((b) & 0xff) << 48) | \
23         ((uint64_t)((c) & 0xff) << 40) | \
24         ((uint64_t)((d) & 0xff) << 32) | \
25         ((uint64_t)((e) & 0xff) << 24) | \
26         ((uint64_t)((f) & 0xff) << 16) | \
27         ((uint64_t)((g) & 0xff) << 8)  | \
28         ((uint64_t)(h) & 0xff))
29 #else
30 #define __BYTES_TO_UINT64(a, b, c, d, e, f, g, h) \
31         (((uint64_t)((h) & 0xff) << 56) | \
32         ((uint64_t)((g) & 0xff) << 48) | \
33         ((uint64_t)((f) & 0xff) << 40) | \
34         ((uint64_t)((e) & 0xff) << 32) | \
35         ((uint64_t)((d) & 0xff) << 24) | \
36         ((uint64_t)((c) & 0xff) << 16) | \
37         ((uint64_t)((b) & 0xff) << 8) | \
38         ((uint64_t)(a) & 0xff))
39 #endif
40
41 #define uint32_t_to_char(ip, a, b, c, d) do {\
42                 *a = (uint8_t)(ip >> 24 & 0xff);\
43                 *b = (uint8_t)(ip >> 16 & 0xff);\
44                 *c = (uint8_t)(ip >> 8 & 0xff);\
45                 *d = (uint8_t)(ip & 0xff);\
46         } while (0)
47
48 #define ETHADDR(a, b, c, d, e, f) (__BYTES_TO_UINT64(a, b, c, d, e, f, 0, 0))
49
50 #define IPSEC_NAT_T_PORT 4500
51 #define MBUF_PTYPE_TUNNEL_ESP_IN_UDP (RTE_PTYPE_TUNNEL_ESP | RTE_PTYPE_L4_UDP)
52
53 struct traffic_type {
54         const uint8_t *data[MAX_PKT_BURST * 2];
55         struct rte_mbuf *pkts[MAX_PKT_BURST * 2];
56         void *saptr[MAX_PKT_BURST * 2];
57         uint32_t res[MAX_PKT_BURST * 2];
58         uint32_t num;
59 };
60
61 struct ipsec_traffic {
62         struct traffic_type ipsec;
63         struct traffic_type ip4;
64         struct traffic_type ip6;
65 };
66
67 /* Fields optimized for devices without burst */
68 struct traffic_type_nb {
69         const uint8_t *data;
70         struct rte_mbuf *pkt;
71         uint32_t res;
72         uint32_t num;
73 };
74
75 struct ipsec_traffic_nb {
76         struct traffic_type_nb ipsec;
77         struct traffic_type_nb ip4;
78         struct traffic_type_nb ip6;
79 };
80
81 /* port/source ethernet addr and destination ethernet addr */
82 struct ethaddr_info {
83         uint64_t src, dst;
84 };
85
86 #if (STATS_INTERVAL > 0)
87 struct ipsec_core_statistics {
88         uint64_t tx;
89         uint64_t rx;
90         uint64_t rx_call;
91         uint64_t tx_call;
92         uint64_t dropped;
93         uint64_t burst_rx;
94 } __rte_cache_aligned;
95
96 extern struct ipsec_core_statistics core_statistics[RTE_MAX_LCORE];
97 #endif /* STATS_INTERVAL */
98
99 extern struct ethaddr_info ethaddr_tbl[RTE_MAX_ETHPORTS];
100
101 /* Port mask to identify the unprotected ports */
102 extern uint32_t unprotected_port_mask;
103
104 /* Index of SA in single mode */
105 extern uint32_t single_sa_idx;
106
107 extern volatile bool force_quit;
108
109 static inline uint8_t
110 is_unprotected_port(uint16_t port_id)
111 {
112         return unprotected_port_mask & (1 << port_id);
113 }
114
115 static inline void
116 core_stats_update_rx(int n)
117 {
118 #if (STATS_INTERVAL > 0)
119         int lcore_id = rte_lcore_id();
120         core_statistics[lcore_id].rx += n;
121         core_statistics[lcore_id].rx_call++;
122         if (n == MAX_PKT_BURST)
123                 core_statistics[lcore_id].burst_rx += n;
124 #else
125         RTE_SET_USED(n);
126 #endif /* STATS_INTERVAL */
127 }
128
129 static inline void
130 core_stats_update_tx(int n)
131 {
132 #if (STATS_INTERVAL > 0)
133         int lcore_id = rte_lcore_id();
134         core_statistics[lcore_id].tx += n;
135         core_statistics[lcore_id].tx_call++;
136 #else
137         RTE_SET_USED(n);
138 #endif /* STATS_INTERVAL */
139 }
140
141 static inline void
142 core_stats_update_drop(int n)
143 {
144 #if (STATS_INTERVAL > 0)
145         int lcore_id = rte_lcore_id();
146         core_statistics[lcore_id].dropped += n;
147 #else
148         RTE_SET_USED(n);
149 #endif /* STATS_INTERVAL */
150 }
151
152 /* helper routine to free bulk of packets */
153 static inline void
154 free_pkts(struct rte_mbuf *mb[], uint32_t n)
155 {
156         uint32_t i;
157
158         for (i = 0; i != n; i++)
159                 rte_pktmbuf_free(mb[i]);
160
161         core_stats_update_drop(n);
162 }
163
164 #endif /* _IPSEC_SECGW_H_ */