integ/base/linuxptp/debian/patches/0051-Time-traceable-flag.patch
Tara Subedi 12e86c6fa5 PTP: smooth/transparent HA switchover
Currently we have following inconsistency between linuxptp and
ptp-notification app.
1) pmc_agent.cc: PMC polling interval (PMC_UPDATE_INTERVAL of 60
sec on pmc_agent_update)
2) ptp-notification app: 'overalltracker_context': {'holdover_seconds':
'15'}

In context of HA switchover, there is pmc polling in 60 sec interval
(pmc_agent_update uses PMC_UPDATE_INTERVAL i.e 60s ). This means when
primary ptp source lost, it would take 60 sec to switchover to secondary
clock.
On ptp-application app side, we have 'ptptracker_context':
{'holdover_seconds': 15} 'overalltracker_context': {'holdover_seconds':
'15'} With this, when the selected ptp source is lost more than 15 sec,
the ptp state and overall state would go holdover and then freerun.

For smooth transition, PMC_UPDATE_INTERVAL should be <<
holdover_seconds. This commit introduces configurable value for
PMC_UPDATE_INTERVAL with "phc2sys .. -p <int value [1, 3600]>",
and without configuration, the default value would be of 7 sec.

TEST PLAN:
PASS: deploy PTP with HA phy2sys parameter of "-p 60"
        or with file global parameter "pmc_update_interval_sec 60"
      stop primary ptp4l instance and check users.log to see
      the "timeout reading pmc" in 60 secs.
PASS: deploy PTP with HA Phy2sys without parameter of "-p"
      stop primary ptp4l instance and check users.log to see
      the "timeout reading pmc" in 7 secs.
      check HA switchover happens in 7 secs, and overall
      state won't change from Locked to holdover/freerun.

Story: 2011370
Task: 52061

Change-Id: I8a9123b15acbbff41954db42822b9f501cd5f2c9
Signed-off-by: Tara Nath Subedi <tara.subedi@windriver.com>
2025-04-29 15:45:08 -04:00

107 lines
3.7 KiB
Diff

From: Andre Mauricio Zelak <andre.zelak@windriver.com>
Date: Wed, 30 Aug 2023 13:28:34 -0300
Subject: [PATCH 51/63] Time traceable flag
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.
Story: 2010723
Task: 48702
Signed-off-by: Andre Mauricio Zelak <andre.zelak@windriver.com>
---
phc2sys.c | 4 ++--
pmc_agent.c | 5 +++++
pmc_agent.h | 1 +
3 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/phc2sys.c b/phc2sys.c
index 5df89e5..27ba630 100644
--- a/phc2sys.c
+++ b/phc2sys.c
@@ -361,7 +361,7 @@ static bool clock_match_ha_tpds_requirements(struct clock *clock, struct config
}
/* is time traceable */
- if (check_time_traceable && !clock->node->utc_offset_traceable) {
+ if (check_time_traceable && !clock->node->time_traceable) {
pr_debug("clock %s time is not traceable", clock->device);
return false;
}
@@ -1336,7 +1336,7 @@ static int ha_handle_status_msg(struct phc2sys_private *priv, char *response,
clock->node->dds.clockQuality.clockClass,
clock->node->dds.clockQuality.clockAccuracy,
clock->node->dds.clockQuality.offsetScaledLogVariance,
- clock->node->utc_offset_traceable ? "yes" : "no ",
+ clock->node->time_traceable ? "yes" : "no ",
clock->node->freq_traceable ? "yes" : "no ",
clock->node->pds.grandmasterClockQuality.clockClass,
clock->node->pds.grandmasterClockQuality.clockAccuracy,
diff --git a/pmc_agent.c b/pmc_agent.c
index 92fc14c..bf65897 100644
--- a/pmc_agent.c
+++ b/pmc_agent.c
@@ -344,6 +344,7 @@ int pmc_agent_query_utc_offset(struct pmc_agent *node, int timeout)
struct ptp_message *msg;
int res;
int sync_offset, leap, utc_offset_traceable, freq_traceable;
+ int time_traceable;
res = run_pmc(node, timeout, MID_TIME_PROPERTIES_DATA_SET, &msg);
if (is_run_pmc_error(res)) {
@@ -354,6 +355,7 @@ int pmc_agent_query_utc_offset(struct pmc_agent *node, int timeout)
sync_offset = node->sync_offset;
leap = node->leap;
utc_offset_traceable = node->utc_offset_traceable;
+ time_traceable = node->time_traceable;
freq_traceable = node->freq_traceable;
tds = (struct timePropertiesDS *) management_tlv_data(msg);
@@ -367,11 +369,13 @@ int pmc_agent_query_utc_offset(struct pmc_agent *node, int timeout)
node->leap = 0;
node->utc_offset_traceable = tds->flags & UTC_OFF_VALID &&
tds->flags & TIME_TRACEABLE;
+ node->time_traceable = tds->flags & TIME_TRACEABLE;
node->freq_traceable = tds->flags & FREQ_TRACEABLE;
} else {
node->sync_offset = 0;
node->leap = 0;
node->utc_offset_traceable = 0;
+ node->time_traceable = 0;
node->freq_traceable = 0;
}
@@ -379,6 +383,7 @@ int pmc_agent_query_utc_offset(struct pmc_agent *node, int timeout)
if ((sync_offset != node->sync_offset) ||
(leap != node->leap) ||
(utc_offset_traceable != node->utc_offset_traceable) ||
+ (time_traceable != node->time_traceable) ||
(freq_traceable != node->freq_traceable)) {
node->new_tpds = true;
}
diff --git a/pmc_agent.h b/pmc_agent.h
index 38951b1..4e70606 100644
--- a/pmc_agent.h
+++ b/pmc_agent.h
@@ -43,6 +43,7 @@ struct pmc_agent {
bool stay_subscribed;
int sync_offset;
int utc_offset_traceable;
+ int time_traceable;
int freq_traceable;
bool new_tpds;
unsigned int index;