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
This commit is contained in:
Johnathan Corgan
2026-03-26 12:31:26 +00:00
parent cb6f263a1d
commit 8f1494853a
2 changed files with 24 additions and 1 deletions
+19
View File
@@ -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()
};
+5 -1
View File
@@ -401,6 +401,7 @@ impl<I: BleIo> BleTransport<I> {
self.packet_tx.clone(),
self.transport_id,
Arc::clone(&self.stats),
recv_mtu,
));
let conn = BleConnection {
@@ -491,6 +492,7 @@ impl<I: BleIo> BleTransport<I> {
packet_tx,
transport_id,
Arc::clone(&stats),
recv_mtu,
));
let conn = BleConnection {
@@ -757,6 +759,7 @@ async fn accept_loop<A>(
packet_tx.clone(),
transport_id,
Arc::clone(&stats),
recv_mtu,
));
let conn = BleConnection {
@@ -802,8 +805,9 @@ async fn receive_loop<S: BleStream>(
packet_tx: PacketTx,
transport_id: TransportId,
stats: Arc<BleStats>,
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) => {