All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 00/14] android: Initial support for pairing
@ 2013-10-31  2:55 Szymon Janc
  2013-10-31  2:55 ` [PATCH 01/14] android: Add missing bonding state definitions to IPC specification Szymon Janc
                   ` (13 more replies)
  0 siblings, 14 replies; 18+ messages in thread
From: Szymon Janc @ 2013-10-31  2:55 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Szymon Janc

Hi,

Following patches add support for pairing with remote device. Currently
link keys are not yet stored on fs.

This was tested for ssp and legacy pairing with haltest on PC only.
Still need to test those on Android. Some debugs logs from that code
could probably be also improved.

Comments are welcome.

BR
Szymon Janc

Szymon Janc (14):
  android: Add missing bonding state definitions to IPC specification
  android: Add missing bond state definition to IPC header
  android: Add support for handling new link key mgmt event
  android: Make load_link_keys function load keys
  android: Set default IO capability on daemon start
  android: Add support for handling create bond command
  android: Add support for handling cancel bond command
  android: Add support for handling remove bond command
  android: Add support for sending pin code request
  android: Add initial support for sending SSP request event
  android: Add support for entry variant in SSP request event
  android: Add support for notify variant in SSP request event
  android: Add support for handling pin reply command
  android: Add support for handling SSP reply command

 android/adapter.c       | 468 +++++++++++++++++++++++++++++++++++++++++++++++-
 android/hal-ipc-api.txt |   4 +
 android/hal-msg.h       |   4 +
 3 files changed, 467 insertions(+), 9 deletions(-)

-- 
1.8.4.rc3


^ permalink raw reply	[flat|nested] 18+ messages in thread

* [PATCH 01/14] android: Add missing bonding state definitions to IPC specification
  2013-10-31  2:55 [PATCH 00/14] android: Initial support for pairing Szymon Janc
@ 2013-10-31  2:55 ` Szymon Janc
  2013-10-31  2:55 ` [PATCH 02/14] android: Add missing bond state definition to IPC header Szymon Janc
                   ` (12 subsequent siblings)
  13 siblings, 0 replies; 18+ messages in thread
From: Szymon Janc @ 2013-10-31  2:55 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Szymon Janc

---
 android/hal-ipc-api.txt | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/android/hal-ipc-api.txt b/android/hal-ipc-api.txt
index e7af8a3..a5d1980 100644
--- a/android/hal-ipc-api.txt
+++ b/android/hal-ipc-api.txt
@@ -370,6 +370,10 @@ Notifications:
 		                         Remote address (6 octets)
 		                         Bond state (1 octet)
 
+		Valid bond state values: 0x00 = None
+		                         0x01 = Bonding
+		                         0x02 = Bonded
+
 	Opcode 0x89 - ACL State Changed notification
 
 		Notification parameters: Status (1 octect)
-- 
1.8.4.rc3


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH 02/14] android: Add missing bond state definition to IPC header
  2013-10-31  2:55 [PATCH 00/14] android: Initial support for pairing Szymon Janc
  2013-10-31  2:55 ` [PATCH 01/14] android: Add missing bonding state definitions to IPC specification Szymon Janc
@ 2013-10-31  2:55 ` Szymon Janc
  2013-10-31  2:55 ` [PATCH 03/14] android: Add support for handling new link key mgmt event Szymon Janc
                   ` (11 subsequent siblings)
  13 siblings, 0 replies; 18+ messages in thread
From: Szymon Janc @ 2013-10-31  2:55 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Szymon Janc

---
 android/hal-msg.h | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/android/hal-msg.h b/android/hal-msg.h
index d2a0e2a..b0ee73c 100644
--- a/android/hal-msg.h
+++ b/android/hal-msg.h
@@ -372,6 +372,10 @@ struct hal_ev_ssp_request {
 	uint32_t passkey;
 } __attribute__((packed));
 
+#define HAL_BOND_STATE_NONE 0
+#define HAL_BOND_STATE_BONDING 1
+#define HAL_BOND_STATE_BONDED 2
+
 #define HAL_EV_BOND_STATE_CHANGED	0x88
 struct hal_ev_bond_state_changed {
 	uint8_t status;
-- 
1.8.4.rc3


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH 03/14] android: Add support for handling new link key mgmt event
  2013-10-31  2:55 [PATCH 00/14] android: Initial support for pairing Szymon Janc
  2013-10-31  2:55 ` [PATCH 01/14] android: Add missing bonding state definitions to IPC specification Szymon Janc
  2013-10-31  2:55 ` [PATCH 02/14] android: Add missing bond state definition to IPC header Szymon Janc
@ 2013-10-31  2:55 ` Szymon Janc
  2013-10-31  2:55 ` [PATCH 04/14] android: Make load_link_keys function load keys Szymon Janc
                   ` (10 subsequent siblings)
  13 siblings, 0 replies; 18+ messages in thread
From: Szymon Janc @ 2013-10-31  2:55 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Szymon Janc

When link key is emitted by kernel bond state change notification is
send to HAL. Storing link key is not yet implemented.
---
 android/adapter.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 57 insertions(+)

diff --git a/android/adapter.c b/android/adapter.c
index 15b65e5..4b4905b 100644
--- a/android/adapter.c
+++ b/android/adapter.c
@@ -195,6 +195,60 @@ static void mgmt_dev_class_changed_event(uint16_t index, uint16_t length,
 	/* TODO: Gatt attrib set*/
 }
 
+static void store_link_key(const bdaddr_t *dst, const uint8_t *key,
+					uint8_t type, uint8_t pin_length)
+{
+	/* TODO store link key */
+
+}
+
+static void send_bond_state_change(const bdaddr_t *addr, uint8_t status,
+								uint8_t state)
+{
+	struct hal_ev_bond_state_changed ev;
+
+	ev.status = status;
+	ev.state = state;
+	bdaddr2android(addr, ev.bdaddr);
+
+	ipc_send(notification_io, HAL_SERVICE_ID_BLUETOOTH,
+			HAL_EV_BOND_STATE_CHANGED, sizeof(ev), &ev, -1);
+}
+
+static void new_link_key_callback(uint16_t index, uint16_t length,
+					const void *param, void *user_data)
+{
+	const struct mgmt_ev_new_link_key *ev = param;
+	const struct mgmt_addr_info *addr = &ev->key.addr;
+	char dst[18];
+
+	if (length < sizeof(*ev)) {
+		error("Too small new link key event");
+		return;
+	}
+
+	ba2str(&addr->bdaddr, dst);
+
+	DBG("new key for %s type %u pin_len %u",
+					dst, ev->key.type, ev->key.pin_len);
+
+	if (ev->key.pin_len > 16) {
+		error("Invalid PIN length (%u) in new_key event",
+							ev->key.pin_len);
+		return;
+	}
+
+	if (ev->store_hint) {
+		const struct mgmt_link_key_info *key = &ev->key;
+
+		store_link_key(&addr->bdaddr, key->val, key->type,
+								key->pin_len);
+	}
+
+	send_bond_state_change(&addr->bdaddr, HAL_STATUS_SUCCESS,
+							HAL_BOND_STATE_BONDED);
+}
+
 static void register_mgmt_handlers(void)
 {
 	mgmt_register(adapter->mgmt, MGMT_EV_NEW_SETTINGS, adapter->index,
@@ -207,6 +261,9 @@ static void register_mgmt_handlers(void)
 	mgmt_register(adapter->mgmt, MGMT_EV_LOCAL_NAME_CHANGED,
 				adapter->index, mgmt_local_name_changed_event,
 				NULL, NULL);
+
+	mgmt_register(adapter->mgmt, MGMT_EV_NEW_LINK_KEY, adapter->index,
+					new_link_key_callback, NULL, NULL);
 }
 
 static void load_link_keys_complete(uint8_t status, uint16_t length,
-- 
1.8.4.rc3


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH 04/14] android: Make load_link_keys function load keys
  2013-10-31  2:55 [PATCH 00/14] android: Initial support for pairing Szymon Janc
                   ` (2 preceding siblings ...)
  2013-10-31  2:55 ` [PATCH 03/14] android: Add support for handling new link key mgmt event Szymon Janc
@ 2013-10-31  2:55 ` Szymon Janc
  2013-10-31  2:55 ` [PATCH 05/14] android: Set default IO capability on daemon start Szymon Janc
                   ` (9 subsequent siblings)
  13 siblings, 0 replies; 18+ messages in thread
From: Szymon Janc @ 2013-10-31  2:55 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Szymon Janc

GSlist passed is expected to hold mgmt_link_key_info structures.
---
 android/adapter.c | 33 ++++++++++++++++++++++++---------
 1 file changed, 24 insertions(+), 9 deletions(-)

diff --git a/android/adapter.c b/android/adapter.c
index 4b4905b..d55a070 100644
--- a/android/adapter.c
+++ b/android/adapter.c
@@ -290,22 +290,37 @@ failed:
 static void load_link_keys(GSList *keys)
 {
 	struct mgmt_cp_load_link_keys *cp;
-	size_t key_len = g_slist_length(keys);
 	struct mgmt_link_key_info *key;
-	size_t len;
+	size_t key_count, cp_size;
+	unsigned int id;
 
-	DBG("");
+	key_count = g_slist_length(keys);
+
+	DBG("keys %zu ", key_count);
+
+	cp_size = sizeof(*cp) + (key_count * sizeof(*key));
+
+	cp = g_malloc0(cp_size);
 
-	len = sizeof(*cp) + key_len * sizeof(*key);
-	cp = g_malloc0(len);
+	/*
+	 * Even if the list of stored keys is empty, it is important to
+	 * load an empty list into the kernel. That way it is ensured
+	 * that no old keys from a previous daemon are present.
+	 */
+	cp->key_count = htobs(key_count);
 
-	cp->debug_keys = 0;
-	cp->key_count = htobs(key_len);
+	for (key = cp->keys; keys != NULL; keys = g_slist_next(keys), key++)
+		memcpy(key, keys->data, sizeof(*key));
 
-	mgmt_send(adapter->mgmt, MGMT_OP_LOAD_LINK_KEYS, adapter->index, len,
-				cp, load_link_keys_complete, NULL, NULL);
+	id = mgmt_send(adapter->mgmt, MGMT_OP_LOAD_LINK_KEYS, adapter->index,
+			cp_size, cp, load_link_keys_complete, NULL, NULL);
 
 	g_free(cp);
+
+	if (id == 0) {
+		error("Failed to load link keys");
+		adapter->ready(-EIO);
+	}
 }
 
 static void set_mode_complete(uint8_t status, uint16_t length,
-- 
1.8.4.rc3


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH 05/14] android: Set default IO capability on daemon start
  2013-10-31  2:55 [PATCH 00/14] android: Initial support for pairing Szymon Janc
                   ` (3 preceding siblings ...)
  2013-10-31  2:55 ` [PATCH 04/14] android: Make load_link_keys function load keys Szymon Janc
@ 2013-10-31  2:55 ` Szymon Janc
  2013-10-31  2:55 ` [PATCH 06/14] android: Add support for handling create bond command Szymon Janc
                   ` (8 subsequent siblings)
  13 siblings, 0 replies; 18+ messages in thread
From: Szymon Janc @ 2013-10-31  2:55 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Szymon Janc

There is no HAL function for setting IO capabilities so this is
hardcoded to DisplayYesNo as Android devices usually have screen
and input.
---
 android/adapter.c | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/android/adapter.c b/android/adapter.c
index d55a070..d730dde 100644
--- a/android/adapter.c
+++ b/android/adapter.c
@@ -34,6 +34,9 @@
 #include "utils.h"
 #include "adapter.h"
 
+/* Default to DisplayYesNo */
+#define DEFAULT_IO_CAPABILITY 0x01
+
 static GIOChannel *notification_io = NULL;
 
 struct bt_adapter {
@@ -358,6 +361,19 @@ static bool set_mode(uint16_t opcode, uint8_t mode)
 	return false;
 }
 
+static void set_io_capability(void)
+{
+	struct mgmt_cp_set_io_capability cp;
+
+	memset(&cp, 0, sizeof(cp));
+	cp.io_capability = DEFAULT_IO_CAPABILITY;
+
+	if (mgmt_send(adapter->mgmt, MGMT_OP_SET_IO_CAPABILITY,
+				adapter->index, sizeof(cp), &cp,
+				NULL, NULL, NULL) == 0)
+		error("Failed to set IO capability");
+}
+
 static void read_info_complete(uint8_t status, uint16_t length, const void *param,
 							void *user_data)
 {
@@ -399,6 +415,7 @@ static void read_info_complete(uint8_t status, uint16_t length, const void *para
 
 	load_link_keys(NULL);
 
+	set_io_capability();
 	set_mode(MGMT_OP_SET_PAIRABLE, 0x01);
 
 	return;
-- 
1.8.4.rc3


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH 06/14] android: Add support for handling create bond command
  2013-10-31  2:55 [PATCH 00/14] android: Initial support for pairing Szymon Janc
                   ` (4 preceding siblings ...)
  2013-10-31  2:55 ` [PATCH 05/14] android: Set default IO capability on daemon start Szymon Janc
@ 2013-10-31  2:55 ` Szymon Janc
  2013-10-31  2:55 ` [PATCH 07/14] android: Add support for handling cancel " Szymon Janc
                   ` (7 subsequent siblings)
  13 siblings, 0 replies; 18+ messages in thread
From: Szymon Janc @ 2013-10-31  2:55 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Szymon Janc

---
 android/adapter.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 63 insertions(+)

diff --git a/android/adapter.c b/android/adapter.c
index d730dde..8c5482b 100644
--- a/android/adapter.c
+++ b/android/adapter.c
@@ -568,6 +568,64 @@ static uint8_t set_property(void *buf, uint16_t len)
 	}
 }
 
+static uint8_t status_mgmt2hal(uint8_t mgmt)
+{
+	switch (mgmt) {
+	case MGMT_STATUS_SUCCESS:
+		return HAL_STATUS_SUCCESS;
+	case MGMT_STATUS_NO_RESOURCES:
+		return HAL_STATUS_NOMEM;
+	case MGMT_STATUS_BUSY:
+		return HAL_STATUS_BUSY;
+	case MGMT_STATUS_NOT_SUPPORTED:
+		return HAL_STATUS_UNSUPPORTED;
+	case MGMT_STATUS_INVALID_PARAMS:
+		return HAL_STATUS_INVALID;
+	case MGMT_STATUS_AUTH_FAILED:
+		return HAL_STATUS_AUTH_FAILURE;
+	case MGMT_STATUS_NOT_CONNECTED:
+		return HAL_STATUS_REMOTE_DEVICE_DOWN;
+	default:
+		return HAL_STATUS_FAILED;
+	}
+}
+
+static void pair_device_complete(uint8_t status, uint16_t length,
+					const void *param, void *user_data)
+{
+	const struct mgmt_rp_pair_device *rp = param;
+
+	DBG("status %u", status);
+
+	/* On success bond state change will be send when new link key event
+	 * is received */
+	if (status == MGMT_STATUS_SUCCESS)
+		return;
+
+	send_bond_state_change(&rp->addr.bdaddr, status_mgmt2hal(status),
+							HAL_BOND_STATE_NONE);
+}
+
+static bool create_bond(void *buf, uint16_t len)
+{
+	struct hal_cmd_create_bond *cmd = buf;
+	struct mgmt_cp_pair_device cp;
+
+	cp.io_cap = DEFAULT_IO_CAPABILITY;
+	cp.addr.type = BDADDR_BREDR;
+	android2bdaddr(cmd->bdaddr, &cp.addr.bdaddr);
+
+	if (mgmt_send(adapter->mgmt, MGMT_OP_PAIR_DEVICE, adapter->index,
+				sizeof(cp), &cp, pair_device_complete, NULL,
+				NULL) == 0)
+		return false;
+
+	send_bond_state_change(&cp.addr.bdaddr, HAL_STATUS_SUCCESS,
+						HAL_BOND_STATE_BONDING);
+
+	return true;
+}
+
 void bt_adapter_handle_cmd(GIOChannel *io, uint8_t opcode, void *buf,
 								uint16_t len)
 {
@@ -605,6 +663,11 @@ void bt_adapter_handle_cmd(GIOChannel *io, uint8_t opcode, void *buf,
 			goto error;
 
 		break;
+	case HAL_OP_CREATE_BOND:
+		if (!create_bond(buf, len))
+			goto error;
+
+		break;
 	default:
 		DBG("Unhandled command, opcode 0x%x", opcode);
 		goto error;
-- 
1.8.4.rc3


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH 07/14] android: Add support for handling cancel bond command
  2013-10-31  2:55 [PATCH 00/14] android: Initial support for pairing Szymon Janc
                   ` (5 preceding siblings ...)
  2013-10-31  2:55 ` [PATCH 06/14] android: Add support for handling create bond command Szymon Janc
@ 2013-10-31  2:55 ` Szymon Janc
  2013-10-31  8:50   ` Johan Hedberg
  2013-10-31  2:55 ` [PATCH 08/14] android: Add support for handling remove " Szymon Janc
                   ` (6 subsequent siblings)
  13 siblings, 1 reply; 18+ messages in thread
From: Szymon Janc @ 2013-10-31  2:55 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Szymon Janc

---
 android/adapter.c | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/android/adapter.c b/android/adapter.c
index 8c5482b..0f174a6 100644
--- a/android/adapter.c
+++ b/android/adapter.c
@@ -626,6 +626,19 @@ static bool create_bond(void *buf, uint16_t len)
 	return true;
 }
 
+static bool cancel_bond(void *buf, uint16_t len)
+{
+	struct hal_cmd_cancel_bond *cmd = buf;
+	struct mgmt_addr_info cp;
+
+	cp.type = BDADDR_BREDR;
+	android2bdaddr(cmd->bdaddr, &cp.bdaddr);
+
+	return mgmt_reply(adapter->mgmt, MGMT_OP_CANCEL_PAIR_DEVICE,
+				adapter->index, sizeof(cp), &cp, NULL, NULL,
+				NULL) > 0;
+}
+
 void bt_adapter_handle_cmd(GIOChannel *io, uint8_t opcode, void *buf,
 								uint16_t len)
 {
@@ -668,6 +681,11 @@ void bt_adapter_handle_cmd(GIOChannel *io, uint8_t opcode, void *buf,
 			goto error;
 
 		break;
+	case HAL_OP_CANCEL_BOND:
+		if (!cancel_bond(buf, len))
+			goto error;
+
+		break;
 	default:
 		DBG("Unhandled command, opcode 0x%x", opcode);
 		goto error;
-- 
1.8.4.rc3


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH 08/14] android: Add support for handling remove bond command
  2013-10-31  2:55 [PATCH 00/14] android: Initial support for pairing Szymon Janc
                   ` (6 preceding siblings ...)
  2013-10-31  2:55 ` [PATCH 07/14] android: Add support for handling cancel " Szymon Janc
@ 2013-10-31  2:55 ` Szymon Janc
  2013-10-31  8:48   ` Johan Hedberg
  2013-10-31  2:55 ` [PATCH 09/14] android: Add support for sending pin code request Szymon Janc
                   ` (5 subsequent siblings)
  13 siblings, 1 reply; 18+ messages in thread
From: Szymon Janc @ 2013-10-31  2:55 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Szymon Janc

---
 android/adapter.c | 25 +++++++++++++++++++++++++
 1 file changed, 25 insertions(+)

diff --git a/android/adapter.c b/android/adapter.c
index 0f174a6..0a91149 100644
--- a/android/adapter.c
+++ b/android/adapter.c
@@ -639,6 +639,26 @@ static bool cancel_bond(void *buf, uint16_t len)
 				NULL) > 0;
 }
 
+static bool remove_bond(void *buf, uint16_t len)
+{
+	struct hal_cmd_remove_bond *cmd = buf;
+	struct mgmt_cp_unpair_device cp;
+
+	cp.disconnect = 1;
+	cp.addr.type = BDADDR_BREDR;
+	android2bdaddr(cmd->bdaddr, &cp.addr.bdaddr);
+
+	if (mgmt_send(adapter->mgmt, MGMT_OP_UNPAIR_DEVICE,
+				adapter->index, sizeof(cp), &cp,
+				NULL, NULL, NULL) == 0)
+		return false;
+
+	send_bond_state_change(&cp.addr.bdaddr, HAL_STATUS_SUCCESS,
+							HAL_BOND_STATE_NONE);
+
+	return true;
+}
+
 void bt_adapter_handle_cmd(GIOChannel *io, uint8_t opcode, void *buf,
 								uint16_t len)
 {
@@ -686,6 +706,11 @@ void bt_adapter_handle_cmd(GIOChannel *io, uint8_t opcode, void *buf,
 			goto error;
 
 		break;
+	case HAL_OP_REMOVE_BOND:
+		if (!remove_bond(buf, len))
+			goto error;
+
+		break;
 	default:
 		DBG("Unhandled command, opcode 0x%x", opcode);
 		goto error;
-- 
1.8.4.rc3


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH 09/14] android: Add support for sending pin code request
  2013-10-31  2:55 [PATCH 00/14] android: Initial support for pairing Szymon Janc
                   ` (7 preceding siblings ...)
  2013-10-31  2:55 ` [PATCH 08/14] android: Add support for handling remove " Szymon Janc
@ 2013-10-31  2:55 ` Szymon Janc
  2013-10-31  2:55 ` [PATCH 10/14] android: Add initial support for sending SSP request event Szymon Janc
                   ` (4 subsequent siblings)
  13 siblings, 0 replies; 18+ messages in thread
From: Szymon Janc @ 2013-10-31  2:55 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Szymon Janc

---
 android/adapter.c | 27 +++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)

diff --git a/android/adapter.c b/android/adapter.c
index 0a91149..0c5ae8b 100644
--- a/android/adapter.c
+++ b/android/adapter.c
@@ -252,6 +252,30 @@ static void new_link_key_callback(uint16_t index, uint16_t length,
 							HAL_BOND_STATE_BONDED);
 }
 
+static void pin_code_request_callback(uint16_t index, uint16_t length,
+					const void *param, void *user_data)
+{
+	const struct mgmt_ev_pin_code_request *ev = param;
+	struct hal_ev_pin_request hal_ev;
+	char dst[18];
+
+	if (length < sizeof(*ev)) {
+		error("Too small PIN code request event");
+		return;
+	}
+
+	ba2str(&ev->addr.bdaddr, dst);
+
+	DBG("%s type %u secure %u", dst, ev->addr.type, ev->secure);
+
+	/* TODO name and CoD of remote devices should probably be cached */
+	memset(&hal_ev, 0, sizeof(hal_ev));
+	bdaddr2android(&ev->addr.bdaddr, hal_ev.bdaddr);
+
+	ipc_send(notification_io, HAL_SERVICE_ID_BLUETOOTH, HAL_EV_PIN_REQUEST,
+						sizeof(hal_ev), &hal_ev, -1);
+}
+
 static void register_mgmt_handlers(void)
 {
 	mgmt_register(adapter->mgmt, MGMT_EV_NEW_SETTINGS, adapter->index,
@@ -267,6 +291,9 @@ static void register_mgmt_handlers(void)
 
 	mgmt_register(adapter->mgmt, MGMT_EV_NEW_LINK_KEY, adapter->index,
 					new_link_key_callback, NULL, NULL);
+
+	mgmt_register(adapter->mgmt, MGMT_EV_PIN_CODE_REQUEST, adapter->index,
+					pin_code_request_callback, NULL, NULL);
 }
 
 static void load_link_keys_complete(uint8_t status, uint16_t length,
-- 
1.8.4.rc3


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH 10/14] android: Add initial support for sending SSP request event
  2013-10-31  2:55 [PATCH 00/14] android: Initial support for pairing Szymon Janc
                   ` (8 preceding siblings ...)
  2013-10-31  2:55 ` [PATCH 09/14] android: Add support for sending pin code request Szymon Janc
@ 2013-10-31  2:55 ` Szymon Janc
  2013-10-31  2:55 ` [PATCH 11/14] android: Add support for entry variant in " Szymon Janc
                   ` (3 subsequent siblings)
  13 siblings, 0 replies; 18+ messages in thread
From: Szymon Janc @ 2013-10-31  2:55 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Szymon Janc

Only consent and confirm variants are supported in this patch.
---
 android/adapter.c | 40 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 40 insertions(+)

diff --git a/android/adapter.c b/android/adapter.c
index 0c5ae8b..b99c860 100644
--- a/android/adapter.c
+++ b/android/adapter.c
@@ -276,6 +276,42 @@ static void pin_code_request_callback(uint16_t index, uint16_t length,
 						sizeof(hal_ev), &hal_ev, -1);
 }
 
+static void send_ssp_request(const bdaddr_t *addr, uint8_t variant,
+							uint32_t passkey)
+{
+	struct hal_ev_ssp_request ev;
+
+	/* TODO name and CoD of remote devices should probably be cached */
+	memset(&ev, 0, sizeof(ev));
+	bdaddr2android(addr, ev.bdaddr);
+	ev.pairing_variant = variant;
+	ev.passkey = passkey;
+
+	ipc_send(notification_io, HAL_SERVICE_ID_BLUETOOTH, HAL_EV_SSP_REQUEST,
+						sizeof(ev), &ev, -1);
+}
+
+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;
+	char dst[18];
+
+	if (length < sizeof(*ev)) {
+		error("Too small user confirm request event");
+		return;
+	}
+
+	ba2str(&ev->addr.bdaddr, dst);
+	DBG("%s confirm_hint %u", dst, ev->confirm_hint);
+
+	if (ev->confirm_hint)
+		send_ssp_request(&ev->addr.bdaddr, HAL_SSP_VARIANT_CONSENT, 0);
+	else
+		send_ssp_request(&ev->addr.bdaddr, HAL_SSP_VARIANT_CONFIRM,
+								ev->value);
+}
+
 static void register_mgmt_handlers(void)
 {
 	mgmt_register(adapter->mgmt, MGMT_EV_NEW_SETTINGS, adapter->index,
@@ -294,6 +330,10 @@ static void register_mgmt_handlers(void)
 
 	mgmt_register(adapter->mgmt, MGMT_EV_PIN_CODE_REQUEST, adapter->index,
 					pin_code_request_callback, NULL, NULL);
+
+	mgmt_register(adapter->mgmt, MGMT_EV_USER_CONFIRM_REQUEST,
+				adapter->index, user_confirm_request_callback,
+				NULL, NULL);
 }
 
 static void load_link_keys_complete(uint8_t status, uint16_t length,
-- 
1.8.4.rc3


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH 11/14] android: Add support for entry variant in SSP request event
  2013-10-31  2:55 [PATCH 00/14] android: Initial support for pairing Szymon Janc
                   ` (9 preceding siblings ...)
  2013-10-31  2:55 ` [PATCH 10/14] android: Add initial support for sending SSP request event Szymon Janc
@ 2013-10-31  2:55 ` Szymon Janc
  2013-10-31  2:55 ` [PATCH 12/14] android: Add support for notify " Szymon Janc
                   ` (2 subsequent siblings)
  13 siblings, 0 replies; 18+ messages in thread
From: Szymon Janc @ 2013-10-31  2:55 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Szymon Janc

---
 android/adapter.c | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/android/adapter.c b/android/adapter.c
index b99c860..1be0fb3 100644
--- a/android/adapter.c
+++ b/android/adapter.c
@@ -312,6 +312,23 @@ static void user_confirm_request_callback(uint16_t index, uint16_t length,
 								ev->value);
 }
 
+static void user_passkey_request_callback(uint16_t index, uint16_t length,
+					const void *param, void *user_data)
+{
+	const struct mgmt_ev_user_passkey_request *ev = param;
+	char dst[18];
+
+	if (length < sizeof(*ev)) {
+		error("Too small passkey request event");
+		return;
+	}
+
+	ba2str(&ev->addr.bdaddr, dst);
+	DBG("%s", dst);
+
+	send_ssp_request(&ev->addr.bdaddr, HAL_SSP_VARIANT_ENTRY, 0);
+}
+
 static void register_mgmt_handlers(void)
 {
 	mgmt_register(adapter->mgmt, MGMT_EV_NEW_SETTINGS, adapter->index,
@@ -334,6 +351,10 @@ static void register_mgmt_handlers(void)
 	mgmt_register(adapter->mgmt, MGMT_EV_USER_CONFIRM_REQUEST,
 				adapter->index, user_confirm_request_callback,
 				NULL, NULL);
+
+	mgmt_register(adapter->mgmt, MGMT_EV_USER_PASSKEY_REQUEST,
+				adapter->index, user_passkey_request_callback,
+				NULL, NULL);
 }
 
 static void load_link_keys_complete(uint8_t status, uint16_t length,
-- 
1.8.4.rc3


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH 12/14] android: Add support for notify variant in SSP request event
  2013-10-31  2:55 [PATCH 00/14] android: Initial support for pairing Szymon Janc
                   ` (10 preceding siblings ...)
  2013-10-31  2:55 ` [PATCH 11/14] android: Add support for entry variant in " Szymon Janc
@ 2013-10-31  2:55 ` Szymon Janc
  2013-10-31  2:55 ` [PATCH 13/14] android: Add support for handling pin reply command Szymon Janc
  2013-10-31  2:55 ` [PATCH 14/14] android: Add support for handling SSP " Szymon Janc
  13 siblings, 0 replies; 18+ messages in thread
From: Szymon Janc @ 2013-10-31  2:55 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Szymon Janc

---
 android/adapter.c | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/android/adapter.c b/android/adapter.c
index 1be0fb3..00766eb 100644
--- a/android/adapter.c
+++ b/android/adapter.c
@@ -329,6 +329,26 @@ static void user_passkey_request_callback(uint16_t index, uint16_t length,
 	send_ssp_request(&ev->addr.bdaddr, HAL_SSP_VARIANT_ENTRY, 0);
 }
 
+static void user_passkey_notify_callback(uint16_t index, uint16_t length,
+					const void *param, void *user_data)
+{
+	const struct mgmt_ev_passkey_notify *ev = param;
+	char dst[18];
+
+	if (length < sizeof(*ev)) {
+		error("Too small passkey notify event");
+		return;
+	}
+
+	ba2str(&ev->addr.bdaddr, dst);
+	DBG("%s entered %u", dst, ev->entered);
+
+	/* HAL seems to not support entered characters */
+	if (!ev->entered)
+		send_ssp_request(&ev->addr.bdaddr, HAL_SSP_VARIANT_NOTIF,
+								ev->passkey);
+}
+
 static void register_mgmt_handlers(void)
 {
 	mgmt_register(adapter->mgmt, MGMT_EV_NEW_SETTINGS, adapter->index,
@@ -355,6 +375,10 @@ static void register_mgmt_handlers(void)
 	mgmt_register(adapter->mgmt, MGMT_EV_USER_PASSKEY_REQUEST,
 				adapter->index, user_passkey_request_callback,
 				NULL, NULL);
+
+	mgmt_register(adapter->mgmt, MGMT_EV_PASSKEY_NOTIFY, adapter->index,
+				user_passkey_notify_callback, NULL, NULL);
+
 }
 
 static void load_link_keys_complete(uint8_t status, uint16_t length,
-- 
1.8.4.rc3


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH 13/14] android: Add support for handling pin reply command
  2013-10-31  2:55 [PATCH 00/14] android: Initial support for pairing Szymon Janc
                   ` (11 preceding siblings ...)
  2013-10-31  2:55 ` [PATCH 12/14] android: Add support for notify " Szymon Janc
@ 2013-10-31  2:55 ` Szymon Janc
  2013-10-31  2:55 ` [PATCH 14/14] android: Add support for handling SSP " Szymon Janc
  13 siblings, 0 replies; 18+ messages in thread
From: Szymon Janc @ 2013-10-31  2:55 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Szymon Janc

---
 android/adapter.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 49 insertions(+)

diff --git a/android/adapter.c b/android/adapter.c
index 00766eb..a6382dd 100644
--- a/android/adapter.c
+++ b/android/adapter.c
@@ -771,6 +771,49 @@ static bool remove_bond(void *buf, uint16_t len)
 	return true;
 }
 
+static uint8_t pin_reply(void *buf, uint16_t len)
+{
+	struct hal_cmd_pin_reply *cmd = buf;
+	bdaddr_t bdaddr;
+	char addr[18];
+
+	android2bdaddr(cmd->bdaddr, &bdaddr);
+	ba2str(&bdaddr, addr);
+
+	DBG("%s accept %u pin_len %u", addr, cmd->accept, cmd->pin_len);
+
+	if (!cmd->accept && cmd->pin_len)
+		return HAL_STATUS_INVALID;
+
+	if (cmd->accept) {
+		struct mgmt_cp_pin_code_reply rp;
+
+		memset(&rp, 0, sizeof(rp));
+
+		bacpy(&rp.addr.bdaddr, &bdaddr);
+		rp.addr.type = BDADDR_BREDR;
+		rp.pin_len = cmd->pin_len;
+		memcpy(rp.pin_code, cmd->pin_code, rp.pin_len);
+
+		if (mgmt_reply(adapter->mgmt, MGMT_OP_PIN_CODE_REPLY,
+					adapter->index, sizeof(rp), &rp,
+					NULL, NULL, NULL) == 0)
+			return HAL_STATUS_FAILED;
+	} else {
+		struct mgmt_cp_pin_code_neg_reply rp;
+
+		bacpy(&rp.addr.bdaddr, &bdaddr);
+		rp.addr.type = BDADDR_BREDR;
+
+		if (mgmt_reply(adapter->mgmt, MGMT_OP_PIN_CODE_NEG_REPLY,
+					adapter->index, sizeof(rp), &rp,
+					NULL, NULL, NULL) == 0)
+			return HAL_STATUS_FAILED;
+	}
+
+	return HAL_STATUS_SUCCESS;
+}
+
 void bt_adapter_handle_cmd(GIOChannel *io, uint8_t opcode, void *buf,
 								uint16_t len)
 {
@@ -823,6 +866,12 @@ void bt_adapter_handle_cmd(GIOChannel *io, uint8_t opcode, void *buf,
 			goto error;
 
 		break;
+	case HAL_OP_PIN_REPLY:
+		status = pin_reply(buf, len);
+		if (status != HAL_STATUS_SUCCESS)
+			goto error;
+
+		break;
 	default:
 		DBG("Unhandled command, opcode 0x%x", opcode);
 		goto error;
-- 
1.8.4.rc3


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH 14/14] android: Add support for handling SSP reply command
  2013-10-31  2:55 [PATCH 00/14] android: Initial support for pairing Szymon Janc
                   ` (12 preceding siblings ...)
  2013-10-31  2:55 ` [PATCH 13/14] android: Add support for handling pin reply command Szymon Janc
@ 2013-10-31  2:55 ` Szymon Janc
  2013-10-31  8:52   ` Johan Hedberg
  13 siblings, 1 reply; 18+ messages in thread
From: Szymon Janc @ 2013-10-31  2:55 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Szymon Janc

---
 android/adapter.c | 94 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 94 insertions(+)

diff --git a/android/adapter.c b/android/adapter.c
index a6382dd..9e12879 100644
--- a/android/adapter.c
+++ b/android/adapter.c
@@ -814,6 +814,94 @@ static uint8_t pin_reply(void *buf, uint16_t len)
 	return HAL_STATUS_SUCCESS;
 }
 
+static uint8_t user_confirm_reply(const bdaddr_t *bdaddr, bool accept)
+{
+	struct mgmt_addr_info cp;
+	uint16_t opcode;
+
+	if (accept)
+		opcode = MGMT_OP_USER_CONFIRM_REPLY;
+	else
+		opcode = MGMT_OP_USER_CONFIRM_NEG_REPLY;
+
+	bacpy(&cp.bdaddr, bdaddr);
+	cp.type = BDADDR_BREDR;
+
+	if (mgmt_reply(adapter->mgmt, opcode, adapter->index, sizeof(cp), &cp,
+							NULL, NULL, NULL) > 0)
+		return HAL_STATUS_SUCCESS;
+
+	return HAL_STATUS_FAILED;
+}
+
+static uint8_t user_passkey_reply(const bdaddr_t *bdaddr, bool accept,
+							uint32_t passkey)
+{
+	unsigned int id;
+
+	if (accept) {
+		struct mgmt_cp_user_passkey_reply cp;
+
+		memset(&cp, 0, sizeof(cp));
+		bacpy(&cp.addr.bdaddr, bdaddr);
+		cp.addr.type = BDADDR_BREDR;
+		cp.passkey = htobl(passkey);
+
+		id = mgmt_reply(adapter->mgmt, MGMT_OP_USER_PASSKEY_REPLY,
+					adapter->index, sizeof(cp), &cp,
+					NULL, NULL, NULL);
+	} else {
+		struct mgmt_cp_user_passkey_neg_reply cp;
+
+		memset(&cp, 0, sizeof(cp));
+		bacpy(&cp.addr.bdaddr, bdaddr);
+		cp.addr.type = BDADDR_BREDR;
+
+		id = mgmt_reply(adapter->mgmt, MGMT_OP_USER_PASSKEY_NEG_REPLY,
+					adapter->index, sizeof(cp), &cp,
+					NULL, NULL, NULL);
+	}
+
+	if (id == 0)
+		return HAL_STATUS_FAILED;
+
+	return HAL_STATUS_SUCCESS;
+}
+
+static uint8_t ssp_reply(void *buf, uint16_t len)
+{
+	struct hal_cmd_ssp_reply *cmd = buf;
+	uint8_t status;
+	bdaddr_t bdaddr;
+	char addr[18];
+
+	/* TODO should parameters sanity be verified here? */
+
+	android2bdaddr(cmd->bdaddr, &bdaddr);
+	ba2str(&bdaddr, addr);
+
+	DBG("%s variant %u accept %u", addr, cmd->ssp_variant, cmd->accept);
+
+	switch (cmd->ssp_variant) {
+	case HAL_SSP_VARIANT_CONFIRM:
+	case HAL_SSP_VARIANT_CONSENT:
+		status = user_confirm_reply(&bdaddr, cmd->accept);
+		break;
+	case HAL_SSP_VARIANT_ENTRY:
+		status = user_passkey_reply(&bdaddr, cmd->accept,
+								cmd->passkey);
+		break;
+	case HAL_SSP_VARIANT_NOTIF:
+		status = HAL_STATUS_SUCCESS;
+		break;
+	default:
+		status = HAL_STATUS_INVALID;
+		break;
+	}
+
+	return status;
+}
+
 void bt_adapter_handle_cmd(GIOChannel *io, uint8_t opcode, void *buf,
 								uint16_t len)
 {
@@ -872,6 +960,12 @@ void bt_adapter_handle_cmd(GIOChannel *io, uint8_t opcode, void *buf,
 			goto error;
 
 		break;
+	case HAL_OP_SSP_REPLY:
+		status = ssp_reply(buf, len);
+		if (status != HAL_STATUS_SUCCESS)
+			goto error;
+
+		break;
 	default:
 		DBG("Unhandled command, opcode 0x%x", opcode);
 		goto error;
-- 
1.8.4.rc3


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* Re: [PATCH 08/14] android: Add support for handling remove bond command
  2013-10-31  2:55 ` [PATCH 08/14] android: Add support for handling remove " Szymon Janc
@ 2013-10-31  8:48   ` Johan Hedberg
  0 siblings, 0 replies; 18+ messages in thread
From: Johan Hedberg @ 2013-10-31  8:48 UTC (permalink / raw)
  To: Szymon Janc; +Cc: linux-bluetooth, Szymon Janc

Hi Szymon,

On Thu, Oct 31, 2013, Szymon Janc wrote:
> ---
>  android/adapter.c | 25 +++++++++++++++++++++++++
>  1 file changed, 25 insertions(+)
> 
> diff --git a/android/adapter.c b/android/adapter.c
> index 0f174a6..0a91149 100644
> --- a/android/adapter.c
> +++ b/android/adapter.c
> @@ -639,6 +639,26 @@ static bool cancel_bond(void *buf, uint16_t len)
>  				NULL) > 0;
>  }
>  
> +static bool remove_bond(void *buf, uint16_t len)
> +{
> +	struct hal_cmd_remove_bond *cmd = buf;
> +	struct mgmt_cp_unpair_device cp;
> +
> +	cp.disconnect = 1;
> +	cp.addr.type = BDADDR_BREDR;
> +	android2bdaddr(cmd->bdaddr, &cp.addr.bdaddr);
> +
> +	if (mgmt_send(adapter->mgmt, MGMT_OP_UNPAIR_DEVICE,
> +				adapter->index, sizeof(cp), &cp,
> +				NULL, NULL, NULL) == 0)
> +		return false;
> +
> +	send_bond_state_change(&cp.addr.bdaddr, HAL_STATUS_SUCCESS,
> +							HAL_BOND_STATE_NONE);

Wouldn't this state change make more sense to send in the mgmt command
complete callback?

Johan

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 07/14] android: Add support for handling cancel bond command
  2013-10-31  2:55 ` [PATCH 07/14] android: Add support for handling cancel " Szymon Janc
@ 2013-10-31  8:50   ` Johan Hedberg
  0 siblings, 0 replies; 18+ messages in thread
From: Johan Hedberg @ 2013-10-31  8:50 UTC (permalink / raw)
  To: Szymon Janc; +Cc: linux-bluetooth, Szymon Janc

Hi Szymon,

On Thu, Oct 31, 2013, Szymon Janc wrote:
> ---
>  android/adapter.c | 18 ++++++++++++++++++
>  1 file changed, 18 insertions(+)

Patches 1-7 have been applied. Thanks.

Johan

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 14/14] android: Add support for handling SSP reply command
  2013-10-31  2:55 ` [PATCH 14/14] android: Add support for handling SSP " Szymon Janc
@ 2013-10-31  8:52   ` Johan Hedberg
  0 siblings, 0 replies; 18+ messages in thread
From: Johan Hedberg @ 2013-10-31  8:52 UTC (permalink / raw)
  To: Szymon Janc; +Cc: linux-bluetooth, Szymon Janc

Hi Szymon,

On Thu, Oct 31, 2013, Szymon Janc wrote:
> ---
>  android/adapter.c | 94 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 94 insertions(+)

Patches 9-14 have been applied. Thanks.

Johan

^ permalink raw reply	[flat|nested] 18+ messages in thread

end of thread, other threads:[~2013-10-31  8:52 UTC | newest]

Thread overview: 18+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-10-31  2:55 [PATCH 00/14] android: Initial support for pairing Szymon Janc
2013-10-31  2:55 ` [PATCH 01/14] android: Add missing bonding state definitions to IPC specification Szymon Janc
2013-10-31  2:55 ` [PATCH 02/14] android: Add missing bond state definition to IPC header Szymon Janc
2013-10-31  2:55 ` [PATCH 03/14] android: Add support for handling new link key mgmt event Szymon Janc
2013-10-31  2:55 ` [PATCH 04/14] android: Make load_link_keys function load keys Szymon Janc
2013-10-31  2:55 ` [PATCH 05/14] android: Set default IO capability on daemon start Szymon Janc
2013-10-31  2:55 ` [PATCH 06/14] android: Add support for handling create bond command Szymon Janc
2013-10-31  2:55 ` [PATCH 07/14] android: Add support for handling cancel " Szymon Janc
2013-10-31  8:50   ` Johan Hedberg
2013-10-31  2:55 ` [PATCH 08/14] android: Add support for handling remove " Szymon Janc
2013-10-31  8:48   ` Johan Hedberg
2013-10-31  2:55 ` [PATCH 09/14] android: Add support for sending pin code request Szymon Janc
2013-10-31  2:55 ` [PATCH 10/14] android: Add initial support for sending SSP request event Szymon Janc
2013-10-31  2:55 ` [PATCH 11/14] android: Add support for entry variant in " Szymon Janc
2013-10-31  2:55 ` [PATCH 12/14] android: Add support for notify " Szymon Janc
2013-10-31  2:55 ` [PATCH 13/14] android: Add support for handling pin reply command Szymon Janc
2013-10-31  2:55 ` [PATCH 14/14] android: Add support for handling SSP " Szymon Janc
2013-10-31  8:52   ` Johan Hedberg

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.