Compressed Bundle Reporting and Custody Transfer Tutorial
This tutorial introduces the Compressed Bundle Reporting (CBR) and Custody Transfer (CT) feature in ION, which implements the CCSDS Orange Book specification "Compressed Bundle Status Reporting and Custody Signaling."
Overview
CBR/CT provides two key capabilities for DTN networks:
-
Compressed Reporting Signals (CRS): A more efficient alternative to traditional BPv7 status reports, allowing multiple bundle status events to be aggregated into a single administrative message.
-
Custody Transfer with Compressed Custody Signals (CCS): A mechanism for reliable bundle delivery through hop-by-hop custody transfer, where each node explicitly accepts responsibility for bundle delivery.
Why Use CBR/CT?
- Reduced Overhead: CRS aggregates multiple status reports into a single message, reducing administrative traffic
- Reliable Delivery: Custody transfer ensures bundles are retransmitted if they don't reach the next custodian
- Interoperability: Follows the CCSDS Orange Book specification for compatibility with other implementations
- Efficient Encoding: Uses CBOR (Concise Binary Object Representation) for compact wire format
Prerequisites
Before using CBR/CT, ensure you have:
- ION built and installed (version 4.2 or later with CBR/CT support)
- Basic familiarity with ION configuration files (see Basic Configuration Tutorial)
- At least two ION nodes configured for communication
Configuration
Enabling CBR/CT Mode
Add the following command to your node's bprc file to enable Orange Book custody mode:
Available custody modes are:
- none - No custody transfer (default)
- bibe - Bundle-In-Bundle Encapsulation mode (reserved for future use)
- orangebook - CCSDS Orange Book CBR/CT mode
Configuring Signal Aggregation
CBR/CT can aggregate multiple signals into a single administrative bundle to reduce overhead. Configure aggregation with the m cbraggr command in your bprc file:
Parameters:
- crs_limit - Maximum bundle sequence entries per CRS before sending
- ccs_limit - Maximum bundle sequence entries per CCS before sending
- timeout_seconds - Maximum seconds to wait before flushing pending signals
Example configurations:
For testing (immediate signal transmission):
For production (aggregate up to 100 bundles):
Complete Node Configuration Example
Here's a complete example node.bprc configuration file with CBR/CT enabled:
## Bundle Protocol configuration with CBR/CT enabled
1
a scheme ipn 'ipnfw' 'ipnadminep'
a endpoint ipn:1.0 x
a endpoint ipn:1.1 x
a endpoint ipn:1.2 x
a protocol udp 1400 100
a induct udp 127.0.0.1:4556 udpcli
a outduct udp 127.0.0.1:4557 udpclo
r 'ipnadmin node.ipnrc'
m custodymode orangebook
m cbraggr 1 1 2
s
Using CBR/CT Features
Sending Bundles with Custody Transfer
When custodymode orangebook is enabled, bundles can request custody transfer using the standard BP flags. For example, using bpsource:
When an application sends a bundle with custody transfer requested, ION automatically: 1. Adds a CTEB (Custody Transfer Extension Block) to the bundle 2. Tracks the bundle in local custody storage 3. Waits for a CCS from the next custodian 4. Releases custody upon receiving CCS acceptance
Monitoring Custody Status
Custody and reporting state is inspected directly through bpadmin, so no
extra tooling is required. Pipe the list/info commands into bpadmin:
Each entry shows the sequence identifier (seqId), sequence number
(seqNum), the next-custodian destination EID, the time custody was
accepted, the time of the last retransmission (or (never)), and the
retransmit count:
To check one specific bundle:
# Reports "pending" (held, awaiting next-hop CCS) or "not-found"
echo 'i custodybundle ipn:1.2 0 1' | bpadmin
l custodybundle is most informative when m cbrretx none is set, since
refused bundles then remain in tracking; with m cbrretx signal they are
re-forwarded on refusal and may drain before you look.
To review received Compressed Reporting Signals:
The legacy
cbrcustodytestutility can also list custody bundles and print aggregate statistics, but it is a developer test tool; thebpadmincommands above are the supported operational interface.
Using bptrace with CRS
The bptrace utility automatically handles both traditional status reports and Compressed Reporting Signals:
# Send a trace bundle with status reporting
bptrace -flags rcv,fwd,dlv ipn:1.1 ipn:2.1 ipn:1.2 -ttl 300 -msg "Trace test"
When nodes are configured with custodymode orangebook, they generate CRS instead of traditional status reports. bptrace seamlessly processes both formats and displays status information in a unified format.
Multi-Node Custody Transfer Example
Network Topology
This example demonstrates custody transfer across three nodes:
Node 1 Configuration (Source)
node1.bprc:
1
a scheme ipn 'ipnfw' 'ipnadminep'
a endpoint ipn:1.0 x
a endpoint ipn:1.1 x
a protocol udp 1400 100
a induct udp 10.0.0.1:4556 udpcli
a outduct udp 10.0.0.2:4556 udpclo
r 'ipnadmin node1.ipnrc'
m custodymode orangebook
m cbraggr 1 1 2
s
Node 2 Configuration (Intermediate Custodian)
node2.bprc:
1
a scheme ipn 'ipnfw' 'ipnadminep'
a endpoint ipn:2.0 x
a endpoint ipn:2.1 x
a protocol udp 1400 100
a induct udp 10.0.0.2:4556 udpcli
a outduct udp 10.0.0.1:4556 udpclo
a outduct udp 10.0.0.3:4556 udpclo
r 'ipnadmin node2.ipnrc'
m custodymode orangebook
m cbraggr 1 1 2
s
Node 3 Configuration (Destination)
node3.bprc:
1
a scheme ipn 'ipnfw' 'ipnadminep'
a endpoint ipn:3.0 x
a endpoint ipn:3.1 x
a protocol udp 1400 100
a induct udp 10.0.0.3:4556 udpcli
a outduct udp 10.0.0.2:4556 udpclo
r 'ipnadmin node3.ipnrc'
m custodymode orangebook
m cbraggr 1 1 2
s
Testing the Custody Chain
-
Start a receiver on Node 3:
-
On Node 1, send a custody-enabled bundle:
-
Verify custody transfer on each node:
Heterogeneous Networks
CBR/CT is designed to work in networks where not all nodes support the Orange Book specification. The CTEB and CREB extension blocks use processing flags that enable transparent forwarding:
- Non-supporting nodes will forward bundles with these blocks intact
- Custody transfer still works between supporting nodes
- Status reporting falls back to traditional BPv7 reports on non-supporting nodes
Configuration for Mixed Networks
For a node that should NOT participate in CBR/CT but should forward bundles transparently:
The node will still forward bundles with CTEB/CREB blocks to the next hop.
Retransmission Strategy
When a next-hop custodian does not acknowledge custody, the node's behavior
is governed by m cbrretx:
- none (default) — no automatic retransmission. Bundles stay in custody
tracking and can be inspected with
l custodybundle. - timer — the
bpclockdaemon re-forwards a bundle afterinterval_secondsif no CCS acceptance has arrived. - signal — a bundle is re-forwarded immediately when a CCS refusal is received for it.
max_retransmissions caps attempts per bundle (0 = unlimited). For example,
retransmit every 30 s up to 5 times:
Command Reference
All CBR/CT options are bpadmin commands: m (manage/set), l (list/show),
a (add), d (delete), and i (info). They may be placed in a node's
bprc file (processed at startup) or piped into a running node with
echo '<command>' | bpadmin. Unless noted otherwise, every command below
requires m custodymode orangebook to be in effect.
Startup vs. runtime: Most commands take effect immediately. The two exceptions are noted in their entries:
m crebreporttoandm cbrcounterwidthare read by long-running daemons from a cached snapshot and are best set in thebprcfile (a runtime change is reliably picked up only after the BP daemons restart).m cbraggris honored at runtime.
Mode and reporting
| Command | Description |
|---|---|
m custodymode { none \| bibe \| orangebook } |
Selects the custody transfer mode. orangebook enables CBR/CT; none (default) disables it; bibe is reserved. This is the master switch for everything below. |
m srmode { traditional \| compressed \| both } |
Selects the status-report format generated by this node: classic BPv7 status reports, Compressed Reporting Signals (CRS), or both. CRS-based reporting (compressed or both) is required for the CREB commands. |
Signal aggregation
m cbraggr <crs_limit> <ccs_limit> <timeout_seconds>
Aggregates multiple status/custody events into one administrative bundle. A
signal is transmitted when its bundle-entry count reaches the limit, or when
timeout_seconds elapses since aggregation began — whichever comes first. A
limit of 0 means "send immediately". Defaults: 10, 10, 5. Effective at
runtime.
m cbraggr 1 1 2 # testing: send almost immediately
m cbraggr 50 50 15 # production: batch up to 50 entries, flush every 15 s
l cbraggr — display the current CRS limit, CCS limit, and timeout.
Retransmission
m cbrretx { none | timer | signal } <interval_seconds> <max_retransmissions>
Controls re-forwarding when custody is not acknowledged. See
Retransmission Strategy above. Defaults: none,
60, 3.
CREB (Compressed Reporting Extension Block) options
| Command | Description |
|---|---|
m crebexpliciteid { 0 \| 1 } |
When 1, the source EID is written explicitly into CREB blocks instead of being implied from the primary block. Default 0. Set 1 only for peers that require the explicit field. |
m crebreportto <eid> \| - |
Redirects every CRS generated for this node's bundles to <eid> (carried as CREB element 4) instead of each bundle's reportTo. Use - to clear. Useful for a dedicated monitoring station. Requires m srmode compressed or both. Best set in bprc (see startup-vs-runtime note). |
l crebreportto |
Show the current report-to override (or "none"). |
m cbrcounterwidth { 16 \| 32 \| 64 } |
Sets the wraparound width (bits) of new bundle sequence counters, for interoperability with constrained peers (Orange Book §3.2.9). Applies to counters created afterward; existing counters keep their width. Default 64. Best set in bprc. |
l cbrcounterwidth |
Show the current counter width and its maximum value. |
Custody-acceptance whitelist
Controls which incoming custody requests this node will accept. The two dimensions are checked independently; an empty list for a dimension means "accept any". If a non-empty list does not match, custody is refused with a CCS refusal.
| Command | Description |
|---|---|
a cbraccept { custodian \| source } <eid> |
Add an EID to the whitelist. custodian matches the node currently holding custody (CTEB custodian EID); source matches the bundle's original source EID. |
d cbraccept { custodian \| source } <eid> |
Remove a whitelist entry. |
l cbraccept |
List both whitelists; (all) means that dimension accepts everyone. |
a cbraccept custodian ipn:3.0 # only take custody from node 3
a cbraccept source ipn:5.1 # only for bundles sourced at ipn:5.1
Auto custody-request policy
Requests custody transfer automatically for bundles sent to listed destinations, even when the sending application did not ask for it.
| Command | Description |
|---|---|
a custodyreq <eid> |
Add a destination EID to the auto custody-request list (exact match). |
d custodyreq <eid> |
Remove a destination EID. |
l custodyreq |
List all auto-request destinations, or (none). |
Monitoring and history
| Command | Description |
|---|---|
l custodybundle |
List all bundles currently held in custody tracking (seqId, seqNum, next-custodian EID, accept time, last-retransmit time, retransmit count). |
i custodybundle <source_eid> <seqId> <seqNum> |
Report one bundle's custody status: pending or not-found. |
m crsmaxlog <count> |
Set the max number of received-CRS records kept in the persistent history log; 0 = unbounded. Default 100. |
l crslog [<eid>] |
Print received CRS records, newest first (timestamp, sender EID, status code [1=received, 2=forwarded, 3=delivered, 4=deleted], bundle count). Optional <eid> filters by sender. |
Troubleshooting
Bundles Not Appearing in Custody
-
Verify custody mode is enabled:
-
Ensure the application requests custody transfer when sending
-
Check that both source and destination nodes have matching custody mode configuration
CCS Signals Not Received
- Verify network connectivity between nodes
- Check aggregation timeout isn't too long
- Review ion.log for CCS-related messages:
Signal Aggregation Issues
If signals seem delayed:
1. Reduce aggregation limits for testing: m cbraggr 1 1 2
2. Check current limits with echo 'l cbraggr' | bpadmin
3. Check for pending custody bundles with echo 'l custodybundle' | bpadmin
Performance Considerations
- Aggregation Limits: Higher limits reduce overhead but increase latency
- Timeout Values: Balance between signal timeliness and aggregation efficiency
- Custody Storage: Monitor custody bundle counts to avoid memory issues
Recommended production settings:
This aggregates up to 50 bundle entries per signal and flushes every 15 seconds.
Extension Blocks Reference
CBR/CT uses two extension blocks:
| Block Type | Name | Purpose |
|---|---|---|
| 13 | CTEB (Custody Transfer Extension Block) | Carries custody sequence information |
| 14 | CREB (Compressed Reporting Extension Block) | Carries status reporting sequence information |
And two administrative record types:
| Admin Record Type | Name | Purpose |
|---|---|---|
| 13 | CCS (Compressed Custody Signal) | Custody acceptance/refusal notifications |
| 14 | CRS (Compressed Reporting Signal) | Aggregated status reports |
See Also
- bprc(5) - Bundle Protocol configuration commands (full CBR/CT command syntax)
- bptrace(1) - Bundle Protocol trace utility
- cbrcustodytest(1) - Developer test utility for custody transfer
- CCSDS Orange Book "Compressed Bundle Status Reporting and Custody Signaling" specification
Summary
CBR/CT provides efficient status reporting and reliable custody-based delivery for DTN networks. Key configuration steps:
- Enable custody mode:
m custodymode orangebook - Choose report format:
m srmode compressed - Configure aggregation:
m cbraggr <crs_limit> <ccs_limit> <timeout> - Monitor with:
echo 'l custodybundle' | bpadminandecho 'l crslog' | bpadmin - Test with:
bptrace(delivery/CRS) andbpsource/bpsink
See the Command Reference above for every option.
For questions or issues, see the ION GitHub repository.