2023-12-20 17:40:59

by Luiz Augusto von Dentz

[permalink] [raw]
Subject: [PATCH BlueZ v2] adapter: Fix link key address type for old kernels

From: Luiz Augusto von Dentz <[email protected]>

On old kernels only BDADDR_BREDR is supported so this attempts to detect
that and retry.

Fixes: https://github.com/bluez/bluez/issues/686
---
src/adapter.c | 59 ++++++++++++++++++++++++++++++++++++++-------------
1 file changed, 44 insertions(+), 15 deletions(-)

diff --git a/src/adapter.c b/src/adapter.c
index ee70b00d249e..022390f0d95d 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -311,6 +311,7 @@ struct btd_adapter {
bool pincode_requested; /* PIN requested during last bonding */
GSList *connections; /* Connected devices */
GSList *devices; /* Devices structure pointers */
+ GSList *load_keys; /* Devices keys to be loaded */
GSList *connect_list; /* Devices to connect when found */
struct btd_device *connect_le; /* LE device waiting to be connected */
sdp_list_t *services; /* Services associated to adapter */
@@ -4284,6 +4285,9 @@ static int set_privacy(struct btd_adapter *adapter, uint8_t privacy)
return -1;
}

+static void load_link_keys(struct btd_adapter *adapter, bool debug_keys,
+ bool retry);
+
static void load_link_keys_complete(uint8_t status, uint16_t length,
const void *param, void *user_data)
{
@@ -4293,18 +4297,31 @@ static void load_link_keys_complete(uint8_t status, uint16_t length,
btd_error(adapter->dev_id,
"Failed to load link keys for hci%u: %s (0x%02x)",
adapter->dev_id, mgmt_errstr(status), status);
+
+ if (status == MGMT_STATUS_INVALID_PARAMS) {
+ load_link_keys(adapter, btd_opts.debug_keys, true);
+ /* Release keys after retry since we shall only retry
+ * once.
+ */
+ goto done;
+ }
+
return;
}

DBG("link keys loaded for hci%u", adapter->dev_id);
+
+done:
+ g_slist_free_full(adapter->load_keys, g_free);
+ adapter->load_keys = NULL;
}

-static void load_link_keys(struct btd_adapter *adapter, GSList *keys,
- bool debug_keys)
+static void load_link_keys(struct btd_adapter *adapter, bool debug_keys,
+ bool retry)
{
struct mgmt_cp_load_link_keys *cp;
struct mgmt_link_key_info *key;
- size_t key_count, cp_size;
+ size_t count, cp_size;
unsigned int id;
GSList *l;

@@ -4318,12 +4335,14 @@ static void load_link_keys(struct btd_adapter *adapter, GSList *keys,
if (!(adapter->supported_settings & MGMT_SETTING_BREDR))
return;

- key_count = g_slist_length(keys);
+ count = g_slist_length(adapter->load_keys);
+ if (!count)
+ return;

- DBG("hci%u keys %zu debug_keys %d", adapter->dev_id, key_count,
- debug_keys);
+ DBG("hci%u keys %zu debug_keys %d retry %s", adapter->dev_id, count,
+ debug_keys, retry ? "true" : "false");

- cp_size = sizeof(*cp) + (key_count * sizeof(*key));
+ cp_size = sizeof(*cp) + (count * sizeof(*key));

cp = g_try_malloc0(cp_size);
if (cp == NULL) {
@@ -4341,13 +4360,18 @@ static void load_link_keys(struct btd_adapter *adapter, GSList *keys,
* behavior for debug keys.
*/
cp->debug_keys = debug_keys;
- cp->key_count = htobs(key_count);
+ cp->key_count = htobs(count);

- for (l = keys, key = cp->keys; l != NULL; l = g_slist_next(l), key++) {
+ for (l = adapter->load_keys, key = cp->keys; l != NULL;
+ l = g_slist_next(l), key++) {
struct link_key_info *info = l->data;

bacpy(&key->addr.bdaddr, &info->bdaddr);
- key->addr.type = info->bdaddr_type;
+ /* Old kernels might only support loading with type set to
+ * BDADDR_BREDR so on retry set that instead of using the stored
+ * info.
+ */
+ key->addr.type = retry ? BDADDR_BREDR : info->bdaddr_type;
key->type = info->type;
memcpy(key->val, info->key, 16);
key->pin_len = info->pin_len;
@@ -4359,9 +4383,12 @@ static void load_link_keys(struct btd_adapter *adapter, GSList *keys,

g_free(cp);

- if (id == 0)
+ if (id == 0) {
btd_error(adapter->dev_id, "Failed to load link keys for hci%u",
adapter->dev_id);
+ g_slist_free_full(adapter->load_keys, g_free);
+ adapter->load_keys = NULL;
+ }
}

static void load_ltks_complete(uint8_t status, uint16_t length,
@@ -4873,7 +4900,6 @@ done:
static void load_devices(struct btd_adapter *adapter)
{
char dirname[PATH_MAX];
- GSList *keys = NULL;
GSList *ltks = NULL;
GSList *irks = NULL;
GSList *params = NULL;
@@ -4964,7 +4990,8 @@ static void load_devices(struct btd_adapter *adapter)
}

if (key_info)
- keys = g_slist_append(keys, key_info);
+ adapter->load_keys = g_slist_append(adapter->load_keys,
+ key_info);

if (ltk_info)
ltks = g_slist_append(ltks, ltk_info);
@@ -5013,8 +5040,7 @@ free:

closedir(dir);

- load_link_keys(adapter, keys, btd_opts.debug_keys);
- g_slist_free_full(keys, g_free);
+ load_link_keys(adapter, btd_opts.debug_keys, false);

load_ltks(adapter, ltks);
g_slist_free_full(ltks, g_free);
@@ -6930,6 +6956,9 @@ static void adapter_remove(struct btd_adapter *adapter)
g_slist_free(adapter->devices);
adapter->devices = NULL;

+ g_slist_free(adapter->load_keys);
+ adapter->load_keys = NULL;
+
discovery_cleanup(adapter, 0);

unload_drivers(adapter);
--
2.43.0



2023-12-20 19:11:46

by bluez.test.bot

[permalink] [raw]
Subject: RE: [BlueZ,v2] adapter: Fix link key address type for old kernels

This is automated email and please do not reply to this email!

Dear submitter,

Thank you for submitting the patches to the linux bluetooth mailing list.
This is a CI test results with your patch series:
PW Link:https://patchwork.kernel.org/project/bluetooth/list/?series=811910

---Test result---

Test Summary:
CheckPatch PASS 0.74 seconds
GitLint PASS 0.31 seconds
BuildEll PASS 24.93 seconds
BluezMake PASS 739.73 seconds
MakeCheck PASS 11.51 seconds
MakeDistcheck PASS 162.69 seconds
CheckValgrind PASS 224.54 seconds
CheckSmatch PASS 330.54 seconds
bluezmakeextell PASS 107.30 seconds
IncrementalBuild PASS 702.43 seconds
ScanBuild PASS 954.80 seconds



---
Regards,
Linux Bluetooth

2023-12-20 19:40:31

by patchwork-bot+bluetooth

[permalink] [raw]
Subject: Re: [PATCH BlueZ v2] adapter: Fix link key address type for old kernels

Hello:

This patch was applied to bluetooth/bluez.git (master)
by Luiz Augusto von Dentz <[email protected]>:

On Wed, 20 Dec 2023 12:40:42 -0500 you wrote:
> From: Luiz Augusto von Dentz <[email protected]>
>
> On old kernels only BDADDR_BREDR is supported so this attempts to detect
> that and retry.
>
> Fixes: https://github.com/bluez/bluez/issues/686
>
> [...]

Here is the summary with links:
- [BlueZ,v2] adapter: Fix link key address type for old kernels
https://git.kernel.org/pub/scm/bluetooth/bluez.git/?id=7ad5669402c9

You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html