in cmd/ptpcheck/cmd/sources.go [44:125]
func sourcesRun(server string, noDNS bool) error {
c, cleanup, err := checker.PrepareClient(server)
defer cleanup()
if err != nil {
return fmt.Errorf("preparing connection: %w", err)
}
ppn, err := c.PortPropertiesNP()
if err != nil {
return fmt.Errorf("getting PORT_PROPERTIES_NP from ptp4l: %w", err)
}
cds, err := c.CurrentDataSet()
if err != nil {
return fmt.Errorf("getting CURRENT_DATA_SET from ptp4l: %w", err)
}
tsn, err := c.TimeStatusNP()
if err != nil {
return fmt.Errorf("getting TIME_STATUS_NP from ptp4l: %w", err)
}
tlv, err := c.UnicastMasterTableNP()
if err != nil {
return fmt.Errorf("getting UNICAST_MASTER_TABLE_NP from ptp4l: %w", err)
}
// obtain time from clock that ptp4l uses
var currentTime time.Time
if ppn.Timestamping == ptp.TimestampingHardware {
currentTime, err = phc.Time(string(ppn.Interface), phc.MethodIoctlSysOffsetExtended)
if err != nil {
log.Errorf("No PHC time data available: %v", err)
}
} else {
currentTime = time.Now()
}
table := tablewriter.NewWriter(os.Stdout)
table.SetColWidth(20)
table.SetHeader([]string{
"selected", "identity", "address", "state", "clock", "variance", "p1:p2", "offset(ns)", "delay(ns)", "last sync",
})
for _, entry := range tlv.UnicastMasterTable.UnicastMasters {
address := entry.Address.String()
if !noDNS {
names, err := net.LookupAddr(address)
if err == nil && len(names) > 0 {
address = names[0]
}
}
val := []string{
fmt.Sprintf("%v", entry.Selected),
entry.PortIdentity.String(),
address,
entry.PortState.String(),
}
if entry.PortState != ptp.UnicastMasterStateWait {
val = append(val, []string{
fmt.Sprintf("%d:0x%x", entry.ClockQuality.ClockClass, entry.ClockQuality.ClockAccuracy),
fmt.Sprintf("0x%x", entry.ClockQuality.OffsetScaledLogVariance),
fmt.Sprintf("%d:%d", entry.Priority1, entry.Priority2),
}...)
} else {
val = append(val, []string{"", "", ""}...)
}
if entry.Selected {
lastSync := "unknown"
if tsn.IngressTimeNS == 0 {
lastSync = "not syncing"
} else if !currentTime.IsZero() {
since := currentTime.Sub(time.Unix(0, tsn.IngressTimeNS))
lastSync = fmt.Sprintf("%v", since)
}
val = append(val, []string{
fmt.Sprintf("%3.f", cds.OffsetFromMaster.Nanoseconds()),
fmt.Sprintf("%3.f", cds.MeanPathDelay.Nanoseconds()),
lastSync,
}...)
} else {
val = append(val, []string{"", "", ""}...)
}
table.Append(val)
}
table.Render()
return nil
}