Also known as: FLC, Full Link Control, FLCO
The DMR Full Link Control (FLC) is the 72-bit PDU that says who is talking to whom on a
DMR voice call.1 It appears in three places: the Voice LC Header (Data
Type 0x1) that opens a call, the Terminator with LC (0x2) that
closes it, and — spread across four fragments — the embedded LC of a
voice superframe. Its leading 6 bits are the FLCO
(Full Link Control Opcode) naming the block type; the remaining octets carry a feature-set ID,
service options, and the 24-bit destination and source addresses that identify the
talkgroup and radio.
The FLCO opcode table
GopherTrunk parses the FLC in internal/radio/dmr/flc.go. Octet 0 holds a 1-bit protect flag
(PF), a reserved bit, and the 6-bit FLCO; the common voice-call opcodes per ETSI TS 102 361-2
§7.1.1 Table 7.1 are:
| FLCO | Opcode | Meaning |
|---|---|---|
0x00 |
Group Voice Channel User | group call — destination is a talkgroup |
0x03 |
Unit-to-Unit Voice Channel User | private call — destination is a subscriber |
0x04 |
Talker Alias header | first block of the alias text |
0x08 |
GPS Info | source location |
0x30 |
Terminator | end-of-transmission link control |
Vendor extensions live behind a non-zero feature-set ID (FID — see
vendor FID); the opcodes above are the manufacturer-independent
set (FID 0). Octet 2, the service options, carries the emergency (bit 7) and
encryption/privacy (bit 6) flags that
FLC.AsGroupVoiceUser surfaces on a decoded group call.
Structure and FEC
The 9 FLC octets are the data portion of a 12-octet RS(12,9,4)
Reed–Solomon frame; the trailing 3 octets are parity, XOR-masked
with a context-specific seed. ParseFLC reads the leading 9 octets a
BPTC(196,96) or embedded-LC decode reconstructs.
In the current pass GopherTrunk relies on the BPTC / embedded-BPTC layer for error correction over
the same bits and treats RS(12,9) verification as a separate, self-contained follow-up
(dmr-rs-12-9), so ParseFLC decodes the FLC without failing it on the RS trailer.
Relevance to SDR
The FLC is where a DMR voice decode turns into a usable scanner event. From one recovered FLC, GopherTrunk learns the call type (group vs unit-to-unit from the FLCO), the talkgroup or destination subscriber, the source radio ID, and whether the traffic is encrypted or an emergency — everything a scanner needs to name and log the call. Because the same FLC arrives redundantly (the Voice LC Header, the embedded LC every superframe, and the Terminator), a receiver has repeated chances to recover it even if the opening header is lost mid-tune, which is what lets GopherTrunk label a call it joined late.
Sources
-
Digital mobile radio — Wikipedia, on the DMR standard and its link-control signalling. ↩