device: Fix bearer selection with single mode controller 28/204928/1
authorSzymon Janc <szymon.janc@codecoup.pl>
Mon, 5 Mar 2018 16:16:35 +0000 (17:16 +0100)
committerAmit Purwar <amit.purwar@samsung.com>
Fri, 26 Apr 2019 10:29:15 +0000 (15:59 +0530)
If remote device is dual mode and advertises without "BR/EDR flag
not supported" set than device is marked as supporting BR/EDR
even if controller is doing LE only. This results in bluetoothd
trying to connect over BR/EDR since this is prefered transport
if none is connected.

Fix this by checking if adapter supports specified technology
before doing heuristic transport selection.

Change-Id: Icb51c40a4327759817c637f90821c0bea866edc4
Signed-off-by: Amit Purwar <amit.purwar@samsung.com>
src/adapter.c
src/adapter.h
src/device.c

index c892a0f..11f643e 100644 (file)
@@ -8694,6 +8694,14 @@ bool btd_adapter_get_discoverable(struct btd_adapter *adapter)
        return false;
 }
 
+bool btd_adapter_get_bredr(struct btd_adapter *adapter)
+{
+       if (adapter->current_settings & MGMT_SETTING_BREDR)
+               return true;
+
+       return false;
+}
+
 struct btd_gatt_database *btd_adapter_get_database(struct btd_adapter *adapter)
 {
        if (!adapter)
index fefbfac..9e13e64 100644 (file)
@@ -146,6 +146,7 @@ bool btd_adapter_get_pairable(struct btd_adapter *adapter);
 bool btd_adapter_get_powered(struct btd_adapter *adapter);
 bool btd_adapter_get_connectable(struct btd_adapter *adapter);
 bool btd_adapter_get_discoverable(struct btd_adapter *adapter);
+bool btd_adapter_get_bredr(struct btd_adapter *adapter);
 
 struct btd_gatt_database *btd_adapter_get_database(struct btd_adapter *adapter);
 
index 9dc0b26..ba61358 100644 (file)
@@ -2441,7 +2441,7 @@ static uint8_t select_conn_bearer(struct btd_device *dev)
         * Prefer BR/EDR if time is the same since it might be from an
         * advertisement with BR/EDR flag set.
         */
-       if (bredr_last <= le_last)
+       if (bredr_last <= le_last && btd_adapter_get_bredr(dev->adapter))
                return BDADDR_BREDR;
 
        return dev->bdaddr_type;