Also known as: MFID, manufacturer TSBK, vendor opcode
P25 vendor TSBK opcodes are manufacturer-specific control-channel messages that live in
the same 6-bit opcode space as the standard OSP opcodes but
are selected by a non-standard MFID (manufacturer ID) byte.1 The same opcode value
decodes differently depending on the MFID: under MFID 0x90 (Motorola) opcode 0x02 is a
patch-group voice grant, while under the standard MFID it is a plain group-voice update. The
two vendors GopherTrunk decodes are Motorola (0x90) and L3Harris (0xA4); both are common
on public-safety systems built on Motorola or Harris
infrastructure.
MFID dispatch
Every TSBK begins with an MFID byte that GopherTrunk parses before the opcode. IsVendorMFID
reports whether it is a recognised vendor (0x90 or 0xA4); the vendor accessors
(AsMotorolaPatchGroup, AsHarrisRegroup, …) each re-check the MFID and opcode before
decoding, so a standard block can never fall through a vendor path. This keeps the vendor
layouts — which are the project’s working model rather than published spec — confined to one
file, internal/radio/p25/phase1/tsbk_vendor.go, where a correction stays local.
Notable vendor opcodes
| MFID | Opcode | Name | Carries |
|---|---|---|---|
0x90 |
0x00 |
Motorola Patch Group Add | Super-group address + up to 3 member talkgroups |
0x90 |
0x01 |
Motorola Patch Group Delete | Super-group address to cancel |
0x90 |
0x02 |
Motorola Patch Group Channel Grant | Patch (super-group) voice grant; grant-shaped payload |
0x90 |
0x03 |
Motorola Patch Group Grant Update | Two (channel, super-group) activity pairs |
0x90 |
0x05 |
Motorola Traffic Channel ID | Raw payload only — not field-decoded |
0x90 |
0x09 |
Motorola System Loading | Raw payload only — not field-decoded |
0x90/0xA4 |
0x15 |
Vendor Talker Alias | One fragment of a radio’s display name |
0xA4 |
0x00 |
Harris Dynamic Regroup | Regroup talkgroup + target unit |
The Motorola patch opcodes carry a multigroup / patch
super-group — several member talkgroups temporarily merged so they
share one call. The patch-grant opcodes reuse the standard group-voice grant and update
layouts exactly, differing only in that the group address is a super-group. The
talker-alias opcode 0x15 is MFID-agnostic, carrying one
block of a radio’s human-readable name to be reassembled across
several TSBKs.
Provenance
TIA-102 does not publish the vendor extensions, so these layouts are reverse-engineered
against the two mature open decoders, OP25 and SDRTrunk, and cross-checked against
field captures where a ground-truth event is known (for example the Motorola patch-grant
layout was confirmed against MMR/CBD captures in issue #376). Two Motorola opcodes —
Traffic Channel ID (0x05) and System Loading (0x09) — are emitted continuously but have
no trustworthy field layout in either reference decoder, so GopherTrunk names them for the
probe log and captures the raw bytes but decodes no fields. GopherTrunk mirrors SDRTrunk’s
per-manufacturer taxonomy (standard / Motorola / Harris / unknown) so an unrecognised vendor
block is reported with its MFID rather than silently misdecoded.
Sources
-
Project 25 — Wikipedia, on the P25 standard. Vendor opcode layouts are reverse-engineered against OP25 and SDRTrunk and are the project’s working model. ↩