[PATCH] Bluetooth: Revert requirement for privacy during discovery

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



The discovery procedure was changed to use non-resolvable private
addresses to keep the system a little bit more private and with
that make it harder to track.

However as it turns out some Low Energy HID devices like the
Microsoft Arc Touch Mouse SE are using direct advertising for
the re-connection procedures. When using a non-resolvable private
address, these events are filtered out by the controller and it
becomes impossible to re-connect the HID device.

When the HID device is discoverable and ready for pairing,
everything works as expected and ADV_IND reports are used.

> HCI Event: LE Meta Event (0x3e) plen 43
    LE Advertising Report (0x02)
      Num reports: 1
      Event type: Connectable undirected - ADV_IND (0x00)
      Address type: Random (0x01)
      Address: E7:AD:BC:AA:1A:3B (Static)
      Data length: 31
      Name (complete): Arc Touch Mouse SE
      Appearance: Mouse (0x03c2)
      Flags: 0x05
        LE Limited Discoverable Mode
        BR/EDR Not Supported
      16-bit Service UUIDs (complete): 1 entry
        Human Interface Device (0x1812)
      RSSI: -57 dBm (0xc7)
> HCI Event: LE Meta Event (0x3e) plen 12
    LE Advertising Report (0x02)
      Num reports: 1
      Event type: Scan response - SCAN_RSP (0x04)
      Address type: Random (0x01)
      Address: E7:AD:BC:AA:1A:3B (Static)
      Data length: 0
      RSSI: -57 dBm (0xc7)

Once the HID device is paired and got disconnected, it only
tries to reconnect using ADV_DIRECT_IND reports.

> HCI Event: LE Meta Event (0x3e) plen 12
    LE Advertising Report (0x02)
      Num reports: 1
      Event type: Connectable directed - ADV_DIRECT_IND (0x01)
      Address type: Random (0x01)
      Address: E7:AD:BC:AA:1A:3B (Static)
      Data length: 0
      RSSI: -53 dBm (0xcb)

These reports are filtered out by the controller if they do
not match the address. When using a non-resolvable private
address to decrease trackability, the controller will not
forward these reports up to the host stack. This means that
re-connection is not possible.

The solution to this problem is to use passive background
scanning with the identity address. Until the support for
true background scanning is available, turn the privacy
requirement for discovery off. It will be turned back on
once HID devices are connected via background scanning.

Signed-off-by: Marcel Holtmann <marcel@xxxxxxxxxxxx>
Cc: stable@xxxxxxxxxxxxxxx # 3.15.x
---
 net/bluetooth/mgmt.c | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
index b9d193157a27..7e9471117e72 100644
--- a/net/bluetooth/mgmt.c
+++ b/net/bluetooth/mgmt.c
@@ -3571,8 +3571,15 @@ static int start_discovery(struct sock *sk, struct hci_dev *hdev,
 		/* All active scans will be done with either a resolvable
 		 * private address (when privacy feature has been enabled)
 		 * or unresolvable private address.
+		 *
+		 * However until passive background scanning is fully
+		 * integrated set require_privacy to false. This allows
+		 * to receive direct advertising reports during discovery.
+		 *
+		 * Once auto-connection handling makes use of background
+		 * scanning, the require_privacy can be set to true.
 		 */
-		err = hci_update_random_address(&req, true, &own_addr_type);
+		err = hci_update_random_address(&req, false, &own_addr_type);
 		if (err < 0) {
 			err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
 					 MGMT_STATUS_FAILED);
-- 
1.9.3

--
To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux