> Date: Tue, 13 Jan 2015 19:36:58 +0100
> From: Christian Weisgerber <na...@mips.inka.de>
> 
> Here's a patch to switch the drift file from an unscaled frequency
> offset to ppm.  The latter format is compatible with that of ntp.org.
> This allows easy switching between ntpd daemons.  (I asked PHK and
> ntimed will probably not have a drift file at all.)
> 
> Old drift files are handled automagically.  All values greater than
> a threshold will be interpreted as ppm.  I picked 5e-3 (== 5000 ppm)
> as the cut-off value, because that's the maximum adjtime() can
> handle and you are unlikely to find a higher frequency offset.  In
> fact, the combination of ntp.org and ntp_adjtime() cannot correct
> offsets higher then 500 ppm.  Conversely, offsets smaller than
> 0.005 ppm (== 5e-9) are improbable.  This compatibility handling
> will be removed in a year.

Does this in any way force a write of the drift file or are you
relying on ntpd deciding that it has a better estimate of the drift somewhere 
in the next year?

> Index: ntpd.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/ntpd/ntpd.c,v
> retrieving revision 1.84
> diff -u -p -r1.84 ntpd.c
> --- ntpd.c    13 Jan 2015 02:28:56 -0000      1.84
> +++ ntpd.c    13 Jan 2015 18:21:49 -0000
> @@ -474,6 +474,8 @@ ntpd_settime(double d)
>       log_info("set local clock to %s (offset %fs)", buf, d);
>  }
>  
> +#define PPM_THRESHOLD        5e-3
> +
>  void
>  readfreq(void)
>  {
> @@ -494,9 +496,15 @@ readfreq(void)
>       if (adjfreq(NULL, &current) == -1)
>               log_warn("adjfreq failed");
>       else if (current == 0) {
> -             if (fscanf(fp, "%le", &d) == 1)
> +             if (fscanf(fp, "%lf", &d) == 1) {
> +                     if (d > PPM_THRESHOLD || d < -PPM_THRESHOLD)
> +                             /* drift file in ppm */
> +                             d /= 1e6;
> +                     else
> +                             log_debug("assuming unscaled frequency "
> +                                       "offset in drift file");
>                       ntpd_adjfreq(d, 0);
> -             else
> +             } else
>                       log_warnx("can't read %s", DRIFTFILE);
>       }
>       fclose(fp);
> @@ -505,8 +513,9 @@ readfreq(void)
>  int
>  writefreq(double d)
>  {
> -     int r;
>       FILE *fp;
> +     double ppm;
> +     int r;
>       static int warnonce = 1;
>  
>       fp = fopen(DRIFTFILE, "w");
> @@ -518,7 +527,8 @@ writefreq(double d)
>               return 0;
>       }
>  
> -     fprintf(fp, "%e\n", d);
> +     ppm = d * 1e6;
> +     fprintf(fp, "%.3f\n", ppm);
>       r = ferror(fp);
>       if (fclose(fp) != 0 || r != 0) {
>               if (warnonce) {
> -- 
> Christian "naddy" Weisgerber                          na...@mips.inka.de
> 
> 

Reply via email to