From 30a094b7ca20bc728c8a297d754d87281eb774eb Mon Sep 17 00:00:00 2001 From: torlando-tech Date: Sun, 2 Nov 2025 12:56:46 -0500 Subject: [PATCH] use id based reassembler lookup on receiving notifications --- src/RNS/Interfaces/BLEInterface.py | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/RNS/Interfaces/BLEInterface.py b/src/RNS/Interfaces/BLEInterface.py index 6f64eb3..d8ceab3 100644 --- a/src/RNS/Interfaces/BLEInterface.py +++ b/src/RNS/Interfaces/BLEInterface.py @@ -1827,6 +1827,17 @@ class BLEInterface(Interface): peer_address: Address of peer that sent data data: Raw bytes received (might be fragment) """ + RNS.log(f"{self} received {len(data)} bytes from peer {peer_address}", RNS.LOG_EXTREME) + + # Look up peer identity to compute fragmenter key + peer_identity = self.address_to_identity.get(peer_address) + if not peer_identity: + RNS.log(f"{self} no identity for peer {peer_address}, dropping data", RNS.LOG_WARNING) + return + + # Compute identity-based fragmenter key (matches peripheral data handler) + frag_key = self._get_fragmenter_key(peer_identity, peer_address) + # Attempt reassembly complete_packet = None peer_name = None @@ -1834,9 +1845,10 @@ class BLEInterface(Interface): # HIGH #2: Lock ordering - get reassembler reference with frag_lock, release before processing # This prevents holding frag_lock during reassembly which could block other threads with self.frag_lock: - if peer_address not in self.reassemblers: - return # No reassembler for this peer - reassembler = self.reassemblers[peer_address] + if frag_key not in self.reassemblers: + RNS.log(f"{self} no reassembler for {peer_address} (key: {frag_key[:16]}), dropping data", RNS.LOG_WARNING) + return + reassembler = self.reassemblers[frag_key] # Process fragment without holding lock (reassemblers are per-peer, no contention) try: