Miura - #53
Open
ea5gvk wants to merge 6 commits into
Open
Conversation
…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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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.