--- config.c | 2 +- port.c | 40 +++++++++++++++++++++++++++++++++++++++- ptp4l.8 | 9 ++++----- 3 files changed, 44 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..1d7059d 100644 --- a/port.c +++ b/port.c @@ -3028,6 +3028,42 @@ err: msg_put(msg); } +static enum timestamp_type port_harmonize_onestep(struct port *p, enum timestamp_type timestamping, int twoStepFlag) +{ + if (twoStepFlag < 0) { + // As global + return timestamping; + } + + 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 +3075,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 +3171,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