Both drivers built the default RSS key a word at a time from rte_rand().
That generator is a fast non-cryptographic PRNG whose state is
recoverable from its output, so the resulting key is predictable.

Use rte_random_bytes() which takes randomness from the operating
system, and report the error to the caller.

Signed-off-by: Stephen Hemminger <[email protected]>
---
 drivers/net/axgbe/axgbe_dev.c | 16 +++++++++++-----
 drivers/net/bnx2x/bnx2x.c     | 11 +++++++----
 2 files changed, 18 insertions(+), 9 deletions(-)

diff --git a/drivers/net/axgbe/axgbe_dev.c b/drivers/net/axgbe/axgbe_dev.c
index 482d3d8062..37856fddd9 100644
--- a/drivers/net/axgbe/axgbe_dev.c
+++ b/drivers/net/axgbe/axgbe_dev.c
@@ -3,6 +3,8 @@
  *   Copyright(c) 2018 Synopsys, Inc. All rights reserved.
  */
 
+#include <rte_random.h>
+
 #include "axgbe_ethdev.h"
 #include "axgbe_common.h"
 #include "axgbe_phy.h"
@@ -931,13 +933,15 @@ static void axgbe_rss_options(struct axgbe_port *pdata)
 static int axgbe_config_rss(struct axgbe_port *pdata)
 {
        uint32_t i;
+       int ret;
 
        if (pdata->rss_enable) {
                /* Initialize RSS hash key and lookup table */
-               uint32_t *key = (uint32_t *)pdata->rss_key;
-
-               for (i = 0; i < sizeof(pdata->rss_key) / 4; i++)
-                       *key++ = (uint32_t)rte_rand();
+               ret = rte_random_bytes(pdata->rss_key, sizeof(pdata->rss_key));
+               if (ret != 0) {
+                       PMD_DRV_LOG_LINE(ERR, "Error generating RSS hash key");
+                       return ret;
+               }
                for (i = 0; i < AXGBE_RSS_MAX_TABLE_SIZE; i++)
                        AXGMAC_SET_BITS(pdata->rss_table[i], MAC_RSSDR, DMCH,
                                        i % pdata->eth_dev->data->nb_rx_queues);
@@ -1393,7 +1397,9 @@ static int axgbe_init(struct axgbe_port *pdata)
        axgbe_config_tx_pbl_val(pdata);
        axgbe_config_rx_pbl_val(pdata);
        axgbe_config_rx_buffer_size(pdata);
-       axgbe_config_rss(pdata);
+       ret = axgbe_config_rss(pdata);
+       if (ret)
+               return ret;
        axgbe_config_tso_mode(pdata);
        wrapper_tx_desc_init(pdata);
        ret = wrapper_rx_desc_init(pdata);
diff --git a/drivers/net/bnx2x/bnx2x.c b/drivers/net/bnx2x/bnx2x.c
index 8790c858d5..97ee95a1be 100644
--- a/drivers/net/bnx2x/bnx2x.c
+++ b/drivers/net/bnx2x/bnx2x.c
@@ -28,6 +28,7 @@
 #include <zlib.h>
 
 #include <rte_bitops.h>
+#include <rte_random.h>
 #include <rte_string_fns.h>
 
 #include "eal_firmware.h"
@@ -6643,7 +6644,7 @@ bnx2x_config_rss_pf(struct bnx2x_softc *sc, struct 
ecore_rss_config_obj *rss_obj
                  uint8_t config_hash)
 {
        struct ecore_config_rss_params params = { NULL };
-       uint32_t i;
+       int rc;
 
        /*
         * Although RSS is meaningless when there is a single HW queue we
@@ -6675,9 +6676,11 @@ bnx2x_config_rss_pf(struct bnx2x_softc *sc, struct 
ecore_rss_config_obj *rss_obj
                         sizeof(params.ind_table));
 
        if (config_hash) {
-/* RSS keys */
-               for (i = 0; i < sizeof(params.rss_key) / 4; i++) {
-                       params.rss_key[i] = (uint32_t) rte_rand();
+               /* RSS keys */
+               rc = rte_random_bytes(params.rss_key, sizeof(params.rss_key));
+               if (rc != 0) {
+                       PMD_DRV_LOG(ERR, sc, "Error generating RSS hash key");
+                       return rc;
                }
 
                rte_bit_relaxed_set32(ECORE_RSS_SET_SRCH, &params.rss_flags);
-- 
2.53.0

Reply via email to