diff --git a/linuxptp-classthreshold.patch b/linuxptp-classthreshold.patch new file mode 100644 index 0000000..71b0250 --- /dev/null +++ b/linuxptp-classthreshold.patch @@ -0,0 +1,138 @@ +Backported commit f774703cb1eee058a346aec3341fee0be329bd6d +Author: Karthikkumar V +Date: Fri Feb 26 06:54:07 2021 +0000 + + Clock Class Threshold Feature addition for PTP4L + + This code changes brings in the ability to program the acceptable + clockClass threshold beyond which device will move to holdover/free-run. + Default clockClass threshold is 248. + Example Use-Case: + This is needed in the cases where T-SC/T-BC Slave might want to listen + only on PRC clockCLass and anything beyond that might not be acceptible + and would want to go to holdover (with SyncE backup or internal oscillator). + + Signed-off-by: Karthikkumar V + Signed-off-by: Ramana Reddy + +diff --git a/clock.c b/clock.c +index c1fcff6..d584748 100644 +--- a/clock.c ++++ b/clock.c +@@ -114,6 +114,7 @@ struct clock { + int utc_offset; + int time_flags; /* grand master role */ + int time_source; /* grand master role */ ++ UInteger8 clock_class_threshold; + UInteger8 max_steps_removed; + enum servo_state servo_state; + enum timestamp_type timestamping; +@@ -978,6 +979,7 @@ struct clock *clock_create(enum clock_type type, struct config *config, + c->default_dataset.localPriority = + config_get_int(config, NULL, "G.8275.defaultDS.localPriority"); + c->max_steps_removed = config_get_int(config, NULL,"maxStepsRemoved"); ++ c->clock_class_threshold = config_get_int(config, NULL, "clock_class_threshold"); + + /* Harmonize the twoStepFlag with the time_stamping option. */ + if (config_harmonize_onestep(config)) { +@@ -1711,6 +1713,11 @@ UInteger8 clock_max_steps_removed(struct clock *c) + return c->max_steps_removed; + } + ++UInteger8 clock_get_clock_class_threshold(struct clock *c) ++{ ++ return c->clock_class_threshold; ++} ++ + UInteger16 clock_steps_removed(struct clock *c) + { + return c->cur.stepsRemoved; +diff --git a/clock.h b/clock.h +index e7daf97..845d54f 100644 +--- a/clock.h ++++ b/clock.h +@@ -289,6 +289,13 @@ int clock_slave_only(struct clock *c); + */ + UInteger8 clock_max_steps_removed(struct clock *c); + ++/** ++ * Obtain the clock class threshold field from a clock's default data set. ++ * @param c The clock instance. ++ * @return Configured clock class threshold value. ++ */ ++UInteger8 clock_get_clock_class_threshold(struct clock *c); ++ + /** + * Obtain the steps removed field from a clock's current data set. + * @param c The clock instance. +diff --git a/config.c b/config.c +index c3deddb..bf1049f 100644 +--- a/config.c ++++ b/config.c +@@ -231,6 +231,7 @@ struct config_item config_tab[] = { + GLOB_ITEM_INT("clockAccuracy", 0xfe, 0, UINT8_MAX), + GLOB_ITEM_INT("clockClass", 248, 0, UINT8_MAX), + GLOB_ITEM_STR("clockIdentity", "000000.0000.000000"), ++ GLOB_ITEM_INT("clock_class_threshold", CLOCK_CLASS_THRESHOLD_DEFAULT, 6, CLOCK_CLASS_THRESHOLD_DEFAULT), + GLOB_ITEM_ENU("clock_servo", CLOCK_SERVO_PI, clock_servo_enu), + GLOB_ITEM_ENU("clock_type", CLOCK_TYPE_ORDINARY, clock_type_enu), + GLOB_ITEM_ENU("dataset_comparison", DS_CMP_IEEE1588, dataset_comp_enu), +diff --git a/configs/default.cfg b/configs/default.cfg +index 9604219..b2ffa94 100644 +--- a/configs/default.cfg ++++ b/configs/default.cfg +@@ -60,6 +60,7 @@ verbose 0 + summary_interval 0 + kernel_leap 1 + check_fup_sync 0 ++clock_class_threshold 248 + # + # Servo Options + # +diff --git a/ds.h b/ds.h +index 9d9c417..dff6d5e 100644 +--- a/ds.h ++++ b/ds.h +@@ -87,6 +87,7 @@ struct parent_ds { + + #define CURRENT_UTC_OFFSET 37 /* 1 Jan 2017 */ + #define INTERNAL_OSCILLATOR 0xA0 ++#define CLOCK_CLASS_THRESHOLD_DEFAULT 248 + + struct timePropertiesDS { + Integer16 currentUtcOffset; +diff --git a/port.c b/port.c +index 2bb974c..eb3b319 100644 +--- a/port.c ++++ b/port.c +@@ -1870,6 +1870,14 @@ int process_announce(struct port *p, struct ptp_message *m) + return result; + } + ++ if (m->announce.grandmasterClockQuality.clockClass > ++ clock_get_clock_class_threshold(p->clock)) { ++ pl_err(60, "port %hu: Master clock quality received is " ++ "greater than configured, ignoring master!", ++ portnum(p)); ++ return result; ++ } ++ + switch (p->state) { + case PS_INITIALIZING: + case PS_FAULTY: +diff --git a/ptp4l.8 b/ptp4l.8 +index b04936a..ca76175 100644 +--- a/ptp4l.8 ++++ b/ptp4l.8 +@@ -455,6 +455,11 @@ message is greater than or equal to the value of maxStepsRemoved the + Announce message is not considered in the operation of the BMCA. + The default value is 255. + .TP ++.B clock_class_threshold ++The maximum clock class value from master, acceptible to sub-ordinate ++clock beyond which it moves out of lock state. ++The default value is 248. ++.TP + + .B domainNumber + The domain attribute of the local clock. diff --git a/linuxptp.spec b/linuxptp.spec index 26dd879..cf7c8ae 100644 --- a/linuxptp.spec +++ b/linuxptp.spec @@ -23,6 +23,8 @@ Source11: https://github.com/mlichvar/clknetsim/archive/%{clknetsim_ver}/clknets # don't repeat some log messages in multi-port configuration Patch1: linuxptp-logmsgs.patch +# add option to set clockClass threshold +Patch2: linuxptp-classthreshold.patch # limit unicast message rate per address and grant duration Patch4: linuxptp-ucastrate.patch # fix quoting in ptp4l man page @@ -48,6 +50,7 @@ Supporting legacy APIs and other platforms is not a goal. %prep %setup -q -a 10 -a 11 -n %{name}-%{!?gitfullver:%{version}}%{?gitfullver} %patch1 -p1 -b .logmsgs +%patch2 -p1 -b .classthreshold %patch4 -p1 -b .ucastrate %patch7 -p1 -b .manfix %patch8 -p1 -b .fclose @@ -75,7 +78,8 @@ echo 'OPTIONS="-a -r"' > $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/phc2sys echo '.so man8/ptp4l.8' > $RPM_BUILD_ROOT%{_mandir}/man5/ptp4l.conf.5 echo '.so man8/timemaster.8' > $RPM_BUILD_ROOT%{_mandir}/man5/timemaster.conf.5 -rm -f configs/snmpd.conf +# Remove patch backup files and non-linuxptp configuration +find configs -type f ! -name '*.cfg' -delete %check cd testsuite