Linux bluetooth development
 help / color / mirror / Atom feed
From: Andrei Emeltchenko <Andrei.Emeltchenko.news@gmail.com>
To: linux-bluetooth@vger.kernel.org
Subject: [PATCHv5 2/7] android: Implement read_info_complete callback
Date: Thu, 17 Oct 2013 11:26:41 +0300	[thread overview]
Message-ID: <1381998406-16662-3-git-send-email-Andrei.Emeltchenko.news@gmail.com> (raw)
In-Reply-To: <1381998406-16662-1-git-send-email-Andrei.Emeltchenko.news@gmail.com>

From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>

Handle read info complete callback from mgmt interface.
---
 Makefile.android   |    3 +-
 android/Android.mk |    1 +
 android/adapter.c  |  108 +++++++++++++++++++++++++++++++++++++++++++++++-----
 android/main.c     |   19 +++++----
 4 files changed, 111 insertions(+), 20 deletions(-)

diff --git a/Makefile.android b/Makefile.android
index 4d7da39..11eadc2 100644
--- a/Makefile.android
+++ b/Makefile.android
@@ -7,7 +7,8 @@ android_bluetoothd_SOURCES =	android/main.c \
 				src/sdpd-database.c src/sdpd-server.c \
 				src/sdpd-service.c src/sdpd-request.c \
 				src/shared/util.h src/shared/util.c \
-				src/shared/mgmt.h src/shared/mgmt.c
+				src/shared/mgmt.h src/shared/mgmt.c \
+				android/adapter.h android/adapter.c
 
 android_bluetoothd_LDADD = lib/libbluetooth-internal.la @GLIB_LIBS@
 endif
diff --git a/android/Android.mk b/android/Android.mk
index d6bd5b8..22f8b92 100644
--- a/android/Android.mk
+++ b/android/Android.mk
@@ -15,6 +15,7 @@ include $(CLEAR_VARS)
 LOCAL_SRC_FILES := \
 	main.c \
 	log.c \
+	adapter.c \
 	../src/shared/mgmt.c \
 	../src/shared/util.c \
 	../src/sdpd-database.c \
diff --git a/android/adapter.c b/android/adapter.c
index 9763530..b384c5d 100644
--- a/android/adapter.c
+++ b/android/adapter.c
@@ -21,24 +21,24 @@
  *
  */
 
+#include "lib/bluetooth.h"
 #include "src/shared/mgmt.h"
+#include "lib/mgmt.h"
 #include "log.h"
 #include "adapter.h"
 
 struct bt_adapter {
 	struct mgmt *mgmt;
-};
+	bdaddr_t bdaddr;
+	uint32_t dev_class;
 
-struct bt_adapter *bt_adapter_new(uint16_t index, struct mgmt *mgmt_if)
-{
-	struct bt_adapter *adapter;
+	char *name;
 
-	adapter = g_new0(struct bt_adapter, 1);
-
-	adapter->mgmt = mgmt_ref(mgmt_if);
+	uint32_t supported_settings;
+	uint32_t current_settings;
+};
 
-	return adapter;
-}
+extern struct bt_adapter *default_adapter;
 
 void bt_adapter_start(struct bt_adapter *adapter)
 {
@@ -52,3 +52,93 @@ void bt_adapter_stop(struct bt_adapter *adapter)
 {
 	DBG("");
 }
+
+static void load_link_keys_complete(uint8_t status, uint16_t length,
+					const void *param, void *user_data)
+{
+	DBG("status %u", status);
+}
+
+static void load_link_keys(struct bt_adapter *adapter, 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;
+
+	DBG("");
+
+	len = sizeof(*cp) + key_len * sizeof(*key);
+	cp = g_malloc0(len);
+
+	cp->debug_keys = 0;
+	cp->key_count = htobs(key_len);
+
+	mgmt_send(adapter->mgmt, MGMT_OP_LOAD_LINK_KEYS, 0, len,
+				cp, load_link_keys_complete, adapter, NULL);
+
+	free(cp);
+}
+
+static void read_info_complete(uint8_t status, uint16_t length, const void *param,
+							void *user_data)
+{
+	struct bt_adapter *adapter = user_data;
+	const struct mgmt_rp_read_info *rp = param;
+
+	DBG("");
+
+	if (status) {
+		error("Failed to read info for index %u: %s (0x%02x)",
+			0, mgmt_errstr(status), status);
+		goto failed;
+	}
+
+	if (length < sizeof(*rp)) {
+		error("Too small read info complete response");
+		goto failed;
+	}
+
+	if (!bacmp(&rp->bdaddr, BDADDR_ANY)) {
+		error("No Bluetooth address");
+		goto failed;
+	}
+
+	/* Store adapter information */
+	bacpy(&adapter->bdaddr, &rp->bdaddr);
+	adapter->dev_class = rp->dev_class[0] | (rp->dev_class[1] << 8) |
+						(rp->dev_class[2] << 16);
+	adapter->name = g_strdup((const char *) rp->name);
+
+	adapter->supported_settings = btohs(rp->supported_settings);
+	adapter->current_settings = btohs(rp->current_settings);
+
+	/* TODO: Register all event notification handlers */
+
+	if (adapter->current_settings & MGMT_SETTING_POWERED)
+		bt_adapter_start(adapter);
+
+	load_link_keys(adapter, NULL);
+
+	return;
+
+failed:
+	default_adapter = NULL;
+}
+
+struct bt_adapter *bt_adapter_new(uint16_t index, struct mgmt *mgmt_if)
+{
+	struct bt_adapter *adapter;
+
+	adapter = g_new0(struct bt_adapter, 1);
+
+	adapter->mgmt = mgmt_ref(mgmt_if);
+
+	if (mgmt_send(mgmt_if, MGMT_OP_READ_INFO, index, 0, NULL,
+				read_info_complete, adapter, NULL) > 0) {
+		mgmt_unref(mgmt_if);
+		return NULL;
+	}
+
+	return adapter;
+}
diff --git a/android/main.c b/android/main.c
index 2b2e4d8..cc09ecd 100644
--- a/android/main.c
+++ b/android/main.c
@@ -49,6 +49,8 @@
 #include "lib/mgmt.h"
 #include "src/shared/mgmt.h"
 
+#include "adapter.h"
+
 #define SHUTDOWN_GRACE_SECONDS 10
 
 static GMainLoop *event_loop;
@@ -57,6 +59,8 @@ static struct mgmt *mgmt_if = NULL;
 static uint8_t mgmt_version = 0;
 static uint8_t mgmt_revision = 0;
 
+struct bt_adapter *default_adapter = NULL;
+
 static gboolean quit_eventloop(gpointer user_data)
 {
 	g_main_loop_quit(event_loop);
@@ -84,22 +88,17 @@ static GOptionEntry options[] = {
 	{ NULL }
 };
 
-static void read_info_complete(uint8_t status, uint16_t length,
-					const void *param, void *user_data)
-{
-	/* TODO: Store Controller information */
-
-	/* TODO: Register all event notification handlers */
-}
-
 static void mgmt_index_added_event(uint16_t index, uint16_t length,
 					const void *param, void *user_data)
 {
 	DBG("index %u", index);
 
-	if (mgmt_send(mgmt_if, MGMT_OP_READ_INFO, index, 0, NULL,
-					read_info_complete, NULL, NULL) > 0)
+	if (default_adapter) {
+		DBG("skip event for index %u", index);
 		return;
+	}
+
+	default_adapter = bt_adapter_new(index, mgmt_if);
 
 	error("Failed to read adapter info for index %u", index);
 }
-- 
1.7.10.4


  parent reply	other threads:[~2013-10-17  8:26 UTC|newest]

Thread overview: 59+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-10-15 10:36 [PATCHv1 0/5] Initial Android BlueZ patches Andrei Emeltchenko
2013-10-15 10:36 ` [PATCHv1 1/5] android: Create HAL API header skeleton Andrei Emeltchenko
2013-10-15 10:37 ` [PATCHv1 2/5] android: Add basic mgmt initialization sequence Andrei Emeltchenko
2013-10-15 10:37 ` [PATCHv1 3/5] android: Add adapter and device struct for BlueZ daemon Andrei Emeltchenko
2013-10-15 10:37 ` [PATCHv1 4/5] android: sdp: Reuse BlueZ SDP server in Android Andrei Emeltchenko
2013-10-15 10:37 ` [PATCHv1 5/5] android: Add cap to bind to port < 1024 Andrei Emeltchenko
2013-10-16  8:46 ` [PATCHv2 0/6] Android BlueZ patches, second chunk Andrei Emeltchenko
2013-10-16  8:46   ` [PATCHv2 1/6] sdp: Check that correct packet received in recv Andrei Emeltchenko
2013-10-16 10:21     ` Johan Hedberg
2013-10-16  8:46   ` [PATCHv2 2/6] android: Create HAL API header skeleton Andrei Emeltchenko
2013-10-16 10:23     ` Johan Hedberg
2013-10-16  8:46   ` [PATCHv2 3/6] android: Add basic mgmt initialization sequence Andrei Emeltchenko
2013-10-16 10:28     ` Johan Hedberg
2013-10-16 12:03     ` Szymon Janc
2013-10-16 12:24       ` Andrei Emeltchenko
2013-10-16  8:46   ` [PATCHv2 4/6] android: Add adapter and device struct for BlueZ daemon Andrei Emeltchenko
2013-10-16 10:31     ` Johan Hedberg
2013-10-16  8:46   ` [PATCHv2 5/6] android: sdp: Reuse BlueZ SDP server in Android Andrei Emeltchenko
2013-10-16  8:46   ` [PATCHv2 6/6] android: Add cap to bind to port < 1024 Andrei Emeltchenko
2013-10-16 14:08 ` [PATCHv3 00/11] Android BlueZ patches, second chunk Andrei Emeltchenko
2013-10-16 14:08   ` [PATCHv3 01/11] android: Create HAL API header skeleton Andrei Emeltchenko
2013-10-16 14:08   ` [PATCHv3 02/11] android: Add basic mgmt initialization sequence Andrei Emeltchenko
2013-10-16 14:08   ` [PATCHv3 03/11] android: Add adapter and device struct for BlueZ daemon Andrei Emeltchenko
2013-10-16 14:08   ` [PATCHv3 04/11] android: sdp: Reuse BlueZ SDP server in Android Andrei Emeltchenko
2013-10-16 14:08   ` [PATCHv3 05/11] android: Add cap to bind to port < 1024 Andrei Emeltchenko
2013-10-16 14:08   ` [PATCHv3 06/11] android: Implement read_info_complete callback Andrei Emeltchenko
2013-10-16 14:08   ` [PATCHv3 07/11] android: Use kernel style to initialize struct fields Andrei Emeltchenko
2013-10-16 14:08   ` [PATCHv3 08/11] android: Rename hal_bluetooth.c to hal-bluetooth.c Andrei Emeltchenko
2013-10-16 14:08   ` [PATCHv3 09/11] android: Rename hal_bt_sock.c to hal-bt-sock.c Andrei Emeltchenko
2013-10-16 14:08   ` [PATCHv3 10/11] android: Add HID Host skeleton Andrei Emeltchenko
2013-10-16 14:08   ` [PATCHv3 11/11] android: Add PAN skeleton Andrei Emeltchenko
2013-10-16 14:36 ` [PATCHv4 00/11] Android BlueZ patches, second chunk Andrei Emeltchenko
2013-10-16 14:36   ` [PATCHv4 01/11] android: Create HAL API header skeleton Andrei Emeltchenko
2013-10-16 14:36   ` [PATCHv4 02/11] android: Add basic mgmt initialization sequence Andrei Emeltchenko
2013-10-16 14:36   ` [PATCHv4 03/11] android: Add adapter and device struct for BlueZ daemon Andrei Emeltchenko
2013-10-16 14:36   ` [PATCHv4 04/11] android: sdp: Reuse BlueZ SDP server in Android Andrei Emeltchenko
2013-10-16 15:48     ` Johan Hedberg
2013-10-16 14:36   ` [PATCHv4 05/11] android: Add cap to bind to port < 1024 Andrei Emeltchenko
2013-10-16 15:44     ` Johan Hedberg
2013-10-16 14:36   ` [PATCHv4 06/11] android: Implement read_info_complete callback Andrei Emeltchenko
2013-10-16 15:47     ` Johan Hedberg
2013-10-16 14:36   ` [PATCHv4 07/11] android: Use kernel style to initialize struct fields Andrei Emeltchenko
2013-10-16 14:36   ` [PATCHv4 08/11] android: Rename hal_bluetooth.c to hal-bluetooth.c Andrei Emeltchenko
2013-10-16 14:36   ` [PATCHv4 09/11] android: Rename hal_bt_sock.c to hal-bt-sock.c Andrei Emeltchenko
2013-10-16 14:36   ` [PATCHv4 10/11] android: Add HID Host skeleton Andrei Emeltchenko
2013-10-16 14:36   ` [PATCHv4 11/11] android: Add PAN skeleton Andrei Emeltchenko
2013-10-17  8:26 ` [PATCHv5 0/7] Android BlueZ patches, second chunk Andrei Emeltchenko
2013-10-17  8:26   ` [PATCHv5 1/7] android: Add capabilities and set userid Andrei Emeltchenko
2013-10-17 11:20     ` Johan Hedberg
2013-10-17 11:26       ` Andrei Emeltchenko
2013-10-17  8:26   ` Andrei Emeltchenko [this message]
2013-10-17 11:53     ` [PATCHv5 2/7] android: Implement read_info_complete callback Johan Hedberg
2013-10-17  8:26   ` [PATCHv5 3/7] android: Use kernel style to initialize struct fields Andrei Emeltchenko
2013-10-17  9:04     ` Marcel Holtmann
2013-10-17  8:26   ` [PATCHv5 4/7] android: Rename hal_bluetooth.c to hal-bluetooth.c Andrei Emeltchenko
2013-10-17  8:26   ` [PATCHv5 5/7] android: Rename hal_bt_sock.c to hal-bt-sock.c Andrei Emeltchenko
2013-10-17  8:26   ` [PATCHv5 6/7] android: Add HID Host skeleton Andrei Emeltchenko
2013-10-17  8:26   ` [PATCHv5 7/7] android: Add PAN skeleton Andrei Emeltchenko
2013-10-18 11:36   ` [PATCHv5 0/7] Android BlueZ patches, second chunk Johan Hedberg

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1381998406-16662-3-git-send-email-Andrei.Emeltchenko.news@gmail.com \
    --to=andrei.emeltchenko.news@gmail.com \
    --cc=linux-bluetooth@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox