diff --git a/src/adapter.c b/src/adapter.c
index 75faa84..11ee19a 100644
--- a/src/adapter.c
+++ b/src/adapter.c
return -EIO;
}
-int btd_adapter_read_local_oob_data(struct btd_adapter *adapter)
-{
- return mgmt_read_local_oob_data(adapter->dev_id);
-}
-
int btd_adapter_add_remote_oob_data(struct btd_adapter *adapter,
const bdaddr_t *bdaddr,
uint8_t *hash, uint8_t *randomizer)
return adapter->oob_handler != NULL;
}
-void adapter_read_local_oob_data_complete(struct btd_adapter *adapter,
- uint8_t *hash, uint8_t *randomizer)
+static void read_local_oob_data_complete(uint8_t status, uint16_t length,
+ const void *param, void *user_data)
{
+ const struct mgmt_rp_read_local_oob_data *rp = param;
+ struct btd_adapter *adapter = user_data;
+ const uint8_t *hash, *randomizer;
+
+ if (status != MGMT_STATUS_SUCCESS) {
+ error("Read local OOB data failed: %s (0x%02x)",
+ mgmt_errstr(status), status);
+ hash = NULL;
+ randomizer = NULL;
+ } else if (length < sizeof(*rp)) {
+ error("Too small read local OOB data response");
+ return;
+ } else {
+ hash = rp->hash;
+ randomizer = rp->randomizer;
+ }
+
if (!adapter->oob_handler || !adapter->oob_handler->read_local_cb)
return;
adapter->oob_handler = NULL;
}
+int btd_adapter_read_local_oob_data(struct btd_adapter *adapter)
+{
+ DBG("hci%u", adapter->dev_id);
+
+ if (mgmt_send(adapter->mgmt, MGMT_OP_READ_LOCAL_OOB_DATA,
+ adapter->dev_id, 0, NULL, read_local_oob_data_complete,
+ adapter, NULL) > 0)
+ return 0;
+
+ return -EIO;
+}
+
void btd_adapter_for_each_device(struct btd_adapter *adapter,
void (*cb)(struct btd_device *device, void *data),
void *data)
diff --git a/src/adapter.h b/src/adapter.h
index 8844fd4..43fb3ea 100644
--- a/src/adapter.h
+++ b/src/adapter.h
int adapter_set_io_capability(struct btd_adapter *adapter, uint8_t io_cap);
int btd_adapter_read_local_oob_data(struct btd_adapter *adapter);
-void adapter_read_local_oob_data_complete(struct btd_adapter *adapter,
- uint8_t *hash, uint8_t *randomizer);
int btd_adapter_add_remote_oob_data(struct btd_adapter *adapter,
const bdaddr_t *bdaddr,
diff --git a/src/mgmt.c b/src/mgmt.c
index 07c80fd..a0919f3 100644
--- a/src/mgmt.c
+++ b/src/mgmt.c
bonding_complete(index, &rp->addr, status);
}
-static void read_local_oob_data_complete(uint16_t index, void *buf, size_t len)
-{
- struct mgmt_rp_read_local_oob_data *rp = buf;
- struct btd_adapter *adapter;
-
- if (len != sizeof(*rp)) {
- error("read_local_oob_data_complete event size mismatch "
- "(%zu != %zu)", len, sizeof(*rp));
- return;
- }
-
- DBG("hci%u", index);
-
- adapter = adapter_find_by_id(index);
- if (adapter)
- adapter_read_local_oob_data_complete(adapter, rp->hash,
- rp->randomizer);
-}
-
-static void read_local_oob_data_failed(uint16_t index)
-{
- struct btd_adapter *adapter;
-
- DBG("hci%u", index);
-
- adapter = adapter_find_by_id(index);
- if (adapter)
- adapter_read_local_oob_data_complete(adapter, NULL, NULL);
-}
-
static void mgmt_cmd_complete(uint16_t index, void *buf, size_t len)
{
struct mgmt_ev_cmd_complete *ev = buf;
DBG("set_local_name complete");
break;
case MGMT_OP_READ_LOCAL_OOB_DATA:
- read_local_oob_data_complete(index, ev->data, len);
+ DBG("read_local_oob_data complete");
break;
case MGMT_OP_ADD_REMOTE_OOB_DATA:
DBG("add_remote_oob_data complete");
switch (opcode) {
case MGMT_OP_READ_LOCAL_OOB_DATA:
- read_local_oob_data_failed(index);
+ DBG("read_local_oob_data failed");
break;
}
return 0;
}
-int mgmt_read_local_oob_data(int index)
-{
- struct mgmt_hdr hdr;
-
- DBG("hci%d", index);
-
- hdr.opcode = htobs(MGMT_OP_READ_LOCAL_OOB_DATA);
- hdr.len = 0;
- hdr.index = htobs(index);
-
- if (write(mgmt_sock, &hdr, sizeof(hdr)) < 0)
- return -errno;
-
- return 0;
-}
-
int mgmt_add_remote_oob_data(int index, const bdaddr_t *bdaddr,
uint8_t *hash, uint8_t *randomizer)
{
diff --git a/src/mgmt.h b/src/mgmt.h
index a097da1..d63bc10 100644
--- a/src/mgmt.h
+++ b/src/mgmt.h
int mgmt_passkey_reply(int index, const bdaddr_t *bdaddr, uint8_t bdaddr_type,
uint32_t passkey);
-int mgmt_read_local_oob_data(int index);
-
int mgmt_add_remote_oob_data(int index, const bdaddr_t *bdaddr,
uint8_t *hash, uint8_t *randomizer);
int mgmt_remove_remote_oob_data(int index, const bdaddr_t *bdaddr);