]> git.puffer.fish Git - matthieu/frr.git/commitdiff
tests: update prng to return better pseudo random numbers
authorChristian Franke <chris@opensourcerouting.org>
Wed, 12 Jul 2017 16:44:44 +0000 (18:44 +0200)
committerChristian Franke <chris@opensourcerouting.org>
Wed, 12 Jul 2017 16:44:44 +0000 (18:44 +0200)
Signed-off-by: Christian Franke <chris@opensourcerouting.org>
tests/helpers/c/prng.c
tests/helpers/c/prng.h
tests/lib/test_srcdest_table.c

index 4b9fd57159ec21c7b054c9eae486995035aa5458..0f78366fcdab75a3e2532380038ce74b36b200a7 100644 (file)
@@ -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
  *
 
 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 *
index 6cc6289a1e76dda896c51abae650566d04ceb847..7b2ab924e4c005adfe3a937fea2215c40d81368d 100644 (file)
@@ -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,
index 792e2696e90ab7fbf83d75b4dcc93bcdd61c7458..111b11a1efa88af0975f5c923ed4890203d55fb4 100644 (file)
@@ -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;