zerodds_transport_udp/lib.rs
1// SPDX-License-Identifier: Apache-2.0
2// Copyright 2026 ZeroDDS Contributors
3//! Crate `zerodds-transport-udp`. Safety classification: **SAFE** (std-only).
4//!
5//! UDP/IP PSM-Implementation des `zerodds-transport::Transport`-Traits.
6//!
7//! ## Spec
8//!
9//! - **DDSI-RTPS 2.5** §9.6.1 — UDP/IP PSM Wire-Mapping.
10//! - **DDSI-RTPS 2.5** §8.3.2 — Locator (Re-Export aus `zerodds-transport`).
11//!
12//! ## Implementiert (RC1)
13//!
14//! - UDPv4 Unicast Bind + Send + Recv via `std::net::UdpSocket`
15//! - UDPv4 Multicast: `bind_multicast_v4` mit Group-Join +
16//! `SO_REUSEADDR`/`SO_REUSEPORT` + `set_multicast_ttl_v4` (DDSI-RTPS
17//! §9.6.1.4 SPDP/SEDP-Discovery-Pfad)
18//! - Read-Timeout konfigurierbar via `with_timeout`
19//! - Bind-Retry-Loop für CI-EADDRINUSE-Race (3× Backoff)
20//! - Anwendungs-Layer-Fragmentation in `zerodds-rtps` (DATA_FRAG/NACK_FRAG,
21//! WP 1.2) übernimmt MTU-Handling — Transport selbst sendet Datagramme
22//! atomar mit `MAX_DATAGRAM_SIZE`-Cap.
23//!
24//! ## Bewusst nicht im Crate
25//!
26//! - **UDPv6**: Locator-Wire-Format unterstützt v6, aber Bind-API ist
27//! v4-spezifisch (`bind_v4`). v6 würde ein paralleles `bind_v6` +
28//! `Ipv6Addr`-Codepfad erfordern. Erweiterungspunkt — kein Layer-Break.
29//! - **Async/Non-blocking**: Sync-Architektur ist gewählter Stil — DCPS
30//! nutzt eigene Tick-Scheduler, kein Tokio-Stack.
31//! - **Pfad-MTU-Discovery**: Fragmentation läuft auf RTPS-Layer (WP 1.2).
32
33#![cfg_attr(not(feature = "std"), no_std)]
34#![forbid(unsafe_code)]
35#![warn(missing_docs)]
36
37#[cfg(feature = "alloc")]
38extern crate alloc;
39
40#[cfg(feature = "std")]
41mod udp_transport;
42
43#[cfg(feature = "std")]
44pub use udp_transport::{MAX_DATAGRAM_SIZE, UdpTransport, UdpTransportError};