Interface control document
1. Identification
| Item | Value |
|---|---|
| Document | ICD-CMOPENDIS-001 rev 1 |
| Product | Open DIS module (HEAT.OpenDIS in the module registry) |
| Product versions covered | v2.0.2 |
| Peer | Any DIS-7 (IEEE 1278.1) compliant source on the network |
| Host | HEAT Capture, HEAT.Capture.ModuleSDK 2.0.5 |
| Data model | HEAT ProtoLib (bundled with HEAT.Capture.ModuleSDK 2.0.5); PDU message only |
| Date | 2026-09-01 |
| Owner | VRAI Simulation |
2. Scope
This document defines the UDP transport and header-level acceptance rules the Open DIS module applies to incoming DIS-7 traffic, and how that traffic maps onto session start/stop and published data. It does not define the DIS-7 PDU format itself - that is IEEE’s published standard, not a VRAI interface - only the subset of the header this module inspects, and what it does with a PDU once accepted.
This module is peer-to-product only: it never transmits a PDU onto the network. It publishes every accepted PDU’s raw bytes unmodified; it does not decode, validate, or otherwise interpret any DIS PDU content beyond the header fields in Section 4.4.
3. Interface inventory
| ID | Name | Direction | Transport | Peer |
|---|---|---|---|---|
| IF-CMOPENDIS-01 | DIS-7 PDU feed | Peer to product | UDP, broadcast or multicast | Any DIS-7 source on the network |
4. IF-CMOPENDIS-01 DIS-7 PDU feed
4.1 Transport and addressing
| Item | Value |
|---|---|
| Protocol | UDP, received via a native (Rust) socket with SO_REUSEADDR set |
| Port | UdpPort, default 3000 |
| Mode | NetworkMode: Broadcast (bind only) or Multicast (bind and join NetworkGroupAddress, default 239.255.0.1) |
| Bind address | INADDR_ANY - the module does not bind to a specific network interface |
4.2 Session and connection lifecycle
The receiver is not connection-oriented and has no lifecycle of its own beyond the module’s: it
binds when HEAT Capture starts (this module runs continuously, independent of capture sessions - see Overview) and stays bound until HEAT Capture exits. Changing UdpPort,
NetworkMode or NetworkGroupAddress tears down and recreates the socket in place, without
restarting the module or losing packets sent before the rebuild completes beyond what UDP itself
may drop.
A peer needs no handshake or session negotiation with this module; it sends UDP datagrams to the bound port or joined multicast group. This module never acknowledges receipt.
4.3 Authentication
None. Any sender able to reach the bound port or joined multicast group is accepted, subject only
to the LocalCaptureOnly filter (4.4).
4.4 Header acceptance rules
Every received datagram is checked before being published; a datagram failing any check is dropped (see error behaviour, 4.7).
| Check | Rule |
|---|---|
| Minimum size | At least 12 bytes |
| Protocol version (header byte 0) | Between 5 and 50 inclusive - wider than the official DIS protocol version range, to tolerate vendor deviations |
| Exercise identifier (header byte 1) | Non-zero |
| Protocol family (header byte 3) | Not validated by this release |
| PDU type (header byte 2) | Not checked - a type-range check exists in source but is deliberately disabled to tolerate vendor-specific PDU type values |
| Sender address | If LocalCaptureOnly is enabled, must match one of the workstation’s own local IP addresses |
This module reads no other part of the DIS-7 header or body.
4.5 Message set
There is no message set beyond “a DIS-7 PDU” - this module treats every accepted datagram
identically regardless of PDU type, except for the session-trigger types named in Section 4.6.
See PduType for the type enumeration used only for that
triggering, not for filtering.
4.6 Session triggering and timing
Received as datagrams arrive; there is no polling. Whether a PDU also starts or stops a capture
session depends on StartOnAnyPDU, StartOnSpecificPDU/StartPduTypes,
StopOnSpecificPDU/StopPduTypes and StopOnSilence/SilenceThreshold - see
Configure. A PDU that triggers a session stop is still published
before the module acts on the trigger.
4.7 Error behaviour
| Condition | Observable | Module behaviour |
|---|---|---|
| Datagram fails a header check (except the sender-address filter) | Warning logged, droppedPackets incremented | Datagram discarded, not published |
LocalCaptureOnly enabled and sender is not local | Nothing logged; droppedPackets incremented | Datagram discarded silently |
Enabled is false | Nothing logged; droppedPackets incremented | Every received datagram discarded, regardless of validity |
| Socket bind or rebuild fails (for example, port already in use) | Error logged, debug view shows error socket state | Receiver does not start, or keeps its previous socket if a rebuild failed |
ICMP “port unreachable” response from a broadcast peer (Windows WSAECONNRESET) | None - silently discarded by the native receiver | No effect on the receive loop |
5. Data model reference
Output is a HEAT ProtoLib PDU message - a single payload field carrying the DIS-7 datagram’s
raw bytes. See HEAT ProtoLib’s message reference. This
module populates no other ProtoLib message and decodes no DIS-7 content.
6. Units, frames and conventions
| Concept | Convention |
|---|---|
| PDU content | Opaque - units, coordinate frames and datum are whatever the peer’s DIS-7 implementation uses; this module does not read them |
| Time base | HEAT Capture’s own wall-clock time at the moment the module publishes, not any timestamp inside the DIS-7 PDU |
7. Configuration affecting the interface
| Setting | Interface effect |
|---|---|
UdpPort, NetworkMode, NetworkGroupAddress | Transport and addressing, 4.1 |
LocalCaptureOnly | Sender-address filter, 4.4 |
Enabled | Whether any accepted datagram is actually published |
StartOnAnyPDU, StartOnSpecificPDU, StartPduTypes, StopOnSpecificPDU, StopPduTypes, StopOnSilence, SilenceThreshold | Session triggering, 4.6 |
See Configure for the full settings reference.
8. Compatibility and versioning
Built against HEAT.Capture.ModuleSDK 2.0.5. This module does not identify or negotiate a DIS
protocol version with the peer beyond the wide, deliberately permissive version-byte range in
4.4; a peer sending a structurally valid but semantically newer or vendor-extended DIS-7 variant
is accepted and republished unmodified, since this module never interprets PDU content.
9. Security considerations
There is no authentication and no transport encryption: any sender reaching the bound port or
joined multicast group is accepted (subject only to LocalCaptureOnly), and its datagram becomes
recorded data.
This module declares the network.listen capability for udp/3000 specifically. HEAT Capture’s
host-side firewall scoping is built from that declaration - changing UdpPort without a matching
firewall change moves the listener outside its granted scope. Treat the network this module
listens on as the security boundary; do not expose it beyond an isolated simulation network.
10. Conformance
- Start HEAT Capture with this module enabled. Confirm the module’s debug view reports
receiverActive: trueand the configuredudpPort. - Send a well-formed DIS-7 PDU (any type) to the configured port/mode. Confirm
receivedPacketsandpublishedPacketsboth increment, andlastPduTypeshows the sent type. - With
StartOnSpecificPDUenabled and defaultStartPduTypes, send aStart/ResumePDU. ConfirmsessionStartedflips totrue. - Send a datagram shorter than 12 bytes. Confirm
droppedPacketsincrements andpublishedPacketsdoes not. - Enable
LocalCaptureOnlyand send from a non-local sender. ConfirmdroppedPacketsincrements with no corresponding warning in the log.
11. Revision history
| Rev | Date | Product version | Change |
|---|---|---|---|
| 1 | 2026-09-01 | v2.0.2 | Initial issue. |