Diff between e6f57ce4edf7a50042ca3fd25bc5e30bc60f37fd and 6e5d3d78fcb2db8e4b502285879acc65fc983ea4

Changed Files

File Additions Deletions Status
plugins/hciops.c +6 -3 modified
plugins/mgmtops.c +14 -5 modified
src/adapter.c +6 -4 modified
src/adapter.h +6 -4 modified
src/event.c +6 -4 modified

Full Patch

diff --git a/plugins/hciops.c b/plugins/hciops.c
index 1048bf6..f583e8c 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 c0af8d8..bcb23d5 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 099b1c2..eb16c58 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 f99eb19..946bac6 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 ff1896a..136ad77 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)