]> git.ipfire.org Git - thirdparty/ntp.git/commitdiff
Bias and Interleave stuff from Dave Mills.
authorHarlan Stenn <stenn@ntp.org>
Wed, 16 Jul 2008 09:26:43 +0000 (05:26 -0400)
committerHarlan Stenn <stenn@ntp.org>
Wed, 16 Jul 2008 09:26:43 +0000 (05:26 -0400)
bk: 487dbed3ppWZnIOfda5k2stUdFk_xQ

14 files changed:
ChangeLog
include/ntp.h
include/ntp_config.h
libntp/statestr.c
ntpd/ntp_config.c
ntpd/ntp_control.c
ntpd/ntp_loopfilter.c
ntpd/ntp_parser.c
ntpd/ntp_parser.h
ntpd/ntp_parser.y
ntpd/ntp_proto.c
ntpd/ntp_refclock.c
ntpd/ntp_request.c
ntpd/ntp_util.c

index 809cf6000f8b88afdc9807557fc59926c4992c76..8f3b8f42ee03a1e99bdd23d2a52169e919108b12 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,6 @@
+* Fixes from Dave Mills: 'bias' and 'interleave' work.  Separate
+  phase and frequency discipline (for long poll intervals).  Update
+  TAI function to match current leapsecond processing.
 * Documentation updates from Dave Mills.
 * [Bug 1037] Use all 16 of the MD5 passwords generated by ntp-keygen.
 * Fixed the incorrect edge parameter being passed to time_pps_kcbind in
index 7e24ef13b372157c68757bd65dc29359012df307..6922dd8393bf22123df490d11fac74dbaf4181ee 100644 (file)
@@ -327,19 +327,24 @@ struct peer {
        u_long  epoch;          /* reference epoch */
        int     burst;          /* packets remaining in burst */
        int     retry;          /* retry counter */
+       int     flip;           /* interleave mode control */
        int     filter_nextpt;  /* index into filter shift register */
        double  filter_delay[NTP_SHIFT]; /* delay shift register */
        double  filter_offset[NTP_SHIFT]; /* offset shift register */
        double  filter_disp[NTP_SHIFT]; /* dispersion shift register */
        u_long  filter_epoch[NTP_SHIFT]; /* epoch shift register */
        u_char  filter_order[NTP_SHIFT]; /* filter sort index */
-       l_fp    org;            /* originate time stamp */
        l_fp    rec;            /* receive time stamp */
        l_fp    xmt;            /* transmit time stamp */
+       l_fp    dst;            /* destination timestamp */
+       l_fp    aorg;           /* origin timestamp */
+       l_fp    borg;           /* alternate origin timestamp */
        double  offset;         /* peer clock offset */
        double  delay;          /* peer roundtrip delay */
        double  jitter;         /* peer jitter (squares) */
        double  disp;           /* peer dispersion */
+       double  xleave;         /* interleave delay */
+       double  bias;           /* bias for NIC asymmetry */
 
        /*
         * Variables used to correct for packet length and asymmetry.
@@ -434,9 +439,11 @@ struct peer {
 #define FLAG_IBURST    0x0100  /* initial burst mode */
 #define FLAG_NOSELECT  0x0200  /* never select */
 #define FLAG_TRUE      0x0400  /* force truechimer */
-#define FLAG_SKEY      0x1000  /* autokey authentication */
+#define FLAG_SKEY      0x0800  /* autokey authentication */
+#define        FLAG_XLEAVE     0x1000  /* interleaved protocol */
+#define        FLAG_XB         0x2000  /* interleaved broadcast */
 #ifdef OPENSSL
-#define FLAG_ASSOC     0x2000  /* autokey request */
+#define FLAG_ASSOC     0x4000  /* autokey request */
 #endif /* OPENSSL */
 
 /*
@@ -701,6 +708,8 @@ struct pkt {
 #define        PEVNT_CLOCK     (11 | PEER_EVENT) /* clock event */
 #define        PEVNT_AUTH      (12 | PEER_EVENT) /* bad auth */
 #define        PEVNT_POPCORN   (13 | PEER_EVENT) /* popcorn */
+#define        PEVNT_XLEAVE    (14 | PEER_EVENT) /* interleave mode */
+#define        PEVNT_XERR      (15 | PEER_EVENT) /* interleave error */
 
 /*
  * Clock event codes
index f8256b6d7e88742d6f86edd0e4755099dd157152..3f16b17082514e79a2ac63c2a6f05d316b9a6672 100644 (file)
@@ -80,6 +80,7 @@ struct peer_node {
     int peerversion;
     int peerkey;
     int peerflags;
+    double bias;
 };
 
 struct auth_node {
index c26ac9e1b4d8011e00a41eae75c81cc310d22c8e..8a051215fbad1da7cb7f6b9c9b96f20dcec3abbc 100644 (file)
@@ -143,6 +143,8 @@ struct codestring peer_codes[] = {
        { PEVNT_CLOCK & ~PEER_EVENT,    "clock" },
        { PEVNT_AUTH & ~PEER_EVENT,     "bad_auth" },
        { PEVNT_POPCORN & ~PEER_EVENT,  "popcorn" },
+       { PEVNT_XLEAVE & ~PEER_EVENT,   "xmode" },
+       { PEVNT_XERR & ~PEER_EVENT,     "xerr" },
        { -1,                           "" }
 };
 
index 4fe5b1eb069658b7bf0b0bbe3c7f963214e24f1c..adae53b3ced49b386959eb80a1a51b6e76692b4d 100644 (file)
@@ -459,6 +459,7 @@ create_peer_node(
        my_node->peerversion = NTP_VERSION;
        my_node->peerkey = 0;
        my_node->peerflags = 0;
+       my_node->bias = 0;
 
        /* Now set the node to the read values */
        my_node->host_mode = hmode;
@@ -509,6 +510,8 @@ create_peer_node(
                    case T_Flag:
                        my_node->peerflags |= my_val->value.i;
                        break;
+                   case T_Bias:
+                       my_node->bias = my_val->value.d;
                }
                free_node(my_val);
        }
@@ -794,6 +797,7 @@ struct key_tok keyword_list[] = {
        { "trustedkey",         T_Trustedkey,      NO_ARG },
 /* option */
        { "autokey",            T_Autokey,         NO_ARG },
+       { "bias",               T_Bias,            NO_ARG },
        { "burst",              T_Burst,           NO_ARG },
        { "iburst",             T_Iburst,          NO_ARG },
        { "key",                T_Key,             NO_ARG },
@@ -806,6 +810,7 @@ struct key_tok keyword_list[] = {
        { "prefer",             T_Prefer,          NO_ARG },
        { "ttl",                T_Ttl,             NO_ARG },
        { "version",            T_Version,         NO_ARG },
+       { "xleave",             T_Xleave,          NO_ARG },
 /* crypto_command */
        { "host",               T_Host,            SINGLE_ARG },
        { "ident",              T_Ident,           SINGLE_ARG },
index a04e9f2ebf92291601935420d08d28a454a98ef4..e8c6410b0a28d00cded4097fe23d3244b9795987 100644 (file)
@@ -195,7 +195,7 @@ static struct ctl_var peer_var[] = {
        { CP_REFTIME,   RO, "reftime" },        /* 17 */
        { CP_ORG,       RO, "org" },            /* 18 */
        { CP_REC,       RO, "rec" },            /* 19 */
-       { CP_XMT,       RO, "xmt" },            /* 20 */
+       { CP_XMT,       RO, "xleave" },         /* 20 */
        { CP_REACH,     RO, "reach" },          /* 21 */
        { CP_UNREACH,   RO, "unreach" },        /* 22 */
        { CP_TIMER,     RO, "timer" },          /* 23 */
@@ -261,6 +261,7 @@ static u_char def_peer_var[] = {
        CP_DELAY,
        CP_DISPERSION,
        CP_JITTER,
+       CP_XMT,
        CP_FILTDELAY,
        CP_FILTOFFSET,
        CP_FILTERROR,
@@ -1508,8 +1509,8 @@ ctl_putpeer(
 
            case CP_DSTPORT:
                ctl_putuint(peer_var[CP_DSTPORT].text,
-                           (u_long)(peer->dstadr ?
-                                    ntohs(((struct sockaddr_in*)&peer->dstadr->sin)->sin_port) : 0));
+                   (u_long)(peer->dstadr ?
+                   ntohs(((struct sockaddr_in*)&peer->dstadr->sin)->sin_port) : 0));
                break;
 
            case CP_IN:
@@ -1583,15 +1584,17 @@ ctl_putpeer(
                break;
 
            case CP_ORG:
-               ctl_putts(peer_var[CP_ORG].text, &peer->org);
+               ctl_putts(peer_var[CP_ORG].text, &peer->aorg);
                break;
 
            case CP_REC:
-               ctl_putts(peer_var[CP_REC].text, &peer->rec);
+               ctl_putts(peer_var[CP_REC].text, &peer->dst);
                break;
 
            case CP_XMT:
-               ctl_putts(peer_var[CP_XMT].text, &peer->xmt);
+               if (peer->flags & FLAG_XLEAVE)
+                       ctl_putdbl(peer_var[CP_XMT].text, peer->xleave *
+                           1e3);
                break;
 
            case CP_REACH:
@@ -1628,7 +1631,8 @@ ctl_putpeer(
                break;
 
            case CP_JITTER:
-               ctl_putdbl(peer_var[CP_JITTER].text, peer->jitter * 1e3);
+               ctl_putdbl(peer_var[CP_JITTER].text, peer->jitter *
+                   1e3);
                break;
 
            case CP_DISPERSION:
@@ -1638,7 +1642,8 @@ ctl_putpeer(
 
            case CP_KEYID:
                if (peer->keyid > NTP_MAXKEY)
-                       ctl_puthex(peer_var[CP_KEYID].text, peer->keyid);
+                       ctl_puthex(peer_var[CP_KEYID].text,
+                           peer->keyid);
                else
                        ctl_putuint(peer_var[CP_KEYID].text,
                            peer->keyid);
index 6be3f54942afc999b10bf3d1f6a179e7c5c884dd..725828403eb752f8b3f96e4356befeee56548152 100644 (file)
@@ -810,14 +810,12 @@ set_freq(
         */
        if (pll_control && kern_enable) {
                memset(&ntv,  0, sizeof(ntv));
-               ntp_adjtime(&ntv);
                ntv.modes = MOD_FREQUENCY;
                ntv.freq = DTOFREQ(drift_comp);
                ntp_adjtime(&ntv);
                snprintf(tbuf, sizeof(tbuf), "kernel %.3f PPM",
                    drift_comp * 1e6);
                report_event(EVNT_FSET, NULL, tbuf);
-               ntp_adjtime(&ntv);
        } else {
                snprintf(tbuf, sizeof(tbuf), "ntpd %.3f PPM",
                    drift_comp * 1e6);
@@ -882,9 +880,11 @@ loop_config(
 
                pll_control = 1;
                memset(&ntv, 0, sizeof(ntv));
-               ntv.modes = MOD_BITS | MOD_FREQUENCY;
+               ntv.modes = MOD_BITS;
+               ntv.status = STA_PLL;
                ntv.maxerror = MAXDISPERSE;
                ntv.esterror = MAXDISPERSE;
+               ntv.constant = sys_poll;
 #ifdef SIGSYS
                /*
                 * Use sigsetjmp() to save state and then call
@@ -936,13 +936,12 @@ loop_config(
        case LOOP_DRIFTCOMP:
 #ifndef LOCKCLOCK
                if (freq > NTP_MAXFREQ || freq < -NTP_MAXFREQ) {
-                       drift_comp = 0;
+                       set_freq(0);
                        rstclock(EVNT_NSET, 0);
-                       break;
+               } else {
+                       set_freq(freq);
+                       rstclock(EVNT_FSET, 0);
                }
-               set_freq(freq);
-               rstclock(EVNT_FSET, 0);
-
 #endif /* LOCKCLOCK */
                break;
 
@@ -958,7 +957,7 @@ loop_config(
                if (pll_control && kern_enable) {
                        memset((char *)&ntv, 0, sizeof(ntv));
                        ntv.modes = MOD_STATUS;
-                       ntv.status = 0;
+                       ntv.status = STA_UNSYNC;
                        ntp_adjtime(&ntv);
                        report_event(EVNT_KERN, NULL,
                            "kernel time sync disabledx");
index 534a2294740b0608fc1a3743fb5de31c8b9dde8b..4b0e3b95a9f80aa1214cabd98ab81ae4dd17a501 100644 (file)
      T_Average = 263,
      T_Bclient = 264,
      T_Beacon = 265,
-     T_Broadcast = 266,
-     T_Broadcastclient = 267,
-     T_Broadcastdelay = 268,
-     T_Burst = 269,
-     T_Calibrate = 270,
-     T_Calldelay = 271,
-     T_Ceiling = 272,
-     T_Clockstats = 273,
-     T_Cohort = 274,
-     T_ControlKey = 275,
-     T_Crypto = 276,
-     T_Cryptostats = 277,
-     T_Day = 278,
-     T_Default = 279,
-     T_Disable = 280,
-     T_Discard = 281,
-     T_Dispersion = 282,
-     T_Double = 283,
-     T_Driftfile = 284,
-     T_WanderThreshold = 285,
-     T_Enable = 286,
-     T_End = 287,
-     T_False = 288,
-     T_File = 289,
-     T_Filegen = 290,
-     T_Flag1 = 291,
-     T_Flag2 = 292,
-     T_Flag3 = 293,
-     T_Flag4 = 294,
-     T_Flake = 295,
-     T_Floor = 296,
-     T_Freq = 297,
-     T_Fudge = 298,
-     T_Host = 299,
-     T_Huffpuff = 300,
-     T_IPv4_address = 301,
-     T_IPv6_address = 302,
-     T_Iburst = 303,
-     T_Ident = 304,
-     T_Ignore = 305,
-     T_Includefile = 306,
-     T_Integer = 307,
-     T_Interface = 308,
-     T_Kernel = 309,
-     T_Key = 310,
-     T_Keys = 311,
-     T_Keysdir = 312,
-     T_Kod = 313,
-     T_Leap = 314,
-     T_Leapfile = 315,
-     T_Limited = 316,
-     T_Link = 317,
-     T_Logconfig = 318,
-     T_Logfile = 319,
-     T_Loopstats = 320,
-     T_Lowpriotrap = 321,
-     T_Manycastclient = 322,
-     T_Manycastserver = 323,
-     T_Mask = 324,
-     T_Maxclock = 325,
-     T_Maxdist = 326,
-     T_Maxhop = 327,
-     T_Maxpoll = 328,
-     T_Minclock = 329,
-     T_Mindist = 330,
-     T_Minimum = 331,
-     T_Minpoll = 332,
-     T_Minsane = 333,
-     T_Mode = 334,
-     T_Monitor = 335,
-     T_Month = 336,
-     T_Multicastclient = 337,
-     T_Nolink = 338,
-     T_Nomodify = 339,
-     T_None = 340,
-     T_Nopeer = 341,
-     T_Noquery = 342,
-     T_Noselect = 343,
-     T_Noserve = 344,
-     T_Notrap = 345,
-     T_Notrust = 346,
-     T_Novolley = 347,
-     T_Ntp = 348,
-     T_Ntpport = 349,
-     T_Orphan = 350,
-     T_Panic = 351,
-     T_Peer = 352,
-     T_Peerstats = 353,
-     T_Phone = 354,
-     T_Pid = 355,
-     T_Pidfile = 356,
-     T_Pool = 357,
-     T_Port = 358,
-     T_Pps = 359,
-     T_Preempt = 360,
-     T_Prefer = 361,
-     T_Protostats = 362,
-     T_Pw = 363,
-     T_Qos = 364,
-     T_RandFile = 365,
-     T_Rawstats = 366,
-     T_Refid = 367,
-     T_Requestkey = 368,
-     T_Restrict = 369,
-     T_Revoke = 370,
-     T_Server = 371,
-     T_Setvar = 372,
-     T_Sign = 373,
-     T_Statistics = 374,
-     T_Stats = 375,
-     T_Statsdir = 376,
-     T_Step = 377,
-     T_Stepout = 378,
-     T_Stratum = 379,
-     T_String = 380,
-     T_Sysstats = 381,
-     T_Tick = 382,
-     T_Time1 = 383,
-     T_Time2 = 384,
-     T_Tinker = 385,
-     T_Tos = 386,
-     T_Trap = 387,
-     T_True = 388,
-     T_Trustedkey = 389,
-     T_Ttl = 390,
-     T_Type = 391,
-     T_Version = 392,
-     T_Week = 393,
-     T_Year = 394,
-     T_Flag = 395,
-     T_Void = 396,
-     T_EOC = 397,
-     T_Simulate = 398,
-     T_Beep_Delay = 399,
-     T_Sim_Duration = 400,
-     T_Server_Offset = 401,
-     T_Duration = 402,
-     T_Freq_Offset = 403,
-     T_Wander = 404,
-     T_Jitter = 405,
-     T_Prop_Delay = 406,
-     T_Proc_Delay = 407
+     T_Bias = 266,
+     T_Broadcast = 267,
+     T_Broadcastclient = 268,
+     T_Broadcastdelay = 269,
+     T_Burst = 270,
+     T_Calibrate = 271,
+     T_Calldelay = 272,
+     T_Ceiling = 273,
+     T_Clockstats = 274,
+     T_Cohort = 275,
+     T_ControlKey = 276,
+     T_Crypto = 277,
+     T_Cryptostats = 278,
+     T_Day = 279,
+     T_Default = 280,
+     T_Disable = 281,
+     T_Discard = 282,
+     T_Dispersion = 283,
+     T_Double = 284,
+     T_Driftfile = 285,
+     T_WanderThreshold = 286,
+     T_Enable = 287,
+     T_End = 288,
+     T_False = 289,
+     T_File = 290,
+     T_Filegen = 291,
+     T_Flag1 = 292,
+     T_Flag2 = 293,
+     T_Flag3 = 294,
+     T_Flag4 = 295,
+     T_Flake = 296,
+     T_Floor = 297,
+     T_Freq = 298,
+     T_Fudge = 299,
+     T_Host = 300,
+     T_Huffpuff = 301,
+     T_IPv4_address = 302,
+     T_IPv6_address = 303,
+     T_Iburst = 304,
+     T_Ident = 305,
+     T_Ignore = 306,
+     T_Includefile = 307,
+     T_Integer = 308,
+     T_Interface = 309,
+     T_Kernel = 310,
+     T_Key = 311,
+     T_Keys = 312,
+     T_Keysdir = 313,
+     T_Kod = 314,
+     T_Leap = 315,
+     T_Leapfile = 316,
+     T_Limited = 317,
+     T_Link = 318,
+     T_Logconfig = 319,
+     T_Logfile = 320,
+     T_Loopstats = 321,
+     T_Lowpriotrap = 322,
+     T_Manycastclient = 323,
+     T_Manycastserver = 324,
+     T_Mask = 325,
+     T_Maxclock = 326,
+     T_Maxdist = 327,
+     T_Maxhop = 328,
+     T_Maxpoll = 329,
+     T_Minclock = 330,
+     T_Mindist = 331,
+     T_Minimum = 332,
+     T_Minpoll = 333,
+     T_Minsane = 334,
+     T_Mode = 335,
+     T_Monitor = 336,
+     T_Month = 337,
+     T_Multicastclient = 338,
+     T_Nolink = 339,
+     T_Nomodify = 340,
+     T_None = 341,
+     T_Nopeer = 342,
+     T_Noquery = 343,
+     T_Noselect = 344,
+     T_Noserve = 345,
+     T_Notrap = 346,
+     T_Notrust = 347,
+     T_Novolley = 348,
+     T_Ntp = 349,
+     T_Ntpport = 350,
+     T_Orphan = 351,
+     T_Panic = 352,
+     T_Peer = 353,
+     T_Peerstats = 354,
+     T_Phone = 355,
+     T_Pid = 356,
+     T_Pidfile = 357,
+     T_Pool = 358,
+     T_Port = 359,
+     T_Pps = 360,
+     T_Preempt = 361,
+     T_Prefer = 362,
+     T_Protostats = 363,
+     T_Pw = 364,
+     T_Qos = 365,
+     T_RandFile = 366,
+     T_Rawstats = 367,
+     T_Refid = 368,
+     T_Requestkey = 369,
+     T_Restrict = 370,
+     T_Revoke = 371,
+     T_Server = 372,
+     T_Setvar = 373,
+     T_Sign = 374,
+     T_Statistics = 375,
+     T_Stats = 376,
+     T_Statsdir = 377,
+     T_Step = 378,
+     T_Stepout = 379,
+     T_Stratum = 380,
+     T_String = 381,
+     T_Sysstats = 382,
+     T_Tick = 383,
+     T_Time1 = 384,
+     T_Time2 = 385,
+     T_Tinker = 386,
+     T_Tos = 387,
+     T_Trap = 388,
+     T_True = 389,
+     T_Trustedkey = 390,
+     T_Ttl = 391,
+     T_Type = 392,
+     T_Version = 393,
+     T_Week = 394,
+     T_Xleave = 395,
+     T_Year = 396,
+     T_Flag = 397,
+     T_Void = 398,
+     T_EOC = 399,
+     T_Simulate = 400,
+     T_Beep_Delay = 401,
+     T_Sim_Duration = 402,
+     T_Server_Offset = 403,
+     T_Duration = 404,
+     T_Freq_Offset = 405,
+     T_Wander = 406,
+     T_Jitter = 407,
+     T_Prop_Delay = 408,
+     T_Proc_Delay = 409
    };
 #endif
 /* Tokens.  */
 #define T_Average 263
 #define T_Bclient 264
 #define T_Beacon 265
-#define T_Broadcast 266
-#define T_Broadcastclient 267
-#define T_Broadcastdelay 268
-#define T_Burst 269
-#define T_Calibrate 270
-#define T_Calldelay 271
-#define T_Ceiling 272
-#define T_Clockstats 273
-#define T_Cohort 274
-#define T_ControlKey 275
-#define T_Crypto 276
-#define T_Cryptostats 277
-#define T_Day 278
-#define T_Default 279
-#define T_Disable 280
-#define T_Discard 281
-#define T_Dispersion 282
-#define T_Double 283
-#define T_Driftfile 284
-#define T_WanderThreshold 285
-#define T_Enable 286
-#define T_End 287
-#define T_False 288
-#define T_File 289
-#define T_Filegen 290
-#define T_Flag1 291
-#define T_Flag2 292
-#define T_Flag3 293
-#define T_Flag4 294
-#define T_Flake 295
-#define T_Floor 296
-#define T_Freq 297
-#define T_Fudge 298
-#define T_Host 299
-#define T_Huffpuff 300
-#define T_IPv4_address 301
-#define T_IPv6_address 302
-#define T_Iburst 303
-#define T_Ident 304
-#define T_Ignore 305
-#define T_Includefile 306
-#define T_Integer 307
-#define T_Interface 308
-#define T_Kernel 309
-#define T_Key 310
-#define T_Keys 311
-#define T_Keysdir 312
-#define T_Kod 313
-#define T_Leap 314
-#define T_Leapfile 315
-#define T_Limited 316
-#define T_Link 317
-#define T_Logconfig 318
-#define T_Logfile 319
-#define T_Loopstats 320
-#define T_Lowpriotrap 321
-#define T_Manycastclient 322
-#define T_Manycastserver 323
-#define T_Mask 324
-#define T_Maxclock 325
-#define T_Maxdist 326
-#define T_Maxhop 327
-#define T_Maxpoll 328
-#define T_Minclock 329
-#define T_Mindist 330
-#define T_Minimum 331
-#define T_Minpoll 332
-#define T_Minsane 333
-#define T_Mode 334
-#define T_Monitor 335
-#define T_Month 336
-#define T_Multicastclient 337
-#define T_Nolink 338
-#define T_Nomodify 339
-#define T_None 340
-#define T_Nopeer 341
-#define T_Noquery 342
-#define T_Noselect 343
-#define T_Noserve 344
-#define T_Notrap 345
-#define T_Notrust 346
-#define T_Novolley 347
-#define T_Ntp 348
-#define T_Ntpport 349
-#define T_Orphan 350
-#define T_Panic 351
-#define T_Peer 352
-#define T_Peerstats 353
-#define T_Phone 354
-#define T_Pid 355
-#define T_Pidfile 356
-#define T_Pool 357
-#define T_Port 358
-#define T_Pps 359
-#define T_Preempt 360
-#define T_Prefer 361
-#define T_Protostats 362
-#define T_Pw 363
-#define T_Qos 364
-#define T_RandFile 365
-#define T_Rawstats 366
-#define T_Refid 367
-#define T_Requestkey 368
-#define T_Restrict 369
-#define T_Revoke 370
-#define T_Server 371
-#define T_Setvar 372
-#define T_Sign 373
-#define T_Statistics 374
-#define T_Stats 375
-#define T_Statsdir 376
-#define T_Step 377
-#define T_Stepout 378
-#define T_Stratum 379
-#define T_String 380
-#define T_Sysstats 381
-#define T_Tick 382
-#define T_Time1 383
-#define T_Time2 384
-#define T_Tinker 385
-#define T_Tos 386
-#define T_Trap 387
-#define T_True 388
-#define T_Trustedkey 389
-#define T_Ttl 390
-#define T_Type 391
-#define T_Version 392
-#define T_Week 393
-#define T_Year 394
-#define T_Flag 395
-#define T_Void 396
-#define T_EOC 397
-#define T_Simulate 398
-#define T_Beep_Delay 399
-#define T_Sim_Duration 400
-#define T_Server_Offset 401
-#define T_Duration 402
-#define T_Freq_Offset 403
-#define T_Wander 404
-#define T_Jitter 405
-#define T_Prop_Delay 406
-#define T_Proc_Delay 407
+#define T_Bias 266
+#define T_Broadcast 267
+#define T_Broadcastclient 268
+#define T_Broadcastdelay 269
+#define T_Burst 270
+#define T_Calibrate 271
+#define T_Calldelay 272
+#define T_Ceiling 273
+#define T_Clockstats 274
+#define T_Cohort 275
+#define T_ControlKey 276
+#define T_Crypto 277
+#define T_Cryptostats 278
+#define T_Day 279
+#define T_Default 280
+#define T_Disable 281
+#define T_Discard 282
+#define T_Dispersion 283
+#define T_Double 284
+#define T_Driftfile 285
+#define T_WanderThreshold 286
+#define T_Enable 287
+#define T_End 288
+#define T_False 289
+#define T_File 290
+#define T_Filegen 291
+#define T_Flag1 292
+#define T_Flag2 293
+#define T_Flag3 294
+#define T_Flag4 295
+#define T_Flake 296
+#define T_Floor 297
+#define T_Freq 298
+#define T_Fudge 299
+#define T_Host 300
+#define T_Huffpuff 301
+#define T_IPv4_address 302
+#define T_IPv6_address 303
+#define T_Iburst 304
+#define T_Ident 305
+#define T_Ignore 306
+#define T_Includefile 307
+#define T_Integer 308
+#define T_Interface 309
+#define T_Kernel 310
+#define T_Key 311
+#define T_Keys 312
+#define T_Keysdir 313
+#define T_Kod 314
+#define T_Leap 315
+#define T_Leapfile 316
+#define T_Limited 317
+#define T_Link 318
+#define T_Logconfig 319
+#define T_Logfile 320
+#define T_Loopstats 321
+#define T_Lowpriotrap 322
+#define T_Manycastclient 323
+#define T_Manycastserver 324
+#define T_Mask 325
+#define T_Maxclock 326
+#define T_Maxdist 327
+#define T_Maxhop 328
+#define T_Maxpoll 329
+#define T_Minclock 330
+#define T_Mindist 331
+#define T_Minimum 332
+#define T_Minpoll 333
+#define T_Minsane 334
+#define T_Mode 335
+#define T_Monitor 336
+#define T_Month 337
+#define T_Multicastclient 338
+#define T_Nolink 339
+#define T_Nomodify 340
+#define T_None 341
+#define T_Nopeer 342
+#define T_Noquery 343
+#define T_Noselect 344
+#define T_Noserve 345
+#define T_Notrap 346
+#define T_Notrust 347
+#define T_Novolley 348
+#define T_Ntp 349
+#define T_Ntpport 350
+#define T_Orphan 351
+#define T_Panic 352
+#define T_Peer 353
+#define T_Peerstats 354
+#define T_Phone 355
+#define T_Pid 356
+#define T_Pidfile 357
+#define T_Pool 358
+#define T_Port 359
+#define T_Pps 360
+#define T_Preempt 361
+#define T_Prefer 362
+#define T_Protostats 363
+#define T_Pw 364
+#define T_Qos 365
+#define T_RandFile 366
+#define T_Rawstats 367
+#define T_Refid 368
+#define T_Requestkey 369
+#define T_Restrict 370
+#define T_Revoke 371
+#define T_Server 372
+#define T_Setvar 373
+#define T_Sign 374
+#define T_Statistics 375
+#define T_Stats 376
+#define T_Statsdir 377
+#define T_Step 378
+#define T_Stepout 379
+#define T_Stratum 380
+#define T_String 381
+#define T_Sysstats 382
+#define T_Tick 383
+#define T_Time1 384
+#define T_Time2 385
+#define T_Tinker 386
+#define T_Tos 387
+#define T_Trap 388
+#define T_True 389
+#define T_Trustedkey 390
+#define T_Ttl 391
+#define T_Type 392
+#define T_Version 393
+#define T_Week 394
+#define T_Xleave 395
+#define T_Year 396
+#define T_Flag 397
+#define T_Void 398
+#define T_EOC 399
+#define T_Simulate 400
+#define T_Beep_Delay 401
+#define T_Sim_Duration 402
+#define T_Server_Offset 403
+#define T_Duration 404
+#define T_Freq_Offset 405
+#define T_Wander 406
+#define T_Jitter 407
+#define T_Prop_Delay 408
+#define T_Proc_Delay 409
 
 
 
@@ -449,7 +453,7 @@ typedef union YYSTYPE
     script_info *Sim_script;
 }
 /* Line 193 of yacc.c.  */
-#line 453 "../../ntpd/ntp_parser.c"
+#line 457 "../../ntpd/ntp_parser.c"
        YYSTYPE;
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
 # define YYSTYPE_IS_DECLARED 1
@@ -462,7 +466,7 @@ typedef union YYSTYPE
 
 
 /* Line 216 of yacc.c.  */
-#line 466 "../../ntpd/ntp_parser.c"
+#line 470 "../../ntpd/ntp_parser.c"
 
 #ifdef short
 # undef short
@@ -677,20 +681,20 @@ union yyalloc
 /* YYFINAL -- State number of the termination state.  */
 #define YYFINAL  164
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   513
+#define YYLAST   546
 
 /* YYNTOKENS -- Number of terminals.  */
-#define YYNTOKENS  158
+#define YYNTOKENS  160
 /* YYNNTS -- Number of nonterminals.  */
 #define YYNNTS  64
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  228
+#define YYNRULES  230
 /* YYNRULES -- Number of states.  */
-#define YYNSTATES  358
+#define YYNSTATES  361
 
 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
 #define YYUNDEFTOK  2
-#define YYMAXUTOK   407
+#define YYMAXUTOK   409
 
 #define YYTRANSLATE(YYX)                                               \
   ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
@@ -702,15 +706,15 @@ static const yytype_uint8 yytranslate[] =
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,   154,     2,   155,     2,     2,     2,     2,
+       2,     2,     2,   156,     2,   157,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,   153,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,   155,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,   156,     2,   157,     2,     2,     2,     2,
+       2,     2,     2,   158,     2,   159,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
@@ -738,7 +742,7 @@ static const yytype_uint8 yytranslate[] =
      115,   116,   117,   118,   119,   120,   121,   122,   123,   124,
      125,   126,   127,   128,   129,   130,   131,   132,   133,   134,
      135,   136,   137,   138,   139,   140,   141,   142,   143,   144,
-     145,   146,   147,   148,   149,   150,   151,   152
+     145,   146,   147,   148,   149,   150,   151,   152,   153,   154
 };
 
 #if YYDEBUG
@@ -749,121 +753,123 @@ static const yytype_uint16 yyprhs[] =
        0,     0,     3,     5,     9,    12,    15,    16,    18,    20,
       22,    24,    26,    28,    30,    32,    34,    36,    38,    42,
       45,    47,    49,    51,    53,    55,    57,    59,    62,    64,
-      66,    69,    71,    73,    75,    77,    80,    83,    86,    88,
-      90,    92,    94,    97,   100,   103,   105,   108,   111,   114,
-     117,   120,   123,   126,   129,   132,   135,   137,   138,   141,
-     143,   146,   149,   152,   155,   158,   161,   164,   167,   169,
-     172,   175,   178,   181,   184,   187,   190,   193,   196,   199,
-     202,   205,   208,   212,   215,   217,   219,   221,   223,   225,
-     227,   229,   231,   234,   236,   239,   242,   244,   246,   248,
-     250,   252,   254,   256,   258,   260,   262,   264,   267,   271,
-     275,   281,   282,   285,   287,   289,   291,   293,   295,   297,
-     299,   301,   303,   305,   307,   309,   311,   314,   316,   319,
-     322,   325,   329,   332,   334,   337,   340,   343,   346,   349,
-     352,   355,   358,   361,   364,   367,   369,   371,   373,   375,
-     377,   379,   381,   383,   386,   389,   391,   394,   397,   400,
-     403,   406,   409,   412,   416,   418,   421,   424,   427,   430,
-     433,   436,   439,   442,   445,   448,   451,   455,   458,   461,
-     463,   466,   467,   472,   476,   479,   481,   484,   487,   490,
-     492,   495,   497,   499,   501,   503,   506,   508,   511,   513,
-     516,   518,   520,   522,   524,   526,   528,   534,   536,   540,
-     543,   547,   551,   554,   556,   562,   567,   571,   573,   575,
-     578,   580,   587,   591,   594,   598,   602,   606,   610
+      66,    69,    71,    73,    76,    78,    80,    83,    86,    89,
+      91,    93,    95,    97,    99,   102,   105,   108,   110,   113,
+     116,   119,   122,   125,   128,   131,   134,   137,   140,   142,
+     143,   146,   148,   151,   154,   157,   160,   163,   166,   169,
+     172,   174,   177,   180,   183,   186,   189,   192,   195,   198,
+     201,   204,   207,   210,   213,   217,   220,   222,   224,   226,
+     228,   230,   232,   234,   236,   239,   241,   244,   247,   249,
+     251,   253,   255,   257,   259,   261,   263,   265,   267,   269,
+     272,   276,   280,   286,   287,   290,   292,   294,   296,   298,
+     300,   302,   304,   306,   308,   310,   312,   314,   316,   319,
+     321,   324,   327,   330,   334,   337,   339,   342,   345,   348,
+     351,   354,   357,   360,   363,   366,   369,   372,   374,   376,
+     378,   380,   382,   384,   386,   388,   391,   394,   396,   399,
+     402,   405,   408,   411,   414,   417,   421,   423,   426,   429,
+     432,   435,   438,   441,   444,   447,   450,   453,   456,   460,
+     463,   466,   468,   471,   472,   477,   481,   484,   486,   489,
+     492,   495,   497,   500,   502,   504,   506,   508,   511,   513,
+     516,   518,   521,   523,   525,   527,   529,   531,   533,   539,
+     541,   545,   548,   552,   556,   559,   561,   567,   572,   576,
+     578,   580,   583,   585,   592,   596,   599,   603,   607,   611,
+     615
 };
 
 /* YYRHS -- A `-1'-separated list of the rules' RHS.  */
 static const yytype_int16 yyrhs[] =
 {
-     159,     0,    -1,   160,    -1,   160,   161,   142,    -1,   161,
-     142,    -1,     1,   142,    -1,    -1,   162,    -1,   168,    -1,
-     169,    -1,   176,    -1,   182,    -1,   173,    -1,   187,    -1,
-     190,    -1,   193,    -1,   196,    -1,   209,    -1,   163,   164,
-     166,    -1,   163,   164,    -1,   116,    -1,   102,    -1,    97,
-      -1,    11,    -1,    67,    -1,   165,    -1,   125,    -1,    52,
-     125,    -1,    46,    -1,    47,    -1,   166,   167,    -1,   167,
-      -1,     6,    -1,    14,    -1,    48,    -1,    55,    52,    -1,
-      77,    52,    -1,    73,    52,    -1,    88,    -1,   105,    -1,
-     106,    -1,   133,    -1,   135,    52,    -1,    79,    52,    -1,
-     137,    52,    -1,    12,    -1,    12,    92,    -1,    68,   206,
-      -1,    82,   206,    -1,     6,    52,    -1,    20,    52,    -1,
-      21,   170,    -1,    56,   125,    -1,    57,   125,    -1,   113,
-      52,    -1,   134,   204,    -1,   171,    -1,    -1,   171,   172,
-      -1,   172,    -1,    44,   125,    -1,    49,   125,    -1,   108,
-     125,    -1,   110,   125,    -1,   115,    52,    -1,   118,   125,
-      -1,   131,   174,    -1,   174,   175,    -1,   175,    -1,    17,
-      52,    -1,    41,    52,    -1,    19,   207,    -1,    95,    52,
-      -1,    75,   208,    -1,    71,   208,    -1,    74,   208,    -1,
-      70,   208,    -1,    78,    52,    -1,    10,    52,    -1,    72,
-      52,    -1,   119,   177,    -1,   121,   125,    -1,    35,   178,
-     179,    -1,   177,   178,    -1,   178,    -1,    18,    -1,    22,
-      -1,    65,    -1,    98,    -1,   111,    -1,   126,    -1,   107,
-      -1,   179,   180,    -1,   180,    -1,    34,   125,    -1,   136,
-     181,    -1,    62,    -1,    83,    -1,    31,    -1,    25,    -1,
-      85,    -1,   100,    -1,    23,    -1,   138,    -1,    81,    -1,
-     139,    -1,     3,    -1,    26,   185,    -1,   114,   164,   183,
-      -1,   114,    24,   183,    -1,   114,   165,    69,   165,   183,
-      -1,    -1,   183,   184,    -1,    40,    -1,    50,    -1,    58,
-      -1,    61,    -1,    66,    -1,    84,    -1,    86,    -1,    87,
-      -1,    89,    -1,    90,    -1,    91,    -1,    94,    -1,   137,
-      -1,   185,   186,    -1,   186,    -1,     8,    52,    -1,    76,
-      52,    -1,    80,    52,    -1,    43,   164,   188,    -1,   188,
-     189,    -1,   189,    -1,   128,   208,    -1,   129,   208,    -1,
-     124,    52,    -1,   112,   125,    -1,    36,   207,    -1,    37,
-     207,    -1,    38,   207,    -1,    39,   207,    -1,    31,   191,
-      -1,    25,   191,    -1,   191,   192,    -1,   192,    -1,     5,
-      -1,     9,    -1,    15,    -1,    54,    -1,    80,    -1,    93,
-      -1,   120,    -1,   130,   194,    -1,   194,   195,    -1,   195,
-      -1,     4,   208,    -1,    27,   208,    -1,    42,   208,    -1,
-      45,   208,    -1,    96,   208,    -1,   122,   208,    -1,   123,
-     208,    -1,    51,   125,   161,    -1,    32,    -1,    13,   208,
-      -1,    16,    52,    -1,   127,   208,    -1,    29,   197,    -1,
-      60,   125,    -1,   101,   125,    -1,    64,   125,    -1,     7,
-      52,    -1,    63,   201,    -1,    99,   205,    -1,   117,   198,
-      -1,   132,   165,   199,    -1,   135,   204,    -1,   109,   125,
-      -1,   125,    -1,   125,    28,    -1,    -1,   125,   153,   125,
-      24,    -1,   125,   153,   125,    -1,   199,   200,    -1,   200,
-      -1,   103,    52,    -1,    53,   165,    -1,   201,   202,    -1,
-     202,    -1,   203,   125,    -1,   125,    -1,   154,    -1,   155,
-      -1,   153,    -1,   204,    52,    -1,    52,    -1,   205,   125,
-      -1,   125,    -1,   206,   164,    -1,   164,    -1,    52,    -1,
-     133,    -1,    33,    -1,    52,    -1,    28,    -1,   210,   156,
-     211,   213,   157,    -1,   143,    -1,   211,   212,   142,    -1,
-     212,   142,    -1,   144,   153,   208,    -1,   145,   153,   208,
-      -1,   213,   214,    -1,   214,    -1,   216,   156,   215,   218,
-     157,    -1,   146,   153,   208,   142,    -1,   116,   153,   217,
-      -1,   165,    -1,   125,    -1,   218,   219,    -1,   219,    -1,
-     147,   153,   208,   156,   220,   157,    -1,   220,   221,   142,
-      -1,   221,   142,    -1,   148,   153,   208,    -1,   149,   153,
-     208,    -1,   150,   153,   208,    -1,   151,   153,   208,    -1,
-     152,   153,   208,    -1
+     161,     0,    -1,   162,    -1,   162,   163,   144,    -1,   163,
+     144,    -1,     1,   144,    -1,    -1,   164,    -1,   170,    -1,
+     171,    -1,   178,    -1,   184,    -1,   175,    -1,   189,    -1,
+     192,    -1,   195,    -1,   198,    -1,   211,    -1,   165,   166,
+     168,    -1,   165,   166,    -1,   117,    -1,   103,    -1,    98,
+      -1,    12,    -1,    68,    -1,   167,    -1,   126,    -1,    53,
+     126,    -1,    47,    -1,    48,    -1,   168,   169,    -1,   169,
+      -1,     6,    -1,    11,   210,    -1,    15,    -1,    49,    -1,
+      56,    53,    -1,    78,    53,    -1,    74,    53,    -1,    89,
+      -1,   106,    -1,   107,    -1,   134,    -1,   140,    -1,   136,
+      53,    -1,    80,    53,    -1,   138,    53,    -1,    13,    -1,
+      13,    93,    -1,    69,   208,    -1,    83,   208,    -1,     6,
+      53,    -1,    21,    53,    -1,    22,   172,    -1,    57,   126,
+      -1,    58,   126,    -1,   114,    53,    -1,   135,   206,    -1,
+     173,    -1,    -1,   173,   174,    -1,   174,    -1,    45,   126,
+      -1,    50,   126,    -1,   109,   126,    -1,   111,   126,    -1,
+     116,    53,    -1,   119,   126,    -1,   132,   176,    -1,   176,
+     177,    -1,   177,    -1,    18,    53,    -1,    42,    53,    -1,
+      20,   209,    -1,    96,    53,    -1,    76,   210,    -1,    72,
+     210,    -1,    75,   210,    -1,    71,   210,    -1,    79,    53,
+      -1,    10,    53,    -1,    73,    53,    -1,   120,   179,    -1,
+     122,   126,    -1,    36,   180,   181,    -1,   179,   180,    -1,
+     180,    -1,    19,    -1,    23,    -1,    66,    -1,    99,    -1,
+     112,    -1,   127,    -1,   108,    -1,   181,   182,    -1,   182,
+      -1,    35,   126,    -1,   137,   183,    -1,    63,    -1,    84,
+      -1,    32,    -1,    26,    -1,    86,    -1,   101,    -1,    24,
+      -1,   139,    -1,    82,    -1,   141,    -1,     3,    -1,    27,
+     187,    -1,   115,   166,   185,    -1,   115,    25,   185,    -1,
+     115,   167,    70,   167,   185,    -1,    -1,   185,   186,    -1,
+      41,    -1,    51,    -1,    59,    -1,    62,    -1,    67,    -1,
+      85,    -1,    87,    -1,    88,    -1,    90,    -1,    91,    -1,
+      92,    -1,    95,    -1,   138,    -1,   187,   188,    -1,   188,
+      -1,     8,    53,    -1,    77,    53,    -1,    81,    53,    -1,
+      44,   166,   190,    -1,   190,   191,    -1,   191,    -1,   129,
+     210,    -1,   130,   210,    -1,   125,    53,    -1,   113,   126,
+      -1,    37,   209,    -1,    38,   209,    -1,    39,   209,    -1,
+      40,   209,    -1,    32,   193,    -1,    26,   193,    -1,   193,
+     194,    -1,   194,    -1,     5,    -1,     9,    -1,    16,    -1,
+      55,    -1,    81,    -1,    94,    -1,   121,    -1,   131,   196,
+      -1,   196,   197,    -1,   197,    -1,     4,   210,    -1,    28,
+     210,    -1,    43,   210,    -1,    46,   210,    -1,    97,   210,
+      -1,   123,   210,    -1,   124,   210,    -1,    52,   126,   163,
+      -1,    33,    -1,    14,   210,    -1,    17,    53,    -1,   128,
+     210,    -1,    30,   199,    -1,    61,   126,    -1,   102,   126,
+      -1,    65,   126,    -1,     7,    53,    -1,    64,   203,    -1,
+     100,   207,    -1,   118,   200,    -1,   133,   167,   201,    -1,
+     136,   206,    -1,   110,   126,    -1,   126,    -1,   126,    29,
+      -1,    -1,   126,   155,   126,    25,    -1,   126,   155,   126,
+      -1,   201,   202,    -1,   202,    -1,   104,    53,    -1,    54,
+     167,    -1,   203,   204,    -1,   204,    -1,   205,   126,    -1,
+     126,    -1,   156,    -1,   157,    -1,   155,    -1,   206,    53,
+      -1,    53,    -1,   207,   126,    -1,   126,    -1,   208,   166,
+      -1,   166,    -1,    53,    -1,   134,    -1,    34,    -1,    53,
+      -1,    29,    -1,   212,   158,   213,   215,   159,    -1,   145,
+      -1,   213,   214,   144,    -1,   214,   144,    -1,   146,   155,
+     210,    -1,   147,   155,   210,    -1,   215,   216,    -1,   216,
+      -1,   218,   158,   217,   220,   159,    -1,   148,   155,   210,
+     144,    -1,   117,   155,   219,    -1,   167,    -1,   126,    -1,
+     220,   221,    -1,   221,    -1,   149,   155,   210,   158,   222,
+     159,    -1,   222,   223,   144,    -1,   223,   144,    -1,   150,
+     155,   210,    -1,   151,   155,   210,    -1,   152,   155,   210,
+      -1,   153,   155,   210,    -1,   154,   155,   210,    -1
 };
 
 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
 static const yytype_uint16 yyrline[] =
 {
-       0,   281,   281,   285,   286,   291,   302,   303,   304,   305,
-     306,   307,   308,   309,   310,   311,   312,   313,   321,   327,
-     336,   337,   338,   339,   340,   344,   345,   346,   362,   363,
-     367,   368,   373,   374,   375,   376,   377,   378,   379,   380,
-     381,   382,   383,   384,   385,   395,   397,   399,   401,   412,
-     414,   416,   423,   425,   427,   429,   434,   436,   440,   441,
-     445,   447,   449,   451,   453,   455,   465,   470,   471,   475,
-     477,   479,   481,   483,   485,   487,   489,   491,   493,   495,
-     505,   507,   509,   517,   518,   522,   524,   526,   528,   530,
-     532,   534,   539,   540,   544,   545,   546,   547,   548,   549,
-     553,   554,   555,   556,   557,   558,   559,   568,   570,   575,
-     580,   588,   589,   593,   594,   595,   596,   597,   598,   599,
-     600,   601,   602,   603,   604,   605,   609,   610,   614,   615,
-     616,   624,   629,   630,   634,   636,   638,   640,   642,   644,
-     646,   648,   657,   659,   664,   665,   669,   670,   671,   672,
-     673,   674,   676,   684,   688,   689,   693,   694,   695,   696,
-     697,   698,   699,   707,   723,   729,   731,   733,   735,   737,
-     740,   742,   744,   747,   749,   751,   753,   755,   757,   761,
-     763,   766,   771,   773,   779,   780,   784,   785,   790,   791,
-     795,   796,   813,   814,   815,   824,   825,   829,   830,   834,
-     835,   839,   848,   849,   853,   854,   862,   877,   881,   882,
-     886,   887,   891,   892,   896,   901,   905,   909,   910,   914,
-     915,   919,   924,   925,   929,   931,   933,   935,   937
+       0,   283,   283,   287,   288,   293,   304,   305,   306,   307,
+     308,   309,   310,   311,   312,   313,   314,   315,   323,   329,
+     338,   339,   340,   341,   342,   346,   347,   348,   364,   365,
+     369,   370,   375,   376,   377,   378,   379,   380,   381,   382,
+     383,   384,   385,   386,   387,   388,   389,   399,   401,   403,
+     405,   416,   418,   420,   427,   429,   431,   433,   438,   440,
+     444,   445,   449,   451,   453,   455,   457,   459,   469,   474,
+     475,   479,   481,   483,   485,   487,   489,   491,   493,   495,
+     497,   499,   509,   511,   513,   521,   522,   526,   528,   530,
+     532,   534,   536,   538,   543,   544,   548,   549,   550,   551,
+     552,   553,   557,   558,   559,   560,   561,   562,   563,   572,
+     574,   579,   584,   592,   593,   597,   598,   599,   600,   601,
+     602,   603,   604,   605,   606,   607,   608,   609,   613,   614,
+     618,   619,   620,   628,   633,   634,   638,   640,   642,   644,
+     646,   648,   650,   652,   661,   663,   668,   669,   673,   674,
+     675,   676,   677,   678,   680,   688,   692,   693,   697,   698,
+     699,   700,   701,   702,   703,   711,   727,   733,   735,   737,
+     739,   741,   744,   746,   748,   751,   753,   755,   757,   759,
+     761,   765,   767,   770,   775,   777,   783,   784,   788,   789,
+     794,   795,   799,   800,   817,   818,   819,   828,   829,   833,
+     834,   838,   839,   843,   852,   853,   857,   858,   866,   881,
+     885,   886,   890,   891,   895,   896,   900,   905,   909,   913,
+     914,   918,   919,   923,   928,   929,   933,   935,   937,   939,
+     941
 };
 #endif
 
@@ -873,7 +879,7 @@ static const yytype_uint16 yyrline[] =
 static const char *const yytname[] =
 {
   "$end", "error", "$undefined", "T_Age", "T_Allan", "T_Auth",
-  "T_Autokey", "T_Automax", "T_Average", "T_Bclient", "T_Beacon",
+  "T_Autokey", "T_Automax", "T_Average", "T_Bclient", "T_Beacon", "T_Bias",
   "T_Broadcast", "T_Broadcastclient", "T_Broadcastdelay", "T_Burst",
   "T_Calibrate", "T_Calldelay", "T_Ceiling", "T_Clockstats", "T_Cohort",
   "T_ControlKey", "T_Crypto", "T_Cryptostats", "T_Day", "T_Default",
@@ -898,28 +904,28 @@ static const char *const yytname[] =
   "T_Statsdir", "T_Step", "T_Stepout", "T_Stratum", "T_String",
   "T_Sysstats", "T_Tick", "T_Time1", "T_Time2", "T_Tinker", "T_Tos",
   "T_Trap", "T_True", "T_Trustedkey", "T_Ttl", "T_Type", "T_Version",
-  "T_Week", "T_Year", "T_Flag", "T_Void", "T_EOC", "T_Simulate",
-  "T_Beep_Delay", "T_Sim_Duration", "T_Server_Offset", "T_Duration",
-  "T_Freq_Offset", "T_Wander", "T_Jitter", "T_Prop_Delay", "T_Proc_Delay",
-  "'='", "'+'", "'-'", "'{'", "'}'", "$accept", "configuration",
-  "command_list", "command", "server_command", "client_type", "address",
-  "ip_address", "option_list", "option", "other_mode_command",
-  "authentication_command", "crypto_command_line", "crypto_command_list",
-  "crypto_command", "orphan_mode_command", "tos_option_list", "tos_option",
-  "monitoring_command", "stats_list", "stat", "filegen_option_list",
-  "filegen_option", "filegen_type", "access_control_command",
-  "ac_flag_list", "access_control_flag", "discard_option_list",
-  "discard_option", "fudge_command", "fudge_factor_list", "fudge_factor",
-  "system_option_command", "system_option_list", "system_option",
-  "tinker_command", "tinker_option_list", "tinker_option",
-  "miscellaneous_command", "drift_parm", "variable_assign",
-  "trap_option_list", "trap_option", "log_config_list",
-  "log_config_command", "log_config_prefix", "integer_list", "string_list",
-  "address_list", "boolean", "number", "simulate_command",
-  "sim_conf_start", "sim_init_statement_list", "sim_init_statement",
-  "sim_server_list", "sim_server", "sim_server_offset", "sim_server_name",
-  "sim_address", "sim_act_list", "sim_act", "sim_act_stmt_list",
-  "sim_act_stmt", 0
+  "T_Week", "T_Xleave", "T_Year", "T_Flag", "T_Void", "T_EOC",
+  "T_Simulate", "T_Beep_Delay", "T_Sim_Duration", "T_Server_Offset",
+  "T_Duration", "T_Freq_Offset", "T_Wander", "T_Jitter", "T_Prop_Delay",
+  "T_Proc_Delay", "'='", "'+'", "'-'", "'{'", "'}'", "$accept",
+  "configuration", "command_list", "command", "server_command",
+  "client_type", "address", "ip_address", "option_list", "option",
+  "other_mode_command", "authentication_command", "crypto_command_line",
+  "crypto_command_list", "crypto_command", "orphan_mode_command",
+  "tos_option_list", "tos_option", "monitoring_command", "stats_list",
+  "stat", "filegen_option_list", "filegen_option", "filegen_type",
+  "access_control_command", "ac_flag_list", "access_control_flag",
+  "discard_option_list", "discard_option", "fudge_command",
+  "fudge_factor_list", "fudge_factor", "system_option_command",
+  "system_option_list", "system_option", "tinker_command",
+  "tinker_option_list", "tinker_option", "miscellaneous_command",
+  "drift_parm", "variable_assign", "trap_option_list", "trap_option",
+  "log_config_list", "log_config_command", "log_config_prefix",
+  "integer_list", "string_list", "address_list", "boolean", "number",
+  "simulate_command", "sim_conf_start", "sim_init_statement_list",
+  "sim_init_statement", "sim_server_list", "sim_server",
+  "sim_server_offset", "sim_server_name", "sim_address", "sim_act_list",
+  "sim_act", "sim_act_stmt_list", "sim_act_stmt", 0
 };
 #endif
 
@@ -943,36 +949,37 @@ static const yytype_uint16 yytoknum[] =
      375,   376,   377,   378,   379,   380,   381,   382,   383,   384,
      385,   386,   387,   388,   389,   390,   391,   392,   393,   394,
      395,   396,   397,   398,   399,   400,   401,   402,   403,   404,
-     405,   406,   407,    61,    43,    45,   123,   125
+     405,   406,   407,   408,   409,    61,    43,    45,   123,   125
 };
 # endif
 
 /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
 static const yytype_uint8 yyr1[] =
 {
-       0,   158,   159,   160,   160,   160,   161,   161,   161,   161,
-     161,   161,   161,   161,   161,   161,   161,   161,   162,   162,
-     163,   163,   163,   163,   163,   164,   164,   164,   165,   165,
-     166,   166,   167,   167,   167,   167,   167,   167,   167,   167,
-     167,   167,   167,   167,   167,   168,   168,   168,   168,   169,
-     169,   169,   169,   169,   169,   169,   170,   170,   171,   171,
-     172,   172,   172,   172,   172,   172,   173,   174,   174,   175,
-     175,   175,   175,   175,   175,   175,   175,   175,   175,   175,
-     176,   176,   176,   177,   177,   178,   178,   178,   178,   178,
-     178,   178,   179,   179,   180,   180,   180,   180,   180,   180,
-     181,   181,   181,   181,   181,   181,   181,   182,   182,   182,
-     182,   183,   183,   184,   184,   184,   184,   184,   184,   184,
-     184,   184,   184,   184,   184,   184,   185,   185,   186,   186,
-     186,   187,   188,   188,   189,   189,   189,   189,   189,   189,
-     189,   189,   190,   190,   191,   191,   192,   192,   192,   192,
-     192,   192,   192,   193,   194,   194,   195,   195,   195,   195,
-     195,   195,   195,   196,   196,   196,   196,   196,   196,   196,
-     196,   196,   196,   196,   196,   196,   196,   196,   196,   197,
-     197,   197,   198,   198,   199,   199,   200,   200,   201,   201,
-     202,   202,   203,   203,   203,   204,   204,   205,   205,   206,
-     206,   207,   207,   207,   208,   208,   209,   210,   211,   211,
-     212,   212,   213,   213,   214,   215,   216,   217,   217,   218,
-     218,   219,   220,   220,   221,   221,   221,   221,   221
+       0,   160,   161,   162,   162,   162,   163,   163,   163,   163,
+     163,   163,   163,   163,   163,   163,   163,   163,   164,   164,
+     165,   165,   165,   165,   165,   166,   166,   166,   167,   167,
+     168,   168,   169,   169,   169,   169,   169,   169,   169,   169,
+     169,   169,   169,   169,   169,   169,   169,   170,   170,   170,
+     170,   171,   171,   171,   171,   171,   171,   171,   172,   172,
+     173,   173,   174,   174,   174,   174,   174,   174,   175,   176,
+     176,   177,   177,   177,   177,   177,   177,   177,   177,   177,
+     177,   177,   178,   178,   178,   179,   179,   180,   180,   180,
+     180,   180,   180,   180,   181,   181,   182,   182,   182,   182,
+     182,   182,   183,   183,   183,   183,   183,   183,   183,   184,
+     184,   184,   184,   185,   185,   186,   186,   186,   186,   186,
+     186,   186,   186,   186,   186,   186,   186,   186,   187,   187,
+     188,   188,   188,   189,   190,   190,   191,   191,   191,   191,
+     191,   191,   191,   191,   192,   192,   193,   193,   194,   194,
+     194,   194,   194,   194,   194,   195,   196,   196,   197,   197,
+     197,   197,   197,   197,   197,   198,   198,   198,   198,   198,
+     198,   198,   198,   198,   198,   198,   198,   198,   198,   198,
+     198,   199,   199,   199,   200,   200,   201,   201,   202,   202,
+     203,   203,   204,   204,   205,   205,   205,   206,   206,   207,
+     207,   208,   208,   209,   209,   209,   210,   210,   211,   212,
+     213,   213,   214,   214,   215,   215,   216,   217,   218,   219,
+     219,   220,   220,   221,   222,   222,   223,   223,   223,   223,
+     223
 };
 
 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
@@ -981,26 +988,27 @@ static const yytype_uint8 yyr2[] =
        0,     2,     1,     3,     2,     2,     0,     1,     1,     1,
        1,     1,     1,     1,     1,     1,     1,     1,     3,     2,
        1,     1,     1,     1,     1,     1,     1,     2,     1,     1,
-       2,     1,     1,     1,     1,     2,     2,     2,     1,     1,
-       1,     1,     2,     2,     2,     1,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     1,     0,     2,     1,
-       2,     2,     2,     2,     2,     2,     2,     2,     1,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     3,     2,     1,     1,     1,     1,     1,     1,
-       1,     1,     2,     1,     2,     2,     1,     1,     1,     1,
-       1,     1,     1,     1,     1,     1,     1,     2,     3,     3,
-       5,     0,     2,     1,     1,     1,     1,     1,     1,     1,
-       1,     1,     1,     1,     1,     1,     2,     1,     2,     2,
-       2,     3,     2,     1,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     1,     1,     1,     1,     1,
-       1,     1,     1,     2,     2,     1,     2,     2,     2,     2,
-       2,     2,     2,     3,     1,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     3,     2,     2,     1,
-       2,     0,     4,     3,     2,     1,     2,     2,     2,     1,
-       2,     1,     1,     1,     1,     2,     1,     2,     1,     2,
-       1,     1,     1,     1,     1,     1,     5,     1,     3,     2,
-       3,     3,     2,     1,     5,     4,     3,     1,     1,     2,
-       1,     6,     3,     2,     3,     3,     3,     3,     3
+       2,     1,     1,     2,     1,     1,     2,     2,     2,     1,
+       1,     1,     1,     1,     2,     2,     2,     1,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     1,     0,
+       2,     1,     2,     2,     2,     2,     2,     2,     2,     2,
+       1,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     3,     2,     1,     1,     1,     1,
+       1,     1,     1,     1,     2,     1,     2,     2,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     1,     1,     2,
+       3,     3,     5,     0,     2,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     1,     2,     1,
+       2,     2,     2,     3,     2,     1,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     1,     1,     1,
+       1,     1,     1,     1,     1,     2,     2,     1,     2,     2,
+       2,     2,     2,     2,     2,     3,     1,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     3,     2,
+       2,     1,     2,     0,     4,     3,     2,     1,     2,     2,
+       2,     1,     2,     1,     1,     1,     1,     2,     1,     2,
+       1,     2,     1,     1,     1,     1,     1,     1,     5,     1,
+       3,     2,     3,     3,     2,     1,     5,     4,     3,     1,
+       1,     2,     1,     6,     3,     2,     3,     3,     3,     3,
+       3
 };
 
 /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
@@ -1008,54 +1016,55 @@ static const yytype_uint8 yyr2[] =
    means the default is an error.  */
 static const yytype_uint8 yydefact[] =
 {
-       0,     0,     0,     0,    23,    45,     0,     0,     0,    57,
-       0,     0,   181,     0,   164,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,    23,    47,     0,     0,     0,    59,
+       0,     0,   183,     0,   166,     0,     0,     0,     0,     0,
        0,     0,     0,    24,     0,     0,    22,     0,     0,    21,
        0,     0,     0,    20,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   207,     0,     2,     0,     7,     0,     8,
+       0,     0,     0,   209,     0,     2,     0,     7,     0,     8,
        9,    12,    10,    11,    13,    14,    15,    16,    17,     0,
-       5,    49,   172,    46,   205,   204,   165,   166,    50,     0,
-       0,     0,     0,     0,     0,    51,    56,    59,   146,   147,
-     148,   149,   150,   151,   152,   143,   145,     0,     0,     0,
-     107,   127,   179,   168,   142,    85,    86,    87,    88,    91,
-      89,    90,     0,    28,    29,     0,    26,     0,    25,     6,
-      52,    53,   169,   191,   194,   192,   193,   173,   189,     0,
-     171,   200,    47,    48,   198,   174,   170,   178,    54,   111,
-     111,    25,     0,   175,    80,    84,    81,   167,     0,     0,
-       0,     0,     0,     0,     0,   153,   155,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,    66,    68,
-       0,   196,    55,   177,     1,     0,     4,    19,     0,    60,
-      61,    62,    63,    64,    65,    58,   144,   128,   129,   130,
-     126,   180,    99,    98,     0,    96,    97,     0,    82,    93,
-      27,     0,     0,     0,     0,     0,     0,     0,     0,   131,
-     133,   163,   188,   190,   199,   197,   109,   108,     0,     0,
-      83,   156,   157,   158,   159,   160,   161,   162,   154,    78,
-      69,   203,   201,   202,    71,    70,    76,    74,    79,    75,
-      73,    77,    72,    67,     0,     0,   176,   185,   195,     3,
-      32,    33,    34,     0,     0,     0,     0,    38,    39,    40,
-      41,     0,     0,    18,    31,     0,     0,     0,     0,    94,
-     106,   102,   104,   100,   101,   103,   105,    95,    92,   138,
-     139,   140,   141,   137,   136,   134,   135,   132,   113,   114,
+       5,    51,   174,    48,   207,   206,   167,   168,    52,     0,
+       0,     0,     0,     0,     0,    53,    58,    61,   148,   149,
+     150,   151,   152,   153,   154,   145,   147,     0,     0,     0,
+     109,   129,   181,   170,   144,    87,    88,    89,    90,    93,
+      91,    92,     0,    28,    29,     0,    26,     0,    25,     6,
+      54,    55,   171,   193,   196,   194,   195,   175,   191,     0,
+     173,   202,    49,    50,   200,   176,   172,   180,    56,   113,
+     113,    25,     0,   177,    82,    86,    83,   169,     0,     0,
+       0,     0,     0,     0,     0,   155,   157,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,    68,    70,
+       0,   198,    57,   179,     1,     0,     4,    19,     0,    62,
+      63,    64,    65,    66,    67,    60,   146,   130,   131,   132,
+     128,   182,   101,   100,     0,    98,    99,     0,    84,    95,
+      27,     0,     0,     0,     0,     0,     0,     0,     0,   133,
+     135,   165,   190,   192,   201,   199,   111,   110,     0,     0,
+      85,   158,   159,   160,   161,   162,   163,   164,   156,    80,
+      71,   205,   203,   204,    73,    72,    78,    76,    81,    77,
+      75,    79,    74,    69,     0,     0,   178,   187,   197,     3,
+      32,     0,    34,    35,     0,     0,     0,     0,    39,    40,
+      41,    42,     0,     0,    43,    18,    31,     0,     0,     0,
+       0,    96,   108,   104,   106,   102,   103,   105,   107,    97,
+      94,   140,   141,   142,   143,   139,   138,   136,   137,   134,
      115,   116,   117,   118,   119,   120,   121,   122,   123,   124,
-     125,   112,   111,   183,   187,   186,   184,    35,    37,    36,
-      43,    42,    44,    30,     0,     0,     0,     0,     0,   213,
-       0,   209,   110,   182,   210,   211,     0,   208,   206,   212,
-       0,   218,   217,   216,     0,     0,     0,     0,     0,   220,
-       0,     0,   214,   219,   215,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   221,
-       0,   223,   224,   225,   226,   227,   228,   222
+     125,   126,   127,   114,   113,   185,   189,   188,   186,    33,
+      36,    38,    37,    45,    44,    46,    30,     0,     0,     0,
+       0,     0,   215,     0,   211,   112,   184,   212,   213,     0,
+     210,   208,   214,     0,   220,   219,   218,     0,     0,     0,
+       0,     0,   222,     0,     0,   216,   221,   217,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   223,     0,   225,   226,   227,   228,   229,   230,
+     224
 };
 
 /* YYDEFGOTO[NTERM-NUM].  */
 static const yytype_int16 yydefgoto[] =
 {
-      -1,    44,    45,    46,    47,    48,   121,   108,   253,   254,
+      -1,    44,    45,    46,    47,    48,   121,   108,   255,   256,
       49,    50,    75,    76,    77,    51,   158,   159,    52,   134,
-     102,   188,   189,   267,    53,   206,   291,    90,    91,    54,
+     102,   188,   189,   269,    53,   206,   293,    90,    91,    54,
      199,   200,    55,    85,    86,    56,   145,   146,    57,    93,
      133,   236,   237,   117,   118,   119,   162,   125,   122,   224,
-      66,    58,    59,   257,   258,   308,   309,   325,   310,   323,
-     328,   329,   342,   343
+      66,    58,    59,   259,   260,   311,   312,   328,   313,   326,
+     331,   332,   345,   346
 };
 
 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
@@ -1063,54 +1072,55 @@ static const yytype_int16 yydefgoto[] =
 #define YYPACT_NINF -129
 static const yytype_int16 yypact[] =
 {
-      11,  -126,   -18,    -7,  -129,   -45,   -13,     7,    13,   124,
-      43,     0,   -53,    43,  -129,    64,   -27,   -48,   -40,   -29,
-      -9,  -104,    -6,  -129,   -27,   -27,  -129,    12,    14,  -129,
-      19,    42,     9,  -129,    22,    64,    23,   -13,    -1,   418,
-     -33,    48,    48,  -129,   152,   215,    16,  -129,   -27,  -129,
-    -129,  -129,  -129,  -129,  -129,  -129,  -129,  -129,  -129,     3,
-    -129,  -129,  -129,  -129,  -129,  -129,  -129,  -129,  -129,    31,
-      44,    47,    49,   115,    51,  -129,   124,  -129,  -129,  -129,
-    -129,  -129,  -129,  -129,  -129,    43,  -129,   118,   126,   127,
-       0,  -129,   154,  -129,    43,  -129,  -129,  -129,  -129,  -129,
-    -129,  -129,     4,  -129,  -129,    55,  -129,   162,  -129,   348,
-    -129,  -129,  -129,  -129,  -129,  -129,  -129,  -104,  -129,    60,
-    -129,  -129,   -27,   -27,  -129,    61,  -129,  -129,  -129,  -129,
-    -129,   122,    34,  -129,    64,  -129,  -129,  -129,   -13,   -13,
-     -13,   -13,   -13,   -13,   -13,    -1,  -129,   140,   157,   -22,
-     158,   -13,   -13,   160,   -13,   -13,   168,   171,   418,  -129,
-     -46,  -129,   172,   172,  -129,    72,  -129,    78,   -81,  -129,
+      10,  -119,    -4,     2,  -129,   -29,    -9,    16,    19,   274,
+       5,     0,   -46,     5,  -129,   -16,   -35,   -41,   -28,   -26,
+     -10,  -122,    -3,  -129,   -35,   -35,  -129,    23,    26,  -129,
+      27,    34,    41,  -129,    30,   -16,    31,    -9,   185,   163,
+       4,    42,    42,  -129,   109,   158,   -13,  -129,   -35,  -129,
+    -129,  -129,  -129,  -129,  -129,  -129,  -129,  -129,  -129,    -7,
+    -129,  -129,  -129,  -129,  -129,  -129,  -129,  -129,  -129,    32,
+      36,    37,    43,    86,    48,  -129,   274,  -129,  -129,  -129,
+    -129,  -129,  -129,  -129,  -129,     5,  -129,   115,   123,   125,
+       0,  -129,   153,  -129,     5,  -129,  -129,  -129,  -129,  -129,
+    -129,  -129,    13,  -129,  -129,    60,  -129,   225,  -129,   309,
+    -129,  -129,  -129,  -129,  -129,  -129,  -129,  -122,  -129,    61,
+    -129,  -129,   -35,   -35,  -129,    66,  -129,  -129,  -129,  -129,
+    -129,   126,    38,  -129,   -16,  -129,  -129,  -129,    -9,    -9,
+      -9,    -9,    -9,    -9,    -9,   185,  -129,   142,   145,   -15,
+     147,    -9,    -9,   148,    -9,    -9,   159,   161,   163,  -129,
+     -39,  -129,   164,   164,  -129,    67,  -129,   354,   -25,  -129,
     -129,  -129,  -129,  -129,  -129,  -129,  -129,  -129,  -129,  -129,
-    -129,  -129,  -129,  -129,   100,  -129,  -129,    50,     4,  -129,
-    -129,   -22,   -22,   -22,   -22,   104,   178,   -13,   -13,   162,
-    -129,  -129,  -129,  -129,  -129,  -129,   335,   335,   -33,   108,
+    -129,  -129,  -129,  -129,    92,  -129,  -129,    58,    13,  -129,
+    -129,   -15,   -15,   -15,   -15,    94,   168,    -9,    -9,   225,
+    -129,  -129,  -129,  -129,  -129,  -129,   408,   408,     4,    98,
     -129,  -129,  -129,  -129,  -129,  -129,  -129,  -129,  -129,  -129,
     -129,  -129,  -129,  -129,  -129,  -129,  -129,  -129,  -129,  -129,
-    -129,  -129,  -129,  -129,   -33,   185,   -46,  -129,  -129,  -129,
-    -129,  -129,  -129,   186,   191,   193,   196,  -129,  -129,  -129,
-    -129,   197,   199,    78,  -129,    99,   101,   -56,   111,  -129,
+    -129,  -129,  -129,  -129,     4,   172,   -39,  -129,  -129,  -129,
+    -129,    -9,  -129,  -129,   176,   177,   179,   180,  -129,  -129,
+    -129,  -129,   184,   187,  -129,   354,  -129,    95,    96,   -88,
+     104,  -129,  -129,  -129,  -129,  -129,  -129,  -129,  -129,  -129,
     -129,  -129,  -129,  -129,  -129,  -129,  -129,  -129,  -129,  -129,
     -129,  -129,  -129,  -129,  -129,  -129,  -129,  -129,  -129,  -129,
-    -129,  -129,  -129,  -129,  -129,  -129,  -129,  -129,  -129,  -129,
-    -129,  -129,  -129,   233,  -129,  -129,  -129,  -129,  -129,  -129,
-    -129,  -129,  -129,  -129,   -13,   -13,   106,   119,   -88,  -129,
-     107,  -129,   335,  -129,  -129,  -129,   -42,  -129,  -129,  -129,
-     114,  -129,  -129,  -129,   109,   117,   -13,   112,   -66,  -129,
-     128,   -13,  -129,  -129,  -129,   113,    56,   120,   123,   131,
-     134,   135,    45,   138,   -13,   -13,   -13,   -13,   -13,  -129,
-     139,  -129,  -129,  -129,  -129,  -129,  -129,  -129
+    -129,  -129,  -129,  -129,  -129,   224,  -129,  -129,  -129,  -129,
+    -129,  -129,  -129,  -129,  -129,  -129,  -129,    -9,    -9,    99,
+     111,   -89,  -129,   108,  -129,   408,  -129,  -129,  -129,   -42,
+    -129,  -129,  -129,   105,  -129,  -129,  -129,   102,   118,    -9,
+     114,   -96,  -129,   130,    -9,  -129,  -129,  -129,   119,   -17,
+     124,   128,   129,   132,   140,    93,   137,    -9,    -9,    -9,
+      -9,    -9,  -129,   141,  -129,  -129,  -129,  -129,  -129,  -129,
+    -129
 };
 
 /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int16 yypgoto[] =
 {
-    -129,  -129,  -129,   -39,  -129,  -129,   133,   -31,  -129,    24,
-    -129,  -129,  -129,  -129,   216,  -129,  -129,   137,  -129,  -129,
-     -25,  -129,   105,  -129,  -129,  -128,  -129,  -129,   206,  -129,
-    -129,   102,  -129,   285,     5,  -129,  -129,   155,  -129,  -129,
-    -129,  -129,    63,  -129,   187,  -129,   260,  -129,   278,    25,
-     -37,  -129,  -129,  -129,    58,  -129,    -3,  -129,  -129,  -129,
-    -129,   -15,  -129,   -36
+    -129,  -129,  -129,   -19,  -129,  -129,    25,   -31,  -129,    44,
+    -129,  -129,  -129,  -129,   220,  -129,  -129,   143,  -129,  -129,
+      -5,  -129,   110,  -129,  -129,  -128,  -129,  -129,   210,  -129,
+    -129,   106,  -129,   291,   -38,  -129,  -129,   162,  -129,  -129,
+    -129,  -129,    70,  -129,   200,  -129,   276,  -129,   295,    15,
+     -37,  -129,  -129,  -129,    68,  -129,    14,  -129,  -129,  -129,
+    -129,    -2,  -129,   -12
 };
 
 /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
@@ -1120,156 +1130,163 @@ static const yytype_int16 yypgoto[] =
 #define YYTABLE_NINF -7
 static const yytype_int16 yytable[] =
 {
-     137,   131,   207,   138,   103,   104,   165,   234,    87,   160,
-     135,   221,     1,   103,   104,    64,    60,     2,     3,   103,
-     104,   113,     4,     5,     6,   105,   139,     7,   306,   182,
-     222,     8,     9,   129,    61,   183,    10,    11,   184,    65,
-      12,   140,    13,    14,   141,    62,    15,    63,    78,   114,
-     115,   116,    79,   260,    16,   103,   104,   235,    80,    67,
-     306,   105,    17,   255,   256,    68,   185,    18,    19,   318,
-     201,    20,    92,   261,    21,    22,    88,   109,    23,    24,
-      89,   327,    95,   321,   240,   110,    96,   186,   255,   256,
-     176,   332,   241,    25,   128,   142,   111,    81,   106,   176,
-     161,   211,   212,   213,   214,   215,   216,   217,    26,   210,
-      27,   223,    28,    29,   226,   227,   112,   229,   230,   120,
-      30,   143,   144,    82,    31,    32,   242,    33,    34,    97,
-      35,   262,    36,   243,   106,   263,    83,   124,    37,   126,
-     187,    38,    39,    40,   127,    41,    42,   132,   136,   107,
-     264,   244,   164,    -6,    43,   245,   169,   246,   166,   168,
-     275,   276,    98,    84,   312,   130,   247,   173,    69,   170,
-     177,    99,   171,    70,   172,   100,   174,   292,   178,   179,
-     190,   167,   181,   248,   249,   203,   205,   209,   265,   266,
-     101,   208,   219,   337,   338,   339,   340,   341,   191,   192,
-     193,   194,   349,   294,   337,   338,   339,   340,   341,   220,
-     225,   250,   228,   251,   239,   252,   269,   270,   271,   272,
-     231,     2,     3,   232,   238,   259,     4,     5,     6,   273,
-     274,     7,    71,   293,    72,     8,     9,   295,   297,    73,
-      10,    11,    74,   298,    12,   299,    13,    14,   300,   301,
-      15,   302,   304,   311,   305,   204,   204,   313,    16,   316,
-     324,   317,   326,   320,   327,   331,    17,   314,   315,   336,
-     334,    18,    19,   344,   195,    20,   345,   303,    21,    22,
-     351,   357,    23,    24,   346,   322,   196,   347,   348,   330,
-     197,   198,   175,   268,   335,   233,   180,    25,    94,   296,
-     218,   277,   163,   123,   202,   319,   350,   352,   353,   354,
-     355,   356,    26,   333,    27,   307,    28,    29,     0,     0,
-       0,     0,     0,     0,    30,     0,     0,     0,    31,    32,
-       0,    33,    34,     0,    35,     0,    36,     0,     0,     0,
-       0,     0,    37,     0,     0,    38,    39,    40,     0,    41,
-      42,     0,     0,     0,     2,     3,     0,    -6,    43,     4,
-       5,     6,     0,     0,     7,     0,     0,     0,     8,     9,
-       0,     0,     0,    10,    11,   278,     0,    12,     0,    13,
-      14,     0,     0,    15,     0,   279,     0,     0,     0,     0,
-       0,    16,     0,   280,     0,     0,   281,     0,     0,    17,
-       0,   282,     0,     0,    18,    19,     0,     0,    20,     0,
-       0,    21,    22,     0,     0,    23,    24,     0,     0,   283,
-       0,   284,   285,     0,   286,   287,   288,     0,   147,   289,
-      25,     0,     0,     0,     0,   148,     0,   149,     0,     0,
-       0,     0,     0,     0,     0,    26,     0,    27,     0,    28,
-      29,     0,     0,     0,     0,     0,     0,    30,     0,   150,
-       0,    31,    32,     0,    33,    34,     0,    35,     0,    36,
-       0,     0,   290,     0,     0,    37,     0,     0,    38,    39,
-      40,     0,    41,    42,     0,     0,     0,     0,   151,   152,
-     153,    43,   154,   155,     0,     0,   156,     0,     0,     0,
+     137,   131,   207,    95,   113,   103,   104,    96,    87,   160,
+      78,     1,   103,   104,    79,   234,     2,     3,   105,   221,
+      64,    80,     4,     5,     6,    60,   165,     7,   309,   309,
+     135,     8,     9,   114,   115,   116,    10,    11,   222,   182,
+      12,   107,    13,    14,    65,   183,    15,   176,   184,    61,
+      97,   103,   104,   330,    16,    62,   176,   130,   257,   258,
+      81,   262,    17,   335,    63,   235,   129,    18,    19,    67,
+     321,    20,    68,   167,    21,    22,   185,    88,    23,    24,
+      92,    89,   263,    98,   324,   109,    82,   128,   103,   104,
+     201,   106,    99,    25,   105,   161,   100,   186,   110,    83,
+     111,   211,   212,   213,   214,   215,   216,   217,    26,   164,
+      27,   101,    28,    29,   226,   227,   112,   229,   230,   223,
+      30,   257,   258,   120,    31,    32,    84,    33,    34,   210,
+      35,   166,    36,   340,   341,   342,   343,   344,    37,   173,
+     264,    38,    39,    40,   265,    41,    42,   204,   204,   124,
+     187,   168,   126,   127,    -6,    43,   132,   136,   169,   266,
+     277,   278,   170,   171,     2,     3,   315,   106,   177,   172,
+       4,     5,     6,   147,   174,     7,   178,   294,   179,     8,
+       9,   148,   181,   149,    10,    11,   190,   203,    12,   138,
+      13,    14,   205,   209,    15,   219,   208,   267,   220,   268,
+     225,   228,    16,   296,   299,   150,   271,   272,   273,   274,
+      17,   239,   231,   139,   232,    18,    19,   238,   261,    20,
+     275,   276,    21,    22,   295,   297,    23,    24,   140,   300,
+     301,   141,   302,   303,   151,   152,   153,   304,   154,   155,
+     305,    25,   156,   340,   341,   342,   343,   344,   314,   316,
+     307,   308,   352,   327,   319,   320,    26,   329,    27,   157,
+      28,    29,   191,   192,   193,   194,   323,   330,    30,   334,
+     317,   318,    31,    32,   337,    33,    34,   339,    35,   347,
+      36,   354,   142,   348,   349,   360,    37,   350,   325,    38,
+      39,    40,   333,    41,    42,   351,   175,   338,   270,   306,
+     180,   233,    -6,    43,    94,   279,   298,   218,   143,   144,
+     355,   356,   357,   358,   359,     2,     3,   202,   163,    69,
+     123,     4,     5,     6,    70,   322,     7,   310,     0,   336,
+       8,     9,     0,   353,     0,    10,    11,     0,   195,    12,
+       0,    13,    14,     0,     0,    15,     0,     0,     0,     0,
+     196,     0,     0,    16,   197,   198,     0,     0,     0,     0,
+     240,    17,     0,     0,     0,   241,    18,    19,     0,   242,
+      20,     0,     0,    21,    22,     0,     0,    23,    24,     0,
+       0,     0,     0,    71,     0,    72,     0,     0,     0,     0,
+      73,     0,    25,    74,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   243,     0,     0,     0,    26,     0,    27,
+     244,    28,    29,     0,     0,     0,     0,     0,     0,    30,
+       0,     0,     0,    31,    32,     0,    33,    34,   245,    35,
+       0,    36,   246,     0,   247,     0,     0,    37,     0,     0,
+      38,    39,    40,   248,    41,    42,     0,     0,     0,   280,
+       0,     0,     0,     0,    43,     0,     0,     0,     0,   281,
+     249,   250,     0,     0,     0,     0,     0,   282,     0,     0,
+     283,     0,     0,     0,     0,   284,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   251,     0,
+     252,     0,   253,   285,   254,   286,   287,     0,   288,   289,
+     290,     0,     0,   291,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   157
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   292
 };
 
 static const yytype_int16 yycheck[] =
 {
-      37,    32,   130,     4,    46,    47,    45,    53,     8,    40,
-      35,    33,     1,    46,    47,    28,   142,     6,     7,    46,
-      47,   125,    11,    12,    13,    52,    27,    16,   116,    25,
-      52,    20,    21,    24,    52,    31,    25,    26,    34,    52,
-      29,    42,    31,    32,    45,    52,    35,    92,     5,   153,
-     154,   155,     9,     3,    43,    46,    47,   103,    15,    52,
-     116,    52,    51,   144,   145,    52,    62,    56,    57,   157,
-     109,    60,   125,    23,    63,    64,    76,   125,    67,    68,
-      80,   147,    18,   125,     6,   125,    22,    83,   144,   145,
-      85,   157,    14,    82,    52,    96,   125,    54,   125,    94,
-      52,   138,   139,   140,   141,   142,   143,   144,    97,   134,
-      99,   133,   101,   102,   151,   152,   125,   154,   155,   125,
-     109,   122,   123,    80,   113,   114,    48,   116,   117,    65,
-     119,    81,   121,    55,   125,    85,    93,   125,   127,   125,
-     136,   130,   131,   132,   125,   134,   135,   125,   125,    16,
-     100,    73,     0,   142,   143,    77,   125,    79,   142,   156,
-     197,   198,    98,   120,   292,    32,    88,    52,    44,   125,
-      52,   107,   125,    49,   125,   111,   125,   208,    52,    52,
-     125,    48,    28,   105,   106,   125,   125,   153,   138,   139,
-     126,    69,    52,   148,   149,   150,   151,   152,    36,    37,
-      38,    39,   157,   234,   148,   149,   150,   151,   152,    52,
-      52,   133,    52,   135,   142,   137,   191,   192,   193,   194,
-      52,     6,     7,    52,    52,   125,    11,    12,    13,   125,
-      52,    16,   108,   125,   110,    20,    21,    52,    52,   115,
-      25,    26,   118,    52,    29,    52,    31,    32,    52,    52,
-      35,    52,   153,   142,   153,   122,   123,    24,    43,   153,
-     146,   142,   153,   156,   147,   153,    51,   304,   305,   156,
-     142,    56,    57,   153,   112,    60,   153,   253,    63,    64,
-     142,   142,    67,    68,   153,   316,   124,   153,   153,   326,
-     128,   129,    76,   188,   331,   158,    90,    82,    13,   236,
-     145,   199,    42,    25,   117,   308,   342,   344,   345,   346,
-     347,   348,    97,   328,    99,   257,   101,   102,    -1,    -1,
-      -1,    -1,    -1,    -1,   109,    -1,    -1,    -1,   113,   114,
-      -1,   116,   117,    -1,   119,    -1,   121,    -1,    -1,    -1,
-      -1,    -1,   127,    -1,    -1,   130,   131,   132,    -1,   134,
-     135,    -1,    -1,    -1,     6,     7,    -1,   142,   143,    11,
-      12,    13,    -1,    -1,    16,    -1,    -1,    -1,    20,    21,
-      -1,    -1,    -1,    25,    26,    40,    -1,    29,    -1,    31,
-      32,    -1,    -1,    35,    -1,    50,    -1,    -1,    -1,    -1,
-      -1,    43,    -1,    58,    -1,    -1,    61,    -1,    -1,    51,
-      -1,    66,    -1,    -1,    56,    57,    -1,    -1,    60,    -1,
-      -1,    63,    64,    -1,    -1,    67,    68,    -1,    -1,    84,
-      -1,    86,    87,    -1,    89,    90,    91,    -1,    10,    94,
-      82,    -1,    -1,    -1,    -1,    17,    -1,    19,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    97,    -1,    99,    -1,   101,
-     102,    -1,    -1,    -1,    -1,    -1,    -1,   109,    -1,    41,
-      -1,   113,   114,    -1,   116,   117,    -1,   119,    -1,   121,
-      -1,    -1,   137,    -1,    -1,   127,    -1,    -1,   130,   131,
-     132,    -1,   134,   135,    -1,    -1,    -1,    -1,    70,    71,
-      72,   143,    74,    75,    -1,    -1,    78,    -1,    -1,    -1,
+      37,    32,   130,    19,   126,    47,    48,    23,     8,    40,
+       5,     1,    47,    48,     9,    54,     6,     7,    53,    34,
+      29,    16,    12,    13,    14,   144,    45,    17,   117,   117,
+      35,    21,    22,   155,   156,   157,    26,    27,    53,    26,
+      30,    16,    32,    33,    53,    32,    36,    85,    35,    53,
+      66,    47,    48,   149,    44,    53,    94,    32,   146,   147,
+      55,     3,    52,   159,    93,   104,    25,    57,    58,    53,
+     159,    61,    53,    48,    64,    65,    63,    77,    68,    69,
+     126,    81,    24,    99,   126,   126,    81,    53,    47,    48,
+     109,   126,   108,    83,    53,    53,   112,    84,   126,    94,
+     126,   138,   139,   140,   141,   142,   143,   144,    98,     0,
+     100,   127,   102,   103,   151,   152,   126,   154,   155,   134,
+     110,   146,   147,   126,   114,   115,   121,   117,   118,   134,
+     120,   144,   122,   150,   151,   152,   153,   154,   128,    53,
+      82,   131,   132,   133,    86,   135,   136,   122,   123,   126,
+     137,   158,   126,   126,   144,   145,   126,   126,   126,   101,
+     197,   198,   126,   126,     6,     7,   294,   126,    53,   126,
+      12,    13,    14,    10,   126,    17,    53,   208,    53,    21,
+      22,    18,    29,    20,    26,    27,   126,   126,    30,     4,
+      32,    33,   126,   155,    36,    53,    70,   139,    53,   141,
+      53,    53,    44,   234,   241,    42,   191,   192,   193,   194,
+      52,   144,    53,    28,    53,    57,    58,    53,   126,    61,
+     126,    53,    64,    65,   126,    53,    68,    69,    43,    53,
+      53,    46,    53,    53,    71,    72,    73,    53,    75,    76,
+      53,    83,    79,   150,   151,   152,   153,   154,   144,    25,
+     155,   155,   159,   148,   155,   144,    98,   155,   100,    96,
+     102,   103,    37,    38,    39,    40,   158,   149,   110,   155,
+     307,   308,   114,   115,   144,   117,   118,   158,   120,   155,
+     122,   144,    97,   155,   155,   144,   128,   155,   319,   131,
+     132,   133,   329,   135,   136,   155,    76,   334,   188,   255,
+      90,   158,   144,   145,    13,   199,   236,   145,   123,   124,
+     347,   348,   349,   350,   351,     6,     7,   117,    42,    45,
+      25,    12,    13,    14,    50,   311,    17,   259,    -1,   331,
+      21,    22,    -1,   345,    -1,    26,    27,    -1,   113,    30,
+      -1,    32,    33,    -1,    -1,    36,    -1,    -1,    -1,    -1,
+     125,    -1,    -1,    44,   129,   130,    -1,    -1,    -1,    -1,
+       6,    52,    -1,    -1,    -1,    11,    57,    58,    -1,    15,
+      61,    -1,    -1,    64,    65,    -1,    -1,    68,    69,    -1,
+      -1,    -1,    -1,   109,    -1,   111,    -1,    -1,    -1,    -1,
+     116,    -1,    83,   119,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    49,    -1,    -1,    -1,    98,    -1,   100,
+      56,   102,   103,    -1,    -1,    -1,    -1,    -1,    -1,   110,
+      -1,    -1,    -1,   114,   115,    -1,   117,   118,    74,   120,
+      -1,   122,    78,    -1,    80,    -1,    -1,   128,    -1,    -1,
+     131,   132,   133,    89,   135,   136,    -1,    -1,    -1,    41,
+      -1,    -1,    -1,    -1,   145,    -1,    -1,    -1,    -1,    51,
+     106,   107,    -1,    -1,    -1,    -1,    -1,    59,    -1,    -1,
+      62,    -1,    -1,    -1,    -1,    67,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   134,    -1,
+     136,    -1,   138,    85,   140,    87,    88,    -1,    90,    91,
+      92,    -1,    -1,    95,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    95
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   138
 };
 
 /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
    symbol of state STATE-NUM.  */
 static const yytype_uint8 yystos[] =
 {
-       0,     1,     6,     7,    11,    12,    13,    16,    20,    21,
-      25,    26,    29,    31,    32,    35,    43,    51,    56,    57,
-      60,    63,    64,    67,    68,    82,    97,    99,   101,   102,
-     109,   113,   114,   116,   117,   119,   121,   127,   130,   131,
-     132,   134,   135,   143,   159,   160,   161,   162,   163,   168,
-     169,   173,   176,   182,   187,   190,   193,   196,   209,   210,
-     142,    52,    52,    92,    28,    52,   208,    52,    52,    44,
-      49,   108,   110,   115,   118,   170,   171,   172,     5,     9,
-      15,    54,    80,    93,   120,   191,   192,     8,    76,    80,
-     185,   186,   125,   197,   191,    18,    22,    65,    98,   107,
-     111,   126,   178,    46,    47,    52,   125,   164,   165,   125,
-     125,   125,   125,   125,   153,   154,   155,   201,   202,   203,
-     125,   164,   206,   206,   125,   205,   125,   125,    52,    24,
-     164,   165,   125,   198,   177,   178,   125,   208,     4,    27,
-      42,    45,    96,   122,   123,   194,   195,    10,    17,    19,
-      41,    70,    71,    72,    74,    75,    78,    95,   174,   175,
-     165,    52,   204,   204,     0,   161,   142,   164,   156,   125,
-     125,   125,   125,    52,   125,   172,   192,    52,    52,    52,
-     186,    28,    25,    31,    34,    62,    83,   136,   179,   180,
-     125,    36,    37,    38,    39,   112,   124,   128,   129,   188,
-     189,   161,   202,   125,   164,   125,   183,   183,    69,   153,
-     178,   208,   208,   208,   208,   208,   208,   208,   195,    52,
-      52,    33,    52,   133,   207,    52,   208,   208,    52,   208,
-     208,    52,    52,   175,    53,   103,   199,   200,    52,   142,
-       6,    14,    48,    55,    73,    77,    79,    88,   105,   106,
-     133,   135,   137,   166,   167,   144,   145,   211,   212,   125,
-       3,    23,    81,    85,   100,   138,   139,   181,   180,   207,
-     207,   207,   207,   125,    52,   208,   208,   189,    40,    50,
-      58,    61,    66,    84,    86,    87,    89,    90,    91,    94,
-     137,   184,   165,   125,   165,    52,   200,    52,    52,    52,
-      52,    52,    52,   167,   153,   153,   116,   212,   213,   214,
-     216,   142,   183,    24,   208,   208,   153,   142,   157,   214,
-     156,   125,   165,   217,   146,   215,   153,   147,   218,   219,
-     208,   153,   157,   219,   142,   208,   156,   148,   149,   150,
-     151,   152,   220,   221,   153,   153,   153,   153,   153,   157,
-     221,   142,   208,   208,   208,   208,   208,   142
+       0,     1,     6,     7,    12,    13,    14,    17,    21,    22,
+      26,    27,    30,    32,    33,    36,    44,    52,    57,    58,
+      61,    64,    65,    68,    69,    83,    98,   100,   102,   103,
+     110,   114,   115,   117,   118,   120,   122,   128,   131,   132,
+     133,   135,   136,   145,   161,   162,   163,   164,   165,   170,
+     171,   175,   178,   184,   189,   192,   195,   198,   211,   212,
+     144,    53,    53,    93,    29,    53,   210,    53,    53,    45,
+      50,   109,   111,   116,   119,   172,   173,   174,     5,     9,
+      16,    55,    81,    94,   121,   193,   194,     8,    77,    81,
+     187,   188,   126,   199,   193,    19,    23,    66,    99,   108,
+     112,   127,   180,    47,    48,    53,   126,   166,   167,   126,
+     126,   126,   126,   126,   155,   156,   157,   203,   204,   205,
+     126,   166,   208,   208,   126,   207,   126,   126,    53,    25,
+     166,   167,   126,   200,   179,   180,   126,   210,     4,    28,
+      43,    46,    97,   123,   124,   196,   197,    10,    18,    20,
+      42,    71,    72,    73,    75,    76,    79,    96,   176,   177,
+     167,    53,   206,   206,     0,   163,   144,   166,   158,   126,
+     126,   126,   126,    53,   126,   174,   194,    53,    53,    53,
+     188,    29,    26,    32,    35,    63,    84,   137,   181,   182,
+     126,    37,    38,    39,    40,   113,   125,   129,   130,   190,
+     191,   163,   204,   126,   166,   126,   185,   185,    70,   155,
+     180,   210,   210,   210,   210,   210,   210,   210,   197,    53,
+      53,    34,    53,   134,   209,    53,   210,   210,    53,   210,
+     210,    53,    53,   177,    54,   104,   201,   202,    53,   144,
+       6,    11,    15,    49,    56,    74,    78,    80,    89,   106,
+     107,   134,   136,   138,   140,   168,   169,   146,   147,   213,
+     214,   126,     3,    24,    82,    86,   101,   139,   141,   183,
+     182,   209,   209,   209,   209,   126,    53,   210,   210,   191,
+      41,    51,    59,    62,    67,    85,    87,    88,    90,    91,
+      92,    95,   138,   186,   167,   126,   167,    53,   202,   210,
+      53,    53,    53,    53,    53,    53,   169,   155,   155,   117,
+     214,   215,   216,   218,   144,   185,    25,   210,   210,   155,
+     144,   159,   216,   158,   126,   167,   219,   148,   217,   155,
+     149,   220,   221,   210,   155,   159,   221,   144,   210,   158,
+     150,   151,   152,   153,   154,   222,   223,   155,   155,   155,
+     155,   155,   159,   223,   144,   210,   210,   210,   210,   210,
+     144
 };
 
 #define yyerrok                (yyerrstatus = 0)
@@ -2084,7 +2101,7 @@ yyreduce:
   switch (yyn)
     {
         case 5:
-#line 292 "ntp_parser.y"
+#line 294 "ntp_parser.y"
     {
                                        if (input_from_file == 1) {
                        msyslog(LOG_INFO, "parse error %s line %d ignored\n",
@@ -2096,7 +2113,7 @@ yyreduce:
     break;
 
   case 18:
-#line 322 "ntp_parser.y"
+#line 324 "ntp_parser.y"
     {
                         struct peer_node *my_node =  create_peer_node((yyvsp[(1) - (3)].Integer), (yyvsp[(2) - (3)].Address_node), (yyvsp[(3) - (3)].Queue));
                         if (my_node)
@@ -2105,7 +2122,7 @@ yyreduce:
     break;
 
   case 19:
-#line 328 "ntp_parser.y"
+#line 330 "ntp_parser.y"
     {
                         struct peer_node *my_node = create_peer_node((yyvsp[(1) - (2)].Integer), (yyvsp[(2) - (2)].Address_node), NULL);
                         if (my_node)
@@ -2114,42 +2131,42 @@ yyreduce:
     break;
 
   case 20:
-#line 336 "ntp_parser.y"
+#line 338 "ntp_parser.y"
     { (yyval.Integer) = T_Server; }
     break;
 
   case 21:
-#line 337 "ntp_parser.y"
+#line 339 "ntp_parser.y"
     { (yyval.Integer) = T_Pool; }
     break;
 
   case 22:
-#line 338 "ntp_parser.y"
+#line 340 "ntp_parser.y"
     { (yyval.Integer) = T_Peer; }
     break;
 
   case 23:
-#line 339 "ntp_parser.y"
+#line 341 "ntp_parser.y"
     { (yyval.Integer) = T_Broadcast; }
     break;
 
   case 24:
-#line 340 "ntp_parser.y"
+#line 342 "ntp_parser.y"
     { (yyval.Integer) = T_Manycastclient; }
     break;
 
   case 25:
-#line 344 "ntp_parser.y"
+#line 346 "ntp_parser.y"
     { (yyval.Address_node) = (yyvsp[(1) - (1)].Address_node); }
     break;
 
   case 26:
-#line 345 "ntp_parser.y"
+#line 347 "ntp_parser.y"
     { (yyval.Address_node) = create_address_node((yyvsp[(1) - (1)].String), default_ai_family); }
     break;
 
   case 27:
-#line 347 "ntp_parser.y"
+#line 349 "ntp_parser.y"
     {
                         if ((yyvsp[(1) - (2)].Integer) == -4)
                             (yyval.Address_node) = create_address_node((yyvsp[(2) - (2)].String), AF_INET);
@@ -2163,694 +2180,704 @@ yyreduce:
     break;
 
   case 28:
-#line 362 "ntp_parser.y"
+#line 364 "ntp_parser.y"
     { (yyval.Address_node) = create_address_node((yyvsp[(1) - (1)].String), AF_INET); }
     break;
 
   case 29:
-#line 363 "ntp_parser.y"
+#line 365 "ntp_parser.y"
     { (yyval.Address_node) = create_address_node((yyvsp[(1) - (1)].String), AF_INET6); }
     break;
 
   case 30:
-#line 367 "ntp_parser.y"
+#line 369 "ntp_parser.y"
     { (yyval.Queue) = enqueue((yyvsp[(1) - (2)].Queue), (yyvsp[(2) - (2)].Attr_val)); }
     break;
 
   case 31:
-#line 368 "ntp_parser.y"
+#line 370 "ntp_parser.y"
     { (yyval.Queue) = enqueue_in_new_queue((yyvsp[(1) - (1)].Attr_val)); }
     break;
 
   case 32:
-#line 373 "ntp_parser.y"
+#line 375 "ntp_parser.y"
     { (yyval.Attr_val) = create_attr_ival(T_Flag, FLAG_SKEY); }
     break;
 
   case 33:
-#line 374 "ntp_parser.y"
-    { (yyval.Attr_val) = create_attr_ival(T_Flag, FLAG_BURST); }
+#line 376 "ntp_parser.y"
+    { (yyval.Attr_val) = create_attr_dval(T_Bias, (yyvsp[(2) - (2)].Double)); }
     break;
 
   case 34:
-#line 375 "ntp_parser.y"
-    { (yyval.Attr_val) = create_attr_ival(T_Flag, FLAG_IBURST); }
+#line 377 "ntp_parser.y"
+    { (yyval.Attr_val) = create_attr_ival(T_Flag, FLAG_BURST); }
     break;
 
   case 35:
-#line 376 "ntp_parser.y"
-    { (yyval.Attr_val) = create_attr_ival(T_Key, (yyvsp[(2) - (2)].Integer)); }
+#line 378 "ntp_parser.y"
+    { (yyval.Attr_val) = create_attr_ival(T_Flag, FLAG_IBURST); }
     break;
 
   case 36:
-#line 377 "ntp_parser.y"
-    { (yyval.Attr_val) = create_attr_ival(T_Minpoll, (yyvsp[(2) - (2)].Integer)); }
+#line 379 "ntp_parser.y"
+    { (yyval.Attr_val) = create_attr_ival(T_Key, (yyvsp[(2) - (2)].Integer)); }
     break;
 
   case 37:
-#line 378 "ntp_parser.y"
-    { (yyval.Attr_val) = create_attr_ival(T_Maxpoll, (yyvsp[(2) - (2)].Integer)); }
+#line 380 "ntp_parser.y"
+    { (yyval.Attr_val) = create_attr_ival(T_Minpoll, (yyvsp[(2) - (2)].Integer)); }
     break;
 
   case 38:
-#line 379 "ntp_parser.y"
-    { (yyval.Attr_val) = create_attr_ival(T_Flag, FLAG_NOSELECT);}
+#line 381 "ntp_parser.y"
+    { (yyval.Attr_val) = create_attr_ival(T_Maxpoll, (yyvsp[(2) - (2)].Integer)); }
     break;
 
   case 39:
-#line 380 "ntp_parser.y"
-    { (yyval.Attr_val) = create_attr_ival(T_Flag, FLAG_PREEMPT); }
+#line 382 "ntp_parser.y"
+    { (yyval.Attr_val) = create_attr_ival(T_Flag, FLAG_NOSELECT);}
     break;
 
   case 40:
-#line 381 "ntp_parser.y"
-    { (yyval.Attr_val) = create_attr_ival(T_Flag, FLAG_PREFER); }
+#line 383 "ntp_parser.y"
+    { (yyval.Attr_val) = create_attr_ival(T_Flag, FLAG_PREEMPT); }
     break;
 
   case 41:
-#line 382 "ntp_parser.y"
-    { (yyval.Attr_val) = create_attr_ival(T_Flag, FLAG_TRUE); }
+#line 384 "ntp_parser.y"
+    { (yyval.Attr_val) = create_attr_ival(T_Flag, FLAG_PREFER); }
     break;
 
   case 42:
-#line 383 "ntp_parser.y"
-    { (yyval.Attr_val) = create_attr_ival(T_Ttl, (yyvsp[(2) - (2)].Integer)); }
+#line 385 "ntp_parser.y"
+    { (yyval.Attr_val) = create_attr_ival(T_Flag, FLAG_TRUE); }
     break;
 
   case 43:
-#line 384 "ntp_parser.y"
-    { (yyval.Attr_val) = create_attr_ival(T_Mode, (yyvsp[(2) - (2)].Integer)); }
+#line 386 "ntp_parser.y"
+    { (yyval.Attr_val) = create_attr_ival(T_Flag, FLAG_XLEAVE); }
     break;
 
   case 44:
-#line 385 "ntp_parser.y"
-    { (yyval.Attr_val) = create_attr_ival(T_Version, (yyvsp[(2) - (2)].Integer)); }
+#line 387 "ntp_parser.y"
+    { (yyval.Attr_val) = create_attr_ival(T_Ttl, (yyvsp[(2) - (2)].Integer)); }
     break;
 
   case 45:
-#line 396 "ntp_parser.y"
-    { my_config.broadcastclient = SIMPLE; }
+#line 388 "ntp_parser.y"
+    { (yyval.Attr_val) = create_attr_ival(T_Mode, (yyvsp[(2) - (2)].Integer)); }
     break;
 
   case 46:
-#line 398 "ntp_parser.y"
-    { my_config.broadcastclient = NOVOLLEY;  }
+#line 389 "ntp_parser.y"
+    { (yyval.Attr_val) = create_attr_ival(T_Version, (yyvsp[(2) - (2)].Integer)); }
     break;
 
   case 47:
 #line 400 "ntp_parser.y"
-    { append_queue(my_config.manycastserver, (yyvsp[(2) - (2)].Queue));  }
+    { my_config.broadcastclient = SIMPLE; }
     break;
 
   case 48:
 #line 402 "ntp_parser.y"
-    { append_queue(my_config.multicastclient, (yyvsp[(2) - (2)].Queue));  }
+    { my_config.broadcastclient = NOVOLLEY;  }
     break;
 
   case 49:
-#line 413 "ntp_parser.y"
-    { my_config.auth.autokey = (yyvsp[(2) - (2)].Integer);  }
+#line 404 "ntp_parser.y"
+    { append_queue(my_config.manycastserver, (yyvsp[(2) - (2)].Queue));  }
     break;
 
   case 50:
-#line 415 "ntp_parser.y"
-    { my_config.auth.control_key = (yyvsp[(2) - (2)].Integer);  }
+#line 406 "ntp_parser.y"
+    { append_queue(my_config.multicastclient, (yyvsp[(2) - (2)].Queue));  }
     break;
 
   case 51:
 #line 417 "ntp_parser.y"
-    { if (my_config.auth.crypto_cmd_list != NULL)
-                                       append_queue(my_config.auth.crypto_cmd_list, (yyvsp[(2) - (2)].Queue));
-                               else
-                                       my_config.auth.crypto_cmd_list = (yyvsp[(2) - (2)].Queue);
-                       cryptosw++;
-                       }
+    { my_config.auth.autokey = (yyvsp[(2) - (2)].Integer);  }
     break;
 
   case 52:
-#line 424 "ntp_parser.y"
-    { my_config.auth.keys = (yyvsp[(2) - (2)].String);  }
+#line 419 "ntp_parser.y"
+    { my_config.auth.control_key = (yyvsp[(2) - (2)].Integer);  }
     break;
 
   case 53:
-#line 426 "ntp_parser.y"
-    { my_config.auth.keysdir = (yyvsp[(2) - (2)].String);  }
+#line 421 "ntp_parser.y"
+    { if (my_config.auth.crypto_cmd_list != NULL)
+                                       append_queue(my_config.auth.crypto_cmd_list, (yyvsp[(2) - (2)].Queue));
+                               else
+                                       my_config.auth.crypto_cmd_list = (yyvsp[(2) - (2)].Queue);
+                       cryptosw++;
+                       }
     break;
 
   case 54:
 #line 428 "ntp_parser.y"
-    { my_config.auth.requested_key = (yyvsp[(2) - (2)].Integer);  }
+    { my_config.auth.keys = (yyvsp[(2) - (2)].String);  }
     break;
 
   case 55:
 #line 430 "ntp_parser.y"
-    { my_config.auth.trusted_key_list = (yyvsp[(2) - (2)].Queue);  }
+    { my_config.auth.keysdir = (yyvsp[(2) - (2)].String);  }
     break;
 
-  case 57:
-#line 436 "ntp_parser.y"
-    { (yyval.Queue) = NULL; }
+  case 56:
+#line 432 "ntp_parser.y"
+    { my_config.auth.requested_key = (yyvsp[(2) - (2)].Integer);  }
     break;
 
-  case 58:
-#line 440 "ntp_parser.y"
-    { (yyval.Queue) = enqueue((yyvsp[(1) - (2)].Queue), (yyvsp[(2) - (2)].Attr_val)); }
+  case 57:
+#line 434 "ntp_parser.y"
+    { my_config.auth.trusted_key_list = (yyvsp[(2) - (2)].Queue);  }
     break;
 
   case 59:
-#line 441 "ntp_parser.y"
-    { (yyval.Queue) = enqueue_in_new_queue((yyvsp[(1) - (1)].Attr_val)); }
+#line 440 "ntp_parser.y"
+    { (yyval.Queue) = NULL; }
     break;
 
   case 60:
-#line 446 "ntp_parser.y"
-    { (yyval.Attr_val) = create_attr_sval(CRYPTO_CONF_PRIV, (yyvsp[(2) - (2)].String)); }
+#line 444 "ntp_parser.y"
+    { (yyval.Queue) = enqueue((yyvsp[(1) - (2)].Queue), (yyvsp[(2) - (2)].Attr_val)); }
     break;
 
   case 61:
-#line 448 "ntp_parser.y"
-    { (yyval.Attr_val) = create_attr_sval(CRYPTO_CONF_IDENT, (yyvsp[(2) - (2)].String)); }
+#line 445 "ntp_parser.y"
+    { (yyval.Queue) = enqueue_in_new_queue((yyvsp[(1) - (1)].Attr_val)); }
     break;
 
   case 62:
 #line 450 "ntp_parser.y"
-    { (yyval.Attr_val) = create_attr_sval(CRYPTO_CONF_PW, (yyvsp[(2) - (2)].String)); }
+    { (yyval.Attr_val) = create_attr_sval(CRYPTO_CONF_PRIV, (yyvsp[(2) - (2)].String)); }
     break;
 
   case 63:
 #line 452 "ntp_parser.y"
-    { (yyval.Attr_val) = create_attr_sval(CRYPTO_CONF_RAND, (yyvsp[(2) - (2)].String)); }
+    { (yyval.Attr_val) = create_attr_sval(CRYPTO_CONF_IDENT, (yyvsp[(2) - (2)].String)); }
     break;
 
   case 64:
 #line 454 "ntp_parser.y"
-    { my_config.auth.revoke = (yyvsp[(2) - (2)].Integer);  }
+    { (yyval.Attr_val) = create_attr_sval(CRYPTO_CONF_PW, (yyvsp[(2) - (2)].String)); }
     break;
 
   case 65:
 #line 456 "ntp_parser.y"
-    { (yyval.Attr_val) = create_attr_sval(CRYPTO_CONF_SIGN, (yyvsp[(2) - (2)].String)); }
+    { (yyval.Attr_val) = create_attr_sval(CRYPTO_CONF_RAND, (yyvsp[(2) - (2)].String)); }
     break;
 
   case 66:
-#line 466 "ntp_parser.y"
-    { append_queue(my_config.orphan_cmds,(yyvsp[(2) - (2)].Queue));  }
+#line 458 "ntp_parser.y"
+    { my_config.auth.revoke = (yyvsp[(2) - (2)].Integer);  }
     break;
 
   case 67:
-#line 470 "ntp_parser.y"
-    { (yyval.Queue) = enqueue((yyvsp[(1) - (2)].Queue), (yyvsp[(2) - (2)].Attr_val)); }
+#line 460 "ntp_parser.y"
+    { (yyval.Attr_val) = create_attr_sval(CRYPTO_CONF_SIGN, (yyvsp[(2) - (2)].String)); }
     break;
 
   case 68:
-#line 471 "ntp_parser.y"
-    { (yyval.Queue) = enqueue_in_new_queue((yyvsp[(1) - (1)].Attr_val)); }
+#line 470 "ntp_parser.y"
+    { append_queue(my_config.orphan_cmds,(yyvsp[(2) - (2)].Queue));  }
     break;
 
   case 69:
-#line 476 "ntp_parser.y"
-    { (yyval.Attr_val) = create_attr_dval(PROTO_CEILING, (double)(yyvsp[(2) - (2)].Integer)); }
+#line 474 "ntp_parser.y"
+    { (yyval.Queue) = enqueue((yyvsp[(1) - (2)].Queue), (yyvsp[(2) - (2)].Attr_val)); }
     break;
 
   case 70:
-#line 478 "ntp_parser.y"
-    { (yyval.Attr_val) = create_attr_dval(PROTO_FLOOR, (double)(yyvsp[(2) - (2)].Integer)); }
+#line 475 "ntp_parser.y"
+    { (yyval.Queue) = enqueue_in_new_queue((yyvsp[(1) - (1)].Attr_val)); }
     break;
 
   case 71:
 #line 480 "ntp_parser.y"
-    { (yyval.Attr_val) = create_attr_dval(PROTO_COHORT, (double)(yyvsp[(2) - (2)].Integer)); }
+    { (yyval.Attr_val) = create_attr_dval(PROTO_CEILING, (double)(yyvsp[(2) - (2)].Integer)); }
     break;
 
   case 72:
 #line 482 "ntp_parser.y"
-    { (yyval.Attr_val) = create_attr_dval(PROTO_ORPHAN, (double)(yyvsp[(2) - (2)].Integer)); }
+    { (yyval.Attr_val) = create_attr_dval(PROTO_FLOOR, (double)(yyvsp[(2) - (2)].Integer)); }
     break;
 
   case 73:
 #line 484 "ntp_parser.y"
-    { (yyval.Attr_val) = create_attr_dval(PROTO_MINDISP, (yyvsp[(2) - (2)].Double)); }
+    { (yyval.Attr_val) = create_attr_dval(PROTO_COHORT, (double)(yyvsp[(2) - (2)].Integer)); }
     break;
 
   case 74:
 #line 486 "ntp_parser.y"
-    { (yyval.Attr_val) = create_attr_dval(PROTO_MAXDIST, (yyvsp[(2) - (2)].Double)); }
+    { (yyval.Attr_val) = create_attr_dval(PROTO_ORPHAN, (double)(yyvsp[(2) - (2)].Integer)); }
     break;
 
   case 75:
 #line 488 "ntp_parser.y"
-    { (yyval.Attr_val) = create_attr_dval(PROTO_MINCLOCK, (yyvsp[(2) - (2)].Double)); }
+    { (yyval.Attr_val) = create_attr_dval(PROTO_MINDISP, (yyvsp[(2) - (2)].Double)); }
     break;
 
   case 76:
 #line 490 "ntp_parser.y"
-    { (yyval.Attr_val) = create_attr_dval(PROTO_MAXCLOCK, (yyvsp[(2) - (2)].Double)); }
+    { (yyval.Attr_val) = create_attr_dval(PROTO_MAXDIST, (yyvsp[(2) - (2)].Double)); }
     break;
 
   case 77:
 #line 492 "ntp_parser.y"
-    { (yyval.Attr_val) = create_attr_dval(PROTO_MINSANE, (double)(yyvsp[(2) - (2)].Integer)); }
+    { (yyval.Attr_val) = create_attr_dval(PROTO_MINCLOCK, (yyvsp[(2) - (2)].Double)); }
     break;
 
   case 78:
 #line 494 "ntp_parser.y"
-    { (yyval.Attr_val) = create_attr_dval(PROTO_BEACON, (double)(yyvsp[(2) - (2)].Integer)); }
+    { (yyval.Attr_val) = create_attr_dval(PROTO_MAXCLOCK, (yyvsp[(2) - (2)].Double)); }
     break;
 
   case 79:
 #line 496 "ntp_parser.y"
-    { (yyval.Attr_val) = create_attr_dval(PROTO_MAXHOP, (double)(yyvsp[(2) - (2)].Integer)); }
+    { (yyval.Attr_val) = create_attr_dval(PROTO_MINSANE, (double)(yyvsp[(2) - (2)].Integer)); }
     break;
 
   case 80:
-#line 506 "ntp_parser.y"
-    { append_queue(my_config.stats_list, (yyvsp[(2) - (2)].Queue));  }
+#line 498 "ntp_parser.y"
+    { (yyval.Attr_val) = create_attr_dval(PROTO_BEACON, (double)(yyvsp[(2) - (2)].Integer)); }
     break;
 
   case 81:
-#line 508 "ntp_parser.y"
-    { my_config.stats_dir = (yyvsp[(2) - (2)].String);  }
+#line 500 "ntp_parser.y"
+    { (yyval.Attr_val) = create_attr_dval(PROTO_MAXHOP, (double)(yyvsp[(2) - (2)].Integer)); }
     break;
 
   case 82:
 #line 510 "ntp_parser.y"
-    {
-                        enqueue(my_config.filegen_opts,
-                                create_filegen_node((yyvsp[(2) - (3)].VoidPtr), (yyvsp[(3) - (3)].Queue)));
-                    }
+    { append_queue(my_config.stats_list, (yyvsp[(2) - (2)].Queue));  }
     break;
 
   case 83:
-#line 517 "ntp_parser.y"
-    { (yyval.Queue) = enqueue((yyvsp[(1) - (2)].Queue), (yyvsp[(2) - (2)].VoidPtr)); }
+#line 512 "ntp_parser.y"
+    { my_config.stats_dir = (yyvsp[(2) - (2)].String);  }
     break;
 
   case 84:
-#line 518 "ntp_parser.y"
-    { (yyval.Queue) = enqueue_in_new_queue((yyvsp[(1) - (1)].VoidPtr)); }
+#line 514 "ntp_parser.y"
+    {
+                        enqueue(my_config.filegen_opts,
+                                create_filegen_node((yyvsp[(2) - (3)].VoidPtr), (yyvsp[(3) - (3)].Queue)));
+                    }
     break;
 
   case 85:
-#line 523 "ntp_parser.y"
-    { (yyval.VoidPtr) = create_pval("clockstats"); }
+#line 521 "ntp_parser.y"
+    { (yyval.Queue) = enqueue((yyvsp[(1) - (2)].Queue), (yyvsp[(2) - (2)].VoidPtr)); }
     break;
 
   case 86:
-#line 525 "ntp_parser.y"
-    { (yyval.VoidPtr) = create_pval("cryptostats"); }
+#line 522 "ntp_parser.y"
+    { (yyval.Queue) = enqueue_in_new_queue((yyvsp[(1) - (1)].VoidPtr)); }
     break;
 
   case 87:
 #line 527 "ntp_parser.y"
-    { (yyval.VoidPtr) = create_pval("loopstats"); }
+    { (yyval.VoidPtr) = create_pval("clockstats"); }
     break;
 
   case 88:
 #line 529 "ntp_parser.y"
-    { (yyval.VoidPtr) = create_pval("peerstats"); }
+    { (yyval.VoidPtr) = create_pval("cryptostats"); }
     break;
 
   case 89:
 #line 531 "ntp_parser.y"
-    { (yyval.VoidPtr) = create_pval("rawstats"); }
+    { (yyval.VoidPtr) = create_pval("loopstats"); }
     break;
 
   case 90:
 #line 533 "ntp_parser.y"
-    { (yyval.VoidPtr) = create_pval("sysstats"); }
+    { (yyval.VoidPtr) = create_pval("peerstats"); }
     break;
 
   case 91:
 #line 535 "ntp_parser.y"
-    { (yyval.VoidPtr) = create_pval("protostats"); }
+    { (yyval.VoidPtr) = create_pval("rawstats"); }
     break;
 
   case 92:
-#line 539 "ntp_parser.y"
-    { (yyval.Queue) = enqueue((yyvsp[(1) - (2)].Queue), (yyvsp[(2) - (2)].Attr_val)); }
+#line 537 "ntp_parser.y"
+    { (yyval.VoidPtr) = create_pval("sysstats"); }
     break;
 
   case 93:
-#line 540 "ntp_parser.y"
-    { (yyval.Queue) = enqueue_in_new_queue((yyvsp[(1) - (1)].Attr_val)); }
+#line 539 "ntp_parser.y"
+    { (yyval.VoidPtr) = create_pval("protostats"); }
     break;
 
   case 94:
-#line 544 "ntp_parser.y"
-    { (yyval.Attr_val) = create_attr_sval(T_File, (yyvsp[(2) - (2)].String)); }
+#line 543 "ntp_parser.y"
+    { (yyval.Queue) = enqueue((yyvsp[(1) - (2)].Queue), (yyvsp[(2) - (2)].Attr_val)); }
     break;
 
   case 95:
-#line 545 "ntp_parser.y"
-    { (yyval.Attr_val) = create_attr_ival(T_Type, (yyvsp[(2) - (2)].Integer)); }
+#line 544 "ntp_parser.y"
+    { (yyval.Queue) = enqueue_in_new_queue((yyvsp[(1) - (1)].Attr_val)); }
     break;
 
   case 96:
-#line 546 "ntp_parser.y"
-    { (yyval.Attr_val) = create_attr_ival(T_Flag, T_Link); }
+#line 548 "ntp_parser.y"
+    { (yyval.Attr_val) = create_attr_sval(T_File, (yyvsp[(2) - (2)].String)); }
     break;
 
   case 97:
-#line 547 "ntp_parser.y"
-    { (yyval.Attr_val) = create_attr_ival(T_Flag, T_Nolink); }
+#line 549 "ntp_parser.y"
+    { (yyval.Attr_val) = create_attr_ival(T_Type, (yyvsp[(2) - (2)].Integer)); }
     break;
 
   case 98:
-#line 548 "ntp_parser.y"
-    { (yyval.Attr_val) = create_attr_ival(T_Flag, T_Enable); }
+#line 550 "ntp_parser.y"
+    { (yyval.Attr_val) = create_attr_ival(T_Flag, T_Link); }
     break;
 
   case 99:
-#line 549 "ntp_parser.y"
-    { (yyval.Attr_val) = create_attr_ival(T_Flag, T_Disable); }
+#line 551 "ntp_parser.y"
+    { (yyval.Attr_val) = create_attr_ival(T_Flag, T_Nolink); }
     break;
 
   case 100:
+#line 552 "ntp_parser.y"
+    { (yyval.Attr_val) = create_attr_ival(T_Flag, T_Enable); }
+    break;
+
+  case 101:
 #line 553 "ntp_parser.y"
+    { (yyval.Attr_val) = create_attr_ival(T_Flag, T_Disable); }
+    break;
+
+  case 102:
+#line 557 "ntp_parser.y"
     { (yyval.Integer) = FILEGEN_NONE; }
     break;
 
-  case 101:
-#line 554 "ntp_parser.y"
+  case 103:
+#line 558 "ntp_parser.y"
     { (yyval.Integer) = FILEGEN_PID; }
     break;
 
-  case 102:
-#line 555 "ntp_parser.y"
+  case 104:
+#line 559 "ntp_parser.y"
     { (yyval.Integer) = FILEGEN_DAY; }
     break;
 
-  case 103:
-#line 556 "ntp_parser.y"
+  case 105:
+#line 560 "ntp_parser.y"
     { (yyval.Integer) = FILEGEN_WEEK; }
     break;
 
-  case 104:
-#line 557 "ntp_parser.y"
+  case 106:
+#line 561 "ntp_parser.y"
     { (yyval.Integer) = FILEGEN_MONTH; }
     break;
 
-  case 105:
-#line 558 "ntp_parser.y"
+  case 107:
+#line 562 "ntp_parser.y"
     { (yyval.Integer) = FILEGEN_YEAR; }
     break;
 
-  case 106:
-#line 559 "ntp_parser.y"
+  case 108:
+#line 563 "ntp_parser.y"
     { (yyval.Integer) = FILEGEN_AGE; }
     break;
 
-  case 107:
-#line 569 "ntp_parser.y"
+  case 109:
+#line 573 "ntp_parser.y"
     {   append_queue(my_config.discard_opts, (yyvsp[(2) - (2)].Queue)); }
     break;
 
-  case 108:
-#line 571 "ntp_parser.y"
+  case 110:
+#line 575 "ntp_parser.y"
     {
                         enqueue(my_config.restrict_opts,
                                 create_restrict_node((yyvsp[(2) - (3)].Address_node), NULL, (yyvsp[(3) - (3)].Queue), ip_file->line_no));
                     }
     break;
 
-  case 109:
-#line 576 "ntp_parser.y"
+  case 111:
+#line 580 "ntp_parser.y"
     {
                         enqueue(my_config.restrict_opts,
                                 create_restrict_node(NULL, NULL, (yyvsp[(3) - (3)].Queue), ip_file->line_no));
                     }
     break;
 
-  case 110:
-#line 581 "ntp_parser.y"
+  case 112:
+#line 585 "ntp_parser.y"
     {
                         enqueue(my_config.restrict_opts,
                                 create_restrict_node((yyvsp[(2) - (5)].Address_node), (yyvsp[(4) - (5)].Address_node), (yyvsp[(5) - (5)].Queue), ip_file->line_no));
                     }
     break;
 
-  case 111:
-#line 588 "ntp_parser.y"
+  case 113:
+#line 592 "ntp_parser.y"
     { (yyval.Queue) = create_queue(); }
     break;
 
-  case 112:
-#line 589 "ntp_parser.y"
+  case 114:
+#line 593 "ntp_parser.y"
     { (yyval.Queue) = enqueue((yyvsp[(1) - (2)].Queue), (yyvsp[(2) - (2)].VoidPtr)); }
     break;
 
-  case 113:
-#line 593 "ntp_parser.y"
+  case 115:
+#line 597 "ntp_parser.y"
     { (yyval.VoidPtr) = create_ival(RES_TIMEOUT); }
     break;
 
-  case 114:
-#line 594 "ntp_parser.y"
+  case 116:
+#line 598 "ntp_parser.y"
     { (yyval.VoidPtr) = create_ival(RES_IGNORE); }
     break;
 
-  case 115:
-#line 595 "ntp_parser.y"
+  case 117:
+#line 599 "ntp_parser.y"
     { (yyval.VoidPtr) = create_ival(RES_KOD); }
     break;
 
-  case 116:
-#line 596 "ntp_parser.y"
+  case 118:
+#line 600 "ntp_parser.y"
     { (yyval.VoidPtr) = create_ival(RES_LIMITED); }
     break;
 
-  case 117:
-#line 597 "ntp_parser.y"
+  case 119:
+#line 601 "ntp_parser.y"
     { (yyval.VoidPtr) = create_ival(RES_LPTRAP); }
     break;
 
-  case 118:
-#line 598 "ntp_parser.y"
-    { (yyval.VoidPtr) = create_ival(RES_NOMODIFY); }
-    break;
-
-  case 119:
-#line 599 "ntp_parser.y"
-    { (yyval.VoidPtr) = create_ival(RES_NOPEER); }
-    break;
-
   case 120:
-#line 600 "ntp_parser.y"
-    { (yyval.VoidPtr) = create_ival(RES_NOQUERY); }
+#line 602 "ntp_parser.y"
+    { (yyval.VoidPtr) = create_ival(RES_NOMODIFY); }
     break;
 
   case 121:
-#line 601 "ntp_parser.y"
-    { (yyval.VoidPtr) = create_ival(RES_DONTSERVE); }
+#line 603 "ntp_parser.y"
+    { (yyval.VoidPtr) = create_ival(RES_NOPEER); }
     break;
 
   case 122:
-#line 602 "ntp_parser.y"
-    { (yyval.VoidPtr) = create_ival(RES_NOTRAP); }
+#line 604 "ntp_parser.y"
+    { (yyval.VoidPtr) = create_ival(RES_NOQUERY); }
     break;
 
   case 123:
-#line 603 "ntp_parser.y"
-    { (yyval.VoidPtr) = create_ival(RES_DONTTRUST); }
+#line 605 "ntp_parser.y"
+    { (yyval.VoidPtr) = create_ival(RES_DONTSERVE); }
     break;
 
   case 124:
-#line 604 "ntp_parser.y"
-    { (yyval.VoidPtr) = create_ival(RESM_NTPONLY); }
+#line 606 "ntp_parser.y"
+    { (yyval.VoidPtr) = create_ival(RES_NOTRAP); }
     break;
 
   case 125:
-#line 605 "ntp_parser.y"
-    { (yyval.VoidPtr) = create_ival(RES_VERSION); }
+#line 607 "ntp_parser.y"
+    { (yyval.VoidPtr) = create_ival(RES_DONTTRUST); }
     break;
 
   case 126:
-#line 609 "ntp_parser.y"
-    { (yyval.Queue) = enqueue((yyvsp[(1) - (2)].Queue), (yyvsp[(2) - (2)].Attr_val)); }
+#line 608 "ntp_parser.y"
+    { (yyval.VoidPtr) = create_ival(RESM_NTPONLY); }
     break;
 
   case 127:
-#line 610 "ntp_parser.y"
-    { (yyval.Queue) = enqueue_in_new_queue((yyvsp[(1) - (1)].Attr_val)); }
+#line 609 "ntp_parser.y"
+    { (yyval.VoidPtr) = create_ival(RES_VERSION); }
     break;
 
   case 128:
-#line 614 "ntp_parser.y"
-    { (yyval.Attr_val) = create_attr_ival(T_Average, (yyvsp[(2) - (2)].Integer)); }
+#line 613 "ntp_parser.y"
+    { (yyval.Queue) = enqueue((yyvsp[(1) - (2)].Queue), (yyvsp[(2) - (2)].Attr_val)); }
     break;
 
   case 129:
-#line 615 "ntp_parser.y"
-    { (yyval.Attr_val) = create_attr_ival(T_Minimum, (yyvsp[(2) - (2)].Integer)); }
+#line 614 "ntp_parser.y"
+    { (yyval.Queue) = enqueue_in_new_queue((yyvsp[(1) - (1)].Attr_val)); }
     break;
 
   case 130:
-#line 616 "ntp_parser.y"
-    { (yyval.Attr_val) = create_attr_ival(T_Monitor, (yyvsp[(2) - (2)].Integer)); }
+#line 618 "ntp_parser.y"
+    { (yyval.Attr_val) = create_attr_ival(T_Average, (yyvsp[(2) - (2)].Integer)); }
     break;
 
   case 131:
-#line 625 "ntp_parser.y"
-    { enqueue(my_config.fudge, create_addr_opts_node((yyvsp[(2) - (3)].Address_node), (yyvsp[(3) - (3)].Queue)));  }
+#line 619 "ntp_parser.y"
+    { (yyval.Attr_val) = create_attr_ival(T_Minimum, (yyvsp[(2) - (2)].Integer)); }
     break;
 
   case 132:
-#line 629 "ntp_parser.y"
-    { enqueue((yyvsp[(1) - (2)].Queue), (yyvsp[(2) - (2)].Attr_val)); }
+#line 620 "ntp_parser.y"
+    { (yyval.Attr_val) = create_attr_ival(T_Monitor, (yyvsp[(2) - (2)].Integer)); }
     break;
 
   case 133:
-#line 630 "ntp_parser.y"
-    { (yyval.Queue) = enqueue_in_new_queue((yyvsp[(1) - (1)].Attr_val)); }
+#line 629 "ntp_parser.y"
+    { enqueue(my_config.fudge, create_addr_opts_node((yyvsp[(2) - (3)].Address_node), (yyvsp[(3) - (3)].Queue)));  }
     break;
 
   case 134:
-#line 635 "ntp_parser.y"
-    { (yyval.Attr_val) = create_attr_dval(CLK_HAVETIME1, (yyvsp[(2) - (2)].Double)); }
+#line 633 "ntp_parser.y"
+    { enqueue((yyvsp[(1) - (2)].Queue), (yyvsp[(2) - (2)].Attr_val)); }
     break;
 
   case 135:
-#line 637 "ntp_parser.y"
-    { (yyval.Attr_val) = create_attr_dval(CLK_HAVETIME2, (yyvsp[(2) - (2)].Double)); }
+#line 634 "ntp_parser.y"
+    { (yyval.Queue) = enqueue_in_new_queue((yyvsp[(1) - (1)].Attr_val)); }
     break;
 
   case 136:
 #line 639 "ntp_parser.y"
-    { (yyval.Attr_val) = create_attr_ival(CLK_HAVEVAL1,  (yyvsp[(2) - (2)].Integer)); }
+    { (yyval.Attr_val) = create_attr_dval(CLK_HAVETIME1, (yyvsp[(2) - (2)].Double)); }
     break;
 
   case 137:
 #line 641 "ntp_parser.y"
-    { (yyval.Attr_val) = create_attr_sval(CLK_HAVEVAL2,  (yyvsp[(2) - (2)].String)); }
+    { (yyval.Attr_val) = create_attr_dval(CLK_HAVETIME2, (yyvsp[(2) - (2)].Double)); }
     break;
 
   case 138:
 #line 643 "ntp_parser.y"
-    { (yyval.Attr_val) = create_attr_ival(CLK_HAVEFLAG1, (yyvsp[(2) - (2)].Integer)); }
+    { (yyval.Attr_val) = create_attr_ival(CLK_HAVEVAL1,  (yyvsp[(2) - (2)].Integer)); }
     break;
 
   case 139:
 #line 645 "ntp_parser.y"
-    { (yyval.Attr_val) = create_attr_ival(CLK_HAVEFLAG2, (yyvsp[(2) - (2)].Integer)); }
+    { (yyval.Attr_val) = create_attr_sval(CLK_HAVEVAL2,  (yyvsp[(2) - (2)].String)); }
     break;
 
   case 140:
 #line 647 "ntp_parser.y"
-    { (yyval.Attr_val) = create_attr_ival(CLK_HAVEFLAG3, (yyvsp[(2) - (2)].Integer)); }
+    { (yyval.Attr_val) = create_attr_ival(CLK_HAVEFLAG1, (yyvsp[(2) - (2)].Integer)); }
     break;
 
   case 141:
 #line 649 "ntp_parser.y"
-    { (yyval.Attr_val) = create_attr_ival(CLK_HAVEFLAG4, (yyvsp[(2) - (2)].Integer)); }
+    { (yyval.Attr_val) = create_attr_ival(CLK_HAVEFLAG2, (yyvsp[(2) - (2)].Integer)); }
     break;
 
   case 142:
-#line 658 "ntp_parser.y"
-    { append_queue(my_config.enable_opts,(yyvsp[(2) - (2)].Queue));  }
+#line 651 "ntp_parser.y"
+    { (yyval.Attr_val) = create_attr_ival(CLK_HAVEFLAG3, (yyvsp[(2) - (2)].Integer)); }
     break;
 
   case 143:
-#line 660 "ntp_parser.y"
-    { append_queue(my_config.disable_opts,(yyvsp[(2) - (2)].Queue));  }
+#line 653 "ntp_parser.y"
+    { (yyval.Attr_val) = create_attr_ival(CLK_HAVEFLAG4, (yyvsp[(2) - (2)].Integer)); }
     break;
 
   case 144:
-#line 664 "ntp_parser.y"
-    { (yyval.Queue) = enqueue((yyvsp[(1) - (2)].Queue), (yyvsp[(2) - (2)].Attr_val)); }
+#line 662 "ntp_parser.y"
+    { append_queue(my_config.enable_opts,(yyvsp[(2) - (2)].Queue));  }
     break;
 
   case 145:
-#line 665 "ntp_parser.y"
-    { (yyval.Queue) = enqueue_in_new_queue((yyvsp[(1) - (1)].Attr_val)); }
+#line 664 "ntp_parser.y"
+    { append_queue(my_config.disable_opts,(yyvsp[(2) - (2)].Queue));  }
     break;
 
   case 146:
-#line 669 "ntp_parser.y"
-    { (yyval.Attr_val) = create_attr_ival(T_Flag, PROTO_AUTHENTICATE); }
+#line 668 "ntp_parser.y"
+    { (yyval.Queue) = enqueue((yyvsp[(1) - (2)].Queue), (yyvsp[(2) - (2)].Attr_val)); }
     break;
 
   case 147:
-#line 670 "ntp_parser.y"
-    { (yyval.Attr_val) = create_attr_ival(T_Flag, PROTO_BROADCLIENT); }
+#line 669 "ntp_parser.y"
+    { (yyval.Queue) = enqueue_in_new_queue((yyvsp[(1) - (1)].Attr_val)); }
     break;
 
   case 148:
-#line 671 "ntp_parser.y"
-    { (yyval.Attr_val) = create_attr_ival(T_Flag, PROTO_CAL); }
+#line 673 "ntp_parser.y"
+    { (yyval.Attr_val) = create_attr_ival(T_Flag, PROTO_AUTHENTICATE); }
     break;
 
   case 149:
-#line 672 "ntp_parser.y"
-    { (yyval.Attr_val) = create_attr_ival(T_Flag, PROTO_KERNEL); }
+#line 674 "ntp_parser.y"
+    { (yyval.Attr_val) = create_attr_ival(T_Flag, PROTO_BROADCLIENT); }
     break;
 
   case 150:
-#line 673 "ntp_parser.y"
-    { (yyval.Attr_val) = create_attr_ival(T_Flag, PROTO_MONITOR); }
+#line 675 "ntp_parser.y"
+    { (yyval.Attr_val) = create_attr_ival(T_Flag, PROTO_CAL); }
     break;
 
   case 151:
-#line 674 "ntp_parser.y"
-    { (yyval.Attr_val) = create_attr_ival(T_Flag, PROTO_NTP); }
+#line 676 "ntp_parser.y"
+    { (yyval.Attr_val) = create_attr_ival(T_Flag, PROTO_KERNEL); }
     break;
 
   case 152:
-#line 676 "ntp_parser.y"
-    { (yyval.Attr_val) = create_attr_ival(T_Flag, PROTO_FILEGEN); }
+#line 677 "ntp_parser.y"
+    { (yyval.Attr_val) = create_attr_ival(T_Flag, PROTO_MONITOR); }
     break;
 
   case 153:
-#line 684 "ntp_parser.y"
-    { append_queue(my_config.tinker, (yyvsp[(2) - (2)].Queue));  }
+#line 678 "ntp_parser.y"
+    { (yyval.Attr_val) = create_attr_ival(T_Flag, PROTO_NTP); }
     break;
 
   case 154:
-#line 688 "ntp_parser.y"
-    { (yyval.Queue) = enqueue((yyvsp[(1) - (2)].Queue), (yyvsp[(2) - (2)].Attr_val)); }
+#line 680 "ntp_parser.y"
+    { (yyval.Attr_val) = create_attr_ival(T_Flag, PROTO_FILEGEN); }
     break;
 
   case 155:
-#line 689 "ntp_parser.y"
-    { (yyval.Queue) = enqueue_in_new_queue((yyvsp[(1) - (1)].Attr_val)); }
+#line 688 "ntp_parser.y"
+    { append_queue(my_config.tinker, (yyvsp[(2) - (2)].Queue));  }
     break;
 
   case 156:
+#line 692 "ntp_parser.y"
+    { (yyval.Queue) = enqueue((yyvsp[(1) - (2)].Queue), (yyvsp[(2) - (2)].Attr_val)); }
+    break;
+
+  case 157:
 #line 693 "ntp_parser.y"
+    { (yyval.Queue) = enqueue_in_new_queue((yyvsp[(1) - (1)].Attr_val)); }
+    break;
+
+  case 158:
+#line 697 "ntp_parser.y"
     { (yyval.Attr_val) = create_attr_dval(LOOP_ALLAN, (yyvsp[(2) - (2)].Double)); }
     break;
 
-  case 157:
-#line 694 "ntp_parser.y"
+  case 159:
+#line 698 "ntp_parser.y"
     { (yyval.Attr_val) = create_attr_dval(LOOP_PHI, (yyvsp[(2) - (2)].Double)); }
     break;
 
-  case 158:
-#line 695 "ntp_parser.y"
+  case 160:
+#line 699 "ntp_parser.y"
     { (yyval.Attr_val) = create_attr_dval(LOOP_FREQ, (yyvsp[(2) - (2)].Double)); }
     break;
 
-  case 159:
-#line 696 "ntp_parser.y"
+  case 161:
+#line 700 "ntp_parser.y"
     { (yyval.Attr_val) = create_attr_dval(LOOP_HUFFPUFF, (yyvsp[(2) - (2)].Double)); }
     break;
 
-  case 160:
-#line 697 "ntp_parser.y"
+  case 162:
+#line 701 "ntp_parser.y"
     { (yyval.Attr_val) = create_attr_dval(LOOP_PANIC, (yyvsp[(2) - (2)].Double)); }
     break;
 
-  case 161:
-#line 698 "ntp_parser.y"
+  case 163:
+#line 702 "ntp_parser.y"
     { (yyval.Attr_val) = create_attr_dval(LOOP_MAX, (yyvsp[(2) - (2)].Double)); }
     break;
 
-  case 162:
-#line 699 "ntp_parser.y"
+  case 164:
+#line 703 "ntp_parser.y"
     { (yyval.Attr_val) = create_attr_dval(LOOP_MINSTEP, (yyvsp[(2) - (2)].Double)); }
     break;
 
-  case 163:
-#line 708 "ntp_parser.y"
+  case 165:
+#line 712 "ntp_parser.y"
     {
                     if (curr_include_level >= MAXINCLUDELEVEL) {
                         fprintf(stderr, "getconfig: Maximum include file level exceeded.\n");
@@ -2868,148 +2895,148 @@ yyreduce:
                 }
     break;
 
-  case 164:
-#line 724 "ntp_parser.y"
+  case 166:
+#line 728 "ntp_parser.y"
     {
                     while (curr_include_level != -1)
                         FCLOSE(fp[curr_include_level--]);
                 }
     break;
 
-  case 165:
-#line 730 "ntp_parser.y"
-    { enqueue(my_config.vars, create_attr_dval(T_Broadcastdelay, (yyvsp[(2) - (2)].Double)));  }
-    break;
-
-  case 166:
-#line 732 "ntp_parser.y"
-    { enqueue(my_config.vars, create_attr_ival(T_Calldelay, (yyvsp[(2) - (2)].Integer)));  }
-    break;
-
   case 167:
 #line 734 "ntp_parser.y"
-    { enqueue(my_config.vars, create_attr_dval(T_Tick, (yyvsp[(2) - (2)].Double)));  }
+    { enqueue(my_config.vars, create_attr_dval(T_Broadcastdelay, (yyvsp[(2) - (2)].Double)));  }
     break;
 
   case 168:
 #line 736 "ntp_parser.y"
-    { /* Null action, possibly all null parms */ }
+    { enqueue(my_config.vars, create_attr_ival(T_Calldelay, (yyvsp[(2) - (2)].Integer)));  }
     break;
 
   case 169:
 #line 738 "ntp_parser.y"
-    { enqueue(my_config.vars, create_attr_sval(T_Leapfile, (yyvsp[(2) - (2)].String))); }
+    { enqueue(my_config.vars, create_attr_dval(T_Tick, (yyvsp[(2) - (2)].Double)));  }
     break;
 
   case 170:
-#line 741 "ntp_parser.y"
-    { enqueue(my_config.vars, create_attr_sval(T_Pidfile, (yyvsp[(2) - (2)].String)));  }
+#line 740 "ntp_parser.y"
+    { /* Null action, possibly all null parms */ }
     break;
 
   case 171:
-#line 743 "ntp_parser.y"
-    { enqueue(my_config.vars, create_attr_sval(T_Logfile, (yyvsp[(2) - (2)].String)));  }
+#line 742 "ntp_parser.y"
+    { enqueue(my_config.vars, create_attr_sval(T_Leapfile, (yyvsp[(2) - (2)].String))); }
     break;
 
   case 172:
 #line 745 "ntp_parser.y"
-    { enqueue(my_config.vars, create_attr_ival(T_Automax, (yyvsp[(2) - (2)].Integer)));  }
+    { enqueue(my_config.vars, create_attr_sval(T_Pidfile, (yyvsp[(2) - (2)].String)));  }
     break;
 
   case 173:
-#line 748 "ntp_parser.y"
-    { append_queue(my_config.logconfig, (yyvsp[(2) - (2)].Queue));  }
+#line 747 "ntp_parser.y"
+    { enqueue(my_config.vars, create_attr_sval(T_Logfile, (yyvsp[(2) - (2)].String)));  }
     break;
 
   case 174:
-#line 750 "ntp_parser.y"
-    { append_queue(my_config.phone, (yyvsp[(2) - (2)].Queue));  }
+#line 749 "ntp_parser.y"
+    { enqueue(my_config.vars, create_attr_ival(T_Automax, (yyvsp[(2) - (2)].Integer)));  }
     break;
 
   case 175:
 #line 752 "ntp_parser.y"
-    { enqueue(my_config.setvar, (yyvsp[(2) - (2)].Set_var));  }
+    { append_queue(my_config.logconfig, (yyvsp[(2) - (2)].Queue));  }
     break;
 
   case 176:
 #line 754 "ntp_parser.y"
-    { enqueue(my_config.trap, create_addr_opts_node((yyvsp[(2) - (3)].Address_node), (yyvsp[(3) - (3)].Queue)));  }
+    { append_queue(my_config.phone, (yyvsp[(2) - (2)].Queue));  }
     break;
 
   case 177:
 #line 756 "ntp_parser.y"
-    { append_queue(my_config.ttl, (yyvsp[(2) - (2)].Queue)); }
+    { enqueue(my_config.setvar, (yyvsp[(2) - (2)].Set_var));  }
     break;
 
   case 178:
 #line 758 "ntp_parser.y"
-    { enqueue(my_config.qos, create_attr_sval(T_Qos, (yyvsp[(2) - (2)].String))); }
+    { enqueue(my_config.trap, create_addr_opts_node((yyvsp[(2) - (3)].Address_node), (yyvsp[(3) - (3)].Queue)));  }
     break;
 
   case 179:
+#line 760 "ntp_parser.y"
+    { append_queue(my_config.ttl, (yyvsp[(2) - (2)].Queue)); }
+    break;
+
+  case 180:
 #line 762 "ntp_parser.y"
+    { enqueue(my_config.qos, create_attr_sval(T_Qos, (yyvsp[(2) - (2)].String))); }
+    break;
+
+  case 181:
+#line 766 "ntp_parser.y"
     { enqueue(my_config.vars, create_attr_sval(T_Driftfile, (yyvsp[(1) - (1)].String))); }
     break;
 
-  case 180:
-#line 764 "ntp_parser.y"
+  case 182:
+#line 768 "ntp_parser.y"
     { enqueue(my_config.vars, create_attr_dval(T_WanderThreshold, (yyvsp[(2) - (2)].Double)));
                  enqueue(my_config.vars, create_attr_sval(T_Driftfile, (yyvsp[(1) - (2)].String))); }
     break;
 
-  case 181:
-#line 766 "ntp_parser.y"
+  case 183:
+#line 770 "ntp_parser.y"
     { /* Null driftfile,  indicated by null string "\0" */
                  enqueue(my_config.vars, create_attr_sval(T_Driftfile, "\0")); }
     break;
 
-  case 182:
-#line 772 "ntp_parser.y"
+  case 184:
+#line 776 "ntp_parser.y"
     { (yyval.Set_var) = create_setvar_node((yyvsp[(1) - (4)].String), (yyvsp[(3) - (4)].String), DEF); }
     break;
 
-  case 183:
-#line 774 "ntp_parser.y"
+  case 185:
+#line 778 "ntp_parser.y"
     { (yyval.Set_var) = create_setvar_node((yyvsp[(1) - (3)].String), (yyvsp[(3) - (3)].String), 0); }
     break;
 
-  case 184:
-#line 779 "ntp_parser.y"
+  case 186:
+#line 783 "ntp_parser.y"
     { (yyval.Queue) = enqueue((yyvsp[(1) - (2)].Queue), (yyvsp[(2) - (2)].Attr_val)); }
     break;
 
-  case 185:
-#line 780 "ntp_parser.y"
+  case 187:
+#line 784 "ntp_parser.y"
     { (yyval.Queue) = enqueue_in_new_queue((yyvsp[(1) - (1)].Attr_val)); }
     break;
 
-  case 186:
-#line 784 "ntp_parser.y"
+  case 188:
+#line 788 "ntp_parser.y"
     { (yyval.Attr_val) = create_attr_ival(T_Port, (yyvsp[(2) - (2)].Integer)); }
     break;
 
-  case 187:
-#line 785 "ntp_parser.y"
+  case 189:
+#line 789 "ntp_parser.y"
     { (yyval.Attr_val) = create_attr_pval(T_Interface, (yyvsp[(2) - (2)].Address_node)); }
     break;
 
-  case 188:
-#line 790 "ntp_parser.y"
+  case 190:
+#line 794 "ntp_parser.y"
     { (yyval.Queue) = enqueue((yyvsp[(1) - (2)].Queue), (yyvsp[(2) - (2)].Attr_val)); }
     break;
 
-  case 189:
-#line 791 "ntp_parser.y"
+  case 191:
+#line 795 "ntp_parser.y"
     { (yyval.Queue) = enqueue_in_new_queue((yyvsp[(1) - (1)].Attr_val)); }
     break;
 
-  case 190:
-#line 795 "ntp_parser.y"
+  case 192:
+#line 799 "ntp_parser.y"
     { (yyval.Attr_val) = create_attr_sval((yyvsp[(1) - (2)].Integer), (yyvsp[(2) - (2)].String)); }
     break;
 
-  case 191:
-#line 797 "ntp_parser.y"
+  case 193:
+#line 801 "ntp_parser.y"
     {
                     /* YUCK!! This is needed because '+' and '-' are not special characters
                      * while '=' is.
@@ -3025,53 +3052,53 @@ yyreduce:
                 }
     break;
 
-  case 192:
-#line 813 "ntp_parser.y"
+  case 194:
+#line 817 "ntp_parser.y"
     { (yyval.Integer) = '+'; }
     break;
 
-  case 193:
-#line 814 "ntp_parser.y"
+  case 195:
+#line 818 "ntp_parser.y"
     { (yyval.Integer) = '-'; }
     break;
 
-  case 194:
-#line 815 "ntp_parser.y"
+  case 196:
+#line 819 "ntp_parser.y"
     { (yyval.Integer) = '='; }
     break;
 
-  case 195:
-#line 824 "ntp_parser.y"
+  case 197:
+#line 828 "ntp_parser.y"
     { (yyval.Queue) = enqueue((yyvsp[(1) - (2)].Queue), create_ival((yyvsp[(2) - (2)].Integer))); }
     break;
 
-  case 196:
-#line 825 "ntp_parser.y"
+  case 198:
+#line 829 "ntp_parser.y"
     { (yyval.Queue) = enqueue_in_new_queue(create_ival((yyvsp[(1) - (1)].Integer))); }
     break;
 
-  case 197:
-#line 829 "ntp_parser.y"
+  case 199:
+#line 833 "ntp_parser.y"
     { (yyval.Queue) = enqueue((yyvsp[(1) - (2)].Queue), create_pval((yyvsp[(2) - (2)].String))); }
     break;
 
-  case 198:
-#line 830 "ntp_parser.y"
+  case 200:
+#line 834 "ntp_parser.y"
     { (yyval.Queue) = enqueue_in_new_queue(create_pval((yyvsp[(1) - (1)].String))); }
     break;
 
-  case 199:
-#line 834 "ntp_parser.y"
+  case 201:
+#line 838 "ntp_parser.y"
     { (yyval.Queue) = enqueue((yyvsp[(1) - (2)].Queue), (yyvsp[(2) - (2)].Address_node)); }
     break;
 
-  case 200:
-#line 835 "ntp_parser.y"
+  case 202:
+#line 839 "ntp_parser.y"
     { (yyval.Queue) = enqueue_in_new_queue((yyvsp[(1) - (1)].Address_node)); }
     break;
 
-  case 201:
-#line 840 "ntp_parser.y"
+  case 203:
+#line 844 "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");
@@ -3082,28 +3109,28 @@ yyreduce:
                 }
     break;
 
-  case 202:
-#line 848 "ntp_parser.y"
+  case 204:
+#line 852 "ntp_parser.y"
     { (yyval.Integer) = 1; }
     break;
 
-  case 203:
-#line 849 "ntp_parser.y"
+  case 205:
+#line 853 "ntp_parser.y"
     { (yyval.Integer) = 0; }
     break;
 
-  case 204:
-#line 853 "ntp_parser.y"
+  case 206:
+#line 857 "ntp_parser.y"
     { (yyval.Double) = (double)(yyvsp[(1) - (1)].Integer); }
     break;
 
-  case 205:
-#line 854 "ntp_parser.y"
+  case 207:
+#line 858 "ntp_parser.y"
     { (yyval.Double) = (yyvsp[(1) - (1)].Double); }
     break;
 
-  case 206:
-#line 863 "ntp_parser.y"
+  case 208:
+#line 867 "ntp_parser.y"
     {
                  my_config.sim_details = create_sim_node((yyvsp[(3) - (5)].Queue), (yyvsp[(4) - (5)].Queue));
 
@@ -3112,119 +3139,119 @@ yyreduce:
              }
     break;
 
-  case 207:
-#line 877 "ntp_parser.y"
+  case 209:
+#line 881 "ntp_parser.y"
     { old_config_style = 0; }
     break;
 
-  case 208:
-#line 881 "ntp_parser.y"
+  case 210:
+#line 885 "ntp_parser.y"
     { (yyval.Queue) = enqueue((yyvsp[(1) - (3)].Queue), (yyvsp[(2) - (3)].Attr_val)); }
     break;
 
-  case 209:
-#line 882 "ntp_parser.y"
+  case 211:
+#line 886 "ntp_parser.y"
     { (yyval.Queue) = enqueue_in_new_queue((yyvsp[(1) - (2)].Attr_val)); }
     break;
 
-  case 210:
-#line 886 "ntp_parser.y"
+  case 212:
+#line 890 "ntp_parser.y"
     { (yyval.Attr_val) = create_attr_dval(T_Beep_Delay, (yyvsp[(3) - (3)].Double)); }
     break;
 
-  case 211:
-#line 887 "ntp_parser.y"
+  case 213:
+#line 891 "ntp_parser.y"
     { (yyval.Attr_val) = create_attr_dval(T_Sim_Duration, (yyvsp[(3) - (3)].Double)); }
     break;
 
-  case 212:
-#line 891 "ntp_parser.y"
+  case 214:
+#line 895 "ntp_parser.y"
     { (yyval.Queue) = enqueue((yyvsp[(1) - (2)].Queue), (yyvsp[(2) - (2)].Sim_server)); }
     break;
 
-  case 213:
-#line 892 "ntp_parser.y"
+  case 215:
+#line 896 "ntp_parser.y"
     { (yyval.Queue) = enqueue_in_new_queue((yyvsp[(1) - (1)].Sim_server)); }
     break;
 
-  case 214:
-#line 897 "ntp_parser.y"
+  case 216:
+#line 901 "ntp_parser.y"
     { (yyval.Sim_server) = create_sim_server((yyvsp[(1) - (5)].Address_node), (yyvsp[(3) - (5)].Double), (yyvsp[(4) - (5)].Queue)); }
     break;
 
-  case 215:
-#line 901 "ntp_parser.y"
+  case 217:
+#line 905 "ntp_parser.y"
     { (yyval.Double) = (yyvsp[(3) - (4)].Double); }
     break;
 
-  case 216:
-#line 905 "ntp_parser.y"
+  case 218:
+#line 909 "ntp_parser.y"
     { (yyval.Address_node) = (yyvsp[(3) - (3)].Address_node); }
     break;
 
-  case 217:
-#line 909 "ntp_parser.y"
+  case 219:
+#line 913 "ntp_parser.y"
     { (yyval.Address_node) = (yyvsp[(1) - (1)].Address_node); }
     break;
 
-  case 218:
-#line 910 "ntp_parser.y"
+  case 220:
+#line 914 "ntp_parser.y"
     { (yyval.Address_node) = create_address_node((yyvsp[(1) - (1)].String), T_String); }
     break;
 
-  case 219:
-#line 914 "ntp_parser.y"
+  case 221:
+#line 918 "ntp_parser.y"
     { (yyval.Queue) = enqueue((yyvsp[(1) - (2)].Queue), (yyvsp[(2) - (2)].Sim_script)); }
     break;
 
-  case 220:
-#line 915 "ntp_parser.y"
+  case 222:
+#line 919 "ntp_parser.y"
     { (yyval.Queue) = enqueue_in_new_queue((yyvsp[(1) - (1)].Sim_script)); }
     break;
 
-  case 221:
-#line 920 "ntp_parser.y"
+  case 223:
+#line 924 "ntp_parser.y"
     { (yyval.Sim_script) = create_sim_script_info((yyvsp[(3) - (6)].Double), (yyvsp[(5) - (6)].Queue)); }
     break;
 
-  case 222:
-#line 924 "ntp_parser.y"
+  case 224:
+#line 928 "ntp_parser.y"
     { (yyval.Queue) = enqueue((yyvsp[(1) - (3)].Queue), (yyvsp[(2) - (3)].Attr_val)); }
     break;
 
-  case 223:
-#line 925 "ntp_parser.y"
+  case 225:
+#line 929 "ntp_parser.y"
     { (yyval.Queue) = enqueue_in_new_queue((yyvsp[(1) - (2)].Attr_val)); }
     break;
 
-  case 224:
-#line 930 "ntp_parser.y"
+  case 226:
+#line 934 "ntp_parser.y"
     { (yyval.Attr_val) = create_attr_dval(T_Freq_Offset, (yyvsp[(3) - (3)].Double)); }
     break;
 
-  case 225:
-#line 932 "ntp_parser.y"
+  case 227:
+#line 936 "ntp_parser.y"
     { (yyval.Attr_val) = create_attr_dval(T_Wander, (yyvsp[(3) - (3)].Double)); }
     break;
 
-  case 226:
-#line 934 "ntp_parser.y"
+  case 228:
+#line 938 "ntp_parser.y"
     { (yyval.Attr_val) = create_attr_dval(T_Jitter, (yyvsp[(3) - (3)].Double)); }
     break;
 
-  case 227:
-#line 936 "ntp_parser.y"
+  case 229:
+#line 940 "ntp_parser.y"
     { (yyval.Attr_val) = create_attr_dval(T_Prop_Delay, (yyvsp[(3) - (3)].Double)); }
     break;
 
-  case 228:
-#line 938 "ntp_parser.y"
+  case 230:
+#line 942 "ntp_parser.y"
     { (yyval.Attr_val) = create_attr_dval(T_Proc_Delay, (yyvsp[(3) - (3)].Double)); }
     break;
 
 
 /* Line 1267 of yacc.c.  */
-#line 3228 "../../ntpd/ntp_parser.c"
+#line 3255 "../../ntpd/ntp_parser.c"
       default: break;
     }
   YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
@@ -3438,7 +3465,7 @@ yyreturn:
 }
 
 
-#line 942 "ntp_parser.y"
+#line 946 "ntp_parser.y"
 
 
 /* KEYWORDS
index aa7861b6d7e9f0a4753b9165d402ae0ca7a999db..676e7fcc34840d239a18db680f29aa0eba90d4eb 100644 (file)
      T_Average = 263,
      T_Bclient = 264,
      T_Beacon = 265,
-     T_Broadcast = 266,
-     T_Broadcastclient = 267,
-     T_Broadcastdelay = 268,
-     T_Burst = 269,
-     T_Calibrate = 270,
-     T_Calldelay = 271,
-     T_Ceiling = 272,
-     T_Clockstats = 273,
-     T_Cohort = 274,
-     T_ControlKey = 275,
-     T_Crypto = 276,
-     T_Cryptostats = 277,
-     T_Day = 278,
-     T_Default = 279,
-     T_Disable = 280,
-     T_Discard = 281,
-     T_Dispersion = 282,
-     T_Double = 283,
-     T_Driftfile = 284,
-     T_WanderThreshold = 285,
-     T_Enable = 286,
-     T_End = 287,
-     T_False = 288,
-     T_File = 289,
-     T_Filegen = 290,
-     T_Flag1 = 291,
-     T_Flag2 = 292,
-     T_Flag3 = 293,
-     T_Flag4 = 294,
-     T_Flake = 295,
-     T_Floor = 296,
-     T_Freq = 297,
-     T_Fudge = 298,
-     T_Host = 299,
-     T_Huffpuff = 300,
-     T_IPv4_address = 301,
-     T_IPv6_address = 302,
-     T_Iburst = 303,
-     T_Ident = 304,
-     T_Ignore = 305,
-     T_Includefile = 306,
-     T_Integer = 307,
-     T_Interface = 308,
-     T_Kernel = 309,
-     T_Key = 310,
-     T_Keys = 311,
-     T_Keysdir = 312,
-     T_Kod = 313,
-     T_Leap = 314,
-     T_Leapfile = 315,
-     T_Limited = 316,
-     T_Link = 317,
-     T_Logconfig = 318,
-     T_Logfile = 319,
-     T_Loopstats = 320,
-     T_Lowpriotrap = 321,
-     T_Manycastclient = 322,
-     T_Manycastserver = 323,
-     T_Mask = 324,
-     T_Maxclock = 325,
-     T_Maxdist = 326,
-     T_Maxhop = 327,
-     T_Maxpoll = 328,
-     T_Minclock = 329,
-     T_Mindist = 330,
-     T_Minimum = 331,
-     T_Minpoll = 332,
-     T_Minsane = 333,
-     T_Mode = 334,
-     T_Monitor = 335,
-     T_Month = 336,
-     T_Multicastclient = 337,
-     T_Nolink = 338,
-     T_Nomodify = 339,
-     T_None = 340,
-     T_Nopeer = 341,
-     T_Noquery = 342,
-     T_Noselect = 343,
-     T_Noserve = 344,
-     T_Notrap = 345,
-     T_Notrust = 346,
-     T_Novolley = 347,
-     T_Ntp = 348,
-     T_Ntpport = 349,
-     T_Orphan = 350,
-     T_Panic = 351,
-     T_Peer = 352,
-     T_Peerstats = 353,
-     T_Phone = 354,
-     T_Pid = 355,
-     T_Pidfile = 356,
-     T_Pool = 357,
-     T_Port = 358,
-     T_Pps = 359,
-     T_Preempt = 360,
-     T_Prefer = 361,
-     T_Protostats = 362,
-     T_Pw = 363,
-     T_Qos = 364,
-     T_RandFile = 365,
-     T_Rawstats = 366,
-     T_Refid = 367,
-     T_Requestkey = 368,
-     T_Restrict = 369,
-     T_Revoke = 370,
-     T_Server = 371,
-     T_Setvar = 372,
-     T_Sign = 373,
-     T_Statistics = 374,
-     T_Stats = 375,
-     T_Statsdir = 376,
-     T_Step = 377,
-     T_Stepout = 378,
-     T_Stratum = 379,
-     T_String = 380,
-     T_Sysstats = 381,
-     T_Tick = 382,
-     T_Time1 = 383,
-     T_Time2 = 384,
-     T_Tinker = 385,
-     T_Tos = 386,
-     T_Trap = 387,
-     T_True = 388,
-     T_Trustedkey = 389,
-     T_Ttl = 390,
-     T_Type = 391,
-     T_Version = 392,
-     T_Week = 393,
-     T_Year = 394,
-     T_Flag = 395,
-     T_Void = 396,
-     T_EOC = 397,
-     T_Simulate = 398,
-     T_Beep_Delay = 399,
-     T_Sim_Duration = 400,
-     T_Server_Offset = 401,
-     T_Duration = 402,
-     T_Freq_Offset = 403,
-     T_Wander = 404,
-     T_Jitter = 405,
-     T_Prop_Delay = 406,
-     T_Proc_Delay = 407
+     T_Bias = 266,
+     T_Broadcast = 267,
+     T_Broadcastclient = 268,
+     T_Broadcastdelay = 269,
+     T_Burst = 270,
+     T_Calibrate = 271,
+     T_Calldelay = 272,
+     T_Ceiling = 273,
+     T_Clockstats = 274,
+     T_Cohort = 275,
+     T_ControlKey = 276,
+     T_Crypto = 277,
+     T_Cryptostats = 278,
+     T_Day = 279,
+     T_Default = 280,
+     T_Disable = 281,
+     T_Discard = 282,
+     T_Dispersion = 283,
+     T_Double = 284,
+     T_Driftfile = 285,
+     T_WanderThreshold = 286,
+     T_Enable = 287,
+     T_End = 288,
+     T_False = 289,
+     T_File = 290,
+     T_Filegen = 291,
+     T_Flag1 = 292,
+     T_Flag2 = 293,
+     T_Flag3 = 294,
+     T_Flag4 = 295,
+     T_Flake = 296,
+     T_Floor = 297,
+     T_Freq = 298,
+     T_Fudge = 299,
+     T_Host = 300,
+     T_Huffpuff = 301,
+     T_IPv4_address = 302,
+     T_IPv6_address = 303,
+     T_Iburst = 304,
+     T_Ident = 305,
+     T_Ignore = 306,
+     T_Includefile = 307,
+     T_Integer = 308,
+     T_Interface = 309,
+     T_Kernel = 310,
+     T_Key = 311,
+     T_Keys = 312,
+     T_Keysdir = 313,
+     T_Kod = 314,
+     T_Leap = 315,
+     T_Leapfile = 316,
+     T_Limited = 317,
+     T_Link = 318,
+     T_Logconfig = 319,
+     T_Logfile = 320,
+     T_Loopstats = 321,
+     T_Lowpriotrap = 322,
+     T_Manycastclient = 323,
+     T_Manycastserver = 324,
+     T_Mask = 325,
+     T_Maxclock = 326,
+     T_Maxdist = 327,
+     T_Maxhop = 328,
+     T_Maxpoll = 329,
+     T_Minclock = 330,
+     T_Mindist = 331,
+     T_Minimum = 332,
+     T_Minpoll = 333,
+     T_Minsane = 334,
+     T_Mode = 335,
+     T_Monitor = 336,
+     T_Month = 337,
+     T_Multicastclient = 338,
+     T_Nolink = 339,
+     T_Nomodify = 340,
+     T_None = 341,
+     T_Nopeer = 342,
+     T_Noquery = 343,
+     T_Noselect = 344,
+     T_Noserve = 345,
+     T_Notrap = 346,
+     T_Notrust = 347,
+     T_Novolley = 348,
+     T_Ntp = 349,
+     T_Ntpport = 350,
+     T_Orphan = 351,
+     T_Panic = 352,
+     T_Peer = 353,
+     T_Peerstats = 354,
+     T_Phone = 355,
+     T_Pid = 356,
+     T_Pidfile = 357,
+     T_Pool = 358,
+     T_Port = 359,
+     T_Pps = 360,
+     T_Preempt = 361,
+     T_Prefer = 362,
+     T_Protostats = 363,
+     T_Pw = 364,
+     T_Qos = 365,
+     T_RandFile = 366,
+     T_Rawstats = 367,
+     T_Refid = 368,
+     T_Requestkey = 369,
+     T_Restrict = 370,
+     T_Revoke = 371,
+     T_Server = 372,
+     T_Setvar = 373,
+     T_Sign = 374,
+     T_Statistics = 375,
+     T_Stats = 376,
+     T_Statsdir = 377,
+     T_Step = 378,
+     T_Stepout = 379,
+     T_Stratum = 380,
+     T_String = 381,
+     T_Sysstats = 382,
+     T_Tick = 383,
+     T_Time1 = 384,
+     T_Time2 = 385,
+     T_Tinker = 386,
+     T_Tos = 387,
+     T_Trap = 388,
+     T_True = 389,
+     T_Trustedkey = 390,
+     T_Ttl = 391,
+     T_Type = 392,
+     T_Version = 393,
+     T_Week = 394,
+     T_Xleave = 395,
+     T_Year = 396,
+     T_Flag = 397,
+     T_Void = 398,
+     T_EOC = 399,
+     T_Simulate = 400,
+     T_Beep_Delay = 401,
+     T_Sim_Duration = 402,
+     T_Server_Offset = 403,
+     T_Duration = 404,
+     T_Freq_Offset = 405,
+     T_Wander = 406,
+     T_Jitter = 407,
+     T_Prop_Delay = 408,
+     T_Proc_Delay = 409
    };
 #endif
 /* Tokens.  */
 #define T_Average 263
 #define T_Bclient 264
 #define T_Beacon 265
-#define T_Broadcast 266
-#define T_Broadcastclient 267
-#define T_Broadcastdelay 268
-#define T_Burst 269
-#define T_Calibrate 270
-#define T_Calldelay 271
-#define T_Ceiling 272
-#define T_Clockstats 273
-#define T_Cohort 274
-#define T_ControlKey 275
-#define T_Crypto 276
-#define T_Cryptostats 277
-#define T_Day 278
-#define T_Default 279
-#define T_Disable 280
-#define T_Discard 281
-#define T_Dispersion 282
-#define T_Double 283
-#define T_Driftfile 284
-#define T_WanderThreshold 285
-#define T_Enable 286
-#define T_End 287
-#define T_False 288
-#define T_File 289
-#define T_Filegen 290
-#define T_Flag1 291
-#define T_Flag2 292
-#define T_Flag3 293
-#define T_Flag4 294
-#define T_Flake 295
-#define T_Floor 296
-#define T_Freq 297
-#define T_Fudge 298
-#define T_Host 299
-#define T_Huffpuff 300
-#define T_IPv4_address 301
-#define T_IPv6_address 302
-#define T_Iburst 303
-#define T_Ident 304
-#define T_Ignore 305
-#define T_Includefile 306
-#define T_Integer 307
-#define T_Interface 308
-#define T_Kernel 309
-#define T_Key 310
-#define T_Keys 311
-#define T_Keysdir 312
-#define T_Kod 313
-#define T_Leap 314
-#define T_Leapfile 315
-#define T_Limited 316
-#define T_Link 317
-#define T_Logconfig 318
-#define T_Logfile 319
-#define T_Loopstats 320
-#define T_Lowpriotrap 321
-#define T_Manycastclient 322
-#define T_Manycastserver 323
-#define T_Mask 324
-#define T_Maxclock 325
-#define T_Maxdist 326
-#define T_Maxhop 327
-#define T_Maxpoll 328
-#define T_Minclock 329
-#define T_Mindist 330
-#define T_Minimum 331
-#define T_Minpoll 332
-#define T_Minsane 333
-#define T_Mode 334
-#define T_Monitor 335
-#define T_Month 336
-#define T_Multicastclient 337
-#define T_Nolink 338
-#define T_Nomodify 339
-#define T_None 340
-#define T_Nopeer 341
-#define T_Noquery 342
-#define T_Noselect 343
-#define T_Noserve 344
-#define T_Notrap 345
-#define T_Notrust 346
-#define T_Novolley 347
-#define T_Ntp 348
-#define T_Ntpport 349
-#define T_Orphan 350
-#define T_Panic 351
-#define T_Peer 352
-#define T_Peerstats 353
-#define T_Phone 354
-#define T_Pid 355
-#define T_Pidfile 356
-#define T_Pool 357
-#define T_Port 358
-#define T_Pps 359
-#define T_Preempt 360
-#define T_Prefer 361
-#define T_Protostats 362
-#define T_Pw 363
-#define T_Qos 364
-#define T_RandFile 365
-#define T_Rawstats 366
-#define T_Refid 367
-#define T_Requestkey 368
-#define T_Restrict 369
-#define T_Revoke 370
-#define T_Server 371
-#define T_Setvar 372
-#define T_Sign 373
-#define T_Statistics 374
-#define T_Stats 375
-#define T_Statsdir 376
-#define T_Step 377
-#define T_Stepout 378
-#define T_Stratum 379
-#define T_String 380
-#define T_Sysstats 381
-#define T_Tick 382
-#define T_Time1 383
-#define T_Time2 384
-#define T_Tinker 385
-#define T_Tos 386
-#define T_Trap 387
-#define T_True 388
-#define T_Trustedkey 389
-#define T_Ttl 390
-#define T_Type 391
-#define T_Version 392
-#define T_Week 393
-#define T_Year 394
-#define T_Flag 395
-#define T_Void 396
-#define T_EOC 397
-#define T_Simulate 398
-#define T_Beep_Delay 399
-#define T_Sim_Duration 400
-#define T_Server_Offset 401
-#define T_Duration 402
-#define T_Freq_Offset 403
-#define T_Wander 404
-#define T_Jitter 405
-#define T_Prop_Delay 406
-#define T_Proc_Delay 407
+#define T_Bias 266
+#define T_Broadcast 267
+#define T_Broadcastclient 268
+#define T_Broadcastdelay 269
+#define T_Burst 270
+#define T_Calibrate 271
+#define T_Calldelay 272
+#define T_Ceiling 273
+#define T_Clockstats 274
+#define T_Cohort 275
+#define T_ControlKey 276
+#define T_Crypto 277
+#define T_Cryptostats 278
+#define T_Day 279
+#define T_Default 280
+#define T_Disable 281
+#define T_Discard 282
+#define T_Dispersion 283
+#define T_Double 284
+#define T_Driftfile 285
+#define T_WanderThreshold 286
+#define T_Enable 287
+#define T_End 288
+#define T_False 289
+#define T_File 290
+#define T_Filegen 291
+#define T_Flag1 292
+#define T_Flag2 293
+#define T_Flag3 294
+#define T_Flag4 295
+#define T_Flake 296
+#define T_Floor 297
+#define T_Freq 298
+#define T_Fudge 299
+#define T_Host 300
+#define T_Huffpuff 301
+#define T_IPv4_address 302
+#define T_IPv6_address 303
+#define T_Iburst 304
+#define T_Ident 305
+#define T_Ignore 306
+#define T_Includefile 307
+#define T_Integer 308
+#define T_Interface 309
+#define T_Kernel 310
+#define T_Key 311
+#define T_Keys 312
+#define T_Keysdir 313
+#define T_Kod 314
+#define T_Leap 315
+#define T_Leapfile 316
+#define T_Limited 317
+#define T_Link 318
+#define T_Logconfig 319
+#define T_Logfile 320
+#define T_Loopstats 321
+#define T_Lowpriotrap 322
+#define T_Manycastclient 323
+#define T_Manycastserver 324
+#define T_Mask 325
+#define T_Maxclock 326
+#define T_Maxdist 327
+#define T_Maxhop 328
+#define T_Maxpoll 329
+#define T_Minclock 330
+#define T_Mindist 331
+#define T_Minimum 332
+#define T_Minpoll 333
+#define T_Minsane 334
+#define T_Mode 335
+#define T_Monitor 336
+#define T_Month 337
+#define T_Multicastclient 338
+#define T_Nolink 339
+#define T_Nomodify 340
+#define T_None 341
+#define T_Nopeer 342
+#define T_Noquery 343
+#define T_Noselect 344
+#define T_Noserve 345
+#define T_Notrap 346
+#define T_Notrust 347
+#define T_Novolley 348
+#define T_Ntp 349
+#define T_Ntpport 350
+#define T_Orphan 351
+#define T_Panic 352
+#define T_Peer 353
+#define T_Peerstats 354
+#define T_Phone 355
+#define T_Pid 356
+#define T_Pidfile 357
+#define T_Pool 358
+#define T_Port 359
+#define T_Pps 360
+#define T_Preempt 361
+#define T_Prefer 362
+#define T_Protostats 363
+#define T_Pw 364
+#define T_Qos 365
+#define T_RandFile 366
+#define T_Rawstats 367
+#define T_Refid 368
+#define T_Requestkey 369
+#define T_Restrict 370
+#define T_Revoke 371
+#define T_Server 372
+#define T_Setvar 373
+#define T_Sign 374
+#define T_Statistics 375
+#define T_Stats 376
+#define T_Statsdir 377
+#define T_Step 378
+#define T_Stepout 379
+#define T_Stratum 380
+#define T_String 381
+#define T_Sysstats 382
+#define T_Tick 383
+#define T_Time1 384
+#define T_Time2 385
+#define T_Tinker 386
+#define T_Tos 387
+#define T_Trap 388
+#define T_True 389
+#define T_Trustedkey 390
+#define T_Ttl 391
+#define T_Type 392
+#define T_Version 393
+#define T_Week 394
+#define T_Xleave 395
+#define T_Year 396
+#define T_Flag 397
+#define T_Void 398
+#define T_EOC 399
+#define T_Simulate 400
+#define T_Beep_Delay 401
+#define T_Sim_Duration 402
+#define T_Server_Offset 403
+#define T_Duration 404
+#define T_Freq_Offset 405
+#define T_Wander 406
+#define T_Jitter 407
+#define T_Prop_Delay 408
+#define T_Proc_Delay 409
 
 
 
@@ -364,7 +368,7 @@ typedef union YYSTYPE
     script_info *Sim_script;
 }
 /* Line 1529 of yacc.c.  */
-#line 368 "../../ntpd/ntp_parser.h"
+#line 372 "../../ntpd/ntp_parser.h"
        YYSTYPE;
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
 # define YYSTYPE_IS_DECLARED 1
index d88c0d0dcd1206206f61e2c7df72bef784bb57f3..c95197a4b0b17fa55ca1c933b4505a8cf57f3588 100644 (file)
@@ -70,6 +70,7 @@
 %token         T_Average
 %token         T_Bclient
 %token         T_Beacon
+%token         T_Bias
 %token         T_Broadcast
 %token         T_Broadcastclient
 %token         T_Broadcastdelay
 %token         T_Type
 %token         T_Version
 %token         T_Week
+%token         T_Xleave
 %token         T_Year
 %token <Integer> T_Integer
 %token          T_Flag     /* Not an actual token */
@@ -371,6 +373,7 @@ option_list
 option
 /*        :    /* Null Statement { $$ = NULL; } */
         :      T_Autokey      { $$ = create_attr_ival(T_Flag, FLAG_SKEY); }
+       |       T_Bias number        { $$ = create_attr_dval(T_Bias, $2); }
        |       T_Burst        { $$ = create_attr_ival(T_Flag, FLAG_BURST); }
        |       T_Iburst       { $$ = create_attr_ival(T_Flag, FLAG_IBURST); }
        |       T_Key T_Integer      { $$ = create_attr_ival(T_Key, $2); }
@@ -380,6 +383,7 @@ option
        |       T_Preempt      { $$ = create_attr_ival(T_Flag, FLAG_PREEMPT); }
        |       T_Prefer       { $$ = create_attr_ival(T_Flag, FLAG_PREFER); }
        |       T_True         { $$ = create_attr_ival(T_Flag, FLAG_TRUE); }
+       |       T_Xleave       { $$ = create_attr_ival(T_Flag, FLAG_XLEAVE); }
        |       T_Ttl T_Integer     { $$ = create_attr_ival(T_Ttl, $2); }
         |       T_Mode T_Integer    { $$ = create_attr_ival(T_Mode, $2); }
        |       T_Version T_Integer { $$ = create_attr_ival(T_Version, $2); }
index e0b31db05c87446299b77ab382754f9a4a75e4d4..e09f0761d977e54819799cc01fed03d0f82b4949 100644 (file)
@@ -80,7 +80,6 @@ double        sys_bdelay;             /* broadcast client default delay */
 int    sys_authenticate;       /* requre authentication for config */
 l_fp   sys_authdelay;          /* authentication delay */
 static double sys_offset;      /* current local clock offset */
-static u_long sys_authdly[2];  /* authentication delay shift reg */
 double sys_mindisp = MINDISPERSE; /* min disp increment (s) */
 double sys_maxdist = MAXDISTANCE; /* selection threshold */
 double sys_jitter;             /* system jitter */
@@ -264,20 +263,6 @@ transmit(
                peer->burst--;
                if (peer->burst == 0) {
 
-                       /*
-                        * If initial broadcast volley and not Autokey,
-                        *  switch to broadcast client mode.
-                        */
-                       if (peer->cast_flags & MDF_BCLNT) {
-                               peer->flags &= ~FLAG_IBURST;
-#ifdef OPENSSL
-                               if (!(peer->flags & FLAG_SKEY))
-                                       peer->hmode = MODE_BCLIENT;
-#else /* OPENSSL */
-                               peer->hmode = MODE_BCLIENT;
-#endif /* OPENSSL */
-                       }
-
                        /*
                         * If ntpdate mode and the clock has not been
                         * set and all peers have completed the burst,
@@ -298,17 +283,6 @@ transmit(
        if (peer->retry > 0)
                peer->retry--;
 
-#ifdef OPENSSL
-       if (peer->cast_flags & MDF_BCLNT) {
-               if (peer->flags & FLAG_SKEY) {
-                       if (!(~peer->crypto & CRYPTO_FLAG_ALL))
-                               peer->hmode = MODE_BCLIENT;
-                       else
-                               peer->hmode = MODE_CLIENT;
-               }
-       }
-#endif /* OPENSSL */
-
        /*
         * Do not transmit if in broadcast client mode. 
         */
@@ -878,8 +852,8 @@ receive(
                            skeyid)) == NULL)
                                sys_restricted++;
                        else
-                               peer->delay = sys_bdelay * 2.;
-                       return;
+                               peer->delay = sys_bdelay;
+                       break;
                }
 
                /*
@@ -897,18 +871,7 @@ receive(
                        sys_restricted++;
                        return;                 /* ignore duplicate */
                }
-#ifdef OPENSSL
-               /*
-                * Ordinarily this will be an association reply message
-                * which initializes the dance. If an autokey reply
-                * message, it is ignored. Any other message is a
-                * protocol error leaving the asssociation ready for a
-                * following association reply message.
-                */
-               if (peer->flags & FLAG_SKEY)
-                       crypto_recv(peer, rbufp);
-#endif /* OPENSSL */
-               return;                         /* hooray */
+               break;
 
        /*
         * This is the first packet received from a symmetric active
@@ -967,9 +930,9 @@ receive(
                 * allowed. Mobiliae a symmetric passive association.
                 */
                if ((peer = newpeer(&rbufp->recv_srcadr,
-                   rbufp->dstadr, MODE_PASSIVE, hisversion,
-                   NTP_MINDPOLL, NTP_MAXDPOLL, FLAG_PREEMPT, MDF_UCAST,
-                   0, skeyid)) == NULL) {
+                   rbufp->dstadr, MODE_PASSIVE, hisversion, pkt->ppoll,
+                   NTP_MAXDPOLL, FLAG_PREEMPT, MDF_UCAST, 0,
+                   skeyid)) == NULL) {
                        sys_declined++;
                        return;                 /* ignore duplicate */
                }
@@ -1017,49 +980,83 @@ receive(
 
        /*
         * Next comes a rigorous schedule of timestamp checking. If the
-        * transmit timestamp is zero, the server is horribly broken.
+        * transmit timestamp is zero, the server has not initialized in
+        * interleaved modes or is horribly broken.
         */
        if (L_ISZERO(&p_xmt)) {
-               peer->flash |= TEST3;           /* protocol unsynch */
-               peer->bogusorg++;
-               return;
+                       peer->flash |= TEST3;           /* unsynch */
 
        /*
         * If the transmit timestamp duplicates a previous one, the
         * packet is a replay. This prevents the bad guys from replaying
         * the most recent packet, authenticated or not.
         */
-       } else if (L_ISEQU(&peer->org, &p_xmt)) {
-               peer->flash |= TEST1;           /* duplicate packet */
+       } else if (L_ISEQU(&peer->xmt, &p_xmt)) {
+               peer->flash |= TEST1;                   /* duplicate */
                peer->oldpkt++;
                return;
 
        /*
-        * If this is a broadcast mode packet, skip further checking.
+        * If this is a broadcast mode packet, skip further checking. If
+        * an intial volley, bail out now and let the client do its
+        * stuff. If the origin timestamp is nonzero, this is an
+        * interleaved broadcast. so restart the protocol.
         */
-       } else if (hismode != MODE_BROADCAST) {
-               if (L_ISZERO(&p_org)) {
-                       peer->flash |= TEST3;   /* protocol unsynch */
-               } else if (!L_ISEQU(&p_org, &peer->xmt)) {
-                       peer->flash |= TEST2;   /* bogus packet */
+       } else if (hismode == MODE_BROADCAST) {
+               if (!L_ISZERO(&p_org) && !(peer->flags & FLAG_XB)) {
+                       peer->flags |= FLAG_XB | FLAG_IBURST;
+                       peer->hmode = MODE_CLIENT;
+                       peer->borg = rbufp->recv_time;
+                       report_event(PEVNT_XLEAVE, peer, NULL);
+                       return;
+               }
+               if (peer->flags & FLAG_IBURST)
+                       return;
+
+       /*
+        * Check for bogus packet in basic mode. If found, switch to
+        * interleaved mode and resynchronize, but only after confirming
+        * the packet is not bogus in symmetric interleaved mode.
+        */
+       } else if (peer->flip == 0) {
+               if (!L_ISEQU(&p_org, &peer->aorg)) {
                        peer->bogusorg++;
+                       peer->flash |= TEST2;   /* bogus */
+                       if (!L_ISZERO(&peer->dst) && L_ISEQU(&p_org,
+                           &peer->dst)) {
+                               peer->flip = 1;
+                               report_event(PEVNT_XLEAVE, peer, NULL);
+                       }
                }
-       }
 
        /*
-        * If not a symmetric mode and any flash is lit, drop the
-        * packet. This helps to protect against old replay attacks.
-        * Can't do this in symmetric modes since a packet can be lost.
+        * Check for valid nonzero timestamp fields.
         */
-       if ((peer->hmode == MODE_CLIENT || peer->hmode ==
-           MODE_BROADCAST) && (peer->flash & PKT_TEST_MASK))
-               return;
+       } else if (L_ISZERO(&p_org) || L_ISZERO(&p_rec) ||
+           L_ISZERO(&peer->dst)) {
+               peer->flash |= TEST3;           /* unsynch */
 
-       peer->org = p_xmt;
-       peer->rec = rbufp->recv_time;
+       /*
+        * Check for bogus packet in interleaved symmetric mode. This
+        * can happen if a packet is lost, duplicat or crossed. If
+        * found, flip and resynchronize.
+        */
+       } else if (!L_ISZERO(&peer->dst) && !L_ISEQU(&p_org,
+                   &peer->dst)) {
+                       peer->bogusorg++;
+                       peer->flip = -peer->flip;
+                       peer->flash |= TEST2;           /* bogus */
+       }
+
+       /*
+        * Update the state variables.
+        */
+       if (peer->flip == 0) {
+               if (hismode != MODE_BROADCAST)
+                       peer->rec = p_xmt;
+               peer->dst = rbufp->recv_time;
+       }
        L_CLR(&peer->xmt);
-       if (peer->flash & PKT_TEST_MASK)
-               return;
 
        /*
         * If this is a crypto_NAK, the server cannot authenticate a
@@ -1255,6 +1252,14 @@ receive(
         * more flashers.
         */
        process_packet(peer, pkt, rbufp->recv_length);
+
+       /*
+        * In interleaved mode update the state variables.
+        */
+       if (peer->flip != 0) {
+               peer->rec = p_rec;
+               peer->dst = rbufp->recv_time;
+       }
 }
 
 
@@ -1275,6 +1280,7 @@ process_packet(
        double  p_offset, p_del, p_disp;
        l_fp    p_rec, p_xmt, p_org, p_reftime, ci;
        u_char  pmode, pleap, pstratum;
+       char    statstr[NTP_MAXSTRLEN];
 #ifdef ASSYM
        int     itemp;
        double  etemp, ftemp, td;
@@ -1283,16 +1289,14 @@ process_packet(
        sys_processed++;
        peer->processed++;
        p_del = FPTOD(NTOHS_FP(pkt->rootdelay));
+       p_offset = 0;
        p_disp = FPTOD(NTOHS_FP(pkt->rootdisp));
        NTOHL_FP(&pkt->reftime, &p_reftime);
+       NTOHL_FP(&pkt->org, &p_org);
        NTOHL_FP(&pkt->rec, &p_rec);
        NTOHL_FP(&pkt->xmt, &p_xmt);
        pmode = PKT_MODE(pkt->li_vn_mode);
        pleap = PKT_LEAP(pkt->li_vn_mode);
-       if (pmode != MODE_BROADCAST)
-               NTOHL_FP(&pkt->org, &p_org);
-       else
-               p_org = peer->rec;
        pstratum = PKT_TO_STRATUM(pkt->stratum);
 
        /*
@@ -1300,7 +1304,7 @@ process_packet(
         */
        record_raw_stats(&peer->srcadr, peer->dstadr ?
            &peer->dstadr->sin : NULL, &p_org, &p_rec, &p_xmt,
-           &peer->rec);
+           &peer->dst);
        peer->leap = pleap;
        peer->stratum = min(pstratum, STRATUM_UNSPEC);
        peer->pmode = pmode;
@@ -1328,16 +1332,13 @@ process_packet(
        poll_update(peer, peer->hpoll);
 
        /*
-        * Verify the server is synchronized; that is, the leap bits and
-        * stratum are valid, the root delay and root dispersion are
-        * valid and the reference timestamp is not later than the
-        * transmit timestamp.
+        * Verify the server is synchronized; that is, the leap bits,
+        * stratum and root distance are valid.
         */
        if (pleap == LEAP_NOTINSYNC ||          /* test 6 */
            pstratum < sys_floor || pstratum >= sys_ceiling)
                peer->flash |= TEST6;           /* bad synch or strat */
-       if (p_del / 2 + p_disp >=               /* test 7 */
-           MAXDISPERSE || !L_ISHIS(&p_xmt, &p_reftime))
+       if (p_del / 2 + p_disp >= MAXDISPERSE)  /* test 7 */
                peer->flash |= TEST7;           /* bad header */
 
        /*
@@ -1370,8 +1371,7 @@ process_packet(
         * roundtrip delay and dispersion. The equations are reordered
         * from the spec for more efficient use of temporaries. For a
         * broadcast association, offset the last measurement by the
-        * computed delay during the client/server volley. Note that
-        * org has been set to the time of last reception. Note the
+        * computed delay during the client/server volley. Note the
         * computation of dispersion includes the system precision plus
         * that due to the frequency error since the origin time.
         *
@@ -1389,18 +1389,142 @@ process_packet(
         * double arithmetic. This preserves the accuracy while
         * retaining the 68-year span.
         *
-        * Let t1 = p_org, t2 = p_rec, t3 = p_xmt, t4 = peer->rec:
-        */
-       ci = p_xmt;                     /* t3 - t4 */
-       L_SUB(&ci, &peer->rec);
-       LFPTOD(&ci, t34);
-       ci = p_rec;                     /* t2 - t1 */
-       L_SUB(&ci, &p_org);
-       LFPTOD(&ci, t21);
-       ci = peer->rec;                 /* t4 - t1 */
-       L_SUB(&ci, &p_org);
-       p_del = fabs(t21 - t34);
-       p_offset = (t21 + t34) / 2.;
+        * There are three interleaving schemes, basic, interleaved
+        * symmetric and interleaved broadcast. The timestamps are
+        * idioscyncratically different. See the onwire briefing/white
+        * paper at www.eecis.udel.edu/~mills for details.
+        *
+        * Interleaved symmetric mode
+        * t1 = peer->aorg/borg, t2 = peer->rec, t3 = p_xmt,
+        * t4 = peer->dst
+        */
+       if (peer->flip != 0) {
+               ci = p_xmt;                             /* t3 - t4 */
+               L_SUB(&ci, &peer->dst);
+               LFPTOD(&ci, t34);
+               ci = p_rec;                             /* t2 - t1 */
+               if (peer->flip > 0)
+                       L_SUB(&ci, &peer->borg);
+               else
+                       L_SUB(&ci, &peer->aorg);
+               LFPTOD(&ci, t21);
+               ci = peer->dst;                         /* t4 - t1 */
+               if (peer->flip > 0)
+                       L_SUB(&ci, &peer->borg);
+               else
+                       L_SUB(&ci, &peer->aorg);
+               p_del = t21 - t34;
+               p_offset = (t21 + t34) / 2.;
+               if (p_del < 0 || p_del > 1.) {
+                       sprintf(statstr, "t21 %.6f t34 %.6f", t21, t34);
+                       report_event(PEVNT_XERR, peer, statstr);
+                       return;
+               }
+
+       /*
+        * Broadcast modes
+        */
+       } else if (peer->pmode == MODE_BROADCAST) {
+
+               /*
+                * Calibrate delay in interleaved broadcast mode. For
+                * basic mode the delay is calculated the old fashioned
+                * way.
+                */
+               if (peer->delay == 0) {
+
+                       /*
+                        * Interleaved broadcast calibrate phase
+                        * t1 = p_org, t2 = peer->borg, t3 = peer->aorg,
+                        * t4 = peer->rec
+                        */
+                       if (peer->flags & FLAG_XB) {
+                               ci = peer->aorg;        /* t3 - t4 */
+                               L_SUB(&ci, &peer->rec);
+                               LFPTOD(&ci, t34);
+                               ci = peer->borg;        /* t2 - t1 */
+                               L_SUB(&ci, &p_org);
+                               LFPTOD(&ci, t21);
+                               ci = peer->rec;         /* t4 - t1 */
+                               L_SUB(&ci, &p_org);
+                               p_del = fabs(t21 - t34);
+                               p_offset = -(t21 + t34) / 2.;
+                               peer->aorg = p_xmt;
+                               peer->borg = peer->dst;
+                       }
+
+               /*
+                * Delay has been calibrated, either by previous volley
+                * or configured. Offset is calculated directly
+                * from timestamp differences adjusted by the previously
+                * calculated delay.
+                */
+               } else {
+                       p_del = peer->delay;
+
+                       /*
+                        * Interleaved broadcast mode
+                        * t1 = peer->borg, t2 = p_org
+                        */
+                       if (peer->flags & FLAG_XB) { 
+                               ci = p_org;             /* delay */ 
+                               L_SUB(&ci, &peer->aorg);
+                               LFPTOD(&ci, t34);
+                               ci = p_org;             /* t2 - t1 */
+                               L_SUB(&ci, &peer->borg);
+                               LFPTOD(&ci, t21);
+                               p_offset = t21 + p_del / 2.;
+                               peer->aorg = p_xmt;
+                               peer->borg = peer->dst;
+                               if (t34 < 0 || t34 > 1.) {
+                                       sprintf(statstr,
+                                           "t21 %.6f t34 %.6f", t21,
+                                           t34);
+                                       report_event(PEVNT_XERR, peer,
+                                           statstr);
+                                       return;
+                               }
+
+                       /*
+                        * Basic broadcast - use direct timestamps.
+                        */
+                       } else {
+                               ci = p_xmt;             /* t3 - t4 */
+                               L_SUB(&ci, &peer->dst);
+                               LFPTOD(&ci, t34);
+                               p_offset = t34 + p_del / 2.;
+                       }
+               }
+
+       /*
+        * Basic mode, otherwise known as the old fashioned way. If this
+        * is broadcast calibrate phase, save the receive timestamp for
+        * use in the next received broadcast.
+        *
+        * t1 = p_org, t2 = p_rec, t3 = p_xmt, t4 = peer->dst
+        */
+       } else {
+               ci = p_xmt;                             /* t3 - t4 */
+               L_SUB(&ci, &peer->dst);
+               LFPTOD(&ci, t34);
+               ci = p_rec;                             /* t2 - t1 */
+               L_SUB(&ci, &p_org);
+               LFPTOD(&ci, t21);
+               ci = peer->dst;                         /* t4 - t1 */
+               L_SUB(&ci, &p_org);
+               p_del = fabs(t21 - t34);
+               p_offset = (t21 + t34) / 2.;
+               if (peer->flags & FLAG_XB) {
+                       peer->rec = p_rec;
+                       peer->hmode = MODE_BCLIENT;
+                       peer->flags &= ~FLAG_IBURST;
+                       peer->burst = 0;
+                       return;
+               }
+       }
+       p_offset += peer->bias;
+       p_disp = LOGTOD(sys_precision) + LOGTOD(peer->precision) +
+           clock_phi * p_del;
 
 #if ASSYM
        /*
@@ -1473,21 +1597,27 @@ process_packet(
 #endif /* ASSYM */
 
        /*
-        * If running in a broadcast association, the clock offset is
-        * (t3 - t4) plus one-half the roundtrip delay, but we can't
-        * measure that directly. Therefore, we start up in MODE_CLIENT
-        * mode and exchange several messages to determine the clock
-        * offset and roundtrip delay and possibly set the system clock.
-        * When the last message is sent, we switch to MODE_BCLIENT mode
-        * and send no further messages.
+        * That was awesome. Now hand off to the clock filter.
         */
-       if (peer->pmode == MODE_BROADCAST) {
-               p_del = peer->delay;
-               p_offset = t34 + p_del / 2.;
-       }
-       p_disp = LOGTOD(sys_precision) + LOGTOD(peer->precision) +
-           clock_phi * p_del;
        clock_filter(peer, p_offset, p_del, p_disp);
+
+       /*
+        * If we are in broadcast calibrate mode, return to broadcast
+        * client mode when the client is fit and the autokey dance is
+        * complete.
+        */
+       if ((peer->cast_flags & MDF_BCLNT) && !peer_unfit(peer)) {
+#ifdef OPENSSL
+               if (peer->flags & FLAG_SKEY) {
+                       if (!(~peer->crypto & CRYPTO_FLAG_ALL))
+                               peer->hmode = MODE_BCLIENT;
+               } else {
+                       peer->hmode = MODE_BCLIENT;
+               }
+#else /* OPENSSL */
+               peer->hmode = MODE_BCLIENT;
+#endif /* OPENSSL */
+       }
 }
 
 
@@ -1573,6 +1703,7 @@ clock_update(
                L_CLR(&sys_reftime);
                sys_jitter = LOGTOD(sys_precision);
                memcpy(&sys_refid, "STEP", 4);
+               leapsec = 0;
                break;
 
        /*
@@ -1592,7 +1723,7 @@ clock_update(
                        sys_leap = LEAP_NOWARNING;
                sys_stratum = min(peer->stratum + 1, STRATUM_UNSPEC);
                sys_rootdelay = peer->delay + peer->rootdelay;
-               sys_reftime = peer->rec;
+               sys_reftime = peer->dst;
 
                /*
                 * If the leapseconds values are from file or network
@@ -1607,28 +1738,28 @@ clock_update(
                        if (leap_sec > now.l_ui) {
                                sys_tai = leap_tai - 1;
                                if (leapsec == 0)
-                                       leapsec = leap_sec - now.l_ui;
                                        report_event(EVNT_ARMED, NULL,
                                            NULL);
-                               }
+                               leapsec = leap_sec - now.l_ui;
                        } else {
                                sys_tai = leap_tai;
                        }
                        break;
 
-               if (leap_vote > sys_survivors / 2) {
+               } else if (leap_vote > sys_survivors / 2) {
                        leap_peers = now.l_ui + leap_month(now.l_ui);
                        if (leap_peers > now.l_ui) {
                                if (leapsec == 0)
-                                       leapsec = leap_peers - now.l_ui;
                                        report_event(PEVNT_ARMED, peer,
                                            NULL);
+                               leapsec = leap_peers - now.l_ui;
                        }
-               } else {
-                       leapsec = 0;
+               } else if (leapsec > 0) {
                        report_event(EVNT_DISARMED, NULL, NULL);
+                       leapsec = 0;
                }
                break;
+
        /*
         * Popcorn spike or step threshold exceeded. Pretend it never
         * happened.
@@ -1744,13 +1875,12 @@ poll_update(
                if (peer->flags & FLAG_REFCLOCK)
                        next = 1 << hpoll;
                else
-                       next = (0x1000UL | (ntp_random() & 0x0ff) <<
+                       next = ((0x1000UL | (ntp_random() & 0x0ff)) <<
                            hpoll) >> 12;
 #else /* REFCLOCK */
-               next = (0x1000UL | (ntp_random() & 0x0ff) << hpoll) >>
+               next = ((0x1000UL | (ntp_random() & 0x0ff)) << hpoll) >>
                    12;
 #endif /* REFCLOCK */
-
                next += peer->outdate;
                if (next > utemp)
                        peer->nextdate = next;
@@ -1815,8 +1945,14 @@ peer_clear(
        peer->ppoll = peer->maxpoll;
        peer->hpoll = peer->minpoll;
        peer->disp = MAXDISPERSE;
-       peer_unfit(peer);
+       peer->flash = peer_unfit(peer);
        peer->jitter = LOGTOD(sys_precision);
+
+       /*
+        * If interleave mode, initialize the alternate origin switch.
+        */
+       if (peer->flags & FLAG_XLEAVE)
+               peer->flip = 1;
        for (i = 0; i < NTP_SHIFT; i++) {
                peer->filter_order[i] = i;
                peer->filter_disp[i] = MAXDISPERSE;
@@ -2601,7 +2737,7 @@ peer_xmit(
        struct pkt xpkt;        /* transmit packet */
        int     sendlen, authlen;
        keyid_t xkeyid = 0;     /* transmit key ID */
-       l_fp    xmt_tx;
+       l_fp    xmt_tx, xmt_ty;;
 
        if (!peer->dstadr)      /* drop peers without interface */
                return;
@@ -2615,8 +2751,8 @@ peer_xmit(
        xpkt.rootdelay = HTONS_FP(DTOFP(sys_rootdelay));
        xpkt.rootdisp =  HTONS_FP(DTOUFP(sys_rootdisp));
        HTONL_FP(&sys_reftime, &xpkt.reftime);
-       HTONL_FP(&peer->org, &xpkt.org);
-       HTONL_FP(&peer->rec, &xpkt.rec);
+       HTONL_FP(&peer->rec, &xpkt.org);
+       HTONL_FP(&peer->dst, &xpkt.rec);
 
        /*
         * If the received packet contains a MAC, the transmitted packet
@@ -2636,13 +2772,51 @@ peer_xmit(
 #else
        if (peer->keyid == 0) {
 #endif /* OPENSSL */
-               get_systime(&peer->xmt);
-               HTONL_FP(&peer->xmt, &xpkt.xmt);
+
+               /*
+                * Transmit a-priori timestamps
+                */
+               get_systime(&xmt_tx);
+               if (peer->flip == 0) {  /* basic mode */
+                       peer->aorg = xmt_tx;
+                       HTONL_FP(&xmt_tx, &xpkt.xmt);
+               } else {                /* interleaved modes */
+                       if (peer->hmode == MODE_BROADCAST) { /* bcst */
+                               HTONL_FP(&xmt_tx, &xpkt.xmt);
+                               if (peer->flip > 0)
+                                       HTONL_FP(&peer->borg,
+                                           &xpkt.org);
+                               else
+                                       HTONL_FP(&peer->aorg,
+                                           &xpkt.org);
+                       } else {        /* symmetric */
+                               if (peer->flip > 0)
+                                       HTONL_FP(&peer->borg,
+                                           &xpkt.xmt);
+                               else
+                                       HTONL_FP(&peer->aorg,
+                                           &xpkt.xmt);
+                       }
+               }
                peer->t21_bytes = sendlen;
                sendpkt(&peer->srcadr, peer->dstadr, sys_ttl[peer->ttl],
                    &xpkt, sendlen);
                peer->sent++;
                peer->throttle += (1 << peer->minpoll) - 2;
+
+               /*
+                * Capture a-posteriori timestamps
+                */
+               get_systime(&xmt_ty);
+               if (peer->flip != 0) {          /* interleaved modes */
+                       if (peer->flip > 0)
+                               peer->aorg = xmt_ty;
+                       else
+                               peer->borg = xmt_ty;
+                       peer->flip = -peer->flip;
+               }
+               L_SUB(&xmt_ty, &xmt_tx);
+               LFPTOD(&xmt_ty, peer->xleave);
 #ifdef DEBUG
                if (debug)
                        printf("transmit: at %ld %s->%s mode %d len %d\n",
@@ -2899,14 +3073,27 @@ peer_xmit(
 #endif /* OPENSSL */
 
        /*
-        * Stash the transmit timestamp corrected for the encryption
-        * delay. If autokey, give back the key, as we use keys only
-        * once. Check for errors such as missing keys, etc.
+        * Transmit a-priori timestamps
         */
+       get_systime(&xmt_tx);
+       if (peer->flip == 0) {          /* basic mode */
+               peer->aorg = xmt_tx;
+               HTONL_FP(&xmt_tx, &xpkt.xmt);
+       } else {                        /* interleaved modes */
+               if (peer->hmode == MODE_BROADCAST) { /* bcst */
+                       HTONL_FP(&xmt_tx, &xpkt.xmt);
+                       if (peer->flip > 0)
+                               HTONL_FP(&peer->borg, &xpkt.org);
+                       else
+                               HTONL_FP(&peer->aorg, &xpkt.org);
+               } else {                /* symmetric */
+                       if (peer->flip > 0)
+                               HTONL_FP(&peer->borg, &xpkt.xmt);
+                       else
+                               HTONL_FP(&peer->aorg, &xpkt.xmt);
+               }
+       }
        xkeyid = peer->keyid;
-       get_systime(&peer->xmt);
-       L_ADD(&peer->xmt, &sys_authdelay);
-       HTONL_FP(&peer->xmt, &xpkt.xmt);
        authlen = authencrypt(xkeyid, (u_int32 *)&xpkt, sendlen);
        if (authlen == 0) {
                report_event(PEVNT_AUTH, peer, "no key");
@@ -2919,7 +3106,6 @@ peer_xmit(
        if (xkeyid > NTP_MAXKEY)
                authtrust(xkeyid, 0);
 #endif /* OPENSSL */
-       get_systime(&xmt_tx);
        if (sendlen > sizeof(xpkt)) {
                msyslog(LOG_ERR, "proto: buffer overflow %u", sendlen);
                exit (-1);
@@ -2931,17 +3117,18 @@ peer_xmit(
        peer->throttle += (1 << peer->minpoll) - 2;
 
        /*
-        * Calculate the encryption delay. Keep the minimum over
-        * the latest two samples.
+        * Capture a-posteriori timestamps
         */
-       L_SUB(&xmt_tx, &peer->xmt);
-       L_ADD(&xmt_tx, &sys_authdelay);
-       sys_authdly[1] = sys_authdly[0];
-       sys_authdly[0] = xmt_tx.l_uf;
-       if (sys_authdly[0] < sys_authdly[1])
-               sys_authdelay.l_uf = sys_authdly[0];
-       else
-               sys_authdelay.l_uf = sys_authdly[1];
+       get_systime(&xmt_ty);
+       if (peer->flip != 0) {                  /* interleaved modes */
+               if (peer->flip > 0)
+                       peer->aorg = xmt_ty;
+               else
+                       peer->borg = xmt_ty;
+               peer->flip = -peer->flip;
+       }
+       L_SUB(&xmt_ty, &xmt_tx);
+       LFPTOD(&xmt_ty, peer->xleave);
 #ifdef OPENSSL
 #ifdef DEBUG
        if (debug)
@@ -2977,8 +3164,7 @@ fast_xmit(
 {
        struct pkt xpkt;        /* transmit packet structure */
        struct pkt *rpkt;       /* receive packet structure */
-       l_fp    xmt_ts;         /* timestamp */
-       l_fp    xmt_tx;         /* timestamp after authent */
+       l_fp    xmt_tx, xmt_ty;
        int     sendlen, authlen;
 #ifdef OPENSSL
        u_int32 temp32;
@@ -3042,8 +3228,8 @@ fast_xmit(
        sendlen = LEN_PKT_NOMAC;
        if (rbufp->recv_length == sendlen) {
                if (mask == NULL) {
-                       get_systime(&xmt_ts);
-                       HTONL_FP(&xmt_ts, &xpkt.xmt);
+                       get_systime(&xmt_tx);
+                       HTONL_FP(&xmt_tx, &xpkt.xmt);
                }
                sendpkt(&rbufp->recv_srcadr, rbufp->dstadr, 0, &xpkt,
                    sendlen);
@@ -3094,10 +3280,9 @@ fast_xmit(
                }
        }
 #endif /* OPENSSL */
+       get_systime(&xmt_tx);
        if (mask == NULL) {
-               get_systime(&xmt_ts);
-               L_ADD(&xmt_ts, &sys_authdelay);
-               HTONL_FP(&xmt_ts, &xpkt.xmt);
+               HTONL_FP(&xmt_tx, &xpkt.xmt);
        }
        authlen = authencrypt(xkeyid, (u_int32 *)&xpkt, sendlen);
        sendlen += authlen;
@@ -3105,21 +3290,10 @@ fast_xmit(
        if (xkeyid > NTP_MAXKEY)
                authtrust(xkeyid, 0);
 #endif /* OPENSSL */
-       get_systime(&xmt_tx);
        sendpkt(&rbufp->recv_srcadr, rbufp->dstadr, 0, &xpkt, sendlen);
-
-       /*
-        * Calculate the encryption delay. Keep the minimum over the
-        * latest two samples.
-        */
-       L_SUB(&xmt_tx, &xmt_ts);
-       L_ADD(&xmt_tx, &sys_authdelay);
-       sys_authdly[1] = sys_authdly[0];
-       sys_authdly[0] = xmt_tx.l_uf;
-       if (sys_authdly[0] < sys_authdly[1])
-               sys_authdelay.l_uf = sys_authdly[0];
-       else
-               sys_authdelay.l_uf = sys_authdly[1];
+       get_systime(&xmt_ty);
+       L_SUB(&xmt_ty, &xmt_tx);
+       sys_authdelay = xmt_ty;
 #ifdef DEBUG
        if (debug)
                printf(
@@ -3305,8 +3479,6 @@ init_proto(void)
        sys_bclient = 0;
        sys_bdelay = 0;
        sys_authenticate = 1;
-       L_CLR(&sys_authdelay);
-       sys_authdly[0] = sys_authdly[1] = 0;
        sys_stattime = current_time;
        proto_clr_stats();
        for (i = 0; i < MAX_TTL; i++) {
index 9a68ceecea97c4446a2013c014e21f2ddf32f90c..252711e428306f12109c7f987c23c523b2962a25 100644 (file)
@@ -591,9 +591,9 @@ refclock_receive(
        }
        peer->reach |= 1;
        peer->reftime = pp->lastref;
-       peer->org = pp->lastrec;
+       peer->aorg = pp->lastrec;
        peer->rootdisp = pp->disp;
-       get_systime(&peer->rec);
+       get_systime(&peer->dst);
        if (!refclock_sample(pp))
                return;
 
index 5cd4a2c49793e3d90400cf9ef4d29b1cd5701022..48dbd3ab84933a3bea9732c7fdd70f462a14c585 100644 (file)
@@ -914,7 +914,7 @@ peer_info (
                ip->rootdispersion = HTONS_FP(DTOUFP(pp->rootdisp));
                ip->refid = pp->refid;
                HTONL_FP(&pp->reftime, &ip->reftime);
-               HTONL_FP(&pp->org, &ip->org);
+               HTONL_FP(&pp->aorg, &ip->org);
                HTONL_FP(&pp->rec, &ip->rec);
                HTONL_FP(&pp->xmt, &ip->xmt);
                j = pp->filter_nextpt - 1;
@@ -1121,7 +1121,6 @@ sys_info(
                is->flags |= INFO_FLAG_FILEGEN;
        is->bdelay = HTONS_FP(DTOFP(sys_bdelay));
        HTONL_UF(sys_authdelay.l_f, &is->authdelay);
-
        (void) more_pkt();
        flush_pkt();
 }
index 38e0fca2f8c2a3ec5ffe39c3432f8fa73e8a07d7..b3c13180df78257ee2a54605aa54a3289f1beb8b 100644 (file)
@@ -101,7 +101,7 @@ int stats_control;
 /*
  * Initial frequency offset later passed to the loopfilter.
  */
-double old_drift;                      /* current frequency */
+double old_drift = 1e9;                /* current frequency */
 static double prev_drift_comp;         /* last frequency update */
 
 /*
@@ -377,15 +377,13 @@ stats_config(
                 * Open drift file and read frequency. If the file is
                 * missing or contains errors, tell the loop to reset.
                 */
-               if ((fp = fopen(stats_drift_file, "r")) == NULL) {
-                       old_drift = 1e9;
+               if ((fp = fopen(stats_drift_file, "r")) == NULL)
                        break;
-               }
+
                if (fscanf(fp, "%lf", &old_drift) != 1) {
                        msyslog(LOG_ERR,
                            "format error frequency file %s", 
                            stats_drift_file);
-                       old_drift = 1e9;
                        fclose(fp);
                        break;
 
@@ -393,9 +391,6 @@ stats_config(
                fclose(fp);
                old_drift /= 1e6;
                prev_drift_comp = old_drift;
-               msyslog(LOG_NOTICE,
-                   "frequency initialized %.3f PPM from %s",
-                       old_drift * 1e6, stats_drift_file);
                break;
 
        /*
@@ -710,7 +705,7 @@ record_sys_stats(void)
        if (sysstats.fp != NULL) {
                 fprintf(sysstats.fp,
                    "%lu %s %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu\n",
-                   day, ulfptoa(&now, 3), sys_stattime - current_time,
+                   day, ulfptoa(&now, 3), current_time - sys_stattime,
                    sys_received, sys_processed, sys_newversion,
                    sys_oldversion, sys_restricted, sys_badlength,
                    sys_badauth, sys_declined, sys_limitrejected,