From 0f3c5c51e5ce447a0881f70f0f4cb44094707493 Mon Sep 17 00:00:00 2001 From: Miroslav Lichvar Date: Tue, 30 Jan 2024 09:49:16 +0100 Subject: [PATCH] fix ts2phc to handle large NMEA delay (RHEL-29737) Resolves: RHEL-29737 --- linuxptp-nmeadelay.patch | 29 +++++++++++++++++++++++++++++ linuxptp.spec | 2 ++ 2 files changed, 31 insertions(+) create mode 100644 linuxptp-nmeadelay.patch diff --git a/linuxptp-nmeadelay.patch b/linuxptp-nmeadelay.patch new file mode 100644 index 0000000..b06c7c1 --- /dev/null +++ b/linuxptp-nmeadelay.patch @@ -0,0 +1,29 @@ +commit 0404c1924254c9162222dd5000a140165d21250c +Author: Miroslav Lichvar +Date: Thu Jan 25 15:23:44 2024 +0100 + + ts2phc: Fix offset for NMEA delays over 0.5 seconds. + + The current code of ts2phc assumes that the NMEA RMC message is received + within 0.5 seconds of the pulse the timestamp in the message is refering + to. However, with most receivers NMEA messages are referenced to the + previous pulse. This causes a 1-second error in the measured offset for + receivers with delays over 0.5 seconds. + + Add a 0.5 second correction to map the whole interval between pulses to + the preceding pulse. + + Signed-off-by: Miroslav Lichvar + +diff --git a/ts2phc_nmea_pps_source.c b/ts2phc_nmea_pps_source.c +index 3a4267d..274b70a 100644 +--- a/ts2phc_nmea_pps_source.c ++++ b/ts2phc_nmea_pps_source.c +@@ -191,6 +191,7 @@ static int ts2phc_nmea_pps_source_getppstime(struct ts2phc_pps_source *src, + return -1; + } + rmc = tmv_add(rmc, duration_since_rmc); ++ rmc = tmv_add(rmc, nanoseconds_to_tmv(500000000)); + utc_time = tmv_to_nanoseconds(rmc); + utc_time /= (int64_t) 1000000000; + *ts = tmv_to_timespec(rmc); diff --git a/linuxptp.spec b/linuxptp.spec index 0715822..c2db936 100644 --- a/linuxptp.spec +++ b/linuxptp.spec @@ -33,6 +33,8 @@ Patch1: linuxptp-ucastrate.patch Patch2: linuxptp-subscribe.patch # fix loading and reloading of leapfile Patch3: linuxptp-lstab.patch +# fix ts2phc to handle large NMEA delay +Patch4: linuxptp-nmeadelay.patch BuildRequires: gcc gcc-c++ make systemd