1*c338e3e2Sotto /* $OpenBSD: ntp.h,v 1.15 2023/11/15 15:52:09 otto Exp $ */ 2ce81b4eaShenning 3914fd659Shenning /* 4914fd659Shenning * Copyright (c) 2004 Henning Brauer <henning@openbsd.org> 5914fd659Shenning * Copyright (c) 2004 Alexander Guy <alexander.guy@andern.org> 6914fd659Shenning * 7914fd659Shenning * Permission to use, copy, modify, and distribute this software for any 8914fd659Shenning * purpose with or without fee is hereby granted, provided that the above 9914fd659Shenning * copyright notice and this permission notice appear in all copies. 10914fd659Shenning * 11914fd659Shenning * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 12914fd659Shenning * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 13914fd659Shenning * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 14914fd659Shenning * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 15914fd659Shenning * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 16914fd659Shenning * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 17914fd659Shenning * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 18914fd659Shenning */ 19914fd659Shenning 205fbf7173Salexander #ifndef _NTP_H_ 215fbf7173Salexander #define _NTP_H_ 225fbf7173Salexander 23914fd659Shenning /* Style borrowed from NTP ref/tcpdump and updated for SNTPv4 (RFC2030). */ 24914fd659Shenning 25914fd659Shenning /* 26914fd659Shenning * RFC Section 3 27914fd659Shenning * 28914fd659Shenning * 0 1 2 3 29914fd659Shenning * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 30914fd659Shenning * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 31914fd659Shenning * | Integer Part | 32914fd659Shenning * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 33914fd659Shenning * | Fraction Part | 34914fd659Shenning * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 35914fd659Shenning * 36914fd659Shenning * 0 1 2 3 37914fd659Shenning * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 38914fd659Shenning * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 39914fd659Shenning * | Integer Part | Fraction Part | 40914fd659Shenning * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 41914fd659Shenning */ 42914fd659Shenning struct l_fixedpt { 43af0b62daSmickey u_int32_t int_partl; 44af0b62daSmickey u_int32_t fractionl; 45914fd659Shenning }; 46*c338e3e2Sotto #define L_DENOMINATOR (UINT32_MAX + 1ULL) 47914fd659Shenning 48914fd659Shenning struct s_fixedpt { 49af0b62daSmickey u_int16_t int_parts; 50af0b62daSmickey u_int16_t fractions; 51914fd659Shenning }; 52*c338e3e2Sotto #define S_DENOMINATOR (UINT16_MAX + 1) 53914fd659Shenning 54914fd659Shenning /* RFC Section 4 55914fd659Shenning * 56914fd659Shenning * 0 1 2 3 57914fd659Shenning * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 58914fd659Shenning * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 59914fd659Shenning * |LI | VN | Mode| Stratum | Poll | Precision | 60914fd659Shenning * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 61914fd659Shenning * | Synchronizing Distance | 62914fd659Shenning * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 63914fd659Shenning * | Synchronizing Dispersion | 64914fd659Shenning * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 65914fd659Shenning * | Reference Clock Identifier | 66914fd659Shenning * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 67914fd659Shenning * | | 68914fd659Shenning * | Reference Timestamp (64 bits) | 69914fd659Shenning * | | 70914fd659Shenning * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 71914fd659Shenning * | | 72914fd659Shenning * | Originate Timestamp (64 bits) | 73914fd659Shenning * | | 74914fd659Shenning * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 75914fd659Shenning * | | 76914fd659Shenning * | Receive Timestamp (64 bits) | 77914fd659Shenning * | | 78914fd659Shenning * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 79914fd659Shenning * | | 80914fd659Shenning * | Transmit Timestamp (64 bits) | 81914fd659Shenning * | | 82914fd659Shenning * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 83914fd659Shenning * | Key Identifier (optional) (32) | 84914fd659Shenning * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 85914fd659Shenning * | | 86914fd659Shenning * | | 87914fd659Shenning * | Message Digest (optional) (128) | 88914fd659Shenning * | | 89914fd659Shenning * | | 90914fd659Shenning * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 91914fd659Shenning * 92914fd659Shenning */ 93914fd659Shenning 94914fd659Shenning #define NTP_DIGESTSIZE 16 95914fd659Shenning #define NTP_MSGSIZE_NOAUTH 48 96914fd659Shenning #define NTP_MSGSIZE (NTP_MSGSIZE_NOAUTH + 4 + NTP_DIGESTSIZE) 97914fd659Shenning 98914fd659Shenning struct ntp_msg { 99914fd659Shenning u_int8_t status; /* status of local clock and leap info */ 100914fd659Shenning u_int8_t stratum; /* Stratum level */ 101914fd659Shenning u_int8_t ppoll; /* poll value */ 102914fd659Shenning int8_t precision; 103bd8c7023Shenning struct s_fixedpt rootdelay; 104914fd659Shenning struct s_fixedpt dispersion; 105914fd659Shenning u_int32_t refid; 106914fd659Shenning struct l_fixedpt reftime; 107914fd659Shenning struct l_fixedpt orgtime; 108914fd659Shenning struct l_fixedpt rectime; 109914fd659Shenning struct l_fixedpt xmttime; 110c0ee96ccShenning } __packed; 111914fd659Shenning 1129096d664Shenning struct ntp_query { 1139096d664Shenning int fd; 1149096d664Shenning struct ntp_msg msg; 115692d048dSalexander double xmttime; 1169096d664Shenning }; 1179096d664Shenning 118914fd659Shenning /* 119914fd659Shenning * Leap Second Codes (high order two bits) 120914fd659Shenning */ 121914fd659Shenning #define LI_NOWARNING (0 << 6) /* no warning */ 122914fd659Shenning #define LI_PLUSSEC (1 << 6) /* add a second (61 seconds) */ 123914fd659Shenning #define LI_MINUSSEC (2 << 6) /* minus a second (59 seconds) */ 124914fd659Shenning #define LI_ALARM (3 << 6) /* alarm condition */ 125914fd659Shenning 126914fd659Shenning /* 127914fd659Shenning * Status Masks 128914fd659Shenning */ 129914fd659Shenning #define MODEMASK (7 << 0) 130914fd659Shenning #define VERSIONMASK (7 << 3) 1312713a698Salexander #define LIMASK (3 << 6) 132914fd659Shenning 133914fd659Shenning /* 134914fd659Shenning * Mode values 135914fd659Shenning */ 136914fd659Shenning #define MODE_RES0 0 /* reserved */ 137914fd659Shenning #define MODE_SYM_ACT 1 /* symmetric active */ 138914fd659Shenning #define MODE_SYM_PAS 2 /* symmetric passive */ 139914fd659Shenning #define MODE_CLIENT 3 /* client */ 140914fd659Shenning #define MODE_SERVER 4 /* server */ 141914fd659Shenning #define MODE_BROADCAST 5 /* broadcast */ 142914fd659Shenning #define MODE_RES1 6 /* reserved for NTP control message */ 143914fd659Shenning #define MODE_RES2 7 /* reserved for private use */ 144914fd659Shenning 145914fd659Shenning #define JAN_1970 2208988800UL /* 1970 - 1900 in seconds */ 146d96a2e9bSotto 147d96a2e9bSotto /* 148d96a2e9bSotto * The era we're in if we have no reason to assume otherwise. 149d96a2e9bSotto * If lfp_to_d() sees an offset <= INT32_MAX the era is is assumed to be 150d96a2e9bSotto * NTP_ERA + 1. 151d96a2e9bSotto * Once the actual year is well into era 1, (after 2036) define NTP_ERA to 1 152d96a2e9bSotto * and adapt (remove) the test in lfp_to_d(). 153d96a2e9bSotto * Once more than half of era 1 has elapsed (after 2104), re-inroduce the test 154d96a2e9bSotto * to move to era 2 if offset <= INT32_MAX, repeat for each half era. 155d96a2e9bSotto */ 156d96a2e9bSotto #define NTP_ERA 0 157d96a2e9bSotto 158d96a2e9bSotto #define SECS_IN_ERA (UINT32_MAX + 1ULL) 1596a5eeebaShenning 1609096d664Shenning #define NTP_VERSION 4 161417a6d09Sdtucker #define NTP_MAXSTRATUM 15 1629096d664Shenning 1635fbf7173Salexander #endif /* _NTP_H_ */ 164