Skip to main content

RTI Connext QoS Mapping

Detailed QoS policy mapping between HDDS and RTI Connext DDS.

Reliability

HDDS

// Best Effort
let qos = DataWriterQos::default()
.reliability(Reliability::BestEffort);

// Reliable
let qos = DataWriterQos::default()
.reliability(Reliability::Reliable {
max_blocking_time: Duration::from_millis(100),
});

RTI Connext (C++ API)

// Best Effort
DDS_DataWriterQos wqos;
wqos.reliability.kind = DDS_BEST_EFFORT_RELIABILITY_QOS;

// Reliable
DDS_DataWriterQos wqos;
wqos.reliability.kind = DDS_RELIABLE_RELIABILITY_QOS;
wqos.reliability.max_blocking_time.sec = 0;
wqos.reliability.max_blocking_time.nanosec = 100000000; // 100ms

RTI Connext (XML)

<reliability>
<kind>RELIABLE_RELIABILITY_QOS</kind>
<max_blocking_time>
<sec>0</sec>
<nanosec>100000000</nanosec>
</max_blocking_time>
</reliability>

Durability

HDDS

DataWriterQos::default()
.durability(Durability::TransientLocal)

RTI Connext (C++ API)

DDS_DataWriterQos wqos;
wqos.durability.kind = DDS_TRANSIENT_LOCAL_DURABILITY_QOS;

RTI Connext (XML)

<durability>
<kind>TRANSIENT_LOCAL_DURABILITY_QOS</kind>
</durability>

Mapping Table

HDDSRTI Connext C++RTI Connext XML
VolatileDDS_VOLATILE_DURABILITY_QOSVOLATILE_DURABILITY_QOS
TransientLocalDDS_TRANSIENT_LOCAL_DURABILITY_QOSTRANSIENT_LOCAL_DURABILITY_QOS
TransientDDS_TRANSIENT_DURABILITY_QOSTRANSIENT_DURABILITY_QOS
PersistentDDS_PERSISTENT_DURABILITY_QOSPERSISTENT_DURABILITY_QOS

History

HDDS

// Keep Last
DataWriterQos::default()
.history(History::KeepLast { depth: 10 })

// Keep All
DataWriterQos::default()
.history(History::KeepAll)

RTI Connext (C++ API)

// Keep Last
DDS_DataWriterQos wqos;
wqos.history.kind = DDS_KEEP_LAST_HISTORY_QOS;
wqos.history.depth = 10;

// Keep All
DDS_DataWriterQos wqos;
wqos.history.kind = DDS_KEEP_ALL_HISTORY_QOS;

RTI Connext (XML)

<history>
<kind>KEEP_LAST_HISTORY_QOS</kind>
<depth>10</depth>
</history>

Deadline

HDDS

DataWriterQos::default()
.deadline(Duration::from_millis(100))

RTI Connext (C++ API)

DDS_DataWriterQos wqos;
wqos.deadline.period.sec = 0;
wqos.deadline.period.nanosec = 100000000;

RTI Connext (XML)

<deadline>
<period>
<sec>0</sec>
<nanosec>100000000</nanosec>
</period>
</deadline>

Liveliness

HDDS

DataWriterQos::default()
.liveliness(Liveliness::ManualByTopic {
lease_duration: Duration::from_secs(1),
})

RTI Connext (C++ API)

DDS_DataWriterQos wqos;
wqos.liveliness.kind = DDS_MANUAL_BY_TOPIC_LIVELINESS_QOS;
wqos.liveliness.lease_duration.sec = 1;
wqos.liveliness.lease_duration.nanosec = 0;

RTI Connext (XML)

<liveliness>
<kind>MANUAL_BY_TOPIC_LIVELINESS_QOS</kind>
<lease_duration>
<sec>1</sec>
<nanosec>0</nanosec>
</lease_duration>
</liveliness>

Mapping Table

HDDSRTI Connext C++RTI Connext XML
AutomaticDDS_AUTOMATIC_LIVELINESS_QOSAUTOMATIC_LIVELINESS_QOS
ManualByParticipantDDS_MANUAL_BY_PARTICIPANT_LIVELINESS_QOSMANUAL_BY_PARTICIPANT_LIVELINESS_QOS
ManualByTopicDDS_MANUAL_BY_TOPIC_LIVELINESS_QOSMANUAL_BY_TOPIC_LIVELINESS_QOS

Ownership

HDDS

DataWriterQos::default()
.ownership(Ownership::Exclusive)
.ownership_strength(100)

RTI Connext (C++ API)

DDS_DataWriterQos wqos;
wqos.ownership.kind = DDS_EXCLUSIVE_OWNERSHIP_QOS;
wqos.ownership_strength.value = 100;

RTI Connext (XML)

<ownership>
<kind>EXCLUSIVE_OWNERSHIP_QOS</kind>
</ownership>
<ownership_strength>
<value>100</value>
</ownership_strength>

Resource Limits

HDDS

DataReaderQos::default()
.resource_limits(ResourceLimits {
max_samples: 1000,
max_instances: 100,
max_samples_per_instance: 10,
})

RTI Connext (C++ API)

DDS_DataReaderQos rqos;
rqos.resource_limits.max_samples = 1000;
rqos.resource_limits.max_instances = 100;
rqos.resource_limits.max_samples_per_instance = 10;

RTI Connext (XML)

<resource_limits>
<max_samples>1000</max_samples>
<max_instances>100</max_instances>
<max_samples_per_instance>10</max_samples_per_instance>
</resource_limits>

Partition

HDDS

PublisherQos::default()
.partition(Partition::new(vec!["sensors", "telemetry"]))

RTI Connext (C++ API)

DDS_PublisherQos pqos;
pqos.partition.name.ensure_length(2, 2);
pqos.partition.name[0] = DDS_String_dup("sensors");
pqos.partition.name[1] = DDS_String_dup("telemetry");

RTI Connext (XML)

<partition>
<name>
<element>sensors</element>
<element>telemetry</element>
</name>
</partition>

Time-Based Filter

HDDS

DataReaderQos::default()
.time_based_filter(Duration::from_millis(100))

RTI Connext (C++ API)

DDS_DataReaderQos rqos;
rqos.time_based_filter.minimum_separation.sec = 0;
rqos.time_based_filter.minimum_separation.nanosec = 100000000;

RTI Connext (XML)

<time_based_filter>
<minimum_separation>
<sec>0</sec>
<nanosec>100000000</nanosec>
</minimum_separation>
</time_based_filter>

Content Filter (RTI Extension)

RTI Connext supports content-filtered topics with SQL-like expressions:

RTI Connext

DDS_ContentFilteredTopic* cft = participant->create_contentfilteredtopic(
"FilteredSensor",
topic,
"sensor_id = 1 AND value > 25.0",
DDS_StringSeq());

HDDS Equivalent

// HDDS content filters
let cft = participant.create_content_filtered_topic(
"FilteredSensor",
&topic,
"sensor_id = %0 AND value > %1",
vec!["1", "25.0"],
)?;

Batching (RTI Extension)

RTI Connext

DDS_DataWriterQos wqos;
wqos.batch.enable = DDS_BOOLEAN_TRUE;
wqos.batch.max_data_bytes = 65536;
wqos.batch.max_flush_delay.sec = 0;
wqos.batch.max_flush_delay.nanosec = 1000000; // 1ms

HDDS Equivalent

let config = DataWriterConfig::default()
.batching_enabled(true)
.max_batch_size(65536)
.batch_flush_period(Duration::from_millis(1));

Complete QoS Example

HDDS Writer QoS

let writer_qos = DataWriterQos::default()
.reliability(Reliability::Reliable {
max_blocking_time: Duration::from_millis(100),
})
.durability(Durability::TransientLocal)
.history(History::KeepLast { depth: 10 })
.deadline(Duration::from_millis(200))
.liveliness(Liveliness::Automatic {
lease_duration: Duration::from_secs(5),
});

RTI Connext Writer QoS (C++)

DDS_DataWriterQos wqos;
DDSTheParticipantFactory->get_default_datawriter_qos(wqos);

// Reliability
wqos.reliability.kind = DDS_RELIABLE_RELIABILITY_QOS;
wqos.reliability.max_blocking_time.sec = 0;
wqos.reliability.max_blocking_time.nanosec = 100000000;

// Durability
wqos.durability.kind = DDS_TRANSIENT_LOCAL_DURABILITY_QOS;

// History
wqos.history.kind = DDS_KEEP_LAST_HISTORY_QOS;
wqos.history.depth = 10;

// Deadline
wqos.deadline.period.sec = 0;
wqos.deadline.period.nanosec = 200000000;

// Liveliness
wqos.liveliness.kind = DDS_AUTOMATIC_LIVELINESS_QOS;
wqos.liveliness.lease_duration.sec = 5;
wqos.liveliness.lease_duration.nanosec = 0;

DDSDataWriter* writer = publisher->create_datawriter(topic, wqos, NULL, DDS_STATUS_MASK_NONE);

RTI Connext Writer QoS (XML Profile)

<?xml version="1.0"?>
<dds xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://community.rti.com/schema/current/rti_dds_qos_profiles.xsd">
<qos_library name="SensorLibrary">
<qos_profile name="SensorProfile">
<datawriter_qos>
<reliability>
<kind>RELIABLE_RELIABILITY_QOS</kind>
<max_blocking_time>
<sec>0</sec>
<nanosec>100000000</nanosec>
</max_blocking_time>
</reliability>
<durability>
<kind>TRANSIENT_LOCAL_DURABILITY_QOS</kind>
</durability>
<history>
<kind>KEEP_LAST_HISTORY_QOS</kind>
<depth>10</depth>
</history>
<deadline>
<period>
<sec>0</sec>
<nanosec>200000000</nanosec>
</period>
</deadline>
<liveliness>
<kind>AUTOMATIC_LIVELINESS_QOS</kind>
<lease_duration>
<sec>5</sec>
<nanosec>0</nanosec>
</lease_duration>
</liveliness>
</datawriter_qos>
</qos_profile>
</qos_library>
</dds>

Duration Format

RTI Connext uses DDS_Duration_t structure:

HDDSRTI Connext
Duration::from_secs(5){.sec = 5, .nanosec = 0}
Duration::from_millis(100){.sec = 0, .nanosec = 100000000}
Duration::from_micros(500){.sec = 0, .nanosec = 500000}
Duration::MAXDDS_DURATION_INFINITE
Duration::ZERODDS_DURATION_ZERO

RTI-Specific Extensions

These RTI Connext QoS policies have no direct HDDS equivalent:

RTI Connext PolicyDescription
entity_factoryControl entity creation
wire_protocolRTPS wire protocol settings
reader_data_lifecycleSample lifecycle management
writer_data_lifecycleInstance lifecycle management
type_consistencyXTypes type matching settings

Compatibility Notes

  1. XTypes: RTI Connext has full XTypes support; use compatible type annotations
  2. Builtin types: RTI uses different namespaces for builtin types
  3. Wire format: Standard RTPS 2.4; compatible at protocol level
  4. License: RTI Connext requires a commercial license

Next Steps