38 #include "flow_common.h"
42 #define FLOW_SWITCH_PROXY_PORT_NB 2
44 #define INTERVAL_QUERY_TIME 1
46 #define SEC2USEC(sec) ((sec) * (1000000L))
48 #define DEFAULT_CTRL_PIPE_SIZE (8192)
52 struct doca_flow_port *
port;
53 struct doca_flow_pipe *
pipe;
85 struct doca_flow_pipe_cfg *pipe_cfg;
88 memset(&match, 0,
sizeof(match));
90 memset(&
fwd, 0,
sizeof(
fwd));
158 memset(&
fwd, 0,
sizeof(
fwd));
159 memset(&match, 0,
sizeof(match));
160 memset(status, 0,
sizeof(*status));
218 struct doca_dev *dev,
219 uint8_t switch_port_idx,
224 struct doca_devinfo *devinfo;
228 if (devinfo ==
NULL) {
229 DOCA_LOG_ERR(
"Failed to convert DOCA device to devinfo for port %u", switch_port_idx);
235 DOCA_LOG_ERR(
"Failed to get interface name for port %u: %s",
250 DOCA_LOG_ERR(
"Failed to create pipe for port %u", switch_port_idx);
256 DOCA_LOG_ERR(
"Failed to add pipe entries for port %u", switch_port_idx);
262 DOCA_LOG_ERR(
"Failed to modify operation state for port %u: %s",
285 struct doca_flow_port *port;
294 DOCA_LOG_ERR(
"Failed to modify operation state from %u to %u for port %u: %s",
318 DOCA_LOG_INFO(
"CTRL-C is pressed, running over the ports and activating them");
346 DOCA_LOG_INFO(
"Signal %d is triggered, quit the sample", signum);
367 struct sigaction action = {0};
370 if (sigaction(SIGINT, &action,
NULL) == -1) {
371 DOCA_LOG_ERR(
"Failed to take SIGINT signal for hot upgrade, errno=%d", errno);
376 if (sigaction(SIGQUIT, &action,
NULL) == -1) {
377 DOCA_LOG_ERR(
"Failed to take SIGQUIT signal for quit program, errno=%d", errno);
425 DOCA_LOG_INFO(
"Total traffic %lu (%lu) | TCP %lu (%lu) | UDP %lu (%lu) | miss %lu (%lu)",
455 struct doca_dev *dev_main,
456 struct doca_dev *dev_sec,
467 struct timeval start, end;
468 long query_time, sleep_time;
469 uint8_t switch_port_idx;
478 memset(dev_arr, 0,
sizeof(
struct doca_dev *) *
nb_ports);
479 dev_arr[0] = dev_main;
480 dev_arr[3] = dev_sec;
498 uint8_t port_id = switch_port_idx * 3;
505 &port_control_list[switch_port_idx]);
507 DOCA_LOG_ERR(
"Failed to init port control %u", switch_port_idx);
515 gettimeofday(&start,
NULL);
524 DOCA_LOG_INFO(
"Waiting for traffic to arrived, press CTRL+C to make process active or CTRL+\\ for quit");
528 gettimeofday(&end,
NULL);
529 query_time =
SEC2USEC(end.tv_sec - start.tv_sec) + (end.tv_usec - start.tv_usec);
534 gettimeofday(&start,
NULL);
539 DOCA_LOG_ERR(
"Failed to query port control %u", switch_port_idx);
struct doca_flow_port * init_doca_flow(uint16_t port_id, uint8_t rxq_num)
static doca_error_t destroy_pipe_cfg(struct doca_flow_pipe_cfg *cfg)
static struct doca_flow_fwd fwd_miss
static struct doca_flow_monitor monitor
static struct doca_flow_fwd fwd
#define FLOW_SWITCH_PROXY_PORT_NB
static uint8_t waiting_for_traffic
doca_error_t flow_switch_hot_upgrade(int nb_queues, int nb_ports, struct doca_dev *dev_main, struct doca_dev *dev_sec, enum doca_flow_port_operation_state state)
static doca_error_t create_switch_pipe(struct doca_flow_port *port, struct doca_flow_pipe **pipe)
static doca_error_t port_control_query(struct port_control *control)
#define INTERVAL_QUERY_TIME
static enum doca_flow_port_operation_state current_state
static doca_error_t port_control_init(struct doca_flow_port *port, struct doca_dev *dev, uint8_t switch_port_idx, enum doca_flow_port_operation_state state, struct entries_status *status, struct port_control *control)
#define DEFAULT_CTRL_PIPE_SIZE
static void activate_signal_handler(int signum)
DOCA_LOG_REGISTER(FLOW_SWITCH_HOT_UPGRADE)
static struct doca_flow_port * switch_ports[FLOW_SWITCH_PROXY_PORT_NB]
static doca_error_t add_switch_pipe_entries(uint8_t switch_port_idx, struct port_control *control, struct entries_status *status)
static void ports_operation_state_modify(enum doca_flow_port_operation_state state)
static int signal_handler_register(void)
static void quit_signal_handler(int signum)
#define DOCA_DEVINFO_IFACE_NAME_SIZE
Buffer size to hold network interface name. Including a null terminator.
#define DOCA_DEVINFO_PCI_ADDR_SIZE
Buffer size to hold PCI BDF format: "XXXX:XX:XX.X". Including a null terminator.
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...
DOCA_STABLE doca_error_t doca_devinfo_get_iface_name(const struct doca_devinfo *devinfo, char *iface_name, uint32_t size)
Get the name of the ethernet interface of a DOCA devinfo.
DOCA_STABLE doca_error_t doca_devinfo_get_pci_addr_str(const struct doca_devinfo *devinfo, char *pci_addr_str)
Get the PCI address of a DOCA devinfo.
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_OPERATING_SYSTEM
doca_flow_port_operation_state
Defines the operation states for a port instance.
DOCA_STABLE doca_error_t doca_flow_pipe_cfg_destroy(struct doca_flow_pipe_cfg *cfg)
Destroy DOCA Flow pipe configuration struct.
DOCA_STABLE doca_error_t doca_flow_pipe_cfg_create(struct doca_flow_pipe_cfg **cfg, struct doca_flow_port *port)
Create DOCA Flow pipe configuration struct.
DOCA_EXPERIMENTAL doca_error_t doca_flow_pipe_cfg_set_match(struct doca_flow_pipe_cfg *cfg, const struct doca_flow_match *match, const struct doca_flow_match *match_mask)
Set pipe's match and match mask.
DOCA_EXPERIMENTAL doca_error_t doca_flow_pipe_create(const struct doca_flow_pipe_cfg *cfg, const struct doca_flow_fwd *fwd, const struct doca_flow_fwd *fwd_miss, struct doca_flow_pipe **pipe)
Create one new pipe.
DOCA_EXPERIMENTAL doca_error_t doca_flow_pipe_cfg_set_miss_counter(struct doca_flow_pipe_cfg *cfg, bool miss_counter)
Set to enable pipe's miss counter.
DOCA_EXPERIMENTAL doca_error_t doca_flow_port_operation_state_modify(struct doca_flow_port *port, enum doca_flow_port_operation_state state)
Modifies the operation state of a port instance.
DOCA_EXPERIMENTAL doca_error_t doca_flow_pipe_cfg_set_monitor(struct doca_flow_pipe_cfg *cfg, const struct doca_flow_monitor *monitor)
Set pipe's monitor.
DOCA_EXPERIMENTAL doca_error_t doca_flow_pipe_add_entry(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 *monitor, const struct doca_flow_fwd *fwd, uint32_t flags, void *usr_ctx, struct doca_flow_pipe_entry **entry)
Add one new entry to a pipe.
DOCA_STABLE void doca_flow_destroy(void)
Destroy the doca flow.
DOCA_STABLE doca_error_t doca_flow_pipe_cfg_set_nr_entries(struct doca_flow_pipe_cfg *cfg, uint32_t nr_entries)
Set pipe's maximum number of flow rules.
DOCA_EXPERIMENTAL doca_error_t doca_flow_resource_query_pipe_miss(struct doca_flow_pipe *pipe, struct doca_flow_resource_query *query_stats)
Extract information about pipe miss entry.
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_FLOW_PORT_OPERATION_STATE_UNCONNECTED
@ DOCA_FLOW_PORT_OPERATION_STATE_STANDBY
@ DOCA_FLOW_PORT_OPERATION_STATE_ACTIVE
@ DOCA_FLOW_PORT_OPERATION_STATE_ACTIVE_READY_TO_SWAP
@ DOCA_FLOW_WAIT_FOR_BATCH
@ DOCA_FLOW_RESOURCE_TYPE_NON_SHARED
#define DOCA_LOG_ERR(format,...)
Generates an ERROR application log message.
#define DOCA_LOG_INFO(format,...)
Generates an INFO application log message.
#define DOCA_LOG_DBG(format,...)
Generates a DEBUG application log message.
doca_error_t flow_process_entries(struct doca_flow_port *port, struct entries_status *status, uint32_t nr_entries)
doca_error_t stop_doca_flow_ports(int nb_ports, struct doca_flow_port *ports[])
doca_error_t init_doca_flow_ports_with_op_state(int nb_ports, struct doca_flow_port *ports[], bool is_hairpin, struct doca_dev *dev_arr[], enum doca_flow_port_operation_state *states, uint32_t actions_mem_size[])
doca_error_t set_flow_pipe_cfg(struct doca_flow_pipe_cfg *cfg, const char *name, enum doca_flow_pipe_type type, bool is_root)
#define SHARED_RESOURCE_NUM_VALUES
#define ACTIONS_MEM_SIZE(nr_queues, entries)
#define ARRAY_INIT(array, val)
enum doca_flow_fwd_type type
doca flow matcher information
struct doca_flow_parser_meta parser_meta
doca monitor action configuration
enum doca_flow_resource_type counter_type
struct doca_flow_resource_query::@115::@117 counter
user context struct that will be used in entries process callback
char iface_name[DOCA_DEVINFO_IFACE_NAME_SIZE]
struct doca_flow_pipe * pipe
char pci_dev[DOCA_DEVINFO_PCI_ADDR_SIZE]
struct doca_flow_pipe_entry * udp_entry
struct doca_flow_pipe_entry * tcp_entry
struct doca_flow_port * port
static uint32_t actions_mem_size[FLOW_SWITCH_PORTS_MAX]
static struct doca_flow_port * ports[FLOW_SWITCH_PORTS_MAX]