fix: TG 4000 before ACL, private call END report, pvt RX_START

- Run dynamic-bridge deactivate for dst 4000 before ACL (group/unit/vcsbk; master+peer)
- Send PRIVATE VOICE,END,RX to report; set slot RX_START on private stream start; fix slot STATUS setdefault
- dmrd_received: return early for private call to 4000 (legacy parity)
pull/4/head
Rodrigo Pérez 6 months ago
parent 94bc1dccd5
commit 9d5e7d00c0

@ -1084,6 +1084,9 @@ class BridgeUseCases:
"""Called by UDP MASTER when DMRD is received. Forward to other systems in same bridge (to_target)."""
if not self._send_to_system:
return
# Legacy bridge_master 3080–3085: private call to ID 4000 only disconnects dynamics; do not route as PC.
if call_type == "unit" and int_id(dst_id) == 4000:
return
if call_type == "unit":
self._pvt_call_received(system_name, peer_id, rf_src, dst_id, seq, slot, frame_type, dtype_vseq, stream_id, data)
return
@ -1482,7 +1485,9 @@ class BridgeUseCases:
protocols = self._get_protocols() if self._get_protocols else {}
source_proto = protocols.get(system_name)
source_status = getattr(source_proto, "STATUS", {}) if source_proto else {}
slot_st = source_status.get(slot, {})
if source_proto:
source_status.setdefault(slot, {})
slot_st = source_status[slot] if source_proto and slot in source_status else {}
if stream_id != slot_st.get("RX_STREAM_ID"):
if (slot_st.get("RX_TYPE") != HBPF_SLT_VTERM) and (pkt_time < (slot_st.get("RX_TIME", 0) + STREAM_TO)) and (rf_src != slot_st.get("RX_RFS")):
logger.warning(
@ -1490,6 +1495,7 @@ class BridgeUseCases:
system_name, int_id(stream_id), int_id(rf_src), int_id(peer_id), int_id(dst_id), slot,
)
return
slot_st["RX_START"] = pkt_time
if dst_id in sub_map:
if sub_map[dst_id][0] != system_name:
self._pvt_targets = [sub_map[dst_id][0]]
@ -1573,10 +1579,27 @@ class BridgeUseCases:
"(%s) *PRIVATE CALL END* STREAM ID: %s SUB: %s PEER: %s DST: %s, TS %s, Duration: %.2f",
system_name, int_id(stream_id), int_id(rf_src), int_id(peer_id), int_id(dst_id), slot, call_duration,
)
slot_st["RX_PEER"] = peer_id
slot_st["RX_SEQ"] = seq
slot_st["RX_RFS"] = rf_src
slot_st["RX_TYPE"] = dtype_vseq
slot_st["RX_TGID"] = dst_id
slot_st["RX_TIME"] = pkt_time
slot_st["RX_STREAM_ID"] = stream_id
report = self._report_factory
if report and hasattr(report, "send_bridge_event"):
try:
report.send_bridge_event(
"PRIVATE VOICE,END,RX,{},{},{},{},{},{},{:.2f}".format(
system_name,
int_id(stream_id),
int_id(peer_id),
int_id(rf_src),
slot,
int_id(dst_id),
call_duration,
)
)
except Exception:
pass
if slot_st:
slot_st["RX_PEER"] = peer_id
slot_st["RX_SEQ"] = seq
slot_st["RX_RFS"] = rf_src
slot_st["RX_TYPE"] = dtype_vseq
slot_st["RX_TGID"] = dst_id
slot_st["RX_TIME"] = pkt_time
slot_st["RX_STREAM_ID"] = stream_id

@ -391,6 +391,18 @@ class HBPProtocol(DatagramProtocol):
logger.warning("(%s) CALL DROPPED AS STREAM ID IS NULL FROM SUBSCRIBER %s", self._system, int_id(_rf_src))
return
pkt_time = time.time()
_int_dst_id = int_id(_dst_id)
# TG / private ID 4000: deactivate dynamic bridges (legacy bridge_master 3080–3177).
# Must run before ACL: private 4000 is rarely in TG allow lists.
if _int_dst_id == 4000 and self._on_deactivate_dynamic_bridges:
_kind = "Private call to ID" if _call_type == "unit" else "Group call to TG"
logger.info(
"(%s) %s 4000 received on TS %s — deactivating all dynamic bridges",
self._system,
_kind,
_slot,
)
self._on_deactivate_dynamic_bridges(self._system)
# ACL (legacy order and _laststrid)
if self._router and _global.get("USE_ACL"):
if not self._router.acl_check(_rf_src, _global.get("SUB_ACL", (True, []))):
@ -428,10 +440,6 @@ class HBPProtocol(DatagramProtocol):
sub_map = self._CONFIG.get("_SUB_MAP")
if sub_map is not None:
sub_map[_rf_src] = (self._system, _slot, pkt_time)
# TG 4000: deactivate all dynamic bridges (legacy routerHBP)
_int_dst_id = int_id(_dst_id)
if _int_dst_id == 4000 and self._on_deactivate_dynamic_bridges:
self._on_deactivate_dynamic_bridges(self._system)
# TG 9991-9999: information services (legacy peer_datagramReceived, also needed in MASTER)
if 9991 <= _int_dst_id <= 9999 and self._on_play_file_request:
if _frame_type == HBPF_DATA_SYNC and _dtype_vseq == HBPF_SLT_VHEAD:
@ -741,6 +749,16 @@ class HBPProtocol(DatagramProtocol):
logger.warning("(%s) CALL DROPPED AS STREAM ID IS NULL FROM SUBSCRIBER %s", self._system, int_id(_rf_src))
return
pkt_time = time.time()
_int_dst_id = int_id(_dst_id)
if _int_dst_id == 4000 and self._on_deactivate_dynamic_bridges:
_kind = "Private call to ID" if _call_type == "unit" else "Group call to TG"
logger.info(
"(%s) %s 4000 received on TS %s — deactivating all dynamic bridges",
self._system,
_kind,
_slot,
)
self._on_deactivate_dynamic_bridges(self._system)
_global = self._CONFIG.get("GLOBAL", {})
if self._router and _global.get("USE_ACL"):
if not self._router.acl_check(_rf_src, _global.get("SUB_ACL", (True, []))):
@ -778,10 +796,6 @@ class HBPProtocol(DatagramProtocol):
sub_map = self._CONFIG.get("_SUB_MAP")
if sub_map is not None:
sub_map[_rf_src] = (self._system, _slot, pkt_time)
_int_dst_id = int_id(_dst_id)
# TG 4000: deactivate all dynamic bridges (legacy routerHBP)
if _int_dst_id == 4000 and self._on_deactivate_dynamic_bridges:
self._on_deactivate_dynamic_bridges(self._system)
if self._on_play_file_request and _frame_type == HBPF_DATA_SYNC and _dtype_vseq == HBPF_SLT_VHEAD:
if 9991 <= _int_dst_id <= 9999:
reactor.callInThread(self._on_play_file_request, str(_int_dst_id), self._system)

Loading…
Cancel
Save

Powered by TurnKey Linux.