]> git.ipfire.org Git - thirdparty/ntp.git/commitdiff
[Bug 2015] Overriding sys_tick should recalculate sys_precision.
authorDave Hart <hart@ntp.org>
Sun, 18 Dec 2011 04:24:58 +0000 (04:24 +0000)
committerDave Hart <hart@ntp.org>
Sun, 18 Dec 2011 04:24:58 +0000 (04:24 +0000)
[Bug 2068] "tos ceiling" default and cap changed to 15.
Floor peer delay using system precision, as with jitter, reflecting
  inability to measure shorter intervals.

bk: 4eed6b1aAW-Z0QoSkP3iBo0pczczaQ

16 files changed:
ChangeLog
include/ntp.h
include/ntp_stdlib.h
include/ntp_unixtime.h
include/ntpd.h
libntp/systime.c
ntpd/complete.conf
ntpd/ntp_config.c
ntpd/ntp_control.c
ntpd/ntp_io.c
ntpd/ntp_loopfilter.c
ntpd/ntp_parser.c
ntpd/ntp_parser.y
ntpd/ntp_proto.c
ports/winnt/ntpd/nt_clockstuff.c
util/ntp-keygen.c

index 037ff3965345bea3a9626786ea7957b9dd9f0d9d..c8e79d359e9edfd58b94e89a45fce0c139ccc516 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,8 @@
+* [Bug 2015] Overriding sys_tick should recalculate sys_precision.
 * [Bug 2037] Fuzzed non-interpolated clock may decrease.
+* [Bug 2068] "tos ceiling" default and cap changed to 15.
+* Floor peer delay using system precision, as with jitter, reflecting
+  inability to measure shorter intervals.
 (4.2.7p240) 2011/12/15 Released by Harlan Stenn <stenn@ntp.org>
 * [Bug 2092] clock_select() selection jitter miscalculated.
 * [Bug 2093] Reintroduce smaller stratum factor to system peer metric.
index bb547aac06a4704db350c7822272aeb1eed8918f..9e3f928874781924d75ebeafaeaf6416a4bbbe0a 100644 (file)
@@ -696,7 +696,7 @@ struct pkt {
 #define PROTO_CALLDELAY                20
 #define PROTO_MINDISP          21
 #define PROTO_MAXDIST          22
-#define PROTO_ADJ              23
+       /* available            23 */
 #define        PROTO_MAXHOP            24
 #define        PROTO_BEACON            25
 #define        PROTO_ORPHAN            26
@@ -718,6 +718,7 @@ struct pkt {
 #define LOOP_FREQ              10      /* set initial frequency */
 #define LOOP_CODEC             11      /* set audio codec frequency */
 #define        LOOP_LEAP               12      /* insert leap after second 23:59 */
+#define        LOOP_TICK               13      /* sim. low precision clock */
 
 /*
  * Configuration items for the stats printer
index f7973b2d190489358398dc6087ba4156a7c51408..98b3fb7e2d20ecd8da34e5a7713ed4998fb0ca9a 100644 (file)
@@ -276,6 +276,7 @@ extern char *       ntp_strerror    (int e);
 
 /* systime.c */
 extern double  sys_tick;               /* tick size or time to read */
+extern double  measured_tick;          /* non-overridable sys_tick */
 extern double  sys_fuzz;               /* min clock read latency */
 
 /* version.c */
index 52e2991f8647248bbb8b059c1977263a2f5c1ef3..0fb738885bf735f1ae929e0cfa36200689509e87 100644 (file)
@@ -8,6 +8,8 @@
 
 #include "ntp_types.h" /* picks up time.h via ntp_machine.h */
 #include "ntp_calendar.h"
+#include "timespecops.h"
+#include "timevalops.h"
 
 #ifdef SIM
 #   define GETTIMEOFDAY(a, b) (node_gettime(&ntp_node, a))
index bf2ceb98ccd78ed80e9b4dcb66f1c363f1e3cf01..7a6026702609a85d9f5511426cbebf79e31bab83 100644 (file)
@@ -236,6 +236,7 @@ extern      void    poll_update     (struct peer *, u_char);
 extern void    clear           (struct peer *);
 extern void    clock_filter    (struct peer *, double, double, double);
 extern void    init_proto      (void);
+extern void    set_sys_tick_precision(double);
 extern void    proto_config    (int, u_long, double, sockaddr_u *);
 extern void    proto_clr_stats (void);
 
index b75eb2a4feba39db3549b53c3ba633f8b5213a9d..88429e491d9f5f90ad0a60a8efeccdd47543f70e 100644 (file)
 double sys_tick = 0;           /* tick size or time to read (s) */
 double sys_fuzz = 0;           /* min. time to read the clock (s) */
 long   sys_fuzz_nsec = 0;      /* min. time to read the clock (ns) */
+double measured_tick;          /* non-overridable sys_tick (s) */
 double sys_residual = 0;       /* adjustment residue (s) */
 time_stepped_callback  step_callback;
 
+#ifndef SIM
 static int lamport_violated;   /* clock was stepped back */
+#endif
 
 void
 set_sys_fuzz(
@@ -95,7 +98,8 @@ get_ostime(
        struct timespec *       tsp
        )
 {
-       int rc;
+       int     rc;
+       long    ticks;
 
 #if defined(HAVE_CLOCK_GETTIME)
        rc = clock_gettime(CLOCK_REALTIME, tsp);
@@ -113,6 +117,11 @@ get_ostime(
                        errno);
                exit(1);
        }
+
+       if (sys_tick > measured_tick) {
+               ticks = (long)((tsp->tv_nsec * 1e-9) / sys_tick);
+               tsp->tv_nsec = (long)(ticks * 1e9 * sys_tick);
+       }
 }
 
 
@@ -125,8 +134,7 @@ get_systime(
        )
 {
        static struct timespec  ts_prev;        /* prior os time */
-       static l_fp             lfp_prev;       /* prior pre-residual result */
-       static l_fp             lfp_prev_w_resid;/* prior result including sys_residual */
+       static l_fp             lfp_prev;       /* prior result */
        struct timespec ts;     /* seconds and nanoseconds */
        struct timespec ts_min; /* earliest permissible */
        struct timespec ts_lam; /* lamport fictional increment */
index 04f39fbc97c8c2916f95588b56f07e49ea653d96..7c9a251ef468fd8a3d994ba17e4d8c836d42a93b 100644 (file)
@@ -24,7 +24,7 @@ requestkey 12
 enable auth ntp monitor
 disable bclient calibrate kernel mode7
 tos beacon 3600 ceiling 16 cohort 0 floor 1 maxclock 10 maxdist 1.5 minclock 3 mindist 0.001 minsane 1 orphan 16 orphanwait 300
-tinker allan 1500 dispersion 15 freq 0 huffpuff 7200 panic 1000 step 0.128 stepout 900
+tinker allan 1500 dispersion 15 freq 0 huffpuff 7200 panic 1000 step 0.128 stepout 900 tick 0.01
 broadcastclient
 server 127.127.1.0 mode 4294967295 prefer true
 fudge 127.127.1.0 time1 0 time2 1.1 stratum 7 refid Abcd
index eecff179bbd583ae14d291a23c91a89cbdbdc348..eda00b4be923c955a97e9b811c8ccdb14b0925fc 100644 (file)
@@ -1942,12 +1942,14 @@ config_tos(
        config_tree *ptree
        )
 {
-       attr_val *tos;
-       int item;
+       attr_val *      tos;
+       int             item;
+       double          val;
 
        item = -1;      /* quiet warning */
        tos = HEAD_PFIFO(ptree->orphan_cmds);
        for (; tos != NULL; tos = tos->link) {
+               val = tos->value.d;
                switch(tos->attr) {
 
                default:
@@ -1955,6 +1957,12 @@ config_tos(
                        break;
 
                case T_Ceiling:
+                       if (val > STRATUM_UNSPEC - 1) {
+                               msyslog(LOG_WARNING,
+                                       "Using maximum tos ceiling %d, %g requested",
+                                       STRATUM_UNSPEC - 1, val);
+                               val = STRATUM_UNSPEC - 1;
+                       }
                        item = PROTO_CEILING;
                        break;
 
@@ -1998,7 +2006,7 @@ config_tos(
                        item = PROTO_BEACON;
                        break;
                }
-               proto_config(item, 0, tos->value.d, NULL);
+               proto_config(item, 0, val, NULL);
        }
 }
 
@@ -2580,6 +2588,10 @@ config_tinker(
                case T_Stepout:
                        item = LOOP_MINSTEP;
                        break;
+
+               case T_Tick:
+                       item = LOOP_TICK;
+                       break;
                }
                loop_config(item, tinker->value.d);
        }
@@ -3395,8 +3407,9 @@ config_vars(
                case T_Broadcastdelay:
                        proto_config(PROTO_BROADDELAY, 0, curr_var->value.d, NULL);
                        break;
+
                case T_Tick:
-                       proto_config(PROTO_ADJ, 0, curr_var->value.d, NULL);
+                       loop_config(LOOP_TICK, curr_var->value.d);
                        break;
 
                case T_Driftfile:
index 1b6bd5f6308e3d399107ae13f8c6c257b5ef70db..17456b1107a6a3a65e5d8f64c1b025a4108e5e20 100644 (file)
@@ -219,7 +219,8 @@ static const struct ctl_proc control_codes[] = {
 #define        CS_TIMERSTATS_RESET     85
 #define        CS_TIMER_OVERRUNS       86
 #define        CS_TIMER_XMTS           87
-#define        CS_MAX_NOAUTOKEY        CS_TIMER_XMTS
+#define        CS_FUZZ                 88
+#define        CS_MAX_NOAUTOKEY        CS_FUZZ
 #ifdef AUTOKEY
 #define        CS_FLAGS                (1 + CS_MAX_NOAUTOKEY)
 #define        CS_HOST                 (2 + CS_MAX_NOAUTOKEY)
@@ -413,6 +414,7 @@ static const struct ctl_var sys_var[] = {
        { CS_TIMERSTATS_RESET,  RO, "timerstats_reset" },/* 85 */
        { CS_TIMER_OVERRUNS,    RO, "timer_overruns" }, /* 86 */
        { CS_TIMER_XMTS,        RO, "timer_xmts" },     /* 87 */
+       { CS_FUZZ,              RO, "fuzz" },           /* 88 */
 #ifdef AUTOKEY
        { CS_FLAGS,     RO, "flags" },          /* 1 + CS_MAX_NOAUTOKEY */
        { CS_HOST,      RO, "host" },           /* 2 + CS_MAX_NOAUTOKEY */
@@ -679,7 +681,7 @@ int num_ctl_traps;
  * different than CTL_SST_TS_UNSPEC.
  */
 #ifdef REFCLOCK
-static u_char clocktypes[] = {
+static const u_char clocktypes[] = {
        CTL_SST_TS_NTP,         /* REFCLK_NONE (0) */
        CTL_SST_TS_LOCAL,       /* REFCLK_LOCALCLOCK (1) */
        CTL_SST_TS_UHF,         /* deprecated REFCLK_GPS_TRAK (2) */
@@ -2232,6 +2234,10 @@ ctl_putsys(
        case CS_TIMER_XMTS:
                ctl_putuint(sys_var[varid].text, timer_xmtcalls);
                break;
+
+       case CS_FUZZ:
+               ctl_putdbl(sys_var[varid].text, sys_fuzz * 1e3);
+               break;
 #ifdef AUTOKEY
        case CS_FLAGS:
                if (crypto_flags)
index f5f78b9f0aaf1b88606e1cf51d8f21f7e7c2a663..d8537be6ff9f0bdadd0f80ac265acf0ceb77c250 100644 (file)
@@ -3162,51 +3162,56 @@ fetch_timestamp(
        )
 {
 #ifdef USE_TIMESTAMP_CMSG
-       struct cmsghdr *cmsghdr;
+       struct cmsghdr *        cmsghdr;
+       struct timeval *        tvp;
+       long                    ticks;
+       double                  fuzz;
+       l_fp                    lfpfuzz;
+       l_fp                    nts;
+#ifdef DEBUG_TIMING
+       l_fp                    dts;
+#endif
 
        cmsghdr = CMSG_FIRSTHDR(msghdr);
        while (cmsghdr != NULL) {
                switch (cmsghdr->cmsg_type)
                {
                case SCM_TIMESTAMP:
-               {
-                       struct timeval *tvp;
-                       double dtemp;
-                       l_fp nts;
-
                        tvp = (struct timeval *)CMSG_DATA(cmsghdr);
+                       if (sys_tick > measured_tick &&
+                           sys_tick > 1e-6) {
+                               ticks = (long)((tvp->tv_usec * 1e-6) /
+                                       sys_tick);
+                               tvp->tv_usec = (long)(ticks * 1e6 *
+                                                     sys_tick);
+                       }
                        DPRINTF(4, ("fetch_timestamp: system network time stamp: %ld.%06ld\n",
                                    tvp->tv_sec, tvp->tv_usec));
-                       nts.l_i = tvp->tv_sec + JAN_1970;
-                       dtemp = (tvp->tv_usec 
-                                + (ntp_random() * 2. / FRAC)) / 1e6;
-                       nts.l_uf = (u_int32)(dtemp * FRAC);
+                       timeval_abstolfp(&nts, tvp);
+                       fuzz = ntp_random() * 2. / FRAC * sys_fuzz;
+                       DTOLFP(fuzz, &lfpfuzz);
+                       L_ADD(&nts, &lfpfuzz);
 #ifdef DEBUG_TIMING
-                       {
-                               l_fp dts;
-
-                               dts = ts;
-                               L_SUB(&dts, &nts);
-                               collect_timing(rb, 
-                                              "input processing delay",
-                                              1, &dts);
-                               DPRINTF(4, ("fetch_timestamp: timestamp delta: %s (incl. prec fuzz)\n",
-                                           lfptoa(&dts, 9)));
-                       }
-#endif
+                       dts = ts;
+                       L_SUB(&dts, &nts);
+                       collect_timing(rb, "input processing delay", 1,
+                                      &dts);
+                       DPRINTF(4, ("fetch_timestamp: timestamp delta: %s (incl. prec fuzz)\n",
+                                   lfptoa(&dts, 9)));
+#endif /* DEBUG_TIMING */
                        ts = nts;  /* network time stamp */
                        break;
-               }
+
                default:
                        DPRINTF(4, ("fetch_timestamp: skipping control message 0x%x\n",
                                    cmsghdr->cmsg_type));
                }
                cmsghdr = CMSG_NXTHDR(msghdr, cmsghdr);
        }
-#endif
+#endif /* USE_TIMESTAMP_CMSG */
        return ts;
 }
-#endif
+#endif /* HAVE_TIMESTAMP */
 
 
 /*
index 0ca46e17cc9eaf4b05ac6640bc2bb13de4f0b107..a6d9b3d393d799be1bc7183aee6ac26bb421c30b 100644 (file)
@@ -1060,7 +1060,11 @@ loop_config(
                        clock_minstep = freq; 
                break;
 
-       case LOOP_LEAP:         /* not used */
+       case LOOP_TICK:         /* tick increment (tick) */
+               set_sys_tick_precision(freq);
+               break;
+
+       case LOOP_LEAP:         /* not used, fall through */
        default:
                msyslog(LOG_NOTICE,
                    "loop_config: unsupported option %d", item);
index fe95991c8baa8cbace53902d3291552eb317499a..13fa5db0165efbb9c770acd6d42a80deeb81e95c 100644 (file)
@@ -749,18 +749,18 @@ union yyalloc
 #endif
 
 /* YYFINAL -- State number of the termination state.  */
-#define YYFINAL  195
+#define YYFINAL  196
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   560
+#define YYLAST   584
 
 /* YYNTOKENS -- Number of terminals.  */
 #define YYNTOKENS  189
 /* YYNNTS -- Number of nonterminals.  */
 #define YYNNTS  100
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  297
+#define YYNRULES  298
 /* YYNRULES -- Number of states.  */
-#define YYNSTATES  398
+#define YYNSTATES  399
 
 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
 #define YYUNDEFTOK  2
@@ -843,16 +843,16 @@ static const yytype_uint16 yyprhs[] =
      401,   404,   407,   409,   411,   413,   415,   417,   419,   422,
      425,   428,   430,   432,   434,   436,   438,   440,   442,   444,
      446,   448,   450,   453,   456,   458,   461,   463,   465,   467,
-     469,   471,   473,   475,   477,   479,   482,   485,   488,   492,
-     494,   497,   500,   503,   506,   510,   513,   515,   517,   519,
-     521,   523,   525,   527,   529,   531,   533,   536,   537,   542,
-     544,   545,   546,   549,   552,   555,   558,   560,   562,   566,
-     570,   572,   574,   576,   578,   580,   582,   584,   586,   588,
-     591,   594,   596,   598,   600,   602,   604,   606,   608,   610,
-     613,   615,   618,   620,   622,   624,   630,   633,   635,   638,
-     640,   642,   644,   646,   648,   650,   656,   658,   662,   665,
-     669,   671,   673,   676,   678,   684,   689,   693,   696,   698,
-     705,   709,   712,   716,   718,   720,   722,   724
+     469,   471,   473,   475,   477,   479,   481,   484,   487,   490,
+     494,   496,   499,   502,   505,   508,   512,   515,   517,   519,
+     521,   523,   525,   527,   529,   531,   533,   535,   538,   539,
+     544,   546,   547,   548,   551,   554,   557,   560,   562,   564,
+     568,   572,   574,   576,   578,   580,   582,   584,   586,   588,
+     590,   593,   596,   598,   600,   602,   604,   606,   608,   610,
+     612,   615,   617,   620,   622,   624,   626,   632,   635,   637,
+     640,   642,   644,   646,   648,   650,   652,   658,   660,   664,
+     667,   671,   673,   675,   678,   680,   686,   691,   695,   698,
+     700,   707,   711,   714,   718,   720,   722,   724,   726
 };
 
 /* YYRHS -- A `-1'-separated list of the rules' RHS.  */
@@ -905,32 +905,32 @@ static const yytype_int16 yyrhs[] =
       66,    -1,    98,    -1,   113,    -1,    97,    -1,   143,    -1,
      156,   246,    -1,   246,   247,    -1,   247,    -1,   248,   274,
       -1,     5,    -1,    30,    -1,    46,    -1,    49,    -1,   118,
-      -1,   145,    -1,   146,    -1,   260,    -1,   264,    -1,   250,
-     274,    -1,   251,   148,    -1,   252,   148,    -1,    57,   148,
-     192,    -1,    36,    -1,    32,   253,    -1,    76,   258,    -1,
-     121,   271,    -1,   140,   254,    -1,   158,   196,   256,    -1,
-     161,   267,    -1,    15,    -1,   106,    -1,   151,    -1,    51,
-      -1,    72,    -1,   123,    -1,   130,    -1,    77,    -1,   138,
-      -1,   148,    -1,   148,    31,    -1,    -1,   148,   184,   148,
-     255,    -1,    26,    -1,    -1,    -1,   256,   257,    -1,   125,
-      58,    -1,    59,   196,    -1,   258,   259,    -1,   259,    -1,
-     148,    -1,   261,   263,   262,    -1,   261,   263,   148,    -1,
-      59,    -1,   102,    -1,     4,    -1,    62,    -1,    64,    -1,
-     169,    -1,    75,    -1,    52,    -1,    33,    -1,   135,   265,
-      -1,   265,   266,    -1,   266,    -1,     6,    -1,     7,    -1,
-      24,    -1,    61,    -1,    89,    -1,   149,    -1,   154,    -1,
-     267,    58,    -1,    58,    -1,   268,   269,    -1,   269,    -1,
-      58,    -1,   270,    -1,   185,    58,    34,    58,   186,    -1,
-     271,   148,    -1,   148,    -1,   272,   195,    -1,   195,    -1,
-      58,    -1,   159,    -1,    37,    -1,    58,    -1,    31,    -1,
-     276,   187,   277,   280,   188,    -1,   174,    -1,   277,   278,
-     173,    -1,   278,   173,    -1,   279,   184,   274,    -1,   175,
-      -1,   176,    -1,   280,   281,    -1,   281,    -1,   283,   187,
-     282,   284,   188,    -1,   177,   184,   274,   173,    -1,   139,
-     184,   195,    -1,   284,   285,    -1,   285,    -1,   178,   184,
-     274,   187,   286,   188,    -1,   286,   287,   173,    -1,   287,
-     173,    -1,   288,   184,   274,    -1,   179,    -1,   180,    -1,
-     181,    -1,   182,    -1,   183,    -1
+      -1,   145,    -1,   146,    -1,   151,    -1,   260,    -1,   264,
+      -1,   250,   274,    -1,   251,   148,    -1,   252,   148,    -1,
+      57,   148,   192,    -1,    36,    -1,    32,   253,    -1,    76,
+     258,    -1,   121,   271,    -1,   140,   254,    -1,   158,   196,
+     256,    -1,   161,   267,    -1,    15,    -1,   106,    -1,   151,
+      -1,    51,    -1,    72,    -1,   123,    -1,   130,    -1,    77,
+      -1,   138,    -1,   148,    -1,   148,    31,    -1,    -1,   148,
+     184,   148,   255,    -1,    26,    -1,    -1,    -1,   256,   257,
+      -1,   125,    58,    -1,    59,   196,    -1,   258,   259,    -1,
+     259,    -1,   148,    -1,   261,   263,   262,    -1,   261,   263,
+     148,    -1,    59,    -1,   102,    -1,     4,    -1,    62,    -1,
+      64,    -1,   169,    -1,    75,    -1,    52,    -1,    33,    -1,
+     135,   265,    -1,   265,   266,    -1,   266,    -1,     6,    -1,
+       7,    -1,    24,    -1,    61,    -1,    89,    -1,   149,    -1,
+     154,    -1,   267,    58,    -1,    58,    -1,   268,   269,    -1,
+     269,    -1,    58,    -1,   270,    -1,   185,    58,    34,    58,
+     186,    -1,   271,   148,    -1,   148,    -1,   272,   195,    -1,
+     195,    -1,    58,    -1,   159,    -1,    37,    -1,    58,    -1,
+      31,    -1,   276,   187,   277,   280,   188,    -1,   174,    -1,
+     277,   278,   173,    -1,   278,   173,    -1,   279,   184,   274,
+      -1,   175,    -1,   176,    -1,   280,   281,    -1,   281,    -1,
+     283,   187,   282,   284,   188,    -1,   177,   184,   274,   173,
+      -1,   139,   184,   195,    -1,   284,   285,    -1,   285,    -1,
+     178,   184,   274,   187,   286,   188,    -1,   286,   287,   173,
+      -1,   287,   173,    -1,   288,   184,   274,    -1,   179,    -1,
+     180,    -1,   181,    -1,   182,    -1,   183,    -1
 };
 
 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
@@ -956,16 +956,16 @@ static const yytype_uint16 yyrline[] =
      942,   944,   949,   950,   954,   955,   956,   957,   965,   967,
      972,   977,   985,   987,  1004,  1005,  1006,  1007,  1008,  1009,
     1013,  1014,  1022,  1027,  1032,  1040,  1045,  1046,  1047,  1048,
-    1049,  1050,  1051,  1060,  1061,  1062,  1069,  1076,  1092,  1111,
-    1116,  1118,  1120,  1122,  1124,  1131,  1136,  1137,  1138,  1142,
-    1143,  1144,  1145,  1149,  1150,  1154,  1161,  1171,  1180,  1185,
-    1187,  1192,  1193,  1201,  1203,  1211,  1216,  1224,  1249,  1256,
-    1266,  1267,  1271,  1272,  1273,  1274,  1278,  1279,  1280,  1284,
-    1289,  1294,  1302,  1303,  1304,  1305,  1306,  1307,  1308,  1318,
-    1323,  1331,  1336,  1344,  1346,  1350,  1355,  1360,  1368,  1373,
-    1381,  1390,  1391,  1395,  1396,  1405,  1423,  1427,  1432,  1440,
-    1445,  1446,  1450,  1455,  1463,  1468,  1473,  1478,  1483,  1491,
-    1496,  1501,  1509,  1514,  1515,  1516,  1517,  1518
+    1049,  1050,  1051,  1052,  1061,  1062,  1063,  1070,  1077,  1093,
+    1112,  1117,  1119,  1121,  1123,  1125,  1132,  1137,  1138,  1139,
+    1143,  1144,  1145,  1146,  1150,  1151,  1155,  1162,  1172,  1181,
+    1186,  1188,  1193,  1194,  1202,  1204,  1212,  1217,  1225,  1250,
+    1257,  1267,  1268,  1272,  1273,  1274,  1275,  1279,  1280,  1281,
+    1285,  1290,  1295,  1303,  1304,  1305,  1306,  1307,  1308,  1309,
+    1319,  1324,  1332,  1337,  1345,  1347,  1351,  1356,  1361,  1369,
+    1374,  1382,  1391,  1392,  1396,  1397,  1406,  1424,  1428,  1433,
+    1441,  1446,  1447,  1451,  1456,  1464,  1469,  1474,  1479,  1484,
+    1492,  1497,  1502,  1510,  1515,  1516,  1517,  1518,  1519
 };
 #endif
 
@@ -1093,16 +1093,16 @@ static const yytype_uint16 yyr1[] =
      237,   237,   238,   238,   239,   239,   239,   239,   240,   240,
      241,   241,   242,   242,   243,   243,   243,   243,   243,   243,
      244,   244,   245,   246,   246,   247,   248,   248,   248,   248,
-     248,   248,   248,   249,   249,   249,   249,   249,   249,   249,
-     249,   249,   249,   249,   249,   249,   250,   250,   250,   251,
-     251,   251,   251,   252,   252,   253,   253,   253,   254,   255,
-     255,   256,   256,   257,   257,   258,   258,   259,   260,   260,
-     261,   261,   262,   262,   262,   262,   263,   263,   263,   264,
-     265,   265,   266,   266,   266,   266,   266,   266,   266,   267,
-     267,   268,   268,   269,   269,   270,   271,   271,   272,   272,
-     273,   273,   273,   274,   274,   275,   276,   277,   277,   278,
-     279,   279,   280,   280,   281,   282,   283,   284,   284,   285,
-     286,   286,   287,   288,   288,   288,   288,   288
+     248,   248,   248,   248,   249,   249,   249,   249,   249,   249,
+     249,   249,   249,   249,   249,   249,   249,   250,   250,   250,
+     251,   251,   251,   251,   252,   252,   253,   253,   253,   254,
+     255,   255,   256,   256,   257,   257,   258,   258,   259,   260,
+     260,   261,   261,   262,   262,   262,   262,   263,   263,   263,
+     264,   265,   265,   266,   266,   266,   266,   266,   266,   266,
+     267,   267,   268,   268,   269,   269,   270,   271,   271,   272,
+     272,   273,   273,   273,   274,   274,   275,   276,   277,   277,
+     278,   279,   279,   280,   280,   281,   282,   283,   284,   284,
+     285,   286,   286,   287,   288,   288,   288,   288,   288
 };
 
 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
@@ -1128,16 +1128,16 @@ static const yytype_uint8 yyr2[] =
        2,     2,     1,     1,     1,     1,     1,     1,     2,     2,
        2,     1,     1,     1,     1,     1,     1,     1,     1,     1,
        1,     1,     2,     2,     1,     2,     1,     1,     1,     1,
-       1,     1,     1,     1,     1,     2,     2,     2,     3,     1,
-       2,     2,     2,     2,     3,     2,     1,     1,     1,     1,
-       1,     1,     1,     1,     1,     1,     2,     0,     4,     1,
-       0,     0,     2,     2,     2,     2,     1,     1,     3,     3,
-       1,     1,     1,     1,     1,     1,     1,     1,     1,     2,
-       2,     1,     1,     1,     1,     1,     1,     1,     1,     2,
-       1,     2,     1,     1,     1,     5,     2,     1,     2,     1,
-       1,     1,     1,     1,     1,     5,     1,     3,     2,     3,
-       1,     1,     2,     1,     5,     4,     3,     2,     1,     6,
-       3,     2,     3,     1,     1,     1,     1,     1
+       1,     1,     1,     1,     1,     1,     2,     2,     2,     3,
+       1,     2,     2,     2,     2,     3,     2,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     2,     0,     4,
+       1,     0,     0,     2,     2,     2,     2,     1,     1,     3,
+       3,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       2,     2,     1,     1,     1,     1,     1,     1,     1,     1,
+       2,     1,     2,     1,     1,     1,     5,     2,     1,     2,
+       1,     1,     1,     1,     1,     1,     5,     1,     3,     2,
+       3,     1,     1,     2,     1,     5,     4,     3,     2,     1,
+       6,     3,     2,     3,     1,     1,     1,     1,     1
 };
 
 /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
@@ -1145,123 +1145,123 @@ static const yytype_uint8 yyr2[] =
    means the default is an error.  */
 static const yytype_uint16 yydefact[] =
 {
-       0,     0,     0,    23,    57,   216,     0,    69,     0,     0,
-     227,     0,   209,     0,     0,   219,     0,   240,     0,     0,
-     220,     0,   223,    24,     0,     0,     0,   241,   217,     0,
-      22,     0,   221,    21,   222,     0,     0,     0,     0,   224,
-      20,     0,     0,     0,   218,     0,     0,     0,     0,     0,
-      55,    56,   276,     0,     2,     0,     7,     0,     8,     0,
+       0,     0,     0,    23,    57,   217,     0,    69,     0,     0,
+     228,     0,   210,     0,     0,   220,     0,   241,     0,     0,
+     221,     0,   224,    24,     0,     0,     0,   242,   218,     0,
+      22,     0,   222,    21,   223,     0,     0,     0,     0,   225,
+      20,     0,     0,     0,   219,     0,     0,     0,     0,     0,
+      55,    56,   277,     0,     2,     0,     7,     0,     8,     0,
        9,    10,    13,    11,    12,    14,    15,    16,    17,     0,
-       0,     0,   203,     0,   204,    18,     0,     5,    60,    61,
+       0,     0,   204,     0,   205,    18,     0,     5,    60,    61,
       62,   184,   185,   186,   187,   190,   188,   189,   191,   179,
-     181,   182,   183,   151,   152,   153,   124,   149,     0,   225,
-     210,   178,    99,   100,   101,   102,   106,   103,   104,   105,
+     181,   182,   183,   151,   152,   153,   124,   149,     0,   226,
+     211,   178,    99,   100,   101,   102,   106,   103,   104,   105,
      107,    28,    29,    27,     0,    25,     0,     6,    63,    64,
-     237,   211,   236,   269,    58,   157,   158,   159,   160,   161,
-     162,   163,   164,   125,   155,     0,    59,    68,   267,   212,
-      65,   252,   253,   254,   255,   256,   257,   258,   249,   251,
-     132,    28,    29,   132,   132,    25,    66,     0,   213,    94,
-      98,    95,   196,   197,   198,   199,   200,   201,   202,   192,
-     194,     0,    89,    84,     0,    85,    93,    91,    92,    90,
-      88,    86,    87,    78,    80,     0,     0,   231,   263,     0,
-      67,   262,   264,   260,   215,     1,     0,     4,    30,    54,
-     274,   273,   205,   206,   207,   248,   247,   246,     0,     0,
-      77,    73,    74,    75,    76,     0,    70,     0,   180,   148,
-     150,   226,    96,   174,   175,   176,   177,     0,     0,   172,
-     173,   165,   167,     0,     0,    26,   208,   235,   268,   154,
-     156,   266,   250,   128,   132,   132,   131,   126,     0,     0,
-      97,   193,   195,   272,   270,   271,    83,    79,    81,    82,
-     214,     0,   261,   259,     3,    19,   242,   243,   244,   239,
-     245,   238,   280,   281,     0,     0,     0,    72,    71,   116,
-     115,     0,   113,   114,     0,   108,   111,   112,   171,   170,
-     166,   168,   169,   134,   135,   136,   137,   138,   139,   140,
-     141,   142,   143,   144,   145,   146,   147,   133,   129,   130,
-     132,   230,     0,     0,   232,     0,    36,    37,    38,    53,
-      46,    48,    47,    50,    39,    40,    41,    42,    49,    51,
-      43,    31,    32,    35,    33,     0,    34,     0,     0,     0,
-       0,   283,     0,   278,     0,   109,   123,   119,   121,   117,
-     118,   120,   122,   110,   127,   229,   228,   234,   233,     0,
-      44,    45,    52,     0,   277,   275,   282,     0,   279,   265,
-     286,     0,     0,     0,     0,     0,   288,     0,     0,   284,
-     287,   285,     0,     0,   293,   294,   295,   296,   297,     0,
-       0,     0,   289,     0,   291,     0,   290,   292
+     238,   212,   237,   270,    58,   157,   158,   159,   160,   161,
+     162,   163,   164,   125,   155,     0,    59,    68,   268,   213,
+      65,   253,   254,   255,   256,   257,   258,   259,   250,   252,
+     132,    28,    29,   132,   132,    25,    66,     0,   214,    94,
+      98,    95,   196,   197,   198,   199,   200,   201,   202,   203,
+     192,   194,     0,    89,    84,     0,    85,    93,    91,    92,
+      90,    88,    86,    87,    78,    80,     0,     0,   232,   264,
+       0,    67,   263,   265,   261,   216,     1,     0,     4,    30,
+      54,   275,   274,   206,   207,   208,   249,   248,   247,     0,
+       0,    77,    73,    74,    75,    76,     0,    70,     0,   180,
+     148,   150,   227,    96,   174,   175,   176,   177,     0,     0,
+     172,   173,   165,   167,     0,     0,    26,   209,   236,   269,
+     154,   156,   267,   251,   128,   132,   132,   131,   126,     0,
+       0,    97,   193,   195,   273,   271,   272,    83,    79,    81,
+      82,   215,     0,   262,   260,     3,    19,   243,   244,   245,
+     240,   246,   239,   281,   282,     0,     0,     0,    72,    71,
+     116,   115,     0,   113,   114,     0,   108,   111,   112,   171,
+     170,   166,   168,   169,   134,   135,   136,   137,   138,   139,
+     140,   141,   142,   143,   144,   145,   146,   147,   133,   129,
+     130,   132,   231,     0,     0,   233,     0,    36,    37,    38,
+      53,    46,    48,    47,    50,    39,    40,    41,    42,    49,
+      51,    43,    31,    32,    35,    33,     0,    34,     0,     0,
+       0,     0,   284,     0,   279,     0,   109,   123,   119,   121,
+     117,   118,   120,   122,   110,   127,   230,   229,   235,   234,
+       0,    44,    45,    52,     0,   278,   276,   283,     0,   280,
+     266,   287,     0,     0,     0,     0,     0,   289,     0,     0,
+     285,   288,   286,     0,     0,   294,   295,   296,   297,   298,
+       0,     0,     0,   290,     0,   292,     0,   291,   293
 };
 
 /* YYDEFGOTO[NTERM-NUM].  */
 static const yytype_int16 yydefgoto[] =
 {
-      -1,    53,    54,    55,    56,    57,   123,   115,   116,   265,
-     331,   332,   333,   334,   335,   336,   337,    58,    59,    60,
-      61,    80,   216,   217,    62,   183,   184,   185,   186,    63,
-     159,   110,   222,   285,   286,   287,   353,    64,   243,   307,
-      96,    97,    98,   133,   134,   135,    65,   231,   232,   233,
-     234,    66,    89,    90,    91,    92,    67,   169,   170,   171,
-      68,    69,    70,    71,   100,   158,   356,   260,   314,   121,
-     122,    72,    73,   271,   208,    74,   148,   149,   194,   190,
-     191,   192,   139,   124,   256,   202,    75,    76,   274,   275,
-     276,   340,   341,   372,   342,   375,   376,   389,   390,   391
+      -1,    53,    54,    55,    56,    57,   123,   115,   116,   266,
+     332,   333,   334,   335,   336,   337,   338,    58,    59,    60,
+      61,    80,   217,   218,    62,   184,   185,   186,   187,    63,
+     159,   110,   223,   286,   287,   288,   354,    64,   244,   308,
+      96,    97,    98,   133,   134,   135,    65,   232,   233,   234,
+     235,    66,    89,    90,    91,    92,    67,   170,   171,   172,
+      68,    69,    70,    71,   100,   158,   357,   261,   315,   121,
+     122,    72,    73,   272,   209,    74,   148,   149,   195,   191,
+     192,   193,   139,   124,   257,   203,    75,    76,   275,   276,
+     277,   341,   342,   373,   343,   376,   377,   390,   391,   392
 };
 
 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
    STATE-NUM.  */
-#define YYPACT_NINF -170
+#define YYPACT_NINF -171
 static const yytype_int16 yypact[] =
 {
-      12,  -144,   -20,  -170,  -170,  -170,   -16,  -170,   123,     8,
-     -98,   123,  -170,   -11,    -7,  -170,   -96,  -170,   -95,   -94,
-    -170,   -91,  -170,  -170,    -7,   467,    -7,  -170,  -170,   -72,
-    -170,   -71,  -170,  -170,  -170,    -3,    54,    40,    27,  -170,
-    -170,   -62,   -11,   -61,  -170,    19,   419,   -58,   -53,    33,
-    -170,  -170,  -170,    96,   178,   -75,  -170,    -7,  -170,    -7,
-    -170,  -170,  -170,  -170,  -170,  -170,  -170,  -170,  -170,    39,
-     -49,   -48,  -170,   -13,  -170,  -170,   -83,  -170,  -170,  -170,
-     241,  -170,  -170,  -170,  -170,  -170,  -170,  -170,  -170,   123,
-    -170,  -170,  -170,  -170,  -170,  -170,     8,  -170,    49,    80,
-    -170,   123,  -170,  -170,  -170,  -170,  -170,  -170,  -170,  -170,
-    -170,  -170,  -170,  -170,   264,  -170,   -32,   332,  -170,  -170,
-    -170,   -91,  -170,  -170,    -7,  -170,  -170,  -170,  -170,  -170,
-    -170,  -170,  -170,   467,  -170,    61,    -7,  -170,  -170,   -25,
-    -170,  -170,  -170,  -170,  -170,  -170,  -170,  -170,    54,  -170,
-    -170,   100,   102,  -170,  -170,    47,  -170,   -39,  -170,   -11,
-    -170,  -170,  -170,  -170,  -170,  -170,  -170,  -170,  -170,    19,
-    -170,    39,  -170,  -170,   -21,  -170,  -170,  -170,  -170,  -170,
-    -170,  -170,  -170,   419,  -170,    95,    39,  -170,  -170,    97,
-     -53,  -170,  -170,  -170,    99,  -170,   -12,  -170,  -170,  -170,
-    -170,  -170,  -170,  -170,  -170,  -170,  -170,  -170,    10,  -140,
-    -170,  -170,  -170,  -170,  -170,   101,  -170,    14,  -170,  -170,
-    -170,  -170,   195,  -170,  -170,  -170,  -170,    18,   109,  -170,
-    -170,   264,  -170,    39,   -21,  -170,  -170,  -170,  -170,  -170,
-    -170,  -170,  -170,   311,  -170,  -170,   311,   311,   -58,    30,
-    -170,  -170,  -170,  -170,  -170,  -170,  -170,  -170,  -170,  -170,
-     -50,   146,  -170,  -170,  -170,   390,  -170,  -170,  -170,  -170,
-    -170,  -170,  -170,  -170,   -93,     9,    -1,  -170,  -170,  -170,
-    -170,    36,  -170,  -170,     3,  -170,  -170,  -170,  -170,  -170,
-    -170,  -170,  -170,  -170,  -170,  -170,  -170,  -170,  -170,  -170,
-    -170,  -170,  -170,  -170,  -170,  -170,  -170,  -170,   311,   311,
-    -170,   164,   -58,   143,  -170,   144,  -170,  -170,  -170,  -170,
-    -170,  -170,  -170,  -170,  -170,  -170,  -170,  -170,  -170,  -170,
-    -170,  -170,  -170,  -170,  -170,   -43,  -170,    57,    31,    38,
-    -109,  -170,    29,  -170,    39,  -170,  -170,  -170,  -170,  -170,
-    -170,  -170,  -170,  -170,   311,  -170,  -170,  -170,  -170,    32,
-    -170,  -170,  -170,    -7,  -170,  -170,  -170,    42,  -170,  -170,
-    -170,    43,    44,    39,    48,  -156,  -170,    51,    39,  -170,
-    -170,  -170,    41,    15,  -170,  -170,  -170,  -170,  -170,    60,
-      58,    50,  -170,    65,  -170,    39,  -170,  -170
+      12,  -142,   -26,  -171,  -171,  -171,   -23,  -171,   123,     8,
+    -112,   123,  -171,   136,   -41,  -171,  -110,  -171,   -96,   -94,
+    -171,   -87,  -171,  -171,   -41,   244,   -41,  -171,  -171,   -83,
+    -171,   -75,  -171,  -171,  -171,    18,    43,    40,    19,  -171,
+    -171,   -69,   136,   -66,  -171,    48,   443,   -65,   -48,    27,
+    -171,  -171,  -171,    86,   202,   -86,  -171,   -41,  -171,   -41,
+    -171,  -171,  -171,  -171,  -171,  -171,  -171,  -171,  -171,   -16,
+     -58,   -57,  -171,   -13,  -171,  -171,   -89,  -171,  -171,  -171,
+     191,  -171,  -171,  -171,  -171,  -171,  -171,  -171,  -171,   123,
+    -171,  -171,  -171,  -171,  -171,  -171,     8,  -171,    41,    69,
+    -171,   123,  -171,  -171,  -171,  -171,  -171,  -171,  -171,  -171,
+    -171,  -171,  -171,  -171,   160,  -171,   -39,   356,  -171,  -171,
+    -171,   -87,  -171,  -171,   -41,  -171,  -171,  -171,  -171,  -171,
+    -171,  -171,  -171,   244,  -171,    53,   -41,  -171,  -171,   -33,
+    -171,  -171,  -171,  -171,  -171,  -171,  -171,  -171,    43,  -171,
+    -171,    93,    94,  -171,  -171,    39,  -171,   -56,  -171,   136,
+    -171,  -171,  -171,  -171,  -171,  -171,  -171,  -171,  -171,  -171,
+      48,  -171,   -16,  -171,  -171,   -21,  -171,  -171,  -171,  -171,
+    -171,  -171,  -171,  -171,   443,  -171,    71,   -16,  -171,  -171,
+      81,   -48,  -171,  -171,  -171,    83,  -171,   -30,  -171,  -171,
+    -171,  -171,  -171,  -171,  -171,  -171,  -171,  -171,  -171,    10,
+    -146,  -171,  -171,  -171,  -171,  -171,    87,  -171,    -4,  -171,
+    -171,  -171,  -171,    88,  -171,  -171,  -171,  -171,     5,    99,
+    -171,  -171,   160,  -171,   -16,   -21,  -171,  -171,  -171,  -171,
+    -171,  -171,  -171,  -171,   335,  -171,  -171,   335,   335,   -65,
+      16,  -171,  -171,  -171,  -171,  -171,  -171,  -171,  -171,  -171,
+    -171,   -50,   126,  -171,  -171,  -171,   414,  -171,  -171,  -171,
+    -171,  -171,  -171,  -171,  -171,  -120,    -8,   -17,  -171,  -171,
+    -171,  -171,    30,  -171,  -171,     3,  -171,  -171,  -171,  -171,
+    -171,  -171,  -171,  -171,  -171,  -171,  -171,  -171,  -171,  -171,
+    -171,  -171,  -171,  -171,  -171,  -171,  -171,  -171,  -171,   335,
+     335,  -171,   154,   -65,   124,  -171,   125,  -171,  -171,  -171,
+    -171,  -171,  -171,  -171,  -171,  -171,  -171,  -171,  -171,  -171,
+    -171,  -171,  -171,  -171,  -171,  -171,   -46,  -171,    36,     6,
+      14,  -131,  -171,     9,  -171,   -16,  -171,  -171,  -171,  -171,
+    -171,  -171,  -171,  -171,  -171,   335,  -171,  -171,  -171,  -171,
+      20,  -171,  -171,  -171,   -41,  -171,  -171,  -171,    21,  -171,
+    -171,  -171,    11,    29,   -16,    24,  -118,  -171,    32,   -16,
+    -171,  -171,  -171,    23,   217,  -171,  -171,  -171,  -171,  -171,
+      64,    46,    28,  -171,    49,  -171,   -16,  -171,  -171
 };
 
 /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int16 yypgoto[] =
 {
-    -170,  -170,  -170,   -44,  -170,  -170,   -14,   -36,  -170,  -170,
-    -170,  -170,  -170,  -170,  -170,  -170,  -170,  -170,  -170,  -170,
-    -170,  -170,  -170,  -170,  -170,  -170,    62,  -170,  -170,  -170,
-    -170,   -35,  -170,  -170,  -170,  -170,  -170,  -170,  -150,  -170,
-    -170,   148,  -170,  -170,   116,  -170,  -170,  -170,    20,  -170,
-    -170,  -170,   242,   -70,  -170,  -170,  -170,  -170,    83,  -170,
-    -170,  -170,  -170,  -170,  -170,  -170,  -170,  -170,  -170,  -170,
-     135,  -170,  -170,  -170,  -170,  -170,  -170,   112,  -170,  -170,
-      67,  -170,  -170,   235,    28,  -169,  -170,  -170,  -170,   -10,
-    -170,  -170,   -77,  -170,  -170,  -170,  -110,  -170,  -122,  -170
+    -171,  -171,  -171,   -49,  -171,  -171,   -14,   -36,  -171,  -171,
+    -171,  -171,  -171,  -171,  -171,  -171,  -171,  -171,  -171,  -171,
+    -171,  -171,  -171,  -171,  -171,  -171,    44,  -171,  -171,  -171,
+    -171,   -35,  -171,  -171,  -171,  -171,  -171,  -171,  -150,  -171,
+    -171,   129,  -171,  -171,    96,  -171,  -171,  -171,    -5,  -171,
+    -171,  -171,   221,   -43,  -171,  -171,  -171,  -171,    63,  -171,
+    -171,  -171,  -171,  -171,  -171,  -171,  -171,  -171,  -171,  -171,
+     114,  -171,  -171,  -171,  -171,  -171,  -171,    92,  -171,  -171,
+      57,  -171,  -171,   225,    22,  -170,  -171,  -171,  -171,   -20,
+    -171,  -171,   -81,  -171,  -171,  -171,  -122,  -171,  -132,  -171
 };
 
 /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
@@ -1271,124 +1271,128 @@ static const yytype_int16 yypgoto[] =
 #define YYTABLE_NINF -7
 static const yytype_int16 yytable[] =
 {
-     114,   155,   252,   246,   247,   188,   346,   160,   102,   312,
-     196,   187,   103,     1,   266,   360,   253,   259,    93,   218,
-     205,     2,   374,   154,   162,     3,     4,     5,   347,    77,
-     338,   218,   379,     6,     7,   272,   273,   254,    78,   206,
-       8,     9,    79,   198,    10,   199,   338,    11,    12,   163,
-      99,    13,   117,   118,   119,   140,   111,   120,   112,    14,
-     141,   142,   207,    15,   291,   164,   150,   104,   165,    16,
-     200,    17,   267,   236,   268,   313,   137,   138,   143,   365,
-      18,    19,   272,   273,    20,   156,   157,   161,    21,    22,
-     113,   193,    23,    24,   308,   309,   195,   201,   197,   203,
-     204,    94,   348,   151,   209,   152,    95,   220,   349,   105,
-     238,   221,    25,    26,    27,   144,   235,   106,    28,   240,
-     361,   107,   238,   241,   250,   350,   244,    29,   245,   248,
-      81,    30,   189,    31,    82,    32,    33,   166,   255,   108,
-      83,   113,    34,   145,   109,   249,    35,    36,    37,    38,
-      39,    40,    41,   258,    42,   261,    43,   263,   269,   277,
-     354,   264,   278,    44,   167,   168,   288,   289,    45,    46,
-      47,   351,    48,    49,   352,   368,    50,    51,   311,   270,
-     315,   153,   343,   344,   345,    -6,    52,     2,   113,    84,
-     355,     3,     4,     5,   384,   385,   386,   387,   388,     6,
-       7,   358,   359,   146,   377,   362,     8,     9,   147,   382,
-      10,   364,   310,    11,    12,   363,   367,    13,   369,   371,
-      85,    86,   374,   279,   381,    14,   397,   373,   383,    15,
-     280,   394,   378,   281,   395,    16,    87,    17,   396,   384,
-     385,   386,   387,   388,   219,   257,    18,    19,   392,   239,
-      20,   290,   251,   101,    21,    22,   237,   262,    23,    24,
-     242,   136,   292,   366,   339,   380,    88,   393,   210,   282,
-       0,     0,     0,     0,     0,     0,   357,     0,    25,    26,
-      27,     0,     0,     0,    28,     0,     0,     0,     0,   211,
-       0,     0,   212,    29,     0,     0,     0,    30,   283,    31,
-       0,    32,    33,     0,   223,   224,   225,   226,    34,     0,
-       0,     0,    35,    36,    37,    38,    39,    40,    41,     0,
-      42,     0,    43,     0,     0,     0,     0,     0,     0,    44,
-       0,     0,     0,     0,    45,    46,    47,     0,    48,    49,
-       0,     2,    50,    51,     0,     3,     4,     5,     0,   370,
-       0,    -6,    52,     6,     7,   293,     0,   284,     0,     0,
-       8,     9,     0,   294,    10,     0,     0,    11,    12,     0,
-     213,    13,   214,     0,     0,     0,     0,     0,   215,    14,
-       0,   295,   296,    15,   297,     0,     0,     0,     0,    16,
-     298,    17,     0,     0,     0,     0,     0,   227,   316,     0,
-      18,    19,     0,     0,    20,     0,   317,     0,    21,    22,
-       0,   228,    23,    24,     0,   299,   229,   230,   300,   301,
-       0,   302,   303,   304,     0,   305,     0,     0,     0,     0,
-       0,   172,    25,    26,    27,     0,     0,   173,    28,   174,
-     318,   319,     0,     0,     0,     0,     0,    29,     0,     0,
-       0,    30,     0,    31,     0,    32,    33,   320,     0,     0,
-       0,     0,    34,     0,   175,     0,    35,    36,    37,    38,
-      39,    40,    41,     0,    42,     0,    43,   306,   321,     0,
-       0,     0,     0,    44,   322,     0,   323,     0,    45,    46,
-      47,     0,    48,    49,     0,     0,    50,    51,     0,   324,
-       0,     0,     0,   176,     0,   177,    52,     0,     0,   178,
-       0,   179,     0,     0,   180,     0,   325,   326,     0,     0,
-     125,   126,   127,   128,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   181,   182,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   327,
-     129,   328,   130,     0,   131,     0,   329,     0,   132,     0,
-     330
+     114,   155,   253,   247,   248,   197,   347,   160,   339,   313,
+     189,   188,   361,     1,   267,   201,   254,   260,    93,   339,
+     206,     2,   111,   154,   112,     3,     4,     5,   348,   273,
+     274,    77,    78,     6,     7,    79,    99,   255,   117,   207,
+       8,     9,   202,   199,    10,   200,   219,    11,    12,   141,
+     142,    13,   118,   162,   119,   273,   274,   366,   219,    14,
+     375,   120,   208,    15,   292,   137,   150,   143,   237,    16,
+     380,    17,   268,   138,   269,   314,   140,   156,   163,   157,
+      18,    19,   161,   113,    20,   194,   196,   198,    21,    22,
+     204,   205,    23,    24,   164,   309,   310,   165,   210,   221,
+     222,    94,   349,   151,   144,   152,    95,   113,   350,   236,
+     239,   241,    25,    26,    27,   242,   280,   362,    28,   245,
+     246,   249,   239,   281,   251,   351,   282,    29,   250,   259,
+      81,    30,   145,    31,    82,    32,    33,   190,   256,   262,
+      83,   264,    34,   265,   279,   278,    35,    36,    37,    38,
+      39,    40,    41,   289,    42,   102,    43,   290,   270,   103,
+     316,   355,   283,    44,   312,   344,   166,   345,    45,    46,
+      47,   352,    48,    49,   353,   369,    50,    51,   346,   271,
+     356,   153,   359,   360,   363,    -6,    52,   365,   113,    84,
+     364,   284,   146,   167,   168,   374,   368,   147,   372,   169,
+     224,   225,   226,   227,   378,   382,   370,   375,   379,   383,
+     384,     2,   396,   311,   104,     3,     4,     5,   211,   395,
+      85,    86,   397,     6,     7,   220,   398,   291,   258,   240,
+       8,     9,   101,   252,    10,   238,    87,    11,    12,   212,
+     243,    13,   213,   385,   386,   387,   388,   389,   263,    14,
+     285,   136,   393,    15,   381,   340,   105,   293,   394,    16,
+     367,    17,     0,     0,   106,     0,    88,     0,   107,     0,
+      18,    19,     0,     0,    20,     0,     0,   358,    21,    22,
+       0,     0,    23,    24,     0,     0,   108,     0,     0,     0,
+       0,   109,     0,   228,     0,     0,     0,   125,   126,   127,
+     128,     0,    25,    26,    27,     0,     0,   229,    28,     0,
+       0,     0,   230,   231,     0,     0,     0,    29,     0,     0,
+     214,    30,   215,    31,     0,    32,    33,   129,   216,   130,
+       0,   131,    34,     0,     0,   132,    35,    36,    37,    38,
+      39,    40,    41,     0,    42,     0,    43,     0,     0,     0,
+     371,     0,     0,    44,     0,     0,     0,     0,    45,    46,
+      47,     0,    48,    49,     0,     2,    50,    51,     0,     3,
+       4,     5,     0,     0,     0,    -6,    52,     6,     7,   294,
+       0,     0,     0,     0,     8,     9,     0,   295,    10,     0,
+       0,    11,    12,     0,     0,    13,   385,   386,   387,   388,
+     389,     0,     0,    14,     0,   296,   297,    15,   298,     0,
+       0,     0,     0,    16,   299,    17,     0,     0,     0,     0,
+       0,     0,   317,     0,    18,    19,     0,     0,    20,     0,
+     318,     0,    21,    22,     0,     0,    23,    24,     0,   300,
+       0,     0,   301,   302,     0,   303,   304,   305,     0,   306,
+       0,     0,     0,     0,     0,   173,    25,    26,    27,     0,
+       0,   174,    28,   175,   319,   320,     0,     0,     0,     0,
+       0,    29,     0,     0,     0,    30,     0,    31,     0,    32,
+      33,   321,     0,     0,     0,     0,    34,     0,   176,     0,
+      35,    36,    37,    38,    39,    40,    41,     0,    42,     0,
+      43,   307,   322,     0,     0,     0,     0,    44,   323,     0,
+     324,     0,    45,    46,    47,     0,    48,    49,     0,     0,
+      50,    51,     0,   325,     0,     0,     0,   177,     0,   178,
+      52,     0,     0,   179,     0,   180,     0,     0,   181,     0,
+     326,   327,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   182,
+     183,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   328,     0,   329,     0,     0,     0,     0,
+     330,     0,     0,     0,   331
 };
 
 static const yytype_int16 yycheck[] =
 {
-      14,    37,   171,   153,   154,    58,     3,    42,    19,    59,
-      54,    47,    23,     1,     4,    58,    37,   186,    10,    89,
-      33,     9,   178,    37,     5,    13,    14,    15,    25,   173,
-     139,   101,   188,    21,    22,   175,   176,    58,    58,    52,
-      28,    29,    58,    57,    32,    59,   139,    35,    36,    30,
-     148,    39,   148,   148,   148,    58,    63,   148,    65,    47,
-       6,     7,    75,    51,   233,    46,    26,    78,    49,    57,
-      31,    59,    62,   117,    64,   125,   148,   148,    24,   188,
-      68,    69,   175,   176,    72,    58,   148,   148,    76,    77,
-     148,    58,    80,    81,   244,   245,     0,    58,   173,   148,
-     148,    93,    99,    63,   187,    65,    98,    58,   105,   120,
-     124,    31,   100,   101,   102,    61,   148,   128,   106,    58,
-     163,   132,   136,   148,   159,   122,    26,   115,    26,    82,
-       7,   119,   185,   121,    11,   123,   124,   118,   159,   150,
-      17,   148,   130,    89,   155,   184,   134,   135,   136,   137,
-     138,   139,   140,    58,   142,    58,   144,    58,   148,    58,
-     310,   173,   148,   151,   145,   146,   148,    58,   156,   157,
-     158,   168,   160,   161,   171,   344,   164,   165,   148,   169,
-      34,   141,   173,   184,   148,   173,   174,     9,   148,    66,
-      26,    13,    14,    15,   179,   180,   181,   182,   183,    21,
-      22,    58,    58,   149,   373,   148,    28,    29,   154,   378,
-      32,   173,   248,    35,    36,   184,   187,    39,   186,   177,
-      97,    98,   178,    28,   173,    47,   395,   184,   187,    51,
-      35,   173,   184,    38,   184,    57,   113,    59,   173,   179,
-     180,   181,   182,   183,    96,   183,    68,    69,   188,   133,
-      72,   231,   169,    11,    76,    77,   121,   190,    80,    81,
-     148,    26,   234,   340,   274,   375,   143,   389,    27,    74,
-      -1,    -1,    -1,    -1,    -1,    -1,   312,    -1,   100,   101,
-     102,    -1,    -1,    -1,   106,    -1,    -1,    -1,    -1,    48,
-      -1,    -1,    51,   115,    -1,    -1,    -1,   119,   103,   121,
-      -1,   123,   124,    -1,    40,    41,    42,    43,   130,    -1,
-      -1,    -1,   134,   135,   136,   137,   138,   139,   140,    -1,
-     142,    -1,   144,    -1,    -1,    -1,    -1,    -1,    -1,   151,
-      -1,    -1,    -1,    -1,   156,   157,   158,    -1,   160,   161,
-      -1,     9,   164,   165,    -1,    13,    14,    15,    -1,   363,
-      -1,   173,   174,    21,    22,    44,    -1,   162,    -1,    -1,
-      28,    29,    -1,    52,    32,    -1,    -1,    35,    36,    -1,
-     129,    39,   131,    -1,    -1,    -1,    -1,    -1,   137,    47,
-      -1,    70,    71,    51,    73,    -1,    -1,    -1,    -1,    57,
-      79,    59,    -1,    -1,    -1,    -1,    -1,   133,     8,    -1,
-      68,    69,    -1,    -1,    72,    -1,    16,    -1,    76,    77,
-      -1,   147,    80,    81,    -1,   104,   152,   153,   107,   108,
-      -1,   110,   111,   112,    -1,   114,    -1,    -1,    -1,    -1,
-      -1,    12,   100,   101,   102,    -1,    -1,    18,   106,    20,
-      50,    51,    -1,    -1,    -1,    -1,    -1,   115,    -1,    -1,
-      -1,   119,    -1,   121,    -1,   123,   124,    67,    -1,    -1,
-      -1,    -1,   130,    -1,    45,    -1,   134,   135,   136,   137,
-     138,   139,   140,    -1,   142,    -1,   144,   166,    88,    -1,
-      -1,    -1,    -1,   151,    94,    -1,    96,    -1,   156,   157,
-     158,    -1,   160,   161,    -1,    -1,   164,   165,    -1,   109,
-      -1,    -1,    -1,    84,    -1,    86,   174,    -1,    -1,    90,
-      -1,    92,    -1,    -1,    95,    -1,   126,   127,    -1,    -1,
-      53,    54,    55,    56,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   116,   117,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   159,
-      83,   161,    85,    -1,    87,    -1,   166,    -1,    91,    -1,
-     170
+      14,    37,   172,   153,   154,    54,     3,    42,   139,    59,
+      58,    47,    58,     1,     4,    31,    37,   187,    10,   139,
+      33,     9,    63,    37,    65,    13,    14,    15,    25,   175,
+     176,   173,    58,    21,    22,    58,   148,    58,   148,    52,
+      28,    29,    58,    57,    32,    59,    89,    35,    36,     6,
+       7,    39,   148,     5,   148,   175,   176,   188,   101,    47,
+     178,   148,    75,    51,   234,   148,    26,    24,   117,    57,
+     188,    59,    62,   148,    64,   125,    58,    58,    30,   148,
+      68,    69,   148,   148,    72,    58,     0,   173,    76,    77,
+     148,   148,    80,    81,    46,   245,   246,    49,   187,    58,
+      31,    93,    99,    63,    61,    65,    98,   148,   105,   148,
+     124,    58,   100,   101,   102,   148,    28,   163,   106,    26,
+      26,    82,   136,    35,   159,   122,    38,   115,   184,    58,
+       7,   119,    89,   121,    11,   123,   124,   185,   159,    58,
+      17,    58,   130,   173,   148,    58,   134,   135,   136,   137,
+     138,   139,   140,   148,   142,    19,   144,    58,   148,    23,
+      34,   311,    74,   151,   148,   173,   118,   184,   156,   157,
+     158,   168,   160,   161,   171,   345,   164,   165,   148,   169,
+      26,   141,    58,    58,   148,   173,   174,   173,   148,    66,
+     184,   103,   149,   145,   146,   184,   187,   154,   177,   151,
+      40,    41,    42,    43,   374,   173,   186,   178,   184,   379,
+     187,     9,   184,   249,    78,    13,    14,    15,    27,   173,
+      97,    98,   173,    21,    22,    96,   396,   232,   184,   133,
+      28,    29,    11,   170,    32,   121,   113,    35,    36,    48,
+     148,    39,    51,   179,   180,   181,   182,   183,   191,    47,
+     162,    26,   188,    51,   376,   275,   120,   235,   390,    57,
+     341,    59,    -1,    -1,   128,    -1,   143,    -1,   132,    -1,
+      68,    69,    -1,    -1,    72,    -1,    -1,   313,    76,    77,
+      -1,    -1,    80,    81,    -1,    -1,   150,    -1,    -1,    -1,
+      -1,   155,    -1,   133,    -1,    -1,    -1,    53,    54,    55,
+      56,    -1,   100,   101,   102,    -1,    -1,   147,   106,    -1,
+      -1,    -1,   152,   153,    -1,    -1,    -1,   115,    -1,    -1,
+     129,   119,   131,   121,    -1,   123,   124,    83,   137,    85,
+      -1,    87,   130,    -1,    -1,    91,   134,   135,   136,   137,
+     138,   139,   140,    -1,   142,    -1,   144,    -1,    -1,    -1,
+     364,    -1,    -1,   151,    -1,    -1,    -1,    -1,   156,   157,
+     158,    -1,   160,   161,    -1,     9,   164,   165,    -1,    13,
+      14,    15,    -1,    -1,    -1,   173,   174,    21,    22,    44,
+      -1,    -1,    -1,    -1,    28,    29,    -1,    52,    32,    -1,
+      -1,    35,    36,    -1,    -1,    39,   179,   180,   181,   182,
+     183,    -1,    -1,    47,    -1,    70,    71,    51,    73,    -1,
+      -1,    -1,    -1,    57,    79,    59,    -1,    -1,    -1,    -1,
+      -1,    -1,     8,    -1,    68,    69,    -1,    -1,    72,    -1,
+      16,    -1,    76,    77,    -1,    -1,    80,    81,    -1,   104,
+      -1,    -1,   107,   108,    -1,   110,   111,   112,    -1,   114,
+      -1,    -1,    -1,    -1,    -1,    12,   100,   101,   102,    -1,
+      -1,    18,   106,    20,    50,    51,    -1,    -1,    -1,    -1,
+      -1,   115,    -1,    -1,    -1,   119,    -1,   121,    -1,   123,
+     124,    67,    -1,    -1,    -1,    -1,   130,    -1,    45,    -1,
+     134,   135,   136,   137,   138,   139,   140,    -1,   142,    -1,
+     144,   166,    88,    -1,    -1,    -1,    -1,   151,    94,    -1,
+      96,    -1,   156,   157,   158,    -1,   160,   161,    -1,    -1,
+     164,   165,    -1,   109,    -1,    -1,    -1,    84,    -1,    86,
+     174,    -1,    -1,    90,    -1,    92,    -1,    -1,    95,    -1,
+     126,   127,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   116,
+     117,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   159,    -1,   161,    -1,    -1,    -1,    -1,
+     166,    -1,    -1,    -1,   170
 };
 
 /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
@@ -1411,30 +1415,30 @@ static const yytype_uint16 yystos[] =
       85,    87,    91,   232,   233,   234,   272,   148,   148,   271,
       58,     6,     7,    24,    61,    89,   149,   154,   265,   266,
       26,    63,    65,   141,   195,   196,    58,   148,   254,   219,
-     220,   148,     5,    30,    46,    49,   118,   145,   146,   246,
-     247,   248,    12,    18,    20,    45,    84,    86,    90,    92,
-      95,   116,   117,   214,   215,   216,   217,   196,    58,   185,
-     268,   269,   270,    58,   267,     0,   192,   173,   195,   195,
-      31,    58,   274,   148,   148,    33,    52,    75,   263,   187,
-      27,    48,    51,   129,   131,   137,   211,   212,   242,   230,
-      58,    31,   221,    40,    41,    42,    43,   133,   147,   152,
-     153,   236,   237,   238,   239,   148,   192,   259,   195,   233,
-      58,   148,   266,   227,    26,    26,   227,   227,    82,   184,
-     220,   247,   274,    37,    58,   159,   273,   215,    58,   274,
-     256,    58,   269,    58,   173,   198,     4,    62,    64,   148,
-     169,   262,   175,   176,   277,   278,   279,    58,   148,    28,
-      35,    38,    74,   103,   162,   222,   223,   224,   148,    58,
-     237,   274,   273,    44,    52,    70,    71,    73,    79,   104,
-     107,   108,   110,   111,   112,   114,   166,   228,   227,   227,
-     196,   148,    59,   125,   257,    34,     8,    16,    50,    51,
-      67,    88,    94,    96,   109,   126,   127,   159,   161,   166,
-     170,   199,   200,   201,   202,   203,   204,   205,   139,   278,
-     280,   281,   283,   173,   184,   148,     3,    25,    99,   105,
-     122,   168,   171,   225,   227,    26,   255,   196,    58,    58,
-      58,   163,   148,   184,   173,   188,   281,   187,   274,   186,
-     195,   177,   282,   184,   178,   284,   285,   274,   184,   188,
-     285,   173,   274,   187,   179,   180,   181,   182,   183,   286,
-     287,   288,   188,   287,   173,   184,   173,   274
+     220,   148,     5,    30,    46,    49,   118,   145,   146,   151,
+     246,   247,   248,    12,    18,    20,    45,    84,    86,    90,
+      92,    95,   116,   117,   214,   215,   216,   217,   196,    58,
+     185,   268,   269,   270,    58,   267,     0,   192,   173,   195,
+     195,    31,    58,   274,   148,   148,    33,    52,    75,   263,
+     187,    27,    48,    51,   129,   131,   137,   211,   212,   242,
+     230,    58,    31,   221,    40,    41,    42,    43,   133,   147,
+     152,   153,   236,   237,   238,   239,   148,   192,   259,   195,
+     233,    58,   148,   266,   227,    26,    26,   227,   227,    82,
+     184,   220,   247,   274,    37,    58,   159,   273,   215,    58,
+     274,   256,    58,   269,    58,   173,   198,     4,    62,    64,
+     148,   169,   262,   175,   176,   277,   278,   279,    58,   148,
+      28,    35,    38,    74,   103,   162,   222,   223,   224,   148,
+      58,   237,   274,   273,    44,    52,    70,    71,    73,    79,
+     104,   107,   108,   110,   111,   112,   114,   166,   228,   227,
+     227,   196,   148,    59,   125,   257,    34,     8,    16,    50,
+      51,    67,    88,    94,    96,   109,   126,   127,   159,   161,
+     166,   170,   199,   200,   201,   202,   203,   204,   205,   139,
+     278,   280,   281,   283,   173,   184,   148,     3,    25,    99,
+     105,   122,   168,   171,   225,   227,    26,   255,   196,    58,
+      58,    58,   163,   148,   184,   173,   188,   281,   187,   274,
+     186,   195,   177,   282,   184,   178,   284,   285,   274,   184,
+     188,   285,   173,   274,   187,   179,   180,   181,   182,   183,
+     286,   287,   288,   188,   287,   173,   184,   173,   274
 };
 
 #define yyerrok                (yyerrstatus = 0)
@@ -3009,10 +3013,10 @@ yyreduce:
     { (yyval.Attr_val) = create_attr_dval((yyvsp[(1) - (2)].Integer), (yyvsp[(2) - (2)].Double)); }
     break;
 
-  case 205:
+  case 206:
 
 /* Line 1464 of yacc.c  */
-#line 1063 "ntp_parser.y"
+#line 1064 "ntp_parser.y"
     {
                        attr_val *av;
                        
@@ -3021,10 +3025,10 @@ yyreduce:
                }
     break;
 
-  case 206:
+  case 207:
 
 /* Line 1464 of yacc.c  */
-#line 1070 "ntp_parser.y"
+#line 1071 "ntp_parser.y"
     {
                        attr_val *av;
                        
@@ -3033,10 +3037,10 @@ yyreduce:
                }
     break;
 
-  case 207:
+  case 208:
 
 /* Line 1464 of yacc.c  */
-#line 1077 "ntp_parser.y"
+#line 1078 "ntp_parser.y"
     {
                        char error_text[64];
                        attr_val *av;
@@ -3054,10 +3058,10 @@ yyreduce:
                }
     break;
 
-  case 208:
+  case 209:
 
 /* Line 1464 of yacc.c  */
-#line 1093 "ntp_parser.y"
+#line 1094 "ntp_parser.y"
     {
                        if (!input_from_file) {
                                yyerror("remote includefile ignored");
@@ -3078,48 +3082,48 @@ yyreduce:
                }
     break;
 
-  case 209:
+  case 210:
 
 /* Line 1464 of yacc.c  */
-#line 1112 "ntp_parser.y"
+#line 1113 "ntp_parser.y"
     {
                        while (curr_include_level != -1)
                                FCLOSE(fp[curr_include_level--]);
                }
     break;
 
-  case 210:
+  case 211:
 
 /* Line 1464 of yacc.c  */
-#line 1117 "ntp_parser.y"
+#line 1118 "ntp_parser.y"
     { /* see drift_parm below for actions */ }
     break;
 
-  case 211:
+  case 212:
 
 /* Line 1464 of yacc.c  */
-#line 1119 "ntp_parser.y"
+#line 1120 "ntp_parser.y"
     { CONCAT_G_FIFOS(cfgt.logconfig, (yyvsp[(2) - (2)].Attr_val_fifo)); }
     break;
 
-  case 212:
+  case 213:
 
 /* Line 1464 of yacc.c  */
-#line 1121 "ntp_parser.y"
+#line 1122 "ntp_parser.y"
     { CONCAT_G_FIFOS(cfgt.phone, (yyvsp[(2) - (2)].String_fifo)); }
     break;
 
-  case 213:
+  case 214:
 
 /* Line 1464 of yacc.c  */
-#line 1123 "ntp_parser.y"
+#line 1124 "ntp_parser.y"
     { APPEND_G_FIFO(cfgt.setvar, (yyvsp[(2) - (2)].Set_var)); }
     break;
 
-  case 214:
+  case 215:
 
 /* Line 1464 of yacc.c  */
-#line 1125 "ntp_parser.y"
+#line 1126 "ntp_parser.y"
     {
                        addr_opts_node *aon;
                        
@@ -3128,17 +3132,17 @@ yyreduce:
                }
     break;
 
-  case 215:
+  case 216:
 
 /* Line 1464 of yacc.c  */
-#line 1132 "ntp_parser.y"
+#line 1133 "ntp_parser.y"
     { CONCAT_G_FIFOS(cfgt.ttl, (yyvsp[(2) - (2)].Attr_val_fifo)); }
     break;
 
-  case 225:
+  case 226:
 
 /* Line 1464 of yacc.c  */
-#line 1155 "ntp_parser.y"
+#line 1156 "ntp_parser.y"
     {
                        attr_val *av;
                        
@@ -3147,10 +3151,10 @@ yyreduce:
                }
     break;
 
-  case 226:
+  case 227:
 
 /* Line 1464 of yacc.c  */
-#line 1162 "ntp_parser.y"
+#line 1163 "ntp_parser.y"
     {
                        attr_val *av;
                        
@@ -3161,10 +3165,10 @@ yyreduce:
                }
     break;
 
-  case 227:
+  case 228:
 
 /* Line 1464 of yacc.c  */
-#line 1171 "ntp_parser.y"
+#line 1172 "ntp_parser.y"
     {
                        attr_val *av;
                        
@@ -3173,78 +3177,78 @@ yyreduce:
                }
     break;
 
-  case 228:
+  case 229:
 
 /* Line 1464 of yacc.c  */
-#line 1181 "ntp_parser.y"
+#line 1182 "ntp_parser.y"
     { (yyval.Set_var) = create_setvar_node((yyvsp[(1) - (4)].String), (yyvsp[(3) - (4)].String), (yyvsp[(4) - (4)].Integer)); }
     break;
 
-  case 230:
+  case 231:
 
 /* Line 1464 of yacc.c  */
-#line 1187 "ntp_parser.y"
+#line 1188 "ntp_parser.y"
     { (yyval.Integer) = 0; }
     break;
 
-  case 231:
+  case 232:
 
 /* Line 1464 of yacc.c  */
-#line 1192 "ntp_parser.y"
+#line 1193 "ntp_parser.y"
     { (yyval.Attr_val_fifo) = NULL; }
     break;
 
-  case 232:
+  case 233:
 
 /* Line 1464 of yacc.c  */
-#line 1194 "ntp_parser.y"
+#line 1195 "ntp_parser.y"
     {
                        (yyval.Attr_val_fifo) = (yyvsp[(1) - (2)].Attr_val_fifo);
                        APPEND_G_FIFO((yyval.Attr_val_fifo), (yyvsp[(2) - (2)].Attr_val));
                }
     break;
 
-  case 233:
+  case 234:
 
 /* Line 1464 of yacc.c  */
-#line 1202 "ntp_parser.y"
+#line 1203 "ntp_parser.y"
     { (yyval.Attr_val) = create_attr_ival((yyvsp[(1) - (2)].Integer), (yyvsp[(2) - (2)].Integer)); }
     break;
 
-  case 234:
+  case 235:
 
 /* Line 1464 of yacc.c  */
-#line 1204 "ntp_parser.y"
+#line 1205 "ntp_parser.y"
     {
                        (yyval.Attr_val) = create_attr_sval((yyvsp[(1) - (2)].Integer), estrdup((yyvsp[(2) - (2)].Address_node)->address));
                        destroy_address_node((yyvsp[(2) - (2)].Address_node));
                }
     break;
 
-  case 235:
+  case 236:
 
 /* Line 1464 of yacc.c  */
-#line 1212 "ntp_parser.y"
+#line 1213 "ntp_parser.y"
     {
                        (yyval.Attr_val_fifo) = (yyvsp[(1) - (2)].Attr_val_fifo);
                        APPEND_G_FIFO((yyval.Attr_val_fifo), (yyvsp[(2) - (2)].Attr_val));
                }
     break;
 
-  case 236:
+  case 237:
 
 /* Line 1464 of yacc.c  */
-#line 1217 "ntp_parser.y"
+#line 1218 "ntp_parser.y"
     {
                        (yyval.Attr_val_fifo) = NULL;
                        APPEND_G_FIFO((yyval.Attr_val_fifo), (yyvsp[(1) - (1)].Attr_val));
                }
     break;
 
-  case 237:
+  case 238:
 
 /* Line 1464 of yacc.c  */
-#line 1225 "ntp_parser.y"
+#line 1226 "ntp_parser.y"
     {
                        char    prefix;
                        char *  type;
@@ -3268,10 +3272,10 @@ yyreduce:
                }
     break;
 
-  case 238:
+  case 239:
 
 /* Line 1464 of yacc.c  */
-#line 1250 "ntp_parser.y"
+#line 1251 "ntp_parser.y"
     {
                        nic_rule_node *nrn;
                        
@@ -3280,10 +3284,10 @@ yyreduce:
                }
     break;
 
-  case 239:
+  case 240:
 
 /* Line 1464 of yacc.c  */
-#line 1257 "ntp_parser.y"
+#line 1258 "ntp_parser.y"
     {
                        nic_rule_node *nrn;
                        
@@ -3292,131 +3296,131 @@ yyreduce:
                }
     break;
 
-  case 249:
+  case 250:
 
 /* Line 1464 of yacc.c  */
-#line 1285 "ntp_parser.y"
+#line 1286 "ntp_parser.y"
     { CONCAT_G_FIFOS(cfgt.reset_counters, (yyvsp[(2) - (2)].Int_fifo)); }
     break;
 
-  case 250:
+  case 251:
 
 /* Line 1464 of yacc.c  */
-#line 1290 "ntp_parser.y"
+#line 1291 "ntp_parser.y"
     {
                        (yyval.Int_fifo) = (yyvsp[(1) - (2)].Int_fifo);
                        APPEND_G_FIFO((yyval.Int_fifo), create_int_node((yyvsp[(2) - (2)].Integer)));
                }
     break;
 
-  case 251:
+  case 252:
 
 /* Line 1464 of yacc.c  */
-#line 1295 "ntp_parser.y"
+#line 1296 "ntp_parser.y"
     {
                        (yyval.Int_fifo) = NULL;
                        APPEND_G_FIFO((yyval.Int_fifo), create_int_node((yyvsp[(1) - (1)].Integer)));
                }
     break;
 
-  case 259:
+  case 260:
 
 /* Line 1464 of yacc.c  */
-#line 1319 "ntp_parser.y"
+#line 1320 "ntp_parser.y"
     {
                        (yyval.Attr_val_fifo) = (yyvsp[(1) - (2)].Attr_val_fifo);
                        APPEND_G_FIFO((yyval.Attr_val_fifo), create_int_node((yyvsp[(2) - (2)].Integer)));
                }
     break;
 
-  case 260:
+  case 261:
 
 /* Line 1464 of yacc.c  */
-#line 1324 "ntp_parser.y"
+#line 1325 "ntp_parser.y"
     {
                        (yyval.Attr_val_fifo) = NULL;
                        APPEND_G_FIFO((yyval.Attr_val_fifo), create_int_node((yyvsp[(1) - (1)].Integer)));
                }
     break;
 
-  case 261:
+  case 262:
 
 /* Line 1464 of yacc.c  */
-#line 1332 "ntp_parser.y"
+#line 1333 "ntp_parser.y"
     {
                        (yyval.Attr_val_fifo) = (yyvsp[(1) - (2)].Attr_val_fifo);
                        APPEND_G_FIFO((yyval.Attr_val_fifo), (yyvsp[(2) - (2)].Attr_val));
                }
     break;
 
-  case 262:
+  case 263:
 
 /* Line 1464 of yacc.c  */
-#line 1337 "ntp_parser.y"
+#line 1338 "ntp_parser.y"
     {
                        (yyval.Attr_val_fifo) = NULL;
                        APPEND_G_FIFO((yyval.Attr_val_fifo), (yyvsp[(1) - (1)].Attr_val));
                }
     break;
 
-  case 263:
+  case 264:
 
 /* Line 1464 of yacc.c  */
-#line 1345 "ntp_parser.y"
+#line 1346 "ntp_parser.y"
     { (yyval.Attr_val) = create_attr_ival('i', (yyvsp[(1) - (1)].Integer)); }
     break;
 
-  case 265:
+  case 266:
 
 /* Line 1464 of yacc.c  */
-#line 1351 "ntp_parser.y"
+#line 1352 "ntp_parser.y"
     { (yyval.Attr_val) = create_attr_rangeval('-', (yyvsp[(2) - (5)].Integer), (yyvsp[(4) - (5)].Integer)); }
     break;
 
-  case 266:
+  case 267:
 
 /* Line 1464 of yacc.c  */
-#line 1356 "ntp_parser.y"
+#line 1357 "ntp_parser.y"
     {
                        (yyval.String_fifo) = (yyvsp[(1) - (2)].String_fifo);
                        APPEND_G_FIFO((yyval.String_fifo), create_string_node((yyvsp[(2) - (2)].String)));
                }
     break;
 
-  case 267:
+  case 268:
 
 /* Line 1464 of yacc.c  */
-#line 1361 "ntp_parser.y"
+#line 1362 "ntp_parser.y"
     {
                        (yyval.String_fifo) = NULL;
                        APPEND_G_FIFO((yyval.String_fifo), create_string_node((yyvsp[(1) - (1)].String)));
                }
     break;
 
-  case 268:
+  case 269:
 
 /* Line 1464 of yacc.c  */
-#line 1369 "ntp_parser.y"
+#line 1370 "ntp_parser.y"
     {
                        (yyval.Address_fifo) = (yyvsp[(1) - (2)].Address_fifo);
                        APPEND_G_FIFO((yyval.Address_fifo), (yyvsp[(2) - (2)].Address_node));
                }
     break;
 
-  case 269:
+  case 270:
 
 /* Line 1464 of yacc.c  */
-#line 1374 "ntp_parser.y"
+#line 1375 "ntp_parser.y"
     {
                        (yyval.Address_fifo) = NULL;
                        APPEND_G_FIFO((yyval.Address_fifo), (yyvsp[(1) - (1)].Address_node));
                }
     break;
 
-  case 270:
+  case 271:
 
 /* Line 1464 of yacc.c  */
-#line 1382 "ntp_parser.y"
+#line 1383 "ntp_parser.y"
     {
                        if ((yyvsp[(1) - (1)].Integer) != 0 && (yyvsp[(1) - (1)].Integer) != 1) {
                                yyerror("Integer value is not boolean (0 or 1). Assuming 1");
@@ -3427,31 +3431,31 @@ yyreduce:
                }
     break;
 
-  case 271:
+  case 272:
 
 /* Line 1464 of yacc.c  */
-#line 1390 "ntp_parser.y"
+#line 1391 "ntp_parser.y"
     { (yyval.Integer) = 1; }
     break;
 
-  case 272:
+  case 273:
 
 /* Line 1464 of yacc.c  */
-#line 1391 "ntp_parser.y"
+#line 1392 "ntp_parser.y"
     { (yyval.Integer) = 0; }
     break;
 
-  case 273:
+  case 274:
 
 /* Line 1464 of yacc.c  */
-#line 1395 "ntp_parser.y"
+#line 1396 "ntp_parser.y"
     { (yyval.Double) = (double)(yyvsp[(1) - (1)].Integer); }
     break;
 
-  case 275:
+  case 276:
 
 /* Line 1464 of yacc.c  */
-#line 1406 "ntp_parser.y"
+#line 1407 "ntp_parser.y"
     {
                        sim_node *sn;
                        
@@ -3463,139 +3467,139 @@ yyreduce:
                }
     break;
 
-  case 276:
+  case 277:
 
 /* Line 1464 of yacc.c  */
-#line 1423 "ntp_parser.y"
+#line 1424 "ntp_parser.y"
     { old_config_style = 0; }
     break;
 
-  case 277:
+  case 278:
 
 /* Line 1464 of yacc.c  */
-#line 1428 "ntp_parser.y"
+#line 1429 "ntp_parser.y"
     {
                        (yyval.Attr_val_fifo) = (yyvsp[(1) - (3)].Attr_val_fifo);
                        APPEND_G_FIFO((yyval.Attr_val_fifo), (yyvsp[(2) - (3)].Attr_val));
                }
     break;
 
-  case 278:
+  case 279:
 
 /* Line 1464 of yacc.c  */
-#line 1433 "ntp_parser.y"
+#line 1434 "ntp_parser.y"
     {
                        (yyval.Attr_val_fifo) = NULL;
                        APPEND_G_FIFO((yyval.Attr_val_fifo), (yyvsp[(1) - (2)].Attr_val));
                }
     break;
 
-  case 279:
+  case 280:
 
 /* Line 1464 of yacc.c  */
-#line 1441 "ntp_parser.y"
+#line 1442 "ntp_parser.y"
     { (yyval.Attr_val) = create_attr_dval((yyvsp[(1) - (3)].Integer), (yyvsp[(3) - (3)].Double)); }
     break;
 
-  case 282:
+  case 283:
 
 /* Line 1464 of yacc.c  */
-#line 1451 "ntp_parser.y"
+#line 1452 "ntp_parser.y"
     {
                        (yyval.Sim_server_fifo) = (yyvsp[(1) - (2)].Sim_server_fifo);
                        APPEND_G_FIFO((yyval.Sim_server_fifo), (yyvsp[(2) - (2)].Sim_server));
                }
     break;
 
-  case 283:
+  case 284:
 
 /* Line 1464 of yacc.c  */
-#line 1456 "ntp_parser.y"
+#line 1457 "ntp_parser.y"
     {
                        (yyval.Sim_server_fifo) = NULL;
                        APPEND_G_FIFO((yyval.Sim_server_fifo), (yyvsp[(1) - (1)].Sim_server));
                }
     break;
 
-  case 284:
+  case 285:
 
 /* Line 1464 of yacc.c  */
-#line 1464 "ntp_parser.y"
+#line 1465 "ntp_parser.y"
     { (yyval.Sim_server) = create_sim_server((yyvsp[(1) - (5)].Address_node), (yyvsp[(3) - (5)].Double), (yyvsp[(4) - (5)].Sim_script_fifo)); }
     break;
 
-  case 285:
+  case 286:
 
 /* Line 1464 of yacc.c  */
-#line 1469 "ntp_parser.y"
+#line 1470 "ntp_parser.y"
     { (yyval.Double) = (yyvsp[(3) - (4)].Double); }
     break;
 
-  case 286:
+  case 287:
 
 /* Line 1464 of yacc.c  */
-#line 1474 "ntp_parser.y"
+#line 1475 "ntp_parser.y"
     { (yyval.Address_node) = (yyvsp[(3) - (3)].Address_node); }
     break;
 
-  case 287:
+  case 288:
 
 /* Line 1464 of yacc.c  */
-#line 1479 "ntp_parser.y"
+#line 1480 "ntp_parser.y"
     {
                        (yyval.Sim_script_fifo) = (yyvsp[(1) - (2)].Sim_script_fifo);
                        APPEND_G_FIFO((yyval.Sim_script_fifo), (yyvsp[(2) - (2)].Sim_script));
                }
     break;
 
-  case 288:
+  case 289:
 
 /* Line 1464 of yacc.c  */
-#line 1484 "ntp_parser.y"
+#line 1485 "ntp_parser.y"
     {
                        (yyval.Sim_script_fifo) = NULL;
                        APPEND_G_FIFO((yyval.Sim_script_fifo), (yyvsp[(1) - (1)].Sim_script));
                }
     break;
 
-  case 289:
+  case 290:
 
 /* Line 1464 of yacc.c  */
-#line 1492 "ntp_parser.y"
+#line 1493 "ntp_parser.y"
     { (yyval.Sim_script) = create_sim_script_info((yyvsp[(3) - (6)].Double), (yyvsp[(5) - (6)].Attr_val_fifo)); }
     break;
 
-  case 290:
+  case 291:
 
 /* Line 1464 of yacc.c  */
-#line 1497 "ntp_parser.y"
+#line 1498 "ntp_parser.y"
     {
                        (yyval.Attr_val_fifo) = (yyvsp[(1) - (3)].Attr_val_fifo);
                        APPEND_G_FIFO((yyval.Attr_val_fifo), (yyvsp[(2) - (3)].Attr_val));
                }
     break;
 
-  case 291:
+  case 292:
 
 /* Line 1464 of yacc.c  */
-#line 1502 "ntp_parser.y"
+#line 1503 "ntp_parser.y"
     {
                        (yyval.Attr_val_fifo) = NULL;
                        APPEND_G_FIFO((yyval.Attr_val_fifo), (yyvsp[(1) - (2)].Attr_val));
                }
     break;
 
-  case 292:
+  case 293:
 
 /* Line 1464 of yacc.c  */
-#line 1510 "ntp_parser.y"
+#line 1511 "ntp_parser.y"
     { (yyval.Attr_val) = create_attr_dval((yyvsp[(1) - (3)].Integer), (yyvsp[(3) - (3)].Double)); }
     break;
 
 
 
 /* Line 1464 of yacc.c  */
-#line 3599 "ntp_parser.c"
+#line 3603 "ntp_parser.c"
       default: break;
     }
   YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
@@ -3807,7 +3811,7 @@ yyreturn:
 
 
 /* Line 1684 of yacc.c  */
-#line 1521 "ntp_parser.y"
+#line 1522 "ntp_parser.y"
 
 
 void 
index c576de0bf35d80c121f3afe800b12a15d4548a21..88e61cffb6dadb9a7f6fdfceb13ce8ecda31dab5 100644 (file)
@@ -1049,6 +1049,7 @@ tinker_option_keyword
        |       T_Panic
        |       T_Step
        |       T_Stepout
+       |       T_Tick
        ;
 
 
index 3b1fb595ecb3b3df9a545024c0e7ac9990a315f3..47f9e30053b915a36225d0934f6ca176efdd6126 100644 (file)
@@ -108,7 +108,7 @@ char        *sys_ident = NULL;      /* identity scheme */
  * TOS and multicast mapping stuff
  */
 int    sys_floor = 0;          /* cluster stratum floor */
-int    sys_ceiling = STRATUM_UNSPEC; /* cluster stratum ceiling */
+int    sys_ceiling = STRATUM_UNSPEC - 1; /* cluster stratum ceiling */
 int    sys_minsane = 1;        /* minimum candidates */
 int    sys_minclock = NTP_MINCLOCK; /* minimum candidates */
 int    sys_maxclock = NTP_MAXCLOCK; /* maximum candidates */
@@ -140,7 +140,7 @@ static      void    peer_xmit       (struct peer *);
 static void    fast_xmit       (struct recvbuf *, int, keyid_t, int);
 static void    pool_xmit       (struct peer *);
 static void    clock_update    (struct peer *);
-static int     default_get_precision (void);
+static void    measure_precision(void);
 static int     local_refid     (struct peer *);
 static int     peer_unfit      (struct peer *);
 #ifdef AUTOKEY
@@ -1692,6 +1692,7 @@ process_packet(
                p_del = fabs(t21 - t34);
                p_offset = (t21 + t34) / 2.;
        }
+       p_del = max(p_del, LOGTOD(sys_precision));
        p_disp = LOGTOD(sys_precision) + LOGTOD(peer->precision) +
            clock_phi * p_del;
 
@@ -3804,7 +3805,7 @@ peer_unfit(
 /*
  * Find the precision of this particular machine
  */
-#define MINSTEP                100e-9  /* minimum clock increment (s) */
+#define MINSTEP                20e-9   /* minimum clock increment (s) */
 #define MAXSTEP                1       /* maximum clock increment (s) */
 #define MINCHANGES     5       /* minimum number of step samples */
 #define MAXLOOPS       ((int)(1. / MINSTEP))   /* avoid infinite loop */
@@ -3829,8 +3830,8 @@ peer_unfit(
  * to read the clock is saved as sys_fuzz, and used to ensure the
  * get_systime() readings always increase and are fuzzed below sys_fuzz.
  */
-int
-default_get_precision(void)
+void
+measure_precision(void)
 {
        l_fp    val;            /* current seconds fraction */
        l_fp    last;           /* last seconds fraction */
@@ -3845,13 +3846,17 @@ default_get_precision(void)
        /*
         * Loop to find precision value in seconds.  With sys_fuzz set
         * to zero, get_systime() disables its fuzzing of low bits.
+        * measured_tick and sys_tick are zeroed to disable get_ostime()
+        * low-precision clock simulation.
         */
        tick = MAXSTEP;
+       sys_tick = 0;
+       measured_tick = 0;
        set_sys_fuzz(0.);
-       get_systime(&last);
        max_repeats = 0;
        repeats = 0;
        changes = 0;
+       get_systime(&last);
        for (i = 0; i < MAXLOOPS && changes < MINCHANGES; i++) {
                get_systime(&val);
                ldiff = val;
@@ -3871,15 +3876,43 @@ default_get_precision(void)
                msyslog(LOG_ERR, "Fatal error: precision could not be measured (MINSTEP too large?)");
                exit(1);
        }
-       sys_tick = tick;
+       measured_tick = tick;
+       set_sys_tick_precision(tick);
        if (0 == max_repeats) {
-               set_sys_fuzz(sys_tick);
+               set_sys_fuzz(tick);
        } else {
-               set_sys_fuzz(sys_tick / max_repeats);
+               set_sys_fuzz(tick / max_repeats);
                msyslog(LOG_NOTICE, "proto: fuzz beneath %.3f usec",
                        sys_fuzz * 1e6);
        }
 
+}
+
+
+void
+set_sys_tick_precision(
+       double tick
+       )
+{
+       int i;
+
+       if (tick > 1.) {
+               msyslog(LOG_ERR,
+                       "unsupported tick %.3f > 1s ignored", tick);
+               return;
+       }
+       if (tick < measured_tick) {
+               msyslog(LOG_ERR,
+                       "proto: tick %.3f less than measured tick %.3f, ignored",
+                       tick, measured_tick);
+               return;
+       } else if (tick > measured_tick) {
+               msyslog(LOG_NOTICE,
+                       "proto: truncating system clock to multiples of %.9f",
+                       tick);
+       }
+       sys_tick = tick;
+
        /*
         * Find the nearest power of two.
         */
@@ -3887,10 +3920,10 @@ default_get_precision(void)
                tick *= 2;
        if (tick - 1 > 1 - tick / 2)
                i++;
-       msyslog(LOG_NOTICE, "proto: precision = %.3f usec (%d)",
-               sys_tick * 1e6, i);
 
-       return i;
+       sys_precision = (s_char)i;
+       msyslog(LOG_NOTICE, "proto: precision = %.3f usec (%d)",
+               sys_tick * 1e6, sys_precision);
 }
 
 
@@ -3915,7 +3948,7 @@ init_proto(void)
        sys_rootdisp = 0;
        L_CLR(&sys_reftime);
        sys_jitter = 0;
-       sys_precision = (s_char)default_get_precision();
+       measure_precision();
        get_systime(&dummy);
        sys_survivors = 0;
        sys_manycastserver = 0;
@@ -4057,10 +4090,6 @@ proto_config(
                orphwait += sys_orphwait;
                break;
 
-       case PROTO_ADJ:         /* tick increment (tick) */
-               sys_tick = dvalue;
-               break;
-
        /*
         * Miscellaneous commands
         */
index c454d3f39ccdbaf8f3298eaabe68a389630aba58..1e1efd7fdf61afc4c67e7d22bbfb43cb32a03535 100644 (file)
@@ -559,15 +559,10 @@ adj_systime(
 
 
        sys_residual = dtemp / 1e6;
-#if 0
-       msyslog(LOG_NOTICE, "adj_systime: %.9f -> %.9f residual %.9f", 
-                   now, 1e-6 * (TimeAdjustment * ppm_per_adjust_unit),
-                   sys_residual);
-#endif
        DPRINTF(3, ("adj_systime: %.9f -> %.9f residual %.9f", 
                    now, 1e-6 * (TimeAdjustment * ppm_per_adjust_unit),
                    sys_residual));
-       if (0 == adjtime_carry)
+       if (0. == adjtime_carry)
                DPRINTF(3, ("\n"));
        else
                DPRINTF(3, (" adjtime %.9f\n", adjtime_carry));
@@ -577,16 +572,14 @@ adj_systime(
        if (last_Adj != TimeAdjustment) {
                last_Adj = TimeAdjustment;
                DPRINTF(2, ("SetSystemTimeAdjustment(%+ld)\n", TimeAdjustment));
-               rc = !SetSystemTimeAdjustment(clockperiod + TimeAdjustment, FALSE);
+               rc = SetSystemTimeAdjustment(clockperiod + TimeAdjustment, FALSE);
+               if (!rc)
+                       msyslog(LOG_ERR, "Can't adjust time: %m");
        } else {
-               rc = FALSE;
-       }
-       if (rc) {
-               msyslog(LOG_ERR, "Can't adjust time: %m");
-               return FALSE;
+               rc = TRUE;
        }
 
-       return TRUE;
+       return rc;
 }
 
 
index c1a2b3023a88ad198bb11c64932b1b878dea4673..8bb24c064bdc3558a79645182e20ee5c39b09ee3 100644 (file)
 #define        MD5SIZE         20      /* maximum key size */
 #define DAY            ((long)60*60*24) /* one day in seconds */
 #define        YEAR            ((long)365) /* one year in days */
-#define MAXFILENAME    256     /* max file name length */
-#define MAXHOSTNAME    256     /* max host name length */
+#define MAXFILENAME    MAXHOSTNAME /* max file name length */
 #ifdef AUTOKEY
 #define        PLEN            512     /* default prime modulus size (bits) */
 #define        ILEN            256     /* default identity modulus size (bits) */