flowrs-engine/vendor/rustdds-0.14.3-flowrs/FLOWRS.md
flowRS fd958c0547 flowRS engine, cut from flowRS 3451b065
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-02 19:04:39 -05:00

2.6 KiB

RustDDS 0.14.3, vendored for flowRS

RustDDS (https://github.com/Atostek/RustDDS) is Atostek's pure-Rust DDS, licensed under the Apache License 2.0 (LICENSE.md, unchanged). This directory is the crates.io package rustdds-0.14.3 (src/, README.md, LICENSE.md, rustfmt.toml, and Cargo's normalized Cargo.toml with its example and test targets removed, since their sources are not copied, and a cargo-machete ignore list for two dependencies it declares and flowRS's build does not use). flowRS's generated ROS 2 nodes run on it through ros2-client 0.11.1; the workspace Cargo.toml (and every generated node's, and tools/perfbench's) points rustdds here with [patch.crates-io].

The first commit that adds this directory adds the package unchanged. Every change since is listed below, and each changed file says so at its top (Apache-2.0 §4(b)).

Changes

  1. Endpoints announce DDS USER_DATA (src/dds/participant.rs, src/discovery/sedp_messages.rs, src/discovery/discovery_db.rs). 0.14.3 parsed a remote endpoint's USER_DATA but never sent one for its own, so a ROS 2 node on ros2-client could not advertise its RIHS01 type hash and ros2 topic info -v showed it as INVALID. DomainParticipant::set_endpoint_user_data(topic, writer, data) records the USER_DATA the participant's DataWriters (or DataReaders) on a topic announce; the local writer's and reader's discovery records take it, and SEDP serializes it as PID_USER_DATA (a CDR sequence<octet>, sent only when set). flowRS sets typehash=RIHS01_…;, what rmw_dds_common::encode_type_hash_for_user_data_qos writes.
  2. A remote endpoint's USER_DATA is read as its octets (sedp_messages.rs): 0.14.3 handed up the parameter's raw bytes, the CDR count included, so typehash= followed four bytes of length and no reader matched it. The count is now taken off (a value too short for its count is kept whole).
  3. A discovered reader keeps the loopback locators it advertised (sedp_messages.rs, From<RtpsReaderProxy> for ReaderProxy). RtpsReaderProxy keeps loopback locators in a bucket of their own, used only once the peer is confirmed to be on this host; the conversion back into the discovery record dropped the bucket. A reader reachable at a loopback address alone (Cyclone DDS pinned to lo: 127.0.0.1, its own or its participant's default locator) was left with no locator at all, so a RustDDS writer matched it and sent it nothing: on Lyrical with Cyclone on lo, ROS to the node worked and the node to ROS did not. The record now carries the advertised list whole, and the proxy built from it splits it again.