dcavalca / rpms / linuxptp

Forked from rpms/linuxptp 2 years ago
Clone
c547f6
Backported commit f774703cb1eee058a346aec3341fee0be329bd6d
c547f6
Author: Karthikkumar V <kvaloor@altiostar.com>
c547f6
Date:   Fri Feb 26 06:54:07 2021 +0000
c547f6
c547f6
    Clock Class Threshold Feature addition for PTP4L
c547f6
    
c547f6
    This code changes brings in the ability to program the acceptable
c547f6
    clockClass threshold beyond which device will move to holdover/free-run.
c547f6
    Default clockClass threshold is 248.
c547f6
    Example Use-Case:
c547f6
    This is needed in the cases where T-SC/T-BC Slave might want to listen
c547f6
    only on PRC clockCLass and anything beyond that might not be acceptible
c547f6
    and would want to go to holdover (with SyncE backup or internal oscillator).
c547f6
    
c547f6
    Signed-off-by: Karthikkumar V <kvaloor@altiostar.com>
c547f6
    Signed-off-by: Ramana Reddy <rreddy@altiostar.com>
c547f6
c547f6
diff --git a/clock.c b/clock.c
c547f6
index c1fcff6..d584748 100644
c547f6
--- a/clock.c
c547f6
+++ b/clock.c
c547f6
@@ -114,6 +114,7 @@ struct clock {
c547f6
 	int utc_offset;
c547f6
 	int time_flags;  /* grand master role */
c547f6
 	int time_source; /* grand master role */
c547f6
+	UInteger8 clock_class_threshold;
c547f6
 	UInteger8 max_steps_removed;
c547f6
 	enum servo_state servo_state;
c547f6
 	enum timestamp_type timestamping;
c547f6
@@ -978,6 +979,7 @@ struct clock *clock_create(enum clock_type type, struct config *config,
c547f6
 	c->default_dataset.localPriority =
c547f6
 		config_get_int(config, NULL, "G.8275.defaultDS.localPriority");
c547f6
 	c->max_steps_removed = config_get_int(config, NULL,"maxStepsRemoved");
c547f6
+	c->clock_class_threshold = config_get_int(config, NULL, "clock_class_threshold");
c547f6
 
c547f6
 	/* Harmonize the twoStepFlag with the time_stamping option. */
c547f6
 	if (config_harmonize_onestep(config)) {
c547f6
@@ -1711,6 +1713,11 @@ UInteger8 clock_max_steps_removed(struct clock *c)
c547f6
 	return c->max_steps_removed;
c547f6
 }
c547f6
 
c547f6
+UInteger8 clock_get_clock_class_threshold(struct clock *c)
c547f6
+{
c547f6
+	return c->clock_class_threshold;
c547f6
+}
c547f6
+
c547f6
 UInteger16 clock_steps_removed(struct clock *c)
c547f6
 {
c547f6
 	return c->cur.stepsRemoved;
c547f6
diff --git a/clock.h b/clock.h
c547f6
index e7daf97..845d54f 100644
c547f6
--- a/clock.h
c547f6
+++ b/clock.h
c547f6
@@ -289,6 +289,13 @@ int clock_slave_only(struct clock *c);
c547f6
  */
c547f6
 UInteger8 clock_max_steps_removed(struct clock *c);
c547f6
 
c547f6
+/**
c547f6
+ * Obtain the clock class threshold field from a clock's default data set.
c547f6
+ * @param c  The clock instance.
c547f6
+ * @return   Configured clock class threshold value.
c547f6
+ */
c547f6
+UInteger8 clock_get_clock_class_threshold(struct clock *c);
c547f6
+
c547f6
 /**
c547f6
  * Obtain the steps removed field from a clock's current data set.
c547f6
  * @param c  The clock instance.
c547f6
diff --git a/config.c b/config.c
c547f6
index c3deddb..bf1049f 100644
c547f6
--- a/config.c
c547f6
+++ b/config.c
c547f6
@@ -231,6 +231,7 @@ struct config_item config_tab[] = {
c547f6
 	GLOB_ITEM_INT("clockAccuracy", 0xfe, 0, UINT8_MAX),
c547f6
 	GLOB_ITEM_INT("clockClass", 248, 0, UINT8_MAX),
c547f6
 	GLOB_ITEM_STR("clockIdentity", "000000.0000.000000"),
c547f6
+	GLOB_ITEM_INT("clock_class_threshold", CLOCK_CLASS_THRESHOLD_DEFAULT, 6, CLOCK_CLASS_THRESHOLD_DEFAULT),
c547f6
 	GLOB_ITEM_ENU("clock_servo", CLOCK_SERVO_PI, clock_servo_enu),
c547f6
 	GLOB_ITEM_ENU("clock_type", CLOCK_TYPE_ORDINARY, clock_type_enu),
c547f6
 	GLOB_ITEM_ENU("dataset_comparison", DS_CMP_IEEE1588, dataset_comp_enu),
c547f6
diff --git a/configs/default.cfg b/configs/default.cfg
c547f6
index 9604219..b2ffa94 100644
c547f6
--- a/configs/default.cfg
c547f6
+++ b/configs/default.cfg
c547f6
@@ -60,6 +60,7 @@ verbose			0
c547f6
 summary_interval	0
c547f6
 kernel_leap		1
c547f6
 check_fup_sync		0
c547f6
+clock_class_threshold	248
c547f6
 #
c547f6
 # Servo Options
c547f6
 #
c547f6
diff --git a/ds.h b/ds.h
c547f6
index 9d9c417..dff6d5e 100644
c547f6
--- a/ds.h
c547f6
+++ b/ds.h
c547f6
@@ -87,6 +87,7 @@ struct parent_ds {
c547f6
 
c547f6
 #define CURRENT_UTC_OFFSET  37 /* 1 Jan 2017 */
c547f6
 #define INTERNAL_OSCILLATOR 0xA0
c547f6
+#define CLOCK_CLASS_THRESHOLD_DEFAULT 248
c547f6
 
c547f6
 struct timePropertiesDS {
c547f6
 	Integer16    currentUtcOffset;
c547f6
diff --git a/port.c b/port.c
c547f6
index 2bb974c..eb3b319 100644
c547f6
--- a/port.c
c547f6
+++ b/port.c
c547f6
@@ -1870,6 +1870,14 @@ int process_announce(struct port *p, struct ptp_message *m)
c547f6
 		return result;
c547f6
 	}
c547f6
 
c547f6
+	if (m->announce.grandmasterClockQuality.clockClass >
c547f6
+		clock_get_clock_class_threshold(p->clock)) {
c547f6
+		pl_err(60, "port %hu: Master clock quality received is "
c547f6
+			"greater than configured, ignoring master!",
c547f6
+			portnum(p));
c547f6
+		return result;
c547f6
+	}
c547f6
+
c547f6
 	switch (p->state) {
c547f6
 	case PS_INITIALIZING:
c547f6
 	case PS_FAULTY:
c547f6
diff --git a/ptp4l.8 b/ptp4l.8
c547f6
index b04936a..ca76175 100644
c547f6
--- a/ptp4l.8
c547f6
+++ b/ptp4l.8
c547f6
@@ -455,6 +455,11 @@ message is greater than or equal to the value of maxStepsRemoved the
c547f6
 Announce message is not considered in the operation of the BMCA.
c547f6
 The default value is 255.
c547f6
 .TP
c547f6
+.B clock_class_threshold
c547f6
+The maximum clock class value from master, acceptible to sub-ordinate
c547f6
+clock beyond which it moves out of lock state.
c547f6
+The default value is 248.
c547f6
+.TP
c547f6
 
c547f6
 .B domainNumber
c547f6
 The domain attribute of the local clock.