ethdev: close device
[dpdk.git] / lib / librte_ether / rte_ethdev.h
index 7e4c998..cea230e 100644 (file)
@@ -351,101 +351,80 @@ struct rte_eth_rss_conf {
        uint64_t rss_hf;     /**< Hash functions to apply - see below. */
 };
 
-/* 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                    (1 << ETH_RSS_IPV4_SHIFT)
-#define ETH_RSS_IPV4_TCP                (1 << ETH_RSS_IPV4_TCP_SHIFT)
-#define ETH_RSS_IPV6                    (1 << ETH_RSS_IPV6_SHIFT)
-#define ETH_RSS_IPV6_EX                 (1 << ETH_RSS_IPV6_EX_SHIFT)
-#define ETH_RSS_IPV6_TCP                (1 << ETH_RSS_IPV6_TCP_SHIFT)
-#define ETH_RSS_IPV6_TCP_EX             (1 << ETH_RSS_IPV6_TCP_EX_SHIFT)
-#define ETH_RSS_IPV4_UDP                (1 << ETH_RSS_IPV4_UDP_SHIFT)
-#define ETH_RSS_IPV6_UDP                (1 << ETH_RSS_IPV6_UDP_SHIFT)
-#define ETH_RSS_IPV6_UDP_EX             (1 << ETH_RSS_IPV6_UDP_EX_SHIFT)
-/* for 40G only */
-#define ETH_RSS_NONF_IPV4_UDP           (1ULL << ETH_RSS_NONF_IPV4_UDP_SHIFT)
-#define ETH_RSS_NONF_IPV4_TCP           (1ULL << ETH_RSS_NONF_IPV4_TCP_SHIFT)
-#define ETH_RSS_NONF_IPV4_SCTP          (1ULL << ETH_RSS_NONF_IPV4_SCTP_SHIFT)
-#define ETH_RSS_NONF_IPV4_OTHER         (1ULL << ETH_RSS_NONF_IPV4_OTHER_SHIFT)
-#define ETH_RSS_FRAG_IPV4               (1ULL << ETH_RSS_FRAG_IPV4_SHIFT)
-#define ETH_RSS_NONF_IPV6_UDP           (1ULL << ETH_RSS_NONF_IPV6_UDP_SHIFT)
-#define ETH_RSS_NONF_IPV6_TCP           (1ULL << ETH_RSS_NONF_IPV6_TCP_SHIFT)
-#define ETH_RSS_NONF_IPV6_SCTP          (1ULL << ETH_RSS_NONF_IPV6_SCTP_SHIFT)
-#define ETH_RSS_NONF_IPV6_OTHER         (1ULL << ETH_RSS_NONF_IPV6_OTHER_SHIFT)
-#define ETH_RSS_FRAG_IPV6               (1ULL << ETH_RSS_FRAG_IPV6_SHIFT)
-/* FCOE relevant should not be used */
-#define ETH_RSS_FCOE_OX                 (1ULL << ETH_RSS_FCOE_OX_SHIFT)
-#define ETH_RSS_FCOE_RX                 (1ULL << ETH_RSS_FCOE_RX_SHIFT)
-#define ETH_RSS_FCOE_OTHER              (1ULL << ETH_RSS_FCOE_OTHER_SHIFT)
-#define ETH_RSS_L2_PAYLOAD              (1ULL << ETH_RSS_L2_PAYLOAD_SHIFT)
+/*
+ * 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_IPV6 | \
-               ETH_RSS_NONF_IPV4_OTHER | \
-               ETH_RSS_FRAG_IPV4 | \
-               ETH_RSS_NONF_IPV6_OTHER | \
-               ETH_RSS_FRAG_IPV6)
+       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_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)
+       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_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
+       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. */
@@ -509,15 +488,16 @@ struct rte_eth_vmdq_mirror_conf {
 };
 
 /**
- * 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. */
 };
 
 /**
@@ -593,6 +573,7 @@ struct rte_eth_vmdq_rx_conf {
        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 */
@@ -635,6 +616,9 @@ 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.
  */
@@ -681,15 +665,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.
@@ -719,10 +694,11 @@ 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. */
 };
 
 /**
@@ -915,6 +891,7 @@ 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. */
 
 struct rte_eth_dev_info {
        struct rte_pci_device *pci_dev; /**< Device PCI information. */
@@ -932,6 +909,10 @@ struct rte_eth_dev_info {
        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. */
+       /** 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. */
@@ -960,73 +941,6 @@ struct rte_eth_dev_callback;
 /** @internal Structure to keep track of registered callbacks */
 TAILQ_HEAD(rte_eth_dev_cb_list, rte_eth_dev_callback);
 
-#define TCP_UGR_FLAG 0x20
-#define TCP_ACK_FLAG 0x10
-#define TCP_PSH_FLAG 0x08
-#define TCP_RST_FLAG 0x04
-#define TCP_SYN_FLAG 0x02
-#define TCP_FIN_FLAG 0x01
-#define TCP_FLAG_ALL 0x3F
-
-/**
- *  A structure used to define an ethertype filter.
- */
-struct rte_ethertype_filter {
-       uint16_t ethertype;  /**< little endian. */
-       uint8_t priority_en; /**< compare priority enable. */
-       uint8_t priority;
-};
-
-/**
- *  A structure used to define an syn filter.
- */
-struct rte_syn_filter {
-       uint8_t hig_pri; /**< 1 means higher pri than 2tuple, 5tupe,
-                             and flex filter, 0 means lower pri. */
-};
-
-/**
- *  A structure used to define a 2tuple filter.
- */
-struct rte_2tuple_filter {
-       uint16_t dst_port;        /**< big endian. */
-       uint8_t protocol;
-       uint8_t tcp_flags;
-       uint16_t priority;        /**< used when more than one filter matches. */
-       uint8_t dst_port_mask:1,  /**< if mask is 1b, means not compare. */
-               protocol_mask:1;
-};
-
-/**
- *  A structure used to define a flex filter.
- */
-struct rte_flex_filter {
-       uint16_t len;
-       uint32_t dwords[32];  /**< flex bytes in big endian. */
-       uint8_t mask[16];     /**< if mask bit is 1b, do not compare
-                                  corresponding byte in dwords. */
-       uint8_t priority;
-};
-
-/**
- *  A structure used to define a 5tuple filter.
- */
-struct rte_5tuple_filter {
-       uint32_t dst_ip;         /**< destination IP address in big endian. */
-       uint32_t src_ip;         /**< source IP address in big endian. */
-       uint16_t dst_port;       /**< destination port in big endian. */
-       uint16_t src_port;       /**< source Port big endian. */
-       uint8_t protocol;        /**< l4 protocol. */
-       uint8_t tcp_flags;       /**< tcp flags. */
-       uint16_t priority;       /**< seven evels (001b-111b), 111b is highest,
-                                     used when more than one filter matches. */
-       uint8_t dst_ip_mask:1,   /**< if mask is 1b, do not compare dst ip. */
-               src_ip_mask:1,   /**< if mask is 1b, do not compare src ip. */
-               dst_port_mask:1, /**< if mask is 1b, do not compare dst port. */
-               src_port_mask:1, /**< if mask is 1b, do not compare src port. */
-               protocol_mask:1; /**< if mask is 1b, do not compare protocol. */
-};
-
 /*
  * Definitions of all functions exported by an Ethernet driver through the
  * the generic structure of type *eth_dev_ops* supplied in the *rte_eth_dev*
@@ -1211,11 +1125,13 @@ 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,
@@ -1241,6 +1157,10 @@ typedef void (*eth_mac_addr_add_t)(struct rte_eth_dev *dev,
                                  uint32_t vmdq);
 /**< @internal Set a MAC address into Receive Address Address Register */
 
+typedef void (*eth_mac_addr_set_t)(struct rte_eth_dev *dev,
+                                 struct ether_addr *mac_addr);
+/**< @internal Set a MAC address into Receive Address Address Register */
+
 typedef int (*eth_uc_hash_table_set_t)(struct rte_eth_dev *dev,
                                  struct ether_addr *mac_addr,
                                  uint8_t on);
@@ -1356,73 +1276,6 @@ 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_add_syn_filter_t)(struct rte_eth_dev *dev,
-                       struct rte_syn_filter *filter, uint16_t rx_queue);
-/**< @internal add syn filter rule on an Ethernet device */
-
-typedef int (*eth_remove_syn_filter_t)(struct rte_eth_dev *dev);
-/**< @internal remove syn filter rule on an Ethernet device */
-
-typedef int (*eth_get_syn_filter_t)(struct rte_eth_dev *dev,
-                       struct rte_syn_filter *filter, uint16_t *rx_queue);
-/**< @internal Get syn filter rule on an Ethernet device */
-
-typedef int (*eth_add_ethertype_filter_t)(struct rte_eth_dev *dev,
-                       uint16_t index, struct rte_ethertype_filter *filter,
-                       uint16_t rx_queue);
-/**< @internal Setup a new ethertype filter rule on an Ethernet device */
-
-typedef int (*eth_remove_ethertype_filter_t)(struct rte_eth_dev *dev,
-                       uint16_t index);
-/**< @internal Remove an ethertype filter rule on an Ethernet device */
-
-typedef int (*eth_get_ethertype_filter_t)(struct rte_eth_dev *dev,
-                       uint16_t index, struct rte_ethertype_filter *filter,
-                       uint16_t *rx_queue);
-/**< @internal Get an ethertype filter rule on an Ethernet device */
-
-typedef int (*eth_add_2tuple_filter_t)(struct rte_eth_dev *dev,
-                       uint16_t index, struct rte_2tuple_filter *filter,
-                       uint16_t rx_queue);
-/**< @internal Setup a new 2tuple filter rule on an Ethernet device */
-
-typedef int (*eth_remove_2tuple_filter_t)(struct rte_eth_dev *dev,
-                       uint16_t index);
-/**< @internal Remove a 2tuple filter rule on an Ethernet device */
-
-typedef int (*eth_get_2tuple_filter_t)(struct rte_eth_dev *dev,
-                       uint16_t index, struct rte_2tuple_filter *filter,
-                       uint16_t *rx_queue);
-/**< @internal Get a 2tuple filter rule on an Ethernet device */
-
-typedef int (*eth_add_5tuple_filter_t)(struct rte_eth_dev *dev,
-                       uint16_t index, struct rte_5tuple_filter *filter,
-                       uint16_t rx_queue);
-/**< @internal Setup a new 5tuple filter rule on an Ethernet device */
-
-typedef int (*eth_remove_5tuple_filter_t)(struct rte_eth_dev *dev,
-                       uint16_t index);
-/**< @internal Remove a 5tuple filter rule on an Ethernet device */
-
-typedef int (*eth_get_5tuple_filter_t)(struct rte_eth_dev *dev,
-                       uint16_t index, struct rte_5tuple_filter *filter,
-                       uint16_t *rx_queue);
-/**< @internal Get a 5tuple filter rule on an Ethernet device */
-
-typedef int (*eth_add_flex_filter_t)(struct rte_eth_dev *dev,
-                       uint16_t index, struct rte_flex_filter *filter,
-                       uint16_t rx_queue);
-/**< @internal Setup a new flex filter rule on an Ethernet device */
-
-typedef int (*eth_remove_flex_filter_t)(struct rte_eth_dev *dev,
-                       uint16_t index);
-/**< @internal Remove a flex filter rule on an Ethernet device */
-
-typedef int (*eth_get_flex_filter_t)(struct rte_eth_dev *dev,
-                       uint16_t index, struct rte_flex_filter *filter,
-                       uint16_t *rx_queue);
-/**< @internal Get a flex filter rule on an Ethernet device */
-
 typedef int (*eth_filter_ctrl_t)(struct rte_eth_dev *dev,
                                 enum rte_filter_type filter_type,
                                 enum rte_filter_op filter_op,
@@ -1474,6 +1327,7 @@ struct eth_dev_ops {
        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.*/
@@ -1524,24 +1378,50 @@ struct eth_dev_ops {
        rss_hash_update_t rss_hash_update;
        /** Get current RSS hash configuration. */
        rss_hash_conf_get_t rss_hash_conf_get;
-       eth_add_syn_filter_t           add_syn_filter;       /**< add syn filter. */
-       eth_remove_syn_filter_t        remove_syn_filter;    /**< remove syn filter. */
-       eth_get_syn_filter_t           get_syn_filter;       /**< get syn filter. */
-       eth_add_ethertype_filter_t     add_ethertype_filter;    /**< add ethertype filter. */
-       eth_remove_ethertype_filter_t  remove_ethertype_filter; /**< remove ethertype filter. */
-       eth_get_ethertype_filter_t     get_ethertype_filter;    /**< get ethertype filter. */
-       eth_add_2tuple_filter_t        add_2tuple_filter;    /**< add 2tuple filter. */
-       eth_remove_2tuple_filter_t     remove_2tuple_filter; /**< remove 2tuple filter. */
-       eth_get_2tuple_filter_t        get_2tuple_filter;    /**< get 2tuple filter. */
-       eth_add_5tuple_filter_t        add_5tuple_filter;    /**< add 5tuple filter. */
-       eth_remove_5tuple_filter_t     remove_5tuple_filter; /**< remove 5tuple filter. */
-       eth_get_5tuple_filter_t        get_5tuple_filter;    /**< get 5tuple filter. */
-       eth_add_flex_filter_t          add_flex_filter;      /**< add flex filter. */
-       eth_remove_flex_filter_t       remove_flex_filter;   /**< remove flex filter. */
-       eth_get_flex_filter_t          get_flex_filter;      /**< get flex filter. */
        eth_filter_ctrl_t              filter_ctrl;          /**< common filter control*/
 };
 
+/**
+ * Function type used for callbacks for processing packets on RX and TX
+ *
+ * If configured for RX, it is called with a burst of packets that have just
+ * been received on the given port and queue. On TX, it is called with a burst
+ * of packets immediately before those packets are put onto the hardware queue
+ * for transmission.
+ *
+ * @param port
+ *   The ethernet port on which rx or tx is being performed
+ * @param queue
+ *   The queue on the ethernet port which is being used to receive or transmit
+ *   the packets.
+ * @param pkts
+ *   The burst of packets on which processing is to be done. On RX, these
+ *   packets have just been received. On TX, they 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 remaining in pkts are processing.
+ *     * On RX, this will be returned to the user as the return value from
+ *       rte_eth_rx_burst.
+ *     * On TX, this will be the number of packets actually written to the NIC.
+ */
+typedef uint16_t (*rte_rxtx_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;
+       rte_rxtx_callback_fn fn;
+       void *param;
+};
+
 /**
  * @internal
  * The generic data structure associated with each ethernet device.
@@ -1559,7 +1439,19 @@ struct rte_eth_dev {
        const struct eth_driver *driver;/**< Driver for this device */
        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;
+       /**
+        * 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;
+       uint8_t attached; /**< Flag indicating the port is attached */
 };
 
 struct rte_eth_dev_sriov {
@@ -1624,7 +1516,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.
@@ -1643,6 +1539,18 @@ extern uint8_t rte_eth_dev_count(void);
  */
 struct rte_eth_dev *rte_eth_dev_allocate(const char *name);
 
+/**
+ * Function for internal use by dummy drivers primarily, e.g. ring-based
+ * driver.
+ * 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);
+
 struct eth_driver;
 /**
  * @internal
@@ -1664,8 +1572,7 @@ struct eth_driver;
  *
  *   - *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).
@@ -1679,6 +1586,27 @@ struct eth_driver;
 typedef int (*eth_dev_init_t)(struct eth_driver  *eth_drv,
                              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_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]
+ *   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)(const struct eth_driver  *eth_drv,
+                                 struct rte_eth_dev *eth_dev);
+
 /**
  * @internal
  * The structure associated with a PMD Ethernet driver.
@@ -1690,11 +1618,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. */
 };
 
@@ -2073,8 +2004,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.
@@ -2412,7 +2345,23 @@ rte_eth_rx_burst(uint8_t port_id, uint16_t queue_id,
        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);
+
+       nb_pkts = (*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_pkts = cb->fn(port_id, queue_id, rx_pkts, nb_pkts,
+                                       cb->param);
+                       cb = cb->next;
+               } while (cb != NULL);
+       }
+#endif
+
+       return nb_pkts;
 }
 #endif
 
@@ -2539,6 +2488,19 @@ rte_eth_tx_burst(uint8_t port_id, uint16_t queue_id,
        struct rte_eth_dev *dev;
 
        dev = &rte_eth_devices[port_id];
+
+#ifdef RTE_ETHDEV_RXTX_CALLBACKS
+       struct rte_eth_rxtx_callback *cb = dev->pre_tx_burst_cbs[queue_id];
+
+       if (unlikely(cb != NULL)) {
+               do {
+                       nb_pkts = cb->fn(port_id, queue_id, tx_pkts, nb_pkts,
+                                       cb->param);
+                       cb = cb->next;
+               } while (cb != NULL);
+       }
+#endif
+
        return (*dev->tx_pkt_burst)(dev->data->tx_queues[queue_id], tx_pkts, nb_pkts);
 }
 #endif
@@ -2951,14 +2913,18 @@ int rte_eth_dev_mac_addr_remove(uint8_t port, struct ether_addr *mac_addr);
  * @param port
  *   The port identifier of the Ethernet device.
  * @param reta_conf
- *    RETA to update.
+ *   RETA to update.
+ * @param reta_size
+ *   Redirection table size. The table size can be queried by
+ *   rte_eth_dev_info_get().
  * @return
  *   - (0) if successful.
  *   - (-ENOTSUP) if hardware doesn't support.
  *   - (-EINVAL) if bad parameter.
  */
 int rte_eth_dev_rss_reta_update(uint8_t port,
-                       struct rte_eth_rss_reta *reta_conf);
+                               struct rte_eth_rss_reta_entry64 *reta_conf,
+                               uint16_t reta_size);
 
  /**
  * Query Redirection Table(RETA) of Receive Side Scaling of Ethernet device.
@@ -2967,13 +2933,17 @@ int rte_eth_dev_rss_reta_update(uint8_t port,
  *   The port identifier of the Ethernet device.
  * @param reta_conf
  *   RETA to query.
+ * @param reta_size
+ *   Redirection table size. The table size can be queried by
+ *   rte_eth_dev_info_get().
  * @return
  *   - (0) if successful.
  *   - (-ENOTSUP) if hardware doesn't support.
  *   - (-EINVAL) if bad parameter.
  */
 int rte_eth_dev_rss_reta_query(uint8_t port,
-                       struct rte_eth_rss_reta *reta_conf);
+                              struct rte_eth_rss_reta_entry64 *reta_conf,
+                              uint16_t reta_size);
 
  /**
  * Updates unicast hash table for receiving packet with the given destination
@@ -3350,7 +3320,7 @@ int rte_eth_dev_bypass_wd_reset(uint8_t port);
  /**
  * Configuration of Receive Side Scaling hash computation of Ethernet device.
  *
- * @param port
+ * @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.
@@ -3367,7 +3337,7 @@ int rte_eth_dev_rss_hash_update(uint8_t port_id,
  * Retrieve current configuration of Receive Side Scaling hash computation
  * of Ethernet device.
  *
- * @param port
+ * @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.
@@ -3416,329 +3386,156 @@ rte_eth_dev_udp_tunnel_delete(uint8_t port_id,
                              struct rte_eth_udp_tunnel *tunnel_udp);
 
 /**
- * add syn filter
+ * 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 rx_queue
- *   The index of RX queue where to store RX packets matching the syn filter.
- * @param filter
- *   The pointer to the structure describing the syn filter rule.
+ * @param filter_type
+ *   Filter type.
  * @return
  *   - (0) if successful.
- *   - (-ENOTSUP) if hardware doesn't support.
- *   - (-EINVAL) if bad parameter.
+ *   - (-ENOTSUP) if hardware doesn't support this filter type.
+ *   - (-ENODEV) if *port_id* invalid.
  */
-int rte_eth_dev_add_syn_filter(uint8_t port_id,
-                       struct rte_syn_filter *filter, uint16_t rx_queue);
+int rte_eth_dev_filter_supported(uint8_t port_id, enum rte_filter_type filter_type);
 
 /**
- * remove syn filter
+ * 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.
- *   - (-EINVAL) if bad parameter.
+ *   - (-ENODEV) if *port_id* invalid.
+ *   - others depends on the specific operations implementation.
  */
-int rte_eth_dev_remove_syn_filter(uint8_t port_id);
+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 syn filter
+ * Add a callback to be called on packet RX on a given port and queue.
  *
- * @param port_id
- *   The port identifier of the Ethernet device.
- * @param filter
- *   The pointer to the structure describing the syn filter.
- * @param rx_queue
- *   A pointer to get the queue index of syn filter.
- * @return
- *   - (0) if successful.
- *   - (-ENOTSUP) if hardware doesn't support.
- *   - (-EINVAL) if bad parameter.
- */
-int rte_eth_dev_get_syn_filter(uint8_t port_id,
-                       struct rte_syn_filter *filter, uint16_t *rx_queue);
-
-/**
- * Add a new ethertype filter rule on an Ethernet device.
+ * 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().
  *
  * @param port_id
  *   The port identifier of the Ethernet device.
- * @param index
- *   The identifier of ethertype filter.
- * @param filter
- *   The pointer to the structure describing the ethertype filter rule.
- *   The *rte_ethertype_filter* structure includes the values of the different
- *   fields to match: ethertype and priority in vlan tag.
- *   priority in vlan tag is not supported for E1000 dev.
- * @param rx_queue
- *   The index of the RX queue where to store RX packets matching the added
- *   ethertype filter.
- * @return
- *   - (0) if successful.
- *   - (-ENOTSUP) if hardware doesn't support ethertype filter.
- *   - (-ENODEV) if *port_id* invalid.
- *   - (-EINVAL) if the filter information is not correct.
- */
-int rte_eth_dev_add_ethertype_filter(uint8_t port_id, uint16_t index,
-                       struct rte_ethertype_filter *filter, uint16_t rx_queue);
-
-/**
- * remove an ethertype filter rule on an 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.
  *
- * @param port_id
- *   The port identifier of the Ethernet device.
- * @param index
- *   The identifier of ethertype filter.
  * @return
- *   - (0) if successful.
- *   - (-ENOTSUP) if hardware doesn't support ethertype filter.
- *   - (-ENODEV) if *port_id* invalid.
- *   - (-EINVAL) if the filter information is not correct.
+ *   NULL on error.
+ *   On success, a pointer value which can later be used to remove the callback.
  */
-int rte_eth_dev_remove_ethertype_filter(uint8_t port_id,
-                       uint16_t index);
+void *rte_eth_add_rx_callback(uint8_t port_id, uint16_t queue_id,
+               rte_rxtx_callback_fn fn, void *user_param);
 
 /**
- * Get an ethertype filter rule on an Ethernet device.
+ * Add a callback to be called on packet TX on a given port and queue.
  *
- * @param port_id
- *   The port identifier of the Ethernet device.
- * @param index
- *   The identifier of ethertype filter.
- * @param filter
- *   A pointer to a structure of type *rte_ethertype_filter* to be filled with
- *   the information of the Ethertype filter.
- * @param rx_queue
- *   A pointer to get the queue index.
- * @return
- *   - (0) if successful.
- *   - (-ENOTSUP) if hardware doesn't support ethertype filter.
- *   - (-ENODEV) if *port_id* invalid.
- *   - (-EINVAL) if the filter information is not correct.
- *   - (-ENOENT) if no enabled filter in this index.
- */
-int rte_eth_dev_get_ethertype_filter(uint8_t port_id, uint16_t index,
-                       struct rte_ethertype_filter *filter, uint16_t *rx_queue);
-
-/**
- * Add a new 2tuple filter rule on an Ethernet device.
+ * 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().
  *
  * @param port_id
  *   The port identifier of the Ethernet device.
- * @param index
- *   The identifier of 2tuple filter.
- * @param filter
- *   The pointer to the structure describing the 2tuple filter rule.
- *   The *rte_2tuple_filter* structure includes the values of the different
- *   fields to match: protocol, dst_port and
- *   tcp_flags if the protocol is tcp type.
- * @param rx_queue
- *   The index of the RX queue where to store RX packets matching the added
- *   2tuple filter.
- * @return
- *   - (0) if successful.
- *   - (-ENOTSUP) if hardware doesn't support 2tuple filter.
- *   - (-ENODEV) if *port_id* invalid.
- *   - (-EINVAL) if the filter information is not correct.
- */
-int rte_eth_dev_add_2tuple_filter(uint8_t port_id, uint16_t index,
-                       struct rte_2tuple_filter *filter, uint16_t rx_queue);
-
-/**
- * remove a 2tuple filter rule on an 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.
  *
- * @param port_id
- *   The port identifier of the Ethernet device.
- * @param index
- *   The identifier of 2tuple filter.
  * @return
- *   - (0) if successful.
- *   - (-ENOTSUP) if hardware doesn't support 2tuple filter.
- *   - (-ENODEV) if *port_id* invalid.
- *   - (-EINVAL) if the filter information is not correct.
+ *   NULL on error.
+ *   On success, a pointer value which can later be used to remove the callback.
  */
-int rte_eth_dev_remove_2tuple_filter(uint8_t port_id, uint16_t index);
+void *rte_eth_add_tx_callback(uint8_t port_id, uint16_t queue_id,
+               rte_rxtx_callback_fn fn, void *user_param);
 
 /**
- * Get an 2tuple filter rule on an Ethernet device.
+ * Remove an RX packet callback from a given port and queue.
  *
- * @param port_id
- *   The port identifier of the Ethernet device.
- * @param index
- *   The identifier of 2tuple filter.
- * @param filter
- *   A pointer to a structure of type *rte_2tuple_filter* to be filled with
- *   the information of the 2tuple filter.
- * @param rx_queue
- *   A pointer to get the queue index.
- * @return
- *   - (0) if successful.
- *   - (-ENOTSUP) if hardware doesn't support 2tuple filter.
- *   - (-ENODEV) if *port_id* invalid.
- *   - (-EINVAL) if the filter information is not correct.
- *   - (-ENOENT) if no enabled filter in this index.
- */
-int rte_eth_dev_get_2tuple_filter(uint8_t port_id, uint16_t index,
-                       struct rte_2tuple_filter *filter, uint16_t *rx_queue);
-
-/**
- * Add a new 5tuple filter rule on an Ethernet device.
+ * This function is used to removed callbacks that were added to a NIC port
+ * queue using rte_eth_add_rx_callback().
  *
- * @param port_id
- *   The port identifier of the Ethernet device.
- * @param index
- *   The identifier of 5tuple filter.
- * @param filter
- *   The pointer to the structure describing the 5tuple filter rule.
- *   The *rte_5tuple_filter* structure includes the values of the different
- *   fields to match: dst src IP, dst src port, protocol and relative masks
- * @param rx_queue
- *   The index of the RX queue where to store RX packets matching the added
- *   5tuple filter.
- * @return
- *   - (0) if successful.
- *   - (-ENOTSUP) if hardware doesn't support 5tuple filter.
- *   - (-ENODEV) if *port_id* invalid.
- *   - (-EINVAL) if the filter information is not correct.
- */
-int rte_eth_dev_add_5tuple_filter(uint8_t port_id, uint16_t index,
-                       struct rte_5tuple_filter *filter, uint16_t rx_queue);
-
-/**
- * remove a 5tuple filter rule on an Ethernet device.
+ * 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():
  *
- * @param port_id
- *   The port identifier of the Ethernet device.
- * @param index
- *   The identifier of 5tuple filter.
- * @return
- *   - (0) if successful.
- *   - (-ENOTSUP) if hardware doesn't support 5tuple filter.
- *   - (-ENODEV) if *port_id* invalid.
- *   - (-EINVAL) if the filter information is not correct.
- */
-int rte_eth_dev_remove_5tuple_filter(uint8_t port_id, uint16_t index);
-
-/**
- * Get an 5tuple filter rule on an Ethernet device.
+ *  - 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.
  *
- * @param port_id
- *   The port identifier of the Ethernet device.
- * @param index
- *   The identifier of 5tuple filter.
- * @param filter
- *   A pointer to a structure of type *rte_5tuple_filter* to be filled with
- *   the information of the 5tuple filter.
- * @param rx_queue
- *   A pointer to get the queue index.
- * @return
- *   - (0) if successful.
- *   - (-ENOTSUP) if hardware doesn't support 5tuple filter.
- *   - (-ENODEV) if *port_id* invalid.
- *   - (-EINVAL) if the filter information is not correct.
- */
-int rte_eth_dev_get_5tuple_filter(uint8_t port_id, uint16_t index,
-                       struct rte_5tuple_filter *filter, uint16_t *rx_queue);
-
-/**
- * Add a new flex filter rule on an Ethernet device.
+ * - 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 index
- *   The identifier of flex filter.
- * @param filter
- *   The pointer to the structure describing the flex filter rule.
- *   The *rte_flex_filter* structure includes the values of the different fields
- *   to match: the dwords (first len bytes of packet ) and relative masks.
- * @param rx_queue
- *   The index of the RX queue where to store RX packets matching the added
- *   flex filter.
- * @return
- *   - (0) if successful.
- *   - (-ENOTSUP) if hardware doesn't support flex filter.
- *   - (-ENODEV) if *port_id* invalid.
- *   - (-EINVAL) if the filter information is not correct.
- *   - (-ENOENT) if no enabled filter in this index.
- */
-int rte_eth_dev_add_flex_filter(uint8_t port_id, uint16_t index,
-                       struct rte_flex_filter *filter, uint16_t rx_queue);
-
-/**
- * remove a flex filter rule on an 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().
  *
- * @param port_id
- *   The port identifier of the Ethernet device.
- * @param index
- *   The identifier of flex filter.
  * @return
- *   - (0) if successful.
- *   - (-ENOTSUP) if hardware doesn't support flex filter.
- *   - (-ENODEV) if *port_id* invalid.
- *   - (-EINVAL) if the filter information is not correct.
+ *   - 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_dev_remove_flex_filter(uint8_t port_id, uint16_t index);
+int rte_eth_remove_rx_callback(uint8_t port_id, uint16_t queue_id,
+               struct rte_eth_rxtx_callback *user_cb);
 
 /**
- * Get an flex filter rule on an Ethernet device.
+ * Remove a TX packet callback from a given port and queue.
  *
- * @param port_id
- *   The port identifier of the Ethernet device.
- * @param index
- *   The identifier of flex filter.
- * @param filter
- *   A pointer to a structure of type *rte_flex_filter* to be filled with
- *   the information of the flex filter.
- * @param rx_queue
- *   A pointer to get the queue index.
- * @return
- *   - (0) if successful.
- *   - (-ENOTSUP) if hardware doesn't support flex filter.
- *   - (-ENODEV) if *port_id* invalid.
- *   - (-EINVAL) if the filter information is not correct.
- *   - (-ENOENT) if no enabled filter in this index.
- */
-int rte_eth_dev_get_flex_filter(uint8_t port_id, uint16_t index,
-                       struct rte_flex_filter *filter, uint16_t *rx_queue);
-
-/**
- * Check whether the filter type is supported on an Ethernet device.
- * All the supported filter types are defined in 'rte_eth_ctrl.h'.
+ * This function is used to removed callbacks that were added to a NIC port
+ * queue using rte_eth_add_tx_callback().
  *
- * @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'.
+ * 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 filter_type
- *   Filter type.
- * @param filter_op
- *   Type of operation.
- * @param arg
- *   A pointer to arguments defined specifically for the operation.
+ * @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) if successful.
- *   - (-ENOTSUP) if hardware doesn't support.
- *   - (-ENODEV) if *port_id* invalid.
- *   - others depends on the specific operations implementation.
+ *   - 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_dev_filter_ctrl(uint8_t port_id, enum rte_filter_type filter_type,
-                       enum rte_filter_op filter_op, void *arg);
+int rte_eth_remove_tx_callback(uint8_t port_id, uint16_t queue_id,
+               struct rte_eth_rxtx_callback *user_cb);
 
 #ifdef __cplusplus
 }