From f6fe4992a094f7765d58fb2b6ccb8d8530e2d3be Mon Sep 17 00:00:00 2001 From: Johan Hedberg Date: Wed, 16 Jul 2014 15:52:28 +0300 Subject: [PATCH] core: Bind connectable mode to discoverable for kernel connection control When the kernel supports the BR/EDR whitelist we don't need to always be connectable in order to receive incoming connections. Therefore, bind the connectable mode to the discoverable mode whenever kernel connection control is supported. To avoid unnecessary mgmt and HCI commands disabling discoverable is simply done by disabling connectable as it has the effect of disabling both settings. --- src/adapter.c | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/adapter.c b/src/adapter.c index bd2092103..9f063b4c4 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -562,6 +562,15 @@ static bool set_discoverable(struct btd_adapter *adapter, uint8_t mode, DBG("sending set mode command for index %u", adapter->dev_id); + if (kernel_conn_control) { + if (mode) + set_mode(adapter, MGMT_OP_SET_CONNECTABLE, mode); + else + /* This also disables discoverable so we're done */ + return set_mode(adapter, MGMT_OP_SET_CONNECTABLE, + mode); + } + if (mgmt_send(adapter->mgmt, MGMT_OP_SET_DISCOVERABLE, adapter->dev_id, sizeof(cp), &cp, set_mode_complete, adapter, NULL) > 0) @@ -1983,6 +1992,18 @@ static void property_set_mode(struct btd_adapter *adapter, uint32_t setting, len = sizeof(mode); break; case MGMT_SETTING_DISCOVERABLE: + if (kernel_conn_control) { + if (mode) { + set_mode(adapter, MGMT_OP_SET_CONNECTABLE, + mode); + } else { + opcode = MGMT_OP_SET_CONNECTABLE; + param = &mode; + len = sizeof(mode); + break; + } + } + memset(&cp, 0, sizeof(cp)); cp.val = mode; if (cp.val) @@ -6908,7 +6929,8 @@ static void read_info_complete(uint8_t status, uint16_t length, set_mode(adapter, MGMT_OP_SET_LE, 0x01); set_mode(adapter, MGMT_OP_SET_PAIRABLE, 0x01); - set_mode(adapter, MGMT_OP_SET_CONNECTABLE, 0x01); + if (!kernel_conn_control) + set_mode(adapter, MGMT_OP_SET_CONNECTABLE, 0x01); if (adapter->stored_discoverable && !adapter->discoverable_timeout) set_discoverable(adapter, 0x01, 0); -- 2.47.3