ethdev: check RETA queue indices against number of queues
authorIvan Boule <ivan.boule@6wind.com>
Fri, 16 May 2014 08:58:39 +0000 (10:58 +0200)
committerThomas Monjalon <thomas.monjalon@6wind.com>
Tue, 27 May 2014 16:42:05 +0000 (18:42 +0200)
Each entry of the RSS redirection table (RETA) of igb and ixgbe ports
contains a 4-bit RX queue index, thus imposing RSS RX queue indices to
be strictly lower than 16.
In addition, if a RETA entry is configured with a RX queue index that is
strictly lower than 16, but is greater or equal to the number of RX queues
of the port, then all input packets whose RSS hash value indexes that RETA
entry are silently dropped by the NIC.

Make the function rte_eth_dev_rss_reta_update() check that RX queue indices
that are supplied in the reta_conf argument are strictly lower than
ETH_RSS_RETA_MAX_QUEUE (16) and are strictly lower than the number of
RX queues of the port.

Signed-off-by: Ivan Boule <ivan.boule@6wind.com>
Acked-by: Thomas Monjalon <thomas.monjalon@6wind.com>
lib/librte_ether/rte_ethdev.c

index a5727dd..473c98b 100644 (file)
@@ -1501,6 +1501,7 @@ int
 rte_eth_dev_rss_reta_update(uint8_t port_id, struct rte_eth_rss_reta *reta_conf)
 {
        struct rte_eth_dev *dev;
+       uint16_t max_rxq;
        uint8_t i,j;
 
        if (port_id >= nb_ports) {
@@ -1514,10 +1515,13 @@ rte_eth_dev_rss_reta_update(uint8_t port_id, struct rte_eth_rss_reta *reta_conf)
                return (-EINVAL);
        }
 
+       dev = &rte_eth_devices[port_id];
+       max_rxq = (dev->data->nb_rx_queues <= ETH_RSS_RETA_MAX_QUEUE) ?
+               dev->data->nb_rx_queues : ETH_RSS_RETA_MAX_QUEUE;
        if (reta_conf->mask_lo != 0) {
                for (i = 0; i < ETH_RSS_RETA_NUM_ENTRIES/2; i++) {
                        if ((reta_conf->mask_lo & (1ULL << i)) &&
-                               (reta_conf->reta[i] >= ETH_RSS_RETA_MAX_QUEUE)) {
+                               (reta_conf->reta[i] >= max_rxq)) {
                                PMD_DEBUG_TRACE("RETA hash index output"
                                        "configration for port=%d,invalid"
                                        "queue=%d\n",port_id,reta_conf->reta[i]);
@@ -1533,7 +1537,7 @@ rte_eth_dev_rss_reta_update(uint8_t port_id, struct rte_eth_rss_reta *reta_conf)
 
                        /* Check if the max entry >= 128 */
                        if ((reta_conf->mask_hi & (1ULL << i)) && 
-                               (reta_conf->reta[j] >= ETH_RSS_RETA_MAX_QUEUE)) {
+                               (reta_conf->reta[j] >= max_rxq)) {
                                PMD_DEBUG_TRACE("RETA hash index output"
                                        "configration for port=%d,invalid"
                                        "queue=%d\n",port_id,reta_conf->reta[j]);
@@ -1543,8 +1547,6 @@ rte_eth_dev_rss_reta_update(uint8_t port_id, struct rte_eth_rss_reta *reta_conf)
                }
        }
 
-       dev = &rte_eth_devices[port_id];
-
        FUNC_PTR_OR_ERR_RET(*dev->dev_ops->reta_update, -ENOTSUP);
        return (*dev->dev_ops->reta_update)(dev, reta_conf);
 }