Fixed the port id map in the Port Data Set event handling. The port id is composed by port number and node index after the HA implementation. Code tidying. As definition, the port id and the port number are different. An existing port number variable was rennamed to prevent missinterpretation. Code tidying. The HA node state change processing was disabled when HA feature is not enabled. Test plan: PASS: Verify the phc2sys executable recognizes the port in the port state change event, when -a configuration option is used PASS: Verify the events in the HA scenario are being recognized Story: 2010723 Task: 49405 Change-Id: Iea2b3c4e7d7dcd07ca2ad52bc4042f80282b1a9a Signed-off-by: Andre Mauricio Zelak <andre.zelak@windriver.com>
146 lines
5.0 KiB
Diff
146 lines
5.0 KiB
Diff
From c9a2a5398bace2f000ecc5ae6185b331cefa3a2c 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/56] 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.25.1
|
|
|