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

38 lines
2.6 KiB
Markdown

# 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.