The 1588 defined computation using variable names from this project is: D = [(t4 - t1) - (t3 - t2) - c1 - c2]/2
The existing code combines the corrections into a variable t3c which we can get the value of by isolating t3, c1 and c2: t3c = t3 + c1 + c2 The 802.1AS defined computation is: D = [(t4 - t1) - (t3 - t2) + c1 - c2]/2 Again, isolating t3, c1 and c2 for 802.1AS: t3c = t3 + c2 - c1 If the ptp profile configured matches 802.1AS, then this patch will compute t3c based on the 802.1AS equation instead of the 1588 version. This has been tested against the MOTU Switch based on the KSZ9567 with non-zero correction fields based on the 802.1AS equation as well as MOTU audio interfaces that don't utilize the correction fields. Signed-off-by: Dylan Robinson <dylan_robin...@motu.com> --- port.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/port.c b/port.c index d551bef..72a92e5 100644 --- a/port.c +++ b/port.c @@ -2433,7 +2433,16 @@ static void port_peer_delay(struct port *p) t3 = timestamp_to_tmv(fup->ts.pdu); c2 = correction_to_tmv(fup->header.correction); calc: - t3c = tmv_add(t3, tmv_add(c1, c2)); + /* 802.1AS specifies the peer delay computation differently than 1588. Do + * the 802.1AS computation when transportSpecific is 1 (in top nibble) and + * the clock domain is 0. If ptp_header.reserved1 (aka minorSdoId) becomes + * configurable, this should also check that it is 0. */ + if ((p->transportSpecific == (1 << 4)) && + (clock_domain_number(p->clock) == 0)) { + t3c = tmv_add(t3, tmv_sub(c2, c1)); + } else { + t3c = tmv_add(t3, tmv_add(c1, c2)); + } if (p->follow_up_info) port_nrate_calculate(p, t3c, t4); -- 2.30.2 _______________________________________________ Linuxptp-devel mailing list Linuxptp-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linuxptp-devel