From 84aee09dd3c84a17f3b5ed5866e6d6a639439eb3 Mon Sep 17 00:00:00 2001 From: Miroslav Lichvar Date: Thu, 12 Sep 2024 12:20:31 +0200 Subject: [PATCH] update to 4.4 (RHEL-58213 RHEL-57040) Resolves: RHEL-58213 RHEL-57040 --- .gitignore | 6 +- linuxptp-addropts.patch | 176 ------------------- linuxptp-holdover.patch | 360 -------------------------------------- linuxptp-lstab.patch | 75 -------- linuxptp-nmeadelay.patch | 365 --------------------------------------- linuxptp-nmealeap.patch | 76 -------- linuxptp-nmeareset.patch | 25 --- linuxptp-ptpver.patch | 60 +++++-- linuxptp-subscribe.patch | 26 --- linuxptp.spec | 32 ++-- sources | 6 +- 11 files changed, 61 insertions(+), 1146 deletions(-) delete mode 100644 linuxptp-addropts.patch delete mode 100644 linuxptp-holdover.patch delete mode 100644 linuxptp-lstab.patch delete mode 100644 linuxptp-nmeadelay.patch delete mode 100644 linuxptp-nmealeap.patch delete mode 100644 linuxptp-nmeareset.patch delete mode 100644 linuxptp-subscribe.patch diff --git a/.gitignore b/.gitignore index bc3f565..a634ba2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ -/linuxptp-4.2.tgz -/linuxptp-testsuite-bf8ead.tar.gz -/clknetsim-5d1dc0.tar.gz +/linuxptp-4.4.tgz +/linuxptp-testsuite-d27dbd.tar.gz +/clknetsim-64df92.tar.gz diff --git a/linuxptp-addropts.patch b/linuxptp-addropts.patch deleted file mode 100644 index 65bd4ae..0000000 --- a/linuxptp-addropts.patch +++ /dev/null @@ -1,176 +0,0 @@ -commit 073faba77e8a82c54210941cee6023dc9e719329 -Author: Miroslav Lichvar -Date: Thu Apr 25 14:25:57 2024 +0200 - - udp+udp6: Make IP addresses configurable. - - Allow configuration of the multicast IPv4/IPv6 addresses, which can be - useful for testing. This complements the L2-specific ptp_dst_mac and - p2p_dst_mac options. - - [ RPC: removed unused #defines PTP_PRIMARY_MCAST_IPADDR and PTP_PDELAY_MCAST_IPADDR ] - - Signed-off-by: Miroslav Lichvar - Signed-off-by: Richard Cochran - -diff --git a/config.c b/config.c -index d7775c0..c220a3e 100644 ---- a/config.c -+++ b/config.c -@@ -299,6 +299,9 @@ struct config_item config_tab[] = { - GLOB_ITEM_INT("offsetScaledLogVariance", 0xffff, 0, UINT16_MAX), - PORT_ITEM_INT("operLogPdelayReqInterval", 0, INT8_MIN, INT8_MAX), - PORT_ITEM_INT("operLogSyncInterval", 0, INT8_MIN, INT8_MAX), -+ PORT_ITEM_STR("p2p_dst_ipv4", "224.0.0.107"), -+ PORT_ITEM_STR("p2p_dst_ipv6", "FF02:0:0:0:0:0:0:6B"), -+ PORT_ITEM_STR("p2p_dst_mac", "01:80:C2:00:00:0E"), - PORT_ITEM_INT("path_trace_enabled", 0, 0, 1), - PORT_ITEM_INT("phc_index", -1, -1, INT_MAX), - GLOB_ITEM_DBL("pi_integral_const", 0.0, 0.0, DBL_MAX), -@@ -317,8 +320,9 @@ struct config_item config_tab[] = { - GLOB_ITEM_INT("priority1", 128, 0, UINT8_MAX), - GLOB_ITEM_INT("priority2", 128, 0, UINT8_MAX), - GLOB_ITEM_STR("productDescription", ";;"), -+ PORT_ITEM_STR("ptp_dst_ipv4", "224.0.1.129"), -+ PORT_ITEM_STR("ptp_dst_ipv6", "FF0E:0:0:0:0:0:0:181"), - PORT_ITEM_STR("ptp_dst_mac", "01:1B:19:00:00:00"), -- PORT_ITEM_STR("p2p_dst_mac", "01:80:C2:00:00:0E"), - GLOB_ITEM_INT("ptp_minor_version", 0, 0, 1), - GLOB_ITEM_STR("refclock_sock_address", "/var/run/refclock.ptp.sock"), - GLOB_ITEM_STR("revisionData", ";;"), -diff --git a/configs/default.cfg b/configs/default.cfg -index 8f94c16..54ce62a 100644 ---- a/configs/default.cfg -+++ b/configs/default.cfg -@@ -94,6 +94,10 @@ write_phase_mode 0 - # Transport options - # - transportSpecific 0x0 -+ptp_dst_ipv4 224.0.1.129 -+p2p_dst_ipv4 224.0.0.107 -+ptp_dst_ipv6 FF0E:0:0:0:0:0:0:181 -+p2p_dst_ipv6 FF02:0:0:0:0:0:0:6B - ptp_dst_mac 01:1B:19:00:00:00 - p2p_dst_mac 01:80:C2:00:00:0E - udp_ttl 1 -diff --git a/ptp4l.8 b/ptp4l.8 -index c59b0b4..a4eb603 100644 ---- a/ptp4l.8 -+++ b/ptp4l.8 -@@ -397,6 +397,27 @@ This value may be changed dynamically using the - POWER_PROFILE_SETTINGS_NP management message. - The default is "none". - -+.TP -+.B ptp_dst_ipv4 -+The IPv4 address to which PTP messages should be sent. -+Relevant only with UDPv4 transport. The default is 224.0.1.129. -+ -+.TP -+.B p2p_dst_ipv4 -+The IPv4 address to which peer delay messages should be sent. -+Relevant only with UDPv4 transport. The default is 224.0.0.107. -+ -+.TP -+.B ptp_dst_ipv6 -+The IPv6 address to which PTP messages should be sent. -+The second byte of the address is substituted with udp6_scope. -+Relevant only with UDPv6 transport. The default is FF0E:0:0:0:0:0:0:181. -+ -+.TP -+.B p2p_dst_ipv6 -+The IPv6 address to which peer delay messages should be sent. -+Relevant only with UDPv6 transport. The default is FF02:0:0:0:0:0:0:6B. -+ - .TP - .B ptp_dst_mac - The MAC address to which PTP messages should be sent. -diff --git a/udp.c b/udp.c -index 7c9402e..38d0ec4 100644 ---- a/udp.c -+++ b/udp.c -@@ -39,8 +39,6 @@ - - #define EVENT_PORT 319 - #define GENERAL_PORT 320 --#define PTP_PRIMARY_MCAST_IPADDR "224.0.1.129" --#define PTP_PDELAY_MCAST_IPADDR "224.0.0.107" - - struct udp { - struct transport t; -@@ -157,6 +155,7 @@ static int udp_open(struct transport *t, struct interface *iface, - const char *name = interface_name(iface); - uint8_t event_dscp, general_dscp; - int efd, gfd, ttl; -+ char *str; - - ttl = config_get_int(t->cfg, name, "udp_ttl"); - udp->mac.len = 0; -@@ -165,11 +164,17 @@ static int udp_open(struct transport *t, struct interface *iface, - udp->ip.len = 0; - sk_interface_addr(name, AF_INET, &udp->ip); - -- if (!inet_aton(PTP_PRIMARY_MCAST_IPADDR, &mcast_addr[MC_PRIMARY])) -+ str = config_get_string(t->cfg, name, "ptp_dst_ipv4"); -+ if (!inet_aton(str, &mcast_addr[MC_PRIMARY])) { -+ pr_err("invalid ptp_dst_ipv4 %s", str); - return -1; -+ } - -- if (!inet_aton(PTP_PDELAY_MCAST_IPADDR, &mcast_addr[MC_PDELAY])) -+ str = config_get_string(t->cfg, name, "p2p_dst_ipv4"); -+ if (!inet_aton(str, &mcast_addr[MC_PDELAY])) { -+ pr_err("invalid p2p_dst_ipv4 %s", str); - return -1; -+ } - - efd = open_socket(name, mcast_addr, EVENT_PORT, ttl); - if (efd < 0) -diff --git a/udp6.c b/udp6.c -index bde1710..188d20e 100644 ---- a/udp6.c -+++ b/udp6.c -@@ -40,10 +40,6 @@ - #define EVENT_PORT 319 - #define GENERAL_PORT 320 - --/* The 0x0e in second byte is substituted with udp6_scope at runtime. */ --#define PTP_PRIMARY_MCAST_IP6ADDR "FF0E:0:0:0:0:0:0:181" --#define PTP_PDELAY_MCAST_IP6ADDR "FF02:0:0:0:0:0:0:6B" -- - enum { MC_PRIMARY, MC_PDELAY }; - - struct udp6 { -@@ -167,6 +163,7 @@ static int udp6_open(struct transport *t, struct interface *iface, - const char *name = interface_name(iface); - uint8_t event_dscp, general_dscp; - int efd, gfd, hop_limit; -+ char *str; - - hop_limit = config_get_int(t->cfg, name, "udp_ttl"); - udp6->mac.len = 0; -@@ -175,16 +172,20 @@ static int udp6_open(struct transport *t, struct interface *iface, - udp6->ip.len = 0; - sk_interface_addr(name, AF_INET6, &udp6->ip); - -- if (1 != inet_pton(AF_INET6, PTP_PRIMARY_MCAST_IP6ADDR, -- &udp6->mc6_addr[MC_PRIMARY])) -+ str = config_get_string(t->cfg, name, "ptp_dst_ipv6"); -+ if (1 != inet_pton(AF_INET6, str, &udp6->mc6_addr[MC_PRIMARY])) { -+ pr_err("invalid ptp_dst_ipv6 %s", str); - return -1; -+ } - - udp6->mc6_addr[MC_PRIMARY].s6_addr[1] = config_get_int(t->cfg, name, - "udp6_scope"); - -- if (1 != inet_pton(AF_INET6, PTP_PDELAY_MCAST_IP6ADDR, -- &udp6->mc6_addr[MC_PDELAY])) -+ str = config_get_string(t->cfg, name, "p2p_dst_ipv6"); -+ if (1 != inet_pton(AF_INET6, str, &udp6->mc6_addr[MC_PDELAY])) { -+ pr_err("invalid p2p_dst_ipv6 %s", str); - return -1; -+ } - - efd = open_socket_ipv6(name, udp6->mc6_addr, EVENT_PORT, &udp6->index, - hop_limit); diff --git a/linuxptp-holdover.patch b/linuxptp-holdover.patch deleted file mode 100644 index b6843d8..0000000 --- a/linuxptp-holdover.patch +++ /dev/null @@ -1,360 +0,0 @@ -commit c7acd4b5bdb95e45d93833ffaac9cac51dfe934b -Author: Miroslav Lichvar -Date: Thu May 16 15:52:48 2024 +0200 - - ts2phc: Avoid unnecessary call of getppstime(). - - Don't get the ToD timestamp for the pulse polarity detection if it won't - be needed (i.e. extts_polarity is not "both"). This allows PPS - timestamps to be saved even when the ToD source fails. - - Signed-off-by: Miroslav Lichvar - -diff --git a/ts2phc_pps_sink.c b/ts2phc_pps_sink.c -index 0d399b8..76912a2 100644 ---- a/ts2phc_pps_sink.c -+++ b/ts2phc_pps_sink.c -@@ -277,21 +277,22 @@ static enum extts_result ts2phc_pps_sink_event(struct ts2phc_private *priv, - goto out; - } - -- err = ts2phc_pps_source_getppstime(priv->src, &source_ts); -- if (err < 0) { -- pr_debug("source ts not valid"); -- return 0; -- } -- -- if (sink->polarity == (PTP_RISING_EDGE | PTP_FALLING_EDGE) && -- ts2phc_pps_sink_ignore(priv, sink, source_ts)) { -+ if (sink->polarity == (PTP_RISING_EDGE | PTP_FALLING_EDGE)) { -+ err = ts2phc_pps_source_getppstime(priv->src, &source_ts); -+ if (err < 0) { -+ pr_debug("source ts not valid"); -+ return 0; -+ } - -- pr_debug("%s SKIP extts index %u at %lld.%09u src %" PRIi64 ".%ld", -- sink->name, event.index, event.t.sec, event.t.nsec, -- (int64_t) source_ts.tv_sec, source_ts.tv_nsec); -+ if (ts2phc_pps_sink_ignore(priv, sink, source_ts)) { -+ pr_debug("%s SKIP extts index %u at %lld.%09u src %" PRIi64 ".%ld", -+ sink->name, event.index, event.t.sec, -+ event.t.nsec, (int64_t)source_ts.tv_sec, -+ source_ts.tv_nsec); - -- result = EXTTS_IGNORE; -- goto out; -+ result = EXTTS_IGNORE; -+ goto out; -+ } - } - - out: - -commit 9880cccc928351a42a3fa9e018949442aca7ddae -Author: Miroslav Lichvar -Date: Thu May 16 15:52:49 2024 +0200 - - ts2phc: Add holdover support. - - If the external PPS signal is generated by a clock with better long-term - stability than the clock synchronizing to it, it can work as a good time - source for some period of time after losing its own time source (e.g. - GPS receiver losing its signal). - - Add an option to specify a holdover interval where ts2phc can continue - synchronizing the clock without any ToD information. Allow that only in - the LOCKED_STABLE servo state, which needs to be enabled by the - servo_num_offset_values option. - - This is supported only in the non-automatic mode and when the pulse - polarity detection is disabled. - - Signed-off-by: Miroslav Lichvar - -diff --git a/config.c b/config.c -index c220a3e..58481db 100644 ---- a/config.c -+++ b/config.c -@@ -344,6 +344,7 @@ struct config_item config_tab[] = { - PORT_ITEM_INT("ts2phc.channel", 0, 0, INT_MAX), - PORT_ITEM_INT("ts2phc.extts_correction", 0, INT_MIN, INT_MAX), - PORT_ITEM_ENU("ts2phc.extts_polarity", PTP_RISING_EDGE, extts_polarity_enu), -+ PORT_ITEM_INT("ts2phc.holdover", 0, 0, INT_MAX), - PORT_ITEM_INT("ts2phc.master", 0, 0, 1), - PORT_ITEM_INT("ts2phc.nmea_baudrate", 9600, 300, INT_MAX), - GLOB_ITEM_STR("ts2phc.nmea_remote_host", ""), -diff --git a/ts2phc.8 b/ts2phc.8 -index 852a527..bcc6f61 100644 ---- a/ts2phc.8 -+++ b/ts2phc.8 -@@ -168,6 +168,16 @@ by changing the clock frequency instead of stepping the clock. When - set to 0.0, the servo will never step the clock except on start. - The default is 0.0. - -+.TP -+.B ts2phc.holdover -+The holdover interval, specified in seconds. When the ToD information stops -+working (e.g. GNSS receiver lost its fix), ts2phc is allowed for the specified -+interval to continue synchronizing the target clock as long as the servo is in -+the SERVO_LOCKED_STABLE state. The servo state needs be enabled by the -+\fBservo_num_offset_values\fP option. The holdover is not supported with the -+\fB-a\fP option and when \fBts2phc.extts_polarity\fP is set to \fIboth\fP. -+The default is 0 (disabled). -+ - .TP - .B ts2phc.nmea_remote_host, ts2phc.nmea_remote_port - Specifies the remote host providing ToD information when using the -diff --git a/ts2phc.c b/ts2phc.c -index 4817c85..d552e0f 100644 ---- a/ts2phc.c -+++ b/ts2phc.c -@@ -440,9 +440,10 @@ static int ts2phc_pps_source_implicit_tstamp(struct ts2phc_private *priv, - - static void ts2phc_synchronize_clocks(struct ts2phc_private *priv, int autocfg) - { -+ struct timespec source_ts, now; - tmv_t source_tmv; - struct ts2phc_clock *c; -- int valid, err; -+ int holdover, valid; - - if (autocfg) { - if (!priv->ref_clock) { -@@ -456,9 +457,20 @@ static void ts2phc_synchronize_clocks(struct ts2phc_private *priv, int autocfg) - return; - } - } else { -- err = ts2phc_pps_source_implicit_tstamp(priv, &source_tmv); -- if (err < 0) -+ valid = !ts2phc_pps_source_implicit_tstamp(priv, &source_tmv); -+ } -+ -+ if (valid) { -+ priv->holdover_start = 0; -+ holdover = 0; -+ } else { -+ clock_gettime(CLOCK_MONOTONIC, &now); -+ -+ if (!priv->holdover_start) -+ priv->holdover_start = now.tv_sec; -+ if (now.tv_sec >= priv->holdover_start + priv->holdover_length) - return; -+ holdover = 1; - } - - LIST_FOREACH(c, &priv->clocks, list) { -@@ -475,6 +487,16 @@ static void ts2phc_synchronize_clocks(struct ts2phc_private *priv, int autocfg) - continue; - } - -+ if (holdover) { -+ if (c->servo_state != SERVO_LOCKED_STABLE) -+ continue; -+ source_ts = tmv_to_timespec(ts); -+ if (source_ts.tv_nsec > NS_PER_SEC / 2) -+ source_ts.tv_sec++; -+ source_ts.tv_nsec = 0; -+ source_tmv = timespec_to_tmv(source_ts); -+ } -+ - offset = tmv_to_nanoseconds(tmv_sub(ts, source_tmv)); - - if (c->no_adj) { -@@ -486,8 +508,15 @@ static void ts2phc_synchronize_clocks(struct ts2phc_private *priv, int autocfg) - adj = servo_sample(c->servo, offset, tmv_to_nanoseconds(ts), - SAMPLE_WEIGHT, &c->servo_state); - -- pr_info("%s offset %10" PRId64 " s%d freq %+7.0f", -- c->name, offset, c->servo_state, adj); -+ if (holdover && c->servo_state != SERVO_LOCKED_STABLE) { -+ pr_info("%s lost holdover lock (offset %10" PRId64 ")", -+ c->name, offset); -+ continue; -+ } -+ -+ pr_info("%s offset %10" PRId64 " s%d freq %+7.0f%s", -+ c->name, offset, c->servo_state, adj, -+ holdover ? " holdover" : ""); - - switch (c->servo_state) { - case SERVO_UNLOCKED: -@@ -751,6 +780,9 @@ int main(int argc, char *argv[]) - return -1; - } - -+ priv.holdover_length = config_get_int(cfg, NULL, "ts2phc.holdover"); -+ priv.holdover_start = 0; -+ - while (is_running()) { - struct ts2phc_clock *c; - -diff --git a/ts2phc.h b/ts2phc.h -index 4833ded..5dbde9b 100644 ---- a/ts2phc.h -+++ b/ts2phc.h -@@ -55,6 +55,8 @@ struct ts2phc_private { - bool state_changed; - LIST_HEAD(port_head, ts2phc_port) ports; - LIST_HEAD(clock_head, ts2phc_clock) clocks; -+ int holdover_length; -+ time_t holdover_start; - }; - - struct ts2phc_clock *ts2phc_clock_add(struct ts2phc_private *priv, -commit bf237fd55d4983a42d9344890dd861f18bea70ca -Author: Miroslav Lichvar -Date: Thu Jul 25 12:43:59 2024 +0200 - - ts2phc: Describe servo options in man page. - - Copy and adapt missing servo options used by ts2phc from the ptp4l man - page. - - Signed-off-by: Miroslav Lichvar - -diff --git a/ts2phc.8 b/ts2phc.8 -index bcc6f61..4c54576 100644 ---- a/ts2phc.8 -+++ b/ts2phc.8 -@@ -117,6 +117,16 @@ command line option. - - .SH GLOBAL OPTIONS - -+.TP -+.B clock_servo -+The servo which is used to synchronize the local clock. Valid values -+are "pi" for a PI controller, "linreg" for an adaptive controller -+using linear regression, "ntpshm" and "refclock_sock" for the NTP SHM and -+chrony SOCK reference clocks respectively to allow another process to -+synchronize the local clock, and "nullf" for a servo that always dials -+frequency offset zero (for use in SyncE nodes). -+The default is "pi". -+ - .TP - .B first_step_threshold - The maximum offset, specified in seconds, that the servo will correct by -@@ -162,12 +172,64 @@ with the log level of the message as a number. The default is an empty string - argument). - - .TP --.B step_threshold --The maximum offset, specified in seconds, that the servo will correct --by changing the clock frequency instead of stepping the clock. When --set to 0.0, the servo will never step the clock except on start. -+.B ntpshm_segment -+The number of the SHM segment used by ntpshm servo. -+The default is 0. -+ -+.TP -+.B pi_integral_const -+The integral constant of the PI controller. When set to 0.0, the -+integral constant will be set by the following formula from the current -+sync interval. -+The default is 0.0. -+ -+ki = min(ki_scale * sync^ki_exponent, ki_norm_max / sync) -+ -+.TP -+.B pi_integral_exponent -+The ki_exponent constant in the formula used to set the integral constant of -+the PI controller from the sync interval. -+The default is 0.4. -+ -+.TP -+.B pi_integral_norm_max -+The ki_norm_max constant in the formula used to set the integral constant of -+the PI controller from the sync interval. -+The default is 0.3. -+ -+.TP -+.B pi_integral_scale -+The ki_scale constant in the formula used to set the integral constant of -+the PI controller from the sync interval. -+The default is 0.3. -+ -+.TP -+.B pi_proportional_const -+The proportional constant of the PI controller. When set to 0.0, the -+proportional constant will be set by the following formula from the current -+sync interval. - The default is 0.0. - -+kp = min(kp_scale * sync^kp_exponent, kp_norm_max / sync) -+ -+.TP -+.B pi_proportional_exponent -+The kp_exponent constant in the formula used to set the proportional constant of -+the PI controller from the sync interval. -+The default is \-0.3. -+ -+.TP -+.B pi_proportional_norm_max -+The kp_norm_max constant in the formula used to set the proportional constant of -+the PI controller from the sync interval. -+The default is 0.7 -+ -+.TP -+.B pi_proportional_scale -+The kp_scale constant in the formula used to set the proportional constant of -+the PI controller from the sync interval. -+The default is 0.7. -+ - .TP - .B ts2phc.holdover - The holdover interval, specified in seconds. When the ToD information stops -@@ -178,6 +240,28 @@ the SERVO_LOCKED_STABLE state. The servo state needs be enabled by the - \fB-a\fP option and when \fBts2phc.extts_polarity\fP is set to \fIboth\fP. - The default is 0 (disabled). - -+.TP -+.B servo_num_offset_values -+The number of offset values considered in order to transition from the -+SERVO_LOCKED to the SERVO_LOCKED_STABLE state. -+The transition occurs once the last 'servo_num_offset_values' offsets -+are all below the 'servo_offset_threshold' value. -+The default value is 10. -+ -+.TP -+.B servo_offset_threshold -+The offset threshold used in order to transition from the SERVO_LOCKED -+to the SERVO_LOCKED_STABLE state. The transition occurs once the -+last 'servo_num_offset_values' offsets are all below the threshold value. -+The default value of offset_threshold is 0 (disabled). -+ -+.TP -+.B step_threshold -+The maximum offset, specified in seconds, that the servo will correct -+by changing the clock frequency instead of stepping the clock. When -+set to 0.0, the servo will never step the clock except on start. -+The default is 0.0. -+ - .TP - .B ts2phc.nmea_remote_host, ts2phc.nmea_remote_port - Specifies the remote host providing ToD information when using the - -commit 7734d2fe8ac52afaa233262548615f79021ae6ee -Author: Miroslav Lichvar -Date: Thu Jul 25 12:46:43 2024 +0200 - - ts2phc: Fix description of holdover option in man page. - - Fix the man page to explain that the LOCKED_STABLE servo state is - enabled by setting the servo_offset_threshold, not - servo_num_offset_values, which is already enabled by default. - - Signed-off-by: Miroslav Lichvar - -diff --git a/ts2phc.8 b/ts2phc.8 -index 4c54576..c0b718b 100644 ---- a/ts2phc.8 -+++ b/ts2phc.8 -@@ -236,7 +236,7 @@ The holdover interval, specified in seconds. When the ToD information stops - working (e.g. GNSS receiver lost its fix), ts2phc is allowed for the specified - interval to continue synchronizing the target clock as long as the servo is in - the SERVO_LOCKED_STABLE state. The servo state needs be enabled by the --\fBservo_num_offset_values\fP option. The holdover is not supported with the -+\fBservo_offset_threshold\fP option. The holdover is not supported with the - \fB-a\fP option and when \fBts2phc.extts_polarity\fP is set to \fIboth\fP. - The default is 0 (disabled). - diff --git a/linuxptp-lstab.patch b/linuxptp-lstab.patch deleted file mode 100644 index b5c5465..0000000 --- a/linuxptp-lstab.patch +++ /dev/null @@ -1,75 +0,0 @@ -commit bbfaa1e253b889aeea97702bbbc87e731e0caf87 -Author: Miroslav Lichvar -Date: Thu Feb 22 13:51:59 2024 +0100 - - lstab: Limit number of parsed leap seconds. - - The lstab structure has a fixed-size array for leap seconds - (currently 28 + 200). Don't read more leap seconds from the leapfile to - avoid corrupting memory. - - Signed-off-by: Miroslav Lichvar - -diff --git a/lstab.c b/lstab.c -index 24add26..8e35504 100644 ---- a/lstab.c -+++ b/lstab.c -@@ -137,7 +137,7 @@ static int lstab_read(struct lstab *lstab, const char *name) - fprintf(stderr, "failed to open '%s' for reading: %m\n", name); - return -1; - } -- while (1) { -+ while (index < N_LEAPS) { - if (!fgets(buf, sizeof(buf), fp)) { - break; - } - -commit 90ad2efc74b0f348fb6b417565b3ada7d161641b -Author: Miroslav Lichvar -Date: Thu Feb 22 13:56:53 2024 +0100 - - lstab: Don't free lstab on update. - - The modification timestamp of the leapfile is checked with every - call of lstab_utc2tai(). If the file is modified, the provided lstab - structure is freed and a new one is allocated from the updated leapfile. - But the new lstab is not returned to the caller as the function doesn't - accept a pointer to the pointer to lstab. This causes reading from the - freed memory and leak of the newly allocated memory. - - Modify update_leapsecond_table() to read the updated leapfile into the - existing lstab structure instead of the reallocation. - - Signed-off-by: Miroslav Lichvar - -diff --git a/lstab.c b/lstab.c -index 8e35504..357ed27 100644 ---- a/lstab.c -+++ b/lstab.c -@@ -195,7 +195,6 @@ struct lstab *lstab_create(const char *filename) - - int update_leapsecond_table(struct lstab *lstab) - { -- const char* leapfile; - struct stat statbuf; - int err; - -@@ -212,14 +211,14 @@ int update_leapsecond_table(struct lstab *lstab) - return 0; - } - printf("updating leap seconds file\n"); -- leapfile = lstab->leapfile; -- lstab_destroy(lstab); - -- lstab = lstab_create(leapfile); -- if (!lstab) { -+ if (lstab_read(lstab, lstab->leapfile)) { -+ lstab->length = 0; - return -1; - } - -+ lstab->lsfile_mtime = statbuf.st_mtim.tv_sec; -+ - return 0; - } - diff --git a/linuxptp-nmeadelay.patch b/linuxptp-nmeadelay.patch deleted file mode 100644 index 64c1ba1..0000000 --- a/linuxptp-nmeadelay.patch +++ /dev/null @@ -1,365 +0,0 @@ -commit 0c406008b530140ed6d992915a6c8a1e5abf15d5 -Author: Miroslav Lichvar -Date: Thu Jan 25 11:26:15 2024 +0100 - - ts2phc: Don't switch system clock to nanosecond mode. - - ts2phc is not synchronizing the system clock and should not switch the - clock to the nanosecond mode with adjtimex(modes=ADJ_NANO) or make any - other modifications to it. The process that is controlling the clock - (e.g. an NTP client) might not be using the nanosecond mode. - - There are two instances of the adjtimex() call in the code. One is used - only to read the clock and can be replaced with faster clock_gettime(). - The other instance is also reading the TAI offset. Instead of switching - to the nanosecond mode, change the timestamp conversion to handle both - microsecond and nanosecond modes according to the current clock status. - - Reviewed-by: Jacob Keller - Signed-off-by: Miroslav Lichvar - -diff --git a/ts2phc_generic_pps_source.c b/ts2phc_generic_pps_source.c -index d503aac..e6b8145 100644 ---- a/ts2phc_generic_pps_source.c -+++ b/ts2phc_generic_pps_source.c -@@ -38,7 +38,6 @@ static int get_ntx(struct timex *ntx) - return -1; - - memset(ntx, 0, sizeof(*ntx)); -- ntx->modes = ADJ_NANO; - code = adjtimex(ntx); - if (code == -1) { - pr_err("adjtimex failed: %m"); -@@ -93,7 +92,10 @@ static int ts2phc_generic_pps_source_getppstime(struct ts2phc_pps_source *src, - } - - ts->tv_sec = ntx.time.tv_sec + tai_offset; -- ts->tv_nsec = ntx.time.tv_usec; -+ if (ntx.status & STA_NANO) -+ ts->tv_nsec = ntx.time.tv_usec; -+ else -+ ts->tv_nsec = ntx.time.tv_usec * 1000; - - return 0; - } -diff --git a/ts2phc_nmea_pps_source.c b/ts2phc_nmea_pps_source.c -index 3a4267d..5b2e06b 100644 ---- a/ts2phc_nmea_pps_source.c -+++ b/ts2phc_nmea_pps_source.c -@@ -62,14 +62,13 @@ static int open_nmea_connection(const char *host, const char *port, - - static void *monitor_nmea_status(void *arg) - { -+ struct timespec rxtime, rxtime_rt, tmo = { 2, 0 }; - struct nmea_parser *np = nmea_parser_create(); - struct pollfd pfd = { -1, POLLIN | POLLPRI }; - char *host, input[256], *port, *ptr, *uart; - struct ts2phc_nmea_pps_source *s = arg; -- struct timespec rxtime, tmo = { 2, 0 }; - int cnt, num, parsed, baud; - struct nmea_rmc rmc; -- struct timex ntx; - - if (!np) { - pr_err("failed to create NMEA parser"); -@@ -79,8 +78,6 @@ static void *monitor_nmea_status(void *arg) - port = config_get_string(s->config, NULL, "ts2phc.nmea_remote_port"); - uart = config_get_string(s->config, NULL, "ts2phc.nmea_serialport"); - baud = config_get_int(s->config, NULL, "ts2phc.nmea_baudrate"); -- memset(&ntx, 0, sizeof(ntx)); -- ntx.modes = ADJ_NANO; - - while (is_running()) { - if (pfd.fd == -1) { -@@ -92,7 +89,7 @@ static void *monitor_nmea_status(void *arg) - } - num = poll(&pfd, 1, NMEA_TMO); - clock_gettime(CLOCK_MONOTONIC, &rxtime); -- adjtimex(&ntx); -+ clock_gettime(CLOCK_REALTIME, &rxtime_rt); - if (num < 0) { - pr_err("poll failed"); - break; -@@ -124,8 +121,7 @@ static void *monitor_nmea_status(void *arg) - if (!nmea_parse(np, ptr, cnt, &rmc, &parsed)) { - pthread_mutex_lock(&s->mutex); - s->local_monotime = rxtime; -- s->local_utctime.tv_sec = ntx.time.tv_sec; -- s->local_utctime.tv_nsec = ntx.time.tv_usec; -+ s->local_utctime = rxtime_rt; - s->rmc_utctime = rmc.ts; - s->rmc_fix_valid = rmc.fix_valid; - pthread_mutex_unlock(&s->mutex); - -commit 72b44bc885e519667a12c89d5b640484807e4946 -Author: Miroslav Lichvar -Date: Tue Jun 4 08:57:15 2024 +0200 - - ts2phc: Use CLOCK_MONOTONIC_RAW for NMEA PPS timestamp. - - In the calculation of the NMEA PPS timestamp is used an interval - measured by the CLOCK_MONOTONIC system clock. This clock may have a - large frequency error when another process (e.g. phc2sys or an NTP - client) is correcting a large time error by slewing. - - This frequency error may cause the timestamp to overflow into the next - second and cause a one-second error in the measured offset, or the wrong - edge of the pulse to be rejected. - - Switch from CLOCK_MONOTONIC to CLOCK_MONOTONIC_RAW to avoid the - impact of the system clock adjustments. - - Signed-off-by: Miroslav Lichvar - -diff --git a/ts2phc_nmea_pps_source.c b/ts2phc_nmea_pps_source.c -index 5b2e06b..7a28433 100644 ---- a/ts2phc_nmea_pps_source.c -+++ b/ts2phc_nmea_pps_source.c -@@ -88,7 +88,7 @@ static void *monitor_nmea_status(void *arg) - } - } - num = poll(&pfd, 1, NMEA_TMO); -- clock_gettime(CLOCK_MONOTONIC, &rxtime); -+ clock_gettime(CLOCK_MONOTONIC_RAW, &rxtime); - clock_gettime(CLOCK_REALTIME, &rxtime_rt); - if (num < 0) { - pr_err("poll failed"); -@@ -160,7 +160,7 @@ static int ts2phc_nmea_pps_source_getppstime(struct ts2phc_pps_source *src, - int64_t utc_time; - bool fix_valid; - -- clock_gettime(CLOCK_MONOTONIC, &now); -+ clock_gettime(CLOCK_MONOTONIC_RAW, &now); - local_t2 = timespec_to_tmv(now); - - pthread_mutex_lock(&m->mutex); - -commit 30e6c4dba892236d8cfe08dc6c55238e11504c71 -Author: Miroslav Lichvar -Date: Mon Jun 3 10:32:05 2024 +0200 - - ts2phc: Provide source type. - - Save the PPS source type in the instance and add a function to retrieve - it. This will be needed for NMEA-specific rounding of timestamps. - - Signed-off-by: Miroslav Lichvar - -diff --git a/ts2phc_pps_source.c b/ts2phc_pps_source.c -index c333f65..ae2ad46 100644 ---- a/ts2phc_pps_source.c -+++ b/ts2phc_pps_source.c -@@ -26,6 +26,8 @@ struct ts2phc_pps_source *ts2phc_pps_source_create(struct ts2phc_private *priv, - src = ts2phc_phc_pps_source_create(priv, dev); - break; - } -+ if (src) -+ src->type = type; - return src; - } - -@@ -46,3 +48,8 @@ struct ts2phc_clock *ts2phc_pps_source_get_clock(struct ts2phc_pps_source *src) - - return NULL; - } -+ -+enum ts2phc_pps_source_type ts2phc_pps_source_get_type(struct ts2phc_pps_source *src) -+{ -+ return src->type; -+} -diff --git a/ts2phc_pps_source.h b/ts2phc_pps_source.h -index 293c693..c87e3af 100644 ---- a/ts2phc_pps_source.h -+++ b/ts2phc_pps_source.h -@@ -53,4 +53,11 @@ int ts2phc_pps_source_getppstime(struct ts2phc_pps_source *src, struct timespec - - struct ts2phc_clock *ts2phc_pps_source_get_clock(struct ts2phc_pps_source *src); - -+/** -+ * Returns the type of the PPS source -+ * @param src Pointer to a source obtained via @ref ts2phc_pps_source_create(). -+ * @return The type of the clock. -+ */ -+enum ts2phc_pps_source_type ts2phc_pps_source_get_type(struct ts2phc_pps_source *src); -+ - #endif -diff --git a/ts2phc_pps_source_private.h b/ts2phc_pps_source_private.h -index 99e6a78..ea6a8ad 100644 ---- a/ts2phc_pps_source_private.h -+++ b/ts2phc_pps_source_private.h -@@ -13,6 +13,7 @@ - #include "ts2phc_pps_source.h" - - struct ts2phc_pps_source { -+ enum ts2phc_pps_source_type type; - void (*destroy)(struct ts2phc_pps_source *src); - int (*getppstime)(struct ts2phc_pps_source *src, struct timespec *ts); - struct ts2phc_clock *(*get_clock)(struct ts2phc_pps_source *src); - -commit bebd15ae90dbfcb74a33e5b428f24c733abf1134 -Author: Miroslav Lichvar -Date: Mon Jun 3 11:06:16 2024 +0200 - - ts2phc: Fix edge rejection for pulse widths over 0.5s. - - If the configured pulse width is longer than 0.5 seconds, the calculated - range of ignored offsets is too small to cover the wrong edge. Fix the - calculation of the limits to use the minimum of pulsewidth and - (1.0s - pulsewidth). A pulsewidth of 0.5s should give the shortest interval. - - Signed-off-by: Miroslav Lichvar - -diff --git a/ts2phc_pps_sink.c b/ts2phc_pps_sink.c -index 05ac225..ca9f721 100644 ---- a/ts2phc_pps_sink.c -+++ b/ts2phc_pps_sink.c -@@ -175,6 +175,8 @@ static struct ts2phc_pps_sink *ts2phc_pps_sink_create(struct ts2phc_private *pri - sink->correction = nanoseconds_to_tmv(correction); - - pulsewidth = config_get_int(cfg, device, "ts2phc.pulsewidth"); -+ if (pulsewidth > 500000000) -+ pulsewidth = 1000000000 - pulsewidth; - pulsewidth /= 2; - sink->ignore_upper = 1000000000 - pulsewidth; - sink->ignore_lower = pulsewidth; - -commit 435e9fc6ebec8daa8ab9f88c2d590e35ace9b2f6 -Author: Miroslav Lichvar -Date: Mon Jun 3 13:57:23 2024 +0200 - - ts2phc: Move upper/lower rejection limit calculation. - - The ignore_upper and ignore_lower fields of the ts2phc_pps_sink struct - are calculated when the PPS source is not known yet. Replace the fields - with the configured pulsewidth and calculate the limits locally later - when needed in ts2phc_pps_sink_ignore(). This will allow an - NMEA-specific calculation of the limits. - - Signed-off-by: Miroslav Lichvar - -diff --git a/ts2phc_pps_sink.c b/ts2phc_pps_sink.c -index ca9f721..8121afb 100644 ---- a/ts2phc_pps_sink.c -+++ b/ts2phc_pps_sink.c -@@ -30,8 +30,7 @@ struct ts2phc_pps_sink { - struct ptp_pin_desc pin_desc; - unsigned int polarity; - tmv_t correction; -- uint32_t ignore_lower; -- uint32_t ignore_upper; -+ uint32_t pulsewidth; - struct ts2phc_clock *clock; - }; - -@@ -153,8 +152,8 @@ static struct ts2phc_pps_sink *ts2phc_pps_sink_create(struct ts2phc_private *pri - struct config *cfg = priv->cfg; - struct ptp_extts_request extts; - struct ts2phc_pps_sink *sink; -- int err, pulsewidth; - int32_t correction; -+ int err; - - sink = calloc(1, sizeof(*sink)); - if (!sink) { -@@ -174,12 +173,9 @@ static struct ts2phc_pps_sink *ts2phc_pps_sink_create(struct ts2phc_private *pri - correction = config_get_int(cfg, device, "ts2phc.extts_correction"); - sink->correction = nanoseconds_to_tmv(correction); - -- pulsewidth = config_get_int(cfg, device, "ts2phc.pulsewidth"); -- if (pulsewidth > 500000000) -- pulsewidth = 1000000000 - pulsewidth; -- pulsewidth /= 2; -- sink->ignore_upper = 1000000000 - pulsewidth; -- sink->ignore_lower = pulsewidth; -+ sink->pulsewidth = config_get_int(cfg, device, "ts2phc.pulsewidth"); -+ if (sink->pulsewidth > 500000000) -+ sink->pulsewidth = 1000000000 - sink->pulsewidth; - - sink->clock = ts2phc_clock_add(priv, device); - if (!sink->clock) { -@@ -243,12 +239,16 @@ static bool ts2phc_pps_sink_ignore(struct ts2phc_private *priv, - struct timespec source_ts) - { - tmv_t source_tmv = timespec_to_tmv(source_ts); -+ uint32_t ignore_lower, ignore_upper; - - source_tmv = tmv_sub(source_tmv, priv->perout_phase); - source_ts = tmv_to_timespec(source_tmv); - -- return source_ts.tv_nsec > sink->ignore_lower && -- source_ts.tv_nsec < sink->ignore_upper; -+ ignore_upper = 1000000000 - sink->pulsewidth / 2; -+ ignore_lower = sink->pulsewidth / 2; -+ -+ return source_ts.tv_nsec > ignore_lower && -+ source_ts.tv_nsec < ignore_upper; - } - - static enum extts_result ts2phc_pps_sink_event(struct ts2phc_private *priv, - -commit 0257b245df1a32869f356c0cfbeacfe5f0a522f5 -Author: Miroslav Lichvar -Date: Mon Jun 3 11:31:45 2024 +0200 - - ts2phc: Allow longer NMEA delays. - - Timestamps from PPS sources are rounded to the nearest pulse, i.e. for - correct synchronization the offset between the source timestamp and - external PPS event timestamp needs to be between -0.5 and +0.5 seconds. - For the pulse edge rejection to work correctly it needs to be even - smaller, between -pulsewidth/2 and +pulsewidth/2. - - With the NMEA PPS source the offset is the delay in the reception of the - RMC message. This message is not expected to come exactly on time with - the corresponding pulse. A positive delay is expected, typically at - least few tens of milliseconds, but some receivers have delays longer - than 0.5 seconds. - - Add NMEA-specific rounding of the offset to not expect negative delays - and allow positive delays of up to 1 second, or whole pulsewidth if the - edge rejection is enabled. - - Signed-off-by: Miroslav Lichvar - -diff --git a/ts2phc.c b/ts2phc.c -index 03c88b1..4817c85 100644 ---- a/ts2phc.c -+++ b/ts2phc.c -@@ -418,9 +418,16 @@ static int ts2phc_pps_source_implicit_tstamp(struct ts2phc_private *priv, - * deduce the timestamp (actually only seconds part, nanoseconds are by - * construction zero) of this edge at the emitter based on the - * emitter's current time. -+ * -+ * With an NMEA source assume its messages always follow the pulse, i.e. -+ * assign the timestamp to the previous pulse instead of nearest pulse. - */ -- if (source_ts.tv_nsec > NS_PER_SEC / 2) -+ if (ts2phc_pps_source_get_type(priv->src) == TS2PHC_PPS_SOURCE_NMEA) { - source_ts.tv_sec++; -+ } else { -+ if (source_ts.tv_nsec > NS_PER_SEC / 2) -+ source_ts.tv_sec++; -+ } - source_ts.tv_nsec = 0; - - tmv = timespec_to_tmv(source_ts); -diff --git a/ts2phc_pps_sink.c b/ts2phc_pps_sink.c -index 8121afb..0d399b8 100644 ---- a/ts2phc_pps_sink.c -+++ b/ts2phc_pps_sink.c -@@ -244,8 +244,13 @@ static bool ts2phc_pps_sink_ignore(struct ts2phc_private *priv, - source_tmv = tmv_sub(source_tmv, priv->perout_phase); - source_ts = tmv_to_timespec(source_tmv); - -- ignore_upper = 1000000000 - sink->pulsewidth / 2; -- ignore_lower = sink->pulsewidth / 2; -+ if (ts2phc_pps_source_get_type(priv->src) == TS2PHC_PPS_SOURCE_NMEA) { -+ ignore_upper = sink->pulsewidth; -+ ignore_lower = 0; -+ } else { -+ ignore_upper = 1000000000 - sink->pulsewidth / 2; -+ ignore_lower = sink->pulsewidth / 2; -+ } - - return source_ts.tv_nsec > ignore_lower && - source_ts.tv_nsec < ignore_upper; diff --git a/linuxptp-nmealeap.patch b/linuxptp-nmealeap.patch deleted file mode 100644 index f00cb0b..0000000 --- a/linuxptp-nmealeap.patch +++ /dev/null @@ -1,76 +0,0 @@ -commit f3c742e24a40cf75272ec39789a2cba35389230d -Author: Miroslav Lichvar -Date: Tue Jun 11 15:25:54 2024 +0200 - - nmea: Fix conversion of leap second. - - When a leap second is inserted, the RMC message reports time of - 23:59:60, which overflows in mktime() to 0:00:00 after the leap second - with an incremented TAI-UTC offset. This causes a one-second error in - the offset meaured by ts2phc. - - Check the seconds field of the RMC message and convert 60 to 59 to make - the timestamp ambiguous per is_utc_ambiguous() and ignored by ts2phc to - avoid updating the clock with the one-second error. - - Signed-off-by: Miroslav Lichvar - -diff --git a/nmea.c b/nmea.c -index 7f1d9a2..b84b42e 100644 ---- a/nmea.c -+++ b/nmea.c -@@ -155,6 +155,9 @@ static int nmea_scan_rmc(struct nmea_parser *np, struct nmea_rmc *result) - if (cnt != 3) { - return -1; - } -+ /* Convert an inserted leap second to ambiguous 23:59:59 */ -+ if (tm.tm_sec == 60) -+ tm.tm_sec = 59; - tm.tm_year += 100; - tm.tm_mon--; - tm.tm_isdst = 0; - -commit b396d361b0d290ce83395851860c2dcd074e0f3b -Author: Miroslav Lichvar -Date: Tue Jun 11 15:32:55 2024 +0200 - - ts2phc: Fix timestamp conversion for leap seconds. - - The UTC timestamp parsed from the RMC message needs to be converted to - TAI in order to calculate the PHC offset. This conversion was done after - adjusting the timestamp for the measured delay between the reception of - the message and the following pulse, which caused the offset measured by - ts2phc to have a one-second error if the message expected during or - after a leap second was missed. - - Apply the TAI-UTC offset to the timestamp parsed from the RMC message - before any adjustments are made to avoid the error. - - Signed-off-by: Miroslav Lichvar - -diff --git a/ts2phc_nmea_pps_source.c b/ts2phc_nmea_pps_source.c -index 7a28433..bdfaf19 100644 ---- a/ts2phc_nmea_pps_source.c -+++ b/ts2phc_nmea_pps_source.c -@@ -186,10 +186,9 @@ static int ts2phc_nmea_pps_source_getppstime(struct ts2phc_pps_source *src, - pr_err("nmea: rmc time stamp stale"); - return -1; - } -- rmc = tmv_add(rmc, duration_since_rmc); -+ - utc_time = tmv_to_nanoseconds(rmc); - utc_time /= (int64_t) 1000000000; -- *ts = tmv_to_timespec(rmc); - - result = lstab_utc2tai(m->lstab, utc_time, &tai_offset); - switch (result) { -@@ -206,6 +205,9 @@ static int ts2phc_nmea_pps_source_getppstime(struct ts2phc_pps_source *src, - pr_err("nmea: utc time stamp is ambiguous"); - break; - } -+ -+ rmc = tmv_add(rmc, duration_since_rmc); -+ *ts = tmv_to_timespec(rmc); - ts->tv_sec += tai_offset; - - return lstab_error; diff --git a/linuxptp-nmeareset.patch b/linuxptp-nmeareset.patch deleted file mode 100644 index d52f279..0000000 --- a/linuxptp-nmeareset.patch +++ /dev/null @@ -1,25 +0,0 @@ -commit b4ad9dccf23cef2d79621cd36987428a65f2bcc9 -Author: Miroslav Lichvar -Date: Tue Jun 11 12:35:10 2024 +0200 - - ts2phc: Reset parser after RMC message. - - When the receiver was configured to generate only RMC messages, every - other message was skipped due to the parser not being in the right - state to process another message. Reset the parser to correctly parse - every valid message. - - Signed-off-by: Miroslav Lichvar - -diff --git a/nmea.c b/nmea.c -index 44c7c01..7f1d9a2 100644 ---- a/nmea.c -+++ b/nmea.c -@@ -171,6 +171,7 @@ int nmea_parse(struct nmea_parser *np, const char *ptr, int buflen, - while (buflen) { - if (!nmea_parse_symbol(np, *ptr)) { - if (!nmea_scan_rmc(np, result)) { -+ nmea_reset(np); - *parsed = count + 1; - return 0; - } diff --git a/linuxptp-ptpver.patch b/linuxptp-ptpver.patch index ca7bad7..4cb1a01 100644 --- a/linuxptp-ptpver.patch +++ b/linuxptp-ptpver.patch @@ -1,4 +1,4 @@ -commit 6e480c9572925a4ea8aac45a10a306e0c4e509a9 +commit daa82cda8318edd6a8e75ef46d0ed065445c8922 Author: Miroslav Lichvar Date: Thu Jan 11 11:33:54 2024 +0100 @@ -7,33 +7,33 @@ Date: Thu Jan 11 11:33:54 2024 +0100 Signed-off-by: Miroslav Lichvar diff --git a/config.c b/config.c -index 398b420..d7775c0 100644 +index 4a28efb..cbff976 100644 --- a/config.c +++ b/config.c -@@ -319,7 +319,7 @@ struct config_item config_tab[] = { - GLOB_ITEM_STR("productDescription", ";;"), +@@ -347,7 +347,7 @@ struct config_item config_tab[] = { + PORT_ITEM_STR("ptp_dst_ipv4", "224.0.1.129"), + PORT_ITEM_STR("ptp_dst_ipv6", "FF0E:0:0:0:0:0:0:181"), PORT_ITEM_STR("ptp_dst_mac", "01:1B:19:00:00:00"), - PORT_ITEM_STR("p2p_dst_mac", "01:80:C2:00:00:0E"), - GLOB_ITEM_INT("ptp_minor_version", 1, 0, 1), + GLOB_ITEM_INT("ptp_minor_version", 0, 0, 1), GLOB_ITEM_STR("refclock_sock_address", "/var/run/refclock.ptp.sock"), GLOB_ITEM_STR("revisionData", ";;"), - GLOB_ITEM_INT("sanity_freq_limit", 200000000, 0, INT_MAX), + GLOB_ITEM_STR("sa_file", NULL), diff --git a/configs/default.cfg b/configs/default.cfg -index 0c7661c..8f94c16 100644 +index c3ad618..768eef8 100644 --- a/configs/default.cfg +++ b/configs/default.cfg -@@ -46,7 +46,7 @@ power_profile.2011.networkTimeInaccuracy -1 +@@ -47,7 +47,7 @@ power_profile.2011.networkTimeInaccuracy -1 power_profile.2017.totalTimeInaccuracy -1 power_profile.grandmasterID 0 power_profile.version none --ptp_minor_version 1 -+ptp_minor_version 0 - # - # Run time options +-ptp_minor_version 1 ++ptp_minor_version 0 + spp -1 + active_key_id 0 # diff --git a/msg.h b/msg.h -index 9c80f45..786ddc7 100644 +index 58c2287..d2658c9 100644 --- a/msg.h +++ b/msg.h @@ -32,7 +32,7 @@ @@ -45,16 +45,44 @@ index 9c80f45..786ddc7 100644 #define PTP_VERSION (PTP_MINOR_VERSION << 4 | PTP_MAJOR_VERSION) #define MAJOR_VERSION_MASK 0x0f +diff --git a/port.c b/port.c +index db35a44..7f945ac 100644 +--- a/port.c ++++ b/port.c +@@ -3696,7 +3696,7 @@ struct port *port_open(const char *phc_device, + pr_err("%s: spp not supported on one-step ports", p->log_name); + goto err_uc_service; + } +- if (port_has_security(p) && (config_get_int(cfg, NULL, "ptp_minor_version") < 1)) { ++ if (port_has_security(p) && ptp_hdr_ver >> 4 < 1) { + pr_err("%s: spp needs at least PTPv2.1", p->log_name); + goto err_uc_service; + } diff --git a/ptp4l.8 b/ptp4l.8 -index 4cb9adb..c59b0b4 100644 +index 87900e3..28cc4c9 100644 --- a/ptp4l.8 +++ b/ptp4l.8 -@@ -813,7 +813,7 @@ The default is 128. +@@ -900,7 +900,8 @@ The default is 128. .TP .B ptp_minor_version This option sets the minorVersionPTP in the common PTP message header. -The default is 1. -+The default (specific to the installed linuxptp package) is 0. ++The default (specific to the installed linuxptp package) is 0, but setting ++\fBsa_file\fR forces the version to 1. .TP .B refclock_sock_address +diff --git a/ptp4l.c b/ptp4l.c +index ac2ef96..0d54d6c 100644 +--- a/ptp4l.c ++++ b/ptp4l.c +@@ -194,6 +194,9 @@ int main(int argc, char *argv[]) + sk_hwts_filter_mode = config_get_int(cfg, NULL, "hwts_filter"); + + ptp_hdr_ver = config_get_int(cfg, NULL, "ptp_minor_version"); ++ /* Override patched default for spp, which requires PTPv2.1 */ ++ if (ptp_hdr_ver < 1 && config_get_string(cfg, NULL, "sa_file")) ++ ptp_hdr_ver = 1; + ptp_hdr_ver = (ptp_hdr_ver << 4) | PTP_MAJOR_VERSION; + + if (sad_create(cfg)) { diff --git a/linuxptp-subscribe.patch b/linuxptp-subscribe.patch deleted file mode 100644 index 2bdf033..0000000 --- a/linuxptp-subscribe.patch +++ /dev/null @@ -1,26 +0,0 @@ -commit b421a4c66ce636adff150dd1aa8eafa981c2693d -Author: Miroslav Lichvar -Date: Wed Jan 3 14:45:51 2024 +0100 - - pmc: Allow missing values in SUBSCRIBE_EVENTS_NP command. - - Don't require all supported notifications to be specified in the command - for compatibility with older scripts. - - Signed-off-by: Miroslav Lichvar - -diff --git a/pmc_common.c b/pmc_common.c -index 62e34a6..b88cfc2 100644 ---- a/pmc_common.c -+++ b/pmc_common.c -@@ -310,8 +310,8 @@ static void do_set_action(struct pmc *pmc, int action, int index, char *str) - onoff_port_state, - onoff_time_status, - onoff_parent_data_set); -- if (cnt != 4) { -- fprintf(stderr, "%s SET needs 4 values\n", -+ if (cnt < 2) { -+ fprintf(stderr, "%s SET needs at least 2 values\n", - idtab[index].name); - break; - } diff --git a/linuxptp.spec b/linuxptp.spec index 82da037..8a7f41b 100644 --- a/linuxptp.spec +++ b/linuxptp.spec @@ -1,16 +1,16 @@ %global _hardened_build 1 -%global testsuite_ver bf8ead -%global clknetsim_ver 5d1dc0 +%global testsuite_ver d27dbd +%global clknetsim_ver 64df92 Name: linuxptp -Version: 4.2 +Version: 4.4 Release: 3%{?dist} Summary: PTP implementation for Linux -License: GPLv2+ -URL: http://linuxptp.sourceforge.net/ +License: GPL-2.0-or-later +URL: https://www.linuxptp.org/ -Source0: https://downloads.sourceforge.net/%{name}/%{name}-%{version}.tgz +Source0: https://downloads.nwtime.org/%{name}/%{name}-%{version}.tgz Source1: phc2sys.service Source2: ptp4l.service Source3: timemaster.service @@ -21,30 +21,16 @@ Source10: https://github.com/mlichvar/linuxptp-testsuite/archive/%{testsuite_ver # simulator for test suite Source11: https://github.com/mlichvar/clknetsim/archive/%{clknetsim_ver}/clknetsim-%{clknetsim_ver}.tar.gz -# allow old syntax of SET SUBSCRIBE_EVENTS_NP command -Patch1: linuxptp-subscribe.patch # disable warning messages about deprecated options Patch2: linuxptp-deprecated.patch # revert default PTP version to 2.0 for better compatibility Patch3: linuxptp-ptpver.patch # limit unicast message rate per address and grant duration Patch4: linuxptp-ucastrate.patch -# fix ts2phc to handle large NMEA delay -Patch5: linuxptp-nmeadelay.patch -# fix loading and reloading of leapfile -Patch6: linuxptp-lstab.patch -# fix ts2phc to correctly handle leap seconds -Patch7: linuxptp-nmealeap.patch -# fix ts2phc to reset NMEA parser after RMC message -Patch8: linuxptp-nmeareset.patch -# add options to configure multicast IP addresses -Patch9: linuxptp-addropts.patch -# add holdover support to ts2phc -Patch10: linuxptp-holdover.patch # check for EL-specific kernels with vclock support Patch12: linuxptp-vclock.patch -BuildRequires: gcc gcc-c++ make systemd +BuildRequires: gcc gcc-c++ gnutls-devel make systemd %{?systemd_requires} @@ -58,6 +44,10 @@ Supporting legacy APIs and other platforms is not a goal. %prep %setup -q -a 10 -a 11 -n %{name}-%{!?gitfullver:%{version}}%{?gitfullver} %autopatch -p1 + +# disable nettle support in favor of gnutls +sed -i 's|find .*"nettle"|true|' incdefs.sh + mv linuxptp-testsuite-%{testsuite_ver}* testsuite mv clknetsim-%{clknetsim_ver}* testsuite/clknetsim diff --git a/sources b/sources index aedb360..e697a7b 100644 --- a/sources +++ b/sources @@ -1,3 +1,3 @@ -SHA512 (linuxptp-4.2.tgz) = 479e512efd0573602379a9e1d8ef5c0ec9e033944cee5aed11c68cea5e8a3f7d4b6f2d11f6d6d4718282010da52c2c8629d675d9b388cc0c3d574845a913cdbb -SHA512 (linuxptp-testsuite-bf8ead.tar.gz) = 6a6d190e8ef43cdb91304f9dc69fd4bc71590b2178c10a8305ddc2660fdc0963a00721db46b951afb0aaf73b268ce2927bca6551010477b6e59ce64aeec22bc6 -SHA512 (clknetsim-5d1dc0.tar.gz) = 76889da425dc9d63ba78811661d78ffa922a63c4f83aeb809fef02c866f64a97b09dd4b0906ccfd1e20cee5091d8b886aadfce54cd338d3bf597b0e976a78927 +SHA512 (linuxptp-4.4.tgz) = f9c8ac0c812d9829b3bc4595412afbeea0cade4937c46efbe47789d0ced38894a65f38a174a65a59c51b4d85a7bbf970b5d575ae1389c504fbd36eb7f96bd282 +SHA512 (linuxptp-testsuite-d27dbd.tar.gz) = e289f63d522eaac3deb1db81442805fb602ae5423c02afb2200e59518e9c3db8dcaa00e42a57f0d81d51bb2e7cbd4b82c1d3522abbb5e5569cfd795ba403d659 +SHA512 (clknetsim-64df92.tar.gz) = 91b7a9c9d4e8eaa8903f1f612cdaa2865d094e1c3531e039da9ad75595f4f4cd6fdbce9afdb0dafa18573d8afcb33a0e101170fc02c6585a231133a10b0890ff