Skip to content

Miura - #53

Open
ea5gvk wants to merge 6 commits into
razvanzeces:mainfrom
ea5gvk:miura
Open

Miura#53
ea5gvk wants to merge 6 commits into
razvanzeces:mainfrom
ea5gvk:miura

Conversation

@ea5gvk

@ea5gvk ea5gvk commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

Resumen del fix para GitHub
Archivo: crates/tetra-entities/src/umac/umac_bs.rs
Función: cmce_to_mac_chanalloc
Causa raíz: el elemento CHANNEL ALLOCATION que el BS envía al radio siempre codificaba mon_pattern: 0 junto con frame18_mon_pattern: Some(0). Según ETSI EN 300 392-2 (cláusula 9.6, "Monitoring pattern for transmitting MSs"), el BS puede asignar un patrón de monitorización numerado (MPN 1-3) al radio durante el establecimiento de la llamada, indicándole exactamente qué frames monitorizar del canal de control mientras transmite. Con mon_pattern=0, el Sepura interpretaba/aplicaba un régimen de monitorización más agresivo que con un patrón explícito — interrumpiendo su propia recepción/sincronismo lo suficiente como para que, tras ~8-9 segundos de PTT continuo, la señal recibida por el BS se degradara hasta disparar el timeout de inactividad UL (ul_inactivity_secs) y cortar la transmisión. El Motorola no se veía afectado por manejar ese mismo caso de forma más tolerante.

Joaquin Murcia and others added 6 commits August 15, 2026 16:42
…the floor

`check_network_media_inactivity` releases any call matching
`origin == Network && tx_active && last_activity_at > 10 s`, but
`last_activity_at` is only refreshed by inbound backhaul voice frames.

When a local MS takes the floor of a network-origin group call — answering an
ongoing call from the network — `origin` stays `Network` and `tx_active` stays
`true`, while no backhaul media is due any more: the audio now flows the other
way. The staleness test therefore fires mid-transmission and sends D-RELEASE to
the very radio that is talking, which the MS shows as a denied/aborted PTT. The
10 s countdown runs from the previous network speaker's last frame, so the cut
can land only a couple of seconds into the local transmission.

`grant_floor` already receives the local speaker's address (`Some(addr)` from
the U-TX DEMAND paths, `None` from the network path) but discarded it unless
the call origin was already `Local`. Record it as `local_floor` and exclude
those calls from the watchdog. UMAC's UL-inactivity timer already owns the
stuck-floor case for a local talker, as the existing doc comment notes.

Observed on a live cell running v0.4.0: a local transmission died after 99
voice frames with `releasing network group call_id=231 gssi=214 — no backhaul
media for >10s`, followed by a `call_id mismatch` once the freed timeslot was
reused. With the fix, local transmissions of 696 and 856 frames (42 s and 51 s)
complete normally and none of that fallout appears.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…floor

`handle_ul_inactivity_timeout_slot` picked whichever group call was active on
the carrier/timeslot, without checking who held the floor. When the floor
belongs to a network speaker there is no local radio to go missing — the audio
arrives over the backhaul — yet the timer forced D-TX CEASED on that call,
dropped it into hang-time and, through `notify_floor_released`, sent a
GROUP_IDLE for a call the network was still streaming.

The timer arms off UMAC's `last_ul_voice`, which is set by any voice burst
received in the traffic slot. A single stray uplink burst is therefore enough:
a radio keying up while the network speaker holds the floor, or a burst decoded
at the edge of coverage. `ul_inactivity_secs` (default 3) later, the in-progress
network call dies. That makes it look random, and the longer the QSO runs the
likelier it is to happen.

Observed on a live cell: network call 263 on gssi=21472 opened at 21:47:19 and
was streaming fine when `UL inactivity timeout on carrier=1600 ts=2` fired at
21:48:28, forcing TX ceased; hang-time expired 5 s later, the timeslot circuit
closed, and the next 12 s of backhaul voice were discarded with `dropping DL
voice on inactive circuit` — audible as the group going silent mid-QSO while
the network side kept talking.

Gate the lookup on `local_floor`, so each watchdog owns its own side: the
UL-inactivity timer covers a local talker that stops keying, while a
network-held floor is covered by `check_network_media_inactivity` and the
absolute call time-out. No coverage is lost — every call with a local speaker
has `local_floor == true`.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Added handling for D-RELEASE delivery via FACCH stealing to improve traffic channel teardown reliability.
Implement D-RELEASE delivery via FACCH stealing Sepura SRP2000 BUG FIX
…P2000

Changed monitoring pattern to 1 for stability with certain radios.
Update monitoring pattern to improve transmission stability Sepura SRP 2000
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants