Nobody seemed to much care about my previous effort to get OpenBSD to
play nicely inside a suspended VM.
http://marc.info/?l=openbsd-misc&m=134324835209706&w=2

Instead of the kernel, this time I'm poking ntpd. To review, the
problem is if the VM host is suspended, the VM guest (OpenBSD) doesn't
get clock interrupts and therefore doesn't advance the clock. ntpd
quite futilely attempts to cope with this:

ntpd[15280]: adjusting local clock by 1396998.486806s
ntpd[15280]: adjusting local clock by 1396997.386122s

I'd like to add an option like -s that will jump the clock forward,
not just once, but whenever it falls too far behind. I called it -j.
If the clock is more than five seconds behind, we just set the time
instead of trying to skew towards it. Note that we never jump
backwards, that would be bad.

Index: ntp.c
===================================================================
RCS file: /cvs/src/usr.sbin/ntpd/ntp.c,v
retrieving revision 1.117
diff -u -p -r1.117 ntp.c
--- ntp.c       21 Sep 2011 15:41:30 -0000      1.117
+++ ntp.c       11 Aug 2013 16:16:32 -0000
@@ -580,6 +580,7 @@ priv_adjtime(void)
        int                       offset_cnt = 0, i = 0, j;
        struct ntp_offset       **offsets;
        double                    offset_median;
+       enum imsg_type            msgtype;
 
        TAILQ_FOREACH(p, &conf->ntp_peers, entry) {
                if (p->trustlevel < TRUSTLEVEL_BADPEER)
@@ -632,7 +633,11 @@ priv_adjtime(void)
        }
        conf->status.leap = offsets[i]->status.leap;
 
-       imsg_compose(ibuf_main, IMSG_ADJTIME, 0, 0, -1,
+       if (conf->jumptime && offset_median > 5.0)
+               msgtype = IMSG_JUMPTIME;
+       else
+               msgtype = IMSG_ADJTIME;
+       imsg_compose(ibuf_main, msgtype, 0, 0, -1,
            &offset_median, sizeof(offset_median));
 
        priv_adjfreq(offset_median);
Index: ntpd.c
===================================================================
RCS file: /cvs/src/usr.sbin/ntpd/ntpd.c,v
retrieving revision 1.69
diff -u -p -r1.69 ntpd.c
--- ntpd.c      19 Mar 2011 23:40:11 -0000      1.69
+++ ntpd.c      11 Aug 2013 16:12:09 -0000
@@ -73,7 +73,7 @@ usage(void)
 {
        extern char *__progname;
 
-       fprintf(stderr, "usage: %s [-dnSsv] [-f file]\n", __progname);
+       fprintf(stderr, "usage: %s [-djnSsv] [-f file]\n", __progname);
        exit(1);
 }
 
@@ -97,7 +97,7 @@ main(int argc, char *argv[])
 
        log_init(1);            /* log to stderr until daemonized */
 
-       while ((ch = getopt(argc, argv, "df:nsSv")) != -1) {
+       while ((ch = getopt(argc, argv, "df:jnsSv")) != -1) {
                switch (ch) {
                case 'd':
                        lconf.debug = 1;
@@ -105,6 +105,9 @@ main(int argc, char *argv[])
                case 'f':
                        conffile = optarg;
                        break;
+               case 'j':
+                       lconf.jumptime = 1;
+                       break;
                case 'n':
                        lconf.noaction = 1;
                        break;
@@ -295,6 +298,14 @@ dispatch_imsg(struct ntpd_conf *lconf)
                                fatalx("invalid IMSG_ADJFREQ received");
                        memcpy(&d, imsg.data, sizeof(d));
                        ntpd_adjfreq(d, 1);
+                       break;
+               case IMSG_JUMPTIME:
+                       if (imsg.hdr.len != IMSG_HEADER_SIZE + sizeof(d))
+                               fatalx("invalid IMSG_JUMPTIME received");
+                       if (!lconf->jumptime)
+                               break;
+                       memcpy(&d, imsg.data, sizeof(d));
+                       ntpd_settime(d);
                        break;
                case IMSG_SETTIME:
                        if (imsg.hdr.len != IMSG_HEADER_SIZE + sizeof(d))
Index: ntpd.h
===================================================================
RCS file: /cvs/src/usr.sbin/ntpd/ntpd.h,v
retrieving revision 1.107
diff -u -p -r1.107 ntpd.h
--- ntpd.h      30 Apr 2013 11:42:56 -0000      1.107
+++ ntpd.h      11 Aug 2013 16:11:40 -0000
@@ -178,6 +178,7 @@ struct ntpd_conf {
        struct ntp_freq                                 freq;
        u_int32_t                                       scale;
        u_int8_t                                        listen_all;
+       u_int8_t                                        jumptime;
        u_int8_t                                        settime;
        u_int8_t                                        debug;
        u_int8_t                                        noaction;
@@ -188,6 +189,7 @@ enum imsg_type {
        IMSG_NONE,
        IMSG_ADJTIME,
        IMSG_ADJFREQ,
+       IMSG_JUMPTIME,
        IMSG_SETTIME,
        IMSG_HOST_DNS
 };

Reply via email to