Annotation of embedaddon/ntp/include/ntp.h, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * ntp.h - NTP definitions for the masses
                      3:  */
                      4: #ifndef NTP_H
                      5: #define NTP_H
                      6: 
                      7: #include <stddef.h>
                      8: #include <math.h>
                      9: 
                     10: #include <ntp_fp.h>
                     11: #include <ntp_types.h>
                     12: #include <ntp_stdlib.h>
                     13: #ifdef OPENSSL
                     14: #include <ntp_crypto.h>
                     15: #endif /* OPENSSL */
                     16: #include <ntp_random.h>
                     17: #include <ntp_net.h>
                     18: 
                     19: #include <isc/boolean.h>
                     20: 
                     21: /*
                     22:  * Calendar arithmetic - contributed by G. Healton
                     23:  */
                     24: #define YEAR_BREAK 500         /* years < this are tm_year values:
                     25:                                 * Break < AnyFourDigitYear && Break >
                     26:                                 * Anytm_yearYear */
                     27: 
                     28: #define YEAR_PIVOT 98          /* 97/98: years < this are year 2000+
                     29:                                 * FYI: official UNIX pivot year is
                     30:                                 * 68/69 */
                     31: 
                     32: /*
                     33:  * Number of Days since 1 BC Gregorian to 1 January of given year
                     34:  */
                     35: #define julian0(year)  (((year) * 365 ) + ((year) > 0 ? (((year) + 3) \
                     36:                            / 4 - ((year - 1) / 100) + ((year - 1) / \
                     37:                            400)) : 0))
                     38: 
                     39: /*
                     40:  * Number of days since start of NTP time to 1 January of given year
                     41:  */
                     42: #define ntp0(year)     (julian0(year) - julian0(1900))
                     43: 
                     44: /*
                     45:  * Number of days since start of UNIX time to 1 January of given year
                     46:  */
                     47: #define unix0(year)    (julian0(year) - julian0(1970))
                     48: 
                     49: /*
                     50:  * LEAP YEAR test for full 4-digit years (e.g, 1999, 2010)
                     51:  */
                     52: #define isleap_4(y)    ((y) % 4 == 0 && !((y) % 100 == 0 && !(y % \
                     53:                            400 == 0)))
                     54: 
                     55: /*
                     56:  * LEAP YEAR test for tm_year (struct tm) years (e.g, 99, 110)
                     57:  */
                     58: #define isleap_tm(y)   ((y) % 4 == 0 && !((y) % 100 == 0 && !(((y) \
                     59:                            + 1900) % 400 == 0)))
                     60: 
                     61: /*
                     62:  * to convert simple two-digit years to tm_year style years:
                     63:  *
                     64:  *     if (year < YEAR_PIVOT)
                     65:  *             year += 100;
                     66:  *
                     67:  * to convert either two-digit OR tm_year years to four-digit years:
                     68:  *
                     69:  *     if (year < YEAR_PIVOT)
                     70:  *             year += 100;
                     71:  *
                     72:  *     if (year < YEAR_BREAK)
                     73:  *             year += 1900;
                     74:  */
                     75: 
                     76: /*
                     77:  * How to get signed characters.  On machines where signed char works,
                     78:  * use it. On machines where signed char doesn't work, char had better
                     79:  * be signed.
                     80:  */
                     81: #ifdef NEED_S_CHAR_TYPEDEF
                     82: # if SIZEOF_SIGNED_CHAR
                     83: typedef signed char s_char;
                     84: # else
                     85: typedef char s_char;
                     86: # endif
                     87:   /* XXX: Why is this sequent bit INSIDE this test? */
                     88: # ifdef sequent
                     89: #  undef SO_RCVBUF
                     90: #  undef SO_SNDBUF
                     91: # endif
                     92: #endif
                     93: #ifndef TRUE
                     94: # define TRUE 1
                     95: #endif /* TRUE */
                     96: #ifndef FALSE
                     97: # define FALSE 0
                     98: #endif /* FALSE */
                     99: 
                    100: /*
                    101:  * NTP protocol parameters.  See section 3.2.6 of the specification.
                    102:  */
                    103: #define        NTP_VERSION     ((u_char)4) /* current version number */
                    104: #define        NTP_OLDVERSION  ((u_char)1) /* oldest credible version */
                    105: #define        NTP_PORT        123     /* included for non-unix machines */
                    106: 
                    107: /*
                    108:  * Poll interval parameters
                    109:  */
                    110: #define NTP_UNREACH    10      /* poll unreach threshold */
                    111: #define        NTP_MINPOLL     3       /* log2 min poll interval (8 s) */
                    112: #define NTP_MINDPOLL   6       /* log2 default min poll (64 s) */
                    113: #define NTP_MAXDPOLL   10      /* log2 default max poll (~17 m) */
                    114: #define        NTP_MAXPOLL     17      /* log2 max poll interval (~36 h) */
                    115: #define        NTP_RETRY       3       /* max packet retries */
                    116: #define        NTP_MINPKT      1       /* log2 min interburst interval (2 s) */
                    117: 
                    118: /*
                    119:  * Clock filter algorithm tuning parameters
                    120:  */
                    121: #define MAXDISPERSE    16.     /* max dispersion */
                    122: #define        NTP_SHIFT       8       /* clock filter stages */
                    123: #define NTP_FWEIGHT    .5      /* clock filter weight */
                    124: 
                    125: /*
                    126:  * Selection algorithm tuning parameters
                    127:  */
                    128: #define        NTP_MINCLOCK    3       /* min survivors */
                    129: #define        NTP_MAXCLOCK    10      /* max candidates */
                    130: #define        NTP_MAXASSOC    50      /* max associations */
                    131: #define MINDISPERSE    .001    /* min distance */
                    132: #define MAXDISTANCE    1.5     /* max root distance (select threshold) */
                    133: #define CLOCK_SGATE    3.      /* popcorn spike gate */
                    134: #define HUFFPUFF       900     /* huff-n'-puff sample interval (s) */
                    135: #define MAXHOP         2       /* anti-clockhop threshold */
                    136: #define MAX_TTL                8       /* max ttl mapping vector size */
                    137: #define        BEACON          7200    /* manycast beacon interval */
                    138: #define NTP_MAXEXTEN   2048    /* max extension field size */
                    139: 
                    140: /*
                    141:  * Miscellaneous stuff
                    142:  */
                    143: #define NTP_MAXKEY     65535   /* max authentication key number */
                    144: #define        KEY_TYPE_MD5    NID_md5 /* MD5 digest NID */
                    145: /*
                    146:  * Limits of things
                    147:  */
                    148: #define        MAXFILENAME     128     /* max length of file name */
                    149: #define MAXHOSTNAME    512     /* max length of host/node name */
                    150: #define NTP_MAXSTRLEN  256     /* max string length */
                    151: 
                    152: /*
                    153:  * Operations for jitter calculations (these use doubles).
                    154:  *
                    155:  * Note that we carefully separate the jitter component from the
                    156:  * dispersion component (frequency error plus precision). The frequency
                    157:  * error component is computed as CLOCK_PHI times the difference between
                    158:  * the epoch of the time measurement and the reference time. The
                    159:  * precision component is computed as the square root of the mean of the
                    160:  * squares of a zero-mean, uniform distribution of unit maximum
                    161:  * amplitude. Whether this makes statistical sense may be arguable.
                    162:  */
                    163: #define SQUARE(x) ((x) * (x))
                    164: #define SQRT(x) (sqrt(x))
                    165: #define DIFF(x, y) (SQUARE((x) - (y)))
                    166: #define LOGTOD(a)      ((a) < 0 ? 1. / (1L << -(a)) : \
                    167:                            1L << (int)(a)) /* log2 to double */
                    168: #define UNIVAR(x)      (SQUARE(.28867513 * LOGTOD(x))) /* std uniform distr */
                    169: #define ULOGTOD(a)     (1L << (int)(a)) /* ulog2 to double */
                    170: 
                    171: #define        EVENT_TIMEOUT   0       /* one second, that is */
                    172: 
                    173: 
                    174: /*
                    175:  * The interface structure is used to hold the addresses and socket
                    176:  * numbers of each of the local network addresses we are using.
                    177:  * Because "interface" is a reserved word in C++ and has so many
                    178:  * varied meanings, a change to "endpt" (via typedef) is under way.
                    179:  * Eventually the struct tag will change from interface to endpt_tag.
                    180:  * endpt is unrelated to the select algorithm's struct endpoint.
                    181:  */
                    182: typedef struct interface endpt;
                    183: struct interface {
                    184:        endpt *         elink;          /* endpt list link */
                    185:        endpt *         mclink;         /* per-AF_* multicast list */
                    186:        SOCKET          fd;             /* socket descriptor */
                    187:        SOCKET          bfd;            /* for receiving broadcasts */
                    188:        u_int32         ifnum;          /* endpt instance count */
                    189:        sockaddr_u      sin;            /* unicast address */
                    190:        sockaddr_u      mask;           /* subnet mask */
                    191:        sockaddr_u      bcast;          /* broadcast address */
                    192:        char            name[32];       /* name of interface */
                    193:        u_short         family;         /* AF_INET/AF_INET6 */
                    194:        u_short         phase;          /* phase in update cycle */
                    195:        u_int32         flags;          /* interface flags */
                    196:        int             last_ttl;       /* last TTL specified */
                    197:        u_int32         addr_refid;     /* IPv4 addr or IPv6 hash */
                    198:        int             num_mcast;      /* mcast addrs enabled */
                    199:        u_long          starttime;      /* current_time at creation */
                    200:        volatile long   received;       /* number of incoming packets */
                    201:        long            sent;           /* number of outgoing packets */
                    202:        long            notsent;        /* number of send failures */
                    203:        u_int           ifindex;        /* for IPV6_MULTICAST_IF */
                    204:        isc_boolean_t   ignore_packets; /* listen-read-drop this? */
                    205:        struct peer *   peers;          /* list of peers using endpt */
                    206:        u_int           peercnt;        /* count of same */
                    207: };
                    208: 
                    209: /*
                    210:  * Flags for interfaces
                    211:  */
                    212: #define INT_UP         0x001   /* Interface is up */
                    213: #define        INT_PPP         0x002   /* Point-to-point interface */
                    214: #define        INT_LOOPBACK    0x004   /* the loopback interface */
                    215: #define        INT_BROADCAST   0x008   /* can broadcast out this interface */
                    216: #define INT_MULTICAST  0x010   /* can multicast out this interface */
                    217: #define        INT_BCASTOPEN   0x020   /* broadcast socket is open */
                    218: #define INT_MCASTOPEN  0x040   /* multicasting enabled */
                    219: #define INT_WILDCARD   0x080   /* wildcard interface - usually skipped */
                    220: #define INT_MCASTIF    0x100   /* bound directly to MCAST address */
                    221: #define INT_PRIVACY    0x200   /* RFC 4941 IPv6 privacy address */
                    222: 
                    223: /*
                    224:  * Define flasher bits (tests 1 through 11 in packet procedure)
                    225:  * These reveal the state at the last grumble from the peer and are
                    226:  * most handy for diagnosing problems, even if not strictly a state
                    227:  * variable in the spec. These are recorded in the peer structure.
                    228:  *
                    229:  * Packet errors
                    230:  */
                    231: #define TEST1          0X0001  /* duplicate packet */
                    232: #define TEST2          0x0002  /* bogus packet */
                    233: #define TEST3          0x0004  /* protocol unsynchronized */
                    234: #define TEST4          0x0008  /* access denied */
                    235: #define TEST5          0x0010  /* bad authentication */
                    236: #define TEST6          0x0020  /* bad synch or stratum */
                    237: #define TEST7          0x0040  /* bad header */
                    238: #define TEST8          0x0080  /* bad autokey */
                    239: #define TEST9          0x0100  /* bad crypto */
                    240: #define        PKT_TEST_MASK   (TEST1 | TEST2 | TEST3 | TEST4 | TEST5 |\
                    241:                        TEST6 | TEST7 | TEST8 | TEST9)
                    242: /*
                    243:  * Peer errors
                    244:  */
                    245: #define TEST10         0x0200  /* peer bad synch or stratum */
                    246: #define        TEST11          0x0400  /* peer distance exceeded */
                    247: #define TEST12         0x0800  /* peer synchronization loop */
                    248: #define TEST13         0x1000  /* peer unreacable */
                    249: #define        PEER_TEST_MASK  (TEST10 | TEST11 | TEST12 | TEST13)
                    250: 
                    251: /*
                    252:  * The peer structure. Holds state information relating to the guys
                    253:  * we are peering with. Most of this stuff is from section 3.2 of the
                    254:  * spec.
                    255:  */
                    256: struct peer {
                    257:        struct peer *next;      /* link pointer in peer hash */
                    258:        struct peer *ass_next;  /* link pointer in associd hash */
                    259:        struct peer *ilink;     /* list of peers for interface */
                    260:        sockaddr_u srcadr;      /* address of remote host */
                    261:        endpt * dstadr;         /* local address */
                    262:        associd_t associd;      /* association ID */
                    263:        u_char  version;        /* version number */
                    264:        u_char  hmode;          /* local association mode */
                    265:        u_char  hpoll;          /* local poll interval */
                    266:        u_char  minpoll;        /* min poll interval */
                    267:        u_char  maxpoll;        /* max poll interval */
                    268:        u_int   flags;          /* association flags */
                    269:        u_char  cast_flags;     /* additional flags */
                    270:        u_char  last_event;     /* last peer error code */
                    271:        u_char  num_events;     /* number of error events */
                    272:        u_char  ttl;            /* ttl/refclock mode */
                    273: 
                    274:        /*
                    275:         * Variables used by reference clock support
                    276:         */
                    277: #ifdef REFCLOCK
                    278:        struct refclockproc *procptr; /* refclock structure pointer */
                    279:        u_char  refclktype;     /* reference clock type */
                    280:        u_char  refclkunit;     /* reference clock unit number */
                    281:        u_char  sstclktype;     /* clock type for system status word */
                    282: #endif /* REFCLOCK */
                    283: 
                    284:        /*
                    285:         * Variables set by received packet
                    286:         */
                    287:        u_char  leap;           /* local leap indicator */
                    288:        u_char  pmode;          /* remote association mode */
                    289:        u_char  stratum;        /* remote stratum */
                    290:        u_char  ppoll;          /* remote poll interval */
                    291:        s_char  precision;      /* remote clock precision */
                    292:        double  rootdelay;      /* roundtrip delay to primary source */
                    293:        double  rootdisp;       /* dispersion to primary source */
                    294:        u_int32 refid;          /* remote reference ID */
                    295:        l_fp    reftime;        /* update epoch */
                    296: 
                    297:        /*
                    298:         * Variables used by authenticated client
                    299:         */
                    300:        keyid_t keyid;          /* current key ID */
                    301: #ifdef OPENSSL
                    302: #define clear_to_zero opcode
                    303:        u_int32 opcode;         /* last request opcode */
                    304:        associd_t assoc;        /* peer association ID */
                    305:        u_int32 crypto;         /* peer status word */
                    306:        EVP_PKEY *pkey;         /* public key */
                    307:        const EVP_MD *digest;   /* message digest algorithm */
                    308:        char    *subject;       /* certificate subject name */
                    309:        char    *issuer;        /* certificate issuer name */
                    310:        struct cert_info *xinfo; /* issuer certificate */
                    311:        keyid_t pkeyid;         /* previous key ID */
                    312:        keyid_t hcookie;        /* host cookie */
                    313:        keyid_t pcookie;        /* peer cookie */
                    314:        const struct pkey_info *ident_pkey; /* identity key */
                    315:        BIGNUM  *iffval;        /* identity challenge (IFF, GQ, MV) */
                    316:        const BIGNUM *grpkey;   /* identity challenge key (GQ) */
                    317:        struct value cookval;   /* receive cookie values */
                    318:        struct value recval;    /* receive autokey values */
                    319:        struct exten *cmmd;     /* extension pointer */
                    320:        u_long  refresh;        /* next refresh epoch */
                    321: 
                    322:        /*
                    323:         * Variables used by authenticated server
                    324:         */
                    325:        keyid_t *keylist;       /* session key ID list */
                    326:        int     keynumber;      /* current key number */
                    327:        struct value encrypt;   /* send encrypt values */
                    328:        struct value sndval;    /* send autokey values */
                    329: #else /* OPENSSL */
                    330: #define clear_to_zero status
                    331: #endif /* OPENSSL */
                    332: 
                    333:        /*
                    334:         * Ephemeral state variables
                    335:         */
                    336:        u_char  status;         /* peer status */
                    337:        u_char  new_status;     /* under-construction status */
                    338:        u_char  reach;          /* reachability register */
                    339:        int     flash;          /* protocol error test tally bits */
                    340:        u_long  epoch;          /* reference epoch */
                    341:        int     burst;          /* packets remaining in burst */
                    342:        int     retry;          /* retry counter */
                    343:        int     flip;           /* interleave mode control */
                    344:        int     filter_nextpt;  /* index into filter shift register */
                    345:        double  filter_delay[NTP_SHIFT]; /* delay shift register */
                    346:        double  filter_offset[NTP_SHIFT]; /* offset shift register */
                    347:        double  filter_disp[NTP_SHIFT]; /* dispersion shift register */
                    348:        u_long  filter_epoch[NTP_SHIFT]; /* epoch shift register */
                    349:        u_char  filter_order[NTP_SHIFT]; /* filter sort index */
                    350:        l_fp    rec;            /* receive time stamp */
                    351:        l_fp    xmt;            /* transmit time stamp */
                    352:        l_fp    dst;            /* destination timestamp */
                    353:        l_fp    aorg;           /* origin timestamp */
                    354:        l_fp    borg;           /* alternate origin timestamp */
                    355:        double  offset;         /* peer clock offset */
                    356:        double  delay;          /* peer roundtrip delay */
                    357:        double  jitter;         /* peer jitter (squares) */
                    358:        double  disp;           /* peer dispersion */
                    359:        double  xleave;         /* interleave delay */
                    360:        double  bias;           /* bias for NIC asymmetry */
                    361: 
                    362:        /*
                    363:         * Variables used to correct for packet length and asymmetry.
                    364:         */
                    365:        double  t21;            /* outbound packet delay */
                    366:        int     t21_bytes;      /* outbound packet length */
                    367:        int     t21_last;       /* last outbound packet length */
                    368:        double  r21;            /* outbound data rate */
                    369:        double  t34;            /* inbound packet delay */
                    370:        int     t34_bytes;      /* inbound packet length */
                    371:        double  r34;            /* inbound data rate */
                    372: 
                    373:        /*
                    374:         * End of clear-to-zero area
                    375:         */
                    376:        u_long  update;         /* receive epoch */
                    377: #define end_clear_to_zero update
                    378:        int     unreach;        /* watchdog counter */
                    379:        int     throttle;       /* rate control */
                    380:        u_long  outdate;        /* send time last packet */
                    381:        u_long  nextdate;       /* send time next packet */
                    382:        u_long  nextaction;     /* peer local activity timeout (refclocks) */
                    383:        void (*action) (struct peer *); /* action timeout function */
                    384: 
                    385:        /*
                    386:         * Statistic counters
                    387:         */
                    388:        u_long  timereset;      /* time stat counters were reset */
                    389:        u_long  timereceived;   /* last packet received time */
                    390:        u_long  timereachable;  /* last reachable/unreachable time */
                    391: 
                    392:        u_long  sent;           /* packets sent */
                    393:        u_long  received;       /* packets received */
                    394:        u_long  processed;      /* packets processed */
                    395:        u_long  badauth;        /* bad authentication (TEST5) */
                    396:        u_long  bogusorg;       /* bogus origin (TEST2, TEST3) */
                    397:        u_long  oldpkt;         /* old duplicate (TEST1) */
                    398:        u_long  seldisptoolarge; /* bad header (TEST6, TEST7) */
                    399:        u_long  selbroken;      /* KoD received */
                    400: };
                    401: 
                    402: /*
                    403:  * Values for peer.leap, sys_leap
                    404:  */
                    405: #define        LEAP_NOWARNING  0x0     /* normal, no leap second warning */
                    406: #define        LEAP_ADDSECOND  0x1     /* last minute of day has 61 seconds */
                    407: #define        LEAP_DELSECOND  0x2     /* last minute of day has 59 seconds */
                    408: #define        LEAP_NOTINSYNC  0x3     /* overload, clock is free running */
                    409: 
                    410: /*
                    411:  * Values for peer mode and packet mode. Only the modes through
                    412:  * MODE_BROADCAST and MODE_BCLIENT appear in the transition
                    413:  * function. MODE_CONTROL and MODE_PRIVATE can appear in packets,
                    414:  * but those never survive to the transition function.
                    415:  * is a
                    416:  */
                    417: #define        MODE_UNSPEC     0       /* unspecified (old version) */
                    418: #define        MODE_ACTIVE     1       /* symmetric active mode */
                    419: #define        MODE_PASSIVE    2       /* symmetric passive mode */
                    420: #define        MODE_CLIENT     3       /* client mode */
                    421: #define        MODE_SERVER     4       /* server mode */
                    422: #define        MODE_BROADCAST  5       /* broadcast mode */
                    423: /*
                    424:  * These can appear in packets
                    425:  */
                    426: #define        MODE_CONTROL    6       /* control mode */
                    427: #define        MODE_PRIVATE    7       /* private mode */
                    428: /*
                    429:  * This is a madeup mode for broadcast client.
                    430:  */
                    431: #define        MODE_BCLIENT    6       /* broadcast client mode */
                    432: 
                    433: /*
                    434:  * Values for peer.stratum, sys_stratum
                    435:  */
                    436: #define        STRATUM_REFCLOCK ((u_char)0) /* default stratum */
                    437: /* A stratum of 0 in the packet is mapped to 16 internally */
                    438: #define        STRATUM_PKT_UNSPEC ((u_char)0) /* unspecified in packet */
                    439: #define        STRATUM_UNSPEC  ((u_char)16) /* unspecified */
                    440: 
                    441: /*
                    442:  * Values for peer.flags
                    443:  */
                    444: #define        FLAG_CONFIG     0x0001  /* association was configured */
                    445: #define        FLAG_PREEMPT    0x0002  /* preemptable association */
                    446: #define        FLAG_AUTHENTIC  0x0004  /* last message was authentic */
                    447: #define        FLAG_REFCLOCK   0x0008  /* this is actually a reference clock */
                    448: #define        FLAG_BC_VOL     0x0010  /* broadcast client volleying */
                    449: #define        FLAG_PREFER     0x0020  /* prefer peer */
                    450: #define        FLAG_BURST      0x0040  /* burst mode */
                    451: #define        FLAG_PPS        0x0080  /* steered by PPS */
                    452: #define        FLAG_IBURST     0x0100  /* initial burst mode */
                    453: #define        FLAG_NOSELECT   0x0200  /* never select */
                    454: #define        FLAG_TRUE       0x0400  /* force truechimer */
                    455: #define        FLAG_SKEY       0x0800  /* autokey authentication */
                    456: #define        FLAG_XLEAVE     0x1000  /* interleaved protocol */
                    457: #define        FLAG_XB         0x2000  /* interleaved broadcast */
                    458: #define        FLAG_XBOGUS     0x4000  /* interleaved bogus packet */
                    459: #ifdef OPENSSL
                    460: #define FLAG_ASSOC     0x8000  /* autokey request */
                    461: #endif /* OPENSSL */
                    462: 
                    463: /*
                    464:  * Definitions for the clear() routine.  We use memset() to clear
                    465:  * the parts of the peer structure which go to zero.  These are
                    466:  * used to calculate the start address and length of the area.
                    467:  */
                    468: #define        CLEAR_TO_ZERO(p)        ((char *)&((p)->clear_to_zero))
                    469: #define        END_CLEAR_TO_ZERO(p)    ((char *)&((p)->end_clear_to_zero))
                    470: #define        LEN_CLEAR_TO_ZERO       (END_CLEAR_TO_ZERO((struct peer *)0) \
                    471:                                    - CLEAR_TO_ZERO((struct peer *)0))
                    472: #define CRYPTO_TO_ZERO(p)      ((char *)&((p)->clear_to_zero))
                    473: #define END_CRYPTO_TO_ZERO(p)  ((char *)&((p)->end_clear_to_zero))
                    474: #define LEN_CRYPTO_TO_ZERO     (END_CRYPTO_TO_ZERO((struct peer *)0) \
                    475:                                    - CRYPTO_TO_ZERO((struct peer *)0))
                    476: 
                    477: /*
                    478:  * Reference clock identifiers (for pps signal)
                    479:  */
                    480: #define PPSREFID (u_int32)"PPS "       /* used when pps controls stratum>1 */
                    481: 
                    482: /*
                    483:  * Reference clock types.  Added as necessary.
                    484:  */
                    485: #define        REFCLK_NONE             0       /* unknown or missing */
                    486: #define        REFCLK_LOCALCLOCK       1       /* external (e.g., lockclock) */
                    487: #define        REFCLK_GPS_TRAK         2       /* TRAK 8810 GPS Receiver */
                    488: #define        REFCLK_WWV_PST          3       /* PST/Traconex 1020 WWV/H */
                    489: #define        REFCLK_SPECTRACOM       4       /* Spectracom (generic) Receivers */
                    490: #define        REFCLK_TRUETIME         5       /* TrueTime (generic) Receivers */
                    491: #define REFCLK_IRIG_AUDIO      6       /* IRIG-B/W audio decoder */
                    492: #define        REFCLK_CHU_AUDIO        7       /* CHU audio demodulator/decoder */
                    493: #define REFCLK_PARSE           8       /* generic driver (usually DCF77,GPS,MSF) */
                    494: #define        REFCLK_GPS_MX4200       9       /* Magnavox MX4200 GPS */
                    495: #define REFCLK_GPS_AS2201      10      /* Austron 2201A GPS */
                    496: #define        REFCLK_GPS_ARBITER      11      /* Arbiter 1088A/B/ GPS */
                    497: #define REFCLK_IRIG_TPRO       12      /* KSI/Odetics TPRO-S IRIG */
                    498: #define REFCLK_ATOM_LEITCH     13      /* Leitch CSD 5300 Master Clock */
                    499: #define REFCLK_MSF_EES         14      /* EES M201 MSF Receiver */
                    500: #define        REFCLK_GPSTM_TRUE       15      /* OLD TrueTime GPS/TM-TMD Receiver */
                    501: #define REFCLK_IRIG_BANCOMM    16      /* Bancomm GPS/IRIG Interface */
                    502: #define REFCLK_GPS_DATUM       17      /* Datum Programmable Time System */
                    503: #define REFCLK_ACTS            18      /* Generic Auto Computer Time Service */
                    504: #define REFCLK_WWV_HEATH       19      /* Heath GC1000 WWV/WWVH Receiver */
                    505: #define REFCLK_GPS_NMEA                20      /* NMEA based GPS clock */
                    506: #define REFCLK_GPS_VME         21      /* TrueTime GPS-VME Interface */
                    507: #define REFCLK_ATOM_PPS                22      /* 1-PPS Clock Discipline */
                    508: #define REFCLK_PTB_ACTS                23      /* replaced by REFCLK_ACTS */
                    509: #define REFCLK_USNO            24      /* replaced by REFCLK_ACTS */
                    510: #define REFCLK_GPS_HP          26      /* HP 58503A Time/Frequency Receiver */
                    511: #define REFCLK_ARCRON_MSF      27      /* ARCRON MSF radio clock. */
                    512: #define REFCLK_SHM             28      /* clock attached thru shared memory */
                    513: #define REFCLK_PALISADE                29      /* Trimble Navigation Palisade GPS */
                    514: #define REFCLK_ONCORE          30      /* Motorola UT Oncore GPS */
                    515: #define REFCLK_GPS_JUPITER     31      /* Rockwell Jupiter GPS receiver */
                    516: #define REFCLK_CHRONOLOG       32      /* Chrono-log K WWVB receiver */
                    517: #define REFCLK_DUMBCLOCK       33      /* Dumb localtime clock */
                    518: #define REFCLK_ULINK           34      /* Ultralink M320 WWVB receiver */
                    519: #define REFCLK_PCF             35      /* Conrad parallel port radio clock */
                    520: #define REFCLK_WWV_AUDIO       36      /* WWV/H audio demodulator/decoder */
                    521: #define REFCLK_FG              37      /* Forum Graphic GPS */
                    522: #define REFCLK_HOPF_SERIAL     38      /* hopf DCF77/GPS serial receiver  */
                    523: #define REFCLK_HOPF_PCI                39      /* hopf DCF77/GPS PCI receiver  */
                    524: #define REFCLK_JJY             40      /* JJY receiver  */
                    525: #define        REFCLK_TT560            41      /* TrueTime 560 IRIG-B decoder */
                    526: #define REFCLK_ZYFER           42      /* Zyfer GPStarplus receiver  */
                    527: #define REFCLK_RIPENCC         43      /* RIPE NCC Trimble driver */
                    528: #define REFCLK_NEOCLOCK4X      44      /* NeoClock4X DCF77 or TDF receiver */
                    529: #define REFCLK_MAX             44      /* NeoClock4X DCF77 or TDF receiver */
                    530: 
                    531: 
                    532: /*
                    533:  * NTP packet format.  The mac field is optional.  It isn't really
                    534:  * an l_fp either, but for now declaring it that way is convenient.
                    535:  * See Appendix A in the specification.
                    536:  *
                    537:  * Note that all u_fp and l_fp values arrive in network byte order
                    538:  * and must be converted (except the mac, which isn't, really).
                    539:  */
                    540: struct pkt {
                    541:        u_char  li_vn_mode;     /* peer leap indicator */
                    542:        u_char  stratum;        /* peer stratum */
                    543:        u_char  ppoll;          /* peer poll interval */
                    544:        s_char  precision;      /* peer clock precision */
                    545:        u_fp    rootdelay;      /* roundtrip delay to primary source */
                    546:        u_fp    rootdisp;       /* dispersion to primary source*/
                    547:        u_int32 refid;          /* reference id */
                    548:        l_fp    reftime;        /* last update time */
                    549:        l_fp    org;            /* originate time stamp */
                    550:        l_fp    rec;            /* receive time stamp */
                    551:        l_fp    xmt;            /* transmit time stamp */
                    552: 
                    553: #define        LEN_PKT_NOMAC   (12 * sizeof(u_int32)) /* min header length */
                    554: #define MIN_MAC_LEN    (1 * sizeof(u_int32))   /* crypto_NAK */
                    555: #define MAX_MD5_LEN    (5 * sizeof(u_int32))   /* MD5 */
                    556: #define        MAX_MAC_LEN     (6 * sizeof(u_int32))   /* SHA */
                    557: 
                    558:        /*
                    559:         * The length of the packet less MAC must be a multiple of 64
                    560:         * with an RSA modulus and Diffie-Hellman prime of 256 octets
                    561:         * and maximum host name of 128 octets, the maximum autokey
                    562:         * command is 152 octets and maximum autokey response is 460
                    563:         * octets. A packet can contain no more than one command and one
                    564:         * response, so the maximum total extension field length is 864
                    565:         * octets. But, to handle humungus certificates, the bank must
                    566:         * be broke.
                    567:         */
                    568: #ifdef OPENSSL
                    569:        u_int32 exten[NTP_MAXEXTEN / 4]; /* max extension field */
                    570: #else /* OPENSSL */
                    571:        u_int32 exten[1];       /* misused */
                    572: #endif /* OPENSSL */
                    573:        u_char  mac[MAX_MAC_LEN]; /* mac */
                    574: };
                    575: 
                    576: /*
                    577:  * Stuff for extracting things from li_vn_mode
                    578:  */
                    579: #define        PKT_MODE(li_vn_mode)    ((u_char)((li_vn_mode) & 0x7))
                    580: #define        PKT_VERSION(li_vn_mode) ((u_char)(((li_vn_mode) >> 3) & 0x7))
                    581: #define        PKT_LEAP(li_vn_mode)    ((u_char)(((li_vn_mode) >> 6) & 0x3))
                    582: 
                    583: /*
                    584:  * Stuff for putting things back into li_vn_mode
                    585:  */
                    586: #define        PKT_LI_VN_MODE(li, vn, md) \
                    587:        ((u_char)((((li) << 6) & 0xc0) | (((vn) << 3) & 0x38) | ((md) & 0x7)))
                    588: 
                    589: 
                    590: /*
                    591:  * Dealing with stratum.  0 gets mapped to 16 incoming, and back to 0
                    592:  * on output.
                    593:  */
                    594: #define        PKT_TO_STRATUM(s)       ((u_char)(((s) == (STRATUM_PKT_UNSPEC)) ?\
                    595:                                (STRATUM_UNSPEC) : (s)))
                    596: 
                    597: #define        STRATUM_TO_PKT(s)       ((u_char)(((s) == (STRATUM_UNSPEC)) ?\
                    598:                                (STRATUM_PKT_UNSPEC) : (s)))
                    599: 
                    600: /*
                    601:  * Event codes. Used for reporting errors/events to the control module
                    602:  */
                    603: #define        PEER_EVENT      0x080   /* this is a peer event */
                    604: #define CRPT_EVENT     0x100   /* this is a crypto event */
                    605: 
                    606: /*
                    607:  * System event codes
                    608:  */
                    609: #define        EVNT_UNSPEC     0       /* unspecified */
                    610: #define        EVNT_NSET       1       /* freq not set */
                    611: #define        EVNT_FSET       2       /* freq set */
                    612: #define        EVNT_SPIK       3       /* spike detect */
                    613: #define        EVNT_FREQ       4       /* freq mode */
                    614: #define        EVNT_SYNC       5       /* clock sync */
                    615: #define        EVNT_SYSRESTART 6       /* restart */
                    616: #define        EVNT_SYSFAULT   7       /* panic stop */
                    617: #define        EVNT_NOPEER     8       /* no sys peer */
                    618: #define        EVNT_ARMED      9       /* leap armed */
                    619: #define        EVNT_DISARMED   10      /* leap disarmed */
                    620: #define        EVNT_LEAP       11      /* leap event */
                    621: #define        EVNT_CLOCKRESET 12      /* clock step */
                    622: #define        EVNT_KERN       13      /* kernel event */
                    623: #define        EVNT_TAI        14      /* TAI */
                    624: #define        EVNT_LEAPVAL    15      /* stale leapsecond values */
                    625: #define        EVNT_CLKHOP     16      /* clockhop */
                    626: 
                    627: /*
                    628:  * Peer event codes
                    629:  */
                    630: #define        PEVNT_MOBIL     (1 | PEER_EVENT) /* mobilize */
                    631: #define        PEVNT_DEMOBIL   (2 | PEER_EVENT) /* demobilize */
                    632: #define        PEVNT_UNREACH   (3 | PEER_EVENT) /* unreachable */
                    633: #define        PEVNT_REACH     (4 | PEER_EVENT) /* reachable */
                    634: #define        PEVNT_RESTART   (5 | PEER_EVENT) /* restart */
                    635: #define        PEVNT_REPLY     (6 | PEER_EVENT) /* no reply */
                    636: #define        PEVNT_RATE      (7 | PEER_EVENT) /* rate exceeded */
                    637: #define        PEVNT_DENY      (8 | PEER_EVENT) /* access denied */
                    638: #define PEVNT_ARMED    (9 | PEER_EVENT) /* leap armed */
                    639: #define        PEVNT_NEWPEER   (10 | PEER_EVENT) /* sys peer */
                    640: #define        PEVNT_CLOCK     (11 | PEER_EVENT) /* clock event */
                    641: #define        PEVNT_AUTH      (12 | PEER_EVENT) /* bad auth */
                    642: #define        PEVNT_POPCORN   (13 | PEER_EVENT) /* popcorn */
                    643: #define        PEVNT_XLEAVE    (14 | PEER_EVENT) /* interleave mode */
                    644: #define        PEVNT_XERR      (15 | PEER_EVENT) /* interleave error */
                    645: #define        PEVNT_TAI       (16 | PEER_EVENT) /* TAI */
                    646: 
                    647: /*
                    648:  * Clock event codes
                    649:  */
                    650: #define        CEVNT_NOMINAL   0       /* unspecified */
                    651: #define        CEVNT_TIMEOUT   1       /* no reply */
                    652: #define        CEVNT_BADREPLY  2       /* bad format */
                    653: #define        CEVNT_FAULT     3       /* fault */
                    654: #define        CEVNT_PROP      4       /* bad signal */
                    655: #define        CEVNT_BADDATE   5       /* bad date */
                    656: #define        CEVNT_BADTIME   6       /* bad time */
                    657: #define CEVNT_MAX      CEVNT_BADTIME
                    658: 
                    659: /*
                    660:  * Very misplaced value.  Default port through which we send traps.
                    661:  */
                    662: #define        TRAPPORT        18447
                    663: 
                    664: 
                    665: /*
                    666:  * To speed lookups, peers are hashed by the low order bits of the
                    667:  * remote IP address. These definitions relate to that.
                    668:  */
                    669: #define        NTP_HASH_SIZE   128
                    670: #define        NTP_HASH_MASK   (NTP_HASH_SIZE-1)
                    671: #define        NTP_HASH_ADDR(src)      sock_hash(src)
                    672: 
                    673: /*
                    674:  * min, min3 and max.  Makes it easier to transliterate the spec without
                    675:  * thinking about it.
                    676:  */
                    677: #define        min(a,b)        (((a) < (b)) ? (a) : (b))
                    678: #define        max(a,b)        (((a) > (b)) ? (a) : (b))
                    679: #define        min3(a,b,c)     min(min((a),(b)), (c))
                    680: 
                    681: 
                    682: /*
                    683:  * Configuration items.  These are for the protocol module (proto_config())
                    684:  */
                    685: #define        PROTO_BROADCLIENT       1
                    686: #define        PROTO_PRECISION         2       /* (not used) */
                    687: #define        PROTO_AUTHENTICATE      3
                    688: #define        PROTO_BROADDELAY        4
                    689: #define        PROTO_AUTHDELAY         5       /* (not used) */
                    690: #define PROTO_MULTICAST_ADD    6
                    691: #define PROTO_MULTICAST_DEL    7
                    692: #define PROTO_NTP              8
                    693: #define PROTO_KERNEL           9
                    694: #define PROTO_MONITOR          10
                    695: #define PROTO_FILEGEN          11
                    696: #define        PROTO_PPS               12
                    697: #define PROTO_CAL              13
                    698: #define PROTO_MINCLOCK         14
                    699: #define        PROTO_MAXCLOCK          15
                    700: #define PROTO_MINSANE          16
                    701: #define PROTO_FLOOR            17
                    702: #define PROTO_CEILING          18
                    703: #define PROTO_COHORT           19
                    704: #define PROTO_CALLDELAY                20
                    705: #define PROTO_MINDISP          21
                    706: #define PROTO_MAXDIST          22
                    707: #define PROTO_ADJ              23
                    708: #define        PROTO_MAXHOP            24
                    709: #define        PROTO_BEACON            25
                    710: #define        PROTO_ORPHAN            26
                    711: 
                    712: /*
                    713:  * Configuration items for the loop filter
                    714:  */
                    715: #define        LOOP_DRIFTINIT          1       /* set initial frequency offset */
                    716: #define LOOP_DRIFTCOMP         2       /* set frequency offset */
                    717: #define LOOP_MAX               3       /* set step offset */
                    718: #define LOOP_PANIC             4       /* set panic offseet */
                    719: #define LOOP_PHI               5       /* set dispersion rate */
                    720: #define LOOP_MINSTEP           6       /* set step timeout */
                    721: #define LOOP_MINPOLL           7       /* set min poll interval (log2 s) */
                    722: #define LOOP_ALLAN             8       /* set minimum Allan intercept */
                    723: #define LOOP_HUFFPUFF          9       /* set huff-n'-puff filter length */
                    724: #define LOOP_FREQ              10      /* set initial frequency */
                    725: #define LOOP_KERN_CLEAR                11      /* reset kernel pll parameters */
                    726: #define LOOP_CODEC             12      /* set audio codec frequency */
                    727: #define        LOOP_LEAP               13      /* insert leap after second 23:59 */
                    728: 
                    729: /*
                    730:  * Configuration items for the stats printer
                    731:  */
                    732: #define        STATS_FREQ_FILE         1       /* configure drift file */
                    733: #define STATS_STATSDIR         2       /* directory prefix for stats files */
                    734: #define        STATS_PID_FILE          3       /* configure ntpd PID file */
                    735: #define        STATS_LEAP_FILE         4       /* configure ntpd leapseconds file */
                    736: 
                    737: #define MJD_1900               15020   /* MJD for 1 Jan 1900 */
                    738: 
                    739: /*
                    740:  * Default parameters.  We use these in the absence of something better.
                    741:  */
                    742: #define INADDR_NTP     0xe0000101      /* NTP multicast address 224.0.1.1 */
                    743: 
                    744: /*
                    745:  * Structure used optionally for monitoring when this is turned on.
                    746:  */
                    747: struct mon_data {
                    748:        struct mon_data *hash_next;     /* next structure in hash list */
                    749:        struct mon_data *mru_next;      /* next structure in MRU list */
                    750:        struct mon_data *mru_prev;      /* previous structure in MRU list */
                    751:        int     flags;                  /* restrict flags */
                    752:        int     leak;                   /* leaky bucket accumulator */
                    753:        int     count;                  /* total packet count */
                    754:        u_long  firsttime;              /* first time found */
                    755:        u_long  lasttime;               /* last time found */
                    756:        sockaddr_u rmtadr;              /* address of remote host */
                    757:        struct interface *interface;    /* interface on which this arrived */
                    758:        u_short rmtport;                /* remote port last came from */
                    759:        u_char  mode;                   /* packet mode */
                    760:        u_char  version;                /* packet version */
                    761:        u_char  cast_flags;             /* flags MDF_?CAST */
                    762: };
                    763: 
                    764: /*
                    765:  * Values for cast_flags
                    766:  */
                    767: #define        MDF_UCAST       0x01            /* unicast */
                    768: #define        MDF_MCAST       0x02            /* multicast */
                    769: #define        MDF_BCAST       0x04            /* broadcast */
                    770: #define        MDF_LCAST       0x08            /* localcast */
                    771: #define MDF_ACAST      0x10            /* manycast */
                    772: #define        MDF_BCLNT       0x20            /* broadcast client */
                    773: #define MDF_ACLNT      0x40            /* manycast client */
                    774: 
                    775: /*
                    776:  * Values used with mon_enabled to indicate reason for enabling monitoring
                    777:  */
                    778: #define MON_OFF    0x00                        /* no monitoring */
                    779: #define MON_ON     0x01                        /* monitoring explicitly enabled */
                    780: #define MON_RES    0x02                        /* implicit monitoring for RES_LIMITED */
                    781: /*
                    782:  * Structure used for restrictlist entries
                    783:  */
                    784: typedef struct res_addr4_tag {
                    785:        u_int32         addr;           /* IPv4 addr (host order) */
                    786:        u_int32         mask;           /* IPv4 mask (host order) */
                    787: } res_addr4;
                    788: 
                    789: typedef struct res_addr6_tag {
                    790:        struct in6_addr addr;           /* IPv6 addr (net order) */
                    791:        struct in6_addr mask;           /* IPv6 mask (net order) */
                    792: } res_addr6;
                    793: 
                    794: typedef struct restrict_u_tag  restrict_u;
                    795: struct restrict_u_tag {
                    796:        restrict_u *            link;   /* link to next entry */
                    797:        u_int32                 count;  /* number of packets matched */
                    798:        u_short                 flags;  /* accesslist flags */
                    799:        u_short                 mflags; /* match flags */
                    800:        union {                         /* variant starting here */
                    801:                res_addr4 v4;
                    802:                res_addr6 v6;
                    803:        } u;
                    804: };
                    805: #define        V4_SIZEOF_RESTRICT_U    (offsetof(restrict_u, u)        \
                    806:                                 + sizeof(res_addr4))
                    807: #define        V6_SIZEOF_RESTRICT_U    (offsetof(restrict_u, u)        \
                    808:                                 + sizeof(res_addr6))
                    809: 
                    810: 
                    811: /*
                    812:  * Access flags
                    813:  */
                    814: #define        RES_IGNORE              0x0001  /* ignore packet */
                    815: #define        RES_DONTSERVE           0x0002  /* access denied */
                    816: #define        RES_DONTTRUST           0x0004  /* authentication required */
                    817: #define        RES_VERSION             0x0008  /* version mismatch */
                    818: #define        RES_NOPEER              0x0010  /* new association denied */
                    819: #define RES_LIMITED            0x0020  /* packet rate exceeded */
                    820: #define RES_FLAGS              (RES_IGNORE | RES_DONTSERVE |\
                    821:                                    RES_DONTTRUST | RES_VERSION |\
                    822:                                    RES_NOPEER | RES_LIMITED)
                    823: 
                    824: #define        RES_NOQUERY             0x0040  /* mode 6/7 packet denied */
                    825: #define        RES_NOMODIFY            0x0080  /* mode 6/7 modify denied */
                    826: #define        RES_NOTRAP              0x0100  /* mode 6/7 set trap denied */
                    827: #define        RES_LPTRAP              0x0200  /* mode 6/7 low priority trap */
                    828: 
                    829: #define RES_KOD                        0x0400  /* send kiss of death packet */
                    830: #define        RES_MSSNTP              0x0800  /* enable MS-SNTP authentication */
                    831: #define RES_TIMEOUT            0x1000  /* timeout this entry */
                    832: 
                    833: #define        RES_ALLFLAGS            (RES_FLAGS | RES_NOQUERY |\
                    834:                                    RES_NOMODIFY | RES_NOTRAP |\
                    835:                                    RES_LPTRAP | RES_KOD |\
                    836:                                    RES_MSSNTP | RES_TIMEOUT)
                    837: 
                    838: /*
                    839:  * Match flags
                    840:  */
                    841: #define        RESM_INTERFACE          0x1000  /* this is an interface */
                    842: #define        RESM_NTPONLY            0x2000  /* match ntp port only */
                    843: 
                    844: /*
                    845:  * Restriction configuration ops
                    846:  */
                    847: #define        RESTRICT_FLAGS          1       /* add flags to restrict entry */
                    848: #define        RESTRICT_UNFLAG         2       /* remove flags from restrict entry */
                    849: #define        RESTRICT_REMOVE         3       /* remove a restrict entry */
                    850: #define        RESTRICT_REMOVEIF       4       /* remove an interface restrict entry */
                    851: 
                    852: /*
                    853:  * Endpoint structure for the select algorithm
                    854:  */
                    855: struct endpoint {
                    856:        double  val;                    /* offset of endpoint */
                    857:        int     type;                   /* interval entry/exit */
                    858: };
                    859: 
                    860: /*
                    861:  * Association matching AM[] return codes
                    862:  */
                    863: #define AM_ERR         -1              /* error */
                    864: #define AM_NOMATCH     0               /* no match */
                    865: #define AM_PROCPKT     1               /* server/symmetric packet */   
                    866: #define AM_BCST                2               /* broadcast packet */  
                    867: #define AM_FXMIT       3               /* client packet */
                    868: #define AM_MANYCAST    4               /* manycast packet */
                    869: #define AM_NEWPASS     5               /* new passive */
                    870: #define AM_NEWBCL      6               /* new broadcast */
                    871: #define        AM_POSSBCL      7               /* discard broadcast */
                    872: 
                    873: /* NetInfo configuration locations */
                    874: #ifdef HAVE_NETINFO
                    875: #define NETINFO_CONFIG_DIR "/config/ntp"
                    876: #endif
                    877: 
                    878: #endif /* NTP_H */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>