Field Guide · term

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.

TDU (0x3) FS NID TDULC (0xF) FS NID 12 × Golay = 288b LC 12 Golay(24,12,8) codewords → 24 RS symbols → RS(24,12,13) → 72-bit Link Control word
A TDU is just frame sync and NID; a TDULC appends a 288-bit link-control region — twelve Golay codewords carrying the 24 symbols of an RS(24,12,13) codeword that recovers the 72-bit Link Control word.

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

  1. Project 25 — Wikipedia, on the P25 standard and its Phase 1 data units. 

See also