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 struct traffic_type {
51 const uint8_t *data[MAX_PKT_BURST * 2];
52 struct rte_mbuf *pkts[MAX_PKT_BURST * 2];
53 void *saptr[MAX_PKT_BURST * 2];
54 uint32_t res[MAX_PKT_BURST * 2];
55 uint32_t num;
56 };
57
58 struct ipsec_traffic {
59 struct traffic_type ipsec;
60 struct traffic_type ip4;
61 struct traffic_type ip6;
62 };
63
64 /* Fields optimized for devices without burst */
65 struct traffic_type_nb {
66 const uint8_t *data;
67 struct rte_mbuf *pkt;
68 uint32_t res;
69 uint32_t num;
70 };
71
72 struct ipsec_traffic_nb {
73 struct traffic_type_nb ipsec;
74 struct traffic_type_nb ip4;
75 struct traffic_type_nb ip6;
76 };
77
78 /* port/source ethernet addr and destination ethernet addr */
79 struct ethaddr_info {
80 uint64_t src, dst;
81 };
82
83 #if (STATS_INTERVAL > 0)
84 struct ipsec_core_statistics {
85 uint64_t tx;
86 uint64_t rx;
87 uint64_t rx_call;
88 uint64_t tx_call;
89 uint64_t dropped;
90 uint64_t burst_rx;
91 } __rte_cache_aligned;
92
93 struct ipsec_core_statistics core_statistics[RTE_MAX_LCORE];
94 #endif /* STATS_INTERVAL */
95
96 extern struct ethaddr_info ethaddr_tbl[RTE_MAX_ETHPORTS];
97
98 /* Port mask to identify the unprotected ports */
99 extern uint32_t unprotected_port_mask;
100
101 /* Index of SA in single mode */
102 extern uint32_t single_sa_idx;
103
104 extern volatile bool force_quit;
105
106 static inline uint8_t
is_unprotected_port(uint16_t port_id)107 is_unprotected_port(uint16_t port_id)
108 {
109 return unprotected_port_mask & (1 << port_id);
110 }
111
112 static inline void
core_stats_update_rx(int n)113 core_stats_update_rx(int n)
114 {
115 #if (STATS_INTERVAL > 0)
116 int lcore_id = rte_lcore_id();
117 core_statistics[lcore_id].rx += n;
118 core_statistics[lcore_id].rx_call++;
119 if (n == MAX_PKT_BURST)
120 core_statistics[lcore_id].burst_rx += n;
121 #else
122 RTE_SET_USED(n);
123 #endif /* STATS_INTERVAL */
124 }
125
126 static inline void
core_stats_update_tx(int n)127 core_stats_update_tx(int n)
128 {
129 #if (STATS_INTERVAL > 0)
130 int lcore_id = rte_lcore_id();
131 core_statistics[lcore_id].tx += n;
132 core_statistics[lcore_id].tx_call++;
133 #else
134 RTE_SET_USED(n);
135 #endif /* STATS_INTERVAL */
136 }
137
138 static inline void
core_stats_update_drop(int n)139 core_stats_update_drop(int n)
140 {
141 #if (STATS_INTERVAL > 0)
142 int lcore_id = rte_lcore_id();
143 core_statistics[lcore_id].dropped += n;
144 #else
145 RTE_SET_USED(n);
146 #endif /* STATS_INTERVAL */
147 }
148
149 /* helper routine to free bulk of packets */
150 static inline void
free_pkts(struct rte_mbuf * mb[],uint32_t n)151 free_pkts(struct rte_mbuf *mb[], uint32_t n)
152 {
153 uint32_t i;
154
155 for (i = 0; i != n; i++)
156 rte_pktmbuf_free(mb[i]);
157
158 core_stats_update_drop(n);
159 }
160
161 #endif /* _IPSEC_SECGW_H_ */
162