diff options
author | Christian Franke <chris@opensourcerouting.org> | 2017-07-12 18:44:44 +0200 |
---|---|---|
committer | Christian Franke <chris@opensourcerouting.org> | 2017-07-12 18:44:44 +0200 |
commit | 6c968614b592cfaf1b03869dbaa0d4fcd94ef6bc (patch) | |
tree | 3cfc9ba1ec7a01c4e3a494ac5d179ba4daa71aba /tests | |
parent | Merge pull request #793 from opensourcerouting/hash-double-init (diff) | |
download | frr-6c968614b592cfaf1b03869dbaa0d4fcd94ef6bc.tar.xz frr-6c968614b592cfaf1b03869dbaa0d4fcd94ef6bc.zip |
tests: update prng to return better pseudo random numbers
Signed-off-by: Christian Franke <chris@opensourcerouting.org>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/helpers/c/prng.c | 42 | ||||
-rw-r--r-- | tests/helpers/c/prng.h | 2 | ||||
-rw-r--r-- | tests/lib/test_srcdest_table.c | 8 |
3 files changed, 21 insertions, 31 deletions
diff --git a/tests/helpers/c/prng.c b/tests/helpers/c/prng.c index 4b9fd5715..0f78366fc 100644 --- a/tests/helpers/c/prng.c +++ b/tests/helpers/c/prng.c @@ -4,6 +4,7 @@ * * Copyright (C) 2012 by Open Source Routing. * Copyright (C) 2012 by Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2017 Christian Franke * * This file is part of Quagga * @@ -32,49 +33,32 @@ struct prng { - unsigned long long state1; - unsigned long long state2; + uint64_t state; }; -static char -prng_bit(struct prng *prng) -{ - prng->state1 *= 2416; - prng->state1 += 374441; - prng->state1 %= 1771875; - - if (prng->state1 % 2) - { - prng->state2 *= 84589; - prng->state2 += 45989; - prng->state2 %= 217728; - } - - return prng->state2 % 2; -} - struct prng* prng_new(unsigned long long seed) { struct prng *rv = calloc(sizeof(*rv), 1); assert(rv); - rv->state1 = rv->state2 = seed; + rv->state = seed; return rv; } -unsigned int +/* + * This implementation has originally been provided to musl libc by + * Szabolcs Nagy <nsz at port70 dot net> in 2013 under the terms of + * the MIT license. + * It is a simple LCG which D.E. Knuth attributes to C.E. Haynes in + * TAOCP Vol2 3.3.4 + */ +int prng_rand(struct prng *prng) { - unsigned int i, rv = 0; - - for (i = 0; i < 32; i++) - { - rv |= prng_bit(prng); - rv <<= 1; - } - return rv; + prng->state = 6364136223846793005ULL*prng->state + 1; + return prng->state>>33; } const char * diff --git a/tests/helpers/c/prng.h b/tests/helpers/c/prng.h index 6cc6289a1..7b2ab924e 100644 --- a/tests/helpers/c/prng.h +++ b/tests/helpers/c/prng.h @@ -27,7 +27,7 @@ struct prng; struct prng* prng_new(unsigned long long seed); -unsigned int prng_rand(struct prng*); +int prng_rand(struct prng*); const char * prng_fuzz(struct prng*, const char *string, const char *charset, diff --git a/tests/lib/test_srcdest_table.c b/tests/lib/test_srcdest_table.c index 792e2696e..111b11a1e 100644 --- a/tests/lib/test_srcdest_table.c +++ b/tests/lib/test_srcdest_table.c @@ -386,7 +386,13 @@ static void test_state_del_one_route(struct test_state *test, struct prng *prng) { - unsigned int which_route = prng_rand(prng) % test->log->count; + unsigned int which_route; + + if (test->log->count == 0) + return; + + which_route = prng_rand(prng) % test->log->count; + struct route_node *rn; struct prefix *dst_p, *src_p; struct prefix_ipv6 dst6_p, src6_p; |