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:
parent
675fbfe013
commit
bb92294f4e
10 changed files with 78 additions and 44 deletions
|
@ -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 */
|
||||
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
"<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,
|
||||
"<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,
|
||||
|
@ -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));
|
||||
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
-->
|
||||
<@CMAKE_PROJECT_NAME@>
|
||||
<Domain>
|
||||
<Id>0</Id>
|
||||
<Id>any</Id>
|
||||
</Domain>
|
||||
<DDSI2E>
|
||||
<General>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue