aboutgitcodebugslistschat
path: root/passt.c
diff options
context:
space:
mode:
Diffstat (limited to 'passt.c')
-rw-r--r--passt.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/passt.c b/passt.c
index 8ddd9b3..0246b04 100644
--- a/passt.c
+++ b/passt.c
@@ -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)))