integ/base/linuxptp/debian/patches/0048-HA-domain-number.patch
Cole Walker aca42c6d4c Implement logic to skip updates with offset spike in ts2phc.
This change allows ts2phc to be configured to ignore timing updates that
have a large offset spike in order to mitigate the resulting timing
skew.

In some circumstances on realtime systems with high CPU load, the
timestamp consumed by ts2phc can be delayed in reaching ts2phc and
results in the offset calculation attempting to speed the clock up by a
large margin.

This change causes ts2phc to ignore updates that would greatly skew the
clock when ts2phc is already in a synchronized state.

The global configuration option "max_phc_update_skip_cnt" is provided to
allow users to specify how many consecutive offset spike incidents will
be ignored before adjusting the clock. The default value is 120. The
behaviour can be disabled by setting max_phc_update_skip_cnt to 0.

This code is ported from a proposed upstream patch found here:
https://sourceforge.net/p/linuxptp/mailman/message/44114092/

Test-plan:
Pass: Verify linuxptp package build
Pass: Deploy ts2phc binary and verify system time sync
Pass: Manually trigger offset spike and verify that ts2phc maintains
stable time sync

Closes-bug: https://bugs.launchpad.net/starlingx/+bug/2059955

Change-Id: I13cd5c3440682ec9256e11449fe62d5fe28f66fa
Signed-off-by: Cole Walker <cole.walker@windriver.com>
2024-04-01 14:53:06 -04:00

146 lines
5.0 KiB
Diff

From 2b78be90379bf767961bec1b3f99462c54036cbf Mon Sep 17 00:00:00 2001
From: Andre Mauricio Zelak <andre.zelak@windriver.com>
Date: Mon, 21 Aug 2023 14:28:20 -0300
Subject: [PATCH 48/58] HA domain number
Support multiple domain numbers for each uds socket used in HA phc2sys.
The ha_domainNumber option is an interface setting to configure the domain
number for an uds socket. It ranges from 0 to 127. If the ha_domainNumber
is not configured for a given interface, the global domainNumber setting
is used.
Test plan:
PASS: Verify use of ha_domainNumber configuration in manual configuration.
Failure path: domain number match
PASS: Verify that phc2sys fails to start if domain number
doesn't match ptp4l instance parameter.
Regression:
PASS: Verify use of global domain number in manual configuration.
PASS: Verify auto configuration uses global domain number.
Signed-off-by: Andre Mauricio Zelak <andre.zelak@windriver.com>
---
config.c | 16 +++++++++++++++-
config.h | 3 +++
phc2sys.c | 11 +++++++++--
pmc_agent.c | 6 +++---
pmc_agent.h | 3 ++-
5 files changed, 32 insertions(+), 7 deletions(-)
diff --git a/config.c b/config.c
index 6a1bfb4..1b7ed51 100644
--- a/config.c
+++ b/config.c
@@ -250,8 +250,9 @@ struct config_item config_tab[] = {
GLOB_ITEM_INT("G.8275.defaultDS.localPriority", 128, 1, UINT8_MAX),
PORT_ITEM_INT("G.8275.portDS.localPriority", 128, 1, UINT8_MAX),
GLOB_ITEM_INT("gmCapable", 1, 0, 1),
- GLOB_ITEM_INT("ha_frequencyTraceable", 0, 0, 1),
+ PORT_ITEM_INT("ha_domainNumber", 0, 0, 127),
GLOB_ITEM_INT("ha_enabled", 0, 0, 1),
+ GLOB_ITEM_INT("ha_frequencyTraceable", 0, 0, 1),
GLOB_ITEM_INT("ha_min_clockAccuracy", 0xfe, 0, 0xff),
GLOB_ITEM_INT("ha_min_gm_ClockClass", 135, 6, 255),
GLOB_ITEM_INT("ha_min_local_clockClass", 135, 6, 255),
@@ -1022,6 +1023,19 @@ unsigned int config_get_interfaces(struct config *cfg, char *interfaces[], unsig
return counter;
}
+bool config_is_option_set(struct config *cfg, const char *section,
+ const char *option)
+{
+ struct config_item *ci;
+ if (section) {
+ ci = config_section_item(cfg, section, option);
+ } else {
+ ci = config_global_item(cfg, option);
+ }
+ fprintf(stderr, "section: %s option: %s ci:%p\n", section, option, ci);
+ return !!ci;
+}
+
int config_harmonize_onestep(struct config *cfg)
{
enum timestamp_type tstype = config_get_int(cfg, NULL, "time_stamping");
diff --git a/config.h b/config.h
index 645fb42..f074736 100644
--- a/config.h
+++ b/config.h
@@ -66,6 +66,9 @@ char *config_get_string(struct config *cfg, const char *section,
unsigned int config_get_interfaces(struct config *cfg, char *interfaces[], unsigned int max);
+bool config_is_option_set(struct config *cfg, const char *section,
+ const char *option);
+
int config_harmonize_onestep(struct config *cfg);
static inline struct option *config_long_options(struct config *cfg)
diff --git a/phc2sys.c b/phc2sys.c
index 065b7f0..be7b07a 100644
--- a/phc2sys.c
+++ b/phc2sys.c
@@ -2226,7 +2226,8 @@ int main(int argc, char *argv[])
getpid());
if (autocfg) {
- if (init_pmc_node(cfg, node, uds_local,
+ domain_number = config_get_int(cfg, NULL, "domainNumber");
+ if (init_pmc_node(cfg, node, uds_local, domain_number,
phc2sys_recv_subscribed, &priv))
goto end;
if (auto_init_ports(&priv, rt) < 0)
@@ -2305,7 +2306,13 @@ int main(int argc, char *argv[])
snprintf(uds_local, sizeof(uds_local), "/var/run/phc2sys.%d.%s",
getpid(), src->device);
- if (init_pmc_node(cfg, src->node, uds_local,
+ if (config_is_option_set(cfg, src->device, "ha_domainNumber")) {
+ domain_number = config_get_int(cfg, src->device,
+ "ha_domainNumber");
+ } else {
+ domain_number = config_get_int(cfg, NULL, "domainNumber");
+ }
+ if (init_pmc_node(cfg, src->node, uds_local, domain_number,
phc2sys_recv_subscribed, &priv))
goto end;
diff --git a/pmc_agent.c b/pmc_agent.c
index af15710..92fc14c 100644
--- a/pmc_agent.c
+++ b/pmc_agent.c
@@ -220,10 +220,10 @@ void run_pmc_events(struct pmc_agent *node)
}
int init_pmc_node(struct config *cfg, struct pmc_agent *node, const char *uds,
- pmc_node_recv_subscribed_t *recv_subscribed, void *context)
+ int domain_number, pmc_node_recv_subscribed_t *recv_subscribed,
+ void *context)
{
- node->pmc = pmc_create(cfg, TRANS_UDS, uds, 0,
- config_get_int(cfg, NULL, "domainNumber"),
+ node->pmc = pmc_create(cfg, TRANS_UDS, uds, 0, domain_number,
config_get_int(cfg, NULL, "transportSpecific") << 4, 1);
if (!node->pmc) {
pr_err("failed to create pmc");
diff --git a/pmc_agent.h b/pmc_agent.h
index 8207c46..38951b1 100644
--- a/pmc_agent.h
+++ b/pmc_agent.h
@@ -56,7 +56,8 @@ struct pmc_agent {
};
int init_pmc_node(struct config *cfg, struct pmc_agent *agent, const char *uds,
- pmc_node_recv_subscribed_t *recv_subscribed, void *context);
+ int domain_number, pmc_node_recv_subscribed_t *recv_subscribed,
+ void *context);
int run_pmc_wait_sync(struct pmc_agent *agent, int timeout);
void run_pmc_events(struct pmc_agent *agent);
--
2.30.2