Diff between 9ce812b08587b48f8885cef9df6d8856f0cb1e34 and 07c33a2dd0149820fa409b570dfc6b05cc932a0a

Changed Files

File Additions Deletions Status
lib/mgmt.h +38 -33 modified
mgmt/main.c +23 -23 modified
plugins/mgmtops.c +31 -31 modified

Full Patch

diff --git a/lib/mgmt.h b/lib/mgmt.h
index ad4781d..22912d4 100644
--- a/lib/mgmt.h
+++ b/lib/mgmt.h
@@ -168,49 +168,39 @@ struct mgmt_cp_load_long_term_keys {
 	struct mgmt_ltk_info keys[0];
 } __packed;
 
-#define MGMT_OP_REMOVE_KEYS		0x0014
-struct mgmt_cp_remove_keys {
-	bdaddr_t bdaddr;
-	uint8_t disconnect;
-} __packed;
-struct mgmt_rp_remove_keys {
-	bdaddr_t bdaddr;
-	uint8_t status;
-} __packed;
-
-#define MGMT_OP_DISCONNECT		0x0015
+#define MGMT_OP_DISCONNECT		0x0014
 struct mgmt_cp_disconnect {
-	bdaddr_t bdaddr;
+	struct mgmt_addr_info addr;
 } __packed;
 struct mgmt_rp_disconnect {
-	bdaddr_t bdaddr;
+	struct mgmt_addr_info addr;
 	uint8_t status;
 } __packed;
 
-#define MGMT_OP_GET_CONNECTIONS		0x0016
+#define MGMT_OP_GET_CONNECTIONS		0x0015
 struct mgmt_rp_get_connections {
 	uint16_t conn_count;
 	struct mgmt_addr_info addr[0];
 } __packed;
 
-#define MGMT_OP_PIN_CODE_REPLY		0x0017
+#define MGMT_OP_PIN_CODE_REPLY		0x0016
 struct mgmt_cp_pin_code_reply {
 	bdaddr_t bdaddr;
 	uint8_t pin_len;
 	uint8_t pin_code[16];
 } __packed;
 
-#define MGMT_OP_PIN_CODE_NEG_REPLY	0x0018
+#define MGMT_OP_PIN_CODE_NEG_REPLY	0x0017
 struct mgmt_cp_pin_code_neg_reply {
 	bdaddr_t bdaddr;
 } __packed;
 
-#define MGMT_OP_SET_IO_CAPABILITY	0x0019
+#define MGMT_OP_SET_IO_CAPABILITY	0x0018
 struct mgmt_cp_set_io_capability {
 	uint8_t io_capability;
 } __packed;
 
-#define MGMT_OP_PAIR_DEVICE		0x001A
+#define MGMT_OP_PAIR_DEVICE		0x0019
 struct mgmt_cp_pair_device {
 	struct mgmt_addr_info addr;
 	uint8_t io_cap;
@@ -220,14 +210,24 @@ struct mgmt_rp_pair_device {
 	uint8_t status;
 } __packed;
 
-#define MGMT_OP_CANCEL_PAIR_DEVICE	0x001B
+#define MGMT_OP_CANCEL_PAIR_DEVICE	0x001A
+
+#define MGMT_OP_UNPAIR_DEVICE		0x001B
+struct mgmt_cp_unpair_device {
+	struct mgmt_addr_info addr;
+	uint8_t disconnect;
+} __packed;
+struct mgmt_rp_unpair_device {
+	struct mgmt_addr_info addr;
+	uint8_t status;
+} __packed;
 
 #define MGMT_OP_USER_CONFIRM_REPLY	0x001C
 struct mgmt_cp_user_confirm_reply {
-	bdaddr_t bdaddr;
+	struct mgmt_addr_info addr;
 } __packed;
 struct mgmt_rp_user_confirm_reply {
-	bdaddr_t bdaddr;
+	struct mgmt_addr_info addr;
 	uint8_t status;
 } __packed;
 
@@ -235,17 +235,17 @@ struct mgmt_rp_user_confirm_reply {
 
 #define MGMT_OP_USER_PASSKEY_REPLY	0x001E
 struct mgmt_cp_user_passkey_reply {
-	bdaddr_t bdaddr;
+	struct mgmt_addr_info addr;
 	uint32_t passkey;
 } __packed;
 struct mgmt_rp_user_passkey_reply {
-	bdaddr_t bdaddr;
+	struct mgmt_addr_info addr;
 	uint8_t status;
 } __packed;
 
 #define MGMT_OP_USER_PASSKEY_NEG_REPLY	0x001F
 struct mgmt_cp_user_passkey_neg_reply {
-	bdaddr_t bdaddr;
+	struct mgmt_addr_info addr;
 } __packed;
 
 #define MGMT_OP_READ_LOCAL_OOB_DATA	0x0020
@@ -256,14 +256,14 @@ struct mgmt_rp_read_local_oob_data {
 
 #define MGMT_OP_ADD_REMOTE_OOB_DATA	0x0021
 struct mgmt_cp_add_remote_oob_data {
-	bdaddr_t bdaddr;
+	struct mgmt_addr_info addr;
 	uint8_t hash[16];
 	uint8_t randomizer[16];
 } __packed;
 
 #define MGMT_OP_REMOVE_REMOTE_OOB_DATA	0x0022
 struct mgmt_cp_remove_remote_oob_data {
-	bdaddr_t bdaddr;
+	struct mgmt_addr_info addr;
 } __packed;
 
 #define MGMT_OP_START_DISCOVERY		0x0023
@@ -285,12 +285,12 @@ struct mgmt_rp_confirm_name {
 
 #define MGMT_OP_BLOCK_DEVICE		0x0026
 struct mgmt_cp_block_device {
-	bdaddr_t bdaddr;
+	struct mgmt_addr_info addr;
 } __packed;
 
 #define MGMT_OP_UNBLOCK_DEVICE		0x0027
 struct mgmt_cp_unblock_device {
-	bdaddr_t bdaddr;
+	struct mgmt_addr_info addr;
 } __packed;
 
 #define MGMT_EV_CMD_COMPLETE		0x0001
@@ -362,19 +362,19 @@ struct mgmt_ev_pin_code_request {
 
 #define MGMT_EV_USER_CONFIRM_REQUEST	0x000F
 struct mgmt_ev_user_confirm_request {
-	bdaddr_t bdaddr;
+	struct mgmt_addr_info addr;
 	uint8_t confirm_hint;
 	uint32_t value;
 } __packed;
 
 #define MGMT_EV_USER_PASSKEY_REQUEST	0x0010
 struct mgmt_ev_user_passkey_request {
-	bdaddr_t bdaddr;
+	struct mgmt_addr_info addr;
 } __packed;
 
 #define MGMT_EV_AUTH_FAILED		0x0011
 struct mgmt_ev_auth_failed {
-	bdaddr_t bdaddr;
+	struct mgmt_addr_info addr;
 	uint8_t status;
 } __packed;
 
@@ -391,10 +391,15 @@ struct mgmt_ev_device_found {
 
 #define MGMT_EV_DEVICE_BLOCKED		0x0014
 struct mgmt_ev_device_blocked {
-	bdaddr_t bdaddr;
+	struct mgmt_addr_info addr;
 } __packed;
 
 #define MGMT_EV_DEVICE_UNBLOCKED	0x0015
 struct mgmt_ev_device_unblocked {
-	bdaddr_t bdaddr;
+	struct mgmt_addr_info addr;
+} __packed;
+
+#define MGMT_EV_DEVICE_UNPAIRED		0x0016
+struct mgmt_ev_device_unpaired {
+	struct mgmt_addr_info addr;
 } __packed;
diff --git a/mgmt/main.c b/mgmt/main.c
index af0a302..8c9e51d 100644
--- a/mgmt/main.c
+++ b/mgmt/main.c
@@ -489,7 +489,7 @@ static int mgmt_auth_failed(int mgmt_sk, uint16_t index,
 
 	if (monitor) {
 		char addr[18];
-		ba2str(&ev->bdaddr, addr);
+		ba2str(&ev->addr.bdaddr, addr);
 		printf("hci%u %s auth failed with status 0x%02x (%s)\n",
 			index, addr, ev->status, mgmt_errstr(ev->status));
 	}
@@ -694,7 +694,7 @@ static int mgmt_confirm_reply(int mgmt_sk, uint16_t index, bdaddr_t *bdaddr)
 	struct mgmt_cp_user_confirm_reply cp;
 
 	memset(&cp, 0, sizeof(cp));
-	bacpy(&cp.bdaddr, bdaddr);
+	bacpy(&cp.addr.bdaddr, bdaddr);
 
 	return mgmt_send_cmd(mgmt_sk, MGMT_OP_USER_CONFIRM_REPLY, index,
 					&cp, sizeof(cp), confirm_rsp, NULL);
@@ -720,7 +720,7 @@ static int mgmt_confirm_neg_reply(int mgmt_sk, uint16_t index,
 	struct mgmt_cp_user_confirm_reply cp;
 
 	memset(&cp, 0, sizeof(cp));
-	bacpy(&cp.bdaddr, bdaddr);
+	bacpy(&cp.addr.bdaddr, bdaddr);
 
 	return mgmt_send_cmd(mgmt_sk, MGMT_OP_USER_CONFIRM_NEG_REPLY, index,
 				&cp, sizeof(cp), confirm_neg_rsp, NULL);
@@ -742,7 +742,7 @@ static int mgmt_user_confirm(int mgmt_sk, uint16_t index,
 		return -EINVAL;
 	}
 
-	ba2str(&ev->bdaddr, addr);
+	ba2str(&ev->addr.bdaddr, addr);
 	val = bt_get_le32(&ev->value);
 
 	if (monitor)
@@ -759,7 +759,7 @@ static int mgmt_user_confirm(int mgmt_sk, uint16_t index,
 	memset(rsp, 0, sizeof(rsp));
 
 	if (fgets(rsp, sizeof(rsp), stdin) == NULL || rsp[0] == '\n')
-		return mgmt_confirm_neg_reply(mgmt_sk, index, &ev->bdaddr);
+		return mgmt_confirm_neg_reply(mgmt_sk, index, &ev->addr.bdaddr);
 
 	rsp_len = strlen(rsp);
 	if (rsp[rsp_len - 1] == '\n') {
@@ -768,9 +768,9 @@ static int mgmt_user_confirm(int mgmt_sk, uint16_t index,
 	}
 
 	if (rsp[0] == 'y' || rsp[0] == 'Y')
-		return mgmt_confirm_reply(mgmt_sk, index, &ev->bdaddr);
+		return mgmt_confirm_reply(mgmt_sk, index, &ev->addr.bdaddr);
 	else
-		return mgmt_confirm_neg_reply(mgmt_sk, index, &ev->bdaddr);
+		return mgmt_confirm_neg_reply(mgmt_sk, index, &ev->addr.bdaddr);
 }
 
 static int mgmt_handle_event(int mgmt_sk, uint16_t ev, uint16_t index,
@@ -1129,7 +1129,7 @@ static void disconnect_rsp(int mgmt_sk, uint16_t op, uint16_t id,
 		exit(EXIT_FAILURE);
 	}
 
-	ba2str(&rp->bdaddr, addr);
+	ba2str(&rp->addr.bdaddr, addr);
 
 	if (rp->status == 0) {
 		printf("%s disconnected\n", addr);
@@ -1151,7 +1151,7 @@ static void cmd_disconnect(int mgmt_sk, uint16_t index, int argc, char **argv)
 		exit(EXIT_FAILURE);
 	}
 
-	str2ba(argv[1], &cp.bdaddr);
+	str2ba(argv[1], &cp.addr.bdaddr);
 
 	if (index == MGMT_INDEX_NONE)
 		index = 0;
@@ -1404,40 +1404,40 @@ static void cmd_pair(int mgmt_sk, uint16_t index, int argc, char **argv)
 	}
 }
 
-static void remove_rsp(int mgmt_sk, uint16_t op, uint16_t id, uint8_t status,
+static void unpair_rsp(int mgmt_sk, uint16_t op, uint16_t id, uint8_t status,
 				void *rsp, uint16_t len, void *user_data)
 {
-	struct mgmt_rp_remove_keys *rp = rsp;
+	struct mgmt_rp_unpair_device *rp = rsp;
 	char addr[18];
 
 	if (status != 0) {
-		fprintf(stderr, "Remove keys failed with status 0x%02x (%s)\n",
+		fprintf(stderr, "Unpair device failed. status 0x%02x (%s)\n",
 						status, mgmt_errstr(status));
 		exit(EXIT_FAILURE);
 	}
 
 	if (len != sizeof(*rp)) {
-		fprintf(stderr, "Unexpected remove_keys_rsp len %u\n", len);
+		fprintf(stderr, "Unexpected unpair_device_rsp len %u\n", len);
 		exit(EXIT_FAILURE);
 	}
 
-	ba2str(&rp->bdaddr, addr);
+	ba2str(&rp->addr.bdaddr, addr);
 
 	if (rp->status != 0) {
 		fprintf(stderr,
-			"Removing keys for %s failed. status 0x%02x (%s)\n",
+			"Unpairing %s failed. status 0x%02x (%s)\n",
 				addr, rp->status, mgmt_errstr(rp->status));
 		exit(EXIT_FAILURE);
 	}
 
-	printf("Removed keys for %s\n", addr);
+	printf("%s unpaired\n", addr);
 
 	exit(EXIT_SUCCESS);
 }
 
-static void cmd_remove(int mgmt_sk, uint16_t index, int argc, char **argv)
+static void cmd_unpair(int mgmt_sk, uint16_t index, int argc, char **argv)
 {
-	struct mgmt_cp_remove_keys cp;
+	struct mgmt_cp_unpair_device cp;
 
 	if (argc < 2) {
 		printf("Usage: btmgmt %s <remote address>\n", argv[0]);
@@ -1448,12 +1448,12 @@ static void cmd_remove(int mgmt_sk, uint16_t index, int argc, char **argv)
 		index = 0;
 
 	memset(&cp, 0, sizeof(cp));
-	str2ba(argv[1], &cp.bdaddr);
+	str2ba(argv[1], &cp.addr.bdaddr);
 	cp.disconnect = 1;
 
-	if (mgmt_send_cmd(mgmt_sk, MGMT_OP_REMOVE_KEYS, index, &cp, sizeof(cp),
-						remove_rsp, NULL) < 0) {
-		fprintf(stderr, "Unable to send remove_keys cmd\n");
+	if (mgmt_send_cmd(mgmt_sk, MGMT_OP_UNPAIR_DEVICE, index, &cp,
+					sizeof(cp), unpair_rsp, NULL) < 0) {
+		fprintf(stderr, "Unable to send unpair_device cmd\n");
 		exit(EXIT_FAILURE);
 	}
 }
@@ -1505,7 +1505,7 @@ static struct {
 	{ "find",	cmd_find,	"Discover nearby devices"	},
 	{ "name",	cmd_name,	"Set local name"		},
 	{ "pair",	cmd_pair,	"Pair with a remote device"	},
-	{ "remove",	cmd_remove,	"Remove pairing (all keys)"	},
+	{ "unpair",	cmd_unpair,	"Unpair device"			},
 	{ "keys",	cmd_keys,	"Load Keys"			},
 	{ NULL, NULL, 0 }
 };
diff --git a/plugins/mgmtops.c b/plugins/mgmtops.c
index 4424ec9..519e34c 100644
--- a/plugins/mgmtops.c
+++ b/plugins/mgmtops.c
@@ -604,7 +604,7 @@ static int mgmt_confirm_reply(int index, bdaddr_t *bdaddr, gboolean success)
 	hdr->index = htobs(index);
 
 	cp = (void *) &buf[sizeof(*hdr)];
-	bacpy(&cp->bdaddr, bdaddr);
+	bacpy(&cp->addr.bdaddr, bdaddr);
 
 	if (write(mgmt_sock, buf, sizeof(buf)) < 0)
 		return -errno;
@@ -632,7 +632,7 @@ static int mgmt_passkey_reply(int index, bdaddr_t *bdaddr, uint32_t passkey)
 		hdr->len = htobs(sizeof(*cp));
 
 		cp = (void *) &buf[sizeof(*hdr)];
-		bacpy(&cp->bdaddr, bdaddr);
+		bacpy(&cp->addr.bdaddr, bdaddr);
 
 		buf_len = sizeof(*hdr) + sizeof(*cp);
 	} else {
@@ -642,7 +642,7 @@ static int mgmt_passkey_reply(int index, bdaddr_t *bdaddr, uint32_t passkey)
 		hdr->len = htobs(sizeof(*cp));
 
 		cp = (void *) &buf[sizeof(*hdr)];
-		bacpy(&cp->bdaddr, bdaddr);
+		bacpy(&cp->addr.bdaddr, bdaddr);
 		cp->passkey = htobl(passkey);
 
 		buf_len = sizeof(*hdr) + sizeof(*cp);
@@ -666,7 +666,7 @@ static void mgmt_passkey_request(int sk, uint16_t index, void *buf, size_t len)
 		return;
 	}
 
-	ba2str(&ev->bdaddr, addr);
+	ba2str(&ev->addr.bdaddr, addr);
 
 	DBG("hci%u %s", index, addr);
 
@@ -677,10 +677,10 @@ static void mgmt_passkey_request(int sk, uint16_t index, void *buf, size_t len)
 
 	info = &controllers[index];
 
-	err = btd_event_user_passkey(&info->bdaddr, &ev->bdaddr);
+	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->bdaddr, INVALID_PASSKEY);
+		mgmt_passkey_reply(index, &ev->addr.bdaddr, INVALID_PASSKEY);
 	}
 }
 
@@ -717,7 +717,7 @@ static void mgmt_user_confirm_request(int sk, uint16_t index, void *buf,
 		return;
 	}
 
-	ba2str(&ev->bdaddr, addr);
+	ba2str(&ev->addr.bdaddr, addr);
 
 	DBG("hci%u %s confirm_hint %u", index, addr, ev->confirm_hint);
 
@@ -732,7 +732,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->bdaddr);
+		bacpy(&data->bdaddr, &ev->addr.bdaddr);
 
 		g_timeout_add_seconds_full(G_PRIORITY_DEFAULT, 1,
 						confirm_accept, data, g_free);
@@ -741,11 +741,11 @@ static void mgmt_user_confirm_request(int sk, uint16_t index, void *buf,
 
 	info = &controllers[index];
 
-	err = btd_event_user_confirm(&info->bdaddr, &ev->bdaddr,
+	err = btd_event_user_confirm(&info->bdaddr, &ev->addr.bdaddr,
 							btohl(ev->value));
 	if (err < 0) {
 		error("btd_event_user_confirm: %s", strerror(-err));
-		mgmt_confirm_reply(index, &ev->bdaddr, FALSE);
+		mgmt_confirm_reply(index, &ev->addr.bdaddr, FALSE);
 	}
 }
 
@@ -930,7 +930,7 @@ static void disconnect_complete(int sk, uint16_t index, void *buf, size_t len)
 		return;
 	}
 
-	ba2str(&rp->bdaddr, addr);
+	ba2str(&rp->addr.bdaddr, addr);
 
 	if (rp->status != 0) {
 		error("Disconnecting %s failed with status %u",
@@ -947,9 +947,9 @@ static void disconnect_complete(int sk, uint16_t index, void *buf, size_t len)
 
 	info = &controllers[index];
 
-	btd_event_disconn_complete(&info->bdaddr, &rp->bdaddr);
+	btd_event_disconn_complete(&info->bdaddr, &rp->addr.bdaddr);
 
-	bonding_complete(info, &rp->bdaddr, HCI_CONNECTION_TERMINATED);
+	bonding_complete(info, &rp->addr.bdaddr, HCI_CONNECTION_TERMINATED);
 }
 
 static void pair_device_complete(int sk, uint16_t index, void *buf, size_t len)
@@ -1133,8 +1133,8 @@ static void mgmt_cmd_complete(int sk, uint16_t index, void *buf, size_t len)
 	case MGMT_OP_LOAD_LINK_KEYS:
 		DBG("load_link_keys complete");
 		break;
-	case MGMT_OP_REMOVE_KEYS:
-		DBG("remove_keys complete");
+	case MGMT_OP_UNPAIR_DEVICE:
+		DBG("unpair_device complete");
 		break;
 	case MGMT_OP_DISCONNECT:
 		DBG("disconnect complete");
@@ -1246,7 +1246,7 @@ static void mgmt_auth_failed(int sk, uint16_t index, void *buf, size_t len)
 
 	info = &controllers[index];
 
-	bonding_complete(info, &ev->bdaddr, ev->status);
+	bonding_complete(info, &ev->addr.bdaddr, ev->status);
 }
 
 static void mgmt_local_name_changed(int sk, uint16_t index, void *buf, size_t len)
@@ -1354,7 +1354,7 @@ static void mgmt_device_blocked(int sk, uint16_t index, void *buf, size_t len)
 		return;
 	}
 
-	ba2str(&ev->bdaddr, addr);
+	ba2str(&ev->addr.bdaddr, addr);
 	DBG("Device blocked, index %u, addr %s", index, addr);
 
 	if (index > max_index) {
@@ -1364,7 +1364,7 @@ static void mgmt_device_blocked(int sk, uint16_t index, void *buf, size_t len)
 
 	info = &controllers[index];
 
-	btd_event_device_blocked(&info->bdaddr, &ev->bdaddr);
+	btd_event_device_blocked(&info->bdaddr, &ev->addr.bdaddr);
 }
 
 static void mgmt_device_unblocked(int sk, uint16_t index, void *buf, size_t len)
@@ -1378,7 +1378,7 @@ static void mgmt_device_unblocked(int sk, uint16_t index, void *buf, size_t len)
 		return;
 	}
 
-	ba2str(&ev->bdaddr, addr);
+	ba2str(&ev->addr.bdaddr, addr);
 	DBG("Device unblocked, index %u, addr %s", index, addr);
 
 	if (index > max_index) {
@@ -1388,7 +1388,7 @@ static void mgmt_device_unblocked(int sk, uint16_t index, void *buf, size_t len)
 
 	info = &controllers[index];
 
-	btd_event_device_unblocked(&info->bdaddr, &ev->bdaddr);
+	btd_event_device_unblocked(&info->bdaddr, &ev->addr.bdaddr);
 }
 
 static void mgmt_new_ltk(int sk, uint16_t index, void *buf, size_t len)
@@ -1753,7 +1753,7 @@ static int mgmt_block_device(int index, bdaddr_t *bdaddr)
 	hdr->index = htobs(index);
 
 	cp = (void *) &buf[sizeof(*hdr)];
-	bacpy(&cp->bdaddr, bdaddr);
+	bacpy(&cp->addr.bdaddr, bdaddr);
 
 	buf_len = sizeof(*hdr) + sizeof(*cp);
 
@@ -1781,7 +1781,7 @@ static int mgmt_unblock_device(int index, bdaddr_t *bdaddr)
 	hdr->index = htobs(index);
 
 	cp = (void *) &buf[sizeof(*hdr)];
-	bacpy(&cp->bdaddr, bdaddr);
+	bacpy(&cp->addr.bdaddr, bdaddr);
 
 	buf_len = sizeof(*hdr) + sizeof(*cp);
 
@@ -1818,7 +1818,7 @@ static int mgmt_disconnect(int index, bdaddr_t *bdaddr)
 	hdr->len = htobs(sizeof(*cp));
 	hdr->index = htobs(index);
 
-	bacpy(&cp->bdaddr, bdaddr);
+	bacpy(&cp->addr.bdaddr, bdaddr);
 
 	if (write(mgmt_sock, buf, sizeof(buf)) < 0)
 		error("write: %s (%d)", strerror(errno), errno);
@@ -1826,22 +1826,22 @@ static int mgmt_disconnect(int index, bdaddr_t *bdaddr)
 	return 0;
 }
 
-static int mgmt_remove_bonding(int index, bdaddr_t *bdaddr)
+static int mgmt_unpair_device(int index, bdaddr_t *bdaddr)
 {
-	char buf[MGMT_HDR_SIZE + sizeof(struct mgmt_cp_remove_keys)];
+	char buf[MGMT_HDR_SIZE + sizeof(struct mgmt_cp_unpair_device)];
 	struct mgmt_hdr *hdr = (void *) buf;
-	struct mgmt_cp_remove_keys *cp = (void *) &buf[sizeof(*hdr)];
+	struct mgmt_cp_unpair_device *cp = (void *) &buf[sizeof(*hdr)];
 	char addr[18];
 
 	ba2str(bdaddr, addr);
 	DBG("index %d addr %s", index, addr);
 
 	memset(buf, 0, sizeof(buf));
-	hdr->opcode = htobs(MGMT_OP_REMOVE_KEYS);
+	hdr->opcode = htobs(MGMT_OP_UNPAIR_DEVICE);
 	hdr->len = htobs(sizeof(*cp));
 	hdr->index = htobs(index);
 
-	bacpy(&cp->bdaddr, bdaddr);
+	bacpy(&cp->addr.bdaddr, bdaddr);
 	cp->disconnect = 1;
 
 	if (write(mgmt_sock, buf, sizeof(buf)) < 0)
@@ -2035,7 +2035,7 @@ static int mgmt_add_remote_oob_data(int index, bdaddr_t *bdaddr,
 	hdr->index = htobs(index);
 	hdr->len = htobs(sizeof(*cp));
 
-	bacpy(&cp->bdaddr, bdaddr);
+	bacpy(&cp->addr.bdaddr, bdaddr);
 	memcpy(cp->hash, hash, 16);
 	memcpy(cp->randomizer, randomizer, 16);
 
@@ -2061,7 +2061,7 @@ static int mgmt_remove_remote_oob_data(int index, bdaddr_t *bdaddr)
 	hdr->index = htobs(index);
 	hdr->len = htobs(sizeof(*cp));
 
-	bacpy(&cp->bdaddr, bdaddr);
+	bacpy(&cp->addr.bdaddr, bdaddr);
 
 	if (write(mgmt_sock, &buf, sizeof(buf)) < 0)
 		return -errno;
@@ -2165,7 +2165,7 @@ static struct btd_adapter_ops mgmt_ops = {
 	.unblock_device = mgmt_unblock_device,
 	.get_conn_list = mgmt_get_conn_list,
 	.disconnect = mgmt_disconnect,
-	.remove_bonding = mgmt_remove_bonding,
+	.remove_bonding = mgmt_unpair_device,
 	.pincode_reply = mgmt_pincode_reply,
 	.confirm_reply = mgmt_confirm_reply,
 	.passkey_reply = mgmt_passkey_reply,