Astro~/0.3
** Conformance / TC Space Data Link Protocol * PAGE 08 / 23
** Astro * Conformance
** /conformance/tcdl

TC Space Data Link Protocol

PICS proforma: what this package implements, clause by clause.

Conformance Statement for pkg/tcdl, CCSDS 232.0-B-4


A2.1 GENERAL INFORMATION

A2.1.1 Identification of PICS

FieldValue
Date of Statement (DD/MM/YYYY)23/08/2026
PICS Serial NumberASTRO-TCDL-PICS-001
System Conformance Statement Cross-ReferenceThis document

A2.1.2 Identification of Implementation Under Test (IUT)

FieldValue
Implementation Nameastro/pkg/tcdl
Implementation VersionSee go.mod / latest commit on main
Special ConfigurationNone
Other InformationGo library implementing CCSDS TC Space Data Link Protocol. Full pipeline: PhysicalChannel (MC mux/demux) -> MasterChannel (VC mux, frame gap detection) -> VirtualChannel (frame buffer) -> Services (MAP Packet with segmentation/reassembly, MAP Access, VC Frame). Variable frame length (up to 1024 bytes). Segment Header (MAP sublayer) support for large packet segmentation. Frame Sequence Number N(S) for COP-1 integration.

A2.1.3 Identification of Supplier

FieldValue
SupplierRavi Suhag
Contact Point for QueriesGitHub, github.com/ravisuhag/astro
Implementation Name(s) and Version(s)astro/pkg/tcdl (Go package)
System Name(s)Astro

A2.1.4 Identification of Specification

FieldValue
SpecificationCCSDS 232.0-B-4 (TC Space Data Link Protocol, Blue Book, Issue 4, October 2019)
Have any exceptions been required?Yes [X] No [ ]

NOTE, Non-supported optional capabilities are identified in section A2.2 with explanations.


A2.2 REQUIREMENTS LIST

Table A-1: TC Service Data Units

ItemDescriptionReferenceStatusSupportNotes
TC-1MAP Packet SDU3.2.2MYesMAPPacketService accepts packet data via Send(), segments across multiple frames when data exceeds capacity, pushes frames into VirtualChannel, and reassembles via Receive().
TC-2MAP Access SDU3.2.3MYesMAPAccessService accepts raw data via Send(), wraps in unsegmented frame with segment header, delivers via Receive().
TC-3VC Frame SDU3.2.4MYesVCFrameService accepts pre-encoded frame bytes via Send(), decodes and buffers, delivers encoded bytes via Receive().
TC-4TC Transfer Frame3.2.5MYesTCTransferFrame struct with Encode() / DecodeTCTransferFrame() round-trip support. Composed of Primary Header, optional Segment Header, Data Field, and Frame Error Control.

Table A-2: Service Parameters

ItemDescriptionReferenceStatusValues AllowedSupportNotes
MAP Packet Service Parameters
TC-5MAP Packet3.3.2.2M-YesPacket data passed as []byte to MAPPacketService.Send(). Segmented if larger than frame capacity.
TC-6GVCID3.3.2.3M-YesDerived from PrimaryHeader.GVCID() (TFVN + SCID + VCID). VCID/SCID configured at service construction.
TC-7MAP ID3.3.2.4M0-63YesSegmentHeader.MAPID, 6 bits. Configured per service instance.
MAP Access Service Parameters
TC-8MAP Access SDU3.4.2.2M-YesRaw data passed to MAPAccessService.Send(). Wrapped in single unsegmented frame.
TC-9GVCID3.4.2.3M-YesDerived from PrimaryHeader.GVCID().
TC-10MAP ID3.4.2.4M0-63YesSegmentHeader.MAPID.
VC Frame Service Parameters
TC-11TC Frame3.5.2.2M-YesVCFrameService accepts complete []byte frame data via Send() / Receive().
TC-12GVCID3.5.2.3M-YesDerived from PrimaryHeader.GVCID().

Table A-3: Service Primitives

ItemDescriptionReferenceStatusSupportNotes
MAP Packet Service Primitives
TC-13MAP_PACKET.request3.3.3.2MYesMAPPacketService.Send(data) implements MAP_PACKET.request. Segments data across multiple frames using Segment Header sequence flags (First/Continuation/Last/Unsegmented). Type-A segments get N(S) from FrameCounter.Next(); Type-B frames always carry N(S)=0. NOTE: Send is non-blocking; a full virtual channel returns ErrBufferFull instead of blocking (declared simplification).
TC-14MAP_PACKET.indication3.3.3.3MYesMAPPacketService.Receive() implements MAP_PACKET.indication. Reassembles segments by buffering First/Continuation data and completing on the Last segment, then delimits packets with the configured PacketSizer, a frame data field carrying several packets back to back is delivered one packet at a time. Gaps in a segment sequence (First/Unsegmented interrupting a reassembly, Continuation/Last without a First, MAP ID change mid-packet) discard the partial packet and return ErrIncompleteSegment.
MAP Access Service Primitives
TC-15MAP_ACCESS.request3.4.3.2MYesMAPAccessService.Send(data) implements MAP_ACCESS.request. Wraps data in frame with unsegmented segment header.
TC-16MAP_ACCESS.indication3.4.3.3MYesMAPAccessService.Receive() implements MAP_ACCESS.indication. Returns data field of next frame.
VC Frame Service Primitives
TC-17VCF.request3.5.3.2MYesVCFrameService.Send(data) decodes frame bytes and pushes into VirtualChannel.
TC-18VCF.indication3.5.3.3MYesVCFrameService.Receive() pulls next frame and returns as encoded bytes.

Table A-4: TC Protocol Data Unit

ItemDescriptionReferenceStatusSupportNotes
TC-19TC Transfer Frame4.1.1MYesTCTransferFrame struct with Encode() / DecodeTCTransferFrame() round-trip. Variable length up to 1024 bytes.
TC-20Transfer Frame Primary Header4.1.2MYesPrimaryHeader, 5 octets (40 bits). All fields per CCSDS: Transfer Frame Version Number (2 bits, enforced as 00), Bypass Flag (1 bit), Control Command Flag (1 bit), Reserved (2 bits, enforced as 00), Spacecraft ID (10 bits), Virtual Channel ID (6 bits), Frame Length (10 bits, total-1), Frame Sequence Number (8 bits). Big-endian encoding. The invalid type Bypass=0 + Control Command=1 is rejected (ErrInvalidFrameType, 4.1.2.3); Type-B frames are forced to N(S)=0 on construction (4.1.2.7). Octets beyond the declared frame length are ignored on decode (CLTU fill, 4.1.2.7.2).
TC-20aBC Frame Contents (Unlock, Set V(R))4.1.3.3MYesBuildUnlockCommand() (0x00), BuildSetVRCommand(vr) (0x82 0x00 <V(R)>), ParseControlCommand(), plus frame-level builders NewUnlockFrame() / NewSetVRFrame() producing Type-BC frames (Bypass=1, CC=1, N(S)=0, no segment header). Malformed contents return ErrInvalidControlCommand.
TC-21Segment Header4.1.4.1MYesSegmentHeader, 1 octet: Sequence Flags (2 bits), MAP ID (6 bits). Present when MAP sublayer is used. Encode() / Decode() / Validate() methods. Constants: SegUnsegmented, SegFirst, SegContinuation, SegLast.
TC-22Transfer Frame Data Field4.1.4.2MYesTCTransferFrame.DataField, variable-length telecommand payload.
TC-23Frame Error Control Field4.1.5MYesTCTransferFrame.FrameErrorControl, 16-bit CRC-16-CCITT (polynomial 0x1021, init 0xFFFF). Auto-computed on construction via NewTCTransferFrame(). Verified on decode; CRC mismatch returns ErrCRCMismatch.

Table A-5: Protocol Procedures

ItemDescriptionReferenceStatusSupportNotes
TC-24MAP Packet Processing Function4.2.2MYesMAPPacketService.Send() segments packets into frames using Segment Header flags. Small packets produce unsegmented frames. Large packets use First/Continuation/Last segmentation. Frame Sequence Number assigned via FrameCounter.
TC-25MAP Access Processing Function4.2.3MYesMAPAccessService.Send() wraps raw data in unsegmented frame with MAP sublayer.
TC-26VC Generation Function4.2.4MYesNewTCTransferFrame() generates frames with SCID, VCID, data, optional Segment Header. CRC auto-computed. Frame Sequence Number configurable via WithSequenceNumber().
TC-27VC Multiplexing Function4.2.5MYesVirtualChannelMultiplexer schedules frames from multiple Virtual Channels using weighted round-robin. Integrated into MasterChannel.
TC-28MC Generation Function4.2.6MYesMasterChannel.AddFrame() routes inbound frames to Virtual Channels by VCID with SCID validation.
TC-29MC Multiplexing Function4.2.7MYesPhysicalChannel implements weighted round-robin MC multiplexing across registered MasterChannels via GetNextFrame().
TC-30MAP Packet Extraction Function4.3.2MYesMAPPacketService.Receive() reassembles segmented packets and delimits multiple packets per frame with the PacketSizer (invoked on every delivery). Reports segment-sequence gaps via ErrIncompleteSegment instead of silently dropping them.
TC-31MAP Access Extraction Function4.3.3MYesMAPAccessService.Receive() returns data field of next frame.
TC-32VC Reception Function4.3.4MYesDecodeTCTransferFrame() parses raw octets into TCTransferFrame, verifying CRC and extracting all fields. MasterChannel.AddFrame() routes received frames to the appropriate VirtualChannel by VCID.
TC-33VC Demultiplexing Function4.3.5MYesMasterChannel.AddFrame() demultiplexes inbound frames to Virtual Channels by VCID.
TC-34MC Reception Function4.3.6MYesMasterChannel.GetNextFrame() pulls next frame from the multiplexer.
TC-35MC Demultiplexing Function4.3.7MYesPhysicalChannel.AddFrame() demultiplexes inbound frames to the correct MasterChannel by SCID.

Table A-6: Management Parameters

ItemDescriptionReferenceStatusValues AllowedSupportNotes
Managed Parameters for a Physical Channel
TC-36Physical Channel NameTable 5-1MCharacter StringYesPhysicalChannel.Name, configured at construction via NewPhysicalChannel(name).
TC-37Maximum Frame Length (octets)Table 5-1MInteger (up to 1024)YesMaxFrameLength constant = 1024. Enforced in NewTCTransferFrame() via ErrDataTooLarge.
TC-38Transfer Frame Version Number (TFVN)Table 5-1M'00' binaryYesPrimaryHeader.VersionNumber, enforced as 0 in Validate().
TC-39Valid Spacecraft IDsTable 5-1MIntegersYesPrimaryHeader.SpacecraftID, 10 bits (0-1023). Validated in Validate().
TC-40MC Multiplexing SchemeTable 5-1MMission SpecificYesPhysicalChannel implements weighted round-robin MC multiplexing.
TC-41Presence of Frame Error ControlTable 5-1MPresent ('1')YesAlways present. CRC-16-CCITT auto-computed and verified.
Managed Parameters for a Master Channel
TC-42SCIDTable 5-2MIntegerYesMasterChannel.scid, configured at construction. Enforced in AddFrame().
TC-43Valid VCIDsTable 5-2MSelectable set of integers (0-63)YesPrimaryHeader.VirtualChannelID, 6 bits (0-63). MasterChannel.channels maps registered VCIDs.
TC-44VC Multiplexing SchemeTable 5-2MMission SpecificYesVirtualChannelMultiplexer implements weighted round-robin scheduling.
Managed Parameters for a Virtual Channel
TC-45SCIDTable 5-3MIntegerYesPrimaryHeader.SpacecraftID. Set via NewTCTransferFrame().
TC-46VCIDTable 5-3M0 to 63YesPrimaryHeader.VirtualChannelID. VirtualChannel.ID configured at construction.
TC-47Presence of Segment HeaderTable 5-3MPresent ('1') / Absent ('0')YesControlled via WithSegmentHeader() option. SegmentHeader struct with encode/decode.
TC-48Service TypeTable 5-3MMAP Packet, MAP Access, or VC FrameYesThree service implementations: MAPPacketService, MAPAccessService, VCFrameService. Registered via TCServiceManager.RegisterVirtualService().

Table A-7: Protocol Specification with SDLS Option

ItemDescriptionReferenceStatusSupportNotes
TC-49SDLS Protocol(see ref. [8])ONoSDLS Option not implemented.

A2.3 CONFORMANCE SUMMARY

Overall Statistics

CategoryTotal ItemsSupportedNot Supported
Mandatory (M)49490
Optional (O)101
Total50491

Non-Conformances (Mandatory Items Not Supported)

None. All 49 mandatory items (including the BC frame contents, TC-20a) are supported.

Declared Simplifications

AreaDeviation
Blocking sendSend() never blocks; a full virtual channel buffer returns ErrBufferFull. The optional blocking behavior of 4.2.2 is left to the caller.

Non-Supported Optional Items

ItemDescriptionReason
TC-49SDLS ProtocolSDLS Option not implemented.

Fully Supported Mandatory Items

Key implementations:

AreaItemsImplementation
Service Data UnitsTC-1-4TCTransferFrame encode/decode, MAPPacketService, MAPAccessService, VCFrameService.
MAP Packet ServiceTC-5-7, TC-13-14MAPPacketService with segmentation (First/Continuation/Last/Unsegmented), PacketSizer-based reassembly.
MAP Access ServiceTC-8-10, TC-15-16MAPAccessService with unsegmented frame wrapping.
VC Frame ServiceTC-11-12, TC-17-18VCFrameService pass-through via VirtualChannel.
Protocol Data UnitTC-19-23PrimaryHeader (40-bit) with frame-type validation and Type-B N(S)=0, BC contents (TC-20a: Unlock / Set V(R)), SegmentHeader (8-bit), CRC-16-CCITT.
Packet ProcessingTC-24-25, TC-30-31MAP Packet segmentation/reassembly, MAP Access raw delivery.
VC FunctionsTC-26-27, TC-32-33NewTCTransferFrame(), VirtualChannelMultiplexer (weighted round-robin), MasterChannel demux by VCID.
MC FunctionsTC-28-29, TC-34-35MasterChannel.AddFrame() routes by VCID. PhysicalChannel MC mux/demux by SCID.
Management ParamsTC-36-48Physical channel name, max frame length 1024, TFVN enforced, SCID/VCID validated, segment header support, all service types.