Fix #1600 - more precise SNTP time calculation

This commit is contained in:
cpq committed 2022-08-09 12:13:23 +01:00
1 parent 2279a51d52
commit b7406357c5
3 files changed
+49 -42

No files matched your search

+20 -6
View File
@@ -4,8 +4,14 @@
#include "log.h"
#include "util.h"
#define SNTP_INTERVAL_SEC 3600
#define SNTP_TIME_OFFSET 2208988800UL
#define SNTP_TIME_OFFSET 2208988800UL // (1970 - 1900) in seconds
#define SNTP_MAX_FRAC 4294967295.0 // 2 ** 32 - 1
static int64_t gettimestamp(const uint32_t *data) {
uint32_t sec = mg_ntohl(data[0]), frac = mg_ntohl(data[1]);
if (sec) sec -= SNTP_TIME_OFFSET;
return ((int64_t) sec) * 1000 + (int64_t) (frac / SNTP_MAX_FRAC * 1000.0);
}
int64_t mg_sntp_parse(const unsigned char *buf, size_t len) {
int64_t res = -1;
@@ -18,10 +24,14 @@ int64_t mg_sntp_parse(const unsigned char *buf, size_t len) {
} else if (buf[1] == 0) {
MG_ERROR(("%s", "server sent a kiss of death"));
} else if (version == 4 || version == 3) {
uint32_t *data = (uint32_t *) &buf[40];
unsigned long seconds = mg_ntohl(data[0]) - SNTP_TIME_OFFSET;
unsigned long fracseconds = mg_ntohl(data[1]);
res = ((int64_t) seconds) * 1000 + (((int64_t) (fracseconds) * 1000) >> 32);
// int64_t ref = gettimestamp((uint32_t *) &buf[16]);
int64_t t0 = gettimestamp((uint32_t *) &buf[24]);
int64_t t1 = gettimestamp((uint32_t *) &buf[32]);
int64_t t2 = gettimestamp((uint32_t *) &buf[40]);
int64_t t3 = (int64_t) mg_millis();
int64_t delta = (t3 - t0) - (t2 - t1);
MG_DEBUG(("%lld %lld %lld %lld delta:%lld", t0, t1, t2, t3, delta));
res = t2 + delta / 2;
} else {
MG_ERROR(("unexpected version: %d", version));
}
@@ -49,8 +59,12 @@ void mg_sntp_request(struct mg_connection *c) {
if (c->is_resolving) {
MG_ERROR(("%lu wait until resolved", c->id));
} else {
uint64_t now = mg_millis();
uint8_t buf[48] = {0};
uint32_t *t = (uint32_t *) &buf[40];
buf[0] = (0 << 6) | (4 << 3) | 3;
t[0] = mg_htonl((uint32_t) (now / 1000) + SNTP_TIME_OFFSET);
t[1] = mg_htonl((uint32_t) ((now % 1000) / 1000.0 * SNTP_MAX_FRAC));
mg_send(c, buf, sizeof(buf));
}
}