summaryrefslogtreecommitdiff
path: root/src/timesync/timesyncd-manager.c
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2018-04-30 22:37:02 +0900
committerYu Watanabe <watanabe.yu+github@gmail.com>2018-05-03 18:05:14 +0900
commit66086a4030e16e9a2c5dd48d5d6538a08cf7bfad (patch)
tree2367612b867e29c4bc2cdfb44c92205a905ccd6b /src/timesync/timesyncd-manager.c
parentc583dd564c2fd89edb785aa94e1869650732dbcb (diff)
downloadsystemd-66086a4030e16e9a2c5dd48d5d6538a08cf7bfad.tar.gz
timesync: save and expose NTP responce on bus
Diffstat (limited to 'src/timesync/timesyncd-manager.c')
-rw-r--r--src/timesync/timesyncd-manager.c60
1 files changed, 13 insertions, 47 deletions
diff --git a/src/timesync/timesyncd-manager.c b/src/timesync/timesyncd-manager.c
index 520e4e1f0f..4f639577ad 100644
--- a/src/timesync/timesyncd-manager.c
+++ b/src/timesync/timesyncd-manager.c
@@ -28,7 +28,6 @@
#include "network-util.h"
#include "ratelimit.h"
#include "socket-util.h"
-#include "sparse-endian.h"
#include "string-util.h"
#include "strv.h"
#include "time-util.h"
@@ -50,59 +49,18 @@
*/
#define NTP_MAX_ADJUST 0.4
-/* NTP protocol, packet header */
-#define NTP_LEAP_PLUSSEC 1
-#define NTP_LEAP_MINUSSEC 2
-#define NTP_LEAP_NOTINSYNC 3
-#define NTP_MODE_CLIENT 3
-#define NTP_MODE_SERVER 4
-#define NTP_FIELD_LEAP(f) (((f) >> 6) & 3)
-#define NTP_FIELD_VERSION(f) (((f) >> 3) & 7)
-#define NTP_FIELD_MODE(f) ((f) & 7)
-#define NTP_FIELD(l, v, m) (((l) << 6) | ((v) << 3) | (m))
-
/* Default of maximum acceptable root distance in microseconds. */
#define NTP_MAX_ROOT_DISTANCE (5 * USEC_PER_SEC)
/* Maximum number of missed replies before selecting another source. */
#define NTP_MAX_MISSED_REPLIES 2
-/*
- * "NTP timestamps are represented as a 64-bit unsigned fixed-point number,
- * in seconds relative to 0h on 1 January 1900."
- */
-#define OFFSET_1900_1970 UINT64_C(2208988800)
-
#define RETRY_USEC (30*USEC_PER_SEC)
#define RATELIMIT_INTERVAL_USEC (10*USEC_PER_SEC)
#define RATELIMIT_BURST 10
#define TIMEOUT_USEC (10*USEC_PER_SEC)
-struct ntp_ts {
- be32_t sec;
- be32_t frac;
-} _packed_;
-
-struct ntp_ts_short {
- be16_t sec;
- be16_t frac;
-} _packed_;
-
-struct ntp_msg {
- uint8_t field;
- uint8_t stratum;
- int8_t poll;
- int8_t precision;
- struct ntp_ts_short root_delay;
- struct ntp_ts_short root_dispersion;
- char refid[4];
- struct ntp_ts reference_time;
- struct ntp_ts origin_time;
- struct ntp_ts recv_time;
- struct ntp_ts trans_time;
-} _packed_;
-
static int manager_arm_timer(Manager *m, usec_t next);
static int manager_clock_watch_setup(Manager *m);
static int manager_listen_setup(Manager *m);
@@ -357,18 +315,18 @@ static int manager_adjust_clock(Manager *m, double offset, int leap_sec) {
(void) touch("/var/lib/systemd/timesync/clock");
(void) touch("/run/systemd/timesync/synchronized");
- m->drift_ppm = tmx.freq / 65536;
+ m->drift_freq = tmx.freq;
log_debug(" status : %04i %s\n"
" time now : %"PRI_TIME".%03"PRI_USEC"\n"
" constant : %"PRI_TIMEX"\n"
" offset : %+.3f sec\n"
- " freq offset : %+"PRI_TIMEX" (%i ppm)\n",
+ " freq offset : %+"PRI_TIMEX" (%+"PRI_TIMEX" ppm)\n",
tmx.status, tmx.status & STA_UNSYNC ? "unsync" : "sync",
tmx.time.tv_sec, tmx.time.tv_usec / NSEC_PER_MSEC,
tmx.constant,
(double)tmx.offset / NSEC_PER_SEC,
- tmx.freq, m->drift_ppm);
+ tmx.freq, tmx.freq / 65536);
return 0;
}
@@ -652,10 +610,18 @@ static int manager_receive_response(sd_event_source *source, int fd, uint32_t re
log_error_errno(r, "Failed to call clock_adjtime(): %m");
}
- log_debug("interval/delta/delay/jitter/drift " USEC_FMT "s/%+.3fs/%.3fs/%.3fs/%+ippm%s",
- m->poll_interval_usec / USEC_PER_SEC, offset, delay, m->samples_jitter, m->drift_ppm,
+ /* Save NTP response */
+ m->ntpmsg = ntpmsg;
+ m->origin_time = m->trans_time;
+ m->dest_time = *recv_time;
+ m->spike = spike;
+
+ log_debug("interval/delta/delay/jitter/drift " USEC_FMT "s/%+.3fs/%.3fs/%.3fs/%+"PRI_TIMEX"ppm%s",
+ m->poll_interval_usec / USEC_PER_SEC, offset, delay, m->samples_jitter, m->drift_freq / 65536,
spike ? " (ignored)" : "");
+ (void) sd_bus_emit_properties_changed(m->bus, "/org/freedesktop/timesync1", "org.freedesktop.timesync1.Manager", "NTPMessage", NULL);
+
if (!m->good) {
_cleanup_free_ char *pretty = NULL;