Den 2026-09-12 kl. 18:16, skrev Stephen Hemminger:
Many performance tests use rte_rand() and the random number
can perturb the results. Add an ability to override the automatic
random seed on DPDK startup.

There is a way to seed the PRNG already, rte_srand(). Why the tests can't use this?

Provided the test results depend on something that use the PRNG before the test driver has had the opportunity to call rte_srand(), controlling the *initial* seed may be required.

I don't think this feature should be controlled by an environment variable. There is no precedent for that. If this functionality is deemed useful, it should be an EAL command line option, it seems to me.


This is not a security problem since rte_rand() is documented
as not being cryptographically secure.

Signed-off-by: Stephen Hemminger <[email protected]>
Reviewed-by: Morten Brørup <[email protected]>
---
v2 - fix header inclusion
    - add docbook comment

  lib/eal/common/rte_random.c  | 14 +++++++++++++-
  lib/eal/include/rte_random.h |  8 +++++---
  2 files changed, 18 insertions(+), 4 deletions(-)

diff --git a/lib/eal/common/rte_random.c b/lib/eal/common/rte_random.c
index 576a32a46c..3cc0e3ec5f 100644
--- a/lib/eal/common/rte_random.c
+++ b/lib/eal/common/rte_random.c
@@ -8,6 +8,7 @@
  #endif
  #endif
  #include <unistd.h>
+#include <stdlib.h>
#include <rte_bitops.h>
  #include <rte_branch_prediction.h>
@@ -247,7 +248,18 @@ eal_rand_init(void)
RTE_LCORE_VAR_ALLOC(rand_state); - seed = __rte_random_initial_seed();
+       const char *env = getenv("DPDK_RANDOM_SEED");
+       if (env != NULL && *env != '\0') {
+               char *end;
+
+               errno = 0;
+               seed = strtoull(env, &end, 0);
+               if (errno != 0 || *end != '\0')
+                       rte_exit(EXIT_FAILURE,
+                                "invalid DPDK_RANDOM_SEED: %s\n", env);

Is rte_exit() the way to deal with errors here? Not to be used in DPDK libraries, if I recall correctly.

I would think logging an error would suffice. Or rte_eal_init_alert().

+       } else {
+               seed = __rte_random_initial_seed();
+       }
rte_srand(seed);
  }
diff --git a/lib/eal/include/rte_random.h b/lib/eal/include/rte_random.h
index 15cbe6215a..bdd4001e78 100644
--- a/lib/eal/include/rte_random.h
+++ b/lib/eal/include/rte_random.h
@@ -20,9 +20,11 @@ extern "C" {
  /**
   * Seed the pseudo-random generator.
   *
- * The generator is automatically seeded by the EAL init with a timer
- * value. It may need to be re-seeded by the user with a real random
- * value.
+ * The generator is automatically seeded by the EAL init with
+ * a system provided random entropy source. But for testing
+ * it can be useful to force a repeatable starting point by
+ * setting the initial seed. This can be done by setting
+ * the `DPDK_RANDOM_SEED` environment variable.
   *
   * This function is not multi-thread safe in regards to other
   * rte_srand() calls, nor is it in relation to concurrent rte_rand(),

Reply via email to