Also known as: LCW, link control word, LCO, link control opcode
The P25 Link Control Word (LCW) is the 72-bit message carried in an
LDU1 voice frame — and, in terminator form, a
TDULC — that says who is talking on the voice channel and
in what mode.1 Its first octet is the Link Control Opcode (LCO, also written LCF for
Link Control Format), which names the word’s layout; the most common,
Group Voice Channel User (0x00), carries the destination talkgroup
and the source radio ID. The 72-bit word is protected by an inner
Hamming(10,6,3) layer under an outer
RS(24,12,13) code.
How it works
The LCO in octet 0 is the discriminator: it tells the parser how to read the remaining eight octets. GopherTrunk models the Group Voice Channel User layout directly and recognises the standard talker-alias opcodes that carry a radio’s display name across an active call as a header-plus-fragments sequence:
| LCO | Name | Content |
|---|---|---|
0x00 |
Group Voice Channel User | MFID, service options, talkgroup (octets 4–5), source ID (octets 6–8) |
0x15 |
Talker Alias — Header | Character set + total alias length |
0x16 |
Talker Alias — Block 1 | First alias-data fragment |
0x17 |
Talker Alias — Block 2 | Second alias-data fragment |
Many more LCOs are defined in TIA-102.AABF (unit-to-unit users, various broadcast and status words); GopherTrunk decodes the ones above and exposes the raw nine octets for any other opcode a caller wants to interpret. Whatever the opcode, the FEC is identical: the 72 content bits are the first 12 six-bit symbols of an RS(24,12,13) codeword, each symbol wrapped in a Hamming(10,6,3) inner codeword. On receive, the inner Hamming pass fixes single-bit hits, then the outer RS pass corrects up to six residual symbol errors before the octets are read.
In practice
The outer RS layer is not optional decoration. Residual bit errors that survive the single-error Hamming layer will corrupt the talkgroup or source under marginal SNR, and because the voice composer gates a call on the on-air talkgroup matching the granted one, a corrupted LCW ends the call early and fragments one transmission into many tiny recordings. Running RS(24,12,13) after the Hamming layer is what holds a marginal call together. The octet layout is equally unforgiving: an earlier GopherTrunk model placed the talkgroup at octets 2–3 and the source at 4–6, which made the talkgroup decode to the constant service-options byte and the real talkgroup land inside the misread source — the same early-termination symptom, from a one-octet shift.
Relevance to SDR
internal/radio/p25/phase1/link_control.go implements ParseLinkControl (the LCO-0 struct with
talkgroup and source), ParseLinkControlContent (raw octets for other opcodes), and
AssembleLinkControl (the symmetric encoder that computes RS parity so synthetic frames carry
valid FEC). The same 72-bit word is reached two ways — from LDU1 via
ExtractLCESBlocks and from a
TDULC terminator — so the LCW is the single most important
metadata unit on a P25 voice channel: it is what turns decoded audio into a labelled call with a
talkgroup and a source radio.
Sources
-
Project 25 — Wikipedia, on the P25 standard and its Phase 1 link-control signalling. ↩