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 <eb@ilities.com>
This commit is contained in:
Erik Boasson 2018-10-14 13:55:56 +08:00
parent 675fbfe013
commit bb92294f4e
10 changed files with 78 additions and 44 deletions

View file

@ -32,7 +32,7 @@ dds__check_domain(
*-# Returns 0 on success or a non-zero error status *-# Returns 0 on success or a non-zero error status
**/ **/
dds_return_t dds_return_t
dds_init(void); dds_init(dds_domainid_t domain);
/* Finalization function, called from main */ /* Finalization function, called from main */

View file

@ -137,8 +137,8 @@ dds__create_builtin_participant(
} }
pp->m_entity.m_guid = guid; pp->m_entity.m_guid = guid;
pp->m_entity.m_domain = dds_domain_create (config.domainId); pp->m_entity.m_domain = dds_domain_create (config.domainId.value);
pp->m_entity.m_domainid = config.domainId; pp->m_entity.m_domainid = config.domainId.value;
pp->m_entity.m_deriver.delete = dds__delete_builtin_participant; pp->m_entity.m_deriver.delete = dds__delete_builtin_participant;
fail: fail:

View file

@ -41,7 +41,7 @@ dds_globals dds_global = { .m_default_domain = DDS_DOMAIN_DEFAULT };
static struct cfgst * dds_cfgst = NULL; static struct cfgst * dds_cfgst = NULL;
dds_return_t dds_return_t
dds_init(void) dds_init(dds_domainid_t domain)
{ {
dds_return_t ret = DDS_RETCODE_OK; dds_return_t ret = DDS_RETCODE_OK;
const char * uri; const char * uri;
@ -86,9 +86,29 @@ dds_init(void)
ret = DDS_ERRNO(DDS_RETCODE_ERROR, "Failed to parse configuration XML file %s", uri); ret = DDS_ERRNO(DDS_RETCODE_ERROR, "Failed to parse configuration XML file %s", uri);
goto fail_config; 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 /* The config.domainId can change internally in DDSI. So, remember what the
* main configured domain id is. */ * main configured domain id is. */
dds_global.m_default_domain = config.domainId; dds_global.m_default_domain = config.domainId.value;
dds__builtin_init(); dds__builtin_init();

View file

@ -148,7 +148,7 @@ dds_create_participant(
bool asleep; bool asleep;
/* Make sure DDS instance is initialized. */ /* Make sure DDS instance is initialized. */
ret = dds_init(); ret = dds_init(domain);
if (ret != DDS_RETCODE_OK) { if (ret != DDS_RETCODE_OK) {
e = (dds_entity_t)ret; e = (dds_entity_t)ret;
goto fail_dds_init; goto fail_dds_init;

View file

@ -45,13 +45,13 @@ Test(ddsc_participant, create_with_no_conf_no_env) {
dds_entity_t participant, participant2, participant3; dds_entity_t participant, participant2, participant3;
dds_return_t status; dds_return_t status;
dds_domainid_t domain_id; 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"); 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"); cr_assert_eq(env_uri, NULL, DDSC_PROJECT_NAME_NOSPACE_CAPS"_URI must be NULL");
//invalid domain //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"); cr_assert_lt(participant, 0, "Error must be received for invalid domain value");
//valid specific domain value //valid specific domain value

View file

@ -235,11 +235,10 @@ struct config
enum boolean_default compat_tcp_enable; enum boolean_default compat_tcp_enable;
int dontRoute; int dontRoute;
int enableMulticastLoopback; int enableMulticastLoopback;
int domainId; struct config_maybe_int32 domainId;
int participantIndex; int participantIndex;
int maxAutoParticipantIndex; int maxAutoParticipantIndex;
int port_base; int port_base;
struct config_maybe_int32 discoveryDomainId;
char *spdpMulticastAddressString; char *spdpMulticastAddressString;
char *defaultMulticastAddressString; char *defaultMulticastAddressString;
char *assumeMulticastCapable; char *assumeMulticastCapable;

View file

@ -101,7 +101,7 @@ static int add_addresses_to_addrset_1 (struct addrset *as, const char *ip, int p
int i; int i;
for (i = 0; i <= config.maxAutoParticipantIndex; 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; loc.port = (unsigned) port;
if (i == 0) if (i == 0)
nn_log (LC_CONFIG, "%s", ddsi_locator_to_string(buf, sizeof(buf), &loc)); 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; int port = port_mode;
if (port == -1) 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; loc.port = (unsigned) port;
nn_log (LC_CONFIG, "%s", ddsi_locator_to_string(buf, sizeof(buf), &loc)); nn_log (LC_CONFIG, "%s", ddsi_locator_to_string(buf, sizeof(buf), &loc));
add_to_addrset (as, &loc); add_to_addrset (as, &loc);

View file

@ -161,7 +161,7 @@ DUPF(cipher);
#ifdef DDSI_INCLUDE_BANDWIDTH_LIMITING #ifdef DDSI_INCLUDE_BANDWIDTH_LIMITING
DUPF(bandwidth); DUPF(bandwidth);
#endif #endif
DU(domainId); DUPF(domainId);
DUPF(durability_cdr); DUPF(durability_cdr);
DUPF(transport_selector); DUPF(transport_selector);
DUPF(many_sockets_mode); DUPF(many_sockets_mode);
@ -727,8 +727,6 @@ static const struct cfgelem discovery_peers_cfgelems[] = {
}; };
static const struct cfgelem discovery_cfgelems[] = { static const struct cfgelem discovery_cfgelems[] = {
{ LEAF("DomainId"), 1, "default", ABSOFF(discoveryDomainId), 0, uf_maybe_int32, 0, pf_maybe_int32,
"<p>This element allows overriding of the DDS Domain Id that is used for DDSI2E.</p>" },
{ LEAF("AdvertiseBuiltinTopicWriters"), 1, "true", ABSOFF(advertise_builtin_topic_writers), 0, uf_boolean, 0, pf_boolean, { LEAF("AdvertiseBuiltinTopicWriters"), 1, "true", ABSOFF(advertise_builtin_topic_writers), 0, uf_boolean, 0, pf_boolean,
"<p>This element controls whether or not DDSI2E advertises writers for the built-in topics from its discovery for backwards compatibility with older OpenSplice versions.</p>" }, "<p>This element controls whether or not DDSI2E advertises writers for the built-in topics from its discovery for backwards compatibility with older OpenSplice versions.</p>" },
{ LEAF("DSGracePeriod"), 1, "30 s", ABSOFF(ds_grace_period), 0, uf_duration_inf, 0, pf_duration, { 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[] = { static const struct cfgelem domain_cfgelems[] = {
{ GROUP("Lease", lease_cfgelems), NULL }, { 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, WILDCARD,
END_MARKER END_MARKER
}; };
@ -1904,9 +1902,20 @@ static int uf_int_min_max(struct cfgst *cfgst, void *parent, struct cfgelem cons
return 1; 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) 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) 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); struct config_maybe_int32 *p = cfg_address(cfgst, parent, cfgelem);
if ( p->isdefault ) if ( p->isdefault )
cfg_log(cfgst, "default%s", is_default ? " [def]" : ""); cfg_log(cfgst, "default%s", is_default ? " [def]" : "");
else else
cfg_log(cfgst, "%d%s", p->value, is_default ? " [def]" : ""); 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) 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"); 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) 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.tracingOutputFile = stderr;
config.enabled_logcats = LC_ERROR | LC_WARNING; 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)); cfgst = os_malloc(sizeof(*cfgst));
memset(cfgst, 0, sizeof(*cfgst)); memset(cfgst, 0, sizeof(*cfgst));

View file

@ -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) if (config.many_sockets_mode == MSM_NO_UNICAST)
{ {
assert (ppid == PARTICIPANT_INDEX_NONE); 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) if (config.allowMulticast)
{ {
/* FIXME: ugly hack - but we'll fix up after creating the multicast sockets */ /* 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) if (ppid >= 0)
{ {
/* FIXME: verify port numbers are in range instead of truncating them like this */ /* 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); *pdisc = (uint32_t) (base + config.port_d1);
*pdata = (uint32_t) (base + config.port_d3); *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) 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; int rc = 0;
/* FIXME: FIXME: FIXME: */ /* FIXME: FIXME: FIXME: */
gv.loc_spdp_mc.kind = NN_LOCATOR_KIND_INVALID; 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) 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; int rc;
if (!config.defaultMulticastAddressString) if (!config.defaultMulticastAddressString)
gv.loc_default_mc = gv.loc_spdp_mc; gv.loc_default_mc = gv.loc_spdp_mc;
@ -464,15 +464,7 @@ int rtps_config_prep (struct cfgst *cfgst)
unsigned num_channel_threads = 0; unsigned num_channel_threads = 0;
#endif #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 */ /* retry_on_reject_duration default is dependent on late_ack_mode and responsiveness timeout, so fix up */
if (config.whc_init_highwater_mark.isdefault) if (config.whc_init_highwater_mark.isdefault)
config.whc_init_highwater_mark.value = config.whc_lowwater_mark; config.whc_init_highwater_mark.value = config.whc_lowwater_mark;
if (config.whc_highwater_mark < 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); unref_addrset (as);
if (arg.errcount) 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 -1;
} }
return 0; return 0;
@ -676,7 +668,7 @@ int create_multicast_sockets(void)
qos->m_multicast = 1; qos->m_multicast = 1;
/* FIXME: should check for overflow */ /* 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) if ((disc = ddsi_factory_create_conn (gv.m_factory, port, qos)) == NULL)
goto err_disc; goto err_disc;
if (config.many_sockets_mode == MSM_NO_UNICAST) if (config.many_sockets_mode == MSM_NO_UNICAST)
@ -686,7 +678,7 @@ int create_multicast_sockets(void)
} }
else 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) if ((data = ddsi_factory_create_conn (gv.m_factory, port, qos)) == NULL)
goto err_data; goto err_data;
} }
@ -960,7 +952,7 @@ int rtps_init (void)
#ifdef DDSI_INCLUDE_NETWORK_PARTITIONS #ifdef DDSI_INCLUDE_NETWORK_PARTITIONS
/* Convert address sets in partition mappings from string to address sets */ /* 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; struct config_networkpartition_listelem *np;
for (np = config.networkPartitions; np; np = np->next) 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) 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; goto err_unicast_sockets;
} }
} }
@ -1052,13 +1044,13 @@ int rtps_init (void)
continue; continue;
else /* Oops! */ 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; goto err_unicast_sockets;
} }
} }
if (ppid > config.maxAutoParticipantIndex) 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; goto err_unicast_sockets;
} }
config.participantIndex = ppid; 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: 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) if (config.pcap_file && *config.pcap_file)
{ {

View file

@ -11,7 +11,7 @@
--> -->
<@CMAKE_PROJECT_NAME@> <@CMAKE_PROJECT_NAME@>
<Domain> <Domain>
<Id>0</Id> <Id>any</Id>
</Domain> </Domain>
<DDSI2E> <DDSI2E>
<General> <General>