summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
3f002f0)
Replace the use of rte_get_timer_cycles() with getentropy() for
seeding the pseudo-random number generator. getentropy() provides a
more truly random value.
getentropy() requires glibc 2.25 and Linux kernel 3.17. In case
getentropy() is not found at compile time, or the relevant syscall
fails in runtime, the rdseed machine instruction will be used as a
fallback.
rdseed is only available on x86 (Broadwell or later). In case it is
not present, rte_get_timer_cycles() will be used as a second fallback.
On non-Meson builds, getentropy() will not be used.
Suggested-by: Bruce Richardson <bruce.richardson@intel.com>
Suggested-by: Stephen Hemminger <stephen@networkplumber.org>
Signed-off-by: Mattias Rönnblom <mattias.ronnblom@ericsson.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
* Copyright(c) 2019 Ericsson AB
*/
* Copyright(c) 2019 Ericsson AB
*/
+#ifdef RTE_MACHINE_CPUFLAG_RDSEED
+#include <x86intrin.h>
+#endif
#include <rte_branch_prediction.h>
#include <rte_cycles.h>
#include <rte_branch_prediction.h>
#include <rte_cycles.h>
return __rte_rand_lfsr258(state);
}
return __rte_rand_lfsr258(state);
}
+static uint64_t
+__rte_random_initial_seed(void)
+{
+#ifdef RTE_LIBEAL_USE_GETENTROPY
+ int ge_rc;
+ uint64_t ge_seed;
+
+ ge_rc = getentropy(&ge_seed, sizeof(ge_seed));
+
+ if (ge_rc == 0)
+ return ge_seed;
+#endif
+#ifdef RTE_MACHINE_CPUFLAG_RDSEED
+ unsigned int rdseed_rc;
+ unsigned long long rdseed_seed;
+
+ /* first fallback: rdseed instruction, if available */
+ rdseed_rc = _rdseed64_step(&rdseed_seed);
+
+ if (rdseed_rc == 1)
+ return (uint64_t)rdseed_seed;
+#endif
+ /* second fallback: seed using rdtsc */
+ return rte_get_timer_cycles();
+}
+
RTE_INIT(rte_rand_init)
{
RTE_INIT(rte_rand_init)
{
- rte_srand(rte_get_timer_cycles());
+ uint64_t seed;
+
+ seed = __rte_random_initial_seed();
+
+ rte_srand(seed);
if dpdk_conf.has('RTE_USE_LIBBSD')
ext_deps += libbsd
endif
if dpdk_conf.has('RTE_USE_LIBBSD')
ext_deps += libbsd
endif
+if cc.has_function('getentropy', prefix : '#include <unistd.h>')
+ cflags += '-DRTE_LIBEAL_USE_GETENTROPY'
+endif
sources = common_sources + env_sources
objs = common_objs + env_objs
headers = common_headers + env_headers
sources = common_sources + env_sources
objs = common_objs + env_objs
headers = common_headers + env_headers