28 #include <rte_ethdev.h>
48 #define DEFAULT_NB_CORES 4
49 #define PACKET_BURST 32
50 #define NB_TX_BURST_TRIES 5
51 #define MIN_ENTRIES_PER_CORE 1024
52 #define MAC_ADDRESS_SIZE 6
67 "Trailer length exceeded ESP payload",
68 "Replay protection failed",
69 "IPsec offload context reached its hard lifetime threshold"};
78 if (signum == SIGINT || signum == SIGTERM) {
79 DOCA_LOG_INFO(
"Signal %d received, preparing to exit", signum);
144 char ipinput[INET6_ADDRSTRLEN];
149 DOCA_LOG_INFO(
"Got bad syndrome: %s, number of hits since last dump: %ld",
164 bool changed =
false;
191 bool changed =
false;
212 uint64_t start_time, end_time;
214 double cycle_time = 5;
215 uint64_t max_timeout = 4000000;
216 uint32_t max_resources =
ctx->config->app_rules.nb_decrypt_rules +
ctx->config->app_rules.nb_encrypt_rules;
219 start_time = rte_get_timer_cycles();
221 if (
ctx->config->debug_mode) {
224 for (i = 0; i <
ctx->config->app_rules.nb_decrypt_rules; i++)
227 end_time = rte_get_timer_cycles();
228 delta = (end_time - start_time) / rte_get_timer_hz();
229 if (delta < cycle_time)
230 sleep(cycle_time - delta);
259 struct rte_mbuf **packets,
261 uint16_t *nb_processed_packets,
262 struct rte_mbuf **processed_packets,
263 struct rte_mbuf **unprocessed_packets)
265 uint32_t current_packet;
268 int unprocessed_packets_idx = 0;
271 *nb_processed_packets = 0;
273 for (current_packet = 0; current_packet < nb_packets; current_packet++) {
275 pkt_meta = *RTE_FLOW_DYNF_METADATA(packets[current_packet]);
291 processed_packets[(*nb_processed_packets)++] = packets[current_packet];
295 unprocessed_packets[unprocessed_packets_idx++] = packets[current_packet];
307 uint16_t nb_packets_received;
308 uint16_t nb_processed_packets = 0;
309 uint16_t nb_packets_to_drop;
316 uint16_t
nb_ports =
ctx->config->dpdk_config->port_config.nb_ports;
319 DOCA_LOG_DBG(
"Core %u is receiving packets", rte_lcore_id());
321 for (port_id = 0; port_id <
nb_ports; port_id++) {
322 nb_packets_received = rte_eth_rx_burst(port_id,
ctx->queue_id, packets,
PACKET_BURST);
323 if (nb_packets_received) {
324 DOCA_LOG_TRC(
"Received %d packets from port %d on core %u",
332 &nb_processed_packets,
337 tx_port = port_id ^ 1;
342 nb_pkts += rte_eth_tx_burst(tx_port,
344 processed_packets + nb_pkts,
345 nb_processed_packets - nb_pkts);
347 }
while (nb_processed_packets > nb_pkts && num_of_tries > 0);
348 if (nb_processed_packets > nb_pkts)
350 "%d packets were dropped during the transmission to the next port",
351 (nb_processed_packets - nb_pkts));
352 nb_packets_to_drop = nb_packets_received - nb_processed_packets;
353 if (nb_packets_to_drop > 0) {
354 DOCA_LOG_WARN(
"%d packets were dropped during the processing",
356 rte_pktmbuf_free_bulk(packets_to_drop, nb_packets_to_drop);
374 uint16_t lcore_index = 0;
375 int current_lcore = 0;
378 current_lcore = rte_get_next_lcore(current_lcore,
true,
false);
385 ctx->queue_id = lcore_index;
410 uint16_t lcore_index = 0;
411 int current_lcore = 0;
415 while ((current_lcore < RTE_MAX_LCORE) && (lcore_index < nb_queues)) {
416 current_lcore = rte_get_next_lcore(current_lcore,
true,
false);
423 ctx->queue_id = lcore_index;
431 if (lcore_index == 0) {
502 size_t bytes_received = 0;
505 ret = recv(fd, buf + bytes_received, bytes_to_read - bytes_received, 0);
507 if (errno == EWOULDBLOCK || errno == EAGAIN)
510 DOCA_LOG_ERR(
"Failed to read from socket buffer [%s]", strerror(errno));
516 bytes_received += ret;
517 }
while (bytes_received < bytes_to_read);
531 uint8_t buf[8] = {0};
532 uint8_t *ptr = &buf[0];
533 uint32_t policy_length;
542 DOCA_LOG_ERR(
"Wrong policy length [%u], should be [%u] or [%u]",
563 uint8_t buffer[1024] = {0};
564 uint32_t policy_length;
587 int encrypt_array_size)
605 int decrypt_array_size)
629 struct doca_flow_port *secured_port;
632 int encrypt_array_size, decrypt_array_size;
634 DOCA_LOG_INFO(
"Waiting for traffic, press Ctrl+C for termination");
637 app_cfg->app_rules.nb_encrypt_rules;
639 app_cfg->app_rules.nb_decrypt_rules;
640 if (
app_cfg->sw_sn_inc_enable) {
649 DOCA_LOG_ERR(
"Failed to process packets on all lcores");
666 if (!
app_cfg->socket_ctx.socket_conf) {
671 memset(&policy, 0,
sizeof(policy));
688 DOCA_LOG_ERR(
"Can't receive more encryption policies, maximum size is [%d]",
694 if ((
app_cfg->app_rules.nb_encrypt_rules != 0) &&
696 DOCA_LOG_DBG(
"Reallocating memory for new encryption rules");
697 app_cfg->app_rules.encrypt_rules =
698 realloc(
app_cfg->app_rules.encrypt_rules,
702 DOCA_LOG_ERR(
"Failed to allocate memory for new encryption rule");
707 if (
app_cfg->sw_sn_inc_enable) {
709 app_cfg->app_rules.encrypt_rules +
710 app_cfg->app_rules.nb_encrypt_rules,
715 enc_rule = &
app_cfg->app_rules.encrypt_rules[
app_cfg->app_rules.nb_encrypt_rules];
723 DOCA_LOG_ERR(
"Can't receive more decryption policies, maximum size is [%d]",
729 if ((
app_cfg->app_rules.nb_decrypt_rules != 0) &&
731 app_cfg->app_rules.decrypt_rules =
732 realloc(
app_cfg->app_rules.decrypt_rules,
736 DOCA_LOG_ERR(
"Failed to allocate memory for new decryption rule");
742 app_cfg->app_rules.decrypt_rules +
743 app_cfg->app_rules.nb_decrypt_rules,
748 dec_rule = &
app_cfg->app_rules.decrypt_rules[
app_cfg->app_rules.nb_decrypt_rules];
760 rte_eal_mp_wait_lcore();
762 if (
app_cfg->socket_ctx.socket_conf) {
764 close(
app_cfg->socket_ctx.connfd);
768 unlink(
app_cfg->socket_ctx.socket_path);
781 struct sockaddr_un
addr;
782 int fd, connfd = -1, flags;
786 addr.sun_family = AF_UNIX;
791 fd = socket(AF_UNIX, SOCK_STREAM, 0);
793 DOCA_LOG_ERR(
"Failed to create new socket [%s]", strerror(errno));
798 flags = fcntl(fd, F_GETFL, 0);
799 if (fcntl(fd, F_SETFL, flags | O_NONBLOCK) == -1) {
800 DOCA_LOG_ERR(
"Failed to set socket as non blocking [%s]", strerror(errno));
806 if (bind(fd, (
struct sockaddr *)&
addr,
sizeof(
addr)) == -1) {
807 DOCA_LOG_ERR(
"Failed to bind the socket with the file path [%s]", strerror(errno));
813 if (listen(fd, 5) == -1) {
814 DOCA_LOG_ERR(
"Failed to listen for incoming connection [%s]", strerror(errno));
819 DOCA_LOG_DBG(
"Waiting for establishing new connection");
825 if (errno == EWOULDBLOCK || errno == EAGAIN) {
831 DOCA_LOG_ERR(
"Failed to accept incoming connection [%s]", strerror(errno));
842 flags = fcntl(connfd, F_GETFL, 0);
843 if (fcntl(connfd, F_SETFL, flags | O_NONBLOCK) == -1) {
844 DOCA_LOG_ERR(
"Failed to set connection socket as non blocking [%s]", strerror(errno));
849 app_cfg->socket_ctx.connfd = connfd;
856 unlink(
app_cfg->socket_ctx.socket_path);
870 DOCA_LOG_DBG(
"Core %d is inserting on queue %d: %d encryption rules and %d decryption rules",
873 ctx->nb_encrypt_rules,
874 ctx->nb_decrypt_rules);
875 if (
ctx->nb_encrypt_rules > 0) {
879 ctx->nb_encrypt_rules,
880 ctx->encrypt_rule_offset);
887 if (
ctx->nb_decrypt_rules > 0) {
891 ctx->nb_decrypt_rules,
892 ctx->decrypt_rule_offset);
925 uint16_t lcore_index;
926 int current_lcore = 0;
928 float encrypt_ratio, decrypt_ratio;
929 int next_encrypt_rule_offset = 0, next_decrypt_rule_offset = 0;
930 double start_time, end_time, total_time;
931 double rules_per_sec;
934 if (nb_queues < 1 || RTE_MAX_LCORE < nb_queues) {
939 if (
app_cfg->app_rules.nb_encrypt_rules == 0 &&
app_cfg->app_rules.nb_decrypt_rules == 0) {
946 nb_queues = RTE_MIN(nb_queues,
951 DOCA_LOG_DBG(
"Running multi-thread insertion on %d queues", nb_queues);
958 encrypt_ratio = (float)
app_cfg->app_rules.nb_encrypt_rules / nb_queues;
959 decrypt_ratio = (
float)
app_cfg->app_rules.nb_decrypt_rules / nb_queues;
961 if (insertion_rate_print)
962 start_time = rte_get_timer_cycles();
963 for (lcore_index = 0; lcore_index < nb_queues; lcore_index++) {
964 current_lcore = rte_get_next_lcore(current_lcore,
true,
false);
965 if (current_lcore == RTE_MAX_LCORE) {
966 DOCA_LOG_ERR(
"Not enough cores to run multi-thread insertion");
970 ctx = ctxs + lcore_index;
974 ctx->queue_id = lcore_index;
975 if (encrypt_ratio < 1) {
976 ctx->nb_encrypt_rules = lcore_index <
app_cfg->app_rules.nb_encrypt_rules ? 1 : 0;
977 ctx->encrypt_rule_offset = lcore_index;
979 ctx->encrypt_rule_offset = next_encrypt_rule_offset;
980 next_encrypt_rule_offset = (lcore_index != (nb_queues - 1)) ?
981 (int)((lcore_index + 1) * encrypt_ratio) :
982 app_cfg->app_rules.nb_encrypt_rules;
983 ctx->nb_encrypt_rules = next_encrypt_rule_offset -
ctx->encrypt_rule_offset;
985 if (decrypt_ratio < 1) {
986 ctx->nb_decrypt_rules = lcore_index <
app_cfg->app_rules.nb_decrypt_rules ? 1 : 0;
987 ctx->decrypt_rule_offset = lcore_index;
989 ctx->decrypt_rule_offset = next_decrypt_rule_offset;
990 next_decrypt_rule_offset = (lcore_index != (nb_queues - 1)) ?
991 (int)((lcore_index + 1) * decrypt_ratio) :
992 app_cfg->app_rules.nb_decrypt_rules;
993 ctx->nb_decrypt_rules = next_decrypt_rule_offset -
ctx->decrypt_rule_offset;
1004 rte_eal_mp_wait_lcore();
1009 if (insertion_rate_print) {
1010 end_time = rte_get_timer_cycles();
1011 total_time = (end_time - start_time) / rte_get_timer_hz();
1014 if (insertion_rate_print) {
1015 DOCA_LOG_INFO(
"Total insertion time for %d encryption rules and %d decryption rules: %f",
1016 app_cfg->app_rules.nb_encrypt_rules,
1017 app_cfg->app_rules.nb_decrypt_rules,
1020 (
app_cfg->app_rules.nb_encrypt_rules +
app_cfg->app_rules.nb_decrypt_rules) / total_time;
1039 int exit_status = EXIT_SUCCESS;
1044 .port_config.nb_queues = 2,
1046 .port_config.nb_hairpin_q = 2,
1047 .port_config.enable_mbuf_metadata =
true,
1048 .port_config.isolated_mode =
true,
1049 .reserve_main_thread =
true,
1053 snprintf(pid_str,
sizeof(pid_str),
"pid_%d", getpid());
1054 char *eal_param[7] = {
"",
"-a",
"00:00.0",
"-l",
"",
"--file-prefix", pid_str};
1055 struct doca_log_backend *sdk_log;
1057 app_cfg.dpdk_config = &dpdk_config;
1063 return EXIT_FAILURE;
1068 return EXIT_FAILURE;
1071 return EXIT_FAILURE;
1081 return EXIT_FAILURE;
1087 return EXIT_FAILURE;
1094 return EXIT_FAILURE;
1097 snprintf(cores_str,
sizeof(cores_str),
"0-%d",
app_cfg.nb_cores - 1);
1098 eal_param[4] = cores_str;
1099 ret = rte_eal_init(7, eal_param);
1103 return EXIT_FAILURE;
1109 exit_status = EXIT_FAILURE;
1119 exit_status = EXIT_FAILURE;
1120 goto config_destroy;
1127 exit_status = EXIT_FAILURE;
1128 goto device_cleanup;
1134 exit_status = EXIT_FAILURE;
1142 DOCA_LOG_WARN(
"Failed to get mac address from DOCA device, setting mac address to default");
1147 DOCA_LOG_WARN(
"switch mode can not set real source mac, setting mac address to default");
1156 DOCA_LOG_WARN(
"Failed to get mac address from DOCA device, setting mac address to default");
1164 exit_status = EXIT_FAILURE;
1172 &
app_cfg.switch_pipes.rss_pipe.pipe);
1175 exit_status = EXIT_FAILURE;
1182 DOCA_LOG_ERR(
"Failed to bind encrypt and decrypt rules");
1183 exit_status = EXIT_FAILURE;
1190 exit_status = EXIT_FAILURE;
1198 exit_status = EXIT_FAILURE;
1206 exit_status = EXIT_FAILURE;
1213 exit_status = EXIT_FAILURE;
1221 exit_status = EXIT_FAILURE;
1226 if (!
app_cfg.socket_ctx.socket_conf) {
1230 exit_status = EXIT_FAILURE;
1234 app_cfg.app_rules.nb_encrypt_rules = 0;
1235 app_cfg.app_rules.nb_decrypt_rules = 0;
1239 exit_status = EXIT_FAILURE;
1246 DOCA_LOG_ERR(
"Error happened during waiting for new traffic");
1247 exit_status = EXIT_FAILURE;
1263 if (
app_cfg.app_rules.encrypt_rules)
1264 free(
app_cfg.app_rules.encrypt_rules);
1265 if (
app_cfg.app_rules.decrypt_rules)
1266 free(
app_cfg.app_rules.decrypt_rules);
void doca_flow_cleanup(int nb_ports, struct ipsec_security_gw_ports_map *ports[])
doca_error_t create_rss_pipe(struct ipsec_security_gw_config *app_cfg, struct doca_flow_port *port, uint16_t nb_queues, struct doca_flow_pipe **rss_pipe)
doca_error_t ipsec_security_gw_init_status(struct ipsec_security_gw_config *app_cfg, int nb_queues)
doca_error_t create_switch_ingress_root_pipes(struct ipsec_security_gw_ports_map *ports[], struct ipsec_security_gw_config *app_cfg)
void security_gateway_free_status_entries(struct ipsec_security_gw_config *app_cfg)
doca_error_t ipsec_security_gw_bind(struct ipsec_security_gw_ports_map *ports[], struct ipsec_security_gw_config *app_cfg)
void security_gateway_free_resources(struct ipsec_security_gw_config *app_cfg)
doca_error_t ipsec_security_gw_init_doca_flow(const struct ipsec_security_gw_config *app_cfg, int nb_queues, struct ipsec_security_gw_ports_map *ports[])
doca_error_t create_switch_egress_root_pipes(struct ipsec_security_gw_ports_map *ports[], struct ipsec_security_gw_config *app_cfg)
#define SET_MAC_ADDR(addr, a, b, c, d, e, f)
doca_error_t register_ipsec_security_gw_params(void)
doca_error_t ipsec_security_gw_parse_config(struct ipsec_security_gw_config *app_cfg)
doca_error_t dpdk_queues_and_ports_init(struct application_dpdk_config *app_dpdk_config)
void dpdk_queues_and_ports_fini(struct application_dpdk_config *app_dpdk_config)
doca_error_t ipsec_security_gw_insert_decrypt_rules(struct ipsec_security_gw_ports_map *ports[], struct ipsec_security_gw_config *app_cfg)
doca_error_t handle_secured_packets_received(struct rte_mbuf **packet, bool bad_syndrome_check, struct ipsec_security_gw_core_ctx *ctx)
doca_error_t add_decrypt_entries(struct ipsec_security_gw_config *app_cfg, struct ipsec_security_gw_ports_map *port, uint16_t queue_id, int nb_rules, int rule_offset)
doca_error_t ipsec_security_gw_create_encrypt_egress(struct ipsec_security_gw_ports_map *ports[], struct ipsec_security_gw_config *app_cfg)
doca_error_t ipsec_security_gw_insert_encrypt_rules(struct ipsec_security_gw_ports_map *ports[], struct ipsec_security_gw_config *app_cfg)
doca_error_t add_encrypt_entries(struct ipsec_security_gw_config *app_cfg, struct ipsec_security_gw_ports_map *ports[], uint16_t queue_id, int nb_rules, int rule_offset)
doca_error_t handle_unsecured_packets_received(struct rte_mbuf **packet, struct ipsec_security_gw_core_ctx *ctx)
static struct app_gpu_cfg app_cfg
DOCA_EXPERIMENTAL doca_error_t doca_argp_start(int argc, char **argv)
Parse incoming arguments (cmd line/json).
DOCA_EXPERIMENTAL doca_error_t doca_argp_init(const char *program_name, void *program_config)
Initialize the parser interface.
DOCA_EXPERIMENTAL doca_error_t doca_argp_destroy(void)
ARG Parser destroy.
DOCA_STABLE doca_error_t doca_devinfo_get_mac_addr(const struct doca_devinfo *devinfo, uint8_t *mac_addr, uint32_t size)
Get the MAC address of a DOCA devinfo.
DOCA_STABLE struct doca_devinfo * doca_dev_as_devinfo(const struct doca_dev *dev)
Get local device info from device. This should be useful when wanting to query information about devi...
enum doca_error doca_error_t
DOCA API return codes.
DOCA_STABLE const char * doca_error_get_descr(doca_error_t error)
Returns the description string of an error code.
@ DOCA_ERROR_INVALID_VALUE
DOCA_EXPERIMENTAL int doca_flow_crypto_ipsec_resource_handle(struct doca_flow_port *port, uint64_t quota, uint32_t max_processed_resources)
Handle ipsec resources.
DOCA_EXPERIMENTAL void doca_flow_tune_server_destroy(void)
Destroy the DOCA Flow Tune Server.
DOCA_STABLE struct doca_flow_port * doca_flow_port_switch_get(const struct doca_flow_port *port)
Get doca flow switch port.
DOCA_EXPERIMENTAL doca_error_t doca_flow_resource_query_entry(struct doca_flow_pipe_entry *entry, struct doca_flow_resource_query *query_stats)
Extract information about specific entry.
DOCA_EXPERIMENTAL doca_error_t doca_log_backend_create_standard(void)
Create default, non configurable backend for application messages.
#define DOCA_LOG_ERR(format,...)
Generates an ERROR application log message.
#define DOCA_LOG_WARN(format,...)
Generates a WARNING application log message.
#define DOCA_LOG_INFO(format,...)
Generates an INFO application log message.
#define DOCA_LOG_TRC(format,...)
Generates a TRACE application log message.
DOCA_EXPERIMENTAL doca_error_t doca_log_backend_create_with_file_sdk(FILE *fptr, struct doca_log_backend **backend)
Create a logging backend with a FILE* stream for SDK messages.
#define DOCA_LOG_DBG(format,...)
Generates a DEBUG application log message.
DOCA_EXPERIMENTAL doca_error_t doca_log_backend_set_sdk_level(struct doca_log_backend *backend, uint32_t level)
Set the log level limit for SDK logging backends.
doca_error_t ipsec_security_gw_init_devices(struct ipsec_security_gw_config *app_cfg)
doca_error_t ipsec_security_gw_close_devices(const struct ipsec_security_gw_config *app_cfg)
@ IPSEC_SECURITY_GW_FWD_SYNDROME_RSS
@ IPSEC_SECURITY_GW_SWITCH
@ IPSEC_SECURITY_GW_ESP_OFFLOAD_BOTH
#define DYN_RESERVED_RULES
@ IPSEC_SECURITY_GW_PERF_BOTH
@ IPSEC_SECURITY_GW_PERF_INSERTION_RATE
#define MAX_SOCKET_PATH_NAME
static bool query_pipe_info(struct security_gateway_pipe_info *pipe)
static void sw_handling_antireplay(struct ipsec_security_gw_config *app_cfg, struct decrypt_rule *decrypt_rules, int decrypt_array_size)
static char * syndrome_list[NUM_OF_SYNDROMES]
static void process_queue_packets(void *args)
static doca_error_t ipsec_security_gw_process_bad_packets(struct ipsec_security_gw_config *config, struct ipsec_security_gw_ports_map *ports[])
static doca_error_t ipsec_security_gw_wait_for_traffic(struct ipsec_security_gw_config *app_cfg, struct ipsec_security_gw_ports_map *ports[])
int main(int argc, char **argv)
static doca_error_t unpack_policy_buffer(uint8_t *buf, uint32_t nb_bytes, struct ipsec_security_gw_ipsec_policy *policy)
static doca_error_t run_multithread_insertion(struct ipsec_security_gw_config *app_cfg, struct ipsec_security_gw_ports_map *ports[], int nb_queues)
static doca_error_t create_policy_socket(struct ipsec_security_gw_config *app_cfg)
static void rule_inserter_worker(void *args)
static bool is_fwd_syndrome_rss(struct ipsec_security_gw_config *app_cfg)
#define NB_TX_BURST_TRIES
DOCA_LOG_REGISTER(IPSEC_SECURITY_GW)
static doca_error_t ipsec_security_gw_process_packets(struct ipsec_security_gw_config *config, struct ipsec_security_gw_ports_map *ports[])
static doca_error_t read_message_length(struct ipsec_security_gw_config *app_cfg, uint32_t *length)
static doca_error_t fill_buffer_from_socket(int fd, size_t bytes_to_read, uint8_t *buf)
static void process_syndrome_packets(void *args)
static void query_decrypt_pipes(struct ipsec_security_gw_config *app_cfg)
static void handle_packets_received(uint16_t port_id, uint16_t nb_packets, struct rte_mbuf **packets, struct ipsec_security_gw_core_ctx *ctx, uint16_t *nb_processed_packets, struct rte_mbuf **processed_packets, struct rte_mbuf **unprocessed_packets)
static bool is_insertion_rate(struct ipsec_security_gw_config *app_cfg)
#define MIN_ENTRIES_PER_CORE
static void query_bad_syndrome(struct decrypt_rule *decrypt_rule)
static void sw_handling_sn_inc(struct ipsec_security_gw_config *app_cfg, struct encrypt_rule *encrypt_rules, int encrypt_array_size)
static void query_encrypt_pipes(struct ipsec_security_gw_config *app_cfg)
static doca_error_t read_message_from_socket(struct ipsec_security_gw_config *app_cfg, struct ipsec_security_gw_ipsec_policy *policy)
static void signal_handler(int signum)
void unpack_blob(uint8_t **buffer, size_t length, uint8_t *output)
uint16_t unpack_uint16(uint8_t **buffer)
uint8_t unpack_uint8(uint8_t **buffer)
uint32_t unpack_uint32(uint8_t **buffer)
doca_error_t ipsec_security_gw_handle_decrypt_policy(struct ipsec_security_gw_config *app_cfg, struct doca_flow_port *secured_port, struct ipsec_security_gw_ipsec_policy *policy, struct decrypt_rule *rule)
void print_policy_attrs(struct ipsec_security_gw_ipsec_policy *policy)
doca_error_t ipsec_security_gw_handle_encrypt_policy(struct ipsec_security_gw_config *app_cfg, struct ipsec_security_gw_ports_map *ports[], struct ipsec_security_gw_ipsec_policy *policy, struct encrypt_rule *rule)
#define POLICY_RECORD_MAX_SIZE
#define POLICY_RECORD_MIN_SIZE
struct application_port_config port_config
struct doca_flow_pipe_entry * entry
enum doca_flow_l3_type l3_type
struct antireplay_state antireplay_state
struct bad_syndrome_entry entries[NUM_OF_SYNDROMES]
struct doca_flow_resource_query::@115::@117 counter
struct ipsec_security_gw_rules app_rules
struct application_dpdk_config * dpdk_config
struct ipsec_security_gw_config * config
struct decrypt_rule * decrypt_rules
struct encrypt_rule * encrypt_rules
char dst_ip_addr[MAX_IP_ADDR_LEN+1]
uint8_t enc_key_data[MAX_KEY_LEN]
char outer_dst_ip[MAX_IP_ADDR_LEN+1]
uint8_t outer_l3_protocol
char outer_src_ip[MAX_IP_ADDR_LEN+1]
char src_ip_addr[MAX_IP_ADDR_LEN+1]
struct decrypt_rule * decrypt_rules
struct encrypt_rule * encrypt_rules
struct ipsec_security_gw_config * app_cfg
struct ipsec_security_gw_ports_map ** ports
char name[MAX_NAME_LEN+1]
struct doca_flow_pipe_entry * entry
char name[MAX_NAME_LEN+1]
struct security_gateway_entry_info * entries_info
struct doca_flow_port * ports[UPF_ACCEL_PORTS_MAX]
static struct doca_flow_port * ports[FLOW_SWITCH_PORTS_MAX]
struct upf_accel_ctx * ctx
size_t strlcpy(char *dst, const char *src, size_t size)