Skip to Content
This documentation is provided with the HEAT environment and describes this HEAT instance.

Interface control document

1. Identification

ItemValue
DocumentICD-CMOPENDIS-001 rev 1
ProductOpen DIS module (HEAT.OpenDIS in the module registry)
Product versions coveredv2.0.2
PeerAny DIS-7 (IEEE 1278.1) compliant source on the network
HostHEAT Capture, HEAT.Capture.ModuleSDK 2.0.5
Data modelHEAT ProtoLib (bundled with HEAT.Capture.ModuleSDK 2.0.5); PDU message only
Date2026-09-01
OwnerVRAI 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

IDNameDirectionTransportPeer
IF-CMOPENDIS-01DIS-7 PDU feedPeer to productUDP, broadcast or multicastAny DIS-7 source on the network

4. IF-CMOPENDIS-01 DIS-7 PDU feed

4.1 Transport and addressing

ItemValue
ProtocolUDP, received via a native (Rust) socket with SO_REUSEADDR set
PortUdpPort, default 3000
ModeNetworkMode: Broadcast (bind only) or Multicast (bind and join NetworkGroupAddress, default 239.255.0.1)
Bind addressINADDR_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).

CheckRule
Minimum sizeAt 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 addressIf 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

ConditionObservableModule behaviour
Datagram fails a header check (except the sender-address filter)Warning logged, droppedPackets incrementedDatagram discarded, not published
LocalCaptureOnly enabled and sender is not localNothing logged; droppedPackets incrementedDatagram discarded silently
Enabled is falseNothing logged; droppedPackets incrementedEvery received datagram discarded, regardless of validity
Socket bind or rebuild fails (for example, port already in use)Error logged, debug view shows error socket stateReceiver 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 receiverNo 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

ConceptConvention
PDU contentOpaque - units, coordinate frames and datum are whatever the peer’s DIS-7 implementation uses; this module does not read them
Time baseHEAT 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

SettingInterface effect
UdpPort, NetworkMode, NetworkGroupAddressTransport and addressing, 4.1
LocalCaptureOnlySender-address filter, 4.4
EnabledWhether any accepted datagram is actually published
StartOnAnyPDU, StartOnSpecificPDU, StartPduTypes, StopOnSpecificPDU, StopPduTypes, StopOnSilence, SilenceThresholdSession 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

  1. Start HEAT Capture with this module enabled. Confirm the module’s debug view reports receiverActive: true and the configured udpPort.
  2. Send a well-formed DIS-7 PDU (any type) to the configured port/mode. Confirm receivedPackets and publishedPackets both increment, and lastPduType shows the sent type.
  3. With StartOnSpecificPDU enabled and default StartPduTypes, send a Start/Resume PDU. Confirm sessionStarted flips to true.
  4. Send a datagram shorter than 12 bytes. Confirm droppedPackets increments and publishedPackets does not.
  5. Enable LocalCaptureOnly and send from a non-local sender. Confirm droppedPackets increments with no corresponding warning in the log.

11. Revision history

RevDateProduct versionChange
12026-09-01v2.0.2Initial issue.
Opens your browser's print dialog. Choose "Save as PDF" as the destination.