Skip to content

Commit 70e6565

Browse files
Remove reliable delivery (#73)
Reliability has been moved one layer higher. See https://github.com/OpenCyphal-Garage/cy for usage.
1 parent 3e852ac commit 70e6565

14 files changed

+1577
-7717
lines changed

README.md

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,13 @@ next-generation intelligent vehicles: manned and unmanned aircraft, spacecraft,
2525
- Support for redundant network interfaces with seamless interface aggregation and zero fail-over delay.
2626
- Robust message reassembler supporting highly distorted datagram streams:
2727
out-of-order fragments, fragment/message deduplication, interleaving, variable MTU, ...
28-
- Packet loss mitigation via:
29-
- reliable topics (retransmit until acknowledged; callback notifications for successful/failed deliveries).
30-
- redundant interfaces (packet lost on one interface may be received on another, transparent to the application);
3128
- Heap not required (but supported); the library can be used with fixed-size block pool allocators.
3229
- Detailed time complexity and memory requirement models for the benefit of real-time high-integrity applications.
33-
- Scalable: designed to handle thousands of topics and hundreds of concurrent transfers with minimal resources.
30+
- Scalable: designed to handle thousands of subjects and hundreds of concurrent transfers with minimal resources.
3431
- Runs anywhere out of the box, including extremely resource-constrained baremetal environments with ~100K ROM/RAM.
3532
No porting required.
3633
- Partial MISRA C compliance (reach out to <https://forum.opencyphal.org>).
37-
- Full implementation in a single C file with only 2k lines of straightforward C99!
34+
- Full implementation in a single C file with less than 2k lines of straightforward C99!
3835
- Extensive verification suite.
3936

4037
## Usage
@@ -71,7 +68,7 @@ standards-compliant C99 compiler is available.
7168

7269
### v3.0 -- WORK IN PROGRESS
7370

74-
The library has been redesigned from scratch to support Cyphal v1.1, named topics, and reliable transfers.
71+
The library has been redesigned from scratch to support Cyphal v1.1 and named topics.
7572
No porting guide is provided since the changes are too significant;
7673
please refer to the new API docs in `libudpard/udpard.h`.
7774

cyphal_udp_header.dsdl

Lines changed: 15 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,31 @@
1+
# Cyphal/UDP provides UNRELIABLE UNORDERED DEDUPLICATED (at most one) delivery of UNICAST or MULTICAST datagrams
2+
# with GUARANTEED INTEGRITY (messages either delivered correct or not delivered).
3+
#
14
# All Cyphal/UDP traffic is sent to port 9382.
25
# The subject multicast group address is composed as 239.0.0.0 (=0xEF000000) + subject_id (23 bits).
6+
#
37
# All frames of a transfer must share the same field values unless otherwise noted.
48
# Frames may arrive out-of-order, possibly interleaved with neighboring transfers; implementations must cope.
9+
#
10+
# The origin UID is a 64-bit globally unique identifier (e.g., EUI-64). It allows nodes to use redundant interfaces
11+
# without source address ambiguity, and also allows live interface migration.
12+
#
13+
# Unicast traffic is sent directly to the source endpoint of the destination node, which is discovered dynamically.
14+
# The destination UID is not included explicitly since the IP endpoint is considered adequate for node identification.
515

616
uint5 version #=2 in this version.
717
uint3 priority # 0=highest, 7=lowest.
818

9-
uint2 KIND_MSG_BEST_EFFORT = 0 # No ack must be sent.
10-
uint2 KIND_MSG_RELIABLE = 1 # Remote must acknowledge reception by sending an ACK frame back.
11-
uint2 KIND_ACK = 2 # Sent P2P; the transfer_id is of the acknowledged frame. Payload empty/ignored.
12-
uint2 kind
13-
uint6 reserved_incompat # Discard frame if any incompatibility flags are set that are not understood.
19+
void5 # Send zero, ignore on reception.
20+
uint3 incompatibility # Send zero, drop frame if nonzero.
1421

15-
void16 # Reserved for compatibility flags and fields (transmit zero, ignore on reception).
16-
17-
# Payload reassembly information.
18-
# We provide both the frame index and the frame payload offset to allow various reassembly strategies depending on the
19-
# preferences of the implementation. The provided information is sufficient for zero-copy out-of-order reassembly.
20-
# Offset 4 bytes.
22+
uint48 transfer_id # For multi-frame reassembly and dedup.
23+
uint64 sender_uid # Origin identifier ensures invariance to the source IP address for reassembly.
2124

22-
uint24 frame_index # Zero-based index of the payload fragment carried by this frame.
23-
void8
2425
uint32 frame_payload_offset # The offset of the frame payload relative to the start of the transfer payload.
2526
uint32 transfer_payload_size # Total for all frames.
2627

27-
# Transfer identification information.
28-
# The transfer-ID is a single field that segregates transfers by topic hash and epoch (publisher sequence restarts).
29-
# Offset 16 bytes.
30-
31-
uint64 transfer_id # For multi-frame reassembly and dedup. ACK specifies the acked tfer here.
32-
uint64 sender_uid # Origin identifier ensures invariance to the source IP address for reassembly.
33-
34-
# Integrity checking information.
35-
# Offset 32 bytes.
36-
3728
uint32 prefix_crc32c # crc32c(payload[0:(frame_payload_offset+payload_size)])
3829
uint32 header_crc32c # Covers all fields above. Same as the transfer payload CRC.
3930

40-
# End of header at 40 bytes. Payload follows.
31+
# Header size 32 bytes; payload follows.

0 commit comments

Comments
 (0)