8.1. Supported Platforms and Programming Languages¶
Connext DDS Micro supports the C and traditional C++ language bindings.
Note that RTI only tests on a subset of the possible combinations of OSs and CPUs. Please refer to the following table for a list of specific platforms and the specific configurations that are tested by RTI.
OS | CPU | Compiler | RTI Architecture Abbreviation |
---|---|---|---|
Red Hat® Enterprise Linux® 6.0, 6.1 (Kernel version 2.6) | x86 | gcc 4.4.5 | i86Linux2.6gcc4.4.5 |
Ubuntu® 18.04 (Kernel version 4) | x64 | gcc 7.3.0 | x64Linux4gcc7.3.0 |
Ubuntu 16.04 (Kernel version 3) | x86 | gcc 5.4.0 | i86Linux3gcc5.4.0 |
PPC Linux (Kernel version 2.6) | ppc7400 | gcc 3.3.3 | ppc7400Linux2.6gcc3.3.3 |
macOS® 10.16 | x64 | clang 8.0 | x64Darwin16clang8.0 |
QNX® 7.0 | armv8 | qcc 5.4.0 | armv8QNX7.0.0qcc_gpp5.4.0 |
QNX 6.6 | armv7a | qcc 4.7.3 | armv7aQNX6.6.0qcc_cpp4.7.3 |
QNX 6.6 | i86 | qcc 4.7.3 | i86QNX6.6qcc_cpp4.7.3 |
Windows® 7 | x86 | Visual Studio® 2010 | i86Win32VS2010 |
Windows® 7 | x64 | Visual Studio® 2015 | x64Win64VS2015 |
8.2. What’s New in 3.0.3¶
8.2.1. Example CMakeLists.txt has new dependency with Micro Application Generator source files¶
The CMakeLists.txt
generated by the Code Generator now has a
rule that will add a dependency with Micro Application Generator (MAG)
source code files. The rule is conditional: it is only added if the option
RTIME_MAG_FILES
is set to the XML file used by MAG when invoking CMake.
8.2.2. ThreadX CMake files and new documentation on building Connext DDS Micro for ThreadX + NetX¶
Connext DDS Micro libraries can now be compiled using rtime-make
and CMake for
ThreadX + NetX. There is a new section in the documentation on building
for the ThreadX operating system and NetX network stack, including
example configurations (see Building the Connext DDS Micro Source for ThreadX).
8.2.3. New documentation on building Connext DDS Micro for FreeRTOS + lwIP¶
There is a new section in the documentation on building for the FreeRTOS operating system and lwIP network stack, including example configurations (see Building the Connext DDS Micro Source for FreeRTOS).
8.2.4. Added missing precondition check to mutex operation¶
This release adds previously missing preconditions to OSAPI_Mutex_take
to check that the self
argument is not NULL.
8.2.5. Updated example CMakeLists.txt to automatically regenerate code when IDL or XML file changes¶
The CMakeLists.txt
generated by Code Generator now has a rule that will
regenerate type-support files if the IDL or XML file with the type definition
changes. The rule is conditional: it is only added if the option
RTIME_IDL_ADD_REGENERATE_TYPESUPPORT_RULE
is set to TRUE when invoking CMake.
8.2.6. Macro TARGET renamed to RTIME_TARGET_NAME¶
The TARGET
macro has been renamed RTIME_TARGET_NAME
to avoid a
clash with other third-party macros. This will affect you if you are
building Connext DDS Micro source in your project, instead of building using the
rtime-make
script.
8.3. What’s Fixed in 3.0.3¶
8.3.1. Missing information in Release Notes for 3.0.2¶
In the Release Notes for 3.0.2, the “What’s Fixed” section did not mention that 3.0.2 fixed vulnerability MICRO-2025. The Release Notes for 3.0.2 have been updated.
8.3.2. Reliable DataWriter sent Heartbeats to best-effort DataReader¶
A reliable DataWriter sent periodic and piggybacked Heartbeats to a best-effort DataReader. This issue has been fixed. Periodic Heartbeats are no longer sent to best-effort DataReaders. Piggybacked Heartbeats are now sent only when the reliable DataWriter has at least one matched reliable DataReader.
[RTI Issue ID MICRO-2225]
8.3.4. Newly matched VOLATILE DataReader did not receive samples until current DataReaders acknowledged outstanding samples¶
Due to a regression in version 3.0.2, a newly matched VOLATILE DataReader may not have received samples until current DataReaders acknowledged samples published before the match.
This issue was most notable when abruptly deleting a DomainParticipant
(for example, with Control-C). It was less likely to occur when a
DomainParticipant was deleted cleanly using the delete_participant()
API or a matched DataReader was deleted with delete_datareader()
.
This issue has been fixed.
[RTI Issue ID MICRO-2233]
8.3.5. Permissions validity dates in leap years not handled correctly¶
According to the DDS Security specification, the Permissions Document contains a <validity> element, which contains <not_before> and <not_after> elements. Each of the latter two elements contains a date and time. If you specified a date in a leap year, Security Plugins incorrectly added one day to the date.
For example, Security Plugins incorrectly interpreted “2020-01-08T00:00:00” as “2020-01-09T00:00:00”. Consequently, if you set the <not_before> value to less than a day before the current time, and the day was in a leap year, you would incorrectly get this error and DomainParticipant creation would fail:
RTI_Security_PermissionsGrant_isValidTime:now is before not_before of permissions file
This problem has been fixed. Leap years in the Permissions Document are now interpreted correctly.
[RTI Issue ID MICRO-2235]
8.3.6. Generated examples did not unregister SHMEM on application destruction¶
The generated examples failed to unregister the SHMEM component when the application was destroyed. This problem has been resolved.
[RTI Issue ID MICRO-2245]
8.3.7. Waitset with 0 second timeout did not return immediately¶
A Waitset with a 0 second timeout did not return immediately, but was rounded up to one clock period. This issue has been fixed.
[RTI Issue ID MICRO-2264]
8.3.8. Order of elements in DomainParticipantQos.user_traffic.enabled_transports may have prevented discovery¶
The order of elements in DomainParticipantQos.user_traffic.enabled_transports
may have prevented discovery from occurring when both the UDPv4 and shared
memory transports were enabled. This issue has been fixed.
[RTI Issue ID MICRO-2274]
8.3.9. Invalid samples in batched data samples did not count as ‘lost samples’¶
Invalid samples in batched data samples were not counted as lost samples
and did not trigger Connext DDS Micro to call on_sample_lost()
when the
on_sample_lost notification was enabled. This issue has been fixed.
[RTI Issue ID MICRO-2289] .. MICRO-2429 backport
8.3.10. Help information displayed for rtime-make script was incomplete for VxWorks targets¶
On Windows systems, the rtime-make
script did not show help information for
compiling VxWorks target applications. This issue has been fixed.
[RTI Issue ID MICRO-2304]
8.3.11. Invalid serialization of samples with types containing members of primitive structures that required padding¶
In Connext DDS 6.0.0 and 6.0.1, the serialization of samples with a type containing a member of a primitive structure that required padding only at the end may have been wrong. For example:
/* Struct1 requires padding at the end. sizeof(Struct1) is 16 */
struct Struct1 {
double double1;
float float1;
};
struct Struct2 {
float float1;
float float2;
};
struct Struct3 {
Struct1 group1;
Struct2 group2;
};
struct Struct4 {
Struct3 msg;
};
The serialization of the following sample for Struct4 was wrong:
{1.0, 2.0, 3.0, 4.0}
Upon reception, the sample would have been deserialized as:
{1.0, 2.0, 0.0, 3.0}
This problem only occurred when all of the following conditions were true. We will use the example above to describe the conditions:
- For non-DynamicData, the code is generated with
-optimization 2
.- For XCDR2 encapsulation, the structure with padding at the end (Struct1) must be
@final
. For XCDR1 encapsulation, Struct1 must be@appendable
or@final
.- The member of Struct1 (group1) is followed by another member (group2) whose type has an alignment that is equal to or smaller than the alignment of the last member (float1) of Struct1. In the example above, group1, where float1 has an alignment of 4, is followed by group2, whose first member, float1, has an alignment of 4.
- The member of Struct1 must be on a second or higher level of nestedness.
This problem has been resolved.
[RTI Issue ID MICRO-2329]
8.3.12. Failure to delete Participant when DataReader specified its own multicast address¶
If a Participant’s DataReader set its enabled_transports
QoS to use multicast,
Participant deletion failed. This problem has been resolved. Now Participant deletion
succeeds when DataReaders specify their own multicast locators.
[RTI Issue ID MICRO-2335]
8.3.13. Generated C code could not be used in C++ applications¶
C code generated by rtiddsgen could not be used in C++ applications. This issue has been fixed. Now C types can be used in C++ code, as long as you use the C API.
[RTI Issue ID MICRO-2340]
8.3.14. Examples generated by Code Generator used untyped register_type APIs instead of typed APIs¶
The examples generated by the Code Generator registered types using
DDS_DomainParticipant_register_type()
, instead of the recommended
FooTypeSupport_register_type()
. This problem has been resolved. The
generated examples now use FooTypeSupport_register_type()
.
[RTI Issue ID MICRO-2343]
8.3.15. Unicast DataReader stopped receiving samples after DataWriter matched with a multicast DataReader¶
A DataReader with a unicast locator stopped receiving samples from a matched DataWriter when another DataReader with a multicast locator matched with that DataWriter. This problem has been resolved. Now all matched DataReaders will receive samples, regardless of whether their locators are unicast or multicast.
[RTI Issue ID MICRO-2369]
8.3.16. Exponential memory growth for remote_participant_allocation¶
The memory allocated by a DomainParticipant increased exponentially with the
value of remote_participant_allocation
in the
DomainParticipantResourceLimits QoS policy. This issue has been fixed.
[RTI Issue ID MICRO-2395]
8.3.17. The delete_contained_entities() APIs may not have returned if an endpoint specified its own TransportQosPolicy¶
If a DataReader and/or DataWriter specified its own transport address in its DDS_TransportQosPolicy, a call to any of the following APIs may not have returned:
- DDS_DomainParticipant_delete_contained_entities()
- DDS_Publisher_delete_contained_entities()
- DDS_Subscriber_delete_contained_entities()
This issue has been fixed.
[RTI Issue ID MICRO-2448]
8.3.18. Default stack too small for ThreadX port¶
The default stack used by the ThreadX port was too small. This issue has been fixed. The default stack size has been increased to 10 KB.
[RTI Issue ID MICRO-2450]
8.4. Previous Releases¶
8.4.1. What’s New in 3.0.2¶
8.4.1.1. Micro Application Generation examples now use ignore_loopback_interface¶
Micro Application Generation (MAG) examples now use ignore_loopback_interface = 0
to tell MAG that the loopback interface should be used. Using this setting is
preferred over using a unicast address in multicast_receive_addresses
.
8.4.1.2. Support for custom prefix properties when configuring the security plugin¶
Connext DDS Micro now supports custom prefixes for the RTI specific properties in the security plugin. This property is optional and properties can still be used without the prefixes.
8.4.1.3. Updated OpenSSL version¶
The Connext DDS Micro security plugin now requires OpenSSL version 1.1.1d or higher. Note that OpenSSL 1.1.x is NOT backward compatible with 1.0.x.
8.4.1.4. Support for payload encryption between local endpoints¶
Connext DDS Micro now supports payload encryption for endpoints between endpoints in the same DomainParticipant. Note that payload encryption is not performed for communication over the INTRA transport.
8.4.1.5. Performance optimization on serialization/deserialization for sequences with complex elements¶
This release improves the serialization/deserialization performance for sequences containing complex elements when the element type has the following properties:
- It is marked as
@final
. - It only contains primitive members, or complex members with only primitive members.
For example:
@final
struct Point {
long x;
long y;
};
@final
struct MyType {
sequence<Point, 1000> points;
};
The optimization is applied to the code generation only when the
optimization level (-optimization
) is set to 2 (default value).
The optimization always applies to DynamicData.
8.4.1.6. Protocol improvements for fragmented samples¶
This release includes minor improvements to the reliability protocol to prevent excessive retransmission of fragments when the subscriber’s network stack is unable to buffer at least one sample.
8.4.2. What’s Fixed in 3.0.2¶
8.4.2.1. Vulnerability¶
This release fixes vulnerability MICRO-2025.
8.4.2.2. Sample filtering methods are always added to the subscriber code for C¶
The generated subscriber example code always included code to filter samples-based fields in the IDL type. However, if the generated IDL file was modified to exclude these fields, the code would fail to compile. The generated code now includes instructions for how to filter instead.
[RTI Issue ID MICRO-1980]
8.4.2.3. Incorrect text in error message when specifying security properties programmatically¶
When specifying security plugin properties via code, one must prefix the
property with data:,
. However, the error message stated to prefix with
data:
instead of data:,
. This issue has been fixed.
[RTI Issue ID MICRO-2127]
8.4.2.4. Invalid serialization of samples with types containing primitive members that require padding¶
The serialization of samples with a type containing a nested complex type with primitive members that require padding may have failed. This means that a DataReader may have received an invalid value for a sample.
@nested struct Struct_3 {
float m1;
long long m2;
short m3;
};
@nested struct Struct_2 {
Struct_3 m1;
};
struct Struct_1 {
Struct_2 m1;
};
In the above example, Struct_3 is nested, and there is padding between m1 (4-byte aligned) and m2 (8-byte aligned) of 4 bytes.
This problem affected DynamicData and the generated code for the following languages: C and C++.
For generated code, a potential workaround to this problem was to generate code with a value of 1 for the -optimization, but this may have had performance implications.
This problem has been resolved.
[RTI Issue ID MICRO-2133]
8.4.2.5. Compiler warning in FreeRTOS port¶
When compiling the FreeRTOS port, the following warning may have been given by the compiler:
passing argument 1 of 'xTaskCreate' from incompatible pointer type freertosThread.c
This issue has been fixed.
[RTI Issue ID MICRO-2153]
8.4.2.6. HelloWorld_dpde_waitset C++ example uses wrong loop variable for printing data¶
When multiple samples are loaned by calling take()
, the
HelloWorld_dpde_waitset C++ example uses the wrong loop variable, i
, with
data_seq
, instead of the correct index j
. This issue has been fixed.
[RTI Issue ID MICRO-2158]
8.4.2.7. Warning DDSC_LOG_DESERIALIZE_UNKNOWN_PID_EC is logged when security is disabled¶
The following INFO message was always logged when security was not compiled:
[1572432716.821711998]INFO: ModuleID=7 Errcode=1209 X=1 E=0 T=1
dds_c/ParticipantBuiltinTopicDataPlugin.c:443/DPDE_ParticipantBuiltinTopicData_deserialize_pv: pid=89 length=176
This issue has been fixed.
[RTI Issue ID MICRO-2162]
8.4.2.8. High memory usage with security enabled¶
Enabling security may have caused very high application memory usage. This release reduces the amount of memory allocated.
[RTI Issue ID MICRO-2164]
8.4.2.9. FlatData: possible compilation error building data for a type with a sequence with Traditional C++¶
Applications using the member function FinalSequenceBuilder::add_n(count)
failed
to compile when the FlatData™ language binding was used with the
Traditional C++ API. The member function add_next()
could be used
instead, but add_n
may achieve better performance. This problem
affected types containing sequences of final structs.
This problem has been resolved.
[RTI Issue ID MICRO-2187]
8.4.2.10. FlatData: Conversion warning on some platforms¶
Applications using FlatData types may have seen a warning such as the following:
warning: conversion to ‘unsigned int’ from ‘long unsigned int’ may alter its value [-Wconversion]
enum { value = primitive_lc_code_helper<sizeof(T)>::single };
This issue has been fixed.
[RTI Issue ID MICRO-2189]
8.4.2.11. FlatData: Bad performance of PrimitiveSequenceBuilder:add_n¶
The function PrimitiveSequenceBuilder:add_n(int count)
, which adds a
number of elements to a primitive sequence in a FlatData sample,
initialized the new elements to zero. This initialization added
unnecessary latency to the sample-building process.
This problem has been resolved by avoiding the initialization
in that function, and by adding a separate overload
(PrimitiveSequenceBuilder:add_n(int count, T value)
)
that initializes the elements.
[RTI Issue ID MICRO-2190]
8.4.2.12. Large timeout values, e.g liveliness and deadline, may cause segmentation fault¶
Large timeout values, larger than 2000s, may have caused a segmentation fault during creation of DDS entities. This issue has been fixed.
[RTI Issue ID MICRO-2192]
8.4.2.13. Generated public APs to serialize/deserialize samples do not work within an IDL module when the -namespace option is used with rtiddsgen¶
The code generated with the -namespace option to rtiddsgen would fail to compile if the IDL file contained more than one IDL module. This issue has been fixed.
[RTI Issue ID MICRO-2194]
8.4.2.14. Configuring the DPDE Discovery Plugin with max_samples_per_remote_builtin_writer > 1 may result in discovery samples not being processed¶
If the Dynamic Participant Dynamic Endpoint (DPDE) discovery plugin was configured with a max_samples_per_remote_builtin_writer > 1, discovery samples may have been received but not processed. This would typically happen when more than 1 discovery sample was being processed at a time. This issue has been resolved.
[RTI Issue ID MICRO-2195]
8.4.2.15. Read/take APIs returned more than depth samples if an instance returned to alive without application reading NOT_ALIVE sample¶
If an instance transitioned from NOT_ALIVE_NO_WRITERS or NOT_ALIVE_DISPOSED to ALIVE and the application did not read/take the sample indicating NOT_ALIVE_NO_WRITERS or NOT_ALIVE_DISPOSED, the number of samples returned would exceed the depth set by the History QoS policy. This issue has been fixed.
[RTI Issue ID MICRO-2196]
8.4.2.16. An application may have terminated with a segmentation fault if OSAPI_Semaphore_give() was called from one thread while another called OSAPI_Semaphore_delete()¶
An application may have terminated with a segmentation fault if OSAPI_Semaphore_give() was called from one thread while another called OSAPI_Semaphore_delete() on Unix-like systems. This issue has been resolved.
[RTI Issue ID MICRO-2209]
8.4.2.17. PUBLICATION_MATCHED_STATUS and SUBSCRIPTION_MATCHED_STATUS may never trigger a WaitSet if the status is enabled after the DomainParticipant is enabled¶
A StatusCondition with a PUBLICATION_MATCHED_STATUS or SUBSCRIPTION_MATCHED_STATUS enabled may have never triggered a WaitSet if the status was enabled after the DomainParticipant was enabled. This issue has been resolved.
[RTI Issue ID MICRO-2219]
8.4.3. What’s New in 3.0.1¶
8.4.3.1. Support for FreeRTOS and ThreadX¶
This release includes support for the FreeRTOS™ and ThreadX® operating systems.
8.4.3.2. New QoS parameter to adjust preemptive ACKNACK period¶
A new QoS parameter has been introduced to expose the preemptive ACKNACK period on DataReaders. The new parameter is configured with:
DDS_DataReaderQos.protocol.rtps_reliable_reader.nack_period
for user DataReadersbuiltin_endpoint_reader_nack_period
for the builtin discovery endpoints in the Dynamic discovery plugin.
Please see the reference API for details.
8.4.3.3. Deserialization of Presentation QoS policy¶
This release provides better support for the Presentation QoS policy. Previously this QoS policy was not supported by the DataWriter; the default value was assumed for a discovered DataReader, which caused an “Unknown QoS” warning when the it was received. In this release, DataWriters will deserialize the Presentation QoS policy and check for compatibility.
8.4.3.4. Dynamic memory allocations removed from Dynamic Discovery Plugin¶
The dynamic discovery plugin in Connext DDS Micro allocated memory dynamically after the DomainParticipant was enabled to store discovered type and topic names. This release includes improvements which make it possible to avoid all memory allocations.
Dynamic memory allocations are avoided by creating the DomainParticipant in a disabled state and creating all local endpoints before the DomainParticipant is enabled.
A DomainParticipant is created in a disabled state by setting
DomainParticipantFactoryQos.entity_factory.autoenable_created_entities = DDS_BOOLEAN_TRUE
before calling create_participant()
. When all entities have been created,
call enable()
on the DomainParticipantFactory to enable all entities.
8.4.3.5. New APIs to serialize and deserialize samples¶
Two new APIs are available to applications to serialize and deserialize samples, for example for record and replay type applications. Please see the C and C++ API reference manuals under “DDS API->Topic->User Data Type Support” for a details.
8.4.3.6. New QoS parameter to set max outstanding samples allowed for remote DataWriter¶
A new QoS parameter has been exposed for the endpoint discovery endpoints
in the dynamic endpoint discovery plugin (DPDE). You can set the new field,
max_samples_per_remote_builtin_endpoint_writer
in
DPDE_DiscoveryPluginProperty, to increase the number of samples a remote
writer may have per builtin endpoint reader and thus decrease network
traffic. Please refer to the DPDE reference manual for a description of
this new parameter.
8.4.3.7. DomainParticipants no longer allocate dynamic memory during deletion¶
DomainParticipants will no longer allocate dynamic memory during deletion.
8.4.4. What’s Fixed in 3.0.1¶
8.4.4.1. DomainParticipant creation failed if active interface had invalid IP¶
An active interface without a valid IP address assigned may have caused DomainParticipant creation to fail. This problem has been resolved. Now if an interface with an invalid IP address is used, it will be ignored and the DomainParticipant will still be created.
[RTI Issue ID MICRO-1602]
8.4.4.2. Incorrect C++ example publisher generated for certain annotations¶
Generating a C++ example for a type annotated with
@transfer_mode(SHMEM_REF)
and @language_binding(FLAT_DATA)
caused the publisher to run out of available loanable samples to
publish. This problem has been resolved.
[RTI Issue ID MICRO-1998]
8.4.4.3. Liveliness lease duration matching did not follow OMG specification¶
Connext DDS Micro allowed a Writer to match with a remote Reader if the requested Liveliness lease duration was INFINITE, ignoring the Liveliness kind. This behavior did not follow the OMG specification. Now matching will only occur if both these conditions are true:
- Requested Liveliness lease duration is >= the Offered lease duration.
- Requested Liveliness kind is <= the Offered Liveliness kind, where AUTOMATIC_LIVELINESS_KIND < MANUAL_BY_PARTICIPANT_LIVELINESS_KIND < MANUAL_BY_TOPIC_LIVELINESS_KIND.
[RTI Issue ID MICRO-2007]
8.4.4.4. rtime-make did not work when started from different shell than Bash¶
rtime-make
requires Bash on UNIX systems. However it did not explicitly
launch Bash and would fail if started from a Bash-incompatible shell. The
script now always launches /bin/bash as the shell.
[RTI Issue ID MICRO-2013]
8.4.4.5. UDP interface warning using valid interfaces¶
Connext DDS Micro logged a warning if no new interfaces were added for each address
listed in the enabled_transports
.
This applied to the enabled_transports
field in the DiscoveryQosPolicy
and UserTrafficQosPolicy in the DomainParticipantQos,
and the DDS_TransportQosPolicy in the DataReaderQos and DataWriterQos.
This problem has been resolved. Now Connext DDS Micro will only log a warning if no new interfaces are added per enabled transport.
[RTI Issue ID MICRO-2018]
8.4.4.6. Payload encryption did not work when using extensible types¶
Due to a miscalculation of resources, payload encryption failed when using extensible types. This problem has been resolved.
[RTI Issue ID MICRO-2020]
8.4.4.7. Duplicate DATA messages sent to multicast in some cases¶
Duplicate DATA messages were sent to multicast when multiple DataReaders were configured with multicast and unicast receive addresses. This problem has been resolved.
[RTI Issue ID MICRO-2043]
8.4.4.8. Could not build source with OSAPI_ENABLE_LOG=0¶
The Connext DDS Micro source was compiled with the -DOSAPI_ENABLE_LOG=0. This problem has been resolved.
[RTI Issue IDs MICRO-2049, MICRO-2048]
8.4.4.9. Compilation error when inter-participant channel disabled¶
When disabling the inter-participant channel at compile time, the compiler reported an error. This problem has been resolved.
[RTI Issue ID MICRO-2051]
8.4.4.10. Seq_copy on a loaned or discontiguous sequence caused incorrect behavior¶
Calling Fooseq_copy() on a loaned or discontiguous sequence did not work correctly. This problem has been resolved.
[RTI Issue ID MICRO-2053]
8.4.4.11. Compiler warning with const IDL strings or strings¶
When declaring a const string or string in IDL, the compiler may have reported a warning. This problem has been resolved.
[RTI Issue ID MICRO-2054]
8.4.4.12. Warnings in header file due to conversion between RTI_BOOL C type and bool C++ type¶
When compiling the security source, the compiler may have reported a warning: “Warnings in header file due to conversion between RTI_BOOL C type and bool C++ type. ” This problem has been resolved.
[RTI Issue ID MICRO-2056]
8.4.4.13. DDS_Subscriber_create_datareader() affected by local_writer_allocation limit¶
The maximum number of DataReaders that could be created was determined by the
DomainParticipant.resource_limits.local_writer_alloation
resource limit.
This problem has been resolved.
[RTI Issue ID MICRO-2065]
8.4.4.14. Restarting remote participant when using DPSE caused DDSC_LOG_PARTICIPANT_LOOKUP error¶
When a remote participant was restarted twice or more when using the static discovery plugin (DPSE), the error message DDSC_LOG_PARTICIPANT_LOOKUP was logged. This problem has been resolved.
[RTI Issue ID MICRO-2088]
8.4.4.15. ‘Failure to give mutex’ error¶
In Connext DDS Micro 3.0.0, a subtle race condition may have occurred on multi-core machines. When this happened, an error message about failing to give a mutex would be printed: error code (EC) 44 in module 1 (OSAPI). This problem has been resolved.
[RTI Issue ID MICRO-2095]
8.4.4.16. DDS_LOG_DR_DESERIALIZE_KEYHASH error¶
A DDS_LOG_DR_DESERIALIZE_KEYHASH error may have been logged, in particular on Linux systems. This issue has been partially fixed in this release.
However, this error may still be logged if the first sample received for an instance is the dispose sample and the dispose sample does not contain the key fields. This is always the case with Connext DDS Micro and may be the case with Connext DDS Professional, if sending the key fields has been disabled. The error is benign and does not cause any communication failure.
[RTI Issue ID MICRO-2097]
8.4.4.17. Entity ID generation was not thread-safe¶
Entity ID generation for DataReaders and DataWriters was not thread-safe and may have lead to duplicate entity IDs. This problem has been resolved.
[RTI Issue ID MICRO-2104]
8.4.4.18. Fully dropped fragmented sample caused communication to stop with KEEP_ALL on DataWriter¶
The combination of a HistoryQosPolicy kind of KEEP_ALL and having fragmented samples may have caused communication to stop between a writer and reader if all fragments for a sample were lost. This problem has been resolved.
[RTI Issue ID MICRO-2114]
8.4.4.19. DDS_WaitSet_wait() returned DDS_RETCODE_ERROR if unblocked with no active conditions¶
An application that used a combination of polling a DataReader and blocking on a DDS_WaitSet may have caused DDS_WaitSet_wait() to return DDS_RETCODE_ERROR. This happened if the DDS_WaitSet was unblocked by an attached condition, but there were no active conditions. This problem has been resolved.
[RTI Issue ID MICRO-2115]
8.4.4.20. ALREADY_EXISTS error printed in high-load scenarios¶
The error code (EC) 23, module 2 (DB) may have been printed if a system was under heavy load and participant lease durations expired. This problem has been resolved.
[RTI Issue ID MICRO-2116]
8.4.4.21. Publication handle not set in SampleInfo structure when on_before_sample_commit() called¶
The publication_handle member of the DDS_SampleInfo structure passed to a DataReader’s on_before_sample_commit() function was not set. This problem has been resolved.
[RTI Issue ID MICRO-2121]
8.4.4.22. Using serialize_data_to_cdr_buffer() with statically allocated buffer gave wrong results¶
Using serialize_data_to_cdr_buffer
with a statically allocated buffer may have
caused incorrect results if a re-alignment of the buffer size was required.
Foo_serialize_data_to_cdr_buffer()
did not support a buffer that was not
aligned to 4. This issue has been resolved.
Note that it is still a requirement that the buffer is aligned to at least 4.
[RTI Issue ID MICRO-2130]
8.4.4.23. Instance resources exhausted even with DDS_REPLACE_OLDEST_INSTANCE_REPLACEMENT_QOS¶
Instance resources may have been exhausted on the DataReader even when DDS_REPLACE_OLDEST_INSTANCE_REPLACEMENT_QOS was specified as the instance-replacement policy and the DataReader was configured to support both XCDRv1 and XCDRv2. This problem has been resolved.
[RTI Issue ID MICRO-2140]
8.4.4.24. UDP Transformation feature did not work in version 3.0.0¶
The UDP Transformation feature was not updated from Connext DDS Micro 2 to work with Connext DDS Micro 3. This problem has been resolved. Please refer to the HelloWorld_transformations example, as Connext DDS Micro 3 uses a different packet structure than Connext DDS Micro 2.
[RTI Issue ID MICRO-2144]
8.4.4.25. Flow-controller with insufficient bandwidth may have caused communication failure¶
A flow-controller configured with less bandwidth than required based on the publication rate may have caused a communication failure when a data writer was configured with KEEP_LAST. This problem has been resolved.
[RTI Issue ID MICRO-2155]
8.4.5. What’s New in 3.0.0.1¶
8.4.5.1. New APIs to Serialize and Deserialize Samples¶
Two new APIs are available to applications to serialize and deserialize samples, for example for record and replay type applications. Please refer to the C and C++ API reference manuals under “DDS API->Topic->User Data Type Support” for a details.
8.4.5.2. Dynamic Memory allocations removed from the Dynamic Discovery Plugin¶
In previous versions of Connext DDS Micro the dynamic discovery plugin (DPDE) allocates memory after the DomainParticipant is enabled to store discovered Topic and Type names. This release includes improvements which make it possible to avoid all memory allocations after the DomainParticipant is enabled.
When a DomainParticipant discovers a Topic that exists locally no memory is allocated. However, if a Topic is discovered that does not exist locally memory is allocated to store the Topic and Type names.
In order to avoid all dynamic memory allocations during discovery the following rules must be followed:
- Create the DomainParticipant disabled by setting DomainParticipantFactoryQos.entity_factory.autoenable_created_entities = DDS_BOOLEAN_FALSE before calling create_participant().
- Create all local DataReaders and DataWriters for all Topics that will be discovered.
- If it is possible to discover DomainParticipants that will not match with local DataReaders and DataWriters, set DomainParticipantFactoryQos.discovery.accept_unknown_peers = DDS_BOOLEAN_FALSE and list all DomainParticipants that should be discovered in DomainParticipantFactoryQos.discovery.initial_peers.
- Call enable() on the DomainParticipant to enable all entities.
A known limitation is that it is not possible ignore specific Topics.
8.4.6. What’s Fixed in 3.0.0.1¶
8.4.6.1. Cannot build source with OSAPI_ENABLE_LOG=0¶
The Connext DDS Micro source did not compile when logging was disabled with the preprocessor definition -DOSAPI_ENABLE_LOG=0. This has been fixed.
[RTI Issue ID MICRO-2049], [RTI Issue ID MICRO-2048]
8.4.6.2. DDS_Subscriber_create_datareader() was affected by the local_writer_allocation limit¶
The maximum number of DataReaders that could be created was determined by the DomainParticipant.resource_limits.local_writer_alloation resource limit. This issue has been fixed.
[RTI Issue ID MICRO-2065]
8.4.7. What’s New in 3.0.0¶
8.4.7.1. Support for XCDR encoding version 2¶
This release adds support for the standard XCDR encoding version 2 data representation described in the “Extensible and Dynamic Topic Types for DDS” specification. This encoding version is more efficient in terms of bandwidth than XCDR encoding version 1, which is supported in previous Connext DDS releases (and still supported in this release).
To select between XCDR and XCDR2 data representations, you can use the DataRepresentationQosPolicy for DataReaders and DataWriters. Connext DDS Micro now supports this policy. You may specify XCDR, XCDR2, or AUTO to indicate which versions of the Extended Common Data Representation (CDR) are offered and requested. The default is AUTO.
A DataWriter offers a single representation, which indicates the CDR version the DataWriter uses to serialize its data. A DataReader requests one or more representations, which indicate the CDR versions the DataReader accepts. If a DataWriter’s offered representation is contained within a reader’s sequence of requested representations, then the offer satisfies the request, and the policies are compatible. Otherwise, they are incompatible. In support of this feature, a new QoS, DATA_REPRESENTATION, has been added for the DataWriter and DataReader. There is also a new annotation, @allowed_data_representation, that can be used to select the supported data representations for a type.
- For more information, see:
- the “Extensible and Dynamic Topic Types for DDS” specification from the Object Management Group (OMG): https://www.omg.org/spec/DDS-XTypes/.
- the section on the DATA_REPRESENTATION QoS Policy, in the RTI Connext DDS Core Libraries User’s Manual (available here if you have Internet access).
- the Data Representation chapter, in the RTI Connext DDS Core Libraries Getting Started Guide Addendum for Extensible Types (available here if you have Internet access).
8.4.7.3. Support for RTI Security Plugins¶
RTI Security Plugins introduce a robust set of security capabilities, including authentication, encryption, access control and logging. Secure multicast support enables efficient and scalable distribution of data to many subscribers. Performance is also optimized by fine-grained control over the level of security applied to each data flow, such as whether encryption or just data integrity is required.
Security Plugins are available in a separate package from the RTI Support Portal, https://support.rti.com/.
See the RTI Security Plugins Release Notes and RTI Security Plugins Getting Started Guide (available here and here if you have Internet access).
8.4.7.4. Large Data Types¶
This release adds support for user-defined data types that exceed the maximum message size supported by the underlying transports, such as 64K in the case of UDP. Its use is fully transparent: samples are automatically fragmented by the DataWriter and reassembled by the DataReader. Once re-assembled, the samples are treated as regular samples and subject to all applicable QoS policies.
8.4.7.5. Asynchronous DataWriters¶
This release adds support for publishing data asynchronously. An asynchronous DataWriter offloads the user thread and makes it possible to coalesce samples across multiple write() calls into a single network packet.
Samples written by an asynchronous DataWriter are not sent in the context of the user thread as part of the write() call. Instead, samples are queued and sent in the context of a separate, dedicated thread. An optional flow control mechanism is provided to throttle the rate at which samples are coalesced and sent by the dedicated thread.
To implement this feature, there are two new QosPolicies, ASYNCHRONOUS_PUBLISHER and PUBLISH_MODE. The ASYNCHRONOUS_PUBLISHER QosPolicy enables/disables asynchronous publishing for the Publisher. If enabled, the Publisher will spawn a separate asynchronous publishing thread, which will be shared by all of the Publisher’s DataWriters that have their new PUBLISH_MODE QosPolicy set to ASYNCHRONOUS. When data is written asynchronously, a new ‘FlowController’ object can be used to shape the network traffic. The FlowController’s properties determine when the asynchronous publishing thread is allowed to send data and how much.
8.4.7.6. Support for KEEP_ALL History¶
This release supports setting the History QoS policy kind to KEEP_ALL.
8.4.7.7. Support for AUTOMATIC and MANUAL_BY_PARTICIPANT Liveliness¶
Now you can set the Liveliness QoS policy kind to AUTOMATIC or MANUAL_BY_PARTICIPANT.
- AUTOMATIC: Connext DDS Micro will automatically assert liveliness for the DataWriter at least as often as the lease_duration.
- MANUAL_BY_PARTICIPANT: The DataWriter is assumed to be alive if any Entity within the same DomainParticipant has asserted its liveliness.
8.4.7.8. Micro Application Generation¶
This release includes Micro Application Generation, which enables you to create a Connext DDS Micro application, including registration of factories and creation of DDS entities, from an XML configuration file. Please see Application Generation in this documentation, as well as the chapter on Generating Applications for Connext DDS Micro, in the RTI Connext DDS Core Libraries XML-Based Application Creation Getting Started Guide (available here if you have Internet access).
Micro Application Generation is enabled by default in this release when compiling with rtime-make. However, future releases may disable the feature by default. Thus, it is advised to always compile with the Micro Application Generation feature enabled (-DRTIME_DDS_ENABLE_APPGEN=1 to cmake).
8.4.7.9. Ability to use only one UDP port per DomainParticipant¶
This release provides a way to use just one UDP port per DomainParticipant. The advantage of this is that by only using one UDP port, Connext DDS Micro will only create a receive thread, so fewer resources are used, mainly stack memory.
The disadvantage is that the port mappings used are not compliant with the OMG’s DDS Interoperability Wire Protocol and communication with other DDS implementations might not be possible.
You can only use this feature if multicast OR unicast is used for both discovery and user traffic. If both unicast AND multicast are configured, you cannot use this feature.
To enable this feature, assign the same value to both the builtin and user port offsets in RtpsWellKnownPorts_t.
8.4.7.10. New C++ DPSE example¶
This release includes a new C++ example that uses DPSE (dynamic participant - static endpoint) discovery.
8.4.8. What’s Fixed in 3.0.0¶
8.4.8.3. CPU endianness detection method improved¶
The CPU endianness detection method has been improved. Now the CMake endian test is used. If CMake is not used to compile, the compiler preprocessor macros are used to infer CPU endianness.
[RTI Issue ID MICRO-1919]
8.4.8.4. Examples used untyped register_type APIs instead of typed APIs¶
The provided examples have been updated to use FooTypeSupport_register_type() instead of DDS_DomainParticipant_register_type(). Using the typed API to register types is preferred over using the untyped API.
[RTI Issue ID MICRO-1922]
8.4.8.5. Wait_set generic error when returned condition sequence exceeded capacity¶
If the number of returned conditions exceeded the maximum size of the returned condition sequence, a generic error, DDS_RETCODE_ERROR, was returned instead of the expected error, DDS_RETCODE_OUT_OF_RESOURCES. This problem has been resolved.
[RTI Issue ID MICRO-1933]
8.4.8.6. WaitSet waited less than specified time period¶
A WaitSet may have waited less than the specified time period. This problem has been resolved.
[RTI Issue ID MICRO-1950]
8.4.8.7. Samples with deserialization errors were accepted¶
In previous versions, samples that could not be deserialized was rejected, causing samples to be resent when reliability was enabled. This behavior has been changed; now samples with deserialization errors are accepted and discarded.
[RTI Issue ID MICRO-1954]
8.4.8.8. Potential wrong API used when using host name as peer¶
The getaddrinfo() API was incorrectly used when a host name was used as a peer. That error might have caused a run-time error. This problem occurred only if compilation was done for Windows or if FACE compliance was enabled. This issue has been fixed.
[RTI Issue ID MICRO-1957]
8.5. Known Issues¶
8.5.1. Flow Controllers require RTOS¶
Flow controllers require an RTOS.
8.5.2. Using OpenSSL 1.0.x and using OpenSSL APIs outside of the RTI Connext DDS Micro libraries may lead to a crash¶
In 3.0.0, the destruction of all the DomainParticipants loading the Security Plugin results in the plugin calling OpenSSL’s EVP_cleanup and ERR_free_strings APIs to clean up OpenSSL state. As a result, if an application running Connext DDS invoked OpenSSL APIs after this cleanup has taken place without re-initializing OpenSSL, the application may have run into unexpected OpenSSL behavior.
OpenSSL 1.1.x has deprecated both EVP_cleanup and ERR_free_strings. For RTI Connext DDS Micro 3.0.2 and later, it is recommended to use OpenSSL 1.1.1d or higher, to avoid this problem.
8.5.3. LatencyBudget is not part of the DataReaderQos or DataWriterQos policy¶
The LatencyBudgetQos policy is not supported and does not appear as part of the DataReader and DataWriter Qos policy documentation. The default value is 0. When creating earliest deadline first (EDF) flow-controllers, the effective scheduling is round-robin.