06c396fbe3
The issue reported is a particular case of a BC configured with redundant PTP clocks with same priority. When a clock recovers from a failure, as both clock were configured with same priority it's expected the active clock source to remain active. But if the recovered clock presented a better local clock class than active, it was being selected active. This specific case was fixed. Closes-bug: 2084723 Test plan: BC with same priority PASS: Start the PTP service with all clocks out of requirements, one is selected, no matter which one. PASS: Then, when the backup clock recovers from failure it is selected active. PASS: Then, when the other clock recovers from failure it remains as backup, no matter the local clock class. PASS: Then, when the active goes out of requirement, the backup is set active. Test plan: GM with same priority PASS: Start the PTP service with all clocks out of requirements, one is selected, no matter which one. PASS: Then, when the backup clock recovers from failure it is selected active. PASS: Then, when the other clock recovers from failure it remains as backup, no matter the local clock class. PASS: Then, when the active goes out of requirement, the backup is set active. Change-Id: Id2568bc8bbaad4cbf15070314f7904d3c3bbd53d Signed-off-by: Andre Mauricio Zelak <andre.zelak@windriver.com>
130 lines
4.1 KiB
Diff
130 lines
4.1 KiB
Diff
From: Andre Mauricio Zelak <andre.zelak@windriver.com>
|
|
Date: Mon, 12 Jun 2023 15:17:26 -0300
|
|
Subject: [PATCH 21/61] pmc_agent: Simplify the update method.
|
|
|
|
The main method that causes the PMC agent to update its status takes a flag
|
|
that results in different behavior when push notifications are active.
|
|
This patch simplifies the interface by letting the agent remember whether
|
|
or not the caller subscribed to the notifications in the first place.
|
|
|
|
Signed-off-by: Richard Cochran <richardcochran@gmail.com>
|
|
Reviewed-by: Vladimir Oltean <olteanv@gmail.com>
|
|
|
|
[commit 1126f8f67e853199f05a7c993c910ebc7807bd3d upstream]
|
|
Signed-off-by: Andre Mauricio Zelak <andre.zelak@windriver.com>
|
|
---
|
|
phc2sys.c | 6 ++++--
|
|
pmc_agent.c | 32 ++++++++++++++++++++------------
|
|
pmc_agent.h | 2 +-
|
|
3 files changed, 25 insertions(+), 15 deletions(-)
|
|
|
|
diff --git a/phc2sys.c b/phc2sys.c
|
|
index f61e699..b155961 100644
|
|
--- a/phc2sys.c
|
|
+++ b/phc2sys.c
|
|
@@ -672,7 +672,7 @@ static int do_pps_loop(struct phc2sys_private *priv, struct clock *clock,
|
|
pps_offset = pps_ts - phc_ts;
|
|
}
|
|
|
|
- if (update_pmc_node(priv->node, 0) < 0)
|
|
+ if (update_pmc_node(priv->node) < 0)
|
|
continue;
|
|
update_clock(priv, clock, pps_offset, pps_ts, -1);
|
|
}
|
|
@@ -710,8 +710,10 @@ static int do_loop(struct phc2sys_private *priv, int subscriptions)
|
|
|
|
while (is_running()) {
|
|
clock_nanosleep(CLOCK_MONOTONIC, 0, &interval, NULL);
|
|
- if (update_pmc_node(priv->node, subscriptions) < 0)
|
|
+
|
|
+ if (update_pmc_node(priv->node) < 0) {
|
|
continue;
|
|
+ }
|
|
|
|
if (subscriptions) {
|
|
run_pmc_events(priv->node);
|
|
diff --git a/pmc_agent.c b/pmc_agent.c
|
|
index 9c5eb71..dd509af 100644
|
|
--- a/pmc_agent.c
|
|
+++ b/pmc_agent.c
|
|
@@ -42,6 +42,7 @@ struct pmc_agent {
|
|
int clock_identity_set;
|
|
int leap;
|
|
int pmc_ds_requested;
|
|
+ bool stay_subscribed;
|
|
int sync_offset;
|
|
int utc_offset_traceable;
|
|
|
|
@@ -188,6 +189,19 @@ static int run_pmc(struct pmc_agent *node, int timeout, int ds_id,
|
|
}
|
|
}
|
|
|
|
+static int renew_subscription(struct pmc_agent *node, int timeout)
|
|
+{
|
|
+ struct ptp_message *msg;
|
|
+ int res;
|
|
+
|
|
+ res = run_pmc(node, timeout, TLV_SUBSCRIBE_EVENTS_NP, &msg);
|
|
+ if (is_run_pmc_error(res)) {
|
|
+ return run_pmc_err2errno(res);
|
|
+ }
|
|
+ msg_put(msg);
|
|
+ return 0;
|
|
+}
|
|
+
|
|
int run_pmc_wait_sync(struct pmc_agent *node, int timeout)
|
|
{
|
|
struct ptp_message *msg;
|
|
@@ -323,7 +337,7 @@ int run_pmc_clock_identity(struct pmc_agent *node, int timeout)
|
|
}
|
|
|
|
/* Returns: -1 in case of error, 0 otherwise */
|
|
-int update_pmc_node(struct pmc_agent *node, int subscribe)
|
|
+int update_pmc_node(struct pmc_agent *node)
|
|
{
|
|
struct timespec tp;
|
|
uint64_t ts;
|
|
@@ -337,8 +351,9 @@ int update_pmc_node(struct pmc_agent *node, int subscribe)
|
|
if (node->pmc &&
|
|
!(ts > node->pmc_last_update &&
|
|
ts - node->pmc_last_update < PMC_UPDATE_INTERVAL)) {
|
|
- if (subscribe)
|
|
- pmc_agent_subscribe(node, 0);
|
|
+ if (node->stay_subscribed) {
|
|
+ renew_subscription(node, 0);
|
|
+ }
|
|
if (run_pmc_get_utc_offset(node, 0) > 0)
|
|
node->pmc_last_update = ts;
|
|
}
|
|
@@ -393,15 +408,8 @@ void pmc_agent_set_sync_offset(struct pmc_agent *agent, int offset)
|
|
|
|
int pmc_agent_subscribe(struct pmc_agent *node, int timeout)
|
|
{
|
|
- struct ptp_message *msg;
|
|
- int res;
|
|
-
|
|
- res = run_pmc(node, timeout, TLV_SUBSCRIBE_EVENTS_NP, &msg);
|
|
- if (is_run_pmc_error(res)) {
|
|
- return run_pmc_err2errno(res);
|
|
- }
|
|
- msg_put(msg);
|
|
- return 0;
|
|
+ node->stay_subscribed = true;
|
|
+ return renew_subscription(node, timeout);
|
|
}
|
|
|
|
bool pmc_agent_utc_offset_traceable(struct pmc_agent *agent)
|
|
diff --git a/pmc_agent.h b/pmc_agent.h
|
|
index 9dc684e..743818f 100644
|
|
--- a/pmc_agent.h
|
|
+++ b/pmc_agent.h
|
|
@@ -33,7 +33,7 @@ typedef int pmc_node_recv_subscribed_t(void *context, struct ptp_message *msg,
|
|
|
|
int init_pmc_node(struct config *cfg, struct pmc_agent *agent, const char *uds,
|
|
pmc_node_recv_subscribed_t *recv_subscribed, void *context);
|
|
-int update_pmc_node(struct pmc_agent *agent, int subscribe);
|
|
+int update_pmc_node(struct pmc_agent *agent);
|
|
int run_pmc_clock_identity(struct pmc_agent *agent, int timeout);
|
|
int run_pmc_wait_sync(struct pmc_agent *agent, int timeout);
|
|
int run_pmc_get_number_ports(struct pmc_agent *agent, int timeout);
|