- adding sync receipt timeout, delay response timeout and signal fail support to portDS as per G.8275.2. - This also sets the signal fail condition for timeout.
Signed-off-by: Greg Armstrong <greg.armstrong...@renesas.com> Signed-off-by: Leon Goldin <leon.goldin...@renesas.com> Signed-off-by: Devasish Dey <devasish....@syncmonk.net> Signed-off-by: Vipin Sharma <vipin.sha...@syncmonk.net> --- ds.h | 9 +++++++++ pmc.c | 9 +++++++-- port.c | 16 +++++++++++++++- port_private.h | 1 + 4 files changed, 32 insertions(+), 3 deletions(-) diff --git a/ds.h b/ds.h index dff6d5e..5136bb2 100644 --- a/ds.h +++ b/ds.h @@ -95,6 +95,11 @@ struct timePropertiesDS { Enumeration8 timeSource; } PACKED; + +#define PDS_PTSF_LOSS_SYNC (1<<0) +#define PDS_PTSF_UNUSABLE (1<<1) +#define PDS_PTSF_LOSS_DELAY_RESP (1<<2) + struct portDS { struct PortIdentity portIdentity; Enumeration8 portState; @@ -106,6 +111,10 @@ struct portDS { Enumeration8 delayMechanism; Integer8 logMinPdelayReqInterval; UInteger8 versionNumber; + UInteger8 localPriority; + UInteger8 signalFail; + UInteger8 syncReceiptTimeout; + UInteger8 delayRespReceiptTimeout; } PACKED; #define FRI_ASAP (-128) diff --git a/pmc.c b/pmc.c index e218ca4..cdc76c8 100644 --- a/pmc.c +++ b/pmc.c @@ -438,16 +438,21 @@ static void pmc_show(struct ptp_message *msg, FILE *fp) IFMT "peerMeanPathDelay %" PRId64 IFMT "logAnnounceInterval %hhd" IFMT "announceReceiptTimeout %hhu" + IFMT "syncReceiptTimeout %hhu" + IFMT "delayRespReceiptTimeout %hhu" IFMT "logSyncInterval %hhd" IFMT "delayMechanism %hhu" IFMT "logMinPdelayReqInterval %hhd" - IFMT "versionNumber %u", + IFMT "versionNumber %u" + IFMT "signalFail %d", pid2str(&p->portIdentity), ps_str[p->portState], p->logMinDelayReqInterval, p->peerMeanPathDelay >> 16, p->logAnnounceInterval, p->announceReceiptTimeout, + p->syncReceiptTimeout, p->delayRespReceiptTimeout, p->logSyncInterval, p->delayMechanism, p->logMinPdelayReqInterval, - p->versionNumber & MAJOR_VERSION_MASK); + p->versionNumber & MAJOR_VERSION_MASK, + p->signalFail ? 1 : 0); break; case MID_PORT_DATA_SET_NP: pnp = (struct port_ds_np *) mgt->data; diff --git a/port.c b/port.c index 871ad68..8075896 100644 --- a/port.c +++ b/port.c @@ -951,6 +951,9 @@ static int port_management_fill_response(struct port *target, } pds->logMinPdelayReqInterval = target->logMinPdelayReqInterval; pds->versionNumber = target->versionNumber; + pds->syncReceiptTimeout = target->syncReceiptTimeout; + pds->delayRespReceiptTimeout = target->delay_response_timeout; + pds->signalFail = target->signalFail; datalen = sizeof(*pds); break; case MID_LOG_ANNOUNCE_INTERVAL: @@ -1115,7 +1118,6 @@ static int port_management_set(struct port *target, int respond = 0; struct management_tlv *tlv; struct port_ds_np *pdsnp; - tlv = (struct management_tlv *) req->management.suffix; switch (id) { @@ -1284,6 +1286,7 @@ static void port_synchronize(struct port *p, enum servo_state state, last_state; tmv_t t1, t1c, t2, c1, c2; + p->signalFail &= ~PDS_PTSF_LOSS_SYNC; port_set_sync_rx_tmo(p); t1 = timestamp_to_tmv(origin_ts); @@ -1995,6 +1998,12 @@ int process_announce(struct port *p, struct ptp_message *m) return result; } + if (p->signalFail) { + pr_debug("%s: Announce message ignored for signal fail\n", + p->name); + return result; + } + if (m->announce.grandmasterClockQuality.clockClass > clock_get_clock_class_threshold(p->clock)) { pl_err(60, "%s: Master clock quality received is " @@ -2089,6 +2098,9 @@ void process_delay_resp(struct port *p, struct ptp_message *m) struct ptp_message *req; tmv_t c3, t3, t4, t4c; + /* clear delay response time out. */ + p->signalFail &= ~PDS_PTSF_LOSS_DELAY_RESP; + if (p->state != PS_UNCALIBRATED && p->state != PS_SLAVE) { return; } @@ -2780,6 +2792,7 @@ static enum fsm_event bc_event(struct port *p, int fd_index) if (fd_index == FD_SYNC_RX_TIMER) { p->service_stats.sync_timeout++; + p->signalFail |= PDS_PTSF_LOSS_SYNC; } else { p->service_stats.announce_timeout++; } @@ -2821,6 +2834,7 @@ static enum fsm_event bc_event(struct port *p, int fd_index) if (p->delay_response_timeout && p->state == PS_SLAVE) { p->delay_response_counter++; if (p->delay_response_counter >= p->delay_response_timeout) { + p->signalFail |= PDS_PTSF_LOSS_DELAY_RESP; p->delay_response_counter = 0; tsproc_reset(clock_get_tsproc(p->clock), 1); pr_err("%s: delay response timeout", p->log_name); diff --git a/port_private.h b/port_private.h index d27dceb..33422fd 100644 --- a/port_private.h +++ b/port_private.h @@ -126,6 +126,7 @@ struct port { Integer8 operLogPdelayReqInterval; Integer8 logPdelayReqInterval; UInteger32 neighborPropDelayThresh; + UInteger8 signalFail; int follow_up_info; int freq_est_interval; int hybrid_e2e; -- 2.25.1 _______________________________________________ Linuxptp-devel mailing list Linuxptp-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linuxptp-devel