From 332ad8f5fb210f1e59333b63e9d08d73542e8a90 Mon Sep 17 00:00:00 2001 From: Johan Hedberg Date: Tue, 8 Jan 2013 12:34:38 +0200 Subject: [PATCH] core: Move mgmt user confirm request handling to adapter code --- src/adapter.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++-- src/mgmt.c | 63 +-------------------------------------------------- src/mgmt.h | 2 -- 3 files changed, 59 insertions(+), 66 deletions(-) diff --git a/src/adapter.c b/src/adapter.c index 11937cac8..c2c817e3b 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -4280,8 +4280,59 @@ int btd_adapter_confirm_reply(struct btd_adapter *adapter, const bdaddr_t *bdaddr, uint8_t bdaddr_type, gboolean success) { - return mgmt_confirm_reply(adapter->dev_id, bdaddr, bdaddr_type, - success); + struct mgmt_cp_user_confirm_reply cp; + uint16_t opcode; + char addr[18]; + + ba2str(bdaddr, addr); + DBG("hci%u addr %s success %d", adapter->dev_id, addr, success); + + if (success) + opcode = MGMT_OP_USER_CONFIRM_REPLY; + else + opcode = MGMT_OP_USER_CONFIRM_NEG_REPLY; + + memset(&cp, 0, sizeof(cp)); + bacpy(&cp.addr.bdaddr, bdaddr); + cp.addr.type = bdaddr_type; + + if (mgmt_reply(adapter->mgmt, opcode, adapter->dev_id, sizeof(cp), &cp, + NULL, NULL, NULL) > 0) + return 0; + + return -EIO; +} + +static void user_confirm_request_callback(uint16_t index, uint16_t length, + const void *param, void *user_data) +{ + const struct mgmt_ev_user_confirm_request *ev = param; + struct btd_adapter *adapter = user_data; + struct btd_device *device; + char addr[18]; + int err; + + if (length < sizeof(*ev)) { + error("Too small user confirm request event"); + return; + } + + ba2str(&ev->addr.bdaddr, addr); + DBG("hci%u %s confirm_hint %u", adapter->dev_id, addr, + ev->confirm_hint); + device = adapter_get_device(adapter, addr, ev->addr.type); + if (!device) { + error("Unable to get device object for %s", addr); + return; + } + + err = device_confirm_passkey(device, btohl(ev->value), + ev->confirm_hint); + if (err < 0) { + error("device_confirm_passkey: %s", strerror(-err)); + btd_adapter_confirm_reply(adapter, &ev->addr.bdaddr, + ev->addr.type, FALSE); + } } int btd_adapter_passkey_reply(struct btd_adapter *adapter, @@ -5303,6 +5354,11 @@ static void read_info_complete(uint8_t status, uint16_t length, pin_code_request_callback, adapter, NULL); + mgmt_register(adapter->mgmt, MGMT_EV_USER_CONFIRM_REQUEST, + adapter->dev_id, + user_confirm_request_callback, + adapter, NULL); + set_dev_class(adapter, adapter->major_class, adapter->minor_class); set_name(adapter, btd_adapter_get_name(adapter)); diff --git a/src/mgmt.c b/src/mgmt.c index c525ff3ba..987bd1730 100644 --- a/src/mgmt.c +++ b/src/mgmt.c @@ -85,37 +85,6 @@ static bool get_adapter_and_device(uint16_t index, return true; } -int mgmt_confirm_reply(int index, const bdaddr_t *bdaddr, uint8_t bdaddr_type, - gboolean success) -{ - char buf[MGMT_HDR_SIZE + sizeof(struct mgmt_cp_user_confirm_reply)]; - struct mgmt_hdr *hdr = (void *) buf; - struct mgmt_cp_user_confirm_reply *cp; - char addr[18]; - - ba2str(bdaddr, addr); - DBG("index %d addr %s success %d", index, addr, success); - - memset(buf, 0, sizeof(buf)); - - if (success) - hdr->opcode = htobs(MGMT_OP_USER_CONFIRM_REPLY); - else - hdr->opcode = htobs(MGMT_OP_USER_CONFIRM_NEG_REPLY); - - hdr->len = htobs(sizeof(*cp)); - hdr->index = htobs(index); - - cp = (void *) &buf[sizeof(*hdr)]; - bacpy(&cp->addr.bdaddr, bdaddr); - cp->addr.type = bdaddr_type; - - if (write(mgmt_sock, buf, sizeof(buf)) < 0) - return -errno; - - return 0; -} - int mgmt_passkey_reply(int index, const bdaddr_t *bdaddr, uint8_t bdaddr_type, uint32_t passkey) { @@ -219,36 +188,6 @@ static void mgmt_passkey_notify(uint16_t index, void *buf, size_t len) error("device_notify_passkey: %s", strerror(-err)); } -static void mgmt_user_confirm_request(uint16_t index, void *buf, - size_t len) -{ - struct mgmt_ev_user_confirm_request *ev = buf; - struct btd_adapter *adapter; - struct btd_device *device; - char addr[18]; - int err; - - if (len < sizeof(*ev)) { - error("Too small user_confirm_request event"); - return; - } - - ba2str(&ev->addr.bdaddr, addr); - - DBG("hci%u %s confirm_hint %u", index, addr, ev->confirm_hint); - - if (!get_adapter_and_device(index, &ev->addr, &adapter, &device, true)) - return; - - err = device_confirm_passkey(device, btohl(ev->value), - ev->confirm_hint); - if (err < 0) { - error("device_confirm_passkey: %s", strerror(-err)); - mgmt_confirm_reply(index, &ev->addr.bdaddr, ev->addr.type, - FALSE); - } -} - static void mgmt_cmd_complete(uint16_t index, void *buf, size_t len) { struct mgmt_ev_cmd_complete *ev = buf; @@ -362,7 +301,7 @@ static gboolean mgmt_event(GIOChannel *channel, GIOCondition cond, DBG("pin_code_request event"); break; case MGMT_EV_USER_CONFIRM_REQUEST: - mgmt_user_confirm_request(index, buf + MGMT_HDR_SIZE, len); + DBG("user_confirm_request event"); break; case MGMT_EV_AUTH_FAILED: DBG("auth_failed event"); diff --git a/src/mgmt.h b/src/mgmt.h index d184da64b..17d739381 100644 --- a/src/mgmt.h +++ b/src/mgmt.h @@ -25,7 +25,5 @@ int mgmt_setup(void); void mgmt_cleanup(void); -int mgmt_confirm_reply(int index, const bdaddr_t *bdaddr, uint8_t bdaddr_type, - gboolean success); int mgmt_passkey_reply(int index, const bdaddr_t *bdaddr, uint8_t bdaddr_type, uint32_t passkey); -- 2.47.3