1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright (C) 2020 Marvell International Ltd.
4 #ifndef _IPSEC_SECGW_H_
5 #define _IPSEC_SECGW_H_
12 #define MAX_PKT_BURST 32
14 #define RTE_LOGTYPE_IPSEC RTE_LOGTYPE_USER1
16 #if RTE_BYTE_ORDER != RTE_LITTLE_ENDIAN
17 #define __BYTES_TO_UINT64(a, b, c, d, e, f, g, h) \
18 (((uint64_t)((a) & 0xff) << 56) | \
19 ((uint64_t)((b) & 0xff) << 48) | \
20 ((uint64_t)((c) & 0xff) << 40) | \
21 ((uint64_t)((d) & 0xff) << 32) | \
22 ((uint64_t)((e) & 0xff) << 24) | \
23 ((uint64_t)((f) & 0xff) << 16) | \
24 ((uint64_t)((g) & 0xff) << 8) | \
25 ((uint64_t)(h) & 0xff))
27 #define __BYTES_TO_UINT64(a, b, c, d, e, f, g, h) \
28 (((uint64_t)((h) & 0xff) << 56) | \
29 ((uint64_t)((g) & 0xff) << 48) | \
30 ((uint64_t)((f) & 0xff) << 40) | \
31 ((uint64_t)((e) & 0xff) << 32) | \
32 ((uint64_t)((d) & 0xff) << 24) | \
33 ((uint64_t)((c) & 0xff) << 16) | \
34 ((uint64_t)((b) & 0xff) << 8) | \
35 ((uint64_t)(a) & 0xff))
38 #define uint32_t_to_char(ip, a, b, c, d) do {\
39 *a = (uint8_t)(ip >> 24 & 0xff);\
40 *b = (uint8_t)(ip >> 16 & 0xff);\
41 *c = (uint8_t)(ip >> 8 & 0xff);\
42 *d = (uint8_t)(ip & 0xff);\
45 #define ETHADDR(a, b, c, d, e, f) (__BYTES_TO_UINT64(a, b, c, d, e, f, 0, 0))
47 #define IPSEC_NAT_T_PORT 4500
48 #define MBUF_PTYPE_TUNNEL_ESP_IN_UDP (RTE_PTYPE_TUNNEL_ESP | RTE_PTYPE_L4_UDP)
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];
58 struct ipsec_traffic {
59 struct traffic_type ipsec;
60 struct traffic_type ip4;
61 struct traffic_type ip6;
64 /* Fields optimized for devices without burst */
65 struct traffic_type_nb {
72 struct ipsec_traffic_nb {
73 struct traffic_type_nb ipsec;
74 struct traffic_type_nb ip4;
75 struct traffic_type_nb ip6;
78 /* port/source ethernet addr and destination ethernet addr */
83 struct ipsec_spd_stats {
89 struct ipsec_sa_stats {
94 struct ipsec_core_statistics {
103 struct ipsec_spd_stats spd4;
104 struct ipsec_spd_stats spd6;
105 struct ipsec_sa_stats sad;
109 struct ipsec_spd_stats spd4;
110 struct ipsec_spd_stats spd6;
111 struct ipsec_sa_stats sad;
121 } __rte_cache_aligned;
123 extern struct ipsec_core_statistics core_statistics[RTE_MAX_LCORE];
125 extern struct ethaddr_info ethaddr_tbl[RTE_MAX_ETHPORTS];
127 /* Port mask to identify the unprotected ports */
128 extern uint32_t unprotected_port_mask;
130 /* Index of SA in single mode */
131 extern uint32_t single_sa_idx;
133 extern volatile bool force_quit;
135 extern uint32_t nb_bufs_in_pool;
137 static inline uint8_t
138 is_unprotected_port(uint16_t port_id)
140 return unprotected_port_mask & (1 << port_id);
144 core_stats_update_rx(int n)
146 int lcore_id = rte_lcore_id();
147 core_statistics[lcore_id].rx += n;
148 core_statistics[lcore_id].rx_call++;
149 if (n == MAX_PKT_BURST)
150 core_statistics[lcore_id].burst_rx += n;
154 core_stats_update_tx(int n)
156 int lcore_id = rte_lcore_id();
157 core_statistics[lcore_id].tx += n;
158 core_statistics[lcore_id].tx_call++;
162 core_stats_update_drop(int n)
164 int lcore_id = rte_lcore_id();
165 core_statistics[lcore_id].dropped += n;
168 /* helper routine to free bulk of packets */
170 free_pkts(struct rte_mbuf *mb[], uint32_t n)
174 for (i = 0; i != n; i++)
175 rte_pktmbuf_free(mb[i]);
177 core_stats_update_drop(n);
180 #endif /* _IPSEC_SECGW_H_ */