TAS
TCP Acceleration as an OS Service
rng.c
1 /*
2  * Copyright 2019 University of Washington, Max Planck Institute for
3  * Software Systems, and The University of Texas at Austin
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining
6  * a copy of this software and associated documentation files (the
7  * "Software"), to deal in the Software without restriction, including
8  * without limitation the rights to use, copy, modify, merge, publish,
9  * distribute, sublicense, and/or sell copies of the Software, and to
10  * permit persons to whom the Software is furnished to do so, subject to
11  * the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be
14  * included in all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
19  * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
20  * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23  */
24 
25 #include <utils_rng.h>
26 
27 static const uint64_t a = 0x5deece66dULL;
28 static const uint64_t c = 0xb;
29 static const uint64_t m = 1ULL << 48;
30 
31 void utils_rng_init(struct utils_rng *rng, uint64_t seed)
32 {
33  rng->seed = (seed ^ a) % m;
34 }
35 
36 uint32_t utils_rng_gen32(struct utils_rng *rng)
37 {
38  uint64_t next;
39  next = (a * rng->seed + c) % m;
40  rng->seed = next;
41  return next >> 16;
42 }
43 
44 double utils_rng_gend(struct utils_rng *rng)
45 {
46  // This is what Java seems to do
47  uint64_t x =
48  (((uint64_t) utils_rng_gen32(rng) >> 6) << 27) +
49  (utils_rng_gen32(rng) >> 5);
50  return x / ((double) (1ULL << 53));
51 }
52 
53 void utils_rng_gen(struct utils_rng *rng, void *buf, size_t size)
54 {
55  uint32_t x;
56  while (size >= 4) {
57  * ((uint32_t *) buf) = utils_rng_gen32(rng);
58  buf = (void*) ((uintptr_t) buf + 4);
59  size -= 4;
60  }
61 
62  x = utils_rng_gen32(rng);
63  while (size > 0) {
64  * ((uint8_t *) buf) = x >> 24;
65  x <<= 8;
66  buf = (void*) ((uintptr_t) buf + 1);
67  size--;
68  }
69 
70 }
71