/* * Copyright(c) 2020 to 2022 ZettaScale Technology and others * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0 which is available at * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License * v. 1.0 which is available at * http://www.eclipse.org/org/documents/edl-v10.php. * * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause */ #ifndef DDSI_CFGELEMS_H #define DDSI_CFGELEMS_H #include "dds/features.h" static struct cfgelem network_interface_attributes[] = { STRING("autodetermine", NULL, 1, "false", MEMBEROF(ddsi_config_network_interface_listelem, cfg.automatic), FUNCTIONS(0, uf_boolean, 0, pf_boolean), DESCRIPTION( "

If set to \"true\" an interface is automatically selected. Specifying " "a name or an address when automatic is set is considered an error.

" )), STRING("name", NULL, 1, "", MEMBEROF(ddsi_config_network_interface_listelem, cfg.name), FUNCTIONS(0, uf_string, ff_free, pf_string), DESCRIPTION( "

This attribute specifies the name of the interface.

" )), STRING("address", NULL, 1, "", MEMBEROF(ddsi_config_network_interface_listelem, cfg.address), FUNCTIONS(0, uf_string, ff_free, pf_string), DESCRIPTION( "

This attribute specifies the address of the interface. With ipv4 allows " " matching on network part if host part is set to zero.

" )), STRING("priority", NULL, 1, "default", MEMBEROF(ddsi_config_network_interface_listelem, cfg.priority), FUNCTIONS(0, uf_maybe_int32, 0, pf_maybe_int32), DESCRIPTION( "

This attribute specifies the interface priority (decimal integer or " "default). The default value for loopback interfaces is 2, for all " "other interfaces it is 0.

" )), BOOL("prefer_multicast", NULL, 1, "false", MEMBEROF(ddsi_config_network_interface_listelem, cfg.prefer_multicast), FUNCTIONS(0, uf_boolean, 0, pf_boolean), DESCRIPTION( "

When false (default) Cyclone DDS uses unicast for data whenever " "there a single unicast suffices. Setting this to true makes it prefer " "multicasting data, falling back to unicast only when no multicast " "is available.

" )), BOOL("presence_required", NULL, 1, "true", MEMBEROF(ddsi_config_network_interface_listelem, cfg.presence_required), FUNCTIONS(0, uf_boolean, 0, pf_boolean), DESCRIPTION( "

By default all specified network interfaces must be present, if they " "are missing Cyclone will refuse to start. By explicitly setting this setting " "for an interface you can instruct Cyclone to simply ignore that interface if " "it is not present.

" )), STRING("multicast", NULL, 1, "default", MEMBEROF(ddsi_config_network_interface_listelem, cfg.multicast), FUNCTIONS(0, uf_boolean_default, 0, pf_boolean_default), DESCRIPTION( "

This attribute specifies the whether the interface should use multicast. " "On its default setting 'default' it will use the value as return by the operating " "system. If set to 'true' the interface will be assumed to be multicast capable " "even when the interface flags returned by the operating system state it is not " "(this provides a workaround for some platforms). If set to 'false' the interface " "will never be used for multicast.") ), END_MARKER }; static struct cfgelem interfaces_cfgelems[] = { GROUP("NetworkInterface", NULL, network_interface_attributes, INT_MAX, MEMBER(network_interfaces), FUNCTIONS(if_network_interfaces, 0, 0, 0), DESCRIPTION( "

This element defines a network interface. You can set autodetermine=\"true\" " "to autoselect the interface CycloneDDS deems to be the highest quality. If " "autodetermine=\"false\" (the default), you must specify the name and/or address " "attribute. If you specify both they must match the same interface.

")), END_MARKER }; static struct cfgelem entity_autonaming_attributes[] = { STRING("seed", NULL, 1, "", MEMBER(entity_naming_seed), FUNCTIONS(0, uf_random_seed, 0, pf_random_seed), DESCRIPTION( "

Provide an initial seed for the entity naming. Your string will be " "hashed to provided the random state. When provided the same sequence of " "names is generated every run. If you create your entities in the same " "order this will ensure they are the same between runs. If you run multiple " "nodes set this via environment variable to ensure every node generates " "unique names. When left empty (the default) a random starting seed is " "chosen.

" )), END_MARKER }; static struct cfgelem general_cfgelems[] = { STRING("MulticastRecvNetworkInterfaceAddresses", NULL, 1, "preferred", MEMBER(networkRecvAddressStrings), FUNCTIONS(0, uf_networkAddresses, ff_networkAddresses, pf_networkAddresses), DESCRIPTION( "

This element specifies on which network interfaces Cyclone DDS " "listens to multicasts. The following options are available:

\n" "\n" "

If Cyclone DDS is in IPv6 mode and the address of the preferred network " "interface is a link-local address, \"all\" is treated as a synonym for " "\"preferred\" and a comma-separated list is treated as \"preferred\" " "if it contains the preferred interface and as \"none\" if not.

" )), GROUP("Interfaces", interfaces_cfgelems, NULL, 1, NOMEMBER, NOFUNCTIONS, DESCRIPTION( "

This element specifies the network interfaces for use by Cyclone " "DDS. Multiple interfaces can be specified with an assigned priority. " "The list in use will be sorted by priority. If interfaces have an " "equal priority the specification order will be preserved.

" )), STRING(DEPRECATED("NetworkInterfaceAddress"), NULL, 1, "auto", MEMBER(depr_networkAddressString), FUNCTIONS(0, uf_networkAddress, ff_free, pf_networkAddress), DESCRIPTION( "

This configuration option is deprecated. Use General/Interfaces " " instead. " " This element specifies the preferred network interface for use by " "Cyclone DDS. The preferred network interface determines the IP address " "that Cyclone DDS advertises in the discovery protocol (but see also " "General/ExternalNetworkAddress), and is also the only interface over " "which multicasts are transmitted. The interface can be identified by " "its IP address, network interface name or network portion of the " "address. If the value \"auto\" is entered here, Cyclone DDS will " "select what it considers the most suitable interface.

" )), STRING("ExternalNetworkAddress", NULL, 1, "auto", MEMBER(externalAddressString), FUNCTIONS(0, uf_networkAddress, ff_free, pf_networkAddress), DESCRIPTION( "

This element allows explicitly overruling the network address " "Cyclone DDS advertises in the discovery protocol, which by default is " "the address of the preferred network interface " "(General/NetworkInterfaceAddress), to allow Cyclone DDS to communicate " "across a Network Address Translation (NAT) device.

")), STRING("ExternalNetworkMask", NULL, 1, "0.0.0.0", MEMBER(externalMaskString), FUNCTIONS(0, uf_string, ff_free, pf_string), DESCRIPTION( "

This element specifies the network mask of the external network " "address. This element is relevant only when an external network " "address (General/ExternalNetworkAddress) is explicitly configured. In " "this case locators received via the discovery protocol that are " "within the same external subnet (as defined by this mask) will be " "translated to an internal address by replacing the network portion of " "the external address with the corresponding portion of the preferred " "network interface address. This option is IPv4-only.

")), LIST("AllowMulticast", NULL, 1, "default", MEMBER(allowMulticast), FUNCTIONS(0, uf_allow_multicast, 0, pf_allow_multicast), DESCRIPTION( "

This element controls whether Cyclone DDS uses multicasts for data " "traffic.

\n" "

It is a comma-separated list of some of the following keywords: " "\"spdp\", \"asm\", \"ssm\", or either of \"false\" or \"true\", or " "\"default\".

\n" "\n" "

When set to \"false\" all multicasting is disabled. The default, " "\"true\" enables full use of multicasts. Listening for multicasts can " "be controlled by General/MulticastRecvNetworkInterfaceAddresses.

\n" "

\"default\" maps on spdp if the network is a WiFi network, on true " "if it is a wired network

"), VALUES("false","spdp","asm","ssm","true")), BOOL(DEPRECATED("PreferMulticast"), NULL, 1, "false", MEMBER(depr_prefer_multicast), FUNCTIONS(0, uf_boolean, 0, pf_boolean), DESCRIPTION( "

Deprecated, use Interfaces/NetworkInterface[@multicast_cost] instead. " "When false (default) Cyclone DDS uses unicast for data whenever " "there a single unicast suffices. Setting this to true makes it prefer " "multicasting data, falling back to unicast only when no multicast " "address is available.

")), INT("MulticastTimeToLive", NULL, 1, "32", MEMBER(multicast_ttl), FUNCTIONS(0, uf_natint_255, 0, pf_int), DESCRIPTION( "

This element specifies the time-to-live setting for outgoing " "multicast packets.

"), RANGE("0;255")), BOOL("DontRoute", NULL, 1, "false", MEMBER(dontRoute), FUNCTIONS(0, uf_boolean, 0, pf_boolean), DESCRIPTION( "

This element allows setting the SO_DONTROUTE option for outgoing " "packets, to bypass the local routing tables. This is generally useful " "only when the routing tables cannot be trusted, which is highly " "unusual.

")), ENUM("UseIPv6", NULL, 1, "default", MEMBER(compat_use_ipv6), FUNCTIONS(0, uf_boolean_default, 0, pf_nop), DESCRIPTION("

Deprecated (use Transport instead)

"), VALUES("false","true","default")), ENUM("Transport", NULL, 1, "default", MEMBER(transport_selector), FUNCTIONS(0, uf_transport_selector, 0, pf_transport_selector), DESCRIPTION( "

This element allows selecting the transport to be used (udp, udp6, " "tcp, tcp6, raweth)

"), VALUES("default","udp","udp6","tcp","tcp6","raweth")), BOOL("EnableMulticastLoopback", NULL, 1, "true", MEMBER(enableMulticastLoopback), FUNCTIONS(0, uf_boolean, 0, pf_boolean), DESCRIPTION( "

This element specifies whether Cyclone DDS allows IP multicast " "packets to be visible to all DDSI participants in the same node, " "including itself. It must be \"true\" for intra-node multicast " "communications, but if a node runs only a single Cyclone DDS service " "and does not host any other DDSI-capable programs, it should be set " "to \"false\" for improved performance.

")), STRING("MaxMessageSize", NULL, 1, "14720 B", MEMBER(max_msg_size), FUNCTIONS(0, uf_memsize, 0, pf_memsize), DESCRIPTION( "

This element specifies the maximum size of the UDP payload that " "Cyclone DDS will generate. Cyclone DDS will try to maintain this limit within " "the bounds of the DDSI specification, which means that in some cases " "(especially for very low values of MaxMessageSize) larger payloads " "may sporadically be observed (currently up to 1192 B).

\n" "

On some networks it may be necessary to set this item to keep the " "packetsize below the MTU to prevent IP fragmentation.

"), UNIT("memsize")), STRING("MaxRexmitMessageSize", NULL, 1, "1456 B", MEMBER(max_rexmit_msg_size), FUNCTIONS(0, uf_memsize, 0, pf_memsize), DESCRIPTION( "

This element specifies the maximum size of the UDP payload that " "Cyclone DDS will generate for a retransmit. Cyclone DDS will try to " "maintain this limit within the bounds of the DDSI specification, which " "means that in some cases (especially for very low values) larger payloads " "may sporadically be observed (currently up to 1192 B).

\n" "

On some networks it may be necessary to set this item to keep the " "packetsize below the MTU to prevent IP fragmentation.

"), UNIT("memsize")), STRING("FragmentSize", NULL, 1, "1344 B", MEMBER(fragment_size), FUNCTIONS(0, uf_memsize16, 0, pf_memsize16), DESCRIPTION( "

This element specifies the size of DDSI sample fragments generated " "by Cyclone DDS. Samples larger than FragmentSize are fragmented into " "fragments of FragmentSize bytes each, except the last one, which may " "be smaller. The DDSI spec mandates a minimum fragment size of 1025 " "bytes, but Cyclone DDS will do whatever size is requested, accepting " "fragments of which the size is at least the minimum of 1025 and " "FragmentSize.

"), UNIT("memsize")), BOOL("RedundantNetworking", NULL, 1, "false", MEMBER(redundant_networking), FUNCTIONS(0, uf_boolean, 0, pf_boolean), DESCRIPTION( "

When enabled, use selected network interfaces in parallel for " "redundancy.

")), ENUM("EntityAutoNaming", entity_autonaming_attributes, 1, "empty", MEMBER(entity_naming_mode), FUNCTIONS(0, uf_entity_naming_mode, 0, pf_entity_naming_mode), DESCRIPTION( "

This element specifies the entity autonaming mode. By default set " "to 'empty' which means no name will be set (but you can still use " "dds_qset_entity_name). When set to 'fancy' participants, publishers, " "subscribers, writers and readers will get randomly generated names. " "An autonamed entity will share a 3-letter prefix with their parent " "entity.

"), VALUES("empty","fancy")), END_MARKER }; #ifdef DDS_HAS_SECURITY static struct cfgelem authentication_library_attributes[] = { STRING("path", NULL, 1, "dds_security_auth", MEMBEROF(ddsi_config_omg_security_listelem, cfg.authentication_plugin.library_path), FUNCTIONS(0, uf_string, ff_free, pf_string), DESCRIPTION( "

This element points to the path of Authentication plugin library.

\n" "

It can be either absolute path excluding file extension " "( /usr/lib/dds_security_auth ) or single file without extension " "( dds_security_auth ).

\n" "

If single file is supplied, the library located by way of the " "current working directory, or LD_LIBRARY_PATH for Unix systems, and " "PATH for Windows system.

" )), STRING("initFunction", NULL, 1, "init_authentication", MEMBEROF(ddsi_config_omg_security_listelem, cfg.authentication_plugin.library_init), FUNCTIONS(0, uf_string, ff_free, pf_string), DESCRIPTION( "

This element names the initialization function of Authentication " "plugin. This function is called after loading the plugin library for " "instantiation purposes. Init function must return an object that " "implements DDS Security Authentication interface.

" )), STRING("finalizeFunction", NULL, 1, "finalize_authentication", MEMBEROF(ddsi_config_omg_security_listelem, cfg.authentication_plugin.library_finalize), FUNCTIONS(0, uf_string, ff_free, pf_string), DESCRIPTION( "

This element names the finalization function of Authentication " "plugin. This function is called to let the plugin release its " "resources.

" )), END_MARKER }; static struct cfgelem access_control_library_attributes[] = { STRING("path", NULL, 1, "dds_security_ac", MEMBEROF(ddsi_config_omg_security_listelem, cfg.access_control_plugin.library_path), FUNCTIONS(0, uf_string, ff_free, pf_string), DESCRIPTION( "

This element points to the path of Access Control plugin library.

\n" "

It can be either absolute path excluding file extension " "( /usr/lib/dds_security_ac ) or single file without extension " "( dds_security_ac ).

\n" "

If single file is supplied, the library located by way of the " "current working directory, or LD_LIBRARY_PATH for Unix systems, and " "PATH for Windows systems.

" )), STRING("initFunction", NULL, 1, "init_access_control", MEMBEROF(ddsi_config_omg_security_listelem, cfg.access_control_plugin.library_init), FUNCTIONS(0, uf_string, ff_free, pf_string), DESCRIPTION( "

This element names the initialization function of Access Control " "plugin. This function is called after loading the plugin library for " "instantiation purposes. Init function must return an object that " "implements DDS Security Access Control interface.

" )), STRING("finalizeFunction", NULL, 1, "finalize_access_control", MEMBEROF(ddsi_config_omg_security_listelem, cfg.access_control_plugin.library_finalize), FUNCTIONS(0, uf_string, ff_free, pf_string), DESCRIPTION( "

This element names the finalization function of Access Control " "plugin. This function is called to let the plugin release its " "resources.

" )), END_MARKER }; static struct cfgelem cryptography_library_attributes[] = { STRING("path", NULL, 1, "dds_security_crypto", MEMBEROF(ddsi_config_omg_security_listelem, cfg.cryptography_plugin.library_path), FUNCTIONS(0, uf_string, ff_free, pf_string), DESCRIPTION( "

This element points to the path of Cryptographic plugin library.

\n" "

It can be either absolute path excluding file extension " "( /usr/lib/dds_security_crypto ) or single file without extension " "( dds_security_crypto ).

\n" "

If single file is supplied, the library located by way of the " "current working directory, or LD_LIBRARY_PATH for Unix systems, and " "PATH for Windows systems.

" )), STRING("initFunction", NULL, 1, "init_crypto", MEMBEROF(ddsi_config_omg_security_listelem, cfg.cryptography_plugin.library_init), FUNCTIONS(0, uf_string, ff_free, pf_string), DESCRIPTION( "

This element names the initialization function of Cryptographic " "plugin. This function is called after loading the plugin library for " "instantiation purposes. Init function must return an object that " "implements DDS Security Cryptographic interface.

" )), STRING("finalizeFunction", NULL, 1, "finalize_crypto", MEMBEROF(ddsi_config_omg_security_listelem, cfg.cryptography_plugin.library_finalize), FUNCTIONS(0, uf_string, ff_free, pf_string), DESCRIPTION( "

This element names the finalization function of Cryptographic " "plugin. This function is called to let the plugin release its " "resources.

" )), END_MARKER }; static struct cfgelem authentication_config_elements[] = { STRING("Library", authentication_library_attributes, 1, "", MEMBEROF(ddsi_config_omg_security_listelem, cfg.authentication_plugin), FUNCTIONS(0, 0, 0, pf_string), DESCRIPTION( "

This element specifies the library to be loaded as the DDS " "Security Access Control plugin.

" )), STRING("IdentityCertificate", NULL, 1, NULL, MEMBEROF(ddsi_config_omg_security_listelem, cfg.authentication_properties.identity_certificate), FUNCTIONS(0, uf_string, ff_free, pf_string), DESCRIPTION( "

Identity certificate that will be used for identifying all " "participants in the OSPL instance.
The content is URI to a X509 " "certificate signed by the IdentityCA in PEM format containing the " "signed public key.

\n" "

Supported URI schemes: file, data

\n" "

Examples:

\n" "

file:participant1_identity_cert.pem

\n" "

data:,-----BEGIN CERTIFICATE-----
\n" "MIIDjjCCAnYCCQDCEu9...6rmT87dhTo=
\n" "-----END CERTIFICATE-----

" )), STRING("IdentityCA", NULL, 1, NULL, MEMBEROF(ddsi_config_omg_security_listelem, cfg.authentication_properties.identity_ca), FUNCTIONS(0, uf_string, ff_free, pf_string), DESCRIPTION( "

URI to the X509 certificate [39] of the Identity CA that is the " "signer of Identity Certificate.

\n" "

Supported URI schemes: file, data

\n" "

The file and data schemas shall refer to a X.509 v3 certificate " "(see X.509 v3 ITU-T Recommendation X.509 (2005) [39]) in PEM format.

\n" "

Examples:

\n" "

file:identity_ca.pem

\n" "

data:,-----BEGIN CERTIFICATE-----
\n" "MIIC3DCCAcQCCQCWE5x+Z...PhovK0mp2ohhRLYI0ZiyYQ==
\n" "-----END CERTIFICATE-----

" )), STRING("PrivateKey", NULL, 1, NULL, MEMBEROF(ddsi_config_omg_security_listelem, cfg.authentication_properties.private_key), FUNCTIONS(0, uf_string, ff_free, pf_string), DESCRIPTION( "

URI to access the private Private Key for all of the participants " "in the OSPL federation.

\n" "

Supported URI schemes: file, data

\n" "

Examples:

\n" "

file:identity_ca_private_key.pem

\n" "

data:,-----BEGIN RSA PRIVATE KEY-----
\n" "MIIEpAIBAAKCAQEA3HIh...AOBaaqSV37XBUJg==
\n" "-----END RSA PRIVATE KEY-----

" )), STRING("Password", NULL, 1, "", MEMBEROF(ddsi_config_omg_security_listelem, cfg.authentication_properties.password), FUNCTIONS(0, uf_string, ff_free, pf_string), DESCRIPTION( "

A password used to decrypt the private_key.

\n" "

The value of the password property shall be interpreted as the " "Base64 encoding of the AES-128 key that shall be used to decrypt the " "private_key using AES128-CBC.

\n" "

If the password property is not present, then the value supplied in " "the private_key property must contain the unencrypted private key.

" )), STRING("TrustedCADirectory", NULL, 1, "", MEMBEROF(ddsi_config_omg_security_listelem, cfg.authentication_properties.trusted_ca_dir), FUNCTIONS(0, uf_string, ff_free, pf_string), DESCRIPTION( "

Trusted CA Directory which contains trusted CA certificates as " "separated files.

" )), STRING("CRL", NULL, 1, "", MEMBEROF(ddsi_config_omg_security_listelem, cfg.authentication_properties.crl), FUNCTIONS(0, uf_string, ff_free, pf_string), DESCRIPTION( "

Optional URI to load an X509 Certificate Revocation List

\n" "

Supported URI schemes: file, data

\n" "

Examples:

\n" "

file:crl.pem

\n" "

data:,-----BEGIN X509 CRL-----
\n" "MIIEpAIBAAKCAQEA3HIh...AOBaaqSV37XBUJg=
\n" "-----END X509 CRL-----

" )), BOOL("IncludeOptionalFields", NULL, 1, "false", MEMBEROF(ddsi_config_omg_security_listelem, cfg.authentication_properties.include_optional_fields), FUNCTIONS(0, uf_boolean, 0, pf_boolean), DESCRIPTION( "

The authentication handshake tokens may contain optional fields to " "be included for finding interoperability problems. If this parameter " "is set to true the optional fields are included in the handshake token " "exchange.

" )), END_MARKER }; static struct cfgelem access_control_config_elements[] = { STRING("Library", access_control_library_attributes, 1, "", MEMBEROF(ddsi_config_omg_security_listelem, cfg.access_control_plugin), FUNCTIONS(0, 0, 0, pf_string), DESCRIPTION( "

This element specifies the library to be loaded as the " "DDS Security Access Control plugin.

" )), STRING("PermissionsCA", NULL, 1, "", MEMBEROF(ddsi_config_omg_security_listelem, cfg.access_control_properties.permissions_ca), FUNCTIONS(0, uf_string, ff_free, pf_string), DESCRIPTION( "

URI to a X509 certificate for the PermissionsCA in PEM format.

\n" "

Supported URI schemes: file, data

\n" "

The file and data schemas shall refer to a X.509 v3 certificate " "(see X.509 v3 ITU-T Recommendation X.509 (2005) [39]) in PEM format.


\n" "

Examples:


\n" "

file:permissions_ca.pem

\n" "

file:/home/myuser/permissions_ca.pem


\n" "

data:,-----BEGIN CERTIFICATE-----

\n" "

MIIC3DCCAcQCCQCWE5x+Z ... PhovK0mp2ohhRLYI0ZiyYQ==

\n" "

-----END CERTIFICATE-----

" )), STRING("Governance", NULL, 1, "", MEMBEROF(ddsi_config_omg_security_listelem, cfg.access_control_properties.governance), FUNCTIONS(0, uf_string, ff_free, pf_string), DESCRIPTION( "

URI to the shared Governance Document signed by the Permissions CA in S/MIME format

\n" "

URI schemes: file, data


\n" "

Examples file URIs:

\n" "

file:governance.smime

\n" "

file:/home/myuser/governance.smime


\n" "

\n" "

Content-Type: multipart/signed; protocol=\"application/x-pkcs7-signature\"; micalg=\"sha-256\"; boundary=\"----F9A8A198D6F08E1285A292ADF14DD04F\"

\n" "

This is an S/MIME signed message

\n" "

------F9A8A198D6F08E1285A292ADF14DD04F

\n" "

\n" "

\n" "

xsi:noNamespaceSchemaLocation=\"omg_shared_ca_governance.xsd\">

\n" "

\n" "

. . .

\n" "

\n" "

\n" "

...

\n" "

------F9A8A198D6F08E1285A292ADF14DD04F

\n" "

Content-Type: application/x-pkcs7-signature; name=\"smime.p7s\"

\n" "

Content-Transfer-Encoding: base64

\n" "

Content-Disposition: attachment; filename=\"smime.p7s\"

\n" "

MIIDuAYJKoZIhv ...al5s=

\n" "

------F9A8A198D6F08E1285A292ADF14DD04F-]]

" )), STRING("Permissions", NULL, 1, "", MEMBEROF(ddsi_config_omg_security_listelem, cfg.access_control_properties.permissions), FUNCTIONS(0, uf_string, ff_free, pf_string), DESCRIPTION( "

URI to the DomainParticipant permissions document signed by the " "Permissions CA in S/MIME format

\n" "

The permissions document specifies the permissions to be applied to a domain.


\n" "

Example file URIs:

\n" "

file:permissions_document.p7s

\n" "

file:/path_to/permissions_document.p7s

\n" "

Example data URI:

\n" "

" )), END_MARKER }; static struct cfgelem cryptography_config_elements[] = { STRING("Library", cryptography_library_attributes, 1, "", MEMBEROF(ddsi_config_omg_security_listelem, cfg.cryptography_plugin), FUNCTIONS(0, 0, 0, pf_string), DESCRIPTION( "

This element specifies the library to be loaded as the DDS Security Cryptographic plugin.

" )), END_MARKER }; static struct cfgelem security_omg_config_elements[] = { GROUP("Authentication", authentication_config_elements, NULL, 1, NOMEMBER, NOFUNCTIONS, DESCRIPTION( "

This element configures the Authentication plugin of the DDS Security specification.

" )), GROUP("AccessControl", access_control_config_elements, NULL, 1, NOMEMBER, NOFUNCTIONS, DESCRIPTION( "

This element configures the Access Control plugin of the DDS Security specification.

" )), GROUP("Cryptographic", cryptography_config_elements, NULL, 1, NOMEMBER, NOFUNCTIONS, DESCRIPTION( "

This element configures the Cryptographic plugin of the DDS Security specification.

" )), END_MARKER }; #endif /* DDS_HAS_SECURITY */ #ifdef DDS_HAS_NETWORK_PARTITIONS static struct cfgelem networkpartition_cfgattrs[] = { STRING("Name", NULL, 1, NULL, MEMBEROF(ddsi_config_networkpartition_listelem, name), FUNCTIONS(0, uf_string, ff_free, pf_string), DESCRIPTION( "

This attribute specifies the name of this Cyclone DDS network " "partition. Two network partitions cannot have the same name.

")), STRING("Address", NULL, 1, NULL, MEMBEROF(ddsi_config_networkpartition_listelem, address_string), FUNCTIONS(0, uf_string, ff_free, pf_string), DESCRIPTION( "

This attribute specifies the multicast addresses associated with " "the network partition as a comma-separated list. Readers matching " "this network partition (cf. Partitioning/PartitionMappings) will " "listen for multicasts on all of these addresses and advertise them " "in the discovery protocol. The writers will select the most suitable " "address from the addresses advertised by the readers.

")), END_MARKER }; static struct cfgelem networkpartitions_cfgelems[] = { STRING("NetworkPartition", networkpartition_cfgattrs, INT_MAX, 0, MEMBER(networkPartitions), FUNCTIONS(if_network_partition, 0, 0, 0), DESCRIPTION( "

This element defines a Cyclone DDS network partition.

" )), END_MARKER }; static struct cfgelem ignoredpartitions_cfgattrs[] = { STRING("DCPSPartitionTopic", NULL, 1, NULL, MEMBEROF(ddsi_config_ignoredpartition_listelem, DCPSPartitionTopic), FUNCTIONS(0, uf_string, ff_free, pf_string), DESCRIPTION( "

This attribute specifies a partition and a topic expression, " "separated by a single '.', that are used to determine if a given " "partition and topic will be ignored or not. The expressions may use " "the usual wildcards '*' and '?'. Cyclone DDS will consider an wildcard " "DCPS partition to match an expression iff there exists a string that " "satisfies both expressions.

" )), END_MARKER }; static struct cfgelem ignoredpartitions_cfgelems[] = { STRING("IgnoredPartition", ignoredpartitions_cfgattrs, INT_MAX, 0, MEMBER(ignoredPartitions), FUNCTIONS(if_ignored_partition, 0, 0, 0), DESCRIPTION( "

This element can be used to prevent certain combinations of DCPS " "partition and topic from being transmitted over the network. Cyclone DDS " "will complete ignore readers and writers for which all DCPS " "partitions as well as their topic is ignored, not even creating DDSI " "readers and writers to mirror the DCPS ones.

" )), END_MARKER }; static struct cfgelem partitionmappings_cfgattrs[] = { STRING("NetworkPartition", NULL, 1, NULL, MEMBEROF(ddsi_config_partitionmapping_listelem, networkPartition), FUNCTIONS(0, uf_string, ff_free, pf_string), DESCRIPTION( "

This attribute specifies which Cyclone DDS network partition is to be " "used for DCPS partition/topic combinations matching the " "DCPSPartitionTopic attribute within this PartitionMapping element.

" )), STRING("DCPSPartitionTopic", NULL, 1, NULL, MEMBEROF(ddsi_config_partitionmapping_listelem, DCPSPartitionTopic), FUNCTIONS(0, uf_string, ff_free, pf_string), DESCRIPTION( "

This attribute specifies a partition and a topic expression, " "separated by a single '.', that are used to determine if a given " "partition and topic maps to the Cyclone DDS network partition named by the " "NetworkPartition attribute in this PartitionMapping element. The " "expressions may use the usual wildcards '*' and '?'. Cyclone DDS will " "consider a wildcard DCPS partition to match an expression if there " "exists a string that satisfies both expressions.

" )), END_MARKER }; static struct cfgelem partitionmappings_cfgelems[] = { STRING("PartitionMapping", partitionmappings_cfgattrs, INT_MAX, 0, MEMBER(partitionMappings), FUNCTIONS(if_partition_mapping, 0, 0, 0), DESCRIPTION( "

This element defines a mapping from a DCPS partition/topic " "combination to a Cyclone DDS network partition. This allows partitioning " "data flows by using special multicast addresses for part of the data " "and possibly also encrypting the data flow.

" )), END_MARKER }; static struct cfgelem partitioning_cfgelems[] = { GROUP("NetworkPartitions", networkpartitions_cfgelems, NULL, 1, NOMEMBER, NOFUNCTIONS, DESCRIPTION( "

The NetworkPartitions element specifies the Cyclone DDS network " "partitions.

" )), GROUP("IgnoredPartitions", ignoredpartitions_cfgelems, NULL, 1, NOMEMBER, NOFUNCTIONS, DESCRIPTION( "

The IgnoredPartitions element specifies DCPS partition/topic " "combinations that are not distributed over the network.

" )), GROUP("PartitionMappings", partitionmappings_cfgelems, NULL, 1, NOMEMBER, NOFUNCTIONS, DESCRIPTION( "

The PartitionMappings element specifies the mapping from DCPS " "partition/topic combinations to Cyclone DDS network partitions.

" )), END_MARKER }; #endif /* DDS_HAS_NETWORK_PARTITIONS */ #ifdef DDS_HAS_NETWORK_CHANNELS static struct cfgelem channel_cfgelems[] = { #ifdef DDS_HAS_BANDWIDTH_LIMITING STRING("DataBandwidthLimit", NULL, 1, "inf", MEMBEROF(ddsi_config_channel_listelem, data_bandwidth_limit), FUNCTIONS(0, uf_bandwidth, 0, pf_bandwidth), DESCRIPTION( "

This element specifies the maximum transmit rate of new samples " "and directly related data, for this channel. Bandwidth limiting uses " "a leaky bucket scheme. The default value \"inf\" means Cyclone DDS imposes " "no limitation, the underlying operating system and hardware will " "likely limit the maximum transmit rate.

") BEHIND_FLAG("DDS_HAS_BANDWIDTH_LIMITING") UNIT("bandwidth")), STRING("AuxiliaryBandwidthLimit", NULL, 1, "inf", MEMBEROF(ddsi_config_channel_listelem, auxiliary_bandwidth_limit), FUNCTIONS(0, uf_bandwidth, 0, pf_bandwidth), DESCRIPTION( "

This element specifies the maximum transmit rate of auxiliary " "traffic on this channel (e.g. retransmits, heartbeats, etc). " "Bandwidth limiting uses a leaky bucket scheme. The default value " "\"inf\" means Cyclone DDS imposes no limitation, the underlying operating " "system and hardware will likely limit the maximum transmit rate.

") UNIT("bandwidth")), #endif INT("DiffServField", NULL, 1, "0", MEMBEROF(ddsi_config_channel_listelem, diffserv_field), FUNCTIONS(0, uf_natint, 0, pf_int), DESCRIPTION( "

This element describes the DiffServ setting the channel will apply " "to the networking messages. This parameter determines the value of " "the diffserv field of the IP version 4 packets sent on this channel " "which allows QoS setting to be applied to the network traffic send on " "this channel.
\n" "Windows platform support for setting the diffserv field is dependent " "on the OS version.
\n" "For Windows version 7 or higher a new API (qWAVE) has been introduced. " "For these platforms the specified diffserv value is mapped to one of " "the support traffic types.\n" "The mapping is as follows: 1-8 background traffic; 9-40 excellent " "traffic; 41-55 audio/video traffic; 56 voice traffic; 57-63 control " "traffic.\n" "When an application is run without Administrative priveleges then " "only the diffserv value of 0, 8, 40 or 56 is allowed.

" ), BEHIND_FLAG("DDS_HAS_NETWORK_CHANNELS") ), END_MARKER }; static struct cfgelem channel_cfgattrs[] = { STRING("Name", NULL, 1, NULL, MEMBEROF(ddsi_config_channel_listelem, name), FUNCTIONS(0, uf_string, ff_free, pf_string), DESCRIPTION( "

This attribute specifies name of this channel. The name should " "uniquely identify the channel.

" )), INT("TransportPriority", NULL, 1, "0", MEMBEROF(ddsi_config_channel_listelem, priority), FUNCTIONS(0, uf_natint, 0, pf_int), DESCRIPTION( "

This attribute sets the transport priority threshold for the " "channel. Each DCPS data writer has a \"transport_priority\" QoS and " "this QoS is used to select a channel for use by this writer. The " "selected channel is the one with the largest threshold not greater " "than the writer's transport priority, and if no such channel exists, " "the channel with the lowest threshold.

" )), END_MARKER }; static struct cfgelem channels_cfgelems[] = { GROUP("Channel", channel_cfgelems, channel_cfgattrs, INT_MAX, MEMBER(channels), FUNCTIONS(if_channel, 0, 0, 0), DESCRIPTION("

This element defines a channel.

")), END_MARKER }; #endif /* DDS_HAS_NETWORK_CHANNELS */ static struct cfgelem thread_properties_sched_cfgelems[] = { ENUM("Class", NULL, 1, "default", MEMBEROF(ddsi_config_thread_properties_listelem, sched_class), FUNCTIONS(0, uf_sched_class, 0, pf_sched_class), DESCRIPTION( "

This element specifies the thread scheduling class " "(realtime, timeshare or default). The user may " "need special privileges from the underlying operating system to be " "able to assign some of the privileged scheduling classes.

"), VALUES("realtime","timeshare","default")), STRING("Priority", NULL, 1, "default", MEMBEROF(ddsi_config_thread_properties_listelem, schedule_priority), FUNCTIONS(0, uf_maybe_int32, 0, pf_maybe_int32), DESCRIPTION( "

This element specifies the thread priority (decimal integer or " "default). Only priorities that are supported by the underlying " "operating system can be assigned to this element. The user may need " "special privileges from the underlying operating system to be able to " "assign some of the privileged priorities.

" )), END_MARKER }; static struct cfgelem thread_properties_cfgattrs[] = { STRING("Name", NULL, 1, NULL, MEMBEROF(ddsi_config_thread_properties_listelem, name), FUNCTIONS(0, uf_string, ff_free, pf_string), DESCRIPTION( "

The Name of the thread for which properties are being set. The " "following threads exist:

\n" "" )), END_MARKER }; static struct cfgelem thread_properties_cfgelems[] = { GROUP("Scheduling", thread_properties_sched_cfgelems, NULL, 1, NOMEMBER, NOFUNCTIONS, DESCRIPTION( "

This element configures the scheduling properties of the thread.

" )), STRING("StackSize", NULL, 1, "default", MEMBEROF(ddsi_config_thread_properties_listelem, stack_size), FUNCTIONS(0, uf_maybe_memsize, 0, pf_maybe_memsize), DESCRIPTION( "

This element configures the stack size for this thread. The " "default value default leaves the stack size at the operating " "system default.

"), UNIT("memsize")), END_MARKER }; static struct cfgelem threads_cfgelems[] = { GROUP("Thread", thread_properties_cfgelems, thread_properties_cfgattrs, INT_MAX, MEMBER(thread_properties), FUNCTIONS(if_thread_properties, 0, 0, 0), DESCRIPTION("

This element is used to set thread properties.

")), END_MARKER }; static struct cfgelem compatibility_cfgelems[] = { ENUM("StandardsConformance", NULL, 1, "lax", MEMBER(standards_conformance), FUNCTIONS(0, uf_standards_conformance, 0, pf_standards_conformance), DESCRIPTION( "

This element sets the level of standards conformance of this " "instance of the Cyclone DDS Service. Stricter conformance typically means " "less interoperability with other implementations. Currently three " "modes are defined:

\n" ""), VALUES("lax","strict","pedantic")), BOOL("ExplicitlyPublishQosSetToDefault", NULL, 1, "false", MEMBER(explicitly_publish_qos_set_to_default), FUNCTIONS(0, uf_boolean, 0, pf_boolean), DESCRIPTION( "

This element specifies whether QoS settings set to default values " "are explicitly published in the discovery protocol. Implementations " "are to use the default value for QoS settings not published, which " "allows a significant reduction of the amount of data that needs to be " "exchanged for the discovery protocol, but this requires all " "implementations to adhere to the default values specified by the " "specifications.

\n" "

When interoperability is required with an implementation that does " "not follow the specifications in this regard, setting this option to " "true will help.

" )), ENUM("ManySocketsMode", NULL, 1, "single", MEMBER(many_sockets_mode), FUNCTIONS(0, uf_many_sockets_mode, 0, pf_many_sockets_mode), DESCRIPTION( "

This option specifies whether a network socket will be created for " "each domain participant on a host. The specification seems to assume " "that each participant has a unique address, and setting this option " "will ensure this to be the case. This is not the default.

\n" "

Disabling it slightly improves performance and reduces network " "traffic somewhat. It also causes the set of port numbers needed by " "Cyclone DDS to become predictable, which may be useful for firewall and " "NAT configuration.

"), VALUES("false","true","single","none","many")), BOOL("AssumeRtiHasPmdEndpoints", NULL, 1, "false", MEMBER(assume_rti_has_pmd_endpoints), FUNCTIONS(0, uf_boolean, 0, pf_boolean), DESCRIPTION( "

This option assumes ParticipantMessageData endpoints required by " "the liveliness protocol are present in RTI participants even when not " "properly advertised by the participant discovery protocol.

" )), END_MARKER }; static struct cfgelem internal_test_cfgelems[] = { INT("XmitLossiness", NULL, 1, "0", MEMBER(xmit_lossiness), FUNCTIONS(0, uf_int, 0, pf_int), DESCRIPTION( "

This element controls the fraction of outgoing packets to drop, " "specified as samples per thousand.

" )), END_MARKER }; static struct cfgelem internal_watermarks_cfgelems[] = { STRING("WhcLow", NULL, 1, "1 kB", MEMBER(whc_lowwater_mark), FUNCTIONS(0, uf_memsize, 0, pf_memsize), DESCRIPTION( "

This element sets the low-water mark for the Cyclone DDS WHCs, " "expressed in bytes. A suspended writer resumes transmitting when its " "Cyclone DDS WHC shrinks to this size.

"), UNIT("memsize")), STRING("WhcHigh", NULL, 1, "500 kB", MEMBER(whc_highwater_mark), FUNCTIONS(0, uf_memsize, 0, pf_memsize), DESCRIPTION( "

This element sets the maximum allowed high-water mark for the " "Cyclone DDS WHCs, expressed in bytes. A writer is suspended when the WHC " "reaches this size.

"), UNIT("memsize")), STRING("WhcHighInit", NULL, 1, "30 kB", MEMBER(whc_init_highwater_mark), FUNCTIONS(0, uf_maybe_memsize, 0, pf_maybe_memsize), DESCRIPTION( "

This element sets the initial level of the high-water mark for the " "Cyclone DDS WHCs, expressed in bytes.

"), UNIT("memsize")), BOOL("WhcAdaptive|WhcAdaptative", NULL, 1, "true", MEMBER(whc_adaptive), FUNCTIONS(0, uf_boolean, 0, pf_boolean), DESCRIPTION( "

This element controls whether Cyclone DDS will adapt the high-water " "mark to current traffic conditions, based on retransmit requests and " "transmit pressure.

" )), END_MARKER }; static struct cfgelem internal_burstsize_cfgelems[] = { STRING("MaxRexmit", NULL, 1, "1 MiB", MEMBER(max_rexmit_burst_size), FUNCTIONS(0, uf_memsize, 0, pf_memsize), DESCRIPTION( "

This element specifies the amount of data to be retransmitted in " "response to one NACK.

"), UNIT("memsize")), STRING("MaxInitTransmit", NULL, 1, "4294967295", MEMBER(init_transmit_extra_pct), FUNCTIONS(0, uf_uint, 0, pf_uint), DESCRIPTION( "

This element specifies how much more than the (presumed or discovered) " "receive buffer size may be sent when transmitting a sample for the first " "time, expressed as a percentage; the remainder will then be handled via " "retransmits. Usually the receivers can keep up with transmitter, at least " "on average, and so generally it is better to hope for the best and recover. " "Besides, the retransmits will be unicast, and so any multicast advantage " "will be lost as well.

"), UNIT("memsize")), END_MARKER }; static struct cfgelem control_topic_cfgattrs[] = { BOOL(DEPRECATED("Enable"), NULL, 1, "false", MEMBER(enable_control_topic), FUNCTIONS(0, uf_boolean, 0, pf_boolean), DESCRIPTION( "

This element controls whether Cyclone DDS should create a topic to " "control Cyclone DDS's behaviour dynamically.

")), STRING(DEPRECATED("InitialReset"), NULL, 1, "inf", MEMBER(initial_deaf_mute_reset), FUNCTIONS(0, uf_duration_inf, 0, pf_duration), DESCRIPTION( "

This element controls after how much time an initial deaf/mute " "state will automatically reset.

")), END_MARKER }; static struct cfgelem control_topic_cfgelems[] = { BOOL(DEPRECATED("Deaf"), NULL, 1, "false", MEMBER(initial_deaf), FUNCTIONS(0, uf_deaf_mute, 0, pf_boolean), DESCRIPTION( "

This element controls whether Cyclone DDS defaults to deaf mode or to " "normal mode. This controls both the initial behaviour and what " "behaviour it auto-reverts to.

")), BOOL(DEPRECATED("Mute"), NULL, 1, "false", MEMBER(initial_mute), FUNCTIONS(0, uf_deaf_mute, 0, pf_boolean), DESCRIPTION( "

This element controls whether Cyclone DDS defaults to mute mode or to " "normal mode. This controls both the initial behaviour and what " "behaviour it auto-reverts to.

")), END_MARKER }; static struct cfgelem rediscovery_blacklist_duration_attrs[] = { BOOL("enforce", NULL, 1, "false", MEMBER(prune_deleted_ppant.enforce_delay), FUNCTIONS(0, uf_boolean, 0, pf_boolean), DESCRIPTION( "

This attribute controls whether the configured time during which " "recently deleted participants will not be rediscovered (i.e., \"black " "listed\") is enforced and following complete removal of the " "participant in Cyclone DDS, or whether it can be rediscovered earlier " "provided all traces of that participant have been removed already.

" )), END_MARKER }; static struct cfgelem heartbeat_interval_attrs[] = { STRING("min", NULL, 1, "5 ms", MEMBER(const_hb_intv_min), FUNCTIONS(0, uf_duration_inf, 0, pf_duration), DESCRIPTION( "

This attribute sets the minimum interval that must have passed " "since the most recent heartbeat from a writer, before another " "asynchronous (not directly related to writing) will be sent.

"), UNIT("duration_inf")), STRING("minsched", NULL, 1, "20 ms", MEMBER(const_hb_intv_sched_min), FUNCTIONS(0, uf_duration_inf, 0, pf_duration), DESCRIPTION( "

This attribute sets the minimum interval for periodic heartbeats. " "Other events may still cause heartbeats to go out.

"), UNIT("duration_inf")), STRING("max", NULL, 1, "8 s", MEMBER(const_hb_intv_sched_max), FUNCTIONS(0, uf_duration_inf, 0, pf_duration), DESCRIPTION( "

This attribute sets the maximum interval for periodic heartbeats.

"), UNIT("duration_inf")), END_MARKER }; static struct cfgelem liveliness_monitoring_attrs[] = { BOOL("StackTraces", NULL, 1, "true", MEMBER(noprogress_log_stacktraces), FUNCTIONS(0, uf_boolean, 0, pf_boolean), DESCRIPTION( "

This element controls whether or not to write stack traces to the " "DDSI2 trace when a thread fails to make progress (on select platforms " "only).

")), STRING("Interval", NULL, 1, "1s", MEMBER(liveliness_monitoring_interval), FUNCTIONS(0, uf_duration_100ms_1hr, 0, pf_duration), DESCRIPTION( "

This element controls the interval at which to check whether " "threads have been making progress.

"), UNIT("duration"), RANGE("100ms;1hr")), END_MARKER }; static struct cfgelem multiple_recv_threads_attrs[] = { INT("maxretries", NULL, 1, "4294967295", MEMBER(recv_thread_stop_maxretries), FUNCTIONS(0, uf_uint, 0, pf_uint), DESCRIPTION( "

Receive threads dedicated to a single socket can only be triggered " "for termination by sending a packet. Reception of any packet will do, " "so termination failure due to packet loss is exceedingly unlikely, " "but to eliminate all risks, it will retry as many times as specified " "by this attribute before aborting.

" )), END_MARKER }; static struct cfgelem sock_rcvbuf_size_attrs[] = { STRING("min", NULL, 1, "default", MEMBER(socket_rcvbuf_size.min), FUNCTIONS(0, uf_maybe_memsize, 0, pf_maybe_memsize), DESCRIPTION( "

This sets the minimum acceptable socket receive buffer size, " "with the special value \"default\" indicating that whatever is " "available is acceptable.

"), UNIT("memsize")), STRING("max", NULL, 1, "default", MEMBER(socket_rcvbuf_size.max), FUNCTIONS(0, uf_maybe_memsize, 0, pf_maybe_memsize), DESCRIPTION( "

This sets the size of the socket receive buffer to request, " "with the special value of \"default\" indicating that it should " "try to satisfy the minimum buffer size. If both are at \"default\", " "it will request 1MiB and accept anything. If the maximum is set " "to less than the minimum, it is ignored.

"), UNIT("memsize")), END_MARKER }; static struct cfgelem sock_sndbuf_size_attrs[] = { STRING("min", NULL, 1, "64 KiB", MEMBER(socket_sndbuf_size.min), FUNCTIONS(0, uf_maybe_memsize, 0, pf_maybe_memsize), DESCRIPTION( "

This sets the minimum acceptable socket send buffer size, " "with the special value \"default\" indicating that whatever is " "available is acceptable.

"), UNIT("memsize")), STRING("max", NULL, 1, "default", MEMBER(socket_sndbuf_size.max), FUNCTIONS(0, uf_maybe_memsize, 0, pf_maybe_memsize), DESCRIPTION( "

This sets the size of the socket send buffer to request, " "with the special value of \"default\" indicating that it should " "try to satisfy the minimum buffer size. If both are at \"default\", " "it will use whatever is the system default. If the maximum is set " "to less than the minimum, it is ignored.

"), UNIT("memsize")), END_MARKER }; static struct cfgelem internal_cfgelems[] = { MOVED("MaxMessageSize", "CycloneDDS/Domain/General/MaxMessageSize"), MOVED("FragmentSize", "CycloneDDS/Domain/General/FragmentSize"), INT("DeliveryQueueMaxSamples", NULL, 1, "256", MEMBER(delivery_queue_maxsamples), FUNCTIONS(0, uf_uint, 0, pf_uint), DESCRIPTION( "

This element controls the maximum size of a delivery queue, " "expressed in samples. Once a delivery queue is full, incoming samples " "destined for that queue are dropped until space becomes available " "again.

")), INT("PrimaryReorderMaxSamples", NULL, 1, "128", MEMBER(primary_reorder_maxsamples), FUNCTIONS(0, uf_uint, 0, pf_uint), DESCRIPTION( "

This element sets the maximum size in samples of a primary " "re-order administration. Each proxy writer has one primary re-order " "administration to buffer the packet flow in case some packets arrive " "out of order. Old samples are forwarded to secondary re-order " "administrations associated with readers in need of historical " "data.

")), INT("SecondaryReorderMaxSamples", NULL, 1, "128", MEMBER(secondary_reorder_maxsamples), FUNCTIONS(0, uf_uint, 0, pf_uint), DESCRIPTION( "

This element sets the maximum size in samples of a secondary " "re-order administration. The secondary re-order administration is per " "reader in need of historical data.

")), INT("DefragUnreliableMaxSamples", NULL, 1, "4", MEMBER(defrag_unreliable_maxsamples), FUNCTIONS(0, uf_uint, 0, pf_uint), DESCRIPTION( "

This element sets the maximum number of samples that can be " "defragmented simultaneously for a best-effort writers.

")), INT("DefragReliableMaxSamples", NULL, 1, "16", MEMBER(defrag_reliable_maxsamples), FUNCTIONS(0, uf_uint, 0, pf_uint), DESCRIPTION( "

This element sets the maximum number of samples that can be " "defragmented simultaneously for a reliable writer. This has to be " "large enough to handle retransmissions of historical data in addition " "to new samples.

")), ENUM("BuiltinEndpointSet", NULL, 1, "writers", MEMBER(besmode), FUNCTIONS(0, uf_besmode, 0, pf_besmode), DESCRIPTION( "

This element controls which participants will have which built-in " "endpoints for the discovery and liveliness protocols. Valid values " "are:

\n" "\n" "

The default is writers, as this is thought to be compliant " "and reasonably efficient. Minimal may or may not be compliant " "but is most efficient, and full is inefficient but certain to " "be compliant. See also Internal/ConservativeBuiltinReaderStartup.

"), VALUES("full","writers","minimal")), BOOL("MeasureHbToAckLatency", NULL, 1, "false", MEMBER(meas_hb_to_ack_latency), FUNCTIONS(0, uf_boolean, 0, pf_boolean), DESCRIPTION( "

This element enables heartbeat-to-ack latency among Cyclone DDS " "services by prepending timestamps to Heartbeat and AckNack messages " "and calculating round trip times. This is non-standard behaviour. The " "measured latencies are quite noisy and are currently not used " "anywhere.

")), BOOL("UnicastResponseToSPDPMessages", NULL, 1, "true", MEMBER(unicast_response_to_spdp_messages), FUNCTIONS(0, uf_boolean, 0, pf_boolean), DESCRIPTION( "

This element controls whether the response to a newly discovered " "participant is sent as a unicasted SPDP packet, instead of " "rescheduling the periodic multicasted one. There is no known benefit " "to setting this to false.

")), INT("SynchronousDeliveryPriorityThreshold", NULL, 1, "0", MEMBER(synchronous_delivery_priority_threshold), FUNCTIONS(0, uf_int, 0, pf_int), DESCRIPTION( "

This element controls whether samples sent by a writer with QoS " "settings latency_budget <= SynchronousDeliveryLatencyBound and " "transport_priority greater than or equal to this element's value will " "be delivered synchronously from the \"recv\" thread, all others will " "be delivered asynchronously through delivery queues. This reduces " "latency at the expense of aggregate bandwidth.

")), STRING("SynchronousDeliveryLatencyBound", NULL, 1, "inf", MEMBER(synchronous_delivery_latency_bound), FUNCTIONS(0, uf_duration_inf, 0, pf_duration), DESCRIPTION( "

This element controls whether samples sent by a writer with QoS " "settings transport_priority >= SynchronousDeliveryPriorityThreshold " "and a latency_budget at most this element's value will be delivered " "synchronously from the \"recv\" thread, all others will be delivered " "asynchronously through delivery queues. This reduces latency at the " "expense of aggregate bandwidth.

"), UNIT("duration_inf")), INT("MaxParticipants", NULL, 1, "0", MEMBER(max_participants), FUNCTIONS(0, uf_natint, 0, pf_int), DESCRIPTION( "

This elements configures the maximum number of DCPS domain " "participants this Cyclone DDS instance is willing to service. 0 is " "unlimited.

")), INT("AccelerateRexmitBlockSize", NULL, 1, "0", MEMBER(accelerate_rexmit_block_size), FUNCTIONS(0, uf_uint, 0, pf_uint), DESCRIPTION( "

Proxy readers that are assumed to sill be retrieving historical " "data get this many samples retransmitted when they NACK something, " "even if some of these samples have sequence numbers outside the set " "covered by the NACK.

")), ENUM("RetransmitMerging", NULL, 1, "never", MEMBER(retransmit_merging), FUNCTIONS(0, uf_retransmit_merging, 0, pf_retransmit_merging), DESCRIPTION( "

This elements controls the addressing and timing of retransmits. " "Possible values are:

\n" "\n" "

The default is never. See also " "Internal/RetransmitMergingPeriod.

"), VALUES("never","adaptive","always")), STRING("RetransmitMergingPeriod", NULL, 1, "5 ms", MEMBER(retransmit_merging_period), FUNCTIONS(0, uf_duration_us_1s, 0, pf_duration), DESCRIPTION( "

This setting determines the size of the time window in which a " "NACK of some sample is ignored because a retransmit of that sample " "has been multicasted too recently. This setting has no effect on " "unicasted retransmits.

\n" "

See also Internal/RetransmitMerging.

"), UNIT("duration"), RANGE("0;1s")), STRING("HeartbeatInterval", heartbeat_interval_attrs, 1, "100 ms", MEMBER(const_hb_intv_sched), FUNCTIONS(0, uf_duration_inf, 0, pf_duration), DESCRIPTION( "

This element allows configuring the base interval for sending " "writer heartbeats and the bounds within which it can vary.

"), UNIT("duration_inf")), STRING("MaxQueuedRexmitBytes", NULL, 1, "512 kB", MEMBER(max_queued_rexmit_bytes), FUNCTIONS(0, uf_memsize, 0, pf_memsize), DESCRIPTION( "

This setting limits the maximum number of bytes queued for " "retransmission. The default value of 0 is unlimited unless an " "AuxiliaryBandwidthLimit has been set, in which case it becomes " "NackDelay * AuxiliaryBandwidthLimit. It must be large enough to " "contain the largest sample that may need to be retransmitted.

"), UNIT("memsize")), INT("MaxQueuedRexmitMessages", NULL, 1, "200", MEMBER(max_queued_rexmit_msgs), FUNCTIONS(0, uf_uint, 0, pf_uint), DESCRIPTION( "

This settings limits the maximum number of samples queued for " "retransmission.

" )), MOVED("LeaseDuration", "CycloneDDS/Domain/Discovery/LeaseDuration"), STRING("WriterLingerDuration", NULL, 1, "1 s", MEMBER(writer_linger_duration), FUNCTIONS(0, uf_duration_ms_1hr, 0, pf_duration), DESCRIPTION( "

This setting controls the maximum duration for which actual " "deletion of a reliable writer with unacknowledged data in its history " "will be postponed to provide proper reliable transmission.

"), UNIT("duration")), MOVED("MinimumSocketReceiveBufferSize", "CycloneDDS/Domain/Internal/SocketReceiveBufferSize[@min]"), MOVED("MinimumSocketSendBufferSize", "CycloneDDS/Domain/Internal/SocketSendBufferSize[@min]"), GROUP("SocketReceiveBufferSize", NULL, sock_rcvbuf_size_attrs, 1, NOMEMBER, NOFUNCTIONS, DESCRIPTION( "

The settings in this element control the size of the socket receive buffers. " "The operating system provides some size receive buffer upon creation " "of the socket, this option can be used to increase the size of the " "buffer beyond that initially provided by the operating system. If the " "buffer size cannot be increased to the requested minimum size, an error is " "reported.

\n" "

The default setting requests a buffer size of 1MiB but accepts whatever " "is available after that.

")), GROUP("SocketSendBufferSize", NULL, sock_sndbuf_size_attrs, 1, NOMEMBER, NOFUNCTIONS, DESCRIPTION( "

The settings in this element control the size of the socket send buffers. " "The operating system provides some size send buffer upon creation " "of the socket, this option can be used to increase the size of the " "buffer beyond that initially provided by the operating system. If the " "buffer size cannot be increased to the requested minimum size, an error is " "reported.

\n" "

The default setting requires a buffer of at least 64KiB.

")), STRING("NackDelay", NULL, 1, "100 ms", MEMBER(nack_delay), FUNCTIONS(0, uf_duration_ms_1hr, 0, pf_duration), DESCRIPTION( "

This setting controls the delay between receipt of a HEARTBEAT " "indicating missing samples and a NACK (ignored when the HEARTBEAT " "requires an answer). However, no NACK is sent if a NACK had been " "scheduled already for a response earlier than the delay requests: " "then that NACK will incorporate the latest information.

"), UNIT("duration")), STRING("AckDelay", NULL, 1, "10 ms", MEMBER(ack_delay), FUNCTIONS(0, uf_duration_ms_1hr, 0, pf_duration), DESCRIPTION( "

This setting controls the delay between sending identical " "acknowledgements.

"), UNIT("duration")), STRING("AutoReschedNackDelay", NULL, 1, "3 s", MEMBER(auto_resched_nack_delay), FUNCTIONS(0, uf_duration_inf, 0, pf_duration), DESCRIPTION( "

This setting controls the interval with which a reader will " "continue NACK'ing missing samples in the absence of a response from " "the writer, as a protection mechanism against writers incorrectly " "stopping the sending of HEARTBEAT messages.

"), UNIT("duration_inf")), STRING("PreEmptiveAckDelay", NULL, 1, "10 ms", MEMBER(preemptive_ack_delay), FUNCTIONS(0, uf_duration_ms_1hr, 0, pf_duration), DESCRIPTION( "

This setting controls the delay between the discovering a remote " "writer and sending a pre-emptive AckNack to discover the range of " "data available.

"), UNIT("duration")), STRING("ScheduleTimeRounding", NULL, 1, "0 ms", MEMBER(schedule_time_rounding), FUNCTIONS(0, uf_duration_ms_1hr, 0, pf_duration), DESCRIPTION( "

This setting allows the timing of scheduled events to be rounded " "up so that more events can be handled in a single cycle of the event " "queue. The default is 0 and causes no rounding at all, i.e. are " "scheduled exactly, whereas a value of 10ms would mean that events are " "rounded up to the nearest 10 milliseconds.

"), UNIT("duration")), #ifdef DDS_HAS_BANDWIDTH_LIMITING STRING("AuxiliaryBandwidthLimit", NULL, 1, "inf", MEMBER(auxiliary_bandwidth_limit), FUNCTIONS(0, uf_bandwidth, 0, pf_bandwidth), DESCRIPTION( "

This element specifies the maximum transmit rate of auxiliary " "traffic not bound to a specific channel, such as discovery traffic, " "as well as auxiliary traffic related to a certain channel if that " "channel has elected to share this global AuxiliaryBandwidthLimit. " "Bandwidth limiting uses a leaky bucket scheme. The default value " "\"inf\" means Cyclone DDS imposes no limitation, the underlying operating " "system and hardware will likely limit the maximum transmit rate.

" ), BEHIND_FLAG("DDS_HAS_BANDWIDTH_LIMITING") ), #endif INT("DDSI2DirectMaxThreads", NULL, 1, "1", MEMBER(ddsi2direct_max_threads), FUNCTIONS(0, uf_uint, 0, pf_uint), DESCRIPTION( "

This element sets the maximum number of extra threads for an " "experimental, undocumented and unsupported direct mode.

")), BOOL("SquashParticipants", NULL, 1, "false", MEMBER(squash_participants), FUNCTIONS(0, uf_boolean, 0, pf_boolean), DESCRIPTION( "

This element controls whether Cyclone DDS advertises all the domain " "participants it serves in DDSI (when set to false), or rather " "only one domain participant (the one corresponding to the Cyclone DDS " "process; when set to true). In the latter case Cyclone DDS becomes " "the virtual owner of all readers and writers of all domain " "participants, dramatically reducing discovery traffic (a similar " "effect can be obtained by setting Internal/BuiltinEndpointSet to " "\"minimal\" but with less loss of information).

" )), STRING("SPDPResponseMaxDelay", NULL, 1, "0 ms", MEMBER(spdp_response_delay_max), FUNCTIONS(0, uf_duration_ms_1s, 0, pf_duration), DESCRIPTION( "

Maximum pseudo-random delay in milliseconds between discovering a" "remote participant and responding to it.

"), UNIT("duration")), BOOL("LateAckMode", NULL, 1, "false", MEMBER(late_ack_mode), FUNCTIONS(0, uf_boolean, 0, pf_boolean), DESCRIPTION( "

Ack a sample only when it has been delivered, instead of when " "committed to delivering it.

")), BOOL("RetryOnRejectBestEffort", NULL, 1, "false", MEMBER(retry_on_reject_besteffort), FUNCTIONS(0, uf_boolean, 0, pf_boolean), DESCRIPTION( "

Whether or not to locally retry pushing a received best-effort " "sample into the reader caches when resource limits are reached.

")), BOOL("GenerateKeyhash", NULL, 1, "false", MEMBER(generate_keyhash), FUNCTIONS(0, uf_boolean, 0, pf_boolean), DESCRIPTION( "

When true, include keyhashes in outgoing data for topics with " "keys.

" )), STRING("MaxSampleSize", NULL, 1, "2147483647 B", MEMBER(max_sample_size), FUNCTIONS(0, uf_memsize, 0, pf_memsize), DESCRIPTION( "

This setting controls the maximum (CDR) serialised size of samples " "that Cyclone DDS will forward in either direction. Samples larger than " "this are discarded with a warning.

"), UNIT("memsize")), BOOL("WriteBatch", NULL, 1, "false", MEMBER(whc_batch), FUNCTIONS(0, uf_boolean, 0, pf_boolean), DESCRIPTION( "

This element enables the batching of write operations. By default " "each write operation writes through the write cache and out onto the " "transport. Enabling write batching causes multiple small write " "operations to be aggregated within the write cache into a single " "larger write. This gives greater throughput at the expense of " "latency. Currently there is no mechanism for the write cache to " "automatically flush itself, so that if write batching is enabled, " "the application may have to use the dds_write_flush function to " "ensure that all samples are written.

" )), BOOL("LivelinessMonitoring", liveliness_monitoring_attrs, 1, "false", MEMBER(liveliness_monitoring), FUNCTIONS(0, uf_boolean, 0, pf_boolean), DESCRIPTION( "

This element controls whether or not implementation should " "internally monitor its own liveliness. If liveliness monitoring is " "enabled, stack traces can be dumped automatically when some thread " "appears to have stopped making progress.

" )), INT("MonitorPort", NULL, 1, "-1", MEMBER(monitor_port), FUNCTIONS(0, uf_int, 0, pf_int), DESCRIPTION( "

This element allows configuring a service that dumps a text " "description of part the internal state to TCP clients. By default " "(-1), this is disabled; specifying 0 means a kernel-allocated port is " "used; a positive number is used as the TCP port number.

" )), STRING(DEPRECATED("AssumeMulticastCapable"), NULL, 1, "", MEMBER(depr_assumeMulticastCapable), FUNCTIONS(0, uf_string, ff_free, pf_string), DESCRIPTION( "

Deprecated, use General/Interfaces/NetworkInterface[@multicast] instead. " "This element controls which network interfaces are assumed to be " "capable of multicasting even when the interface flags returned by the " "operating system state it is not (this provides a workaround for some " "platforms). It is a comma-separated lists of patterns (with ? and * " "wildcards) against which the interface names are matched.

" )), BOOL("PrioritizeRetransmit", NULL, 1, "true", MEMBER(prioritize_retransmit), FUNCTIONS(0, uf_boolean, 0, pf_boolean), DESCRIPTION( "

This element controls whether retransmits are prioritized over new " "data, speeding up recovery.

" )), INT("UseMulticastIfMreqn", NULL, 1, "0", MEMBER(use_multicast_if_mreqn), FUNCTIONS(0, uf_int, 0, pf_int), DESCRIPTION("

Do not use.

")), STRING("RediscoveryBlacklistDuration", rediscovery_blacklist_duration_attrs, 1, "0s", MEMBER(prune_deleted_ppant.delay), FUNCTIONS(0, uf_duration_inf, 0, pf_duration), DESCRIPTION( "

This element controls for how long a remote participant that was " "previously deleted will remain on a blacklist to prevent rediscovery, " "giving the software on a node time to perform any cleanup actions it " "needs to do. To some extent this delay is required internally by " "Cyclone DDS, but in the default configuration with the 'enforce' attribute " "set to false, Cyclone DDS will reallow rediscovery as soon as it has " "cleared its internal administration. Setting it to too small a value " "may result in the entry being pruned from the blacklist before Cyclone DDS " "is ready, it is therefore recommended to set it to at least several " "seconds.

"), UNIT("duration_inf")), ENUM("MultipleReceiveThreads", multiple_recv_threads_attrs, 1, "default", MEMBER(multiple_recv_threads), FUNCTIONS(0, uf_boolean_default, 0, pf_boolean_default), DESCRIPTION( "

This element controls whether all traffic is handled by a single " "receive thread (false) or whether multiple receive threads may be used " "to improve latency (true). By default it is disabled on Windows because " "it appears that one cannot count on being able to send packets to " "oneself, which is necessary to stop the thread during shutdown. " "Currently multiple receive threads are only used for connectionless " "transport (e.g., UDP) and ManySocketsMode not set to single (the " "default).

"), VALUES("false","true","default")), GROUP("ControlTopic", control_topic_cfgelems, control_topic_cfgattrs, 1, NOMEMBER, NOFUNCTIONS, DESCRIPTION( "

The ControlTopic element allows configured whether Cyclone DDS provides " "a special control interface via a predefined topic or not.

" )), GROUP("Test", internal_test_cfgelems, NULL, 1, NOMEMBER, NOFUNCTIONS, DESCRIPTION("

Testing options.

")), GROUP("Watermarks", internal_watermarks_cfgelems, NULL, 1, NOMEMBER, NOFUNCTIONS, DESCRIPTION("

Watermarks for flow-control.

")), GROUP("BurstSize", internal_burstsize_cfgelems, NULL, 1, NOMEMBER, NOFUNCTIONS, DESCRIPTION("

Setting for controlling the size of transmit bursts.

")), LIST("EnableExpensiveChecks", NULL, 1, "", MEMBER(enabled_xchecks), FUNCTIONS(0, uf_xcheck, 0, pf_xcheck), DESCRIPTION( "

This element enables expensive checks in builds with assertions " "enabled and is ignored otherwise. Recognised categories are:

\n" "