aboutsummaryrefslogtreecommitdiff
path: root/include/odp/api/spec/packet_io_types.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/odp/api/spec/packet_io_types.h')
-rw-r--r--include/odp/api/spec/packet_io_types.h1253
1 files changed, 1253 insertions, 0 deletions
diff --git a/include/odp/api/spec/packet_io_types.h b/include/odp/api/spec/packet_io_types.h
new file mode 100644
index 000000000..9e56e087a
--- /dev/null
+++ b/include/odp/api/spec/packet_io_types.h
@@ -0,0 +1,1253 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright (c) 2013-2018 Linaro Limited
+ * Copyright (c) 2020-2023 Nokia
+ */
+
+/**
+ * @file
+ *
+ * ODP Packet IO types
+ */
+
+#ifndef ODP_API_SPEC_PACKET_IO_TYPES_H_
+#define ODP_API_SPEC_PACKET_IO_TYPES_H_
+#include <odp/visibility_begin.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <odp/api/packet_types.h>
+#include <odp/api/packet_io_stats.h>
+#include <odp/api/pool_types.h>
+#include <odp/api/queue_types.h>
+#include <odp/api/reassembly.h>
+#include <odp/api/std_types.h>
+
+/** @defgroup odp_packet_io ODP PACKET IO
+ * @{
+ */
+
+/**
+ * @typedef odp_pktio_t
+ * Packet IO handle
+ */
+
+/**
+ * @typedef odp_pktin_queue_t
+ * Direct packet input queue handle
+ */
+
+/**
+ * @typedef odp_pktout_queue_t
+ * Direct packet output queue handle
+ */
+
+/**
+ * @typedef odp_lso_profile_t
+ * LSO profile handle
+ */
+
+/**
+ * @def ODP_PKTIO_INVALID
+ * Invalid packet IO handle
+ */
+
+/**
+ * @def ODP_LSO_PROFILE_INVALID
+ * Invalid LSO profile handle
+ */
+
+/**
+ * @def ODP_PKTIO_MAX_INDEX
+ * Maximum packet IO interface index. Use odp_pktio_max_index() to check the
+ * runtime maximum value, which may be smaller than this value.
+ */
+
+/**
+ * @def ODP_PKTIO_MACADDR_MAXSIZE
+ * Minimum size of output buffer for odp_pktio_mac_addr()
+ * Actual MAC address sizes may be different.
+ */
+
+/**
+ * @def ODP_PKTIN_NO_WAIT
+ * Do not wait on packet input
+ */
+
+/**
+ * @def ODP_PKTIN_MAX_QUEUES
+ * Maximum number of packet input queues supported by the API. Use
+ * odp_pktio_capability() to check the maximum number of queues per interface.
+ */
+
+/**
+ * @def ODP_PKTOUT_MAX_QUEUES
+ * Maximum number of packet output queues supported by the API. Use
+ * odp_pktio_capability() to check the maximum number of queues per interface.
+ */
+
+/**
+ * Packet input mode
+ */
+typedef enum odp_pktin_mode_t {
+ /** Direct packet input from the interface */
+ ODP_PKTIN_MODE_DIRECT = 0,
+ /** Packet input through scheduler and scheduled event queues */
+ ODP_PKTIN_MODE_SCHED,
+ /** Packet input through plain event queues */
+ ODP_PKTIN_MODE_QUEUE,
+ /** Application will never receive from this interface */
+ ODP_PKTIN_MODE_DISABLED
+} odp_pktin_mode_t;
+
+/**
+ * Packet output mode
+ */
+typedef enum odp_pktout_mode_t {
+ /** Direct packet output on the interface */
+ ODP_PKTOUT_MODE_DIRECT = 0,
+ /** Packet output through event queues */
+ ODP_PKTOUT_MODE_QUEUE,
+ /** Packet output through traffic manager API */
+ ODP_PKTOUT_MODE_TM,
+ /** Application will never send to this interface */
+ ODP_PKTOUT_MODE_DISABLED
+} odp_pktout_mode_t;
+
+/**
+ * Packet input hash protocols
+ *
+ * The list of protocol header field combinations, which are included into
+ * packet input hash calculation.
+ */
+typedef union odp_pktin_hash_proto_t {
+ /** Protocol header fields for hashing */
+ struct {
+ /** IPv4 addresses and UDP port numbers */
+ uint32_t ipv4_udp : 1;
+ /** IPv4 addresses and TCP port numbers */
+ uint32_t ipv4_tcp : 1;
+ /** IPv4 addresses */
+ uint32_t ipv4 : 1;
+ /** IPv6 addresses and UDP port numbers */
+ uint32_t ipv6_udp : 1;
+ /** IPv6 addresses and TCP port numbers */
+ uint32_t ipv6_tcp : 1;
+ /** IPv6 addresses */
+ uint32_t ipv6 : 1;
+ } proto;
+
+ /** All bits of the bit field structure
+ *
+ * This field can be used to set/clear all bits, or to perform bitwise
+ * operations over those. */
+ uint32_t all_bits;
+} odp_pktin_hash_proto_t;
+
+/**
+ * Packet IO operation mode
+ */
+typedef enum odp_pktio_op_mode_t {
+ /** Multithread safe operation
+ *
+ * Direct packet IO operation (recv or send) is multithread safe. Any
+ * number of application threads may perform the operation
+ * concurrently. */
+ ODP_PKTIO_OP_MT = 0,
+
+ /** Not multithread safe operation
+ *
+ * Direct packet IO operation (recv or send) may not be multithread
+ * safe. Application ensures synchronization between threads so that
+ * simultaneously only single thread attempts the operation on
+ * the same (pktin or pktout) queue. */
+ ODP_PKTIO_OP_MT_UNSAFE
+
+} odp_pktio_op_mode_t;
+
+/**
+ * Packet input queue parameters override
+ */
+typedef struct odp_pktin_queue_param_ovr_t {
+ /** Override for schedule group in odp_schedule_param_t
+ *
+ * This parameter is considered only when queue type is
+ * ODP_QUEUE_TYPE_SCHED. */
+ odp_schedule_group_t group;
+} odp_pktin_queue_param_ovr_t;
+
+/**
+ * Packet input vector configuration
+ */
+typedef struct odp_pktin_vector_config_t {
+ /** Enable packet input vector
+ *
+ * When true, packet input vector is enabled and configured with vector
+ * config parameters. Otherwise, packet input vector configuration
+ * parameters are ignored. When vectors are enabled, packets may
+ * be delivered both as packet vector events and packet events.
+ * The default value is false.
+ */
+ odp_bool_t enable;
+
+ /** Vector pool
+ *
+ * Vector pool to allocate the vectors to hold packets.
+ * The pool must have been created with the ODP_POOL_VECTOR type.
+ */
+ odp_pool_t pool;
+
+ /** Maximum time to wait for packets
+ *
+ * Maximum timeout in nanoseconds to wait for the producer to form the
+ * vector of packet events (odp_packet_vector_t). This value should be
+ * in the range of odp_pktin_vector_capability_t::min_tmo_ns to
+ * odp_pktin_vector_capability_t::max_tmo_ns.
+ */
+ uint64_t max_tmo_ns;
+
+ /** Maximum number of packets in a vector
+ *
+ * The packet input subsystem forms packet vector events when either
+ * it reaches odp_pktin_vector_config_t::max_tmo_ns or producer reaches
+ * max_size packets. This value should be in the range of
+ * odp_pktin_vector_capability_t::min_size to
+ * odp_pktin_vector_capability_t::max_size.
+ *
+ * @note The maximum number of packets this vector can hold is defined
+ * by odp_pool_param_t::vector::max_size with odp_pktin_vector_config_t::pool.
+ * The max_size should not be greater than odp_pool_param_t::vector::max_size.
+ */
+ uint32_t max_size;
+
+} odp_pktin_vector_config_t;
+
+/**
+ * Packet input queue parameters
+ */
+typedef struct odp_pktin_queue_param_t {
+ /** Operation mode
+ *
+ * The default value is ODP_PKTIO_OP_MT. Application may enable
+ * performance optimization by defining ODP_PKTIO_OP_MT_UNSAFE when
+ * applicable. */
+ odp_pktio_op_mode_t op_mode;
+
+ /** Enable classifier
+ *
+ * * 0: Classifier is disabled (default)
+ * * 1: Classifier is enabled. Use classifier to direct incoming
+ * packets into pktin event queues. Classifier can be enabled
+ * only in ODP_PKTIN_MODE_SCHED and ODP_PKTIN_MODE_QUEUE modes.
+ * Both classifier and hashing cannot be enabled simultaneously
+ * ('hash_enable' must be 0). */
+ odp_bool_t classifier_enable;
+
+ /** Enable flow hashing
+ *
+ * * 0: Do not hash flows (default)
+ * * 1: Enable flow hashing. Use flow hashing to spread incoming
+ * packets into input queues. Hashing can be enabled in all
+ * modes. Both classifier and hashing cannot be enabled
+ * simultaneously ('classifier_enable' must be 0). */
+ odp_bool_t hash_enable;
+
+ /** Protocol field selection for hashing
+ *
+ * Multiple protocols can be selected. Ignored when 'hash_enable' is
+ * zero. The default value is all bits zero. */
+ odp_pktin_hash_proto_t hash_proto;
+
+ /** Number of input queues to be created
+ *
+ * When classifier is enabled in odp_pktin_queue_config() this
+ * value is ignored, otherwise at least one queue is required.
+ * More than one input queues require flow hashing configured.
+ * The maximum value is defined by pktio capability 'max_input_queues'.
+ * Queue type is defined by the input mode. The default value is 1. */
+ uint32_t num_queues;
+
+ /** Input queue size array
+ *
+ * An array containing queue sizes for each 'num_queues' input queues
+ * in ODP_PKTIN_MODE_DIRECT mode. The value of zero means
+ * implementation specific default size. Nonzero values must be between
+ * 'min_input_queue_size' and 'max_input_queue_size' capabilities. The
+ * implementation may round-up given values. The default value is zero.
+ */
+ uint32_t queue_size[ODP_PKTIN_MAX_QUEUES];
+
+ /** Queue parameters
+ *
+ * These are used for input queue creation in ODP_PKTIN_MODE_QUEUE
+ * or ODP_PKTIN_MODE_SCHED modes. Scheduler parameters are considered
+ * only in ODP_PKTIN_MODE_SCHED mode. Default values are defined in
+ * odp_queue_param_t documentation. The type field is ignored
+ * and the queue type is deduced from the pktio input mode.
+ * When classifier is enabled in odp_pktin_queue_config() this
+ * value is ignored. */
+ odp_queue_param_t queue_param;
+
+ /** Queue parameters override
+ *
+ * When the override array is defined, the same parameter value
+ * in 'queue_param' is ignored and these per queue parameter
+ * values are used instead. Array elements are used in order
+ * (i.e. the first queue gets parameters from the first array
+ * element, etc).
+ * Must point to an array of num_queues elements or NULL to
+ * disable queue parameters override. The default value is
+ * NULL.
+ */
+ odp_pktin_queue_param_ovr_t *queue_param_ovr;
+
+ /** Packet input vector configuration */
+ odp_pktin_vector_config_t vector;
+
+} odp_pktin_queue_param_t;
+
+/**
+ * Packet output queue parameters
+ *
+ * These parameters are used in ODP_PKTOUT_MODE_DIRECT and
+ * ODP_PKTOUT_MODE_QUEUE modes.
+ */
+typedef struct odp_pktout_queue_param_t {
+ /** Operation mode
+ *
+ * The default value is ODP_PKTIO_OP_MT. Application may enable
+ * performance optimization by defining ODP_PKTIO_OP_MT_UNSAFE when
+ * applicable. */
+ odp_pktio_op_mode_t op_mode;
+
+ /** Number of output queues to be created. The value must be between
+ * 1 and interface capability. The default value is 1. */
+ uint32_t num_queues;
+
+ /** Output queue size array
+ *
+ * An array containing queue sizes for each 'num_queues' output queues.
+ * The value of zero means implementation specific default size.
+ * Nonzero values must be between 'min_output_queue_size' and
+ * 'max_output_queue_size' capabilities. The implementation may
+ * round-up given values. The default value is zero.
+ */
+ uint32_t queue_size[ODP_PKTOUT_MAX_QUEUES];
+
+} odp_pktout_queue_param_t;
+
+/**
+ * Packet IO parameters
+ *
+ * Packet IO interface level parameters. Use odp_pktio_param_init() to
+ * initialize the structure with default values.
+ */
+typedef struct odp_pktio_param_t {
+ /** Packet input mode
+ *
+ * The default value is ODP_PKTIN_MODE_DIRECT. */
+ odp_pktin_mode_t in_mode;
+
+ /** Packet output mode
+ *
+ * The default value is ODP_PKTOUT_MODE_DIRECT. */
+ odp_pktout_mode_t out_mode;
+
+} odp_pktio_param_t;
+
+/**
+ * Packet input configuration options bit field
+ *
+ * Packet input configuration options listed in a bit field structure. Packet
+ * input timestamping may be enabled for all packets or at least for those that
+ * belong to time synchronization protocol (PTP).
+ *
+ * Packet input checksum checking may be enabled or disabled. When it is
+ * enabled, implementation will attempt to verify checksum correctness on
+ * incoming packets and depending on drop configuration either deliver erroneous
+ * packets with appropriate flags set (e.g. odp_packet_has_l3_error(),
+ * odp_packet_l3_chksum_status()) or drop those. When packet dropping is
+ * enabled, application will never receive a packet with the specified error
+ * and may avoid to check the error flag.
+ *
+ * If checksum checking is enabled, IPv4 header checksum checking is always
+ * done for packets that do not have IP options and L4 checksum checking
+ * is done for unfragmented packets that do not have IPv4 options or IPv6
+ * extension headers. In other cases checksum checking may or may not
+ * be done. For example, L4 checksum of fragmented packets is typically
+ * not checked.
+ *
+ * IPv4 checksum checking may be enabled only when parsing level is
+ * ODP_PROTO_LAYER_L3 or higher. Similarly, L4 level checksum checking
+ * may be enabled only with parsing level ODP_PROTO_LAYER_L4 or higher.
+ *
+ * Whether checksum checking was done and whether a checksum was correct
+ * can be queried for each received packet with odp_packet_l3_chksum_status()
+ * and odp_packet_l4_chksum_status().
+ */
+typedef union odp_pktin_config_opt_t {
+ /** Option flags */
+ struct {
+ /** Timestamp all packets on packet input */
+ uint64_t ts_all : 1;
+
+ /** Timestamp (at least) IEEE1588 / PTP packets
+ * on packet input */
+ uint64_t ts_ptp : 1;
+
+ /** Check IPv4 header checksum on packet input */
+ uint64_t ipv4_chksum : 1;
+
+ /** Check UDP checksum on packet input */
+ uint64_t udp_chksum : 1;
+
+ /** Check TCP checksum on packet input */
+ uint64_t tcp_chksum : 1;
+
+ /** Check SCTP checksum on packet input */
+ uint64_t sctp_chksum : 1;
+
+ /** Drop packets with an IPv4 error on packet input */
+ uint64_t drop_ipv4_err : 1;
+
+ /** Drop packets with an IPv6 error on packet input */
+ uint64_t drop_ipv6_err : 1;
+
+ /** Drop packets with a UDP error on packet input */
+ uint64_t drop_udp_err : 1;
+
+ /** Drop packets with a TCP error on packet input */
+ uint64_t drop_tcp_err : 1;
+
+ /** Drop packets with a SCTP error on packet input */
+ uint64_t drop_sctp_err : 1;
+
+ } bit;
+
+ /** All bits of the bit field structure
+ *
+ * This field can be used to set/clear all flags, or bitwise
+ * operations over the entire structure. */
+ uint64_t all_bits;
+} odp_pktin_config_opt_t;
+
+/**
+ * Packet output configuration options bit field
+ *
+ * Packet output configuration options listed in a bit field structure. Packet
+ * output checksum insertion may be enabled or disabled (e.g. ipv4_chksum_ena):
+ *
+ * 0: Disable checksum insertion. Application will not request checksum
+ * insertion for any packet. This is the default value for xxx_chksum_ena
+ * bits.
+ * 1: Enable checksum insertion. Application will request checksum insertion
+ * for some packets.
+ *
+ * When checksum insertion is enabled, application may use configuration options
+ * to set the default behaviour on packet output (e.g. ipv4_chksum):
+ *
+ * 0: Do not insert checksum by default. This is the default value for
+ * xxx_chksum bits.
+ * 1: Calculate and insert checksum by default.
+ *
+ * These defaults may be overridden on per packet basis using e.g.
+ * odp_packet_l4_chksum_insert().
+ *
+ * For correct operation, packet metadata must provide valid offsets and type
+ * flags for the appropriate layer 3 and layer 4 protocols. L3 and L4 offsets
+ * can be updated with odp_packet_l3_offset_set() and odp_packet_l4_offset_set()
+ * calls. L3 and L4 type flags can be updated using odp_packet_has_*_set() calls
+ * For example, UDP checksum calculation needs both L3 and L4 types (IP and UDP) and
+ * L3 and L4 offsets (to access IP and UDP headers), while IP checksum
+ * calculation only needs L3 type (IP) and L3 offset (to access IP header).
+ * When application (e.g. a switch) does not modify L3/L4 data and thus checksum
+ * does not need to be updated, checksum insertion should be disabled for optimal
+ * performance.
+ *
+ * UDP, TCP and SCTP checksum insertion must not be requested for IP fragments.
+ * Use checksum override function (odp_packet_l4_chksum_insert()) to disable
+ * checksumming when sending a fragment through a packet IO interface that has
+ * the relevant L4 checksum insertion enabled.
+ *
+ * Result of checksum insertion at packet output is undefined if the protocol
+ * headers required for checksum calculation are not well formed. Packet must
+ * contain at least as many data bytes after L3/L4 offsets as the headers
+ * indicate. Other data bytes of the packet are ignored for the checksum
+ * insertion.
+ */
+typedef union odp_pktout_config_opt_t {
+ /** Option flags for packet output */
+ struct {
+ /** Enable Tx timestamp capture */
+ uint64_t ts_ena : 1;
+
+ /** Enable IPv4 header checksum insertion */
+ uint64_t ipv4_chksum_ena : 1;
+
+ /** Enable UDP checksum insertion */
+ uint64_t udp_chksum_ena : 1;
+
+ /** Enable TCP checksum insertion */
+ uint64_t tcp_chksum_ena : 1;
+
+ /** Enable SCTP checksum insertion */
+ uint64_t sctp_chksum_ena : 1;
+
+ /** Insert IPv4 header checksum by default */
+ uint64_t ipv4_chksum : 1;
+
+ /** Insert UDP checksum on packet by default */
+ uint64_t udp_chksum : 1;
+
+ /** Insert TCP checksum on packet by default */
+ uint64_t tcp_chksum : 1;
+
+ /** Insert SCTP checksum on packet by default */
+ uint64_t sctp_chksum : 1;
+
+ /** Packet references not used on packet output
+ *
+ * When set, application indicates that it will not transmit
+ * packet references on this packet IO interface.
+ * Since every ODP implementation supports it, it is always
+ * ok to set this flag.
+ *
+ * 0: Packet references may be transmitted on the
+ * interface (the default value).
+ * 1: Packet references will not be transmitted on the
+ * interface.
+ */
+ uint64_t no_packet_refs : 1;
+
+ /** Enable packet aging and drop
+ *
+ * 0: application will not request packet aging (default)
+ * 1: application may request packet aging
+ */
+ uint64_t aging_ena : 1;
+
+ /**
+ * For backwards compatibility, setting this flag is the same as setting
+ * tx_compl.mode_event in odp_pktio_config_t. The default value is zero.
+ *
+ * @deprecated Use odp_pktio_config_t::mode_event instead.
+ */
+ uint64_t tx_compl_ena : 1;
+
+ /** Enable packet protocol stats update */
+ uint64_t proto_stats_ena : 1;
+
+ } bit;
+
+ /** All bits of the bit field structure
+ *
+ * This field can be used to set/clear all flags, or bitwise
+ * operations over the entire structure. */
+ uint64_t all_bits;
+} odp_pktout_config_opt_t;
+
+/**
+ * Parser configuration
+ */
+typedef struct odp_pktio_parser_config_t {
+ /** Protocol parsing level in packet input
+ *
+ * Application requires that protocol headers in a packet are checked
+ * up to this layer during packet input. Use ODP_PROTO_LAYER_ALL for
+ * all layers. Packet metadata for this and all preceding layers are
+ * set. In addition, offset (and pointer) to the next layer is set.
+ * Other layer/protocol specific metadata have undefined values.
+ *
+ * The default value is ODP_PROTO_LAYER_ALL. */
+ odp_proto_layer_t layer;
+
+} odp_pktio_parser_config_t;
+
+/** Ethernet flow control modes */
+typedef enum odp_pktio_link_pause_t {
+ /** Flow control mode is unknown */
+ ODP_PKTIO_LINK_PAUSE_UNKNOWN = -1,
+ /** No flow control */
+ ODP_PKTIO_LINK_PAUSE_OFF = 0,
+ /** Pause frame flow control enabled */
+ ODP_PKTIO_LINK_PAUSE_ON = 1,
+ /** Priority-based Flow Control (PFC) enabled */
+ ODP_PKTIO_LINK_PFC_ON = 2
+
+} odp_pktio_link_pause_t;
+
+/**
+ * Packet IO configuration options
+ *
+ * Packet IO interface level configuration options. Use odp_pktio_capability()
+ * to see which options are supported by the implementation.
+ * Use odp_pktio_config_init() to initialize the structure with default values.
+ */
+typedef struct odp_pktio_config_t {
+ /** Packet input configuration options bit field
+ *
+ * Default value for all bits is zero. */
+ odp_pktin_config_opt_t pktin;
+
+ /** Packet output configuration options bit field
+ *
+ * Default value for all bits is zero. */
+ odp_pktout_config_opt_t pktout;
+
+ /** Packet input parser configuration */
+ odp_pktio_parser_config_t parser;
+
+ /** Interface loopback mode
+ *
+ * In this mode the packets sent out through the interface is
+ * looped back to input of the same interface. Supporting loopback mode
+ * is an optional feature per interface and should be queried in the
+ * interface capability before enabling the same.
+ *
+ * Default value is false.
+ */
+ odp_bool_t enable_loop;
+
+ /** Inbound IPSEC inlined with packet input
+ *
+ * Enable/disable inline inbound IPSEC operation. When enabled packet
+ * input directs all IPSEC packets automatically to IPSEC inbound
+ * processing. IPSEC configuration (through IPSEC API) must be done
+ * before enabling this feature in pktio.
+ * Packets that are not (recognized as) IPSEC are processed
+ * according to the packet input configuration.
+ *
+ * 0: Disable inbound IPSEC inline operation (default)
+ * 1: Enable inbound IPSEC inline operation
+ *
+ * @see odp_ipsec_config(), odp_ipsec_sa_create()
+ */
+ odp_bool_t inbound_ipsec;
+
+ /** Outbound IPSEC inlined with packet output
+ *
+ * Enable/disable inline outbound IPSEC operation. When enabled IPSEC
+ * outbound processing can send outgoing IPSEC packets directly
+ * to the pktio interface for output. IPSEC configuration is done
+ * through the IPSEC API.
+ *
+ * Support of outbound IPSEC inline operation with traffic manager
+ * (ODP_PKTOUT_MODE_TM) can be queried with odp_ipsec_capability().
+ *
+ * * 0: Disable outbound IPSEC inline operation (default)
+ * * 1: Enable outbound IPSEC inline operation
+ *
+ * @see odp_ipsec_config(), odp_ipsec_sa_create(), odp_ipsec_out_inline()
+ */
+ odp_bool_t outbound_ipsec;
+
+ /** Enable Large Send Offload (LSO)
+ *
+ * Enables LSO on the interface. Use LSO capabilities (odp_lso_capability_t) to check if
+ * the interface supports LSO (in the selected packet output mode). LSO cannot be enabled
+ * in ODP_PKTOUT_MODE_QUEUE mode. Also, LSO operation cannot be combined with IPSEC on
+ * packet output.
+ *
+ * Application requests LSO for outgoing packets with odp_pktout_send_lso() or
+ * odp_tm_enq_multi_lso(). Other packet output calls ignore LSO metadata in packets.
+ *
+ * 0: Application will not use LSO (default)
+ * 1: Application will use LSO
+ */
+ odp_bool_t enable_lso;
+
+ /** Packet input reassembly configuration */
+ odp_reass_config_t reassembly;
+
+ /** Link flow control configuration */
+ struct {
+ /** Reception of flow control frames
+ *
+ * Configures interface operation when an Ethernet flow control frame is received:
+ * * ODP_PKTIO_LINK_PAUSE_OFF: Flow control is disabled
+ * * ODP_PKTIO_LINK_PAUSE_ON: Enable traditional Ethernet pause frame handling.
+ * When a pause frame is received, all packet output
+ * is halted temporarily.
+ * * ODP_PKTIO_LINK_PFC_ON: Enable Priority-based Flow Control (PFC)
+ * handling. When a PFC frame is received, packet
+ * output of certain (VLAN) class of service levels
+ * are halted temporarily.
+ *
+ * The default value is ODP_PKTIO_LINK_PAUSE_OFF.
+ */
+ odp_pktio_link_pause_t pause_rx;
+
+ /** Transmission of flow control frames
+ *
+ * Configures Ethernet flow control frame generation on the interface:
+ * * ODP_PKTIO_LINK_PAUSE_OFF: Flow control is disabled
+ * * ODP_PKTIO_LINK_PAUSE_ON: Enable traditional Ethernet pause frame
+ * generation. Pause frames are generated to request
+ * the remote end of the link to halt all
+ * transmissions temporarily.
+ * * ODP_PKTIO_LINK_PFC_ON: Enable Priority-based Flow Control (PFC) frame
+ * generation. PFC frames are generated to request
+ * the remote end of the link to halt transmission
+ * of certain (VLAN) class of service levels
+ * temporarily.
+ *
+ * When PFC is enabled, classifier API is used to configure CoS nodes with back
+ * pressure threshold and PFC priority level parameters (odp_bp_param_t).
+ *
+ * The default value is ODP_PKTIO_LINK_PAUSE_OFF.
+ */
+ odp_pktio_link_pause_t pause_tx;
+
+ } flow_control;
+
+ /**
+ * Packet transmit completion configuration
+ */
+ struct {
+ /**
+ * Enable packet transmit completion events
+ *
+ * Use pktio capability tx_compl to check if packet transmit completion mode
+ * #ODP_PACKET_TX_COMPL_EVENT is supported.
+ *
+ * 0: Application will not request ODP_PACKET_TX_COMPL_EVENT mode
+ * completion (default)
+ * 1: Application may request ODP_PACKET_TX_COMPL_EVENT mode completion
+ */
+ uint32_t mode_event : 1;
+
+ /**
+ * Enable packet transmit completion check through polling
+ *
+ * Use pktio capability tx_compl to check if packet transmit completion mode
+ * #ODP_PACKET_TX_COMPL_POLL is supported.
+ *
+ * 0: Application will not request ODP_PACKET_TX_COMPL_POLL mode
+ * completion (default)
+ * 1: Application may request ODP_PACKET_TX_COMPL_POLL mode completion
+ */
+ uint32_t mode_poll : 1;
+
+ /**
+ * Maximum completion index
+ *
+ * When ODP_PACKET_TX_COMPL_POLL mode is enabled, the maximum completion index
+ * value that application will use. The value must be between 0 and
+ * tx_compl.max_compl_id capability. The default value is zero.
+ */
+ uint32_t max_compl_id;
+
+ } tx_compl;
+
+} odp_pktio_config_t;
+
+/**
+ * Packet IO set operations
+ *
+ * Supported packet IO interface set operations listed in a bit field structure.
+ */
+typedef union odp_pktio_set_op_t {
+ /** Operation flags */
+ struct {
+ /** Promiscuous mode */
+ uint32_t promisc_mode : 1;
+ /** MAC address */
+ uint32_t mac_addr : 1;
+ /** Per port header offset(skip)set */
+ uint32_t skip_offset : 1;
+ /** Maximum frame length */
+ uint32_t maxlen : 1;
+ } op;
+ /** All bits of the bit field structure.
+ * This field can be used to set/clear all flags, or bitwise
+ * operations over the entire structure. */
+ uint32_t all_bits;
+} odp_pktio_set_op_t;
+
+/** Maximum number of custom LSO fields supported by ODP API */
+#define ODP_LSO_MAX_CUSTOM 8
+
+/** LSO custom modification options */
+typedef enum odp_lso_modify_t {
+ /** Add current segment number. Numbering starts from zero. */
+ ODP_LSO_ADD_SEGMENT_NUM = 0x1,
+
+ /** Add number of payload bytes in the segment */
+ ODP_LSO_ADD_PAYLOAD_LEN = 0x2,
+
+ /** Add number of payload bytes in all previous segments */
+ ODP_LSO_ADD_PAYLOAD_OFFSET = 0x4
+
+} odp_lso_modify_t;
+
+/** LSO protocol options
+ *
+ * An LSO operation may perform segmentation on these protocols.
+ */
+typedef enum odp_lso_protocol_t {
+ /** Protocol not selected. */
+ ODP_LSO_PROTO_NONE = 0,
+
+ /** Custom protocol. LSO performs only custom field updates to the packet headers. */
+ ODP_LSO_PROTO_CUSTOM,
+
+ /** LSO performs IPv4 fragmentation.
+ *
+ * IP header length and checksum fields are updated. IP fragmentation related fields are
+ * filled and IPv4 Identification field value is copied from the original packet. */
+ ODP_LSO_PROTO_IPV4,
+
+ /** LSO performs IPv6 fragmentation. */
+ ODP_LSO_PROTO_IPV6,
+
+ /** LSO performs TCP segmentation on top of IPv4.
+ *
+ * IP header length and checksum fields are updated. IP fragmentation is not performed
+ * and IPv4 Don't Fragment bit is not set. Unique IPv4 Identification field values
+ * are generated. Those are usually increments of the IPv4 ID field value in the packet.
+ */
+ ODP_LSO_PROTO_TCP_IPV4,
+
+ /** LSO performs TCP segmentation on top of IPv6. */
+ ODP_LSO_PROTO_TCP_IPV6,
+
+ /** LSO performs SCTP segmentation on top of IPv4. */
+ ODP_LSO_PROTO_SCTP_IPV4,
+
+ /** LSO performs SCTP segmentation on top of IPv6. */
+ ODP_LSO_PROTO_SCTP_IPV6
+
+} odp_lso_protocol_t;
+
+/** Large Send Offload (LSO) capabilities */
+typedef struct odp_lso_capability_t {
+ /** Maximum number of LSO profiles. When zero, LSO is not supported. */
+ uint32_t max_profiles;
+
+ /** Maximum number of LSO profiles per packet IO interface. When zero, LSO is not
+ * supported by the interface. */
+ uint32_t max_profiles_per_pktio;
+
+ /** Maximum number of segments in an input packet. When one, LSO operation accepts only
+ * non-segmented packets as input. */
+ uint32_t max_packet_segments;
+
+ /** Maximum number of segments an LSO operation may create. This implies that
+ * the maximum supported input packet payload size for an LSO operation is
+ * max_segments * max_payload_len bytes. */
+ uint32_t max_segments;
+
+ /** Maximum payload length per an LSO generated packet (in bytes). This is the maximum value
+ * for max_payload_len in odp_packet_lso_opt_t. */
+ uint32_t max_payload_len;
+
+ /** Maximum supported offset to the packet payload (in bytes). This is the maximum value
+ * for payload_offset in odp_packet_lso_opt_t. */
+ uint32_t max_payload_offset;
+
+ /** Supported LSO custom modification options */
+ struct {
+ /** ODP_LSO_ADD_SEGMENT_NUM support */
+ uint16_t add_segment_num:1;
+
+ /** ODP_LSO_ADD_PAYLOAD_LEN support */
+ uint16_t add_payload_len:1;
+
+ /** ODP_LSO_ADD_PAYLOAD_OFFSET support */
+ uint16_t add_payload_offset:1;
+
+ } mod_op;
+
+ /** Maximum number of custom fields supported per LSO profile. When zero, custom
+ * fields are not supported. */
+ uint8_t max_num_custom;
+
+ /** Supported LSO protocol options */
+ struct {
+ /** ODP_LSO_PROTO_CUSTOM support */
+ uint32_t custom:1;
+
+ /** ODP_LSO_PROTO_IPV4 support */
+ uint32_t ipv4:1;
+
+ /** ODP_LSO_PROTO_IPV6 support */
+ uint32_t ipv6:1;
+
+ /** ODP_LSO_PROTO_TCP_IPV4 support */
+ uint32_t tcp_ipv4:1;
+
+ /** ODP_LSO_PROTO_TCP_IPV6 support */
+ uint32_t tcp_ipv6:1;
+
+ /** ODP_LSO_PROTO_SCTP_IPV4 support */
+ uint32_t sctp_ipv4:1;
+
+ /** ODP_LSO_PROTO_SCTP_IPV6 support */
+ uint32_t sctp_ipv6:1;
+
+ } proto;
+
+} odp_lso_capability_t;
+
+/**
+ * Packet input vector capabilities
+ */
+typedef struct odp_pktin_vector_capability_t {
+ /** Packet input vector availability */
+ odp_support_t supported;
+
+ /** Maximum number of packets that can be accumulated into a packet
+ * vector by a producer
+ *
+ * odp_pktin_vector_config_t::max_size should not be greater than this
+ * value. */
+ uint32_t max_size;
+
+ /** Minimum value allowed to be configured to
+ * odp_pktin_vector_config_t::max_size */
+ uint32_t min_size;
+
+ /** Maximum timeout in nanoseconds for the producer to wait for the
+ * vector of packets
+ *
+ * odp_pktin_vector_config_t::max_tmo_ns should not be greater than this
+ * value. */
+ uint64_t max_tmo_ns;
+
+ /** Minimum value allowed to be configured to
+ * odp_pktin_vector_config_t::max_tmo_ns */
+ uint64_t min_tmo_ns;
+
+} odp_pktin_vector_capability_t;
+
+/**
+ * Packet IO capabilities
+ *
+ * Note that interface capabilities may differ between packet output modes. For example,
+ * LSO may not be supported in ODP_PKTOUT_MODE_TM mode, while it is supported in
+ * ODP_PKTOUT_MODE_DIRECT mode.
+ */
+typedef struct odp_pktio_capability_t {
+ /** Maximum number of input queues
+ *
+ * Value does not exceed ODP_PKTIN_MAX_QUEUES. */
+ uint32_t max_input_queues;
+
+ /** Minimum input queue size
+ *
+ * Zero if configuring queue size is not supported. */
+ uint32_t min_input_queue_size;
+
+ /** Maximum input queue size
+ *
+ * Zero if configuring queue size is not supported. */
+ uint32_t max_input_queue_size;
+
+ /** Maximum number of output queues
+ *
+ * Value does not exceed ODP_PKTOUT_MAX_QUEUES. */
+ uint32_t max_output_queues;
+
+ /** Minimum output queue size
+ *
+ * Zero if configuring queue size is not supported. */
+ uint32_t min_output_queue_size;
+
+ /** Maximum output queue size
+ *
+ * Zero if configuring queue size is not supported. */
+ uint32_t max_output_queue_size;
+
+ /** Supported pktio configuration options */
+ odp_pktio_config_t config;
+
+ /** Supported set operations
+ *
+ * A bit set to one indicates a supported operation. All other bits are
+ * set to zero. */
+ odp_pktio_set_op_t set_op;
+
+ /** Packet input vector capability */
+ odp_pktin_vector_capability_t vector;
+
+ /** LSO capabilities */
+ odp_lso_capability_t lso;
+
+ /** Supported frame lengths for odp_pktio_maxlen_set()
+ *
+ * A frame length value of zero indicates an unsupported operation. */
+ struct {
+ /** Equal maximum frame length for both packet input and output
+ *
+ * When set, the same maximum frame length value has to be used
+ * for both input and output directions. */
+ odp_bool_t equal;
+ /** Minimum valid value for 'maxlen_input' */
+ uint32_t min_input;
+ /** Maximum valid value for 'maxlen_input' */
+ uint32_t max_input;
+ /** Minimum valid value for 'maxlen_output' */
+ uint32_t min_output;
+ /** Maximum valid value for 'maxlen_output' */
+ uint32_t max_output;
+ } maxlen;
+
+ /**
+ * Max Tx aging timeout in nano seconds supported when packet aging
+ * feature is supported.
+ *
+ * 0: aging is not supported
+ * >0: maximum aging timeout supported in nanoseconds
+ */
+ uint64_t max_tx_aging_tmo_ns;
+
+ /** Supported packet Tx completion options */
+ struct {
+ /**
+ * Scheduled queue support
+ *
+ * This defines whether schedule queues are supported for receiving Tx
+ * completion events.
+ *
+ * 0: Scheduled queues are not supported for receiving Tx completion events.
+ * 1: Scheduled queues are supported for receiving Tx completion events.
+ * @see odp_packet_tx_compl_request()
+ */
+ odp_bool_t queue_type_sched;
+
+ /**
+ * Plain queue support
+ *
+ * This defines whether plain queues are supported for receiving Tx
+ * completion events.
+ *
+ * 0: Plain queues are not supported for receiving Tx completion events.
+ * 1: Plain queues are supported for receiving Tx completion events.
+ * @see odp_packet_tx_compl_request()
+ */
+ odp_bool_t queue_type_plain;
+
+ /**
+ * For backwards compatibility, mode_all is synonym of mode_event.
+ *
+ * @deprecated Use mode_event instead.
+ */
+ uint32_t mode_all : 1;
+
+ /** Packet transmit completion mode ODP_PACKET_TX_COMPL_EVENT support */
+ uint32_t mode_event : 1;
+
+ /** Packet transmit completion mode ODP_PACKET_TX_COMPL_POLL support */
+ uint32_t mode_poll : 1;
+
+ /** Maximum supported completion ID value */
+ uint32_t max_compl_id;
+
+ } tx_compl;
+
+ /** Supported packet free control options */
+ struct {
+ /**
+ * Packet free control option #ODP_PACKET_FREE_CTRL_DONT_FREE support
+ * with odp_packet_free_ctrl_set().
+ */
+ uint32_t dont_free : 1;
+
+ } free_ctrl;
+
+ /** Packet input reassembly capability */
+ odp_reass_capability_t reassembly;
+
+ /** Statistics counters capabilities */
+ odp_pktio_stats_capability_t stats;
+
+ /** Supported flow control modes */
+ struct {
+ /** Reception of traditional Ethernet pause frames */
+ uint32_t pause_rx: 1;
+
+ /** Reception of PFC frames */
+ uint32_t pfc_rx: 1;
+
+ /** Generation of traditional Ethernet pause frames */
+ uint32_t pause_tx: 1;
+
+ /** Generation of PFC frames */
+ uint32_t pfc_tx: 1;
+
+ } flow_control;
+
+} odp_pktio_capability_t;
+
+/**
+ * LSO profile parameters
+ */
+typedef struct odp_lso_profile_param_t {
+ /**
+ * Segmentation protocol
+ *
+ * Selects on which protocol LSO operation performs segmentation (e.g. IP fragmentation vs.
+ * TCP segmentation). When ODP_LSO_PROTO_CUSTOM is selected, only custom field
+ * modifications are performed. The default value is ODP_LSO_PROTO_NONE. Check LSO
+ * capability for supported protocols.
+ */
+ odp_lso_protocol_t lso_proto;
+
+ /**
+ * Custom fields
+ *
+ * Set lso_proto to ODP_LSO_PROTO_CUSTOM when using custom fields. Fields are defined
+ * in the same order they appear in the packet.
+ */
+ struct {
+ /** Custom field to be modified by LSO */
+ struct {
+ /** Field modify operation. Selects how value of the field is modified
+ * from its original value during segmentation. Field value is assumed
+ * to be in network (big endian) byte order. */
+ odp_lso_modify_t mod_op;
+
+ /** Field offset in bytes from packet start */
+ uint32_t offset;
+
+ /** Field size in bytes. Valid values are 1, 2, 4, and 8 bytes. */
+ uint8_t size;
+
+ } field[ODP_LSO_MAX_CUSTOM];
+
+ /** Number of custom fields specified. The default value is 0. */
+ uint8_t num_custom;
+
+ } custom;
+
+} odp_lso_profile_param_t;
+
+/** Link status */
+typedef enum odp_pktio_link_status_t {
+ /** Link status is unknown */
+ ODP_PKTIO_LINK_STATUS_UNKNOWN = -1,
+ /** Link status is down */
+ ODP_PKTIO_LINK_STATUS_DOWN = 0,
+ /** Link status is up */
+ ODP_PKTIO_LINK_STATUS_UP = 1
+
+} odp_pktio_link_status_t;
+
+/**
+ * Packet IO information
+ */
+typedef struct odp_pktio_info_t {
+ /** Packet IO device name */
+ const char *name;
+
+ /** Packet IO driver name (implementation specific) */
+ const char *drv_name;
+
+ /** Packet pool */
+ odp_pool_t pool;
+
+ /** Packet IO parameters */
+ odp_pktio_param_t param;
+
+} odp_pktio_info_t;
+
+/** @name Link speed
+ * Packet IO link speeds in Mbps
+ * @anchor link_speed
+ * @{
+ */
+
+/** Link speed unknown */
+#define ODP_PKTIO_LINK_SPEED_UNKNOWN 0
+/** Link speed 10 Mbit/s */
+#define ODP_PKTIO_LINK_SPEED_10M 10
+/** Link speed 100 Mbit/s */
+#define ODP_PKTIO_LINK_SPEED_100M 100
+/** Link speed 1 Gbit/s */
+#define ODP_PKTIO_LINK_SPEED_1G 1000
+/** Link speed 2.5 Gbit/s */
+#define ODP_PKTIO_LINK_SPEED_2_5G 2500
+/** Link speed 5 Gbit/s */
+#define ODP_PKTIO_LINK_SPEED_5G 5000
+/** Link speed 10 Gbit/s */
+#define ODP_PKTIO_LINK_SPEED_10G 10000
+/** Link speed 20 Gbit/s */
+#define ODP_PKTIO_LINK_SPEED_20G 20000
+/** Link speed 25 Gbit/s */
+#define ODP_PKTIO_LINK_SPEED_25G 25000
+/** Link speed 40 Gbit/s */
+#define ODP_PKTIO_LINK_SPEED_40G 40000
+/** Link speed 50 Gbit/s */
+#define ODP_PKTIO_LINK_SPEED_50G 50000
+/** Link speed 56 Gbit/s */
+#define ODP_PKTIO_LINK_SPEED_56G 56000
+/** Link speed 100 Gbit/s */
+#define ODP_PKTIO_LINK_SPEED_100G 100000
+/** Link speed 200 Gbit/s */
+#define ODP_PKTIO_LINK_SPEED_200G 200000
+/** Link speed 400 Gbit/s */
+#define ODP_PKTIO_LINK_SPEED_400G 400000
+
+/** @} */
+
+/** Autonegotiation mode */
+typedef enum odp_pktio_link_autoneg_t {
+ /** Autonegotiation state unknown */
+ ODP_PKTIO_LINK_AUTONEG_UNKNOWN = -1,
+ /** Autonegotiation disabled */
+ ODP_PKTIO_LINK_AUTONEG_OFF = 0,
+ /** Autonegotiation enabled */
+ ODP_PKTIO_LINK_AUTONEG_ON = 1
+
+} odp_pktio_link_autoneg_t;
+
+/** Duplex mode */
+typedef enum odp_pktio_link_duplex_t {
+ /** Link duplex mode is unknown */
+ ODP_PKTIO_LINK_DUPLEX_UNKNOWN = -1,
+ /** Half duplex mode */
+ ODP_PKTIO_LINK_DUPLEX_HALF = 0,
+ /** Full duplex mode */
+ ODP_PKTIO_LINK_DUPLEX_FULL = 1
+
+} odp_pktio_link_duplex_t;
+
+/**
+ * Packet IO link information
+ */
+typedef struct odp_pktio_link_info_t {
+ /** Link autonegotiation */
+ odp_pktio_link_autoneg_t autoneg;
+ /** Duplex mode */
+ odp_pktio_link_duplex_t duplex;
+ /** Link media type
+ *
+ * The implementation owned string describes link media type. Values are
+ * implementation specific short names like copper, fiber, or virtual.
+ * The value of "unknown" is used when media type cannot be determined. */
+ const char *media;
+ /** Reception of pause frames */
+ odp_pktio_link_pause_t pause_rx;
+ /** Transmission of pause frames */
+ odp_pktio_link_pause_t pause_tx;
+ /** Link speed in Mbps
+ *
+ * The value of zero means that the link speed is unknown.
+ * ODP_PKTIO_LINK_SPEED_* (@ref link_speed) defines can be used to
+ * compare the value to standard link speeds. */
+ uint32_t speed;
+ /** Link status */
+ odp_pktio_link_status_t status;
+} odp_pktio_link_info_t;
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#include <odp/visibility_end.h>
+#endif