Conformance Statement for pkg/tcdl, CCSDS 232.0-B-4
A2.1 GENERAL INFORMATION
A2.1.1 Identification of PICS
| Field | Value |
|---|---|
| Date of Statement (DD/MM/YYYY) | 23/08/2026 |
| PICS Serial Number | ASTRO-TCDL-PICS-001 |
| System Conformance Statement Cross-Reference | This document |
A2.1.2 Identification of Implementation Under Test (IUT)
| Field | Value |
|---|---|
| Implementation Name | astro/pkg/tcdl |
| Implementation Version | See go.mod / latest commit on main |
| Special Configuration | None |
| Other Information | Go 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
| Field | Value |
|---|---|
| Supplier | Ravi Suhag |
| Contact Point for Queries | GitHub, 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
| Field | Value |
|---|---|
| Specification | CCSDS 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
| Item | Description | Reference | Status | Support | Notes |
|---|---|---|---|---|---|
| TC-1 | MAP Packet SDU | 3.2.2 | M | Yes | |
MAPPacket accepts packet data via Send(), segments across multiple frames when data exceeds capacity, pushes frames into Virtual, and reassembles via Receive(). | |||||
| TC-2 | MAP Access SDU | 3.2.3 | M | Yes | |
MAPAccess accepts raw data via Send(), wraps in unsegmented frame with segment header, delivers via Receive(). | |||||
| TC-3 | VC Frame SDU | 3.2.4 | M | Yes | |
VCFrame accepts pre-encoded frame bytes via Send(), decodes and buffers, delivers encoded bytes via Receive(). | |||||
| TC-4 | TC Transfer Frame | 3.2.5 | M | Yes | |
TCTransfer struct with Encode() / Decode round-trip support. Composed of Primary Header, optional Segment Header, Data Field, and Frame Error Control. | |||||
Table A-2: Service Parameters
| Item | Description | Reference | Status | Values Allowed | Support | Notes |
|---|---|---|---|---|---|---|
| MAP Packet Service Parameters | ||||||
| TC-5 | MAP Packet | 3.3.2.2 | M | - | Yes | Packet data passed as []byte to MAPPacketService.Send(). Segmented if larger than frame capacity. |
| TC-6 | GVCID | 3.3.2.3 | M | - | Yes | Derived from PrimaryHeader.GVCID() (TFVN + SCID + VCID). VCID/SCID configured at service construction. |
| TC-7 | MAP ID | 3.3.2.4 | M | 0-63 | Yes | SegmentHeader.MAPID, 6 bits. Configured per service instance. |
| MAP Access Service Parameters | ||||||
| TC-8 | MAP Access SDU | 3.4.2.2 | M | - | Yes | Raw data passed to MAPAccessService.Send(). Wrapped in single unsegmented frame. |
| TC-9 | GVCID | 3.4.2.3 | M | - | Yes | Derived from PrimaryHeader.GVCID(). |
| TC-10 | MAP ID | 3.4.2.4 | M | 0-63 | Yes | SegmentHeader.MAPID. |
| VC Frame Service Parameters | ||||||
| TC-11 | TC Frame | 3.5.2.2 | M | - | Yes | VCFrameService accepts complete []byte frame data via Send() / Receive(). |
| TC-12 | GVCID | 3.5.2.3 | M | - | Yes | Derived from PrimaryHeader.GVCID(). |
Table A-3: Service Primitives
| Item | Description | Reference | Status | Support | Notes |
|---|---|---|---|---|---|
| MAP Packet Service Primitives | |||||
| TC-13 | MAP_ | 3.3.3.2 | M | Yes | |
MAPPacket implements MAP_Frame; Type-B frames always carry N(S)=0. NOTE: Send is non-blocking; a full virtual channel returns Err instead of blocking (declared simplification). | |||||
| TC-14 | MAP_ | 3.3.3.3 | M | Yes | |
MAPPacket implements MAP_PacketSizer, a frame data field carrying several packets back to back is delivered one packet at a time. Gaps in a segment sequence (First/Err. | |||||
| MAP Access Service Primitives | |||||
| TC-15 | MAP_ | 3.4.3.2 | M | Yes | |
MAPAccess implements MAP_ | |||||
| TC-16 | MAP_ | 3.4.3.3 | M | Yes | |
MAPAccess implements MAP_ | |||||
| VC Frame Service Primitives | |||||
| TC-17 | VCF.request | 3.5.3.2 | M | Yes | |
VCFrame decodes frame bytes and pushes into Virtual. | |||||
| TC-18 | VCF. | 3.5.3.3 | M | Yes | |
VCFrame pulls next frame and returns as encoded bytes. | |||||
Table A-4: TC Protocol Data Unit
| Item | Description | Reference | Status | Support | Notes |
|---|---|---|---|---|---|
| TC-19 | TC Transfer Frame | 4.1.1 | M | Yes | |
TCTransfer struct with Encode() / Decode round-trip. Variable length up to 1024 bytes. | |||||
| TC-20 | Transfer Frame Primary Header | 4.1.2 | M | Yes | |
Primary, 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 (Err, 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-20a | BC Frame Contents (Unlock, Set V(R)) | 4.1.3.3 | M | Yes | |
Build (0x00), Build (0x82 0x00 <V(R)>), Parse, plus frame-level builders New / New producing Type-BC frames (Bypass=1, CC=1, N(S)=0, no segment header). Malformed contents return Err. | |||||
| TC-21 | Segment Header | 4.1.4.1 | M | Yes | |
Segment, 1 octet: Sequence Flags (2 bits), MAP ID (6 bits). Present when MAP sublayer is used. Encode() / Decode() / Validate() methods. Constants: Seg, SegFirst, Seg, SegLast. | |||||
| TC-22 | Transfer Frame Data Field | 4.1.4.2 | M | Yes | |
TCTransfer, variable-length telecommand payload. | |||||
| TC-23 | Frame Error Control Field | 4.1.5 | M | Yes | |
TCTransfer, 16-bit CRC-16-CCITT (polynomial 0x1021, init 0xFFFF). Auto-computed on construction via New. Verified on decode; CRC mismatch returns Err. | |||||
Table A-5: Protocol Procedures
| Item | Description | Reference | Status | Support | Notes |
|---|---|---|---|---|---|
| TC-24 | MAP Packet Processing Function | 4.2.2 | M | Yes | |
MAPPacket segments packets into frames using Segment Header flags. Small packets produce unsegmented frames. Large packets use First/FrameCounter. | |||||
| TC-25 | MAP Access Processing Function | 4.2.3 | M | Yes | |
MAPAccess wraps raw data in unsegmented frame with MAP sublayer. | |||||
| TC-26 | VC Generation Function | 4.2.4 | M | Yes | |
New generates frames with SCID, VCID, data, optional Segment Header. CRC auto-computed. Frame Sequence Number configurable via With. | |||||
| TC-27 | VC Multiplexing Function | 4.2.5 | M | Yes | |
Virtual schedules frames from multiple Virtual Channels using weighted round-robin. Integrated into Master. | |||||
| TC-28 | MC Generation Function | 4.2.6 | M | Yes | |
Master routes inbound frames to Virtual Channels by VCID with SCID validation. | |||||
| TC-29 | MC Multiplexing Function | 4.2.7 | M | Yes | |
Physical implements weighted round-robin MC multiplexing across registered Masters via Get. | |||||
| TC-30 | MAP Packet Extraction Function | 4.3.2 | M | Yes | |
MAPPacket reassembles segmented packets and delimits multiple packets per frame with the PacketSizer (invoked on every delivery). Reports segment-sequence gaps via Err instead of silently dropping them. | |||||
| TC-31 | MAP Access Extraction Function | 4.3.3 | M | Yes | |
MAPAccess returns data field of next frame. | |||||
| TC-32 | VC Reception Function | 4.3.4 | M | Yes | |
Decode parses raw octets into TCTransfer, verifying CRC and extracting all fields. Master routes received frames to the appropriate Virtual by VCID. | |||||
| TC-33 | VC Demultiplexing Function | 4.3.5 | M | Yes | |
Master demultiplexes inbound frames to Virtual Channels by VCID. | |||||
| TC-34 | MC Reception Function | 4.3.6 | M | Yes | |
Master pulls next frame from the multiplexer. | |||||
| TC-35 | MC Demultiplexing Function | 4.3.7 | M | Yes | |
Physical demultiplexes inbound frames to the correct Master by SCID. | |||||
Table A-6: Management Parameters
| Item | Description | Reference | Status | Values Allowed | Support | Notes |
|---|---|---|---|---|---|---|
| Managed Parameters for a Physical Channel | ||||||
| TC-36 | Physical Channel Name | Table 5-1 | M | Character String | Yes | |
Physical, configured at construction via New. | ||||||
| TC-37 | Maximum Frame Length (octets) | Table 5-1 | M | Integer (up to 1024) | Yes | |
Max constant = 1024. Enforced in New via Err. | ||||||
| TC-38 | Transfer Frame Version Number (TFVN) | Table 5-1 | M | '00' binary | Yes | |
Primary, enforced as 0 in Validate(). | ||||||
| TC-39 | Valid Spacecraft IDs | Table 5-1 | M | Integers | Yes | |
Primary, 10 bits (0-1023). Validated in Validate(). | ||||||
| TC-40 | MC Multiplexing Scheme | Table 5-1 | M | Mission Specific | Yes | |
Physical implements weighted round-robin MC multiplexing. | ||||||
| TC-41 | Presence of Frame Error Control | Table 5-1 | M | Present ('1') | Yes | |
Always present. CRC-16-CCITT auto-computed and verified. | ||||||
| Managed Parameters for a Master Channel | ||||||
| TC-42 | SCID | Table 5-2 | M | Integer | Yes | |
Master, configured at construction. Enforced in AddFrame(). | ||||||
| TC-43 | Valid VCIDs | Table 5-2 | M | Selectable set of integers (0-63) | Yes | |
Primary, 6 bits (0-63). Master maps registered VCIDs. | ||||||
| TC-44 | VC Multiplexing Scheme | Table 5-2 | M | Mission Specific | Yes | |
Virtual implements weighted round-robin scheduling. | ||||||
| Managed Parameters for a Virtual Channel | ||||||
| TC-45 | SCID | Table 5-3 | M | Integer | Yes | |
Primary. Set via New. | ||||||
| TC-46 | VCID | Table 5-3 | M | 0 to 63 | Yes | |
Primary. Virtual configured at construction. | ||||||
| TC-47 | Presence of Segment Header | Table 5-3 | M | Present ('1') / Absent ('0') | Yes | |
Controlled via With option. Segment struct with encode/ | ||||||
| TC-48 | Service Type | Table 5-3 | M | MAP Packet, MAP Access, or VC Frame | Yes | |
Three service implementations: MAPPacket, MAPAccess, VCFrame. Registered via TCService. | ||||||
Table A-7: Protocol Specification with SDLS Option
| Item | Description | Reference | Status | Support | Notes |
|---|---|---|---|---|---|
| TC-49 | SDLS Protocol | (see ref. [8]) | O | No | SDLS Option not implemented. |
A2.3 CONFORMANCE SUMMARY
Overall Statistics
| Category | Total Items | Supported | Not Supported |
|---|---|---|---|
| Mandatory (M) | 49 | 49 | 0 |
| Optional (O) | 1 | 0 | 1 |
| Total | 50 | 49 | 1 |
Non-Conformances (Mandatory Items Not Supported)
None. All 49 mandatory items (including the BC frame contents, TC-20a) are supported.
Declared Simplifications
| Area | Deviation |
|---|---|
| Blocking send | Send() 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
| Item | Description | Reason |
|---|---|---|
| TC-49 | SDLS Protocol | SDLS Option not implemented. |
Fully Supported Mandatory Items
Key implementations:
| Area | Items | Implementation |
|---|---|---|
| Service Data Units | TC-1-4 | |
TCTransfer encode/MAPPacket, MAPAccess, VCFrame. | ||
| MAP Packet Service | TC-5-7, TC-13-14 | |
MAPPacket with segmentation (First/PacketSizer-based reassembly. | ||
| MAP Access Service | TC-8-10, TC-15-16 | |
MAPAccess with unsegmented frame wrapping. | ||
| VC Frame Service | TC-11-12, TC-17-18 | |
VCFrame pass-through via Virtual. | ||
| Protocol Data Unit | TC-19-23 | |
Primary (40-bit) with frame-type validation and Type-B N(S)=0, BC contents (TC-20a: Unlock / Set V(R)), Segment (8-bit), CRC-16-CCITT. | ||
| Packet Processing | TC-24-25, TC-30-31 | |
MAP Packet segmentation/ | ||
| VC Functions | TC-26-27, TC-32-33 | |
New, Virtual (weighted round-robin), Master demux by VCID. | ||
| MC Functions | TC-28-29, TC-34-35 | |
Master routes by VCID. Physical MC mux/demux by SCID. | ||
| Management Params | TC-36-48 | |
Physical channel name, max frame length 1024, TFVN enforced, SCID/VCID validated, segment header support, all service types. | ||
Wire test vectors
None. pkg/tcdl has no golden wire literals to extract: its test values are inputs rather than pinned expected octets.
See how this is verified for what the corpus covers and what it does not.