brubru · experimental

Robust Packet

AX.25 packet traffic carried by eight slow, shaped phase-modulated carriers. Error correction and a full-frame interleaver protect the packet before it reaches the radio.

8 carriers50 symbols/s per carrier200 / 600 bit/s before packet overheadKISS host attachment

hfmodem has no observed live-radio Robust Packet station results. Its current evidence is third-party public recordings, generated waveform tests and software station loopback. The figures below are schematics, not RF measurements. They start static, change only when you use a control, and produce no audio.

01 / Geometry

Eight carriers share one narrow audio band

The carrier centres are 1290, 1350, 1410, 1470, 1530, 1590, 1650 and 1710 Hz: 60 Hz apart around 1500 Hz. Each symbol lasts 20 ms. Pulse shaping smooths the transitions between symbols; the composite is a sum of all eight carriers rather than one tone jumping between eight frequencies.

SCS describes the narrow Robust Packet mode as a nominal 500 Hz waveform with 200 or 600 bit/s throughput and full-frame interleaving. Those are protocol-level descriptions, not sensitivity or throughput measurements of hfmodem. SCS PTC-IIpro manual, §5.10.

Eight Robust Packet carrier centresSchematic pulse-shaped lobes at 1290 through 1710 Hz with 60 Hz spacing. All eight carriers run at 50 symbols per second.
Pulse-shaped multicarrier sketch. Lobe height and shape are illustrative, without a decibel scale; carrier centres and spacing come from the implementation. This is not a captured spectrum.

Level 0: 8 × 50 × 1 = 400 coded bit/s; rate 1/2 gives 200 bit/s before packet overhead.

Carrier data and rate arithmetic
Exact centres; level names follow hfmodem's 0/1 numbering
CarrierCentre (Hz)Symbol rate
0129050 symbols/s
1135050 symbols/s
2141050 symbols/s
3147050 symbols/s
4153050 symbols/s
5159050 symbols/s
6165050 symbols/s
7171050 symbols/s
Data levelCoded bits / carrier symbolTotal coded bit/sCode ratePre-overhead bit/s
014001/2200
128003/4600

Native processing: 9600 samples/s, 192 samples per symbol, root-raised-cosine roll-off 0.33. Waveform constants and pulses. Synthetic bursts after card-rate conversion span 1247–1755 Hz at −26 dB. SCS’s nominal bandwidth uses a −30 dB threshold. Waveform evidence and measurement conditions.

02 / Modulation and coding

Encode bits, then transmit phase changes

Each carrier carries a phase change relative to its previous symbol. Level 0 uses two differential steps; level 1 uses four. The reference, preamble and headers keep the binary step mapping at both data levels. The angle convention below is the transmitter's actual mapping, including its −45° rotation.

Differential phase-step constellationPhase changes, not absolute received phase. Use Previous or Next phase step to inspect the bit mapping as text and a marked vector.
Ideal differential vectors, without noise, fading or receiver samples. The outlined point and bold vector identify the selected step independently of colour.

Level 0 · bit 0 · differential step −45°.

The forward path

A packet is scrambled with a nine-bit pseudorandom sequence, encoded with a constraint-length-nine convolutional code, then interleaved. Level 1 punctures the mother code before interleaving. The receiver reverses the permutation, restores omitted bits as erasures, and runs a soft-input Viterbi decoder before checking the packet.

Packet + zero tail→PN9 scramble→K=9 code→Puncture at level 1→Interleave→8 phase streams
Transmitter differential mapping; pair index is b0 + 2b1
LevelBits [b0,b1]Step
00 / 1−45° / −225°
100 / 10 / 01 / 11−45° / −135° / −315° / −225°

Bytes enter the encoder least-significant bit first. The mother code's generators are octal 657 and 435; level 1 keeps output masks (1,1,0) and (0,1,1), giving rate 3/4. A final zero byte supplies the eight zero tail bits and is excluded from scrambling. PN9 starts at state 1, shifts right with feedback from register bits 0 and 4 into bit 8, and takes the low register byte after each group of eight updates. These exact conventions matter as much as the polynomial names.

The full-frame interleaver uses a generated permutation. Its outer register starts at 1 and accepts positions below the coded length; a six-bit remap starts at 30 and rearranges positions below 64. Encoding writes wire[permutation] = coded; decoding reads wire[permutation].

Outer interleaver generator selection; tap positions are zero-based
Coded length belowRegister widthFeedback taps
1024109, 2
40961211, 5, 3, 0
81921312, 3, 2, 0
327681514, 0

Precision references: code and puncturing constants, PN9, interleaver and six-bit remap, encoder order, phase mapping and shared trellis implementation.

03 / Packet time

A header selects the coded body length

The burst begins with one reference symbol, eight preamble symbols and an eight-symbol header. The header codebook has 64 entries, each 64 bits across eight carriers. Its index combines 4 × class + level. Class 15 adds an eight-symbol extension header. The body follows at the selected data level.

Robust Packet burst timelineSchematic time-scaled reference, preamble, header, body, shaping ramp and final silence. The table below provides every duration and symbol count.
Computed packet timing, not a recorded transmission. Capacity includes the wrapper, padding and zero tail, not just application text. A seven-symbol shaping ramp and one 20 ms silent slot belong to the audio buffer; the station schedules the PTT lead separately.

75-byte class 3 at level 0: 167 encoded symbols + 8 buffer-tail slots = 3.50 seconds of audio.

Timeline data
Durations derived from 50 symbols/s
PartSymbols / slotsDuration (ms)
Reference120
Preamble8160
Header8160
Extension header00
Coded body1503000
Shaping ramp7140
Final silence120

Classes 0–14 have capacities 15, 21, 45, 75, 105, 126, 147, 168, 189, 210, 231, 252, 273, 294, 312 bytes. Class 15 holds 345 + 30e bytes for extensions e = 0…16, ending at 825 bytes. The implementation supports 32 capacities at each level; generated tests cover all of them. Public corpus frames cover classes 3 and 4 at level 0.

For capacity N: level 0 body = 2N symbols; level 1 body = 2N/3 symbols.
Encoded symbols = 17 + (class 15 ? 8 : 0) + body symbols.
Audio duration = (encoded symbols + 7 ramp slots + 1 silent slot) × 20 ms.

Exact 64-entry header construction, capacities, symbol counts and rendered buffer and scheduled lead.

04 / Frame boundaries

Keep AX.25 bytes, compress repeated addresses

The library boundary accepts AX.25 frames without their frame-check sequence (FCS). A destination and source each occupy seven AX.25 bytes; optional repeater addresses extend the list. Robust Packet compresses each address to five bytes: a four-byte little-endian base-40 callsign integer and the original SSID/flags byte. The callsign alphabet contains letters, digits, space and !"#.

AX.25 frame and Robust Packet bare wrapperA conventional host frame has destination, source, control, optional PID and information. The bare Robust Packet wrapper adds a header, compresses addresses, appends the original frame FCS, padding and a zero tail. Field widths in this diagram are not byte scale.HOST · FCS-free AX.25 bytesDestination · 7 BSource · 7 BControlPID*InformationBARE RPR BODY · before scrambling and codingHeaderAddresses · 5 B eachControl / PID* / infoFCS · 2 BPaddingZero tail
Structural sketch, without HDLC flags or bit stuffing copied into the RPR body. *PID appears where the supported control form requires it. Optional repeater addresses follow the same compression rule. The zero tail belongs to the encoder, not the delivered AX.25 frame.

One frame: bare packet

The wrapper's low five bits record padding; two bits suggest a speed. It carries compressed addresses, the original control/PID/information bytes, and the FCS calculated over the expanded AX.25 frame. Padding lies outside that FCS. The receiver verifies it before returning the unchanged frame without FCS.

Several frames: container

Up to eight compatible frames can share addresses in a container. Length words delimit their contents, and one CRC covers the container header, lengths and contents. Later records carry one command/response flag bit; their source flag is its complement. Frames with incompatible address/flag representation stay bare. No per-frame FCS is invented on delivery.

hfmodem's shared AX.25 parser handles two to ten addresses and a one-byte control form; Robust Packet accepts frames up to 399 bytes at this boundary. A frame that fits no permitted bare class is logged and skipped while other input frames keep their order. Padding must fit the bare packet's five-bit field. Truncated lengths, invalid addresses, malformed containers and failed checks deliver no frame.

The checksum implementation is CRC-16/X-25: polynomial 0x1021, initial and final XOR 0xffff, reflected processing, serialized as two little-endian bytes in the RPR wrapper. Standard AX.25 HDLC bit order should not be confused with this byte-oriented wrapper. The AX.25 v2.2 specification, §3 defines the underlying addresses, control/PID and FCS fields.

Exact wrapper rules: address compression, bare/container assembly, validation, supported AX.25 parsing and CRC recurrence and variant. Framing evidence and edge cases.

05 / Host and radio

KISS and AX.25 link control

KISS is the computer-to-modem framing boundary. It is not the modulation heard over the air and does not by itself establish an AX.25 connection. The host supplies frame bytes without FCS; brubru wraps, codes and transmits them, then returns validated received bytes. Tracker and AGWPE hosts provide connected AX.25 sessions, acknowledgements and retries. The attached application supplies mail transport.

Host application / AX.25 link owner↔KISS bytes↔brubru frame + waveform↔Radio audio

The original Chepponis/Karn KISS description separates the host protocol from the modem's keying and channel access. A type byte uses its high nibble for the port and low nibble for the command. FEND (C0) delimits frames; data C0 escapes to DB DC, and data DB to DB DD. KISS itself adds no frame CRC.

Byte-escaping example only, not a valid AX.25 frame:
Payload: 01 C0 DB 02
Port 0 / data command: C0 | 00 | 01 DB DC DB DD 02 | C0

The hfmodem listener defaults to loopback, accepts one KISS client and bounds payloads at 2048 bytes. TXDELAY and SlotTime use 10 ms units on KISS; station options use milliseconds. Default persistence 63 accepts an inclusive uniform byte draw, so an eligible quiet-slot decision succeeds with probability 64/256. Channel eligibility and a shared station arbiter still govern transmission.

Current station defaults and ownership
Setting / responsibilityCurrent behavior
Level / limiterLevel 0; crest limiter enabled
TXDELAY / contention slot100 ms / 100 ms
Channel detector480 Hz band compared with flanking guards and a qualified noise floor
Startup qualification2 seconds of qualifying windows; broadband occupancy already present can resemble a noisy floor
KISS hostOne client; raw frames immediately; no HTTP service
Connection / mailTracker and AGWPE provide connected sessions; the application handles mail

KISS constants/parser, host server, channel access, station attachment and host selection. Station settings and software-tested shutdown limits.

06 / Listening and evidence

Passive monitoring and decoder evidence

hfmodem console rpr monitor listens at the rig's current dial. An optional --freq tunes once; you can retune the radio itself afterward. A recording can be supplied with --wav recording.wav. The monitor decodes both supported levels and exposes CRC-checked AX.25 frames; it never calls, acknowledges or transmits. Passive monitor guide.

The receiver acquires the eight-symbol preamble, fits frequency and timing, and handles spectral inversion. Long frames of at least 300 symbols use decision-directed timing and phase updates every 32 symbols; short frames keep the preamble grid. These are implementation choices, not a promise of universal receiver sensitivity. Acquisition and tracking.

Evidence remains bounded by its source
EvidenceWhat it establishesWhat remains open
Public corpus: four frames from three stationsDecoded frame bytes, FCS checks and measured regeneration comparisons; classes 3/4 at level 0Our station has no observed Robust Packet RF results
Generated waveformsAll 32 capacities at both levels; inversion and ±15 Hz offset cases; noise cases referenced to a 3 kHz bandwidthIndependent receiver interoperability and calibrated sensitivity
Software station/KISS testsFrame transport, queueing, access decisions and simulated resource failuresPhysical PTT/unkey guarantees and on-air connected-mode exchange
ContainersGenerated framing and malformed-input vectorsThe public corpus does not independently establish container behavior

Corpus comparisons and loopback results are software evidence. Pat mail and Windows component checks exercise connected sessions over virtual audio. No live-radio Robust Packet delivery is claimed here. Link boundary and implementation status preserve those limits.

07 / References

Protocol descriptions and exact implementation

The primary documents below describe the manufacturer's mode and the underlying AX.25/KISS boundaries. Exact packet capacities, header codewords, PN9 phase, interleaver order and transmit shaping are specified by the linked public code and the waveform, framing, link and station guides.