The cc.has_function() check compiled its test program under strict
-std=c11, where glibc hides the getentropy() declaration behind
_DEFAULT_SOURCE. The probe therefore always failed on Linux and
RTE_LIBEAL_USE_GETENTROPY was never defined, silently falling back
to RDSEED or TSC for the initial PRNG seed.
Now that a getentropy() wrapper exists for Windows it can always be
enabled. Removing the conditional means any future regression is a
link error rather than a silent downgrade of seed quality.
Falling back to the TSC now logs at ERR level, including the errno
from getentropy() so that a blocked syscall can be told apart from
other failures. A TSC derived seed only varies by process start time,
which a co-resident attacker can bound.
This requires glibc >= 2.25, which all supported distributions meet.
A backport needs the preceding patch which adds the Windows
getentropy() shim, otherwise the Windows build breaks.
Bugzilla ID: 2035
Fixes: faf8fd252785 ("eal: improve entropy for initial PRNG seed")
Cc: [email protected]
Signed-off-by: Stephen Hemminger <[email protected]>
---
doc/guides/rel_notes/release_26_11.rst | 4 ++++
lib/eal/common/rte_random.c | 6 ++++--
lib/eal/include/rte_random.h | 7 ++++---
lib/eal/meson.build | 3 ---
4 files changed, 12 insertions(+), 8 deletions(-)
diff --git a/doc/guides/rel_notes/release_26_11.rst
b/doc/guides/rel_notes/release_26_11.rst
index 87c7e81bde..5852f7acfb 100644
--- a/doc/guides/rel_notes/release_26_11.rst
+++ b/doc/guides/rel_notes/release_26_11.rst
@@ -55,6 +55,10 @@ New Features
Also, make sure to start the actual text at the margin.
=======================================================
+* **Updated random number generation.**
+
+ * The initial seed is now always taken from ``getentropy()``.
+
Removed Items
-------------
diff --git a/lib/eal/common/rte_random.c b/lib/eal/common/rte_random.c
index 537fa035ee..b036c50349 100644
--- a/lib/eal/common/rte_random.c
+++ b/lib/eal/common/rte_random.c
@@ -7,6 +7,8 @@
#include <x86intrin.h>
#endif
#endif
+#include <errno.h>
+#include <string.h>
#include <unistd.h>
#include <rte_bitops.h>
@@ -219,7 +221,6 @@ rte_drand(void)
static uint64_t
__rte_random_initial_seed(void)
{
-#ifdef RTE_LIBEAL_USE_GETENTROPY
int ge_rc;
uint64_t ge_seed;
@@ -227,7 +228,6 @@ __rte_random_initial_seed(void)
if (ge_rc == 0)
return ge_seed;
-#endif
#ifdef __RDSEED__
unsigned int rdseed_low;
unsigned int rdseed_high;
@@ -238,6 +238,8 @@ __rte_random_initial_seed(void)
return (uint64_t)rdseed_low | ((uint64_t)rdseed_high << 32);
#endif
/* second fallback: seed using rdtsc */
+ EAL_LOG(ERR, "getentropy() failed (%s), seeding PRNG from TSC: seed has
low entropy",
+ strerror(errno));
return rte_get_tsc_cycles();
}
diff --git a/lib/eal/include/rte_random.h b/lib/eal/include/rte_random.h
index 15cbe6215a..978ecda203 100644
--- a/lib/eal/include/rte_random.h
+++ b/lib/eal/include/rte_random.h
@@ -20,9 +20,10 @@ 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 from the
+ * random source provided by the operating system, so there is no need
+ * to re-seed it to get unpredictable values. Seeding it explicitly is
+ * useful to make a run repeatable.
*
* This function is not multi-thread safe in regards to other
* rte_srand() calls, nor is it in relation to concurrent rte_rand(),
diff --git a/lib/eal/meson.build b/lib/eal/meson.build
index f9fcee24ee..2bf3c67439 100644
--- a/lib/eal/meson.build
+++ b/lib/eal/meson.build
@@ -24,9 +24,6 @@ endif
if dpdk_conf.has('RTE_HAS_LIBARCHIVE')
ext_deps += libarchive
endif
-if cc.has_function('getentropy', prefix : '#include <unistd.h>')
- cflags += '-DRTE_LIBEAL_USE_GETENTROPY'
-endif
if is_freebsd
annotate_locks = false
--
2.53.0