Astro~/0.3
** Conformance / CCSDS File Delivery Protocol * PAGE 03 / 23
** Astro * Conformance
** /conformance/cfdp

CCSDS File Delivery Protocol

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

Conformance Statement for pkg/cfdp, CCSDS 727.0-B-5


A1.1 GENERAL INFORMATION

A1.1.1 Identification of PICS

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

A1.1.2 Identification of Implementation Under Test (IUT)

FieldValue
Implementation Nameastro/pkg/cfdp
Implementation VersionSee go.mod / latest commit on main
Special ConfigurationNone
Other InformationGo library implementing CFDP Part 1. Full PDU codec set, modular and CRC-32 checksums, an abstract Filestore with in-memory and OS-backed implementations, and caller-pumped Class 1 and Class 2 transaction machines. The library owns no goroutines and no clock: timers and retransmission scheduling belong to the caller, matching the shape of pkg/cop's FOP-1.

A1.1.3 Identification of Supplier

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

A1.1.4 Identification of Specification

FieldValue
SpecificationCCSDS 727.0-B-5 (CCSDS File Delivery Protocol, Blue Book, Issue 5, July 2020)
Have any exceptions been required?Yes [X] No [ ], see A1.6

A1.2 PROTOCOL DATA UNITS

FeatureReferenceStatusSupport
Fixed PDU headerclause 5.1.2, table 5-1MY
Version '001'table 5-1MY: other versions rejected on decode
PDU type: File Directive / File Dataclause 5.1.6MY
Direction flagtable 5-1MY
Transmission mode flagtable 5-1MY: '0' acknowledged, '1' unacknowledged
CRC flagtable 5-1MY
Large File flagtable 5-1MY: widens every FSS field to 64 bits
PDU data field lengthtable 5-1MY: includes the CRC when present
Segmentation controltable 5-1MY
Length of entity IDstable 5-1MY: 1 to 8 octets, encoded as width less one
Segment metadata flagtable 5-1MY
Length of transaction sequence numbertable 5-1MY: 1 to 8 octets
Variable-width entity IDsclause 5.1.4MY
LV objectsclause 5.1.8, table 5-2MY
TLV objectsclause 5.1.9, table 5-3MY
File-Size Sensitive fieldsclause 5.1.10MY

A1.3 FILE DIRECTIVE PDUs

FeatureReferenceStatusSupport
Directive codesclause 5.2.1.2, table 5-4MY: reserved codes rejected
Condition codesclause 5.2.1.3, table 5-5MY: all fourteen the table defines
EOF PDUclause 5.2.2, table 5-6MY: condition, checksum, file size, fault location
Fault location omitted for 'no error'table 5-6MY
Finished PDUclause 5.2.3, table 5-7MY: condition, delivery code, file status, responses
Fault location omitted for 'no error' and 'unsupported checksum type'table 5-7MY
ACK PDUclause 5.2.4, table 5-8MY: EOF and Finished only
ACK directive subtype rulestable 5-8MY: '0001' for Finished, '0000' otherwise
Transaction statusclause 5.2.4MY: all four values
Metadata PDUclause 5.2.5, table 5-9MY
Closure requestedtable 5-9MY
Checksum type fieldtable 5-9MY
Empty filenames for fileless transactionstable 5-9MY
NAK PDUclause 5.2.6, table 5-10OY
Segment requestsclause 5.2.6.2, table 5-11OY: including the 0..0 metadata request
Prompt PDUclause 5.2.7, table 5-12OY: answered with NAK or Keep Alive
Keep Alive PDUclause 5.2.8, table 5-13OY

A1.4 FILE DATA PDUs

FeatureReferenceStatusSupport
File Data PDUclause 5.3, table 5-14MY
Offset fieldtable 5-14MY: FSS
Record continuation stateclause 5.3OY: all four states, decoded when present
Segment metadatatable 5-14OY: up to 63 octets

A1.5 PROCEDURES

FeatureReferenceStatusSupport
CRC at transmitting entityclause 4.1.1OY
CRC at receiving entityclause 4.1.2OY: failing PDUs are discarded
CRC algorithm: CCSDS Telecommand CRCclause 4.1.3.1MY: reuses pkg/crc
CRC placement and coverageclause 4.1.3.2MY: final octets, counted in the data field length
Checksum 32 bitsclause 4.2.1.2MY
Modular checksumclause 4.2.2.3MY: verified against the Annex F worked example
Null checksumclause 4.2.2.4MY
Additional checksum algorithmsclause 4.2.2.5OY: CRC-32C (type 2), CRC-32 (type 3)
Class 1 unacknowledged transferclause 4.6MY: file data arriving before Metadata is buffered and replayed
Class 2 acknowledged transferclause 4.6OY: NAK-driven gap recovery; the last recovered segment triggers the Finished PDU
Check limitclause 4.6.3.3OY: caller-driven via ExpireCheckLimit; closes out Class 1 with closure
Fault handlers: cancel, suspend, ignore, abandonclause 4.8, table 4-1MY: every condition defaults to cancel; per-condition config overrides
Suspend and resumeclause 4.11OY: state flags; the caller owns the clock
Cancelclause 4.11OY: sender EOF (cancel) carries progress; receiver Cancel() and inbound EOF (cancel) close out with Finished (incomplete)
Filestore requestsclause 5.4.1, table 5-16OP: see A1.6
Filestore responsesclause 5.4.2, table 5-17OY: one per request
Messages to userclause 5.4.3OY: carried, not interpreted
Fault handler override TLVclause 5.4.4OY: sent from SenderConfig, applied by the receiver on arrival
Flow label TLVclause 5.4.5OY: carried, not interpreted
Entity ID TLVclause 5.4.6MY: used for fault location

A1.6 EXCEPTIONS AND UNSUPPORTED FEATURES

FeatureReferenceSupportRationale
Filestore actions: append, replacetable 5-16NDecoded; execution returns status 'not performed' (table 5-18 allows this).
Filestore actions: create/remove directory, deny directorytable 5-16NSame. The Filestore interface is deliberately file-only.
Adaptive flow control from Keep Aliveclause 4.6NKeep Alive and Prompt encode and decode; no rate adaptation.
Part 2 user behaviourclause 6N by designThe Part 2 message formats are implemented (see A1.8). What is not is the behaviour around them: which primitive to call on receipt, and how to queue concurrent suspension orders, which clause 6.5.4.1.2 calls "an implementation matter".
Timers and inactivity detectionclause 4.6N by designThe library owns no clock. Retransmission and timeout scheduling are the caller's, exposed as ResendEOF, RequestNAK, ResendFinished, ExpireCheckLimit, and DeclareFault. Limit and inactivity faults raised through DeclareFault take the table 4-1 route.

A1.7 IMPLEMENTATION LIMITS

LimitValueSource
Entity ID width1 to 8 octets3-bit length field, table 5-1
Transaction sequence number width1 to 8 octets3-bit length field, table 5-1
PDU data field length65535 octets16-bit field, table 5-1
LV / TLV value length255 octets8-bit length field, tables 5-2 and 5-3
Segment metadata length63 octets6-bit length field, table 5-14
File size, small file2^32 - 1 octets32-bit FSS, clause 5.1.10
File size, large file2^64 - 1 octets64-bit FSS, clause 5.1.10

A1.8 PART 2: USER OPERATIONS

Section 6 carries every User Operation as a Reserved CFDP Message inside a Message to User TLV in an ordinary transaction's metadata (clause 6.1.1), so Part 2 adds no PDU of its own. The message identifier (the ASCII characters cfdp (table 6-1)) is what separates a protocol message from an application one, and UserMessagesFrom uses it to sift a metadata TLV run.

All 20 message types of tables 6-3, 6-14, 6-17, 6-20 and 6-23 are named, and every content table is encoded and decoded.

MessageReferenceSupportNotes
Reserved CFDP Message headertable 6-1YesThe cfdp identifier and the type octet.
Originating Transaction IDclause 6.1.5, table 6-2YesCommon to every operation. The two 3-bit length fields hold the width less one; the reserved bits either side are checked to be zero.
Proxy Put Requesttable 6-4YesAn omitted file name is a zero-length LV, not an absent field.
Proxy Message to Usertable 6-5Yes
Proxy Filestore Requesttable 6-6YesAn 8-bit length then a filestore request's TLV value, doing the job the TLV's own length would.
Proxy Fault Handler Overridetable 6-7Yes
Proxy Transmission Modetable 6-8YesTable 5-1 makes '0' acknowledged, so the flag is inverted on the wire.
Proxy Flow Labeltable 6-9Yes
Proxy Segmentation Controltable 6-10Yes'0' means record boundaries respected.
Proxy Put Responsetable 6-12YesCondition code, spare bit, delivery code, file status, the Finished PDU's packing.
Proxy Filestore Responsetable 6-13Yes
Proxy Put Cancelclause 6.2.6.2YesHas no content, and is encoded with none.
Proxy Closure Requesttable 6-11Yes
Directory Listing Requesttable 6-15Yes
Directory Listing Responsetable 6-16YesSuccess is '0' here.
Remote Status Report Requesttable 6-18Yes
Remote Status Report Responsetable 6-19YesSuccess is '1' here, the opposite polarity from table 6-16, and in the low bit rather than the high one.
Remote Suspend Requesttable 6-21Yesclause 6.5.3.1.2 requires the carrying transaction to be Acknowledged; that is the caller's to arrange.
Remote Suspend Responsetable 6-22YesCarries the transaction ID, which is easy to miss because the field list runs onto a second page.
Remote Resume Requesttable 6-24Yes
Remote Resume Responsetable 6-25YesSame body as table 6-22. Clause 6.6.4.2 notes a successful resume may not change the suspension state, so the indicator reports state rather than outcome.

The message type numbering has a gap inside the proxy range: 0x0A is the Originating Transaction ID, common to every operation rather than belonging to proxy, so proxy runs 0x00-0x09 and resumes at 0x0B.