X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Flibrte_ether%2Frte_ethdev.h;h=5b51fe6bc7b2766eed49e52380c9567de1205f2a;hb=719dbebceb81;hp=d5ea46b9ff6cf96cddc20f36aedac3fd50db4e99;hpb=e5ffdd1457c0fb4e8365f524ee2529ac726edcf3;p=dpdk.git diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h index d5ea46b9ff..5b51fe6bc7 100644 --- a/lib/librte_ether/rte_ethdev.h +++ b/lib/librte_ether/rte_ethdev.h @@ -1,13 +1,13 @@ /*- * BSD LICENSE - * - * Copyright(c) 2010-2014 Intel Corporation. All rights reserved. + * + * Copyright(c) 2010-2015 Intel Corporation. All rights reserved. * 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 @@ -17,7 +17,7 @@ * * 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 @@ -172,11 +172,19 @@ extern "C" { #include +/* Use this macro to check if LRO API is supported */ +#define RTE_ETHDEV_HAS_LRO_SUPPORT + #include #include #include -#include +#include +#include #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. @@ -186,16 +194,31 @@ struct rte_eth_stats { 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 mbufs (i.e. RX queues are full). + */ + uint64_t ibadcrc __rte_deprecated; + /**< Deprecated; Total of RX packets with CRC error. */ + uint64_t ibadlen __rte_deprecated; + /**< Deprecated; Total of RX packets with bad length. */ uint64_t ierrors; /**< Total number of erroneous received packets. */ uint64_t oerrors; /**< Total number of failed transmitted packets. */ - uint64_t imcasts; /**< Total number of multicast received packets. */ + uint64_t imcasts; + /**< Deprecated; Total number of multicast received packets. */ uint64_t rx_nombuf; /**< Total number of RX mbuf allocation failures. */ - uint64_t fdirmatch; /**< Total number of RX packets matching a filter. */ - uint64_t fdirmiss; /**< Total number of RX packets not matching any filter. */ - uint64_t tx_pause_xon; /**< Total nb. of XON pause frame sent. */ - uint64_t rx_pause_xon; /**< Total nb. of XON pause frame received. */ - uint64_t tx_pause_xoff; /**< Total nb. of XOFF pause frame sent. */ - uint64_t rx_pause_xoff; /**< Total nb. of XOFF pause frame received. */ + uint64_t fdirmatch __rte_deprecated; + /**< Deprecated; Total number of RX packets matching a filter. */ + uint64_t fdirmiss __rte_deprecated; + /**< Deprecated; Total number of RX packets not matching any filter. */ + uint64_t tx_pause_xon __rte_deprecated; + /**< Deprecated; Total nb. of XON pause frame sent. */ + uint64_t rx_pause_xon __rte_deprecated; + /**< Deprecated; Total nb. of XON pause frame received. */ + uint64_t tx_pause_xoff __rte_deprecated; + /**< Deprecated; Total nb. of XOFF pause frame sent. */ + uint64_t rx_pause_xoff __rte_deprecated; + /**< Deprecated; Total nb. of XOFF pause frame received. */ uint64_t q_ipackets[RTE_ETHDEV_QUEUE_STAT_CNTRS]; /**< Total number of queue RX packets. */ uint64_t q_opackets[RTE_ETHDEV_QUEUE_STAT_CNTRS]; @@ -230,6 +253,9 @@ struct rte_eth_link { #define ETH_LINK_SPEED_100 100 /**< 100 megabits/second. */ #define ETH_LINK_SPEED_1000 1000 /**< 1 gigabits/second. */ #define ETH_LINK_SPEED_10000 10000 /**< 10 gigabits/second. */ +#define ETH_LINK_SPEED_10G 10000 /**< alias of 10 gigabits/second. */ +#define ETH_LINK_SPEED_20G 20000 /**< 20 gigabits/second. */ +#define ETH_LINK_SPEED_40G 40000 /**< 40 gigabits/second. */ #define ETH_LINK_AUTONEG_DUPLEX 0 /**< Auto-negotiate duplex. */ #define ETH_LINK_HALF_DUPLEX 1 /**< Half-duplex connection. */ @@ -245,43 +271,59 @@ struct rte_eth_thresh { 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 { - ETH_MQ_RX_NONE = 0, /**< None of DCB,RSS or VMDQ mode */ - - ETH_MQ_RX_RSS, /**< For RX side, only RSS is on */ - ETH_MQ_RX_DCB, /**< For RX side,only DCB is on. */ - ETH_MQ_RX_DCB_RSS, /**< Both DCB and RSS enable */ - - ETH_MQ_RX_VMDQ_ONLY, /**< Only VMDQ, no RSS nor DCB */ - ETH_MQ_RX_VMDQ_RSS, /**< RSS mode with VMDQ */ - ETH_MQ_RX_VMDQ_DCB, /**< Use VMDQ+DCB to route traffic to queues */ - ETH_MQ_RX_VMDQ_DCB_RSS, /**< Enable both VMDQ and DCB in VMDq */ + /** 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 + * 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 + * 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_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 + * for tx mq mode backward compatible */ #define ETH_DCB_NONE ETH_MQ_TX_NONE #define ETH_VMDQ_DCB_TX ETH_MQ_TX_VMDQ_DCB @@ -295,45 +337,114 @@ struct rte_eth_rxmode { 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).*/ - uint8_t header_split : 1, /**< Header Split enable. */ + 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. */ + hw_strip_crc : 1, /**< Enable CRC stripping by hardware. */ + enable_scatter : 1, /**< Enable scatter packets rx handler */ + enable_lro : 1; /**< Enable LRO */ }; /** * 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 of 40 bytes holding the RSS key to use for hashing specific - * header fields of received packets. - * Otherwise, a default random hash key is used by the device driver. + * 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. */ - uint16_t rss_hf; /**< Hash functions to apply - see below. */ + 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. */ }; -#define ETH_RSS_IPV4 0x0001 /**< IPv4 packet. */ -#define ETH_RSS_IPV4_TCP 0x0002 /**< IPv4/TCP packet. */ -#define ETH_RSS_IPV6 0x0004 /**< IPv6 packet. */ -#define ETH_RSS_IPV6_EX 0x0008 /**< IPv6 packet with extension headers.*/ -#define ETH_RSS_IPV6_TCP 0x0010 /**< IPv6/TCP packet. */ -#define ETH_RSS_IPV6_TCP_EX 0x0020 /**< IPv6/TCP with extension headers. */ -/* Intel RSS extensions to UDP packets */ -#define ETH_RSS_IPV4_UDP 0x0040 /**< IPv4/UDP packet. */ -#define ETH_RSS_IPV6_UDP 0x0080 /**< IPv6/UDP packet. */ -#define ETH_RSS_IPV6_UDP_EX 0x0100 /**< IPv6/UDP with extension headers. */ -/* Definitions used for redirection table entry size */ -#define ETH_RSS_RETA_NUM_ENTRIES 128 -#define ETH_RSS_RETA_MAX_QUEUE 16 +/* + * 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_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) + +/**< 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) + +/* + * 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_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. */ @@ -343,7 +454,7 @@ struct rte_eth_rss_conf { /* DCB capability defines */ #define ETH_DCB_PG_SUPPORT 0x00000001 /**< Priority Group(ETS) support. */ -#define ETH_DCB_PFC_SUPPORT 0x00000002 /**< Priority Flow Control 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 */ @@ -354,12 +465,11 @@ struct rte_eth_rss_conf { #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*/ +#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. */ @@ -370,43 +480,46 @@ struct rte_eth_rss_conf { #define ETH_VMDQ_ACCEPT_BROADCAST 0x0008 /**< accept broadcast packets. */ #define ETH_VMDQ_ACCEPT_MULTICAST 0x0010 /**< multicast promiscuous. */ -/* Definitions used for VMDQ mirror rules setting */ -#define ETH_VMDQ_NUM_MIRROR_RULE 4 /**< Maximum nb. of mirror rules. . */ +/** Maximum nb. of vlan per mirror rule */ +#define ETH_MIRROR_MAX_VLANS 64 -#define ETH_VMDQ_POOL_MIRROR 0x0001 /**< Virtual Pool Mirroring. */ -#define ETH_VMDQ_UPLINK_MIRROR 0x0002 /**< Uplink Port Mirroring. */ -#define ETH_VMDQ_DOWNLIN_MIRROR 0x0004 /**< Downlink Port Mirroring. */ -#define ETH_VMDQ_VLAN_MIRROR 0x0008 /**< VLAN Mirroring. */ +#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. */ - uint16_t vlan_id[ETH_VMDQ_MAX_VLAN_FILTERS]; - /** VLAN ID list for vlan mirror. */ + /** 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_vmdq_mirror_conf { - uint8_t rule_type_mask; /**< Mirroring rule type mask we want to set */ - uint8_t dst_pool; /**< Destination pool for this mirror rule. */ +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 */ - struct rte_eth_vlan_mirror vlan; /**< VLAN ID setting for VLAN mirroring */ + /** VLAN ID setting for VLAN mirroring. */ + struct rte_eth_vlan_mirror vlan; }; /** - * A structure used to configure Redirection Table of the Receive Side - * Scaling (RSS) feature of an Ethernet port. + * 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 { - /** First 64 mask bits indicate which entry(s) need to updated/queried. */ - uint64_t mask_lo; - /** Second 64 mask bits indicate which entry(s) need to updated/queried. */ - uint64_t mask_hi; - uint8_t reta[ETH_RSS_RETA_NUM_ENTRIES]; /**< 128 RETA entries*/ +struct rte_eth_rss_reta_entry64 { + uint64_t mask; + /**< Mask bits indicate which entries need to be updated/queried. */ + uint8_t reta[RTE_RETA_GROUP_SIZE]; + /**< Group of 64 redirection table entries. */ }; /** @@ -432,20 +545,20 @@ enum rte_eth_nb_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 */ - uint8_t dcb_queue[ETH_DCB_NUM_USER_PRIORITIES]; - /**< Possible DCB queue,4 or 8. */ + /** 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. */ - uint8_t dcb_queue[ETH_DCB_NUM_USER_PRIORITIES]; - /**< Possible DCB queue,4 or 8. */ + /** 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. */ - uint8_t dcb_queue[ETH_DCB_NUM_USER_PRIORITIES]; - /**< Possible DCB queue,4 or 8. */ + /** Traffic class each UP mapped to. */ + uint8_t dcb_tc[ETH_DCB_NUM_USER_PRIORITIES]; }; struct rte_eth_vmdq_tx_conf { @@ -472,7 +585,7 @@ struct rte_eth_vmdq_dcb_conf { 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_queue[ETH_DCB_NUM_USER_PRIORITIES]; + uint8_t dcb_tc[ETH_DCB_NUM_USER_PRIORITIES]; /**< Selects a queue in a pool */ }; @@ -480,7 +593,9 @@ 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 */ @@ -492,6 +607,15 @@ struct rte_eth_vmdq_rx_conf { */ struct rte_eth_txmode { enum rte_eth_tx_mq_mode mq_mode; /**< TX multi-queues mode. */ + + /* For i40e specifically */ + uint16_t pvid; + 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 */ }; /** @@ -501,6 +625,7 @@ 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(). */ }; #define ETH_TXQ_FLAGS_NOMULTSEGS 0x0001 /**< nb_segs=1 for all mbufs */ @@ -513,14 +638,29 @@ struct rte_eth_rxconf { #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) /** * 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; /**< Drives the freeing of TX buffers. */ + 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(). */ +}; + +/** + * 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. */ }; /** @@ -545,6 +685,7 @@ struct rte_eth_fc_conf { 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 */ }; /** @@ -557,15 +698,6 @@ struct rte_eth_pfc_conf { uint8_t priority; /**< VLAN User Priority. */ }; -/** - * Flow Director setting modes: none (default), 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. */ -}; - /** * Memory space that can be configured to store Flow Director filters * in the board memory. @@ -595,118 +727,19 @@ 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. */ - /** Offset of flexbytes field in RX packets (in 16-bit word units). */ - uint8_t flexbytes_offset; /** 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. */ }; /** - * Possible l4type of FDIR filters. - */ -enum rte_l4type { - RTE_FDIR_L4TYPE_NONE = 0, /**< None. */ - RTE_FDIR_L4TYPE_UDP, /**< UDP. */ - RTE_FDIR_L4TYPE_TCP, /**< TCP. */ - RTE_FDIR_L4TYPE_SCTP, /**< SCTP. */ -}; - -/** - * Select IPv4 or IPv6 FDIR filters. - */ -enum rte_iptype { - RTE_FDIR_IPTYPE_IPV4 = 0, /**< IPv4. */ - RTE_FDIR_IPTYPE_IPV6 , /**< IPv6. */ -}; - -/** - * A structure used to define a FDIR packet filter. + * UDP tunneling configuration. */ -struct rte_fdir_filter { - uint16_t flex_bytes; /**< Flex bytes value to match. */ - uint16_t vlan_id; /**< VLAN ID value to match, 0 otherwise. */ - uint16_t port_src; /**< Source port to match, 0 otherwise. */ - uint16_t port_dst; /**< Destination port to match, 0 otherwise. */ - union { - uint32_t ipv4_addr; /**< IPv4 source address to match. */ - uint32_t ipv6_addr[4]; /**< IPv6 source address to match. */ - } ip_src; /**< IPv4/IPv6 source address to match (union of above). */ - union { - uint32_t ipv4_addr; /**< IPv4 destination address to match. */ - uint32_t ipv6_addr[4]; /**< IPv6 destination address to match */ - } ip_dst; /**< IPv4/IPv6 destination address to match (union of above). */ - enum rte_l4type l4type; /**< l4type to match: NONE/UDP/TCP/SCTP. */ - enum rte_iptype iptype; /**< IP packet type to match: IPv4 or IPv6. */ -}; - -/** - * A structure used to configure FDIR masks that are used by the device - * to match the various fields of RX packet headers. - * @note The only_ip_flow field has the opposite meaning compared to other - * masks! - */ -struct rte_fdir_masks { - /** When set to 1, packet l4type is \b NOT relevant in filters, and - source and destination port masks must be set to zero. */ - uint8_t only_ip_flow; - /** If set to 1, vlan_id is relevant in filters. */ - uint8_t vlan_id; - /** If set to 1, vlan_prio is relevant in filters. */ - uint8_t vlan_prio; - /** If set to 1, flexbytes is relevant in filters. */ - uint8_t flexbytes; - /** If set to 1, set the IPv6 masks. Otherwise set the IPv4 masks. */ - uint8_t set_ipv6_mask; - /** When set to 1, comparison of destination IPv6 address with IP6AT - registers is meaningful. */ - uint8_t comp_ipv6_dst; - /** Mask of Destination IPv4 Address. All bits set to 1 define the - relevant bits to use in the destination address of an IPv4 packet - when matching it against FDIR filters. */ - uint32_t dst_ipv4_mask; - /** Mask of Source IPv4 Address. All bits set to 1 define - the relevant bits to use in the source address of an IPv4 packet - when matching it against FDIR filters. */ - uint32_t src_ipv4_mask; - /** Mask of Source IPv6 Address. All bits set to 1 define the - relevant BYTES to use in the source address of an IPv6 packet - when matching it against FDIR filters. */ - uint16_t dst_ipv6_mask; - /** Mask of Destination IPv6 Address. All bits set to 1 define the - relevant BYTES to use in the destination address of an IPv6 packet - when matching it against FDIR filters. */ - uint16_t src_ipv6_mask; - /** Mask of Source Port. All bits set to 1 define the relevant - bits to use in the source port of an IP packets when matching it - against FDIR filters. */ - uint16_t src_port_mask; - /** Mask of Destination Port. All bits set to 1 define the relevant - bits to use in the destination port of an IP packet when matching it - against FDIR filters. */ - uint16_t dst_port_mask; -}; - -/** - * A structure used to report the status of the flow director filters in use. - */ -struct rte_eth_fdir { - /** Number of filters with collision indication. */ - uint16_t collision; - /** Number of free (non programmed) filters. */ - uint16_t free; - /** The Lookup hash value of the added filter that updated the value - of the MAXLEN field */ - uint16_t maxhash; - /** Longest linked list of filters in the table. */ - uint8_t maxlen; - /** Number of added filters. */ - uint64_t add; - /** Number of removed filters. */ - uint64_t remove; - /** Number of failed added filters (no more space in device). */ - uint64_t f_add; - /** Number of failed removed filters. */ - uint64_t f_remove; +struct rte_eth_udp_tunnel { + uint16_t udp_port; + uint8_t prot_type; }; /** @@ -715,6 +748,8 @@ struct rte_eth_fdir { struct rte_intr_conf { /** enable/disable lsc interrupt. 0 (default) - disable, 1 enable */ uint16_t lsc; + /** enable/disable rxq interrupt. 0 (default) - disable, 1 enable */ + uint16_t rxq; }; /** @@ -734,7 +769,7 @@ struct rte_eth_conf { Read the datasheet of given ethernet controller for details. The possible values of this field are defined in implementation of each driver. */ - union { + struct { struct rte_eth_rss_conf rss_conf; /**< Port RSS configuration */ struct rte_eth_vmdq_dcb_conf vmdq_dcb_conf; /**< Port vmdq+dcb configuration. */ @@ -751,9 +786,9 @@ struct rte_eth_conf { 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; + /** 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. */ }; @@ -772,6 +807,7 @@ struct rte_eth_conf { #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 /** * TX offload capabilities of a device. @@ -783,6 +819,8 @@ struct rte_eth_conf { #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 struct rte_eth_dev_info { struct rte_pci_device *pci_dev; /**< Device PCI information. */ @@ -794,14 +832,99 @@ struct rte_eth_dev_info { 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; + 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. */ uint32_t rx_offload_capa; /**< Device RX offload capabilities. */ uint32_t tx_offload_capa; /**< Device 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 */ +}; + +/** + * 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_aligned; + +/** + * Ethernet device TX queue information structure. + * Used to retieve 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_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 ethdev->eth_xstats_get() to provide + * statistics that are not provided in the generic rte_eth_stats + * structure. + */ +struct rte_eth_xstats { + char name[RTE_ETH_XSTATS_NAME_SIZE]; + uint64_t value; +}; + +#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; struct rte_eth_dev_callback; @@ -823,6 +946,12 @@ typedef int (*eth_dev_start_t)(struct rte_eth_dev *dev); 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. */ @@ -849,6 +978,13 @@ typedef void (*eth_stats_get_t)(struct rte_eth_dev *dev, 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_xstats *stats, unsigned 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_queue_stats_mapping_set_t)(struct rte_eth_dev *dev, uint16_t queue_id, uint8_t stat_idx, @@ -859,6 +995,14 @@ 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 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, @@ -874,15 +1018,32 @@ typedef int (*eth_tx_queue_setup_t)(struct rte_eth_dev *dev, 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); -/**< @Get number of available descriptors on a receive queue of an Ethernet device. */ +/**< @internal Get number of available descriptors on a receive queue of an Ethernet device. */ typedef int (*eth_rx_descriptor_done_t)(void *rxq, uint16_t offset); -/**< @Check DD bit of specific RX descriptor */ +/**< @internal Check DD bit of specific RX descriptor */ + +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, @@ -896,6 +1057,11 @@ typedef void (*vlan_tpid_set_t)(struct rte_eth_dev *dev, typedef void (*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); @@ -911,47 +1077,12 @@ typedef uint16_t (*eth_tx_burst_t)(void *txq, uint16_t nb_pkts); /**< @internal Send output packets on a transmit queue of an Ethernet device. */ -typedef int (*fdir_add_signature_filter_t)(struct rte_eth_dev *dev, - struct rte_fdir_filter *fdir_ftr, - uint8_t rx_queue); -/**< @internal Setup a new signature filter rule on an Ethernet device */ - -typedef int (*fdir_update_signature_filter_t)(struct rte_eth_dev *dev, - struct rte_fdir_filter *fdir_ftr, - uint8_t rx_queue); -/**< @internal Update a signature filter rule on an Ethernet device */ - -typedef int (*fdir_remove_signature_filter_t)(struct rte_eth_dev *dev, - struct rte_fdir_filter *fdir_ftr); -/**< @internal Remove a signature filter rule on an Ethernet device */ - -typedef void (*fdir_infos_get_t)(struct rte_eth_dev *dev, - struct rte_eth_fdir *fdir); -/**< @internal Get information about fdir status */ - -typedef int (*fdir_add_perfect_filter_t)(struct rte_eth_dev *dev, - struct rte_fdir_filter *fdir_ftr, - uint16_t soft_id, uint8_t rx_queue, - uint8_t drop); -/**< @internal Setup a new perfect filter rule on an Ethernet device */ - -typedef int (*fdir_update_perfect_filter_t)(struct rte_eth_dev *dev, - struct rte_fdir_filter *fdir_ftr, - uint16_t soft_id, uint8_t rx_queue, - uint8_t drop); -/**< @internal Update a perfect filter rule on an Ethernet device */ - -typedef int (*fdir_remove_perfect_filter_t)(struct rte_eth_dev *dev, - struct rte_fdir_filter *fdir_ftr, - uint16_t soft_id); -/**< @internal Remove a perfect filter rule on an Ethernet device */ - -typedef int (*fdir_set_masks_t)(struct rte_eth_dev *dev, - struct rte_fdir_masks *fdir_masks); -/**< @internal Setup flow director masks on 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); + 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, @@ -959,13 +1090,23 @@ typedef int (*priority_flow_ctrl_set_t)(struct rte_eth_dev *dev, /**< @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 *reta_conf); + 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 *reta_conf); + 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 */ @@ -979,7 +1120,11 @@ typedef void (*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 */ +/**< @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, @@ -992,7 +1137,7 @@ typedef int (*eth_uc_all_hash_table_set_t)(struct rte_eth_dev *dev, typedef int (*eth_set_vf_rx_mode_t)(struct rte_eth_dev *dev, uint16_t vf, - uint16_t rx_mode, + uint16_t rx_mode, uint8_t on); /**< @internal Set a VF receive mode */ @@ -1006,15 +1151,26 @@ typedef int (*eth_set_vf_tx_t)(struct rte_eth_dev *dev, uint8_t on); /**< @internal Enable or disable a VF transmit */ -typedef int (*eth_set_vf_vlan_filter_t)(struct rte_eth_dev *dev, - uint16_t vlan, +typedef int (*eth_set_vf_vlan_filter_t)(struct rte_eth_dev *dev, + uint16_t vlan, uint64_t vf_mask, uint8_t vlan_on); /**< @internal Set VF VLAN pool filter */ +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_set_vf_rate_limit_t)(struct rte_eth_dev *dev, + uint16_t vf, + uint16_t tx_rate, + uint64_t q_msk); +/**< @internal Set VF TX rate */ + typedef int (*eth_mirror_rule_set_t)(struct rte_eth_dev *dev, - struct rte_eth_vmdq_mirror_conf *mirror_conf, - uint8_t rule_id, + struct rte_eth_mirror_conf *mirror_conf, + uint8_t rule_id, uint8_t on); /**< @internal Add a traffic mirroring rule on an Ethernet device */ @@ -1022,6 +1178,52 @@ 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_add_t)(struct rte_eth_dev *dev, + struct rte_eth_udp_tunnel *tunnel_udp); +/**< @internal Add tunneling UDP info */ + +typedef int (*eth_udp_tunnel_del_t)(struct rte_eth_dev *dev, + struct rte_eth_udp_tunnel *tunnel_udp); +/**< @internal Delete tunneling UDP info */ + +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_get_reg_length_t)(struct rte_eth_dev *dev); +/**< @internal Retrieve device register count */ + +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 */ + #ifdef RTE_NIC_BYPASS enum { @@ -1076,6 +1278,15 @@ typedef int32_t (*bypass_ver_show_t)(struct rte_eth_dev *dev, uint32_t *ver); typedef int32_t (*bypass_wd_reset_t)(struct rte_eth_dev *dev); #endif +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_get_dcb_info)(struct rte_eth_dev *dev, + struct rte_eth_dcb_info *dcb_info); +/**< @internal Get dcb information on an Ethernet device */ /** * @internal A structure containing the functions exported by an Ethernet driver. @@ -1084,33 +1295,49 @@ 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_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 OF. */ eth_link_update_t link_update; /**< Get device link state. */ - eth_stats_get_t stats_get; /**< Get device statistics. */ - eth_stats_reset_t stats_reset; /**< Reset device statistics. */ + 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_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. */ + mtu_set_t mtu_set; /**< Set MTU. */ vlan_filter_set_t vlan_filter_set; /**< Filter VLAN Setup. */ vlan_tpid_set_t vlan_tpid_set; /**< Outer 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 Rx queue count. */ eth_rx_descriptor_done_t rx_descriptor_done; /**< Check rxd DD bit */ + /**< Enable Rx queue interrupt. */ + eth_rx_enable_intr_t rx_queue_intr_enable; + /**< Disable Rx queue interrupt.*/ + eth_rx_disable_intr_t rx_queue_intr_disable; eth_tx_queue_setup_t tx_queue_setup;/**< Set up device TX queue.*/ eth_queue_release_t tx_queue_release;/**< Release TX queue.*/ 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_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_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.*/ @@ -1119,27 +1346,25 @@ struct eth_dev_ops { eth_set_vf_rx_t set_vf_rx; /**< enable/disable a VF receive */ eth_set_vf_tx_t set_vf_tx; /**< enable/disable a VF transmit */ eth_set_vf_vlan_filter_t set_vf_vlan_filter; /**< Set VF VLAN filter */ - - /** Add a signature filter. */ - fdir_add_signature_filter_t fdir_add_signature_filter; - /** Update a signature filter. */ - fdir_update_signature_filter_t fdir_update_signature_filter; - /** Remove a signature filter. */ - fdir_remove_signature_filter_t fdir_remove_signature_filter; - /** Get information about FDIR status. */ - fdir_infos_get_t fdir_infos_get; - /** Add a perfect filter. */ - fdir_add_perfect_filter_t fdir_add_perfect_filter; - /** Update a perfect filter. */ - fdir_update_perfect_filter_t fdir_update_perfect_filter; - /** Remove a perfect filter. */ - fdir_remove_perfect_filter_t fdir_remove_perfect_filter; - /** Setup masks for FDIR filtering. */ - fdir_set_masks_t fdir_set_masks; + eth_udp_tunnel_add_t udp_tunnel_add; + eth_udp_tunnel_del_t udp_tunnel_del; + eth_set_queue_rate_limit_t set_queue_rate_limit; /**< Set queue rate limit */ + eth_set_vf_rate_limit_t set_vf_rate_limit; /**< Set VF rate limit */ /** Update redirection table. */ reta_update_t reta_update; /** Query redirection table. */ reta_query_t reta_query; + + eth_get_reg_length_t get_reg_length; + /**< Get # of registers */ + 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 */ /* bypass control */ #ifdef RTE_NIC_BYPASS bypass_init_t bypass_init; @@ -1153,6 +1378,102 @@ struct eth_dev_ops { bypass_wd_reset_t bypass_wd_reset; #endif + /** Configure RSS hash protocols. */ + rss_hash_update_t rss_hash_update; + /** Get current RSS hash configuration. */ + rss_hash_conf_get_t rss_hash_conf_get; + eth_filter_ctrl_t filter_ctrl; + /**< common filter control. */ + eth_set_mc_addr_list_t set_mc_addr_list; /**< set list of mcast addrs */ + eth_rxq_info_get_t rxq_info_get; + /**< retrieve RX queue information. */ + eth_txq_info_get_t txq_info_get; + /**< retrieve TX queue information. */ + /** Turn IEEE1588/802.1AS timestamping on. */ + eth_timesync_enable_t timesync_enable; + /** Turn IEEE1588/802.1AS timestamping off. */ + eth_timesync_disable_t timesync_disable; + /** Read the IEEE1588/802.1AS RX timestamp. */ + eth_timesync_read_rx_timestamp_t timesync_read_rx_timestamp; + /** Read the IEEE1588/802.1AS TX timestamp. */ + eth_timesync_read_tx_timestamp_t timesync_read_tx_timestamp; + + /** Get DCB information */ + eth_get_dcb_info get_dcb_info; +}; + +/** + * 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 + * 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)(uint8_t port, 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 + * 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)(uint8_t port, uint16_t queue, + struct rte_mbuf *pkts[], uint16_t nb_pkts, void *user_param); + +/** + * @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; +}; + +/** + * The eth device type. + */ +enum rte_eth_dev_type { + RTE_ETH_DEV_UNKNOWN, /**< unknown device type */ + RTE_ETH_DEV_PCI, + /**< Physical function and Virtual function of PCI devices */ + RTE_ETH_DEV_VIRTUAL, /**< non hardware device */ + RTE_ETH_DEV_MAX /**< max value of this enum */ }; /** @@ -1170,9 +1491,22 @@ struct rte_eth_dev { eth_tx_burst_t tx_pkt_burst; /**< Pointer to PMD transmit function. */ struct rte_eth_dev_data *data; /**< Pointer to device data */ const struct eth_driver *driver;/**< Driver for this device */ - struct eth_dev_ops *dev_ops; /**< Functions exported by PMD */ + const struct eth_dev_ops *dev_ops; /**< Functions exported by PMD */ struct rte_pci_device *pci_dev; /**< PCI info. supplied by probing */ - struct rte_eth_dev_cb_list callbacks; /**< User application callbacks */ + /** 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]; + uint8_t attached; /**< Flag indicating the port is attached */ + enum rte_eth_dev_type dev_type; /**< Flag indicating the device type */ }; struct rte_eth_dev_sriov { @@ -1183,6 +1517,8 @@ struct rte_eth_dev_sriov { }; #define RTE_ETH_DEV_SRIOV(dev) ((dev)->data->sriov) +#define RTE_ETH_NAME_MAX_LEN (32) + /** * @internal * The data part, with no function pointers, associated with each ethernet device. @@ -1191,11 +1527,13 @@ struct rte_eth_dev_sriov { * 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 */ @@ -1204,11 +1542,14 @@ struct rte_eth_dev_data { /**< Link-level information & status */ struct rte_eth_conf dev_conf; /**< Configuration applied to device. */ - uint16_t max_frame_size; /**< Default is ETHER_MAX_LEN (1518). */ + 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]; + 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. */ @@ -1216,9 +1557,23 @@ struct rte_eth_dev_data { 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). */ + 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 */ + const char *drv_name; /**< Driver name */ }; +/** Device supports hotplug detach */ +#define RTE_ETH_DEV_DETACHABLE 0x0001 +/** Device supports link state interrupt */ +#define RTE_ETH_DEV_INTR_LSC 0x0002 + /** * @internal * The pool of *rte_eth_dev* structures. The size of the pool @@ -1230,7 +1585,11 @@ extern struct rte_eth_dev rte_eth_devices[]; * Get the total number of Ethernet devices that have been successfully * initialized by the [matching] Ethernet driver during the PCI probing phase. * All devices whose port identifier is in the range - * [0, rte_eth_dev_count() - 1] can be operated on by network applications. + * [0, rte_eth_dev_count() - 1] can be operated on by network applications + * immediately after invoking rte_eal_init(). + * If the application unplugs a port using hotplug function, The enabled port + * numbers may be noncontiguous. In the case, the applications need to manage + * enabled port by themselves. * * @return * - The total number of usable Ethernet devices. @@ -1238,15 +1597,67 @@ extern struct rte_eth_dev rte_eth_devices[]; extern uint8_t rte_eth_dev_count(void); /** - * Function for internal use by dummy drivers primarily, e.g. ring-based - * driver. + * @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 + */ +extern 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(void); +struct rte_eth_dev *rte_eth_dev_allocate(const char *name, + enum rte_eth_dev_type type); + +/** + * @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); + +/** + * Attach a new Ethernet device specified by aruguments. + * + * @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 'eth_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, uint8_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 device name actually detached. + * @return + * 0 on success and devname is filled, negative on error + */ +int rte_eth_dev_detach(uint8_t port_id, char *devname); struct eth_driver; /** @@ -1254,9 +1665,6 @@ struct eth_driver; * Initialization function of an Ethernet driver invoked for each matching * Ethernet PCI device detected during the PCI probing phase. * - * @param eth_drv - * The pointer to the [matching] Ethernet driver structure supplied by - * the PMD when it registered itself. * @param eth_dev * The *eth_dev* pointer is the address of the *rte_eth_dev* structure * associated with the matching device and which have been [automatically] @@ -1267,10 +1675,11 @@ struct eth_driver; * - *pci_dev*: Holds the pointers to the *rte_pci_device* structure which * contains the generic PCI information of the matching device. * + * - *driver*: Holds the pointer to the *eth_driver* structure. + * * - *dev_private*: Holds a pointer to the device private data structure. * - * - *max_frame_size*: Contains the default Ethernet maximum frame length - * (1518). + * - *mtu*: Contains the default Ethernet maximum frame length (1500). * * - *port_id*: Contains the port index of the device (actually the index * of the *eth_dev* structure in the *rte_eth_devices* array). @@ -1281,8 +1690,24 @@ struct eth_driver; * of the *eth_dev* structure. * - <0: Error code of the device initialization failure. */ -typedef int (*eth_dev_init_t)(struct eth_driver *eth_drv, - struct rte_eth_dev *eth_dev); +typedef int (*eth_dev_init_t)(struct rte_eth_dev *eth_dev); + +/** + * @internal + * Finalization function of an Ethernet driver invoked for each matching + * Ethernet PCI device detected during the PCI closing phase. + * + * @param eth_dev + * The *eth_dev* pointer is the address of the *rte_eth_dev* structure + * associated with the matching device and which have been [automatically] + * allocated in the *rte_eth_devices* array. + * @return + * - 0: Success, the device is properly finalized by the driver. + * In particular, the driver MUST free the *dev_ops* pointer + * of the *eth_dev* structure. + * - <0: Error code of the device initialization failure. + */ +typedef int (*eth_dev_uninit_t)(struct rte_eth_dev *eth_dev); /** * @internal @@ -1295,11 +1720,14 @@ typedef int (*eth_dev_init_t)(struct eth_driver *eth_drv, * * - The *eth_dev_init* function invoked for each matching PCI device. * + * - The *eth_dev_uninit* function invoked for each matching PCI device. + * * - The size of the private data to allocate for each matching device. */ struct eth_driver { struct rte_pci_driver pci_drv; /**< The PMD is also a PCI driver. */ eth_dev_init_t eth_dev_init; /**< Device init function. */ + eth_dev_uninit_t eth_dev_uninit; /**< Device uninit function. */ unsigned int dev_private_size; /**< Size of device private data. */ }; @@ -1371,6 +1799,8 @@ extern int rte_eth_dev_configure(uint8_t port_id, * 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. @@ -1408,6 +1838,8 @@ extern int rte_eth_rx_queue_setup(uint8_t port_id, uint16_t rx_queue_id, * 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 RX 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. @@ -1448,6 +1880,85 @@ extern int rte_eth_tx_queue_setup(uint8_t port_id, uint16_t tx_queue_id, */ extern int rte_eth_dev_socket_id(uint8_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 + */ +extern int rte_eth_dev_is_valid_port(uint8_t port_id); + +/* + * Allocate mbuf from mempool, setup the DMA physical address + * and then start RX for specified 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 transmit queue is correctly set up. + * - -EINVAL: The port_id or the queue_id out of range. + * - -ENOTSUP: The function not supported in PMD driver. + */ +extern int rte_eth_dev_rx_queue_start(uint8_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 transmit queue is correctly set up. + * - -EINVAL: The port_id or the queue_id out of range. + * - -ENOTSUP: The function not supported in PMD driver. + */ +extern int rte_eth_dev_rx_queue_stop(uint8_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 correctly set up. + * - -EINVAL: The port_id or the queue_id out of range. + * - -ENOTSUP: The function not supported in PMD driver. + */ +extern int rte_eth_dev_tx_queue_start(uint8_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 correctly set up. + * - -EINVAL: The port_id or the queue_id out of range. + * - -ENOTSUP: The function not supported in PMD driver. + */ +extern int rte_eth_dev_tx_queue_stop(uint8_t port_id, uint16_t tx_queue_id); + + /** * Start an Ethernet device. @@ -1475,8 +1986,36 @@ extern int rte_eth_dev_start(uint8_t port_id); */ extern void rte_eth_dev_stop(uint8_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. + */ +extern int rte_eth_dev_set_link_up(uint8_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. + */ +extern int rte_eth_dev_set_link_down(uint8_t port_id); + /** - * Close an Ethernet device. The device cannot be restarted! + * 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. @@ -1580,8 +2119,10 @@ extern void rte_eth_link_get_nowait(uint8_t port_id, * - *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. */ -extern void rte_eth_stats_get(uint8_t port_id, struct rte_eth_stats *stats); +extern int rte_eth_stats_get(uint8_t port_id, struct rte_eth_stats *stats); /** * Reset the general I/O statistics of an Ethernet device. @@ -1592,21 +2133,53 @@ extern void rte_eth_stats_get(uint8_t port_id, struct rte_eth_stats *stats); extern void rte_eth_stats_reset(uint8_t port_id); /** - * Set a mapping for the specified transmit queue to the specified per-queue - * statistics counter. + * Retrieve extended statistics of an Ethernet device. * * @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]. + * @param xstats + * A pointer to a table of structure of type *rte_eth_xstats* + * to be filled with device statistics names and values. + * This parameter can be set to NULL if n is 0. + * @param n + * The size of the stats table, which should be large enough to store + * all the statistics of the device. * @return - * Zero if successful. Non-zero otherwise. + * - positive value lower or equal to n: success. The return value + * is the number of entries filled in the stats table. + * - 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. + * - negative value on error (invalid port id) + */ +extern int rte_eth_xstats_get(uint8_t port_id, + struct rte_eth_xstats *xstats, unsigned n); + +/** + * Reset extended statistics of an Ethernet device. + * + * @param port_id + * The port identifier of the Ethernet device. + */ +extern void rte_eth_xstats_reset(uint8_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. */ extern int rte_eth_dev_set_tx_queue_stats_mapping(uint8_t port_id, uint16_t tx_queue_id, @@ -1656,6 +2229,34 @@ extern void rte_eth_macaddr_get(uint8_t port_id, struct ether_addr *mac_addr); extern void rte_eth_dev_info_get(uint8_t port_id, struct rte_eth_dev_info *dev_info); +/** + * 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. + */ +extern int rte_eth_dev_get_mtu(uint8_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. + * - (-EINVAL) if *mtu* invalid. + */ +extern int rte_eth_dev_set_mtu(uint8_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. @@ -1678,7 +2279,7 @@ extern int rte_eth_dev_vlan_filter(uint8_t port_id, uint16_t vlan_id , int on); /** * Enable/Disable hardware VLAN Strip by a rx queue of an Ethernet device. - * 82599/X540 can support VLAN stripping at the rx queue level + * 82599/X540/X550 can support VLAN stripping at the rx queue level * * @param port_id * The port identifier of the Ethernet device. @@ -1750,6 +2351,22 @@ extern int rte_eth_dev_set_vlan_offload(uint8_t port_id, int offload_mask); */ extern int rte_eth_dev_get_vlan_offload(uint8_t port_id); +/** + * Set port based TX VLAN insersion on or off. + * + * @param port_id + * The port identifier of the Ethernet device. + * @param pvid + * Port based TX VLAN identifier togeth with user priority. + * @param on + * Turn on or off the port based TX VLAN insertion. + * + * @return + * - (0) if successful. + * - negative if failed. + */ +extern int rte_eth_dev_set_vlan_pvid(uint8_t port_id, uint16_t pvid, int on); + /** * * Retrieve a burst of input packets from a receive queue of an Ethernet @@ -1838,12 +2455,28 @@ extern uint16_t rte_eth_rx_burst(uint8_t port_id, uint16_t queue_id, #else static inline uint16_t rte_eth_rx_burst(uint8_t port_id, uint16_t queue_id, - struct rte_mbuf **rx_pkts, uint16_t nb_pkts) + struct rte_mbuf **rx_pkts, const uint16_t nb_pkts) { struct rte_eth_dev *dev; dev = &rte_eth_devices[port_id]; - return (*dev->rx_pkt_burst)(dev->data->rx_queues[queue_id], rx_pkts, nb_pkts); + + 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; } #endif @@ -1864,7 +2497,7 @@ static inline uint32_t rte_eth_rx_queue_count(uint8_t port_id, uint16_t queue_id) { struct rte_eth_dev *dev; - + dev = &rte_eth_devices[port_id]; return (*dev->dev_ops->rx_queue_count)(dev, queue_id); } @@ -1877,7 +2510,7 @@ rte_eth_rx_queue_count(uint8_t port_id, uint16_t queue_id) * The port identifier of the Ethernet device. * @param queue_id * The queue id on the specific port. - * @offset + * @param offset * The offset of the descriptor ID from tail. * @return * - (1) if the specific DD bit is set. @@ -1937,10 +2570,9 @@ rte_eth_rx_descriptor_done(uint8_t port_id, uint16_t queue_id, uint16_t offset) * 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 previously sent packets reached the "minimum transmit - * packets to free" threshold, the rte_eth_tx_burst() function must - * [attempt to] free the *rte_mbuf* buffers of those packets whose - * transmission was effectively completed. + * 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. * * @param port_id * The port identifier of the Ethernet device. @@ -1970,225 +2602,22 @@ rte_eth_tx_burst(uint8_t port_id, uint16_t queue_id, struct rte_eth_dev *dev; dev = &rte_eth_devices[port_id]; - return (*dev->tx_pkt_burst)(dev->data->tx_queues[queue_id], tx_pkts, nb_pkts); -} -#endif -/** - * Setup a new signature filter rule on an Ethernet device - * - * @param port_id - * The port identifier of the Ethernet device. - * @param fdir_filter - * The pointer to the fdir filter structure describing the signature filter - * rule. - * The *rte_fdir_filter* structure includes the values of the different fields - * to match: source and destination IP addresses, vlan id, flexbytes, source - * and destination ports, and so on. - * @param rx_queue - * The index of the RX queue where to store RX packets matching the added - * signature filter defined in fdir_filter. - * @return - * - (0) if successful. - * - (-ENOTSUP) if hardware doesn't support flow director mode. - * - (-ENODEV) if *port_id* invalid. - * - (-ENOSYS) if the FDIR mode is not configured in signature mode - * on *port_id*. - * - (-EINVAL) if the fdir_filter information is not correct. - */ -int rte_eth_dev_fdir_add_signature_filter(uint8_t port_id, - struct rte_fdir_filter *fdir_filter, - uint8_t rx_queue); - -/** - * Update a signature filter rule on an Ethernet device. - * If the rule doesn't exits, it is created. - * - * @param port_id - * The port identifier of the Ethernet device. - * @param fdir_ftr - * The pointer to the structure describing the signature filter rule. - * The *rte_fdir_filter* structure includes the values of the different fields - * to match: source and destination IP addresses, vlan id, flexbytes, source - * and destination ports, and so on. - * @param rx_queue - * The index of the RX queue where to store RX packets matching the added - * signature filter defined in fdir_ftr. - * @return - * - (0) if successful. - * - (-ENOTSUP) if hardware doesn't support flow director mode. - * - (-ENODEV) if *port_id* invalid. - * - (-ENOSYS) if the flow director mode is not configured in signature mode - * on *port_id*. - * - (-EINVAL) if the fdir_filter information is not correct. - */ -int rte_eth_dev_fdir_update_signature_filter(uint8_t port_id, - struct rte_fdir_filter *fdir_ftr, - uint8_t rx_queue); +#ifdef RTE_ETHDEV_RXTX_CALLBACKS + struct rte_eth_rxtx_callback *cb = dev->pre_tx_burst_cbs[queue_id]; -/** - * Remove a signature filter rule on an Ethernet device. - * - * @param port_id - * The port identifier of the Ethernet device. - * @param fdir_ftr - * The pointer to the structure describing the signature filter rule. - * The *rte_fdir_filter* structure includes the values of the different fields - * to match: source and destination IP addresses, vlan id, flexbytes, source - * and destination ports, and so on. - * @return - * - (0) if successful. - * - (-ENOTSUP) if hardware doesn't support flow director mode. - * - (-ENODEV) if *port_id* invalid. - * - (-ENOSYS) if the flow director mode is not configured in signature mode - * on *port_id*. - * - (-EINVAL) if the fdir_filter information is not correct. - */ -int rte_eth_dev_fdir_remove_signature_filter(uint8_t port_id, - struct rte_fdir_filter *fdir_ftr); - -/** - * Retrieve the flow director information of an Ethernet device. - * - * @param port_id - * The port identifier of the Ethernet device. - * @param fdir - * A pointer to a structure of type *rte_eth_dev_fdir* to be filled with - * the flow director information of the Ethernet device. - * @return - * - (0) if successful. - * - (-ENOTSUP) if hardware doesn't support flow director mode. - * - (-ENODEV) if *port_id* invalid. - * - (-ENOSYS) if the flow director mode is not configured on *port_id*. - */ -int rte_eth_dev_fdir_get_infos(uint8_t port_id, struct rte_eth_fdir *fdir); - -/** - * Add a new perfect filter rule on an Ethernet device. - * - * @param port_id - * The port identifier of the Ethernet device. - * @param fdir_filter - * The pointer to the structure describing the perfect filter rule. - * The *rte_fdir_filter* structure includes the values of the different fields - * to match: source and destination IP addresses, vlan id, flexbytes, source - * and destination ports, and so on. - * IPv6 are not supported. - * @param soft_id - * The 16-bit value supplied in the field hash.fdir.id of mbuf for RX - * packets matching the perfect filter. - * @param rx_queue - * The index of the RX queue where to store RX packets matching the added - * perfect filter defined in fdir_filter. - * @param drop - * If drop is set to 1, matching RX packets are stored into the RX drop - * queue defined in the rte_fdir_conf. - * @return - * - (0) if successful. - * - (-ENOTSUP) if hardware doesn't support flow director mode. - * - (-ENODEV) if *port_id* invalid. - * - (-ENOSYS) if the flow director mode is not configured in perfect mode - * on *port_id*. - * - (-EINVAL) if the fdir_filter information is not correct. - */ -int rte_eth_dev_fdir_add_perfect_filter(uint8_t port_id, - struct rte_fdir_filter *fdir_filter, - uint16_t soft_id, uint8_t rx_queue, - uint8_t drop); - -/** - * Update a perfect filter rule on an Ethernet device. - * If the rule doesn't exits, it is created. - * - * @param port_id - * The port identifier of the Ethernet device. - * @param fdir_filter - * The pointer to the structure describing the perfect filter rule. - * The *rte_fdir_filter* structure includes the values of the different fields - * to match: source and destination IP addresses, vlan id, flexbytes, source - * and destination ports, and so on. - * IPv6 are not supported. - * @param soft_id - * The 16-bit value supplied in the field hash.fdir.id of mbuf for RX - * packets matching the perfect filter. - * @param rx_queue - * The index of the RX queue where to store RX packets matching the added - * perfect filter defined in fdir_filter. - * @param drop - * If drop is set to 1, matching RX packets are stored into the RX drop - * queue defined in the rte_fdir_conf. - * @return - * - (0) if successful. - * - (-ENOTSUP) if hardware doesn't support flow director mode. - * - (-ENODEV) if *port_id* invalid. - * - (-ENOSYS) if the flow director mode is not configured in perfect mode - * on *port_id*. - * - (-EINVAL) if the fdir_filter information is not correct. - */ -int rte_eth_dev_fdir_update_perfect_filter(uint8_t port_id, - struct rte_fdir_filter *fdir_filter, - uint16_t soft_id, uint8_t rx_queue, - uint8_t drop); + 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 -/** - * Remove a perfect filter rule on an Ethernet device. - * - * @param port_id - * The port identifier of the Ethernet device. - * @param fdir_filter - * The pointer to the structure describing the perfect filter rule. - * The *rte_fdir_filter* structure includes the values of the different fields - * to match: source and destination IP addresses, vlan id, flexbytes, source - * and destination ports, and so on. - * IPv6 are not supported. - * @param soft_id - * The soft_id value provided when adding/updating the removed filter. - * @return - * - (0) if successful. - * - (-ENOTSUP) if hardware doesn't support flow director mode. - * - (-ENODEV) if *port_id* invalid. - * - (-ENOSYS) if the flow director mode is not configured in perfect mode - * on *port_id*. - * - (-EINVAL) if the fdir_filter information is not correct. - */ -int rte_eth_dev_fdir_remove_perfect_filter(uint8_t port_id, - struct rte_fdir_filter *fdir_filter, - uint16_t soft_id); -/** - * Configure globally the masks for flow director mode for an Ethernet device. - * For example, the device can match packets with only the first 24 bits of - * the IPv4 source address. - * - * The following fields can be masked: IPv4 addresses and L4 port numbers. - * The following fields can be either enabled or disabled completely for the - * matching functionality: VLAN ID tag; VLAN Priority + CFI bit; Flexible 2-byte - * tuple. - * IPv6 masks are not supported. - * - * All filters must comply with the masks previously configured. - * For example, with a mask equal to 255.255.255.0 for the source IPv4 address, - * all IPv4 filters must be created with a source IPv4 address that fits the - * "X.X.X.0" format. - * - * This function flushes all filters that have been previously added in - * the device. - * - * @param port_id - * The port identifier of the Ethernet device. - * @param fdir_mask - * The pointer to the fdir mask structure describing relevant headers fields - * and relevant bits to use when matching packets addresses and ports. - * IPv6 masks are not supported. - * @return - * - (0) if successful. - * - (-ENOTSUP) if hardware doesn't support flow director mode. - * - (-ENODEV) if *port_id* invalid. - * - (-ENOSYS) if the flow director mode is not configured in perfect - * mode on *port_id*. - * - (-EINVAL) if the fdir_filter information is not correct - */ -int rte_eth_dev_fdir_set_masks(uint8_t port_id, - struct rte_fdir_masks *fdir_mask); + return (*dev->tx_pkt_burst)(dev->data->tx_queues[queue_id], tx_pkts, nb_pkts); +} +#endif /** * The eth device event type for interrupt, and maybe others in the future. @@ -2262,6 +2691,92 @@ int rte_eth_dev_callback_unregister(uint8_t port_id, void _rte_eth_dev_callback_process(struct rte_eth_dev *dev, enum rte_eth_event_type event); +/** + * 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 packect 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. + */ +int rte_eth_dev_rx_intr_enable(uint8_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. + */ +int rte_eth_dev_rx_intr_disable(uint8_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(uint8_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(uint8_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. @@ -2290,6 +2805,21 @@ int rte_eth_led_on(uint8_t port_id); */ int rte_eth_led_off(uint8_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. + */ +int rte_eth_dev_flow_ctrl_get(uint8_t port_id, + struct rte_eth_fc_conf *fc_conf); + /** * Configure the Ethernet link flow control for Ethernet device * @@ -2305,12 +2835,12 @@ int rte_eth_led_off(uint8_t port_id); * - (-EIO) if flow control setup failure */ int rte_eth_dev_flow_ctrl_set(uint8_t port_id, - struct rte_eth_fc_conf *fc_conf); + struct rte_eth_fc_conf *fc_conf); /** - * Configure the Ethernet priority flow control under DCB environment - * for Ethernet device. - * + * 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 @@ -2361,41 +2891,65 @@ int rte_eth_dev_mac_addr_add(uint8_t port, struct ether_addr *mac_addr, */ int rte_eth_dev_mac_addr_remove(uint8_t port, struct ether_addr *mac_addr); +/** + * Set the default MAC address. + * + * @param port + * 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(uint8_t port, struct ether_addr *mac_addr); + + /** * Update Redirection Table(RETA) of Receive Side Scaling of Ethernet device. - * + * * @param port * The port identifier of the Ethernet device. - * @param reta_conf - * RETA to update. + * @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. + * - (0) if successful. * - (-ENOTSUP) if hardware doesn't support. * - (-EINVAL) if bad parameter. */ -int rte_eth_dev_rss_reta_update(uint8_t port, - struct rte_eth_rss_reta *reta_conf); +int rte_eth_dev_rss_reta_update(uint8_t port, + 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 * The port identifier of the Ethernet device. - * @param reta_conf + * @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. + * - (0) if successful. * - (-ENOTSUP) if hardware doesn't support. * - (-EINVAL) if bad parameter. */ -int rte_eth_dev_rss_reta_query(uint8_t port, - struct rte_eth_rss_reta *reta_conf); - +int rte_eth_dev_rss_reta_query(uint8_t port, + 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 + * 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 * The port identifier of the Ethernet device. * @param addr @@ -2404,7 +2958,7 @@ int rte_eth_dev_rss_reta_query(uint8_t port, * 1 - Set an unicast hash bit for receiving packets with the MAC address. * 0 - Clear an unicast hash bit. * @return - * - (0) if successful. + * - (0) if successful. * - (-ENOTSUP) if hardware doesn't support. * - (-ENODEV) if *port_id* invalid. * - (-EINVAL) if bad parameter. @@ -2413,18 +2967,18 @@ int rte_eth_dev_uc_hash_table_set(uint8_t port,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 + * 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 * The port identifier of the Ethernet device. * @param on - * 1 - Set all unicast hash bitmaps for receiving all the Ethernet + * 1 - Set all unicast hash bitmaps for receiving all the Ethernet * MAC addresses * 0 - Clear all unicast hash bitmaps * @return - * - (0) if successful. + * - (0) if successful. * - (-ENOTSUP) if hardware doesn't support. * - (-ENODEV) if *port_id* invalid. * - (-EINVAL) if bad parameter. @@ -2433,13 +2987,13 @@ int rte_eth_dev_uc_all_hash_table_set(uint8_t port,uint8_t on); /** * Set RX L2 Filtering mode of a VF of an Ethernet device. - * + * * @param port * The port identifier of the Ethernet device. - * @param vf + * @param vf * VF id. * @param rx_mode - * The RX mode mask, which is one or more of accepting Untagged Packets, + * The RX mode mask, which is one or more of accepting Untagged Packets, * packets that match the PFUTA table, Broadcast and Multicast Promiscuous. * ETH_VMDQ_ACCEPT_UNTAG,ETH_VMDQ_ACCEPT_HASH_UC, * ETH_VMDQ_ACCEPT_BROADCAST and ETH_VMDQ_ACCEPT_MULTICAST will be used @@ -2448,7 +3002,7 @@ int rte_eth_dev_uc_all_hash_table_set(uint8_t port,uint8_t on); * 1 - Enable a VF RX mode. * 0 - Disable a VF RX mode. * @return - * - (0) if successful. + * - (0) if successful. * - (-ENOTSUP) if hardware doesn't support. * - (-ENOTSUP) if hardware doesn't support. * - (-EINVAL) if bad parameter. @@ -2458,26 +3012,26 @@ int rte_eth_dev_set_vf_rxmode(uint8_t port, uint16_t vf, uint16_t rx_mode, /** * Enable or disable a VF traffic transmit of the Ethernet device. -* +* * @param port * The port identifier of the Ethernet device. -* @param vf +* @param vf * VF id. * @param on * 1 - Enable a VF traffic transmit. * 0 - Disable a VF traffic transmit. * @return -* - (0) if successful. +* - (0) if successful. * - (-ENODEV) if *port_id* invalid. * - (-ENOTSUP) if hardware doesn't support. * - (-EINVAL) if bad parameter. */ -int +int rte_eth_dev_set_vf_tx(uint8_t port,uint16_t vf, uint8_t on); /** * Enable or disable a VF traffic receive of an Ethernet device. -* +* * @param port * The port identifier of the Ethernet device. * @param vf @@ -2486,18 +3040,18 @@ rte_eth_dev_set_vf_tx(uint8_t port,uint16_t vf, uint8_t on); * 1 - Enable a VF traffic receive. * 0 - Disable a VF traffic receive. * @return -* - (0) if successful. +* - (0) if successful. * - (-ENOTSUP) if hardware doesn't support. * - (-ENODEV) if *port_id* invalid. * - (-EINVAL) if bad parameter. */ -int +int rte_eth_dev_set_vf_rx(uint8_t port,uint16_t vf, uint8_t on); /** * Enable/Disable hardware VF VLAN 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 @@ -2508,16 +3062,16 @@ rte_eth_dev_set_vf_rx(uint8_t port,uint16_t vf, uint8_t on); * 1 - Enable VFs VLAN filtering. * 0 - Disable VFs VLAN filtering. * @return -* - (0) if successful. +* - (0) if successful. * - (-ENOTSUP) if hardware doesn't support. * - (-ENODEV) if *port_id* invalid. * - (-EINVAL) if bad parameter. */ int -rte_eth_dev_set_vf_vlan_filter(uint8_t port, uint16_t vlan_id, +rte_eth_dev_set_vf_vlan_filter(uint8_t port, uint16_t vlan_id, uint64_t vf_mask, uint8_t vlan_on); - + /** * Set a traffic mirroring rule on an Ethernet device * @@ -2540,7 +3094,7 @@ rte_eth_dev_set_vf_vlan_filter(uint8_t port, uint16_t vlan_id, * - (-EINVAL) if the mr_conf information is not correct. */ int rte_eth_mirror_rule_set(uint8_t port_id, - struct rte_eth_vmdq_mirror_conf *mirror_conf, + struct rte_eth_mirror_conf *mirror_conf, uint8_t rule_id, uint8_t on); @@ -2560,6 +3114,44 @@ int rte_eth_mirror_rule_set(uint8_t port_id, int rte_eth_mirror_rule_reset(uint8_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. + * - (-EINVAL) if bad parameter. + */ +int rte_eth_set_queue_rate_limit(uint8_t port_id, uint16_t queue_idx, + uint16_t tx_rate); + +/** + * Set the rate limitation for a vf on an Ethernet device. + * + * @param port_id + * The port identifier of the Ethernet device. + * @param vf + * VF id. + * @param tx_rate + * The tx rate allocated from the total link speed for this VF id. + * @param q_msk + * The queue mask which need to set the rate. + * @return + * - (0) if successful. + * - (-ENOTSUP) if hardware doesn't support this feature. + * - (-ENODEV) if *port_id* invalid. + * - (-EINVAL) if bad parameter. + */ +int rte_eth_set_vf_rate_limit(uint8_t port_id, uint16_t vf, + uint16_t tx_rate, uint64_t q_msk); + /** * Initialize bypass logic. This function needs to be called before * executing any other bypass API. @@ -2595,7 +3187,7 @@ int rte_eth_dev_bypass_state_show(uint8_t port, uint32_t *state); * * @param port * The port identifier of the Ethernet device. - * @param state + * @param new_state * The current bypass state. * - (1) Normal mode * - (2) Bypass mode @@ -2660,7 +3252,7 @@ int rte_eth_dev_bypass_event_store(uint8_t port, uint32_t event, uint32_t state) * * @param port * The port identifier of the Ethernet device. - * @param state + * @param timeout * The timeout to be set. * - (0) 0 seconds (timer is off) * - (1) 1.5 seconds @@ -2725,6 +3317,481 @@ int rte_eth_dev_bypass_wd_timeout_show(uint8_t port, uint32_t *wd_timeout); */ int rte_eth_dev_bypass_wd_reset(uint8_t port); + /** + * 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. + * - (-ENOTSUP) if hardware doesn't support. + * - (-EINVAL) if bad parameter. + */ +int rte_eth_dev_rss_hash_update(uint8_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. + * - (-ENOTSUP) if hardware doesn't support RSS. + */ +int +rte_eth_dev_rss_hash_conf_get(uint8_t port_id, + struct rte_eth_rss_conf *rss_conf); + + /** + * Add UDP tunneling port of an Ethernet device for filtering a specific + * tunneling packet by UDP port number. + * + * @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. + * - (-ENOTSUP) if hardware doesn't support tunnel type. + */ +int +rte_eth_dev_udp_tunnel_add(uint8_t port_id, + struct rte_eth_udp_tunnel *tunnel_udp); + + /** + * Detete UDP tunneling port configuration of Ethernet device + * + * @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. + * - (-ENOTSUP) if hardware doesn't support tunnel type. + */ +int +rte_eth_dev_udp_tunnel_delete(uint8_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. + */ +int rte_eth_dev_filter_supported(uint8_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. + * - others depends on the specific operations implementation. + */ +int rte_eth_dev_filter_ctrl(uint8_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. + * - (-ENOTSUP) if hardware doesn't support. + */ +int rte_eth_dev_get_dcb_info(uint8_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(uint8_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(uint8_t port_id, uint16_t queue_id, + rte_tx_callback_fn fn, void *user_param); + +/** + * 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(uint8_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(uint8_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(uint8_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(uint8_t port_id, uint16_t queue_id, + struct rte_eth_txq_info *qinfo); + +/* + * Retrieve number of available registers for access + * + * @param port_id + * The port identifier of the Ethernet device. + * @return + * - (>=0) number of registers if successful. + * - (-ENOTSUP) if hardware doesn't support. + * - (-ENODEV) if *port_id* invalid. + * - others depends on the specific operations implementation. + */ +int rte_eth_dev_get_reg_length(uint8_t port_id); + +/** + * Retrieve device registers and register attributes + * + * @param port_id + * The port identifier of the Ethernet device. + * @param info + * The template includes buffer for register data and attribute to be filled. + * @return + * - (0) if successful. + * - (-ENOTSUP) if hardware doesn't support. + * - (-ENODEV) if *port_id* invalid. + * - others depends on the specific operations implementation. + */ +int rte_eth_dev_get_reg_info(uint8_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. + * - others depends on the specific operations implementation. + */ +int rte_eth_dev_get_eeprom_length(uint8_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. + * - others depends on the specific operations implementation. + */ +int rte_eth_dev_get_eeprom(uint8_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. + * - others depends on the specific operations implementation. + */ +int rte_eth_dev_set_eeprom(uint8_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. + * - (-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(uint8_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. + * - -ENOTSUP: The function is not supported by the Ethernet driver. + */ +extern int rte_eth_timesync_enable(uint8_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. + * - -ENOTSUP: The function is not supported by the Ethernet driver. + */ +extern int rte_eth_timesync_disable(uint8_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. + * - -ENOTSUP: The function is not supported by the Ethernet driver. + */ +extern int rte_eth_timesync_read_rx_timestamp(uint8_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. + * - -ENOTSUP: The function is not supported by the Ethernet driver. + */ +extern int rte_eth_timesync_read_tx_timestamp(uint8_t port_id, + struct timespec *timestamp); + +/** + * 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. + * + * @return + * - 0 on success, negative on error + */ +extern void rte_eth_copy_pci_info(struct rte_eth_dev *eth_dev, struct rte_pci_device *pci_dev); + + +/** + * 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