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