|
Miroslav Lichvar |
68ba54 |
commit 7e8eba5332671abfd95d06dd191059eded1d2cca
|
|
Miroslav Lichvar |
68ba54 |
Author: Miroslav Lichvar <mlichvar@redhat.com>
|
|
Miroslav Lichvar |
68ba54 |
Date: Mon May 31 11:07:52 2021 +0200
|
|
Miroslav Lichvar |
68ba54 |
|
|
Miroslav Lichvar |
68ba54 |
clock: Reset state when switching port with same best clock.
|
|
Miroslav Lichvar |
68ba54 |
|
|
Miroslav Lichvar |
68ba54 |
When the best port is changed, but the ID of the best clock doesn't
|
|
Miroslav Lichvar |
68ba54 |
change (e.g. a passive port is activated on link failure), reset the
|
|
Miroslav Lichvar |
68ba54 |
current delay and other master/link-specific state to avoid the switch
|
|
Miroslav Lichvar |
68ba54 |
throwing the clock off.
|
|
Miroslav Lichvar |
68ba54 |
|
|
Miroslav Lichvar |
68ba54 |
Reviewed-by: Jacob Keller <jacob.e.keller@intel.com>
|
|
Miroslav Lichvar |
68ba54 |
Signed-off-by: Miroslav Lichvar <mlichvar@redhat.com>
|
|
Miroslav Lichvar |
68ba54 |
|
|
Miroslav Lichvar |
68ba54 |
diff --git a/clock.c b/clock.c
|
|
Miroslav Lichvar |
68ba54 |
index d428ae2..f14006f 100644
|
|
Miroslav Lichvar |
68ba54 |
--- a/clock.c
|
|
Miroslav Lichvar |
68ba54 |
+++ b/clock.c
|
|
Miroslav Lichvar |
68ba54 |
@@ -1940,7 +1940,7 @@ static void handle_state_decision_event(struct clock *c)
|
|
Miroslav Lichvar |
68ba54 |
best_id = c->dds.clockIdentity;
|
|
Miroslav Lichvar |
68ba54 |
}
|
|
Miroslav Lichvar |
68ba54 |
|
|
Miroslav Lichvar |
68ba54 |
- if (!cid_eq(&best_id, &c->best_id)) {
|
|
Miroslav Lichvar |
68ba54 |
+ if (!cid_eq(&best_id, &c->best_id) || best != c->best) {
|
|
Miroslav Lichvar |
68ba54 |
clock_freq_est_reset(c);
|
|
Miroslav Lichvar |
68ba54 |
tsproc_reset(c->tsproc, 1);
|
|
Miroslav Lichvar |
68ba54 |
if (!tmv_is_zero(c->initial_delay))
|
|
Miroslav Lichvar |
68ba54 |
|
|
Miroslav Lichvar |
68ba54 |
commit 262a49b07eaccc0f0237e3cd4df01b185b8f664f
|
|
Miroslav Lichvar |
68ba54 |
Author: Miroslav Lichvar <mlichvar@redhat.com>
|
|
Miroslav Lichvar |
68ba54 |
Date: Mon May 31 11:07:53 2021 +0200
|
|
Miroslav Lichvar |
68ba54 |
|
|
Miroslav Lichvar |
68ba54 |
clock: Reset clock check on best clock/port change.
|
|
Miroslav Lichvar |
68ba54 |
|
|
Miroslav Lichvar |
68ba54 |
Reset the clock check when the best clock or port changes, together with
|
|
Miroslav Lichvar |
68ba54 |
the other state like current estimated delay and frequency. This avoids
|
|
Miroslav Lichvar |
68ba54 |
false positives if the clock is controlled by an external process when
|
|
Miroslav Lichvar |
68ba54 |
not synchronized by PTP (e.g. phc2sys -rr).
|
|
Miroslav Lichvar |
68ba54 |
|
|
Miroslav Lichvar |
68ba54 |
Reviewed-by: Jacob Keller <jacob.e.keller@intel.com>
|
|
Miroslav Lichvar |
68ba54 |
Signed-off-by: Miroslav Lichvar <mlichvar@redhat.com>
|
|
Miroslav Lichvar |
68ba54 |
|
|
Miroslav Lichvar |
68ba54 |
diff --git a/clock.c b/clock.c
|
|
Miroslav Lichvar |
68ba54 |
index f14006f..7d0f985 100644
|
|
Miroslav Lichvar |
68ba54 |
--- a/clock.c
|
|
Miroslav Lichvar |
68ba54 |
+++ b/clock.c
|
|
Miroslav Lichvar |
68ba54 |
@@ -1942,6 +1942,8 @@ static void handle_state_decision_event(struct clock *c)
|
|
Miroslav Lichvar |
68ba54 |
|
|
Miroslav Lichvar |
68ba54 |
if (!cid_eq(&best_id, &c->best_id) || best != c->best) {
|
|
Miroslav Lichvar |
68ba54 |
clock_freq_est_reset(c);
|
|
Miroslav Lichvar |
68ba54 |
+ if (c->sanity_check)
|
|
Miroslav Lichvar |
68ba54 |
+ clockcheck_reset(c->sanity_check);
|
|
Miroslav Lichvar |
68ba54 |
tsproc_reset(c->tsproc, 1);
|
|
Miroslav Lichvar |
68ba54 |
if (!tmv_is_zero(c->initial_delay))
|
|
Miroslav Lichvar |
68ba54 |
tsproc_set_delay(c->tsproc, c->initial_delay);
|
|
Miroslav Lichvar |
68ba54 |
diff --git a/clockcheck.c b/clockcheck.c
|
|
Miroslav Lichvar |
68ba54 |
index d48a578..d0b4714 100644
|
|
Miroslav Lichvar |
68ba54 |
--- a/clockcheck.c
|
|
Miroslav Lichvar |
68ba54 |
+++ b/clockcheck.c
|
|
Miroslav Lichvar |
68ba54 |
@@ -47,9 +47,16 @@ struct clockcheck *clockcheck_create(int freq_limit)
|
|
Miroslav Lichvar |
68ba54 |
if (!cc)
|
|
Miroslav Lichvar |
68ba54 |
return NULL;
|
|
Miroslav Lichvar |
68ba54 |
cc->freq_limit = freq_limit;
|
|
Miroslav Lichvar |
68ba54 |
+ clockcheck_reset(cc);
|
|
Miroslav Lichvar |
68ba54 |
+ return cc;
|
|
Miroslav Lichvar |
68ba54 |
+}
|
|
Miroslav Lichvar |
68ba54 |
+
|
|
Miroslav Lichvar |
68ba54 |
+void clockcheck_reset(struct clockcheck *cc)
|
|
Miroslav Lichvar |
68ba54 |
+{
|
|
Miroslav Lichvar |
68ba54 |
+ cc->freq_known = 0;
|
|
Miroslav Lichvar |
68ba54 |
cc->max_freq = -CHECK_MAX_FREQ;
|
|
Miroslav Lichvar |
68ba54 |
cc->min_freq = CHECK_MAX_FREQ;
|
|
Miroslav Lichvar |
68ba54 |
- return cc;
|
|
Miroslav Lichvar |
68ba54 |
+ cc->last_ts = 0;
|
|
Miroslav Lichvar |
68ba54 |
}
|
|
Miroslav Lichvar |
68ba54 |
|
|
Miroslav Lichvar |
68ba54 |
int clockcheck_sample(struct clockcheck *cc, uint64_t ts)
|
|
Miroslav Lichvar |
68ba54 |
diff --git a/clockcheck.h b/clockcheck.h
|
|
Miroslav Lichvar |
68ba54 |
index 78aca48..1ff86eb 100644
|
|
Miroslav Lichvar |
68ba54 |
--- a/clockcheck.h
|
|
Miroslav Lichvar |
68ba54 |
+++ b/clockcheck.h
|
|
Miroslav Lichvar |
68ba54 |
@@ -33,6 +33,12 @@ struct clockcheck;
|
|
Miroslav Lichvar |
68ba54 |
*/
|
|
Miroslav Lichvar |
68ba54 |
struct clockcheck *clockcheck_create(int freq_limit);
|
|
Miroslav Lichvar |
68ba54 |
|
|
Miroslav Lichvar |
68ba54 |
+/**
|
|
Miroslav Lichvar |
68ba54 |
+ * Reset a clock check.
|
|
Miroslav Lichvar |
68ba54 |
+ * @param cc Pointer to a clock check obtained via @ref clockcheck_create().
|
|
Miroslav Lichvar |
68ba54 |
+ */
|
|
Miroslav Lichvar |
68ba54 |
+void clockcheck_reset(struct clockcheck *cc);
|
|
Miroslav Lichvar |
68ba54 |
+
|
|
Miroslav Lichvar |
68ba54 |
/**
|
|
Miroslav Lichvar |
68ba54 |
* Perform the sanity check on a time stamp.
|
|
Miroslav Lichvar |
68ba54 |
* @param cc Pointer to a clock check obtained via @ref clockcheck_create().
|
|
Miroslav Lichvar |
68ba54 |
|
|
Miroslav Lichvar |
68ba54 |
commit e117e37e379556fa23337db2518bb44d8793e039
|
|
Miroslav Lichvar |
68ba54 |
Author: Miroslav Lichvar <mlichvar@redhat.com>
|
|
Miroslav Lichvar |
68ba54 |
Date: Mon May 31 11:07:54 2021 +0200
|
|
Miroslav Lichvar |
68ba54 |
|
|
Miroslav Lichvar |
68ba54 |
port: Don't check timestamps from non-slave ports.
|
|
Miroslav Lichvar |
68ba54 |
|
|
Miroslav Lichvar |
68ba54 |
Don't perform the sanity check on receive timestamps from ports in
|
|
Miroslav Lichvar |
68ba54 |
non-slave states to avoid false positives in the jbod mode, where
|
|
Miroslav Lichvar |
68ba54 |
the timestamps can be generated by different clocks.
|
|
Miroslav Lichvar |
68ba54 |
|
|
Miroslav Lichvar |
68ba54 |
Reviewed-by: Jacob Keller <jacob.e.keller@intel.com>
|
|
Miroslav Lichvar |
68ba54 |
Signed-off-by: Miroslav Lichvar <mlichvar@redhat.com>
|
|
Miroslav Lichvar |
68ba54 |
|
|
Miroslav Lichvar |
68ba54 |
diff --git a/port.c b/port.c
|
|
Miroslav Lichvar |
68ba54 |
index b5b775f..ec5c92e 100644
|
|
Miroslav Lichvar |
68ba54 |
--- a/port.c
|
|
Miroslav Lichvar |
68ba54 |
+++ b/port.c
|
|
Miroslav Lichvar |
68ba54 |
@@ -2749,7 +2749,10 @@ static enum fsm_event bc_event(struct port *p, int fd_index)
|
|
Miroslav Lichvar |
68ba54 |
}
|
|
Miroslav Lichvar |
68ba54 |
if (msg_sots_valid(msg)) {
|
|
Miroslav Lichvar |
68ba54 |
ts_add(&msg->hwts.ts, -p->rx_timestamp_offset);
|
|
Miroslav Lichvar |
68ba54 |
- clock_check_ts(p->clock, tmv_to_nanoseconds(msg->hwts.ts));
|
|
Miroslav Lichvar |
68ba54 |
+ if (p->state == PS_SLAVE) {
|
|
Miroslav Lichvar |
68ba54 |
+ clock_check_ts(p->clock,
|
|
Miroslav Lichvar |
68ba54 |
+ tmv_to_nanoseconds(msg->hwts.ts));
|
|
Miroslav Lichvar |
68ba54 |
+ }
|
|
Miroslav Lichvar |
68ba54 |
}
|
|
Miroslav Lichvar |
68ba54 |
|
|
Miroslav Lichvar |
68ba54 |
switch (msg_type(msg)) {
|
|
Miroslav Lichvar |
68ba54 |
|
|
Miroslav Lichvar |
68ba54 |
commit 6df84259647757bc53818a039734f8ff85618c02
|
|
Miroslav Lichvar |
68ba54 |
Author: Miroslav Lichvar <mlichvar@redhat.com>
|
|
Miroslav Lichvar |
68ba54 |
Date: Mon May 31 11:07:55 2021 +0200
|
|
Miroslav Lichvar |
68ba54 |
|
|
Miroslav Lichvar |
68ba54 |
port: Don't renew raw transport.
|
|
Miroslav Lichvar |
68ba54 |
|
|
Miroslav Lichvar |
68ba54 |
Renewing of the transport on announce/sync timeout is needed in the
|
|
Miroslav Lichvar |
68ba54 |
client-only mode to avoid getting stuck with a broken multicast socket
|
|
Miroslav Lichvar |
68ba54 |
when the link goes down.
|
|
Miroslav Lichvar |
68ba54 |
|
|
Miroslav Lichvar |
68ba54 |
This shouldn't be necessary with the raw transport. Closing and binding
|
|
Miroslav Lichvar |
68ba54 |
of raw sockets can apparently be so slow that it triggers a false
|
|
Miroslav Lichvar |
68ba54 |
positive in the clock check.
|
|
Miroslav Lichvar |
68ba54 |
|
|
Miroslav Lichvar |
68ba54 |
Reported-by: Amar Subramanyam <asubramanyam@altiostar.com>
|
|
Miroslav Lichvar |
68ba54 |
Signed-off-by: Miroslav Lichvar <mlichvar@redhat.com>
|
|
Miroslav Lichvar |
68ba54 |
Reviewed-by: Jacob Keller <jacob.e.keller@intel.com>
|
|
Miroslav Lichvar |
68ba54 |
|
|
Miroslav Lichvar |
68ba54 |
diff --git a/port.c b/port.c
|
|
Miroslav Lichvar |
68ba54 |
index ec5c92e..c057591 100644
|
|
Miroslav Lichvar |
68ba54 |
--- a/port.c
|
|
Miroslav Lichvar |
68ba54 |
+++ b/port.c
|
|
Miroslav Lichvar |
68ba54 |
@@ -1811,6 +1811,12 @@ static int port_renew_transport(struct port *p)
|
|
Miroslav Lichvar |
68ba54 |
if (!port_is_enabled(p)) {
|
|
Miroslav Lichvar |
68ba54 |
return 0;
|
|
Miroslav Lichvar |
68ba54 |
}
|
|
Miroslav Lichvar |
68ba54 |
+
|
|
Miroslav Lichvar |
68ba54 |
+ /* Closing and binding of raw sockets is too slow and unnecessary */
|
|
Miroslav Lichvar |
68ba54 |
+ if (transport_type(p->trp) == TRANS_IEEE_802_3) {
|
|
Miroslav Lichvar |
68ba54 |
+ return 0;
|
|
Miroslav Lichvar |
68ba54 |
+ }
|
|
Miroslav Lichvar |
68ba54 |
+
|
|
Miroslav Lichvar |
68ba54 |
transport_close(p->trp, &p->fda);
|
|
Miroslav Lichvar |
68ba54 |
port_clear_fda(p, FD_FIRST_TIMER);
|
|
Miroslav Lichvar |
68ba54 |
res = transport_open(p->trp, p->iface, &p->fda, p->timestamping);
|
|
Miroslav Lichvar |
68ba54 |
|
|
Miroslav Lichvar |
68ba54 |
commit a082bcd700e4955ebaa00d7039bf4bce92048ac4
|
|
Miroslav Lichvar |
68ba54 |
Author: Miroslav Lichvar <mlichvar@redhat.com>
|
|
Miroslav Lichvar |
68ba54 |
Date: Mon May 31 11:07:56 2021 +0200
|
|
Miroslav Lichvar |
68ba54 |
|
|
Miroslav Lichvar |
68ba54 |
clockcheck: Increase minimum interval.
|
|
Miroslav Lichvar |
68ba54 |
|
|
Miroslav Lichvar |
68ba54 |
Increase the minimum check interval to 1 second to measure the frequency
|
|
Miroslav Lichvar |
68ba54 |
offset more accurately and with default configuration make false
|
|
Miroslav Lichvar |
68ba54 |
positives less likely due to a heavily overloaded system.
|
|
Miroslav Lichvar |
68ba54 |
|
|
Miroslav Lichvar |
68ba54 |
Signed-off-by: Miroslav Lichvar <mlichvar@redhat.com>
|
|
Miroslav Lichvar |
68ba54 |
Reviewed-by: Jacob Keller <jacob.e.keller@intel.com>
|
|
Miroslav Lichvar |
68ba54 |
|
|
Miroslav Lichvar |
68ba54 |
diff --git a/clockcheck.c b/clockcheck.c
|
|
Miroslav Lichvar |
68ba54 |
index d0b4714..f0141be 100644
|
|
Miroslav Lichvar |
68ba54 |
--- a/clockcheck.c
|
|
Miroslav Lichvar |
68ba54 |
+++ b/clockcheck.c
|
|
Miroslav Lichvar |
68ba54 |
@@ -23,7 +23,7 @@
|
|
Miroslav Lichvar |
68ba54 |
#include "clockcheck.h"
|
|
Miroslav Lichvar |
68ba54 |
#include "print.h"
|
|
Miroslav Lichvar |
68ba54 |
|
|
Miroslav Lichvar |
68ba54 |
-#define CHECK_MIN_INTERVAL 100000000
|
|
Miroslav Lichvar |
68ba54 |
+#define CHECK_MIN_INTERVAL 1000000000
|
|
Miroslav Lichvar |
68ba54 |
#define CHECK_MAX_FREQ 900000000
|
|
Miroslav Lichvar |
68ba54 |
|
|
Miroslav Lichvar |
68ba54 |
struct clockcheck {
|