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.
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.
Level 0: 8 × 50 × 1 = 400 coded bit/s; rate 1/2 gives 200 bit/s before packet overhead.
Carrier data and rate arithmetic
| Carrier | Centre (Hz) | Symbol rate |
|---|---|---|
| 0 | 1290 | 50 symbols/s |
| 1 | 1350 | 50 symbols/s |
| 2 | 1410 | 50 symbols/s |
| 3 | 1470 | 50 symbols/s |
| 4 | 1530 | 50 symbols/s |
| 5 | 1590 | 50 symbols/s |
| 6 | 1650 | 50 symbols/s |
| 7 | 1710 | 50 symbols/s |
| Data level | Coded bits / carrier symbol | Total coded bit/s | Code rate | Pre-overhead bit/s |
|---|---|---|---|---|
| 0 | 1 | 400 | 1/2 | 200 |
| 1 | 2 | 800 | 3/4 | 600 |
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.
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.
| Level | Bits [b0,b1] | Step |
|---|---|---|
| 0 | 0 / 1 | −45° / −225° |
| 1 | 00 / 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].
| Coded length below | Register width | Feedback taps |
|---|---|---|
| 1024 | 10 | 9, 2 |
| 4096 | 12 | 11, 5, 3, 0 |
| 8192 | 13 | 12, 3, 2, 0 |
| 32768 | 15 | 14, 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.
75-byte class 3 at level 0: 167 encoded symbols + 8 buffer-tail slots = 3.50 seconds of audio.
Timeline data
| Part | Symbols / slots | Duration (ms) |
|---|---|---|
| Reference | 1 | 20 |
| Preamble | 8 | 160 |
| Header | 8 | 160 |
| Extension header | 0 | 0 |
| Coded body | 150 | 3000 |
| Shaping ramp | 7 | 140 |
| Final silence | 1 | 20 |
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 !"#.
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.
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.
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.
| Setting / responsibility | Current behavior |
|---|---|
| Level / limiter | Level 0; crest limiter enabled |
| TXDELAY / contention slot | 100 ms / 100 ms |
| Channel detector | 480 Hz band compared with flanking guards and a qualified noise floor |
| Startup qualification | 2 seconds of qualifying windows; broadband occupancy already present can resemble a noisy floor |
| KISS host | One client; raw frames immediately; no HTTP service |
| Connection / mail | Tracker 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 | What it establishes | What remains open |
|---|---|---|
| Public corpus: four frames from three stations | Decoded frame bytes, FCS checks and measured regeneration comparisons; classes 3/4 at level 0 | Our station has no observed Robust Packet RF results |
| Generated waveforms | All 32 capacities at both levels; inversion and ±15 Hz offset cases; noise cases referenced to a 3 kHz bandwidth | Independent receiver interoperability and calibrated sensitivity |
| Software station/KISS tests | Frame transport, queueing, access decisions and simulated resource failures | Physical PTT/unkey guarantees and on-air connected-mode exchange |
| Containers | Generated framing and malformed-input vectors | The 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.
- SCS PTC-IIpro manual 4.0, §5.10 — nominal bandwidth, coding and throughput description.
- SCS Tracker/DSP TNC manual 1.7, %B — 1500 Hz transmit centre and manufacturer R300/R600 mode names. Those product commands are not hfmodem console commands.
- AX.25 v2.2 specification — frame fields and connected-link procedures used by the Tracker and AGWPE hosts.
- The KISS TNC, Mike Chepponis and Phil Karn — host framing, escaping and control commands.