Also known as: TDU, TDULC, terminator data unit, terminator with link control
The P25 Terminator Data Unit is the frame that closes a P25 Phase 1 voice transmission.1
It comes in two forms distinguished by DUID: the TDU (0x3) is a
bare terminator — frame sync and NID marking end-of-transmission
with no further payload — while the TDULC (0xF) also carries a 72-bit
Link Control word, the same LCW an
LDU1 carries but behind a different FEC: inner
Golay(24,12,8) codewords under an outer
RS(24,12,13) code.
How it works
Both terminators start like any P25 frame, with the frame sync and the BCH-protected NID whose DUID identifies the type. The TDU stops there — its purpose is purely to signal that voice has ended, so a receiver can close the call and release the channel. The TDULC adds a link-control region immediately after the NID in the status-stripped payload: 288 bits of twelve Golay(24,12,8) codewords. Each Golay codeword’s 12 data bits carry two 6-bit RS symbols, so the twelve codewords yield the 24 symbols of an outer RS(24,12,13) codeword; RS-decoding that recovers the 12 information symbols — the 72-bit (9-octet) Link Control word. The decode fails safe: if the layout or FEC does not resolve, the outer RS flags the word uncorrectable rather than surfacing a garbled Link Control.
In practice
The TDULC matters because some Link Control content rides there rather than in the voice
frames. On Motorola Phase 1 systems, talker-alias Link Control (LCO 0x15 header, 0x17 data)
appears primarily in the terminator, not LDU1 — so a decoder that returns at the terminator
without parsing its Link Control misses the alias entirely. GopherTrunk’s TDULC extractor closes
that gap, feeding the recovered nine LC octets into the same carriage-independent talker-alias
buffer the LDU1 path uses.
One caveat is documented honestly in the source: the exact on-air bit interleaving of the TDULC LC region is not reachable from the post-FEC ground-truth dumps the project has, and no IQ fixture is committed, so GopherTrunk currently reads the twelve Golay codewords sequentially without a separate deinterleave pass. The RS/Golay math is exact and round-trip tested; if a capture later reveals an interleave, only that one seam changes, and a wrong layout fails safe — the outer RS rejects the word rather than emitting junk.
Relevance to SDR
internal/radio/p25/phase1/tdulc.go implements ExtractTDULCLinkControl, chaining
framing.GolayDecode24_12 over the twelve inner codewords into framing.DecodeRS24_12 for the
outer layer, and returns the LC opcode, the nine content octets, and a corrected-error count.
The bare TDU needs no such parsing — its value is the DUID alone. Together the two terminators
tell a scanner when a call ends and, in the TDULC case, deliver a last Link Control payload
(often the talker’s alias) that would otherwise be lost at the tail of the transmission.
Sources
-
Project 25 — Wikipedia, on the P25 standard and its Phase 1 data units. ↩