From: Michael Brudevold <puffy.taco@gmail.com>
To: linux-bluetooth@vger.kernel.org
Cc: Michael Brudevold <michael.brudevold@veranexsolutions.com>
Subject: [PATCH v2 2/3] Accept LE formatted EIR data with neard plugin
Date: Fri, 10 Jun 2022 17:11:23 -0500 [thread overview]
Message-ID: <20220610221124.18591-3-puffy.taco@gmail.com> (raw)
In-Reply-To: <20220610221124.18591-1-puffy.taco@gmail.com>
From: Michael Brudevold <michael.brudevold@veranexsolutions.com>
LE EIR differs from BREDR EIR in that it does not start with the device
address. Add ability to handle this data and send the correct address type
when adding remote OOB.
BREDR support remains for P-192; P-256 is not added.
This patch does not address requesting LE OOB data.
---
plugins/neard.c | 86 ++++++++++++++++++++++++++++++++++++++++---------
src/adapter.c | 19 ++++++++---
src/adapter.h | 5 +--
3 files changed, 88 insertions(+), 22 deletions(-)
diff --git a/plugins/neard.c b/plugins/neard.c
index 11d9e91c4..e03f981e0 100644
--- a/plugins/neard.c
+++ b/plugins/neard.c
@@ -56,11 +56,14 @@ enum cps {
struct oob_params {
bdaddr_t address;
+ uint8_t address_type;
uint32_t class;
char *name;
GSList *services;
- uint8_t *hash;
- uint8_t *randomizer;
+ uint8_t *hash192;
+ uint8_t *randomizer192;
+ uint8_t *hash256;
+ uint8_t *randomizer256;
uint8_t *pin;
int pin_len;
enum cps power_state;
@@ -70,8 +73,10 @@ static void free_oob_params(struct oob_params *params)
{
g_slist_free_full(params->services, free);
g_free(params->name);
- g_free(params->hash);
- g_free(params->randomizer);
+ g_free(params->hash192);
+ g_free(params->randomizer192);
+ g_free(params->hash256);
+ g_free(params->randomizer256);
free(params->pin);
}
@@ -352,10 +357,10 @@ static int process_eir(uint8_t *eir, size_t size, struct oob_params *remote)
remote->services = eir_data.services;
eir_data.services = NULL;
- remote->hash = eir_data.hash192;
+ remote->hash192 = eir_data.hash192;
eir_data.hash192 = NULL;
- remote->randomizer = eir_data.randomizer192;
+ remote->randomizer192 = eir_data.randomizer192;
eir_data.randomizer192 = NULL;
eir_data_free(&eir_data);
@@ -363,6 +368,36 @@ static int process_eir(uint8_t *eir, size_t size, struct oob_params *remote)
return 0;
}
+static void process_eir_le(uint8_t *eir, size_t size, struct oob_params *remote)
+{
+ struct eir_data eir_data;
+
+ DBG("size %zu", size);
+
+ memset(&eir_data, 0, sizeof(eir_data));
+
+ eir_parse(&eir_data, eir, size);
+
+ bacpy(&remote->address, &eir_data.addr);
+ remote->address_type = eir_data.addr_type;
+
+ remote->class = eir_data.class;
+
+ remote->name = eir_data.name;
+ eir_data.name = NULL;
+
+ remote->services = eir_data.services;
+ eir_data.services = NULL;
+
+ remote->hash256 = eir_data.hash256;
+ eir_data.hash256 = NULL;
+
+ remote->randomizer256 = eir_data.randomizer256;
+ eir_data.randomizer256 = NULL;
+
+ eir_data_free(&eir_data);
+}
+
/*
* This is (barely documented) Nokia extension format, most work was done by
* reverse engineering.
@@ -543,7 +578,7 @@ static int process_message(DBusMessage *msg, struct oob_params *remote)
uint8_t *eir;
int size;
- /* nokia.com:bt and EIR should not be passed together */
+ /* nokia.com:bt, EIR, and EIR.le should not be passed together */
if (bacmp(&remote->address, BDADDR_ANY) != 0)
goto error;
@@ -561,7 +596,7 @@ static int process_message(DBusMessage *msg, struct oob_params *remote)
uint8_t *data;
int size;
- /* nokia.com:bt and EIR should not be passed together */
+ /* nokia.com:bt, EIR, and EIR.le should not be passed together */
if (bacmp(&remote->address, BDADDR_ANY) != 0)
goto error;
@@ -574,6 +609,23 @@ static int process_message(DBusMessage *msg, struct oob_params *remote)
if (process_nokia_com_bt(data, size, remote))
goto error;
+ } else if (strcasecmp(key, "EIR.le") == 0) {
+ DBusMessageIter array;
+ uint8_t *eir;
+ int size;
+
+ /* nokia.com:bt, EIR, and EIR.le should not be passed together */
+ if (bacmp(&remote->address, BDADDR_ANY) != 0)
+ goto error;
+
+ if (dbus_message_iter_get_arg_type(&value) !=
+ DBUS_TYPE_ARRAY)
+ goto error;
+
+ dbus_message_iter_recurse(&value, &array);
+ dbus_message_iter_get_fixed_array(&array, &eir, &size);
+
+ process_eir_le(eir, size, remote);
} else if (strcasecmp(key, "State") == 0) {
const char *state;
@@ -635,10 +687,13 @@ static void store_params(struct btd_adapter *adapter, struct btd_device *device,
if (params->services)
device_add_eir_uuids(device, params->services);
- if (params->hash) {
+ if (params->hash192 || params->hash256) {
btd_adapter_add_remote_oob_data(adapter, ¶ms->address,
- params->hash,
- params->randomizer);
+ params->address_type,
+ params->hash192,
+ params->randomizer192,
+ params->hash256,
+ params->randomizer256);
} else if (params->pin_len) {
/* TODO
* Handle PIN, for now only discovery mode and 'common' PINs
@@ -692,7 +747,7 @@ static DBusMessage *push_oob(DBusConnection *conn, DBusMessage *msg, void *data)
}
device = btd_adapter_get_device(adapter, &remote.address,
- BDADDR_BREDR);
+ remote.address_type);
err = check_device(device);
if (err < 0) {
@@ -716,7 +771,7 @@ static DBusMessage *push_oob(DBusConnection *conn, DBusMessage *msg, void *data)
free_oob_params(&remote);
err = adapter_create_bonding(adapter, device_get_address(device),
- BDADDR_BREDR, io_cap);
+ remote.address_type, io_cap);
if (err < 0)
return error_reply(msg, -err);
@@ -764,7 +819,8 @@ static DBusMessage *request_oob(DBusConnection *conn, DBusMessage *msg,
goto done;
}
- device = btd_adapter_get_device(adapter, &remote.address, BDADDR_BREDR);
+ device = btd_adapter_get_device(adapter, &remote.address,
+ remote.address_type);
err = check_device(device);
if (err < 0)
@@ -777,7 +833,7 @@ static DBusMessage *request_oob(DBusConnection *conn, DBusMessage *msg,
store_params(adapter, device, &remote);
- if (remote.hash && btd_adapter_get_powered(adapter))
+ if (remote.hash192 && btd_adapter_get_powered(adapter))
goto read_local;
done:
free_oob_params(&remote);
diff --git a/src/adapter.c b/src/adapter.c
index f7faaa263..9cad36da8 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -8770,7 +8770,11 @@ int adapter_set_io_capability(struct btd_adapter *adapter, uint8_t io_cap)
int btd_adapter_add_remote_oob_data(struct btd_adapter *adapter,
const bdaddr_t *bdaddr,
- uint8_t *hash, uint8_t *randomizer)
+ uint8_t bdaddr_type,
+ uint8_t *hash192,
+ uint8_t *randomizer192,
+ uint8_t *hash256,
+ uint8_t *randomizer256)
{
struct mgmt_cp_add_remote_oob_data cp;
char addr[18];
@@ -8780,10 +8784,15 @@ int btd_adapter_add_remote_oob_data(struct btd_adapter *adapter,
memset(&cp, 0, sizeof(cp));
bacpy(&cp.addr.bdaddr, bdaddr);
- memcpy(cp.hash192, hash, 16);
-
- if (randomizer)
- memcpy(cp.rand192, randomizer, 16);
+ cp.addr.type = bdaddr_type;
+ if (hash192)
+ memcpy(cp.hash192, hash192, 16);
+ if (hash256)
+ memcpy(cp.hash256, hash256, 16);
+ if (randomizer192)
+ memcpy(cp.rand192, randomizer192, 16);
+ if (randomizer256)
+ memcpy(cp.rand256, randomizer256, 16);
if (mgmt_send(adapter->mgmt, MGMT_OP_ADD_REMOTE_OOB_DATA,
adapter->dev_id, sizeof(cp), &cp,
diff --git a/src/adapter.h b/src/adapter.h
index 688ed51c6..b0a324a78 100644
--- a/src/adapter.h
+++ b/src/adapter.h
@@ -213,8 +213,9 @@ int adapter_set_io_capability(struct btd_adapter *adapter, uint8_t io_cap);
int btd_adapter_read_local_oob_data(struct btd_adapter *adapter);
int btd_adapter_add_remote_oob_data(struct btd_adapter *adapter,
- const bdaddr_t *bdaddr,
- uint8_t *hash, uint8_t *randomizer);
+ const bdaddr_t *bdaddr, uint8_t bdaddr_type,
+ uint8_t *hash192, uint8_t *randomizer192,
+ uint8_t *hash256, uint8_t *randomizer256);
int btd_adapter_remove_remote_oob_data(struct btd_adapter *adapter,
const bdaddr_t *bdaddr);
--
2.25.1
next prev parent reply other threads:[~2022-06-10 22:12 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-06-10 22:11 [PATCH v2 0/3] LE OOB pairing support Michael Brudevold
2022-06-10 22:11 ` [PATCH v2 1/3] eir: parse data types for LE OOB pairing Michael Brudevold
2022-06-11 0:37 ` LE OOB pairing support bluez.test.bot
2022-06-11 20:27 ` [PATCH v2 1/3] eir: parse data types for LE OOB pairing Luiz Augusto von Dentz
2022-06-13 21:42 ` Mike Brudevold
2022-06-13 21:55 ` Luiz Augusto von Dentz
2022-06-13 22:28 ` Mike Brudevold
2022-06-21 18:57 ` Luiz Augusto von Dentz
2022-06-21 19:50 ` Mike Brudevold
2022-06-10 22:11 ` Michael Brudevold [this message]
2022-06-10 22:11 ` [PATCH v2 3/3] neard: Update D-Bus path and interface Michael Brudevold
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220610221124.18591-3-puffy.taco@gmail.com \
--to=puffy.taco@gmail.com \
--cc=linux-bluetooth@vger.kernel.org \
--cc=michael.brudevold@veranexsolutions.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).