From 8f1494853af28fe5c2bc12eea5636d3221a23276 Mon Sep 17 00:00:00 2001 From: Johnathan Corgan Date: Thu, 26 Mar 2026 12:31:26 +0000 Subject: [PATCH] BLE transport: recv buffer sizing, advertising interval, socket tuning, PHY logging - Size receive buffer from negotiated recv_mtu instead of hardcoded 4096 (prevents silent truncation if MTU exceeds buffer size) - Set advertising interval to 400-600ms for deterministic behavior instead of depending on BlueZ driver defaults - Enable power_forced_active on L2CAP sockets to prevent sniff-mode latency spikes during data transfer (best-effort, logged on failure) - Log negotiated PHY and MTU at connection establishment for diagnostics --- src/transport/ble/io.rs | 19 +++++++++++++++++++ src/transport/ble/mod.rs | 6 +++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/transport/ble/io.rs b/src/transport/ble/io.rs index 86df395..1968b74 100644 --- a/src/transport/ble/io.rs +++ b/src/transport/ble/io.rs @@ -165,6 +165,13 @@ mod bluer_impl { let recv_mtu = conn .recv_mtu() .map_err(|e| map_io_err("recv_mtu", e))? as u16; + + // Log negotiated PHY for diagnostics (2M vs 1M) + match conn.as_ref().phy() { + Ok(phy) => debug!(addr = %remote, phy, send_mtu, recv_mtu, "BLE connection established"), + Err(_) => debug!(addr = %remote, send_mtu, recv_mtu, "BLE connection established (PHY query unsupported)"), + } + Ok(Self { conn, remote, send_mtu, recv_mtu }) } } @@ -339,6 +346,11 @@ mod bluer_impl { .set_recv_mtu(self.mtu) .map_err(|e| map_io_err("set_recv_mtu", e))?; + // Prevent sniff mode to reduce latency during data transfer + if let Err(e) = listener.as_ref().set_power_forced_active(true) { + debug!(error = %e, "BLE listener: set_power_forced_active not supported"); + } + debug!(psm, mtu = self.mtu, "BLE listener bound"); Ok(BluerAcceptor { @@ -363,6 +375,11 @@ mod bluer_impl { .set_recv_mtu(self.mtu) .map_err(|e| map_io_err("set_recv_mtu", e))?; + // Prevent sniff mode to reduce latency during data transfer + if let Err(e) = socket.set_power_forced_active(true) { + debug!(error = %e, "BLE connect: set_power_forced_active not supported"); + } + let conn = socket .connect(target_sa) .await @@ -381,6 +398,8 @@ mod bluer_impl { s }, local_name: Some("fips".to_string()), + min_interval: Some(std::time::Duration::from_millis(400)), + max_interval: Some(std::time::Duration::from_millis(600)), ..Default::default() }; diff --git a/src/transport/ble/mod.rs b/src/transport/ble/mod.rs index 5311c9e..f87b739 100644 --- a/src/transport/ble/mod.rs +++ b/src/transport/ble/mod.rs @@ -401,6 +401,7 @@ impl BleTransport { self.packet_tx.clone(), self.transport_id, Arc::clone(&self.stats), + recv_mtu, )); let conn = BleConnection { @@ -491,6 +492,7 @@ impl BleTransport { packet_tx, transport_id, Arc::clone(&stats), + recv_mtu, )); let conn = BleConnection { @@ -757,6 +759,7 @@ async fn accept_loop( packet_tx.clone(), transport_id, Arc::clone(&stats), + recv_mtu, )); let conn = BleConnection { @@ -802,8 +805,9 @@ async fn receive_loop( packet_tx: PacketTx, transport_id: TransportId, stats: Arc, + recv_mtu: u16, ) { - let mut buf = vec![0u8; 4096]; + let mut buf = vec![0u8; recv_mtu as usize]; loop { match stream.recv(&mut buf).await { Ok(0) => {