
Fix clock selection algorithm behavior where a clock source starts to match requirements but is not selected because it has the same ha_priority than active. In a HA configuration with two or more clocks configured with equal ha_priority if no clock source matches the requirements the first one in the configuration file is selected active. This is a standard behavior to always have a clock source, even when they are not synchronized. When one of the clock sources starts to match the requirements it must be selected active, regardless of the priority. But when a second clock source starts to match the requirements and has the same ha_priority as the active, the active remains the clock source. There is no need to switch active when they have equal ha_priority. Test plan: two sources with the same priority PASS: Verify a clock source is selected active when it starts to match the requirements and the current active doesn't match them, even if they have equal ha_priority. PASS: Verify a clock source isn't selected active when it starts to match the requirements and the current active also matches them. Regression: two sources with different priority PASS: Verify a clock source is selected active when it starts to match the requirements and the current active doesn't match them, even if their ha_priority is lower than the actives. PASS: Verify a clock source is selected active when it starts to match the requirements and the current active also matches them but has lower ha_priority configured. PASS: Verify a clock source isn't selected active when it starts to match the requirements and the current active also matches them and has higher ha_priority configured. Story: 2010723 Task: 48699 Change-Id: If80532b7b8febcc164f7c748a8d4122b4f10fd3b Signed-off-by: Andre Mauricio Zelak <andre.zelak@windriver.com>
183 lines
5.4 KiB
Diff
183 lines
5.4 KiB
Diff
From b8188a4fd51bc8983e5d19f18fe37b8ca39d03a6 Mon Sep 17 00:00:00 2001
|
|
From: Andre Mauricio Zelak <andre.zelak@windriver.com>
|
|
Date: Mon, 12 Jun 2023 17:20:04 -0300
|
|
Subject: [PATCH 27/50] pmc_agent: Convert the method that queries TAI-UTC
|
|
offset into the canonical form.
|
|
|
|
This patch renames the function to have the module prefix and corrects the
|
|
return code semantics.
|
|
|
|
The active word in the function's name is "query" rather that "get" in
|
|
order to distinguish methods that send and receive over the network
|
|
from those that merely return a cached value.
|
|
|
|
Signed-off-by: Richard Cochran <richardcochran@gmail.com>
|
|
Reviewed-by: Jacob Keller <jacob.e.keller@intel.com>
|
|
|
|
[commit 943c8f51c56acb72277d1a9459bbf7b7a5ac5fe7 upstream]
|
|
Signed-off-by: Andre Mauricio Zelak <andre.zelak@windriver.com>
|
|
---
|
|
phc2sys.c | 8 +++----
|
|
pmc_agent.c | 63 +++++++++++++++++++++++++++--------------------------
|
|
pmc_agent.h | 16 ++++++++++++--
|
|
3 files changed, 50 insertions(+), 37 deletions(-)
|
|
|
|
diff --git a/phc2sys.c b/phc2sys.c
|
|
index 3cafbb2..78d662b 100644
|
|
--- a/phc2sys.c
|
|
+++ b/phc2sys.c
|
|
@@ -720,7 +720,7 @@ static int do_loop(struct phc2sys_private *priv, int subscriptions)
|
|
if (priv->state_changed) {
|
|
/* force getting offset, as it may have
|
|
* changed after the port state change */
|
|
- if (run_pmc_get_utc_offset(priv->node, 1000) <= 0) {
|
|
+ if (pmc_agent_query_utc_offset(priv->node, 1000)) {
|
|
pr_err("failed to get UTC offset");
|
|
continue;
|
|
}
|
|
@@ -921,7 +921,7 @@ static int auto_init_ports(struct phc2sys_private *priv, int add_rt)
|
|
}
|
|
|
|
/* get initial offset */
|
|
- if (run_pmc_get_utc_offset(priv->node, 1000) <= 0) {
|
|
+ if (pmc_agent_query_utc_offset(priv->node, 1000)) {
|
|
pr_err("failed to get UTC offset");
|
|
return -1;
|
|
}
|
|
@@ -1330,8 +1330,8 @@ int main(int argc, char *argv[])
|
|
}
|
|
|
|
if (!priv.forced_sync_offset) {
|
|
- r = run_pmc_get_utc_offset(priv.node, 1000);
|
|
- if (r <= 0) {
|
|
+ r = pmc_agent_query_utc_offset(priv.node, 1000);
|
|
+ if (r) {
|
|
pr_err("failed to get UTC offset");
|
|
goto end;
|
|
}
|
|
diff --git a/pmc_agent.c b/pmc_agent.c
|
|
index 833d1c1..7a57a2f 100644
|
|
--- a/pmc_agent.c
|
|
+++ b/pmc_agent.c
|
|
@@ -228,36 +228,6 @@ int run_pmc_wait_sync(struct pmc_agent *node, int timeout)
|
|
}
|
|
}
|
|
|
|
-int run_pmc_get_utc_offset(struct pmc_agent *node, int timeout)
|
|
-{
|
|
- struct ptp_message *msg;
|
|
- int res;
|
|
- struct timePropertiesDS *tds;
|
|
-
|
|
- res = run_pmc(node, timeout, TLV_TIME_PROPERTIES_DATA_SET, &msg);
|
|
- if (res <= 0)
|
|
- return res;
|
|
-
|
|
- tds = (struct timePropertiesDS *) management_tlv_data(msg);
|
|
- if (tds->flags & PTP_TIMESCALE) {
|
|
- node->sync_offset = tds->currentUtcOffset;
|
|
- if (tds->flags & LEAP_61)
|
|
- node->leap = 1;
|
|
- else if (tds->flags & LEAP_59)
|
|
- node->leap = -1;
|
|
- else
|
|
- node->leap = 0;
|
|
- node->utc_offset_traceable = tds->flags & UTC_OFF_VALID &&
|
|
- tds->flags & TIME_TRACEABLE;
|
|
- } else {
|
|
- node->sync_offset = 0;
|
|
- node->leap = 0;
|
|
- node->utc_offset_traceable = 0;
|
|
- }
|
|
- msg_put(msg);
|
|
- return 1;
|
|
-}
|
|
-
|
|
int run_pmc_get_number_ports(struct pmc_agent *node, int timeout)
|
|
{
|
|
struct ptp_message *msg;
|
|
@@ -384,6 +354,37 @@ int pmc_agent_get_sync_offset(struct pmc_agent *agent)
|
|
return agent->sync_offset;
|
|
}
|
|
|
|
+int pmc_agent_query_utc_offset(struct pmc_agent *node, int timeout)
|
|
+{
|
|
+ struct timePropertiesDS *tds;
|
|
+ struct ptp_message *msg;
|
|
+ int res;
|
|
+
|
|
+ res = run_pmc(node, timeout, TLV_TIME_PROPERTIES_DATA_SET, &msg);
|
|
+ if (is_run_pmc_error(res)) {
|
|
+ return run_pmc_err2errno(res);
|
|
+ }
|
|
+
|
|
+ tds = (struct timePropertiesDS *) management_tlv_data(msg);
|
|
+ if (tds->flags & PTP_TIMESCALE) {
|
|
+ node->sync_offset = tds->currentUtcOffset;
|
|
+ if (tds->flags & LEAP_61)
|
|
+ node->leap = 1;
|
|
+ else if (tds->flags & LEAP_59)
|
|
+ node->leap = -1;
|
|
+ else
|
|
+ node->leap = 0;
|
|
+ node->utc_offset_traceable = tds->flags & UTC_OFF_VALID &&
|
|
+ tds->flags & TIME_TRACEABLE;
|
|
+ } else {
|
|
+ node->sync_offset = 0;
|
|
+ node->leap = 0;
|
|
+ node->utc_offset_traceable = 0;
|
|
+ }
|
|
+ msg_put(msg);
|
|
+ return 0;
|
|
+}
|
|
+
|
|
void pmc_agent_set_sync_offset(struct pmc_agent *agent, int offset)
|
|
{
|
|
agent->sync_offset = offset;
|
|
@@ -413,7 +414,7 @@ int pmc_agent_update(struct pmc_agent *node)
|
|
if (node->stay_subscribed) {
|
|
renew_subscription(node, 0);
|
|
}
|
|
- if (run_pmc_get_utc_offset(node, 0) > 0) {
|
|
+ if (!pmc_agent_query_utc_offset(node, 0)) {
|
|
node->pmc_last_update = ts;
|
|
}
|
|
}
|
|
diff --git a/pmc_agent.h b/pmc_agent.h
|
|
index 0ed10f8..44326d2 100644
|
|
--- a/pmc_agent.h
|
|
+++ b/pmc_agent.h
|
|
@@ -40,8 +40,6 @@ void run_pmc_events(struct pmc_agent *agent);
|
|
int run_pmc_port_properties(struct pmc_agent *agent, int timeout,
|
|
unsigned int port, int *state,
|
|
int *tstamping, char *iface);
|
|
-int run_pmc_get_utc_offset(struct pmc_agent *agent, int timeout);
|
|
-
|
|
|
|
/**
|
|
* Creates an instance of a PMC agent.
|
|
@@ -75,6 +73,20 @@ int pmc_agent_get_leap(struct pmc_agent *agent);
|
|
*/
|
|
int pmc_agent_get_sync_offset(struct pmc_agent *agent);
|
|
|
|
+/**
|
|
+ * Queries the TAI-UTC offset and the current leap adjustment from the
|
|
+ * ptp4l service.
|
|
+ *
|
|
+ * In addition:
|
|
+ *
|
|
+ * - The port state notification callback might be invoked.
|
|
+ *
|
|
+ * @param agent Pointer to a PMC instance obtained via @ref pmc_agent_create().
|
|
+ * @param timeout Transmit and receive timeout in milliseconds.
|
|
+ * @return Zero on success, negative error code otherwise.
|
|
+ */
|
|
+int pmc_agent_query_utc_offset(struct pmc_agent *agent, int timeout);
|
|
+
|
|
/**
|
|
* Sets the TAI-UTC offset.
|
|
* @param agent Pointer to a PMC instance obtained via @ref pmc_agent_create().
|
|
--
|
|
2.25.1
|
|
|