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 107 is_unprotected_port(uint16_t port_id) 108 { 109 return unprotected_port_mask & (1 << port_id); 110 } 111 112 static inline void 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 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 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 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