|
|
# OpenBridge (FreeBridge / DMRE)
|
|
|
|
|
|
## DMRE y «OpenBridge v5» {#dmre-and-openbridge-v5}
|
|
|
|
|
|
En cable, OpenBridge extendido usa el opcode **`DMRE`**. El **byte de versión de protocolo embebido** dentro de la trama (ver [disposición DMRE v5](dmre-v5.md)) selecciona el diseño: **versión > 4** es el formato **v5 de 89 bytes** (saltos, campo repetidor fuente, MAC BLAKE2b). En documentación y conversaciones de operadores, **«DMRE v5»** y **«OpenBridge v5»** son lo mismo: **tramas DMRE con versión embebida 5** (no el camino corto solo DMRD).
|
|
|
|
|
|
**Recomendación (red ADN Systems):** todos los enlaces inter-servidor que participen en la malla **ADN Systems** deberían usar **DMRE v5** (`PROTO_VER: 5` en YAML, que fija **VER** / versión embebida negociada) y **`ENHANCED_OBP: true`** para que **BCSQ**, **BCKA** y el control de bucle multipath se comporten igual. Los **pares** (otros servidores) deben configurarse igual. **DMRD v1** (solo HMAC) permanece como modo de compatibilidad, pero **no** es el modo preferido para nuevos despliegues ADN.
|
|
|
|
|
|
## Qué es OpenBridge
|
|
|
|
|
|
**OpenBridge** es un protocolo UDP entre **servidores** (y algunos gateways). Transporta voz DMR usando:
|
|
|
|
|
|
- **`DMRD`** versión 1 — carga autenticada HMAC-SHA1 (modo de compatibilidad); o
|
|
|
- **`DMRE`** — trama extendida con MAC **BLAKE2b**, versión embebida, marcas de tiempo, **saltos**, IDs servidor/repetidor de origen, etc. (**DMRE v5** = versión embebida 5, recomendada arriba).
|
|
|
|
|
|
Esta pila implementa el modo par **OPENBRIDGE** en **`udp_hbp.py`** y el enrutado de voz en **`RoutingUseCases`** (`application/routing/`, `application/subscription/`).
|
|
|
|
|
|
## Ingreso (DMRE)
|
|
|
|
|
|
1. Verificar **BLAKE2b** sobre el prefijo autenticado.
|
|
|
2. Comprobar **NETWORK_ID**, socket **TARGET** / `RELAX_CHECKS`, **slot** (TS1 para ingreso OBP).
|
|
|
3. Incrementar **saltos**; si **> 10**, descartar y opcionalmente enviar **BCSQ**.
|
|
|
4. Reconstruir un pseudo-**DMRD** para el bridge y llamar **`dmrd_received`** con metadatos de salto.
|
|
|
|
|
|
## Egreso (`send_system`)
|
|
|
|
|
|
- Construir **DMRE** o **DMRD** v1 según **VER** negociada y versión embebida.
|
|
|
- Preservar **saltos**, **BER/RSSI**, **source_server** / **source_rptr** según haga falta para interoperar.
|
|
|
|
|
|
## Control de bucle (malla multipath)
|
|
|
|
|
|
Para voz de **grupo** en OpenBridge:
|
|
|
|
|
|
1. **Finalizado** / **timeout 180 s** — descartar flujos obsoletos.
|
|
|
2. **Eco HBP** — si un sistema no-OBP ya tiene este `stream_id` en RX, esta pata OBP se trata como eco.
|
|
|
3. **Varios OBP** — entre patas OBP con el mismo `stream_id` y TG, **solo el `1ST` más temprano** (`min(perf_counter)`) **reenvía**; las demás paran y pueden enviar **BCSQ** si **`ENHANCED_OBP`** es true.
|
|
|
|
|
|
## BCSQ (Bridge Control — Source Quench)
|
|
|
|
|
|
- **Significado:** «No reenvíes este **`stream_id`** en esta **TG** hacia mi pata.»
|
|
|
- **Lo envía** el OBP **perdedor** en control de bucle hacia su **par** (no es broadcast global).
|
|
|
- **Se respeta** al reenviar a otro OBP: si el `_bcsq` del destino coincide, **omitir** `send_system`.
|
|
|
|
|
|
## BCKA (keepalive)
|
|
|
|
|
|
- **ENHANCED_OBP** — si el keepalive del par está obsoleto, bloquear reenvío hasta que se refresque.
|
|
|
|
|
|
## Reenvío de bridge (`to_target`)
|
|
|
|
|
|
Por fila de destino: deduplicar `(SYSTEM, TS)`, comprobar **BCSQ**, **BCKA**, **ACL**, reescribir **LC** / **TGID**, forzar patrón de bit **TS1** para OBP, llamar **`send_system`**.
|
|
|
|
|
|
## Filtros de ingreso (TG de grupo) {#ingress-filters-group-tg}
|
|
|
|
|
|
Para tráfico de **grupo** (y **vcsbk**), OpenBridge aplica **filtros TG** antes de que el flujo llegue al router de bridges. Los flujos descartados pueden disparar **BCSQ** hacia el par. Las reglas exactas difieren entre **DMRD v1** y **DMRE** en `udp_hbp.py`; en general rechazan tráfico tratado como **solo local** o **servidor incorrecto** para el destino, por ejemplo:
|
|
|
|
|
|
- TG bajas (p. ej. **≤ 79** en DMRE; DMRD v1 también combina **9990–9999**, **92–199**, **900999** en una comprobación).
|
|
|
- **9990–9999** y **900999** (rangos de servicio / servidor local en DMRE).
|
|
|
- **92–199** salvo que el ID de **servidor de origen** coincida con el ID principal de tu servidor (DMRE).
|
|
|
- **80–89** y **800–899** salvo que el prefijo **MCC** coincida (DMRE).
|
|
|
|
|
|
Las llamadas **privadas (unitarias)** no están sujetas al mismo bloqueo de filtro TG de grupo de la misma forma; configura **ACL** por separado.
|
|
|
|
|
|
Resumen orientado al operador: [Números especiales — ingreso OpenBridge](../user-guide/special-numbers.md#openbridge-ingress--group-tg-filters).
|
|
|
|
|
|
## Eventos de monitor (adn-monitor)
|
|
|
|
|
|
- **INGRESS** — primera vista de depuración por pata.
|
|
|
- **START** — canónico **después** de ganar el bucle (estado del panel).
|
|
|
|
|
|
Ver también: [disposición DMRE v5](dmre-v5.md), [Monitor](../user-guide/monitoring.md).
|