The UDS uses a global setting from the configuration to set the remote
server address.  As a result, a program cannot act as both a UDS
client and server, because the source and destination addresses would
be identical.  Fix the issue by allowing the remote address to be
configurable.

Signed-off-by: Richard Cochran <richardcoch...@gmail.com>
---
 pmc.c        | 6 ++++--
 pmc_agent.c  | 3 ++-
 pmc_common.c | 8 ++++----
 pmc_common.h | 6 +++---
 tz2alt.c     | 3 ++-
 uds.c        | 6 ++++--
 6 files changed, 19 insertions(+), 13 deletions(-)

diff --git a/pmc.c b/pmc.c
index 9faf790..d18fea0 100644
--- a/pmc.c
+++ b/pmc.c
@@ -823,8 +823,10 @@ int main(int argc, char *argv[])
        print_set_syslog(1);
        print_set_verbose(1);
 
-       pmc = pmc_create(cfg, transport_type, iface_name, boundary_hops,
-                        domain_number, transport_specific, zero_datalen);
+       pmc = pmc_create(cfg, transport_type, iface_name,
+                        config_get_string(cfg, NULL, "uds_address"),
+                        boundary_hops, domain_number, transport_specific,
+                        zero_datalen);
        if (!pmc) {
                fprintf(stderr, "failed to create pmc\n");
                config_destroy(cfg);
diff --git a/pmc_agent.c b/pmc_agent.c
index 494c174..fec6dea 100644
--- a/pmc_agent.c
+++ b/pmc_agent.c
@@ -232,7 +232,8 @@ int run_pmc_wait_sync(struct pmc_agent *node, int timeout)
 int init_pmc_node(struct config *cfg, struct pmc_agent *node, const char *uds,
                  pmc_node_recv_subscribed_t *recv_subscribed, void *context)
 {
-       node->pmc = pmc_create(cfg, TRANS_UDS, uds, 0,
+       node->pmc = pmc_create(cfg, TRANS_UDS, uds,
+                              config_get_string(cfg, NULL, "uds_address"), 0,
                               config_get_int(cfg, NULL, "domainNumber"),
                               config_get_int(cfg, NULL, "transportSpecific") 
<< 4, 1);
        if (!node->pmc) {
diff --git a/pmc_common.c b/pmc_common.c
index 5092c09..fca16c6 100644
--- a/pmc_common.c
+++ b/pmc_common.c
@@ -488,9 +488,9 @@ struct pmc {
 };
 
 struct pmc *pmc_create(struct config *cfg, enum transport_type transport_type,
-                      const char *iface_name, UInteger8 boundary_hops,
-                      UInteger8 domain_number, UInteger8 transport_specific,
-                      int zero_datalen)
+                      const char *iface_name, const char *remote_address,
+                      UInteger8 boundary_hops, UInteger8 domain_number,
+                      UInteger8 transport_specific, int zero_datalen)
 {
        struct pmc *pmc;
        UInteger32 proc_id;
@@ -524,7 +524,7 @@ struct pmc *pmc_create(struct config *cfg, enum 
transport_type transport_type,
                goto failed;
        }
 
-       pmc->iface = interface_create(iface_name, NULL);
+       pmc->iface = interface_create(iface_name, remote_address);
        if (!pmc->iface) {
                pr_err("failed to create interface");
                goto failed;
diff --git a/pmc_common.h b/pmc_common.h
index 6fb2fae..355b2c0 100644
--- a/pmc_common.h
+++ b/pmc_common.h
@@ -29,9 +29,9 @@
 struct pmc;
 
 struct pmc *pmc_create(struct config *cfg, enum transport_type transport_type,
-                      const char *iface_name, UInteger8 boundary_hops,
-                      UInteger8 domain_number, UInteger8 transport_specific,
-                      int zero_datalen);
+                      const char *iface_name, const char *remote_address,
+                      UInteger8 boundary_hops, UInteger8 domain_number,
+                      UInteger8 transport_specific, int zero_datalen);
 
 void pmc_destroy(struct pmc *pmc);
 
diff --git a/tz2alt.c b/tz2alt.c
index feb77a5..65b5835 100644
--- a/tz2alt.c
+++ b/tz2alt.c
@@ -181,7 +181,8 @@ static int update_ptp_serivce(struct tzinfo *tz, struct 
tzinfo *next)
        struct pmc *pmc;
        int err;
 
-       pmc = pmc_create(cfg, TRANS_UDS, uds_local, 0,
+       pmc = pmc_create(cfg, TRANS_UDS, uds_local,
+                        config_get_string(cfg, NULL, "uds_address"), 0,
                         config_get_int(cfg, NULL, "domainNumber"),
                         config_get_int(cfg, NULL, "transportSpecific") << 4, 
1);
        if (!pmc) {
diff --git a/uds.c b/uds.c
index 6d39dc8..fafb100 100644
--- a/uds.c
+++ b/uds.c
@@ -54,7 +54,7 @@ static int uds_open(struct transport *t, struct interface 
*iface, struct fdarray
                    enum timestamp_type tt)
 {
        char *uds_ro_path = config_get_string(t->cfg, NULL, "uds_ro_address");
-       char *uds_path = config_get_string(t->cfg, NULL, "uds_address");
+       const char *uds_path = interface_remote(iface);
        struct uds *uds = container_of(t, struct uds, t);
        const char *name = interface_name(iface);
        const char* file_mode_cfg;
@@ -89,7 +89,9 @@ static int uds_open(struct transport *t, struct interface 
*iface, struct fdarray
        /* For client use, pre load the server path. */
        memset(&sa, 0, sizeof(sa));
        sa.sun_family = AF_LOCAL;
-       strncpy(sa.sun_path, uds_path, sizeof(sa.sun_path) - 1);
+       if (uds_path) {
+               strncpy(sa.sun_path, uds_path, sizeof(sa.sun_path) - 1);
+       }
        uds->address.sun = sa;
        uds->address.len = sizeof(sa);
 
-- 
2.39.2



_______________________________________________
Linuxptp-devel mailing list
Linuxptp-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxptp-devel

Reply via email to