Skip to main content

Module header_extension

Module header_extension 

Source
Expand description

HeaderExtension Submessage (DDSI-RTPS 2.5 §8.3.3.2 / §9.4.5.2 / §9.4.2.15).

Die HeaderExtension (HE) ist eine in DDSI-RTPS 2.5 neu eingefuehrte Submessage-Klasse, die einer RTPS-Nachricht optionale Header- Felder anhaengt:

  • messageLength: u32 — Gesamtlaenge der RTPS-Message ab dem ersten Submessage-Header. Erlaubt Reader-Pre-Allocation und ist Pflicht-Hint fuer non-UDP-Transporte ohne implizite Datagram- Grenze.
  • rtpsSendTimestamp: 8 Byte (Time_t) — Sender-Wallclock zum Zeitpunkt des send()-Calls. Speist clockSkewDetected im Receiver-State (§8.3.7.4).
  • uextension4: 4 Byte vendor-spezifisch.
  • wextension8: 8 Byte vendor-spezifisch (Spec §8.3.3.2).
  • messageChecksum: CRC-32C (4 Byte), CRC-64-XZ (8 Byte) oder MD5-128 (16 Byte) ueber den Bereich [RtpsHeader || alle Submessages || HE-Submessage-Header || HE-Body bis vor dem Checksum-Feld]. C-Flag (2 Bit) selektiert die Variante.
  • parameters: ParameterList (TLV) — bisher nur fuer Vendor-Erweiterungen reserviert; must_understand darin loest ganzheitlichen Message-Reject aus (§9.4.2.11.2).

§SubmessageId und Flag-Layout (Auftrags-Spezifikation)

  • SubmessageId = 0x80 — HE-Marker. Ausserhalb der “klassischen” Submessage-Range (≤ 0x7F) und damit forwards-kompatibel zu Pre-2.5- Implementierungen, die octets_to_next_header zum Skippen nutzen.

Flag-Bits im Submessage-Header:

BitSymbolBedeutung
0EEndianness (1 = LE)
1LmessageLength vorhanden
2WrtpsSendTimestamp vorhanden
3Uuextension4 vorhanden
4Vwextension8 vorhanden
5+6CChecksum-Variante (0=keine, 1=CRC-32C, 2=CRC-64, 3=MD5)
7Pparameters (ParameterList) vorhanden

§Receiver-State-Update (§8.3.7.4)

Bei Empfang einer HE aktualisiert der Receiver:

  • Receiver.messageLength aus dem L-Feld (falls vorhanden) → Cross-Check gegen tatsaechliche Datagram-Restlaenge. Mismatch = WireError::ValueOutOfRange.
  • Receiver.haveTimestamp = true, Receiver.timestamp = … aus dem T-Feld (falls vorhanden).
  • Receiver.messageChecksum = … aus dem C-Feld (falls Variante ≠ 0).
  • Receiver.parameters = … aus dem P-Feld (falls vorhanden).
  • clockSkewDetected Heuristik: wenn |Receiver.timestamp - now| > Grenzwert. (Diese Heuristik verbleibt im Receiver-Code; das Decode-Modul liefert nur die Eingabe.)

§DoS-Cap

MAX_HE_LENGTH = 16 KiB: HE-Body darf nicht laenger als 16 KiB sein (deckt typische ParameterList + alle Optional-Felder). Verhindert Amplification ueber boesartig grosse parameters.

Structs§

HeTimestamp
8-Byte Sender-Timestamp (Time_t = i32 sec + u32 nanosec, Big-Endian im RTPS-Wire-Sinn — wird im HE-Body in Submessage-Endianness geschrieben).
HeaderExtension
Geparste HeaderExtension-Submessage.

Enums§

ChecksumKind
Spec §9.4.2.15.2 — Auswahl der messageChecksum-Variante. Wert liegt in den C-Bits (5+6) des Flag-Bytes.
ChecksumValue
Inhalt der messageChecksum (variabel nach ChecksumKind).

Constants§

HE_FLAG_C0
Lower-Bit der C-Maske (Bit 5).
HE_FLAG_C1
Higher-Bit der C-Maske (Bit 6).
HE_FLAG_C_MASK
Maske der beiden Checksum-Selector-Bits (Bits 5+6).
HE_FLAG_E
E-Flag (Bit 0) — Endianness des Bodies (1 = LE).
HE_FLAG_L
L-Flag (Bit 1) — messageLength vorhanden.
HE_FLAG_P
P-Flag (Bit 7) — parameters (ParameterList) vorhanden.
HE_FLAG_U
U-Flag (Bit 3) — uextension4 vorhanden.
HE_FLAG_V
V-Flag (Bit 4) — wextension8 vorhanden.
HE_FLAG_W
W-Flag (Bit 2) — rtpsSendTimestamp vorhanden.
MAX_HE_LENGTH
Hard-Cap fuer HE-Body-Laenge (DoS-Schutz).
PID_MUST_UNDERSTAND
Bit-Maske: gesetzt -> Reader MUSS diesen PID verstehen, sonst die gesamte Message (HE-Carrier) verwerfen.
PID_VENDOR_SPECIFIC
Bit-Maske: gesetzt -> Vendor-spezifischer PID (Spec-Reservation 2.5 Tab 9.13). Reader die diesen PID nicht kennen, duerfen ihn skippen wenn das must_understand-Bit nicht gesetzt ist.
SUBMESSAGE_ID_HEADER_EXTENSION
SubmessageId fuer HeaderExtension (DDSI-RTPS 2.5).

Functions§

pid_must_understand
Liefert true, wenn der gegebene PID das Must-Understand-Bit gesetzt hat.
pid_strip
Roher PID ohne Must-Understand- und Vendor-Bits.