From bb92294f4ed46b6aef803c7eff8f5ec2daa59355 Mon Sep 17 00:00:00 2001 From: Erik Boasson Date: Sun, 14 Oct 2018 13:55:56 +0800 Subject: [PATCH] Let dds_create_participant determine domain id if config specifies "any" (new default) Note: DDS_DOMAIN_DEFAULT with a configuration specifying "any" results in domain 0. Signed-off-by: Erik Boasson --- src/core/ddsc/src/dds__init.h | 2 +- src/core/ddsc/src/dds_builtin.c | 4 +-- src/core/ddsc/src/dds_init.c | 24 ++++++++++++-- src/core/ddsc/src/dds_participant.c | 2 +- src/core/ddsc/tests/participant.c | 4 +-- src/core/ddsi/include/ddsi/q_config.h | 3 +- src/core/ddsi/src/q_addrset.c | 4 +-- src/core/ddsi/src/q_config.c | 45 ++++++++++++++++++++------- src/core/ddsi/src/q_init.c | 32 +++++++------------ src/etc/cmake/default.xml.in | 2 +- 10 files changed, 78 insertions(+), 44 deletions(-) diff --git a/src/core/ddsc/src/dds__init.h b/src/core/ddsc/src/dds__init.h index 61cc7f8..ea3136f 100644 --- a/src/core/ddsc/src/dds__init.h +++ b/src/core/ddsc/src/dds__init.h @@ -32,7 +32,7 @@ dds__check_domain( *-# Returns 0 on success or a non-zero error status **/ dds_return_t -dds_init(void); +dds_init(dds_domainid_t domain); /* Finalization function, called from main */ diff --git a/src/core/ddsc/src/dds_builtin.c b/src/core/ddsc/src/dds_builtin.c index c8c9cc8..70373be 100644 --- a/src/core/ddsc/src/dds_builtin.c +++ b/src/core/ddsc/src/dds_builtin.c @@ -137,8 +137,8 @@ dds__create_builtin_participant( } pp->m_entity.m_guid = guid; - pp->m_entity.m_domain = dds_domain_create (config.domainId); - pp->m_entity.m_domainid = config.domainId; + pp->m_entity.m_domain = dds_domain_create (config.domainId.value); + pp->m_entity.m_domainid = config.domainId.value; pp->m_entity.m_deriver.delete = dds__delete_builtin_participant; fail: diff --git a/src/core/ddsc/src/dds_init.c b/src/core/ddsc/src/dds_init.c index 90f0d64..f27694f 100644 --- a/src/core/ddsc/src/dds_init.c +++ b/src/core/ddsc/src/dds_init.c @@ -41,7 +41,7 @@ dds_globals dds_global = { .m_default_domain = DDS_DOMAIN_DEFAULT }; static struct cfgst * dds_cfgst = NULL; dds_return_t -dds_init(void) +dds_init(dds_domainid_t domain) { dds_return_t ret = DDS_RETCODE_OK; const char * uri; @@ -86,9 +86,29 @@ dds_init(void) ret = DDS_ERRNO(DDS_RETCODE_ERROR, "Failed to parse configuration XML file %s", uri); goto fail_config; } + + /* if a domain id was explicitly given, check & fix up the configuration */ + if (domain != DDS_DOMAIN_DEFAULT) + { + if (domain < 0 || domain > 230) + { + ret = DDS_ERRNO(DDS_RETCODE_ERROR, "requested domain id %d is out of range", domain); + goto fail_config; + } + else if (config.domainId.isdefault) + { + config.domainId.value = domain; + } + else if (domain != config.domainId.value) + { + ret = DDS_ERRNO(DDS_RETCODE_ERROR, "requested domain id %d is inconsistent with configured value %d", domain, config.domainId.value); + goto fail_config; + } + } + /* The config.domainId can change internally in DDSI. So, remember what the * main configured domain id is. */ - dds_global.m_default_domain = config.domainId; + dds_global.m_default_domain = config.domainId.value; dds__builtin_init(); diff --git a/src/core/ddsc/src/dds_participant.c b/src/core/ddsc/src/dds_participant.c index 6010310..14b3b05 100644 --- a/src/core/ddsc/src/dds_participant.c +++ b/src/core/ddsc/src/dds_participant.c @@ -148,7 +148,7 @@ dds_create_participant( bool asleep; /* Make sure DDS instance is initialized. */ - ret = dds_init(); + ret = dds_init(domain); if (ret != DDS_RETCODE_OK) { e = (dds_entity_t)ret; goto fail_dds_init; diff --git a/src/core/ddsc/tests/participant.c b/src/core/ddsc/tests/participant.c index 8c67657..7122280 100644 --- a/src/core/ddsc/tests/participant.c +++ b/src/core/ddsc/tests/participant.c @@ -45,13 +45,13 @@ Test(ddsc_participant, create_with_no_conf_no_env) { dds_entity_t participant, participant2, participant3; dds_return_t status; dds_domainid_t domain_id; - dds_domainid_t valid_domain=0; + dds_domainid_t valid_domain=3; const char * env_uri = os_getenv(DDSC_PROJECT_NAME_NOSPACE_CAPS"_URI"); cr_assert_eq(env_uri, NULL, DDSC_PROJECT_NAME_NOSPACE_CAPS"_URI must be NULL"); //invalid domain - participant = dds_create_participant (1, NULL, NULL); + participant = dds_create_participant (-2, NULL, NULL); cr_assert_lt(participant, 0, "Error must be received for invalid domain value"); //valid specific domain value diff --git a/src/core/ddsi/include/ddsi/q_config.h b/src/core/ddsi/include/ddsi/q_config.h index b7dd0b9..e4271cc 100644 --- a/src/core/ddsi/include/ddsi/q_config.h +++ b/src/core/ddsi/include/ddsi/q_config.h @@ -235,11 +235,10 @@ struct config enum boolean_default compat_tcp_enable; int dontRoute; int enableMulticastLoopback; - int domainId; + struct config_maybe_int32 domainId; int participantIndex; int maxAutoParticipantIndex; int port_base; - struct config_maybe_int32 discoveryDomainId; char *spdpMulticastAddressString; char *defaultMulticastAddressString; char *assumeMulticastCapable; diff --git a/src/core/ddsi/src/q_addrset.c b/src/core/ddsi/src/q_addrset.c index 77ef0e6..d4f0176 100644 --- a/src/core/ddsi/src/q_addrset.c +++ b/src/core/ddsi/src/q_addrset.c @@ -101,7 +101,7 @@ static int add_addresses_to_addrset_1 (struct addrset *as, const char *ip, int p int i; for (i = 0; i <= config.maxAutoParticipantIndex; i++) { - int port = config.port_base + config.port_dg * config.domainId + i * config.port_pg + config.port_d1; + int port = config.port_base + config.port_dg * config.domainId.value + i * config.port_pg + config.port_d1; loc.port = (unsigned) port; if (i == 0) nn_log (LC_CONFIG, "%s", ddsi_locator_to_string(buf, sizeof(buf), &loc)); @@ -114,7 +114,7 @@ static int add_addresses_to_addrset_1 (struct addrset *as, const char *ip, int p { int port = port_mode; if (port == -1) - port = config.port_base + config.port_dg * config.domainId + config.port_d0; + port = config.port_base + config.port_dg * config.domainId.value + config.port_d0; loc.port = (unsigned) port; nn_log (LC_CONFIG, "%s", ddsi_locator_to_string(buf, sizeof(buf), &loc)); add_to_addrset (as, &loc); diff --git a/src/core/ddsi/src/q_config.c b/src/core/ddsi/src/q_config.c index 5fbb69c..278aab0 100644 --- a/src/core/ddsi/src/q_config.c +++ b/src/core/ddsi/src/q_config.c @@ -161,7 +161,7 @@ DUPF(cipher); #ifdef DDSI_INCLUDE_BANDWIDTH_LIMITING DUPF(bandwidth); #endif -DU(domainId); +DUPF(domainId); DUPF(durability_cdr); DUPF(transport_selector); DUPF(many_sockets_mode); @@ -727,8 +727,6 @@ static const struct cfgelem discovery_peers_cfgelems[] = { }; static const struct cfgelem discovery_cfgelems[] = { - { LEAF("DomainId"), 1, "default", ABSOFF(discoveryDomainId), 0, uf_maybe_int32, 0, pf_maybe_int32, - "

This element allows overriding of the DDS Domain Id that is used for DDSI2E.

" }, { LEAF("AdvertiseBuiltinTopicWriters"), 1, "true", ABSOFF(advertise_builtin_topic_writers), 0, uf_boolean, 0, pf_boolean, "

This element controls whether or not DDSI2E advertises writers for the built-in topics from its discovery for backwards compatibility with older OpenSplice versions.

" }, { LEAF("DSGracePeriod"), 1, "30 s", ABSOFF(ds_grace_period), 0, uf_duration_inf, 0, pf_duration, @@ -873,7 +871,7 @@ static const struct cfgelem lease_cfgelems[] = { static const struct cfgelem domain_cfgelems[] = { { GROUP("Lease", lease_cfgelems), NULL }, - { LEAF("Id"), 1, "0", ABSOFF(domainId), 0, uf_domainId, 0, pf_int, NULL }, + { LEAF("Id"), 1, "any", ABSOFF(domainId), 0, uf_domainId, 0, pf_domainId, NULL }, WILDCARD, END_MARKER }; @@ -1904,9 +1902,20 @@ static int uf_int_min_max(struct cfgst *cfgst, void *parent, struct cfgelem cons return 1; } -static int uf_domainId(struct cfgst *cfgst, void *parent, struct cfgelem const * const cfgelem, int first, const char *value) +static int uf_domainId(struct cfgst *cfgst, void *parent, struct cfgelem const * const cfgelem, UNUSED_ARG(int first), const char *value) { - return uf_int_min_max(cfgst, parent, cfgelem, first, value, 0, 230); + struct config_maybe_int32 *elem = cfg_address(cfgst, parent, cfgelem); + int pos; + if (os_strcasecmp(value, "any") == 0) { + elem->isdefault = 1; + elem->value = 0; + return 1; + } else if (sscanf(value, "%d%n", &elem->value, &pos) == 1 && value[pos] == 0 && elem->value >= 0 && elem->value <= 230) { + elem->isdefault = 0; + return 1; + } else { + return cfg_error(cfgst, "'%s': neither 'any' nor a decimal integer in 0 .. 230\n", value); + } } static int uf_participantIndex(struct cfgst *cfgst, void *parent, struct cfgelem const * const cfgelem, int first, const char *value) @@ -2213,11 +2222,11 @@ static void pf_uint32(struct cfgst *cfgst, void *parent, struct cfgelem const * static void pf_maybe_int32(struct cfgst *cfgst, void *parent, struct cfgelem const * const cfgelem, int is_default) { - struct config_maybe_int32 *p = cfg_address(cfgst, parent, cfgelem); - if ( p->isdefault ) - cfg_log(cfgst, "default%s", is_default ? " [def]" : ""); - else - cfg_log(cfgst, "%d%s", p->value, is_default ? " [def]" : ""); + struct config_maybe_int32 *p = cfg_address(cfgst, parent, cfgelem); + if ( p->isdefault ) + cfg_log(cfgst, "default%s", is_default ? " [def]" : ""); + else + cfg_log(cfgst, "%d%s", p->value, is_default ? " [def]" : ""); } static void pf_maybe_memsize(struct cfgst *cfgst, void *parent, struct cfgelem const * const cfgelem, int is_default) @@ -2229,6 +2238,14 @@ static void pf_maybe_memsize(struct cfgst *cfgst, void *parent, struct cfgelem c pf_int64_unit(cfgst, p->value, is_default, unittab_memsize, "B"); } +static void pf_domainId(struct cfgst *cfgst, void *parent, struct cfgelem const * const cfgelem, int is_default) +{ + struct config_maybe_int32 *p = cfg_address(cfgst, parent, cfgelem); + if ( p->isdefault ) + cfg_log(cfgst, "any (%d)%s", p->value, is_default ? " [def]" : ""); + else + cfg_log(cfgst, "%d%s", p->value, is_default ? " [def]" : ""); +} static void pf_float(struct cfgst *cfgst, void *parent, struct cfgelem const * const cfgelem, int is_default) { @@ -2707,6 +2724,12 @@ struct cfgst * config_init config.tracingOutputFile = stderr; config.enabled_logcats = LC_ERROR | LC_WARNING; + /* eventually, we domainId.value will be the real domain id selected, even if it was configured + to the default of "any" and has "isdefault" set; initializing it to the default-default + value of 0 means "any" in the config & DDS_DOMAIN_DEFAULT in create participant automatically + ends up on the right value */ + config.domainId.value = 0; + cfgst = os_malloc(sizeof(*cfgst)); memset(cfgst, 0, sizeof(*cfgst)); diff --git a/src/core/ddsi/src/q_init.c b/src/core/ddsi/src/q_init.c index 3f5f863..736896a 100644 --- a/src/core/ddsi/src/q_init.c +++ b/src/core/ddsi/src/q_init.c @@ -74,7 +74,7 @@ static int make_uc_sockets (uint32_t * pdisc, uint32_t * pdata, int ppid) if (config.many_sockets_mode == MSM_NO_UNICAST) { assert (ppid == PARTICIPANT_INDEX_NONE); - *pdata = *pdisc = (uint32_t) (config.port_base + config.port_dg * config.domainId); + *pdata = *pdisc = (uint32_t) (config.port_base + config.port_dg * config.domainId.value); if (config.allowMulticast) { /* FIXME: ugly hack - but we'll fix up after creating the multicast sockets */ @@ -85,7 +85,7 @@ static int make_uc_sockets (uint32_t * pdisc, uint32_t * pdata, int ppid) if (ppid >= 0) { /* FIXME: verify port numbers are in range instead of truncating them like this */ - int base = config.port_base + (config.port_dg * config.domainId) + (ppid * config.port_pg); + int base = config.port_base + (config.port_dg * config.domainId.value) + (ppid * config.port_pg); *pdisc = (uint32_t) (base + config.port_d1); *pdata = (uint32_t) (base + config.port_d3); } @@ -284,7 +284,7 @@ static int string_to_default_locator (nn_locator_t *loc, const char *string, uin static int set_spdp_address (void) { - const uint32_t port = (uint32_t) (config.port_base + config.port_dg * config.domainId + config.port_d0); + const uint32_t port = (uint32_t) (config.port_base + config.port_dg * config.domainId.value + config.port_d0); int rc = 0; /* FIXME: FIXME: FIXME: */ gv.loc_spdp_mc.kind = NN_LOCATOR_KIND_INVALID; @@ -321,7 +321,7 @@ static int set_spdp_address (void) static int set_default_mc_address (void) { - const uint32_t port = (uint32_t) (config.port_base + config.port_dg * config.domainId + config.port_d2); + const uint32_t port = (uint32_t) (config.port_base + config.port_dg * config.domainId.value + config.port_d2); int rc; if (!config.defaultMulticastAddressString) gv.loc_default_mc = gv.loc_spdp_mc; @@ -464,15 +464,7 @@ int rtps_config_prep (struct cfgst *cfgst) unsigned num_channel_threads = 0; #endif - /* if the discovery domain id was explicitly set, override the default here */ - if (!config.discoveryDomainId.isdefault) - { - config.domainId = config.discoveryDomainId.value; - } - /* retry_on_reject_duration default is dependent on late_ack_mode and responsiveness timeout, so fix up */ - - if (config.whc_init_highwater_mark.isdefault) config.whc_init_highwater_mark.value = config.whc_lowwater_mark; if (config.whc_highwater_mark < config.whc_lowwater_mark || @@ -662,7 +654,7 @@ int joinleave_spdp_defmcip (int dojoin) unref_addrset (as); if (arg.errcount) { - NN_ERROR ("rtps_init: failed to join multicast groups for domain %d participant %d\n", config.domainId, config.participantIndex); + NN_ERROR ("rtps_init: failed to join multicast groups for domain %d participant %d\n", config.domainId.value, config.participantIndex); return -1; } return 0; @@ -676,7 +668,7 @@ int create_multicast_sockets(void) qos->m_multicast = 1; /* FIXME: should check for overflow */ - port = (uint32_t) (config.port_base + config.port_dg * config.domainId + config.port_d0); + port = (uint32_t) (config.port_base + config.port_dg * config.domainId.value + config.port_d0); if ((disc = ddsi_factory_create_conn (gv.m_factory, port, qos)) == NULL) goto err_disc; if (config.many_sockets_mode == MSM_NO_UNICAST) @@ -686,7 +678,7 @@ int create_multicast_sockets(void) } else { - port = (uint32_t) (config.port_base + config.port_dg * config.domainId + config.port_d2); + port = (uint32_t) (config.port_base + config.port_dg * config.domainId.value + config.port_d2); if ((data = ddsi_factory_create_conn (gv.m_factory, port, qos)) == NULL) goto err_data; } @@ -960,7 +952,7 @@ int rtps_init (void) #ifdef DDSI_INCLUDE_NETWORK_PARTITIONS /* Convert address sets in partition mappings from string to address sets */ { - const int port = config.port_base + config.port_dg * config.domainId + config.port_d2; + const int port = config.port_base + config.port_dg * config.domainId.value + config.port_d2; struct config_networkpartition_listelem *np; for (np = config.networkPartitions; np; np = np->next) { @@ -1034,7 +1026,7 @@ int rtps_init (void) { if (make_uc_sockets (&port_disc_uc, &port_data_uc, config.participantIndex) < 0) { - NN_ERROR ("rtps_init: failed to create unicast sockets for domain %d participant %d\n", config.domainId, config.participantIndex); + NN_ERROR ("rtps_init: failed to create unicast sockets for domain %d participant %d\n", config.domainId.value, config.participantIndex); goto err_unicast_sockets; } } @@ -1052,13 +1044,13 @@ int rtps_init (void) continue; else /* Oops! */ { - NN_ERROR ("rtps_init: failed to create unicast sockets for domain %d participant %d\n", config.domainId, ppid); + NN_ERROR ("rtps_init: failed to create unicast sockets for domain %d participant %d\n", config.domainId.value, ppid); goto err_unicast_sockets; } } if (ppid > config.maxAutoParticipantIndex) { - NN_ERROR ("rtps_init: failed to find a free participant index for domain %d\n", config.domainId); + NN_ERROR ("rtps_init: failed to find a free participant index for domain %d\n", config.domainId.value); goto err_unicast_sockets; } config.participantIndex = ppid; @@ -1069,7 +1061,7 @@ int rtps_init (void) } nn_log (LC_CONFIG, "rtps_init: uc ports: disc %u data %u\n", port_disc_uc, port_data_uc); } - nn_log (LC_CONFIG, "rtps_init: domainid %d participantid %d\n", config.domainId, config.participantIndex); + nn_log (LC_CONFIG, "rtps_init: domainid %d participantid %d\n", config.domainId.value, config.participantIndex); if (config.pcap_file && *config.pcap_file) { diff --git a/src/etc/cmake/default.xml.in b/src/etc/cmake/default.xml.in index 61bc3c8..2a4853e 100644 --- a/src/etc/cmake/default.xml.in +++ b/src/etc/cmake/default.xml.in @@ -11,7 +11,7 @@ --> <@CMAKE_PROJECT_NAME@> - 0 + any