Case A - Simple, uninterrupted downlink

4 images queued for pass 1, no interrupt. Baseline case. constructed

Setup / assumptions

  • 4 images, sent as 4 separate transfers (labeled Tx1-Tx4 - "Tx" = "transaction," CFDP's term for one file transfer). Splitting big images into several transfers instead is still open - Q8.
  • CFDP's reliable mode ("Class 2 / Acknowledged") - confirmed with PAVI. The satellite gets confirmation each image arrived, and can resend missing pieces if needed.
  • Sent one at a time, Tx1→Tx2→Tx3→Tx4 - deliberate, not just tidiness (why, below).
  • PLDP doesn't process live. It records during the pass, and only decodes/checks afterward, once the pass ends ("LOS" = Loss Of Signal).

How these 4 images got decided for Pass 1 in the first place is now shown in the diagram below, at PPS's downlink-request step - PPS's mechanism, worked out later in this project (see the TC vs X-band concept, Q23): a request travels up as a custom command, and the satellite's payload app locally issues each Put.request from it. Still a light, unconfirmed working assumption, not locked - noted here since this is the first case where the gap actually shows up.

CCSDS 727.0-B-5 §4.6.4.1: "Acknowledged mode procedures may be exercised only over duplex transmission paths." Why the confirmations below can't just stay on the ground - Class 2 requires a two-way path.
Why one-at-a-time is safer: a lost frame while Image 1 is sending only damages Image 1 - Images 2-4 stay clean. Mixing all 4 together ("interleaving") would let one lost frame touch several at once. CFDP repairs either way - every piece is labeled with which image and position it belongs to - but interleaving spreads the risk: one bad frame could mean repairing all 4 instead of just 1.

Phase 1 - Sending during Pass 1

The satellite sends all 4 images, one after another. Each image goes out as three messages in order: "here's what's coming" (Metadata), the image data itself (File Data), and "that's everything, here's the checksum" (EOF).

Nothing complicated here - no pausing, no resending. The smooth, ideal case.

Pass ends (LOS). Everything sent is sitting in PLDP's raw recording, but nothing's been decoded or checked yet.

Phase 2 - Ground-side processing, then Pass 2's S-band uplink

PLDP decodes the pass-1 recording, reassembles all 4 images, checks each checksum - all clean. PLDP does not wait for all 4 before acting: each image's confirmation is handed off to MCS the moment that image individually validates - Image 1 first, then 2, and so on, independent of how long Image 4 takes.

Important: the moment a checksum checks out, that image is ready for L0 processing - right away. Everything below is CFDP's own paperwork to formally close the transfer; it doesn't block using the image.

PLDP sends two confirmations per image: "got your EOF" (ACK(EOF)) and "complete and correct" (Finished(complete)). PLDP can't talk to the satellite directly, so these travel to MCS first, then ride up on Pass 2's S-band window - S-band and X-band are up together on every pass, so this doesn't need a separate dedicated contact.

CCSDS 727.0-B-5 §4.6.4.3.5: Positive Acknowledgment applies to EOF and Finished PDUs, with ACK(EOF) and ACK(Finished) as the expected responses - the rule behind this whole round-trip.

Why dispatch immediately instead of batching everything?

Two separate layers were getting blurred together here - worth pulling apart:

  1. PLDP's dispatch policy - hand each image's confirmation off the moment it validates. Never wait on a slower sibling.
  2. MCS's transmission policy - when Pass 2's S-band window opens, MCS batches whatever's sitting in its queue at that moment into one frame (see below). This happens naturally, regardless of how PLDP dispatched - it isn't something PLDP has to orchestrate.

Result: Images 1-3, ready by the time Pass 2's window opens, go up together in one frame. Image 4, not ready yet, simply isn't in the queue at that moment - it rides whatever later window it's actually ready for. Nobody waits artificially, and nothing gets sent as a wasted lone transmission if something else happens to be ready alongside it. This gets full transmission-count efficiency (the same COP-1/CLCW round-trip argument that would apply if MCS runs something like YAMCS) with none of the downside of an artificial wait - and it matches how CFDP is already built to treat every transfer as independent.

CCSDS 727.0-B-5 §3.1.2: "The CFDP entity shall be implemented such that virtually any number of transactions may be concurrently in various stages of transmission or reception." A binding "shall," not a suggestion.

Still open: whether MCS's actual per-transmission cost (COP-1 round trips, command queue gating, rate limits) is large enough to matter in practice - doesn't change this design, just how much it was worth reasoning through. Worth confirming with whoever operates MCS.

How do these confirmations actually get from PLDP up to the satellite?

PLDP can't transmit - everything has to hop through MCS, the only system with a real uplink:

  1. PLDP hands each confirmation to MCS as it becomes ready (ACK(EOF) + Finished, per image). Exact interface/format is still an open integration question.
  2. MCS wraps each PDU in its own Space Packet - one packet per PDU, never several PDUs in one packet. This is baked into CFDP itself, not our choice: it hands data downward one PDU at a time.
  3. Each packet is marked uplink-direction (the "Packet Type" bit) and addressed to a dedicated APID reserved for CFDP traffic - separate from normal command APIDs.
  4. Whatever's queued gets "blocked" into the same Transfer Frame(s) over S-band - packed one after another, each packet's own length marking where the next starts. This is where transmission-count efficiency actually comes from: at the frame level, not by PLDP batching anything itself.
  5. Onboard, the packet router reads each APID and routes it straight to the CFDP software instead of the command processor - mail sorted by its address.
727.0-B-5, UT layer service description (p.3-6): CFDP sends one PDU per UNITDATA.request call - "a UT_SDU whose content is a CFDP PDU." Why step 2 is one-packet-per-PDU.
133.0-B-2 §4.1.3.3.2.1-3: the Packet Type bit - '0' downlink, '1' uplink. Same packet format both directions.
232.0-B-4 §3.2.2.3: "blocking of Packets" - multiple packets extracted from one frame via each packet's own length field. Confirms step 4 directly against the TC spec.

Does it fit in one frame?

A TC Transfer Frame maxes out at 1024 octets (mission-configured limit could be lower). ACK/Finished PDUs are tiny - ~10-25 octets each with packet header; all 8 (worst case, everything ready at once) together, ~200-250 octets. Fits easily.

232.0-B-4 §4.1.2.8: "The size of this field limits the maximum length of a Transfer Frame to 1024 octets" - also a Managed Parameter, so missions may set it lower.

Where this could get tight (not here, but worth knowing)

  • A smaller configured frame size just spreads a bigger batch across more frames - not a failure.
  • PDUs with filestore responses or "message to user" content are larger than this bare-minimum case.
  • Large File Data PDUs (image data, Phase 1) are the opposite extreme - routinely bigger than one frame, spanning several. Same mechanism, opposite end of the scale.

Phase 3 - Same Pass 2, the satellite confirms receipt

The satellite acknowledges each Finished message as it individually arrives and gets processed (ACK(Finished)), rather than waiting for all 4 - Image 1 can be fully closed while Image 4 is still processing. This travels back down via X-band, still within Pass 2, since X-band is co-active with the S-band uplink that just happened. No third pass needed.

Case A sequence diagram: PPS's downlink request triggers Tx1-4 before Pass 1 (light, unconfirmed mechanism, Q23), then Phase 1 send, Phase 2 pipelined ACK/Finished dispatch via MCS's natural batching, Phase 3 ACK(Finished) close-out, all within 2 passes

Rendered from diagram/case_a_closure.puml (PlantUML)

Variant - what if the pass ends mid-way through the last image?

Suppose Pass 1 is barely too short for all 4 - Images 1-3 finish cleanly, but LOS hits mid-way through Image 4. The design above already handles this with no special case:

  • Images 1-3: fully received, no problems → send their confirmations at the next chance, without waiting on Image 4.
  • Image 4: incomplete, needs Pass 2 to finish, then goes through its own confirmation cycle separately.

This works because CFDP treats every transfer independently - 3 of 4 images can be wrapped up a whole pass earlier than the 4th.

The one thing worth remembering

Even in this best case, fully closing out all 4 transfers takes two passes (Pass 1 for the original send, Pass 2 for the complete uplink+downlink confirmation round trip). It's two, not three, specifically because S-band and X-band are up together on every pass: the confirmations ride Pass 2's S-band up, and the satellite's reply rides that same Pass 2's X-band down. But as noted above, the image itself is usable much sooner, right after Phase 2's checksum check. Don't confuse "not yet closed" with "not yet usable."

Open questions this case raised

Q8 - Do we send one image per transfer, or split big images into several smaller transfers? We assumed "one image, one transfer" here. No longer just theoretical - it's the live choice in front of the team for Case C right now (Tiling vs. Pause/Resume, going to the CONOPS call). Whichever gets picked there is the real answer here too.
Whether MCS's per-transmission cost (COP-1/CLCW, queue gating, rate limits) is significant enough to have mattered - doesn't change the design, just how much it was worth debating.
Q23 (light, unconfirmed) - the downlink-request mechanism that decided these 4 images for Pass 1 in the first place, shown in the diagram's opening step. Plain TC command, next-pass effect assumed - very likely correct but genuinely unconfirmed with whoever owns PPS/the onboard payload app.