With this patch we introduce the twoStepFlag evaluation at port level.

---
 config.c |  2 +-
 port.c   | 35 ++++++++++++++++++++++++++++++++++-
 ptp4l.8  |  9 ++++-----
 3 files changed, 39 insertions(+), 7 deletions(-)

diff --git a/config.c b/config.c
index 4472d3d..f0e1e07 100644
--- a/config.c
+++ b/config.c
@@ -322,7 +322,7 @@ struct config_item config_tab[] = {
        PORT_ITEM_INT("ts2phc.pin_index", 0, 0, INT_MAX),
        GLOB_ITEM_INT("ts2phc.pulsewidth", 500000000, 1000000, 999000000),
        PORT_ITEM_ENU("tsproc_mode", TSPROC_FILTER, tsproc_enu),
-       GLOB_ITEM_INT("twoStepFlag", 1, 0, 1),
+       PORT_ITEM_INT("twoStepFlag", 1, 0, 1),
        GLOB_ITEM_INT("tx_timestamp_timeout", 1, 1, INT_MAX),
        PORT_ITEM_INT("udp_ttl", 1, 1, 255),
        PORT_ITEM_INT("udp6_scope", 0x0E, 0x00, 0x0F),
diff --git a/port.c b/port.c
index 10bb9e1..b700ff3 100644
--- a/port.c
+++ b/port.c
@@ -3028,6 +3028,37 @@ err:
        msg_put(msg);
 }
 
+static enum timestamp_type port_harmonize_onestep(struct port *p, enum 
timestamp_type timestamping, int twoStepFlag)
+{
+       switch (timestamping) {
+       case TS_SOFTWARE:
+       case TS_LEGACY_HW:
+               if (!twoStepFlag) {
+                       pr_err("%s: one step is only possible "
+                              "with hardware time stamping", p->log_name);
+                       return timestamping;
+               }
+               break;
+       case TS_HARDWARE:
+               if (!twoStepFlag) {
+                       pr_debug("%s: upgrading to one step time stamping "
+                                "in order to match the port.twoStepFlag", 
p->log_name);
+                       return TS_ONESTEP;
+               }
+               break;
+       case TS_ONESTEP:
+       case TS_P2P1STEP:
+               if (twoStepFlag) {
+                       pr_debug("%s: degrading to two step time stamping, "
+                                    "in order to match the port.twoStepFlag", 
p->log_name);
+                       return TS_HARDWARE;
+               }
+               break;
+       }
+
+       return timestamping;
+}
+
 struct port *port_open(const char *phc_device,
                       int phc_index,
                       enum timestamp_type timestamping,
@@ -3039,6 +3070,7 @@ struct port *port_open(const char *phc_device,
        struct config *cfg = clock_config(clock);
        struct port *p = malloc(sizeof(*p));
        int i;
+       int twoStepFlag;
 
        if (!p) {
                return NULL;
@@ -3134,7 +3166,8 @@ struct port *port_open(const char *phc_device,
        p->tx_timestamp_offset <<= 16;
        p->link_status = LINK_UP;
        p->clock = clock;
-       p->timestamping = timestamping;
+       twoStepFlag = config_get_int(cfg, p->name, "twoStepFlag");
+       p->timestamping = port_harmonize_onestep(p, timestamping, twoStepFlag);
        p->portIdentity.clockIdentity = clock_identity(clock);
        p->portIdentity.portNumber = number;
        p->state = PS_INITIALIZING;
diff --git a/ptp4l.8 b/ptp4l.8
index fe9e150..bea4dae 100644
--- a/ptp4l.8
+++ b/ptp4l.8
@@ -143,6 +143,10 @@ See UNICAST DISCOVERY OPTIONS, below.
 .SH PORT OPTIONS
 
 .TP
+.B twoStepFlag
+Enable two-step mode for sync messages. One-step mode can be used only with
+hardware time stamping.
+The default is 1 (enabled).
 .B delayAsymmetry
 The time difference in nanoseconds of the transmit and receive
 paths. This value should be positive when the server-to-client
@@ -378,11 +382,6 @@ to the same subnet.
 
 .SH PROGRAM AND CLOCK OPTIONS
 
-.TP
-.B twoStepFlag
-Enable two-step mode for sync messages. One-step mode can be used only with
-hardware time stamping.
-The default is 1 (enabled).
 .TP
 .B clientOnly
 The local clock is a client-only clock if enabled. The default is 0 (disabled).
-- 
2.31.1



_______________________________________________
Linuxptp-devel mailing list
Linuxptp-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxptp-devel

Reply via email to