Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 36 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,42 @@ Versioning follows [Semantic Versioning 2.0](https://semver.org/).

## [Unreleased]

Reserved for changes after the `1.0.0-rc.6` workspace tag.
### Fixed

- **Multi-homed discovery (#27).** On a host with more than one interface (VPN,
Docker, second NIC) ZeroDDS announced a single discovery locator resolved from
the default-route source-address probe. When that interface differs from the
one a peer shares, the announced unicast locator is unreachable: the peer
discovers the participant over multicast (`discovered=1`) but never matches an
endpoint (`matched=0`) and no data flows. Automatic mode now enumerates every
eligible unicast interface (`if-addrs`) and announces **all** of them, so a
peer on any shared segment finds a reachable locator. Metatraffic is fanned out
to every de-duplicated usable peer locator (UDP cannot detect a dead
destination). `ZERODDS_INTERFACE` keeps its deterministic single-interface
behaviour. Multi-interface multicast join/TX is intentionally deferred (see
`docs/OPEN-ITEMS.md`) — packet capture proved multicast was never the failing
operation.

### Changed

- **BREAKING (`zerodds-rtps`): `ParticipantBuiltinTopicData` locator fields are
now `Vec<Locator>`, not `Option<Locator>`.** Every field that is semantically a
locator list per DDSI-RTPS 2.5 §9.6.1 (`default_unicast_locators`,
`default_multicast_locators`, `metatraffic_unicast_locators`,
`metatraffic_multicast_locators`) changed type, and the four fields were
renamed to the plural. This is required for #27 (a `*_LOCATOR` PID may repeat;
the wire already allowed it — decode now retains all, in LE and BE).

**Migration:**
- Construction: `default_unicast_locator: Some(loc)` → `default_unicast_locators: vec![loc]`; `…: None` → `…: Vec::new()`.
- Single-value reads: use `primary_default_unicast_locator()` /
`primary_metatraffic_unicast_locator()` (return `Option<Locator>`, first of
the list), or `metatraffic_or_default_unicast_locators()` for the full
fan-out set.
- Decode no longer filters locators; routing/usability selection moved to
DCPS/transport (`locator_looks_routable` is a public predicate there).
- No wire-format change and no on-the-wire compatibility break — repeated
locator PIDs are standard RTPS and are emitted/parsed by Cyclone/FastDDS.

## [1.0.0-rc.6] — 2026-07-22

Expand Down
22 changes: 21 additions & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 4 additions & 4 deletions crates/dcps/src/builtin_topics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -728,10 +728,10 @@ mod tests {
guid: g,
protocol_version: ProtocolVersion::V2_5,
vendor_id: VendorId::ZERODDS,
default_unicast_locator: None,
default_multicast_locator: None,
metatraffic_unicast_locator: None,
metatraffic_multicast_locator: None,
default_unicast_locators: Vec::new(),
default_multicast_locators: Vec::new(),
metatraffic_unicast_locators: Vec::new(),
metatraffic_multicast_locators: Vec::new(),
domain_id: None,
builtin_endpoint_set: 0,
lease_duration: zerodds_qos::Duration::from_secs(100),
Expand Down
8 changes: 4 additions & 4 deletions crates/dcps/src/participant.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2226,10 +2226,10 @@ mod tests {
guid: Guid::new(remote, EntityId::PARTICIPANT),
protocol_version: ProtocolVersion::V2_5,
vendor_id: VendorId::ZERODDS,
default_unicast_locator: None,
default_multicast_locator: None,
metatraffic_unicast_locator: None,
metatraffic_multicast_locator: None,
default_unicast_locators: Vec::new(),
default_multicast_locators: Vec::new(),
metatraffic_unicast_locators: Vec::new(),
metatraffic_multicast_locators: Vec::new(),
domain_id: Some(30),
builtin_endpoint_set: 0,
lease_duration: zerodds_rtps::participant_data::Duration::from_secs(100),
Expand Down
Loading
Loading