From 6d37563a33635c5addedab1a86e4447dad4aeb2d Mon Sep 17 00:00:00 2001 From: Szymon Janc Date: Mon, 5 Mar 2018 17:16:35 +0100 Subject: [PATCH] device: Fix bearer selection with single mode controller 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 --- src/adapter.c | 8 ++++++++ src/adapter.h | 1 + src/device.c | 2 +- 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/adapter.c b/src/adapter.c index c892a0f..11f643e 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -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) diff --git a/src/adapter.h b/src/adapter.h index fefbfac..9e13e64 100644 --- a/src/adapter.h +++ b/src/adapter.h @@ -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); diff --git a/src/device.c b/src/device.c index 9dc0b26..ba61358 100644 --- a/src/device.c +++ b/src/device.c @@ -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; -- 2.7.4