30 #include <rte_ethdev.h>
31 #include <rte_hash_crc.h>
102 return val > 0 ? val : 1;
134 for (i = 0; i < qers->
num_qers; ++i) {
193 ids_array[i] = meter_idx;
225 DOCA_LOG_ERR(
"Failed to init DOCA shared meters port %u tx: %s",
248 for (pdr_idx = 0; pdr_idx < pdrs->
num_pdrs; ++pdr_idx) {
253 DOCA_LOG_ERR(
"Failed to init DOCA shared meters of pdr %u: %s",
273 struct doca_flow_pipe_entry **
entry)
303 for (uint32_t i = 0; i < fars->
num_fars; ++i) {
330 struct doca_flow_pipe_entry **
entry)
355 act_enc.encap_cfg.encap.outer.ip4.dst_ip = RTE_BE32(far->fp_oh_ip.v4);
356 act_enc.encap_cfg.encap.tun.gtp_teid = RTE_BE32(far->fp_oh_teid);
383 struct doca_flow_pipe_entry **
entry)
426 .next_pipe = qer_idx == (pdr->
qerids_num - 1) ?
436 .entry_idx = pdr->
id,
465 DOCA_LOG_ERR(
"Failed to insert PDR rule to port %u meter tables: %s",
493 for (pdr_idx = 0; pdr_idx < num_pdrs; pdr_idx++) {
548 shared_counter_ids->
cntr_0 = start_idx;
549 shared_counter_ids->
cntrs_num = num_cntrs;
554 for (port_id = 0; port_id < num_ports; port_id++) {
555 shared_counter_ids->
ids[port_id] =
556 rte_calloc(
"Counter IDS", num_cntrs,
sizeof(uint32_t), RTE_CACHE_LINE_SIZE);
557 if (!shared_counter_ids->
ids[port_id]) {
558 DOCA_LOG_ERR(
"Failed to allocate Counter IDS array for port %u", port_id);
562 for (i = 0; i < num_cntrs; ++i) {
571 rte_free(shared_counter_ids->
ids[port_id]);
585 for (port_id = 0; port_id < num_ports; port_id++)
586 rte_free(shared_counter_ids->
ids[port_id]);
605 uint32_t num_conn_per_core = (max_conn_per_port + num_cores - 1) / num_cores;
631 &shared_counter_ids);
640 shared_counter_ids.
ids[port_id][i],
643 DOCA_LOG_ERR(
"Failed to configure shared counter %u to port %d", i, port_id);
648 shared_counter_ids.
ids[port_id],
652 DOCA_LOG_ERR(
"Failed to bind shared counter to port %d", port_id);
671 RTE_LCORE_FOREACH_WORKER(lcore)
673 fp_data = &fp_data_arr[lcore];
677 rte_hash_free(fp_data->
dyn_tbl);
680 rte_free(fp_data_arr);
692 uint16_t num_cores = rte_lcore_count() - 1;
694 assert(num_cores > 0);
698 char mem_name[RTE_MEMZONE_NAMESIZE];
699 struct rte_hash_parameters dyn_tbl_params = {
703 .hash_func = rte_hash_crc,
704 .hash_func_init_val = 0,
705 .socket_id = rte_socket_id(),
706 .extra_flag = RTE_HASH_EXTRA_FLAGS_EXT_TABLE,
708 uint16_t curr_quota_base_cntr_idx = 0;
716 fp_data_arr = rte_calloc(
"FP data", RTE_MAX_LCORE,
sizeof(*fp_data), RTE_CACHE_LINE_SIZE);
724 RTE_LCORE_FOREACH_WORKER(lcore)
726 fp_data = &fp_data_arr[lcore];
728 snprintf(mem_name,
sizeof(mem_name),
"Dyn conn ht %u", lcore);
729 fp_data->
dyn_tbl = rte_hash_create(&dyn_tbl_params);
731 DOCA_LOG_ERR(
"Failed to allocate dynamic connection table");
736 snprintf(mem_name,
sizeof(mem_name),
"Dyn conn data %u", lcore);
738 dyn_tbl_params.entries,
740 RTE_CACHE_LINE_SIZE);
742 DOCA_LOG_ERR(
"Failed to allocate dynamic connection table data");
747 num_cntrs = quota_cntrs_per_core_num;
749 if (quota_cntrs_remainder_num) {
751 quota_cntrs_remainder_num--;
759 DOCA_LOG_ERR(
"Failed to populate quota counters ids for core %u", lcore);
762 curr_quota_base_cntr_idx += num_cntrs;
773 *fp_data_arr_out = fp_data_arr;
793 DOCA_LOG_INFO(
"//////////////////// SW DATAPATH COUNTERS ////////////////////");
795 RTE_LCORE_FOREACH_WORKER(lcore)
797 fp_data = &fp_data_arr[lcore];
801 "Core %3u sw new_pkts=%-8lu new_bytes=%-8lu ex_pkts=%-8lu ex_bytes=%-8lu err_pkts=%-8lu err_bytes=%-8lu",
819 "TOTAL sw new_pkts=%-8lu new_bytes=%-8lu ex_pkts=%-8lu ex_bytes=%-8lu err_pkts=%-8lu err_bytes=%-8lu",
845 DOCA_LOG_INFO(
"//////////////////// %s COUNTERS ////////////////////", name);
847 RTE_LCORE_FOREACH_WORKER(lcore)
849 fp_data = &fp_data_arr[lcore];
850 if (strcmp(name,
"ACCELERATED") == 0) {
853 }
else if (strcmp(name,
"NOT ACCELERATED") == 0) {
856 }
else if (strcmp(name,
"ACCELERATION FAILED") == 0) {
865 "Core %3u %s ran_current=%-8lu ran_aged=%-8lu ran_total=%-8lu ran_errors=%-8lu ran_aging_errors=%-8lu wan_current=%-8lu wan_aged=%-8lu wan_total=%-8lu wan_errors=%-8lu wan_aging_errors=%-8lu",
890 "TOTAL %s ran_current=%-8lu ran_aged=%-8lu ran_total=%-8lu ran_errors=%-8lu ran_aging_errors=%-8lu wan_current=%-8lu wan_aged=%-8lu wan_total=%-8lu wan_errors=%-8lu wan_aging_errors=%-8lu",
920 DOCA_LOG_INFO(
"//////////////////// HW PDR COUNTERS ////////////////////");
922 for (pdr_idx = 0; pdr_idx < pdrs->
num_pdrs; pdr_idx++) {
926 pdr_sum.
counter.total_pkts = 0;
927 pdr_sum.
counter.total_bytes = 0;
933 DOCA_LOG_ERR(
"Error querying port %u PDR counter %d: %s",
944 pdr_stats.
counter.total_bytes);
992 DOCA_LOG_ERR(
"Error querying port %u RX %s Drop counter: %s",
1001 DOCA_LOG_ERR(
"Error querying port %u TX %s Drop counter: %s",
1008 DOCA_LOG_INFO(
"Port %d DROP %-8s rx_pkts=%-8lu tx_pkts=%-8lu",
1011 rx_dropped_stats.
counter.total_pkts,
1012 tx_dropped_stats.
counter.total_pkts);
1014 rx_dropped_stats_sum.
counter.total_pkts += rx_dropped_stats.
counter.total_pkts;
1015 tx_dropped_stats_sum.
counter.total_pkts += tx_dropped_stats.
counter.total_pkts;
1018 DOCA_LOG_INFO(
"TOTAL DROP %-8s rx_pkts=%-8lu tx_pkts=%-8lu",
1020 rx_dropped_stats_sum.
counter.total_pkts,
1021 tx_dropped_stats_sum.
counter.total_pkts);
1033 DOCA_LOG_INFO(
"//////////////////// STATIC HW COUNTERS ////////////////////");
1072 sigemptyset(sigset);
1073 sigaddset(sigset, SIGINT);
1074 sigaddset(sigset, SIGTERM);
1075 sigaddset(sigset, SIGUSR1);
1077 ret = pthread_sigmask(SIG_BLOCK, sigset,
NULL);
1079 DOCA_LOG_ERR(
"Failed to apply signal mask: %s", strerror(ret));
1187 goto cleanup_doca_flow;
1198 goto cleanup_fp_data;
1238 DOCA_LOG_ERR(
"Failed to process port %u entries", port_id);
1283 DOCA_LOG_INFO(
"Waiting for traffic, press Ctrl+C for termination");
1286 ret = sigwait(&sigset, &sig);
1306 rte_eal_mp_wait_lcore();
1323 const char *n = (
const char *)param;
1325 cfg->smf_config_file_path = n;
1340 const char *n = (
const char *)param;
1342 cfg->vxlan_config_file_path = n;
1357 const uint32_t n = *(
const uint32_t *)param;
1359 cfg->hw_aging_time_sec = n;
1360 cfg->sw_aging_time_sec = n;
1375 const uint32_t n = *(
const uint32_t *)param;
1378 DOCA_LOG_ERR(
"Bad param: num-pkts-pefore-accel must be greater or equal to 1");
1382 cfg->dpi_threshold = n;
1409 const int32_t n = *(
const int32_t *)param;
1416 cfg->fixed_port = n;
1428 struct doca_argp_param *pdr_file_path_param;
1429 struct doca_argp_param *vxlan_file_path_param;
1430 struct doca_argp_param *aging_time_sec_param;
1431 struct doca_argp_param *pkts_before_accel_param;
1432 struct doca_argp_param *fixed_port_param;
1496 pkts_before_accel_param,
1497 "Number of packets processed in software before accelerating to hardware, enabling DPI on initial packets");
1528 uint16_t
nb_ports = rte_eth_dev_count_avail();
1549 struct doca_log_backend *sdk_log;
1550 int exit_status = EXIT_FAILURE;
1559 .port_config.isolated_mode = 1,
1560 .port_config.enable_mbuf_metadata = 1,
1569 goto upf_accel_exit;
1574 goto upf_accel_exit;
1577 goto upf_accel_exit;
1579 DOCA_LOG_INFO(
"Starting UPF Acceleration app pid %d", getpid());
1584 goto upf_accel_exit;
1613 if (!rte_flow_dynf_metadata_avail()) {
1614 DOCA_LOG_ERR(
"Dynamic flow metadata is not available");
1615 goto dpdk_ports_queues_cleanup;
1620 goto dpdk_ports_queues_cleanup;
1625 goto dpdk_smf_cleanup;
1645 goto dpdk_vxlan_cleanup;
1651 goto upf_accel_deinit;
1654 exit_status = EXIT_SUCCESS;
1665 dpdk_ports_queues_cleanup:
1672 if (exit_status == EXIT_SUCCESS)
1673 DOCA_LOG_INFO(
"UPF Acceleration app finished successfully");
static void cleanup(struct cache_invalidate_sample_state *state)
doca_error_t dpdk_init(int argc, char **argv)
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)
static enum doca_flow_pipe_domain domain
static struct doca_flow_pipe_entry * entries[NB_ENTRIES]
static struct doca_flow_fwd fwd
static struct doca_flow_pipe_entry * entry[MAX_ENTRIES]
#define DEFAULT_TIMEOUT_US
DOCA_EXPERIMENTAL void doca_argp_param_set_description(struct doca_argp_param *param, const char *description)
Set the description of the program param, used during program usage.
DOCA_EXPERIMENTAL void doca_argp_param_set_long_name(struct doca_argp_param *param, const char *name)
Set the long name of the program param.
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 void doca_argp_set_dpdk_program(doca_argp_dpdk_cb_t callback)
Mark the program as based on DPDK API.
DOCA_EXPERIMENTAL void doca_argp_param_set_callback(struct doca_argp_param *param, doca_argp_param_cb_t callback)
Set the callback function of the program param.
DOCA_EXPERIMENTAL void doca_argp_param_set_mandatory(struct doca_argp_param *param)
Mark the program param as mandatory.
DOCA_EXPERIMENTAL doca_error_t doca_argp_param_create(struct doca_argp_param **param)
Create new program param.
DOCA_EXPERIMENTAL void doca_argp_param_set_type(struct doca_argp_param *param, enum doca_argp_type type)
Set the type of the param arguments.
DOCA_EXPERIMENTAL void doca_argp_param_set_short_name(struct doca_argp_param *param, const char *name)
Set the short name of the program param.
DOCA_EXPERIMENTAL doca_error_t doca_argp_destroy(void)
ARG Parser destroy.
DOCA_EXPERIMENTAL doca_error_t doca_argp_register_param(struct doca_argp_param *input_param)
Register a program flag.
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_STABLE doca_error_t doca_flow_entries_process(struct doca_flow_port *port, uint16_t pipe_queue, uint64_t timeout, uint32_t max_processed_entries)
Process entries in queue.
DOCA_STABLE doca_error_t doca_flow_shared_resources_bind(enum doca_flow_shared_resource_type type, uint32_t *res_array, uint32_t res_array_len, void *bindable_obj)
Binds a bulk of shared resources to a bindable object.
DOCA_EXPERIMENTAL doca_error_t doca_flow_shared_resource_set_cfg(enum doca_flow_shared_resource_type type, uint32_t id, struct doca_flow_shared_resource_cfg *cfg)
Configure a single shared resource.
DOCA_STABLE void doca_flow_destroy(void)
Destroy the doca flow.
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_FLOW_SHARED_RESOURCE_METER
@ DOCA_FLOW_SHARED_RESOURCE_COUNTER
@ DOCA_FLOW_METER_COLOR_MODE_BLIND
@ DOCA_FLOW_RESOURCE_TYPE_SHARED
@ DOCA_FLOW_METER_ALGORITHM_TYPE_RFC2697
@ DOCA_FLOW_METER_LIMIT_TYPE_BYTES
@ DOCA_FLOW_PIPE_DOMAIN_EGRESS
@ DOCA_FLOW_PIPE_DOMAIN_DEFAULT
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.
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.
const struct ip_frag_config * cfg
struct ip_frag_sw_counters sw_counters[IP_FRAG_PORT_NUM]
@ PARSER_PKT_TYPE_TUNNELED
doca_error_t stop_doca_flow_ports(int nb_ports, struct doca_flow_port *ports[])
doca_error_t init_doca_flow_ports(int nb_ports, struct doca_flow_port *ports[], bool is_hairpin, struct doca_dev *dev_arr[], uint32_t actions_mem_size[])
doca_error_t init_doca_flow_cb(int nb_queues, const char *mode, struct flow_resources *resource, uint32_t nr_shared_resources[], doca_flow_entry_process_cb cb, doca_flow_pipe_process_cb pipe_process_cb, struct doca_flow_definitions *defs)
#define ACTIONS_MEM_SIZE(nr_queues, entries)
#define ARRAY_INIT(array, val)
uint32_t * ids[UPF_ACCEL_PORTS_MAX]
struct application_port_config port_config
doca flow actions information
struct doca_flow_resource_encap_cfg encap_cfg
enum doca_flow_fwd_type type
doca flow matcher information
struct doca_flow_meta meta
doca monitor action configuration
struct doca_flow_monitor::@101::@106 shared_meter
struct doca_flow_monitor::@103::@107 shared_counter
enum doca_flow_resource_type meter_type
struct doca_flow_encap_action encap
struct doca_flow_resource_query::@115::@117 counter
doca flow shared resource configuration
user context struct that will be used in entries process callback
struct upf_accel_pdrs * pdrs
const char * vxlan_config_file_path
struct upf_accel_qers * qers
uint32_t hw_aging_time_sec
struct upf_accel_fars * fars
upf_accel_get_forwarding_port get_fwd_port
struct doca_flow_pipe * pipes[UPF_ACCEL_PORTS_MAX][UPF_ACCEL_PIPE_NUM]
struct flow_resources resource
uint32_t num_static_entries[UPF_ACCEL_PORTS_MAX]
struct doca_flow_port * ports[UPF_ACCEL_PORTS_MAX]
struct doca_flow_pipe_entry * drop_entries[UPF_ACCEL_DROP_NUM][UPF_ACCEL_NUM_DOMAINS]
struct doca_dev * dev_arr[UPF_ACCEL_PORTS_MAX]
uint32_t num_shared_resources[SHARED_RESOURCE_NUM_VALUES]
struct upf_accel_entry_ctx static_entry_ctx[UPF_ACCEL_PORTS_MAX]
struct doca_flow_pipe_entry * smf_entries[UPF_ACCEL_MAX_NUM_PDR][UPF_ACCEL_PORTS_MAX]
const struct upf_accel_config * upf_accel_cfg
struct doca_flow_monitor * mon
struct doca_flow_match * match
struct doca_flow_pipe * pipe
enum doca_flow_pipe_domain domain
enum upf_accel_port port_id
enum upf_accel_rule_type type
struct upf_accel_static_entry_ctx static_ctx
struct upf_accel_far arr_fars[]
struct upf_accel_fp_accel_counters accel_failed_counters[PARSER_PKT_TYPE_NUM]
struct upf_accel_entry_ctx * dyn_tbl_data
struct rte_hash * dyn_tbl
struct upf_accel_ctx * ctx
struct app_shared_counter_ids quota_cntrs
struct upf_accel_fp_sw_counters sw_counters
struct upf_accel_fp_accel_counters accel_counters[PARSER_PKT_TYPE_NUM]
struct upf_accel_fp_accel_counters unaccel_counters[PARSER_PKT_TYPE_NUM]
struct upf_accel_packet_byte_counter new_conn
struct upf_accel_packet_byte_counter err
struct upf_accel_packet_byte_counter ex_conn
uint32_t qerids[UPF_ACCEL_PDR_QERIDS_LEN]
enum upf_accel_pdr_pdi_si pdi_si
struct upf_accel_pdr arr_pdrs[]
struct upf_accel_qer arr_qers[]
struct entries_status ctrl_status
static uint32_t actions_mem_size[FLOW_SWITCH_PORTS_MAX]
static int upf_accel_calc_num_shared_meters(uint16_t num_ports)
static doca_error_t upf_accel_signals_mask(sigset_t *sigset)
static doca_error_t deinit_upf_accel(struct upf_accel_ctx *upf_accel_ctx, struct upf_accel_fp_data *fp_data_arr)
static doca_error_t vxlan_config_file_path_callback(void *param, void *config)
static int upf_accel_fp_loop_wrapper(void *param)
static doca_error_t upf_accel_shared_meters_dev_init(struct upf_accel_ctx *upf_accel_ctx, struct doca_flow_shared_resource_cfg *cfg, const struct upf_accel_pdr *pdr, enum upf_accel_port port_id)
static enum upf_accel_port upf_accel_single_port_get_fwd_port(enum upf_accel_port port_id)
static doca_error_t upf_accel_shared_meters_init(struct upf_accel_ctx *upf_accel_ctx)
static doca_error_t upf_accel_pipe_encap_counter_insert(struct upf_accel_ctx *upf_accel_ctx, uint32_t pdr_idx, uint32_t pdr_id, uint32_t far_id, uint8_t qfi, enum upf_accel_pdr_pdi_si pdi_si, enum upf_accel_port port_id, struct doca_flow_pipe_entry **entry)
static doca_error_t pipe_pdr_insert(struct upf_accel_ctx *upf_accel_ctx, struct upf_accel_entry_cfg *cfg, struct doca_flow_pipe_entry **entry)
static void upf_accel_fp_data_cleanup(struct upf_accel_fp_data *fp_data_arr)
static doca_error_t init_upf_accel(struct upf_accel_ctx *upf_accel_ctx, struct upf_accel_fp_data **fp_data_arr)
static uint32_t port_id_and_idx_to_quota_counter(enum upf_accel_port port_id, uint32_t idx)
int main(int argc, char **argv)
static void free_quota_counters_ids(struct app_shared_counter_ids *shared_counter_ids, uint16_t num_ports)
static const struct upf_accel_far * upf_accel_get_far_by_id(const struct upf_accel_fars *fars, uint32_t far_id)
static doca_error_t upf_accel_init_quota_counters(struct upf_accel_ctx *upf_accel_ctx)
static doca_error_t upf_accel_shared_meters_level_init(struct upf_accel_ctx *upf_accel_ctx, const struct upf_accel_pdr *pdr)
DOCA_LOG_REGISTER(UPF_ACCEL)
static doca_error_t run_upf_accel(struct upf_accel_ctx *upf_accel_ctx, struct upf_accel_fp_data *fp_data_arr)
static doca_error_t pipe_shared_meter_common_insert(struct upf_accel_ctx *upf_accel_ctx, uint32_t pdr_idx, uint32_t qer_idx, enum upf_accel_port port_id)
static doca_error_t upf_accel_register_params(void)
static int upf_accel_calc_num_shared_counters(uint16_t num_ports)
static void upf_accel_fp_sw_counters_print(struct upf_accel_fp_data *fp_data_arr)
static doca_error_t aging_time_sec_callback(void *param, void *config)
static doca_error_t smf_config_file_path_callback(void *param, void *config)
static doca_error_t fixed_port_callback(void *param, void *config)
static doca_error_t pkts_before_accel_callback(void *param, void *config)
static doca_error_t upf_accel_smf_rules_add(struct upf_accel_ctx *upf_accel_ctx)
static uint32_t calculate_hash_table_size(uint16_t num_cores)
static void upf_accel_fp_accel_counters_print(struct upf_accel_fp_data *fp_data_arr, const char *name)
static doca_error_t upf_accel_tx_counters_insert(struct upf_accel_ctx *upf_accel_ctx, uint32_t pdr_idx, uint32_t pdr_id, uint32_t far_id, uint8_t qfi, enum upf_accel_pdr_pdi_si pdi_si, struct doca_flow_pipe_entry **entry)
static void upf_accel_pdrs_print(struct upf_accel_ctx *upf_accel_ctx)
static void upf_accel_static_hw_counters_print(struct upf_accel_ctx *upf_accel_ctx)
static doca_error_t upf_accel_dpdk_config_num_ports(struct application_dpdk_config *dpdk_config)
static doca_error_t alloc_and_populate_quota_counters_ids(uint16_t start_idx, size_t num_ports, size_t num_cntrs, struct app_shared_counter_ids *shared_counter_ids)
static void upf_accel_debug_counters_print(struct upf_accel_ctx *upf_accel_ctx, struct upf_accel_fp_data *fp_data_arr)
static doca_error_t upf_accel_fp_data_init(struct upf_accel_ctx *ctx, struct upf_accel_fp_data **fp_data_arr_out)
static void upf_accel_drop_counter_print(struct upf_accel_ctx *upf_accel_ctx, enum upf_accel_pipe_drop_type drop_type)
static uint32_t upf_accel_shared_meters_table_offset_get(enum upf_accel_port port_id, uint32_t pdr_idx, uint32_t meter_idx)
static struct upf_accel_qer * upf_accel_get_qer_by_qer_id(struct upf_accel_qers *qers, uint32_t qer_id)
static uint32_t upf_accel_get_pdr_index_from_pdrs(const struct upf_accel_pdrs *pdrs, const struct upf_accel_pdr *pdr)
static uint64_t upf_accel_clamp_rate(uint64_t val)
static doca_error_t pipe_shared_meter_insert(struct upf_accel_ctx *upf_accel_ctx, uint32_t pdr_idx, uint32_t qer_idx)
void upf_accel_sw_aging_ll_init(struct upf_accel_fp_data *fp_data, enum parser_pkt_type pkt_type)
void upf_accel_vxlan_cleanup(struct upf_accel_config *cfg)
#define UPF_ACCEL_DEFAULT_DPI_THRESHOLD
doca_error_t upf_accel_vxlan_parse(struct upf_accel_config *cfg)
#define UPF_ACCEL_HW_AGING_TIME_DEFAULT_SEC
#define UPF_ACCEL_MAX_PDR_NUM_RATE_METERS
#define UPF_ACCEL_SW_AGING_TIME_DEFAULT_SEC
#define UPF_ACCEL_MAX_NUM_PDR
static uint8_t upf_accel_domain_idx_get(enum upf_accel_port port_id, uint8_t domain)
void upf_accel_smf_cleanup(struct upf_accel_config *cfg)
@ UPF_ACCEL_PIPE_TX_COLOR_MATCH_START
@ UPF_ACCEL_PIPE_TX_COUNTER
@ UPF_ACCEL_PIPE_TX_SHARED_METERS_START
@ UPF_ACCEL_PIPE_TX_COLOR_MATCH_NO_MORE_METERS
static enum upf_accel_port upf_accel_get_opposite_port(enum upf_accel_port port_id)
doca_error_t upf_accel_smf_parse(struct upf_accel_config *cfg)
@ UPF_ACCEL_PDR_PDI_SI_DL
@ UPF_ACCEL_PDR_PDI_SI_UL
#define UPF_ACCEL_NUM_QUOTA_COUNTERS_PER_PORT
#define UPF_ACCEL_FIXED_PORT_NONE
@ UPF_ACCEL_ENCAP_ACTION_NONE
@ UPF_ACCEL_ENCAP_ACTION_5G
@ UPF_ACCEL_ENCAP_ACTION_4G
void upf_accel_check_for_valid_entry_aging(struct doca_flow_pipe_entry *entry, uint16_t pipe_queue, enum doca_flow_entry_status status, enum doca_flow_entry_op op, void *user_ctx)
void upf_accel_fp_loop(struct upf_accel_fp_data *fp_data)
struct upf_accel_ctx * ctx
doca_error_t upf_accel_pipeline_create(struct upf_accel_ctx *upf_accel_ctx)
doca_error_t upf_accel_pipe_static_entry_add(struct upf_accel_ctx *upf_accel_ctx, enum upf_accel_port port_id, uint16_t pipe_queue, struct doca_flow_pipe *pipe, const struct doca_flow_match *match, const struct doca_flow_actions *actions, const struct doca_flow_monitor *mon, const struct doca_flow_fwd *fwd, uint32_t flags, void *usr_ctx, struct doca_flow_pipe_entry **entry)
#define UPF_ACCEL_QFI_NONE
#define UPF_ACCEL_MAX_NUM_CONNECTIONS
#define UPF_ACCEL_MAX_NUM_FAILED_ACCEL_PER_CORE