/* Non-authentication extension fields and corresponding internal flags */
#define NTP_EF_EXP_MONO_ROOT 0xF323
+#define NTP_EF_EXP_NET_CORRECTION 0xF324
#define NTP_EF_FLAG_EXP_MONO_ROOT 0x1
+#define NTP_EF_FLAG_EXP_NET_CORRECTION 0x2
/* Pre-NTPv5 experimental extension field */
typedef struct {
#define NTP_EF_EXP_MONO_ROOT_MAGIC 0xF5BEDD9AU
+/* Experimental extension field to provide PTP corrections */
+typedef struct {
+ uint32_t magic;
+ NTP_int64 correction;
+ uint32_t reserved[3];
+} NTP_EFExpNetCorrection;
+
+#define NTP_EF_EXP_NET_CORRECTION_MAGIC 0x07AC2CEBU
+
/* Authentication extension fields */
#define NTP_EF_NTS_UNIQUE_IDENTIFIER 0x0104
assert(offsetof(NTP_Packet, transmit_ts) == 40);
assert(sizeof (NTP_EFExpMonoRoot) == 24);
+ assert(sizeof (NTP_EFExpNetCorrection) == 24);
}
/* ================================================== */
NTP_EF_EXP_MONO_ROOT_MAGIC))
info->ext_field_flags |= NTP_EF_FLAG_EXP_MONO_ROOT;
break;
+ case NTP_EF_EXP_NET_CORRECTION:
+ if (is_exp_ef(ef_body, ef_body_length, sizeof (NTP_EFExpNetCorrection),
+ NTP_EF_EXP_NET_CORRECTION_MAGIC))
+ info->ext_field_flags |= NTP_EF_FLAG_EXP_NET_CORRECTION;
+ break;
default:
DEBUG_LOG("Unknown extension field type=%x", (unsigned int)ef_type);
}