in cmd/ptpcheck/checker/checker.go [45:106]
func Run(c *ptp.MgmtClient) (*PTPCheckResult, error) {
var err error
currentDataSet, err := c.CurrentDataSet()
if err != nil {
return nil, err
}
log.Debugf("CurrentDataSet: %+v", currentDataSet)
defaultDataSet, err := c.DefaultDataSet()
if err != nil {
return nil, err
}
log.Debugf("DefaultDataSet: %+v", defaultDataSet)
parentDataSet, err := c.ParentDataSet()
if err != nil {
return nil, err
}
log.Debugf("ParentDataSet: %+v", parentDataSet)
/* gmPresent calculation from non-standard TIME_STATUS_NP
if (cid_eq(&c->dad.pds.grandmasterIdentity, &c->dds.clockIdentity))
tsn->gmPresent = 0;
else
tsn->gmPresent = 1;
where dad.pds is PARENT_DATA_SET and dds is DEFAULT_DATA_SET
*/
gmPresent := defaultDataSet.ClockIdentity != parentDataSet.GrandmasterIdentity
result := &PTPCheckResult{
OffsetFromMasterNS: currentDataSet.OffsetFromMaster.Nanoseconds(),
GrandmasterPresent: gmPresent,
MeanPathDelayNS: currentDataSet.MeanPathDelay.Nanoseconds(),
StepsRemoved: int(currentDataSet.StepsRemoved),
ClockIdentity: defaultDataSet.ClockIdentity.String(),
GrandmasterIdentity: parentDataSet.GrandmasterIdentity.String(),
PortStatsTX: map[string]uint64{},
PortStatsRX: map[string]uint64{},
}
portStats, err := c.PortStatsNP()
// it's a non-standard ptp4l thing, might be missing
if err != nil {
log.Warningf("couldn't get PortStatsNP: %v", err)
} else {
log.Debugf("PortStatsNP: %+v", portStats)
for k, v := range ptp.MessageTypeToString {
result.PortStatsRX[v] = portStats.PortStats.RXMsgType[k]
result.PortStatsTX[v] = portStats.PortStats.TXMsgType[k]
}
}
timeStatus, err := c.TimeStatusNP()
// it's a non-standard ptp4l thing, might be missing
if err != nil {
log.Warningf("couldn't get TimeStatusNP: %v", err)
} else {
log.Debugf("TimeStatusNP: %+v", timeStatus)
result.IngressTimeNS = timeStatus.IngressTimeNS
}
return result, nil
}