From 6e5d3d78fcb2db8e4b502285879acc65fc983ea4 Mon Sep 17 00:00:00 2001 From: Johan Hedberg Date: Thu, 9 Feb 2012 15:41:15 +0200 Subject: [PATCH] adapter_ops: Add address type to confirm_reply and passkey_reply --- plugins/hciops.c | 9 ++++++--- plugins/mgmtops.c | 19 ++++++++++++++----- src/adapter.c | 10 ++++++---- src/adapter.h | 10 ++++++---- src/event.c | 10 ++++++---- 5 files changed, 38 insertions(+), 20 deletions(-) diff --git a/plugins/hciops.c b/plugins/hciops.c index 1048bf6e1..f583e8cc5 100644 --- a/plugins/hciops.c +++ b/plugins/hciops.c @@ -1125,7 +1125,8 @@ static void return_link_keys(int index, void *ptr) /* Simple Pairing handling */ -static int hciops_confirm_reply(int index, bdaddr_t *bdaddr, gboolean success) +static int hciops_confirm_reply(int index, bdaddr_t *bdaddr, addr_type_t type, + gboolean success) { struct dev_info *dev = &devs[index]; user_confirm_reply_cp cp; @@ -1186,7 +1187,8 @@ static void user_confirm_request(int index, void *ptr) /* Wait 5 milliseconds before doing auto-accept */ usleep(5000); - if (hciops_confirm_reply(index, &req->bdaddr, TRUE) < 0) + if (hciops_confirm_reply(index, &req->bdaddr, + ADDR_TYPE_BREDR, TRUE) < 0) goto fail; return; @@ -3418,7 +3420,8 @@ static int hciops_pincode_reply(int index, bdaddr_t *bdaddr, const char *pin, return err; } -static int hciops_passkey_reply(int index, bdaddr_t *bdaddr, uint32_t passkey) +static int hciops_passkey_reply(int index, bdaddr_t *bdaddr, addr_type_t type, + uint32_t passkey) { struct dev_info *dev = &devs[index]; char addr[18]; diff --git a/plugins/mgmtops.c b/plugins/mgmtops.c index c0af8d85f..bcb23d503 100644 --- a/plugins/mgmtops.c +++ b/plugins/mgmtops.c @@ -598,7 +598,8 @@ static void mgmt_pin_code_request(int sk, uint16_t index, void *buf, size_t len) } } -static int mgmt_confirm_reply(int index, bdaddr_t *bdaddr, gboolean success) +static int mgmt_confirm_reply(int index, bdaddr_t *bdaddr, addr_type_t type, + gboolean success) { char buf[MGMT_HDR_SIZE + sizeof(struct mgmt_cp_user_confirm_reply)]; struct mgmt_hdr *hdr = (void *) buf; @@ -620,6 +621,7 @@ static int mgmt_confirm_reply(int index, bdaddr_t *bdaddr, gboolean success) cp = (void *) &buf[sizeof(*hdr)]; bacpy(&cp->addr.bdaddr, bdaddr); + cp->addr.type = mgmt_addr_type(type); if (write(mgmt_sock, buf, sizeof(buf)) < 0) return -errno; @@ -627,7 +629,8 @@ static int mgmt_confirm_reply(int index, bdaddr_t *bdaddr, gboolean success) return 0; } -static int mgmt_passkey_reply(int index, bdaddr_t *bdaddr, uint32_t passkey) +static int mgmt_passkey_reply(int index, bdaddr_t *bdaddr, addr_type_t type, + uint32_t passkey) { char buf[MGMT_HDR_SIZE + sizeof(struct mgmt_cp_user_passkey_reply)]; struct mgmt_hdr *hdr = (void *) buf; @@ -648,6 +651,7 @@ static int mgmt_passkey_reply(int index, bdaddr_t *bdaddr, uint32_t passkey) cp = (void *) &buf[sizeof(*hdr)]; bacpy(&cp->addr.bdaddr, bdaddr); + cp->addr.type = mgmt_addr_type(type); buf_len = sizeof(*hdr) + sizeof(*cp); } else { @@ -658,6 +662,7 @@ static int mgmt_passkey_reply(int index, bdaddr_t *bdaddr, uint32_t passkey) cp = (void *) &buf[sizeof(*hdr)]; bacpy(&cp->addr.bdaddr, bdaddr); + cp->addr.type = mgmt_addr_type(type); cp->passkey = htobl(passkey); buf_len = sizeof(*hdr) + sizeof(*cp); @@ -695,13 +700,15 @@ static void mgmt_passkey_request(int sk, uint16_t index, void *buf, size_t len) err = btd_event_user_passkey(&info->bdaddr, &ev->addr.bdaddr); if (err < 0) { error("btd_event_user_passkey: %s", strerror(-err)); - mgmt_passkey_reply(index, &ev->addr.bdaddr, INVALID_PASSKEY); + mgmt_passkey_reply(index, &ev->addr.bdaddr, ev->addr.type, + INVALID_PASSKEY); } } struct confirm_data { int index; bdaddr_t bdaddr; + uint8_t type; }; static gboolean confirm_accept(gpointer user_data) @@ -714,7 +721,7 @@ static gboolean confirm_accept(gpointer user_data) if (data->index > max_index || !info->valid) return FALSE; - mgmt_confirm_reply(data->index, &data->bdaddr, TRUE); + mgmt_confirm_reply(data->index, &data->bdaddr, data->type, TRUE); return FALSE; } @@ -748,6 +755,7 @@ static void mgmt_user_confirm_request(int sk, uint16_t index, void *buf, data = g_new0(struct confirm_data, 1); data->index = index; bacpy(&data->bdaddr, &ev->addr.bdaddr); + data->type = ev->addr.type; g_timeout_add_seconds_full(G_PRIORITY_DEFAULT, 1, confirm_accept, data, g_free); @@ -760,7 +768,8 @@ static void mgmt_user_confirm_request(int sk, uint16_t index, void *buf, btohl(ev->value)); if (err < 0) { error("btd_event_user_confirm: %s", strerror(-err)); - mgmt_confirm_reply(index, &ev->addr.bdaddr, FALSE); + mgmt_confirm_reply(index, &ev->addr.bdaddr, ev->addr.type, + FALSE); } } diff --git a/src/adapter.c b/src/adapter.c index 099b1c223..eb16c58eb 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -3530,15 +3530,17 @@ int btd_adapter_pincode_reply(struct btd_adapter *adapter, bdaddr_t *bdaddr, } int btd_adapter_confirm_reply(struct btd_adapter *adapter, bdaddr_t *bdaddr, - gboolean success) + addr_type_t type, gboolean success) { - return adapter_ops->confirm_reply(adapter->dev_id, bdaddr, success); + return adapter_ops->confirm_reply(adapter->dev_id, bdaddr, type, + success); } int btd_adapter_passkey_reply(struct btd_adapter *adapter, bdaddr_t *bdaddr, - uint32_t passkey) + addr_type_t type, uint32_t passkey) { - return adapter_ops->passkey_reply(adapter->dev_id, bdaddr, passkey); + return adapter_ops->passkey_reply(adapter->dev_id, bdaddr, type, + passkey); } int btd_adapter_encrypt_link(struct btd_adapter *adapter, bdaddr_t *bdaddr, diff --git a/src/adapter.h b/src/adapter.h index f99eb1946..946bac619 100644 --- a/src/adapter.h +++ b/src/adapter.h @@ -200,8 +200,10 @@ struct btd_adapter_ops { int (*remove_bonding) (int index, bdaddr_t *bdaddr, addr_type_t type); int (*pincode_reply) (int index, bdaddr_t *bdaddr, const char *pin, size_t pin_len); - int (*confirm_reply) (int index, bdaddr_t *bdaddr, gboolean success); - int (*passkey_reply) (int index, bdaddr_t *bdaddr, uint32_t passkey); + int (*confirm_reply) (int index, bdaddr_t *bdaddr, addr_type_t type, + gboolean success); + int (*passkey_reply) (int index, bdaddr_t *bdaddr, addr_type_t type, + uint32_t passkey); int (*encrypt_link) (int index, bdaddr_t *bdaddr, bt_hci_result_t cb, gpointer user_data); int (*set_did) (int index, uint16_t vendor, uint16_t product, @@ -256,9 +258,9 @@ int btd_adapter_remove_bonding(struct btd_adapter *adapter, bdaddr_t *bdaddr, int btd_adapter_pincode_reply(struct btd_adapter *adapter, bdaddr_t *bdaddr, const char *pin, size_t pin_len); int btd_adapter_confirm_reply(struct btd_adapter *adapter, bdaddr_t *bdaddr, - gboolean success); + addr_type_t type, gboolean success); int btd_adapter_passkey_reply(struct btd_adapter *adapter, bdaddr_t *bdaddr, - uint32_t passkey); + addr_type_t type, uint32_t passkey); int btd_adapter_encrypt_link(struct btd_adapter *adapter, bdaddr_t *bdaddr, bt_hci_result_t cb, gpointer user_data); diff --git a/src/event.c b/src/event.c index ff1896aee..136ad77af 100644 --- a/src/event.c +++ b/src/event.c @@ -138,10 +138,11 @@ static int confirm_reply(struct btd_adapter *adapter, struct btd_device *device, gboolean success) { bdaddr_t bdaddr; + addr_type_t type; - device_get_address(device, &bdaddr, NULL); + device_get_address(device, &bdaddr, &type); - return btd_adapter_confirm_reply(adapter, &bdaddr, success); + return btd_adapter_confirm_reply(adapter, &bdaddr, type, success); } static void confirm_cb(struct agent *agent, DBusError *err, void *user_data) @@ -159,13 +160,14 @@ static void passkey_cb(struct agent *agent, DBusError *err, uint32_t passkey, struct btd_device *device = user_data; struct btd_adapter *adapter = device_get_adapter(device); bdaddr_t bdaddr; + addr_type_t type; - device_get_address(device, &bdaddr, NULL); + device_get_address(device, &bdaddr, &type); if (err) passkey = INVALID_PASSKEY; - btd_adapter_passkey_reply(adapter, &bdaddr, passkey); + btd_adapter_passkey_reply(adapter, &bdaddr, type, passkey); } int btd_event_user_confirm(bdaddr_t *sba, bdaddr_t *dba, uint32_t passkey) -- 2.47.3