aboutsummaryrefslogtreecommitdiffstats
path: root/lib/librte_ether
diff options
context:
space:
mode:
Diffstat (limited to 'lib/librte_ether')
-rw-r--r--lib/librte_ether/Makefile44
-rw-r--r--lib/librte_ether/ethdev_profile.c135
-rw-r--r--lib/librte_ether/ethdev_profile.h27
-rw-r--r--lib/librte_ether/meson.build27
-rw-r--r--lib/librte_ether/rte_dev_info.h31
-rw-r--r--lib/librte_ether/rte_eth_ctrl.h827
-rw-r--r--lib/librte_ether/rte_ethdev.c4170
-rw-r--r--lib/librte_ether/rte_ethdev.h4112
-rw-r--r--lib/librte_ether/rte_ethdev_core.h613
-rw-r--r--lib/librte_ether/rte_ethdev_driver.h132
-rw-r--r--lib/librte_ether/rte_ethdev_pci.h196
-rw-r--r--lib/librte_ether/rte_ethdev_vdev.h84
-rw-r--r--lib/librte_ether/rte_ethdev_version.map232
-rw-r--r--lib/librte_ether/rte_flow.c420
-rw-r--r--lib/librte_ether/rte_flow.h1483
-rw-r--r--lib/librte_ether/rte_flow_driver.h121
-rw-r--r--lib/librte_ether/rte_mtr.c201
-rw-r--r--lib/librte_ether/rte_mtr.h730
-rw-r--r--lib/librte_ether/rte_mtr_driver.h192
-rw-r--r--lib/librte_ether/rte_tm.c409
-rw-r--r--lib/librte_ether/rte_tm.h1912
-rw-r--r--lib/librte_ether/rte_tm_driver.h337
22 files changed, 0 insertions, 16435 deletions
diff --git a/lib/librte_ether/Makefile b/lib/librte_ether/Makefile
deleted file mode 100644
index 3ca5782b..00000000
--- a/lib/librte_ether/Makefile
+++ /dev/null
@@ -1,44 +0,0 @@
-# SPDX-License-Identifier: BSD-3-Clause
-# Copyright(c) 2010-2017 Intel Corporation
-
-include $(RTE_SDK)/mk/rte.vars.mk
-
-#
-# library name
-#
-LIB = librte_ethdev.a
-
-CFLAGS += -DALLOW_EXPERIMENTAL_API
-CFLAGS += -O3
-CFLAGS += $(WERROR_FLAGS)
-LDLIBS += -lrte_net -lrte_eal -lrte_mempool -lrte_ring
-LDLIBS += -lrte_mbuf
-
-EXPORT_MAP := rte_ethdev_version.map
-
-LIBABIVER := 8
-
-SRCS-y += rte_ethdev.c
-SRCS-y += rte_flow.c
-SRCS-y += rte_tm.c
-SRCS-y += rte_mtr.c
-SRCS-y += ethdev_profile.c
-
-#
-# Export include files
-#
-SYMLINK-y-include += rte_ethdev.h
-SYMLINK-y-include += rte_ethdev_driver.h
-SYMLINK-y-include += rte_ethdev_core.h
-SYMLINK-y-include += rte_ethdev_pci.h
-SYMLINK-y-include += rte_ethdev_vdev.h
-SYMLINK-y-include += rte_eth_ctrl.h
-SYMLINK-y-include += rte_dev_info.h
-SYMLINK-y-include += rte_flow.h
-SYMLINK-y-include += rte_flow_driver.h
-SYMLINK-y-include += rte_tm.h
-SYMLINK-y-include += rte_tm_driver.h
-SYMLINK-y-include += rte_mtr.h
-SYMLINK-y-include += rte_mtr_driver.h
-
-include $(RTE_SDK)/mk/rte.lib.mk
diff --git a/lib/librte_ether/ethdev_profile.c b/lib/librte_ether/ethdev_profile.c
deleted file mode 100644
index 0d1dcda3..00000000
--- a/lib/librte_ether/ethdev_profile.c
+++ /dev/null
@@ -1,135 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2017 Intel Corporation
- */
-
-#include "ethdev_profile.h"
-
-/**
- * This conditional block enables RX queues profiling by tracking wasted
- * iterations, i.e. iterations which yielded no RX packets. Profiling is
- * performed using the Instrumentation and Tracing Technology (ITT) API,
- * employed by the Intel (R) VTune (TM) Amplifier.
- */
-#ifdef RTE_ETHDEV_PROFILE_ITT_WASTED_RX_ITERATIONS
-
-#include <ittnotify.h>
-
-#define ITT_MAX_NAME_LEN (100)
-
-/**
- * Auxiliary ITT structure belonging to Ethernet device and using to:
- * - track RX queue state to determine whether it is wasting loop iterations
- * - begin or end ITT task using task domain and task name (handle)
- */
-struct itt_profile_rx_data {
- /**
- * ITT domains for each queue.
- */
- __itt_domain *domains[RTE_MAX_QUEUES_PER_PORT];
- /**
- * ITT task names for each queue.
- */
- __itt_string_handle *handles[RTE_MAX_QUEUES_PER_PORT];
- /**
- * Flags indicating the queues state. Possible values:
- * 1 - queue is wasting iterations,
- * 0 - otherwise.
- */
- uint8_t queue_state[RTE_MAX_QUEUES_PER_PORT];
-};
-
-/**
- * The pool of *itt_profile_rx_data* structures.
- */
-struct itt_profile_rx_data itt_rx_data[RTE_MAX_ETHPORTS];
-
-
-/**
- * This callback function manages ITT tasks collection on given port and queue.
- * It must be registered with rte_eth_add_rx_callback() to be called from
- * rte_eth_rx_burst(). To find more comments see rte_rx_callback_fn function
- * type declaration.
- */
-static uint16_t
-collect_itt_rx_burst_cb(uint16_t port_id, uint16_t queue_id,
- __rte_unused struct rte_mbuf *pkts[], uint16_t nb_pkts,
- __rte_unused uint16_t max_pkts, __rte_unused void *user_param)
-{
- if (unlikely(nb_pkts == 0)) {
- if (!itt_rx_data[port_id].queue_state[queue_id]) {
- __itt_task_begin(
- itt_rx_data[port_id].domains[queue_id],
- __itt_null, __itt_null,
- itt_rx_data[port_id].handles[queue_id]);
- itt_rx_data[port_id].queue_state[queue_id] = 1;
- }
- } else {
- if (unlikely(itt_rx_data[port_id].queue_state[queue_id])) {
- __itt_task_end(
- itt_rx_data[port_id].domains[queue_id]);
- itt_rx_data[port_id].queue_state[queue_id] = 0;
- }
- }
- return nb_pkts;
-}
-
-/**
- * Initialization of itt_profile_rx_data for a given Ethernet device.
- * This function must be invoked when ethernet device is being configured.
- * Result will be stored in the global array *itt_rx_data*.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param port_name
- * The name of the Ethernet device.
- * @param rx_queue_num
- * The number of RX queues on specified port.
- *
- * @return
- * - On success, zero.
- * - On failure, a negative value.
- */
-static inline int
-itt_profile_rx_init(uint16_t port_id, char *port_name, uint8_t rx_queue_num)
-{
- uint16_t q_id;
-
- for (q_id = 0; q_id < rx_queue_num; ++q_id) {
- char domain_name[ITT_MAX_NAME_LEN];
-
- snprintf(domain_name, sizeof(domain_name),
- "RXBurst.WastedIterations.Port_%s.Queue_%d",
- port_name, q_id);
- itt_rx_data[port_id].domains[q_id]
- = __itt_domain_create(domain_name);
-
- char task_name[ITT_MAX_NAME_LEN];
-
- snprintf(task_name, sizeof(task_name),
- "port id: %d; queue id: %d",
- port_id, q_id);
- itt_rx_data[port_id].handles[q_id]
- = __itt_string_handle_create(task_name);
-
- itt_rx_data[port_id].queue_state[q_id] = 0;
-
- if (!rte_eth_add_rx_callback(
- port_id, q_id, collect_itt_rx_burst_cb, NULL)) {
- return -rte_errno;
- }
- }
-
- return 0;
-}
-#endif /* RTE_ETHDEV_PROFILE_ITT_WASTED_RX_ITERATIONS */
-
-int
-__rte_eth_profile_rx_init(__rte_unused uint16_t port_id,
- __rte_unused struct rte_eth_dev *dev)
-{
-#ifdef RTE_ETHDEV_PROFILE_ITT_WASTED_RX_ITERATIONS
- return itt_profile_rx_init(
- port_id, dev->data->name, dev->data->nb_rx_queues);
-#endif
- return 0;
-}
diff --git a/lib/librte_ether/ethdev_profile.h b/lib/librte_ether/ethdev_profile.h
deleted file mode 100644
index e5ea3682..00000000
--- a/lib/librte_ether/ethdev_profile.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2017 Intel Corporation
- */
-
-#ifndef _RTE_ETHDEV_PROFILE_H_
-#define _RTE_ETHDEV_PROFILE_H_
-
-#include "rte_ethdev.h"
-
-/**
- * Initialization of profiling RX queues for the Ethernet device.
- * Implementation of this function depends on chosen profiling method,
- * defined in configs.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param dev
- * Pointer to struct rte_eth_dev corresponding to given port_id.
- *
- * @return
- * - On success, zero.
- * - On failure, a negative value.
- */
-int
-__rte_eth_profile_rx_init(uint16_t port_id, struct rte_eth_dev *dev);
-
-#endif
diff --git a/lib/librte_ether/meson.build b/lib/librte_ether/meson.build
deleted file mode 100644
index 7fed8605..00000000
--- a/lib/librte_ether/meson.build
+++ /dev/null
@@ -1,27 +0,0 @@
-# SPDX-License-Identifier: BSD-3-Clause
-# Copyright(c) 2017 Intel Corporation
-
-name = 'ethdev'
-version = 8
-allow_experimental_apis = true
-sources = files('ethdev_profile.c',
- 'rte_ethdev.c',
- 'rte_flow.c',
- 'rte_mtr.c',
- 'rte_tm.c')
-
-headers = files('rte_ethdev.h',
- 'rte_ethdev_driver.h',
- 'rte_ethdev_core.h',
- 'rte_ethdev_pci.h',
- 'rte_ethdev_vdev.h',
- 'rte_eth_ctrl.h',
- 'rte_dev_info.h',
- 'rte_flow.h',
- 'rte_flow_driver.h',
- 'rte_mtr.h',
- 'rte_mtr_driver.h',
- 'rte_tm.h',
- 'rte_tm_driver.h')
-
-deps += ['net']
diff --git a/lib/librte_ether/rte_dev_info.h b/lib/librte_ether/rte_dev_info.h
deleted file mode 100644
index 6b68584d..00000000
--- a/lib/librte_ether/rte_dev_info.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2015 Intel Corporation
- */
-
-#ifndef _RTE_DEV_INFO_H_
-#define _RTE_DEV_INFO_H_
-
-#include <stdint.h>
-
-/*
- * Placeholder for accessing device registers
- */
-struct rte_dev_reg_info {
- void *data; /**< Buffer for return registers */
- uint32_t offset; /**< Start register table location for access */
- uint32_t length; /**< Number of registers to fetch */
- uint32_t width; /**< Size of device register */
- uint32_t version; /**< Device version */
-};
-
-/*
- * Placeholder for accessing device eeprom
- */
-struct rte_dev_eeprom_info {
- void *data; /**< Buffer for return eeprom */
- uint32_t offset; /**< Start eeprom address for access*/
- uint32_t length; /**< Length of eeprom region to access */
- uint32_t magic; /**< Device-specific key, such as device-id */
-};
-
-#endif /* _RTE_DEV_INFO_H_ */
diff --git a/lib/librte_ether/rte_eth_ctrl.h b/lib/librte_ether/rte_eth_ctrl.h
deleted file mode 100644
index 668f59ac..00000000
--- a/lib/librte_ether/rte_eth_ctrl.h
+++ /dev/null
@@ -1,827 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2015 Intel Corporation
- */
-
-#ifndef _RTE_ETH_CTRL_H_
-#define _RTE_ETH_CTRL_H_
-
-#include <stdint.h>
-#include <rte_common.h>
-#include "rte_ether.h"
-
-/**
- * @file
- *
- * Ethernet device features and related data structures used
- * by control APIs should be defined in this file.
- *
- */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
- * A packet can be identified by hardware as different flow types. Different
- * NIC hardwares may support different flow types.
- * Basically, the NIC hardware identifies the flow type as deep protocol as
- * possible, and exclusively. For example, if a packet is identified as
- * 'RTE_ETH_FLOW_NONFRAG_IPV4_TCP', it will not be any of other flow types,
- * though it is an actual IPV4 packet.
- * Note that the flow types are used to define RSS offload types in
- * rte_ethdev.h.
- */
-#define RTE_ETH_FLOW_UNKNOWN 0
-#define RTE_ETH_FLOW_RAW 1
-#define RTE_ETH_FLOW_IPV4 2
-#define RTE_ETH_FLOW_FRAG_IPV4 3
-#define RTE_ETH_FLOW_NONFRAG_IPV4_TCP 4
-#define RTE_ETH_FLOW_NONFRAG_IPV4_UDP 5
-#define RTE_ETH_FLOW_NONFRAG_IPV4_SCTP 6
-#define RTE_ETH_FLOW_NONFRAG_IPV4_OTHER 7
-#define RTE_ETH_FLOW_IPV6 8
-#define RTE_ETH_FLOW_FRAG_IPV6 9
-#define RTE_ETH_FLOW_NONFRAG_IPV6_TCP 10
-#define RTE_ETH_FLOW_NONFRAG_IPV6_UDP 11
-#define RTE_ETH_FLOW_NONFRAG_IPV6_SCTP 12
-#define RTE_ETH_FLOW_NONFRAG_IPV6_OTHER 13
-#define RTE_ETH_FLOW_L2_PAYLOAD 14
-#define RTE_ETH_FLOW_IPV6_EX 15
-#define RTE_ETH_FLOW_IPV6_TCP_EX 16
-#define RTE_ETH_FLOW_IPV6_UDP_EX 17
-#define RTE_ETH_FLOW_PORT 18
- /**< Consider device port number as a flow differentiator */
-#define RTE_ETH_FLOW_VXLAN 19 /**< VXLAN protocol based flow */
-#define RTE_ETH_FLOW_GENEVE 20 /**< GENEVE protocol based flow */
-#define RTE_ETH_FLOW_NVGRE 21 /**< NVGRE protocol based flow */
-#define RTE_ETH_FLOW_MAX 22
-
-/**
- * Feature filter types
- */
-enum rte_filter_type {
- RTE_ETH_FILTER_NONE = 0,
- RTE_ETH_FILTER_MACVLAN,
- RTE_ETH_FILTER_ETHERTYPE,
- RTE_ETH_FILTER_FLEXIBLE,
- RTE_ETH_FILTER_SYN,
- RTE_ETH_FILTER_NTUPLE,
- RTE_ETH_FILTER_TUNNEL,
- RTE_ETH_FILTER_FDIR,
- RTE_ETH_FILTER_HASH,
- RTE_ETH_FILTER_L2_TUNNEL,
- RTE_ETH_FILTER_GENERIC,
- RTE_ETH_FILTER_MAX
-};
-
-/**
- * Generic operations on filters
- */
-enum rte_filter_op {
- /** used to check whether the type filter is supported */
- RTE_ETH_FILTER_NOP = 0,
- RTE_ETH_FILTER_ADD, /**< add filter entry */
- RTE_ETH_FILTER_UPDATE, /**< update filter entry */
- RTE_ETH_FILTER_DELETE, /**< delete filter entry */
- RTE_ETH_FILTER_FLUSH, /**< flush all entries */
- RTE_ETH_FILTER_GET, /**< get filter entry */
- RTE_ETH_FILTER_SET, /**< configurations */
- RTE_ETH_FILTER_INFO, /**< retrieve information */
- RTE_ETH_FILTER_STATS, /**< retrieve statistics */
- RTE_ETH_FILTER_OP_MAX
-};
-
-/**
- * MAC filter type
- */
-enum rte_mac_filter_type {
- RTE_MAC_PERFECT_MATCH = 1, /**< exact match of MAC addr. */
- RTE_MACVLAN_PERFECT_MATCH, /**< exact match of MAC addr and VLAN ID. */
- RTE_MAC_HASH_MATCH, /**< hash match of MAC addr. */
- /** hash match of MAC addr and exact match of VLAN ID. */
- RTE_MACVLAN_HASH_MATCH,
-};
-
-/**
- * MAC filter info
- */
-struct rte_eth_mac_filter {
- uint8_t is_vf; /**< 1 for VF, 0 for port dev */
- uint16_t dst_id; /**< VF ID, available when is_vf is 1*/
- enum rte_mac_filter_type filter_type; /**< MAC filter type */
- struct ether_addr mac_addr;
-};
-
-/**
- * Define all structures for Ethertype Filter type.
- */
-
-#define RTE_ETHTYPE_FLAGS_MAC 0x0001 /**< If set, compare mac */
-#define RTE_ETHTYPE_FLAGS_DROP 0x0002 /**< If set, drop packet when match */
-
-/**
- * A structure used to define the ethertype filter entry
- * to support RTE_ETH_FILTER_ETHERTYPE with RTE_ETH_FILTER_ADD,
- * RTE_ETH_FILTER_DELETE and RTE_ETH_FILTER_GET operations.
- */
-struct rte_eth_ethertype_filter {
- struct ether_addr mac_addr; /**< Mac address to match. */
- uint16_t ether_type; /**< Ether type to match */
- uint16_t flags; /**< Flags from RTE_ETHTYPE_FLAGS_* */
- uint16_t queue; /**< Queue assigned to when match*/
-};
-
-#define RTE_FLEX_FILTER_MAXLEN 128 /**< bytes to use in flex filter. */
-#define RTE_FLEX_FILTER_MASK_SIZE \
- (RTE_ALIGN(RTE_FLEX_FILTER_MAXLEN, CHAR_BIT) / CHAR_BIT)
- /**< mask bytes in flex filter. */
-
-/**
- * A structure used to define the flex filter entry
- * to support RTE_ETH_FILTER_FLEXIBLE with RTE_ETH_FILTER_ADD,
- * RTE_ETH_FILTER_DELETE and RTE_ETH_FILTER_GET operations.
- */
-struct rte_eth_flex_filter {
- uint16_t len;
- uint8_t bytes[RTE_FLEX_FILTER_MAXLEN]; /**< flex bytes in big endian.*/
- uint8_t mask[RTE_FLEX_FILTER_MASK_SIZE]; /**< if mask bit is 1b, do
- not compare corresponding byte. */
- uint8_t priority;
- uint16_t queue; /**< Queue assigned to when match. */
-};
-
-/**
- * A structure used to define the TCP syn filter entry
- * to support RTE_ETH_FILTER_SYN with RTE_ETH_FILTER_ADD,
- * RTE_ETH_FILTER_DELETE and RTE_ETH_FILTER_GET operations.
- */
-struct rte_eth_syn_filter {
- uint8_t hig_pri; /**< 1 - higher priority than other filters,
- 0 - lower priority. */
- uint16_t queue; /**< Queue assigned to when match */
-};
-
-/**
- * Define all structures for ntuple Filter type.
- */
-
-#define RTE_NTUPLE_FLAGS_DST_IP 0x0001 /**< If set, dst_ip is part of ntuple */
-#define RTE_NTUPLE_FLAGS_SRC_IP 0x0002 /**< If set, src_ip is part of ntuple */
-#define RTE_NTUPLE_FLAGS_DST_PORT 0x0004 /**< If set, dst_port is part of ntuple */
-#define RTE_NTUPLE_FLAGS_SRC_PORT 0x0008 /**< If set, src_port is part of ntuple */
-#define RTE_NTUPLE_FLAGS_PROTO 0x0010 /**< If set, protocol is part of ntuple */
-#define RTE_NTUPLE_FLAGS_TCP_FLAG 0x0020 /**< If set, tcp flag is involved */
-
-#define RTE_5TUPLE_FLAGS ( \
- RTE_NTUPLE_FLAGS_DST_IP | \
- RTE_NTUPLE_FLAGS_SRC_IP | \
- RTE_NTUPLE_FLAGS_DST_PORT | \
- RTE_NTUPLE_FLAGS_SRC_PORT | \
- RTE_NTUPLE_FLAGS_PROTO)
-
-#define RTE_2TUPLE_FLAGS ( \
- RTE_NTUPLE_FLAGS_DST_PORT | \
- RTE_NTUPLE_FLAGS_PROTO)
-
-#define TCP_URG_FLAG 0x20
-#define TCP_ACK_FLAG 0x10
-#define TCP_PSH_FLAG 0x08
-#define TCP_RST_FLAG 0x04
-#define TCP_SYN_FLAG 0x02
-#define TCP_FIN_FLAG 0x01
-#define TCP_FLAG_ALL 0x3F
-
-/**
- * A structure used to define the ntuple filter entry
- * to support RTE_ETH_FILTER_NTUPLE with RTE_ETH_FILTER_ADD,
- * RTE_ETH_FILTER_DELETE and RTE_ETH_FILTER_GET operations.
- */
-struct rte_eth_ntuple_filter {
- uint16_t flags; /**< Flags from RTE_NTUPLE_FLAGS_* */
- uint32_t dst_ip; /**< Destination IP address in big endian. */
- uint32_t dst_ip_mask; /**< Mask of destination IP address. */
- uint32_t src_ip; /**< Source IP address in big endian. */
- uint32_t src_ip_mask; /**< Mask of destination IP address. */
- uint16_t dst_port; /**< Destination port in big endian. */
- uint16_t dst_port_mask; /**< Mask of destination port. */
- uint16_t src_port; /**< Source Port in big endian. */
- uint16_t src_port_mask; /**< Mask of source port. */
- uint8_t proto; /**< L4 protocol. */
- uint8_t proto_mask; /**< Mask of L4 protocol. */
- /** tcp_flags only meaningful when the proto is TCP.
- The packet matched above ntuple fields and contain
- any set bit in tcp_flags will hit this filter. */
- uint8_t tcp_flags;
- uint16_t priority; /**< seven levels (001b-111b), 111b is highest,
- used when more than one filter matches. */
- uint16_t queue; /**< Queue assigned to when match*/
-};
-
-/**
- * Tunneled type.
- */
-enum rte_eth_tunnel_type {
- RTE_TUNNEL_TYPE_NONE = 0,
- RTE_TUNNEL_TYPE_VXLAN,
- RTE_TUNNEL_TYPE_GENEVE,
- RTE_TUNNEL_TYPE_TEREDO,
- RTE_TUNNEL_TYPE_NVGRE,
- RTE_TUNNEL_TYPE_IP_IN_GRE,
- RTE_L2_TUNNEL_TYPE_E_TAG,
- RTE_TUNNEL_TYPE_MAX,
-};
-
-/**
- * filter type of tunneling packet
- */
-#define ETH_TUNNEL_FILTER_OMAC 0x01 /**< filter by outer MAC addr */
-#define ETH_TUNNEL_FILTER_OIP 0x02 /**< filter by outer IP Addr */
-#define ETH_TUNNEL_FILTER_TENID 0x04 /**< filter by tenant ID */
-#define ETH_TUNNEL_FILTER_IMAC 0x08 /**< filter by inner MAC addr */
-#define ETH_TUNNEL_FILTER_IVLAN 0x10 /**< filter by inner VLAN ID */
-#define ETH_TUNNEL_FILTER_IIP 0x20 /**< filter by inner IP addr */
-
-#define RTE_TUNNEL_FILTER_IMAC_IVLAN (ETH_TUNNEL_FILTER_IMAC | \
- ETH_TUNNEL_FILTER_IVLAN)
-#define RTE_TUNNEL_FILTER_IMAC_IVLAN_TENID (ETH_TUNNEL_FILTER_IMAC | \
- ETH_TUNNEL_FILTER_IVLAN | \
- ETH_TUNNEL_FILTER_TENID)
-#define RTE_TUNNEL_FILTER_IMAC_TENID (ETH_TUNNEL_FILTER_IMAC | \
- ETH_TUNNEL_FILTER_TENID)
-#define RTE_TUNNEL_FILTER_OMAC_TENID_IMAC (ETH_TUNNEL_FILTER_OMAC | \
- ETH_TUNNEL_FILTER_TENID | \
- ETH_TUNNEL_FILTER_IMAC)
-
-/**
- * Select IPv4 or IPv6 for tunnel filters.
- */
-enum rte_tunnel_iptype {
- RTE_TUNNEL_IPTYPE_IPV4 = 0, /**< IPv4. */
- RTE_TUNNEL_IPTYPE_IPV6, /**< IPv6. */
-};
-
-/**
- * Tunneling Packet filter configuration.
- */
-struct rte_eth_tunnel_filter_conf {
- struct ether_addr outer_mac; /**< Outer MAC address to match. */
- struct ether_addr inner_mac; /**< Inner MAC address to match. */
- uint16_t inner_vlan; /**< Inner VLAN to match. */
- enum rte_tunnel_iptype ip_type; /**< IP address type. */
- /** Outer destination IP address to match if ETH_TUNNEL_FILTER_OIP
- is set in filter_type, or inner destination IP address to match
- if ETH_TUNNEL_FILTER_IIP is set in filter_type . */
- union {
- uint32_t ipv4_addr; /**< IPv4 address in big endian. */
- uint32_t ipv6_addr[4]; /**< IPv6 address in big endian. */
- } ip_addr;
- /** Flags from ETH_TUNNEL_FILTER_XX - see above. */
- uint16_t filter_type;
- enum rte_eth_tunnel_type tunnel_type; /**< Tunnel Type. */
- uint32_t tenant_id; /**< Tenant ID to match. VNI, GRE key... */
- uint16_t queue_id; /**< Queue assigned to if match. */
-};
-
-/**
- * Global eth device configuration type.
- */
-enum rte_eth_global_cfg_type {
- RTE_ETH_GLOBAL_CFG_TYPE_UNKNOWN = 0,
- RTE_ETH_GLOBAL_CFG_TYPE_GRE_KEY_LEN,
- RTE_ETH_GLOBAL_CFG_TYPE_MAX,
-};
-
-/**
- * Global eth device configuration.
- */
-struct rte_eth_global_cfg {
- enum rte_eth_global_cfg_type cfg_type; /**< Global config type. */
- union {
- uint8_t gre_key_len; /**< Valid GRE key length in byte. */
- uint64_t reserved; /**< Reserve space for future use. */
- } cfg;
-};
-
-#define RTE_ETH_FDIR_MAX_FLEXLEN 16 /**< Max length of flexbytes. */
-#define RTE_ETH_INSET_SIZE_MAX 128 /**< Max length of input set. */
-
-/**
- * Input set fields for Flow Director and Hash filters
- */
-enum rte_eth_input_set_field {
- RTE_ETH_INPUT_SET_UNKNOWN = 0,
-
- /* L2 */
- RTE_ETH_INPUT_SET_L2_SRC_MAC = 1,
- RTE_ETH_INPUT_SET_L2_DST_MAC,
- RTE_ETH_INPUT_SET_L2_OUTER_VLAN,
- RTE_ETH_INPUT_SET_L2_INNER_VLAN,
- RTE_ETH_INPUT_SET_L2_ETHERTYPE,
-
- /* L3 */
- RTE_ETH_INPUT_SET_L3_SRC_IP4 = 129,
- RTE_ETH_INPUT_SET_L3_DST_IP4,
- RTE_ETH_INPUT_SET_L3_SRC_IP6,
- RTE_ETH_INPUT_SET_L3_DST_IP6,
- RTE_ETH_INPUT_SET_L3_IP4_TOS,
- RTE_ETH_INPUT_SET_L3_IP4_PROTO,
- RTE_ETH_INPUT_SET_L3_IP6_TC,
- RTE_ETH_INPUT_SET_L3_IP6_NEXT_HEADER,
- RTE_ETH_INPUT_SET_L3_IP4_TTL,
- RTE_ETH_INPUT_SET_L3_IP6_HOP_LIMITS,
-
- /* L4 */
- RTE_ETH_INPUT_SET_L4_UDP_SRC_PORT = 257,
- RTE_ETH_INPUT_SET_L4_UDP_DST_PORT,
- RTE_ETH_INPUT_SET_L4_TCP_SRC_PORT,
- RTE_ETH_INPUT_SET_L4_TCP_DST_PORT,
- RTE_ETH_INPUT_SET_L4_SCTP_SRC_PORT,
- RTE_ETH_INPUT_SET_L4_SCTP_DST_PORT,
- RTE_ETH_INPUT_SET_L4_SCTP_VERIFICATION_TAG,
-
- /* Tunnel */
- RTE_ETH_INPUT_SET_TUNNEL_L2_INNER_DST_MAC = 385,
- RTE_ETH_INPUT_SET_TUNNEL_L2_INNER_SRC_MAC,
- RTE_ETH_INPUT_SET_TUNNEL_L2_INNER_VLAN,
- RTE_ETH_INPUT_SET_TUNNEL_L4_UDP_KEY,
- RTE_ETH_INPUT_SET_TUNNEL_GRE_KEY,
-
- /* Flexible Payload */
- RTE_ETH_INPUT_SET_FLEX_PAYLOAD_1ST_WORD = 641,
- RTE_ETH_INPUT_SET_FLEX_PAYLOAD_2ND_WORD,
- RTE_ETH_INPUT_SET_FLEX_PAYLOAD_3RD_WORD,
- RTE_ETH_INPUT_SET_FLEX_PAYLOAD_4TH_WORD,
- RTE_ETH_INPUT_SET_FLEX_PAYLOAD_5TH_WORD,
- RTE_ETH_INPUT_SET_FLEX_PAYLOAD_6TH_WORD,
- RTE_ETH_INPUT_SET_FLEX_PAYLOAD_7TH_WORD,
- RTE_ETH_INPUT_SET_FLEX_PAYLOAD_8TH_WORD,
-
- RTE_ETH_INPUT_SET_DEFAULT = 65533,
- RTE_ETH_INPUT_SET_NONE = 65534,
- RTE_ETH_INPUT_SET_MAX = 65535,
-};
-
-/**
- * Filters input set operations
- */
-enum rte_filter_input_set_op {
- RTE_ETH_INPUT_SET_OP_UNKNOWN,
- RTE_ETH_INPUT_SET_SELECT, /**< select input set */
- RTE_ETH_INPUT_SET_ADD, /**< add input set entry */
- RTE_ETH_INPUT_SET_OP_MAX
-};
-
-
-/**
- * A structure used to define the input set configuration for
- * flow director and hash filters
- */
-struct rte_eth_input_set_conf {
- uint16_t flow_type;
- uint16_t inset_size;
- enum rte_eth_input_set_field field[RTE_ETH_INSET_SIZE_MAX];
- enum rte_filter_input_set_op op;
-};
-
-/**
- * A structure used to define the input for L2 flow
- */
-struct rte_eth_l2_flow {
- uint16_t ether_type; /**< Ether type in big endian */
-};
-
-/**
- * A structure used to define the input for IPV4 flow
- */
-struct rte_eth_ipv4_flow {
- uint32_t src_ip; /**< IPv4 source address in big endian. */
- uint32_t dst_ip; /**< IPv4 destination address in big endian. */
- uint8_t tos; /**< Type of service to match. */
- uint8_t ttl; /**< Time to live to match. */
- uint8_t proto; /**< Protocol, next header in big endian. */
-};
-
-/**
- * A structure used to define the input for IPV4 UDP flow
- */
-struct rte_eth_udpv4_flow {
- struct rte_eth_ipv4_flow ip; /**< IPv4 fields to match. */
- uint16_t src_port; /**< UDP source port in big endian. */
- uint16_t dst_port; /**< UDP destination port in big endian. */
-};
-
-/**
- * A structure used to define the input for IPV4 TCP flow
- */
-struct rte_eth_tcpv4_flow {
- struct rte_eth_ipv4_flow ip; /**< IPv4 fields to match. */
- uint16_t src_port; /**< TCP source port in big endian. */
- uint16_t dst_port; /**< TCP destination port in big endian. */
-};
-
-/**
- * A structure used to define the input for IPV4 SCTP flow
- */
-struct rte_eth_sctpv4_flow {
- struct rte_eth_ipv4_flow ip; /**< IPv4 fields to match. */
- uint16_t src_port; /**< SCTP source port in big endian. */
- uint16_t dst_port; /**< SCTP destination port in big endian. */
- uint32_t verify_tag; /**< Verify tag in big endian */
-};
-
-/**
- * A structure used to define the input for IPV6 flow
- */
-struct rte_eth_ipv6_flow {
- uint32_t src_ip[4]; /**< IPv6 source address in big endian. */
- uint32_t dst_ip[4]; /**< IPv6 destination address in big endian. */
- uint8_t tc; /**< Traffic class to match. */
- uint8_t proto; /**< Protocol, next header to match. */
- uint8_t hop_limits; /**< Hop limits to match. */
-};
-
-/**
- * A structure used to define the input for IPV6 UDP flow
- */
-struct rte_eth_udpv6_flow {
- struct rte_eth_ipv6_flow ip; /**< IPv6 fields to match. */
- uint16_t src_port; /**< UDP source port in big endian. */
- uint16_t dst_port; /**< UDP destination port in big endian. */
-};
-
-/**
- * A structure used to define the input for IPV6 TCP flow
- */
-struct rte_eth_tcpv6_flow {
- struct rte_eth_ipv6_flow ip; /**< IPv6 fields to match. */
- uint16_t src_port; /**< TCP source port to in big endian. */
- uint16_t dst_port; /**< TCP destination port in big endian. */
-};
-
-/**
- * A structure used to define the input for IPV6 SCTP flow
- */
-struct rte_eth_sctpv6_flow {
- struct rte_eth_ipv6_flow ip; /**< IPv6 fields to match. */
- uint16_t src_port; /**< SCTP source port in big endian. */
- uint16_t dst_port; /**< SCTP destination port in big endian. */
- uint32_t verify_tag; /**< Verify tag in big endian. */
-};
-
-/**
- * A structure used to define the input for MAC VLAN flow
- */
-struct rte_eth_mac_vlan_flow {
- struct ether_addr mac_addr; /**< Mac address to match. */
-};
-
-/**
- * Tunnel type for flow director.
- */
-enum rte_eth_fdir_tunnel_type {
- RTE_FDIR_TUNNEL_TYPE_UNKNOWN = 0,
- RTE_FDIR_TUNNEL_TYPE_NVGRE,
- RTE_FDIR_TUNNEL_TYPE_VXLAN,
-};
-
-/**
- * A structure used to define the input for tunnel flow, now it's VxLAN or
- * NVGRE
- */
-struct rte_eth_tunnel_flow {
- enum rte_eth_fdir_tunnel_type tunnel_type; /**< Tunnel type to match. */
- /** Tunnel ID to match. TNI, VNI... in big endian. */
- uint32_t tunnel_id;
- struct ether_addr mac_addr; /**< Mac address to match. */
-};
-
-/**
- * An union contains the inputs for all types of flow
- * Items in flows need to be in big endian
- */
-union rte_eth_fdir_flow {
- struct rte_eth_l2_flow l2_flow;
- struct rte_eth_udpv4_flow udp4_flow;
- struct rte_eth_tcpv4_flow tcp4_flow;
- struct rte_eth_sctpv4_flow sctp4_flow;
- struct rte_eth_ipv4_flow ip4_flow;
- struct rte_eth_udpv6_flow udp6_flow;
- struct rte_eth_tcpv6_flow tcp6_flow;
- struct rte_eth_sctpv6_flow sctp6_flow;
- struct rte_eth_ipv6_flow ipv6_flow;
- struct rte_eth_mac_vlan_flow mac_vlan_flow;
- struct rte_eth_tunnel_flow tunnel_flow;
-};
-
-/**
- * A structure used to contain extend input of flow
- */
-struct rte_eth_fdir_flow_ext {
- uint16_t vlan_tci;
- uint8_t flexbytes[RTE_ETH_FDIR_MAX_FLEXLEN];
- /**< It is filled by the flexible payload to match. */
- uint8_t is_vf; /**< 1 for VF, 0 for port dev */
- uint16_t dst_id; /**< VF ID, available when is_vf is 1*/
-};
-
-/**
- * A structure used to define the input for a flow director filter entry
- */
-struct rte_eth_fdir_input {
- uint16_t flow_type;
- union rte_eth_fdir_flow flow;
- /**< Flow fields to match, dependent on flow_type */
- struct rte_eth_fdir_flow_ext flow_ext;
- /**< Additional fields to match */
-};
-
-/**
- * Behavior will be taken if FDIR match
- */
-enum rte_eth_fdir_behavior {
- RTE_ETH_FDIR_ACCEPT = 0,
- RTE_ETH_FDIR_REJECT,
- RTE_ETH_FDIR_PASSTHRU,
-};
-
-/**
- * Flow director report status
- * It defines what will be reported if FDIR entry is matched.
- */
-enum rte_eth_fdir_status {
- RTE_ETH_FDIR_NO_REPORT_STATUS = 0, /**< Report nothing. */
- RTE_ETH_FDIR_REPORT_ID, /**< Only report FD ID. */
- RTE_ETH_FDIR_REPORT_ID_FLEX_4, /**< Report FD ID and 4 flex bytes. */
- RTE_ETH_FDIR_REPORT_FLEX_8, /**< Report 8 flex bytes. */
-};
-
-/**
- * A structure used to define an action when match FDIR packet filter.
- */
-struct rte_eth_fdir_action {
- uint16_t rx_queue; /**< Queue assigned to if FDIR match. */
- enum rte_eth_fdir_behavior behavior; /**< Behavior will be taken */
- enum rte_eth_fdir_status report_status; /**< Status report option */
- uint8_t flex_off;
- /**< If report_status is RTE_ETH_FDIR_REPORT_ID_FLEX_4 or
- RTE_ETH_FDIR_REPORT_FLEX_8, flex_off specifies where the reported
- flex bytes start from in flexible payload. */
-};
-
-/**
- * A structure used to define the flow director filter entry by filter_ctrl API
- * It supports RTE_ETH_FILTER_FDIR with RTE_ETH_FILTER_ADD and
- * RTE_ETH_FILTER_DELETE operations.
- */
-struct rte_eth_fdir_filter {
- uint32_t soft_id;
- /**< ID, an unique value is required when deal with FDIR entry */
- struct rte_eth_fdir_input input; /**< Input set */
- struct rte_eth_fdir_action action; /**< Action taken when match */
-};
-
-/**
- * A structure used to configure FDIR masks that are used by the device
- * to match the various fields of RX packet headers.
- */
-struct rte_eth_fdir_masks {
- uint16_t vlan_tci_mask; /**< Bit mask for vlan_tci in big endian */
- /** Bit mask for ipv4 flow in big endian. */
- struct rte_eth_ipv4_flow ipv4_mask;
- /** Bit maks for ipv6 flow in big endian. */
- struct rte_eth_ipv6_flow ipv6_mask;
- /** Bit mask for L4 source port in big endian. */
- uint16_t src_port_mask;
- /** Bit mask for L4 destination port in big endian. */
- uint16_t dst_port_mask;
- /** 6 bit mask for proper 6 bytes of Mac address, bit 0 matches the
- first byte on the wire */
- uint8_t mac_addr_byte_mask;
- /** Bit mask for tunnel ID in big endian. */
- uint32_t tunnel_id_mask;
- uint8_t tunnel_type_mask; /**< 1 - Match tunnel type,
- 0 - Ignore tunnel type. */
-};
-
-/**
- * Payload type
- */
-enum rte_eth_payload_type {
- RTE_ETH_PAYLOAD_UNKNOWN = 0,
- RTE_ETH_RAW_PAYLOAD,
- RTE_ETH_L2_PAYLOAD,
- RTE_ETH_L3_PAYLOAD,
- RTE_ETH_L4_PAYLOAD,
- RTE_ETH_PAYLOAD_MAX = 8,
-};
-
-/**
- * A structure used to select bytes extracted from the protocol layers to
- * flexible payload for filter
- */
-struct rte_eth_flex_payload_cfg {
- enum rte_eth_payload_type type; /**< Payload type */
- uint16_t src_offset[RTE_ETH_FDIR_MAX_FLEXLEN];
- /**< Offset in bytes from the beginning of packet's payload
- src_offset[i] indicates the flexbyte i's offset in original
- packet payload. This value should be less than
- flex_payload_limit in struct rte_eth_fdir_info.*/
-};
-
-/**
- * A structure used to define FDIR masks for flexible payload
- * for each flow type
- */
-struct rte_eth_fdir_flex_mask {
- uint16_t flow_type;
- uint8_t mask[RTE_ETH_FDIR_MAX_FLEXLEN];
- /**< Mask for the whole flexible payload */
-};
-
-/**
- * A structure used to define all flexible payload related setting
- * include flex payload and flex mask
- */
-struct rte_eth_fdir_flex_conf {
- uint16_t nb_payloads; /**< The number of following payload cfg */
- uint16_t nb_flexmasks; /**< The number of following mask */
- struct rte_eth_flex_payload_cfg flex_set[RTE_ETH_PAYLOAD_MAX];
- /**< Flex payload configuration for each payload type */
- struct rte_eth_fdir_flex_mask flex_mask[RTE_ETH_FLOW_MAX];
- /**< Flex mask configuration for each flow type */
-};
-
-/**
- * Flow Director setting modes: none, signature or perfect.
- */
-enum rte_fdir_mode {
- RTE_FDIR_MODE_NONE = 0, /**< Disable FDIR support. */
- RTE_FDIR_MODE_SIGNATURE, /**< Enable FDIR signature filter mode. */
- RTE_FDIR_MODE_PERFECT, /**< Enable FDIR perfect filter mode. */
- RTE_FDIR_MODE_PERFECT_MAC_VLAN, /**< Enable FDIR filter mode - MAC VLAN. */
- RTE_FDIR_MODE_PERFECT_TUNNEL, /**< Enable FDIR filter mode - tunnel. */
-};
-
-#define UINT64_BIT (CHAR_BIT * sizeof(uint64_t))
-#define RTE_FLOW_MASK_ARRAY_SIZE \
- (RTE_ALIGN(RTE_ETH_FLOW_MAX, UINT64_BIT)/UINT64_BIT)
-
-/**
- * A structure used to get the information of flow director filter.
- * It supports RTE_ETH_FILTER_FDIR with RTE_ETH_FILTER_INFO operation.
- * It includes the mode, flexible payload configuration information,
- * capabilities and supported flow types, flexible payload characters.
- * It can be gotten to help taking specific configurations per device.
- */
-struct rte_eth_fdir_info {
- enum rte_fdir_mode mode; /**< Flow director mode */
- struct rte_eth_fdir_masks mask;
- /** Flex payload configuration information */
- struct rte_eth_fdir_flex_conf flex_conf;
- uint32_t guarant_spc; /**< Guaranteed spaces.*/
- uint32_t best_spc; /**< Best effort spaces.*/
- /** Bit mask for every supported flow type. */
- uint64_t flow_types_mask[RTE_FLOW_MASK_ARRAY_SIZE];
- uint32_t max_flexpayload; /**< Total flex payload in bytes. */
- /** Flexible payload unit in bytes. Size and alignments of all flex
- payload segments should be multiplies of this value. */
- uint32_t flex_payload_unit;
- /** Max number of flexible payload continuous segments.
- Each segment should be a multiple of flex_payload_unit.*/
- uint32_t max_flex_payload_segment_num;
- /** Maximum src_offset in bytes allowed. It indicates that
- src_offset[i] in struct rte_eth_flex_payload_cfg should be less
- than this value. */
- uint16_t flex_payload_limit;
- /** Flex bitmask unit in bytes. Size of flex bitmasks should be a
- multiply of this value. */
- uint32_t flex_bitmask_unit;
- /** Max supported size of flex bitmasks in flex_bitmask_unit */
- uint32_t max_flex_bitmask_num;
-};
-
-/**
- * A structure used to define the statistics of flow director.
- * It supports RTE_ETH_FILTER_FDIR with RTE_ETH_FILTER_STATS operation.
- */
-struct rte_eth_fdir_stats {
- uint32_t collision; /**< Number of filters with collision. */
- uint32_t free; /**< Number of free filters. */
- uint32_t maxhash;
- /**< The lookup hash value of the added filter that updated the value
- of the MAXLEN field */
- uint32_t maxlen; /**< Longest linked list of filters. */
- uint64_t add; /**< Number of added filters. */
- uint64_t remove; /**< Number of removed filters. */
- uint64_t f_add; /**< Number of failed added filters. */
- uint64_t f_remove; /**< Number of failed removed filters. */
- uint32_t guarant_cnt; /**< Number of filters in guaranteed spaces. */
- uint32_t best_cnt; /**< Number of filters in best effort spaces. */
-};
-
-/**
- * Flow Director filter information types.
- */
-enum rte_eth_fdir_filter_info_type {
- RTE_ETH_FDIR_FILTER_INFO_TYPE_UNKNOWN = 0,
- /** Flow Director filter input set configuration */
- RTE_ETH_FDIR_FILTER_INPUT_SET_SELECT,
- RTE_ETH_FDIR_FILTER_INFO_TYPE_MAX,
-};
-
-/**
- * A structure used to set FDIR filter information, to support filter type
- * of 'RTE_ETH_FILTER_FDIR' RTE_ETH_FDIR_FILTER_INPUT_SET_SELECT operation.
- */
-struct rte_eth_fdir_filter_info {
- enum rte_eth_fdir_filter_info_type info_type; /**< Information type */
- /** Details of fdir filter information */
- union {
- /** Flow Director input set configuration per port */
- struct rte_eth_input_set_conf input_set_conf;
- } info;
-};
-
-/**
- * Hash filter information types.
- * - RTE_ETH_HASH_FILTER_SYM_HASH_ENA_PER_PORT is for getting/setting the
- * information/configuration of 'symmetric hash enable' per port.
- * - RTE_ETH_HASH_FILTER_GLOBAL_CONFIG is for getting/setting the global
- * configurations of hash filters. Those global configurations are valid
- * for all ports of the same NIC.
- * - RTE_ETH_HASH_FILTER_INPUT_SET_SELECT is for setting the global
- * hash input set fields
- */
-enum rte_eth_hash_filter_info_type {
- RTE_ETH_HASH_FILTER_INFO_TYPE_UNKNOWN = 0,
- /** Symmetric hash enable per port */
- RTE_ETH_HASH_FILTER_SYM_HASH_ENA_PER_PORT,
- /** Configure globally for hash filter */
- RTE_ETH_HASH_FILTER_GLOBAL_CONFIG,
- /** Global Hash filter input set configuration */
- RTE_ETH_HASH_FILTER_INPUT_SET_SELECT,
- RTE_ETH_HASH_FILTER_INFO_TYPE_MAX,
-};
-
-/**
- * Hash function types.
- */
-enum rte_eth_hash_function {
- RTE_ETH_HASH_FUNCTION_DEFAULT = 0,
- RTE_ETH_HASH_FUNCTION_TOEPLITZ, /**< Toeplitz */
- RTE_ETH_HASH_FUNCTION_SIMPLE_XOR, /**< Simple XOR */
- RTE_ETH_HASH_FUNCTION_MAX,
-};
-
-#define RTE_SYM_HASH_MASK_ARRAY_SIZE \
- (RTE_ALIGN(RTE_ETH_FLOW_MAX, UINT64_BIT)/UINT64_BIT)
-/**
- * A structure used to set or get global hash function configurations which
- * include symmetric hash enable per flow type and hash function type.
- * Each bit in sym_hash_enable_mask[] indicates if the symmetric hash of the
- * corresponding flow type is enabled or not.
- * Each bit in valid_bit_mask[] indicates if the corresponding bit in
- * sym_hash_enable_mask[] is valid or not. For the configurations gotten, it
- * also means if the flow type is supported by hardware or not.
- */
-struct rte_eth_hash_global_conf {
- enum rte_eth_hash_function hash_func; /**< Hash function type */
- /** Bit mask for symmetric hash enable per flow type */
- uint64_t sym_hash_enable_mask[RTE_SYM_HASH_MASK_ARRAY_SIZE];
- /** Bit mask indicates if the corresponding bit is valid */
- uint64_t valid_bit_mask[RTE_SYM_HASH_MASK_ARRAY_SIZE];
-};
-
-/**
- * A structure used to set or get hash filter information, to support filter
- * type of 'RTE_ETH_FILTER_HASH' and its operations.
- */
-struct rte_eth_hash_filter_info {
- enum rte_eth_hash_filter_info_type info_type; /**< Information type */
- /** Details of hash filter information */
- union {
- /** For RTE_ETH_HASH_FILTER_SYM_HASH_ENA_PER_PORT */
- uint8_t enable;
- /** Global configurations of hash filter */
- struct rte_eth_hash_global_conf global_conf;
- /** Global configurations of hash filter input set */
- struct rte_eth_input_set_conf input_set_conf;
- } info;
-};
-
-/**
- * l2 tunnel configuration.
- */
-struct rte_eth_l2_tunnel_conf {
- enum rte_eth_tunnel_type l2_tunnel_type;
- uint16_t ether_type; /* ether type in l2 header */
- uint32_t tunnel_id; /* port tag id for e-tag */
- uint16_t vf_id; /* VF id for tag insertion */
- uint32_t pool; /* destination pool for tag based forwarding */
-};
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _RTE_ETH_CTRL_H_ */
diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
deleted file mode 100644
index 0590f0c1..00000000
--- a/lib/librte_ether/rte_ethdev.c
+++ /dev/null
@@ -1,4170 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2017 Intel Corporation
- */
-
-#include <sys/types.h>
-#include <sys/queue.h>
-#include <ctype.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdarg.h>
-#include <errno.h>
-#include <stdint.h>
-#include <inttypes.h>
-#include <netinet/in.h>
-
-#include <rte_byteorder.h>
-#include <rte_log.h>
-#include <rte_debug.h>
-#include <rte_interrupts.h>
-#include <rte_memory.h>
-#include <rte_memcpy.h>
-#include <rte_memzone.h>
-#include <rte_launch.h>
-#include <rte_eal.h>
-#include <rte_per_lcore.h>
-#include <rte_lcore.h>
-#include <rte_atomic.h>
-#include <rte_branch_prediction.h>
-#include <rte_common.h>
-#include <rte_mempool.h>
-#include <rte_malloc.h>
-#include <rte_mbuf.h>
-#include <rte_errno.h>
-#include <rte_spinlock.h>
-#include <rte_string_fns.h>
-#include <rte_compat.h>
-
-#include "rte_ether.h"
-#include "rte_ethdev.h"
-#include "rte_ethdev_driver.h"
-#include "ethdev_profile.h"
-
-static const char *MZ_RTE_ETH_DEV_DATA = "rte_eth_dev_data";
-struct rte_eth_dev rte_eth_devices[RTE_MAX_ETHPORTS];
-static uint8_t eth_dev_last_created_port;
-
-/* spinlock for eth device callbacks */
-static rte_spinlock_t rte_eth_dev_cb_lock = RTE_SPINLOCK_INITIALIZER;
-
-/* spinlock for add/remove rx callbacks */
-static rte_spinlock_t rte_eth_rx_cb_lock = RTE_SPINLOCK_INITIALIZER;
-
-/* spinlock for add/remove tx callbacks */
-static rte_spinlock_t rte_eth_tx_cb_lock = RTE_SPINLOCK_INITIALIZER;
-
-/* spinlock for shared data allocation */
-static rte_spinlock_t rte_eth_shared_data_lock = RTE_SPINLOCK_INITIALIZER;
-
-/* store statistics names and its offset in stats structure */
-struct rte_eth_xstats_name_off {
- char name[RTE_ETH_XSTATS_NAME_SIZE];
- unsigned offset;
-};
-
-/* Shared memory between primary and secondary processes. */
-static struct {
- uint64_t next_owner_id;
- rte_spinlock_t ownership_lock;
- struct rte_eth_dev_data data[RTE_MAX_ETHPORTS];
-} *rte_eth_dev_shared_data;
-
-static const struct rte_eth_xstats_name_off rte_stats_strings[] = {
- {"rx_good_packets", offsetof(struct rte_eth_stats, ipackets)},
- {"tx_good_packets", offsetof(struct rte_eth_stats, opackets)},
- {"rx_good_bytes", offsetof(struct rte_eth_stats, ibytes)},
- {"tx_good_bytes", offsetof(struct rte_eth_stats, obytes)},
- {"rx_missed_errors", offsetof(struct rte_eth_stats, imissed)},
- {"rx_errors", offsetof(struct rte_eth_stats, ierrors)},
- {"tx_errors", offsetof(struct rte_eth_stats, oerrors)},
- {"rx_mbuf_allocation_errors", offsetof(struct rte_eth_stats,
- rx_nombuf)},
-};
-
-#define RTE_NB_STATS (sizeof(rte_stats_strings) / sizeof(rte_stats_strings[0]))
-
-static const struct rte_eth_xstats_name_off rte_rxq_stats_strings[] = {
- {"packets", offsetof(struct rte_eth_stats, q_ipackets)},
- {"bytes", offsetof(struct rte_eth_stats, q_ibytes)},
- {"errors", offsetof(struct rte_eth_stats, q_errors)},
-};
-
-#define RTE_NB_RXQ_STATS (sizeof(rte_rxq_stats_strings) / \
- sizeof(rte_rxq_stats_strings[0]))
-
-static const struct rte_eth_xstats_name_off rte_txq_stats_strings[] = {
- {"packets", offsetof(struct rte_eth_stats, q_opackets)},
- {"bytes", offsetof(struct rte_eth_stats, q_obytes)},
-};
-#define RTE_NB_TXQ_STATS (sizeof(rte_txq_stats_strings) / \
- sizeof(rte_txq_stats_strings[0]))
-
-#define RTE_RX_OFFLOAD_BIT2STR(_name) \
- { DEV_RX_OFFLOAD_##_name, #_name }
-
-static const struct {
- uint64_t offload;
- const char *name;
-} rte_rx_offload_names[] = {
- RTE_RX_OFFLOAD_BIT2STR(VLAN_STRIP),
- RTE_RX_OFFLOAD_BIT2STR(IPV4_CKSUM),
- RTE_RX_OFFLOAD_BIT2STR(UDP_CKSUM),
- RTE_RX_OFFLOAD_BIT2STR(TCP_CKSUM),
- RTE_RX_OFFLOAD_BIT2STR(TCP_LRO),
- RTE_RX_OFFLOAD_BIT2STR(QINQ_STRIP),
- RTE_RX_OFFLOAD_BIT2STR(OUTER_IPV4_CKSUM),
- RTE_RX_OFFLOAD_BIT2STR(MACSEC_STRIP),
- RTE_RX_OFFLOAD_BIT2STR(HEADER_SPLIT),
- RTE_RX_OFFLOAD_BIT2STR(VLAN_FILTER),
- RTE_RX_OFFLOAD_BIT2STR(VLAN_EXTEND),
- RTE_RX_OFFLOAD_BIT2STR(JUMBO_FRAME),
- RTE_RX_OFFLOAD_BIT2STR(CRC_STRIP),
- RTE_RX_OFFLOAD_BIT2STR(SCATTER),
- RTE_RX_OFFLOAD_BIT2STR(TIMESTAMP),
- RTE_RX_OFFLOAD_BIT2STR(SECURITY),
-};
-
-#undef RTE_RX_OFFLOAD_BIT2STR
-
-#define RTE_TX_OFFLOAD_BIT2STR(_name) \
- { DEV_TX_OFFLOAD_##_name, #_name }
-
-static const struct {
- uint64_t offload;
- const char *name;
-} rte_tx_offload_names[] = {
- RTE_TX_OFFLOAD_BIT2STR(VLAN_INSERT),
- RTE_TX_OFFLOAD_BIT2STR(IPV4_CKSUM),
- RTE_TX_OFFLOAD_BIT2STR(UDP_CKSUM),
- RTE_TX_OFFLOAD_BIT2STR(TCP_CKSUM),
- RTE_TX_OFFLOAD_BIT2STR(SCTP_CKSUM),
- RTE_TX_OFFLOAD_BIT2STR(TCP_TSO),
- RTE_TX_OFFLOAD_BIT2STR(UDP_TSO),
- RTE_TX_OFFLOAD_BIT2STR(OUTER_IPV4_CKSUM),
- RTE_TX_OFFLOAD_BIT2STR(QINQ_INSERT),
- RTE_TX_OFFLOAD_BIT2STR(VXLAN_TNL_TSO),
- RTE_TX_OFFLOAD_BIT2STR(GRE_TNL_TSO),
- RTE_TX_OFFLOAD_BIT2STR(IPIP_TNL_TSO),
- RTE_TX_OFFLOAD_BIT2STR(GENEVE_TNL_TSO),
- RTE_TX_OFFLOAD_BIT2STR(MACSEC_INSERT),
- RTE_TX_OFFLOAD_BIT2STR(MT_LOCKFREE),
- RTE_TX_OFFLOAD_BIT2STR(MULTI_SEGS),
- RTE_TX_OFFLOAD_BIT2STR(MBUF_FAST_FREE),
- RTE_TX_OFFLOAD_BIT2STR(SECURITY),
-};
-
-#undef RTE_TX_OFFLOAD_BIT2STR
-
-/**
- * The user application callback description.
- *
- * It contains callback address to be registered by user application,
- * the pointer to the parameters for callback, and the event type.
- */
-struct rte_eth_dev_callback {
- TAILQ_ENTRY(rte_eth_dev_callback) next; /**< Callbacks list */
- rte_eth_dev_cb_fn cb_fn; /**< Callback address */
- void *cb_arg; /**< Parameter for callback */
- void *ret_param; /**< Return parameter */
- enum rte_eth_event_type event; /**< Interrupt event type */
- uint32_t active; /**< Callback is executing */
-};
-
-enum {
- STAT_QMAP_TX = 0,
- STAT_QMAP_RX
-};
-
-uint16_t
-rte_eth_find_next(uint16_t port_id)
-{
- while (port_id < RTE_MAX_ETHPORTS &&
- rte_eth_devices[port_id].state != RTE_ETH_DEV_ATTACHED &&
- rte_eth_devices[port_id].state != RTE_ETH_DEV_REMOVED)
- port_id++;
-
- if (port_id >= RTE_MAX_ETHPORTS)
- return RTE_MAX_ETHPORTS;
-
- return port_id;
-}
-
-static void
-rte_eth_dev_shared_data_prepare(void)
-{
- const unsigned flags = 0;
- const struct rte_memzone *mz;
-
- rte_spinlock_lock(&rte_eth_shared_data_lock);
-
- if (rte_eth_dev_shared_data == NULL) {
- if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
- /* Allocate port data and ownership shared memory. */
- mz = rte_memzone_reserve(MZ_RTE_ETH_DEV_DATA,
- sizeof(*rte_eth_dev_shared_data),
- rte_socket_id(), flags);
- } else
- mz = rte_memzone_lookup(MZ_RTE_ETH_DEV_DATA);
- if (mz == NULL)
- rte_panic("Cannot allocate ethdev shared data\n");
-
- rte_eth_dev_shared_data = mz->addr;
- if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
- rte_eth_dev_shared_data->next_owner_id =
- RTE_ETH_DEV_NO_OWNER + 1;
- rte_spinlock_init(&rte_eth_dev_shared_data->ownership_lock);
- memset(rte_eth_dev_shared_data->data, 0,
- sizeof(rte_eth_dev_shared_data->data));
- }
- }
-
- rte_spinlock_unlock(&rte_eth_shared_data_lock);
-}
-
-struct rte_eth_dev *
-rte_eth_dev_allocated(const char *name)
-{
- unsigned i;
-
- for (i = 0; i < RTE_MAX_ETHPORTS; i++) {
- if ((rte_eth_devices[i].state == RTE_ETH_DEV_ATTACHED) &&
- strcmp(rte_eth_devices[i].data->name, name) == 0)
- return &rte_eth_devices[i];
- }
- return NULL;
-}
-
-static uint16_t
-rte_eth_dev_find_free_port(void)
-{
- unsigned i;
-
- for (i = 0; i < RTE_MAX_ETHPORTS; i++) {
- /* Using shared name field to find a free port. */
- if (rte_eth_dev_shared_data->data[i].name[0] == '\0') {
- RTE_ASSERT(rte_eth_devices[i].state ==
- RTE_ETH_DEV_UNUSED);
- return i;
- }
- }
- return RTE_MAX_ETHPORTS;
-}
-
-static struct rte_eth_dev *
-eth_dev_get(uint16_t port_id)
-{
- struct rte_eth_dev *eth_dev = &rte_eth_devices[port_id];
-
- eth_dev->data = &rte_eth_dev_shared_data->data[port_id];
- eth_dev->state = RTE_ETH_DEV_ATTACHED;
-
- eth_dev_last_created_port = port_id;
-
- return eth_dev;
-}
-
-struct rte_eth_dev *
-rte_eth_dev_allocate(const char *name)
-{
- uint16_t port_id;
- struct rte_eth_dev *eth_dev = NULL;
-
- rte_eth_dev_shared_data_prepare();
-
- /* Synchronize port creation between primary and secondary threads. */
- rte_spinlock_lock(&rte_eth_dev_shared_data->ownership_lock);
-
- port_id = rte_eth_dev_find_free_port();
- if (port_id == RTE_MAX_ETHPORTS) {
- RTE_LOG(ERR, EAL, "Reached maximum number of Ethernet ports\n");
- goto unlock;
- }
-
- if (rte_eth_dev_allocated(name) != NULL) {
- RTE_LOG(ERR, EAL, "Ethernet Device with name %s already allocated!\n",
- name);
- goto unlock;
- }
-
- eth_dev = eth_dev_get(port_id);
- snprintf(eth_dev->data->name, sizeof(eth_dev->data->name), "%s", name);
- eth_dev->data->port_id = port_id;
- eth_dev->data->mtu = ETHER_MTU;
-
-unlock:
- rte_spinlock_unlock(&rte_eth_dev_shared_data->ownership_lock);
-
- if (eth_dev != NULL)
- _rte_eth_dev_callback_process(eth_dev, RTE_ETH_EVENT_NEW, NULL);
-
- return eth_dev;
-}
-
-/*
- * Attach to a port already registered by the primary process, which
- * makes sure that the same device would have the same port id both
- * in the primary and secondary process.
- */
-struct rte_eth_dev *
-rte_eth_dev_attach_secondary(const char *name)
-{
- uint16_t i;
- struct rte_eth_dev *eth_dev = NULL;
-
- rte_eth_dev_shared_data_prepare();
-
- /* Synchronize port attachment to primary port creation and release. */
- rte_spinlock_lock(&rte_eth_dev_shared_data->ownership_lock);
-
- for (i = 0; i < RTE_MAX_ETHPORTS; i++) {
- if (strcmp(rte_eth_dev_shared_data->data[i].name, name) == 0)
- break;
- }
- if (i == RTE_MAX_ETHPORTS) {
- RTE_PMD_DEBUG_TRACE(
- "device %s is not driven by the primary process\n",
- name);
- } else {
- eth_dev = eth_dev_get(i);
- RTE_ASSERT(eth_dev->data->port_id == i);
- }
-
- rte_spinlock_unlock(&rte_eth_dev_shared_data->ownership_lock);
- return eth_dev;
-}
-
-int
-rte_eth_dev_release_port(struct rte_eth_dev *eth_dev)
-{
- if (eth_dev == NULL)
- return -EINVAL;
-
- rte_eth_dev_shared_data_prepare();
-
- rte_spinlock_lock(&rte_eth_dev_shared_data->ownership_lock);
-
- eth_dev->state = RTE_ETH_DEV_UNUSED;
-
- memset(eth_dev->data, 0, sizeof(struct rte_eth_dev_data));
-
- rte_spinlock_unlock(&rte_eth_dev_shared_data->ownership_lock);
-
- _rte_eth_dev_callback_process(eth_dev, RTE_ETH_EVENT_DESTROY, NULL);
-
- return 0;
-}
-
-int
-rte_eth_dev_is_valid_port(uint16_t port_id)
-{
- if (port_id >= RTE_MAX_ETHPORTS ||
- (rte_eth_devices[port_id].state == RTE_ETH_DEV_UNUSED))
- return 0;
- else
- return 1;
-}
-
-static int
-rte_eth_is_valid_owner_id(uint64_t owner_id)
-{
- if (owner_id == RTE_ETH_DEV_NO_OWNER ||
- rte_eth_dev_shared_data->next_owner_id <= owner_id) {
- RTE_PMD_DEBUG_TRACE("Invalid owner_id=%016lX.\n", owner_id);
- return 0;
- }
- return 1;
-}
-
-uint64_t __rte_experimental
-rte_eth_find_next_owned_by(uint16_t port_id, const uint64_t owner_id)
-{
- while (port_id < RTE_MAX_ETHPORTS &&
- ((rte_eth_devices[port_id].state != RTE_ETH_DEV_ATTACHED &&
- rte_eth_devices[port_id].state != RTE_ETH_DEV_REMOVED) ||
- rte_eth_devices[port_id].data->owner.id != owner_id))
- port_id++;
-
- if (port_id >= RTE_MAX_ETHPORTS)
- return RTE_MAX_ETHPORTS;
-
- return port_id;
-}
-
-int __rte_experimental
-rte_eth_dev_owner_new(uint64_t *owner_id)
-{
- rte_eth_dev_shared_data_prepare();
-
- rte_spinlock_lock(&rte_eth_dev_shared_data->ownership_lock);
-
- *owner_id = rte_eth_dev_shared_data->next_owner_id++;
-
- rte_spinlock_unlock(&rte_eth_dev_shared_data->ownership_lock);
- return 0;
-}
-
-static int
-_rte_eth_dev_owner_set(const uint16_t port_id, const uint64_t old_owner_id,
- const struct rte_eth_dev_owner *new_owner)
-{
- struct rte_eth_dev_owner *port_owner;
- int sret;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
-
- if (!rte_eth_is_valid_owner_id(new_owner->id) &&
- !rte_eth_is_valid_owner_id(old_owner_id))
- return -EINVAL;
-
- port_owner = &rte_eth_devices[port_id].data->owner;
- if (port_owner->id != old_owner_id) {
- RTE_PMD_DEBUG_TRACE("Cannot set owner to port %d already owned"
- " by %s_%016lX.\n", port_id,
- port_owner->name, port_owner->id);
- return -EPERM;
- }
-
- sret = snprintf(port_owner->name, RTE_ETH_MAX_OWNER_NAME_LEN, "%s",
- new_owner->name);
- if (sret < 0 || sret >= RTE_ETH_MAX_OWNER_NAME_LEN)
- RTE_PMD_DEBUG_TRACE("Port %d owner name was truncated.\n",
- port_id);
-
- port_owner->id = new_owner->id;
-
- RTE_PMD_DEBUG_TRACE("Port %d owner is %s_%016lX.\n", port_id,
- new_owner->name, new_owner->id);
-
- return 0;
-}
-
-int __rte_experimental
-rte_eth_dev_owner_set(const uint16_t port_id,
- const struct rte_eth_dev_owner *owner)
-{
- int ret;
-
- rte_eth_dev_shared_data_prepare();
-
- rte_spinlock_lock(&rte_eth_dev_shared_data->ownership_lock);
-
- ret = _rte_eth_dev_owner_set(port_id, RTE_ETH_DEV_NO_OWNER, owner);
-
- rte_spinlock_unlock(&rte_eth_dev_shared_data->ownership_lock);
- return ret;
-}
-
-int __rte_experimental
-rte_eth_dev_owner_unset(const uint16_t port_id, const uint64_t owner_id)
-{
- const struct rte_eth_dev_owner new_owner = (struct rte_eth_dev_owner)
- {.id = RTE_ETH_DEV_NO_OWNER, .name = ""};
- int ret;
-
- rte_eth_dev_shared_data_prepare();
-
- rte_spinlock_lock(&rte_eth_dev_shared_data->ownership_lock);
-
- ret = _rte_eth_dev_owner_set(port_id, owner_id, &new_owner);
-
- rte_spinlock_unlock(&rte_eth_dev_shared_data->ownership_lock);
- return ret;
-}
-
-void __rte_experimental
-rte_eth_dev_owner_delete(const uint64_t owner_id)
-{
- uint16_t port_id;
-
- rte_eth_dev_shared_data_prepare();
-
- rte_spinlock_lock(&rte_eth_dev_shared_data->ownership_lock);
-
- if (rte_eth_is_valid_owner_id(owner_id)) {
- RTE_ETH_FOREACH_DEV_OWNED_BY(port_id, owner_id)
- memset(&rte_eth_devices[port_id].data->owner, 0,
- sizeof(struct rte_eth_dev_owner));
- RTE_PMD_DEBUG_TRACE("All port owners owned by %016X identifier"
- " have removed.\n", owner_id);
- }
-
- rte_spinlock_unlock(&rte_eth_dev_shared_data->ownership_lock);
-}
-
-int __rte_experimental
-rte_eth_dev_owner_get(const uint16_t port_id, struct rte_eth_dev_owner *owner)
-{
- int ret = 0;
-
- rte_eth_dev_shared_data_prepare();
-
- rte_spinlock_lock(&rte_eth_dev_shared_data->ownership_lock);
-
- if (!rte_eth_dev_is_valid_port(port_id)) {
- RTE_PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id);
- ret = -ENODEV;
- } else {
- rte_memcpy(owner, &rte_eth_devices[port_id].data->owner,
- sizeof(*owner));
- }
-
- rte_spinlock_unlock(&rte_eth_dev_shared_data->ownership_lock);
- return ret;
-}
-
-int
-rte_eth_dev_socket_id(uint16_t port_id)
-{
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -1);
- return rte_eth_devices[port_id].data->numa_node;
-}
-
-void *
-rte_eth_dev_get_sec_ctx(uint8_t port_id)
-{
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, NULL);
- return rte_eth_devices[port_id].security_ctx;
-}
-
-uint16_t
-rte_eth_dev_count(void)
-{
- uint16_t p;
- uint16_t count;
-
- count = 0;
-
- RTE_ETH_FOREACH_DEV(p)
- count++;
-
- return count;
-}
-
-int
-rte_eth_dev_get_name_by_port(uint16_t port_id, char *name)
-{
- char *tmp;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -EINVAL);
-
- if (name == NULL) {
- RTE_PMD_DEBUG_TRACE("Null pointer is specified\n");
- return -EINVAL;
- }
-
- /* shouldn't check 'rte_eth_devices[i].data',
- * because it might be overwritten by VDEV PMD */
- tmp = rte_eth_dev_shared_data->data[port_id].name;
- strcpy(name, tmp);
- return 0;
-}
-
-int
-rte_eth_dev_get_port_by_name(const char *name, uint16_t *port_id)
-{
- uint32_t pid;
-
- if (name == NULL) {
- RTE_PMD_DEBUG_TRACE("Null pointer is specified\n");
- return -EINVAL;
- }
-
- for (pid = 0; pid < RTE_MAX_ETHPORTS; pid++) {
- if (rte_eth_devices[pid].state != RTE_ETH_DEV_UNUSED &&
- !strncmp(name, rte_eth_dev_shared_data->data[pid].name,
- strlen(name))) {
- *port_id = pid;
- return 0;
- }
- }
-
- return -ENODEV;
-}
-
-static int
-eth_err(uint16_t port_id, int ret)
-{
- if (ret == 0)
- return 0;
- if (rte_eth_dev_is_removed(port_id))
- return -EIO;
- return ret;
-}
-
-/* attach the new device, then store port_id of the device */
-int
-rte_eth_dev_attach(const char *devargs, uint16_t *port_id)
-{
- int ret = -1;
- int current = rte_eth_dev_count();
- char *name = NULL;
- char *args = NULL;
-
- if ((devargs == NULL) || (port_id == NULL)) {
- ret = -EINVAL;
- goto err;
- }
-
- /* parse devargs, then retrieve device name and args */
- if (rte_eal_parse_devargs_str(devargs, &name, &args))
- goto err;
-
- ret = rte_eal_dev_attach(name, args);
- if (ret < 0)
- goto err;
-
- /* no point looking at the port count if no port exists */
- if (!rte_eth_dev_count()) {
- RTE_LOG(ERR, EAL, "No port found for device (%s)\n", name);
- ret = -1;
- goto err;
- }
-
- /* if nothing happened, there is a bug here, since some driver told us
- * it did attach a device, but did not create a port.
- */
- if (current == rte_eth_dev_count()) {
- ret = -1;
- goto err;
- }
-
- *port_id = eth_dev_last_created_port;
- ret = 0;
-
-err:
- free(name);
- free(args);
- return ret;
-}
-
-/* detach the device, then store the name of the device */
-int
-rte_eth_dev_detach(uint16_t port_id, char *name)
-{
- uint32_t dev_flags;
- int ret = -1;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -EINVAL);
-
- if (name == NULL) {
- ret = -EINVAL;
- goto err;
- }
-
- dev_flags = rte_eth_devices[port_id].data->dev_flags;
- if (dev_flags & RTE_ETH_DEV_BONDED_SLAVE) {
- RTE_LOG(ERR, EAL, "Port %" PRIu16 " is bonded, cannot detach\n",
- port_id);
- ret = -ENOTSUP;
- goto err;
- }
-
- snprintf(name, sizeof(rte_eth_devices[port_id].data->name),
- "%s", rte_eth_devices[port_id].data->name);
-
- ret = rte_eal_dev_detach(rte_eth_devices[port_id].device);
- if (ret < 0)
- goto err;
-
- rte_eth_dev_release_port(&rte_eth_devices[port_id]);
- return 0;
-
-err:
- return ret;
-}
-
-static int
-rte_eth_dev_rx_queue_config(struct rte_eth_dev *dev, uint16_t nb_queues)
-{
- uint16_t old_nb_queues = dev->data->nb_rx_queues;
- void **rxq;
- unsigned i;
-
- if (dev->data->rx_queues == NULL && nb_queues != 0) { /* first time configuration */
- dev->data->rx_queues = rte_zmalloc("ethdev->rx_queues",
- sizeof(dev->data->rx_queues[0]) * nb_queues,
- RTE_CACHE_LINE_SIZE);
- if (dev->data->rx_queues == NULL) {
- dev->data->nb_rx_queues = 0;
- return -(ENOMEM);
- }
- } else if (dev->data->rx_queues != NULL && nb_queues != 0) { /* re-configure */
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rx_queue_release, -ENOTSUP);
-
- rxq = dev->data->rx_queues;
-
- for (i = nb_queues; i < old_nb_queues; i++)
- (*dev->dev_ops->rx_queue_release)(rxq[i]);
- rxq = rte_realloc(rxq, sizeof(rxq[0]) * nb_queues,
- RTE_CACHE_LINE_SIZE);
- if (rxq == NULL)
- return -(ENOMEM);
- if (nb_queues > old_nb_queues) {
- uint16_t new_qs = nb_queues - old_nb_queues;
-
- memset(rxq + old_nb_queues, 0,
- sizeof(rxq[0]) * new_qs);
- }
-
- dev->data->rx_queues = rxq;
-
- } else if (dev->data->rx_queues != NULL && nb_queues == 0) {
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rx_queue_release, -ENOTSUP);
-
- rxq = dev->data->rx_queues;
-
- for (i = nb_queues; i < old_nb_queues; i++)
- (*dev->dev_ops->rx_queue_release)(rxq[i]);
-
- rte_free(dev->data->rx_queues);
- dev->data->rx_queues = NULL;
- }
- dev->data->nb_rx_queues = nb_queues;
- return 0;
-}
-
-int
-rte_eth_dev_rx_queue_start(uint16_t port_id, uint16_t rx_queue_id)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -EINVAL);
-
- dev = &rte_eth_devices[port_id];
- if (rx_queue_id >= dev->data->nb_rx_queues) {
- RTE_PMD_DEBUG_TRACE("Invalid RX queue_id=%d\n", rx_queue_id);
- return -EINVAL;
- }
-
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rx_queue_start, -ENOTSUP);
-
- if (dev->data->rx_queue_state[rx_queue_id] != RTE_ETH_QUEUE_STATE_STOPPED) {
- RTE_PMD_DEBUG_TRACE("Queue %" PRIu16" of device with port_id=%" PRIu8
- " already started\n",
- rx_queue_id, port_id);
- return 0;
- }
-
- return eth_err(port_id, dev->dev_ops->rx_queue_start(dev,
- rx_queue_id));
-
-}
-
-int
-rte_eth_dev_rx_queue_stop(uint16_t port_id, uint16_t rx_queue_id)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -EINVAL);
-
- dev = &rte_eth_devices[port_id];
- if (rx_queue_id >= dev->data->nb_rx_queues) {
- RTE_PMD_DEBUG_TRACE("Invalid RX queue_id=%d\n", rx_queue_id);
- return -EINVAL;
- }
-
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rx_queue_stop, -ENOTSUP);
-
- if (dev->data->rx_queue_state[rx_queue_id] == RTE_ETH_QUEUE_STATE_STOPPED) {
- RTE_PMD_DEBUG_TRACE("Queue %" PRIu16" of device with port_id=%" PRIu8
- " already stopped\n",
- rx_queue_id, port_id);
- return 0;
- }
-
- return eth_err(port_id, dev->dev_ops->rx_queue_stop(dev, rx_queue_id));
-
-}
-
-int
-rte_eth_dev_tx_queue_start(uint16_t port_id, uint16_t tx_queue_id)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -EINVAL);
-
- dev = &rte_eth_devices[port_id];
- if (tx_queue_id >= dev->data->nb_tx_queues) {
- RTE_PMD_DEBUG_TRACE("Invalid TX queue_id=%d\n", tx_queue_id);
- return -EINVAL;
- }
-
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->tx_queue_start, -ENOTSUP);
-
- if (dev->data->tx_queue_state[tx_queue_id] != RTE_ETH_QUEUE_STATE_STOPPED) {
- RTE_PMD_DEBUG_TRACE("Queue %" PRIu16" of device with port_id=%" PRIu8
- " already started\n",
- tx_queue_id, port_id);
- return 0;
- }
-
- return eth_err(port_id, dev->dev_ops->tx_queue_start(dev,
- tx_queue_id));
-
-}
-
-int
-rte_eth_dev_tx_queue_stop(uint16_t port_id, uint16_t tx_queue_id)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -EINVAL);
-
- dev = &rte_eth_devices[port_id];
- if (tx_queue_id >= dev->data->nb_tx_queues) {
- RTE_PMD_DEBUG_TRACE("Invalid TX queue_id=%d\n", tx_queue_id);
- return -EINVAL;
- }
-
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->tx_queue_stop, -ENOTSUP);
-
- if (dev->data->tx_queue_state[tx_queue_id] == RTE_ETH_QUEUE_STATE_STOPPED) {
- RTE_PMD_DEBUG_TRACE("Queue %" PRIu16" of device with port_id=%" PRIu8
- " already stopped\n",
- tx_queue_id, port_id);
- return 0;
- }
-
- return eth_err(port_id, dev->dev_ops->tx_queue_stop(dev, tx_queue_id));
-
-}
-
-static int
-rte_eth_dev_tx_queue_config(struct rte_eth_dev *dev, uint16_t nb_queues)
-{
- uint16_t old_nb_queues = dev->data->nb_tx_queues;
- void **txq;
- unsigned i;
-
- if (dev->data->tx_queues == NULL && nb_queues != 0) { /* first time configuration */
- dev->data->tx_queues = rte_zmalloc("ethdev->tx_queues",
- sizeof(dev->data->tx_queues[0]) * nb_queues,
- RTE_CACHE_LINE_SIZE);
- if (dev->data->tx_queues == NULL) {
- dev->data->nb_tx_queues = 0;
- return -(ENOMEM);
- }
- } else if (dev->data->tx_queues != NULL && nb_queues != 0) { /* re-configure */
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->tx_queue_release, -ENOTSUP);
-
- txq = dev->data->tx_queues;
-
- for (i = nb_queues; i < old_nb_queues; i++)
- (*dev->dev_ops->tx_queue_release)(txq[i]);
- txq = rte_realloc(txq, sizeof(txq[0]) * nb_queues,
- RTE_CACHE_LINE_SIZE);
- if (txq == NULL)
- return -ENOMEM;
- if (nb_queues > old_nb_queues) {
- uint16_t new_qs = nb_queues - old_nb_queues;
-
- memset(txq + old_nb_queues, 0,
- sizeof(txq[0]) * new_qs);
- }
-
- dev->data->tx_queues = txq;
-
- } else if (dev->data->tx_queues != NULL && nb_queues == 0) {
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->tx_queue_release, -ENOTSUP);
-
- txq = dev->data->tx_queues;
-
- for (i = nb_queues; i < old_nb_queues; i++)
- (*dev->dev_ops->tx_queue_release)(txq[i]);
-
- rte_free(dev->data->tx_queues);
- dev->data->tx_queues = NULL;
- }
- dev->data->nb_tx_queues = nb_queues;
- return 0;
-}
-
-uint32_t
-rte_eth_speed_bitflag(uint32_t speed, int duplex)
-{
- switch (speed) {
- case ETH_SPEED_NUM_10M:
- return duplex ? ETH_LINK_SPEED_10M : ETH_LINK_SPEED_10M_HD;
- case ETH_SPEED_NUM_100M:
- return duplex ? ETH_LINK_SPEED_100M : ETH_LINK_SPEED_100M_HD;
- case ETH_SPEED_NUM_1G:
- return ETH_LINK_SPEED_1G;
- case ETH_SPEED_NUM_2_5G:
- return ETH_LINK_SPEED_2_5G;
- case ETH_SPEED_NUM_5G:
- return ETH_LINK_SPEED_5G;
- case ETH_SPEED_NUM_10G:
- return ETH_LINK_SPEED_10G;
- case ETH_SPEED_NUM_20G:
- return ETH_LINK_SPEED_20G;
- case ETH_SPEED_NUM_25G:
- return ETH_LINK_SPEED_25G;
- case ETH_SPEED_NUM_40G:
- return ETH_LINK_SPEED_40G;
- case ETH_SPEED_NUM_50G:
- return ETH_LINK_SPEED_50G;
- case ETH_SPEED_NUM_56G:
- return ETH_LINK_SPEED_56G;
- case ETH_SPEED_NUM_100G:
- return ETH_LINK_SPEED_100G;
- default:
- return 0;
- }
-}
-
-/**
- * A conversion function from rxmode bitfield API.
- */
-static void
-rte_eth_convert_rx_offload_bitfield(const struct rte_eth_rxmode *rxmode,
- uint64_t *rx_offloads)
-{
- uint64_t offloads = 0;
-
- if (rxmode->header_split == 1)
- offloads |= DEV_RX_OFFLOAD_HEADER_SPLIT;
- if (rxmode->hw_ip_checksum == 1)
- offloads |= DEV_RX_OFFLOAD_CHECKSUM;
- if (rxmode->hw_vlan_filter == 1)
- offloads |= DEV_RX_OFFLOAD_VLAN_FILTER;
- if (rxmode->hw_vlan_strip == 1)
- offloads |= DEV_RX_OFFLOAD_VLAN_STRIP;
- if (rxmode->hw_vlan_extend == 1)
- offloads |= DEV_RX_OFFLOAD_VLAN_EXTEND;
- if (rxmode->jumbo_frame == 1)
- offloads |= DEV_RX_OFFLOAD_JUMBO_FRAME;
- if (rxmode->hw_strip_crc == 1)
- offloads |= DEV_RX_OFFLOAD_CRC_STRIP;
- if (rxmode->enable_scatter == 1)
- offloads |= DEV_RX_OFFLOAD_SCATTER;
- if (rxmode->enable_lro == 1)
- offloads |= DEV_RX_OFFLOAD_TCP_LRO;
- if (rxmode->hw_timestamp == 1)
- offloads |= DEV_RX_OFFLOAD_TIMESTAMP;
- if (rxmode->security == 1)
- offloads |= DEV_RX_OFFLOAD_SECURITY;
-
- *rx_offloads = offloads;
-}
-
-/**
- * A conversion function from rxmode offloads API.
- */
-static void
-rte_eth_convert_rx_offloads(const uint64_t rx_offloads,
- struct rte_eth_rxmode *rxmode)
-{
-
- if (rx_offloads & DEV_RX_OFFLOAD_HEADER_SPLIT)
- rxmode->header_split = 1;
- else
- rxmode->header_split = 0;
- if (rx_offloads & DEV_RX_OFFLOAD_CHECKSUM)
- rxmode->hw_ip_checksum = 1;
- else
- rxmode->hw_ip_checksum = 0;
- if (rx_offloads & DEV_RX_OFFLOAD_VLAN_FILTER)
- rxmode->hw_vlan_filter = 1;
- else
- rxmode->hw_vlan_filter = 0;
- if (rx_offloads & DEV_RX_OFFLOAD_VLAN_STRIP)
- rxmode->hw_vlan_strip = 1;
- else
- rxmode->hw_vlan_strip = 0;
- if (rx_offloads & DEV_RX_OFFLOAD_VLAN_EXTEND)
- rxmode->hw_vlan_extend = 1;
- else
- rxmode->hw_vlan_extend = 0;
- if (rx_offloads & DEV_RX_OFFLOAD_JUMBO_FRAME)
- rxmode->jumbo_frame = 1;
- else
- rxmode->jumbo_frame = 0;
- if (rx_offloads & DEV_RX_OFFLOAD_CRC_STRIP)
- rxmode->hw_strip_crc = 1;
- else
- rxmode->hw_strip_crc = 0;
- if (rx_offloads & DEV_RX_OFFLOAD_SCATTER)
- rxmode->enable_scatter = 1;
- else
- rxmode->enable_scatter = 0;
- if (rx_offloads & DEV_RX_OFFLOAD_TCP_LRO)
- rxmode->enable_lro = 1;
- else
- rxmode->enable_lro = 0;
- if (rx_offloads & DEV_RX_OFFLOAD_TIMESTAMP)
- rxmode->hw_timestamp = 1;
- else
- rxmode->hw_timestamp = 0;
- if (rx_offloads & DEV_RX_OFFLOAD_SECURITY)
- rxmode->security = 1;
- else
- rxmode->security = 0;
-}
-
-const char * __rte_experimental
-rte_eth_dev_rx_offload_name(uint64_t offload)
-{
- const char *name = "UNKNOWN";
- unsigned int i;
-
- for (i = 0; i < RTE_DIM(rte_rx_offload_names); ++i) {
- if (offload == rte_rx_offload_names[i].offload) {
- name = rte_rx_offload_names[i].name;
- break;
- }
- }
-
- return name;
-}
-
-const char * __rte_experimental
-rte_eth_dev_tx_offload_name(uint64_t offload)
-{
- const char *name = "UNKNOWN";
- unsigned int i;
-
- for (i = 0; i < RTE_DIM(rte_tx_offload_names); ++i) {
- if (offload == rte_tx_offload_names[i].offload) {
- name = rte_tx_offload_names[i].name;
- break;
- }
- }
-
- return name;
-}
-
-int
-rte_eth_dev_configure(uint16_t port_id, uint16_t nb_rx_q, uint16_t nb_tx_q,
- const struct rte_eth_conf *dev_conf)
-{
- struct rte_eth_dev *dev;
- struct rte_eth_dev_info dev_info;
- struct rte_eth_conf local_conf = *dev_conf;
- int diag;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -EINVAL);
-
- if (nb_rx_q > RTE_MAX_QUEUES_PER_PORT) {
- RTE_PMD_DEBUG_TRACE(
- "Number of RX queues requested (%u) is greater than max supported(%d)\n",
- nb_rx_q, RTE_MAX_QUEUES_PER_PORT);
- return -EINVAL;
- }
-
- if (nb_tx_q > RTE_MAX_QUEUES_PER_PORT) {
- RTE_PMD_DEBUG_TRACE(
- "Number of TX queues requested (%u) is greater than max supported(%d)\n",
- nb_tx_q, RTE_MAX_QUEUES_PER_PORT);
- return -EINVAL;
- }
-
- dev = &rte_eth_devices[port_id];
-
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->dev_infos_get, -ENOTSUP);
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->dev_configure, -ENOTSUP);
-
- if (dev->data->dev_started) {
- RTE_PMD_DEBUG_TRACE(
- "port %d must be stopped to allow configuration\n", port_id);
- return -EBUSY;
- }
-
- /*
- * Convert between the offloads API to enable PMDs to support
- * only one of them.
- */
- if (dev_conf->rxmode.ignore_offload_bitfield == 0) {
- rte_eth_convert_rx_offload_bitfield(
- &dev_conf->rxmode, &local_conf.rxmode.offloads);
- } else {
- rte_eth_convert_rx_offloads(dev_conf->rxmode.offloads,
- &local_conf.rxmode);
- }
-
- /* Copy the dev_conf parameter into the dev structure */
- memcpy(&dev->data->dev_conf, &local_conf, sizeof(dev->data->dev_conf));
-
- /*
- * Check that the numbers of RX and TX queues are not greater
- * than the maximum number of RX and TX queues supported by the
- * configured device.
- */
- (*dev->dev_ops->dev_infos_get)(dev, &dev_info);
-
- if (nb_rx_q == 0 && nb_tx_q == 0) {
- RTE_PMD_DEBUG_TRACE("ethdev port_id=%d both rx and tx queue cannot be 0\n", port_id);
- return -EINVAL;
- }
-
- if (nb_rx_q > dev_info.max_rx_queues) {
- RTE_PMD_DEBUG_TRACE("ethdev port_id=%d nb_rx_queues=%d > %d\n",
- port_id, nb_rx_q, dev_info.max_rx_queues);
- return -EINVAL;
- }
-
- if (nb_tx_q > dev_info.max_tx_queues) {
- RTE_PMD_DEBUG_TRACE("ethdev port_id=%d nb_tx_queues=%d > %d\n",
- port_id, nb_tx_q, dev_info.max_tx_queues);
- return -EINVAL;
- }
-
- /* Check that the device supports requested interrupts */
- if ((dev_conf->intr_conf.lsc == 1) &&
- (!(dev->data->dev_flags & RTE_ETH_DEV_INTR_LSC))) {
- RTE_PMD_DEBUG_TRACE("driver %s does not support lsc\n",
- dev->device->driver->name);
- return -EINVAL;
- }
- if ((dev_conf->intr_conf.rmv == 1) &&
- (!(dev->data->dev_flags & RTE_ETH_DEV_INTR_RMV))) {
- RTE_PMD_DEBUG_TRACE("driver %s does not support rmv\n",
- dev->device->driver->name);
- return -EINVAL;
- }
-
- /*
- * If jumbo frames are enabled, check that the maximum RX packet
- * length is supported by the configured device.
- */
- if (local_conf.rxmode.offloads & DEV_RX_OFFLOAD_JUMBO_FRAME) {
- if (dev_conf->rxmode.max_rx_pkt_len >
- dev_info.max_rx_pktlen) {
- RTE_PMD_DEBUG_TRACE("ethdev port_id=%d max_rx_pkt_len %u"
- " > max valid value %u\n",
- port_id,
- (unsigned)dev_conf->rxmode.max_rx_pkt_len,
- (unsigned)dev_info.max_rx_pktlen);
- return -EINVAL;
- } else if (dev_conf->rxmode.max_rx_pkt_len < ETHER_MIN_LEN) {
- RTE_PMD_DEBUG_TRACE("ethdev port_id=%d max_rx_pkt_len %u"
- " < min valid value %u\n",
- port_id,
- (unsigned)dev_conf->rxmode.max_rx_pkt_len,
- (unsigned)ETHER_MIN_LEN);
- return -EINVAL;
- }
- } else {
- if (dev_conf->rxmode.max_rx_pkt_len < ETHER_MIN_LEN ||
- dev_conf->rxmode.max_rx_pkt_len > ETHER_MAX_LEN)
- /* Use default value */
- dev->data->dev_conf.rxmode.max_rx_pkt_len =
- ETHER_MAX_LEN;
- }
-
- /*
- * Setup new number of RX/TX queues and reconfigure device.
- */
- diag = rte_eth_dev_rx_queue_config(dev, nb_rx_q);
- if (diag != 0) {
- RTE_PMD_DEBUG_TRACE("port%d rte_eth_dev_rx_queue_config = %d\n",
- port_id, diag);
- return diag;
- }
-
- diag = rte_eth_dev_tx_queue_config(dev, nb_tx_q);
- if (diag != 0) {
- RTE_PMD_DEBUG_TRACE("port%d rte_eth_dev_tx_queue_config = %d\n",
- port_id, diag);
- rte_eth_dev_rx_queue_config(dev, 0);
- return diag;
- }
-
- diag = (*dev->dev_ops->dev_configure)(dev);
- if (diag != 0) {
- RTE_PMD_DEBUG_TRACE("port%d dev_configure = %d\n",
- port_id, diag);
- rte_eth_dev_rx_queue_config(dev, 0);
- rte_eth_dev_tx_queue_config(dev, 0);
- return eth_err(port_id, diag);
- }
-
- /* Initialize Rx profiling if enabled at compilation time. */
- diag = __rte_eth_profile_rx_init(port_id, dev);
- if (diag != 0) {
- RTE_PMD_DEBUG_TRACE("port%d __rte_eth_profile_rx_init = %d\n",
- port_id, diag);
- rte_eth_dev_rx_queue_config(dev, 0);
- rte_eth_dev_tx_queue_config(dev, 0);
- return eth_err(port_id, diag);
- }
-
- return 0;
-}
-
-void
-_rte_eth_dev_reset(struct rte_eth_dev *dev)
-{
- if (dev->data->dev_started) {
- RTE_PMD_DEBUG_TRACE(
- "port %d must be stopped to allow reset\n",
- dev->data->port_id);
- return;
- }
-
- rte_eth_dev_rx_queue_config(dev, 0);
- rte_eth_dev_tx_queue_config(dev, 0);
-
- memset(&dev->data->dev_conf, 0, sizeof(dev->data->dev_conf));
-}
-
-static void
-rte_eth_dev_config_restore(uint16_t port_id)
-{
- struct rte_eth_dev *dev;
- struct rte_eth_dev_info dev_info;
- struct ether_addr *addr;
- uint16_t i;
- uint32_t pool = 0;
- uint64_t pool_mask;
-
- dev = &rte_eth_devices[port_id];
-
- rte_eth_dev_info_get(port_id, &dev_info);
-
- /* replay MAC address configuration including default MAC */
- addr = &dev->data->mac_addrs[0];
- if (*dev->dev_ops->mac_addr_set != NULL)
- (*dev->dev_ops->mac_addr_set)(dev, addr);
- else if (*dev->dev_ops->mac_addr_add != NULL)
- (*dev->dev_ops->mac_addr_add)(dev, addr, 0, pool);
-
- if (*dev->dev_ops->mac_addr_add != NULL) {
- for (i = 1; i < dev_info.max_mac_addrs; i++) {
- addr = &dev->data->mac_addrs[i];
-
- /* skip zero address */
- if (is_zero_ether_addr(addr))
- continue;
-
- pool = 0;
- pool_mask = dev->data->mac_pool_sel[i];
-
- do {
- if (pool_mask & 1ULL)
- (*dev->dev_ops->mac_addr_add)(dev,
- addr, i, pool);
- pool_mask >>= 1;
- pool++;
- } while (pool_mask);
- }
- }
-
- /* replay promiscuous configuration */
- if (rte_eth_promiscuous_get(port_id) == 1)
- rte_eth_promiscuous_enable(port_id);
- else if (rte_eth_promiscuous_get(port_id) == 0)
- rte_eth_promiscuous_disable(port_id);
-
- /* replay all multicast configuration */
- if (rte_eth_allmulticast_get(port_id) == 1)
- rte_eth_allmulticast_enable(port_id);
- else if (rte_eth_allmulticast_get(port_id) == 0)
- rte_eth_allmulticast_disable(port_id);
-}
-
-int
-rte_eth_dev_start(uint16_t port_id)
-{
- struct rte_eth_dev *dev;
- int diag;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -EINVAL);
-
- dev = &rte_eth_devices[port_id];
-
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->dev_start, -ENOTSUP);
-
- if (dev->data->dev_started != 0) {
- RTE_PMD_DEBUG_TRACE("Device with port_id=%" PRIu16
- " already started\n",
- port_id);
- return 0;
- }
-
- diag = (*dev->dev_ops->dev_start)(dev);
- if (diag == 0)
- dev->data->dev_started = 1;
- else
- return eth_err(port_id, diag);
-
- rte_eth_dev_config_restore(port_id);
-
- if (dev->data->dev_conf.intr_conf.lsc == 0) {
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->link_update, -ENOTSUP);
- (*dev->dev_ops->link_update)(dev, 0);
- }
- return 0;
-}
-
-void
-rte_eth_dev_stop(uint16_t port_id)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_RET(port_id);
- dev = &rte_eth_devices[port_id];
-
- RTE_FUNC_PTR_OR_RET(*dev->dev_ops->dev_stop);
-
- if (dev->data->dev_started == 0) {
- RTE_PMD_DEBUG_TRACE("Device with port_id=%" PRIu16
- " already stopped\n",
- port_id);
- return;
- }
-
- dev->data->dev_started = 0;
- (*dev->dev_ops->dev_stop)(dev);
-}
-
-int
-rte_eth_dev_set_link_up(uint16_t port_id)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -EINVAL);
-
- dev = &rte_eth_devices[port_id];
-
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->dev_set_link_up, -ENOTSUP);
- return eth_err(port_id, (*dev->dev_ops->dev_set_link_up)(dev));
-}
-
-int
-rte_eth_dev_set_link_down(uint16_t port_id)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -EINVAL);
-
- dev = &rte_eth_devices[port_id];
-
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->dev_set_link_down, -ENOTSUP);
- return eth_err(port_id, (*dev->dev_ops->dev_set_link_down)(dev));
-}
-
-void
-rte_eth_dev_close(uint16_t port_id)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_RET(port_id);
- dev = &rte_eth_devices[port_id];
-
- RTE_FUNC_PTR_OR_RET(*dev->dev_ops->dev_close);
- dev->data->dev_started = 0;
- (*dev->dev_ops->dev_close)(dev);
-
- dev->data->nb_rx_queues = 0;
- rte_free(dev->data->rx_queues);
- dev->data->rx_queues = NULL;
- dev->data->nb_tx_queues = 0;
- rte_free(dev->data->tx_queues);
- dev->data->tx_queues = NULL;
-}
-
-int
-rte_eth_dev_reset(uint16_t port_id)
-{
- struct rte_eth_dev *dev;
- int ret;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -EINVAL);
- dev = &rte_eth_devices[port_id];
-
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->dev_reset, -ENOTSUP);
-
- rte_eth_dev_stop(port_id);
- ret = dev->dev_ops->dev_reset(dev);
-
- return eth_err(port_id, ret);
-}
-
-int __rte_experimental
-rte_eth_dev_is_removed(uint16_t port_id)
-{
- struct rte_eth_dev *dev;
- int ret;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, 0);
-
- dev = &rte_eth_devices[port_id];
-
- if (dev->state == RTE_ETH_DEV_REMOVED)
- return 1;
-
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->is_removed, 0);
-
- ret = dev->dev_ops->is_removed(dev);
- if (ret != 0)
- /* Device is physically removed. */
- dev->state = RTE_ETH_DEV_REMOVED;
-
- return ret;
-}
-
-int
-rte_eth_rx_queue_setup(uint16_t port_id, uint16_t rx_queue_id,
- uint16_t nb_rx_desc, unsigned int socket_id,
- const struct rte_eth_rxconf *rx_conf,
- struct rte_mempool *mp)
-{
- int ret;
- uint32_t mbp_buf_size;
- struct rte_eth_dev *dev;
- struct rte_eth_dev_info dev_info;
- struct rte_eth_rxconf local_conf;
- void **rxq;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -EINVAL);
-
- dev = &rte_eth_devices[port_id];
- if (rx_queue_id >= dev->data->nb_rx_queues) {
- RTE_PMD_DEBUG_TRACE("Invalid RX queue_id=%d\n", rx_queue_id);
- return -EINVAL;
- }
-
- if (dev->data->dev_started) {
- RTE_PMD_DEBUG_TRACE(
- "port %d must be stopped to allow configuration\n", port_id);
- return -EBUSY;
- }
-
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->dev_infos_get, -ENOTSUP);
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rx_queue_setup, -ENOTSUP);
-
- /*
- * Check the size of the mbuf data buffer.
- * This value must be provided in the private data of the memory pool.
- * First check that the memory pool has a valid private data.
- */
- rte_eth_dev_info_get(port_id, &dev_info);
- if (mp->private_data_size < sizeof(struct rte_pktmbuf_pool_private)) {
- RTE_PMD_DEBUG_TRACE("%s private_data_size %d < %d\n",
- mp->name, (int) mp->private_data_size,
- (int) sizeof(struct rte_pktmbuf_pool_private));
- return -ENOSPC;
- }
- mbp_buf_size = rte_pktmbuf_data_room_size(mp);
-
- if ((mbp_buf_size - RTE_PKTMBUF_HEADROOM) < dev_info.min_rx_bufsize) {
- RTE_PMD_DEBUG_TRACE("%s mbuf_data_room_size %d < %d "
- "(RTE_PKTMBUF_HEADROOM=%d + min_rx_bufsize(dev)"
- "=%d)\n",
- mp->name,
- (int)mbp_buf_size,
- (int)(RTE_PKTMBUF_HEADROOM +
- dev_info.min_rx_bufsize),
- (int)RTE_PKTMBUF_HEADROOM,
- (int)dev_info.min_rx_bufsize);
- return -EINVAL;
- }
-
- if (nb_rx_desc > dev_info.rx_desc_lim.nb_max ||
- nb_rx_desc < dev_info.rx_desc_lim.nb_min ||
- nb_rx_desc % dev_info.rx_desc_lim.nb_align != 0) {
-
- RTE_PMD_DEBUG_TRACE("Invalid value for nb_rx_desc(=%hu), "
- "should be: <= %hu, = %hu, and a product of %hu\n",
- nb_rx_desc,
- dev_info.rx_desc_lim.nb_max,
- dev_info.rx_desc_lim.nb_min,
- dev_info.rx_desc_lim.nb_align);
- return -EINVAL;
- }
-
- rxq = dev->data->rx_queues;
- if (rxq[rx_queue_id]) {
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rx_queue_release,
- -ENOTSUP);
- (*dev->dev_ops->rx_queue_release)(rxq[rx_queue_id]);
- rxq[rx_queue_id] = NULL;
- }
-
- if (rx_conf == NULL)
- rx_conf = &dev_info.default_rxconf;
-
- local_conf = *rx_conf;
- if (dev->data->dev_conf.rxmode.ignore_offload_bitfield == 0) {
- /**
- * Reflect port offloads to queue offloads in order for
- * offloads to not be discarded.
- */
- rte_eth_convert_rx_offload_bitfield(&dev->data->dev_conf.rxmode,
- &local_conf.offloads);
- }
-
- ret = (*dev->dev_ops->rx_queue_setup)(dev, rx_queue_id, nb_rx_desc,
- socket_id, &local_conf, mp);
- if (!ret) {
- if (!dev->data->min_rx_buf_size ||
- dev->data->min_rx_buf_size > mbp_buf_size)
- dev->data->min_rx_buf_size = mbp_buf_size;
- }
-
- return eth_err(port_id, ret);
-}
-
-/**
- * A conversion function from txq_flags API.
- */
-static void
-rte_eth_convert_txq_flags(const uint32_t txq_flags, uint64_t *tx_offloads)
-{
- uint64_t offloads = 0;
-
- if (!(txq_flags & ETH_TXQ_FLAGS_NOMULTSEGS))
- offloads |= DEV_TX_OFFLOAD_MULTI_SEGS;
- if (!(txq_flags & ETH_TXQ_FLAGS_NOVLANOFFL))
- offloads |= DEV_TX_OFFLOAD_VLAN_INSERT;
- if (!(txq_flags & ETH_TXQ_FLAGS_NOXSUMSCTP))
- offloads |= DEV_TX_OFFLOAD_SCTP_CKSUM;
- if (!(txq_flags & ETH_TXQ_FLAGS_NOXSUMUDP))
- offloads |= DEV_TX_OFFLOAD_UDP_CKSUM;
- if (!(txq_flags & ETH_TXQ_FLAGS_NOXSUMTCP))
- offloads |= DEV_TX_OFFLOAD_TCP_CKSUM;
- if ((txq_flags & ETH_TXQ_FLAGS_NOREFCOUNT) &&
- (txq_flags & ETH_TXQ_FLAGS_NOMULTMEMP))
- offloads |= DEV_TX_OFFLOAD_MBUF_FAST_FREE;
-
- *tx_offloads = offloads;
-}
-
-/**
- * A conversion function from offloads API.
- */
-static void
-rte_eth_convert_txq_offloads(const uint64_t tx_offloads, uint32_t *txq_flags)
-{
- uint32_t flags = 0;
-
- if (!(tx_offloads & DEV_TX_OFFLOAD_MULTI_SEGS))
- flags |= ETH_TXQ_FLAGS_NOMULTSEGS;
- if (!(tx_offloads & DEV_TX_OFFLOAD_VLAN_INSERT))
- flags |= ETH_TXQ_FLAGS_NOVLANOFFL;
- if (!(tx_offloads & DEV_TX_OFFLOAD_SCTP_CKSUM))
- flags |= ETH_TXQ_FLAGS_NOXSUMSCTP;
- if (!(tx_offloads & DEV_TX_OFFLOAD_UDP_CKSUM))
- flags |= ETH_TXQ_FLAGS_NOXSUMUDP;
- if (!(tx_offloads & DEV_TX_OFFLOAD_TCP_CKSUM))
- flags |= ETH_TXQ_FLAGS_NOXSUMTCP;
- if (tx_offloads & DEV_TX_OFFLOAD_MBUF_FAST_FREE)
- flags |= (ETH_TXQ_FLAGS_NOREFCOUNT | ETH_TXQ_FLAGS_NOMULTMEMP);
-
- *txq_flags = flags;
-}
-
-int
-rte_eth_tx_queue_setup(uint16_t port_id, uint16_t tx_queue_id,
- uint16_t nb_tx_desc, unsigned int socket_id,
- const struct rte_eth_txconf *tx_conf)
-{
- struct rte_eth_dev *dev;
- struct rte_eth_dev_info dev_info;
- struct rte_eth_txconf local_conf;
- void **txq;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -EINVAL);
-
- dev = &rte_eth_devices[port_id];
- if (tx_queue_id >= dev->data->nb_tx_queues) {
- RTE_PMD_DEBUG_TRACE("Invalid TX queue_id=%d\n", tx_queue_id);
- return -EINVAL;
- }
-
- if (dev->data->dev_started) {
- RTE_PMD_DEBUG_TRACE(
- "port %d must be stopped to allow configuration\n", port_id);
- return -EBUSY;
- }
-
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->dev_infos_get, -ENOTSUP);
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->tx_queue_setup, -ENOTSUP);
-
- rte_eth_dev_info_get(port_id, &dev_info);
-
- if (nb_tx_desc > dev_info.tx_desc_lim.nb_max ||
- nb_tx_desc < dev_info.tx_desc_lim.nb_min ||
- nb_tx_desc % dev_info.tx_desc_lim.nb_align != 0) {
- RTE_PMD_DEBUG_TRACE("Invalid value for nb_tx_desc(=%hu), "
- "should be: <= %hu, = %hu, and a product of %hu\n",
- nb_tx_desc,
- dev_info.tx_desc_lim.nb_max,
- dev_info.tx_desc_lim.nb_min,
- dev_info.tx_desc_lim.nb_align);
- return -EINVAL;
- }
-
- txq = dev->data->tx_queues;
- if (txq[tx_queue_id]) {
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->tx_queue_release,
- -ENOTSUP);
- (*dev->dev_ops->tx_queue_release)(txq[tx_queue_id]);
- txq[tx_queue_id] = NULL;
- }
-
- if (tx_conf == NULL)
- tx_conf = &dev_info.default_txconf;
-
- /*
- * Convert between the offloads API to enable PMDs to support
- * only one of them.
- */
- local_conf = *tx_conf;
- if (tx_conf->txq_flags & ETH_TXQ_FLAGS_IGNORE) {
- rte_eth_convert_txq_offloads(tx_conf->offloads,
- &local_conf.txq_flags);
- /* Keep the ignore flag. */
- local_conf.txq_flags |= ETH_TXQ_FLAGS_IGNORE;
- } else {
- rte_eth_convert_txq_flags(tx_conf->txq_flags,
- &local_conf.offloads);
- }
-
- return eth_err(port_id, (*dev->dev_ops->tx_queue_setup)(dev,
- tx_queue_id, nb_tx_desc, socket_id, &local_conf));
-}
-
-void
-rte_eth_tx_buffer_drop_callback(struct rte_mbuf **pkts, uint16_t unsent,
- void *userdata __rte_unused)
-{
- unsigned i;
-
- for (i = 0; i < unsent; i++)
- rte_pktmbuf_free(pkts[i]);
-}
-
-void
-rte_eth_tx_buffer_count_callback(struct rte_mbuf **pkts, uint16_t unsent,
- void *userdata)
-{
- uint64_t *count = userdata;
- unsigned i;
-
- for (i = 0; i < unsent; i++)
- rte_pktmbuf_free(pkts[i]);
-
- *count += unsent;
-}
-
-int
-rte_eth_tx_buffer_set_err_callback(struct rte_eth_dev_tx_buffer *buffer,
- buffer_tx_error_fn cbfn, void *userdata)
-{
- buffer->error_callback = cbfn;
- buffer->error_userdata = userdata;
- return 0;
-}
-
-int
-rte_eth_tx_buffer_init(struct rte_eth_dev_tx_buffer *buffer, uint16_t size)
-{
- int ret = 0;
-
- if (buffer == NULL)
- return -EINVAL;
-
- buffer->size = size;
- if (buffer->error_callback == NULL) {
- ret = rte_eth_tx_buffer_set_err_callback(
- buffer, rte_eth_tx_buffer_drop_callback, NULL);
- }
-
- return ret;
-}
-
-int
-rte_eth_tx_done_cleanup(uint16_t port_id, uint16_t queue_id, uint32_t free_cnt)
-{
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
- int ret;
-
- /* Validate Input Data. Bail if not valid or not supported. */
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->tx_done_cleanup, -ENOTSUP);
-
- /* Call driver to free pending mbufs. */
- ret = (*dev->dev_ops->tx_done_cleanup)(dev->data->tx_queues[queue_id],
- free_cnt);
- return eth_err(port_id, ret);
-}
-
-void
-rte_eth_promiscuous_enable(uint16_t port_id)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_RET(port_id);
- dev = &rte_eth_devices[port_id];
-
- RTE_FUNC_PTR_OR_RET(*dev->dev_ops->promiscuous_enable);
- (*dev->dev_ops->promiscuous_enable)(dev);
- dev->data->promiscuous = 1;
-}
-
-void
-rte_eth_promiscuous_disable(uint16_t port_id)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_RET(port_id);
- dev = &rte_eth_devices[port_id];
-
- RTE_FUNC_PTR_OR_RET(*dev->dev_ops->promiscuous_disable);
- dev->data->promiscuous = 0;
- (*dev->dev_ops->promiscuous_disable)(dev);
-}
-
-int
-rte_eth_promiscuous_get(uint16_t port_id)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -EINVAL);
-
- dev = &rte_eth_devices[port_id];
- return dev->data->promiscuous;
-}
-
-void
-rte_eth_allmulticast_enable(uint16_t port_id)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_RET(port_id);
- dev = &rte_eth_devices[port_id];
-
- RTE_FUNC_PTR_OR_RET(*dev->dev_ops->allmulticast_enable);
- (*dev->dev_ops->allmulticast_enable)(dev);
- dev->data->all_multicast = 1;
-}
-
-void
-rte_eth_allmulticast_disable(uint16_t port_id)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_RET(port_id);
- dev = &rte_eth_devices[port_id];
-
- RTE_FUNC_PTR_OR_RET(*dev->dev_ops->allmulticast_disable);
- dev->data->all_multicast = 0;
- (*dev->dev_ops->allmulticast_disable)(dev);
-}
-
-int
-rte_eth_allmulticast_get(uint16_t port_id)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -EINVAL);
-
- dev = &rte_eth_devices[port_id];
- return dev->data->all_multicast;
-}
-
-static inline int
-rte_eth_dev_atomic_read_link_status(struct rte_eth_dev *dev,
- struct rte_eth_link *link)
-{
- struct rte_eth_link *dst = link;
- struct rte_eth_link *src = &(dev->data->dev_link);
-
- if (rte_atomic64_cmpset((uint64_t *)dst, *(uint64_t *)dst,
- *(uint64_t *)src) == 0)
- return -1;
-
- return 0;
-}
-
-void
-rte_eth_link_get(uint16_t port_id, struct rte_eth_link *eth_link)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_RET(port_id);
- dev = &rte_eth_devices[port_id];
-
- if (dev->data->dev_conf.intr_conf.lsc != 0)
- rte_eth_dev_atomic_read_link_status(dev, eth_link);
- else {
- RTE_FUNC_PTR_OR_RET(*dev->dev_ops->link_update);
- (*dev->dev_ops->link_update)(dev, 1);
- *eth_link = dev->data->dev_link;
- }
-}
-
-void
-rte_eth_link_get_nowait(uint16_t port_id, struct rte_eth_link *eth_link)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_RET(port_id);
- dev = &rte_eth_devices[port_id];
-
- if (dev->data->dev_conf.intr_conf.lsc != 0)
- rte_eth_dev_atomic_read_link_status(dev, eth_link);
- else {
- RTE_FUNC_PTR_OR_RET(*dev->dev_ops->link_update);
- (*dev->dev_ops->link_update)(dev, 0);
- *eth_link = dev->data->dev_link;
- }
-}
-
-int
-rte_eth_stats_get(uint16_t port_id, struct rte_eth_stats *stats)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -EINVAL);
-
- dev = &rte_eth_devices[port_id];
- memset(stats, 0, sizeof(*stats));
-
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->stats_get, -ENOTSUP);
- stats->rx_nombuf = dev->data->rx_mbuf_alloc_failed;
- return eth_err(port_id, (*dev->dev_ops->stats_get)(dev, stats));
-}
-
-int
-rte_eth_stats_reset(uint16_t port_id)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
- dev = &rte_eth_devices[port_id];
-
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->stats_reset, -ENOTSUP);
- (*dev->dev_ops->stats_reset)(dev);
- dev->data->rx_mbuf_alloc_failed = 0;
-
- return 0;
-}
-
-static inline int
-get_xstats_basic_count(struct rte_eth_dev *dev)
-{
- uint16_t nb_rxqs, nb_txqs;
- int count;
-
- nb_rxqs = RTE_MIN(dev->data->nb_rx_queues, RTE_ETHDEV_QUEUE_STAT_CNTRS);
- nb_txqs = RTE_MIN(dev->data->nb_tx_queues, RTE_ETHDEV_QUEUE_STAT_CNTRS);
-
- count = RTE_NB_STATS;
- count += nb_rxqs * RTE_NB_RXQ_STATS;
- count += nb_txqs * RTE_NB_TXQ_STATS;
-
- return count;
-}
-
-static int
-get_xstats_count(uint16_t port_id)
-{
- struct rte_eth_dev *dev;
- int count;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -EINVAL);
- dev = &rte_eth_devices[port_id];
- if (dev->dev_ops->xstats_get_names_by_id != NULL) {
- count = (*dev->dev_ops->xstats_get_names_by_id)(dev, NULL,
- NULL, 0);
- if (count < 0)
- return eth_err(port_id, count);
- }
- if (dev->dev_ops->xstats_get_names != NULL) {
- count = (*dev->dev_ops->xstats_get_names)(dev, NULL, 0);
- if (count < 0)
- return eth_err(port_id, count);
- } else
- count = 0;
-
-
- count += get_xstats_basic_count(dev);
-
- return count;
-}
-
-int
-rte_eth_xstats_get_id_by_name(uint16_t port_id, const char *xstat_name,
- uint64_t *id)
-{
- int cnt_xstats, idx_xstat;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
-
- if (!id) {
- RTE_PMD_DEBUG_TRACE("Error: id pointer is NULL\n");
- return -ENOMEM;
- }
-
- if (!xstat_name) {
- RTE_PMD_DEBUG_TRACE("Error: xstat_name pointer is NULL\n");
- return -ENOMEM;
- }
-
- /* Get count */
- cnt_xstats = rte_eth_xstats_get_names_by_id(port_id, NULL, 0, NULL);
- if (cnt_xstats < 0) {
- RTE_PMD_DEBUG_TRACE("Error: Cannot get count of xstats\n");
- return -ENODEV;
- }
-
- /* Get id-name lookup table */
- struct rte_eth_xstat_name xstats_names[cnt_xstats];
-
- if (cnt_xstats != rte_eth_xstats_get_names_by_id(
- port_id, xstats_names, cnt_xstats, NULL)) {
- RTE_PMD_DEBUG_TRACE("Error: Cannot get xstats lookup\n");
- return -1;
- }
-
- for (idx_xstat = 0; idx_xstat < cnt_xstats; idx_xstat++) {
- if (!strcmp(xstats_names[idx_xstat].name, xstat_name)) {
- *id = idx_xstat;
- return 0;
- };
- }
-
- return -EINVAL;
-}
-
-/* retrieve basic stats names */
-static int
-rte_eth_basic_stats_get_names(struct rte_eth_dev *dev,
- struct rte_eth_xstat_name *xstats_names)
-{
- int cnt_used_entries = 0;
- uint32_t idx, id_queue;
- uint16_t num_q;
-
- for (idx = 0; idx < RTE_NB_STATS; idx++) {
- snprintf(xstats_names[cnt_used_entries].name,
- sizeof(xstats_names[0].name),
- "%s", rte_stats_strings[idx].name);
- cnt_used_entries++;
- }
- num_q = RTE_MIN(dev->data->nb_rx_queues, RTE_ETHDEV_QUEUE_STAT_CNTRS);
- for (id_queue = 0; id_queue < num_q; id_queue++) {
- for (idx = 0; idx < RTE_NB_RXQ_STATS; idx++) {
- snprintf(xstats_names[cnt_used_entries].name,
- sizeof(xstats_names[0].name),
- "rx_q%u%s",
- id_queue, rte_rxq_stats_strings[idx].name);
- cnt_used_entries++;
- }
-
- }
- num_q = RTE_MIN(dev->data->nb_tx_queues, RTE_ETHDEV_QUEUE_STAT_CNTRS);
- for (id_queue = 0; id_queue < num_q; id_queue++) {
- for (idx = 0; idx < RTE_NB_TXQ_STATS; idx++) {
- snprintf(xstats_names[cnt_used_entries].name,
- sizeof(xstats_names[0].name),
- "tx_q%u%s",
- id_queue, rte_txq_stats_strings[idx].name);
- cnt_used_entries++;
- }
- }
- return cnt_used_entries;
-}
-
-/* retrieve ethdev extended statistics names */
-int
-rte_eth_xstats_get_names_by_id(uint16_t port_id,
- struct rte_eth_xstat_name *xstats_names, unsigned int size,
- uint64_t *ids)
-{
- struct rte_eth_xstat_name *xstats_names_copy;
- unsigned int no_basic_stat_requested = 1;
- unsigned int no_ext_stat_requested = 1;
- unsigned int expected_entries;
- unsigned int basic_count;
- struct rte_eth_dev *dev;
- unsigned int i;
- int ret;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
- dev = &rte_eth_devices[port_id];
-
- basic_count = get_xstats_basic_count(dev);
- ret = get_xstats_count(port_id);
- if (ret < 0)
- return ret;
- expected_entries = (unsigned int)ret;
-
- /* Return max number of stats if no ids given */
- if (!ids) {
- if (!xstats_names)
- return expected_entries;
- else if (xstats_names && size < expected_entries)
- return expected_entries;
- }
-
- if (ids && !xstats_names)
- return -EINVAL;
-
- if (ids && dev->dev_ops->xstats_get_names_by_id != NULL && size > 0) {
- uint64_t ids_copy[size];
-
- for (i = 0; i < size; i++) {
- if (ids[i] < basic_count) {
- no_basic_stat_requested = 0;
- break;
- }
-
- /*
- * Convert ids to xstats ids that PMD knows.
- * ids known by user are basic + extended stats.
- */
- ids_copy[i] = ids[i] - basic_count;
- }
-
- if (no_basic_stat_requested)
- return (*dev->dev_ops->xstats_get_names_by_id)(dev,
- xstats_names, ids_copy, size);
- }
-
- /* Retrieve all stats */
- if (!ids) {
- int num_stats = rte_eth_xstats_get_names(port_id, xstats_names,
- expected_entries);
- if (num_stats < 0 || num_stats > (int)expected_entries)
- return num_stats;
- else
- return expected_entries;
- }
-
- xstats_names_copy = calloc(expected_entries,
- sizeof(struct rte_eth_xstat_name));
-
- if (!xstats_names_copy) {
- RTE_PMD_DEBUG_TRACE("ERROR: can't allocate memory");
- return -ENOMEM;
- }
-
- if (ids) {
- for (i = 0; i < size; i++) {
- if (ids[i] >= basic_count) {
- no_ext_stat_requested = 0;
- break;
- }
- }
- }
-
- /* Fill xstats_names_copy structure */
- if (ids && no_ext_stat_requested) {
- rte_eth_basic_stats_get_names(dev, xstats_names_copy);
- } else {
- ret = rte_eth_xstats_get_names(port_id, xstats_names_copy,
- expected_entries);
- if (ret < 0) {
- free(xstats_names_copy);
- return ret;
- }
- }
-
- /* Filter stats */
- for (i = 0; i < size; i++) {
- if (ids[i] >= expected_entries) {
- RTE_PMD_DEBUG_TRACE("ERROR: id value isn't valid\n");
- free(xstats_names_copy);
- return -1;
- }
- xstats_names[i] = xstats_names_copy[ids[i]];
- }
-
- free(xstats_names_copy);
- return size;
-}
-
-int
-rte_eth_xstats_get_names(uint16_t port_id,
- struct rte_eth_xstat_name *xstats_names,
- unsigned int size)
-{
- struct rte_eth_dev *dev;
- int cnt_used_entries;
- int cnt_expected_entries;
- int cnt_driver_entries;
-
- cnt_expected_entries = get_xstats_count(port_id);
- if (xstats_names == NULL || cnt_expected_entries < 0 ||
- (int)size < cnt_expected_entries)
- return cnt_expected_entries;
-
- /* port_id checked in get_xstats_count() */
- dev = &rte_eth_devices[port_id];
-
- cnt_used_entries = rte_eth_basic_stats_get_names(
- dev, xstats_names);
-
- if (dev->dev_ops->xstats_get_names != NULL) {
- /* If there are any driver-specific xstats, append them
- * to end of list.
- */
- cnt_driver_entries = (*dev->dev_ops->xstats_get_names)(
- dev,
- xstats_names + cnt_used_entries,
- size - cnt_used_entries);
- if (cnt_driver_entries < 0)
- return eth_err(port_id, cnt_driver_entries);
- cnt_used_entries += cnt_driver_entries;
- }
-
- return cnt_used_entries;
-}
-
-
-static int
-rte_eth_basic_stats_get(uint16_t port_id, struct rte_eth_xstat *xstats)
-{
- struct rte_eth_dev *dev;
- struct rte_eth_stats eth_stats;
- unsigned int count = 0, i, q;
- uint64_t val, *stats_ptr;
- uint16_t nb_rxqs, nb_txqs;
- int ret;
-
- ret = rte_eth_stats_get(port_id, &eth_stats);
- if (ret < 0)
- return ret;
-
- dev = &rte_eth_devices[port_id];
-
- nb_rxqs = RTE_MIN(dev->data->nb_rx_queues, RTE_ETHDEV_QUEUE_STAT_CNTRS);
- nb_txqs = RTE_MIN(dev->data->nb_tx_queues, RTE_ETHDEV_QUEUE_STAT_CNTRS);
-
- /* global stats */
- for (i = 0; i < RTE_NB_STATS; i++) {
- stats_ptr = RTE_PTR_ADD(&eth_stats,
- rte_stats_strings[i].offset);
- val = *stats_ptr;
- xstats[count++].value = val;
- }
-
- /* per-rxq stats */
- for (q = 0; q < nb_rxqs; q++) {
- for (i = 0; i < RTE_NB_RXQ_STATS; i++) {
- stats_ptr = RTE_PTR_ADD(&eth_stats,
- rte_rxq_stats_strings[i].offset +
- q * sizeof(uint64_t));
- val = *stats_ptr;
- xstats[count++].value = val;
- }
- }
-
- /* per-txq stats */
- for (q = 0; q < nb_txqs; q++) {
- for (i = 0; i < RTE_NB_TXQ_STATS; i++) {
- stats_ptr = RTE_PTR_ADD(&eth_stats,
- rte_txq_stats_strings[i].offset +
- q * sizeof(uint64_t));
- val = *stats_ptr;
- xstats[count++].value = val;
- }
- }
- return count;
-}
-
-/* retrieve ethdev extended statistics */
-int
-rte_eth_xstats_get_by_id(uint16_t port_id, const uint64_t *ids,
- uint64_t *values, unsigned int size)
-{
- unsigned int no_basic_stat_requested = 1;
- unsigned int no_ext_stat_requested = 1;
- unsigned int num_xstats_filled;
- unsigned int basic_count;
- uint16_t expected_entries;
- struct rte_eth_dev *dev;
- unsigned int i;
- int ret;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
- ret = get_xstats_count(port_id);
- if (ret < 0)
- return ret;
- expected_entries = (uint16_t)ret;
- struct rte_eth_xstat xstats[expected_entries];
- dev = &rte_eth_devices[port_id];
- basic_count = get_xstats_basic_count(dev);
-
- /* Return max number of stats if no ids given */
- if (!ids) {
- if (!values)
- return expected_entries;
- else if (values && size < expected_entries)
- return expected_entries;
- }
-
- if (ids && !values)
- return -EINVAL;
-
- if (ids && dev->dev_ops->xstats_get_by_id != NULL && size) {
- unsigned int basic_count = get_xstats_basic_count(dev);
- uint64_t ids_copy[size];
-
- for (i = 0; i < size; i++) {
- if (ids[i] < basic_count) {
- no_basic_stat_requested = 0;
- break;
- }
-
- /*
- * Convert ids to xstats ids that PMD knows.
- * ids known by user are basic + extended stats.
- */
- ids_copy[i] = ids[i] - basic_count;
- }
-
- if (no_basic_stat_requested)
- return (*dev->dev_ops->xstats_get_by_id)(dev, ids_copy,
- values, size);
- }
-
- if (ids) {
- for (i = 0; i < size; i++) {
- if (ids[i] >= basic_count) {
- no_ext_stat_requested = 0;
- break;
- }
- }
- }
-
- /* Fill the xstats structure */
- if (ids && no_ext_stat_requested)
- ret = rte_eth_basic_stats_get(port_id, xstats);
- else
- ret = rte_eth_xstats_get(port_id, xstats, expected_entries);
-
- if (ret < 0)
- return ret;
- num_xstats_filled = (unsigned int)ret;
-
- /* Return all stats */
- if (!ids) {
- for (i = 0; i < num_xstats_filled; i++)
- values[i] = xstats[i].value;
- return expected_entries;
- }
-
- /* Filter stats */
- for (i = 0; i < size; i++) {
- if (ids[i] >= expected_entries) {
- RTE_PMD_DEBUG_TRACE("ERROR: id value isn't valid\n");
- return -1;
- }
- values[i] = xstats[ids[i]].value;
- }
- return size;
-}
-
-int
-rte_eth_xstats_get(uint16_t port_id, struct rte_eth_xstat *xstats,
- unsigned int n)
-{
- struct rte_eth_dev *dev;
- unsigned int count = 0, i;
- signed int xcount = 0;
- uint16_t nb_rxqs, nb_txqs;
- int ret;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -EINVAL);
-
- dev = &rte_eth_devices[port_id];
-
- nb_rxqs = RTE_MIN(dev->data->nb_rx_queues, RTE_ETHDEV_QUEUE_STAT_CNTRS);
- nb_txqs = RTE_MIN(dev->data->nb_tx_queues, RTE_ETHDEV_QUEUE_STAT_CNTRS);
-
- /* Return generic statistics */
- count = RTE_NB_STATS + (nb_rxqs * RTE_NB_RXQ_STATS) +
- (nb_txqs * RTE_NB_TXQ_STATS);
-
- /* implemented by the driver */
- if (dev->dev_ops->xstats_get != NULL) {
- /* Retrieve the xstats from the driver at the end of the
- * xstats struct.
- */
- xcount = (*dev->dev_ops->xstats_get)(dev,
- xstats ? xstats + count : NULL,
- (n > count) ? n - count : 0);
-
- if (xcount < 0)
- return eth_err(port_id, xcount);
- }
-
- if (n < count + xcount || xstats == NULL)
- return count + xcount;
-
- /* now fill the xstats structure */
- ret = rte_eth_basic_stats_get(port_id, xstats);
- if (ret < 0)
- return ret;
- count = ret;
-
- for (i = 0; i < count; i++)
- xstats[i].id = i;
- /* add an offset to driver-specific stats */
- for ( ; i < count + xcount; i++)
- xstats[i].id += count;
-
- return count + xcount;
-}
-
-/* reset ethdev extended statistics */
-void
-rte_eth_xstats_reset(uint16_t port_id)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_RET(port_id);
- dev = &rte_eth_devices[port_id];
-
- /* implemented by the driver */
- if (dev->dev_ops->xstats_reset != NULL) {
- (*dev->dev_ops->xstats_reset)(dev);
- return;
- }
-
- /* fallback to default */
- rte_eth_stats_reset(port_id);
-}
-
-static int
-set_queue_stats_mapping(uint16_t port_id, uint16_t queue_id, uint8_t stat_idx,
- uint8_t is_rx)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
-
- dev = &rte_eth_devices[port_id];
-
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->queue_stats_mapping_set, -ENOTSUP);
- return (*dev->dev_ops->queue_stats_mapping_set)
- (dev, queue_id, stat_idx, is_rx);
-}
-
-
-int
-rte_eth_dev_set_tx_queue_stats_mapping(uint16_t port_id, uint16_t tx_queue_id,
- uint8_t stat_idx)
-{
- return eth_err(port_id, set_queue_stats_mapping(port_id, tx_queue_id,
- stat_idx, STAT_QMAP_TX));
-}
-
-
-int
-rte_eth_dev_set_rx_queue_stats_mapping(uint16_t port_id, uint16_t rx_queue_id,
- uint8_t stat_idx)
-{
- return eth_err(port_id, set_queue_stats_mapping(port_id, rx_queue_id,
- stat_idx, STAT_QMAP_RX));
-}
-
-int
-rte_eth_dev_fw_version_get(uint16_t port_id, char *fw_version, size_t fw_size)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
- dev = &rte_eth_devices[port_id];
-
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->fw_version_get, -ENOTSUP);
- return eth_err(port_id, (*dev->dev_ops->fw_version_get)(dev,
- fw_version, fw_size));
-}
-
-void
-rte_eth_dev_info_get(uint16_t port_id, struct rte_eth_dev_info *dev_info)
-{
- struct rte_eth_dev *dev;
- const struct rte_eth_desc_lim lim = {
- .nb_max = UINT16_MAX,
- .nb_min = 0,
- .nb_align = 1,
- };
-
- RTE_ETH_VALID_PORTID_OR_RET(port_id);
- dev = &rte_eth_devices[port_id];
-
- memset(dev_info, 0, sizeof(struct rte_eth_dev_info));
- dev_info->rx_desc_lim = lim;
- dev_info->tx_desc_lim = lim;
-
- RTE_FUNC_PTR_OR_RET(*dev->dev_ops->dev_infos_get);
- (*dev->dev_ops->dev_infos_get)(dev, dev_info);
- dev_info->driver_name = dev->device->driver->name;
- dev_info->nb_rx_queues = dev->data->nb_rx_queues;
- dev_info->nb_tx_queues = dev->data->nb_tx_queues;
-}
-
-int
-rte_eth_dev_get_supported_ptypes(uint16_t port_id, uint32_t ptype_mask,
- uint32_t *ptypes, int num)
-{
- int i, j;
- struct rte_eth_dev *dev;
- const uint32_t *all_ptypes;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
- dev = &rte_eth_devices[port_id];
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->dev_supported_ptypes_get, 0);
- all_ptypes = (*dev->dev_ops->dev_supported_ptypes_get)(dev);
-
- if (!all_ptypes)
- return 0;
-
- for (i = 0, j = 0; all_ptypes[i] != RTE_PTYPE_UNKNOWN; ++i)
- if (all_ptypes[i] & ptype_mask) {
- if (j < num)
- ptypes[j] = all_ptypes[i];
- j++;
- }
-
- return j;
-}
-
-void
-rte_eth_macaddr_get(uint16_t port_id, struct ether_addr *mac_addr)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_RET(port_id);
- dev = &rte_eth_devices[port_id];
- ether_addr_copy(&dev->data->mac_addrs[0], mac_addr);
-}
-
-
-int
-rte_eth_dev_get_mtu(uint16_t port_id, uint16_t *mtu)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
-
- dev = &rte_eth_devices[port_id];
- *mtu = dev->data->mtu;
- return 0;
-}
-
-int
-rte_eth_dev_set_mtu(uint16_t port_id, uint16_t mtu)
-{
- int ret;
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
- dev = &rte_eth_devices[port_id];
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->mtu_set, -ENOTSUP);
-
- ret = (*dev->dev_ops->mtu_set)(dev, mtu);
- if (!ret)
- dev->data->mtu = mtu;
-
- return eth_err(port_id, ret);
-}
-
-int
-rte_eth_dev_vlan_filter(uint16_t port_id, uint16_t vlan_id, int on)
-{
- struct rte_eth_dev *dev;
- int ret;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
- dev = &rte_eth_devices[port_id];
- if (!(dev->data->dev_conf.rxmode.offloads &
- DEV_RX_OFFLOAD_VLAN_FILTER)) {
- RTE_PMD_DEBUG_TRACE("port %d: vlan-filtering disabled\n", port_id);
- return -ENOSYS;
- }
-
- if (vlan_id > 4095) {
- RTE_PMD_DEBUG_TRACE("(port_id=%d) invalid vlan_id=%u > 4095\n",
- port_id, (unsigned) vlan_id);
- return -EINVAL;
- }
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->vlan_filter_set, -ENOTSUP);
-
- ret = (*dev->dev_ops->vlan_filter_set)(dev, vlan_id, on);
- if (ret == 0) {
- struct rte_vlan_filter_conf *vfc;
- int vidx;
- int vbit;
-
- vfc = &dev->data->vlan_filter_conf;
- vidx = vlan_id / 64;
- vbit = vlan_id % 64;
-
- if (on)
- vfc->ids[vidx] |= UINT64_C(1) << vbit;
- else
- vfc->ids[vidx] &= ~(UINT64_C(1) << vbit);
- }
-
- return eth_err(port_id, ret);
-}
-
-int
-rte_eth_dev_set_vlan_strip_on_queue(uint16_t port_id, uint16_t rx_queue_id,
- int on)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
- dev = &rte_eth_devices[port_id];
- if (rx_queue_id >= dev->data->nb_rx_queues) {
- RTE_PMD_DEBUG_TRACE("Invalid rx_queue_id=%d\n", port_id);
- return -EINVAL;
- }
-
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->vlan_strip_queue_set, -ENOTSUP);
- (*dev->dev_ops->vlan_strip_queue_set)(dev, rx_queue_id, on);
-
- return 0;
-}
-
-int
-rte_eth_dev_set_vlan_ether_type(uint16_t port_id,
- enum rte_vlan_type vlan_type,
- uint16_t tpid)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
- dev = &rte_eth_devices[port_id];
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->vlan_tpid_set, -ENOTSUP);
-
- return eth_err(port_id, (*dev->dev_ops->vlan_tpid_set)(dev, vlan_type,
- tpid));
-}
-
-int
-rte_eth_dev_set_vlan_offload(uint16_t port_id, int offload_mask)
-{
- struct rte_eth_dev *dev;
- int ret = 0;
- int mask = 0;
- int cur, org = 0;
- uint64_t orig_offloads;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
- dev = &rte_eth_devices[port_id];
-
- /* save original values in case of failure */
- orig_offloads = dev->data->dev_conf.rxmode.offloads;
-
- /*check which option changed by application*/
- cur = !!(offload_mask & ETH_VLAN_STRIP_OFFLOAD);
- org = !!(dev->data->dev_conf.rxmode.offloads &
- DEV_RX_OFFLOAD_VLAN_STRIP);
- if (cur != org) {
- if (cur)
- dev->data->dev_conf.rxmode.offloads |=
- DEV_RX_OFFLOAD_VLAN_STRIP;
- else
- dev->data->dev_conf.rxmode.offloads &=
- ~DEV_RX_OFFLOAD_VLAN_STRIP;
- mask |= ETH_VLAN_STRIP_MASK;
- }
-
- cur = !!(offload_mask & ETH_VLAN_FILTER_OFFLOAD);
- org = !!(dev->data->dev_conf.rxmode.offloads &
- DEV_RX_OFFLOAD_VLAN_FILTER);
- if (cur != org) {
- if (cur)
- dev->data->dev_conf.rxmode.offloads |=
- DEV_RX_OFFLOAD_VLAN_FILTER;
- else
- dev->data->dev_conf.rxmode.offloads &=
- ~DEV_RX_OFFLOAD_VLAN_FILTER;
- mask |= ETH_VLAN_FILTER_MASK;
- }
-
- cur = !!(offload_mask & ETH_VLAN_EXTEND_OFFLOAD);
- org = !!(dev->data->dev_conf.rxmode.offloads &
- DEV_RX_OFFLOAD_VLAN_EXTEND);
- if (cur != org) {
- if (cur)
- dev->data->dev_conf.rxmode.offloads |=
- DEV_RX_OFFLOAD_VLAN_EXTEND;
- else
- dev->data->dev_conf.rxmode.offloads &=
- ~DEV_RX_OFFLOAD_VLAN_EXTEND;
- mask |= ETH_VLAN_EXTEND_MASK;
- }
-
- /*no change*/
- if (mask == 0)
- return ret;
-
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->vlan_offload_set, -ENOTSUP);
-
- /*
- * Convert to the offload bitfield API just in case the underlying PMD
- * still supporting it.
- */
- rte_eth_convert_rx_offloads(dev->data->dev_conf.rxmode.offloads,
- &dev->data->dev_conf.rxmode);
- ret = (*dev->dev_ops->vlan_offload_set)(dev, mask);
- if (ret) {
- /* hit an error restore original values */
- dev->data->dev_conf.rxmode.offloads = orig_offloads;
- rte_eth_convert_rx_offloads(dev->data->dev_conf.rxmode.offloads,
- &dev->data->dev_conf.rxmode);
- }
-
- return eth_err(port_id, ret);
-}
-
-int
-rte_eth_dev_get_vlan_offload(uint16_t port_id)
-{
- struct rte_eth_dev *dev;
- int ret = 0;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
- dev = &rte_eth_devices[port_id];
-
- if (dev->data->dev_conf.rxmode.offloads &
- DEV_RX_OFFLOAD_VLAN_STRIP)
- ret |= ETH_VLAN_STRIP_OFFLOAD;
-
- if (dev->data->dev_conf.rxmode.offloads &
- DEV_RX_OFFLOAD_VLAN_FILTER)
- ret |= ETH_VLAN_FILTER_OFFLOAD;
-
- if (dev->data->dev_conf.rxmode.offloads &
- DEV_RX_OFFLOAD_VLAN_EXTEND)
- ret |= ETH_VLAN_EXTEND_OFFLOAD;
-
- return ret;
-}
-
-int
-rte_eth_dev_set_vlan_pvid(uint16_t port_id, uint16_t pvid, int on)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
- dev = &rte_eth_devices[port_id];
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->vlan_pvid_set, -ENOTSUP);
-
- return eth_err(port_id, (*dev->dev_ops->vlan_pvid_set)(dev, pvid, on));
-}
-
-int
-rte_eth_dev_flow_ctrl_get(uint16_t port_id, struct rte_eth_fc_conf *fc_conf)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
- dev = &rte_eth_devices[port_id];
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->flow_ctrl_get, -ENOTSUP);
- memset(fc_conf, 0, sizeof(*fc_conf));
- return eth_err(port_id, (*dev->dev_ops->flow_ctrl_get)(dev, fc_conf));
-}
-
-int
-rte_eth_dev_flow_ctrl_set(uint16_t port_id, struct rte_eth_fc_conf *fc_conf)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
- if ((fc_conf->send_xon != 0) && (fc_conf->send_xon != 1)) {
- RTE_PMD_DEBUG_TRACE("Invalid send_xon, only 0/1 allowed\n");
- return -EINVAL;
- }
-
- dev = &rte_eth_devices[port_id];
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->flow_ctrl_set, -ENOTSUP);
- return eth_err(port_id, (*dev->dev_ops->flow_ctrl_set)(dev, fc_conf));
-}
-
-int
-rte_eth_dev_priority_flow_ctrl_set(uint16_t port_id,
- struct rte_eth_pfc_conf *pfc_conf)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
- if (pfc_conf->priority > (ETH_DCB_NUM_USER_PRIORITIES - 1)) {
- RTE_PMD_DEBUG_TRACE("Invalid priority, only 0-7 allowed\n");
- return -EINVAL;
- }
-
- dev = &rte_eth_devices[port_id];
- /* High water, low water validation are device specific */
- if (*dev->dev_ops->priority_flow_ctrl_set)
- return eth_err(port_id, (*dev->dev_ops->priority_flow_ctrl_set)
- (dev, pfc_conf));
- return -ENOTSUP;
-}
-
-static int
-rte_eth_check_reta_mask(struct rte_eth_rss_reta_entry64 *reta_conf,
- uint16_t reta_size)
-{
- uint16_t i, num;
-
- if (!reta_conf)
- return -EINVAL;
-
- num = (reta_size + RTE_RETA_GROUP_SIZE - 1) / RTE_RETA_GROUP_SIZE;
- for (i = 0; i < num; i++) {
- if (reta_conf[i].mask)
- return 0;
- }
-
- return -EINVAL;
-}
-
-static int
-rte_eth_check_reta_entry(struct rte_eth_rss_reta_entry64 *reta_conf,
- uint16_t reta_size,
- uint16_t max_rxq)
-{
- uint16_t i, idx, shift;
-
- if (!reta_conf)
- return -EINVAL;
-
- if (max_rxq == 0) {
- RTE_PMD_DEBUG_TRACE("No receive queue is available\n");
- return -EINVAL;
- }
-
- for (i = 0; i < reta_size; i++) {
- idx = i / RTE_RETA_GROUP_SIZE;
- shift = i % RTE_RETA_GROUP_SIZE;
- if ((reta_conf[idx].mask & (1ULL << shift)) &&
- (reta_conf[idx].reta[shift] >= max_rxq)) {
- RTE_PMD_DEBUG_TRACE("reta_conf[%u]->reta[%u]: %u exceeds "
- "the maximum rxq index: %u\n", idx, shift,
- reta_conf[idx].reta[shift], max_rxq);
- return -EINVAL;
- }
- }
-
- return 0;
-}
-
-int
-rte_eth_dev_rss_reta_update(uint16_t port_id,
- struct rte_eth_rss_reta_entry64 *reta_conf,
- uint16_t reta_size)
-{
- struct rte_eth_dev *dev;
- int ret;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
- /* Check mask bits */
- ret = rte_eth_check_reta_mask(reta_conf, reta_size);
- if (ret < 0)
- return ret;
-
- dev = &rte_eth_devices[port_id];
-
- /* Check entry value */
- ret = rte_eth_check_reta_entry(reta_conf, reta_size,
- dev->data->nb_rx_queues);
- if (ret < 0)
- return ret;
-
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->reta_update, -ENOTSUP);
- return eth_err(port_id, (*dev->dev_ops->reta_update)(dev, reta_conf,
- reta_size));
-}
-
-int
-rte_eth_dev_rss_reta_query(uint16_t port_id,
- struct rte_eth_rss_reta_entry64 *reta_conf,
- uint16_t reta_size)
-{
- struct rte_eth_dev *dev;
- int ret;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
-
- /* Check mask bits */
- ret = rte_eth_check_reta_mask(reta_conf, reta_size);
- if (ret < 0)
- return ret;
-
- dev = &rte_eth_devices[port_id];
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->reta_query, -ENOTSUP);
- return eth_err(port_id, (*dev->dev_ops->reta_query)(dev, reta_conf,
- reta_size));
-}
-
-int
-rte_eth_dev_rss_hash_update(uint16_t port_id,
- struct rte_eth_rss_conf *rss_conf)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
- dev = &rte_eth_devices[port_id];
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rss_hash_update, -ENOTSUP);
- return eth_err(port_id, (*dev->dev_ops->rss_hash_update)(dev,
- rss_conf));
-}
-
-int
-rte_eth_dev_rss_hash_conf_get(uint16_t port_id,
- struct rte_eth_rss_conf *rss_conf)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
- dev = &rte_eth_devices[port_id];
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rss_hash_conf_get, -ENOTSUP);
- return eth_err(port_id, (*dev->dev_ops->rss_hash_conf_get)(dev,
- rss_conf));
-}
-
-int
-rte_eth_dev_udp_tunnel_port_add(uint16_t port_id,
- struct rte_eth_udp_tunnel *udp_tunnel)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
- if (udp_tunnel == NULL) {
- RTE_PMD_DEBUG_TRACE("Invalid udp_tunnel parameter\n");
- return -EINVAL;
- }
-
- if (udp_tunnel->prot_type >= RTE_TUNNEL_TYPE_MAX) {
- RTE_PMD_DEBUG_TRACE("Invalid tunnel type\n");
- return -EINVAL;
- }
-
- dev = &rte_eth_devices[port_id];
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->udp_tunnel_port_add, -ENOTSUP);
- return eth_err(port_id, (*dev->dev_ops->udp_tunnel_port_add)(dev,
- udp_tunnel));
-}
-
-int
-rte_eth_dev_udp_tunnel_port_delete(uint16_t port_id,
- struct rte_eth_udp_tunnel *udp_tunnel)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
- dev = &rte_eth_devices[port_id];
-
- if (udp_tunnel == NULL) {
- RTE_PMD_DEBUG_TRACE("Invalid udp_tunnel parameter\n");
- return -EINVAL;
- }
-
- if (udp_tunnel->prot_type >= RTE_TUNNEL_TYPE_MAX) {
- RTE_PMD_DEBUG_TRACE("Invalid tunnel type\n");
- return -EINVAL;
- }
-
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->udp_tunnel_port_del, -ENOTSUP);
- return eth_err(port_id, (*dev->dev_ops->udp_tunnel_port_del)(dev,
- udp_tunnel));
-}
-
-int
-rte_eth_led_on(uint16_t port_id)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
- dev = &rte_eth_devices[port_id];
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->dev_led_on, -ENOTSUP);
- return eth_err(port_id, (*dev->dev_ops->dev_led_on)(dev));
-}
-
-int
-rte_eth_led_off(uint16_t port_id)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
- dev = &rte_eth_devices[port_id];
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->dev_led_off, -ENOTSUP);
- return eth_err(port_id, (*dev->dev_ops->dev_led_off)(dev));
-}
-
-/*
- * Returns index into MAC address array of addr. Use 00:00:00:00:00:00 to find
- * an empty spot.
- */
-static int
-get_mac_addr_index(uint16_t port_id, const struct ether_addr *addr)
-{
- struct rte_eth_dev_info dev_info;
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
- unsigned i;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
- rte_eth_dev_info_get(port_id, &dev_info);
-
- for (i = 0; i < dev_info.max_mac_addrs; i++)
- if (memcmp(addr, &dev->data->mac_addrs[i], ETHER_ADDR_LEN) == 0)
- return i;
-
- return -1;
-}
-
-static const struct ether_addr null_mac_addr;
-
-int
-rte_eth_dev_mac_addr_add(uint16_t port_id, struct ether_addr *addr,
- uint32_t pool)
-{
- struct rte_eth_dev *dev;
- int index;
- uint64_t pool_mask;
- int ret;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
- dev = &rte_eth_devices[port_id];
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->mac_addr_add, -ENOTSUP);
-
- if (is_zero_ether_addr(addr)) {
- RTE_PMD_DEBUG_TRACE("port %d: Cannot add NULL MAC address\n",
- port_id);
- return -EINVAL;
- }
- if (pool >= ETH_64_POOLS) {
- RTE_PMD_DEBUG_TRACE("pool id must be 0-%d\n", ETH_64_POOLS - 1);
- return -EINVAL;
- }
-
- index = get_mac_addr_index(port_id, addr);
- if (index < 0) {
- index = get_mac_addr_index(port_id, &null_mac_addr);
- if (index < 0) {
- RTE_PMD_DEBUG_TRACE("port %d: MAC address array full\n",
- port_id);
- return -ENOSPC;
- }
- } else {
- pool_mask = dev->data->mac_pool_sel[index];
-
- /* Check if both MAC address and pool is already there, and do nothing */
- if (pool_mask & (1ULL << pool))
- return 0;
- }
-
- /* Update NIC */
- ret = (*dev->dev_ops->mac_addr_add)(dev, addr, index, pool);
-
- if (ret == 0) {
- /* Update address in NIC data structure */
- ether_addr_copy(addr, &dev->data->mac_addrs[index]);
-
- /* Update pool bitmap in NIC data structure */
- dev->data->mac_pool_sel[index] |= (1ULL << pool);
- }
-
- return eth_err(port_id, ret);
-}
-
-int
-rte_eth_dev_mac_addr_remove(uint16_t port_id, struct ether_addr *addr)
-{
- struct rte_eth_dev *dev;
- int index;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
- dev = &rte_eth_devices[port_id];
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->mac_addr_remove, -ENOTSUP);
-
- index = get_mac_addr_index(port_id, addr);
- if (index == 0) {
- RTE_PMD_DEBUG_TRACE("port %d: Cannot remove default MAC address\n", port_id);
- return -EADDRINUSE;
- } else if (index < 0)
- return 0; /* Do nothing if address wasn't found */
-
- /* Update NIC */
- (*dev->dev_ops->mac_addr_remove)(dev, index);
-
- /* Update address in NIC data structure */
- ether_addr_copy(&null_mac_addr, &dev->data->mac_addrs[index]);
-
- /* reset pool bitmap */
- dev->data->mac_pool_sel[index] = 0;
-
- return 0;
-}
-
-int
-rte_eth_dev_default_mac_addr_set(uint16_t port_id, struct ether_addr *addr)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
-
- if (!is_valid_assigned_ether_addr(addr))
- return -EINVAL;
-
- dev = &rte_eth_devices[port_id];
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->mac_addr_set, -ENOTSUP);
-
- /* Update default address in NIC data structure */
- ether_addr_copy(addr, &dev->data->mac_addrs[0]);
-
- (*dev->dev_ops->mac_addr_set)(dev, addr);
-
- return 0;
-}
-
-
-/*
- * Returns index into MAC address array of addr. Use 00:00:00:00:00:00 to find
- * an empty spot.
- */
-static int
-get_hash_mac_addr_index(uint16_t port_id, const struct ether_addr *addr)
-{
- struct rte_eth_dev_info dev_info;
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
- unsigned i;
-
- rte_eth_dev_info_get(port_id, &dev_info);
- if (!dev->data->hash_mac_addrs)
- return -1;
-
- for (i = 0; i < dev_info.max_hash_mac_addrs; i++)
- if (memcmp(addr, &dev->data->hash_mac_addrs[i],
- ETHER_ADDR_LEN) == 0)
- return i;
-
- return -1;
-}
-
-int
-rte_eth_dev_uc_hash_table_set(uint16_t port_id, struct ether_addr *addr,
- uint8_t on)
-{
- int index;
- int ret;
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
-
- dev = &rte_eth_devices[port_id];
- if (is_zero_ether_addr(addr)) {
- RTE_PMD_DEBUG_TRACE("port %d: Cannot add NULL MAC address\n",
- port_id);
- return -EINVAL;
- }
-
- index = get_hash_mac_addr_index(port_id, addr);
- /* Check if it's already there, and do nothing */
- if ((index >= 0) && on)
- return 0;
-
- if (index < 0) {
- if (!on) {
- RTE_PMD_DEBUG_TRACE("port %d: the MAC address was not "
- "set in UTA\n", port_id);
- return -EINVAL;
- }
-
- index = get_hash_mac_addr_index(port_id, &null_mac_addr);
- if (index < 0) {
- RTE_PMD_DEBUG_TRACE("port %d: MAC address array full\n",
- port_id);
- return -ENOSPC;
- }
- }
-
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->uc_hash_table_set, -ENOTSUP);
- ret = (*dev->dev_ops->uc_hash_table_set)(dev, addr, on);
- if (ret == 0) {
- /* Update address in NIC data structure */
- if (on)
- ether_addr_copy(addr,
- &dev->data->hash_mac_addrs[index]);
- else
- ether_addr_copy(&null_mac_addr,
- &dev->data->hash_mac_addrs[index]);
- }
-
- return eth_err(port_id, ret);
-}
-
-int
-rte_eth_dev_uc_all_hash_table_set(uint16_t port_id, uint8_t on)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
-
- dev = &rte_eth_devices[port_id];
-
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->uc_all_hash_table_set, -ENOTSUP);
- return eth_err(port_id, (*dev->dev_ops->uc_all_hash_table_set)(dev,
- on));
-}
-
-int rte_eth_set_queue_rate_limit(uint16_t port_id, uint16_t queue_idx,
- uint16_t tx_rate)
-{
- struct rte_eth_dev *dev;
- struct rte_eth_dev_info dev_info;
- struct rte_eth_link link;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
-
- dev = &rte_eth_devices[port_id];
- rte_eth_dev_info_get(port_id, &dev_info);
- link = dev->data->dev_link;
-
- if (queue_idx > dev_info.max_tx_queues) {
- RTE_PMD_DEBUG_TRACE("set queue rate limit:port %d: "
- "invalid queue id=%d\n", port_id, queue_idx);
- return -EINVAL;
- }
-
- if (tx_rate > link.link_speed) {
- RTE_PMD_DEBUG_TRACE("set queue rate limit:invalid tx_rate=%d, "
- "bigger than link speed= %d\n",
- tx_rate, link.link_speed);
- return -EINVAL;
- }
-
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->set_queue_rate_limit, -ENOTSUP);
- return eth_err(port_id, (*dev->dev_ops->set_queue_rate_limit)(dev,
- queue_idx, tx_rate));
-}
-
-int
-rte_eth_mirror_rule_set(uint16_t port_id,
- struct rte_eth_mirror_conf *mirror_conf,
- uint8_t rule_id, uint8_t on)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
- if (mirror_conf->rule_type == 0) {
- RTE_PMD_DEBUG_TRACE("mirror rule type can not be 0.\n");
- return -EINVAL;
- }
-
- if (mirror_conf->dst_pool >= ETH_64_POOLS) {
- RTE_PMD_DEBUG_TRACE("Invalid dst pool, pool id must be 0-%d\n",
- ETH_64_POOLS - 1);
- return -EINVAL;
- }
-
- if ((mirror_conf->rule_type & (ETH_MIRROR_VIRTUAL_POOL_UP |
- ETH_MIRROR_VIRTUAL_POOL_DOWN)) &&
- (mirror_conf->pool_mask == 0)) {
- RTE_PMD_DEBUG_TRACE("Invalid mirror pool, pool mask can not be 0.\n");
- return -EINVAL;
- }
-
- if ((mirror_conf->rule_type & ETH_MIRROR_VLAN) &&
- mirror_conf->vlan.vlan_mask == 0) {
- RTE_PMD_DEBUG_TRACE("Invalid vlan mask, vlan mask can not be 0.\n");
- return -EINVAL;
- }
-
- dev = &rte_eth_devices[port_id];
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->mirror_rule_set, -ENOTSUP);
-
- return eth_err(port_id, (*dev->dev_ops->mirror_rule_set)(dev,
- mirror_conf, rule_id, on));
-}
-
-int
-rte_eth_mirror_rule_reset(uint16_t port_id, uint8_t rule_id)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
-
- dev = &rte_eth_devices[port_id];
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->mirror_rule_reset, -ENOTSUP);
-
- return eth_err(port_id, (*dev->dev_ops->mirror_rule_reset)(dev,
- rule_id));
-}
-
-RTE_INIT(eth_dev_init_cb_lists)
-{
- int i;
-
- for (i = 0; i < RTE_MAX_ETHPORTS; i++)
- TAILQ_INIT(&rte_eth_devices[i].link_intr_cbs);
-}
-
-int
-rte_eth_dev_callback_register(uint16_t port_id,
- enum rte_eth_event_type event,
- rte_eth_dev_cb_fn cb_fn, void *cb_arg)
-{
- struct rte_eth_dev *dev;
- struct rte_eth_dev_callback *user_cb;
- uint32_t next_port; /* size is 32-bit to prevent loop wrap-around */
- uint16_t last_port;
-
- if (!cb_fn)
- return -EINVAL;
-
- if (!rte_eth_dev_is_valid_port(port_id) && port_id != RTE_ETH_ALL) {
- RTE_LOG(ERR, EAL, "Invalid port_id=%d\n", port_id);
- return -EINVAL;
- }
-
- if (port_id == RTE_ETH_ALL) {
- next_port = 0;
- last_port = RTE_MAX_ETHPORTS - 1;
- } else {
- next_port = last_port = port_id;
- }
-
- rte_spinlock_lock(&rte_eth_dev_cb_lock);
-
- do {
- dev = &rte_eth_devices[next_port];
-
- TAILQ_FOREACH(user_cb, &(dev->link_intr_cbs), next) {
- if (user_cb->cb_fn == cb_fn &&
- user_cb->cb_arg == cb_arg &&
- user_cb->event == event) {
- break;
- }
- }
-
- /* create a new callback. */
- if (user_cb == NULL) {
- user_cb = rte_zmalloc("INTR_USER_CALLBACK",
- sizeof(struct rte_eth_dev_callback), 0);
- if (user_cb != NULL) {
- user_cb->cb_fn = cb_fn;
- user_cb->cb_arg = cb_arg;
- user_cb->event = event;
- TAILQ_INSERT_TAIL(&(dev->link_intr_cbs),
- user_cb, next);
- } else {
- rte_spinlock_unlock(&rte_eth_dev_cb_lock);
- rte_eth_dev_callback_unregister(port_id, event,
- cb_fn, cb_arg);
- return -ENOMEM;
- }
-
- }
- } while (++next_port <= last_port);
-
- rte_spinlock_unlock(&rte_eth_dev_cb_lock);
- return 0;
-}
-
-int
-rte_eth_dev_callback_unregister(uint16_t port_id,
- enum rte_eth_event_type event,
- rte_eth_dev_cb_fn cb_fn, void *cb_arg)
-{
- int ret;
- struct rte_eth_dev *dev;
- struct rte_eth_dev_callback *cb, *next;
- uint32_t next_port; /* size is 32-bit to prevent loop wrap-around */
- uint16_t last_port;
-
- if (!cb_fn)
- return -EINVAL;
-
- if (!rte_eth_dev_is_valid_port(port_id) && port_id != RTE_ETH_ALL) {
- RTE_LOG(ERR, EAL, "Invalid port_id=%d\n", port_id);
- return -EINVAL;
- }
-
- if (port_id == RTE_ETH_ALL) {
- next_port = 0;
- last_port = RTE_MAX_ETHPORTS - 1;
- } else {
- next_port = last_port = port_id;
- }
-
- rte_spinlock_lock(&rte_eth_dev_cb_lock);
-
- do {
- dev = &rte_eth_devices[next_port];
- ret = 0;
- for (cb = TAILQ_FIRST(&dev->link_intr_cbs); cb != NULL;
- cb = next) {
-
- next = TAILQ_NEXT(cb, next);
-
- if (cb->cb_fn != cb_fn || cb->event != event ||
- (cb->cb_arg != (void *)-1 && cb->cb_arg != cb_arg))
- continue;
-
- /*
- * if this callback is not executing right now,
- * then remove it.
- */
- if (cb->active == 0) {
- TAILQ_REMOVE(&(dev->link_intr_cbs), cb, next);
- rte_free(cb);
- } else {
- ret = -EAGAIN;
- }
- }
- } while (++next_port <= last_port);
-
- rte_spinlock_unlock(&rte_eth_dev_cb_lock);
- return ret;
-}
-
-int
-_rte_eth_dev_callback_process(struct rte_eth_dev *dev,
- enum rte_eth_event_type event, void *ret_param)
-{
- struct rte_eth_dev_callback *cb_lst;
- struct rte_eth_dev_callback dev_cb;
- int rc = 0;
-
- rte_spinlock_lock(&rte_eth_dev_cb_lock);
- TAILQ_FOREACH(cb_lst, &(dev->link_intr_cbs), next) {
- if (cb_lst->cb_fn == NULL || cb_lst->event != event)
- continue;
- dev_cb = *cb_lst;
- cb_lst->active = 1;
- if (ret_param != NULL)
- dev_cb.ret_param = ret_param;
-
- rte_spinlock_unlock(&rte_eth_dev_cb_lock);
- rc = dev_cb.cb_fn(dev->data->port_id, dev_cb.event,
- dev_cb.cb_arg, dev_cb.ret_param);
- rte_spinlock_lock(&rte_eth_dev_cb_lock);
- cb_lst->active = 0;
- }
- rte_spinlock_unlock(&rte_eth_dev_cb_lock);
- return rc;
-}
-
-int
-rte_eth_dev_rx_intr_ctl(uint16_t port_id, int epfd, int op, void *data)
-{
- uint32_t vec;
- struct rte_eth_dev *dev;
- struct rte_intr_handle *intr_handle;
- uint16_t qid;
- int rc;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
-
- dev = &rte_eth_devices[port_id];
-
- if (!dev->intr_handle) {
- RTE_PMD_DEBUG_TRACE("RX Intr handle unset\n");
- return -ENOTSUP;
- }
-
- intr_handle = dev->intr_handle;
- if (!intr_handle->intr_vec) {
- RTE_PMD_DEBUG_TRACE("RX Intr vector unset\n");
- return -EPERM;
- }
-
- for (qid = 0; qid < dev->data->nb_rx_queues; qid++) {
- vec = intr_handle->intr_vec[qid];
- rc = rte_intr_rx_ctl(intr_handle, epfd, op, vec, data);
- if (rc && rc != -EEXIST) {
- RTE_PMD_DEBUG_TRACE("p %u q %u rx ctl error"
- " op %d epfd %d vec %u\n",
- port_id, qid, op, epfd, vec);
- }
- }
-
- return 0;
-}
-
-const struct rte_memzone *
-rte_eth_dma_zone_reserve(const struct rte_eth_dev *dev, const char *ring_name,
- uint16_t queue_id, size_t size, unsigned align,
- int socket_id)
-{
- char z_name[RTE_MEMZONE_NAMESIZE];
- const struct rte_memzone *mz;
-
- snprintf(z_name, sizeof(z_name), "%s_%s_%d_%d",
- dev->device->driver->name, ring_name,
- dev->data->port_id, queue_id);
-
- mz = rte_memzone_lookup(z_name);
- if (mz)
- return mz;
-
- return rte_memzone_reserve_aligned(z_name, size, socket_id, 0, align);
-}
-
-int
-rte_eth_dev_rx_intr_ctl_q(uint16_t port_id, uint16_t queue_id,
- int epfd, int op, void *data)
-{
- uint32_t vec;
- struct rte_eth_dev *dev;
- struct rte_intr_handle *intr_handle;
- int rc;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
-
- dev = &rte_eth_devices[port_id];
- if (queue_id >= dev->data->nb_rx_queues) {
- RTE_PMD_DEBUG_TRACE("Invalid RX queue_id=%u\n", queue_id);
- return -EINVAL;
- }
-
- if (!dev->intr_handle) {
- RTE_PMD_DEBUG_TRACE("RX Intr handle unset\n");
- return -ENOTSUP;
- }
-
- intr_handle = dev->intr_handle;
- if (!intr_handle->intr_vec) {
- RTE_PMD_DEBUG_TRACE("RX Intr vector unset\n");
- return -EPERM;
- }
-
- vec = intr_handle->intr_vec[queue_id];
- rc = rte_intr_rx_ctl(intr_handle, epfd, op, vec, data);
- if (rc && rc != -EEXIST) {
- RTE_PMD_DEBUG_TRACE("p %u q %u rx ctl error"
- " op %d epfd %d vec %u\n",
- port_id, queue_id, op, epfd, vec);
- return rc;
- }
-
- return 0;
-}
-
-int
-rte_eth_dev_rx_intr_enable(uint16_t port_id,
- uint16_t queue_id)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
-
- dev = &rte_eth_devices[port_id];
-
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rx_queue_intr_enable, -ENOTSUP);
- return eth_err(port_id, (*dev->dev_ops->rx_queue_intr_enable)(dev,
- queue_id));
-}
-
-int
-rte_eth_dev_rx_intr_disable(uint16_t port_id,
- uint16_t queue_id)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
-
- dev = &rte_eth_devices[port_id];
-
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rx_queue_intr_disable, -ENOTSUP);
- return eth_err(port_id, (*dev->dev_ops->rx_queue_intr_disable)(dev,
- queue_id));
-}
-
-
-int
-rte_eth_dev_filter_supported(uint16_t port_id,
- enum rte_filter_type filter_type)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
-
- dev = &rte_eth_devices[port_id];
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->filter_ctrl, -ENOTSUP);
- return (*dev->dev_ops->filter_ctrl)(dev, filter_type,
- RTE_ETH_FILTER_NOP, NULL);
-}
-
-int
-rte_eth_dev_filter_ctrl_v22(uint16_t port_id,
- enum rte_filter_type filter_type,
- enum rte_filter_op filter_op, void *arg);
-
-int
-rte_eth_dev_filter_ctrl_v22(uint16_t port_id,
- enum rte_filter_type filter_type,
- enum rte_filter_op filter_op, void *arg)
-{
- struct rte_eth_fdir_info_v22 {
- enum rte_fdir_mode mode;
- struct rte_eth_fdir_masks mask;
- struct rte_eth_fdir_flex_conf flex_conf;
- uint32_t guarant_spc;
- uint32_t best_spc;
- uint32_t flow_types_mask[1];
- uint32_t max_flexpayload;
- uint32_t flex_payload_unit;
- uint32_t max_flex_payload_segment_num;
- uint16_t flex_payload_limit;
- uint32_t flex_bitmask_unit;
- uint32_t max_flex_bitmask_num;
- };
-
- struct rte_eth_hash_global_conf_v22 {
- enum rte_eth_hash_function hash_func;
- uint32_t sym_hash_enable_mask[1];
- uint32_t valid_bit_mask[1];
- };
-
- struct rte_eth_hash_filter_info_v22 {
- enum rte_eth_hash_filter_info_type info_type;
- union {
- uint8_t enable;
- struct rte_eth_hash_global_conf_v22 global_conf;
- struct rte_eth_input_set_conf input_set_conf;
- } info;
- };
-
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
-
- dev = &rte_eth_devices[port_id];
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->filter_ctrl, -ENOTSUP);
- if (filter_op == RTE_ETH_FILTER_INFO) {
- int retval;
- struct rte_eth_fdir_info_v22 *fdir_info_v22;
- struct rte_eth_fdir_info fdir_info;
-
- fdir_info_v22 = (struct rte_eth_fdir_info_v22 *)arg;
-
- retval = (*dev->dev_ops->filter_ctrl)(dev, filter_type,
- filter_op, (void *)&fdir_info);
- fdir_info_v22->mode = fdir_info.mode;
- fdir_info_v22->mask = fdir_info.mask;
- fdir_info_v22->flex_conf = fdir_info.flex_conf;
- fdir_info_v22->guarant_spc = fdir_info.guarant_spc;
- fdir_info_v22->best_spc = fdir_info.best_spc;
- fdir_info_v22->flow_types_mask[0] =
- (uint32_t)fdir_info.flow_types_mask[0];
- fdir_info_v22->max_flexpayload = fdir_info.max_flexpayload;
- fdir_info_v22->flex_payload_unit = fdir_info.flex_payload_unit;
- fdir_info_v22->max_flex_payload_segment_num =
- fdir_info.max_flex_payload_segment_num;
- fdir_info_v22->flex_payload_limit =
- fdir_info.flex_payload_limit;
- fdir_info_v22->flex_bitmask_unit = fdir_info.flex_bitmask_unit;
- fdir_info_v22->max_flex_bitmask_num =
- fdir_info.max_flex_bitmask_num;
- return retval;
- } else if (filter_op == RTE_ETH_FILTER_GET) {
- int retval;
- struct rte_eth_hash_filter_info f_info;
- struct rte_eth_hash_filter_info_v22 *f_info_v22 =
- (struct rte_eth_hash_filter_info_v22 *)arg;
-
- f_info.info_type = f_info_v22->info_type;
- retval = (*dev->dev_ops->filter_ctrl)(dev, filter_type,
- filter_op, (void *)&f_info);
-
- switch (f_info_v22->info_type) {
- case RTE_ETH_HASH_FILTER_SYM_HASH_ENA_PER_PORT:
- f_info_v22->info.enable = f_info.info.enable;
- break;
- case RTE_ETH_HASH_FILTER_GLOBAL_CONFIG:
- f_info_v22->info.global_conf.hash_func =
- f_info.info.global_conf.hash_func;
- f_info_v22->info.global_conf.sym_hash_enable_mask[0] =
- (uint32_t)
- f_info.info.global_conf.sym_hash_enable_mask[0];
- f_info_v22->info.global_conf.valid_bit_mask[0] =
- (uint32_t)
- f_info.info.global_conf.valid_bit_mask[0];
- break;
- case RTE_ETH_HASH_FILTER_INPUT_SET_SELECT:
- f_info_v22->info.input_set_conf =
- f_info.info.input_set_conf;
- break;
- default:
- break;
- }
- return retval;
- } else if (filter_op == RTE_ETH_FILTER_SET) {
- struct rte_eth_hash_filter_info f_info;
- struct rte_eth_hash_filter_info_v22 *f_v22 =
- (struct rte_eth_hash_filter_info_v22 *)arg;
-
- f_info.info_type = f_v22->info_type;
- switch (f_v22->info_type) {
- case RTE_ETH_HASH_FILTER_SYM_HASH_ENA_PER_PORT:
- f_info.info.enable = f_v22->info.enable;
- break;
- case RTE_ETH_HASH_FILTER_GLOBAL_CONFIG:
- f_info.info.global_conf.hash_func =
- f_v22->info.global_conf.hash_func;
- f_info.info.global_conf.sym_hash_enable_mask[0] =
- (uint32_t)
- f_v22->info.global_conf.sym_hash_enable_mask[0];
- f_info.info.global_conf.valid_bit_mask[0] =
- (uint32_t)
- f_v22->info.global_conf.valid_bit_mask[0];
- break;
- case RTE_ETH_HASH_FILTER_INPUT_SET_SELECT:
- f_info.info.input_set_conf =
- f_v22->info.input_set_conf;
- break;
- default:
- break;
- }
- return (*dev->dev_ops->filter_ctrl)(dev, filter_type, filter_op,
- (void *)&f_info);
- } else
- return (*dev->dev_ops->filter_ctrl)(dev, filter_type, filter_op,
- arg);
-}
-VERSION_SYMBOL(rte_eth_dev_filter_ctrl, _v22, 2.2);
-
-int
-rte_eth_dev_filter_ctrl_v1802(uint16_t port_id,
- enum rte_filter_type filter_type,
- enum rte_filter_op filter_op, void *arg);
-
-int
-rte_eth_dev_filter_ctrl_v1802(uint16_t port_id,
- enum rte_filter_type filter_type,
- enum rte_filter_op filter_op, void *arg)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
-
- dev = &rte_eth_devices[port_id];
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->filter_ctrl, -ENOTSUP);
- return eth_err(port_id, (*dev->dev_ops->filter_ctrl)(dev, filter_type,
- filter_op, arg));
-}
-BIND_DEFAULT_SYMBOL(rte_eth_dev_filter_ctrl, _v1802, 18.02);
-MAP_STATIC_SYMBOL(int rte_eth_dev_filter_ctrl(uint16_t port_id,
- enum rte_filter_type filter_type,
- enum rte_filter_op filter_op, void *arg),
- rte_eth_dev_filter_ctrl_v1802);
-
-void *
-rte_eth_add_rx_callback(uint16_t port_id, uint16_t queue_id,
- rte_rx_callback_fn fn, void *user_param)
-{
-#ifndef RTE_ETHDEV_RXTX_CALLBACKS
- rte_errno = ENOTSUP;
- return NULL;
-#endif
- /* check input parameters */
- if (!rte_eth_dev_is_valid_port(port_id) || fn == NULL ||
- queue_id >= rte_eth_devices[port_id].data->nb_rx_queues) {
- rte_errno = EINVAL;
- return NULL;
- }
- struct rte_eth_rxtx_callback *cb = rte_zmalloc(NULL, sizeof(*cb), 0);
-
- if (cb == NULL) {
- rte_errno = ENOMEM;
- return NULL;
- }
-
- cb->fn.rx = fn;
- cb->param = user_param;
-
- rte_spinlock_lock(&rte_eth_rx_cb_lock);
- /* Add the callbacks in fifo order. */
- struct rte_eth_rxtx_callback *tail =
- rte_eth_devices[port_id].post_rx_burst_cbs[queue_id];
-
- if (!tail) {
- rte_eth_devices[port_id].post_rx_burst_cbs[queue_id] = cb;
-
- } else {
- while (tail->next)
- tail = tail->next;
- tail->next = cb;
- }
- rte_spinlock_unlock(&rte_eth_rx_cb_lock);
-
- return cb;
-}
-
-void *
-rte_eth_add_first_rx_callback(uint16_t port_id, uint16_t queue_id,
- rte_rx_callback_fn fn, void *user_param)
-{
-#ifndef RTE_ETHDEV_RXTX_CALLBACKS
- rte_errno = ENOTSUP;
- return NULL;
-#endif
- /* check input parameters */
- if (!rte_eth_dev_is_valid_port(port_id) || fn == NULL ||
- queue_id >= rte_eth_devices[port_id].data->nb_rx_queues) {
- rte_errno = EINVAL;
- return NULL;
- }
-
- struct rte_eth_rxtx_callback *cb = rte_zmalloc(NULL, sizeof(*cb), 0);
-
- if (cb == NULL) {
- rte_errno = ENOMEM;
- return NULL;
- }
-
- cb->fn.rx = fn;
- cb->param = user_param;
-
- rte_spinlock_lock(&rte_eth_rx_cb_lock);
- /* Add the callbacks at fisrt position*/
- cb->next = rte_eth_devices[port_id].post_rx_burst_cbs[queue_id];
- rte_smp_wmb();
- rte_eth_devices[port_id].post_rx_burst_cbs[queue_id] = cb;
- rte_spinlock_unlock(&rte_eth_rx_cb_lock);
-
- return cb;
-}
-
-void *
-rte_eth_add_tx_callback(uint16_t port_id, uint16_t queue_id,
- rte_tx_callback_fn fn, void *user_param)
-{
-#ifndef RTE_ETHDEV_RXTX_CALLBACKS
- rte_errno = ENOTSUP;
- return NULL;
-#endif
- /* check input parameters */
- if (!rte_eth_dev_is_valid_port(port_id) || fn == NULL ||
- queue_id >= rte_eth_devices[port_id].data->nb_tx_queues) {
- rte_errno = EINVAL;
- return NULL;
- }
-
- struct rte_eth_rxtx_callback *cb = rte_zmalloc(NULL, sizeof(*cb), 0);
-
- if (cb == NULL) {
- rte_errno = ENOMEM;
- return NULL;
- }
-
- cb->fn.tx = fn;
- cb->param = user_param;
-
- rte_spinlock_lock(&rte_eth_tx_cb_lock);
- /* Add the callbacks in fifo order. */
- struct rte_eth_rxtx_callback *tail =
- rte_eth_devices[port_id].pre_tx_burst_cbs[queue_id];
-
- if (!tail) {
- rte_eth_devices[port_id].pre_tx_burst_cbs[queue_id] = cb;
-
- } else {
- while (tail->next)
- tail = tail->next;
- tail->next = cb;
- }
- rte_spinlock_unlock(&rte_eth_tx_cb_lock);
-
- return cb;
-}
-
-int
-rte_eth_remove_rx_callback(uint16_t port_id, uint16_t queue_id,
- struct rte_eth_rxtx_callback *user_cb)
-{
-#ifndef RTE_ETHDEV_RXTX_CALLBACKS
- return -ENOTSUP;
-#endif
- /* Check input parameters. */
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -EINVAL);
- if (user_cb == NULL ||
- queue_id >= rte_eth_devices[port_id].data->nb_rx_queues)
- return -EINVAL;
-
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
- struct rte_eth_rxtx_callback *cb;
- struct rte_eth_rxtx_callback **prev_cb;
- int ret = -EINVAL;
-
- rte_spinlock_lock(&rte_eth_rx_cb_lock);
- prev_cb = &dev->post_rx_burst_cbs[queue_id];
- for (; *prev_cb != NULL; prev_cb = &cb->next) {
- cb = *prev_cb;
- if (cb == user_cb) {
- /* Remove the user cb from the callback list. */
- *prev_cb = cb->next;
- ret = 0;
- break;
- }
- }
- rte_spinlock_unlock(&rte_eth_rx_cb_lock);
-
- return ret;
-}
-
-int
-rte_eth_remove_tx_callback(uint16_t port_id, uint16_t queue_id,
- struct rte_eth_rxtx_callback *user_cb)
-{
-#ifndef RTE_ETHDEV_RXTX_CALLBACKS
- return -ENOTSUP;
-#endif
- /* Check input parameters. */
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -EINVAL);
- if (user_cb == NULL ||
- queue_id >= rte_eth_devices[port_id].data->nb_tx_queues)
- return -EINVAL;
-
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
- int ret = -EINVAL;
- struct rte_eth_rxtx_callback *cb;
- struct rte_eth_rxtx_callback **prev_cb;
-
- rte_spinlock_lock(&rte_eth_tx_cb_lock);
- prev_cb = &dev->pre_tx_burst_cbs[queue_id];
- for (; *prev_cb != NULL; prev_cb = &cb->next) {
- cb = *prev_cb;
- if (cb == user_cb) {
- /* Remove the user cb from the callback list. */
- *prev_cb = cb->next;
- ret = 0;
- break;
- }
- }
- rte_spinlock_unlock(&rte_eth_tx_cb_lock);
-
- return ret;
-}
-
-int
-rte_eth_rx_queue_info_get(uint16_t port_id, uint16_t queue_id,
- struct rte_eth_rxq_info *qinfo)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
-
- if (qinfo == NULL)
- return -EINVAL;
-
- dev = &rte_eth_devices[port_id];
- if (queue_id >= dev->data->nb_rx_queues) {
- RTE_PMD_DEBUG_TRACE("Invalid RX queue_id=%d\n", queue_id);
- return -EINVAL;
- }
-
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rxq_info_get, -ENOTSUP);
-
- memset(qinfo, 0, sizeof(*qinfo));
- dev->dev_ops->rxq_info_get(dev, queue_id, qinfo);
- return 0;
-}
-
-int
-rte_eth_tx_queue_info_get(uint16_t port_id, uint16_t queue_id,
- struct rte_eth_txq_info *qinfo)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
-
- if (qinfo == NULL)
- return -EINVAL;
-
- dev = &rte_eth_devices[port_id];
- if (queue_id >= dev->data->nb_tx_queues) {
- RTE_PMD_DEBUG_TRACE("Invalid TX queue_id=%d\n", queue_id);
- return -EINVAL;
- }
-
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->txq_info_get, -ENOTSUP);
-
- memset(qinfo, 0, sizeof(*qinfo));
- dev->dev_ops->txq_info_get(dev, queue_id, qinfo);
- return 0;
-}
-
-int
-rte_eth_dev_set_mc_addr_list(uint16_t port_id,
- struct ether_addr *mc_addr_set,
- uint32_t nb_mc_addr)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
-
- dev = &rte_eth_devices[port_id];
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->set_mc_addr_list, -ENOTSUP);
- return eth_err(port_id, dev->dev_ops->set_mc_addr_list(dev,
- mc_addr_set, nb_mc_addr));
-}
-
-int
-rte_eth_timesync_enable(uint16_t port_id)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
- dev = &rte_eth_devices[port_id];
-
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->timesync_enable, -ENOTSUP);
- return eth_err(port_id, (*dev->dev_ops->timesync_enable)(dev));
-}
-
-int
-rte_eth_timesync_disable(uint16_t port_id)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
- dev = &rte_eth_devices[port_id];
-
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->timesync_disable, -ENOTSUP);
- return eth_err(port_id, (*dev->dev_ops->timesync_disable)(dev));
-}
-
-int
-rte_eth_timesync_read_rx_timestamp(uint16_t port_id, struct timespec *timestamp,
- uint32_t flags)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
- dev = &rte_eth_devices[port_id];
-
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->timesync_read_rx_timestamp, -ENOTSUP);
- return eth_err(port_id, (*dev->dev_ops->timesync_read_rx_timestamp)
- (dev, timestamp, flags));
-}
-
-int
-rte_eth_timesync_read_tx_timestamp(uint16_t port_id,
- struct timespec *timestamp)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
- dev = &rte_eth_devices[port_id];
-
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->timesync_read_tx_timestamp, -ENOTSUP);
- return eth_err(port_id, (*dev->dev_ops->timesync_read_tx_timestamp)
- (dev, timestamp));
-}
-
-int
-rte_eth_timesync_adjust_time(uint16_t port_id, int64_t delta)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
- dev = &rte_eth_devices[port_id];
-
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->timesync_adjust_time, -ENOTSUP);
- return eth_err(port_id, (*dev->dev_ops->timesync_adjust_time)(dev,
- delta));
-}
-
-int
-rte_eth_timesync_read_time(uint16_t port_id, struct timespec *timestamp)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
- dev = &rte_eth_devices[port_id];
-
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->timesync_read_time, -ENOTSUP);
- return eth_err(port_id, (*dev->dev_ops->timesync_read_time)(dev,
- timestamp));
-}
-
-int
-rte_eth_timesync_write_time(uint16_t port_id, const struct timespec *timestamp)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
- dev = &rte_eth_devices[port_id];
-
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->timesync_write_time, -ENOTSUP);
- return eth_err(port_id, (*dev->dev_ops->timesync_write_time)(dev,
- timestamp));
-}
-
-int
-rte_eth_dev_get_reg_info(uint16_t port_id, struct rte_dev_reg_info *info)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
-
- dev = &rte_eth_devices[port_id];
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->get_reg, -ENOTSUP);
- return eth_err(port_id, (*dev->dev_ops->get_reg)(dev, info));
-}
-
-int
-rte_eth_dev_get_eeprom_length(uint16_t port_id)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
-
- dev = &rte_eth_devices[port_id];
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->get_eeprom_length, -ENOTSUP);
- return eth_err(port_id, (*dev->dev_ops->get_eeprom_length)(dev));
-}
-
-int
-rte_eth_dev_get_eeprom(uint16_t port_id, struct rte_dev_eeprom_info *info)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
-
- dev = &rte_eth_devices[port_id];
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->get_eeprom, -ENOTSUP);
- return eth_err(port_id, (*dev->dev_ops->get_eeprom)(dev, info));
-}
-
-int
-rte_eth_dev_set_eeprom(uint16_t port_id, struct rte_dev_eeprom_info *info)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
-
- dev = &rte_eth_devices[port_id];
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->set_eeprom, -ENOTSUP);
- return eth_err(port_id, (*dev->dev_ops->set_eeprom)(dev, info));
-}
-
-int
-rte_eth_dev_get_dcb_info(uint16_t port_id,
- struct rte_eth_dcb_info *dcb_info)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
-
- dev = &rte_eth_devices[port_id];
- memset(dcb_info, 0, sizeof(struct rte_eth_dcb_info));
-
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->get_dcb_info, -ENOTSUP);
- return eth_err(port_id, (*dev->dev_ops->get_dcb_info)(dev, dcb_info));
-}
-
-int
-rte_eth_dev_l2_tunnel_eth_type_conf(uint16_t port_id,
- struct rte_eth_l2_tunnel_conf *l2_tunnel)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
- if (l2_tunnel == NULL) {
- RTE_PMD_DEBUG_TRACE("Invalid l2_tunnel parameter\n");
- return -EINVAL;
- }
-
- if (l2_tunnel->l2_tunnel_type >= RTE_TUNNEL_TYPE_MAX) {
- RTE_PMD_DEBUG_TRACE("Invalid tunnel type\n");
- return -EINVAL;
- }
-
- dev = &rte_eth_devices[port_id];
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->l2_tunnel_eth_type_conf,
- -ENOTSUP);
- return eth_err(port_id, (*dev->dev_ops->l2_tunnel_eth_type_conf)(dev,
- l2_tunnel));
-}
-
-int
-rte_eth_dev_l2_tunnel_offload_set(uint16_t port_id,
- struct rte_eth_l2_tunnel_conf *l2_tunnel,
- uint32_t mask,
- uint8_t en)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
-
- if (l2_tunnel == NULL) {
- RTE_PMD_DEBUG_TRACE("Invalid l2_tunnel parameter\n");
- return -EINVAL;
- }
-
- if (l2_tunnel->l2_tunnel_type >= RTE_TUNNEL_TYPE_MAX) {
- RTE_PMD_DEBUG_TRACE("Invalid tunnel type.\n");
- return -EINVAL;
- }
-
- if (mask == 0) {
- RTE_PMD_DEBUG_TRACE("Mask should have a value.\n");
- return -EINVAL;
- }
-
- dev = &rte_eth_devices[port_id];
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->l2_tunnel_offload_set,
- -ENOTSUP);
- return eth_err(port_id, (*dev->dev_ops->l2_tunnel_offload_set)(dev,
- l2_tunnel, mask, en));
-}
-
-static void
-rte_eth_dev_adjust_nb_desc(uint16_t *nb_desc,
- const struct rte_eth_desc_lim *desc_lim)
-{
- if (desc_lim->nb_align != 0)
- *nb_desc = RTE_ALIGN_CEIL(*nb_desc, desc_lim->nb_align);
-
- if (desc_lim->nb_max != 0)
- *nb_desc = RTE_MIN(*nb_desc, desc_lim->nb_max);
-
- *nb_desc = RTE_MAX(*nb_desc, desc_lim->nb_min);
-}
-
-int
-rte_eth_dev_adjust_nb_rx_tx_desc(uint16_t port_id,
- uint16_t *nb_rx_desc,
- uint16_t *nb_tx_desc)
-{
- struct rte_eth_dev *dev;
- struct rte_eth_dev_info dev_info;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
-
- dev = &rte_eth_devices[port_id];
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->dev_infos_get, -ENOTSUP);
-
- rte_eth_dev_info_get(port_id, &dev_info);
-
- if (nb_rx_desc != NULL)
- rte_eth_dev_adjust_nb_desc(nb_rx_desc, &dev_info.rx_desc_lim);
-
- if (nb_tx_desc != NULL)
- rte_eth_dev_adjust_nb_desc(nb_tx_desc, &dev_info.tx_desc_lim);
-
- return 0;
-}
-
-int
-rte_eth_dev_pool_ops_supported(uint16_t port_id, const char *pool)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
-
- if (pool == NULL)
- return -EINVAL;
-
- dev = &rte_eth_devices[port_id];
-
- if (*dev->dev_ops->pool_ops_supported == NULL)
- return 1; /* all pools are supported */
-
- return (*dev->dev_ops->pool_ops_supported)(dev, pool);
-}
diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
deleted file mode 100644
index 03615330..00000000
--- a/lib/librte_ether/rte_ethdev.h
+++ /dev/null
@@ -1,4112 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2017 Intel Corporation
- */
-
-#ifndef _RTE_ETHDEV_H_
-#define _RTE_ETHDEV_H_
-
-/**
- * @file
- *
- * RTE Ethernet Device API
- *
- * The Ethernet Device API is composed of two parts:
- *
- * - The application-oriented Ethernet API that includes functions to setup
- * an Ethernet device (configure it, setup its RX and TX queues and start it),
- * to get its MAC address, the speed and the status of its physical link,
- * to receive and to transmit packets, and so on.
- *
- * - The driver-oriented Ethernet API that exports functions allowing
- * an Ethernet Poll Mode Driver (PMD) to allocate an Ethernet device instance,
- * create memzone for HW rings and process registered callbacks, and so on.
- * PMDs should include rte_ethdev_driver.h instead of this header.
- *
- * By default, all the functions of the Ethernet Device API exported by a PMD
- * are lock-free functions which assume to not be invoked in parallel on
- * different logical cores to work on the same target object. For instance,
- * the receive function of a PMD cannot be invoked in parallel on two logical
- * cores to poll the same RX queue [of the same port]. Of course, this function
- * can be invoked in parallel by different logical cores on different RX queues.
- * It is the responsibility of the upper level application to enforce this rule.
- *
- * If needed, parallel accesses by multiple logical cores to shared queues
- * shall be explicitly protected by dedicated inline lock-aware functions
- * built on top of their corresponding lock-free functions of the PMD API.
- *
- * In all functions of the Ethernet API, the Ethernet device is
- * designated by an integer >= 0 named the device port identifier.
- *
- * At the Ethernet driver level, Ethernet devices are represented by a generic
- * data structure of type *rte_eth_dev*.
- *
- * Ethernet devices are dynamically registered during the PCI probing phase
- * performed at EAL initialization time.
- * When an Ethernet device is being probed, an *rte_eth_dev* structure and
- * a new port identifier are allocated for that device. Then, the eth_dev_init()
- * function supplied by the Ethernet driver matching the probed PCI
- * device is invoked to properly initialize the device.
- *
- * The role of the device init function consists of resetting the hardware,
- * checking access to Non-volatile Memory (NVM), reading the MAC address
- * from NVM etc.
- *
- * If the device init operation is successful, the correspondence between
- * the port identifier assigned to the new device and its associated
- * *rte_eth_dev* structure is effectively registered.
- * Otherwise, both the *rte_eth_dev* structure and the port identifier are
- * freed.
- *
- * The functions exported by the application Ethernet API to setup a device
- * designated by its port identifier must be invoked in the following order:
- * - rte_eth_dev_configure()
- * - rte_eth_tx_queue_setup()
- * - rte_eth_rx_queue_setup()
- * - rte_eth_dev_start()
- *
- * Then, the network application can invoke, in any order, the functions
- * exported by the Ethernet API to get the MAC address of a given device, to
- * get the speed and the status of a device physical link, to receive/transmit
- * [burst of] packets, and so on.
- *
- * If the application wants to change the configuration (i.e. call
- * rte_eth_dev_configure(), rte_eth_tx_queue_setup(), or
- * rte_eth_rx_queue_setup()), it must call rte_eth_dev_stop() first to stop the
- * device and then do the reconfiguration before calling rte_eth_dev_start()
- * again. The transmit and receive functions should not be invoked when the
- * device is stopped.
- *
- * Please note that some configuration is not stored between calls to
- * rte_eth_dev_stop()/rte_eth_dev_start(). The following configuration will
- * be retained:
- *
- * - flow control settings
- * - receive mode configuration (promiscuous mode, hardware checksum mode,
- * RSS/VMDQ settings etc.)
- * - VLAN filtering configuration
- * - MAC addresses supplied to MAC address array
- * - flow director filtering mode (but not filtering rules)
- * - NIC queue statistics mappings
- *
- * Any other configuration will not be stored and will need to be re-entered
- * before a call to rte_eth_dev_start().
- *
- * Finally, a network application can close an Ethernet device by invoking the
- * rte_eth_dev_close() function.
- *
- * Each function of the application Ethernet API invokes a specific function
- * of the PMD that controls the target device designated by its port
- * identifier.
- * For this purpose, all device-specific functions of an Ethernet driver are
- * supplied through a set of pointers contained in a generic structure of type
- * *eth_dev_ops*.
- * The address of the *eth_dev_ops* structure is stored in the *rte_eth_dev*
- * structure by the device init function of the Ethernet driver, which is
- * invoked during the PCI probing phase, as explained earlier.
- *
- * In other words, each function of the Ethernet API simply retrieves the
- * *rte_eth_dev* structure associated with the device port identifier and
- * performs an indirect invocation of the corresponding driver function
- * supplied in the *eth_dev_ops* structure of the *rte_eth_dev* structure.
- *
- * For performance reasons, the address of the burst-oriented RX and TX
- * functions of the Ethernet driver are not contained in the *eth_dev_ops*
- * structure. Instead, they are directly stored at the beginning of the
- * *rte_eth_dev* structure to avoid an extra indirect memory access during
- * their invocation.
- *
- * RTE ethernet device drivers do not use interrupts for transmitting or
- * receiving. Instead, Ethernet drivers export Poll-Mode receive and transmit
- * functions to applications.
- * Both receive and transmit functions are packet-burst oriented to minimize
- * their cost per packet through the following optimizations:
- *
- * - Sharing among multiple packets the incompressible cost of the
- * invocation of receive/transmit functions.
- *
- * - Enabling receive/transmit functions to take advantage of burst-oriented
- * hardware features (L1 cache, prefetch instructions, NIC head/tail
- * registers) to minimize the number of CPU cycles per packet, for instance,
- * by avoiding useless read memory accesses to ring descriptors, or by
- * systematically using arrays of pointers that exactly fit L1 cache line
- * boundaries and sizes.
- *
- * The burst-oriented receive function does not provide any error notification,
- * to avoid the corresponding overhead. As a hint, the upper-level application
- * might check the status of the device link once being systematically returned
- * a 0 value by the receive function of the driver for a given number of tries.
- */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <stdint.h>
-
-/* Use this macro to check if LRO API is supported */
-#define RTE_ETHDEV_HAS_LRO_SUPPORT
-
-#include <rte_compat.h>
-#include <rte_log.h>
-#include <rte_interrupts.h>
-#include <rte_dev.h>
-#include <rte_devargs.h>
-#include <rte_errno.h>
-#include <rte_common.h>
-#include <rte_config.h>
-
-#include "rte_ether.h"
-#include "rte_eth_ctrl.h"
-#include "rte_dev_info.h"
-
-struct rte_mbuf;
-
-/**
- * A structure used to retrieve statistics for an Ethernet port.
- * Not all statistics fields in struct rte_eth_stats are supported
- * by any type of network interface card (NIC). If any statistics
- * field is not supported, its value is 0.
- */
-struct rte_eth_stats {
- uint64_t ipackets; /**< Total number of successfully received packets. */
- uint64_t opackets; /**< Total number of successfully transmitted packets.*/
- uint64_t ibytes; /**< Total number of successfully received bytes. */
- uint64_t obytes; /**< Total number of successfully transmitted bytes. */
- uint64_t imissed;
- /**< Total of RX packets dropped by the HW,
- * because there are no available buffer (i.e. RX queues are full).
- */
- uint64_t ierrors; /**< Total number of erroneous received packets. */
- uint64_t oerrors; /**< Total number of failed transmitted packets. */
- uint64_t rx_nombuf; /**< Total number of RX mbuf allocation failures. */
- uint64_t q_ipackets[RTE_ETHDEV_QUEUE_STAT_CNTRS];
- /**< Total number of queue RX packets. */
- uint64_t q_opackets[RTE_ETHDEV_QUEUE_STAT_CNTRS];
- /**< Total number of queue TX packets. */
- uint64_t q_ibytes[RTE_ETHDEV_QUEUE_STAT_CNTRS];
- /**< Total number of successfully received queue bytes. */
- uint64_t q_obytes[RTE_ETHDEV_QUEUE_STAT_CNTRS];
- /**< Total number of successfully transmitted queue bytes. */
- uint64_t q_errors[RTE_ETHDEV_QUEUE_STAT_CNTRS];
- /**< Total number of queue packets received that are dropped. */
-};
-
-/**
- * Device supported speeds bitmap flags
- */
-#define ETH_LINK_SPEED_AUTONEG (0 << 0) /**< Autonegotiate (all speeds) */
-#define ETH_LINK_SPEED_FIXED (1 << 0) /**< Disable autoneg (fixed speed) */
-#define ETH_LINK_SPEED_10M_HD (1 << 1) /**< 10 Mbps half-duplex */
-#define ETH_LINK_SPEED_10M (1 << 2) /**< 10 Mbps full-duplex */
-#define ETH_LINK_SPEED_100M_HD (1 << 3) /**< 100 Mbps half-duplex */
-#define ETH_LINK_SPEED_100M (1 << 4) /**< 100 Mbps full-duplex */
-#define ETH_LINK_SPEED_1G (1 << 5) /**< 1 Gbps */
-#define ETH_LINK_SPEED_2_5G (1 << 6) /**< 2.5 Gbps */
-#define ETH_LINK_SPEED_5G (1 << 7) /**< 5 Gbps */
-#define ETH_LINK_SPEED_10G (1 << 8) /**< 10 Gbps */
-#define ETH_LINK_SPEED_20G (1 << 9) /**< 20 Gbps */
-#define ETH_LINK_SPEED_25G (1 << 10) /**< 25 Gbps */
-#define ETH_LINK_SPEED_40G (1 << 11) /**< 40 Gbps */
-#define ETH_LINK_SPEED_50G (1 << 12) /**< 50 Gbps */
-#define ETH_LINK_SPEED_56G (1 << 13) /**< 56 Gbps */
-#define ETH_LINK_SPEED_100G (1 << 14) /**< 100 Gbps */
-
-/**
- * Ethernet numeric link speeds in Mbps
- */
-#define ETH_SPEED_NUM_NONE 0 /**< Not defined */
-#define ETH_SPEED_NUM_10M 10 /**< 10 Mbps */
-#define ETH_SPEED_NUM_100M 100 /**< 100 Mbps */
-#define ETH_SPEED_NUM_1G 1000 /**< 1 Gbps */
-#define ETH_SPEED_NUM_2_5G 2500 /**< 2.5 Gbps */
-#define ETH_SPEED_NUM_5G 5000 /**< 5 Gbps */
-#define ETH_SPEED_NUM_10G 10000 /**< 10 Gbps */
-#define ETH_SPEED_NUM_20G 20000 /**< 20 Gbps */
-#define ETH_SPEED_NUM_25G 25000 /**< 25 Gbps */
-#define ETH_SPEED_NUM_40G 40000 /**< 40 Gbps */
-#define ETH_SPEED_NUM_50G 50000 /**< 50 Gbps */
-#define ETH_SPEED_NUM_56G 56000 /**< 56 Gbps */
-#define ETH_SPEED_NUM_100G 100000 /**< 100 Gbps */
-
-/**
- * A structure used to retrieve link-level information of an Ethernet port.
- */
-__extension__
-struct rte_eth_link {
- uint32_t link_speed; /**< ETH_SPEED_NUM_ */
- uint16_t link_duplex : 1; /**< ETH_LINK_[HALF/FULL]_DUPLEX */
- uint16_t link_autoneg : 1; /**< ETH_LINK_[AUTONEG/FIXED] */
- uint16_t link_status : 1; /**< ETH_LINK_[DOWN/UP] */
-} __attribute__((aligned(8))); /**< aligned for atomic64 read/write */
-
-/* Utility constants */
-#define ETH_LINK_HALF_DUPLEX 0 /**< Half-duplex connection (see link_duplex). */
-#define ETH_LINK_FULL_DUPLEX 1 /**< Full-duplex connection (see link_duplex). */
-#define ETH_LINK_DOWN 0 /**< Link is down (see link_status). */
-#define ETH_LINK_UP 1 /**< Link is up (see link_status). */
-#define ETH_LINK_FIXED 0 /**< No autonegotiation (see link_autoneg). */
-#define ETH_LINK_AUTONEG 1 /**< Autonegotiated (see link_autoneg). */
-
-/**
- * A structure used to configure the ring threshold registers of an RX/TX
- * queue for an Ethernet port.
- */
-struct rte_eth_thresh {
- uint8_t pthresh; /**< Ring prefetch threshold. */
- uint8_t hthresh; /**< Ring host threshold. */
- uint8_t wthresh; /**< Ring writeback threshold. */
-};
-
-/**
- * Simple flags are used for rte_eth_conf.rxmode.mq_mode.
- */
-#define ETH_MQ_RX_RSS_FLAG 0x1
-#define ETH_MQ_RX_DCB_FLAG 0x2
-#define ETH_MQ_RX_VMDQ_FLAG 0x4
-
-/**
- * A set of values to identify what method is to be used to route
- * packets to multiple queues.
- */
-enum rte_eth_rx_mq_mode {
- /** None of DCB,RSS or VMDQ mode */
- ETH_MQ_RX_NONE = 0,
-
- /** For RX side, only RSS is on */
- ETH_MQ_RX_RSS = ETH_MQ_RX_RSS_FLAG,
- /** For RX side,only DCB is on. */
- ETH_MQ_RX_DCB = ETH_MQ_RX_DCB_FLAG,
- /** Both DCB and RSS enable */
- ETH_MQ_RX_DCB_RSS = ETH_MQ_RX_RSS_FLAG | ETH_MQ_RX_DCB_FLAG,
-
- /** Only VMDQ, no RSS nor DCB */
- ETH_MQ_RX_VMDQ_ONLY = ETH_MQ_RX_VMDQ_FLAG,
- /** RSS mode with VMDQ */
- ETH_MQ_RX_VMDQ_RSS = ETH_MQ_RX_RSS_FLAG | ETH_MQ_RX_VMDQ_FLAG,
- /** Use VMDQ+DCB to route traffic to queues */
- ETH_MQ_RX_VMDQ_DCB = ETH_MQ_RX_VMDQ_FLAG | ETH_MQ_RX_DCB_FLAG,
- /** Enable both VMDQ and DCB in VMDq */
- ETH_MQ_RX_VMDQ_DCB_RSS = ETH_MQ_RX_RSS_FLAG | ETH_MQ_RX_DCB_FLAG |
- ETH_MQ_RX_VMDQ_FLAG,
-};
-
-/**
- * for rx mq mode backward compatible
- */
-#define ETH_RSS ETH_MQ_RX_RSS
-#define VMDQ_DCB ETH_MQ_RX_VMDQ_DCB
-#define ETH_DCB_RX ETH_MQ_RX_DCB
-
-/**
- * A set of values to identify what method is to be used to transmit
- * packets using multi-TCs.
- */
-enum rte_eth_tx_mq_mode {
- ETH_MQ_TX_NONE = 0, /**< It is in neither DCB nor VT mode. */
- ETH_MQ_TX_DCB, /**< For TX side,only DCB is on. */
- ETH_MQ_TX_VMDQ_DCB, /**< For TX side,both DCB and VT is on. */
- ETH_MQ_TX_VMDQ_ONLY, /**< Only VT on, no DCB */
-};
-
-/**
- * for tx mq mode backward compatible
- */
-#define ETH_DCB_NONE ETH_MQ_TX_NONE
-#define ETH_VMDQ_DCB_TX ETH_MQ_TX_VMDQ_DCB
-#define ETH_DCB_TX ETH_MQ_TX_DCB
-
-/**
- * A structure used to configure the RX features of an Ethernet port.
- */
-struct rte_eth_rxmode {
- /** The multi-queue packet distribution mode to be used, e.g. RSS. */
- enum rte_eth_rx_mq_mode mq_mode;
- uint32_t max_rx_pkt_len; /**< Only used if jumbo_frame enabled. */
- uint16_t split_hdr_size; /**< hdr buf size (header_split enabled).*/
- /**
- * Per-port Rx offloads to be set using DEV_RX_OFFLOAD_* flags.
- * Only offloads set on rx_offload_capa field on rte_eth_dev_info
- * structure are allowed to be set.
- */
- uint64_t offloads;
- __extension__
- /**
- * Below bitfield API is obsolete. Application should
- * enable per-port offloads using the offload field
- * above.
- */
- uint16_t header_split : 1, /**< Header Split enable. */
- hw_ip_checksum : 1, /**< IP/UDP/TCP checksum offload enable. */
- hw_vlan_filter : 1, /**< VLAN filter enable. */
- hw_vlan_strip : 1, /**< VLAN strip enable. */
- hw_vlan_extend : 1, /**< Extended VLAN enable. */
- jumbo_frame : 1, /**< Jumbo Frame Receipt enable. */
- hw_strip_crc : 1, /**< Enable CRC stripping by hardware. */
- enable_scatter : 1, /**< Enable scatter packets rx handler */
- enable_lro : 1, /**< Enable LRO */
- hw_timestamp : 1, /**< Enable HW timestamp */
- security : 1, /**< Enable rte_security offloads */
- /**
- * When set the offload bitfield should be ignored.
- * Instead per-port Rx offloads should be set on offloads
- * field above.
- * Per-queue offloads shuold be set on rte_eth_rxq_conf
- * structure.
- * This bit is temporary till rxmode bitfield offloads API will
- * be deprecated.
- */
- ignore_offload_bitfield : 1;
-};
-
-/**
- * VLAN types to indicate if it is for single VLAN, inner VLAN or outer VLAN.
- * Note that single VLAN is treated the same as inner VLAN.
- */
-enum rte_vlan_type {
- ETH_VLAN_TYPE_UNKNOWN = 0,
- ETH_VLAN_TYPE_INNER, /**< Inner VLAN. */
- ETH_VLAN_TYPE_OUTER, /**< Single VLAN, or outer VLAN. */
- ETH_VLAN_TYPE_MAX,
-};
-
-/**
- * A structure used to describe a vlan filter.
- * If the bit corresponding to a VID is set, such VID is on.
- */
-struct rte_vlan_filter_conf {
- uint64_t ids[64];
-};
-
-/**
- * A structure used to configure the Receive Side Scaling (RSS) feature
- * of an Ethernet port.
- * If not NULL, the *rss_key* pointer of the *rss_conf* structure points
- * to an array holding the RSS key to use for hashing specific header
- * fields of received packets. The length of this array should be indicated
- * by *rss_key_len* below. Otherwise, a default random hash key is used by
- * the device driver.
- *
- * The *rss_key_len* field of the *rss_conf* structure indicates the length
- * in bytes of the array pointed by *rss_key*. To be compatible, this length
- * will be checked in i40e only. Others assume 40 bytes to be used as before.
- *
- * The *rss_hf* field of the *rss_conf* structure indicates the different
- * types of IPv4/IPv6 packets to which the RSS hashing must be applied.
- * Supplying an *rss_hf* equal to zero disables the RSS feature.
- */
-struct rte_eth_rss_conf {
- uint8_t *rss_key; /**< If not NULL, 40-byte hash key. */
- uint8_t rss_key_len; /**< hash key length in bytes. */
- uint64_t rss_hf; /**< Hash functions to apply - see below. */
-};
-
-/*
- * The RSS offload types are defined based on flow types which are defined
- * in rte_eth_ctrl.h. Different NIC hardwares may support different RSS offload
- * types. The supported flow types or RSS offload types can be queried by
- * rte_eth_dev_info_get().
- */
-#define ETH_RSS_IPV4 (1ULL << RTE_ETH_FLOW_IPV4)
-#define ETH_RSS_FRAG_IPV4 (1ULL << RTE_ETH_FLOW_FRAG_IPV4)
-#define ETH_RSS_NONFRAG_IPV4_TCP (1ULL << RTE_ETH_FLOW_NONFRAG_IPV4_TCP)
-#define ETH_RSS_NONFRAG_IPV4_UDP (1ULL << RTE_ETH_FLOW_NONFRAG_IPV4_UDP)
-#define ETH_RSS_NONFRAG_IPV4_SCTP (1ULL << RTE_ETH_FLOW_NONFRAG_IPV4_SCTP)
-#define ETH_RSS_NONFRAG_IPV4_OTHER (1ULL << RTE_ETH_FLOW_NONFRAG_IPV4_OTHER)
-#define ETH_RSS_IPV6 (1ULL << RTE_ETH_FLOW_IPV6)
-#define ETH_RSS_FRAG_IPV6 (1ULL << RTE_ETH_FLOW_FRAG_IPV6)
-#define ETH_RSS_NONFRAG_IPV6_TCP (1ULL << RTE_ETH_FLOW_NONFRAG_IPV6_TCP)
-#define ETH_RSS_NONFRAG_IPV6_UDP (1ULL << RTE_ETH_FLOW_NONFRAG_IPV6_UDP)
-#define ETH_RSS_NONFRAG_IPV6_SCTP (1ULL << RTE_ETH_FLOW_NONFRAG_IPV6_SCTP)
-#define ETH_RSS_NONFRAG_IPV6_OTHER (1ULL << RTE_ETH_FLOW_NONFRAG_IPV6_OTHER)
-#define ETH_RSS_L2_PAYLOAD (1ULL << RTE_ETH_FLOW_L2_PAYLOAD)
-#define ETH_RSS_IPV6_EX (1ULL << RTE_ETH_FLOW_IPV6_EX)
-#define ETH_RSS_IPV6_TCP_EX (1ULL << RTE_ETH_FLOW_IPV6_TCP_EX)
-#define ETH_RSS_IPV6_UDP_EX (1ULL << RTE_ETH_FLOW_IPV6_UDP_EX)
-#define ETH_RSS_PORT (1ULL << RTE_ETH_FLOW_PORT)
-#define ETH_RSS_VXLAN (1ULL << RTE_ETH_FLOW_VXLAN)
-#define ETH_RSS_GENEVE (1ULL << RTE_ETH_FLOW_GENEVE)
-#define ETH_RSS_NVGRE (1ULL << RTE_ETH_FLOW_NVGRE)
-
-#define ETH_RSS_IP ( \
- ETH_RSS_IPV4 | \
- ETH_RSS_FRAG_IPV4 | \
- ETH_RSS_NONFRAG_IPV4_OTHER | \
- ETH_RSS_IPV6 | \
- ETH_RSS_FRAG_IPV6 | \
- ETH_RSS_NONFRAG_IPV6_OTHER | \
- ETH_RSS_IPV6_EX)
-
-#define ETH_RSS_UDP ( \
- ETH_RSS_NONFRAG_IPV4_UDP | \
- ETH_RSS_NONFRAG_IPV6_UDP | \
- ETH_RSS_IPV6_UDP_EX)
-
-#define ETH_RSS_TCP ( \
- ETH_RSS_NONFRAG_IPV4_TCP | \
- ETH_RSS_NONFRAG_IPV6_TCP | \
- ETH_RSS_IPV6_TCP_EX)
-
-#define ETH_RSS_SCTP ( \
- ETH_RSS_NONFRAG_IPV4_SCTP | \
- ETH_RSS_NONFRAG_IPV6_SCTP)
-
-#define ETH_RSS_TUNNEL ( \
- ETH_RSS_VXLAN | \
- ETH_RSS_GENEVE | \
- ETH_RSS_NVGRE)
-
-/**< Mask of valid RSS hash protocols */
-#define ETH_RSS_PROTO_MASK ( \
- ETH_RSS_IPV4 | \
- ETH_RSS_FRAG_IPV4 | \
- ETH_RSS_NONFRAG_IPV4_TCP | \
- ETH_RSS_NONFRAG_IPV4_UDP | \
- ETH_RSS_NONFRAG_IPV4_SCTP | \
- ETH_RSS_NONFRAG_IPV4_OTHER | \
- ETH_RSS_IPV6 | \
- ETH_RSS_FRAG_IPV6 | \
- ETH_RSS_NONFRAG_IPV6_TCP | \
- ETH_RSS_NONFRAG_IPV6_UDP | \
- ETH_RSS_NONFRAG_IPV6_SCTP | \
- ETH_RSS_NONFRAG_IPV6_OTHER | \
- ETH_RSS_L2_PAYLOAD | \
- ETH_RSS_IPV6_EX | \
- ETH_RSS_IPV6_TCP_EX | \
- ETH_RSS_IPV6_UDP_EX | \
- ETH_RSS_PORT | \
- ETH_RSS_VXLAN | \
- ETH_RSS_GENEVE | \
- ETH_RSS_NVGRE)
-
-/*
- * Definitions used for redirection table entry size.
- * Some RSS RETA sizes may not be supported by some drivers, check the
- * documentation or the description of relevant functions for more details.
- */
-#define ETH_RSS_RETA_SIZE_64 64
-#define ETH_RSS_RETA_SIZE_128 128
-#define ETH_RSS_RETA_SIZE_256 256
-#define ETH_RSS_RETA_SIZE_512 512
-#define RTE_RETA_GROUP_SIZE 64
-
-/* Definitions used for VMDQ and DCB functionality */
-#define ETH_VMDQ_MAX_VLAN_FILTERS 64 /**< Maximum nb. of VMDQ vlan filters. */
-#define ETH_DCB_NUM_USER_PRIORITIES 8 /**< Maximum nb. of DCB priorities. */
-#define ETH_VMDQ_DCB_NUM_QUEUES 128 /**< Maximum nb. of VMDQ DCB queues. */
-#define ETH_DCB_NUM_QUEUES 128 /**< Maximum nb. of DCB queues. */
-
-/* DCB capability defines */
-#define ETH_DCB_PG_SUPPORT 0x00000001 /**< Priority Group(ETS) support. */
-#define ETH_DCB_PFC_SUPPORT 0x00000002 /**< Priority Flow Control support. */
-
-/* Definitions used for VLAN Offload functionality */
-#define ETH_VLAN_STRIP_OFFLOAD 0x0001 /**< VLAN Strip On/Off */
-#define ETH_VLAN_FILTER_OFFLOAD 0x0002 /**< VLAN Filter On/Off */
-#define ETH_VLAN_EXTEND_OFFLOAD 0x0004 /**< VLAN Extend On/Off */
-
-/* Definitions used for mask VLAN setting */
-#define ETH_VLAN_STRIP_MASK 0x0001 /**< VLAN Strip setting mask */
-#define ETH_VLAN_FILTER_MASK 0x0002 /**< VLAN Filter setting mask*/
-#define ETH_VLAN_EXTEND_MASK 0x0004 /**< VLAN Extend setting mask*/
-#define ETH_VLAN_ID_MAX 0x0FFF /**< VLAN ID is in lower 12 bits*/
-
-/* Definitions used for receive MAC address */
-#define ETH_NUM_RECEIVE_MAC_ADDR 128 /**< Maximum nb. of receive mac addr. */
-
-/* Definitions used for unicast hash */
-#define ETH_VMDQ_NUM_UC_HASH_ARRAY 128 /**< Maximum nb. of UC hash array. */
-
-/* Definitions used for VMDQ pool rx mode setting */
-#define ETH_VMDQ_ACCEPT_UNTAG 0x0001 /**< accept untagged packets. */
-#define ETH_VMDQ_ACCEPT_HASH_MC 0x0002 /**< accept packets in multicast table . */
-#define ETH_VMDQ_ACCEPT_HASH_UC 0x0004 /**< accept packets in unicast table. */
-#define ETH_VMDQ_ACCEPT_BROADCAST 0x0008 /**< accept broadcast packets. */
-#define ETH_VMDQ_ACCEPT_MULTICAST 0x0010 /**< multicast promiscuous. */
-
-/** Maximum nb. of vlan per mirror rule */
-#define ETH_MIRROR_MAX_VLANS 64
-
-#define ETH_MIRROR_VIRTUAL_POOL_UP 0x01 /**< Virtual Pool uplink Mirroring. */
-#define ETH_MIRROR_UPLINK_PORT 0x02 /**< Uplink Port Mirroring. */
-#define ETH_MIRROR_DOWNLINK_PORT 0x04 /**< Downlink Port Mirroring. */
-#define ETH_MIRROR_VLAN 0x08 /**< VLAN Mirroring. */
-#define ETH_MIRROR_VIRTUAL_POOL_DOWN 0x10 /**< Virtual Pool downlink Mirroring. */
-
-/**
- * A structure used to configure VLAN traffic mirror of an Ethernet port.
- */
-struct rte_eth_vlan_mirror {
- uint64_t vlan_mask; /**< mask for valid VLAN ID. */
- /** VLAN ID list for vlan mirroring. */
- uint16_t vlan_id[ETH_MIRROR_MAX_VLANS];
-};
-
-/**
- * A structure used to configure traffic mirror of an Ethernet port.
- */
-struct rte_eth_mirror_conf {
- uint8_t rule_type; /**< Mirroring rule type */
- uint8_t dst_pool; /**< Destination pool for this mirror rule. */
- uint64_t pool_mask; /**< Bitmap of pool for pool mirroring */
- /** VLAN ID setting for VLAN mirroring. */
- struct rte_eth_vlan_mirror vlan;
-};
-
-/**
- * A structure used to configure 64 entries of Redirection Table of the
- * Receive Side Scaling (RSS) feature of an Ethernet port. To configure
- * more than 64 entries supported by hardware, an array of this structure
- * is needed.
- */
-struct rte_eth_rss_reta_entry64 {
- uint64_t mask;
- /**< Mask bits indicate which entries need to be updated/queried. */
- uint16_t reta[RTE_RETA_GROUP_SIZE];
- /**< Group of 64 redirection table entries. */
-};
-
-/**
- * This enum indicates the possible number of traffic classes
- * in DCB configurations
- */
-enum rte_eth_nb_tcs {
- ETH_4_TCS = 4, /**< 4 TCs with DCB. */
- ETH_8_TCS = 8 /**< 8 TCs with DCB. */
-};
-
-/**
- * This enum indicates the possible number of queue pools
- * in VMDQ configurations.
- */
-enum rte_eth_nb_pools {
- ETH_8_POOLS = 8, /**< 8 VMDq pools. */
- ETH_16_POOLS = 16, /**< 16 VMDq pools. */
- ETH_32_POOLS = 32, /**< 32 VMDq pools. */
- ETH_64_POOLS = 64 /**< 64 VMDq pools. */
-};
-
-/* This structure may be extended in future. */
-struct rte_eth_dcb_rx_conf {
- enum rte_eth_nb_tcs nb_tcs; /**< Possible DCB TCs, 4 or 8 TCs */
- /** Traffic class each UP mapped to. */
- uint8_t dcb_tc[ETH_DCB_NUM_USER_PRIORITIES];
-};
-
-struct rte_eth_vmdq_dcb_tx_conf {
- enum rte_eth_nb_pools nb_queue_pools; /**< With DCB, 16 or 32 pools. */
- /** Traffic class each UP mapped to. */
- uint8_t dcb_tc[ETH_DCB_NUM_USER_PRIORITIES];
-};
-
-struct rte_eth_dcb_tx_conf {
- enum rte_eth_nb_tcs nb_tcs; /**< Possible DCB TCs, 4 or 8 TCs. */
- /** Traffic class each UP mapped to. */
- uint8_t dcb_tc[ETH_DCB_NUM_USER_PRIORITIES];
-};
-
-struct rte_eth_vmdq_tx_conf {
- enum rte_eth_nb_pools nb_queue_pools; /**< VMDq mode, 64 pools. */
-};
-
-/**
- * A structure used to configure the VMDQ+DCB feature
- * of an Ethernet port.
- *
- * Using this feature, packets are routed to a pool of queues, based
- * on the vlan id in the vlan tag, and then to a specific queue within
- * that pool, using the user priority vlan tag field.
- *
- * A default pool may be used, if desired, to route all traffic which
- * does not match the vlan filter rules.
- */
-struct rte_eth_vmdq_dcb_conf {
- enum rte_eth_nb_pools nb_queue_pools; /**< With DCB, 16 or 32 pools */
- uint8_t enable_default_pool; /**< If non-zero, use a default pool */
- uint8_t default_pool; /**< The default pool, if applicable */
- uint8_t nb_pool_maps; /**< We can have up to 64 filters/mappings */
- struct {
- uint16_t vlan_id; /**< The vlan id of the received frame */
- uint64_t pools; /**< Bitmask of pools for packet rx */
- } pool_map[ETH_VMDQ_MAX_VLAN_FILTERS]; /**< VMDq vlan pool maps. */
- uint8_t dcb_tc[ETH_DCB_NUM_USER_PRIORITIES];
- /**< Selects a queue in a pool */
-};
-
-/**
- * A structure used to configure the VMDQ feature of an Ethernet port when
- * not combined with the DCB feature.
- *
- * Using this feature, packets are routed to a pool of queues. By default,
- * the pool selection is based on the MAC address, the vlan id in the
- * vlan tag as specified in the pool_map array.
- * Passing the ETH_VMDQ_ACCEPT_UNTAG in the rx_mode field allows pool
- * selection using only the MAC address. MAC address to pool mapping is done
- * using the rte_eth_dev_mac_addr_add function, with the pool parameter
- * corresponding to the pool id.
- *
- * Queue selection within the selected pool will be done using RSS when
- * it is enabled or revert to the first queue of the pool if not.
- *
- * A default pool may be used, if desired, to route all traffic which
- * does not match the vlan filter rules or any pool MAC address.
- */
-struct rte_eth_vmdq_rx_conf {
- enum rte_eth_nb_pools nb_queue_pools; /**< VMDq only mode, 8 or 64 pools */
- uint8_t enable_default_pool; /**< If non-zero, use a default pool */
- uint8_t default_pool; /**< The default pool, if applicable */
- uint8_t enable_loop_back; /**< Enable VT loop back */
- uint8_t nb_pool_maps; /**< We can have up to 64 filters/mappings */
- uint32_t rx_mode; /**< Flags from ETH_VMDQ_ACCEPT_* */
- struct {
- uint16_t vlan_id; /**< The vlan id of the received frame */
- uint64_t pools; /**< Bitmask of pools for packet rx */
- } pool_map[ETH_VMDQ_MAX_VLAN_FILTERS]; /**< VMDq vlan pool maps. */
-};
-
-/**
- * A structure used to configure the TX features of an Ethernet port.
- */
-struct rte_eth_txmode {
- enum rte_eth_tx_mq_mode mq_mode; /**< TX multi-queues mode. */
- /**
- * Per-port Tx offloads to be set using DEV_TX_OFFLOAD_* flags.
- * Only offloads set on tx_offload_capa field on rte_eth_dev_info
- * structure are allowed to be set.
- */
- uint64_t offloads;
-
- /* For i40e specifically */
- uint16_t pvid;
- __extension__
- uint8_t hw_vlan_reject_tagged : 1,
- /**< If set, reject sending out tagged pkts */
- hw_vlan_reject_untagged : 1,
- /**< If set, reject sending out untagged pkts */
- hw_vlan_insert_pvid : 1;
- /**< If set, enable port based VLAN insertion */
-};
-
-/**
- * A structure used to configure an RX ring of an Ethernet port.
- */
-struct rte_eth_rxconf {
- struct rte_eth_thresh rx_thresh; /**< RX ring threshold registers. */
- uint16_t rx_free_thresh; /**< Drives the freeing of RX descriptors. */
- uint8_t rx_drop_en; /**< Drop packets if no descriptors are available. */
- uint8_t rx_deferred_start; /**< Do not start queue with rte_eth_dev_start(). */
- /**
- * Per-queue Rx offloads to be set using DEV_RX_OFFLOAD_* flags.
- * Only offloads set on rx_queue_offload_capa or rx_offload_capa
- * fields on rte_eth_dev_info structure are allowed to be set.
- */
- uint64_t offloads;
-};
-
-#define ETH_TXQ_FLAGS_NOMULTSEGS 0x0001 /**< nb_segs=1 for all mbufs */
-#define ETH_TXQ_FLAGS_NOREFCOUNT 0x0002 /**< refcnt can be ignored */
-#define ETH_TXQ_FLAGS_NOMULTMEMP 0x0004 /**< all bufs come from same mempool */
-#define ETH_TXQ_FLAGS_NOVLANOFFL 0x0100 /**< disable VLAN offload */
-#define ETH_TXQ_FLAGS_NOXSUMSCTP 0x0200 /**< disable SCTP checksum offload */
-#define ETH_TXQ_FLAGS_NOXSUMUDP 0x0400 /**< disable UDP checksum offload */
-#define ETH_TXQ_FLAGS_NOXSUMTCP 0x0800 /**< disable TCP checksum offload */
-#define ETH_TXQ_FLAGS_NOOFFLOADS \
- (ETH_TXQ_FLAGS_NOVLANOFFL | ETH_TXQ_FLAGS_NOXSUMSCTP | \
- ETH_TXQ_FLAGS_NOXSUMUDP | ETH_TXQ_FLAGS_NOXSUMTCP)
-#define ETH_TXQ_FLAGS_NOXSUMS \
- (ETH_TXQ_FLAGS_NOXSUMSCTP | ETH_TXQ_FLAGS_NOXSUMUDP | \
- ETH_TXQ_FLAGS_NOXSUMTCP)
-/**
- * When set the txq_flags should be ignored,
- * instead per-queue Tx offloads will be set on offloads field
- * located on rte_eth_txq_conf struct.
- * This flag is temporary till the rte_eth_txq_conf.txq_flags
- * API will be deprecated.
- */
-#define ETH_TXQ_FLAGS_IGNORE 0x8000
-
-/**
- * A structure used to configure a TX ring of an Ethernet port.
- */
-struct rte_eth_txconf {
- struct rte_eth_thresh tx_thresh; /**< TX ring threshold registers. */
- uint16_t tx_rs_thresh; /**< Drives the setting of RS bit on TXDs. */
- uint16_t tx_free_thresh; /**< Start freeing TX buffers if there are
- less free descriptors than this value. */
-
- uint32_t txq_flags; /**< Set flags for the Tx queue */
- uint8_t tx_deferred_start; /**< Do not start queue with rte_eth_dev_start(). */
- /**
- * Per-queue Tx offloads to be set using DEV_TX_OFFLOAD_* flags.
- * Only offloads set on tx_queue_offload_capa or tx_offload_capa
- * fields on rte_eth_dev_info structure are allowed to be set.
- */
- uint64_t offloads;
-};
-
-/**
- * A structure contains information about HW descriptor ring limitations.
- */
-struct rte_eth_desc_lim {
- uint16_t nb_max; /**< Max allowed number of descriptors. */
- uint16_t nb_min; /**< Min allowed number of descriptors. */
- uint16_t nb_align; /**< Number of descriptors should be aligned to. */
-
- /**
- * Max allowed number of segments per whole packet.
- *
- * - For TSO packet this is the total number of data descriptors allowed
- * by device.
- *
- * @see nb_mtu_seg_max
- */
- uint16_t nb_seg_max;
-
- /**
- * Max number of segments per one MTU.
- *
- * - For non-TSO packet, this is the maximum allowed number of segments
- * in a single transmit packet.
- *
- * - For TSO packet each segment within the TSO may span up to this
- * value.
- *
- * @see nb_seg_max
- */
- uint16_t nb_mtu_seg_max;
-};
-
-/**
- * This enum indicates the flow control mode
- */
-enum rte_eth_fc_mode {
- RTE_FC_NONE = 0, /**< Disable flow control. */
- RTE_FC_RX_PAUSE, /**< RX pause frame, enable flowctrl on TX side. */
- RTE_FC_TX_PAUSE, /**< TX pause frame, enable flowctrl on RX side. */
- RTE_FC_FULL /**< Enable flow control on both side. */
-};
-
-/**
- * A structure used to configure Ethernet flow control parameter.
- * These parameters will be configured into the register of the NIC.
- * Please refer to the corresponding data sheet for proper value.
- */
-struct rte_eth_fc_conf {
- uint32_t high_water; /**< High threshold value to trigger XOFF */
- uint32_t low_water; /**< Low threshold value to trigger XON */
- uint16_t pause_time; /**< Pause quota in the Pause frame */
- uint16_t send_xon; /**< Is XON frame need be sent */
- enum rte_eth_fc_mode mode; /**< Link flow control mode */
- uint8_t mac_ctrl_frame_fwd; /**< Forward MAC control frames */
- uint8_t autoneg; /**< Use Pause autoneg */
-};
-
-/**
- * A structure used to configure Ethernet priority flow control parameter.
- * These parameters will be configured into the register of the NIC.
- * Please refer to the corresponding data sheet for proper value.
- */
-struct rte_eth_pfc_conf {
- struct rte_eth_fc_conf fc; /**< General flow control parameter. */
- uint8_t priority; /**< VLAN User Priority. */
-};
-
-/**
- * Memory space that can be configured to store Flow Director filters
- * in the board memory.
- */
-enum rte_fdir_pballoc_type {
- RTE_FDIR_PBALLOC_64K = 0, /**< 64k. */
- RTE_FDIR_PBALLOC_128K, /**< 128k. */
- RTE_FDIR_PBALLOC_256K, /**< 256k. */
-};
-
-/**
- * Select report mode of FDIR hash information in RX descriptors.
- */
-enum rte_fdir_status_mode {
- RTE_FDIR_NO_REPORT_STATUS = 0, /**< Never report FDIR hash. */
- RTE_FDIR_REPORT_STATUS, /**< Only report FDIR hash for matching pkts. */
- RTE_FDIR_REPORT_STATUS_ALWAYS, /**< Always report FDIR hash. */
-};
-
-/**
- * A structure used to configure the Flow Director (FDIR) feature
- * of an Ethernet port.
- *
- * If mode is RTE_FDIR_DISABLE, the pballoc value is ignored.
- */
-struct rte_fdir_conf {
- enum rte_fdir_mode mode; /**< Flow Director mode. */
- enum rte_fdir_pballoc_type pballoc; /**< Space for FDIR filters. */
- enum rte_fdir_status_mode status; /**< How to report FDIR hash. */
- /** RX queue of packets matching a "drop" filter in perfect mode. */
- uint8_t drop_queue;
- struct rte_eth_fdir_masks mask;
- struct rte_eth_fdir_flex_conf flex_conf;
- /**< Flex payload configuration. */
-};
-
-/**
- * UDP tunneling configuration.
- * Used to config the UDP port for a type of tunnel.
- * NICs need the UDP port to identify the tunnel type.
- * Normally a type of tunnel has a default UDP port, this structure can be used
- * in case if the users want to change or support more UDP port.
- */
-struct rte_eth_udp_tunnel {
- uint16_t udp_port; /**< UDP port used for the tunnel. */
- uint8_t prot_type; /**< Tunnel type. Defined in rte_eth_tunnel_type. */
-};
-
-/**
- * A structure used to enable/disable specific device interrupts.
- */
-struct rte_intr_conf {
- /** enable/disable lsc interrupt. 0 (default) - disable, 1 enable */
- uint32_t lsc:1;
- /** enable/disable rxq interrupt. 0 (default) - disable, 1 enable */
- uint32_t rxq:1;
- /** enable/disable rmv interrupt. 0 (default) - disable, 1 enable */
- uint32_t rmv:1;
-};
-
-/**
- * A structure used to configure an Ethernet port.
- * Depending upon the RX multi-queue mode, extra advanced
- * configuration settings may be needed.
- */
-struct rte_eth_conf {
- uint32_t link_speeds; /**< bitmap of ETH_LINK_SPEED_XXX of speeds to be
- used. ETH_LINK_SPEED_FIXED disables link
- autonegotiation, and a unique speed shall be
- set. Otherwise, the bitmap defines the set of
- speeds to be advertised. If the special value
- ETH_LINK_SPEED_AUTONEG (0) is used, all speeds
- supported are advertised. */
- struct rte_eth_rxmode rxmode; /**< Port RX configuration. */
- struct rte_eth_txmode txmode; /**< Port TX configuration. */
- uint32_t lpbk_mode; /**< Loopback operation mode. By default the value
- is 0, meaning the loopback mode is disabled.
- Read the datasheet of given ethernet controller
- for details. The possible values of this field
- are defined in implementation of each driver. */
- struct {
- struct rte_eth_rss_conf rss_conf; /**< Port RSS configuration */
- struct rte_eth_vmdq_dcb_conf vmdq_dcb_conf;
- /**< Port vmdq+dcb configuration. */
- struct rte_eth_dcb_rx_conf dcb_rx_conf;
- /**< Port dcb RX configuration. */
- struct rte_eth_vmdq_rx_conf vmdq_rx_conf;
- /**< Port vmdq RX configuration. */
- } rx_adv_conf; /**< Port RX filtering configuration. */
- union {
- struct rte_eth_vmdq_dcb_tx_conf vmdq_dcb_tx_conf;
- /**< Port vmdq+dcb TX configuration. */
- struct rte_eth_dcb_tx_conf dcb_tx_conf;
- /**< Port dcb TX configuration. */
- struct rte_eth_vmdq_tx_conf vmdq_tx_conf;
- /**< Port vmdq TX configuration. */
- } tx_adv_conf; /**< Port TX DCB configuration (union). */
- /** Currently,Priority Flow Control(PFC) are supported,if DCB with PFC
- is needed,and the variable must be set ETH_DCB_PFC_SUPPORT. */
- uint32_t dcb_capability_en;
- struct rte_fdir_conf fdir_conf; /**< FDIR configuration. */
- struct rte_intr_conf intr_conf; /**< Interrupt mode configuration. */
-};
-
-/**
- * A structure used to retrieve the contextual information of
- * an Ethernet device, such as the controlling driver of the device,
- * its PCI context, etc...
- */
-
-/**
- * RX offload capabilities of a device.
- */
-#define DEV_RX_OFFLOAD_VLAN_STRIP 0x00000001
-#define DEV_RX_OFFLOAD_IPV4_CKSUM 0x00000002
-#define DEV_RX_OFFLOAD_UDP_CKSUM 0x00000004
-#define DEV_RX_OFFLOAD_TCP_CKSUM 0x00000008
-#define DEV_RX_OFFLOAD_TCP_LRO 0x00000010
-#define DEV_RX_OFFLOAD_QINQ_STRIP 0x00000020
-#define DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM 0x00000040
-#define DEV_RX_OFFLOAD_MACSEC_STRIP 0x00000080
-#define DEV_RX_OFFLOAD_HEADER_SPLIT 0x00000100
-#define DEV_RX_OFFLOAD_VLAN_FILTER 0x00000200
-#define DEV_RX_OFFLOAD_VLAN_EXTEND 0x00000400
-#define DEV_RX_OFFLOAD_JUMBO_FRAME 0x00000800
-#define DEV_RX_OFFLOAD_CRC_STRIP 0x00001000
-#define DEV_RX_OFFLOAD_SCATTER 0x00002000
-#define DEV_RX_OFFLOAD_TIMESTAMP 0x00004000
-#define DEV_RX_OFFLOAD_SECURITY 0x00008000
-#define DEV_RX_OFFLOAD_CHECKSUM (DEV_RX_OFFLOAD_IPV4_CKSUM | \
- DEV_RX_OFFLOAD_UDP_CKSUM | \
- DEV_RX_OFFLOAD_TCP_CKSUM)
-#define DEV_RX_OFFLOAD_VLAN (DEV_RX_OFFLOAD_VLAN_STRIP | \
- DEV_RX_OFFLOAD_VLAN_FILTER | \
- DEV_RX_OFFLOAD_VLAN_EXTEND)
-
-/*
- * If new Rx offload capabilities are defined, they also must be
- * mentioned in rte_rx_offload_names in rte_ethdev.c file.
- */
-
-/**
- * TX offload capabilities of a device.
- */
-#define DEV_TX_OFFLOAD_VLAN_INSERT 0x00000001
-#define DEV_TX_OFFLOAD_IPV4_CKSUM 0x00000002
-#define DEV_TX_OFFLOAD_UDP_CKSUM 0x00000004
-#define DEV_TX_OFFLOAD_TCP_CKSUM 0x00000008
-#define DEV_TX_OFFLOAD_SCTP_CKSUM 0x00000010
-#define DEV_TX_OFFLOAD_TCP_TSO 0x00000020
-#define DEV_TX_OFFLOAD_UDP_TSO 0x00000040
-#define DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM 0x00000080 /**< Used for tunneling packet. */
-#define DEV_TX_OFFLOAD_QINQ_INSERT 0x00000100
-#define DEV_TX_OFFLOAD_VXLAN_TNL_TSO 0x00000200 /**< Used for tunneling packet. */
-#define DEV_TX_OFFLOAD_GRE_TNL_TSO 0x00000400 /**< Used for tunneling packet. */
-#define DEV_TX_OFFLOAD_IPIP_TNL_TSO 0x00000800 /**< Used for tunneling packet. */
-#define DEV_TX_OFFLOAD_GENEVE_TNL_TSO 0x00001000 /**< Used for tunneling packet. */
-#define DEV_TX_OFFLOAD_MACSEC_INSERT 0x00002000
-#define DEV_TX_OFFLOAD_MT_LOCKFREE 0x00004000
-/**< Multiple threads can invoke rte_eth_tx_burst() concurrently on the same
- * tx queue without SW lock.
- */
-#define DEV_TX_OFFLOAD_MULTI_SEGS 0x00008000
-/**< Device supports multi segment send. */
-#define DEV_TX_OFFLOAD_MBUF_FAST_FREE 0x00010000
-/**< Device supports optimization for fast release of mbufs.
- * When set application must guarantee that per-queue all mbufs comes from
- * the same mempool and has refcnt = 1.
- */
-#define DEV_TX_OFFLOAD_SECURITY 0x00020000
-
-/*
- * If new Tx offload capabilities are defined, they also must be
- * mentioned in rte_tx_offload_names in rte_ethdev.c file.
- */
-
-struct rte_pci_device;
-
-/**
- * Ethernet device information
- */
-struct rte_eth_dev_info {
- struct rte_pci_device *pci_dev; /**< Device PCI information. */
- const char *driver_name; /**< Device Driver name. */
- unsigned int if_index; /**< Index to bound host interface, or 0 if none.
- Use if_indextoname() to translate into an interface name. */
- uint32_t min_rx_bufsize; /**< Minimum size of RX buffer. */
- uint32_t max_rx_pktlen; /**< Maximum configurable length of RX pkt. */
- uint16_t max_rx_queues; /**< Maximum number of RX queues. */
- uint16_t max_tx_queues; /**< Maximum number of TX queues. */
- uint32_t max_mac_addrs; /**< Maximum number of MAC addresses. */
- uint32_t max_hash_mac_addrs;
- /** Maximum number of hash MAC addresses for MTA and UTA. */
- uint16_t max_vfs; /**< Maximum number of VFs. */
- uint16_t max_vmdq_pools; /**< Maximum number of VMDq pools. */
- uint64_t rx_offload_capa;
- /**< Device per port RX offload capabilities. */
- uint64_t tx_offload_capa;
- /**< Device per port TX offload capabilities. */
- uint64_t rx_queue_offload_capa;
- /**< Device per queue RX offload capabilities. */
- uint64_t tx_queue_offload_capa;
- /**< Device per queue TX offload capabilities. */
- uint16_t reta_size;
- /**< Device redirection table size, the total number of entries. */
- uint8_t hash_key_size; /**< Hash key size in bytes */
- /** Bit mask of RSS offloads, the bit offset also means flow type */
- uint64_t flow_type_rss_offloads;
- struct rte_eth_rxconf default_rxconf; /**< Default RX configuration */
- struct rte_eth_txconf default_txconf; /**< Default TX configuration */
- uint16_t vmdq_queue_base; /**< First queue ID for VMDQ pools. */
- uint16_t vmdq_queue_num; /**< Queue number for VMDQ pools. */
- uint16_t vmdq_pool_base; /**< First ID of VMDQ pools. */
- struct rte_eth_desc_lim rx_desc_lim; /**< RX descriptors limits */
- struct rte_eth_desc_lim tx_desc_lim; /**< TX descriptors limits */
- uint32_t speed_capa; /**< Supported speeds bitmap (ETH_LINK_SPEED_). */
- /** Configured number of rx/tx queues */
- uint16_t nb_rx_queues; /**< Number of RX queues. */
- uint16_t nb_tx_queues; /**< Number of TX queues. */
-};
-
-/**
- * Ethernet device RX queue information structure.
- * Used to retieve information about configured queue.
- */
-struct rte_eth_rxq_info {
- struct rte_mempool *mp; /**< mempool used by that queue. */
- struct rte_eth_rxconf conf; /**< queue config parameters. */
- uint8_t scattered_rx; /**< scattered packets RX supported. */
- uint16_t nb_desc; /**< configured number of RXDs. */
-} __rte_cache_min_aligned;
-
-/**
- * Ethernet device TX queue information structure.
- * Used to retrieve information about configured queue.
- */
-struct rte_eth_txq_info {
- struct rte_eth_txconf conf; /**< queue config parameters. */
- uint16_t nb_desc; /**< configured number of TXDs. */
-} __rte_cache_min_aligned;
-
-/** Maximum name length for extended statistics counters */
-#define RTE_ETH_XSTATS_NAME_SIZE 64
-
-/**
- * An Ethernet device extended statistic structure
- *
- * This structure is used by rte_eth_xstats_get() to provide
- * statistics that are not provided in the generic *rte_eth_stats*
- * structure.
- * It maps a name id, corresponding to an index in the array returned
- * by rte_eth_xstats_get_names(), to a statistic value.
- */
-struct rte_eth_xstat {
- uint64_t id; /**< The index in xstats name array. */
- uint64_t value; /**< The statistic counter value. */
-};
-
-/**
- * A name element for extended statistics.
- *
- * An array of this structure is returned by rte_eth_xstats_get_names().
- * It lists the names of extended statistics for a PMD. The *rte_eth_xstat*
- * structure references these names by their array index.
- */
-struct rte_eth_xstat_name {
- char name[RTE_ETH_XSTATS_NAME_SIZE]; /**< The statistic name. */
-};
-
-#define ETH_DCB_NUM_TCS 8
-#define ETH_MAX_VMDQ_POOL 64
-
-/**
- * A structure used to get the information of queue and
- * TC mapping on both TX and RX paths.
- */
-struct rte_eth_dcb_tc_queue_mapping {
- /** rx queues assigned to tc per Pool */
- struct {
- uint8_t base;
- uint8_t nb_queue;
- } tc_rxq[ETH_MAX_VMDQ_POOL][ETH_DCB_NUM_TCS];
- /** rx queues assigned to tc per Pool */
- struct {
- uint8_t base;
- uint8_t nb_queue;
- } tc_txq[ETH_MAX_VMDQ_POOL][ETH_DCB_NUM_TCS];
-};
-
-/**
- * A structure used to get the information of DCB.
- * It includes TC UP mapping and queue TC mapping.
- */
-struct rte_eth_dcb_info {
- uint8_t nb_tcs; /**< number of TCs */
- uint8_t prio_tc[ETH_DCB_NUM_USER_PRIORITIES]; /**< Priority to tc */
- uint8_t tc_bws[ETH_DCB_NUM_TCS]; /**< TX BW percentage for each TC */
- /** rx queues assigned to tc */
- struct rte_eth_dcb_tc_queue_mapping tc_queue;
-};
-
-/**
- * RX/TX queue states
- */
-#define RTE_ETH_QUEUE_STATE_STOPPED 0
-#define RTE_ETH_QUEUE_STATE_STARTED 1
-
-struct rte_eth_dev;
-
-#define RTE_ETH_ALL RTE_MAX_ETHPORTS
-
-/* Macros to check for valid port */
-#define RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, retval) do { \
- if (!rte_eth_dev_is_valid_port(port_id)) { \
- RTE_PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id); \
- return retval; \
- } \
-} while (0)
-
-#define RTE_ETH_VALID_PORTID_OR_RET(port_id) do { \
- if (!rte_eth_dev_is_valid_port(port_id)) { \
- RTE_PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id); \
- return; \
- } \
-} while (0)
-
-/**
- * l2 tunnel configuration.
- */
-
-/**< l2 tunnel enable mask */
-#define ETH_L2_TUNNEL_ENABLE_MASK 0x00000001
-/**< l2 tunnel insertion mask */
-#define ETH_L2_TUNNEL_INSERTION_MASK 0x00000002
-/**< l2 tunnel stripping mask */
-#define ETH_L2_TUNNEL_STRIPPING_MASK 0x00000004
-/**< l2 tunnel forwarding mask */
-#define ETH_L2_TUNNEL_FORWARDING_MASK 0x00000008
-
-/**
- * Function type used for RX packet processing packet callbacks.
- *
- * The callback function is called on RX with a burst of packets that have
- * been received on the given port and queue.
- *
- * @param port_id
- * The Ethernet port on which RX is being performed.
- * @param queue
- * The queue on the Ethernet port which is being used to receive the packets.
- * @param pkts
- * The burst of packets that have just been received.
- * @param nb_pkts
- * The number of packets in the burst pointed to by "pkts".
- * @param max_pkts
- * The max number of packets that can be stored in the "pkts" array.
- * @param user_param
- * The arbitrary user parameter passed in by the application when the callback
- * was originally configured.
- * @return
- * The number of packets returned to the user.
- */
-typedef uint16_t (*rte_rx_callback_fn)(uint16_t port_id, uint16_t queue,
- struct rte_mbuf *pkts[], uint16_t nb_pkts, uint16_t max_pkts,
- void *user_param);
-
-/**
- * Function type used for TX packet processing packet callbacks.
- *
- * The callback function is called on TX with a burst of packets immediately
- * before the packets are put onto the hardware queue for transmission.
- *
- * @param port_id
- * The Ethernet port on which TX is being performed.
- * @param queue
- * The queue on the Ethernet port which is being used to transmit the packets.
- * @param pkts
- * The burst of packets that are about to be transmitted.
- * @param nb_pkts
- * The number of packets in the burst pointed to by "pkts".
- * @param user_param
- * The arbitrary user parameter passed in by the application when the callback
- * was originally configured.
- * @return
- * The number of packets to be written to the NIC.
- */
-typedef uint16_t (*rte_tx_callback_fn)(uint16_t port_id, uint16_t queue,
- struct rte_mbuf *pkts[], uint16_t nb_pkts, void *user_param);
-
-/**
- * A set of values to describe the possible states of an eth device.
- */
-enum rte_eth_dev_state {
- RTE_ETH_DEV_UNUSED = 0,
- RTE_ETH_DEV_ATTACHED,
- RTE_ETH_DEV_DEFERRED,
- RTE_ETH_DEV_REMOVED,
-};
-
-struct rte_eth_dev_sriov {
- uint8_t active; /**< SRIOV is active with 16, 32 or 64 pools */
- uint8_t nb_q_per_pool; /**< rx queue number per pool */
- uint16_t def_vmdq_idx; /**< Default pool num used for PF */
- uint16_t def_pool_q_idx; /**< Default pool queue start reg index */
-};
-#define RTE_ETH_DEV_SRIOV(dev) ((dev)->data->sriov)
-
-#define RTE_ETH_NAME_MAX_LEN RTE_DEV_NAME_MAX_LEN
-
-#define RTE_ETH_DEV_NO_OWNER 0
-
-#define RTE_ETH_MAX_OWNER_NAME_LEN 64
-
-struct rte_eth_dev_owner {
- uint64_t id; /**< The owner unique identifier. */
- char name[RTE_ETH_MAX_OWNER_NAME_LEN]; /**< The owner name. */
-};
-
-/** Device supports link state interrupt */
-#define RTE_ETH_DEV_INTR_LSC 0x0002
-/** Device is a bonded slave */
-#define RTE_ETH_DEV_BONDED_SLAVE 0x0004
-/** Device supports device removal interrupt */
-#define RTE_ETH_DEV_INTR_RMV 0x0008
-
-/**
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice.
- *
- * Iterates over valid ethdev ports owned by a specific owner.
- *
- * @param port_id
- * The id of the next possible valid owned port.
- * @param owner_id
- * The owner identifier.
- * RTE_ETH_DEV_NO_OWNER means iterate over all valid ownerless ports.
- * @return
- * Next valid port id owned by owner_id, RTE_MAX_ETHPORTS if there is none.
- */
-uint64_t __rte_experimental rte_eth_find_next_owned_by(uint16_t port_id,
- const uint64_t owner_id);
-
-/**
- * Macro to iterate over all enabled ethdev ports owned by a specific owner.
- */
-#define RTE_ETH_FOREACH_DEV_OWNED_BY(p, o) \
- for (p = rte_eth_find_next_owned_by(0, o); \
- (unsigned int)p < (unsigned int)RTE_MAX_ETHPORTS; \
- p = rte_eth_find_next_owned_by(p + 1, o))
-
-/**
- * Iterates over valid ethdev ports.
- *
- * @param port_id
- * The id of the next possible valid port.
- * @return
- * Next valid port id, RTE_MAX_ETHPORTS if there is none.
- */
-uint16_t rte_eth_find_next(uint16_t port_id);
-
-/**
- * Macro to iterate over all enabled and ownerless ethdev ports.
- */
-#define RTE_ETH_FOREACH_DEV(p) \
- RTE_ETH_FOREACH_DEV_OWNED_BY(p, RTE_ETH_DEV_NO_OWNER)
-
-
-/**
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice.
- *
- * Get a new unique owner identifier.
- * An owner identifier is used to owns Ethernet devices by only one DPDK entity
- * to avoid multiple management of device by different entities.
- *
- * @param owner_id
- * Owner identifier pointer.
- * @return
- * Negative errno value on error, 0 on success.
- */
-int __rte_experimental rte_eth_dev_owner_new(uint64_t *owner_id);
-
-/**
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice.
- *
- * Set an Ethernet device owner.
- *
- * @param port_id
- * The identifier of the port to own.
- * @param owner
- * The owner pointer.
- * @return
- * Negative errno value on error, 0 on success.
- */
-int __rte_experimental rte_eth_dev_owner_set(const uint16_t port_id,
- const struct rte_eth_dev_owner *owner);
-
-/**
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice.
- *
- * Unset Ethernet device owner to make the device ownerless.
- *
- * @param port_id
- * The identifier of port to make ownerless.
- * @param owner_id
- * The owner identifier.
- * @return
- * 0 on success, negative errno value on error.
- */
-int __rte_experimental rte_eth_dev_owner_unset(const uint16_t port_id,
- const uint64_t owner_id);
-
-/**
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice.
- *
- * Remove owner from all Ethernet devices owned by a specific owner.
- *
- * @param owner_id
- * The owner identifier.
- */
-void __rte_experimental rte_eth_dev_owner_delete(const uint64_t owner_id);
-
-/**
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice.
- *
- * Get the owner of an Ethernet device.
- *
- * @param port_id
- * The port identifier.
- * @param owner
- * The owner structure pointer to fill.
- * @return
- * 0 on success, negative errno value on error..
- */
-int __rte_experimental rte_eth_dev_owner_get(const uint16_t port_id,
- struct rte_eth_dev_owner *owner);
-
-/**
- * Get the total number of Ethernet devices that have been successfully
- * initialized by the matching Ethernet driver during the PCI probing phase
- * and that are available for applications to use. These devices must be
- * accessed by using the ``RTE_ETH_FOREACH_DEV()`` macro to deal with
- * non-contiguous ranges of devices.
- * These non-contiguous ranges can be created by calls to hotplug functions or
- * by some PMDs.
- *
- * @return
- * - The total number of usable Ethernet devices.
- */
-uint16_t rte_eth_dev_count(void);
-
-/**
- * Attach a new Ethernet device specified by arguments.
- *
- * @param devargs
- * A pointer to a strings array describing the new device
- * to be attached. The strings should be a pci address like
- * '0000:01:00.0' or virtual device name like 'net_pcap0'.
- * @param port_id
- * A pointer to a port identifier actually attached.
- * @return
- * 0 on success and port_id is filled, negative on error
- */
-int rte_eth_dev_attach(const char *devargs, uint16_t *port_id);
-
-/**
- * Detach a Ethernet device specified by port identifier.
- * This function must be called when the device is in the
- * closed state.
- *
- * @param port_id
- * The port identifier of the device to detach.
- * @param devname
- * A pointer to a buffer that will be filled with the device name.
- * This buffer must be at least RTE_DEV_NAME_MAX_LEN long.
- * @return
- * 0 on success and devname is filled, negative on error
- */
-int rte_eth_dev_detach(uint16_t port_id, char *devname);
-
-/**
- * Convert a numerical speed in Mbps to a bitmap flag that can be used in
- * the bitmap link_speeds of the struct rte_eth_conf
- *
- * @param speed
- * Numerical speed value in Mbps
- * @param duplex
- * ETH_LINK_[HALF/FULL]_DUPLEX (only for 10/100M speeds)
- * @return
- * 0 if the speed cannot be mapped
- */
-uint32_t rte_eth_speed_bitflag(uint32_t speed, int duplex);
-
-/**
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice
- *
- * Get DEV_RX_OFFLOAD_* flag name.
- *
- * @param offload
- * Offload flag.
- * @return
- * Offload name or 'UNKNOWN' if the flag cannot be recognised.
- */
-const char * __rte_experimental rte_eth_dev_rx_offload_name(uint64_t offload);
-
-/**
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice
- *
- * Get DEV_TX_OFFLOAD_* flag name.
- *
- * @param offload
- * Offload flag.
- * @return
- * Offload name or 'UNKNOWN' if the flag cannot be recognised.
- */
-const char * __rte_experimental rte_eth_dev_tx_offload_name(uint64_t offload);
-
-/**
- * Configure an Ethernet device.
- * This function must be invoked first before any other function in the
- * Ethernet API. This function can also be re-invoked when a device is in the
- * stopped state.
- *
- * @param port_id
- * The port identifier of the Ethernet device to configure.
- * @param nb_rx_queue
- * The number of receive queues to set up for the Ethernet device.
- * @param nb_tx_queue
- * The number of transmit queues to set up for the Ethernet device.
- * @param eth_conf
- * The pointer to the configuration data to be used for the Ethernet device.
- * The *rte_eth_conf* structure includes:
- * - the hardware offload features to activate, with dedicated fields for
- * each statically configurable offload hardware feature provided by
- * Ethernet devices, such as IP checksum or VLAN tag stripping for
- * example.
- * The Rx offload bitfield API is obsolete and will be deprecated.
- * Applications should set the ignore_bitfield_offloads bit on *rxmode*
- * structure and use offloads field to set per-port offloads instead.
- * - the Receive Side Scaling (RSS) configuration when using multiple RX
- * queues per port.
- *
- * Embedding all configuration information in a single data structure
- * is the more flexible method that allows the addition of new features
- * without changing the syntax of the API.
- * @return
- * - 0: Success, device configured.
- * - <0: Error code returned by the driver configuration function.
- */
-int rte_eth_dev_configure(uint16_t port_id, uint16_t nb_rx_queue,
- uint16_t nb_tx_queue, const struct rte_eth_conf *eth_conf);
-
-/**
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice.
- *
- * Check if an Ethernet device was physically removed.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @return
- * 1 when the Ethernet device is removed, otherwise 0.
- */
-int __rte_experimental
-rte_eth_dev_is_removed(uint16_t port_id);
-
-/**
- * Allocate and set up a receive queue for an Ethernet device.
- *
- * The function allocates a contiguous block of memory for *nb_rx_desc*
- * receive descriptors from a memory zone associated with *socket_id*
- * and initializes each receive descriptor with a network buffer allocated
- * from the memory pool *mb_pool*.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param rx_queue_id
- * The index of the receive queue to set up.
- * The value must be in the range [0, nb_rx_queue - 1] previously supplied
- * to rte_eth_dev_configure().
- * @param nb_rx_desc
- * The number of receive descriptors to allocate for the receive ring.
- * @param socket_id
- * The *socket_id* argument is the socket identifier in case of NUMA.
- * The value can be *SOCKET_ID_ANY* if there is no NUMA constraint for
- * the DMA memory allocated for the receive descriptors of the ring.
- * @param rx_conf
- * The pointer to the configuration data to be used for the receive queue.
- * NULL value is allowed, in which case default RX configuration
- * will be used.
- * The *rx_conf* structure contains an *rx_thresh* structure with the values
- * of the Prefetch, Host, and Write-Back threshold registers of the receive
- * ring.
- * In addition it contains the hardware offloads features to activate using
- * the DEV_RX_OFFLOAD_* flags.
- * @param mb_pool
- * The pointer to the memory pool from which to allocate *rte_mbuf* network
- * memory buffers to populate each descriptor of the receive ring.
- * @return
- * - 0: Success, receive queue correctly set up.
- * - -EIO: if device is removed.
- * - -EINVAL: The size of network buffers which can be allocated from the
- * memory pool does not fit the various buffer sizes allowed by the
- * device controller.
- * - -ENOMEM: Unable to allocate the receive ring descriptors or to
- * allocate network memory buffers from the memory pool when
- * initializing receive descriptors.
- */
-int rte_eth_rx_queue_setup(uint16_t port_id, uint16_t rx_queue_id,
- uint16_t nb_rx_desc, unsigned int socket_id,
- const struct rte_eth_rxconf *rx_conf,
- struct rte_mempool *mb_pool);
-
-/**
- * Allocate and set up a transmit queue for an Ethernet device.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param tx_queue_id
- * The index of the transmit queue to set up.
- * The value must be in the range [0, nb_tx_queue - 1] previously supplied
- * to rte_eth_dev_configure().
- * @param nb_tx_desc
- * The number of transmit descriptors to allocate for the transmit ring.
- * @param socket_id
- * The *socket_id* argument is the socket identifier in case of NUMA.
- * Its value can be *SOCKET_ID_ANY* if there is no NUMA constraint for
- * the DMA memory allocated for the transmit descriptors of the ring.
- * @param tx_conf
- * The pointer to the configuration data to be used for the transmit queue.
- * NULL value is allowed, in which case default TX configuration
- * will be used.
- * The *tx_conf* structure contains the following data:
- * - The *tx_thresh* structure with the values of the Prefetch, Host, and
- * Write-Back threshold registers of the transmit ring.
- * When setting Write-Back threshold to the value greater then zero,
- * *tx_rs_thresh* value should be explicitly set to one.
- * - The *tx_free_thresh* value indicates the [minimum] number of network
- * buffers that must be pending in the transmit ring to trigger their
- * [implicit] freeing by the driver transmit function.
- * - The *tx_rs_thresh* value indicates the [minimum] number of transmit
- * descriptors that must be pending in the transmit ring before setting the
- * RS bit on a descriptor by the driver transmit function.
- * The *tx_rs_thresh* value should be less or equal then
- * *tx_free_thresh* value, and both of them should be less then
- * *nb_tx_desc* - 3.
- * - The *txq_flags* member contains flags to pass to the TX queue setup
- * function to configure the behavior of the TX queue. This should be set
- * to 0 if no special configuration is required.
- * This API is obsolete and will be deprecated. Applications
- * should set it to ETH_TXQ_FLAGS_IGNORE and use
- * the offloads field below.
- * - The *offloads* member contains Tx offloads to be enabled.
- * Offloads which are not set cannot be used on the datapath.
- *
- * Note that setting *tx_free_thresh* or *tx_rs_thresh* value to 0 forces
- * the transmit function to use default values.
- * @return
- * - 0: Success, the transmit queue is correctly set up.
- * - -ENOMEM: Unable to allocate the transmit ring descriptors.
- */
-int rte_eth_tx_queue_setup(uint16_t port_id, uint16_t tx_queue_id,
- uint16_t nb_tx_desc, unsigned int socket_id,
- const struct rte_eth_txconf *tx_conf);
-
-/**
- * Return the NUMA socket to which an Ethernet device is connected
- *
- * @param port_id
- * The port identifier of the Ethernet device
- * @return
- * The NUMA socket id to which the Ethernet device is connected or
- * a default of zero if the socket could not be determined.
- * -1 is returned is the port_id value is out of range.
- */
-int rte_eth_dev_socket_id(uint16_t port_id);
-
-/**
- * Check if port_id of device is attached
- *
- * @param port_id
- * The port identifier of the Ethernet device
- * @return
- * - 0 if port is out of range or not attached
- * - 1 if device is attached
- */
-int rte_eth_dev_is_valid_port(uint16_t port_id);
-
-/**
- * Start specified RX queue of a port. It is used when rx_deferred_start
- * flag of the specified queue is true.
- *
- * @param port_id
- * The port identifier of the Ethernet device
- * @param rx_queue_id
- * The index of the rx queue to update the ring.
- * The value must be in the range [0, nb_rx_queue - 1] previously supplied
- * to rte_eth_dev_configure().
- * @return
- * - 0: Success, the receive queue is started.
- * - -EINVAL: The port_id or the queue_id out of range.
- * - -EIO: if device is removed.
- * - -ENOTSUP: The function not supported in PMD driver.
- */
-int rte_eth_dev_rx_queue_start(uint16_t port_id, uint16_t rx_queue_id);
-
-/**
- * Stop specified RX queue of a port
- *
- * @param port_id
- * The port identifier of the Ethernet device
- * @param rx_queue_id
- * The index of the rx queue to update the ring.
- * The value must be in the range [0, nb_rx_queue - 1] previously supplied
- * to rte_eth_dev_configure().
- * @return
- * - 0: Success, the receive queue is stopped.
- * - -EINVAL: The port_id or the queue_id out of range.
- * - -EIO: if device is removed.
- * - -ENOTSUP: The function not supported in PMD driver.
- */
-int rte_eth_dev_rx_queue_stop(uint16_t port_id, uint16_t rx_queue_id);
-
-/**
- * Start TX for specified queue of a port. It is used when tx_deferred_start
- * flag of the specified queue is true.
- *
- * @param port_id
- * The port identifier of the Ethernet device
- * @param tx_queue_id
- * The index of the tx queue to update the ring.
- * The value must be in the range [0, nb_tx_queue - 1] previously supplied
- * to rte_eth_dev_configure().
- * @return
- * - 0: Success, the transmit queue is started.
- * - -EINVAL: The port_id or the queue_id out of range.
- * - -EIO: if device is removed.
- * - -ENOTSUP: The function not supported in PMD driver.
- */
-int rte_eth_dev_tx_queue_start(uint16_t port_id, uint16_t tx_queue_id);
-
-/**
- * Stop specified TX queue of a port
- *
- * @param port_id
- * The port identifier of the Ethernet device
- * @param tx_queue_id
- * The index of the tx queue to update the ring.
- * The value must be in the range [0, nb_tx_queue - 1] previously supplied
- * to rte_eth_dev_configure().
- * @return
- * - 0: Success, the transmit queue is stopped.
- * - -EINVAL: The port_id or the queue_id out of range.
- * - -EIO: if device is removed.
- * - -ENOTSUP: The function not supported in PMD driver.
- */
-int rte_eth_dev_tx_queue_stop(uint16_t port_id, uint16_t tx_queue_id);
-
-/**
- * Start an Ethernet device.
- *
- * The device start step is the last one and consists of setting the configured
- * offload features and in starting the transmit and the receive units of the
- * device.
- * On success, all basic functions exported by the Ethernet API (link status,
- * receive/transmit, and so on) can be invoked.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @return
- * - 0: Success, Ethernet device started.
- * - <0: Error code of the driver device start function.
- */
-int rte_eth_dev_start(uint16_t port_id);
-
-/**
- * Stop an Ethernet device. The device can be restarted with a call to
- * rte_eth_dev_start()
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- */
-void rte_eth_dev_stop(uint16_t port_id);
-
-/**
- * Link up an Ethernet device.
- *
- * Set device link up will re-enable the device rx/tx
- * functionality after it is previously set device linked down.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @return
- * - 0: Success, Ethernet device linked up.
- * - <0: Error code of the driver device link up function.
- */
-int rte_eth_dev_set_link_up(uint16_t port_id);
-
-/**
- * Link down an Ethernet device.
- * The device rx/tx functionality will be disabled if success,
- * and it can be re-enabled with a call to
- * rte_eth_dev_set_link_up()
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- */
-int rte_eth_dev_set_link_down(uint16_t port_id);
-
-/**
- * Close a stopped Ethernet device. The device cannot be restarted!
- * The function frees all resources except for needed by the
- * closed state. To free these resources, call rte_eth_dev_detach().
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- */
-void rte_eth_dev_close(uint16_t port_id);
-
-/**
- * Reset a Ethernet device and keep its port id.
- *
- * When a port has to be reset passively, the DPDK application can invoke
- * this function. For example when a PF is reset, all its VFs should also
- * be reset. Normally a DPDK application can invoke this function when
- * RTE_ETH_EVENT_INTR_RESET event is detected, but can also use it to start
- * a port reset in other circumstances.
- *
- * When this function is called, it first stops the port and then calls the
- * PMD specific dev_uninit( ) and dev_init( ) to return the port to initial
- * state, in which no Tx and Rx queues are setup, as if the port has been
- * reset and not started. The port keeps the port id it had before the
- * function call.
- *
- * After calling rte_eth_dev_reset( ), the application should use
- * rte_eth_dev_configure( ), rte_eth_rx_queue_setup( ),
- * rte_eth_tx_queue_setup( ), and rte_eth_dev_start( )
- * to reconfigure the device as appropriate.
- *
- * Note: To avoid unexpected behavior, the application should stop calling
- * Tx and Rx functions before calling rte_eth_dev_reset( ). For thread
- * safety, all these controlling functions should be called from the same
- * thread.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- *
- * @return
- * - (0) if successful.
- * - (-EINVAL) if port identifier is invalid.
- * - (-ENOTSUP) if hardware doesn't support this function.
- * - (-EPERM) if not ran from the primary process.
- * - (-EIO) if re-initialisation failed or device is removed.
- * - (-ENOMEM) if the reset failed due to OOM.
- * - (-EAGAIN) if the reset temporarily failed and should be retried later.
- */
-int rte_eth_dev_reset(uint16_t port_id);
-
-/**
- * Enable receipt in promiscuous mode for an Ethernet device.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- */
-void rte_eth_promiscuous_enable(uint16_t port_id);
-
-/**
- * Disable receipt in promiscuous mode for an Ethernet device.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- */
-void rte_eth_promiscuous_disable(uint16_t port_id);
-
-/**
- * Return the value of promiscuous mode for an Ethernet device.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @return
- * - (1) if promiscuous is enabled
- * - (0) if promiscuous is disabled.
- * - (-1) on error
- */
-int rte_eth_promiscuous_get(uint16_t port_id);
-
-/**
- * Enable the receipt of any multicast frame by an Ethernet device.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- */
-void rte_eth_allmulticast_enable(uint16_t port_id);
-
-/**
- * Disable the receipt of all multicast frames by an Ethernet device.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- */
-void rte_eth_allmulticast_disable(uint16_t port_id);
-
-/**
- * Return the value of allmulticast mode for an Ethernet device.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @return
- * - (1) if allmulticast is enabled
- * - (0) if allmulticast is disabled.
- * - (-1) on error
- */
-int rte_eth_allmulticast_get(uint16_t port_id);
-
-/**
- * Retrieve the status (ON/OFF), the speed (in Mbps) and the mode (HALF-DUPLEX
- * or FULL-DUPLEX) of the physical link of an Ethernet device. It might need
- * to wait up to 9 seconds in it.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param link
- * A pointer to an *rte_eth_link* structure to be filled with
- * the status, the speed and the mode of the Ethernet device link.
- */
-void rte_eth_link_get(uint16_t port_id, struct rte_eth_link *link);
-
-/**
- * Retrieve the status (ON/OFF), the speed (in Mbps) and the mode (HALF-DUPLEX
- * or FULL-DUPLEX) of the physical link of an Ethernet device. It is a no-wait
- * version of rte_eth_link_get().
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param link
- * A pointer to an *rte_eth_link* structure to be filled with
- * the status, the speed and the mode of the Ethernet device link.
- */
-void rte_eth_link_get_nowait(uint16_t port_id, struct rte_eth_link *link);
-
-/**
- * Retrieve the general I/O statistics of an Ethernet device.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param stats
- * A pointer to a structure of type *rte_eth_stats* to be filled with
- * the values of device counters for the following set of statistics:
- * - *ipackets* with the total of successfully received packets.
- * - *opackets* with the total of successfully transmitted packets.
- * - *ibytes* with the total of successfully received bytes.
- * - *obytes* with the total of successfully transmitted bytes.
- * - *ierrors* with the total of erroneous received packets.
- * - *oerrors* with the total of failed transmitted packets.
- * @return
- * Zero if successful. Non-zero otherwise.
- */
-int rte_eth_stats_get(uint16_t port_id, struct rte_eth_stats *stats);
-
-/**
- * Reset the general I/O statistics of an Ethernet device.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @return
- * - (0) if device notified to reset stats.
- * - (-ENOTSUP) if hardware doesn't support.
- * - (-ENODEV) if *port_id* invalid.
- */
-int rte_eth_stats_reset(uint16_t port_id);
-
-/**
- * Retrieve names of extended statistics of an Ethernet device.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param xstats_names
- * An rte_eth_xstat_name array of at least *size* elements to
- * be filled. If set to NULL, the function returns the required number
- * of elements.
- * @param size
- * The size of the xstats_names array (number of elements).
- * @return
- * - A positive value lower or equal to size: success. The return value
- * is the number of entries filled in the stats table.
- * - A positive value higher than size: error, the given statistics table
- * is too small. The return value corresponds to the size that should
- * be given to succeed. The entries in the table are not valid and
- * shall not be used by the caller.
- * - A negative value on error (invalid port id).
- */
-int rte_eth_xstats_get_names(uint16_t port_id,
- struct rte_eth_xstat_name *xstats_names,
- unsigned int size);
-
-/**
- * Retrieve extended statistics of an Ethernet device.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param xstats
- * A pointer to a table of structure of type *rte_eth_xstat*
- * to be filled with device statistics ids and values: id is the
- * index of the name string in xstats_names (see rte_eth_xstats_get_names()),
- * and value is the statistic counter.
- * This parameter can be set to NULL if n is 0.
- * @param n
- * The size of the xstats array (number of elements).
- * @return
- * - A positive value lower or equal to n: success. The return value
- * is the number of entries filled in the stats table.
- * - A positive value higher than n: error, the given statistics table
- * is too small. The return value corresponds to the size that should
- * be given to succeed. The entries in the table are not valid and
- * shall not be used by the caller.
- * - A negative value on error (invalid port id).
- */
-int rte_eth_xstats_get(uint16_t port_id, struct rte_eth_xstat *xstats,
- unsigned int n);
-
-/**
- * Retrieve names of extended statistics of an Ethernet device.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param xstats_names
- * An rte_eth_xstat_name array of at least *size* elements to
- * be filled. If set to NULL, the function returns the required number
- * of elements.
- * @param ids
- * IDs array given by app to retrieve specific statistics
- * @param size
- * The size of the xstats_names array (number of elements).
- * @return
- * - A positive value lower or equal to size: success. The return value
- * is the number of entries filled in the stats table.
- * - A positive value higher than size: error, the given statistics table
- * is too small. The return value corresponds to the size that should
- * be given to succeed. The entries in the table are not valid and
- * shall not be used by the caller.
- * - A negative value on error (invalid port id).
- */
-int
-rte_eth_xstats_get_names_by_id(uint16_t port_id,
- struct rte_eth_xstat_name *xstats_names, unsigned int size,
- uint64_t *ids);
-
-/**
- * Retrieve extended statistics of an Ethernet device.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param ids
- * A pointer to an ids array passed by application. This tells which
- * statistics values function should retrieve. This parameter
- * can be set to NULL if size is 0. In this case function will retrieve
- * all avalible statistics.
- * @param values
- * A pointer to a table to be filled with device statistics values.
- * @param size
- * The size of the ids array (number of elements).
- * @return
- * - A positive value lower or equal to size: success. The return value
- * is the number of entries filled in the stats table.
- * - A positive value higher than size: error, the given statistics table
- * is too small. The return value corresponds to the size that should
- * be given to succeed. The entries in the table are not valid and
- * shall not be used by the caller.
- * - A negative value on error (invalid port id).
- */
-int rte_eth_xstats_get_by_id(uint16_t port_id, const uint64_t *ids,
- uint64_t *values, unsigned int size);
-
-/**
- * Gets the ID of a statistic from its name.
- *
- * This function searches for the statistics using string compares, and
- * as such should not be used on the fast-path. For fast-path retrieval of
- * specific statistics, store the ID as provided in *id* from this function,
- * and pass the ID to rte_eth_xstats_get()
- *
- * @param port_id The port to look up statistics from
- * @param xstat_name The name of the statistic to return
- * @param[out] id A pointer to an app-supplied uint64_t which should be
- * set to the ID of the stat if the stat exists.
- * @return
- * 0 on success
- * -ENODEV for invalid port_id,
- * -EIO if device is removed,
- * -EINVAL if the xstat_name doesn't exist in port_id
- */
-int rte_eth_xstats_get_id_by_name(uint16_t port_id, const char *xstat_name,
- uint64_t *id);
-
-/**
- * Reset extended statistics of an Ethernet device.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- */
-void rte_eth_xstats_reset(uint16_t port_id);
-
-/**
- * Set a mapping for the specified transmit queue to the specified per-queue
- * statistics counter.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param tx_queue_id
- * The index of the transmit queue for which a queue stats mapping is required.
- * The value must be in the range [0, nb_tx_queue - 1] previously supplied
- * to rte_eth_dev_configure().
- * @param stat_idx
- * The per-queue packet statistics functionality number that the transmit
- * queue is to be assigned.
- * The value must be in the range [0, RTE_MAX_ETHPORT_QUEUE_STATS_MAPS - 1].
- * @return
- * Zero if successful. Non-zero otherwise.
- */
-int rte_eth_dev_set_tx_queue_stats_mapping(uint16_t port_id,
- uint16_t tx_queue_id, uint8_t stat_idx);
-
-/**
- * Set a mapping for the specified receive queue to the specified per-queue
- * statistics counter.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param rx_queue_id
- * The index of the receive queue for which a queue stats mapping is required.
- * The value must be in the range [0, nb_rx_queue - 1] previously supplied
- * to rte_eth_dev_configure().
- * @param stat_idx
- * The per-queue packet statistics functionality number that the receive
- * queue is to be assigned.
- * The value must be in the range [0, RTE_MAX_ETHPORT_QUEUE_STATS_MAPS - 1].
- * @return
- * Zero if successful. Non-zero otherwise.
- */
-int rte_eth_dev_set_rx_queue_stats_mapping(uint16_t port_id,
- uint16_t rx_queue_id,
- uint8_t stat_idx);
-
-/**
- * Retrieve the Ethernet address of an Ethernet device.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param mac_addr
- * A pointer to a structure of type *ether_addr* to be filled with
- * the Ethernet address of the Ethernet device.
- */
-void rte_eth_macaddr_get(uint16_t port_id, struct ether_addr *mac_addr);
-
-/**
- * Retrieve the contextual information of an Ethernet device.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param dev_info
- * A pointer to a structure of type *rte_eth_dev_info* to be filled with
- * the contextual information of the Ethernet device.
- */
-void rte_eth_dev_info_get(uint16_t port_id, struct rte_eth_dev_info *dev_info);
-
-/**
- * Retrieve the firmware version of a device.
- *
- * @param port_id
- * The port identifier of the device.
- * @param fw_version
- * A pointer to a string array storing the firmware version of a device,
- * the string includes terminating null. This pointer is allocated by caller.
- * @param fw_size
- * The size of the string array pointed by fw_version, which should be
- * large enough to store firmware version of the device.
- * @return
- * - (0) if successful.
- * - (-ENOTSUP) if operation is not supported.
- * - (-ENODEV) if *port_id* invalid.
- * - (-EIO) if device is removed.
- * - (>0) if *fw_size* is not enough to store firmware version, return
- * the size of the non truncated string.
- */
-int rte_eth_dev_fw_version_get(uint16_t port_id,
- char *fw_version, size_t fw_size);
-
-/**
- * Retrieve the supported packet types of an Ethernet device.
- *
- * When a packet type is announced as supported, it *must* be recognized by
- * the PMD. For instance, if RTE_PTYPE_L2_ETHER, RTE_PTYPE_L2_ETHER_VLAN
- * and RTE_PTYPE_L3_IPV4 are announced, the PMD must return the following
- * packet types for these packets:
- * - Ether/IPv4 -> RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4
- * - Ether/Vlan/IPv4 -> RTE_PTYPE_L2_ETHER_VLAN | RTE_PTYPE_L3_IPV4
- * - Ether/[anything else] -> RTE_PTYPE_L2_ETHER
- * - Ether/Vlan/[anything else] -> RTE_PTYPE_L2_ETHER_VLAN
- *
- * When a packet is received by a PMD, the most precise type must be
- * returned among the ones supported. However a PMD is allowed to set
- * packet type that is not in the supported list, at the condition that it
- * is more precise. Therefore, a PMD announcing no supported packet types
- * can still set a matching packet type in a received packet.
- *
- * @note
- * Better to invoke this API after the device is already started or rx burst
- * function is decided, to obtain correct supported ptypes.
- * @note
- * if a given PMD does not report what ptypes it supports, then the supported
- * ptype count is reported as 0.
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param ptype_mask
- * A hint of what kind of packet type which the caller is interested in.
- * @param ptypes
- * An array pointer to store adequate packet types, allocated by caller.
- * @param num
- * Size of the array pointed by param ptypes.
- * @return
- * - (>=0) Number of supported ptypes. If the number of types exceeds num,
- * only num entries will be filled into the ptypes array, but the full
- * count of supported ptypes will be returned.
- * - (-ENODEV) if *port_id* invalid.
- */
-int rte_eth_dev_get_supported_ptypes(uint16_t port_id, uint32_t ptype_mask,
- uint32_t *ptypes, int num);
-
-/**
- * Retrieve the MTU of an Ethernet device.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param mtu
- * A pointer to a uint16_t where the retrieved MTU is to be stored.
- * @return
- * - (0) if successful.
- * - (-ENODEV) if *port_id* invalid.
- */
-int rte_eth_dev_get_mtu(uint16_t port_id, uint16_t *mtu);
-
-/**
- * Change the MTU of an Ethernet device.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param mtu
- * A uint16_t for the MTU to be applied.
- * @return
- * - (0) if successful.
- * - (-ENOTSUP) if operation is not supported.
- * - (-ENODEV) if *port_id* invalid.
- * - (-EIO) if device is removed.
- * - (-EINVAL) if *mtu* invalid.
- * - (-EBUSY) if operation is not allowed when the port is running
- */
-int rte_eth_dev_set_mtu(uint16_t port_id, uint16_t mtu);
-
-/**
- * Enable/Disable hardware filtering by an Ethernet device of received
- * VLAN packets tagged with a given VLAN Tag Identifier.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param vlan_id
- * The VLAN Tag Identifier whose filtering must be enabled or disabled.
- * @param on
- * If > 0, enable VLAN filtering of VLAN packets tagged with *vlan_id*.
- * Otherwise, disable VLAN filtering of VLAN packets tagged with *vlan_id*.
- * @return
- * - (0) if successful.
- * - (-ENOSUP) if hardware-assisted VLAN filtering not configured.
- * - (-ENODEV) if *port_id* invalid.
- * - (-EIO) if device is removed.
- * - (-ENOSYS) if VLAN filtering on *port_id* disabled.
- * - (-EINVAL) if *vlan_id* > 4095.
- */
-int rte_eth_dev_vlan_filter(uint16_t port_id, uint16_t vlan_id, int on);
-
-/**
- * Enable/Disable hardware VLAN Strip by a rx queue of an Ethernet device.
- * 82599/X540/X550 can support VLAN stripping at the rx queue level
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param rx_queue_id
- * The index of the receive queue for which a queue stats mapping is required.
- * The value must be in the range [0, nb_rx_queue - 1] previously supplied
- * to rte_eth_dev_configure().
- * @param on
- * If 1, Enable VLAN Stripping of the receive queue of the Ethernet port.
- * If 0, Disable VLAN Stripping of the receive queue of the Ethernet port.
- * @return
- * - (0) if successful.
- * - (-ENOSUP) if hardware-assisted VLAN stripping not configured.
- * - (-ENODEV) if *port_id* invalid.
- * - (-EINVAL) if *rx_queue_id* invalid.
- */
-int rte_eth_dev_set_vlan_strip_on_queue(uint16_t port_id, uint16_t rx_queue_id,
- int on);
-
-/**
- * Set the Outer VLAN Ether Type by an Ethernet device, it can be inserted to
- * the VLAN Header. This is a register setup available on some Intel NIC, not
- * but all, please check the data sheet for availability.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param vlan_type
- * The vlan type.
- * @param tag_type
- * The Tag Protocol ID
- * @return
- * - (0) if successful.
- * - (-ENOSUP) if hardware-assisted VLAN TPID setup is not supported.
- * - (-ENODEV) if *port_id* invalid.
- * - (-EIO) if device is removed.
- */
-int rte_eth_dev_set_vlan_ether_type(uint16_t port_id,
- enum rte_vlan_type vlan_type,
- uint16_t tag_type);
-
-/**
- * Set VLAN offload configuration on an Ethernet device
- * Enable/Disable Extended VLAN by an Ethernet device, This is a register setup
- * available on some Intel NIC, not but all, please check the data sheet for
- * availability.
- * Enable/Disable VLAN Strip can be done on rx queue for certain NIC, but here
- * the configuration is applied on the port level.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param offload_mask
- * The VLAN Offload bit mask can be mixed use with "OR"
- * ETH_VLAN_STRIP_OFFLOAD
- * ETH_VLAN_FILTER_OFFLOAD
- * ETH_VLAN_EXTEND_OFFLOAD
- * @return
- * - (0) if successful.
- * - (-ENOSUP) if hardware-assisted VLAN filtering not configured.
- * - (-ENODEV) if *port_id* invalid.
- * - (-EIO) if device is removed.
- */
-int rte_eth_dev_set_vlan_offload(uint16_t port_id, int offload_mask);
-
-/**
- * Read VLAN Offload configuration from an Ethernet device
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @return
- * - (>0) if successful. Bit mask to indicate
- * ETH_VLAN_STRIP_OFFLOAD
- * ETH_VLAN_FILTER_OFFLOAD
- * ETH_VLAN_EXTEND_OFFLOAD
- * - (-ENODEV) if *port_id* invalid.
- */
-int rte_eth_dev_get_vlan_offload(uint16_t port_id);
-
-/**
- * Set port based TX VLAN insertion on or off.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param pvid
- * Port based TX VLAN identifier together with user priority.
- * @param on
- * Turn on or off the port based TX VLAN insertion.
- *
- * @return
- * - (0) if successful.
- * - negative if failed.
- */
-int rte_eth_dev_set_vlan_pvid(uint16_t port_id, uint16_t pvid, int on);
-
-typedef void (*buffer_tx_error_fn)(struct rte_mbuf **unsent, uint16_t count,
- void *userdata);
-
-/**
- * Structure used to buffer packets for future TX
- * Used by APIs rte_eth_tx_buffer and rte_eth_tx_buffer_flush
- */
-struct rte_eth_dev_tx_buffer {
- buffer_tx_error_fn error_callback;
- void *error_userdata;
- uint16_t size; /**< Size of buffer for buffered tx */
- uint16_t length; /**< Number of packets in the array */
- struct rte_mbuf *pkts[];
- /**< Pending packets to be sent on explicit flush or when full */
-};
-
-/**
- * Calculate the size of the tx buffer.
- *
- * @param sz
- * Number of stored packets.
- */
-#define RTE_ETH_TX_BUFFER_SIZE(sz) \
- (sizeof(struct rte_eth_dev_tx_buffer) + (sz) * sizeof(struct rte_mbuf *))
-
-/**
- * Initialize default values for buffered transmitting
- *
- * @param buffer
- * Tx buffer to be initialized.
- * @param size
- * Buffer size
- * @return
- * 0 if no error
- */
-int
-rte_eth_tx_buffer_init(struct rte_eth_dev_tx_buffer *buffer, uint16_t size);
-
-/**
- * Configure a callback for buffered packets which cannot be sent
- *
- * Register a specific callback to be called when an attempt is made to send
- * all packets buffered on an ethernet port, but not all packets can
- * successfully be sent. The callback registered here will be called only
- * from calls to rte_eth_tx_buffer() and rte_eth_tx_buffer_flush() APIs.
- * The default callback configured for each queue by default just frees the
- * packets back to the calling mempool. If additional behaviour is required,
- * for example, to count dropped packets, or to retry transmission of packets
- * which cannot be sent, this function should be used to register a suitable
- * callback function to implement the desired behaviour.
- * The example callback "rte_eth_count_unsent_packet_callback()" is also
- * provided as reference.
- *
- * @param buffer
- * The port identifier of the Ethernet device.
- * @param callback
- * The function to be used as the callback.
- * @param userdata
- * Arbitrary parameter to be passed to the callback function
- * @return
- * 0 on success, or -1 on error with rte_errno set appropriately
- */
-int
-rte_eth_tx_buffer_set_err_callback(struct rte_eth_dev_tx_buffer *buffer,
- buffer_tx_error_fn callback, void *userdata);
-
-/**
- * Callback function for silently dropping unsent buffered packets.
- *
- * This function can be passed to rte_eth_tx_buffer_set_err_callback() to
- * adjust the default behavior when buffered packets cannot be sent. This
- * function drops any unsent packets silently and is used by tx buffered
- * operations as default behavior.
- *
- * NOTE: this function should not be called directly, instead it should be used
- * as a callback for packet buffering.
- *
- * NOTE: when configuring this function as a callback with
- * rte_eth_tx_buffer_set_err_callback(), the final, userdata parameter
- * should point to an uint64_t value.
- *
- * @param pkts
- * The previously buffered packets which could not be sent
- * @param unsent
- * The number of unsent packets in the pkts array
- * @param userdata
- * Not used
- */
-void
-rte_eth_tx_buffer_drop_callback(struct rte_mbuf **pkts, uint16_t unsent,
- void *userdata);
-
-/**
- * Callback function for tracking unsent buffered packets.
- *
- * This function can be passed to rte_eth_tx_buffer_set_err_callback() to
- * adjust the default behavior when buffered packets cannot be sent. This
- * function drops any unsent packets, but also updates a user-supplied counter
- * to track the overall number of packets dropped. The counter should be an
- * uint64_t variable.
- *
- * NOTE: this function should not be called directly, instead it should be used
- * as a callback for packet buffering.
- *
- * NOTE: when configuring this function as a callback with
- * rte_eth_tx_buffer_set_err_callback(), the final, userdata parameter
- * should point to an uint64_t value.
- *
- * @param pkts
- * The previously buffered packets which could not be sent
- * @param unsent
- * The number of unsent packets in the pkts array
- * @param userdata
- * Pointer to an uint64_t value, which will be incremented by unsent
- */
-void
-rte_eth_tx_buffer_count_callback(struct rte_mbuf **pkts, uint16_t unsent,
- void *userdata);
-
-/**
- * Request the driver to free mbufs currently cached by the driver. The
- * driver will only free the mbuf if it is no longer in use. It is the
- * application's responsibity to ensure rte_eth_tx_buffer_flush(..) is
- * called if needed.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param queue_id
- * The index of the transmit queue through which output packets must be
- * sent.
- * The value must be in the range [0, nb_tx_queue - 1] previously supplied
- * to rte_eth_dev_configure().
- * @param free_cnt
- * Maximum number of packets to free. Use 0 to indicate all possible packets
- * should be freed. Note that a packet may be using multiple mbufs.
- * @return
- * Failure: < 0
- * -ENODEV: Invalid interface
- * -EIO: device is removed
- * -ENOTSUP: Driver does not support function
- * Success: >= 0
- * 0-n: Number of packets freed. More packets may still remain in ring that
- * are in use.
- */
-int
-rte_eth_tx_done_cleanup(uint16_t port_id, uint16_t queue_id, uint32_t free_cnt);
-
-/**
- * The eth device event type for interrupt, and maybe others in the future.
- */
-enum rte_eth_event_type {
- RTE_ETH_EVENT_UNKNOWN, /**< unknown event type */
- RTE_ETH_EVENT_INTR_LSC, /**< lsc interrupt event */
- RTE_ETH_EVENT_QUEUE_STATE,
- /**< queue state event (enabled/disabled) */
- RTE_ETH_EVENT_INTR_RESET,
- /**< reset interrupt event, sent to VF on PF reset */
- RTE_ETH_EVENT_VF_MBOX, /**< message from the VF received by PF */
- RTE_ETH_EVENT_MACSEC, /**< MACsec offload related event */
- RTE_ETH_EVENT_INTR_RMV, /**< device removal event */
- RTE_ETH_EVENT_NEW, /**< port is probed */
- RTE_ETH_EVENT_DESTROY, /**< port is released */
- RTE_ETH_EVENT_MAX /**< max value of this enum */
-};
-
-typedef int (*rte_eth_dev_cb_fn)(uint16_t port_id,
- enum rte_eth_event_type event, void *cb_arg, void *ret_param);
-/**< user application callback to be registered for interrupts */
-
-/**
- * Register a callback function for port event.
- *
- * @param port_id
- * Port id.
- * RTE_ETH_ALL means register the event for all port ids.
- * @param event
- * Event interested.
- * @param cb_fn
- * User supplied callback function to be called.
- * @param cb_arg
- * Pointer to the parameters for the registered callback.
- *
- * @return
- * - On success, zero.
- * - On failure, a negative value.
- */
-int rte_eth_dev_callback_register(uint16_t port_id,
- enum rte_eth_event_type event,
- rte_eth_dev_cb_fn cb_fn, void *cb_arg);
-
-/**
- * Unregister a callback function for port event.
- *
- * @param port_id
- * Port id.
- * RTE_ETH_ALL means unregister the event for all port ids.
- * @param event
- * Event interested.
- * @param cb_fn
- * User supplied callback function to be called.
- * @param cb_arg
- * Pointer to the parameters for the registered callback. -1 means to
- * remove all for the same callback address and same event.
- *
- * @return
- * - On success, zero.
- * - On failure, a negative value.
- */
-int rte_eth_dev_callback_unregister(uint16_t port_id,
- enum rte_eth_event_type event,
- rte_eth_dev_cb_fn cb_fn, void *cb_arg);
-
-/**
- * When there is no rx packet coming in Rx Queue for a long time, we can
- * sleep lcore related to RX Queue for power saving, and enable rx interrupt
- * to be triggered when Rx packet arrives.
- *
- * The rte_eth_dev_rx_intr_enable() function enables rx queue
- * interrupt on specific rx queue of a port.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param queue_id
- * The index of the receive queue from which to retrieve input packets.
- * The value must be in the range [0, nb_rx_queue - 1] previously supplied
- * to rte_eth_dev_configure().
- * @return
- * - (0) if successful.
- * - (-ENOTSUP) if underlying hardware OR driver doesn't support
- * that operation.
- * - (-ENODEV) if *port_id* invalid.
- * - (-EIO) if device is removed.
- */
-int rte_eth_dev_rx_intr_enable(uint16_t port_id, uint16_t queue_id);
-
-/**
- * When lcore wakes up from rx interrupt indicating packet coming, disable rx
- * interrupt and returns to polling mode.
- *
- * The rte_eth_dev_rx_intr_disable() function disables rx queue
- * interrupt on specific rx queue of a port.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param queue_id
- * The index of the receive queue from which to retrieve input packets.
- * The value must be in the range [0, nb_rx_queue - 1] previously supplied
- * to rte_eth_dev_configure().
- * @return
- * - (0) if successful.
- * - (-ENOTSUP) if underlying hardware OR driver doesn't support
- * that operation.
- * - (-ENODEV) if *port_id* invalid.
- * - (-EIO) if device is removed.
- */
-int rte_eth_dev_rx_intr_disable(uint16_t port_id, uint16_t queue_id);
-
-/**
- * RX Interrupt control per port.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param epfd
- * Epoll instance fd which the intr vector associated to.
- * Using RTE_EPOLL_PER_THREAD allows to use per thread epoll instance.
- * @param op
- * The operation be performed for the vector.
- * Operation type of {RTE_INTR_EVENT_ADD, RTE_INTR_EVENT_DEL}.
- * @param data
- * User raw data.
- * @return
- * - On success, zero.
- * - On failure, a negative value.
- */
-int rte_eth_dev_rx_intr_ctl(uint16_t port_id, int epfd, int op, void *data);
-
-/**
- * RX Interrupt control per queue.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param queue_id
- * The index of the receive queue from which to retrieve input packets.
- * The value must be in the range [0, nb_rx_queue - 1] previously supplied
- * to rte_eth_dev_configure().
- * @param epfd
- * Epoll instance fd which the intr vector associated to.
- * Using RTE_EPOLL_PER_THREAD allows to use per thread epoll instance.
- * @param op
- * The operation be performed for the vector.
- * Operation type of {RTE_INTR_EVENT_ADD, RTE_INTR_EVENT_DEL}.
- * @param data
- * User raw data.
- * @return
- * - On success, zero.
- * - On failure, a negative value.
- */
-int rte_eth_dev_rx_intr_ctl_q(uint16_t port_id, uint16_t queue_id,
- int epfd, int op, void *data);
-
-/**
- * Turn on the LED on the Ethernet device.
- * This function turns on the LED on the Ethernet device.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @return
- * - (0) if successful.
- * - (-ENOTSUP) if underlying hardware OR driver doesn't support
- * that operation.
- * - (-ENODEV) if *port_id* invalid.
- * - (-EIO) if device is removed.
- */
-int rte_eth_led_on(uint16_t port_id);
-
-/**
- * Turn off the LED on the Ethernet device.
- * This function turns off the LED on the Ethernet device.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @return
- * - (0) if successful.
- * - (-ENOTSUP) if underlying hardware OR driver doesn't support
- * that operation.
- * - (-ENODEV) if *port_id* invalid.
- * - (-EIO) if device is removed.
- */
-int rte_eth_led_off(uint16_t port_id);
-
-/**
- * Get current status of the Ethernet link flow control for Ethernet device
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param fc_conf
- * The pointer to the structure where to store the flow control parameters.
- * @return
- * - (0) if successful.
- * - (-ENOTSUP) if hardware doesn't support flow control.
- * - (-ENODEV) if *port_id* invalid.
- * - (-EIO) if device is removed.
- */
-int rte_eth_dev_flow_ctrl_get(uint16_t port_id,
- struct rte_eth_fc_conf *fc_conf);
-
-/**
- * Configure the Ethernet link flow control for Ethernet device
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param fc_conf
- * The pointer to the structure of the flow control parameters.
- * @return
- * - (0) if successful.
- * - (-ENOTSUP) if hardware doesn't support flow control mode.
- * - (-ENODEV) if *port_id* invalid.
- * - (-EINVAL) if bad parameter
- * - (-EIO) if flow control setup failure or device is removed.
- */
-int rte_eth_dev_flow_ctrl_set(uint16_t port_id,
- struct rte_eth_fc_conf *fc_conf);
-
-/**
- * Configure the Ethernet priority flow control under DCB environment
- * for Ethernet device.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param pfc_conf
- * The pointer to the structure of the priority flow control parameters.
- * @return
- * - (0) if successful.
- * - (-ENOTSUP) if hardware doesn't support priority flow control mode.
- * - (-ENODEV) if *port_id* invalid.
- * - (-EINVAL) if bad parameter
- * - (-EIO) if flow control setup failure or device is removed.
- */
-int rte_eth_dev_priority_flow_ctrl_set(uint16_t port_id,
- struct rte_eth_pfc_conf *pfc_conf);
-
-/**
- * Add a MAC address to an internal array of addresses used to enable whitelist
- * filtering to accept packets only if the destination MAC address matches.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param mac_addr
- * The MAC address to add.
- * @param pool
- * VMDq pool index to associate address with (if VMDq is enabled). If VMDq is
- * not enabled, this should be set to 0.
- * @return
- * - (0) if successfully added or *mac_addr* was already added.
- * - (-ENOTSUP) if hardware doesn't support this feature.
- * - (-ENODEV) if *port* is invalid.
- * - (-EIO) if device is removed.
- * - (-ENOSPC) if no more MAC addresses can be added.
- * - (-EINVAL) if MAC address is invalid.
- */
-int rte_eth_dev_mac_addr_add(uint16_t port_id, struct ether_addr *mac_addr,
- uint32_t pool);
-
-/**
- * Remove a MAC address from the internal array of addresses.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param mac_addr
- * MAC address to remove.
- * @return
- * - (0) if successful, or *mac_addr* didn't exist.
- * - (-ENOTSUP) if hardware doesn't support.
- * - (-ENODEV) if *port* invalid.
- * - (-EADDRINUSE) if attempting to remove the default MAC address
- */
-int rte_eth_dev_mac_addr_remove(uint16_t port_id, struct ether_addr *mac_addr);
-
-/**
- * Set the default MAC address.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param mac_addr
- * New default MAC address.
- * @return
- * - (0) if successful, or *mac_addr* didn't exist.
- * - (-ENOTSUP) if hardware doesn't support.
- * - (-ENODEV) if *port* invalid.
- * - (-EINVAL) if MAC address is invalid.
- */
-int rte_eth_dev_default_mac_addr_set(uint16_t port_id,
- struct ether_addr *mac_addr);
-
-/**
- * Update Redirection Table(RETA) of Receive Side Scaling of Ethernet device.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param reta_conf
- * RETA to update.
- * @param reta_size
- * Redirection table size. The table size can be queried by
- * rte_eth_dev_info_get().
- * @return
- * - (0) if successful.
- * - (-ENOTSUP) if hardware doesn't support.
- * - (-EINVAL) if bad parameter.
- * - (-EIO) if device is removed.
- */
-int rte_eth_dev_rss_reta_update(uint16_t port_id,
- struct rte_eth_rss_reta_entry64 *reta_conf,
- uint16_t reta_size);
-
- /**
- * Query Redirection Table(RETA) of Receive Side Scaling of Ethernet device.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param reta_conf
- * RETA to query.
- * @param reta_size
- * Redirection table size. The table size can be queried by
- * rte_eth_dev_info_get().
- * @return
- * - (0) if successful.
- * - (-ENOTSUP) if hardware doesn't support.
- * - (-EINVAL) if bad parameter.
- * - (-EIO) if device is removed.
- */
-int rte_eth_dev_rss_reta_query(uint16_t port_id,
- struct rte_eth_rss_reta_entry64 *reta_conf,
- uint16_t reta_size);
-
- /**
- * Updates unicast hash table for receiving packet with the given destination
- * MAC address, and the packet is routed to all VFs for which the RX mode is
- * accept packets that match the unicast hash table.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param addr
- * Unicast MAC address.
- * @param on
- * 1 - Set an unicast hash bit for receiving packets with the MAC address.
- * 0 - Clear an unicast hash bit.
- * @return
- * - (0) if successful.
- * - (-ENOTSUP) if hardware doesn't support.
- * - (-ENODEV) if *port_id* invalid.
- * - (-EIO) if device is removed.
- * - (-EINVAL) if bad parameter.
- */
-int rte_eth_dev_uc_hash_table_set(uint16_t port_id, struct ether_addr *addr,
- uint8_t on);
-
- /**
- * Updates all unicast hash bitmaps for receiving packet with any Unicast
- * Ethernet MAC addresses,the packet is routed to all VFs for which the RX
- * mode is accept packets that match the unicast hash table.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param on
- * 1 - Set all unicast hash bitmaps for receiving all the Ethernet
- * MAC addresses
- * 0 - Clear all unicast hash bitmaps
- * @return
- * - (0) if successful.
- * - (-ENOTSUP) if hardware doesn't support.
- * - (-ENODEV) if *port_id* invalid.
- * - (-EIO) if device is removed.
- * - (-EINVAL) if bad parameter.
- */
-int rte_eth_dev_uc_all_hash_table_set(uint16_t port_id, uint8_t on);
-
-/**
- * Set a traffic mirroring rule on an Ethernet device
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param mirror_conf
- * The pointer to the traffic mirroring structure describing the mirroring rule.
- * The *rte_eth_vm_mirror_conf* structure includes the type of mirroring rule,
- * destination pool and the value of rule if enable vlan or pool mirroring.
- *
- * @param rule_id
- * The index of traffic mirroring rule, we support four separated rules.
- * @param on
- * 1 - Enable a mirroring rule.
- * 0 - Disable a mirroring rule.
- * @return
- * - (0) if successful.
- * - (-ENOTSUP) if hardware doesn't support this feature.
- * - (-ENODEV) if *port_id* invalid.
- * - (-EIO) if device is removed.
- * - (-EINVAL) if the mr_conf information is not correct.
- */
-int rte_eth_mirror_rule_set(uint16_t port_id,
- struct rte_eth_mirror_conf *mirror_conf,
- uint8_t rule_id,
- uint8_t on);
-
-/**
- * Reset a traffic mirroring rule on an Ethernet device.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param rule_id
- * The index of traffic mirroring rule, we support four separated rules.
- * @return
- * - (0) if successful.
- * - (-ENOTSUP) if hardware doesn't support this feature.
- * - (-ENODEV) if *port_id* invalid.
- * - (-EIO) if device is removed.
- * - (-EINVAL) if bad parameter.
- */
-int rte_eth_mirror_rule_reset(uint16_t port_id,
- uint8_t rule_id);
-
-/**
- * Set the rate limitation for a queue on an Ethernet device.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param queue_idx
- * The queue id.
- * @param tx_rate
- * The tx rate in Mbps. Allocated from the total port link speed.
- * @return
- * - (0) if successful.
- * - (-ENOTSUP) if hardware doesn't support this feature.
- * - (-ENODEV) if *port_id* invalid.
- * - (-EIO) if device is removed.
- * - (-EINVAL) if bad parameter.
- */
-int rte_eth_set_queue_rate_limit(uint16_t port_id, uint16_t queue_idx,
- uint16_t tx_rate);
-
- /**
- * Configuration of Receive Side Scaling hash computation of Ethernet device.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param rss_conf
- * The new configuration to use for RSS hash computation on the port.
- * @return
- * - (0) if successful.
- * - (-ENODEV) if port identifier is invalid.
- * - (-EIO) if device is removed.
- * - (-ENOTSUP) if hardware doesn't support.
- * - (-EINVAL) if bad parameter.
- */
-int rte_eth_dev_rss_hash_update(uint16_t port_id,
- struct rte_eth_rss_conf *rss_conf);
-
- /**
- * Retrieve current configuration of Receive Side Scaling hash computation
- * of Ethernet device.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param rss_conf
- * Where to store the current RSS hash configuration of the Ethernet device.
- * @return
- * - (0) if successful.
- * - (-ENODEV) if port identifier is invalid.
- * - (-EIO) if device is removed.
- * - (-ENOTSUP) if hardware doesn't support RSS.
- */
-int
-rte_eth_dev_rss_hash_conf_get(uint16_t port_id,
- struct rte_eth_rss_conf *rss_conf);
-
- /**
- * Add UDP tunneling port for a specific type of tunnel.
- * The packets with this UDP port will be identified as this type of tunnel.
- * Before enabling any offloading function for a tunnel, users can call this API
- * to change or add more UDP port for the tunnel. So the offloading function
- * can take effect on the packets with the specific UDP port.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param tunnel_udp
- * UDP tunneling configuration.
- *
- * @return
- * - (0) if successful.
- * - (-ENODEV) if port identifier is invalid.
- * - (-EIO) if device is removed.
- * - (-ENOTSUP) if hardware doesn't support tunnel type.
- */
-int
-rte_eth_dev_udp_tunnel_port_add(uint16_t port_id,
- struct rte_eth_udp_tunnel *tunnel_udp);
-
- /**
- * Delete UDP tunneling port a specific type of tunnel.
- * The packets with this UDP port will not be identified as this type of tunnel
- * any more.
- * Before enabling any offloading function for a tunnel, users can call this API
- * to delete a UDP port for the tunnel. So the offloading function will not take
- * effect on the packets with the specific UDP port.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param tunnel_udp
- * UDP tunneling configuration.
- *
- * @return
- * - (0) if successful.
- * - (-ENODEV) if port identifier is invalid.
- * - (-EIO) if device is removed.
- * - (-ENOTSUP) if hardware doesn't support tunnel type.
- */
-int
-rte_eth_dev_udp_tunnel_port_delete(uint16_t port_id,
- struct rte_eth_udp_tunnel *tunnel_udp);
-
-/**
- * Check whether the filter type is supported on an Ethernet device.
- * All the supported filter types are defined in 'rte_eth_ctrl.h'.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param filter_type
- * Filter type.
- * @return
- * - (0) if successful.
- * - (-ENOTSUP) if hardware doesn't support this filter type.
- * - (-ENODEV) if *port_id* invalid.
- * - (-EIO) if device is removed.
- */
-int rte_eth_dev_filter_supported(uint16_t port_id,
- enum rte_filter_type filter_type);
-
-/**
- * Take operations to assigned filter type on an Ethernet device.
- * All the supported operations and filter types are defined in 'rte_eth_ctrl.h'.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param filter_type
- * Filter type.
- * @param filter_op
- * Type of operation.
- * @param arg
- * A pointer to arguments defined specifically for the operation.
- * @return
- * - (0) if successful.
- * - (-ENOTSUP) if hardware doesn't support.
- * - (-ENODEV) if *port_id* invalid.
- * - (-EIO) if device is removed.
- * - others depends on the specific operations implementation.
- */
-int rte_eth_dev_filter_ctrl(uint16_t port_id, enum rte_filter_type filter_type,
- enum rte_filter_op filter_op, void *arg);
-
-/**
- * Get DCB information on an Ethernet device.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param dcb_info
- * dcb information.
- * @return
- * - (0) if successful.
- * - (-ENODEV) if port identifier is invalid.
- * - (-EIO) if device is removed.
- * - (-ENOTSUP) if hardware doesn't support.
- */
-int rte_eth_dev_get_dcb_info(uint16_t port_id,
- struct rte_eth_dcb_info *dcb_info);
-
-/**
- * Add a callback to be called on packet RX on a given port and queue.
- *
- * This API configures a function to be called for each burst of
- * packets received on a given NIC port queue. The return value is a pointer
- * that can be used to later remove the callback using
- * rte_eth_remove_rx_callback().
- *
- * Multiple functions are called in the order that they are added.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param queue_id
- * The queue on the Ethernet device on which the callback is to be added.
- * @param fn
- * The callback function
- * @param user_param
- * A generic pointer parameter which will be passed to each invocation of the
- * callback function on this port and queue.
- *
- * @return
- * NULL on error.
- * On success, a pointer value which can later be used to remove the callback.
- */
-void *rte_eth_add_rx_callback(uint16_t port_id, uint16_t queue_id,
- rte_rx_callback_fn fn, void *user_param);
-
-/**
- * Add a callback that must be called first on packet RX on a given port
- * and queue.
- *
- * This API configures a first function to be called for each burst of
- * packets received on a given NIC port queue. The return value is a pointer
- * that can be used to later remove the callback using
- * rte_eth_remove_rx_callback().
- *
- * Multiple functions are called in the order that they are added.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param queue_id
- * The queue on the Ethernet device on which the callback is to be added.
- * @param fn
- * The callback function
- * @param user_param
- * A generic pointer parameter which will be passed to each invocation of the
- * callback function on this port and queue.
- *
- * @return
- * NULL on error.
- * On success, a pointer value which can later be used to remove the callback.
- */
-void *rte_eth_add_first_rx_callback(uint16_t port_id, uint16_t queue_id,
- rte_rx_callback_fn fn, void *user_param);
-
-/**
- * Add a callback to be called on packet TX on a given port and queue.
- *
- * This API configures a function to be called for each burst of
- * packets sent on a given NIC port queue. The return value is a pointer
- * that can be used to later remove the callback using
- * rte_eth_remove_tx_callback().
- *
- * Multiple functions are called in the order that they are added.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param queue_id
- * The queue on the Ethernet device on which the callback is to be added.
- * @param fn
- * The callback function
- * @param user_param
- * A generic pointer parameter which will be passed to each invocation of the
- * callback function on this port and queue.
- *
- * @return
- * NULL on error.
- * On success, a pointer value which can later be used to remove the callback.
- */
-void *rte_eth_add_tx_callback(uint16_t port_id, uint16_t queue_id,
- rte_tx_callback_fn fn, void *user_param);
-
-struct rte_eth_rxtx_callback;
-
-/**
- * Remove an RX packet callback from a given port and queue.
- *
- * This function is used to removed callbacks that were added to a NIC port
- * queue using rte_eth_add_rx_callback().
- *
- * Note: the callback is removed from the callback list but it isn't freed
- * since the it may still be in use. The memory for the callback can be
- * subsequently freed back by the application by calling rte_free():
- *
- * - Immediately - if the port is stopped, or the user knows that no
- * callbacks are in flight e.g. if called from the thread doing RX/TX
- * on that queue.
- *
- * - After a short delay - where the delay is sufficient to allow any
- * in-flight callbacks to complete.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param queue_id
- * The queue on the Ethernet device from which the callback is to be removed.
- * @param user_cb
- * User supplied callback created via rte_eth_add_rx_callback().
- *
- * @return
- * - 0: Success. Callback was removed.
- * - -ENOTSUP: Callback support is not available.
- * - -EINVAL: The port_id or the queue_id is out of range, or the callback
- * is NULL or not found for the port/queue.
- */
-int rte_eth_remove_rx_callback(uint16_t port_id, uint16_t queue_id,
- struct rte_eth_rxtx_callback *user_cb);
-
-/**
- * Remove a TX packet callback from a given port and queue.
- *
- * This function is used to removed callbacks that were added to a NIC port
- * queue using rte_eth_add_tx_callback().
- *
- * Note: the callback is removed from the callback list but it isn't freed
- * since the it may still be in use. The memory for the callback can be
- * subsequently freed back by the application by calling rte_free():
- *
- * - Immediately - if the port is stopped, or the user knows that no
- * callbacks are in flight e.g. if called from the thread doing RX/TX
- * on that queue.
- *
- * - After a short delay - where the delay is sufficient to allow any
- * in-flight callbacks to complete.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param queue_id
- * The queue on the Ethernet device from which the callback is to be removed.
- * @param user_cb
- * User supplied callback created via rte_eth_add_tx_callback().
- *
- * @return
- * - 0: Success. Callback was removed.
- * - -ENOTSUP: Callback support is not available.
- * - -EINVAL: The port_id or the queue_id is out of range, or the callback
- * is NULL or not found for the port/queue.
- */
-int rte_eth_remove_tx_callback(uint16_t port_id, uint16_t queue_id,
- struct rte_eth_rxtx_callback *user_cb);
-
-/**
- * Retrieve information about given port's RX queue.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param queue_id
- * The RX queue on the Ethernet device for which information
- * will be retrieved.
- * @param qinfo
- * A pointer to a structure of type *rte_eth_rxq_info_info* to be filled with
- * the information of the Ethernet device.
- *
- * @return
- * - 0: Success
- * - -ENOTSUP: routine is not supported by the device PMD.
- * - -EINVAL: The port_id or the queue_id is out of range.
- */
-int rte_eth_rx_queue_info_get(uint16_t port_id, uint16_t queue_id,
- struct rte_eth_rxq_info *qinfo);
-
-/**
- * Retrieve information about given port's TX queue.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param queue_id
- * The TX queue on the Ethernet device for which information
- * will be retrieved.
- * @param qinfo
- * A pointer to a structure of type *rte_eth_txq_info_info* to be filled with
- * the information of the Ethernet device.
- *
- * @return
- * - 0: Success
- * - -ENOTSUP: routine is not supported by the device PMD.
- * - -EINVAL: The port_id or the queue_id is out of range.
- */
-int rte_eth_tx_queue_info_get(uint16_t port_id, uint16_t queue_id,
- struct rte_eth_txq_info *qinfo);
-
-/**
- * Retrieve device registers and register attributes (number of registers and
- * register size)
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param info
- * Pointer to rte_dev_reg_info structure to fill in. If info->data is
- * NULL the function fills in the width and length fields. If non-NULL
- * the registers are put into the buffer pointed at by the data field.
- * @return
- * - (0) if successful.
- * - (-ENOTSUP) if hardware doesn't support.
- * - (-ENODEV) if *port_id* invalid.
- * - (-EIO) if device is removed.
- * - others depends on the specific operations implementation.
- */
-int rte_eth_dev_get_reg_info(uint16_t port_id, struct rte_dev_reg_info *info);
-
-/**
- * Retrieve size of device EEPROM
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @return
- * - (>=0) EEPROM size if successful.
- * - (-ENOTSUP) if hardware doesn't support.
- * - (-ENODEV) if *port_id* invalid.
- * - (-EIO) if device is removed.
- * - others depends on the specific operations implementation.
- */
-int rte_eth_dev_get_eeprom_length(uint16_t port_id);
-
-/**
- * Retrieve EEPROM and EEPROM attribute
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param info
- * The template includes buffer for return EEPROM data and
- * EEPROM attributes to be filled.
- * @return
- * - (0) if successful.
- * - (-ENOTSUP) if hardware doesn't support.
- * - (-ENODEV) if *port_id* invalid.
- * - (-EIO) if device is removed.
- * - others depends on the specific operations implementation.
- */
-int rte_eth_dev_get_eeprom(uint16_t port_id, struct rte_dev_eeprom_info *info);
-
-/**
- * Program EEPROM with provided data
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param info
- * The template includes EEPROM data for programming and
- * EEPROM attributes to be filled
- * @return
- * - (0) if successful.
- * - (-ENOTSUP) if hardware doesn't support.
- * - (-ENODEV) if *port_id* invalid.
- * - (-EIO) if device is removed.
- * - others depends on the specific operations implementation.
- */
-int rte_eth_dev_set_eeprom(uint16_t port_id, struct rte_dev_eeprom_info *info);
-
-/**
- * Set the list of multicast addresses to filter on an Ethernet device.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param mc_addr_set
- * The array of multicast addresses to set. Equal to NULL when the function
- * is invoked to flush the set of filtered addresses.
- * @param nb_mc_addr
- * The number of multicast addresses in the *mc_addr_set* array. Equal to 0
- * when the function is invoked to flush the set of filtered addresses.
- * @return
- * - (0) if successful.
- * - (-ENODEV) if *port_id* invalid.
- * - (-EIO) if device is removed.
- * - (-ENOTSUP) if PMD of *port_id* doesn't support multicast filtering.
- * - (-ENOSPC) if *port_id* has not enough multicast filtering resources.
- */
-int rte_eth_dev_set_mc_addr_list(uint16_t port_id,
- struct ether_addr *mc_addr_set,
- uint32_t nb_mc_addr);
-
-/**
- * Enable IEEE1588/802.1AS timestamping for an Ethernet device.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- *
- * @return
- * - 0: Success.
- * - -ENODEV: The port ID is invalid.
- * - -EIO: if device is removed.
- * - -ENOTSUP: The function is not supported by the Ethernet driver.
- */
-int rte_eth_timesync_enable(uint16_t port_id);
-
-/**
- * Disable IEEE1588/802.1AS timestamping for an Ethernet device.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- *
- * @return
- * - 0: Success.
- * - -ENODEV: The port ID is invalid.
- * - -EIO: if device is removed.
- * - -ENOTSUP: The function is not supported by the Ethernet driver.
- */
-int rte_eth_timesync_disable(uint16_t port_id);
-
-/**
- * Read an IEEE1588/802.1AS RX timestamp from an Ethernet device.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param timestamp
- * Pointer to the timestamp struct.
- * @param flags
- * Device specific flags. Used to pass the RX timesync register index to
- * i40e. Unused in igb/ixgbe, pass 0 instead.
- *
- * @return
- * - 0: Success.
- * - -EINVAL: No timestamp is available.
- * - -ENODEV: The port ID is invalid.
- * - -EIO: if device is removed.
- * - -ENOTSUP: The function is not supported by the Ethernet driver.
- */
-int rte_eth_timesync_read_rx_timestamp(uint16_t port_id,
- struct timespec *timestamp, uint32_t flags);
-
-/**
- * Read an IEEE1588/802.1AS TX timestamp from an Ethernet device.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param timestamp
- * Pointer to the timestamp struct.
- *
- * @return
- * - 0: Success.
- * - -EINVAL: No timestamp is available.
- * - -ENODEV: The port ID is invalid.
- * - -EIO: if device is removed.
- * - -ENOTSUP: The function is not supported by the Ethernet driver.
- */
-int rte_eth_timesync_read_tx_timestamp(uint16_t port_id,
- struct timespec *timestamp);
-
-/**
- * Adjust the timesync clock on an Ethernet device.
- *
- * This is usually used in conjunction with other Ethdev timesync functions to
- * synchronize the device time using the IEEE1588/802.1AS protocol.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param delta
- * The adjustment in nanoseconds.
- *
- * @return
- * - 0: Success.
- * - -ENODEV: The port ID is invalid.
- * - -EIO: if device is removed.
- * - -ENOTSUP: The function is not supported by the Ethernet driver.
- */
-int rte_eth_timesync_adjust_time(uint16_t port_id, int64_t delta);
-
-/**
- * Read the time from the timesync clock on an Ethernet device.
- *
- * This is usually used in conjunction with other Ethdev timesync functions to
- * synchronize the device time using the IEEE1588/802.1AS protocol.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param time
- * Pointer to the timespec struct that holds the time.
- *
- * @return
- * - 0: Success.
- */
-int rte_eth_timesync_read_time(uint16_t port_id, struct timespec *time);
-
-/**
- * Set the time of the timesync clock on an Ethernet device.
- *
- * This is usually used in conjunction with other Ethdev timesync functions to
- * synchronize the device time using the IEEE1588/802.1AS protocol.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param time
- * Pointer to the timespec struct that holds the time.
- *
- * @return
- * - 0: Success.
- * - -EINVAL: No timestamp is available.
- * - -ENODEV: The port ID is invalid.
- * - -EIO: if device is removed.
- * - -ENOTSUP: The function is not supported by the Ethernet driver.
- */
-int rte_eth_timesync_write_time(uint16_t port_id, const struct timespec *time);
-
-/**
- * Config l2 tunnel ether type of an Ethernet device for filtering specific
- * tunnel packets by ether type.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param l2_tunnel
- * l2 tunnel configuration.
- *
- * @return
- * - (0) if successful.
- * - (-ENODEV) if port identifier is invalid.
- * - (-EIO) if device is removed.
- * - (-ENOTSUP) if hardware doesn't support tunnel type.
- */
-int
-rte_eth_dev_l2_tunnel_eth_type_conf(uint16_t port_id,
- struct rte_eth_l2_tunnel_conf *l2_tunnel);
-
-/**
- * Enable/disable l2 tunnel offload functions. Include,
- * 1, The ability of parsing a type of l2 tunnel of an Ethernet device.
- * Filtering, forwarding and offloading this type of tunnel packets depend on
- * this ability.
- * 2, Stripping the l2 tunnel tag.
- * 3, Insertion of the l2 tunnel tag.
- * 4, Forwarding the packets based on the l2 tunnel tag.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param l2_tunnel
- * l2 tunnel parameters.
- * @param mask
- * Indicate the offload function.
- * @param en
- * Enable or disable this function.
- *
- * @return
- * - (0) if successful.
- * - (-ENODEV) if port identifier is invalid.
- * - (-EIO) if device is removed.
- * - (-ENOTSUP) if hardware doesn't support tunnel type.
- */
-int
-rte_eth_dev_l2_tunnel_offload_set(uint16_t port_id,
- struct rte_eth_l2_tunnel_conf *l2_tunnel,
- uint32_t mask,
- uint8_t en);
-
-/**
-* Get the port id from pci address or device name
-* Ex: 0000:2:00.0 or vdev name net_pcap0
-*
-* @param name
-* pci address or name of the device
-* @param port_id
-* pointer to port identifier of the device
-* @return
-* - (0) if successful and port_id is filled.
-* - (-ENODEV or -EINVAL) on failure.
-*/
-int
-rte_eth_dev_get_port_by_name(const char *name, uint16_t *port_id);
-
-/**
-* Get the device name from port id
-*
-* @param port_id
-* pointer to port identifier of the device
-* @param name
-* pci address or name of the device
-* @return
-* - (0) if successful.
-* - (-EINVAL) on failure.
-*/
-int
-rte_eth_dev_get_name_by_port(uint16_t port_id, char *name);
-
-/**
- * Check that numbers of Rx and Tx descriptors satisfy descriptors limits from
- * the ethernet device information, otherwise adjust them to boundaries.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param nb_rx_desc
- * A pointer to a uint16_t where the number of receive
- * descriptors stored.
- * @param nb_tx_desc
- * A pointer to a uint16_t where the number of transmit
- * descriptors stored.
- * @return
- * - (0) if successful.
- * - (-ENOTSUP, -ENODEV or -EINVAL) on failure.
- */
-int rte_eth_dev_adjust_nb_rx_tx_desc(uint16_t port_id,
- uint16_t *nb_rx_desc,
- uint16_t *nb_tx_desc);
-
-/**
- * Test if a port supports specific mempool ops.
- *
- * @param port_id
- * Port identifier of the Ethernet device.
- * @param [in] pool
- * The name of the pool operations to test.
- * @return
- * - 0: best mempool ops choice for this port.
- * - 1: mempool ops are supported for this port.
- * - -ENOTSUP: mempool ops not supported for this port.
- * - -ENODEV: Invalid port Identifier.
- * - -EINVAL: Pool param is null.
- */
-int
-rte_eth_dev_pool_ops_supported(uint16_t port_id, const char *pool);
-
-/**
- * Get the security context for the Ethernet device.
- *
- * @param port_id
- * Port identifier of the Ethernet device
- * @return
- * - NULL on error.
- * - pointer to security context on success.
- */
-void *
-rte_eth_dev_get_sec_ctx(uint8_t port_id);
-
-
-#include <rte_ethdev_core.h>
-
-/**
- *
- * Retrieve a burst of input packets from a receive queue of an Ethernet
- * device. The retrieved packets are stored in *rte_mbuf* structures whose
- * pointers are supplied in the *rx_pkts* array.
- *
- * The rte_eth_rx_burst() function loops, parsing the RX ring of the
- * receive queue, up to *nb_pkts* packets, and for each completed RX
- * descriptor in the ring, it performs the following operations:
- *
- * - Initialize the *rte_mbuf* data structure associated with the
- * RX descriptor according to the information provided by the NIC into
- * that RX descriptor.
- *
- * - Store the *rte_mbuf* data structure into the next entry of the
- * *rx_pkts* array.
- *
- * - Replenish the RX descriptor with a new *rte_mbuf* buffer
- * allocated from the memory pool associated with the receive queue at
- * initialization time.
- *
- * When retrieving an input packet that was scattered by the controller
- * into multiple receive descriptors, the rte_eth_rx_burst() function
- * appends the associated *rte_mbuf* buffers to the first buffer of the
- * packet.
- *
- * The rte_eth_rx_burst() function returns the number of packets
- * actually retrieved, which is the number of *rte_mbuf* data structures
- * effectively supplied into the *rx_pkts* array.
- * A return value equal to *nb_pkts* indicates that the RX queue contained
- * at least *rx_pkts* packets, and this is likely to signify that other
- * received packets remain in the input queue. Applications implementing
- * a "retrieve as much received packets as possible" policy can check this
- * specific case and keep invoking the rte_eth_rx_burst() function until
- * a value less than *nb_pkts* is returned.
- *
- * This receive method has the following advantages:
- *
- * - It allows a run-to-completion network stack engine to retrieve and
- * to immediately process received packets in a fast burst-oriented
- * approach, avoiding the overhead of unnecessary intermediate packet
- * queue/dequeue operations.
- *
- * - Conversely, it also allows an asynchronous-oriented processing
- * method to retrieve bursts of received packets and to immediately
- * queue them for further parallel processing by another logical core,
- * for instance. However, instead of having received packets being
- * individually queued by the driver, this approach allows the caller
- * of the rte_eth_rx_burst() function to queue a burst of retrieved
- * packets at a time and therefore dramatically reduce the cost of
- * enqueue/dequeue operations per packet.
- *
- * - It allows the rte_eth_rx_burst() function of the driver to take
- * advantage of burst-oriented hardware features (CPU cache,
- * prefetch instructions, and so on) to minimize the number of CPU
- * cycles per packet.
- *
- * To summarize, the proposed receive API enables many
- * burst-oriented optimizations in both synchronous and asynchronous
- * packet processing environments with no overhead in both cases.
- *
- * The rte_eth_rx_burst() function does not provide any error
- * notification to avoid the corresponding overhead. As a hint, the
- * upper-level application might check the status of the device link once
- * being systematically returned a 0 value for a given number of tries.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param queue_id
- * The index of the receive queue from which to retrieve input packets.
- * The value must be in the range [0, nb_rx_queue - 1] previously supplied
- * to rte_eth_dev_configure().
- * @param rx_pkts
- * The address of an array of pointers to *rte_mbuf* structures that
- * must be large enough to store *nb_pkts* pointers in it.
- * @param nb_pkts
- * The maximum number of packets to retrieve.
- * @return
- * The number of packets actually retrieved, which is the number
- * of pointers to *rte_mbuf* structures effectively supplied to the
- * *rx_pkts* array.
- */
-static inline uint16_t
-rte_eth_rx_burst(uint16_t port_id, uint16_t queue_id,
- struct rte_mbuf **rx_pkts, const uint16_t nb_pkts)
-{
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
-
-#ifdef RTE_LIBRTE_ETHDEV_DEBUG
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, 0);
- RTE_FUNC_PTR_OR_ERR_RET(*dev->rx_pkt_burst, 0);
-
- if (queue_id >= dev->data->nb_rx_queues) {
- RTE_PMD_DEBUG_TRACE("Invalid RX queue_id=%d\n", queue_id);
- return 0;
- }
-#endif
- int16_t nb_rx = (*dev->rx_pkt_burst)(dev->data->rx_queues[queue_id],
- rx_pkts, nb_pkts);
-
-#ifdef RTE_ETHDEV_RXTX_CALLBACKS
- struct rte_eth_rxtx_callback *cb = dev->post_rx_burst_cbs[queue_id];
-
- if (unlikely(cb != NULL)) {
- do {
- nb_rx = cb->fn.rx(port_id, queue_id, rx_pkts, nb_rx,
- nb_pkts, cb->param);
- cb = cb->next;
- } while (cb != NULL);
- }
-#endif
-
- return nb_rx;
-}
-
-/**
- * Get the number of used descriptors of a rx queue
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param queue_id
- * The queue id on the specific port.
- * @return
- * The number of used descriptors in the specific queue, or:
- * (-EINVAL) if *port_id* or *queue_id* is invalid
- * (-ENOTSUP) if the device does not support this function
- */
-static inline int
-rte_eth_rx_queue_count(uint16_t port_id, uint16_t queue_id)
-{
- struct rte_eth_dev *dev;
-
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -EINVAL);
- dev = &rte_eth_devices[port_id];
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rx_queue_count, -ENOTSUP);
- if (queue_id >= dev->data->nb_rx_queues)
- return -EINVAL;
-
- return (*dev->dev_ops->rx_queue_count)(dev, queue_id);
-}
-
-/**
- * Check if the DD bit of the specific RX descriptor in the queue has been set
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param queue_id
- * The queue id on the specific port.
- * @param offset
- * The offset of the descriptor ID from tail.
- * @return
- * - (1) if the specific DD bit is set.
- * - (0) if the specific DD bit is not set.
- * - (-ENODEV) if *port_id* invalid.
- * - (-ENOTSUP) if the device does not support this function
- */
-static inline int
-rte_eth_rx_descriptor_done(uint16_t port_id, uint16_t queue_id, uint16_t offset)
-{
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rx_descriptor_done, -ENOTSUP);
- return (*dev->dev_ops->rx_descriptor_done)( \
- dev->data->rx_queues[queue_id], offset);
-}
-
-#define RTE_ETH_RX_DESC_AVAIL 0 /**< Desc available for hw. */
-#define RTE_ETH_RX_DESC_DONE 1 /**< Desc done, filled by hw. */
-#define RTE_ETH_RX_DESC_UNAVAIL 2 /**< Desc used by driver or hw. */
-
-/**
- * Check the status of a Rx descriptor in the queue
- *
- * It should be called in a similar context than the Rx function:
- * - on a dataplane core
- * - not concurrently on the same queue
- *
- * Since it's a dataplane function, no check is performed on port_id and
- * queue_id. The caller must therefore ensure that the port is enabled
- * and the queue is configured and running.
- *
- * Note: accessing to a random descriptor in the ring may trigger cache
- * misses and have a performance impact.
- *
- * @param port_id
- * A valid port identifier of the Ethernet device which.
- * @param queue_id
- * A valid Rx queue identifier on this port.
- * @param offset
- * The offset of the descriptor starting from tail (0 is the next
- * packet to be received by the driver).
- *
- * @return
- * - (RTE_ETH_RX_DESC_AVAIL): Descriptor is available for the hardware to
- * receive a packet.
- * - (RTE_ETH_RX_DESC_DONE): Descriptor is done, it is filled by hw, but
- * not yet processed by the driver (i.e. in the receive queue).
- * - (RTE_ETH_RX_DESC_UNAVAIL): Descriptor is unavailable, either hold by
- * the driver and not yet returned to hw, or reserved by the hw.
- * - (-EINVAL) bad descriptor offset.
- * - (-ENOTSUP) if the device does not support this function.
- * - (-ENODEV) bad port or queue (only if compiled with debug).
- */
-static inline int
-rte_eth_rx_descriptor_status(uint16_t port_id, uint16_t queue_id,
- uint16_t offset)
-{
- struct rte_eth_dev *dev;
- void *rxq;
-
-#ifdef RTE_LIBRTE_ETHDEV_DEBUG
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
-#endif
- dev = &rte_eth_devices[port_id];
-#ifdef RTE_LIBRTE_ETHDEV_DEBUG
- if (queue_id >= dev->data->nb_rx_queues)
- return -ENODEV;
-#endif
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rx_descriptor_status, -ENOTSUP);
- rxq = dev->data->rx_queues[queue_id];
-
- return (*dev->dev_ops->rx_descriptor_status)(rxq, offset);
-}
-
-#define RTE_ETH_TX_DESC_FULL 0 /**< Desc filled for hw, waiting xmit. */
-#define RTE_ETH_TX_DESC_DONE 1 /**< Desc done, packet is transmitted. */
-#define RTE_ETH_TX_DESC_UNAVAIL 2 /**< Desc used by driver or hw. */
-
-/**
- * Check the status of a Tx descriptor in the queue.
- *
- * It should be called in a similar context than the Tx function:
- * - on a dataplane core
- * - not concurrently on the same queue
- *
- * Since it's a dataplane function, no check is performed on port_id and
- * queue_id. The caller must therefore ensure that the port is enabled
- * and the queue is configured and running.
- *
- * Note: accessing to a random descriptor in the ring may trigger cache
- * misses and have a performance impact.
- *
- * @param port_id
- * A valid port identifier of the Ethernet device which.
- * @param queue_id
- * A valid Tx queue identifier on this port.
- * @param offset
- * The offset of the descriptor starting from tail (0 is the place where
- * the next packet will be send).
- *
- * @return
- * - (RTE_ETH_TX_DESC_FULL) Descriptor is being processed by the hw, i.e.
- * in the transmit queue.
- * - (RTE_ETH_TX_DESC_DONE) Hardware is done with this descriptor, it can
- * be reused by the driver.
- * - (RTE_ETH_TX_DESC_UNAVAIL): Descriptor is unavailable, reserved by the
- * driver or the hardware.
- * - (-EINVAL) bad descriptor offset.
- * - (-ENOTSUP) if the device does not support this function.
- * - (-ENODEV) bad port or queue (only if compiled with debug).
- */
-static inline int rte_eth_tx_descriptor_status(uint16_t port_id,
- uint16_t queue_id, uint16_t offset)
-{
- struct rte_eth_dev *dev;
- void *txq;
-
-#ifdef RTE_LIBRTE_ETHDEV_DEBUG
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
-#endif
- dev = &rte_eth_devices[port_id];
-#ifdef RTE_LIBRTE_ETHDEV_DEBUG
- if (queue_id >= dev->data->nb_tx_queues)
- return -ENODEV;
-#endif
- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->tx_descriptor_status, -ENOTSUP);
- txq = dev->data->tx_queues[queue_id];
-
- return (*dev->dev_ops->tx_descriptor_status)(txq, offset);
-}
-
-/**
- * Send a burst of output packets on a transmit queue of an Ethernet device.
- *
- * The rte_eth_tx_burst() function is invoked to transmit output packets
- * on the output queue *queue_id* of the Ethernet device designated by its
- * *port_id*.
- * The *nb_pkts* parameter is the number of packets to send which are
- * supplied in the *tx_pkts* array of *rte_mbuf* structures, each of them
- * allocated from a pool created with rte_pktmbuf_pool_create().
- * The rte_eth_tx_burst() function loops, sending *nb_pkts* packets,
- * up to the number of transmit descriptors available in the TX ring of the
- * transmit queue.
- * For each packet to send, the rte_eth_tx_burst() function performs
- * the following operations:
- *
- * - Pick up the next available descriptor in the transmit ring.
- *
- * - Free the network buffer previously sent with that descriptor, if any.
- *
- * - Initialize the transmit descriptor with the information provided
- * in the *rte_mbuf data structure.
- *
- * In the case of a segmented packet composed of a list of *rte_mbuf* buffers,
- * the rte_eth_tx_burst() function uses several transmit descriptors
- * of the ring.
- *
- * The rte_eth_tx_burst() function returns the number of packets it
- * actually sent. A return value equal to *nb_pkts* means that all packets
- * have been sent, and this is likely to signify that other output packets
- * could be immediately transmitted again. Applications that implement a
- * "send as many packets to transmit as possible" policy can check this
- * specific case and keep invoking the rte_eth_tx_burst() function until
- * a value less than *nb_pkts* is returned.
- *
- * It is the responsibility of the rte_eth_tx_burst() function to
- * transparently free the memory buffers of packets previously sent.
- * This feature is driven by the *tx_free_thresh* value supplied to the
- * rte_eth_dev_configure() function at device configuration time.
- * When the number of free TX descriptors drops below this threshold, the
- * rte_eth_tx_burst() function must [attempt to] free the *rte_mbuf* buffers
- * of those packets whose transmission was effectively completed.
- *
- * If the PMD is DEV_TX_OFFLOAD_MT_LOCKFREE capable, multiple threads can
- * invoke this function concurrently on the same tx queue without SW lock.
- * @see rte_eth_dev_info_get, struct rte_eth_txconf::txq_flags
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param queue_id
- * The index of the transmit queue through which output packets must be
- * sent.
- * The value must be in the range [0, nb_tx_queue - 1] previously supplied
- * to rte_eth_dev_configure().
- * @param tx_pkts
- * The address of an array of *nb_pkts* pointers to *rte_mbuf* structures
- * which contain the output packets.
- * @param nb_pkts
- * The maximum number of packets to transmit.
- * @return
- * The number of output packets actually stored in transmit descriptors of
- * the transmit ring. The return value can be less than the value of the
- * *tx_pkts* parameter when the transmit ring is full or has been filled up.
- */
-static inline uint16_t
-rte_eth_tx_burst(uint16_t port_id, uint16_t queue_id,
- struct rte_mbuf **tx_pkts, uint16_t nb_pkts)
-{
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
-
-#ifdef RTE_LIBRTE_ETHDEV_DEBUG
- RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, 0);
- RTE_FUNC_PTR_OR_ERR_RET(*dev->tx_pkt_burst, 0);
-
- if (queue_id >= dev->data->nb_tx_queues) {
- RTE_PMD_DEBUG_TRACE("Invalid TX queue_id=%d\n", queue_id);
- return 0;
- }
-#endif
-
-#ifdef RTE_ETHDEV_RXTX_CALLBACKS
- struct rte_eth_rxtx_callback *cb = dev->pre_tx_burst_cbs[queue_id];
-
- if (unlikely(cb != NULL)) {
- do {
- nb_pkts = cb->fn.tx(port_id, queue_id, tx_pkts, nb_pkts,
- cb->param);
- cb = cb->next;
- } while (cb != NULL);
- }
-#endif
-
- return (*dev->tx_pkt_burst)(dev->data->tx_queues[queue_id], tx_pkts, nb_pkts);
-}
-
-/**
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice
- *
- * Process a burst of output packets on a transmit queue of an Ethernet device.
- *
- * The rte_eth_tx_prepare() function is invoked to prepare output packets to be
- * transmitted on the output queue *queue_id* of the Ethernet device designated
- * by its *port_id*.
- * The *nb_pkts* parameter is the number of packets to be prepared which are
- * supplied in the *tx_pkts* array of *rte_mbuf* structures, each of them
- * allocated from a pool created with rte_pktmbuf_pool_create().
- * For each packet to send, the rte_eth_tx_prepare() function performs
- * the following operations:
- *
- * - Check if packet meets devices requirements for tx offloads.
- *
- * - Check limitations about number of segments.
- *
- * - Check additional requirements when debug is enabled.
- *
- * - Update and/or reset required checksums when tx offload is set for packet.
- *
- * Since this function can modify packet data, provided mbufs must be safely
- * writable (e.g. modified data cannot be in shared segment).
- *
- * The rte_eth_tx_prepare() function returns the number of packets ready to be
- * sent. A return value equal to *nb_pkts* means that all packets are valid and
- * ready to be sent, otherwise stops processing on the first invalid packet and
- * leaves the rest packets untouched.
- *
- * When this functionality is not implemented in the driver, all packets are
- * are returned untouched.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * The value must be a valid port id.
- * @param queue_id
- * The index of the transmit queue through which output packets must be
- * sent.
- * The value must be in the range [0, nb_tx_queue - 1] previously supplied
- * to rte_eth_dev_configure().
- * @param tx_pkts
- * The address of an array of *nb_pkts* pointers to *rte_mbuf* structures
- * which contain the output packets.
- * @param nb_pkts
- * The maximum number of packets to process.
- * @return
- * The number of packets correct and ready to be sent. The return value can be
- * less than the value of the *tx_pkts* parameter when some packet doesn't
- * meet devices requirements with rte_errno set appropriately:
- * - -EINVAL: offload flags are not correctly set
- * - -ENOTSUP: the offload feature is not supported by the hardware
- *
- */
-
-#ifndef RTE_ETHDEV_TX_PREPARE_NOOP
-
-static inline uint16_t
-rte_eth_tx_prepare(uint16_t port_id, uint16_t queue_id,
- struct rte_mbuf **tx_pkts, uint16_t nb_pkts)
-{
- struct rte_eth_dev *dev;
-
-#ifdef RTE_LIBRTE_ETHDEV_DEBUG
- if (!rte_eth_dev_is_valid_port(port_id)) {
- RTE_PMD_DEBUG_TRACE("Invalid TX port_id=%d\n", port_id);
- rte_errno = -EINVAL;
- return 0;
- }
-#endif
-
- dev = &rte_eth_devices[port_id];
-
-#ifdef RTE_LIBRTE_ETHDEV_DEBUG
- if (queue_id >= dev->data->nb_tx_queues) {
- RTE_PMD_DEBUG_TRACE("Invalid TX queue_id=%d\n", queue_id);
- rte_errno = -EINVAL;
- return 0;
- }
-#endif
-
- if (!dev->tx_pkt_prepare)
- return nb_pkts;
-
- return (*dev->tx_pkt_prepare)(dev->data->tx_queues[queue_id],
- tx_pkts, nb_pkts);
-}
-
-#else
-
-/*
- * Native NOOP operation for compilation targets which doesn't require any
- * preparations steps, and functional NOOP may introduce unnecessary performance
- * drop.
- *
- * Generally this is not a good idea to turn it on globally and didn't should
- * be used if behavior of tx_preparation can change.
- */
-
-static inline uint16_t
-rte_eth_tx_prepare(__rte_unused uint16_t port_id,
- __rte_unused uint16_t queue_id,
- __rte_unused struct rte_mbuf **tx_pkts, uint16_t nb_pkts)
-{
- return nb_pkts;
-}
-
-#endif
-
-/**
- * Send any packets queued up for transmission on a port and HW queue
- *
- * This causes an explicit flush of packets previously buffered via the
- * rte_eth_tx_buffer() function. It returns the number of packets successfully
- * sent to the NIC, and calls the error callback for any unsent packets. Unless
- * explicitly set up otherwise, the default callback simply frees the unsent
- * packets back to the owning mempool.
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param queue_id
- * The index of the transmit queue through which output packets must be
- * sent.
- * The value must be in the range [0, nb_tx_queue - 1] previously supplied
- * to rte_eth_dev_configure().
- * @param buffer
- * Buffer of packets to be transmit.
- * @return
- * The number of packets successfully sent to the Ethernet device. The error
- * callback is called for any packets which could not be sent.
- */
-static inline uint16_t
-rte_eth_tx_buffer_flush(uint16_t port_id, uint16_t queue_id,
- struct rte_eth_dev_tx_buffer *buffer)
-{
- uint16_t sent;
- uint16_t to_send = buffer->length;
-
- if (to_send == 0)
- return 0;
-
- sent = rte_eth_tx_burst(port_id, queue_id, buffer->pkts, to_send);
-
- buffer->length = 0;
-
- /* All packets sent, or to be dealt with by callback below */
- if (unlikely(sent != to_send))
- buffer->error_callback(&buffer->pkts[sent], to_send - sent,
- buffer->error_userdata);
-
- return sent;
-}
-
-/**
- * Buffer a single packet for future transmission on a port and queue
- *
- * This function takes a single mbuf/packet and buffers it for later
- * transmission on the particular port and queue specified. Once the buffer is
- * full of packets, an attempt will be made to transmit all the buffered
- * packets. In case of error, where not all packets can be transmitted, a
- * callback is called with the unsent packets as a parameter. If no callback
- * is explicitly set up, the unsent packets are just freed back to the owning
- * mempool. The function returns the number of packets actually sent i.e.
- * 0 if no buffer flush occurred, otherwise the number of packets successfully
- * flushed
- *
- * @param port_id
- * The port identifier of the Ethernet device.
- * @param queue_id
- * The index of the transmit queue through which output packets must be
- * sent.
- * The value must be in the range [0, nb_tx_queue - 1] previously supplied
- * to rte_eth_dev_configure().
- * @param buffer
- * Buffer used to collect packets to be sent.
- * @param tx_pkt
- * Pointer to the packet mbuf to be sent.
- * @return
- * 0 = packet has been buffered for later transmission
- * N > 0 = packet has been buffered, and the buffer was subsequently flushed,
- * causing N packets to be sent, and the error callback to be called for
- * the rest.
- */
-static __rte_always_inline uint16_t
-rte_eth_tx_buffer(uint16_t port_id, uint16_t queue_id,
- struct rte_eth_dev_tx_buffer *buffer, struct rte_mbuf *tx_pkt)
-{
- buffer->pkts[buffer->length++] = tx_pkt;
- if (buffer->length < buffer->size)
- return 0;
-
- return rte_eth_tx_buffer_flush(port_id, queue_id, buffer);
-}
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _RTE_ETHDEV_H_ */
diff --git a/lib/librte_ether/rte_ethdev_core.h b/lib/librte_ether/rte_ethdev_core.h
deleted file mode 100644
index e5681e46..00000000
--- a/lib/librte_ether/rte_ethdev_core.h
+++ /dev/null
@@ -1,613 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2017 Intel Corporation
- */
-
-#ifndef _RTE_ETHDEV_CORE_H_
-#define _RTE_ETHDEV_CORE_H_
-
-/**
- * @file
- *
- * RTE Ethernet Device internal header.
- *
- * This header contains internal data types. But they are still part of the
- * public API because they are used by inline functions in the published API.
- *
- * Applications should not use these directly.
- *
- */
-
-struct rte_eth_dev_callback;
-/** @internal Structure to keep track of registered callbacks */
-TAILQ_HEAD(rte_eth_dev_cb_list, rte_eth_dev_callback);
-
-/*
- * Definitions of all functions exported by an Ethernet driver through the
- * the generic structure of type *eth_dev_ops* supplied in the *rte_eth_dev*
- * structure associated with an Ethernet device.
- */
-struct rte_eth_dev;
-
-typedef int (*eth_dev_configure_t)(struct rte_eth_dev *dev);
-/**< @internal Ethernet device configuration. */
-
-typedef int (*eth_dev_start_t)(struct rte_eth_dev *dev);
-/**< @internal Function used to start a configured Ethernet device. */
-
-typedef void (*eth_dev_stop_t)(struct rte_eth_dev *dev);
-/**< @internal Function used to stop a configured Ethernet device. */
-
-typedef int (*eth_dev_set_link_up_t)(struct rte_eth_dev *dev);
-/**< @internal Function used to link up a configured Ethernet device. */
-
-typedef int (*eth_dev_set_link_down_t)(struct rte_eth_dev *dev);
-/**< @internal Function used to link down a configured Ethernet device. */
-
-typedef void (*eth_dev_close_t)(struct rte_eth_dev *dev);
-/**< @internal Function used to close a configured Ethernet device. */
-
-typedef int (*eth_dev_reset_t)(struct rte_eth_dev *dev);
-/** <@internal Function used to reset a configured Ethernet device. */
-
-typedef int (*eth_is_removed_t)(struct rte_eth_dev *dev);
-/**< @internal Function used to detect an Ethernet device removal. */
-
-typedef void (*eth_promiscuous_enable_t)(struct rte_eth_dev *dev);
-/**< @internal Function used to enable the RX promiscuous mode of an Ethernet device. */
-
-typedef void (*eth_promiscuous_disable_t)(struct rte_eth_dev *dev);
-/**< @internal Function used to disable the RX promiscuous mode of an Ethernet device. */
-
-typedef void (*eth_allmulticast_enable_t)(struct rte_eth_dev *dev);
-/**< @internal Enable the receipt of all multicast packets by an Ethernet device. */
-
-typedef void (*eth_allmulticast_disable_t)(struct rte_eth_dev *dev);
-/**< @internal Disable the receipt of all multicast packets by an Ethernet device. */
-
-typedef int (*eth_link_update_t)(struct rte_eth_dev *dev,
- int wait_to_complete);
-/**< @internal Get link speed, duplex mode and state (up/down) of an Ethernet device. */
-
-typedef int (*eth_stats_get_t)(struct rte_eth_dev *dev,
- struct rte_eth_stats *igb_stats);
-/**< @internal Get global I/O statistics of an Ethernet device. */
-
-typedef void (*eth_stats_reset_t)(struct rte_eth_dev *dev);
-/**< @internal Reset global I/O statistics of an Ethernet device to 0. */
-
-typedef int (*eth_xstats_get_t)(struct rte_eth_dev *dev,
- struct rte_eth_xstat *stats, unsigned n);
-/**< @internal Get extended stats of an Ethernet device. */
-
-typedef int (*eth_xstats_get_by_id_t)(struct rte_eth_dev *dev,
- const uint64_t *ids,
- uint64_t *values,
- unsigned int n);
-/**< @internal Get extended stats of an Ethernet device. */
-
-typedef void (*eth_xstats_reset_t)(struct rte_eth_dev *dev);
-/**< @internal Reset extended stats of an Ethernet device. */
-
-typedef int (*eth_xstats_get_names_t)(struct rte_eth_dev *dev,
- struct rte_eth_xstat_name *xstats_names, unsigned size);
-/**< @internal Get names of extended stats of an Ethernet device. */
-
-typedef int (*eth_xstats_get_names_by_id_t)(struct rte_eth_dev *dev,
- struct rte_eth_xstat_name *xstats_names, const uint64_t *ids,
- unsigned int size);
-/**< @internal Get names of extended stats of an Ethernet device. */
-
-typedef int (*eth_queue_stats_mapping_set_t)(struct rte_eth_dev *dev,
- uint16_t queue_id,
- uint8_t stat_idx,
- uint8_t is_rx);
-/**< @internal Set a queue statistics mapping for a tx/rx queue of an Ethernet device. */
-
-typedef void (*eth_dev_infos_get_t)(struct rte_eth_dev *dev,
- struct rte_eth_dev_info *dev_info);
-/**< @internal Get specific informations of an Ethernet device. */
-
-typedef const uint32_t *(*eth_dev_supported_ptypes_get_t)(struct rte_eth_dev *dev);
-/**< @internal Get supported ptypes of an Ethernet device. */
-
-typedef int (*eth_queue_start_t)(struct rte_eth_dev *dev,
- uint16_t queue_id);
-/**< @internal Start rx and tx of a queue of an Ethernet device. */
-
-typedef int (*eth_queue_stop_t)(struct rte_eth_dev *dev,
- uint16_t queue_id);
-/**< @internal Stop rx and tx of a queue of an Ethernet device. */
-
-typedef int (*eth_rx_queue_setup_t)(struct rte_eth_dev *dev,
- uint16_t rx_queue_id,
- uint16_t nb_rx_desc,
- unsigned int socket_id,
- const struct rte_eth_rxconf *rx_conf,
- struct rte_mempool *mb_pool);
-/**< @internal Set up a receive queue of an Ethernet device. */
-
-typedef int (*eth_tx_queue_setup_t)(struct rte_eth_dev *dev,
- uint16_t tx_queue_id,
- uint16_t nb_tx_desc,
- unsigned int socket_id,
- const struct rte_eth_txconf *tx_conf);
-/**< @internal Setup a transmit queue of an Ethernet device. */
-
-typedef int (*eth_rx_enable_intr_t)(struct rte_eth_dev *dev,
- uint16_t rx_queue_id);
-/**< @internal Enable interrupt of a receive queue of an Ethernet device. */
-
-typedef int (*eth_rx_disable_intr_t)(struct rte_eth_dev *dev,
- uint16_t rx_queue_id);
-/**< @internal Disable interrupt of a receive queue of an Ethernet device. */
-
-typedef void (*eth_queue_release_t)(void *queue);
-/**< @internal Release memory resources allocated by given RX/TX queue. */
-
-typedef uint32_t (*eth_rx_queue_count_t)(struct rte_eth_dev *dev,
- uint16_t rx_queue_id);
-/**< @internal Get number of used descriptors on a receive queue. */
-
-typedef int (*eth_rx_descriptor_done_t)(void *rxq, uint16_t offset);
-/**< @internal Check DD bit of specific RX descriptor */
-
-typedef int (*eth_rx_descriptor_status_t)(void *rxq, uint16_t offset);
-/**< @internal Check the status of a Rx descriptor */
-
-typedef int (*eth_tx_descriptor_status_t)(void *txq, uint16_t offset);
-/**< @internal Check the status of a Tx descriptor */
-
-typedef int (*eth_fw_version_get_t)(struct rte_eth_dev *dev,
- char *fw_version, size_t fw_size);
-/**< @internal Get firmware information of an Ethernet device. */
-
-typedef int (*eth_tx_done_cleanup_t)(void *txq, uint32_t free_cnt);
-/**< @internal Force mbufs to be from TX ring. */
-
-typedef void (*eth_rxq_info_get_t)(struct rte_eth_dev *dev,
- uint16_t rx_queue_id, struct rte_eth_rxq_info *qinfo);
-
-typedef void (*eth_txq_info_get_t)(struct rte_eth_dev *dev,
- uint16_t tx_queue_id, struct rte_eth_txq_info *qinfo);
-
-typedef int (*mtu_set_t)(struct rte_eth_dev *dev, uint16_t mtu);
-/**< @internal Set MTU. */
-
-typedef int (*vlan_filter_set_t)(struct rte_eth_dev *dev,
- uint16_t vlan_id,
- int on);
-/**< @internal filtering of a VLAN Tag Identifier by an Ethernet device. */
-
-typedef int (*vlan_tpid_set_t)(struct rte_eth_dev *dev,
- enum rte_vlan_type type, uint16_t tpid);
-/**< @internal set the outer/inner VLAN-TPID by an Ethernet device. */
-
-typedef int (*vlan_offload_set_t)(struct rte_eth_dev *dev, int mask);
-/**< @internal set VLAN offload function by an Ethernet device. */
-
-typedef int (*vlan_pvid_set_t)(struct rte_eth_dev *dev,
- uint16_t vlan_id,
- int on);
-/**< @internal set port based TX VLAN insertion by an Ethernet device. */
-
-typedef void (*vlan_strip_queue_set_t)(struct rte_eth_dev *dev,
- uint16_t rx_queue_id,
- int on);
-/**< @internal VLAN stripping enable/disable by an queue of Ethernet device. */
-
-typedef uint16_t (*eth_rx_burst_t)(void *rxq,
- struct rte_mbuf **rx_pkts,
- uint16_t nb_pkts);
-/**< @internal Retrieve input packets from a receive queue of an Ethernet device. */
-
-typedef uint16_t (*eth_tx_burst_t)(void *txq,
- struct rte_mbuf **tx_pkts,
- uint16_t nb_pkts);
-/**< @internal Send output packets on a transmit queue of an Ethernet device. */
-
-typedef uint16_t (*eth_tx_prep_t)(void *txq,
- struct rte_mbuf **tx_pkts,
- uint16_t nb_pkts);
-/**< @internal Prepare output packets on a transmit queue of an Ethernet device. */
-
-typedef int (*flow_ctrl_get_t)(struct rte_eth_dev *dev,
- struct rte_eth_fc_conf *fc_conf);
-/**< @internal Get current flow control parameter on an Ethernet device */
-
-typedef int (*flow_ctrl_set_t)(struct rte_eth_dev *dev,
- struct rte_eth_fc_conf *fc_conf);
-/**< @internal Setup flow control parameter on an Ethernet device */
-
-typedef int (*priority_flow_ctrl_set_t)(struct rte_eth_dev *dev,
- struct rte_eth_pfc_conf *pfc_conf);
-/**< @internal Setup priority flow control parameter on an Ethernet device */
-
-typedef int (*reta_update_t)(struct rte_eth_dev *dev,
- struct rte_eth_rss_reta_entry64 *reta_conf,
- uint16_t reta_size);
-/**< @internal Update RSS redirection table on an Ethernet device */
-
-typedef int (*reta_query_t)(struct rte_eth_dev *dev,
- struct rte_eth_rss_reta_entry64 *reta_conf,
- uint16_t reta_size);
-/**< @internal Query RSS redirection table on an Ethernet device */
-
-typedef int (*rss_hash_update_t)(struct rte_eth_dev *dev,
- struct rte_eth_rss_conf *rss_conf);
-/**< @internal Update RSS hash configuration of an Ethernet device */
-
-typedef int (*rss_hash_conf_get_t)(struct rte_eth_dev *dev,
- struct rte_eth_rss_conf *rss_conf);
-/**< @internal Get current RSS hash configuration of an Ethernet device */
-
-typedef int (*eth_dev_led_on_t)(struct rte_eth_dev *dev);
-/**< @internal Turn on SW controllable LED on an Ethernet device */
-
-typedef int (*eth_dev_led_off_t)(struct rte_eth_dev *dev);
-/**< @internal Turn off SW controllable LED on an Ethernet device */
-
-typedef void (*eth_mac_addr_remove_t)(struct rte_eth_dev *dev, uint32_t index);
-/**< @internal Remove MAC address from receive address register */
-
-typedef int (*eth_mac_addr_add_t)(struct rte_eth_dev *dev,
- struct ether_addr *mac_addr,
- uint32_t index,
- uint32_t vmdq);
-/**< @internal Set a MAC address into Receive Address Address Register */
-
-typedef void (*eth_mac_addr_set_t)(struct rte_eth_dev *dev,
- struct ether_addr *mac_addr);
-/**< @internal Set a MAC address into Receive Address Address Register */
-
-typedef int (*eth_uc_hash_table_set_t)(struct rte_eth_dev *dev,
- struct ether_addr *mac_addr,
- uint8_t on);
-/**< @internal Set a Unicast Hash bitmap */
-
-typedef int (*eth_uc_all_hash_table_set_t)(struct rte_eth_dev *dev,
- uint8_t on);
-/**< @internal Set all Unicast Hash bitmap */
-
-typedef int (*eth_set_queue_rate_limit_t)(struct rte_eth_dev *dev,
- uint16_t queue_idx,
- uint16_t tx_rate);
-/**< @internal Set queue TX rate */
-
-typedef int (*eth_mirror_rule_set_t)(struct rte_eth_dev *dev,
- struct rte_eth_mirror_conf *mirror_conf,
- uint8_t rule_id,
- uint8_t on);
-/**< @internal Add a traffic mirroring rule on an Ethernet device */
-
-typedef int (*eth_mirror_rule_reset_t)(struct rte_eth_dev *dev,
- uint8_t rule_id);
-/**< @internal Remove a traffic mirroring rule on an Ethernet device */
-
-typedef int (*eth_udp_tunnel_port_add_t)(struct rte_eth_dev *dev,
- struct rte_eth_udp_tunnel *tunnel_udp);
-/**< @internal Add tunneling UDP port */
-
-typedef int (*eth_udp_tunnel_port_del_t)(struct rte_eth_dev *dev,
- struct rte_eth_udp_tunnel *tunnel_udp);
-/**< @internal Delete tunneling UDP port */
-
-typedef int (*eth_set_mc_addr_list_t)(struct rte_eth_dev *dev,
- struct ether_addr *mc_addr_set,
- uint32_t nb_mc_addr);
-/**< @internal set the list of multicast addresses on an Ethernet device */
-
-typedef int (*eth_timesync_enable_t)(struct rte_eth_dev *dev);
-/**< @internal Function used to enable IEEE1588/802.1AS timestamping. */
-
-typedef int (*eth_timesync_disable_t)(struct rte_eth_dev *dev);
-/**< @internal Function used to disable IEEE1588/802.1AS timestamping. */
-
-typedef int (*eth_timesync_read_rx_timestamp_t)(struct rte_eth_dev *dev,
- struct timespec *timestamp,
- uint32_t flags);
-/**< @internal Function used to read an RX IEEE1588/802.1AS timestamp. */
-
-typedef int (*eth_timesync_read_tx_timestamp_t)(struct rte_eth_dev *dev,
- struct timespec *timestamp);
-/**< @internal Function used to read a TX IEEE1588/802.1AS timestamp. */
-
-typedef int (*eth_timesync_adjust_time)(struct rte_eth_dev *dev, int64_t);
-/**< @internal Function used to adjust the device clock */
-
-typedef int (*eth_timesync_read_time)(struct rte_eth_dev *dev,
- struct timespec *timestamp);
-/**< @internal Function used to get time from the device clock. */
-
-typedef int (*eth_timesync_write_time)(struct rte_eth_dev *dev,
- const struct timespec *timestamp);
-/**< @internal Function used to get time from the device clock */
-
-typedef int (*eth_get_reg_t)(struct rte_eth_dev *dev,
- struct rte_dev_reg_info *info);
-/**< @internal Retrieve registers */
-
-typedef int (*eth_get_eeprom_length_t)(struct rte_eth_dev *dev);
-/**< @internal Retrieve eeprom size */
-
-typedef int (*eth_get_eeprom_t)(struct rte_eth_dev *dev,
- struct rte_dev_eeprom_info *info);
-/**< @internal Retrieve eeprom data */
-
-typedef int (*eth_set_eeprom_t)(struct rte_eth_dev *dev,
- struct rte_dev_eeprom_info *info);
-/**< @internal Program eeprom data */
-
-typedef int (*eth_l2_tunnel_eth_type_conf_t)
- (struct rte_eth_dev *dev, struct rte_eth_l2_tunnel_conf *l2_tunnel);
-/**< @internal config l2 tunnel ether type */
-
-typedef int (*eth_l2_tunnel_offload_set_t)
- (struct rte_eth_dev *dev,
- struct rte_eth_l2_tunnel_conf *l2_tunnel,
- uint32_t mask,
- uint8_t en);
-/**< @internal enable/disable the l2 tunnel offload functions */
-
-
-typedef int (*eth_filter_ctrl_t)(struct rte_eth_dev *dev,
- enum rte_filter_type filter_type,
- enum rte_filter_op filter_op,
- void *arg);
-/**< @internal Take operations to assigned filter type on an Ethernet device */
-
-typedef int (*eth_tm_ops_get_t)(struct rte_eth_dev *dev, void *ops);
-/**< @internal Get Traffic Management (TM) operations on an Ethernet device */
-
-typedef int (*eth_mtr_ops_get_t)(struct rte_eth_dev *dev, void *ops);
-/**< @internal Get Trafffic Metering and Policing (MTR) operations */
-
-typedef int (*eth_get_dcb_info)(struct rte_eth_dev *dev,
- struct rte_eth_dcb_info *dcb_info);
-/**< @internal Get dcb information on an Ethernet device */
-
-typedef int (*eth_pool_ops_supported_t)(struct rte_eth_dev *dev,
- const char *pool);
-/**< @internal Test if a port supports specific mempool ops */
-
-/**
- * @internal A structure containing the functions exported by an Ethernet driver.
- */
-struct eth_dev_ops {
- eth_dev_configure_t dev_configure; /**< Configure device. */
- eth_dev_start_t dev_start; /**< Start device. */
- eth_dev_stop_t dev_stop; /**< Stop device. */
- eth_dev_set_link_up_t dev_set_link_up; /**< Device link up. */
- eth_dev_set_link_down_t dev_set_link_down; /**< Device link down. */
- eth_dev_close_t dev_close; /**< Close device. */
- eth_dev_reset_t dev_reset; /**< Reset device. */
- eth_link_update_t link_update; /**< Get device link state. */
- eth_is_removed_t is_removed;
- /**< Check if the device was physically removed. */
-
- eth_promiscuous_enable_t promiscuous_enable; /**< Promiscuous ON. */
- eth_promiscuous_disable_t promiscuous_disable;/**< Promiscuous OFF. */
- eth_allmulticast_enable_t allmulticast_enable;/**< RX multicast ON. */
- eth_allmulticast_disable_t allmulticast_disable;/**< RX multicast OFF. */
- eth_mac_addr_remove_t mac_addr_remove; /**< Remove MAC address. */
- eth_mac_addr_add_t mac_addr_add; /**< Add a MAC address. */
- eth_mac_addr_set_t mac_addr_set; /**< Set a MAC address. */
- eth_set_mc_addr_list_t set_mc_addr_list; /**< set list of mcast addrs. */
- mtu_set_t mtu_set; /**< Set MTU. */
-
- eth_stats_get_t stats_get; /**< Get generic device statistics. */
- eth_stats_reset_t stats_reset; /**< Reset generic device statistics. */
- eth_xstats_get_t xstats_get; /**< Get extended device statistics. */
- eth_xstats_reset_t xstats_reset; /**< Reset extended device statistics. */
- eth_xstats_get_names_t xstats_get_names;
- /**< Get names of extended statistics. */
- eth_queue_stats_mapping_set_t queue_stats_mapping_set;
- /**< Configure per queue stat counter mapping. */
-
- eth_dev_infos_get_t dev_infos_get; /**< Get device info. */
- eth_rxq_info_get_t rxq_info_get; /**< retrieve RX queue information. */
- eth_txq_info_get_t txq_info_get; /**< retrieve TX queue information. */
- eth_fw_version_get_t fw_version_get; /**< Get firmware version. */
- eth_dev_supported_ptypes_get_t dev_supported_ptypes_get;
- /**< Get packet types supported and identified by device. */
-
- vlan_filter_set_t vlan_filter_set; /**< Filter VLAN Setup. */
- vlan_tpid_set_t vlan_tpid_set; /**< Outer/Inner VLAN TPID Setup. */
- vlan_strip_queue_set_t vlan_strip_queue_set; /**< VLAN Stripping on queue. */
- vlan_offload_set_t vlan_offload_set; /**< Set VLAN Offload. */
- vlan_pvid_set_t vlan_pvid_set; /**< Set port based TX VLAN insertion. */
-
- eth_queue_start_t rx_queue_start;/**< Start RX for a queue. */
- eth_queue_stop_t rx_queue_stop; /**< Stop RX for a queue. */
- eth_queue_start_t tx_queue_start;/**< Start TX for a queue. */
- eth_queue_stop_t tx_queue_stop; /**< Stop TX for a queue. */
- eth_rx_queue_setup_t rx_queue_setup;/**< Set up device RX queue. */
- eth_queue_release_t rx_queue_release; /**< Release RX queue. */
- eth_rx_queue_count_t rx_queue_count;
- /**< Get the number of used RX descriptors. */
- eth_rx_descriptor_done_t rx_descriptor_done; /**< Check rxd DD bit. */
- eth_rx_descriptor_status_t rx_descriptor_status;
- /**< Check the status of a Rx descriptor. */
- eth_tx_descriptor_status_t tx_descriptor_status;
- /**< Check the status of a Tx descriptor. */
- eth_rx_enable_intr_t rx_queue_intr_enable; /**< Enable Rx queue interrupt. */
- eth_rx_disable_intr_t rx_queue_intr_disable; /**< Disable Rx queue interrupt. */
- eth_tx_queue_setup_t tx_queue_setup;/**< Set up device TX queue. */
- eth_queue_release_t tx_queue_release; /**< Release TX queue. */
- eth_tx_done_cleanup_t tx_done_cleanup;/**< Free tx ring mbufs */
-
- eth_dev_led_on_t dev_led_on; /**< Turn on LED. */
- eth_dev_led_off_t dev_led_off; /**< Turn off LED. */
-
- flow_ctrl_get_t flow_ctrl_get; /**< Get flow control. */
- flow_ctrl_set_t flow_ctrl_set; /**< Setup flow control. */
- priority_flow_ctrl_set_t priority_flow_ctrl_set; /**< Setup priority flow control. */
-
- eth_uc_hash_table_set_t uc_hash_table_set; /**< Set Unicast Table Array. */
- eth_uc_all_hash_table_set_t uc_all_hash_table_set; /**< Set Unicast hash bitmap. */
-
- eth_mirror_rule_set_t mirror_rule_set; /**< Add a traffic mirror rule. */
- eth_mirror_rule_reset_t mirror_rule_reset; /**< reset a traffic mirror rule. */
-
- eth_udp_tunnel_port_add_t udp_tunnel_port_add; /** Add UDP tunnel port. */
- eth_udp_tunnel_port_del_t udp_tunnel_port_del; /** Del UDP tunnel port. */
- eth_l2_tunnel_eth_type_conf_t l2_tunnel_eth_type_conf;
- /** Config ether type of l2 tunnel. */
- eth_l2_tunnel_offload_set_t l2_tunnel_offload_set;
- /** Enable/disable l2 tunnel offload functions. */
-
- eth_set_queue_rate_limit_t set_queue_rate_limit; /**< Set queue rate limit. */
-
- rss_hash_update_t rss_hash_update; /** Configure RSS hash protocols. */
- rss_hash_conf_get_t rss_hash_conf_get; /** Get current RSS hash configuration. */
- reta_update_t reta_update; /** Update redirection table. */
- reta_query_t reta_query; /** Query redirection table. */
-
- eth_get_reg_t get_reg; /**< Get registers. */
- eth_get_eeprom_length_t get_eeprom_length; /**< Get eeprom length. */
- eth_get_eeprom_t get_eeprom; /**< Get eeprom data. */
- eth_set_eeprom_t set_eeprom; /**< Set eeprom. */
-
-
- eth_filter_ctrl_t filter_ctrl; /**< common filter control. */
-
- eth_get_dcb_info get_dcb_info; /** Get DCB information. */
-
- eth_timesync_enable_t timesync_enable;
- /** Turn IEEE1588/802.1AS timestamping on. */
- eth_timesync_disable_t timesync_disable;
- /** Turn IEEE1588/802.1AS timestamping off. */
- eth_timesync_read_rx_timestamp_t timesync_read_rx_timestamp;
- /** Read the IEEE1588/802.1AS RX timestamp. */
- eth_timesync_read_tx_timestamp_t timesync_read_tx_timestamp;
- /** Read the IEEE1588/802.1AS TX timestamp. */
- eth_timesync_adjust_time timesync_adjust_time; /** Adjust the device clock. */
- eth_timesync_read_time timesync_read_time; /** Get the device clock time. */
- eth_timesync_write_time timesync_write_time; /** Set the device clock time. */
-
- eth_xstats_get_by_id_t xstats_get_by_id;
- /**< Get extended device statistic values by ID. */
- eth_xstats_get_names_by_id_t xstats_get_names_by_id;
- /**< Get name of extended device statistics by ID. */
-
- eth_tm_ops_get_t tm_ops_get;
- /**< Get Traffic Management (TM) operations. */
-
- eth_mtr_ops_get_t mtr_ops_get;
- /**< Get Traffic Metering and Policing (MTR) operations. */
-
- eth_pool_ops_supported_t pool_ops_supported;
- /**< Test if a port supports specific mempool ops */
-};
-
-/**
- * @internal
- * Structure used to hold information about the callbacks to be called for a
- * queue on RX and TX.
- */
-struct rte_eth_rxtx_callback {
- struct rte_eth_rxtx_callback *next;
- union{
- rte_rx_callback_fn rx;
- rte_tx_callback_fn tx;
- } fn;
- void *param;
-};
-
-/**
- * @internal
- * The generic data structure associated with each ethernet device.
- *
- * Pointers to burst-oriented packet receive and transmit functions are
- * located at the beginning of the structure, along with the pointer to
- * where all the data elements for the particular device are stored in shared
- * memory. This split allows the function pointer and driver data to be per-
- * process, while the actual configuration data for the device is shared.
- */
-struct rte_eth_dev {
- eth_rx_burst_t rx_pkt_burst; /**< Pointer to PMD receive function. */
- eth_tx_burst_t tx_pkt_burst; /**< Pointer to PMD transmit function. */
- eth_tx_prep_t tx_pkt_prepare; /**< Pointer to PMD transmit prepare function. */
- struct rte_eth_dev_data *data; /**< Pointer to device data */
- const struct eth_dev_ops *dev_ops; /**< Functions exported by PMD */
- struct rte_device *device; /**< Backing device */
- struct rte_intr_handle *intr_handle; /**< Device interrupt handle */
- /** User application callbacks for NIC interrupts */
- struct rte_eth_dev_cb_list link_intr_cbs;
- /**
- * User-supplied functions called from rx_burst to post-process
- * received packets before passing them to the user
- */
- struct rte_eth_rxtx_callback *post_rx_burst_cbs[RTE_MAX_QUEUES_PER_PORT];
- /**
- * User-supplied functions called from tx_burst to pre-process
- * received packets before passing them to the driver for transmission.
- */
- struct rte_eth_rxtx_callback *pre_tx_burst_cbs[RTE_MAX_QUEUES_PER_PORT];
- enum rte_eth_dev_state state; /**< Flag indicating the port state */
- void *security_ctx; /**< Context for security ops */
-} __rte_cache_aligned;
-
-struct rte_eth_dev_sriov;
-struct rte_eth_dev_owner;
-
-/**
- * @internal
- * The data part, with no function pointers, associated with each ethernet device.
- *
- * This structure is safe to place in shared memory to be common among different
- * processes in a multi-process configuration.
- */
-struct rte_eth_dev_data {
- char name[RTE_ETH_NAME_MAX_LEN]; /**< Unique identifier name */
-
- void **rx_queues; /**< Array of pointers to RX queues. */
- void **tx_queues; /**< Array of pointers to TX queues. */
- uint16_t nb_rx_queues; /**< Number of RX queues. */
- uint16_t nb_tx_queues; /**< Number of TX queues. */
-
- struct rte_eth_dev_sriov sriov; /**< SRIOV data */
-
- void *dev_private; /**< PMD-specific private data */
-
- struct rte_eth_link dev_link;
- /**< Link-level information & status */
-
- struct rte_eth_conf dev_conf; /**< Configuration applied to device. */
- uint16_t mtu; /**< Maximum Transmission Unit. */
-
- uint32_t min_rx_buf_size;
- /**< Common rx buffer size handled by all queues */
-
- uint64_t rx_mbuf_alloc_failed; /**< RX ring mbuf allocation failures. */
- struct ether_addr* mac_addrs;/**< Device Ethernet Link address. */
- uint64_t mac_pool_sel[ETH_NUM_RECEIVE_MAC_ADDR];
- /** bitmap array of associating Ethernet MAC addresses to pools */
- struct ether_addr* hash_mac_addrs;
- /** Device Ethernet MAC addresses of hash filtering. */
- uint16_t port_id; /**< Device [external] port identifier. */
- __extension__
- uint8_t promiscuous : 1, /**< RX promiscuous mode ON(1) / OFF(0). */
- scattered_rx : 1, /**< RX of scattered packets is ON(1) / OFF(0) */
- all_multicast : 1, /**< RX all multicast mode ON(1) / OFF(0). */
- dev_started : 1, /**< Device state: STARTED(1) / STOPPED(0). */
- lro : 1; /**< RX LRO is ON(1) / OFF(0) */
- uint8_t rx_queue_state[RTE_MAX_QUEUES_PER_PORT];
- /** Queues state: STARTED(1) / STOPPED(0) */
- uint8_t tx_queue_state[RTE_MAX_QUEUES_PER_PORT];
- /** Queues state: STARTED(1) / STOPPED(0) */
- uint32_t dev_flags; /**< Capabilities */
- enum rte_kernel_driver kdrv; /**< Kernel driver passthrough */
- int numa_node; /**< NUMA node connection */
- struct rte_vlan_filter_conf vlan_filter_conf;
- /**< VLAN filter configuration. */
- struct rte_eth_dev_owner owner; /**< The port owner. */
-} __rte_cache_aligned;
-
-/**
- * @internal
- * The pool of *rte_eth_dev* structures. The size of the pool
- * is configured at compile-time in the <rte_ethdev.c> file.
- */
-extern struct rte_eth_dev rte_eth_devices[];
-
-#endif /* _RTE_ETHDEV_CORE_H_ */
diff --git a/lib/librte_ether/rte_ethdev_driver.h b/lib/librte_ether/rte_ethdev_driver.h
deleted file mode 100644
index 45f08c65..00000000
--- a/lib/librte_ether/rte_ethdev_driver.h
+++ /dev/null
@@ -1,132 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2017 Intel Corporation
- */
-
-#ifndef _RTE_ETHDEV_DRIVER_H_
-#define _RTE_ETHDEV_DRIVER_H_
-
-/**
- * @file
- *
- * RTE Ethernet Device PMD API
- *
- * These APIs for the use from Ethernet drivers, user applications shouldn't
- * use them.
- *
- */
-
-#include <rte_ethdev.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * @internal
- * Returns a ethdev slot specified by the unique identifier name.
- *
- * @param name
- * The pointer to the Unique identifier name for each Ethernet device
- * @return
- * - The pointer to the ethdev slot, on success. NULL on error
- */
-struct rte_eth_dev *rte_eth_dev_allocated(const char *name);
-
-/**
- * @internal
- * Allocates a new ethdev slot for an ethernet device and returns the pointer
- * to that slot for the driver to use.
- *
- * @param name Unique identifier name for each Ethernet device
- * @param type Device type of this Ethernet device
- * @return
- * - Slot in the rte_dev_devices array for a new device;
- */
-struct rte_eth_dev *rte_eth_dev_allocate(const char *name);
-
-/**
- * @internal
- * Attach to the ethdev already initialized by the primary
- * process.
- *
- * @param name Ethernet device's name.
- * @return
- * - Success: Slot in the rte_dev_devices array for attached
- * device.
- * - Error: Null pointer.
- */
-struct rte_eth_dev *rte_eth_dev_attach_secondary(const char *name);
-
-/**
- * @internal
- * Release the specified ethdev port.
- *
- * @param eth_dev
- * The *eth_dev* pointer is the address of the *rte_eth_dev* structure.
- * @return
- * - 0 on success, negative on error
- */
-int rte_eth_dev_release_port(struct rte_eth_dev *eth_dev);
-
-/**
- * @internal
- * Release device queues and clear its configuration to force the user
- * application to reconfigure it. It is for internal use only.
- *
- * @param dev
- * Pointer to struct rte_eth_dev.
- *
- * @return
- * void
- */
-void _rte_eth_dev_reset(struct rte_eth_dev *dev);
-
-/**
- * @internal Executes all the user application registered callbacks for
- * the specific device. It is for DPDK internal user only. User
- * application should not call it directly.
- *
- * @param dev
- * Pointer to struct rte_eth_dev.
- * @param event
- * Eth device interrupt event type.
- * @param ret_param
- * To pass data back to user application.
- * This allows the user application to decide if a particular function
- * is permitted or not.
- *
- * @return
- * int
- */
-int _rte_eth_dev_callback_process(struct rte_eth_dev *dev,
- enum rte_eth_event_type event, void *ret_param);
-
-/**
- * Create memzone for HW rings.
- * malloc can't be used as the physical address is needed.
- * If the memzone is already created, then this function returns a ptr
- * to the old one.
- *
- * @param eth_dev
- * The *eth_dev* pointer is the address of the *rte_eth_dev* structure
- * @param name
- * The name of the memory zone
- * @param queue_id
- * The index of the queue to add to name
- * @param size
- * The sizeof of the memory area
- * @param align
- * Alignment for resulting memzone. Must be a power of 2.
- * @param socket_id
- * The *socket_id* argument is the socket identifier in case of NUMA.
- */
-const struct rte_memzone *
-rte_eth_dma_zone_reserve(const struct rte_eth_dev *eth_dev, const char *name,
- uint16_t queue_id, size_t size,
- unsigned align, int socket_id);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _RTE_ETHDEV_DRIVER_H_ */
diff --git a/lib/librte_ether/rte_ethdev_pci.h b/lib/librte_ether/rte_ethdev_pci.h
deleted file mode 100644
index 897ce5b4..00000000
--- a/lib/librte_ether/rte_ethdev_pci.h
+++ /dev/null
@@ -1,196 +0,0 @@
-/*-
- * BSD LICENSE
- *
- * Copyright(c) 2017 Brocade Communications Systems, Inc.
- * Author: Jan Blunck <jblunck@infradead.org>
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name of the copyright holder nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef _RTE_ETHDEV_PCI_H_
-#define _RTE_ETHDEV_PCI_H_
-
-#include <rte_malloc.h>
-#include <rte_pci.h>
-#include <rte_bus_pci.h>
-#include <rte_config.h>
-#include <rte_ethdev_driver.h>
-
-/**
- * Copy pci device info to the Ethernet device data.
- *
- * @param eth_dev
- * The *eth_dev* pointer is the address of the *rte_eth_dev* structure.
- * @param pci_dev
- * The *pci_dev* pointer is the address of the *rte_pci_device* structure.
- */
-static inline void
-rte_eth_copy_pci_info(struct rte_eth_dev *eth_dev,
- struct rte_pci_device *pci_dev)
-{
- if ((eth_dev == NULL) || (pci_dev == NULL)) {
- RTE_PMD_DEBUG_TRACE("NULL pointer eth_dev=%p pci_dev=%p\n",
- eth_dev, pci_dev);
- return;
- }
-
- eth_dev->intr_handle = &pci_dev->intr_handle;
-
- eth_dev->data->dev_flags = 0;
- if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_LSC)
- eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_LSC;
- if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_RMV)
- eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_RMV;
-
- eth_dev->data->kdrv = pci_dev->kdrv;
- eth_dev->data->numa_node = pci_dev->device.numa_node;
-}
-
-/**
- * @internal
- * Allocates a new ethdev slot for an ethernet device and returns the pointer
- * to that slot for the driver to use.
- *
- * @param dev
- * Pointer to the PCI device
- *
- * @param private_data_size
- * Size of private data structure
- *
- * @return
- * A pointer to a rte_eth_dev or NULL if allocation failed.
- */
-static inline struct rte_eth_dev *
-rte_eth_dev_pci_allocate(struct rte_pci_device *dev, size_t private_data_size)
-{
- struct rte_eth_dev *eth_dev;
- const char *name;
-
- if (!dev)
- return NULL;
-
- name = dev->device.name;
-
- if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
- eth_dev = rte_eth_dev_allocate(name);
- if (!eth_dev)
- return NULL;
-
- if (private_data_size) {
- eth_dev->data->dev_private = rte_zmalloc_socket(name,
- private_data_size, RTE_CACHE_LINE_SIZE,
- dev->device.numa_node);
- if (!eth_dev->data->dev_private) {
- rte_eth_dev_release_port(eth_dev);
- return NULL;
- }
- }
- } else {
- eth_dev = rte_eth_dev_attach_secondary(name);
- if (!eth_dev)
- return NULL;
- }
-
- eth_dev->device = &dev->device;
- rte_eth_copy_pci_info(eth_dev, dev);
- return eth_dev;
-}
-
-static inline void
-rte_eth_dev_pci_release(struct rte_eth_dev *eth_dev)
-{
- /* free ether device */
- rte_eth_dev_release_port(eth_dev);
-
- if (rte_eal_process_type() == RTE_PROC_PRIMARY)
- rte_free(eth_dev->data->dev_private);
-
- eth_dev->data->dev_private = NULL;
-
- /*
- * Secondary process will check the name to attach.
- * Clear this field to avoid attaching a released ports.
- */
- eth_dev->data->name[0] = '\0';
-
- eth_dev->device = NULL;
- eth_dev->intr_handle = NULL;
-}
-
-typedef int (*eth_dev_pci_callback_t)(struct rte_eth_dev *eth_dev);
-
-/**
- * @internal
- * Wrapper for use by pci drivers in a .probe function to attach to a ethdev
- * interface.
- */
-static inline int
-rte_eth_dev_pci_generic_probe(struct rte_pci_device *pci_dev,
- size_t private_data_size, eth_dev_pci_callback_t dev_init)
-{
- struct rte_eth_dev *eth_dev;
- int ret;
-
- eth_dev = rte_eth_dev_pci_allocate(pci_dev, private_data_size);
- if (!eth_dev)
- return -ENOMEM;
-
- RTE_FUNC_PTR_OR_ERR_RET(*dev_init, -EINVAL);
- ret = dev_init(eth_dev);
- if (ret)
- rte_eth_dev_pci_release(eth_dev);
-
- return ret;
-}
-
-/**
- * @internal
- * Wrapper for use by pci drivers in a .remove function to detach a ethdev
- * interface.
- */
-static inline int
-rte_eth_dev_pci_generic_remove(struct rte_pci_device *pci_dev,
- eth_dev_pci_callback_t dev_uninit)
-{
- struct rte_eth_dev *eth_dev;
- int ret;
-
- eth_dev = rte_eth_dev_allocated(pci_dev->device.name);
- if (!eth_dev)
- return -ENODEV;
-
- if (dev_uninit) {
- ret = dev_uninit(eth_dev);
- if (ret)
- return ret;
- }
-
- rte_eth_dev_pci_release(eth_dev);
- return 0;
-}
-
-#endif /* _RTE_ETHDEV_PCI_H_ */
diff --git a/lib/librte_ether/rte_ethdev_vdev.h b/lib/librte_ether/rte_ethdev_vdev.h
deleted file mode 100644
index 259feda3..00000000
--- a/lib/librte_ether/rte_ethdev_vdev.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/*-
- * BSD LICENSE
- *
- * Copyright(c) 2017 Brocade Communications Systems, Inc.
- * Author: Jan Blunck <jblunck@infradead.org>
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name of the copyright holder nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef _RTE_ETHDEV_VDEV_H_
-#define _RTE_ETHDEV_VDEV_H_
-
-#include <rte_config.h>
-#include <rte_malloc.h>
-#include <rte_bus_vdev.h>
-#include <rte_ethdev_driver.h>
-
-/**
- * @internal
- * Allocates a new ethdev slot for an ethernet device and returns the pointer
- * to that slot for the driver to use.
- *
- * @param dev
- * Pointer to virtual device
- *
- * @param private_data_size
- * Size of private data structure
- *
- * @return
- * A pointer to a rte_eth_dev or NULL if allocation failed.
- */
-static inline struct rte_eth_dev *
-rte_eth_vdev_allocate(struct rte_vdev_device *dev, size_t private_data_size)
-{
- struct rte_eth_dev *eth_dev;
- const char *name = rte_vdev_device_name(dev);
-
- eth_dev = rte_eth_dev_allocate(name);
- if (!eth_dev)
- return NULL;
-
- if (private_data_size) {
- eth_dev->data->dev_private = rte_zmalloc_socket(name,
- private_data_size, RTE_CACHE_LINE_SIZE,
- dev->device.numa_node);
- if (!eth_dev->data->dev_private) {
- rte_eth_dev_release_port(eth_dev);
- return NULL;
- }
- }
-
- eth_dev->device = &dev->device;
- eth_dev->intr_handle = NULL;
-
- eth_dev->data->kdrv = RTE_KDRV_NONE;
- eth_dev->data->numa_node = dev->device.numa_node;
- return eth_dev;
-}
-
-#endif /* _RTE_ETHDEV_VDEV_H_ */
diff --git a/lib/librte_ether/rte_ethdev_version.map b/lib/librte_ether/rte_ethdev_version.map
deleted file mode 100644
index 87f02fb7..00000000
--- a/lib/librte_ether/rte_ethdev_version.map
+++ /dev/null
@@ -1,232 +0,0 @@
-DPDK_2.2 {
- global:
-
- rte_eth_add_rx_callback;
- rte_eth_add_tx_callback;
- rte_eth_allmulticast_disable;
- rte_eth_allmulticast_enable;
- rte_eth_allmulticast_get;
- rte_eth_dev_allocate;
- rte_eth_dev_allocated;
- rte_eth_dev_attach;
- rte_eth_dev_callback_register;
- rte_eth_dev_callback_unregister;
- rte_eth_dev_close;
- rte_eth_dev_configure;
- rte_eth_dev_count;
- rte_eth_dev_default_mac_addr_set;
- rte_eth_dev_detach;
- rte_eth_dev_filter_ctrl;
- rte_eth_dev_filter_supported;
- rte_eth_dev_flow_ctrl_get;
- rte_eth_dev_flow_ctrl_set;
- rte_eth_dev_get_dcb_info;
- rte_eth_dev_get_eeprom;
- rte_eth_dev_get_eeprom_length;
- rte_eth_dev_get_mtu;
- rte_eth_dev_get_reg_info;
- rte_eth_dev_get_vlan_offload;
- rte_eth_devices;
- rte_eth_dev_info_get;
- rte_eth_dev_is_valid_port;
- rte_eth_dev_mac_addr_add;
- rte_eth_dev_mac_addr_remove;
- rte_eth_dev_priority_flow_ctrl_set;
- rte_eth_dev_release_port;
- rte_eth_dev_rss_hash_conf_get;
- rte_eth_dev_rss_hash_update;
- rte_eth_dev_rss_reta_query;
- rte_eth_dev_rss_reta_update;
- rte_eth_dev_rx_intr_ctl;
- rte_eth_dev_rx_intr_ctl_q;
- rte_eth_dev_rx_intr_disable;
- rte_eth_dev_rx_intr_enable;
- rte_eth_dev_rx_queue_start;
- rte_eth_dev_rx_queue_stop;
- rte_eth_dev_set_eeprom;
- rte_eth_dev_set_link_down;
- rte_eth_dev_set_link_up;
- rte_eth_dev_set_mc_addr_list;
- rte_eth_dev_set_mtu;
- rte_eth_dev_set_rx_queue_stats_mapping;
- rte_eth_dev_set_tx_queue_stats_mapping;
- rte_eth_dev_set_vlan_offload;
- rte_eth_dev_set_vlan_pvid;
- rte_eth_dev_set_vlan_strip_on_queue;
- rte_eth_dev_socket_id;
- rte_eth_dev_start;
- rte_eth_dev_stop;
- rte_eth_dev_tx_queue_start;
- rte_eth_dev_tx_queue_stop;
- rte_eth_dev_uc_all_hash_table_set;
- rte_eth_dev_uc_hash_table_set;
- rte_eth_dev_vlan_filter;
- rte_eth_dma_zone_reserve;
- rte_eth_led_off;
- rte_eth_led_on;
- rte_eth_link;
- rte_eth_link_get;
- rte_eth_link_get_nowait;
- rte_eth_macaddr_get;
- rte_eth_mirror_rule_reset;
- rte_eth_mirror_rule_set;
- rte_eth_promiscuous_disable;
- rte_eth_promiscuous_enable;
- rte_eth_promiscuous_get;
- rte_eth_remove_rx_callback;
- rte_eth_remove_tx_callback;
- rte_eth_rx_queue_info_get;
- rte_eth_rx_queue_setup;
- rte_eth_set_queue_rate_limit;
- rte_eth_stats;
- rte_eth_stats_get;
- rte_eth_stats_reset;
- rte_eth_timesync_adjust_time;
- rte_eth_timesync_disable;
- rte_eth_timesync_enable;
- rte_eth_timesync_read_rx_timestamp;
- rte_eth_timesync_read_time;
- rte_eth_timesync_read_tx_timestamp;
- rte_eth_timesync_write_time;
- rte_eth_tx_queue_info_get;
- rte_eth_tx_queue_setup;
- rte_eth_xstats_get;
- rte_eth_xstats_reset;
-
- local: *;
-};
-
-DPDK_16.04 {
- global:
-
- rte_eth_dev_get_supported_ptypes;
- rte_eth_dev_l2_tunnel_eth_type_conf;
- rte_eth_dev_l2_tunnel_offload_set;
- rte_eth_dev_set_vlan_ether_type;
- rte_eth_dev_udp_tunnel_port_add;
- rte_eth_dev_udp_tunnel_port_delete;
- rte_eth_speed_bitflag;
- rte_eth_tx_buffer_count_callback;
- rte_eth_tx_buffer_drop_callback;
- rte_eth_tx_buffer_init;
- rte_eth_tx_buffer_set_err_callback;
-
-} DPDK_2.2;
-
-DPDK_16.07 {
- global:
-
- rte_eth_add_first_rx_callback;
- rte_eth_dev_get_name_by_port;
- rte_eth_dev_get_port_by_name;
- rte_eth_xstats_get_names;
-
-} DPDK_16.04;
-
-DPDK_17.02 {
- global:
-
- _rte_eth_dev_reset;
- rte_eth_dev_fw_version_get;
- rte_flow_create;
- rte_flow_destroy;
- rte_flow_flush;
- rte_flow_query;
- rte_flow_validate;
-
-} DPDK_16.07;
-
-DPDK_17.05 {
- global:
-
- rte_eth_dev_attach_secondary;
- rte_eth_find_next;
- rte_eth_tx_done_cleanup;
- rte_eth_xstats_get_by_id;
- rte_eth_xstats_get_id_by_name;
- rte_eth_xstats_get_names_by_id;
-
-} DPDK_17.02;
-
-DPDK_17.08 {
- global:
-
- _rte_eth_dev_callback_process;
- rte_eth_dev_adjust_nb_rx_tx_desc;
- rte_flow_copy;
- rte_flow_isolate;
- rte_tm_capabilities_get;
- rte_tm_hierarchy_commit;
- rte_tm_level_capabilities_get;
- rte_tm_mark_ip_dscp;
- rte_tm_mark_ip_ecn;
- rte_tm_mark_vlan_dei;
- rte_tm_node_add;
- rte_tm_node_capabilities_get;
- rte_tm_node_cman_update;
- rte_tm_node_delete;
- rte_tm_node_parent_update;
- rte_tm_node_resume;
- rte_tm_node_shaper_update;
- rte_tm_node_shared_shaper_update;
- rte_tm_node_shared_wred_context_update;
- rte_tm_node_stats_read;
- rte_tm_node_stats_update;
- rte_tm_node_suspend;
- rte_tm_node_type_get;
- rte_tm_node_wfq_weight_mode_update;
- rte_tm_node_wred_context_update;
- rte_tm_shaper_profile_add;
- rte_tm_shaper_profile_delete;
- rte_tm_shared_shaper_add_update;
- rte_tm_shared_shaper_delete;
- rte_tm_shared_wred_context_add_update;
- rte_tm_shared_wred_context_delete;
- rte_tm_wred_profile_add;
- rte_tm_wred_profile_delete;
-
-} DPDK_17.05;
-
-DPDK_17.11 {
- global:
-
- rte_eth_dev_get_sec_ctx;
- rte_eth_dev_pool_ops_supported;
- rte_eth_dev_reset;
- rte_flow_error_set;
-
-} DPDK_17.08;
-
-DPDK_18.02 {
- global:
-
- rte_eth_dev_filter_ctrl;
-
-} DPDK_17.11;
-
-EXPERIMENTAL {
- global:
-
- rte_eth_dev_is_removed;
- rte_eth_dev_owner_delete;
- rte_eth_dev_owner_get;
- rte_eth_dev_owner_new;
- rte_eth_dev_owner_set;
- rte_eth_dev_owner_unset;
- rte_eth_dev_rx_offload_name;
- rte_eth_dev_tx_offload_name;
- rte_eth_find_next_owned_by;
- rte_mtr_capabilities_get;
- rte_mtr_create;
- rte_mtr_destroy;
- rte_mtr_meter_disable;
- rte_mtr_meter_dscp_table_update;
- rte_mtr_meter_enable;
- rte_mtr_meter_profile_add;
- rte_mtr_meter_profile_delete;
- rte_mtr_meter_profile_update;
- rte_mtr_policer_actions_update;
- rte_mtr_stats_read;
- rte_mtr_stats_update;
-
-} DPDK_17.11;
diff --git a/lib/librte_ether/rte_flow.c b/lib/librte_ether/rte_flow.c
deleted file mode 100644
index 38f2d27b..00000000
--- a/lib/librte_ether/rte_flow.c
+++ /dev/null
@@ -1,420 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright 2016 6WIND S.A.
- * Copyright 2016 Mellanox.
- */
-
-#include <errno.h>
-#include <stddef.h>
-#include <stdint.h>
-#include <string.h>
-
-#include <rte_common.h>
-#include <rte_errno.h>
-#include <rte_branch_prediction.h>
-#include "rte_ethdev.h"
-#include "rte_flow_driver.h"
-#include "rte_flow.h"
-
-/**
- * Flow elements description tables.
- */
-struct rte_flow_desc_data {
- const char *name;
- size_t size;
-};
-
-/** Generate flow_item[] entry. */
-#define MK_FLOW_ITEM(t, s) \
- [RTE_FLOW_ITEM_TYPE_ ## t] = { \
- .name = # t, \
- .size = s, \
- }
-
-/** Information about known flow pattern items. */
-static const struct rte_flow_desc_data rte_flow_desc_item[] = {
- MK_FLOW_ITEM(END, 0),
- MK_FLOW_ITEM(VOID, 0),
- MK_FLOW_ITEM(INVERT, 0),
- MK_FLOW_ITEM(ANY, sizeof(struct rte_flow_item_any)),
- MK_FLOW_ITEM(PF, 0),
- MK_FLOW_ITEM(VF, sizeof(struct rte_flow_item_vf)),
- MK_FLOW_ITEM(PORT, sizeof(struct rte_flow_item_port)),
- MK_FLOW_ITEM(RAW, sizeof(struct rte_flow_item_raw)), /* +pattern[] */
- MK_FLOW_ITEM(ETH, sizeof(struct rte_flow_item_eth)),
- MK_FLOW_ITEM(VLAN, sizeof(struct rte_flow_item_vlan)),
- MK_FLOW_ITEM(IPV4, sizeof(struct rte_flow_item_ipv4)),
- MK_FLOW_ITEM(IPV6, sizeof(struct rte_flow_item_ipv6)),
- MK_FLOW_ITEM(ICMP, sizeof(struct rte_flow_item_icmp)),
- MK_FLOW_ITEM(UDP, sizeof(struct rte_flow_item_udp)),
- MK_FLOW_ITEM(TCP, sizeof(struct rte_flow_item_tcp)),
- MK_FLOW_ITEM(SCTP, sizeof(struct rte_flow_item_sctp)),
- MK_FLOW_ITEM(VXLAN, sizeof(struct rte_flow_item_vxlan)),
- MK_FLOW_ITEM(MPLS, sizeof(struct rte_flow_item_mpls)),
- MK_FLOW_ITEM(GRE, sizeof(struct rte_flow_item_gre)),
- MK_FLOW_ITEM(E_TAG, sizeof(struct rte_flow_item_e_tag)),
- MK_FLOW_ITEM(NVGRE, sizeof(struct rte_flow_item_nvgre)),
- MK_FLOW_ITEM(GENEVE, sizeof(struct rte_flow_item_geneve)),
-};
-
-/** Generate flow_action[] entry. */
-#define MK_FLOW_ACTION(t, s) \
- [RTE_FLOW_ACTION_TYPE_ ## t] = { \
- .name = # t, \
- .size = s, \
- }
-
-/** Information about known flow actions. */
-static const struct rte_flow_desc_data rte_flow_desc_action[] = {
- MK_FLOW_ACTION(END, 0),
- MK_FLOW_ACTION(VOID, 0),
- MK_FLOW_ACTION(PASSTHRU, 0),
- MK_FLOW_ACTION(MARK, sizeof(struct rte_flow_action_mark)),
- MK_FLOW_ACTION(FLAG, 0),
- MK_FLOW_ACTION(QUEUE, sizeof(struct rte_flow_action_queue)),
- MK_FLOW_ACTION(DROP, 0),
- MK_FLOW_ACTION(COUNT, 0),
- MK_FLOW_ACTION(DUP, sizeof(struct rte_flow_action_dup)),
- MK_FLOW_ACTION(RSS, sizeof(struct rte_flow_action_rss)), /* +queue[] */
- MK_FLOW_ACTION(PF, 0),
- MK_FLOW_ACTION(VF, sizeof(struct rte_flow_action_vf)),
-};
-
-static int
-flow_err(uint16_t port_id, int ret, struct rte_flow_error *error)
-{
- if (ret == 0)
- return 0;
- if (rte_eth_dev_is_removed(port_id))
- return rte_flow_error_set(error, EIO,
- RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
- NULL, rte_strerror(EIO));
- return ret;
-}
-
-/* Get generic flow operations structure from a port. */
-const struct rte_flow_ops *
-rte_flow_ops_get(uint16_t port_id, struct rte_flow_error *error)
-{
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
- const struct rte_flow_ops *ops;
- int code;
-
- if (unlikely(!rte_eth_dev_is_valid_port(port_id)))
- code = ENODEV;
- else if (unlikely(!dev->dev_ops->filter_ctrl ||
- dev->dev_ops->filter_ctrl(dev,
- RTE_ETH_FILTER_GENERIC,
- RTE_ETH_FILTER_GET,
- &ops) ||
- !ops))
- code = ENOSYS;
- else
- return ops;
- rte_flow_error_set(error, code, RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
- NULL, rte_strerror(code));
- return NULL;
-}
-
-/* Check whether a flow rule can be created on a given port. */
-int
-rte_flow_validate(uint16_t port_id,
- const struct rte_flow_attr *attr,
- const struct rte_flow_item pattern[],
- const struct rte_flow_action actions[],
- struct rte_flow_error *error)
-{
- const struct rte_flow_ops *ops = rte_flow_ops_get(port_id, error);
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
-
- if (unlikely(!ops))
- return -rte_errno;
- if (likely(!!ops->validate))
- return flow_err(port_id, ops->validate(dev, attr, pattern,
- actions, error), error);
- return rte_flow_error_set(error, ENOSYS,
- RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
- NULL, rte_strerror(ENOSYS));
-}
-
-/* Create a flow rule on a given port. */
-struct rte_flow *
-rte_flow_create(uint16_t port_id,
- const struct rte_flow_attr *attr,
- const struct rte_flow_item pattern[],
- const struct rte_flow_action actions[],
- struct rte_flow_error *error)
-{
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
- struct rte_flow *flow;
- const struct rte_flow_ops *ops = rte_flow_ops_get(port_id, error);
-
- if (unlikely(!ops))
- return NULL;
- if (likely(!!ops->create)) {
- flow = ops->create(dev, attr, pattern, actions, error);
- if (flow == NULL)
- flow_err(port_id, -rte_errno, error);
- return flow;
- }
- rte_flow_error_set(error, ENOSYS, RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
- NULL, rte_strerror(ENOSYS));
- return NULL;
-}
-
-/* Destroy a flow rule on a given port. */
-int
-rte_flow_destroy(uint16_t port_id,
- struct rte_flow *flow,
- struct rte_flow_error *error)
-{
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
- const struct rte_flow_ops *ops = rte_flow_ops_get(port_id, error);
-
- if (unlikely(!ops))
- return -rte_errno;
- if (likely(!!ops->destroy))
- return flow_err(port_id, ops->destroy(dev, flow, error),
- error);
- return rte_flow_error_set(error, ENOSYS,
- RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
- NULL, rte_strerror(ENOSYS));
-}
-
-/* Destroy all flow rules associated with a port. */
-int
-rte_flow_flush(uint16_t port_id,
- struct rte_flow_error *error)
-{
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
- const struct rte_flow_ops *ops = rte_flow_ops_get(port_id, error);
-
- if (unlikely(!ops))
- return -rte_errno;
- if (likely(!!ops->flush))
- return flow_err(port_id, ops->flush(dev, error), error);
- return rte_flow_error_set(error, ENOSYS,
- RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
- NULL, rte_strerror(ENOSYS));
-}
-
-/* Query an existing flow rule. */
-int
-rte_flow_query(uint16_t port_id,
- struct rte_flow *flow,
- enum rte_flow_action_type action,
- void *data,
- struct rte_flow_error *error)
-{
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
- const struct rte_flow_ops *ops = rte_flow_ops_get(port_id, error);
-
- if (!ops)
- return -rte_errno;
- if (likely(!!ops->query))
- return flow_err(port_id, ops->query(dev, flow, action, data,
- error), error);
- return rte_flow_error_set(error, ENOSYS,
- RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
- NULL, rte_strerror(ENOSYS));
-}
-
-/* Restrict ingress traffic to the defined flow rules. */
-int
-rte_flow_isolate(uint16_t port_id,
- int set,
- struct rte_flow_error *error)
-{
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
- const struct rte_flow_ops *ops = rte_flow_ops_get(port_id, error);
-
- if (!ops)
- return -rte_errno;
- if (likely(!!ops->isolate))
- return flow_err(port_id, ops->isolate(dev, set, error), error);
- return rte_flow_error_set(error, ENOSYS,
- RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
- NULL, rte_strerror(ENOSYS));
-}
-
-/* Initialize flow error structure. */
-int
-rte_flow_error_set(struct rte_flow_error *error,
- int code,
- enum rte_flow_error_type type,
- const void *cause,
- const char *message)
-{
- if (error) {
- *error = (struct rte_flow_error){
- .type = type,
- .cause = cause,
- .message = message,
- };
- }
- rte_errno = code;
- return -code;
-}
-
-/** Compute storage space needed by item specification. */
-static void
-flow_item_spec_size(const struct rte_flow_item *item,
- size_t *size, size_t *pad)
-{
- if (!item->spec) {
- *size = 0;
- goto empty;
- }
- switch (item->type) {
- union {
- const struct rte_flow_item_raw *raw;
- } spec;
-
- /* Not a fall-through */
- case RTE_FLOW_ITEM_TYPE_RAW:
- spec.raw = item->spec;
- *size = offsetof(struct rte_flow_item_raw, pattern) +
- spec.raw->length * sizeof(*spec.raw->pattern);
- break;
- default:
- *size = rte_flow_desc_item[item->type].size;
- break;
- }
-empty:
- *pad = RTE_ALIGN_CEIL(*size, sizeof(double)) - *size;
-}
-
-/** Compute storage space needed by action configuration. */
-static void
-flow_action_conf_size(const struct rte_flow_action *action,
- size_t *size, size_t *pad)
-{
- if (!action->conf) {
- *size = 0;
- goto empty;
- }
- switch (action->type) {
- union {
- const struct rte_flow_action_rss *rss;
- } conf;
-
- /* Not a fall-through. */
- case RTE_FLOW_ACTION_TYPE_RSS:
- conf.rss = action->conf;
- *size = offsetof(struct rte_flow_action_rss, queue) +
- conf.rss->num * sizeof(*conf.rss->queue);
- break;
- default:
- *size = rte_flow_desc_action[action->type].size;
- break;
- }
-empty:
- *pad = RTE_ALIGN_CEIL(*size, sizeof(double)) - *size;
-}
-
-/** Store a full rte_flow description. */
-size_t
-rte_flow_copy(struct rte_flow_desc *desc, size_t len,
- const struct rte_flow_attr *attr,
- const struct rte_flow_item *items,
- const struct rte_flow_action *actions)
-{
- struct rte_flow_desc *fd = NULL;
- size_t tmp;
- size_t pad;
- size_t off1 = 0;
- size_t off2 = 0;
- size_t size = 0;
-
-store:
- if (items) {
- const struct rte_flow_item *item;
-
- item = items;
- if (fd)
- fd->items = (void *)&fd->data[off1];
- do {
- struct rte_flow_item *dst = NULL;
-
- if ((size_t)item->type >=
- RTE_DIM(rte_flow_desc_item) ||
- !rte_flow_desc_item[item->type].name) {
- rte_errno = ENOTSUP;
- return 0;
- }
- if (fd)
- dst = memcpy(fd->data + off1, item,
- sizeof(*item));
- off1 += sizeof(*item);
- flow_item_spec_size(item, &tmp, &pad);
- if (item->spec) {
- if (fd)
- dst->spec = memcpy(fd->data + off2,
- item->spec, tmp);
- off2 += tmp + pad;
- }
- if (item->last) {
- if (fd)
- dst->last = memcpy(fd->data + off2,
- item->last, tmp);
- off2 += tmp + pad;
- }
- if (item->mask) {
- if (fd)
- dst->mask = memcpy(fd->data + off2,
- item->mask, tmp);
- off2 += tmp + pad;
- }
- off2 = RTE_ALIGN_CEIL(off2, sizeof(double));
- } while ((item++)->type != RTE_FLOW_ITEM_TYPE_END);
- off1 = RTE_ALIGN_CEIL(off1, sizeof(double));
- }
- if (actions) {
- const struct rte_flow_action *action;
-
- action = actions;
- if (fd)
- fd->actions = (void *)&fd->data[off1];
- do {
- struct rte_flow_action *dst = NULL;
-
- if ((size_t)action->type >=
- RTE_DIM(rte_flow_desc_action) ||
- !rte_flow_desc_action[action->type].name) {
- rte_errno = ENOTSUP;
- return 0;
- }
- if (fd)
- dst = memcpy(fd->data + off1, action,
- sizeof(*action));
- off1 += sizeof(*action);
- flow_action_conf_size(action, &tmp, &pad);
- if (action->conf) {
- if (fd)
- dst->conf = memcpy(fd->data + off2,
- action->conf, tmp);
- off2 += tmp + pad;
- }
- off2 = RTE_ALIGN_CEIL(off2, sizeof(double));
- } while ((action++)->type != RTE_FLOW_ACTION_TYPE_END);
- }
- if (fd != NULL)
- return size;
- off1 = RTE_ALIGN_CEIL(off1, sizeof(double));
- tmp = RTE_ALIGN_CEIL(offsetof(struct rte_flow_desc, data),
- sizeof(double));
- size = tmp + off1 + off2;
- if (size > len)
- return size;
- fd = desc;
- if (fd != NULL) {
- *fd = (const struct rte_flow_desc) {
- .size = size,
- .attr = *attr,
- };
- tmp -= offsetof(struct rte_flow_desc, data);
- off2 = tmp + off1;
- off1 = tmp;
- goto store;
- }
- return 0;
-}
diff --git a/lib/librte_ether/rte_flow.h b/lib/librte_ether/rte_flow.h
deleted file mode 100644
index 13e42021..00000000
--- a/lib/librte_ether/rte_flow.h
+++ /dev/null
@@ -1,1483 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright 2016 6WIND S.A.
- * Copyright 2016 Mellanox.
- */
-
-#ifndef RTE_FLOW_H_
-#define RTE_FLOW_H_
-
-/**
- * @file
- * RTE generic flow API
- *
- * This interface provides the ability to program packet matching and
- * associated actions in hardware through flow rules.
- */
-
-#include <rte_arp.h>
-#include <rte_ether.h>
-#include <rte_icmp.h>
-#include <rte_ip.h>
-#include <rte_sctp.h>
-#include <rte_tcp.h>
-#include <rte_udp.h>
-#include <rte_byteorder.h>
-#include <rte_esp.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * Flow rule attributes.
- *
- * Priorities are set on two levels: per group and per rule within groups.
- *
- * Lower values denote higher priority, the highest priority for both levels
- * is 0, so that a rule with priority 0 in group 8 is always matched after a
- * rule with priority 8 in group 0.
- *
- * Although optional, applications are encouraged to group similar rules as
- * much as possible to fully take advantage of hardware capabilities
- * (e.g. optimized matching) and work around limitations (e.g. a single
- * pattern type possibly allowed in a given group).
- *
- * Group and priority levels are arbitrary and up to the application, they
- * do not need to be contiguous nor start from 0, however the maximum number
- * varies between devices and may be affected by existing flow rules.
- *
- * If a packet is matched by several rules of a given group for a given
- * priority level, the outcome is undefined. It can take any path, may be
- * duplicated or even cause unrecoverable errors.
- *
- * Note that support for more than a single group and priority level is not
- * guaranteed.
- *
- * Flow rules can apply to inbound and/or outbound traffic (ingress/egress).
- *
- * Several pattern items and actions are valid and can be used in both
- * directions. Those valid for only one direction are described as such.
- *
- * At least one direction must be specified.
- *
- * Specifying both directions at once for a given rule is not recommended
- * but may be valid in a few cases (e.g. shared counter).
- */
-struct rte_flow_attr {
- uint32_t group; /**< Priority group. */
- uint32_t priority; /**< Priority level within group. */
- uint32_t ingress:1; /**< Rule applies to ingress traffic. */
- uint32_t egress:1; /**< Rule applies to egress traffic. */
- uint32_t reserved:30; /**< Reserved, must be zero. */
-};
-
-/**
- * Matching pattern item types.
- *
- * Pattern items fall in two categories:
- *
- * - Matching protocol headers and packet data (ANY, RAW, ETH, VLAN, IPV4,
- * IPV6, ICMP, UDP, TCP, SCTP, VXLAN and so on), usually associated with a
- * specification structure. These must be stacked in the same order as the
- * protocol layers to match, starting from the lowest.
- *
- * - Matching meta-data or affecting pattern processing (END, VOID, INVERT,
- * PF, VF, PORT and so on), often without a specification structure. Since
- * they do not match packet contents, these can be specified anywhere
- * within item lists without affecting others.
- *
- * See the description of individual types for more information. Those
- * marked with [META] fall into the second category.
- */
-enum rte_flow_item_type {
- /**
- * [META]
- *
- * End marker for item lists. Prevents further processing of items,
- * thereby ending the pattern.
- *
- * No associated specification structure.
- */
- RTE_FLOW_ITEM_TYPE_END,
-
- /**
- * [META]
- *
- * Used as a placeholder for convenience. It is ignored and simply
- * discarded by PMDs.
- *
- * No associated specification structure.
- */
- RTE_FLOW_ITEM_TYPE_VOID,
-
- /**
- * [META]
- *
- * Inverted matching, i.e. process packets that do not match the
- * pattern.
- *
- * No associated specification structure.
- */
- RTE_FLOW_ITEM_TYPE_INVERT,
-
- /**
- * Matches any protocol in place of the current layer, a single ANY
- * may also stand for several protocol layers.
- *
- * See struct rte_flow_item_any.
- */
- RTE_FLOW_ITEM_TYPE_ANY,
-
- /**
- * [META]
- *
- * Matches packets addressed to the physical function of the device.
- *
- * If the underlying device function differs from the one that would
- * normally receive the matched traffic, specifying this item
- * prevents it from reaching that device unless the flow rule
- * contains a PF action. Packets are not duplicated between device
- * instances by default.
- *
- * No associated specification structure.
- */
- RTE_FLOW_ITEM_TYPE_PF,
-
- /**
- * [META]
- *
- * Matches packets addressed to a virtual function ID of the device.
- *
- * If the underlying device function differs from the one that would
- * normally receive the matched traffic, specifying this item
- * prevents it from reaching that device unless the flow rule
- * contains a VF action. Packets are not duplicated between device
- * instances by default.
- *
- * See struct rte_flow_item_vf.
- */
- RTE_FLOW_ITEM_TYPE_VF,
-
- /**
- * [META]
- *
- * Matches packets coming from the specified physical port of the
- * underlying device.
- *
- * The first PORT item overrides the physical port normally
- * associated with the specified DPDK input port (port_id). This
- * item can be provided several times to match additional physical
- * ports.
- *
- * See struct rte_flow_item_port.
- */
- RTE_FLOW_ITEM_TYPE_PORT,
-
- /**
- * Matches a byte string of a given length at a given offset.
- *
- * See struct rte_flow_item_raw.
- */
- RTE_FLOW_ITEM_TYPE_RAW,
-
- /**
- * Matches an Ethernet header.
- *
- * See struct rte_flow_item_eth.
- */
- RTE_FLOW_ITEM_TYPE_ETH,
-
- /**
- * Matches an 802.1Q/ad VLAN tag.
- *
- * See struct rte_flow_item_vlan.
- */
- RTE_FLOW_ITEM_TYPE_VLAN,
-
- /**
- * Matches an IPv4 header.
- *
- * See struct rte_flow_item_ipv4.
- */
- RTE_FLOW_ITEM_TYPE_IPV4,
-
- /**
- * Matches an IPv6 header.
- *
- * See struct rte_flow_item_ipv6.
- */
- RTE_FLOW_ITEM_TYPE_IPV6,
-
- /**
- * Matches an ICMP header.
- *
- * See struct rte_flow_item_icmp.
- */
- RTE_FLOW_ITEM_TYPE_ICMP,
-
- /**
- * Matches a UDP header.
- *
- * See struct rte_flow_item_udp.
- */
- RTE_FLOW_ITEM_TYPE_UDP,
-
- /**
- * Matches a TCP header.
- *
- * See struct rte_flow_item_tcp.
- */
- RTE_FLOW_ITEM_TYPE_TCP,
-
- /**
- * Matches a SCTP header.
- *
- * See struct rte_flow_item_sctp.
- */
- RTE_FLOW_ITEM_TYPE_SCTP,
-
- /**
- * Matches a VXLAN header.
- *
- * See struct rte_flow_item_vxlan.
- */
- RTE_FLOW_ITEM_TYPE_VXLAN,
-
- /**
- * Matches a E_TAG header.
- *
- * See struct rte_flow_item_e_tag.
- */
- RTE_FLOW_ITEM_TYPE_E_TAG,
-
- /**
- * Matches a NVGRE header.
- *
- * See struct rte_flow_item_nvgre.
- */
- RTE_FLOW_ITEM_TYPE_NVGRE,
-
- /**
- * Matches a MPLS header.
- *
- * See struct rte_flow_item_mpls.
- */
- RTE_FLOW_ITEM_TYPE_MPLS,
-
- /**
- * Matches a GRE header.
- *
- * See struct rte_flow_item_gre.
- */
- RTE_FLOW_ITEM_TYPE_GRE,
-
- /**
- * [META]
- *
- * Fuzzy pattern match, expect faster than default.
- *
- * This is for device that support fuzzy matching option.
- * Usually a fuzzy matching is fast but the cost is accuracy.
- *
- * See struct rte_flow_item_fuzzy.
- */
- RTE_FLOW_ITEM_TYPE_FUZZY,
-
- /**
- * Matches a GTP header.
- *
- * Configure flow for GTP packets.
- *
- * See struct rte_flow_item_gtp.
- */
- RTE_FLOW_ITEM_TYPE_GTP,
-
- /**
- * Matches a GTP header.
- *
- * Configure flow for GTP-C packets.
- *
- * See struct rte_flow_item_gtp.
- */
- RTE_FLOW_ITEM_TYPE_GTPC,
-
- /**
- * Matches a GTP header.
- *
- * Configure flow for GTP-U packets.
- *
- * See struct rte_flow_item_gtp.
- */
- RTE_FLOW_ITEM_TYPE_GTPU,
-
- /**
- * Matches a ESP header.
- *
- * See struct rte_flow_item_esp.
- */
- RTE_FLOW_ITEM_TYPE_ESP,
-
- /**
- * Matches a GENEVE header.
- *
- * See struct rte_flow_item_geneve.
- */
- RTE_FLOW_ITEM_TYPE_GENEVE,
-};
-
-/**
- * RTE_FLOW_ITEM_TYPE_ANY
- *
- * Matches any protocol in place of the current layer, a single ANY may also
- * stand for several protocol layers.
- *
- * This is usually specified as the first pattern item when looking for a
- * protocol anywhere in a packet.
- *
- * A zeroed mask stands for any number of layers.
- */
-struct rte_flow_item_any {
- uint32_t num; /**< Number of layers covered. */
-};
-
-/** Default mask for RTE_FLOW_ITEM_TYPE_ANY. */
-#ifndef __cplusplus
-static const struct rte_flow_item_any rte_flow_item_any_mask = {
- .num = 0x00000000,
-};
-#endif
-
-/**
- * RTE_FLOW_ITEM_TYPE_VF
- *
- * Matches packets addressed to a virtual function ID of the device.
- *
- * If the underlying device function differs from the one that would
- * normally receive the matched traffic, specifying this item prevents it
- * from reaching that device unless the flow rule contains a VF
- * action. Packets are not duplicated between device instances by default.
- *
- * - Likely to return an error or never match any traffic if this causes a
- * VF device to match traffic addressed to a different VF.
- * - Can be specified multiple times to match traffic addressed to several
- * VF IDs.
- * - Can be combined with a PF item to match both PF and VF traffic.
- *
- * A zeroed mask can be used to match any VF ID.
- */
-struct rte_flow_item_vf {
- uint32_t id; /**< Destination VF ID. */
-};
-
-/** Default mask for RTE_FLOW_ITEM_TYPE_VF. */
-#ifndef __cplusplus
-static const struct rte_flow_item_vf rte_flow_item_vf_mask = {
- .id = 0x00000000,
-};
-#endif
-
-/**
- * RTE_FLOW_ITEM_TYPE_PORT
- *
- * Matches packets coming from the specified physical port of the underlying
- * device.
- *
- * The first PORT item overrides the physical port normally associated with
- * the specified DPDK input port (port_id). This item can be provided
- * several times to match additional physical ports.
- *
- * Note that physical ports are not necessarily tied to DPDK input ports
- * (port_id) when those are not under DPDK control. Possible values are
- * specific to each device, they are not necessarily indexed from zero and
- * may not be contiguous.
- *
- * As a device property, the list of allowed values as well as the value
- * associated with a port_id should be retrieved by other means.
- *
- * A zeroed mask can be used to match any port index.
- */
-struct rte_flow_item_port {
- uint32_t index; /**< Physical port index. */
-};
-
-/** Default mask for RTE_FLOW_ITEM_TYPE_PORT. */
-#ifndef __cplusplus
-static const struct rte_flow_item_port rte_flow_item_port_mask = {
- .index = 0x00000000,
-};
-#endif
-
-/**
- * RTE_FLOW_ITEM_TYPE_RAW
- *
- * Matches a byte string of a given length at a given offset.
- *
- * Offset is either absolute (using the start of the packet) or relative to
- * the end of the previous matched item in the stack, in which case negative
- * values are allowed.
- *
- * If search is enabled, offset is used as the starting point. The search
- * area can be delimited by setting limit to a nonzero value, which is the
- * maximum number of bytes after offset where the pattern may start.
- *
- * Matching a zero-length pattern is allowed, doing so resets the relative
- * offset for subsequent items.
- *
- * This type does not support ranges (struct rte_flow_item.last).
- */
-struct rte_flow_item_raw {
- uint32_t relative:1; /**< Look for pattern after the previous item. */
- uint32_t search:1; /**< Search pattern from offset (see also limit). */
- uint32_t reserved:30; /**< Reserved, must be set to zero. */
- int32_t offset; /**< Absolute or relative offset for pattern. */
- uint16_t limit; /**< Search area limit for start of pattern. */
- uint16_t length; /**< Pattern length. */
- uint8_t pattern[]; /**< Byte string to look for. */
-};
-
-/** Default mask for RTE_FLOW_ITEM_TYPE_RAW. */
-#ifndef __cplusplus
-static const struct rte_flow_item_raw rte_flow_item_raw_mask = {
- .relative = 1,
- .search = 1,
- .reserved = 0x3fffffff,
- .offset = 0xffffffff,
- .limit = 0xffff,
- .length = 0xffff,
-};
-#endif
-
-/**
- * RTE_FLOW_ITEM_TYPE_ETH
- *
- * Matches an Ethernet header.
- */
-struct rte_flow_item_eth {
- struct ether_addr dst; /**< Destination MAC. */
- struct ether_addr src; /**< Source MAC. */
- rte_be16_t type; /**< EtherType. */
-};
-
-/** Default mask for RTE_FLOW_ITEM_TYPE_ETH. */
-#ifndef __cplusplus
-static const struct rte_flow_item_eth rte_flow_item_eth_mask = {
- .dst.addr_bytes = "\xff\xff\xff\xff\xff\xff",
- .src.addr_bytes = "\xff\xff\xff\xff\xff\xff",
- .type = RTE_BE16(0x0000),
-};
-#endif
-
-/**
- * RTE_FLOW_ITEM_TYPE_VLAN
- *
- * Matches an 802.1Q/ad VLAN tag.
- *
- * This type normally follows either RTE_FLOW_ITEM_TYPE_ETH or
- * RTE_FLOW_ITEM_TYPE_VLAN.
- */
-struct rte_flow_item_vlan {
- rte_be16_t tpid; /**< Tag protocol identifier. */
- rte_be16_t tci; /**< Tag control information. */
-};
-
-/** Default mask for RTE_FLOW_ITEM_TYPE_VLAN. */
-#ifndef __cplusplus
-static const struct rte_flow_item_vlan rte_flow_item_vlan_mask = {
- .tpid = RTE_BE16(0x0000),
- .tci = RTE_BE16(0xffff),
-};
-#endif
-
-/**
- * RTE_FLOW_ITEM_TYPE_IPV4
- *
- * Matches an IPv4 header.
- *
- * Note: IPv4 options are handled by dedicated pattern items.
- */
-struct rte_flow_item_ipv4 {
- struct ipv4_hdr hdr; /**< IPv4 header definition. */
-};
-
-/** Default mask for RTE_FLOW_ITEM_TYPE_IPV4. */
-#ifndef __cplusplus
-static const struct rte_flow_item_ipv4 rte_flow_item_ipv4_mask = {
- .hdr = {
- .src_addr = RTE_BE32(0xffffffff),
- .dst_addr = RTE_BE32(0xffffffff),
- },
-};
-#endif
-
-/**
- * RTE_FLOW_ITEM_TYPE_IPV6.
- *
- * Matches an IPv6 header.
- *
- * Note: IPv6 options are handled by dedicated pattern items.
- */
-struct rte_flow_item_ipv6 {
- struct ipv6_hdr hdr; /**< IPv6 header definition. */
-};
-
-/** Default mask for RTE_FLOW_ITEM_TYPE_IPV6. */
-#ifndef __cplusplus
-static const struct rte_flow_item_ipv6 rte_flow_item_ipv6_mask = {
- .hdr = {
- .src_addr =
- "\xff\xff\xff\xff\xff\xff\xff\xff"
- "\xff\xff\xff\xff\xff\xff\xff\xff",
- .dst_addr =
- "\xff\xff\xff\xff\xff\xff\xff\xff"
- "\xff\xff\xff\xff\xff\xff\xff\xff",
- },
-};
-#endif
-
-/**
- * RTE_FLOW_ITEM_TYPE_ICMP.
- *
- * Matches an ICMP header.
- */
-struct rte_flow_item_icmp {
- struct icmp_hdr hdr; /**< ICMP header definition. */
-};
-
-/** Default mask for RTE_FLOW_ITEM_TYPE_ICMP. */
-#ifndef __cplusplus
-static const struct rte_flow_item_icmp rte_flow_item_icmp_mask = {
- .hdr = {
- .icmp_type = 0xff,
- .icmp_code = 0xff,
- },
-};
-#endif
-
-/**
- * RTE_FLOW_ITEM_TYPE_UDP.
- *
- * Matches a UDP header.
- */
-struct rte_flow_item_udp {
- struct udp_hdr hdr; /**< UDP header definition. */
-};
-
-/** Default mask for RTE_FLOW_ITEM_TYPE_UDP. */
-#ifndef __cplusplus
-static const struct rte_flow_item_udp rte_flow_item_udp_mask = {
- .hdr = {
- .src_port = RTE_BE16(0xffff),
- .dst_port = RTE_BE16(0xffff),
- },
-};
-#endif
-
-/**
- * RTE_FLOW_ITEM_TYPE_TCP.
- *
- * Matches a TCP header.
- */
-struct rte_flow_item_tcp {
- struct tcp_hdr hdr; /**< TCP header definition. */
-};
-
-/** Default mask for RTE_FLOW_ITEM_TYPE_TCP. */
-#ifndef __cplusplus
-static const struct rte_flow_item_tcp rte_flow_item_tcp_mask = {
- .hdr = {
- .src_port = RTE_BE16(0xffff),
- .dst_port = RTE_BE16(0xffff),
- },
-};
-#endif
-
-/**
- * RTE_FLOW_ITEM_TYPE_SCTP.
- *
- * Matches a SCTP header.
- */
-struct rte_flow_item_sctp {
- struct sctp_hdr hdr; /**< SCTP header definition. */
-};
-
-/** Default mask for RTE_FLOW_ITEM_TYPE_SCTP. */
-#ifndef __cplusplus
-static const struct rte_flow_item_sctp rte_flow_item_sctp_mask = {
- .hdr = {
- .src_port = RTE_BE16(0xffff),
- .dst_port = RTE_BE16(0xffff),
- },
-};
-#endif
-
-/**
- * RTE_FLOW_ITEM_TYPE_VXLAN.
- *
- * Matches a VXLAN header (RFC 7348).
- */
-struct rte_flow_item_vxlan {
- uint8_t flags; /**< Normally 0x08 (I flag). */
- uint8_t rsvd0[3]; /**< Reserved, normally 0x000000. */
- uint8_t vni[3]; /**< VXLAN identifier. */
- uint8_t rsvd1; /**< Reserved, normally 0x00. */
-};
-
-/** Default mask for RTE_FLOW_ITEM_TYPE_VXLAN. */
-#ifndef __cplusplus
-static const struct rte_flow_item_vxlan rte_flow_item_vxlan_mask = {
- .vni = "\xff\xff\xff",
-};
-#endif
-
-/**
- * RTE_FLOW_ITEM_TYPE_E_TAG.
- *
- * Matches a E-tag header.
- */
-struct rte_flow_item_e_tag {
- rte_be16_t tpid; /**< Tag protocol identifier (0x893F). */
- /**
- * E-Tag control information (E-TCI).
- * E-PCP (3b), E-DEI (1b), ingress E-CID base (12b).
- */
- rte_be16_t epcp_edei_in_ecid_b;
- /** Reserved (2b), GRP (2b), E-CID base (12b). */
- rte_be16_t rsvd_grp_ecid_b;
- uint8_t in_ecid_e; /**< Ingress E-CID ext. */
- uint8_t ecid_e; /**< E-CID ext. */
-};
-
-/** Default mask for RTE_FLOW_ITEM_TYPE_E_TAG. */
-#ifndef __cplusplus
-static const struct rte_flow_item_e_tag rte_flow_item_e_tag_mask = {
- .rsvd_grp_ecid_b = RTE_BE16(0x3fff),
-};
-#endif
-
-/**
- * RTE_FLOW_ITEM_TYPE_NVGRE.
- *
- * Matches a NVGRE header.
- */
-struct rte_flow_item_nvgre {
- /**
- * Checksum (1b), undefined (1b), key bit (1b), sequence number (1b),
- * reserved 0 (9b), version (3b).
- *
- * c_k_s_rsvd0_ver must have value 0x2000 according to RFC 7637.
- */
- rte_be16_t c_k_s_rsvd0_ver;
- rte_be16_t protocol; /**< Protocol type (0x6558). */
- uint8_t tni[3]; /**< Virtual subnet ID. */
- uint8_t flow_id; /**< Flow ID. */
-};
-
-/** Default mask for RTE_FLOW_ITEM_TYPE_NVGRE. */
-#ifndef __cplusplus
-static const struct rte_flow_item_nvgre rte_flow_item_nvgre_mask = {
- .tni = "\xff\xff\xff",
-};
-#endif
-
-/**
- * RTE_FLOW_ITEM_TYPE_MPLS.
- *
- * Matches a MPLS header.
- */
-struct rte_flow_item_mpls {
- /**
- * Label (20b), TC (3b), Bottom of Stack (1b).
- */
- uint8_t label_tc_s[3];
- uint8_t ttl; /** Time-to-Live. */
-};
-
-/** Default mask for RTE_FLOW_ITEM_TYPE_MPLS. */
-#ifndef __cplusplus
-static const struct rte_flow_item_mpls rte_flow_item_mpls_mask = {
- .label_tc_s = "\xff\xff\xf0",
-};
-#endif
-
-/**
- * RTE_FLOW_ITEM_TYPE_GRE.
- *
- * Matches a GRE header.
- */
-struct rte_flow_item_gre {
- /**
- * Checksum (1b), reserved 0 (12b), version (3b).
- * Refer to RFC 2784.
- */
- rte_be16_t c_rsvd0_ver;
- rte_be16_t protocol; /**< Protocol type. */
-};
-
-/** Default mask for RTE_FLOW_ITEM_TYPE_GRE. */
-#ifndef __cplusplus
-static const struct rte_flow_item_gre rte_flow_item_gre_mask = {
- .protocol = RTE_BE16(0xffff),
-};
-#endif
-
-/**
- * RTE_FLOW_ITEM_TYPE_FUZZY
- *
- * Fuzzy pattern match, expect faster than default.
- *
- * This is for device that support fuzzy match option.
- * Usually a fuzzy match is fast but the cost is accuracy.
- * i.e. Signature Match only match pattern's hash value, but it is
- * possible two different patterns have the same hash value.
- *
- * Matching accuracy level can be configure by threshold.
- * Driver can divide the range of threshold and map to different
- * accuracy levels that device support.
- *
- * Threshold 0 means perfect match (no fuzziness), while threshold
- * 0xffffffff means fuzziest match.
- */
-struct rte_flow_item_fuzzy {
- uint32_t thresh; /**< Accuracy threshold. */
-};
-
-/** Default mask for RTE_FLOW_ITEM_TYPE_FUZZY. */
-#ifndef __cplusplus
-static const struct rte_flow_item_fuzzy rte_flow_item_fuzzy_mask = {
- .thresh = 0xffffffff,
-};
-#endif
-
-/**
- * RTE_FLOW_ITEM_TYPE_GTP.
- *
- * Matches a GTPv1 header.
- */
-struct rte_flow_item_gtp {
- /**
- * Version (3b), protocol type (1b), reserved (1b),
- * Extension header flag (1b),
- * Sequence number flag (1b),
- * N-PDU number flag (1b).
- */
- uint8_t v_pt_rsv_flags;
- uint8_t msg_type; /**< Message type. */
- rte_be16_t msg_len; /**< Message length. */
- rte_be32_t teid; /**< Tunnel endpoint identifier. */
-};
-
-/** Default mask for RTE_FLOW_ITEM_TYPE_GTP. */
-#ifndef __cplusplus
-static const struct rte_flow_item_gtp rte_flow_item_gtp_mask = {
- .teid = RTE_BE32(0xffffffff),
-};
-#endif
-
-/**
- * RTE_FLOW_ITEM_TYPE_ESP
- *
- * Matches an ESP header.
- */
-struct rte_flow_item_esp {
- struct esp_hdr hdr; /**< ESP header definition. */
-};
-
-/** Default mask for RTE_FLOW_ITEM_TYPE_ESP. */
-#ifndef __cplusplus
-static const struct rte_flow_item_esp rte_flow_item_esp_mask = {
- .hdr = {
- .spi = 0xffffffff,
- },
-};
-#endif
-
-/**
- * RTE_FLOW_ITEM_TYPE_GENEVE.
- *
- * Matches a GENEVE header.
- */
-struct rte_flow_item_geneve {
- /**
- * Version (2b), length of the options fields (6b), OAM packet (1b),
- * critical options present (1b), reserved 0 (6b).
- */
- rte_be16_t ver_opt_len_o_c_rsvd0;
- rte_be16_t protocol; /**< Protocol type. */
- uint8_t vni[3]; /**< Virtual Network Identifier. */
- uint8_t rsvd1; /**< Reserved, normally 0x00. */
-};
-
-/** Default mask for RTE_FLOW_ITEM_TYPE_GENEVE. */
-#ifndef __cplusplus
-static const struct rte_flow_item_geneve rte_flow_item_geneve_mask = {
- .vni = "\xff\xff\xff",
-};
-#endif
-
-/**
- * Matching pattern item definition.
- *
- * A pattern is formed by stacking items starting from the lowest protocol
- * layer to match. This stacking restriction does not apply to meta items
- * which can be placed anywhere in the stack without affecting the meaning
- * of the resulting pattern.
- *
- * Patterns are terminated by END items.
- *
- * The spec field should be a valid pointer to a structure of the related
- * item type. It may remain unspecified (NULL) in many cases to request
- * broad (nonspecific) matching. In such cases, last and mask must also be
- * set to NULL.
- *
- * Optionally, last can point to a structure of the same type to define an
- * inclusive range. This is mostly supported by integer and address fields,
- * may cause errors otherwise. Fields that do not support ranges must be set
- * to 0 or to the same value as the corresponding fields in spec.
- *
- * Only the fields defined to nonzero values in the default masks (see
- * rte_flow_item_{name}_mask constants) are considered relevant by
- * default. This can be overridden by providing a mask structure of the
- * same type with applicable bits set to one. It can also be used to
- * partially filter out specific fields (e.g. as an alternate mean to match
- * ranges of IP addresses).
- *
- * Mask is a simple bit-mask applied before interpreting the contents of
- * spec and last, which may yield unexpected results if not used
- * carefully. For example, if for an IPv4 address field, spec provides
- * 10.1.2.3, last provides 10.3.4.5 and mask provides 255.255.0.0, the
- * effective range becomes 10.1.0.0 to 10.3.255.255.
- */
-struct rte_flow_item {
- enum rte_flow_item_type type; /**< Item type. */
- const void *spec; /**< Pointer to item specification structure. */
- const void *last; /**< Defines an inclusive range (spec to last). */
- const void *mask; /**< Bit-mask applied to spec and last. */
-};
-
-/**
- * Action types.
- *
- * Each possible action is represented by a type. Some have associated
- * configuration structures. Several actions combined in a list can be
- * affected to a flow rule. That list is not ordered.
- *
- * They fall in three categories:
- *
- * - Terminating actions (such as QUEUE, DROP, RSS, PF, VF) that prevent
- * processing matched packets by subsequent flow rules, unless overridden
- * with PASSTHRU.
- *
- * - Non terminating actions (PASSTHRU, DUP) that leave matched packets up
- * for additional processing by subsequent flow rules.
- *
- * - Other non terminating meta actions that do not affect the fate of
- * packets (END, VOID, MARK, FLAG, COUNT).
- *
- * When several actions are combined in a flow rule, they should all have
- * different types (e.g. dropping a packet twice is not possible).
- *
- * Only the last action of a given type is taken into account. PMDs still
- * perform error checking on the entire list.
- *
- * Note that PASSTHRU is the only action able to override a terminating
- * rule.
- */
-enum rte_flow_action_type {
- /**
- * [META]
- *
- * End marker for action lists. Prevents further processing of
- * actions, thereby ending the list.
- *
- * No associated configuration structure.
- */
- RTE_FLOW_ACTION_TYPE_END,
-
- /**
- * [META]
- *
- * Used as a placeholder for convenience. It is ignored and simply
- * discarded by PMDs.
- *
- * No associated configuration structure.
- */
- RTE_FLOW_ACTION_TYPE_VOID,
-
- /**
- * Leaves packets up for additional processing by subsequent flow
- * rules. This is the default when a rule does not contain a
- * terminating action, but can be specified to force a rule to
- * become non-terminating.
- *
- * No associated configuration structure.
- */
- RTE_FLOW_ACTION_TYPE_PASSTHRU,
-
- /**
- * [META]
- *
- * Attaches an integer value to packets and sets PKT_RX_FDIR and
- * PKT_RX_FDIR_ID mbuf flags.
- *
- * See struct rte_flow_action_mark.
- */
- RTE_FLOW_ACTION_TYPE_MARK,
-
- /**
- * [META]
- *
- * Flags packets. Similar to MARK without a specific value; only
- * sets the PKT_RX_FDIR mbuf flag.
- *
- * No associated configuration structure.
- */
- RTE_FLOW_ACTION_TYPE_FLAG,
-
- /**
- * Assigns packets to a given queue index.
- *
- * See struct rte_flow_action_queue.
- */
- RTE_FLOW_ACTION_TYPE_QUEUE,
-
- /**
- * Drops packets.
- *
- * PASSTHRU overrides this action if both are specified.
- *
- * No associated configuration structure.
- */
- RTE_FLOW_ACTION_TYPE_DROP,
-
- /**
- * [META]
- *
- * Enables counters for this rule.
- *
- * These counters can be retrieved and reset through rte_flow_query(),
- * see struct rte_flow_query_count.
- *
- * No associated configuration structure.
- */
- RTE_FLOW_ACTION_TYPE_COUNT,
-
- /**
- * Duplicates packets to a given queue index.
- *
- * This is normally combined with QUEUE, however when used alone, it
- * is actually similar to QUEUE + PASSTHRU.
- *
- * See struct rte_flow_action_dup.
- */
- RTE_FLOW_ACTION_TYPE_DUP,
-
- /**
- * Similar to QUEUE, except RSS is additionally performed on packets
- * to spread them among several queues according to the provided
- * parameters.
- *
- * See struct rte_flow_action_rss.
- */
- RTE_FLOW_ACTION_TYPE_RSS,
-
- /**
- * Redirects packets to the physical function (PF) of the current
- * device.
- *
- * No associated configuration structure.
- */
- RTE_FLOW_ACTION_TYPE_PF,
-
- /**
- * Redirects packets to the virtual function (VF) of the current
- * device with the specified ID.
- *
- * See struct rte_flow_action_vf.
- */
- RTE_FLOW_ACTION_TYPE_VF,
-
- /**
- * Traffic metering and policing (MTR).
- *
- * See struct rte_flow_action_meter.
- * See file rte_mtr.h for MTR object configuration.
- */
- RTE_FLOW_ACTION_TYPE_METER,
-
- /**
- * Redirects packets to security engine of current device for security
- * processing as specified by security session.
- *
- * See struct rte_flow_action_security.
- */
- RTE_FLOW_ACTION_TYPE_SECURITY
-};
-
-/**
- * RTE_FLOW_ACTION_TYPE_MARK
- *
- * Attaches an integer value to packets and sets PKT_RX_FDIR and
- * PKT_RX_FDIR_ID mbuf flags.
- *
- * This value is arbitrary and application-defined. Maximum allowed value
- * depends on the underlying implementation. It is returned in the
- * hash.fdir.hi mbuf field.
- */
-struct rte_flow_action_mark {
- uint32_t id; /**< Integer value to return with packets. */
-};
-
-/**
- * RTE_FLOW_ACTION_TYPE_QUEUE
- *
- * Assign packets to a given queue index.
- *
- * Terminating by default.
- */
-struct rte_flow_action_queue {
- uint16_t index; /**< Queue index to use. */
-};
-
-/**
- * RTE_FLOW_ACTION_TYPE_COUNT (query)
- *
- * Query structure to retrieve and reset flow rule counters.
- */
-struct rte_flow_query_count {
- uint32_t reset:1; /**< Reset counters after query [in]. */
- uint32_t hits_set:1; /**< hits field is set [out]. */
- uint32_t bytes_set:1; /**< bytes field is set [out]. */
- uint32_t reserved:29; /**< Reserved, must be zero [in, out]. */
- uint64_t hits; /**< Number of hits for this rule [out]. */
- uint64_t bytes; /**< Number of bytes through this rule [out]. */
-};
-
-/**
- * RTE_FLOW_ACTION_TYPE_DUP
- *
- * Duplicates packets to a given queue index.
- *
- * This is normally combined with QUEUE, however when used alone, it is
- * actually similar to QUEUE + PASSTHRU.
- *
- * Non-terminating by default.
- */
-struct rte_flow_action_dup {
- uint16_t index; /**< Queue index to duplicate packets to. */
-};
-
-/**
- * RTE_FLOW_ACTION_TYPE_RSS
- *
- * Similar to QUEUE, except RSS is additionally performed on packets to
- * spread them among several queues according to the provided parameters.
- *
- * Note: RSS hash result is stored in the hash.rss mbuf field which overlaps
- * hash.fdir.lo. Since the MARK action sets the hash.fdir.hi field only,
- * both can be requested simultaneously.
- *
- * Terminating by default.
- */
-struct rte_flow_action_rss {
- const struct rte_eth_rss_conf *rss_conf; /**< RSS parameters. */
- uint16_t num; /**< Number of entries in queue[]. */
- uint16_t queue[]; /**< Queues indices to use. */
-};
-
-/**
- * RTE_FLOW_ACTION_TYPE_VF
- *
- * Redirects packets to a virtual function (VF) of the current device.
- *
- * Packets matched by a VF pattern item can be redirected to their original
- * VF ID instead of the specified one. This parameter may not be available
- * and is not guaranteed to work properly if the VF part is matched by a
- * prior flow rule or if packets are not addressed to a VF in the first
- * place.
- *
- * Terminating by default.
- */
-struct rte_flow_action_vf {
- uint32_t original:1; /**< Use original VF ID if possible. */
- uint32_t reserved:31; /**< Reserved, must be zero. */
- uint32_t id; /**< VF ID to redirect packets to. */
-};
-
-/**
- * RTE_FLOW_ACTION_TYPE_METER
- *
- * Traffic metering and policing (MTR).
- *
- * Packets matched by items of this type can be either dropped or passed to the
- * next item with their color set by the MTR object.
- *
- * Non-terminating by default.
- */
-struct rte_flow_action_meter {
- uint32_t mtr_id; /**< MTR object ID created with rte_mtr_create(). */
-};
-
-/**
- * RTE_FLOW_ACTION_TYPE_SECURITY
- *
- * Perform the security action on flows matched by the pattern items
- * according to the configuration of the security session.
- *
- * This action modifies the payload of matched flows. For INLINE_CRYPTO, the
- * security protocol headers and IV are fully provided by the application as
- * specified in the flow pattern. The payload of matching packets is
- * encrypted on egress, and decrypted and authenticated on ingress.
- * For INLINE_PROTOCOL, the security protocol is fully offloaded to HW,
- * providing full encapsulation and decapsulation of packets in security
- * protocols. The flow pattern specifies both the outer security header fields
- * and the inner packet fields. The security session specified in the action
- * must match the pattern parameters.
- *
- * The security session specified in the action must be created on the same
- * port as the flow action that is being specified.
- *
- * The ingress/egress flow attribute should match that specified in the
- * security session if the security session supports the definition of the
- * direction.
- *
- * Multiple flows can be configured to use the same security session.
- *
- * Non-terminating by default.
- */
-struct rte_flow_action_security {
- void *security_session; /**< Pointer to security session structure. */
-};
-
-/**
- * Definition of a single action.
- *
- * A list of actions is terminated by a END action.
- *
- * For simple actions without a configuration structure, conf remains NULL.
- */
-struct rte_flow_action {
- enum rte_flow_action_type type; /**< Action type. */
- const void *conf; /**< Pointer to action configuration structure. */
-};
-
-/**
- * Opaque type returned after successfully creating a flow.
- *
- * This handle can be used to manage and query the related flow (e.g. to
- * destroy it or retrieve counters).
- */
-struct rte_flow;
-
-/**
- * Verbose error types.
- *
- * Most of them provide the type of the object referenced by struct
- * rte_flow_error.cause.
- */
-enum rte_flow_error_type {
- RTE_FLOW_ERROR_TYPE_NONE, /**< No error. */
- RTE_FLOW_ERROR_TYPE_UNSPECIFIED, /**< Cause unspecified. */
- RTE_FLOW_ERROR_TYPE_HANDLE, /**< Flow rule (handle). */
- RTE_FLOW_ERROR_TYPE_ATTR_GROUP, /**< Group field. */
- RTE_FLOW_ERROR_TYPE_ATTR_PRIORITY, /**< Priority field. */
- RTE_FLOW_ERROR_TYPE_ATTR_INGRESS, /**< Ingress field. */
- RTE_FLOW_ERROR_TYPE_ATTR_EGRESS, /**< Egress field. */
- RTE_FLOW_ERROR_TYPE_ATTR, /**< Attributes structure. */
- RTE_FLOW_ERROR_TYPE_ITEM_NUM, /**< Pattern length. */
- RTE_FLOW_ERROR_TYPE_ITEM, /**< Specific pattern item. */
- RTE_FLOW_ERROR_TYPE_ACTION_NUM, /**< Number of actions. */
- RTE_FLOW_ERROR_TYPE_ACTION, /**< Specific action. */
-};
-
-/**
- * Verbose error structure definition.
- *
- * This object is normally allocated by applications and set by PMDs, the
- * message points to a constant string which does not need to be freed by
- * the application, however its pointer can be considered valid only as long
- * as its associated DPDK port remains configured. Closing the underlying
- * device or unloading the PMD invalidates it.
- *
- * Both cause and message may be NULL regardless of the error type.
- */
-struct rte_flow_error {
- enum rte_flow_error_type type; /**< Cause field and error types. */
- const void *cause; /**< Object responsible for the error. */
- const char *message; /**< Human-readable error message. */
-};
-
-/**
- * Check whether a flow rule can be created on a given port.
- *
- * The flow rule is validated for correctness and whether it could be accepted
- * by the device given sufficient resources. The rule is checked against the
- * current device mode and queue configuration. The flow rule may also
- * optionally be validated against existing flow rules and device resources.
- * This function has no effect on the target device.
- *
- * The returned value is guaranteed to remain valid only as long as no
- * successful calls to rte_flow_create() or rte_flow_destroy() are made in
- * the meantime and no device parameter affecting flow rules in any way are
- * modified, due to possible collisions or resource limitations (although in
- * such cases EINVAL should not be returned).
- *
- * @param port_id
- * Port identifier of Ethernet device.
- * @param[in] attr
- * Flow rule attributes.
- * @param[in] pattern
- * Pattern specification (list terminated by the END pattern item).
- * @param[in] actions
- * Associated actions (list terminated by the END action).
- * @param[out] error
- * Perform verbose error reporting if not NULL. PMDs initialize this
- * structure in case of error only.
- *
- * @return
- * 0 if flow rule is valid and can be created. A negative errno value
- * otherwise (rte_errno is also set), the following errors are defined:
- *
- * -ENOSYS: underlying device does not support this functionality.
- *
- * -EIO: underlying device is removed.
- *
- * -EINVAL: unknown or invalid rule specification.
- *
- * -ENOTSUP: valid but unsupported rule specification (e.g. partial
- * bit-masks are unsupported).
- *
- * -EEXIST: collision with an existing rule. Only returned if device
- * supports flow rule collision checking and there was a flow rule
- * collision. Not receiving this return code is no guarantee that creating
- * the rule will not fail due to a collision.
- *
- * -ENOMEM: not enough memory to execute the function, or if the device
- * supports resource validation, resource limitation on the device.
- *
- * -EBUSY: action cannot be performed due to busy device resources, may
- * succeed if the affected queues or even the entire port are in a stopped
- * state (see rte_eth_dev_rx_queue_stop() and rte_eth_dev_stop()).
- */
-int
-rte_flow_validate(uint16_t port_id,
- const struct rte_flow_attr *attr,
- const struct rte_flow_item pattern[],
- const struct rte_flow_action actions[],
- struct rte_flow_error *error);
-
-/**
- * Create a flow rule on a given port.
- *
- * @param port_id
- * Port identifier of Ethernet device.
- * @param[in] attr
- * Flow rule attributes.
- * @param[in] pattern
- * Pattern specification (list terminated by the END pattern item).
- * @param[in] actions
- * Associated actions (list terminated by the END action).
- * @param[out] error
- * Perform verbose error reporting if not NULL. PMDs initialize this
- * structure in case of error only.
- *
- * @return
- * A valid handle in case of success, NULL otherwise and rte_errno is set
- * to the positive version of one of the error codes defined for
- * rte_flow_validate().
- */
-struct rte_flow *
-rte_flow_create(uint16_t port_id,
- const struct rte_flow_attr *attr,
- const struct rte_flow_item pattern[],
- const struct rte_flow_action actions[],
- struct rte_flow_error *error);
-
-/**
- * Destroy a flow rule on a given port.
- *
- * Failure to destroy a flow rule handle may occur when other flow rules
- * depend on it, and destroying it would result in an inconsistent state.
- *
- * This function is only guaranteed to succeed if handles are destroyed in
- * reverse order of their creation.
- *
- * @param port_id
- * Port identifier of Ethernet device.
- * @param flow
- * Flow rule handle to destroy.
- * @param[out] error
- * Perform verbose error reporting if not NULL. PMDs initialize this
- * structure in case of error only.
- *
- * @return
- * 0 on success, a negative errno value otherwise and rte_errno is set.
- */
-int
-rte_flow_destroy(uint16_t port_id,
- struct rte_flow *flow,
- struct rte_flow_error *error);
-
-/**
- * Destroy all flow rules associated with a port.
- *
- * In the unlikely event of failure, handles are still considered destroyed
- * and no longer valid but the port must be assumed to be in an inconsistent
- * state.
- *
- * @param port_id
- * Port identifier of Ethernet device.
- * @param[out] error
- * Perform verbose error reporting if not NULL. PMDs initialize this
- * structure in case of error only.
- *
- * @return
- * 0 on success, a negative errno value otherwise and rte_errno is set.
- */
-int
-rte_flow_flush(uint16_t port_id,
- struct rte_flow_error *error);
-
-/**
- * Query an existing flow rule.
- *
- * This function allows retrieving flow-specific data such as counters.
- * Data is gathered by special actions which must be present in the flow
- * rule definition.
- *
- * \see RTE_FLOW_ACTION_TYPE_COUNT
- *
- * @param port_id
- * Port identifier of Ethernet device.
- * @param flow
- * Flow rule handle to query.
- * @param action
- * Action type to query.
- * @param[in, out] data
- * Pointer to storage for the associated query data type.
- * @param[out] error
- * Perform verbose error reporting if not NULL. PMDs initialize this
- * structure in case of error only.
- *
- * @return
- * 0 on success, a negative errno value otherwise and rte_errno is set.
- */
-int
-rte_flow_query(uint16_t port_id,
- struct rte_flow *flow,
- enum rte_flow_action_type action,
- void *data,
- struct rte_flow_error *error);
-
-/**
- * Restrict ingress traffic to the defined flow rules.
- *
- * Isolated mode guarantees that all ingress traffic comes from defined flow
- * rules only (current and future).
- *
- * Besides making ingress more deterministic, it allows PMDs to safely reuse
- * resources otherwise assigned to handle the remaining traffic, such as
- * global RSS configuration settings, VLAN filters, MAC address entries,
- * legacy filter API rules and so on in order to expand the set of possible
- * flow rule types.
- *
- * Calling this function as soon as possible after device initialization,
- * ideally before the first call to rte_eth_dev_configure(), is recommended
- * to avoid possible failures due to conflicting settings.
- *
- * Once effective, leaving isolated mode may not be possible depending on
- * PMD implementation.
- *
- * Additionally, the following functionality has no effect on the underlying
- * port and may return errors such as ENOTSUP ("not supported"):
- *
- * - Toggling promiscuous mode.
- * - Toggling allmulticast mode.
- * - Configuring MAC addresses.
- * - Configuring multicast addresses.
- * - Configuring VLAN filters.
- * - Configuring Rx filters through the legacy API (e.g. FDIR).
- * - Configuring global RSS settings.
- *
- * @param port_id
- * Port identifier of Ethernet device.
- * @param set
- * Nonzero to enter isolated mode, attempt to leave it otherwise.
- * @param[out] error
- * Perform verbose error reporting if not NULL. PMDs initialize this
- * structure in case of error only.
- *
- * @return
- * 0 on success, a negative errno value otherwise and rte_errno is set.
- */
-int
-rte_flow_isolate(uint16_t port_id, int set, struct rte_flow_error *error);
-
-/**
- * Initialize flow error structure.
- *
- * @param[out] error
- * Pointer to flow error structure (may be NULL).
- * @param code
- * Related error code (rte_errno).
- * @param type
- * Cause field and error types.
- * @param cause
- * Object responsible for the error.
- * @param message
- * Human-readable error message.
- *
- * @return
- * Negative error code (errno value) and rte_errno is set.
- */
-int
-rte_flow_error_set(struct rte_flow_error *error,
- int code,
- enum rte_flow_error_type type,
- const void *cause,
- const char *message);
-
-/**
- * Generic flow representation.
- *
- * This form is sufficient to describe an rte_flow independently from any
- * PMD implementation and allows for replayability and identification.
- */
-struct rte_flow_desc {
- size_t size; /**< Allocated space including data[]. */
- struct rte_flow_attr attr; /**< Attributes. */
- struct rte_flow_item *items; /**< Items. */
- struct rte_flow_action *actions; /**< Actions. */
- uint8_t data[]; /**< Storage for items/actions. */
-};
-
-/**
- * Copy an rte_flow rule description.
- *
- * @param[in] fd
- * Flow rule description.
- * @param[in] len
- * Total size of allocated data for the flow description.
- * @param[in] attr
- * Flow rule attributes.
- * @param[in] items
- * Pattern specification (list terminated by the END pattern item).
- * @param[in] actions
- * Associated actions (list terminated by the END action).
- *
- * @return
- * If len is greater or equal to the size of the flow, the total size of the
- * flow description and its data.
- * If len is lower than the size of the flow, the number of bytes that would
- * have been written to desc had it been sufficient. Nothing is written.
- */
-size_t
-rte_flow_copy(struct rte_flow_desc *fd, size_t len,
- const struct rte_flow_attr *attr,
- const struct rte_flow_item *items,
- const struct rte_flow_action *actions);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* RTE_FLOW_H_ */
diff --git a/lib/librte_ether/rte_flow_driver.h b/lib/librte_ether/rte_flow_driver.h
deleted file mode 100644
index 7778c8e0..00000000
--- a/lib/librte_ether/rte_flow_driver.h
+++ /dev/null
@@ -1,121 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright 2016 6WIND S.A.
- * Copyright 2016 Mellanox.
- */
-
-#ifndef RTE_FLOW_DRIVER_H_
-#define RTE_FLOW_DRIVER_H_
-
-/**
- * @file
- * RTE generic flow API (driver side)
- *
- * This file provides implementation helpers for internal use by PMDs, they
- * are not intended to be exposed to applications and are not subject to ABI
- * versioning.
- */
-
-#include <stdint.h>
-
-#include "rte_ethdev.h"
-#include "rte_flow.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * Generic flow operations structure implemented and returned by PMDs.
- *
- * To implement this API, PMDs must handle the RTE_ETH_FILTER_GENERIC filter
- * type in their .filter_ctrl callback function (struct eth_dev_ops) as well
- * as the RTE_ETH_FILTER_GET filter operation.
- *
- * If successful, this operation must result in a pointer to a PMD-specific
- * struct rte_flow_ops written to the argument address as described below:
- *
- * \code
- *
- * // PMD filter_ctrl callback
- *
- * static const struct rte_flow_ops pmd_flow_ops = { ... };
- *
- * switch (filter_type) {
- * case RTE_ETH_FILTER_GENERIC:
- * if (filter_op != RTE_ETH_FILTER_GET)
- * return -EINVAL;
- * *(const void **)arg = &pmd_flow_ops;
- * return 0;
- * }
- *
- * \endcode
- *
- * See also rte_flow_ops_get().
- *
- * These callback functions are not supposed to be used by applications
- * directly, which must rely on the API defined in rte_flow.h.
- *
- * Public-facing wrapper functions perform a few consistency checks so that
- * unimplemented (i.e. NULL) callbacks simply return -ENOTSUP. These
- * callbacks otherwise only differ by their first argument (with port ID
- * already resolved to a pointer to struct rte_eth_dev).
- */
-struct rte_flow_ops {
- /** See rte_flow_validate(). */
- int (*validate)
- (struct rte_eth_dev *,
- const struct rte_flow_attr *,
- const struct rte_flow_item [],
- const struct rte_flow_action [],
- struct rte_flow_error *);
- /** See rte_flow_create(). */
- struct rte_flow *(*create)
- (struct rte_eth_dev *,
- const struct rte_flow_attr *,
- const struct rte_flow_item [],
- const struct rte_flow_action [],
- struct rte_flow_error *);
- /** See rte_flow_destroy(). */
- int (*destroy)
- (struct rte_eth_dev *,
- struct rte_flow *,
- struct rte_flow_error *);
- /** See rte_flow_flush(). */
- int (*flush)
- (struct rte_eth_dev *,
- struct rte_flow_error *);
- /** See rte_flow_query(). */
- int (*query)
- (struct rte_eth_dev *,
- struct rte_flow *,
- enum rte_flow_action_type,
- void *,
- struct rte_flow_error *);
- /** See rte_flow_isolate(). */
- int (*isolate)
- (struct rte_eth_dev *,
- int,
- struct rte_flow_error *);
-};
-
-/**
- * Get generic flow operations structure from a port.
- *
- * @param port_id
- * Port identifier to query.
- * @param[out] error
- * Pointer to flow error structure.
- *
- * @return
- * The flow operations structure associated with port_id, NULL in case of
- * error, in which case rte_errno is set and the error structure contains
- * additional details.
- */
-const struct rte_flow_ops *
-rte_flow_ops_get(uint16_t port_id, struct rte_flow_error *error);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* RTE_FLOW_DRIVER_H_ */
diff --git a/lib/librte_ether/rte_mtr.c b/lib/librte_ether/rte_mtr.c
deleted file mode 100644
index 1046cb5f..00000000
--- a/lib/librte_ether/rte_mtr.c
+++ /dev/null
@@ -1,201 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2017 Intel Corporation
- */
-
-#include <stdint.h>
-
-#include <rte_errno.h>
-#include "rte_compat.h"
-#include "rte_ethdev.h"
-#include "rte_mtr_driver.h"
-#include "rte_mtr.h"
-
-/* Get generic traffic metering & policing operations structure from a port. */
-const struct rte_mtr_ops *
-rte_mtr_ops_get(uint16_t port_id, struct rte_mtr_error *error)
-{
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
- const struct rte_mtr_ops *ops;
-
- if (!rte_eth_dev_is_valid_port(port_id)) {
- rte_mtr_error_set(error,
- ENODEV,
- RTE_MTR_ERROR_TYPE_UNSPECIFIED,
- NULL,
- rte_strerror(ENODEV));
- return NULL;
- }
-
- if ((dev->dev_ops->mtr_ops_get == NULL) ||
- (dev->dev_ops->mtr_ops_get(dev, &ops) != 0) ||
- (ops == NULL)) {
- rte_mtr_error_set(error,
- ENOSYS,
- RTE_MTR_ERROR_TYPE_UNSPECIFIED,
- NULL,
- rte_strerror(ENOSYS));
- return NULL;
- }
-
- return ops;
-}
-
-#define RTE_MTR_FUNC(port_id, func) \
-({ \
- const struct rte_mtr_ops *ops = \
- rte_mtr_ops_get(port_id, error); \
- if (ops == NULL) \
- return -rte_errno; \
- \
- if (ops->func == NULL) \
- return -rte_mtr_error_set(error, \
- ENOSYS, \
- RTE_MTR_ERROR_TYPE_UNSPECIFIED, \
- NULL, \
- rte_strerror(ENOSYS)); \
- \
- ops->func; \
-})
-
-/* MTR capabilities get */
-int __rte_experimental
-rte_mtr_capabilities_get(uint16_t port_id,
- struct rte_mtr_capabilities *cap,
- struct rte_mtr_error *error)
-{
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
- return RTE_MTR_FUNC(port_id, capabilities_get)(dev,
- cap, error);
-}
-
-/* MTR meter profile add */
-int __rte_experimental
-rte_mtr_meter_profile_add(uint16_t port_id,
- uint32_t meter_profile_id,
- struct rte_mtr_meter_profile *profile,
- struct rte_mtr_error *error)
-{
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
- return RTE_MTR_FUNC(port_id, meter_profile_add)(dev,
- meter_profile_id, profile, error);
-}
-
-/** MTR meter profile delete */
-int __rte_experimental
-rte_mtr_meter_profile_delete(uint16_t port_id,
- uint32_t meter_profile_id,
- struct rte_mtr_error *error)
-{
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
- return RTE_MTR_FUNC(port_id, meter_profile_delete)(dev,
- meter_profile_id, error);
-}
-
-/** MTR object create */
-int __rte_experimental
-rte_mtr_create(uint16_t port_id,
- uint32_t mtr_id,
- struct rte_mtr_params *params,
- int shared,
- struct rte_mtr_error *error)
-{
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
- return RTE_MTR_FUNC(port_id, create)(dev,
- mtr_id, params, shared, error);
-}
-
-/** MTR object destroy */
-int __rte_experimental
-rte_mtr_destroy(uint16_t port_id,
- uint32_t mtr_id,
- struct rte_mtr_error *error)
-{
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
- return RTE_MTR_FUNC(port_id, destroy)(dev,
- mtr_id, error);
-}
-
-/** MTR object meter enable */
-int __rte_experimental
-rte_mtr_meter_enable(uint16_t port_id,
- uint32_t mtr_id,
- struct rte_mtr_error *error)
-{
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
- return RTE_MTR_FUNC(port_id, meter_enable)(dev,
- mtr_id, error);
-}
-
-/** MTR object meter disable */
-int __rte_experimental
-rte_mtr_meter_disable(uint16_t port_id,
- uint32_t mtr_id,
- struct rte_mtr_error *error)
-{
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
- return RTE_MTR_FUNC(port_id, meter_disable)(dev,
- mtr_id, error);
-}
-
-/** MTR object meter profile update */
-int __rte_experimental
-rte_mtr_meter_profile_update(uint16_t port_id,
- uint32_t mtr_id,
- uint32_t meter_profile_id,
- struct rte_mtr_error *error)
-{
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
- return RTE_MTR_FUNC(port_id, meter_profile_update)(dev,
- mtr_id, meter_profile_id, error);
-}
-
-/** MTR object meter DSCP table update */
-int __rte_experimental
-rte_mtr_meter_dscp_table_update(uint16_t port_id,
- uint32_t mtr_id,
- enum rte_mtr_color *dscp_table,
- struct rte_mtr_error *error)
-{
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
- return RTE_MTR_FUNC(port_id, meter_dscp_table_update)(dev,
- mtr_id, dscp_table, error);
-}
-
-/** MTR object policer action update */
-int __rte_experimental
-rte_mtr_policer_actions_update(uint16_t port_id,
- uint32_t mtr_id,
- uint32_t action_mask,
- enum rte_mtr_policer_action *actions,
- struct rte_mtr_error *error)
-{
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
- return RTE_MTR_FUNC(port_id, policer_actions_update)(dev,
- mtr_id, action_mask, actions, error);
-}
-
-/** MTR object enabled stats update */
-int __rte_experimental
-rte_mtr_stats_update(uint16_t port_id,
- uint32_t mtr_id,
- uint64_t stats_mask,
- struct rte_mtr_error *error)
-{
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
- return RTE_MTR_FUNC(port_id, stats_update)(dev,
- mtr_id, stats_mask, error);
-}
-
-/** MTR object stats read */
-int __rte_experimental
-rte_mtr_stats_read(uint16_t port_id,
- uint32_t mtr_id,
- struct rte_mtr_stats *stats,
- uint64_t *stats_mask,
- int clear,
- struct rte_mtr_error *error)
-{
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
- return RTE_MTR_FUNC(port_id, stats_read)(dev,
- mtr_id, stats, stats_mask, clear, error);
-}
diff --git a/lib/librte_ether/rte_mtr.h b/lib/librte_ether/rte_mtr.h
deleted file mode 100644
index c4819b27..00000000
--- a/lib/librte_ether/rte_mtr.h
+++ /dev/null
@@ -1,730 +0,0 @@
-/*-
- * BSD LICENSE
- *
- * Copyright 2017 Intel Corporation
- * Copyright 2017 NXP
- * Copyright 2017 Cavium
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name of Intel Corporation nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef __INCLUDE_RTE_MTR_H__
-#define __INCLUDE_RTE_MTR_H__
-
-/**
- * @file
- * RTE Generic Traffic Metering and Policing API
- *
- * This interface provides the ability to configure the traffic metering and
- * policing (MTR) in a generic way.
- *
- * The processing done for each input packet hitting a MTR object is:
- * A) Traffic metering: The packet is assigned a color (the meter output
- * color), based on the previous history of the flow reflected in the
- * current state of the MTR object, according to the specific traffic
- * metering algorithm. The traffic metering algorithm can typically work
- * in color aware mode, in which case the input packet already has an
- * initial color (the input color), or in color blind mode, which is
- * equivalent to considering all input packets initially colored as green.
- * B) Policing: There is a separate policer action configured for each meter
- * output color, which can:
- * a) Drop the packet.
- * b) Keep the same packet color: the policer output color matches the
- * meter output color (essentially a no-op action).
- * c) Recolor the packet: the policer output color is different than
- * the meter output color.
- * The policer output color is the output color of the packet, which is
- * set in the packet meta-data (i.e. struct rte_mbuf::sched::color).
- * C) Statistics: The set of counters maintained for each MTR object is
- * configurable and subject to the implementation support. This set
- * includes the number of packets and bytes dropped or passed for each
- * output color.
- *
- * Once successfully created, an MTR object is linked to one or several flows
- * through the meter action of the flow API.
- * A) Whether an MTR object is private to a flow or potentially shared by
- * several flows has to be specified at creation time.
- * B) Several meter actions can be potentially registered for the same flow.
- *
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice
- */
-#include <stdint.h>
-#include <rte_compat.h>
-#include <rte_common.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * Color
- */
-enum rte_mtr_color {
- RTE_MTR_GREEN = 0, /**< Green */
- RTE_MTR_YELLOW, /**< Yellow */
- RTE_MTR_RED, /**< Red */
- RTE_MTR_COLORS /**< Number of colors. */
-};
-
-/**
- * Statistics counter type
- */
-enum rte_mtr_stats_type {
- /** Number of packets passed as green by the policer. */
- RTE_MTR_STATS_N_PKTS_GREEN = 1 << 0,
-
- /** Number of packets passed as yellow by the policer. */
- RTE_MTR_STATS_N_PKTS_YELLOW = 1 << 1,
-
- /** Number of packets passed as red by the policer. */
- RTE_MTR_STATS_N_PKTS_RED = 1 << 2,
-
- /** Number of packets dropped by the policer. */
- RTE_MTR_STATS_N_PKTS_DROPPED = 1 << 3,
-
- /** Number of bytes passed as green by the policer. */
- RTE_MTR_STATS_N_BYTES_GREEN = 1 << 4,
-
- /** Number of bytes passed as yellow by the policer. */
- RTE_MTR_STATS_N_BYTES_YELLOW = 1 << 5,
-
- /** Number of bytes passed as red by the policer. */
- RTE_MTR_STATS_N_BYTES_RED = 1 << 6,
-
- /** Number of bytes dropped by the policer. */
- RTE_MTR_STATS_N_BYTES_DROPPED = 1 << 7,
-};
-
-/**
- * Statistics counters
- */
-struct rte_mtr_stats {
- /** Number of packets passed by the policer (per color). */
- uint64_t n_pkts[RTE_MTR_COLORS];
-
- /** Number of bytes passed by the policer (per color). */
- uint64_t n_bytes[RTE_MTR_COLORS];
-
- /** Number of packets dropped by the policer. */
- uint64_t n_pkts_dropped;
-
- /** Number of bytes passed by the policer. */
- uint64_t n_bytes_dropped;
-};
-
-/**
- * Traffic metering algorithms
- */
-enum rte_mtr_algorithm {
- /** No traffic metering performed, the output color is the same as the
- * input color for every input packet. The meter of the MTR object is
- * working in pass-through mode, having same effect as meter disable.
- * @see rte_mtr_meter_disable()
- */
- RTE_MTR_NONE = 0,
-
- /** Single Rate Three Color Marker (srTCM) - IETF RFC 2697. */
- RTE_MTR_SRTCM_RFC2697,
-
- /** Two Rate Three Color Marker (trTCM) - IETF RFC 2698. */
- RTE_MTR_TRTCM_RFC2698,
-
- /** Two Rate Three Color Marker (trTCM) - IETF RFC 4115. */
- RTE_MTR_TRTCM_RFC4115,
-};
-
-/**
- * Meter profile
- */
-struct rte_mtr_meter_profile {
- /** Traffic metering algorithm. */
- enum rte_mtr_algorithm alg;
-
- RTE_STD_C11
- union {
- /** Items only valid when *alg* is set to srTCM - RFC 2697. */
- struct {
- /** Committed Information Rate (CIR) (bytes/second). */
- uint64_t cir;
-
- /** Committed Burst Size (CBS) (bytes). */
- uint64_t cbs;
-
- /** Excess Burst Size (EBS) (bytes). */
- uint64_t ebs;
- } srtcm_rfc2697;
-
- /** Items only valid when *alg* is set to trTCM - RFC 2698. */
- struct {
- /** Committed Information Rate (CIR) (bytes/second). */
- uint64_t cir;
-
- /** Peak Information Rate (PIR) (bytes/second). */
- uint64_t pir;
-
- /** Committed Burst Size (CBS) (byes). */
- uint64_t cbs;
-
- /** Peak Burst Size (PBS) (bytes). */
- uint64_t pbs;
- } trtcm_rfc2698;
-
- /** Items only valid when *alg* is set to trTCM - RFC 4115. */
- struct {
- /** Committed Information Rate (CIR) (bytes/second). */
- uint64_t cir;
-
- /** Excess Information Rate (EIR) (bytes/second). */
- uint64_t eir;
-
- /** Committed Burst Size (CBS) (byes). */
- uint64_t cbs;
-
- /** Excess Burst Size (EBS) (bytes). */
- uint64_t ebs;
- } trtcm_rfc4115;
- };
-};
-
-/**
- * Policer actions
- */
-enum rte_mtr_policer_action {
- /** Recolor the packet as green. */
- MTR_POLICER_ACTION_COLOR_GREEN = 0,
-
- /** Recolor the packet as yellow. */
- MTR_POLICER_ACTION_COLOR_YELLOW,
-
- /** Recolor the packet as red. */
- MTR_POLICER_ACTION_COLOR_RED,
-
- /** Drop the packet. */
- MTR_POLICER_ACTION_DROP,
-};
-
-/**
- * Parameters for each traffic metering & policing object
- *
- * @see enum rte_mtr_stats_type
- */
-struct rte_mtr_params {
- /** Meter profile ID. */
- uint32_t meter_profile_id;
-
- /** Meter input color in case of MTR object chaining. When non-zero: if
- * a previous MTR object is enabled in the same flow, then the color
- * determined by the latest MTR object in the same flow is used as the
- * input color by the current MTR object, otherwise the current MTR
- * object uses the *dscp_table* to determine the input color. When zero:
- * the color determined by any previous MTR object in same flow is
- * ignored by the current MTR object, which uses the *dscp_table* to
- * determine the input color.
- */
- int use_prev_mtr_color;
-
- /** Meter input color. When non-NULL: it points to a pre-allocated and
- * pre-populated table with exactly 64 elements providing the input
- * color for each value of the IPv4/IPv6 Differentiated Services Code
- * Point (DSCP) input packet field. When NULL: it is equivalent to
- * setting this parameter to an all-green populated table (i.e. table
- * with all the 64 elements set to green color). The color blind mode
- * is configured by setting *use_prev_mtr_color* to 0 and *dscp_table*
- * to either NULL or to an all-green populated table. When
- * *use_prev_mtr_color* is non-zero value or when *dscp_table* contains
- * at least one yellow or red color element, then the color aware mode
- * is configured.
- */
- enum rte_mtr_color *dscp_table;
-
- /** Non-zero to enable the meter, zero to disable the meter at the time
- * of MTR object creation. Ignored when the meter profile indicated by
- * *meter_profile_id* is set to NONE.
- * @see rte_mtr_meter_disable()
- */
- int meter_enable;
-
- /** Policer actions (per meter output color). */
- enum rte_mtr_policer_action action[RTE_MTR_COLORS];
-
- /** Set of stats counters to be enabled.
- * @see enum rte_mtr_stats_type
- */
- uint64_t stats_mask;
-};
-
-/**
- * MTR capabilities
- */
-struct rte_mtr_capabilities {
- /** Maximum number of MTR objects. */
- uint32_t n_max;
-
- /** Maximum number of MTR objects that can be shared by multiple flows.
- * The value of zero indicates that shared MTR objects are not
- * supported. The maximum value is *n_max*.
- */
- uint32_t n_shared_max;
-
- /** When non-zero, this flag indicates that all the MTR objects that
- * cannot be shared by multiple flows have identical capability set.
- */
- int identical;
-
- /** When non-zero, this flag indicates that all the MTR objects that
- * can be shared by multiple flows have identical capability set.
- */
- int shared_identical;
-
- /** Maximum number of flows that can share the same MTR object. The
- * value of zero is invalid. The value of 1 means that shared MTR
- * objects not supported.
- */
- uint32_t shared_n_flows_per_mtr_max;
-
- /** Maximum number of MTR objects that can be part of the same flow. The
- * value of zero is invalid. The value of 1 indicates that MTR object
- * chaining is not supported. The maximum value is *n_max*.
- */
- uint32_t chaining_n_mtrs_per_flow_max;
-
- /**
- * When non-zero, it indicates that the packet color identified by one
- * MTR object can be used as the packet input color by any subsequent
- * MTR object from the same flow. When zero, it indicates that the color
- * determined by one MTR object is always ignored by any subsequent MTR
- * object from the same flow. Only valid when MTR chaining is supported,
- * i.e. *chaining_n_mtrs_per_flow_max* is greater than 1. When non-zero,
- * it also means that the color aware mode is supported by at least one
- * metering algorithm.
- */
- int chaining_use_prev_mtr_color_supported;
-
- /**
- * When non-zero, it indicates that the packet color identified by one
- * MTR object is always used as the packet input color by any subsequent
- * MTR object that is part of the same flow. When zero, it indicates
- * that whether the color determined by one MTR object is either ignored
- * or used as the packet input color by any subsequent MTR object from
- * the same flow is individually configurable for each MTR object. Only
- * valid when *chaining_use_prev_mtr_color_supported* is non-zero.
- */
- int chaining_use_prev_mtr_color_enforced;
-
- /** Maximum number of MTR objects that can have their meter configured
- * to run the srTCM RFC 2697 algorithm. The value of 0 indicates this
- * metering algorithm is not supported. The maximum value is *n_max*.
- */
- uint32_t meter_srtcm_rfc2697_n_max;
-
- /** Maximum number of MTR objects that can have their meter configured
- * to run the trTCM RFC 2698 algorithm. The value of 0 indicates this
- * metering algorithm is not supported. The maximum value is *n_max*.
- */
- uint32_t meter_trtcm_rfc2698_n_max;
-
- /** Maximum number of MTR objects that can have their meter configured
- * to run the trTCM RFC 4115 algorithm. The value of 0 indicates this
- * metering algorithm is not supported. The maximum value is *n_max*.
- */
- uint32_t meter_trtcm_rfc4115_n_max;
-
- /** Maximum traffic rate that can be metered by a single MTR object. For
- * srTCM RFC 2697, this is the maximum CIR rate. For trTCM RFC 2698,
- * this is the maximum PIR rate. For trTCM RFC 4115, this is the maximum
- * value for the sum of PIR and EIR rates.
- */
- uint64_t meter_rate_max;
-
- /**
- * When non-zero, it indicates that color aware mode is supported for
- * the srTCM RFC 2697 metering algorithm.
- */
- int color_aware_srtcm_rfc2697_supported;
-
- /**
- * When non-zero, it indicates that color aware mode is supported for
- * the trTCM RFC 2698 metering algorithm.
- */
- int color_aware_trtcm_rfc2698_supported;
-
- /**
- * When non-zero, it indicates that color aware mode is supported for
- * the trTCM RFC 4115 metering algorithm.
- */
- int color_aware_trtcm_rfc4115_supported;
-
- /** When non-zero, it indicates that the policer packet recolor actions
- * are supported.
- * @see enum rte_mtr_policer_action
- */
- int policer_action_recolor_supported;
-
- /** When non-zero, it indicates that the policer packet drop action is
- * supported.
- * @see enum rte_mtr_policer_action
- */
- int policer_action_drop_supported;
-
- /** Set of supported statistics counter types.
- * @see enum rte_mtr_stats_type
- */
- uint64_t stats_mask;
-};
-
-/**
- * Verbose error types.
- *
- * Most of them provide the type of the object referenced by struct
- * rte_mtr_error::cause.
- */
-enum rte_mtr_error_type {
- RTE_MTR_ERROR_TYPE_NONE, /**< No error. */
- RTE_MTR_ERROR_TYPE_UNSPECIFIED, /**< Cause unspecified. */
- RTE_MTR_ERROR_TYPE_METER_PROFILE_ID,
- RTE_MTR_ERROR_TYPE_METER_PROFILE,
- RTE_MTR_ERROR_TYPE_MTR_ID,
- RTE_MTR_ERROR_TYPE_MTR_PARAMS,
- RTE_MTR_ERROR_TYPE_POLICER_ACTION_GREEN,
- RTE_MTR_ERROR_TYPE_POLICER_ACTION_YELLOW,
- RTE_MTR_ERROR_TYPE_POLICER_ACTION_RED,
- RTE_MTR_ERROR_TYPE_STATS_MASK,
- RTE_MTR_ERROR_TYPE_STATS,
- RTE_MTR_ERROR_TYPE_SHARED,
-};
-
-/**
- * Verbose error structure definition.
- *
- * This object is normally allocated by applications and set by PMDs, the
- * message points to a constant string which does not need to be freed by
- * the application, however its pointer can be considered valid only as long
- * as its associated DPDK port remains configured. Closing the underlying
- * device or unloading the PMD invalidates it.
- *
- * Both cause and message may be NULL regardless of the error type.
- */
-struct rte_mtr_error {
- enum rte_mtr_error_type type; /**< Cause field and error type. */
- const void *cause; /**< Object responsible for the error. */
- const char *message; /**< Human-readable error message. */
-};
-
-/**
- * MTR capabilities get
- *
- * @param[in] port_id
- * The port identifier of the Ethernet device.
- * @param[out] cap
- * MTR capabilities. Needs to be pre-allocated and valid.
- * @param[out] error
- * Error details. Filled in only on error, when not NULL.
- * @return
- * 0 on success, non-zero error code otherwise.
- */
-int __rte_experimental
-rte_mtr_capabilities_get(uint16_t port_id,
- struct rte_mtr_capabilities *cap,
- struct rte_mtr_error *error);
-
-/**
- * Meter profile add
- *
- * Create a new meter profile with ID set to *meter_profile_id*. The new profile
- * is used to create one or several MTR objects.
- *
- * @param[in] port_id
- * The port identifier of the Ethernet device.
- * @param[in] meter_profile_id
- * ID for the new meter profile. Needs to be unused by any of the existing
- * meter profiles added for the current port.
- * @param[in] profile
- * Meter profile parameters. Needs to be pre-allocated and valid.
- * @param[out] error
- * Error details. Filled in only on error, when not NULL.
- * @return
- * 0 on success, non-zero error code otherwise.
- */
-int __rte_experimental
-rte_mtr_meter_profile_add(uint16_t port_id,
- uint32_t meter_profile_id,
- struct rte_mtr_meter_profile *profile,
- struct rte_mtr_error *error);
-
-/**
- * Meter profile delete
- *
- * Delete an existing meter profile. This operation fails when there is
- * currently at least one user (i.e. MTR object) of this profile.
- *
- * @param[in] port_id
- * The port identifier of the Ethernet device.
- * @param[in] meter_profile_id
- * Meter profile ID. Needs to be the valid.
- * @param[out] error
- * Error details. Filled in only on error, when not NULL.
- * @return
- * 0 on success, non-zero error code otherwise.
- */
-int __rte_experimental
-rte_mtr_meter_profile_delete(uint16_t port_id,
- uint32_t meter_profile_id,
- struct rte_mtr_error *error);
-
-/**
- * MTR object create
- *
- * Create a new MTR object for the current port. This object is run as part of
- * associated flow action for traffic metering and policing.
- *
- * @param[in] port_id
- * The port identifier of the Ethernet device.
- * @param[in] mtr_id
- * MTR object ID. Needs to be unused by any of the existing MTR objects.
- * created for the current port.
- * @param[in] params
- * MTR object params. Needs to be pre-allocated and valid.
- * @param[in] shared
- * Non-zero when this MTR object can be shared by multiple flows, zero when
- * this MTR object can be used by a single flow.
- * @param[out] error
- * Error details. Filled in only on error, when not NULL.
- * @return
- * 0 on success, non-zero error code otherwise.
- *
- * @see enum rte_flow_action_type::RTE_FLOW_ACTION_TYPE_METER
- */
-int __rte_experimental
-rte_mtr_create(uint16_t port_id,
- uint32_t mtr_id,
- struct rte_mtr_params *params,
- int shared,
- struct rte_mtr_error *error);
-
-/**
- * MTR object destroy
- *
- * Delete an existing MTR object. This operation fails when there is currently
- * at least one user (i.e. flow) of this MTR object.
- *
- * @param[in] port_id
- * The port identifier of the Ethernet device.
- * @param[in] mtr_id
- * MTR object ID. Needs to be valid.
- * created for the current port.
- * @param[out] error
- * Error details. Filled in only on error, when not NULL.
- * @return
- * 0 on success, non-zero error code otherwise.
- */
-int __rte_experimental
-rte_mtr_destroy(uint16_t port_id,
- uint32_t mtr_id,
- struct rte_mtr_error *error);
-
-/**
- * MTR object meter disable
- *
- * Disable the meter of an existing MTR object. In disabled state, the meter of
- * the current MTR object works in pass-through mode, meaning that for each
- * input packet the meter output color is always the same as the input color. In
- * particular, when the meter of the current MTR object is configured in color
- * blind mode, the input color is always green, so the meter output color is
- * also always green. Note that the policer and the statistics of the current
- * MTR object are working as usual while the meter is disabled. No action is
- * taken and this function returns successfully when the meter of the current
- * MTR object is already disabled.
- *
- * @param[in] port_id
- * The port identifier of the Ethernet device.
- * @param[in] mtr_id
- * MTR object ID.
- * @param[out] error
- * Error details. Filled in only on error, when not NULL.
- * @return
- * 0 on success, non-zero error code otherwise.
- */
-int __rte_experimental
-rte_mtr_meter_disable(uint16_t port_id,
- uint32_t mtr_id,
- struct rte_mtr_error *error);
-
-/**
- * MTR object meter enable
- *
- * Enable the meter of an existing MTR object. If the MTR object has its meter
- * already enabled, then no action is taken and this function returns
- * successfully.
- *
- * @param[in] port_id
- * The port identifier of the Ethernet device.
- * @param[in] mtr_id
- * MTR object ID.
- * @param[out] error
- * Error details. Filled in only on error, when not NULL.
- * @return
- * 0 on success, non-zero error code otherwise.
- */
-int __rte_experimental
-rte_mtr_meter_enable(uint16_t port_id,
- uint32_t mtr_id,
- struct rte_mtr_error *error);
-
-/**
- * MTR object meter profile update
- *
- * @param[in] port_id
- * The port identifier of the Ethernet device.
- * @param[in] mtr_id
- * MTR object ID. Needs to be valid.
- * @param[in] meter_profile_id
- * Meter profile ID for the current MTR object. Needs to be valid.
- * @param[out] error
- * Error details. Filled in only on error, when not NULL.
- * @return
- * 0 on success, non-zero error code otherwise.
- */
-int __rte_experimental
-rte_mtr_meter_profile_update(uint16_t port_id,
- uint32_t mtr_id,
- uint32_t meter_profile_id,
- struct rte_mtr_error *error);
-
-/**
- * MTR object DSCP table update
- *
- * @param[in] port_id
- * The port identifier of the Ethernet device.
- * @param[in] mtr_id
- * MTR object ID. Needs to be valid.
- * @param[in] dscp_table
- * When non-NULL: it points to a pre-allocated and pre-populated table with
- * exactly 64 elements providing the input color for each value of the
- * IPv4/IPv6 Differentiated Services Code Point (DSCP) input packet field.
- * When NULL: it is equivalent to setting this parameter to an “all-green”
- * populated table (i.e. table with all the 64 elements set to green color).
- * @param[out] error
- * Error details. Filled in only on error, when not NULL.
- * @return
- * 0 on success, non-zero error code otherwise.
- */
-int __rte_experimental
-rte_mtr_meter_dscp_table_update(uint16_t port_id,
- uint32_t mtr_id,
- enum rte_mtr_color *dscp_table,
- struct rte_mtr_error *error);
-
-/**
- * MTR object policer actions update
- *
- * @param[in] port_id
- * The port identifier of the Ethernet device.
- * @param[in] mtr_id
- * MTR object ID. Needs to be valid.
- * @param[in] action_mask
- * Bit mask indicating which policer actions need to be updated. One or more
- * policer actions can be updated in a single function invocation. To update
- * the policer action associated with color C, bit (1 << C) needs to be set in
- * *action_mask* and element at position C in the *actions* array needs to be
- * valid.
- * @param[in] actions
- * Pre-allocated and pre-populated array of policer actions.
- * @param[out] error
- * Error details. Filled in only on error, when not NULL.
- * @return
- * 0 on success, non-zero error code otherwise.
- */
-int __rte_experimental
-rte_mtr_policer_actions_update(uint16_t port_id,
- uint32_t mtr_id,
- uint32_t action_mask,
- enum rte_mtr_policer_action *actions,
- struct rte_mtr_error *error);
-
-/**
- * MTR object enabled statistics counters update
- *
- * @param[in] port_id
- * The port identifier of the Ethernet device.
- * @param[in] mtr_id
- * MTR object ID. Needs to be valid.
- * @param[in] stats_mask
- * Mask of statistics counter types to be enabled for the current MTR object.
- * Any statistics counter type not included in this set is to be disabled for
- * the current MTR object.
- * @param[out] error
- * Error details. Filled in only on error, when not NULL.
- * @return
- * 0 on success, non-zero error code otherwise.
- *
- * @see enum rte_mtr_stats_type
- */
-int __rte_experimental
-rte_mtr_stats_update(uint16_t port_id,
- uint32_t mtr_id,
- uint64_t stats_mask,
- struct rte_mtr_error *error);
-
-/**
- * MTR object statistics counters read
- *
- * @param[in] port_id
- * The port identifier of the Ethernet device.
- * @param[in] mtr_id
- * MTR object ID. Needs to be valid.
- * @param[out] stats
- * When non-NULL, it contains the current value for the statistics counters
- * enabled for the current MTR object.
- * @param[out] stats_mask
- * When non-NULL, it contains the mask of statistics counter types that are
- * currently enabled for this MTR object, indicating which of the counters
- * retrieved with the *stats* structure are valid.
- * @param[in] clear
- * When this parameter has a non-zero value, the statistics counters are
- * cleared (i.e. set to zero) immediately after they have been read,
- * otherwise the statistics counters are left untouched.
- * @param[out] error
- * Error details. Filled in only on error, when not NULL.
- * @return
- * 0 on success, non-zero error code otherwise.
- *
- * @see enum rte_mtr_stats_type
- */
-int __rte_experimental
-rte_mtr_stats_read(uint16_t port_id,
- uint32_t mtr_id,
- struct rte_mtr_stats *stats,
- uint64_t *stats_mask,
- int clear,
- struct rte_mtr_error *error);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __INCLUDE_RTE_MTR_H__ */
diff --git a/lib/librte_ether/rte_mtr_driver.h b/lib/librte_ether/rte_mtr_driver.h
deleted file mode 100644
index c9a6d7c3..00000000
--- a/lib/librte_ether/rte_mtr_driver.h
+++ /dev/null
@@ -1,192 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2017 Intel Corporation
- */
-
-#ifndef __INCLUDE_RTE_MTR_DRIVER_H__
-#define __INCLUDE_RTE_MTR_DRIVER_H__
-
-/**
- * @file
- * RTE Generic Traffic Metering and Policing API (Driver Side)
- *
- * This file provides implementation helpers for internal use by PMDs, they
- * are not intended to be exposed to applications and are not subject to ABI
- * versioning.
- */
-
-#include <stdint.h>
-
-#include <rte_errno.h>
-#include "rte_ethdev.h"
-#include "rte_mtr.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-typedef int (*rte_mtr_capabilities_get_t)(struct rte_eth_dev *dev,
- struct rte_mtr_capabilities *cap,
- struct rte_mtr_error *error);
-/**< @internal MTR capabilities get */
-
-typedef int (*rte_mtr_meter_profile_add_t)(struct rte_eth_dev *dev,
- uint32_t meter_profile_id,
- struct rte_mtr_meter_profile *profile,
- struct rte_mtr_error *error);
-/**< @internal MTR meter profile add */
-
-typedef int (*rte_mtr_meter_profile_delete_t)(struct rte_eth_dev *dev,
- uint32_t meter_profile_id,
- struct rte_mtr_error *error);
-/**< @internal MTR meter profile delete */
-
-typedef int (*rte_mtr_create_t)(struct rte_eth_dev *dev,
- uint32_t mtr_id,
- struct rte_mtr_params *params,
- int shared,
- struct rte_mtr_error *error);
-/**< @internal MTR object create */
-
-typedef int (*rte_mtr_destroy_t)(struct rte_eth_dev *dev,
- uint32_t mtr_id,
- struct rte_mtr_error *error);
-/**< @internal MTR object destroy */
-
-typedef int (*rte_mtr_meter_enable_t)(struct rte_eth_dev *dev,
- uint32_t mtr_id,
- struct rte_mtr_error *error);
-/**< @internal MTR object meter enable */
-
-typedef int (*rte_mtr_meter_disable_t)(struct rte_eth_dev *dev,
- uint32_t mtr_id,
- struct rte_mtr_error *error);
-/**< @internal MTR object meter disable */
-
-typedef int (*rte_mtr_meter_profile_update_t)(struct rte_eth_dev *dev,
- uint32_t mtr_id,
- uint32_t meter_profile_id,
- struct rte_mtr_error *error);
-/**< @internal MTR object meter profile update */
-
-typedef int (*rte_mtr_meter_dscp_table_update_t)(struct rte_eth_dev *dev,
- uint32_t mtr_id,
- enum rte_mtr_color *dscp_table,
- struct rte_mtr_error *error);
-/**< @internal MTR object meter DSCP table update */
-
-typedef int (*rte_mtr_policer_actions_update_t)(struct rte_eth_dev *dev,
- uint32_t mtr_id,
- uint32_t action_mask,
- enum rte_mtr_policer_action *actions,
- struct rte_mtr_error *error);
-/**< @internal MTR object policer action update*/
-
-typedef int (*rte_mtr_stats_update_t)(struct rte_eth_dev *dev,
- uint32_t mtr_id,
- uint64_t stats_mask,
- struct rte_mtr_error *error);
-/**< @internal MTR object enabled stats update */
-
-typedef int (*rte_mtr_stats_read_t)(struct rte_eth_dev *dev,
- uint32_t mtr_id,
- struct rte_mtr_stats *stats,
- uint64_t *stats_mask,
- int clear,
- struct rte_mtr_error *error);
-/**< @internal MTR object stats read */
-
-struct rte_mtr_ops {
- /** MTR capabilities get */
- rte_mtr_capabilities_get_t capabilities_get;
-
- /** MTR meter profile add */
- rte_mtr_meter_profile_add_t meter_profile_add;
-
- /** MTR meter profile delete */
- rte_mtr_meter_profile_delete_t meter_profile_delete;
-
- /** MTR object create */
- rte_mtr_create_t create;
-
- /** MTR object destroy */
- rte_mtr_destroy_t destroy;
-
- /** MTR object meter enable */
- rte_mtr_meter_enable_t meter_enable;
-
- /** MTR object meter disable */
- rte_mtr_meter_disable_t meter_disable;
-
- /** MTR object meter profile update */
- rte_mtr_meter_profile_update_t meter_profile_update;
-
- /** MTR object meter DSCP table update */
- rte_mtr_meter_dscp_table_update_t meter_dscp_table_update;
-
- /** MTR object policer action update */
- rte_mtr_policer_actions_update_t policer_actions_update;
-
- /** MTR object enabled stats update */
- rte_mtr_stats_update_t stats_update;
-
- /** MTR object stats read */
- rte_mtr_stats_read_t stats_read;
-};
-
-/**
- * Initialize generic error structure.
- *
- * This function also sets rte_errno to a given value.
- *
- * @param[out] error
- * Pointer to error structure (may be NULL).
- * @param[in] code
- * Related error code (rte_errno).
- * @param[in] type
- * Cause field and error type.
- * @param[in] cause
- * Object responsible for the error.
- * @param[in] message
- * Human-readable error message.
- *
- * @return
- * Error code.
- */
-static inline int
-rte_mtr_error_set(struct rte_mtr_error *error,
- int code,
- enum rte_mtr_error_type type,
- const void *cause,
- const char *message)
-{
- if (error) {
- *error = (struct rte_mtr_error){
- .type = type,
- .cause = cause,
- .message = message,
- };
- }
- rte_errno = code;
- return code;
-}
-
-/**
- * Get generic traffic metering and policing operations structure from a port
- *
- * @param[in] port_id
- * The port identifier of the Ethernet device.
- * @param[out] error
- * Error details
- *
- * @return
- * The traffic metering and policing operations structure associated with
- * port_id on success, NULL otherwise.
- */
-const struct rte_mtr_ops *
-rte_mtr_ops_get(uint16_t port_id, struct rte_mtr_error *error);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __INCLUDE_RTE_MTR_DRIVER_H__ */
diff --git a/lib/librte_ether/rte_tm.c b/lib/librte_ether/rte_tm.c
deleted file mode 100644
index 9709454f..00000000
--- a/lib/librte_ether/rte_tm.c
+++ /dev/null
@@ -1,409 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2017 Intel Corporation
- */
-
-#include <stdint.h>
-
-#include <rte_errno.h>
-#include "rte_ethdev.h"
-#include "rte_tm_driver.h"
-#include "rte_tm.h"
-
-/* Get generic traffic manager operations structure from a port. */
-const struct rte_tm_ops *
-rte_tm_ops_get(uint16_t port_id, struct rte_tm_error *error)
-{
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
- const struct rte_tm_ops *ops;
-
- if (!rte_eth_dev_is_valid_port(port_id)) {
- rte_tm_error_set(error,
- ENODEV,
- RTE_TM_ERROR_TYPE_UNSPECIFIED,
- NULL,
- rte_strerror(ENODEV));
- return NULL;
- }
-
- if ((dev->dev_ops->tm_ops_get == NULL) ||
- (dev->dev_ops->tm_ops_get(dev, &ops) != 0) ||
- (ops == NULL)) {
- rte_tm_error_set(error,
- ENOSYS,
- RTE_TM_ERROR_TYPE_UNSPECIFIED,
- NULL,
- rte_strerror(ENOSYS));
- return NULL;
- }
-
- return ops;
-}
-
-#define RTE_TM_FUNC(port_id, func) \
-({ \
- const struct rte_tm_ops *ops = \
- rte_tm_ops_get(port_id, error); \
- if (ops == NULL) \
- return -rte_errno; \
- \
- if (ops->func == NULL) \
- return -rte_tm_error_set(error, \
- ENOSYS, \
- RTE_TM_ERROR_TYPE_UNSPECIFIED, \
- NULL, \
- rte_strerror(ENOSYS)); \
- \
- ops->func; \
-})
-
-/* Get number of leaf nodes */
-int
-rte_tm_get_number_of_leaf_nodes(uint16_t port_id,
- uint32_t *n_leaf_nodes,
- struct rte_tm_error *error)
-{
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
- const struct rte_tm_ops *ops =
- rte_tm_ops_get(port_id, error);
-
- if (ops == NULL)
- return -rte_errno;
-
- if (n_leaf_nodes == NULL) {
- rte_tm_error_set(error,
- EINVAL,
- RTE_TM_ERROR_TYPE_UNSPECIFIED,
- NULL,
- rte_strerror(EINVAL));
- return -rte_errno;
- }
-
- *n_leaf_nodes = dev->data->nb_tx_queues;
- return 0;
-}
-
-/* Check node type (leaf or non-leaf) */
-int
-rte_tm_node_type_get(uint16_t port_id,
- uint32_t node_id,
- int *is_leaf,
- struct rte_tm_error *error)
-{
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
- return RTE_TM_FUNC(port_id, node_type_get)(dev,
- node_id, is_leaf, error);
-}
-
-/* Get capabilities */
-int rte_tm_capabilities_get(uint16_t port_id,
- struct rte_tm_capabilities *cap,
- struct rte_tm_error *error)
-{
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
- return RTE_TM_FUNC(port_id, capabilities_get)(dev,
- cap, error);
-}
-
-/* Get level capabilities */
-int rte_tm_level_capabilities_get(uint16_t port_id,
- uint32_t level_id,
- struct rte_tm_level_capabilities *cap,
- struct rte_tm_error *error)
-{
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
- return RTE_TM_FUNC(port_id, level_capabilities_get)(dev,
- level_id, cap, error);
-}
-
-/* Get node capabilities */
-int rte_tm_node_capabilities_get(uint16_t port_id,
- uint32_t node_id,
- struct rte_tm_node_capabilities *cap,
- struct rte_tm_error *error)
-{
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
- return RTE_TM_FUNC(port_id, node_capabilities_get)(dev,
- node_id, cap, error);
-}
-
-/* Add WRED profile */
-int rte_tm_wred_profile_add(uint16_t port_id,
- uint32_t wred_profile_id,
- struct rte_tm_wred_params *profile,
- struct rte_tm_error *error)
-{
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
- return RTE_TM_FUNC(port_id, wred_profile_add)(dev,
- wred_profile_id, profile, error);
-}
-
-/* Delete WRED profile */
-int rte_tm_wred_profile_delete(uint16_t port_id,
- uint32_t wred_profile_id,
- struct rte_tm_error *error)
-{
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
- return RTE_TM_FUNC(port_id, wred_profile_delete)(dev,
- wred_profile_id, error);
-}
-
-/* Add/update shared WRED context */
-int rte_tm_shared_wred_context_add_update(uint16_t port_id,
- uint32_t shared_wred_context_id,
- uint32_t wred_profile_id,
- struct rte_tm_error *error)
-{
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
- return RTE_TM_FUNC(port_id, shared_wred_context_add_update)(dev,
- shared_wred_context_id, wred_profile_id, error);
-}
-
-/* Delete shared WRED context */
-int rte_tm_shared_wred_context_delete(uint16_t port_id,
- uint32_t shared_wred_context_id,
- struct rte_tm_error *error)
-{
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
- return RTE_TM_FUNC(port_id, shared_wred_context_delete)(dev,
- shared_wred_context_id, error);
-}
-
-/* Add shaper profile */
-int rte_tm_shaper_profile_add(uint16_t port_id,
- uint32_t shaper_profile_id,
- struct rte_tm_shaper_params *profile,
- struct rte_tm_error *error)
-{
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
- return RTE_TM_FUNC(port_id, shaper_profile_add)(dev,
- shaper_profile_id, profile, error);
-}
-
-/* Delete WRED profile */
-int rte_tm_shaper_profile_delete(uint16_t port_id,
- uint32_t shaper_profile_id,
- struct rte_tm_error *error)
-{
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
- return RTE_TM_FUNC(port_id, shaper_profile_delete)(dev,
- shaper_profile_id, error);
-}
-
-/* Add shared shaper */
-int rte_tm_shared_shaper_add_update(uint16_t port_id,
- uint32_t shared_shaper_id,
- uint32_t shaper_profile_id,
- struct rte_tm_error *error)
-{
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
- return RTE_TM_FUNC(port_id, shared_shaper_add_update)(dev,
- shared_shaper_id, shaper_profile_id, error);
-}
-
-/* Delete shared shaper */
-int rte_tm_shared_shaper_delete(uint16_t port_id,
- uint32_t shared_shaper_id,
- struct rte_tm_error *error)
-{
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
- return RTE_TM_FUNC(port_id, shared_shaper_delete)(dev,
- shared_shaper_id, error);
-}
-
-/* Add node to port traffic manager hierarchy */
-int rte_tm_node_add(uint16_t port_id,
- uint32_t node_id,
- uint32_t parent_node_id,
- uint32_t priority,
- uint32_t weight,
- uint32_t level_id,
- struct rte_tm_node_params *params,
- struct rte_tm_error *error)
-{
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
- return RTE_TM_FUNC(port_id, node_add)(dev,
- node_id, parent_node_id, priority, weight, level_id,
- params, error);
-}
-
-/* Delete node from traffic manager hierarchy */
-int rte_tm_node_delete(uint16_t port_id,
- uint32_t node_id,
- struct rte_tm_error *error)
-{
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
- return RTE_TM_FUNC(port_id, node_delete)(dev,
- node_id, error);
-}
-
-/* Suspend node */
-int rte_tm_node_suspend(uint16_t port_id,
- uint32_t node_id,
- struct rte_tm_error *error)
-{
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
- return RTE_TM_FUNC(port_id, node_suspend)(dev,
- node_id, error);
-}
-
-/* Resume node */
-int rte_tm_node_resume(uint16_t port_id,
- uint32_t node_id,
- struct rte_tm_error *error)
-{
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
- return RTE_TM_FUNC(port_id, node_resume)(dev,
- node_id, error);
-}
-
-/* Commit the initial port traffic manager hierarchy */
-int rte_tm_hierarchy_commit(uint16_t port_id,
- int clear_on_fail,
- struct rte_tm_error *error)
-{
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
- return RTE_TM_FUNC(port_id, hierarchy_commit)(dev,
- clear_on_fail, error);
-}
-
-/* Update node parent */
-int rte_tm_node_parent_update(uint16_t port_id,
- uint32_t node_id,
- uint32_t parent_node_id,
- uint32_t priority,
- uint32_t weight,
- struct rte_tm_error *error)
-{
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
- return RTE_TM_FUNC(port_id, node_parent_update)(dev,
- node_id, parent_node_id, priority, weight, error);
-}
-
-/* Update node private shaper */
-int rte_tm_node_shaper_update(uint16_t port_id,
- uint32_t node_id,
- uint32_t shaper_profile_id,
- struct rte_tm_error *error)
-{
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
- return RTE_TM_FUNC(port_id, node_shaper_update)(dev,
- node_id, shaper_profile_id, error);
-}
-
-/* Update node shared shapers */
-int rte_tm_node_shared_shaper_update(uint16_t port_id,
- uint32_t node_id,
- uint32_t shared_shaper_id,
- int add,
- struct rte_tm_error *error)
-{
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
- return RTE_TM_FUNC(port_id, node_shared_shaper_update)(dev,
- node_id, shared_shaper_id, add, error);
-}
-
-/* Update node stats */
-int rte_tm_node_stats_update(uint16_t port_id,
- uint32_t node_id,
- uint64_t stats_mask,
- struct rte_tm_error *error)
-{
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
- return RTE_TM_FUNC(port_id, node_stats_update)(dev,
- node_id, stats_mask, error);
-}
-
-/* Update WFQ weight mode */
-int rte_tm_node_wfq_weight_mode_update(uint16_t port_id,
- uint32_t node_id,
- int *wfq_weight_mode,
- uint32_t n_sp_priorities,
- struct rte_tm_error *error)
-{
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
- return RTE_TM_FUNC(port_id, node_wfq_weight_mode_update)(dev,
- node_id, wfq_weight_mode, n_sp_priorities, error);
-}
-
-/* Update node congestion management mode */
-int rte_tm_node_cman_update(uint16_t port_id,
- uint32_t node_id,
- enum rte_tm_cman_mode cman,
- struct rte_tm_error *error)
-{
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
- return RTE_TM_FUNC(port_id, node_cman_update)(dev,
- node_id, cman, error);
-}
-
-/* Update node private WRED context */
-int rte_tm_node_wred_context_update(uint16_t port_id,
- uint32_t node_id,
- uint32_t wred_profile_id,
- struct rte_tm_error *error)
-{
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
- return RTE_TM_FUNC(port_id, node_wred_context_update)(dev,
- node_id, wred_profile_id, error);
-}
-
-/* Update node shared WRED context */
-int rte_tm_node_shared_wred_context_update(uint16_t port_id,
- uint32_t node_id,
- uint32_t shared_wred_context_id,
- int add,
- struct rte_tm_error *error)
-{
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
- return RTE_TM_FUNC(port_id, node_shared_wred_context_update)(dev,
- node_id, shared_wred_context_id, add, error);
-}
-
-/* Read and/or clear stats counters for specific node */
-int rte_tm_node_stats_read(uint16_t port_id,
- uint32_t node_id,
- struct rte_tm_node_stats *stats,
- uint64_t *stats_mask,
- int clear,
- struct rte_tm_error *error)
-{
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
- return RTE_TM_FUNC(port_id, node_stats_read)(dev,
- node_id, stats, stats_mask, clear, error);
-}
-
-/* Packet marking - VLAN DEI */
-int rte_tm_mark_vlan_dei(uint16_t port_id,
- int mark_green,
- int mark_yellow,
- int mark_red,
- struct rte_tm_error *error)
-{
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
- return RTE_TM_FUNC(port_id, mark_vlan_dei)(dev,
- mark_green, mark_yellow, mark_red, error);
-}
-
-/* Packet marking - IPv4/IPv6 ECN */
-int rte_tm_mark_ip_ecn(uint16_t port_id,
- int mark_green,
- int mark_yellow,
- int mark_red,
- struct rte_tm_error *error)
-{
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
- return RTE_TM_FUNC(port_id, mark_ip_ecn)(dev,
- mark_green, mark_yellow, mark_red, error);
-}
-
-/* Packet marking - IPv4/IPv6 DSCP */
-int rte_tm_mark_ip_dscp(uint16_t port_id,
- int mark_green,
- int mark_yellow,
- int mark_red,
- struct rte_tm_error *error)
-{
- struct rte_eth_dev *dev = &rte_eth_devices[port_id];
- return RTE_TM_FUNC(port_id, mark_ip_dscp)(dev,
- mark_green, mark_yellow, mark_red, error);
-}
diff --git a/lib/librte_ether/rte_tm.h b/lib/librte_ether/rte_tm.h
deleted file mode 100644
index 2b25a871..00000000
--- a/lib/librte_ether/rte_tm.h
+++ /dev/null
@@ -1,1912 +0,0 @@
-/*-
- * BSD LICENSE
- *
- * Copyright(c) 2017 Intel Corporation.
- * Copyright(c) 2017 Cavium.
- * Copyright(c) 2017 NXP.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name of Intel Corporation nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef __INCLUDE_RTE_TM_H__
-#define __INCLUDE_RTE_TM_H__
-
-/**
- * @file
- * RTE Generic Traffic Manager API
- *
- * This interface provides the ability to configure the traffic manager in a
- * generic way. It includes features such as: hierarchical scheduling,
- * traffic shaping, congestion management, packet marking, etc.
- *
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice
- */
-
-#include <stdint.h>
-
-#include <rte_common.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * Ethernet framing overhead.
- *
- * Overhead fields per Ethernet frame:
- * 1. Preamble: 7 bytes;
- * 2. Start of Frame Delimiter (SFD): 1 byte;
- * 3. Inter-Frame Gap (IFG): 12 bytes.
- *
- * One of the typical values for the *pkt_length_adjust* field of the shaper
- * profile.
- *
- * @see struct rte_tm_shaper_params
- */
-#define RTE_TM_ETH_FRAMING_OVERHEAD 20
-
-/**
- * Ethernet framing overhead including the Frame Check Sequence (FCS) field.
- * Useful when FCS is generated and added at the end of the Ethernet frame on
- * TX side without any SW intervention.
- *
- * One of the typical values for the pkt_length_adjust field of the shaper
- * profile.
- *
- * @see struct rte_tm_shaper_params
- */
-#define RTE_TM_ETH_FRAMING_OVERHEAD_FCS 24
-
-/**
- * Invalid WRED profile ID.
- *
- * @see struct rte_tm_node_params
- * @see rte_tm_node_add()
- * @see rte_tm_node_wred_context_update()
- */
-#define RTE_TM_WRED_PROFILE_ID_NONE UINT32_MAX
-
-/**
- *Invalid shaper profile ID.
- *
- * @see struct rte_tm_node_params
- * @see rte_tm_node_add()
- * @see rte_tm_node_shaper_update()
- */
-#define RTE_TM_SHAPER_PROFILE_ID_NONE UINT32_MAX
-
-/**
- * Node ID for the parent of the root node.
- *
- * @see rte_tm_node_add()
- */
-#define RTE_TM_NODE_ID_NULL UINT32_MAX
-
-/**
- * Node level ID used to disable level ID checking.
- *
- * @see rte_tm_node_add()
- */
-#define RTE_TM_NODE_LEVEL_ID_ANY UINT32_MAX
-
-/**
- * Color
- */
-enum rte_tm_color {
- RTE_TM_GREEN = 0, /**< Green */
- RTE_TM_YELLOW, /**< Yellow */
- RTE_TM_RED, /**< Red */
- RTE_TM_COLORS /**< Number of colors */
-};
-
-/**
- * Node statistics counter type
- */
-enum rte_tm_stats_type {
- /** Number of packets scheduled from current node. */
- RTE_TM_STATS_N_PKTS = 1 << 0,
-
- /** Number of bytes scheduled from current node. */
- RTE_TM_STATS_N_BYTES = 1 << 1,
-
- /** Number of green packets dropped by current leaf node. */
- RTE_TM_STATS_N_PKTS_GREEN_DROPPED = 1 << 2,
-
- /** Number of yellow packets dropped by current leaf node. */
- RTE_TM_STATS_N_PKTS_YELLOW_DROPPED = 1 << 3,
-
- /** Number of red packets dropped by current leaf node. */
- RTE_TM_STATS_N_PKTS_RED_DROPPED = 1 << 4,
-
- /** Number of green bytes dropped by current leaf node. */
- RTE_TM_STATS_N_BYTES_GREEN_DROPPED = 1 << 5,
-
- /** Number of yellow bytes dropped by current leaf node. */
- RTE_TM_STATS_N_BYTES_YELLOW_DROPPED = 1 << 6,
-
- /** Number of red bytes dropped by current leaf node. */
- RTE_TM_STATS_N_BYTES_RED_DROPPED = 1 << 7,
-
- /** Number of packets currently waiting in the packet queue of current
- * leaf node.
- */
- RTE_TM_STATS_N_PKTS_QUEUED = 1 << 8,
-
- /** Number of bytes currently waiting in the packet queue of current
- * leaf node.
- */
- RTE_TM_STATS_N_BYTES_QUEUED = 1 << 9,
-};
-
-/**
- * Node statistics counters
- */
-struct rte_tm_node_stats {
- /** Number of packets scheduled from current node. */
- uint64_t n_pkts;
-
- /** Number of bytes scheduled from current node. */
- uint64_t n_bytes;
-
- /** Statistics counters for leaf nodes only. */
- struct {
- /** Number of packets dropped by current leaf node per each
- * color.
- */
- uint64_t n_pkts_dropped[RTE_TM_COLORS];
-
- /** Number of bytes dropped by current leaf node per each
- * color.
- */
- uint64_t n_bytes_dropped[RTE_TM_COLORS];
-
- /** Number of packets currently waiting in the packet queue of
- * current leaf node.
- */
- uint64_t n_pkts_queued;
-
- /** Number of bytes currently waiting in the packet queue of
- * current leaf node.
- */
- uint64_t n_bytes_queued;
- } leaf;
-};
-
-/**
- * Traffic manager dynamic updates
- */
-enum rte_tm_dynamic_update_type {
- /** Dynamic parent node update. The new parent node is located on same
- * hierarchy level as the former parent node. Consequently, the node
- * whose parent is changed preserves its hierarchy level.
- */
- RTE_TM_UPDATE_NODE_PARENT_KEEP_LEVEL = 1 << 0,
-
- /** Dynamic parent node update. The new parent node is located on
- * different hierarchy level than the former parent node. Consequently,
- * the node whose parent is changed also changes its hierarchy level.
- */
- RTE_TM_UPDATE_NODE_PARENT_CHANGE_LEVEL = 1 << 1,
-
- /** Dynamic node add/delete. */
- RTE_TM_UPDATE_NODE_ADD_DELETE = 1 << 2,
-
- /** Suspend/resume nodes. */
- RTE_TM_UPDATE_NODE_SUSPEND_RESUME = 1 << 3,
-
- /** Dynamic switch between byte-based and packet-based WFQ weights. */
- RTE_TM_UPDATE_NODE_WFQ_WEIGHT_MODE = 1 << 4,
-
- /** Dynamic update on number of SP priorities. */
- RTE_TM_UPDATE_NODE_N_SP_PRIORITIES = 1 << 5,
-
- /** Dynamic update of congestion management mode for leaf nodes. */
- RTE_TM_UPDATE_NODE_CMAN = 1 << 6,
-
- /** Dynamic update of the set of enabled stats counter types. */
- RTE_TM_UPDATE_NODE_STATS = 1 << 7,
-};
-
-/**
- * Traffic manager capabilities
- */
-struct rte_tm_capabilities {
- /** Maximum number of nodes. */
- uint32_t n_nodes_max;
-
- /** Maximum number of levels (i.e. number of nodes connecting the root
- * node with any leaf node, including the root and the leaf).
- */
- uint32_t n_levels_max;
-
- /** When non-zero, this flag indicates that all the non-leaf nodes
- * (with the exception of the root node) have identical capability set.
- */
- int non_leaf_nodes_identical;
-
- /** When non-zero, this flag indicates that all the leaf nodes have
- * identical capability set.
- */
- int leaf_nodes_identical;
-
- /** Maximum number of shapers, either private or shared. In case the
- * implementation does not share any resources between private and
- * shared shapers, it is typically equal to the sum of
- * *shaper_private_n_max* and *shaper_shared_n_max*. The
- * value of zero indicates that traffic shaping is not supported.
- */
- uint32_t shaper_n_max;
-
- /** Maximum number of private shapers. Indicates the maximum number of
- * nodes that can concurrently have their private shaper enabled. The
- * value of zero indicates that private shapers are not supported.
- */
- uint32_t shaper_private_n_max;
-
- /** Maximum number of private shapers that support dual rate shaping.
- * Indicates the maximum number of nodes that can concurrently have
- * their private shaper enabled with dual rate support. Only valid when
- * private shapers are supported. The value of zero indicates that dual
- * rate shaping is not available for private shapers. The maximum value
- * is *shaper_private_n_max*.
- */
- int shaper_private_dual_rate_n_max;
-
- /** Minimum committed/peak rate (bytes per second) for any private
- * shaper. Valid only when private shapers are supported.
- */
- uint64_t shaper_private_rate_min;
-
- /** Maximum committed/peak rate (bytes per second) for any private
- * shaper. Valid only when private shapers are supported.
- */
- uint64_t shaper_private_rate_max;
-
- /** Maximum number of shared shapers. The value of zero indicates that
- * shared shapers are not supported.
- */
- uint32_t shaper_shared_n_max;
-
- /** Maximum number of nodes that can share the same shared shaper.
- * Only valid when shared shapers are supported.
- */
- uint32_t shaper_shared_n_nodes_per_shaper_max;
-
- /** Maximum number of shared shapers a node can be part of. This
- * parameter indicates that there is at least one node that can be
- * configured with this many shared shapers, which might not be true for
- * all the nodes. Only valid when shared shapers are supported, in which
- * case it ranges from 1 to *shaper_shared_n_max*.
- */
- uint32_t shaper_shared_n_shapers_per_node_max;
-
- /** Maximum number of shared shapers that can be configured with dual
- * rate shaping. The value of zero indicates that dual rate shaping
- * support is not available for shared shapers.
- */
- uint32_t shaper_shared_dual_rate_n_max;
-
- /** Minimum committed/peak rate (bytes per second) for any shared
- * shaper. Only valid when shared shapers are supported.
- */
- uint64_t shaper_shared_rate_min;
-
- /** Maximum committed/peak rate (bytes per second) for any shared
- * shaper. Only valid when shared shapers are supported.
- */
- uint64_t shaper_shared_rate_max;
-
- /** Minimum value allowed for packet length adjustment for any private
- * or shared shaper.
- */
- int shaper_pkt_length_adjust_min;
-
- /** Maximum value allowed for packet length adjustment for any private
- * or shared shaper.
- */
- int shaper_pkt_length_adjust_max;
-
- /** Maximum number of children nodes. This parameter indicates that
- * there is at least one non-leaf node that can be configured with this
- * many children nodes, which might not be true for all the non-leaf
- * nodes.
- */
- uint32_t sched_n_children_max;
-
- /** Maximum number of supported priority levels. This parameter
- * indicates that there is at least one non-leaf node that can be
- * configured with this many priority levels for managing its children
- * nodes, which might not be true for all the non-leaf nodes. The value
- * of zero is invalid. The value of 1 indicates that only priority 0 is
- * supported, which essentially means that Strict Priority (SP)
- * algorithm is not supported.
- */
- uint32_t sched_sp_n_priorities_max;
-
- /** Maximum number of sibling nodes that can have the same priority at
- * any given time, i.e. maximum size of the WFQ sibling node group. This
- * parameter indicates there is at least one non-leaf node that meets
- * this condition, which might not be true for all the non-leaf nodes.
- * The value of zero is invalid. The value of 1 indicates that WFQ
- * algorithm is not supported. The maximum value is
- * *sched_n_children_max*.
- */
- uint32_t sched_wfq_n_children_per_group_max;
-
- /** Maximum number of priority levels that can have more than one child
- * node at any given time, i.e. maximum number of WFQ sibling node
- * groups that have two or more members. This parameter indicates there
- * is at least one non-leaf node that meets this condition, which might
- * not be true for all the non-leaf nodes. The value of zero states that
- * WFQ algorithm is not supported. The value of 1 indicates that
- * (*sched_sp_n_priorities_max* - 1) priority levels have at most one
- * child node, so there can be only one priority level with two or
- * more sibling nodes making up a WFQ group. The maximum value is:
- * min(floor(*sched_n_children_max* / 2), *sched_sp_n_priorities_max*).
- */
- uint32_t sched_wfq_n_groups_max;
-
- /** Maximum WFQ weight. The value of 1 indicates that all sibling nodes
- * with same priority have the same WFQ weight, so WFQ is reduced to FQ.
- */
- uint32_t sched_wfq_weight_max;
-
- /** Head drop algorithm support. When non-zero, this parameter
- * indicates that there is at least one leaf node that supports the head
- * drop algorithm, which might not be true for all the leaf nodes.
- */
- int cman_head_drop_supported;
-
- /** Maximum number of WRED contexts, either private or shared. In case
- * the implementation does not share any resources between private and
- * shared WRED contexts, it is typically equal to the sum of
- * *cman_wred_context_private_n_max* and
- * *cman_wred_context_shared_n_max*. The value of zero indicates that
- * WRED is not supported.
- */
- uint32_t cman_wred_context_n_max;
-
- /** Maximum number of private WRED contexts. Indicates the maximum
- * number of leaf nodes that can concurrently have their private WRED
- * context enabled. The value of zero indicates that private WRED
- * contexts are not supported.
- */
- uint32_t cman_wred_context_private_n_max;
-
- /** Maximum number of shared WRED contexts. The value of zero
- * indicates that shared WRED contexts are not supported.
- */
- uint32_t cman_wred_context_shared_n_max;
-
- /** Maximum number of leaf nodes that can share the same WRED context.
- * Only valid when shared WRED contexts are supported.
- */
- uint32_t cman_wred_context_shared_n_nodes_per_context_max;
-
- /** Maximum number of shared WRED contexts a leaf node can be part of.
- * This parameter indicates that there is at least one leaf node that
- * can be configured with this many shared WRED contexts, which might
- * not be true for all the leaf nodes. Only valid when shared WRED
- * contexts are supported, in which case it ranges from 1 to
- * *cman_wred_context_shared_n_max*.
- */
- uint32_t cman_wred_context_shared_n_contexts_per_node_max;
-
- /** Support for VLAN DEI packet marking (per color). */
- int mark_vlan_dei_supported[RTE_TM_COLORS];
-
- /** Support for IPv4/IPv6 ECN marking of TCP packets (per color). */
- int mark_ip_ecn_tcp_supported[RTE_TM_COLORS];
-
- /** Support for IPv4/IPv6 ECN marking of SCTP packets (per color). */
- int mark_ip_ecn_sctp_supported[RTE_TM_COLORS];
-
- /** Support for IPv4/IPv6 DSCP packet marking (per color). */
- int mark_ip_dscp_supported[RTE_TM_COLORS];
-
- /** Set of supported dynamic update operations.
- * @see enum rte_tm_dynamic_update_type
- */
- uint64_t dynamic_update_mask;
-
- /** Set of supported statistics counter types.
- * @see enum rte_tm_stats_type
- */
- uint64_t stats_mask;
-};
-
-/**
- * Traffic manager level capabilities
- */
-struct rte_tm_level_capabilities {
- /** Maximum number of nodes for the current hierarchy level. */
- uint32_t n_nodes_max;
-
- /** Maximum number of non-leaf nodes for the current hierarchy level.
- * The value of 0 indicates that current level only supports leaf
- * nodes. The maximum value is *n_nodes_max*.
- */
- uint32_t n_nodes_nonleaf_max;
-
- /** Maximum number of leaf nodes for the current hierarchy level. The
- * value of 0 indicates that current level only supports non-leaf
- * nodes. The maximum value is *n_nodes_max*.
- */
- uint32_t n_nodes_leaf_max;
-
- /** When non-zero, this flag indicates that all the non-leaf nodes on
- * this level have identical capability set. Valid only when
- * *n_nodes_nonleaf_max* is non-zero.
- */
- int non_leaf_nodes_identical;
-
- /** When non-zero, this flag indicates that all the leaf nodes on this
- * level have identical capability set. Valid only when
- * *n_nodes_leaf_max* is non-zero.
- */
- int leaf_nodes_identical;
-
- RTE_STD_C11
- union {
- /** Items valid only for the non-leaf nodes on this level. */
- struct {
- /** Private shaper support. When non-zero, it indicates
- * there is at least one non-leaf node on this level
- * with private shaper support, which may not be the
- * case for all the non-leaf nodes on this level.
- */
- int shaper_private_supported;
-
- /** Dual rate support for private shaper. Valid only
- * when private shaper is supported for the non-leaf
- * nodes on the current level. When non-zero, it
- * indicates there is at least one non-leaf node on this
- * level with dual rate private shaper support, which
- * may not be the case for all the non-leaf nodes on
- * this level.
- */
- int shaper_private_dual_rate_supported;
-
- /** Minimum committed/peak rate (bytes per second) for
- * private shapers of the non-leaf nodes of this level.
- * Valid only when private shaper is supported on this
- * level.
- */
- uint64_t shaper_private_rate_min;
-
- /** Maximum committed/peak rate (bytes per second) for
- * private shapers of the non-leaf nodes on this level.
- * Valid only when private shaper is supported on this
- * level.
- */
- uint64_t shaper_private_rate_max;
-
- /** Maximum number of shared shapers that any non-leaf
- * node on this level can be part of. The value of zero
- * indicates that shared shapers are not supported by
- * the non-leaf nodes on this level. When non-zero, it
- * indicates there is at least one non-leaf node on this
- * level that meets this condition, which may not be the
- * case for all the non-leaf nodes on this level.
- */
- uint32_t shaper_shared_n_max;
-
- /** Maximum number of children nodes. This parameter
- * indicates that there is at least one non-leaf node on
- * this level that can be configured with this many
- * children nodes, which might not be true for all the
- * non-leaf nodes on this level.
- */
- uint32_t sched_n_children_max;
-
- /** Maximum number of supported priority levels. This
- * parameter indicates that there is at least one
- * non-leaf node on this level that can be configured
- * with this many priority levels for managing its
- * children nodes, which might not be true for all the
- * non-leaf nodes on this level. The value of zero is
- * invalid. The value of 1 indicates that only priority
- * 0 is supported, which essentially means that Strict
- * Priority (SP) algorithm is not supported on this
- * level.
- */
- uint32_t sched_sp_n_priorities_max;
-
- /** Maximum number of sibling nodes that can have the
- * same priority at any given time, i.e. maximum size of
- * the WFQ sibling node group. This parameter indicates
- * there is at least one non-leaf node on this level
- * that meets this condition, which may not be true for
- * all the non-leaf nodes on this level. The value of
- * zero is invalid. The value of 1 indicates that WFQ
- * algorithm is not supported on this level. The maximum
- * value is *sched_n_children_max*.
- */
- uint32_t sched_wfq_n_children_per_group_max;
-
- /** Maximum number of priority levels that can have
- * more than one child node at any given time, i.e.
- * maximum number of WFQ sibling node groups that
- * have two or more members. This parameter indicates
- * there is at least one non-leaf node on this level
- * that meets this condition, which might not be true
- * for all the non-leaf nodes. The value of zero states
- * that WFQ algorithm is not supported on this level.
- * The value of 1 indicates that
- * (*sched_sp_n_priorities_max* - 1) priority levels on
- * this level have at most one child node, so there can
- * be only one priority level with two or more sibling
- * nodes making up a WFQ group on this level. The
- * maximum value is:
- * min(floor(*sched_n_children_max* / 2),
- * *sched_sp_n_priorities_max*).
- */
- uint32_t sched_wfq_n_groups_max;
-
- /** Maximum WFQ weight. The value of 1 indicates that
- * all sibling nodes on this level with same priority
- * have the same WFQ weight, so on this level WFQ is
- * reduced to FQ.
- */
- uint32_t sched_wfq_weight_max;
-
- /** Mask of statistics counter types supported by the
- * non-leaf nodes on this level. Every supported
- * statistics counter type is supported by at least one
- * non-leaf node on this level, which may not be true
- * for all the non-leaf nodes on this level.
- * @see enum rte_tm_stats_type
- */
- uint64_t stats_mask;
- } nonleaf;
-
- /** Items valid only for the leaf nodes on this level. */
- struct {
- /** Private shaper support. When non-zero, it indicates
- * there is at least one leaf node on this level with
- * private shaper support, which may not be the case for
- * all the leaf nodes on this level.
- */
- int shaper_private_supported;
-
- /** Dual rate support for private shaper. Valid only
- * when private shaper is supported for the leaf nodes
- * on this level. When non-zero, it indicates there is
- * at least one leaf node on this level with dual rate
- * private shaper support, which may not be the case for
- * all the leaf nodes on this level.
- */
- int shaper_private_dual_rate_supported;
-
- /** Minimum committed/peak rate (bytes per second) for
- * private shapers of the leaf nodes of this level.
- * Valid only when private shaper is supported for the
- * leaf nodes on this level.
- */
- uint64_t shaper_private_rate_min;
-
- /** Maximum committed/peak rate (bytes per second) for
- * private shapers of the leaf nodes on this level.
- * Valid only when private shaper is supported for the
- * leaf nodes on this level.
- */
- uint64_t shaper_private_rate_max;
-
- /** Maximum number of shared shapers that any leaf node
- * on this level can be part of. The value of zero
- * indicates that shared shapers are not supported by
- * the leaf nodes on this level. When non-zero, it
- * indicates there is at least one leaf node on this
- * level that meets this condition, which may not be the
- * case for all the leaf nodes on this level.
- */
- uint32_t shaper_shared_n_max;
-
- /** Head drop algorithm support. When non-zero, this
- * parameter indicates that there is at least one leaf
- * node on this level that supports the head drop
- * algorithm, which might not be true for all the leaf
- * nodes on this level.
- */
- int cman_head_drop_supported;
-
- /** Private WRED context support. When non-zero, it
- * indicates there is at least one node on this level
- * with private WRED context support, which may not be
- * true for all the leaf nodes on this level.
- */
- int cman_wred_context_private_supported;
-
- /** Maximum number of shared WRED contexts that any
- * leaf node on this level can be part of. The value of
- * zero indicates that shared WRED contexts are not
- * supported by the leaf nodes on this level. When
- * non-zero, it indicates there is at least one leaf
- * node on this level that meets this condition, which
- * may not be the case for all the leaf nodes on this
- * level.
- */
- uint32_t cman_wred_context_shared_n_max;
-
- /** Mask of statistics counter types supported by the
- * leaf nodes on this level. Every supported statistics
- * counter type is supported by at least one leaf node
- * on this level, which may not be true for all the leaf
- * nodes on this level.
- * @see enum rte_tm_stats_type
- */
- uint64_t stats_mask;
- } leaf;
- };
-};
-
-/**
- * Traffic manager node capabilities
- */
-struct rte_tm_node_capabilities {
- /** Private shaper support for the current node. */
- int shaper_private_supported;
-
- /** Dual rate shaping support for private shaper of current node.
- * Valid only when private shaper is supported by the current node.
- */
- int shaper_private_dual_rate_supported;
-
- /** Minimum committed/peak rate (bytes per second) for private
- * shaper of current node. Valid only when private shaper is supported
- * by the current node.
- */
- uint64_t shaper_private_rate_min;
-
- /** Maximum committed/peak rate (bytes per second) for private
- * shaper of current node. Valid only when private shaper is supported
- * by the current node.
- */
- uint64_t shaper_private_rate_max;
-
- /** Maximum number of shared shapers the current node can be part of.
- * The value of zero indicates that shared shapers are not supported by
- * the current node.
- */
- uint32_t shaper_shared_n_max;
-
- RTE_STD_C11
- union {
- /** Items valid only for non-leaf nodes. */
- struct {
- /** Maximum number of children nodes. */
- uint32_t sched_n_children_max;
-
- /** Maximum number of supported priority levels. The
- * value of zero is invalid. The value of 1 indicates
- * that only priority 0 is supported, which essentially
- * means that Strict Priority (SP) algorithm is not
- * supported.
- */
- uint32_t sched_sp_n_priorities_max;
-
- /** Maximum number of sibling nodes that can have the
- * same priority at any given time, i.e. maximum size
- * of the WFQ sibling node group. The value of zero
- * is invalid. The value of 1 indicates that WFQ
- * algorithm is not supported. The maximum value is
- * *sched_n_children_max*.
- */
- uint32_t sched_wfq_n_children_per_group_max;
-
- /** Maximum number of priority levels that can have
- * more than one child node at any given time, i.e.
- * maximum number of WFQ sibling node groups that have
- * two or more members. The value of zero states that
- * WFQ algorithm is not supported. The value of 1
- * indicates that (*sched_sp_n_priorities_max* - 1)
- * priority levels have at most one child node, so there
- * can be only one priority level with two or more
- * sibling nodes making up a WFQ group. The maximum
- * value is: min(floor(*sched_n_children_max* / 2),
- * *sched_sp_n_priorities_max*).
- */
- uint32_t sched_wfq_n_groups_max;
-
- /** Maximum WFQ weight. The value of 1 indicates that
- * all sibling nodes with same priority have the same
- * WFQ weight, so WFQ is reduced to FQ.
- */
- uint32_t sched_wfq_weight_max;
- } nonleaf;
-
- /** Items valid only for leaf nodes. */
- struct {
- /** Head drop algorithm support for current node. */
- int cman_head_drop_supported;
-
- /** Private WRED context support for current node. */
- int cman_wred_context_private_supported;
-
- /** Maximum number of shared WRED contexts the current
- * node can be part of. The value of zero indicates that
- * shared WRED contexts are not supported by the current
- * node.
- */
- uint32_t cman_wred_context_shared_n_max;
- } leaf;
- };
-
- /** Mask of statistics counter types supported by the current node.
- * @see enum rte_tm_stats_type
- */
- uint64_t stats_mask;
-};
-
-/**
- * Congestion management (CMAN) mode
- *
- * This is used for controlling the admission of packets into a packet queue or
- * group of packet queues on congestion. On request of writing a new packet
- * into the current queue while the queue is full, the *tail drop* algorithm
- * drops the new packet while leaving the queue unmodified, as opposed to *head
- * drop* algorithm, which drops the packet at the head of the queue (the oldest
- * packet waiting in the queue) and admits the new packet at the tail of the
- * queue.
- *
- * The *Random Early Detection (RED)* algorithm works by proactively dropping
- * more and more input packets as the queue occupancy builds up. When the queue
- * is full or almost full, RED effectively works as *tail drop*. The *Weighted
- * RED* algorithm uses a separate set of RED thresholds for each packet color.
- */
-enum rte_tm_cman_mode {
- RTE_TM_CMAN_TAIL_DROP = 0, /**< Tail drop */
- RTE_TM_CMAN_HEAD_DROP, /**< Head drop */
- RTE_TM_CMAN_WRED, /**< Weighted Random Early Detection (WRED) */
-};
-
-/**
- * Random Early Detection (RED) profile
- */
-struct rte_tm_red_params {
- /** Minimum queue threshold */
- uint16_t min_th;
-
- /** Maximum queue threshold */
- uint16_t max_th;
-
- /** Inverse of packet marking probability maximum value (maxp), i.e.
- * maxp_inv = 1 / maxp
- */
- uint16_t maxp_inv;
-
- /** Negated log2 of queue weight (wq), i.e. wq = 1 / (2 ^ wq_log2) */
- uint16_t wq_log2;
-};
-
-/**
- * Weighted RED (WRED) profile
- *
- * Multiple WRED contexts can share the same WRED profile. Each leaf node with
- * WRED enabled as its congestion management mode has zero or one private WRED
- * context (only one leaf node using it) and/or zero, one or several shared
- * WRED contexts (multiple leaf nodes use the same WRED context). A private
- * WRED context is used to perform congestion management for a single leaf
- * node, while a shared WRED context is used to perform congestion management
- * for a group of leaf nodes.
- */
-struct rte_tm_wred_params {
- /** One set of RED parameters per packet color */
- struct rte_tm_red_params red_params[RTE_TM_COLORS];
-};
-
-/**
- * Token bucket
- */
-struct rte_tm_token_bucket {
- /** Token bucket rate (bytes per second) */
- uint64_t rate;
-
- /** Token bucket size (bytes), a.k.a. max burst size */
- uint64_t size;
-};
-
-/**
- * Shaper (rate limiter) profile
- *
- * Multiple shaper instances can share the same shaper profile. Each node has
- * zero or one private shaper (only one node using it) and/or zero, one or
- * several shared shapers (multiple nodes use the same shaper instance).
- * A private shaper is used to perform traffic shaping for a single node, while
- * a shared shaper is used to perform traffic shaping for a group of nodes.
- *
- * Single rate shapers use a single token bucket. A single rate shaper can be
- * configured by setting the rate of the committed bucket to zero, which
- * effectively disables this bucket. The peak bucket is used to limit the rate
- * and the burst size for the current shaper.
- *
- * Dual rate shapers use both the committed and the peak token buckets. The
- * rate of the peak bucket has to be bigger than zero, as well as greater than
- * or equal to the rate of the committed bucket.
- */
-struct rte_tm_shaper_params {
- /** Committed token bucket */
- struct rte_tm_token_bucket committed;
-
- /** Peak token bucket */
- struct rte_tm_token_bucket peak;
-
- /** Signed value to be added to the length of each packet for the
- * purpose of shaping. Can be used to correct the packet length with
- * the framing overhead bytes that are also consumed on the wire (e.g.
- * RTE_TM_ETH_FRAMING_OVERHEAD_FCS).
- */
- int32_t pkt_length_adjust;
-};
-
-/**
- * Node parameters
- *
- * Each non-leaf node has multiple inputs (its children nodes) and single output
- * (which is input to its parent node). It arbitrates its inputs using Strict
- * Priority (SP) and Weighted Fair Queuing (WFQ) algorithms to schedule input
- * packets to its output while observing its shaping (rate limiting)
- * constraints.
- *
- * Algorithms such as Weighted Round Robin (WRR), Byte-level WRR, Deficit WRR
- * (DWRR), etc. are considered approximations of the WFQ ideal and are
- * assimilated to WFQ, although an associated implementation-dependent trade-off
- * on accuracy, performance and resource usage might exist.
- *
- * Children nodes with different priorities are scheduled using the SP algorithm
- * based on their priority, with zero (0) as the highest priority. Children with
- * the same priority are scheduled using the WFQ algorithm according to their
- * weights. The WFQ weight of a given child node is relative to the sum of the
- * weights of all its sibling nodes that have the same priority, with one (1) as
- * the lowest weight. For each SP priority, the WFQ weight mode can be set as
- * either byte-based or packet-based.
- *
- * Each leaf node sits on top of a TX queue of the current Ethernet port. Hence,
- * the leaf nodes are predefined, with their node IDs set to 0 .. (N-1), where N
- * is the number of TX queues configured for the current Ethernet port. The
- * non-leaf nodes have their IDs generated by the application.
- */
-struct rte_tm_node_params {
- /** Shaper profile for the private shaper. The absence of the private
- * shaper for the current node is indicated by setting this parameter
- * to RTE_TM_SHAPER_PROFILE_ID_NONE.
- */
- uint32_t shaper_profile_id;
-
- /** User allocated array of valid shared shaper IDs. */
- uint32_t *shared_shaper_id;
-
- /** Number of shared shaper IDs in the *shared_shaper_id* array. */
- uint32_t n_shared_shapers;
-
- RTE_STD_C11
- union {
- /** Parameters only valid for non-leaf nodes. */
- struct {
- /** WFQ weight mode for each SP priority. When NULL, it
- * indicates that WFQ is to be used for all priorities.
- * When non-NULL, it points to a pre-allocated array of
- * *n_sp_priorities* values, with non-zero value for
- * byte-mode and zero for packet-mode.
- */
- int *wfq_weight_mode;
-
- /** Number of SP priorities. */
- uint32_t n_sp_priorities;
- } nonleaf;
-
- /** Parameters only valid for leaf nodes. */
- struct {
- /** Congestion management mode */
- enum rte_tm_cman_mode cman;
-
- /** WRED parameters (only valid when *cman* is set to
- * WRED).
- */
- struct {
- /** WRED profile for private WRED context. The
- * absence of a private WRED context for the
- * current leaf node is indicated by value
- * RTE_TM_WRED_PROFILE_ID_NONE.
- */
- uint32_t wred_profile_id;
-
- /** User allocated array of shared WRED context
- * IDs. When set to NULL, it indicates that the
- * current leaf node should not currently be
- * part of any shared WRED contexts.
- */
- uint32_t *shared_wred_context_id;
-
- /** Number of elements in the
- * *shared_wred_context_id* array. Only valid
- * when *shared_wred_context_id* is non-NULL,
- * in which case it should be non-zero.
- */
- uint32_t n_shared_wred_contexts;
- } wred;
- } leaf;
- };
-
- /** Mask of statistics counter types to be enabled for this node. This
- * needs to be a subset of the statistics counter types available for
- * the current node. Any statistics counter type not included in this
- * set is to be disabled for the current node.
- * @see enum rte_tm_stats_type
- */
- uint64_t stats_mask;
-};
-
-/**
- * Verbose error types.
- *
- * Most of them provide the type of the object referenced by struct
- * rte_tm_error::cause.
- */
-enum rte_tm_error_type {
- RTE_TM_ERROR_TYPE_NONE, /**< No error. */
- RTE_TM_ERROR_TYPE_UNSPECIFIED, /**< Cause unspecified. */
- RTE_TM_ERROR_TYPE_CAPABILITIES,
- RTE_TM_ERROR_TYPE_LEVEL_ID,
- RTE_TM_ERROR_TYPE_WRED_PROFILE,
- RTE_TM_ERROR_TYPE_WRED_PROFILE_GREEN,
- RTE_TM_ERROR_TYPE_WRED_PROFILE_YELLOW,
- RTE_TM_ERROR_TYPE_WRED_PROFILE_RED,
- RTE_TM_ERROR_TYPE_WRED_PROFILE_ID,
- RTE_TM_ERROR_TYPE_SHARED_WRED_CONTEXT_ID,
- RTE_TM_ERROR_TYPE_SHAPER_PROFILE,
- RTE_TM_ERROR_TYPE_SHAPER_PROFILE_COMMITTED_RATE,
- RTE_TM_ERROR_TYPE_SHAPER_PROFILE_COMMITTED_SIZE,
- RTE_TM_ERROR_TYPE_SHAPER_PROFILE_PEAK_RATE,
- RTE_TM_ERROR_TYPE_SHAPER_PROFILE_PEAK_SIZE,
- RTE_TM_ERROR_TYPE_SHAPER_PROFILE_PKT_ADJUST_LEN,
- RTE_TM_ERROR_TYPE_SHAPER_PROFILE_ID,
- RTE_TM_ERROR_TYPE_SHARED_SHAPER_ID,
- RTE_TM_ERROR_TYPE_NODE_PARENT_NODE_ID,
- RTE_TM_ERROR_TYPE_NODE_PRIORITY,
- RTE_TM_ERROR_TYPE_NODE_WEIGHT,
- RTE_TM_ERROR_TYPE_NODE_PARAMS,
- RTE_TM_ERROR_TYPE_NODE_PARAMS_SHAPER_PROFILE_ID,
- RTE_TM_ERROR_TYPE_NODE_PARAMS_SHARED_SHAPER_ID,
- RTE_TM_ERROR_TYPE_NODE_PARAMS_N_SHARED_SHAPERS,
- RTE_TM_ERROR_TYPE_NODE_PARAMS_WFQ_WEIGHT_MODE,
- RTE_TM_ERROR_TYPE_NODE_PARAMS_N_SP_PRIORITIES,
- RTE_TM_ERROR_TYPE_NODE_PARAMS_CMAN,
- RTE_TM_ERROR_TYPE_NODE_PARAMS_WRED_PROFILE_ID,
- RTE_TM_ERROR_TYPE_NODE_PARAMS_SHARED_WRED_CONTEXT_ID,
- RTE_TM_ERROR_TYPE_NODE_PARAMS_N_SHARED_WRED_CONTEXTS,
- RTE_TM_ERROR_TYPE_NODE_PARAMS_STATS,
- RTE_TM_ERROR_TYPE_NODE_ID,
-};
-
-/**
- * Verbose error structure definition.
- *
- * This object is normally allocated by applications and set by PMDs, the
- * message points to a constant string which does not need to be freed by
- * the application, however its pointer can be considered valid only as long
- * as its associated DPDK port remains configured. Closing the underlying
- * device or unloading the PMD invalidates it.
- *
- * Both cause and message may be NULL regardless of the error type.
- */
-struct rte_tm_error {
- enum rte_tm_error_type type; /**< Cause field and error type. */
- const void *cause; /**< Object responsible for the error. */
- const char *message; /**< Human-readable error message. */
-};
-
-/**
- * Traffic manager get number of leaf nodes
- *
- * Each leaf node sits on on top of a TX queue of the current Ethernet port.
- * Therefore, the set of leaf nodes is predefined, their number is always equal
- * to N (where N is the number of TX queues configured for the current port)
- * and their IDs are 0 .. (N-1).
- *
- * @param[in] port_id
- * The port identifier of the Ethernet device.
- * @param[out] n_leaf_nodes
- * Number of leaf nodes for the current port.
- * @param[out] error
- * Error details. Filled in only on error, when not NULL.
- * @return
- * 0 on success, non-zero error code otherwise.
- */
-int
-rte_tm_get_number_of_leaf_nodes(uint16_t port_id,
- uint32_t *n_leaf_nodes,
- struct rte_tm_error *error);
-
-/**
- * Traffic manager node ID validate and type (i.e. leaf or non-leaf) get
- *
- * The leaf nodes have predefined IDs in the range of 0 .. (N-1), where N is
- * the number of TX queues of the current Ethernet port. The non-leaf nodes
- * have their IDs generated by the application outside of the above range,
- * which is reserved for leaf nodes.
- *
- * @param[in] port_id
- * The port identifier of the Ethernet device.
- * @param[in] node_id
- * Node ID value. Needs to be valid.
- * @param[out] is_leaf
- * Set to non-zero value when node is leaf and to zero otherwise (non-leaf).
- * @param[out] error
- * Error details. Filled in only on error, when not NULL.
- * @return
- * 0 on success, non-zero error code otherwise.
- */
-int
-rte_tm_node_type_get(uint16_t port_id,
- uint32_t node_id,
- int *is_leaf,
- struct rte_tm_error *error);
-
-/**
- * Traffic manager capabilities get
- *
- * @param[in] port_id
- * The port identifier of the Ethernet device.
- * @param[out] cap
- * Traffic manager capabilities. Needs to be pre-allocated and valid.
- * @param[out] error
- * Error details. Filled in only on error, when not NULL.
- * @return
- * 0 on success, non-zero error code otherwise.
- */
-int
-rte_tm_capabilities_get(uint16_t port_id,
- struct rte_tm_capabilities *cap,
- struct rte_tm_error *error);
-
-/**
- * Traffic manager level capabilities get
- *
- * @param[in] port_id
- * The port identifier of the Ethernet device.
- * @param[in] level_id
- * The hierarchy level identifier. The value of 0 identifies the level of the
- * root node.
- * @param[out] cap
- * Traffic manager level capabilities. Needs to be pre-allocated and valid.
- * @param[out] error
- * Error details. Filled in only on error, when not NULL.
- * @return
- * 0 on success, non-zero error code otherwise.
- */
-int
-rte_tm_level_capabilities_get(uint16_t port_id,
- uint32_t level_id,
- struct rte_tm_level_capabilities *cap,
- struct rte_tm_error *error);
-
-/**
- * Traffic manager node capabilities get
- *
- * @param[in] port_id
- * The port identifier of the Ethernet device.
- * @param[in] node_id
- * Node ID. Needs to be valid.
- * @param[out] cap
- * Traffic manager node capabilities. Needs to be pre-allocated and valid.
- * @param[out] error
- * Error details. Filled in only on error, when not NULL.
- * @return
- * 0 on success, non-zero error code otherwise.
- */
-int
-rte_tm_node_capabilities_get(uint16_t port_id,
- uint32_t node_id,
- struct rte_tm_node_capabilities *cap,
- struct rte_tm_error *error);
-
-/**
- * Traffic manager WRED profile add
- *
- * Create a new WRED profile with ID set to *wred_profile_id*. The new profile
- * is used to create one or several WRED contexts.
- *
- * @param[in] port_id
- * The port identifier of the Ethernet device.
- * @param[in] wred_profile_id
- * WRED profile ID for the new profile. Needs to be unused.
- * @param[in] profile
- * WRED profile parameters. Needs to be pre-allocated and valid.
- * @param[out] error
- * Error details. Filled in only on error, when not NULL.
- * @return
- * 0 on success, non-zero error code otherwise.
- *
- * @see struct rte_tm_capabilities::cman_wred_context_n_max
- */
-int
-rte_tm_wred_profile_add(uint16_t port_id,
- uint32_t wred_profile_id,
- struct rte_tm_wred_params *profile,
- struct rte_tm_error *error);
-
-/**
- * Traffic manager WRED profile delete
- *
- * Delete an existing WRED profile. This operation fails when there is
- * currently at least one user (i.e. WRED context) of this WRED profile.
- *
- * @param[in] port_id
- * The port identifier of the Ethernet device.
- * @param[in] wred_profile_id
- * WRED profile ID. Needs to be the valid.
- * @param[out] error
- * Error details. Filled in only on error, when not NULL.
- * @return
- * 0 on success, non-zero error code otherwise.
- *
- * @see struct rte_tm_capabilities::cman_wred_context_n_max
- */
-int
-rte_tm_wred_profile_delete(uint16_t port_id,
- uint32_t wred_profile_id,
- struct rte_tm_error *error);
-
-/**
- * Traffic manager shared WRED context add or update
- *
- * When *shared_wred_context_id* is invalid, a new WRED context with this ID is
- * created by using the WRED profile identified by *wred_profile_id*.
- *
- * When *shared_wred_context_id* is valid, this WRED context is no longer using
- * the profile previously assigned to it and is updated to use the profile
- * identified by *wred_profile_id*.
- *
- * A valid shared WRED context can be assigned to several hierarchy leaf nodes
- * configured to use WRED as the congestion management mode.
- *
- * @param[in] port_id
- * The port identifier of the Ethernet device.
- * @param[in] shared_wred_context_id
- * Shared WRED context ID
- * @param[in] wred_profile_id
- * WRED profile ID. Needs to be the valid.
- * @param[out] error
- * Error details. Filled in only on error, when not NULL.
- * @return
- * 0 on success, non-zero error code otherwise.
- *
- * @see struct rte_tm_capabilities::cman_wred_context_shared_n_max
- */
-int
-rte_tm_shared_wred_context_add_update(uint16_t port_id,
- uint32_t shared_wred_context_id,
- uint32_t wred_profile_id,
- struct rte_tm_error *error);
-
-/**
- * Traffic manager shared WRED context delete
- *
- * Delete an existing shared WRED context. This operation fails when there is
- * currently at least one user (i.e. hierarchy leaf node) of this shared WRED
- * context.
- *
- * @param[in] port_id
- * The port identifier of the Ethernet device.
- * @param[in] shared_wred_context_id
- * Shared WRED context ID. Needs to be the valid.
- * @param[out] error
- * Error details. Filled in only on error, when not NULL.
- * @return
- * 0 on success, non-zero error code otherwise.
- *
- * @see struct rte_tm_capabilities::cman_wred_context_shared_n_max
- */
-int
-rte_tm_shared_wred_context_delete(uint16_t port_id,
- uint32_t shared_wred_context_id,
- struct rte_tm_error *error);
-
-/**
- * Traffic manager shaper profile add
- *
- * Create a new shaper profile with ID set to *shaper_profile_id*. The new
- * shaper profile is used to create one or several shapers.
- *
- * @param[in] port_id
- * The port identifier of the Ethernet device.
- * @param[in] shaper_profile_id
- * Shaper profile ID for the new profile. Needs to be unused.
- * @param[in] profile
- * Shaper profile parameters. Needs to be pre-allocated and valid.
- * @param[out] error
- * Error details. Filled in only on error, when not NULL.
- * @return
- * 0 on success, non-zero error code otherwise.
- *
- * @see struct rte_tm_capabilities::shaper_n_max
- */
-int
-rte_tm_shaper_profile_add(uint16_t port_id,
- uint32_t shaper_profile_id,
- struct rte_tm_shaper_params *profile,
- struct rte_tm_error *error);
-
-/**
- * Traffic manager shaper profile delete
- *
- * Delete an existing shaper profile. This operation fails when there is
- * currently at least one user (i.e. shaper) of this shaper profile.
- *
- * @param[in] port_id
- * The port identifier of the Ethernet device.
- * @param[in] shaper_profile_id
- * Shaper profile ID. Needs to be the valid.
- * @param[out] error
- * Error details. Filled in only on error, when not NULL.
- * @return
- * 0 on success, non-zero error code otherwise.
- *
- * @see struct rte_tm_capabilities::shaper_n_max
- */
-int
-rte_tm_shaper_profile_delete(uint16_t port_id,
- uint32_t shaper_profile_id,
- struct rte_tm_error *error);
-
-/**
- * Traffic manager shared shaper add or update
- *
- * When *shared_shaper_id* is not a valid shared shaper ID, a new shared shaper
- * with this ID is created using the shaper profile identified by
- * *shaper_profile_id*.
- *
- * When *shared_shaper_id* is a valid shared shaper ID, this shared shaper is
- * no longer using the shaper profile previously assigned to it and is updated
- * to use the shaper profile identified by *shaper_profile_id*.
- *
- * @param[in] port_id
- * The port identifier of the Ethernet device.
- * @param[in] shared_shaper_id
- * Shared shaper ID
- * @param[in] shaper_profile_id
- * Shaper profile ID. Needs to be the valid.
- * @param[out] error
- * Error details. Filled in only on error, when not NULL.
- * @return
- * 0 on success, non-zero error code otherwise.
- *
- * @see struct rte_tm_capabilities::shaper_shared_n_max
- */
-int
-rte_tm_shared_shaper_add_update(uint16_t port_id,
- uint32_t shared_shaper_id,
- uint32_t shaper_profile_id,
- struct rte_tm_error *error);
-
-/**
- * Traffic manager shared shaper delete
- *
- * Delete an existing shared shaper. This operation fails when there is
- * currently at least one user (i.e. hierarchy node) of this shared shaper.
- *
- * @param[in] port_id
- * The port identifier of the Ethernet device.
- * @param[in] shared_shaper_id
- * Shared shaper ID. Needs to be the valid.
- * @param[out] error
- * Error details. Filled in only on error, when not NULL.
- * @return
- * 0 on success, non-zero error code otherwise.
- *
- * @see struct rte_tm_capabilities::shaper_shared_n_max
- */
-int
-rte_tm_shared_shaper_delete(uint16_t port_id,
- uint32_t shared_shaper_id,
- struct rte_tm_error *error);
-
-/**
- * Traffic manager node add
- *
- * Create new node and connect it as child of an existing node. The new node is
- * further identified by *node_id*, which needs to be unused by any of the
- * existing nodes. The parent node is identified by *parent_node_id*, which
- * needs to be the valid ID of an existing non-leaf node. The parent node is
- * going to use the provided SP *priority* and WFQ *weight* to schedule its new
- * child node.
- *
- * This function has to be called for both leaf and non-leaf nodes. In the case
- * of leaf nodes (i.e. *node_id* is within the range of 0 .. (N-1), with N as
- * the number of configured TX queues of the current port), the leaf node is
- * configured rather than created (as the set of leaf nodes is predefined) and
- * it is also connected as child of an existing node.
- *
- * The first node that is added becomes the root node and all the nodes that
- * are subsequently added have to be added as descendants of the root node. The
- * parent of the root node has to be specified as RTE_TM_NODE_ID_NULL and there
- * can only be one node with this parent ID (i.e. the root node). Further
- * restrictions for root node: needs to be non-leaf, its private shaper profile
- * needs to be valid and single rate, cannot use any shared shapers.
- *
- * When called before rte_tm_hierarchy_commit() invocation, this function is
- * typically used to define the initial start-up hierarchy for the port.
- * Provided that dynamic hierarchy updates are supported by the current port (as
- * advertised in the port capability set), this function can be also called
- * after the rte_tm_hierarchy_commit() invocation.
- *
- * @param[in] port_id
- * The port identifier of the Ethernet device.
- * @param[in] node_id
- * Node ID. Needs to be unused by any of the existing nodes.
- * @param[in] parent_node_id
- * Parent node ID. Needs to be the valid.
- * @param[in] priority
- * Node priority. The highest node priority is zero. Used by the SP algorithm
- * running on the parent of the current node for scheduling this child node.
- * @param[in] weight
- * Node weight. The node weight is relative to the weight sum of all siblings
- * that have the same priority. The lowest weight is one. Used by the WFQ
- * algorithm running on the parent of the current node for scheduling this
- * child node.
- * @param[in] level_id
- * Level ID that should be met by this node. The hierarchy level of the
- * current node is already fully specified through its parent node (i.e. the
- * level of this node is equal to the level of its parent node plus one),
- * therefore the reason for providing this parameter is to enable the
- * application to perform step-by-step checking of the node level during
- * successive invocations of this function. When not desired, this check can
- * be disabled by assigning value RTE_TM_NODE_LEVEL_ID_ANY to this parameter.
- * @param[in] params
- * Node parameters. Needs to be pre-allocated and valid.
- * @param[out] error
- * Error details. Filled in only on error, when not NULL.
- * @return
- * 0 on success, non-zero error code otherwise.
- *
- * @see rte_tm_hierarchy_commit()
- * @see RTE_TM_UPDATE_NODE_ADD_DELETE
- * @see RTE_TM_NODE_LEVEL_ID_ANY
- * @see struct rte_tm_capabilities
- */
-int
-rte_tm_node_add(uint16_t port_id,
- uint32_t node_id,
- uint32_t parent_node_id,
- uint32_t priority,
- uint32_t weight,
- uint32_t level_id,
- struct rte_tm_node_params *params,
- struct rte_tm_error *error);
-
-/**
- * Traffic manager node delete
- *
- * Delete an existing node. This operation fails when this node currently has
- * at least one user (i.e. child node).
- *
- * When called before rte_tm_hierarchy_commit() invocation, this function is
- * typically used to define the initial start-up hierarchy for the port.
- * Provided that dynamic hierarchy updates are supported by the current port (as
- * advertised in the port capability set), this function can be also called
- * after the rte_tm_hierarchy_commit() invocation.
- *
- * @param[in] port_id
- * The port identifier of the Ethernet device.
- * @param[in] node_id
- * Node ID. Needs to be valid.
- * @param[out] error
- * Error details. Filled in only on error, when not NULL.
- * @return
- * 0 on success, non-zero error code otherwise.
- *
- * @see RTE_TM_UPDATE_NODE_ADD_DELETE
- */
-int
-rte_tm_node_delete(uint16_t port_id,
- uint32_t node_id,
- struct rte_tm_error *error);
-
-/**
- * Traffic manager node suspend
- *
- * Suspend an existing node. While the node is in suspended state, no packet is
- * scheduled from this node and its descendants. The node exits the suspended
- * state through the node resume operation.
- *
- * @param[in] port_id
- * The port identifier of the Ethernet device.
- * @param[in] node_id
- * Node ID. Needs to be valid.
- * @param[out] error
- * Error details. Filled in only on error, when not NULL.
- * @return
- * 0 on success, non-zero error code otherwise.
- *
- * @see rte_tm_node_resume()
- * @see RTE_TM_UPDATE_NODE_SUSPEND_RESUME
- */
-int
-rte_tm_node_suspend(uint16_t port_id,
- uint32_t node_id,
- struct rte_tm_error *error);
-
-/**
- * Traffic manager node resume
- *
- * Resume an existing node that is currently in suspended state. The node
- * entered the suspended state as result of a previous node suspend operation.
- *
- * @param[in] port_id
- * The port identifier of the Ethernet device.
- * @param[in] node_id
- * Node ID. Needs to be valid.
- * @param[out] error
- * Error details. Filled in only on error, when not NULL.
- * @return
- * 0 on success, non-zero error code otherwise.
- *
- * @see rte_tm_node_suspend()
- * @see RTE_TM_UPDATE_NODE_SUSPEND_RESUME
- */
-int
-rte_tm_node_resume(uint16_t port_id,
- uint32_t node_id,
- struct rte_tm_error *error);
-
-/**
- * Traffic manager hierarchy commit
- *
- * This function is called during the port initialization phase (before the
- * Ethernet port is started) to freeze the start-up hierarchy.
- *
- * This function typically performs the following steps:
- * a) It validates the start-up hierarchy that was previously defined for the
- * current port through successive rte_tm_node_add() invocations;
- * b) Assuming successful validation, it performs all the necessary port
- * specific configuration operations to install the specified hierarchy on
- * the current port, with immediate effect once the port is started.
- *
- * This function fails when the currently configured hierarchy is not supported
- * by the Ethernet port, in which case the user can abort or try out another
- * hierarchy configuration (e.g. a hierarchy with less leaf nodes), which can be
- * build from scratch (when *clear_on_fail* is enabled) or by modifying the
- * existing hierarchy configuration (when *clear_on_fail* is disabled).
- *
- * Note that this function can still fail due to other causes (e.g. not enough
- * memory available in the system, etc), even though the specified hierarchy is
- * supported in principle by the current port.
- *
- * @param[in] port_id
- * The port identifier of the Ethernet device.
- * @param[in] clear_on_fail
- * On function call failure, hierarchy is cleared when this parameter is
- * non-zero and preserved when this parameter is equal to zero.
- * @param[out] error
- * Error details. Filled in only on error, when not NULL.
- * @return
- * 0 on success, non-zero error code otherwise.
- *
- * @see rte_tm_node_add()
- * @see rte_tm_node_delete()
- */
-int
-rte_tm_hierarchy_commit(uint16_t port_id,
- int clear_on_fail,
- struct rte_tm_error *error);
-
-/**
- * Traffic manager node parent update
- *
- * Restriction for root node: its parent cannot be changed.
- *
- * This function can only be called after the rte_tm_hierarchy_commit()
- * invocation. Its success depends on the port support for this operation, as
- * advertised through the port capability set.
- *
- * @param[in] port_id
- * The port identifier of the Ethernet device.
- * @param[in] node_id
- * Node ID. Needs to be valid.
- * @param[in] parent_node_id
- * Node ID for the new parent. Needs to be valid.
- * @param[in] priority
- * Node priority. The highest node priority is zero. Used by the SP algorithm
- * running on the parent of the current node for scheduling this child node.
- * @param[in] weight
- * Node weight. The node weight is relative to the weight sum of all siblings
- * that have the same priority. The lowest weight is zero. Used by the WFQ
- * algorithm running on the parent of the current node for scheduling this
- * child node.
- * @param[out] error
- * Error details. Filled in only on error, when not NULL.
- * @return
- * 0 on success, non-zero error code otherwise.
- *
- * @see RTE_TM_UPDATE_NODE_PARENT_KEEP_LEVEL
- * @see RTE_TM_UPDATE_NODE_PARENT_CHANGE_LEVEL
- */
-int
-rte_tm_node_parent_update(uint16_t port_id,
- uint32_t node_id,
- uint32_t parent_node_id,
- uint32_t priority,
- uint32_t weight,
- struct rte_tm_error *error);
-
-/**
- * Traffic manager node private shaper update
- *
- * Restriction for the root node: its private shaper profile needs to be valid
- * and single rate.
- *
- * @param[in] port_id
- * The port identifier of the Ethernet device.
- * @param[in] node_id
- * Node ID. Needs to be valid.
- * @param[in] shaper_profile_id
- * Shaper profile ID for the private shaper of the current node. Needs to be
- * either valid shaper profile ID or RTE_TM_SHAPER_PROFILE_ID_NONE, with
- * the latter disabling the private shaper of the current node.
- * @param[out] error
- * Error details. Filled in only on error, when not NULL.
- * @return
- * 0 on success, non-zero error code otherwise.
- *
- * @see struct rte_tm_capabilities::shaper_private_n_max
- */
-int
-rte_tm_node_shaper_update(uint16_t port_id,
- uint32_t node_id,
- uint32_t shaper_profile_id,
- struct rte_tm_error *error);
-
-/**
- * Traffic manager node shared shapers update
- *
- * Restriction for root node: cannot use any shared rate shapers.
- *
- * @param[in] port_id
- * The port identifier of the Ethernet device.
- * @param[in] node_id
- * Node ID. Needs to be valid.
- * @param[in] shared_shaper_id
- * Shared shaper ID. Needs to be valid.
- * @param[in] add
- * Set to non-zero value to add this shared shaper to current node or to zero
- * to delete this shared shaper from current node.
- * @param[out] error
- * Error details. Filled in only on error, when not NULL.
- * @return
- * 0 on success, non-zero error code otherwise.
- *
- * @see struct rte_tm_capabilities::shaper_shared_n_max
- */
-int
-rte_tm_node_shared_shaper_update(uint16_t port_id,
- uint32_t node_id,
- uint32_t shared_shaper_id,
- int add,
- struct rte_tm_error *error);
-
-/**
- * Traffic manager node enabled statistics counters update
- *
- * @param[in] port_id
- * The port identifier of the Ethernet device.
- * @param[in] node_id
- * Node ID. Needs to be valid.
- * @param[in] stats_mask
- * Mask of statistics counter types to be enabled for the current node. This
- * needs to be a subset of the statistics counter types available for the
- * current node. Any statistics counter type not included in this set is to
- * be disabled for the current node.
- * @param[out] error
- * Error details. Filled in only on error, when not NULL.
- * @return
- * 0 on success, non-zero error code otherwise.
- *
- * @see enum rte_tm_stats_type
- * @see RTE_TM_UPDATE_NODE_STATS
- */
-int
-rte_tm_node_stats_update(uint16_t port_id,
- uint32_t node_id,
- uint64_t stats_mask,
- struct rte_tm_error *error);
-
-/**
- * Traffic manager node WFQ weight mode update
- *
- * @param[in] port_id
- * The port identifier of the Ethernet device.
- * @param[in] node_id
- * Node ID. Needs to be valid leaf node ID.
- * @param[in] wfq_weight_mode
- * WFQ weight mode for each SP priority. When NULL, it indicates that WFQ is
- * to be used for all priorities. When non-NULL, it points to a pre-allocated
- * array of *n_sp_priorities* values, with non-zero value for byte-mode and
- * zero for packet-mode.
- * @param[in] n_sp_priorities
- * Number of SP priorities.
- * @param[out] error
- * Error details. Filled in only on error, when not NULL.
- * @return
- * 0 on success, non-zero error code otherwise.
- *
- * @see RTE_TM_UPDATE_NODE_WFQ_WEIGHT_MODE
- * @see RTE_TM_UPDATE_NODE_N_SP_PRIORITIES
- */
-int
-rte_tm_node_wfq_weight_mode_update(uint16_t port_id,
- uint32_t node_id,
- int *wfq_weight_mode,
- uint32_t n_sp_priorities,
- struct rte_tm_error *error);
-
-/**
- * Traffic manager node congestion management mode update
- *
- * @param[in] port_id
- * The port identifier of the Ethernet device.
- * @param[in] node_id
- * Node ID. Needs to be valid leaf node ID.
- * @param[in] cman
- * Congestion management mode.
- * @param[out] error
- * Error details. Filled in only on error, when not NULL.
- * @return
- * 0 on success, non-zero error code otherwise.
- *
- * @see RTE_TM_UPDATE_NODE_CMAN
- */
-int
-rte_tm_node_cman_update(uint16_t port_id,
- uint32_t node_id,
- enum rte_tm_cman_mode cman,
- struct rte_tm_error *error);
-
-/**
- * Traffic manager node private WRED context update
- *
- * @param[in] port_id
- * The port identifier of the Ethernet device.
- * @param[in] node_id
- * Node ID. Needs to be valid leaf node ID.
- * @param[in] wred_profile_id
- * WRED profile ID for the private WRED context of the current node. Needs to
- * be either valid WRED profile ID or RTE_TM_WRED_PROFILE_ID_NONE, with the
- * latter disabling the private WRED context of the current node.
- * @param[out] error
- * Error details. Filled in only on error, when not NULL.
- * @return
- * 0 on success, non-zero error code otherwise.
- *
- * @see struct rte_tm_capabilities::cman_wred_context_private_n_max
-*/
-int
-rte_tm_node_wred_context_update(uint16_t port_id,
- uint32_t node_id,
- uint32_t wred_profile_id,
- struct rte_tm_error *error);
-
-/**
- * Traffic manager node shared WRED context update
- *
- * @param[in] port_id
- * The port identifier of the Ethernet device.
- * @param[in] node_id
- * Node ID. Needs to be valid leaf node ID.
- * @param[in] shared_wred_context_id
- * Shared WRED context ID. Needs to be valid.
- * @param[in] add
- * Set to non-zero value to add this shared WRED context to current node or
- * to zero to delete this shared WRED context from current node.
- * @param[out] error
- * Error details. Filled in only on error, when not NULL.
- * @return
- * 0 on success, non-zero error code otherwise.
- *
- * @see struct rte_tm_capabilities::cman_wred_context_shared_n_max
- */
-int
-rte_tm_node_shared_wred_context_update(uint16_t port_id,
- uint32_t node_id,
- uint32_t shared_wred_context_id,
- int add,
- struct rte_tm_error *error);
-
-/**
- * Traffic manager node statistics counters read
- *
- * @param[in] port_id
- * The port identifier of the Ethernet device.
- * @param[in] node_id
- * Node ID. Needs to be valid.
- * @param[out] stats
- * When non-NULL, it contains the current value for the statistics counters
- * enabled for the current node.
- * @param[out] stats_mask
- * When non-NULL, it contains the mask of statistics counter types that are
- * currently enabled for this node, indicating which of the counters
- * retrieved with the *stats* structure are valid.
- * @param[in] clear
- * When this parameter has a non-zero value, the statistics counters are
- * cleared (i.e. set to zero) immediately after they have been read,
- * otherwise the statistics counters are left untouched.
- * @param[out] error
- * Error details. Filled in only on error, when not NULL.
- * @return
- * 0 on success, non-zero error code otherwise.
- *
- * @see enum rte_tm_stats_type
- */
-int
-rte_tm_node_stats_read(uint16_t port_id,
- uint32_t node_id,
- struct rte_tm_node_stats *stats,
- uint64_t *stats_mask,
- int clear,
- struct rte_tm_error *error);
-
-/**
- * Traffic manager packet marking - VLAN DEI (IEEE 802.1Q)
- *
- * IEEE 802.1p maps the traffic class to the VLAN Priority Code Point (PCP)
- * field (3 bits), while IEEE 802.1q maps the drop priority to the VLAN Drop
- * Eligible Indicator (DEI) field (1 bit), which was previously named Canonical
- * Format Indicator (CFI).
- *
- * All VLAN frames of a given color get their DEI bit set if marking is enabled
- * for this color; otherwise, their DEI bit is left as is (either set or not).
- *
- * @param[in] port_id
- * The port identifier of the Ethernet device.
- * @param[in] mark_green
- * Set to non-zero value to enable marking of green packets and to zero to
- * disable it.
- * @param[in] mark_yellow
- * Set to non-zero value to enable marking of yellow packets and to zero to
- * disable it.
- * @param[in] mark_red
- * Set to non-zero value to enable marking of red packets and to zero to
- * disable it.
- * @param[out] error
- * Error details. Filled in only on error, when not NULL.
- * @return
- * 0 on success, non-zero error code otherwise.
- *
- * @see struct rte_tm_capabilities::mark_vlan_dei_supported
- */
-int
-rte_tm_mark_vlan_dei(uint16_t port_id,
- int mark_green,
- int mark_yellow,
- int mark_red,
- struct rte_tm_error *error);
-
-/**
- * Traffic manager packet marking - IPv4 / IPv6 ECN (IETF RFC 3168)
- *
- * IETF RFCs 2474 and 3168 reorganize the IPv4 Type of Service (TOS) field
- * (8 bits) and the IPv6 Traffic Class (TC) field (8 bits) into Differentiated
- * Services Codepoint (DSCP) field (6 bits) and Explicit Congestion
- * Notification (ECN) field (2 bits). The DSCP field is typically used to
- * encode the traffic class and/or drop priority (RFC 2597), while the ECN
- * field is used by RFC 3168 to implement a congestion notification mechanism
- * to be leveraged by transport layer protocols such as TCP and SCTP that have
- * congestion control mechanisms.
- *
- * When congestion is experienced, as alternative to dropping the packet,
- * routers can change the ECN field of input packets from 2'b01 or 2'b10
- * (values indicating that source endpoint is ECN-capable) to 2'b11 (meaning
- * that congestion is experienced). The destination endpoint can use the
- * ECN-Echo (ECE) TCP flag to relay the congestion indication back to the
- * source endpoint, which acknowledges it back to the destination endpoint with
- * the Congestion Window Reduced (CWR) TCP flag.
- *
- * All IPv4/IPv6 packets of a given color with ECN set to 2’b01 or 2’b10
- * carrying TCP or SCTP have their ECN set to 2’b11 if the marking feature is
- * enabled for the current color, otherwise the ECN field is left as is.
- *
- * @param[in] port_id
- * The port identifier of the Ethernet device.
- * @param[in] mark_green
- * Set to non-zero value to enable marking of green packets and to zero to
- * disable it.
- * @param[in] mark_yellow
- * Set to non-zero value to enable marking of yellow packets and to zero to
- * disable it.
- * @param[in] mark_red
- * Set to non-zero value to enable marking of red packets and to zero to
- * disable it.
- * @param[out] error
- * Error details. Filled in only on error, when not NULL.
- * @return
- * 0 on success, non-zero error code otherwise.
- *
- * @see struct rte_tm_capabilities::mark_ip_ecn_tcp_supported
- * @see struct rte_tm_capabilities::mark_ip_ecn_sctp_supported
- */
-int
-rte_tm_mark_ip_ecn(uint16_t port_id,
- int mark_green,
- int mark_yellow,
- int mark_red,
- struct rte_tm_error *error);
-
-/**
- * Traffic manager packet marking - IPv4 / IPv6 DSCP (IETF RFC 2597)
- *
- * IETF RFC 2597 maps the traffic class and the drop priority to the IPv4/IPv6
- * Differentiated Services Codepoint (DSCP) field (6 bits). Here are the DSCP
- * values proposed by this RFC:
- *
- * <pre> Class 1 Class 2 Class 3 Class 4 </pre>
- * <pre> +----------+----------+----------+----------+</pre>
- * <pre>Low Drop Prec | 001010 | 010010 | 011010 | 100010 |</pre>
- * <pre>Medium Drop Prec | 001100 | 010100 | 011100 | 100100 |</pre>
- * <pre>High Drop Prec | 001110 | 010110 | 011110 | 100110 |</pre>
- * <pre> +----------+----------+----------+----------+</pre>
- *
- * There are 4 traffic classes (classes 1 .. 4) encoded by DSCP bits 1 and 2,
- * as well as 3 drop priorities (low/medium/high) encoded by DSCP bits 3 and 4.
- *
- * All IPv4/IPv6 packets have their color marked into DSCP bits 3 and 4 as
- * follows: green mapped to Low Drop Precedence (2’b01), yellow to Medium
- * (2’b10) and red to High (2’b11). Marking needs to be explicitly enabled
- * for each color; when not enabled for a given color, the DSCP field of all
- * packets with that color is left as is.
- *
- * @param[in] port_id
- * The port identifier of the Ethernet device.
- * @param[in] mark_green
- * Set to non-zero value to enable marking of green packets and to zero to
- * disable it.
- * @param[in] mark_yellow
- * Set to non-zero value to enable marking of yellow packets and to zero to
- * disable it.
- * @param[in] mark_red
- * Set to non-zero value to enable marking of red packets and to zero to
- * disable it.
- * @param[out] error
- * Error details. Filled in only on error, when not NULL.
- * @return
- * 0 on success, non-zero error code otherwise.
- *
- * @see struct rte_tm_capabilities::mark_ip_dscp_supported
- */
-int
-rte_tm_mark_ip_dscp(uint16_t port_id,
- int mark_green,
- int mark_yellow,
- int mark_red,
- struct rte_tm_error *error);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __INCLUDE_RTE_TM_H__ */
diff --git a/lib/librte_ether/rte_tm_driver.h b/lib/librte_ether/rte_tm_driver.h
deleted file mode 100644
index 90114ff5..00000000
--- a/lib/librte_ether/rte_tm_driver.h
+++ /dev/null
@@ -1,337 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2017 Intel Corporation
- */
-
-#ifndef __INCLUDE_RTE_TM_DRIVER_H__
-#define __INCLUDE_RTE_TM_DRIVER_H__
-
-/**
- * @file
- * RTE Generic Traffic Manager API (Driver Side)
- *
- * This file provides implementation helpers for internal use by PMDs, they
- * are not intended to be exposed to applications and are not subject to ABI
- * versioning.
- */
-
-#include <stdint.h>
-
-#include <rte_errno.h>
-#include "rte_ethdev.h"
-#include "rte_tm.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/** @internal Traffic manager node ID validate and type get */
-typedef int (*rte_tm_node_type_get_t)(struct rte_eth_dev *dev,
- uint32_t node_id,
- int *is_leaf,
- struct rte_tm_error *error);
-
-/** @internal Traffic manager capabilities get */
-typedef int (*rte_tm_capabilities_get_t)(struct rte_eth_dev *dev,
- struct rte_tm_capabilities *cap,
- struct rte_tm_error *error);
-
-/** @internal Traffic manager level capabilities get */
-typedef int (*rte_tm_level_capabilities_get_t)(struct rte_eth_dev *dev,
- uint32_t level_id,
- struct rte_tm_level_capabilities *cap,
- struct rte_tm_error *error);
-
-/** @internal Traffic manager node capabilities get */
-typedef int (*rte_tm_node_capabilities_get_t)(struct rte_eth_dev *dev,
- uint32_t node_id,
- struct rte_tm_node_capabilities *cap,
- struct rte_tm_error *error);
-
-/** @internal Traffic manager WRED profile add */
-typedef int (*rte_tm_wred_profile_add_t)(struct rte_eth_dev *dev,
- uint32_t wred_profile_id,
- struct rte_tm_wred_params *profile,
- struct rte_tm_error *error);
-
-/** @internal Traffic manager WRED profile delete */
-typedef int (*rte_tm_wred_profile_delete_t)(struct rte_eth_dev *dev,
- uint32_t wred_profile_id,
- struct rte_tm_error *error);
-
-/** @internal Traffic manager shared WRED context add */
-typedef int (*rte_tm_shared_wred_context_add_update_t)(
- struct rte_eth_dev *dev,
- uint32_t shared_wred_context_id,
- uint32_t wred_profile_id,
- struct rte_tm_error *error);
-
-/** @internal Traffic manager shared WRED context delete */
-typedef int (*rte_tm_shared_wred_context_delete_t)(
- struct rte_eth_dev *dev,
- uint32_t shared_wred_context_id,
- struct rte_tm_error *error);
-
-/** @internal Traffic manager shaper profile add */
-typedef int (*rte_tm_shaper_profile_add_t)(struct rte_eth_dev *dev,
- uint32_t shaper_profile_id,
- struct rte_tm_shaper_params *profile,
- struct rte_tm_error *error);
-
-/** @internal Traffic manager shaper profile delete */
-typedef int (*rte_tm_shaper_profile_delete_t)(struct rte_eth_dev *dev,
- uint32_t shaper_profile_id,
- struct rte_tm_error *error);
-
-/** @internal Traffic manager shared shaper add/update */
-typedef int (*rte_tm_shared_shaper_add_update_t)(struct rte_eth_dev *dev,
- uint32_t shared_shaper_id,
- uint32_t shaper_profile_id,
- struct rte_tm_error *error);
-
-/** @internal Traffic manager shared shaper delete */
-typedef int (*rte_tm_shared_shaper_delete_t)(struct rte_eth_dev *dev,
- uint32_t shared_shaper_id,
- struct rte_tm_error *error);
-
-/** @internal Traffic manager node add */
-typedef int (*rte_tm_node_add_t)(struct rte_eth_dev *dev,
- uint32_t node_id,
- uint32_t parent_node_id,
- uint32_t priority,
- uint32_t weight,
- uint32_t level_id,
- struct rte_tm_node_params *params,
- struct rte_tm_error *error);
-
-/** @internal Traffic manager node delete */
-typedef int (*rte_tm_node_delete_t)(struct rte_eth_dev *dev,
- uint32_t node_id,
- struct rte_tm_error *error);
-
-/** @internal Traffic manager node suspend */
-typedef int (*rte_tm_node_suspend_t)(struct rte_eth_dev *dev,
- uint32_t node_id,
- struct rte_tm_error *error);
-
-/** @internal Traffic manager node resume */
-typedef int (*rte_tm_node_resume_t)(struct rte_eth_dev *dev,
- uint32_t node_id,
- struct rte_tm_error *error);
-
-/** @internal Traffic manager hierarchy commit */
-typedef int (*rte_tm_hierarchy_commit_t)(struct rte_eth_dev *dev,
- int clear_on_fail,
- struct rte_tm_error *error);
-
-/** @internal Traffic manager node parent update */
-typedef int (*rte_tm_node_parent_update_t)(struct rte_eth_dev *dev,
- uint32_t node_id,
- uint32_t parent_node_id,
- uint32_t priority,
- uint32_t weight,
- struct rte_tm_error *error);
-
-/** @internal Traffic manager node shaper update */
-typedef int (*rte_tm_node_shaper_update_t)(struct rte_eth_dev *dev,
- uint32_t node_id,
- uint32_t shaper_profile_id,
- struct rte_tm_error *error);
-
-/** @internal Traffic manager node shaper update */
-typedef int (*rte_tm_node_shared_shaper_update_t)(struct rte_eth_dev *dev,
- uint32_t node_id,
- uint32_t shared_shaper_id,
- int32_t add,
- struct rte_tm_error *error);
-
-/** @internal Traffic manager node stats update */
-typedef int (*rte_tm_node_stats_update_t)(struct rte_eth_dev *dev,
- uint32_t node_id,
- uint64_t stats_mask,
- struct rte_tm_error *error);
-
-/** @internal Traffic manager node WFQ weight mode update */
-typedef int (*rte_tm_node_wfq_weight_mode_update_t)(
- struct rte_eth_dev *dev,
- uint32_t node_id,
- int *wfq_weight_mode,
- uint32_t n_sp_priorities,
- struct rte_tm_error *error);
-
-/** @internal Traffic manager node congestion management mode update */
-typedef int (*rte_tm_node_cman_update_t)(struct rte_eth_dev *dev,
- uint32_t node_id,
- enum rte_tm_cman_mode cman,
- struct rte_tm_error *error);
-
-/** @internal Traffic manager node WRED context update */
-typedef int (*rte_tm_node_wred_context_update_t)(
- struct rte_eth_dev *dev,
- uint32_t node_id,
- uint32_t wred_profile_id,
- struct rte_tm_error *error);
-
-/** @internal Traffic manager node WRED context update */
-typedef int (*rte_tm_node_shared_wred_context_update_t)(
- struct rte_eth_dev *dev,
- uint32_t node_id,
- uint32_t shared_wred_context_id,
- int add,
- struct rte_tm_error *error);
-
-/** @internal Traffic manager read stats counters for specific node */
-typedef int (*rte_tm_node_stats_read_t)(struct rte_eth_dev *dev,
- uint32_t node_id,
- struct rte_tm_node_stats *stats,
- uint64_t *stats_mask,
- int clear,
- struct rte_tm_error *error);
-
-/** @internal Traffic manager packet marking - VLAN DEI */
-typedef int (*rte_tm_mark_vlan_dei_t)(struct rte_eth_dev *dev,
- int mark_green,
- int mark_yellow,
- int mark_red,
- struct rte_tm_error *error);
-
-/** @internal Traffic manager packet marking - IPv4/IPv6 ECN */
-typedef int (*rte_tm_mark_ip_ecn_t)(struct rte_eth_dev *dev,
- int mark_green,
- int mark_yellow,
- int mark_red,
- struct rte_tm_error *error);
-
-/** @internal Traffic manager packet marking - IPv4/IPv6 DSCP */
-typedef int (*rte_tm_mark_ip_dscp_t)(struct rte_eth_dev *dev,
- int mark_green,
- int mark_yellow,
- int mark_red,
- struct rte_tm_error *error);
-
-struct rte_tm_ops {
- /** Traffic manager node type get */
- rte_tm_node_type_get_t node_type_get;
-
- /** Traffic manager capabilities_get */
- rte_tm_capabilities_get_t capabilities_get;
- /** Traffic manager level capabilities_get */
- rte_tm_level_capabilities_get_t level_capabilities_get;
- /** Traffic manager node capabilities get */
- rte_tm_node_capabilities_get_t node_capabilities_get;
-
- /** Traffic manager WRED profile add */
- rte_tm_wred_profile_add_t wred_profile_add;
- /** Traffic manager WRED profile delete */
- rte_tm_wred_profile_delete_t wred_profile_delete;
- /** Traffic manager shared WRED context add/update */
- rte_tm_shared_wred_context_add_update_t
- shared_wred_context_add_update;
- /** Traffic manager shared WRED context delete */
- rte_tm_shared_wred_context_delete_t
- shared_wred_context_delete;
-
- /** Traffic manager shaper profile add */
- rte_tm_shaper_profile_add_t shaper_profile_add;
- /** Traffic manager shaper profile delete */
- rte_tm_shaper_profile_delete_t shaper_profile_delete;
- /** Traffic manager shared shaper add/update */
- rte_tm_shared_shaper_add_update_t shared_shaper_add_update;
- /** Traffic manager shared shaper delete */
- rte_tm_shared_shaper_delete_t shared_shaper_delete;
-
- /** Traffic manager node add */
- rte_tm_node_add_t node_add;
- /** Traffic manager node delete */
- rte_tm_node_delete_t node_delete;
- /** Traffic manager node suspend */
- rte_tm_node_suspend_t node_suspend;
- /** Traffic manager node resume */
- rte_tm_node_resume_t node_resume;
- /** Traffic manager hierarchy commit */
- rte_tm_hierarchy_commit_t hierarchy_commit;
-
- /** Traffic manager node parent update */
- rte_tm_node_parent_update_t node_parent_update;
- /** Traffic manager node shaper update */
- rte_tm_node_shaper_update_t node_shaper_update;
- /** Traffic manager node shared shaper update */
- rte_tm_node_shared_shaper_update_t node_shared_shaper_update;
- /** Traffic manager node stats update */
- rte_tm_node_stats_update_t node_stats_update;
- /** Traffic manager node WFQ weight mode update */
- rte_tm_node_wfq_weight_mode_update_t node_wfq_weight_mode_update;
- /** Traffic manager node congestion management mode update */
- rte_tm_node_cman_update_t node_cman_update;
- /** Traffic manager node WRED context update */
- rte_tm_node_wred_context_update_t node_wred_context_update;
- /** Traffic manager node shared WRED context update */
- rte_tm_node_shared_wred_context_update_t
- node_shared_wred_context_update;
- /** Traffic manager read statistics counters for current node */
- rte_tm_node_stats_read_t node_stats_read;
-
- /** Traffic manager packet marking - VLAN DEI */
- rte_tm_mark_vlan_dei_t mark_vlan_dei;
- /** Traffic manager packet marking - IPv4/IPv6 ECN */
- rte_tm_mark_ip_ecn_t mark_ip_ecn;
- /** Traffic manager packet marking - IPv4/IPv6 DSCP */
- rte_tm_mark_ip_dscp_t mark_ip_dscp;
-};
-
-/**
- * Initialize generic error structure.
- *
- * This function also sets rte_errno to a given value.
- *
- * @param[out] error
- * Pointer to error structure (may be NULL).
- * @param[in] code
- * Related error code (rte_errno).
- * @param[in] type
- * Cause field and error type.
- * @param[in] cause
- * Object responsible for the error.
- * @param[in] message
- * Human-readable error message.
- *
- * @return
- * Error code.
- */
-static inline int
-rte_tm_error_set(struct rte_tm_error *error,
- int code,
- enum rte_tm_error_type type,
- const void *cause,
- const char *message)
-{
- if (error) {
- *error = (struct rte_tm_error){
- .type = type,
- .cause = cause,
- .message = message,
- };
- }
- rte_errno = code;
- return code;
-}
-
-/**
- * Get generic traffic manager operations structure from a port
- *
- * @param[in] port_id
- * The port identifier of the Ethernet device.
- * @param[out] error
- * Error details
- *
- * @return
- * The traffic manager operations structure associated with port_id on
- * success, NULL otherwise.
- */
-const struct rte_tm_ops *
-rte_tm_ops_get(uint16_t port_id, struct rte_tm_error *error);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __INCLUDE_RTE_TM_DRIVER_H__ */