in cmd/ntpcheck/checker/peer.go [175:230]
func NewPeerFromChrony(s *chrony.ReplySourceData, p *chrony.ReplyNTPData) (*Peer, error) {
if s == nil {
return nil, fmt.Errorf("no ReplySourceData to create Peer")
}
// clear auth and interlieved flag
flash := s.Flags & chrony.NTPFlagsTests
// don't report all flashers if peer is unreachable
if flash > 0 {
flash ^= chrony.NTPFlagsTests // negate bits as original NTPD flashers have opposite meaning
}
// all NTP measures are in ms, and chrony reports all in seconds, thus secToMS everywhere
peer := Peer{
Configured: true,
AuthPossible: false,
Authentic: s.Flags&chrony.NTPFlagAuthenticated != 0,
Reachable: s.Reachability == 255, // all 8 attempts
Broadcast: false,
Selection: chronyToPeerSelection[s.State],
Condition: chrony.SourceStateDesc[s.State],
Flash: flash,
Flashers: chrony.ReadNTPTestFlags(s.Flags),
Offset: -1 * secToMS(s.OrigLatestMeas), // sourceData offset and NTPData offset sign has opposite meaning
PPoll: int(s.Poll),
HPoll: int(s.Poll),
Stratum: int(s.Stratum),
SRCAdr: s.IPAddr.String(),
Reach: uint8(s.Reachability),
}
// populate data from ntpdata struct
if p != nil {
refID := chrony.RefidAsHEX(p.RefID)
// Only stratum 1 servers can have GPS or something else as string refID
if p.Stratum == 1 {
refIDStr := chrony.RefidToString(p.RefID)
if len(refIDStr) > 0 {
refID = refIDStr
}
}
peer.Leap = int(p.Leap)
peer.HPoll = int(p.Poll)
peer.DSTAdr = p.LocalAddr.String()
peer.RefTime = p.RefTime.String()
peer.Offset = secToMS(p.Offset)
peer.Dispersion = secToMS(p.PeerDispersion)
peer.DSTPort = int(p.RemotePort)
peer.RefID = refID
peer.PPoll = int(p.Poll)
peer.Jitter = secToMS(p.PeerDispersion) // best approx we have
peer.RootDelay = secToMS(p.RootDelay)
peer.Precision = int(p.Precision)
peer.Delay = secToMS(p.PeerDelay)
peer.RootDisp = secToMS(p.RootDispersion)
}
// no need for sanity check as we are not parsing k=v pairs in case of chrony proto
return &peer, nil
}