root/src/add-ons/kernel/drivers/hyperv/hyperv_ic/timesync/TimeSyncProtocol.h
/*
 * Copyright 2026 John Davis. All rights reserved.
 * Distributed under the terms of the MIT License.
 */
#ifndef _HYPERV_TIMESYNC_PROTOCOL_H_
#define _HYPERV_TIMESYNC_PROTOCOL_H_


#include "ICProtocol.h"


#define HV_TIMESYNC_RING_SIZE           0x1000
#define HV_TIMESYNC_PKT_BUFFER_SIZE     128


// Time sync versions
#define HV_TIMESYNC_VERSION_V1_0        MAKE_IC_VERSION(1, 0)
#define HV_TIMESYNC_VERSION_V3_0        MAKE_IC_VERSION(3, 0)
#define HV_TIMESYNC_VERSION_V4_0        MAKE_IC_VERSION(4, 0)


static const uint32 hv_timesync_versions[] = {
        HV_TIMESYNC_VERSION_V4_0,
        HV_TIMESYNC_VERSION_V3_0,
        HV_TIMESYNC_VERSION_V1_0
};
static const uint32 hv_timesync_version_count = sizeof(hv_timesync_versions)
        / sizeof(hv_timesync_versions[0]);


#define HV_TIMESYNC_TIME_BASE           116444736000000000ULL

// Time sync message flags
#define HV_TIMESYNC_MSGFLAGS_SYNC               (1 << 0)
#define HV_TIMESYNC_MSGFLAGS_SAMPLE             (1 << 1)


// Time sync message (versions 1 and 3)
typedef struct {
        hv_ic_msg_header header;

        uint64  parent_time;
        uint64  child_time;
        uint64  round_trip_time;
        uint8   flags;
} _PACKED hv_timesync_msg_v1;


// Time sync message (version 4)
typedef struct {
        hv_ic_msg_header header;

        uint64  parent_time;
        uint64  reference_time;
        uint8   flags;
        uint8   leap_flags;
        uint8   stratum;
        uint8   reserved[3];
} _PACKED hv_timesync_msg_v4;