Signed-off-by: Anders Selhammer <anders.selham...@est.tech>
---
 bmc.h       |  5 +++++
 clock.c     | 15 ++++++++++++---
 config.c    | 12 +++++++++++-
 default.cfg |  3 +++
 gPTP.cfg    |  3 +++
 port.c      |  2 ++
 ptp4l.8     | 33 +++++++++++++++++++++++++++++++++
 7 files changed, 69 insertions(+), 4 deletions(-)

diff --git a/bmc.h b/bmc.h
index b8f3561..aca6db2 100644
--- a/bmc.h
+++ b/bmc.h
@@ -32,6 +32,11 @@ typedef int (*dscmp_type)(struct dataset*, struct dataset*);
 struct clock; /*forward declaration*/
 struct port; /*forward declaration*/
 
+enum dscmp_type {
+       DSCMP_IEEE1588,
+       DSCMP_G8275,
+};
+
 /**
  * BMC state decision algorithm.
  * @param c  The local clock.
diff --git a/clock.c b/clock.c
index 272c7da..1547cdb 100644
--- a/clock.c
+++ b/clock.c
@@ -35,10 +35,10 @@
 #include "msg.h"
 #include "phc.h"
 #include "port.h"
-#include "servo.h"
-#include "stats.h"
 #include "print.h"
 #include "rtnl.h"
+#include "servo.h"
+#include "stats.h"
 #include "tlv.h"
 #include "tsproc.h"
 #include "uds.h"
@@ -1068,7 +1068,16 @@ struct clock *clock_create(enum clock_type type, struct 
config *config,
        }
        c->servo_state = SERVO_UNLOCKED;
        c->servo_type = servo;
-       c->dscmp = dscmp_ieee1588;
+       switch (config_get_int(config, NULL, "dscmp")) {
+       case DSCMP_IEEE1588:
+               c->dscmp = dscmp_G8275;
+               break;
+       case DSCMP_G8275:
+       default:
+               c->dscmp = dscmp_ieee1588;
+       }
+       c->localPriority =
+               config_get_int(config, NULL, "G.8275.defaultDS.localPriority");
        c->tsproc = tsproc_create(config_get_int(config, NULL, "tsproc_mode"),
                                  config_get_int(config, NULL, "delay_filter"),
                                  config_get_int(config, NULL, 
"delay_filter_length"));
diff --git a/config.c b/config.c
index 320cc1b..5444905 100644
--- a/config.c
+++ b/config.c
@@ -22,6 +22,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include "bmc.h"
 #include "config.h"
 #include "ether.h"
 #include "hash.h"
@@ -125,6 +126,12 @@ struct config_item {
 #define PORT_ITEM_STR(label, _default) \
        CONFIG_ITEM_STRING(label, 1, _default)
 
+static struct config_enum dscmp_enu[] = {
+       { "ieee1588", DSCMP_IEEE1588 },
+       { "G8275",    DSCMP_G8275    },
+       { NULL, 0 },
+};
+
 static struct config_enum clock_servo_enu[] = {
        { "pi",     CLOCK_SERVO_PI     },
        { "linreg", CLOCK_SERVO_LINREG },
@@ -182,6 +189,7 @@ struct config_item config_tab[] = {
        PORT_ITEM_ENU("delay_filter", FILTER_MOVING_MEDIAN, delay_filter_enu),
        PORT_ITEM_INT("delay_filter_length", 10, 1, INT_MAX),
        PORT_ITEM_ENU("delay_mechanism", DM_E2E, delay_mech_enu),
+       GLOB_ITEM_ENU("dscmp", DSCMP_IEEE1588, dscmp_enu),
        GLOB_ITEM_INT("dscp_event", 0, 0, 63),
        GLOB_ITEM_INT("dscp_general", 0, 0, 63),
        GLOB_ITEM_INT("domainNumber", 0, 0, 127),
@@ -198,14 +206,16 @@ struct config_item config_tab[] = {
        PORT_ITEM_INT("ingressLatency", 0, INT_MIN, INT_MAX),
        GLOB_ITEM_INT("initial_delay", 0, 0, INT_MAX),
        GLOB_ITEM_INT("kernel_leap", 1, 0, 1),
+       GLOB_ITEM_INT("G.8275.defaultDS.localPriority", 128, 0, UINT8_MAX),
+       PORT_ITEM_INT("G.8275.portDS.localPriority", 128, 0, UINT8_MAX),
        PORT_ITEM_INT("logAnnounceInterval", 1, INT8_MIN, INT8_MAX),
        PORT_ITEM_INT("logMinDelayReqInterval", 0, INT8_MIN, INT8_MAX),
        PORT_ITEM_INT("logMinPdelayReqInterval", 0, INT8_MIN, INT8_MAX),
        PORT_ITEM_INT("logSyncInterval", 0, INT8_MIN, INT8_MAX),
        GLOB_ITEM_INT("logging_level", LOG_INFO, PRINT_LEVEL_MIN, 
PRINT_LEVEL_MAX),
-       GLOB_ITEM_STR("message_tag", NULL),
        GLOB_ITEM_STR("manufacturerIdentity", "00:00:00"),
        GLOB_ITEM_INT("max_frequency", 900000000, 0, INT_MAX),
+       GLOB_ITEM_STR("message_tag", NULL),
        PORT_ITEM_INT("min_neighbor_prop_delay", -20000000, INT_MIN, -1),
        PORT_ITEM_INT("neighborPropDelayThresh", 20000000, 0, INT_MAX),
        PORT_ITEM_INT("net_sync_monitor", 0, 0, 1),
diff --git a/default.cfg b/default.cfg
index e76aeae..fff0271 100644
--- a/default.cfg
+++ b/default.cfg
@@ -15,6 +15,8 @@ free_running          0
 freq_est_interval      1
 dscp_event             0
 dscp_general           0
+dscmp                  ieee1588
+G.8275.defaultDS.localPriority 128
 #
 # Port Data Set
 #
@@ -27,6 +29,7 @@ syncReceiptTimeout    0
 delayAsymmetry         0
 fault_reset_interval   4
 neighborPropDelayThresh        20000000
+G.8275.portDS.localPriority 128
 #
 # Run time options
 #
diff --git a/gPTP.cfg b/gPTP.cfg
index 1e7a33e..e2f2a0f 100644
--- a/gPTP.cfg
+++ b/gPTP.cfg
@@ -13,6 +13,8 @@ clockAccuracy         0xFE
 offsetScaledLogVariance        0xFFFF
 free_running           0
 freq_est_interval      1
+dscmp                  ieee1588
+G.8275.defaultDS.localPriority 128
 #
 # Port Data Set
 #
@@ -25,6 +27,7 @@ delayAsymmetry                0
 fault_reset_interval   4
 neighborPropDelayThresh        800
 min_neighbor_prop_delay        -20000000
+G.8275.portDS.localPriority 128
 #
 # Run time options
 #
diff --git a/port.c b/port.c
index 458f77b..3d03bb7 100644
--- a/port.c
+++ b/port.c
@@ -2836,6 +2836,8 @@ struct port *port_open(int phc_index,
        p->portIdentity.clockIdentity = clock_identity(clock);
        p->portIdentity.portNumber = number;
        p->state = PS_INITIALIZING;
+       p->localPriority =
+               config_get_int(cfg, interface->name, 
"G.8275.portDS.localPriority");
        p->delayMechanism = config_get_int(cfg, p->name, "delay_mechanism");
        p->versionNumber = PTP_VERSION;
 
diff --git a/ptp4l.8 b/ptp4l.8
index 950e07c..a201a53 100644
--- a/ptp4l.8
+++ b/ptp4l.8
@@ -245,6 +245,21 @@ The default is UDPv4.
 Upper limit for peer delay in nanoseconds. If the estimated peer delay is
 greater than this value the port is marked as not 802.1AS capable.
 .TP
+.B G.8275.portDS.localPriority
+The Telecom Profiles (ITU-T G.8275.1 and G.8275.2) specify an
+alternate Best Master Clock Algorithm (BMCA) with a unique data set
+comparison algorithm.  The value of this option is associated with
+Announce messages arriving on a particular port and is used as a tie
+breaker whenever clockClass, clockAccuracy, offsetScaledLogVariance,
+and priority2 are equal. This option is only used when
+"dscmp" is set to "G8275".
+The default value is 128.
+
+Warning: the BMCA is guaranteed to produce a spanning tree (that is, a
+timing network without loops) only when using the default values of
+G.8275.defaultDS.localPriority and G.8275.portDS.localPriority.
+Careful network engineering is needed when using non-default values.
+.TP
 .B min_neighbor_prop_delay
 Lower limit for peer delay in nanoseconds. If the estimated peer delay is
 smaller than this value the port is marked as not 802.1AS capable.
@@ -341,6 +356,24 @@ The offsetScaledLogVariance attribute of the local clock. 
It characterizes the
 stability of the clock.
 The default is 0xFFFF.
 .TP
+.B dscmp
+The dscmp attribute of the local clock. It used to select which dataset 
comparison function to use in the Best Master Clock Algorithm (BMCA).
+The default is ieee1588.
+.TP
+.B G.8275.defaultDS.localPriority
+The Telecom Profiles (ITU-T G.8275.1 and G.8275.2) specify an
+alternate Best Master Clock Algorithm (BMCA) with a unique data set
+comparison algorithm.  The value of this option is associated with the
+local clock and is used as a tie breaker whenever clockClass,
+clockAccuracy, offsetScaledLogVariance, and priority2 are equal. This
+option is only used when "dscmp" is set to "G8275".
+The default value is 128.
+
+Warning: the BMCA is guaranteed to produce a spanning tree (that is, a
+timing network without loops) only when using the default values of
+G.8275.defaultDS.localPriority and G.8275.portDS.localPriority.
+Careful network engineering is needed when using non-default values.
+.TP
 .B domainNumber
 The domain attribute of the local clock.
 The default is 0.
-- 
1.8.3.1


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Linuxptp-devel mailing list
Linuxptp-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxptp-devel

Reply via email to