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.3. Shared Memory not prioritized over UDP if UDP locators appeared before SHMEM locators

In previous versions, when specifying SHMEM locators in DomainParticipantQos.user_traffic, DomainParticipantQos.discovery.transports, DataReaderQos.transports, or DataWriterQos.transports, a shared memory transport locator (e.g., the default _shmem) had to be listed before a UDP locator. This issue has been fixed. Now they can appear in either order and SHMEM will still be prioritized over UDP.

[RTI Issue ID MICRO-2230]

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 DataReaders
  • builtin_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.2. Large data streaming using RTI FlatData™ language binding and Zero Copy transfer over shared memory

To meet strict latency requirements, you can reduce the default number of copies made by the middleware when publishing and receiving large samples (on the order of MBs) by using two new features: FlatData language binding and Zero Copy transfer over shared memory.

These features can be used standalone or in combination.

By using the FlatData language binding, you can reduce the number of copies from the default of four copies to two copies, for both UDP and shared memory communications. FlatData is a language binding in which the in-memory representation of a sample matches the wire representation, reducing the cost of serialization/deserialization to zero. You can directly access the serialized data without deserializing it first. To select FlatData as the language binding of a type, annotate it with the new @language_binding(FLAT_DATA) annotation.

Zero Copy transfer over shared memory allows you to reduce the number of copies to zero for communications within the same host. This feature accomplishes zero copies by using the shared memory builtin transport to send references to samples within a shared memory segment owned by the DataWriter, instead of using the shared memory builtin transport to send the serialized sample content by making a copy. With Zero Copy transfer over shared memory, there is no need for the DataWriter to serialize a sample, and there is no need for the DataReader to deserialize an incoming sample since the sample is accessed directly on the shared memory segment created by the DataWriter. The new TransferModeQosPolicy specifies the properties of a Zero Copy DataWriter.

For more information on setting up and using one or both of these features, see the chapter on Sending Large Data, in the RTI Connext DDS Core Libraries User’s Manual (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.1. Linker error when using shared libraries on VxWorks systems

There was a linker error when compiling examples for architecture ppc604Vx6.9gcc4.3.3 using shared libraries. The compiler reported that the libraries could not be found. This issue has been fixed.

[RTI Issue ID MICRO-1841]

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.

8.5.4. Porting Guide does not include information about shared memory support

The RTI Connext DDS Micro porting guide does not include information about porting the shared memory support. If the target does not support the POSIX shared memory API, it is necessary to compile RTI Connext DDS Micro with -DOSAPI_ENABLE_SHMEM=0.