Astro~/0.3
** Conformance / Space Link Extension * PAGE 18 / 23
** Astro * Conformance
** /conformance/sle

Space Link Extension

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

Conformance Statement for pkg/sle, CCSDS 913.1-B-2, 911.1-B-5, 911.2-B-4, 911.5-B-4, 912.1-B-5


A2.1 GENERAL INFORMATION

A2.1.1 Identification of PICS

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

A2.1.2 Identification of Implementation Under Test (IUT)

FieldValue
Implementation Nameastro/pkg/sle
Implementation VersionSee go.mod / latest commit on main
Special ConfigurationNone
Other InformationGo library implementing the ISP1 transport and the four SLE transfer services. The user role is implemented in full. The provider role answers the association and data operations, runs production and the transfer buffer of clause 3.1.9 and annex B, and serves several service instances through Complex; what it does not hold is a service agreement, whose provision periods and parameter ranges are mission configuration. The package owns no goroutines, no timers and no sockets beyond the TML reader and writer: the caller drives every machine and supplies the clock.

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/sle (Go package)
System Name(s)Astro

A2.1.4 Identification of Specification

FieldValue
SpecificationCCSDS 913.1-B-2 (ISP1), 911.1-B-5 (RAF), 911.2-B-4 (RCF), 911.5-B-4 (ROCF), 912.1-B-5 (FCLTU)
Have any exceptions been required?Yes [X] No [ ]

NOTE, Non-supported and partly supported capabilities are identified in section A2.3 with explanations. What the provider does not hold is a service agreement, which is mission configuration rather than protocol; that is marked on every row it touches.


A2.2 REQUIREMENTS LIST

Table A-1: Transport Mapping Layer (CCSDS 913.1-B-2 clause 3.3)

ItemDescriptionReferenceStatusSupportNotes
SLE-1TML message framing3.3.2MYesMessage with an eight-octet header. DecodeMessage, ReadMessage, WriteMessage.
SLE-2Context message3.3.2.2.4MYesContextMessage, a fixed 12-octet body carrying 'ISP1', version 1, the heartbeat interval and the dead factor.
SLE-3Heartbeat message3.3.2.2.5MYesHeartbeatMessage(). An empty body is required and enforced.
SLE-4SLE PDU message3.3.2.2.3MYesMessageSLEPDU carrying a BER-encoded PDU.
SLE-5Heartbeat timing3.3.3MPartialAssociation.HeartbeatDue, PeerDead and NextHeartbeat report when a heartbeat is owed and when the peer has gone silent. The library runs no timer: the caller acts on the hint.
SLE-6Message size limit-OYesDefaultMaxMessageSize (16 MiB), overridable per read. Not a spec requirement; a bound on hostile length fields.

Table A-2: BER encoding (ITU-T X.690, as SLE uses it)

ItemDescriptionReferenceStatusSupportNotes
SLE-7Definite-length formX.690 8.1.3MYesShort and long forms, encoding and decoding.
SLE-8Indefinite-length formX.690 8.1.3.6OYesAccepted on decode by scanning for the end-of-contents octets, because real providers emit it. The encoder always emits the definite form. A primitive indefinite length is refused per clause 8.1.3.2 (ErrIndefiniteLength).
SLE-9INTEGER, OCTET STRING, OBJECT IDENTIFIER, VisibleString, NULL, SEQUENCEX.690 8MYesAppendInteger, AppendOctetString, AppendObjectIdentifier, AppendVisibleString, AppendNull, AppendSequence.
SLE-10Context-specific tagsX.690 8.1.2MYesMulti-octet tag numbers supported, which SLE needs for tags 100 to 104.

Table A-3: Credentials and authentication (CCSDS 913.1-B-2 clause 3.1.2)

ItemDescriptionReferenceStatusSupportNotes
SLE-11ISP1 credentials3.1.2MYesCredentials with time, random number and a SHA-256 digest. A digest decodes only at 20 or 32 octets, the two lengths clause 3.2.3 note 2 defines.
SLE-12SHA-256 digest3.1.2.3MYes32 octets. DigestSizeSHA256. Issue 2 replaced SHA-1; this implements Issue 2 only. A 20-octet legacy digest decodes but fails verification, because the superseded SHA-1 scheme is not implemented.
SLE-13Credential time window3.1.2.2.1MYesAcceptableDelay on AssociationConfig. Zero disables the check.
SLE-14Unauthenticated associations3.1.2OYesLeaving Password empty omits credentials.
SLE-15Credentials on service PDUs3.1.2MYesAssociation.MakeCredentials stamps every outgoing PDU. Inbound checking follows AuthLevel, none, bind (default), or all, and at 'all' every HandlePDU path runs CheckPeerCredentials, transfer-buffer entries included.

Table A-4: Association operations (common PDUs module)

ItemDescriptionReferenceStatusSupportNotes
SLE-16BIND invocation and return911.1-B-5 3.2MYesBindInvocation, BindReturn, Association.Bind, HandleBindInvocation, HandleBindReturn.
SLE-17UNBIND invocation and return3.3MYesUnbindInvocation, UnbindReturn, with the 'end' and 'suspend' reasons.
SLE-18PEER-ABORT3.11MYesPeerAbort with the full diagnostic set. Encoded as the primitive [104] with the bare diagnostic octet (9F 68 01 xx), per the IMPLICIT TAGS module. Sent on any PDU the state forbids. PeerAbort.UrgentData and Association.HandleUrgentData carry the ISP1 urgent-data mapping of 913.1-B-2 clause 3.4; writing the octet out of band is the caller's, since the library owns no socket.
SLE-19Service instance identifier3.2.2MYesServiceInstanceIdentifier. Attribute identifiers encode as the OBJECT IDENTIFIERs of the SLE-SERVICE-INSTANCE-ID module (sagr = 1.3.112.4.3.1.2.52 and so on); the legacy VisibleString form is accepted on decode and flagged.
SLE-20Version negotiation3.2.2MPartialThe version number is carried and checked on BIND. The package implements version 5 semantics only; it does not fall back to an older version's PDU set.

Table A-5: Service state machine (911.1-B-5 clause 4.2, and the same in the other three)

ItemDescriptionReferenceStatusSupportNotes
SLE-21State 1 'unbound'4.2.1MYesServiceUnbound.
SLE-22State 2 'ready'4.2.1MYesServiceReady.
SLE-23State 3 'active'4.2.1MYesServiceActive.
SLE-24BIND valid only in state 13.2.1.6MYesErrAlreadyBound otherwise.
SLE-25UNBIND valid only in state 23.3.1.5MYesErrAlreadyStarted when still active.
SLE-26START valid only in state 23.4.1.7MYesErrNotBound or ErrAlreadyStarted otherwise.
SLE-27STOP valid only in state 33.5.1.3MYesErrNotStarted otherwise.
SLE-28Data transfer valid only in state 33.6.1.3MYesBoth halves refuse; an inbound transfer buffer outside state 3 draws a PEER-ABORT.
SLE-29Negative STOP return leaves state 3table 4-1 row 10MYesTested.
SLE-30Unexpected PDU -> PEER-ABORT 'protocol error'table 4-1MYesErrUnexpectedPDU, with the abort queued for sending. A STATUS-REPORT arriving in state 1 draws it too.
SLE-30aDuplicate invoke identifiers3.1MYesThe provider machines track every invoke identifier since the BIND and answer a reuse with the 'duplicate invoke ID' diagnostic (ErrDuplicateInvokeId).
SLE-31Return <n> timertable 4-1 note 11MPartialNot run by the library. ServiceUser.Outstanding() reports which invocations are waiting so the caller can time them.
SLE-32Provider-initiated BINDtable 4-1 row 1ONoOnly the user initiates. A provider-initiated association is a ground-station arrangement this package does not model.

Table A-6: Return All Frames (CCSDS 911.1-B-5)

ItemDescriptionReferenceStatusSupportNotes
SLE-33RAF-START3.4MYesRAFStartInvocation, RAFStartReturn, with both diagnostic alternatives and the conditional time range.
SLE-34RAF-STOP3.5MYesStopInvocation and Acknowledgement, shared across services.
SLE-35RAF-TRANSFER-DATA3.6MYesRAFTransferDataInvocation: earth receive time, antenna id, data link continuity, delivered frame quality, private annotation, frame.
SLE-36Transfer buffer3.1.9MYesRAFTransferBuffer, a SEQUENCE OF frames and notifications.
SLE-37RAF-SYNC-NOTIFY3.7MYesSyncNotifyInvocation, all four alternatives. The lossFrameSync report's fields sit directly under the implicit [0], per the IMPLICIT TAGS module. Shared with RCF and ROCF, which define it identically.
SLE-38RAF-STATUS-REPORT3.8MYesRAFStatusReportInvocation, both frame counters and all four lock statuses.
SLE-39RAF-SCHEDULE-STATUS-REPORT3.9MYesScheduleStatusReportInvocation and its return, with the 2-to-600 second cycle enforced.
SLE-40RAF-GET-PARAMETER3.10MYesGetParameterInvocation and GetParameterReturn encode and decode in full, and receiving one no longer aborts the association. ServiceUser.GetParameter asks; ServiceProvider.HandleGetParameterInvocation answers, negatively with 'unknown parameter' when the caller has no value. All 8 alternatives of RafGetParameter are named through DecodeParameter, with integer values read and structured ones (latencyLimit's CHOICE, permittedFrameQuality's SET) handed back as raw BER.
SLE-41Requested frame quality3.4.2MYesRequestedFrameQuality: good only, erred only, all.

Table A-7: Return Channel Frames (CCSDS 911.2-B-4)

ItemDescriptionReferenceStatusSupportNotes
SLE-42RCF-START with GVCID3.4MYesRCFStartInvocation carrying RequestedGVCID. No frame quality: RCF delivers only good frames.
SLE-43GvcId SEQUENCEannex AMYesGVCID with the master-channel alternative. Spacecraft ranges checked per frame version, and the virtual channel held to VcId (0 .. 63).
SLE-44Transfer frame version numbersannex AMYesTM 0, AOS 1, USLP 12. The USLP value is the four-bit wire field '1100', not the "version 4" the protocol is named for.
SLE-45RCF-TRANSFER-DATA3.6MYesRCFTransferDataInvocation. No delivered-frame-quality field.
SLE-46RCF transfer buffer3.1.9MYesRCFTransferBuffer.
SLE-47RCF-STATUS-REPORT3.8MYesRCFStatusReportInvocation, one frame counter rather than RAF's two.
SLE-48RCF-GET-PARAMETER3.10MYesAs SLE-40, with the 8 alternatives of RcfGetParameter.

Table A-8: Return Operational Control Fields (CCSDS 911.5-B-4)

ItemDescriptionReferenceStatusSupportNotes
SLE-49ROCF-START3.4MYesROCFStartInvocation: GVCID, control word type, update mode.
SLE-50ControlWordType CHOICEannex AMYesControlWordType: all control words, CLCW (optionally from one TC virtual channel), or not CLCW. The TC virtual channel is held to VcId (0 .. 63).
SLE-51Update mode3.4.2MYesUpdateContinuous and UpdateChangeBased.
SLE-52ROCF-TRANSFER-DATA3.6MYesROCFTransferDataInvocation carrying the four-octet control field. pkg/cop decodes a CLCW from it.
SLE-53ROCF transfer buffer3.1.9MYesROCFTransferBuffer.
SLE-54ROCF-STATUS-REPORT3.8MYesROCFStatusReportInvocation: frames processed and OCFs delivered, counted separately.
SLE-55ROCF-GET-PARAMETER3.10MYesAs SLE-40, with the 14 alternatives of RocfGetParameter.

Table A-9: Forward CLTU (CCSDS 912.1-B-5)

ItemDescriptionReferenceStatusSupportNotes
SLE-56CLTU-START3.4MYesFCLTUStartInvocation with the first CLTU identification; FCLTUStartReturn whose positive result carries the radiation window.
SLE-57CLTU-TRANSFER-DATA3.6MYesFCLTUTransferDataInvocation: CLTU id, earliest and latest transmission time, delay, radiation notification request, the CLTU.
SLE-58CLTU identification sequence3.6.2.5MYesFCLTUUser keeps the count and advances it as each CLTU is sent, so CLTUs pipeline without waiting for returns (clause 3.1.6). A refusal resynchronises the count from the number the provider quotes. FCLTUProvider enforces the rule and quotes the expected number in a refusal.
SLE-59Buffer available reporting3.6.2MYesCltuBufferAvailable on every TRANSFER-DATA return. The library reports the figure the caller supplies; it manages no buffer of its own.
SLE-60CLTU-ASYNC-NOTIFY3.7MYesFCLTUAsyncNotifyInvocation, all nine notification alternatives, with CltuLastProcessed and CltuLastOk, whose fields sit directly under the implicit [1], per the IMPLICIT TAGS module.
SLE-61CLTU-THROW-EVENT3.9MYesFCLTUThrowEventInvocation and its return. FCLTUUser numbers each invocation itself (clause 3.9.2.4) and resynchronises from a refusal's echoed identification. The event identifier and qualifier are carried through unread: their meaning is in the service agreement.
SLE-62CLTU-STATUS-REPORT3.8MYesFCLTUStatusReportInvocation: CLTUs received, processed and radiated, plus buffer and uplink status.
SLE-63FCLTU production statusannex AMYesFCLTUProductionStatus, four values. Deliberately a separate Go type from the return services' three-value ProductionStatus: the numbers disagree.
SLE-64CltuStatus valuesannex AMYesCltuStatus: 0, 1, 2, 4, 5. Value 3 is FSP's 'acknowledged' and is rejected.
SLE-65CLTU-GET-PARAMETER3.10MYesAs SLE-40, with the 20 alternatives of CltuGetParameter.

Table A-10: Delivery modes

ItemDescriptionReferenceStatusSupportNotes
SLE-66Return timely online911.1-B-5 1.2.2MPartialThe mode is carried and its predicates reported. Discarding is the caller's: the machines hold one PDU and never queue.
SLE-67Return complete online1.2.2MPartialAs above; backpressure is the caller's.
SLE-68Return offline1.2.2OPartialModeled as configuration. AllowsPastStartTime and AllowsPeriodicStatusReport change what the user machine will ask for. No store is read; the caller supplies the data.
SLE-69Forward online912.1-B-5 1.2MPartialAs the return online modes.
SLE-70Forward offline1.2OPartialEnum value and predicates only.
SLE-71Data discarded notificationtable 4-1 row 14MPartialThe notification is encodable and decodable. Deciding to discard is the caller's, because the buffer is.

A2.3 EXCEPTIONS AND LIMITATIONS

Non-Supported Items

ItemDescriptionReason
SLE-32Provider-initiated BINDOnly the user initiates an association. A provider-initiated one is a ground-station arrangement outside what a library consumer needs.

Partly Supported Items

ItemDescriptionWhat is missing
SLE-5, SLE-31Heartbeat and return timersThe library runs no clock. It reports when a heartbeat is due, when a peer looks dead and which invocations are outstanding; the caller's loop acts. This is deliberate, see the guide's "No goroutines, no timers".
SLE-20Version negotiationVersion 5 PDU semantics only. The number is carried and checked, but there is no fallback to an earlier version's PDU set.
SLE-40, 48, 55, 65GET-PARAMETER for all four servicesComplete. All 50 alternatives across the four services are named, parameterName is checked against its tag so decoding against the wrong service is caught rather than mis-reported, and values the schema makes a single integer are read. Structured values, sets, nested CHOICEs, are handed back as raw BER rather than as guessed-at Go types.
SLE-66 to SLE-71Delivery modesThe mode is configuration and predicates. The buffering the modes imply is in Production for the provider side; a user that wants to buffer what it receives does that itself, since only it knows what it is doing with the data.
The provider role, throughoutServiceProvider, Production, ComplexThe association, the states, the data operations, production and the transfer buffer of clause 3.1.9 and annex B, and routing a BIND across several service instances are all here. What is not is a service agreement: provision periods, permitted parameter ranges, which initiator may bind to what. Those are a mission's configuration rather than the protocol, so the four agreement-shaped BIND diagnostics, access denied, not accessible to this initiator, invalid time, out of service, are left for a caller to raise. See A2.4 and A2.5.

Fully Supported Mandatory Items

The user role is complete for all four services: BIND, UNBIND, PEER-ABORT, START, STOP, SCHEDULE-STATUS-REPORT, and each service's data operations, TRANSFER-DATA and SYNC-NOTIFY and STATUS-REPORT for the return services, TRANSFER-DATA and THROW-EVENT and ASYNC-NOTIFY and STATUS-REPORT for FCLTU. GET-PARAMETER decodes and answers cleanly, and its per-service parameter CHOICEs are named: all 50 alternatives across the four services, with integer values read and structured ones left as raw BER.

AreaItemsImplementation
TransportSLE-1-6tml.go, framing, context, heartbeat.
EncodingSLE-7-10ber.go, the definite-length subset SLE uses.
AuthenticationSLE-11-15credentials.go, assoc.go.
AssociationSLE-16-20bind.go, assoc.go.
State machineSLE-21-31service.go, shared by all four services.
RAFSLE-33-41raf.go.
RCFSLE-42-48rcf.go, common.go for the GVCID.
ROCFSLE-49-55rocf.go.
FCLTUSLE-56-65fcltu.go.
Delivery modesSLE-66-71delivery.go.
Productionclause 3.1.9.1, annex Bproduction.go, the transfer buffer, the release timer, backpressure, the production status machine.
Service instances910.4-B-2 clause 4.4.2complex.go, the instance set and BIND routing.

A2.4 PRODUCTION AND THE TRANSFER BUFFER

Production implements clause 3.1.9.1 and annex B. It owns no clock: every method that involves time takes the time, and the release timer is read through Due, Expired and Deadline.

RequirementReferenceSupportNotes
Transfer buffer holds transfer-data and sync-notify recordsclause 3.1.9.1.2, clause 3.1.9.1.13YesOnly those two are buffered; everything else is sent as soon as possible, which is the caller's to do.
Release timer starts on insertion into an empty bufferclause 3.1.9.1.4YesNot on every insert, so the timer measures how long the oldest record has waited.
Timer duration is the latency limitclause 3.1.9.1.5YesA zero limit runs no timer, which is the offline and complete-online case.
Buffer holds transfer-buffer-size recordsclause 3.1.9.1.6Yes
Release when full, on timer expiry, or on 'end of data'clause 3.1.9.1.7YesAll three conditions.
Records released in insertion orderclause 3.1.9.1.8Yes
Backpressure discards the whole buffer and inserts 'data discarded due to excessive backlog'clause 3.1.9.1.9YesThe whole buffer, not the one record that would not fit. The release timer restarts from the moment of the backpressure.
Buffer size temporarily incremented by one while that notification waitsclause 3.1.9.1.10YesRestored when the contents are passed on. Without it, a channel configured with a buffer size of one would carry nothing but backlog notifications.
An accepted STOP builds and passes the buffer immediatelyclause 3.1.9.1.11YesStop.
The buffer is cleared when the association is abortedclause 3.1.9.1.12YesAbort, which delivers nothing.
Production status transitionstable B-1Yeshalted->running, running->interrupted, interrupted->running, any->halted. halted->interrupted is refused: it is not a row in table B-1 and has no edge in figure B-1.
Initial production status is haltedclause B2.3YesProduction is not yet configured for the instance.
A status change is notified through the buffer, in sequenceclause 3.1.9.1.3YesThe notification is returned by SetRunning and friends for the caller to insert, so it lands between the frames acquired before the event and those after.

A2.5 SERVING SEVERAL SERVICE INSTANCES

Complex holds the configured instances and routes an inbound BIND.

RequirementSupportNotes
Several instances served at onceYesEach with its own provider, production and state. Two cannot share an identifier: a BIND naming it would be ambiguous.
Route a BIND to the instance it namesYesRoute, keyed on the service instance identifier. The Complex is the binding authority, per 910.4-B-2 clause 4.4.2.4.
Refuse an unknown instanceYesBindNoSuchServiceInstance.
Refuse an instance already boundYesBindAlreadyBound. The instance still comes back, so a caller can answer on its association.
Refuse an unsupported versionYesBindVersionNotSupported.
Refuse for service-agreement reasonsN by designAccess denied, not accessible to this initiator, invalid time, out of service. Those depend on an agreement the complex does not hold; a caller checks them and answers with the diagnostic that fits.