diff options
Diffstat (limited to 'passt.c')
-rw-r--r-- | passt.c | 40 |
1 files changed, 40 insertions, 0 deletions
@@ -35,6 +35,9 @@ #include <syslog.h> #include <sys/prctl.h> #include <netinet/if_ether.h> +#ifdef HAS_GETRANDOM +#include <sys/random.h> +#endif #include "util.h" #include "passt.h" @@ -104,6 +107,41 @@ static void post_handler(struct ctx *c, const struct timespec *now) } /** + * secret_init() - Create secret value for SipHash calculations + * @c: Execution context + */ +static void secret_init(struct ctx *c) +{ +#ifndef HAS_GETRANDOM + int dev_random = open("/dev/random", O_RDONLY); + unsigned int random_read = 0; + + while (dev_random && random_read < sizeof(c->hash_secret)) { + int ret = read(dev_random, + (uint8_t *)&c->hash_secret + random_read, + sizeof(c->hash_secret) - random_read); + + if (ret == -1 && errno == EINTR) + continue; + + if (ret <= 0) + break; + + random_read += ret; + } + if (dev_random >= 0) + close(dev_random); + if (random_read < sizeof(c->hash_secret)) { +#else + if (getrandom(&c->hash_secret, sizeof(c->hash_secret), + GRND_RANDOM) < 0) { +#endif /* !HAS_GETRANDOM */ + perror("TCP initial sequence getrandom"); + exit(EXIT_FAILURE); + } +} + +/** * timer_init() - Set initial timestamp for timer runs to current time * @c: Execution context * @now: Current timestamp @@ -237,6 +275,8 @@ int main(int argc, char **argv) tap_sock_init(&c); + secret_init(&c); + clock_gettime(CLOCK_MONOTONIC, &now); if ((!c.no_udp && udp_init(&c)) || (!c.no_tcp && tcp_init(&c))) |