From 70811dfc47ad2ca5b2c2fa96ce964d45fd4b82b5 Mon Sep 17 00:00:00 2001 From: Johan Hedberg Date: Sun, 6 Jan 2013 19:04:53 +0200 Subject: [PATCH] core: Move mgmt read local OOB data handling to adapter code --- src/adapter.c | 38 +++++++++++++++++++++++++++++++------- src/adapter.h | 2 -- src/mgmt.c | 50 ++------------------------------------------------ src/mgmt.h | 2 -- 4 files changed, 33 insertions(+), 59 deletions(-) diff --git a/src/adapter.c b/src/adapter.c index 75faa8435..11ee19af5 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -4135,11 +4135,6 @@ int adapter_set_io_capability(struct btd_adapter *adapter, uint8_t io_cap) 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) @@ -4173,9 +4168,26 @@ gboolean btd_adapter_check_oob_handler(struct btd_adapter *adapter) 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; @@ -4186,6 +4198,18 @@ void adapter_read_local_oob_data_complete(struct btd_adapter *adapter, 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 8844fd486..43fb3ea80 100644 --- a/src/adapter.h +++ b/src/adapter.h @@ -184,8 +184,6 @@ void adapter_bonding_complete(struct btd_adapter *adapter, 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 07c80fd54..a0919f388 100644 --- a/src/mgmt.c +++ b/src/mgmt.c @@ -456,36 +456,6 @@ static void pair_device_complete(uint16_t index, uint8_t status, 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; @@ -576,7 +546,7 @@ static void mgmt_cmd_complete(uint16_t index, void *buf, size_t len) 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"); @@ -628,7 +598,7 @@ static void mgmt_cmd_status(uint16_t index, void *buf, size_t len) switch (opcode) { case MGMT_OP_READ_LOCAL_OOB_DATA: - read_local_oob_data_failed(index); + DBG("read_local_oob_data failed"); break; } @@ -1106,22 +1076,6 @@ int mgmt_cancel_bonding(int index, const bdaddr_t *bdaddr, uint8_t addr_type) 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 a097da158..d63bc100a 100644 --- a/src/mgmt.h +++ b/src/mgmt.h @@ -39,8 +39,6 @@ int mgmt_confirm_reply(int index, const bdaddr_t *bdaddr, uint8_t bdaddr_type, 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); -- 2.47.3