in ptp/simpleclient/measurements.go [100:138]
func (m *measurements) latest() (*MeasurementResult, error) {
var lastServerToClient *mData
var lastClientToServer *mData
for _, v := range m.serverToClient {
if v.receiveTS.IsZero() || v.sendTS.IsZero() {
continue
}
if lastServerToClient == nil || v.receiveTS.After(lastServerToClient.receiveTS) {
lastServerToClient = v
}
}
for _, v := range m.clientToServer {
if v.receiveTS.IsZero() || v.sendTS.IsZero() {
continue
}
if lastClientToServer == nil || v.receiveTS.After(lastClientToServer.receiveTS) {
lastClientToServer = v
}
}
if lastServerToClient == nil {
return nil, fmt.Errorf("no sync/followup data yet")
}
if lastClientToServer == nil {
return nil, fmt.Errorf("no delay data yet")
}
clientToServerDiff := lastClientToServer.receiveTS.Sub(lastClientToServer.sendTS)
serverToClientDiff := lastServerToClient.receiveTS.Sub(lastServerToClient.sendTS)
delay := (clientToServerDiff + serverToClientDiff) / 2
offset := serverToClientDiff - delay
// or this expression of same formula
// offset := (serverToClientDiff - clientToServerDiff)/2
return &MeasurementResult{
Delay: delay,
Offset: offset,
ServerToClientDiff: serverToClientDiff,
ClientToServerDiff: clientToServerDiff,
Timestamp: lastClientToServer.receiveTS,
}, nil
}