ethdev: allow to force Rx scatter mode
[dpdk.git] / lib / librte_ether / rte_ethdev.h
index d2d7d5e..2b98700 100644 (file)
@@ -186,6 +186,9 @@ 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 missed packets (e.g full FIFO). */
+       uint64_t ibadcrc;   /**< Total of RX packets with CRC error. */
+       uint64_t ibadlen;   /**< 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. */
@@ -230,6 +233,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. */
@@ -301,38 +307,124 @@ struct rte_eth_rxmode {
                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 */
 };
 
 /**
  * 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. */
-
-#define ETH_RSS_PROTO_MASK  0x01FF /**< Mask of valid RSS hash protocols */
+/* Supported RSS offloads */
+/* for 1G & 10G */
+#define ETH_RSS_IPV4_SHIFT                    0
+#define ETH_RSS_IPV4_TCP_SHIFT                1
+#define ETH_RSS_IPV6_SHIFT                    2
+#define ETH_RSS_IPV6_EX_SHIFT                 3
+#define ETH_RSS_IPV6_TCP_SHIFT                4
+#define ETH_RSS_IPV6_TCP_EX_SHIFT             5
+#define ETH_RSS_IPV4_UDP_SHIFT                6
+#define ETH_RSS_IPV6_UDP_SHIFT                7
+#define ETH_RSS_IPV6_UDP_EX_SHIFT             8
+/* for 40G only */
+#define ETH_RSS_NONF_IPV4_UDP_SHIFT           31
+#define ETH_RSS_NONF_IPV4_TCP_SHIFT           33
+#define ETH_RSS_NONF_IPV4_SCTP_SHIFT          34
+#define ETH_RSS_NONF_IPV4_OTHER_SHIFT         35
+#define ETH_RSS_FRAG_IPV4_SHIFT               36
+#define ETH_RSS_NONF_IPV6_UDP_SHIFT           41
+#define ETH_RSS_NONF_IPV6_TCP_SHIFT           43
+#define ETH_RSS_NONF_IPV6_SCTP_SHIFT          44
+#define ETH_RSS_NONF_IPV6_OTHER_SHIFT         45
+#define ETH_RSS_FRAG_IPV6_SHIFT               46
+#define ETH_RSS_FCOE_OX_SHIFT                 48
+#define ETH_RSS_FCOE_RX_SHIFT                 49
+#define ETH_RSS_FCOE_OTHER_SHIFT              50
+#define ETH_RSS_L2_PAYLOAD_SHIFT              63
+
+/* for 1G & 10G */
+#define ETH_RSS_IPV4                    ((uint16_t)1 << ETH_RSS_IPV4_SHIFT)
+#define ETH_RSS_IPV4_TCP                ((uint16_t)1 << ETH_RSS_IPV4_TCP_SHIFT)
+#define ETH_RSS_IPV6                    ((uint16_t)1 << ETH_RSS_IPV6_SHIFT)
+#define ETH_RSS_IPV6_EX                 ((uint16_t)1 << ETH_RSS_IPV6_EX_SHIFT)
+#define ETH_RSS_IPV6_TCP                ((uint16_t)1 << ETH_RSS_IPV6_TCP_SHIFT)
+#define ETH_RSS_IPV6_TCP_EX             ((uint16_t)1 << ETH_RSS_IPV6_TCP_EX_SHIFT)
+#define ETH_RSS_IPV4_UDP                ((uint16_t)1 << ETH_RSS_IPV4_UDP_SHIFT)
+#define ETH_RSS_IPV6_UDP                ((uint16_t)1 << ETH_RSS_IPV6_UDP_SHIFT)
+#define ETH_RSS_IPV6_UDP_EX             ((uint16_t)1 << ETH_RSS_IPV6_UDP_EX_SHIFT)
+/* for 40G only */
+#define ETH_RSS_NONF_IPV4_UDP           ((uint64_t)1 << ETH_RSS_NONF_IPV4_UDP_SHIFT)
+#define ETH_RSS_NONF_IPV4_TCP           ((uint64_t)1 << ETH_RSS_NONF_IPV4_TCP_SHIFT)
+#define ETH_RSS_NONF_IPV4_SCTP          ((uint64_t)1 << ETH_RSS_NONF_IPV4_SCTP_SHIFT)
+#define ETH_RSS_NONF_IPV4_OTHER         ((uint64_t)1 << ETH_RSS_NONF_IPV4_OTHER_SHIFT)
+#define ETH_RSS_FRAG_IPV4               ((uint64_t)1 << ETH_RSS_FRAG_IPV4_SHIFT)
+#define ETH_RSS_NONF_IPV6_UDP           ((uint64_t)1 << ETH_RSS_NONF_IPV6_UDP_SHIFT)
+#define ETH_RSS_NONF_IPV6_TCP           ((uint64_t)1 << ETH_RSS_NONF_IPV6_TCP_SHIFT)
+#define ETH_RSS_NONF_IPV6_SCTP          ((uint64_t)1 << ETH_RSS_NONF_IPV6_SCTP_SHIFT)
+#define ETH_RSS_NONF_IPV6_OTHER         ((uint64_t)1 << ETH_RSS_NONF_IPV6_OTHER_SHIFT)
+#define ETH_RSS_FRAG_IPV6               ((uint64_t)1 << ETH_RSS_FRAG_IPV6_SHIFT)
+#define ETH_RSS_FCOE_OX                 ((uint64_t)1 << ETH_RSS_FCOE_OX_SHIFT) /* not used */
+#define ETH_RSS_FCOE_RX                 ((uint64_t)1 << ETH_RSS_FCOE_RX_SHIFT) /* not used */
+#define ETH_RSS_FCOE_OTHER              ((uint64_t)1 << ETH_RSS_FCOE_OTHER_SHIFT) /* not used */
+#define ETH_RSS_L2_PAYLOAD              ((uint64_t)1 << ETH_RSS_L2_PAYLOAD_SHIFT)
+
+#define ETH_RSS_IP ( \
+               ETH_RSS_IPV4 | \
+               ETH_RSS_IPV6 | \
+               ETH_RSS_NONF_IPV4_OTHER | \
+               ETH_RSS_FRAG_IPV4 | \
+               ETH_RSS_NONF_IPV6_OTHER | \
+               ETH_RSS_FRAG_IPV6)
+#define ETH_RSS_UDP ( \
+               ETH_RSS_IPV4 | \
+               ETH_RSS_IPV6 | \
+               ETH_RSS_IPV4_UDP | \
+               ETH_RSS_IPV6_UDP | \
+               ETH_RSS_IPV6_UDP_EX | \
+               ETH_RSS_NONF_IPV4_UDP | \
+               ETH_RSS_NONF_IPV6_UDP)
+/**< Mask of valid RSS hash protocols */
+#define ETH_RSS_PROTO_MASK ( \
+               ETH_RSS_IPV4 | \
+               ETH_RSS_IPV4_TCP | \
+               ETH_RSS_IPV6 | \
+               ETH_RSS_IPV6_EX | \
+               ETH_RSS_IPV6_TCP | \
+               ETH_RSS_IPV6_TCP_EX | \
+               ETH_RSS_IPV4_UDP | \
+               ETH_RSS_IPV6_UDP | \
+               ETH_RSS_IPV6_UDP_EX | \
+               ETH_RSS_NONF_IPV4_UDP | \
+               ETH_RSS_NONF_IPV4_TCP | \
+               ETH_RSS_NONF_IPV4_SCTP | \
+               ETH_RSS_NONF_IPV4_OTHER | \
+               ETH_RSS_FRAG_IPV4 | \
+               ETH_RSS_NONF_IPV6_UDP | \
+               ETH_RSS_NONF_IPV6_TCP | \
+               ETH_RSS_NONF_IPV6_SCTP | \
+               ETH_RSS_NONF_IPV6_OTHER | \
+               ETH_RSS_FRAG_IPV6 | \
+               ETH_RSS_L2_PAYLOAD)
+
 /* Definitions used for redirection table entry size */
 #define ETH_RSS_RETA_NUM_ENTRIES 128
 #define ETH_RSS_RETA_MAX_QUEUE   16
@@ -361,7 +453,6 @@ struct rte_eth_rss_conf {
 /* 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. */
 
@@ -495,6 +586,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 */
 };
 
 /**
@@ -550,6 +650,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 */
 };
 
 /**
@@ -982,6 +1083,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);
@@ -1036,8 +1142,12 @@ 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,
@@ -1272,6 +1382,7 @@ struct eth_dev_ops {
        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.*/
@@ -1284,6 +1395,7 @@ struct eth_dev_ops {
        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 */
@@ -1404,6 +1516,9 @@ struct rte_eth_dev_data {
        struct rte_eth_conf dev_conf;   /**< Configuration applied to device. */
        uint16_t max_frame_size;        /**< Default is ETHER_MAX_LEN (1518). */
 
+       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];
@@ -2039,6 +2154,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
@@ -2579,6 +2710,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
  *
@@ -2594,7 +2740,7 @@ 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