diff --git a/ntp.h b/ntp.h index 5ea5ef6..52b2ab5 100644 --- a/ntp.h +++ b/ntp.h @@ -113,6 +113,23 @@ typedef struct { #define NTP_REFID_LOCAL 0x7F7F0101UL /* 127.127.1.1 */ #define NTP_REFID_SMOOTH 0x7F7F01FFUL /* 127.127.1.255 */ +/* Non-authentication extension fields and corresponding internal flags */ + +#define NTP_EF_EXP1 0xF323 + +#define NTP_EF_FLAG_EXP1 0x1 + +/* Pre-NTPv5 experimental extension field */ +typedef struct { + uint32_t magic; + NTP_int32 root_delay; + NTP_int32 root_dispersion; + NTP_int64 mono_receive_ts; + uint32_t mono_epoch; +} NTP_ExtFieldExp1; + +#define NTP_EF_EXP1_MAGIC 0xF5BEDD9AU + /* Authentication extension fields */ #define NTP_EF_NTS_UNIQUE_IDENTIFIER 0x0104 diff --git a/ntp_core.c b/ntp_core.c index 5455964..9eb6758 100644 --- a/ntp_core.c +++ b/ntp_core.c @@ -1406,6 +1406,11 @@ parse_packet(NTP_Packet *packet, int length, NTP_PacketInfo *info) case NTP_EF_NTS_AUTH_AND_EEF: info->auth.mode = NTP_AUTH_NTS; break; + case NTP_EF_EXP1: + if (ef_body_length == sizeof (NTP_ExtFieldExp1) && + ntohl(((NTP_ExtFieldExp1 *)ef_body)->magic) == NTP_EF_EXP1_MAGIC) + info->ext_field_flags |= NTP_EF_FLAG_EXP1; + break; default: DEBUG_LOG("Unknown extension field type=%x", (unsigned int)ef_type); }