| /* |
| chronyd/chronyc - Programs for keeping computer clocks accurate. |
| |
| ********************************************************************** |
| * Copyright (C) Richard P. Curnow 1997-2003 |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of version 2 of the GNU General Public License as |
| * published by the Free Software Foundation. |
| * |
| * This program is distributed in the hope that it will be useful, but |
| * WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| * General Public License for more details. |
| * |
| * You should have received a copy of the GNU General Public License along |
| * with this program; if not, write to the Free Software Foundation, Inc., |
| * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
| * |
| ********************************************************************** |
| |
| ======================================================================= |
| |
| Header file containing common NTP bits and pieces |
| */ |
| |
| #ifndef GOT_NTP_H |
| #define GOT_NTP_H |
| |
| #include "sysincl.h" |
| |
| #include "hash.h" |
| |
| typedef struct { |
| uint32_t hi; |
| uint32_t lo; |
| } NTP_int64; |
| |
| typedef uint32_t NTP_int32; |
| |
| /* The UDP port number used by NTP */ |
| #define NTP_PORT 123 |
| |
| /* The NTP protocol version that we support */ |
| #define NTP_VERSION 4 |
| |
| /* Maximum stratum number (infinity) */ |
| #define NTP_MAX_STRATUM 16 |
| |
| /* The minimum valid length of an extension field */ |
| #define NTP_MIN_EXTENSION_LENGTH 16 |
| |
| /* The maximum assumed length of all extension fields in received |
| packets (RFC 5905 doesn't specify a limit on length or number of |
| extension fields in one packet) */ |
| #define NTP_MAX_EXTENSIONS_LENGTH 1024 |
| |
| /* The minimum and maximum supported length of MAC */ |
| #define NTP_MIN_MAC_LENGTH (4 + 16) |
| #define NTP_MAX_MAC_LENGTH (4 + MAX_HASH_LENGTH) |
| |
| /* The maximum length of MAC in NTPv4 packets which allows deterministic |
| parsing of extension fields (RFC 7822) */ |
| #define NTP_MAX_V4_MAC_LENGTH (4 + 20) |
| |
| /* Type definition for leap bits */ |
| typedef enum { |
| LEAP_Normal = 0, |
| LEAP_InsertSecond = 1, |
| LEAP_DeleteSecond = 2, |
| LEAP_Unsynchronised = 3 |
| } NTP_Leap; |
| |
| typedef enum { |
| MODE_UNDEFINED = 0, |
| MODE_ACTIVE = 1, |
| MODE_PASSIVE = 2, |
| MODE_CLIENT = 3, |
| MODE_SERVER = 4, |
| MODE_BROADCAST = 5 |
| } NTP_Mode; |
| |
| typedef struct { |
| uint8_t lvm; |
| uint8_t stratum; |
| int8_t poll; |
| int8_t precision; |
| NTP_int32 root_delay; |
| NTP_int32 root_dispersion; |
| NTP_int32 reference_id; |
| NTP_int64 reference_ts; |
| NTP_int64 originate_ts; |
| NTP_int64 receive_ts; |
| NTP_int64 transmit_ts; |
| |
| /* Optional extension fields, we don't send packets with them yet */ |
| /* uint8_t extensions[] */ |
| |
| /* Optional message authentication code (MAC) */ |
| NTP_int32 auth_keyid; |
| uint8_t auth_data[NTP_MAX_MAC_LENGTH - 4]; |
| } NTP_Packet; |
| |
| #define NTP_NORMAL_PACKET_LENGTH (int)offsetof(NTP_Packet, auth_keyid) |
| |
| /* The buffer used to hold a datagram read from the network */ |
| typedef struct { |
| NTP_Packet ntp_pkt; |
| uint8_t extensions[NTP_MAX_EXTENSIONS_LENGTH]; |
| } NTP_Receive_Buffer; |
| |
| /* Macros to work with the lvm field */ |
| #define NTP_LVM_TO_LEAP(lvm) (((lvm) >> 6) & 0x3) |
| #define NTP_LVM_TO_VERSION(lvm) (((lvm) >> 3) & 0x7) |
| #define NTP_LVM_TO_MODE(lvm) ((lvm) & 0x7) |
| #define NTP_LVM(leap, version, mode) \ |
| ((((leap) << 6) & 0xc0) | (((version) << 3) & 0x38) | ((mode) & 0x07)) |
| |
| /* Special NTP reference IDs */ |
| #define NTP_REFID_UNSYNC 0x0UL |
| #define NTP_REFID_LOCAL 0x7F7F0101UL /* 127.127.1.1 */ |
| #define NTP_REFID_SMOOTH 0x7F7F01FFUL /* 127.127.1.255 */ |
| |
| #endif /* GOT_NTP_H */ |