Documentation ¶
Overview ¶
Index ¶
Constants ¶
const JAN_1970 = 2208988800
JAN_1970 is the Unix Epoch in NTP Seconds (1970 - 1900)
Variables ¶
This section is empty.
Functions ¶
Types ¶
type Header ¶
type Header struct { LeapIndicator LeapIndicator // 2 bits VersionNumber VersionNumber // 3 bits Mode Mode // 3 bits Stratum uint8 Poll int8 Precision int8 RootDelay Short RootDispersion Short ReferenceId [4]byte ReferenceTimestamp Timestamp OriginTimestamp Timestamp ReceiveTimestamp Timestamp TransmitTimestamp Timestamp }
NTP Packet Header Format
0 1 2 3 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 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |LI | VN |Mode | Stratum | Poll | Precision | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Root Delay | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Root Dispersion | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Reference ID | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | + Reference Timestamp (64) + | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | + Origin Timestamp (64) + | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | + Receive Timestamp (64) + | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | + Transmit Timestamp (64) + | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | . . . Extension Field 1 (variable) . . . | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | . . . Extension Field 2 (variable) . . . | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Key Identifier | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | | dgst (128) | | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
func (*Header) MarshalBinary ¶
func (*Header) UnmarshalBinary ¶
type LeapIndicator ¶
type LeapIndicator byte
LeapIndicator (LI): 2-bit integer warning of an impending leap second to be inserted or deleted in the last minute of the current month.
const ( LEAP_NONE LeapIndicator = iota LEAP_ADD // last minute of the day has 61 seconds LEAP_SUB // last minute of the day has 59 seconds LEAP_NOSYNC // unknown (clock unsynchronized) )
func (LeapIndicator) String ¶
func (i LeapIndicator) String() string
type Server ¶
type Server struct { net.PacketConn // contains filtered or unexported fields }
A simple NTP server intended for testing. It can serve time at some offset from the real time and adjust for a single leap second.
func (*Server) SetLeapSecond ¶
func (s *Server) SetLeapSecond(second time.Time, direction LeapIndicator)
Must be exactly midnight on the first day of the month. This is the first time that is always valid after the leap has occurred for both adding and removing a second. This is the same way leap seconds are officially listed. https://www.ietf.org/timezones/data/leap-seconds.list
func (*Server) UpdateOffset ¶
Get the current offset between real time and the server's time, adjusting for a leap second as needed. now is real time, not server time.
type Short ¶
NTP Short Format
0 1 2 3 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 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Seconds | Fraction | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
type Timestamp ¶
NTP Timestamp Format
0 1 2 3 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 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Seconds | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Fraction | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
func NewTimestamp ¶
NewTimestamp converts from Go's Time to NTP's 64-bit Timestamp format.
type VersionNumber ¶
type VersionNumber byte
VersionNumber (VN): 3-bit integer representing the NTP version number, currently 4.
const NTPv4 VersionNumber = 4
func (VersionNumber) String ¶
func (i VersionNumber) String() string
Notes ¶
Bugs ¶
Since our clock source is UTC instead of TAI or some type of monotonic clock, trying to use this server during a real leap second will lead to incorrect results. Timekeeping sucks.
We doesn't account for the possibility of UpdateOffset behaving differently for the transmit time instead of the received time. No idea what the correct behavior is.