f1f6ebc0ea
Currently there are some public headers that include 'sys/queue.h', which is not POSIX, but usually provided by the Linux/BSD system library. (Not in POSIX.1, POSIX.1-2001, or POSIX.1-2008. Present on the BSDs.) The file is missing on Windows. During the Windows build, DPDK uses a bundled copy, so building a DPDK library works fine. But when OVS or other applications use DPDK as a library, because some DPDK public headers include 'sys/queue.h', on Windows, it triggers an error due to no such file. One solution is to install the 'lib/eal/windows/include/sys/queue.h' into Windows environment, such as [1]. However, this means DPDK exports the functionalities of 'sys/queue.h' into the environment, which might cause symbols, macros, headers clashing with other applications. The patch fixes it by removing the "#include <sys/queue.h>" from DPDK public headers, so programs including DPDK headers don't depend on the system to provide 'sys/queue.h'. When these public headers use macros such as TAILQ_xxx, we replace it by the ones with RTE_ prefix. For Windows, we copy the definitions from <sys/queue.h> to rte_os.h in Windows EAL. Note that these RTE_ macros are compatible with <sys/queue.h>, both at the level of API (to use with <sys/queue.h> macros in C files) and ABI (to avoid breaking it). Additionally, the TAILQ_FOREACH_SAFE is not part of <sys/queue.h>, the patch replaces it with RTE_TAILQ_FOREACH_SAFE. [1] http://mails.dpdk.org/archives/dev/2021-August/216304.html Suggested-by: Nick Connolly <nick.connolly@mayadata.io> Suggested-by: Dmitry Kozlyuk <dmitry.kozliuk@gmail.com> Signed-off-by: William Tu <u9012063@gmail.com> Acked-by: Dmitry Kozlyuk <dmitry.kozliuk@gmail.com> Acked-by: Narcisa Vasile <navasile@linux.microsoft.com>
202 lines
7.3 KiB
C
202 lines
7.3 KiB
C
/* SPDX-License-Identifier: BSD-3-Clause
|
|
* Copyright(c) 2017 Intel Corporation
|
|
*/
|
|
|
|
#ifndef _RTE_ETHDEV_CORE_H_
|
|
#define _RTE_ETHDEV_CORE_H_
|
|
|
|
#include <pthread.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 */
|
|
RTE_TAILQ_HEAD(rte_eth_dev_cb_list, rte_eth_dev_callback);
|
|
|
|
struct rte_eth_dev;
|
|
|
|
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 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 */
|
|
|
|
|
|
/**
|
|
* @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. */
|
|
|
|
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. */
|
|
|
|
/**
|
|
* Next two fields are per-device data but *data is shared between
|
|
* primary and secondary processes and *process_private is per-process
|
|
* private. The second one is managed by PMDs if necessary.
|
|
*/
|
|
struct rte_eth_dev_data *data; /**< Pointer to device data. */
|
|
void *process_private; /**< Pointer to per-process 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 */
|
|
|
|
uint64_t reserved_64s[4]; /**< Reserved for future fields */
|
|
void *reserved_ptrs[4]; /**< Reserved for future fields */
|
|
} __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.
|
|
* @see rte_eth_dev_release_port()
|
|
*/
|
|
|
|
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 rte_ether_addr *mac_addrs;
|
|
/**< Device Ethernet link address.
|
|
* @see rte_eth_dev_release_port()
|
|
*/
|
|
uint64_t mac_pool_sel[ETH_NUM_RECEIVE_MAC_ADDR];
|
|
/**< Bitmap associating MAC addresses to pools. */
|
|
struct rte_ether_addr *hash_mac_addrs;
|
|
/**< Device Ethernet MAC addresses of hash filtering.
|
|
* @see rte_eth_dev_release_port()
|
|
*/
|
|
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) */
|
|
dev_configured : 1;
|
|
/**< Indicates whether the device is configured.
|
|
* CONFIGURED(1) / NOT CONFIGURED(0).
|
|
*/
|
|
uint8_t rx_queue_state[RTE_MAX_QUEUES_PER_PORT];
|
|
/**< Queues state: HAIRPIN(2) / STARTED(1) / STOPPED(0). */
|
|
uint8_t tx_queue_state[RTE_MAX_QUEUES_PER_PORT];
|
|
/**< Queues state: HAIRPIN(2) / STARTED(1) / STOPPED(0). */
|
|
uint32_t dev_flags; /**< Capabilities. */
|
|
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. */
|
|
uint16_t representor_id;
|
|
/**< Switch-specific identifier.
|
|
* Valid if RTE_ETH_DEV_REPRESENTOR in dev_flags.
|
|
*/
|
|
|
|
pthread_mutex_t flow_ops_mutex; /**< rte_flow ops mutex. */
|
|
uint64_t reserved_64s[4]; /**< Reserved for future fields */
|
|
void *reserved_ptrs[4]; /**< Reserved for future fields */
|
|
} __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_ */
|