You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ADN-DMR-Peer-Server/docs/en/server/protocols/openbridge.md

4.3 KiB

OpenBridge (FreeBridge / DMRE)

DMRE and “OpenBridge v5”

On the wire, extended OpenBridge uses the DMRE opcode. The embedded protocol version byte inside the frame (see DMRE v5 layout) selects the layout: version > 4 is the 89-byte v5 format (hops, source repeater field, BLAKE2b MAC). In documentation and operator discussions, “DMRE v5” and “OpenBridge v5” refer to the same thing: DMRE frames with embedded version 5 (not the older short DMRD-only path).

Recommendation (ADN Systems network): All inter-server links that participate in the ADN Systems mesh should use DMRE v5 (PROTO_VER: 5 in YAML, which sets the negotiated VER / embedded version) and ENHANCED_OBP: true so BCSQ, BCKA, and multi-path loop control behave consistently. Peers (other servers) should be configured the same way. DMRD v1 (HMAC-only) remains available as a compatibility mode, but it is not the preferred mode for new ADN deployments.

What OpenBridge is

OpenBridge is a UDP protocol between servers (and some gateways). It carries DMR voice using:

  • DMRD version 1 — HMAC-SHA1 authenticated payload (compatibility mode); or
  • DMRE — extended frame with BLAKE2b MAC, embedded version, timestamps, hops, source server/repeater IDs, etc. (DMRE v5 = embedded version 5, recommended above).

This stack implements the OPENBRIDGE peer mode in udp_hbp.py and bridge routing in BridgeUseCases.

Ingress (DMRE)

  1. Verify BLAKE2b over the authenticated prefix.
  2. Check NETWORK_ID, TARGET socket / RELAX_CHECKS, slot (TS1 for OBP ingress).
  3. Increment hops; if > 10, drop and optionally send BCSQ.
  4. Rebuild a pseudo-DMRD for the bridge and call dmrd_received with hop metadata.

Egress (send_system)

  • Build DMRE or DMRD v1 depending on negotiated VER and embedded version.
  • Preserve hops, BER/RSSI, source_server / source_rptr as required for interop.

Loop control (multi-path mesh)

For group voice on OpenBridge:

  1. Finished / timeout 180 s — drop stale streams.
  2. Echo HBP — if a non-OBP system already has this stream_id in RX, this OBP path is treated as echo.
  3. Multiple OBP — among OBP legs with the same stream_id and TG, only the earliest 1ST time (min(perf_counter) ) forwards; others stop and may send BCSQ if ENHANCED_OBP is true.

BCSQ (Bridge Control — Source Quench)

  • Meaning: “Do not forward this stream_id on this TG to my leg.”
  • Sent by the losing OBP in loop control to its peer (not a global broadcast).
  • Honoured when forwarding to another OBP: if the destination’s _bcsq matches, skip send_system.

BCKA (keepalive)

  • ENHANCED_OBP — if peer keepalive is stale, block forward until refreshed.

Bridge forwarding (to_target)

Per destination row: dedupe (SYSTEM, TS), check BCSQ, BCKA, ACL, rewrite LC / TGID, force TS1 bit pattern for OBP, call send_system.

Ingress filters (group TG)

For group (and vcsbk) traffic, OpenBridge applies TG filters before traffic reaches the bridge router. Dropped streams may trigger BCSQ back to the peer. The exact rules differ between DMRD v1 and DMRE paths in udp_hbp.py; in general they reject traffic that is treated as local-only or wrong server for the destination, for example:

  • Low TG numbers (e.g. ≤ 79 on DMRE; DMRD v1 also combines 9990–9999, 92–199, 900999 in one check).
  • 9990–9999 and 900999 (service / local-server ranges on DMRE).
  • 92–199 unless the source server ID matches your server’s main ID (DMRE).
  • 80–89 and 800–899 unless the MCC prefix matches (DMRE).

Private (unit) calls are not subject to the same group-TG filter block in the same way; configure ACL separately.

Operator-oriented summary: Special numbers — OpenBridge ingress.

Monitor events (adn-monitor)

  • INGRESS — debug-only first sight per leg.
  • START — canonical after loop win (dashboard state).

See also: DMRE v5 layout, Monitoring.

Powered by TurnKey Linux.