summaryrefslogtreecommitdiff
path: root/src/ipcpd/normal/enroll.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ipcpd/normal/enroll.c')
-rw-r--r--src/ipcpd/normal/enroll.c53
1 files changed, 52 insertions, 1 deletions
diff --git a/src/ipcpd/normal/enroll.c b/src/ipcpd/normal/enroll.c
index 16bfc592..94e171c0 100644
--- a/src/ipcpd/normal/enroll.c
+++ b/src/ipcpd/normal/enroll.c
@@ -21,10 +21,12 @@
#define OUROBOROS_PREFIX "enrollment"
#include <ouroboros/config.h>
+#include <ouroboros/time_utils.h>
#include <ouroboros/cdap.h>
#include <ouroboros/dev.h>
#include <ouroboros/logs.h>
#include <ouroboros/rib.h>
+#include <ouroboros/endian.h>
#include "ae.h"
@@ -32,10 +34,15 @@
#include <stdlib.h>
#include <string.h>
+/* Symbolic, will return current time */
+#define TIME_NAME "localtime"
+#define ENROLL_WARN_TIME_OFFSET 20
+
#define DLR "/"
#define DIF_PATH DLR DIF_NAME
#define BOOT_PATH DLR BOOT_NAME
#define MEMBERS_PATH DLR MEMBERS_NAME
+#define TIME_PATH DLR TIME_NAME
int enroll_handle(int fd)
{
@@ -72,7 +79,6 @@ int enroll_handle(int fd)
while (!(boot_r && members_r && dif_name_r)) {
key = cdap_request_wait(ci, &oc, &name, &data,
(size_t *) &len , &flags);
-
assert(key >= 0);
assert(name);
@@ -96,6 +102,15 @@ int enroll_handle(int fd)
members_r = true;
} else if (strcmp(name, dif_ro) == 0) {
dif_name_r = true;
+ } else if (strcmp(name, TIME_PATH) == 0) {
+ struct timespec t;
+ uint64_t buf[2];
+ clock_gettime(CLOCK_REALTIME, &t);
+ buf[0] = hton64(t.tv_sec);
+ buf[1] = hton64(t.tv_nsec);
+ cdap_reply_send(ci, key, 0, buf, sizeof(buf));
+ free(name);
+ continue;
} else {
log_warn("Illegal read: %s.", name);
cdap_reply_send(ci, key, -1, NULL, 0);
@@ -146,6 +161,11 @@ int enroll_boot(char * dst_name)
size_t len;
int fd;
+ struct timespec t0;
+ struct timespec rtt;
+
+ ssize_t delta_t;
+
char * boot_ro = BOOT_PATH;
char * members_ro = MEMBERS_PATH;
char * dif_ro = DIF_PATH;
@@ -171,6 +191,37 @@ int enroll_boot(char * dst_name)
log_dbg("Getting boot information from %s.", dst_name);
+ clock_gettime(CLOCK_REALTIME, &t0);
+
+ key = cdap_request_send(ci, CDAP_READ, TIME_PATH, NULL, 0, 0);
+ if (key < 0) {
+ log_err("Failed to send CDAP request.");
+ cdap_destroy(ci);
+ flow_dealloc(fd);
+ return -1;
+ }
+
+ if (cdap_reply_wait(ci, key, &data, &len)) {
+ log_err("Failed to get CDAP reply.");
+ cdap_destroy(ci);
+ flow_dealloc(fd);
+ return -1;
+ }
+
+ clock_gettime(CLOCK_REALTIME, &rtt);
+
+ delta_t = ts_diff_ms(&t0, &rtt);
+
+ assert (len == 2 * sizeof (uint64_t));
+
+ rtt.tv_sec = ntoh64(((uint64_t *) data)[0]);
+ rtt.tv_nsec = ntoh64(((uint64_t *) data)[1]);
+
+ if (abs(ts_diff_ms(&t0, &rtt)) - delta_t > ENROLL_WARN_TIME_OFFSET)
+ log_warn("Clock offset above threshold.");
+
+ free(data);
+
key = cdap_request_send(ci, CDAP_READ, boot_ro, NULL, 0, 0);
if (key < 0) {
log_err("Failed to send CDAP request.");