in cmd/ntpcheck/checker/peer.go [85:162]
func NewPeerFromNTP(p *control.NTPControlMsg) (*Peer, error) {
psWord, err := p.GetPeerStatus()
if err != nil {
return nil, err
}
m, err := p.GetAssociationInfo()
if err != nil {
return nil, err
}
var reach, flash uint16
// data comes as k=v pairs in packet, and those kv pairs are parsed by GetAssociationInfo.
// If data is severely corrupted GetAssociationInfo will return error.
// It's ok to have some fields missing, thus we don't check for errors below.
leap, _ := strconv.Atoi(m["leap"])
unreach, _ := strconv.Atoi(m["unreach"])
pmode, _ := strconv.Atoi(m["pmode"])
hpoll, _ := strconv.Atoi(m["hpoll"])
offset, _ := strconv.ParseFloat(m["offset"], 64)
dispersion, _ := strconv.ParseFloat(m["dispersion"], 64)
dstport, _ := strconv.Atoi(m["dstport"])
fmt.Sscan(m["reach"], &reach)
ppoll, _ := strconv.Atoi(m["ppoll"])
headway, _ := strconv.Atoi(m["headway"])
fmt.Sscan(m["flash"], &flash)
jitter, _ := strconv.ParseFloat(m["jitter"], 64)
rootdelay, _ := strconv.ParseFloat(m["rootdelay"], 64)
precision, _ := strconv.Atoi(m["precision"])
delay, _ := strconv.ParseFloat(m["delay"], 64)
stratum, _ := strconv.Atoi(m["stratum"])
hmode, _ := strconv.Atoi(m["hmode"])
srcport, _ := strconv.Atoi(m["srcport"])
xleave, _ := strconv.ParseFloat(m["xleave"], 64)
rootdisp, _ := strconv.ParseFloat(m["rootdisp"], 64)
peer := Peer{
// from PeerStatusWord
Configured: psWord.PeerStatus.Configured,
AuthPossible: psWord.PeerStatus.AuthEnabled,
Authentic: psWord.PeerStatus.AuthOK,
Reachable: psWord.PeerStatus.Reachable,
Broadcast: psWord.PeerStatus.Broadcast,
Selection: psWord.PeerSelection,
Condition: control.PeerSelect[psWord.PeerSelection],
// from variables
Leap: leap,
Unreach: unreach,
PMode: pmode,
HPoll: hpoll,
DSTAdr: m["dstadr"],
Rec: m["rec"],
FiltOffset: m["filtoffset"],
RefTime: m["reftime"],
Offset: offset,
FiltDisp: m["filtdisp"],
SRCAdr: m["srcadr"],
Dispersion: dispersion,
DSTPort: dstport,
RefID: m["refid"],
Reach: uint8(reach),
PPoll: ppoll,
Headway: headway,
Flash: uint16(flash),
Flashers: control.ReadFlashStatusWord(uint16(flash)),
Jitter: jitter,
RootDelay: rootdelay,
Precision: precision,
Delay: delay,
Stratum: stratum,
HMode: hmode,
FiltDelay: m["filtdelay"],
SRCPort: srcport,
Xleave: xleave,
RootDisp: rootdisp,
}
if err := sanityCheckPeerVars(&peer); err != nil {
return nil, err
}
return &peer, nil
}