A new time traceable flag was added to pmc agent to store the current time traceable status. This flag replaces the utc_offset_traceable flag in the HA clock selection algorithm and status command. Test plan: HA clock selection algorithm PASS: Verify the clock source which time isn't traceable is discarded by the algorithm if ha_gm_timeTraceable is enabled. PASS: Verify the clock source which time is traceable isn't discarded by the algorithm if ha_gm_timeTraceable is enabled. Regression: status command PASS: Verify the response of status command shows the correct GM time traceable. The 'valid sources' command is used to get a list of interfaces which the clock is matching the requirements. The response contains a space separated list of interfaces, or "None" when not a single clock is matching all the requirements. Test plan: valid sources command PASS: Verify that a space separated list of interface is returned when one or more clocks match the requirements. PASS: Verify that the string "None" is returned when not a single clock match the requirements. Now the GM time traceable check is enabled by default as it is an important check for both T-GM and T-BC scenarios. The GM time traceable check is controlled in configuration by using the ha_gm_timeTraceable setting, and it can be disabled using the value 0 (ha_gm_timeTraceable 0). Test plan: default value PASS Verify the check is performed by default. PASS Verify the user can disable the check by configuration. Bonus: Fixed the behavior when none clock is matching the requirements and the active clock source is disabled using the 'disable source <interface>' command. The interface is must be disabled and a new clock source is selected. Test plan: none clock is matching the requirements PASS: Verify that the active source can be disabled and a new one is selected. PASS: Verify that an attempt to disable the last active interface fails and an appopriated message is given as response. PASS: Verify that the interface with higher priority is selected after re-enabling it. PASS: Verify the active clock source doesn't change if another interface is disabled. PASS: Verify the active clock source doesn't change if another interface is re-enabled. Story: 2010723 Task: 48702 Change-Id: I64193575a995e520d36460c0ebb8dd452fa8c2b8 Signed-off-by: Andre Mauricio Zelak <andre.zelak@windriver.com>
134 lines
4.1 KiB
Diff
134 lines
4.1 KiB
Diff
From 82a369b4fe44a7cea41fb0ccf408c02b1b6aa694 Mon Sep 17 00:00:00 2001
|
|
From: Andre Mauricio Zelak <andre.zelak@windriver.com>
|
|
Date: Mon, 12 Jun 2023 15:17:26 -0300
|
|
Subject: [PATCH 21/54] 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);
|
|
--
|
|
2.25.1
|
|
|