On Tue, Aug 24, 2021 at 05:12:11AM +0000, Karthikkumar V via Linuxptp-devel
wrote:
> @@ -1997,6 +1998,9 @@ void process_delay_resp(struct port *p, struct
> ptp_message *m)
> return;
> }
>
> + /* Valid Delay Response received, reset the counter */
> + p->delay_response_counter = 0;
> +
> c3 = correction_to_tmv(m->header.correction);
> t3 = req->hwts.ts;
> t4 = timestamp_to_tmv(m->ts.pdu);
> @@ -2680,7 +2684,24 @@ static enum fsm_event bc_event(struct port *p, int
> fd_index)
> pr_debug("%s: delay timeout", p->log_name);
> port_set_delay_tmo(p);
> delay_req_prune(p);
> - return port_delay_request(p) ? EV_FAULT_DETECTED : EV_NONE;
> + if (port_delay_request(p)) {
> + return EV_FAULT_DETECTED;
> + }
> + /* Successfully send Delay Request,
> + * increment delay response counter
> + */
How about this instead?
if (p->delay_response_timeout && p->state == PS_SLAVE) {
p->delay_response_counter++;
if (p->delay_response_counter >=
p->delay_response_timeout) {
p->delay_response_counter = 0;
tsproc_reset(clock_get_tsproc(p->clock), 1);
pr_err("%s: delay response timeout",
p->log_name);
return EV_SYNCHRONIZATION_FAULT;
}
}
return EV_NONE;
I fixed that up and also corrected the man page text. Please check
the patch, below, and if you like it then I'll merge it like that.
Thanks,
Richard
>From 547aa74794c1bdc656b6416ff66ff8a0fb234e39 Mon Sep 17 00:00:00 2001
From: Karthikkumar V via Linuxptp-devel <[email protected]>
Date: Tue, 24 Aug 2021 05:12:11 +0000
Subject: [PATCH] Delay Response Timeout Feature addition for PTP4L
This code changes brings in the ability to program delay response timeout
within which, if the upstream master does not send a valid delay response
within the configurable delay response timeout duration, device will move
out of lock state.Default delay_response_timeout is 0 (disabled).
Signed-off-by: Karthikkumar V <[email protected]>
Signed-off-by: Ramana Reddy <[email protected]>
Reviewed-by: Miroslav Lichvar <[email protected]>
Signed-off-by: Richard Cochran <[email protected]>
---
clock.c | 5 +++++
clock.h | 7 +++++++
config.c | 1 +
configs/default.cfg | 1 +
port.c | 18 +++++++++++++++++-
port_private.h | 2 ++
ptp4l.8 | 6 ++++++
7 files changed, 39 insertions(+), 1 deletion(-)
diff --git a/clock.c b/clock.c
index ec70f91..7333313 100644
--- a/clock.c
+++ b/clock.c
@@ -1730,6 +1730,11 @@ UInteger16 clock_steps_removed(struct clock *c)
return c->cur.stepsRemoved;
}
+struct tsproc *clock_get_tsproc(struct clock *c)
+{
+ return c->tsproc;
+}
+
int clock_switch_phc(struct clock *c, int phc_index)
{
struct servo *servo;
diff --git a/clock.h b/clock.h
index 845d54f..e2a3e36 100644
--- a/clock.h
+++ b/clock.h
@@ -303,6 +303,13 @@ UInteger8 clock_get_clock_class_threshold(struct clock *c);
*/
UInteger16 clock_steps_removed(struct clock *c);
+/**
+ * Obtain the Time Stamp Processor instance from a clock.
+ * @param c The clock instance.
+ * @return The Time Stamp Processor associated with the clock.
+ */
+struct tsproc *clock_get_tsproc(struct clock *c);
+
/**
* Switch to a new PTP Hardware Clock, for use with the "jbod" mode.
* @param c The clock instance.
diff --git a/config.c b/config.c
index eb8b988..f3c52ba 100644
--- a/config.c
+++ b/config.c
@@ -239,6 +239,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),
+ PORT_ITEM_INT("delay_response_timeout", 0, 0, UINT8_MAX),
GLOB_ITEM_INT("dscp_event", 0, 0, 63),
GLOB_ITEM_INT("dscp_general", 0, 0, 63),
GLOB_ITEM_INT("domainNumber", 0, 0, 127),
diff --git a/configs/default.cfg b/configs/default.cfg
index d615610..cd383b5 100644
--- a/configs/default.cfg
+++ b/configs/default.cfg
@@ -30,6 +30,7 @@ logMinPdelayReqInterval 0
operLogPdelayReqInterval 0
announceReceiptTimeout 3
syncReceiptTimeout 0
+delay_response_timeout 0
delayAsymmetry 0
fault_reset_interval 4
neighborPropDelayThresh 20000000
diff --git a/port.c b/port.c
index c82bdaf..d5119b7 100644
--- a/port.c
+++ b/port.c
@@ -1732,6 +1732,7 @@ int port_initialize(struct port *p)
p->operLogPdelayReqInterval = config_get_int(cfg, p->name,
"operLogPdelayReqInterval");
p->neighborPropDelayThresh = config_get_int(cfg, p->name,
"neighborPropDelayThresh");
p->min_neighbor_prop_delay = config_get_int(cfg, p->name,
"min_neighbor_prop_delay");
+ p->delay_response_timeout = config_get_int(cfg, p->name,
"delay_response_timeout");
if (config_get_int(cfg, p->name, "asCapable") == AS_CAPABLE_TRUE) {
p->asCapable = ALWAYS_CAPABLE;
@@ -1997,6 +1998,9 @@ void process_delay_resp(struct port *p, struct
ptp_message *m)
return;
}
+ /* Valid Delay Response received, reset the counter */
+ p->delay_response_counter = 0;
+
c3 = correction_to_tmv(m->header.correction);
t3 = req->hwts.ts;
t4 = timestamp_to_tmv(m->ts.pdu);
@@ -2680,7 +2684,19 @@ static enum fsm_event bc_event(struct port *p, int
fd_index)
pr_debug("%s: delay timeout", p->log_name);
port_set_delay_tmo(p);
delay_req_prune(p);
- return port_delay_request(p) ? EV_FAULT_DETECTED : EV_NONE;
+ if (port_delay_request(p)) {
+ return EV_FAULT_DETECTED;
+ }
+ if (p->delay_response_timeout && p->state == PS_SLAVE) {
+ p->delay_response_counter++;
+ if (p->delay_response_counter >=
p->delay_response_timeout) {
+ p->delay_response_counter = 0;
+ tsproc_reset(clock_get_tsproc(p->clock), 1);
+ pr_err("%s: delay response timeout",
p->log_name);
+ return EV_SYNCHRONIZATION_FAULT;
+ }
+ }
+ return EV_NONE;
case FD_QUALIFICATION_TIMER:
pr_debug("%s: qualification timeout", p->log_name);
diff --git a/port_private.h b/port_private.h
index 2a98ef4..5391879 100644
--- a/port_private.h
+++ b/port_private.h
@@ -143,6 +143,8 @@ struct port {
struct fault_interval flt_interval_pertype[FT_CNT];
enum fault_type last_fault_type;
UInteger8 versionNumber; /* UInteger4 */
+ UInteger8 delay_response_counter;
+ UInteger8 delay_response_timeout;
struct PortStats stats;
/* foreignMasterDS */
LIST_HEAD(fm, foreign_clock) foreign_masters;
diff --git a/ptp4l.8 b/ptp4l.8
index a0779ef..8c2969f 100644
--- a/ptp4l.8
+++ b/ptp4l.8
@@ -204,6 +204,12 @@ running in gPTP mode according to the 802.1AS-2011
standard. Setting
this option to zero will disable the sync message timeout.
The default is 0 or disabled.
.TP
+.B delay_response_timeout
+The number of delay response messages that may go missing before
+triggering a synchronization fault. Setting this option to zero will
+disable the delay response timeout.
+The default is 0 or disabled.
+.TP
.B transportSpecific
The transport specific field. Must be in the range 0 to 255.
The default is 0.
--
2.20.1
_______________________________________________
Linuxptp-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linuxptp-devel