Linux bluetooth development
 help / color / mirror / Atom feed
* [RFCv2 00/14] Basic code for Android BlueZ
@ 2013-10-01 15:03 Andrei Emeltchenko
  2013-10-01 15:03 ` [RFCv2 01/14] android: Add Adapter Bluetooth HAL template Andrei Emeltchenko
                   ` (13 more replies)
  0 siblings, 14 replies; 20+ messages in thread
From: Andrei Emeltchenko @ 2013-10-01 15:03 UTC (permalink / raw)
  To: linux-bluetooth

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

Skeletons for Android Bluetooth and Socket HALs and BlueZ daemon.

Note: Still need rebase after patches from Frederic are applied.

Changes:
	* RFCv2: Took comments from mailing list reviewers. Use single
	makefile, remove mgmt library and directly link, remove adapter
	code and use default_adapter pointer and other style changes.
	Dropped some patches due to major changes.

Andrei Emeltchenko (14):
  android: Add Adapter Bluetooth HAL template
  android: Add Socket Bluetooth HAL template
  android: Enable Socket interface
  android: Start Android Bluetooth daemon
  android: Add basic mgmt initialization sequence
  android: Create HAL API header skeleton
  android: Add adapter and device struct for BlueZ daemon
  android: Add Android Makefile for libbluetooth
  android: sdp: Reuse BlueZ SDP server in Android
  android: Add cap to bind to port < 1024
  android: Implement read_info_complete callback
  android: Handle mgmt changed events
  android: Add makefile for hciconfig
  android: Add makefile for hcitool

 Makefile.android        |    9 +-
 android/Android.mk      |  165 +++++++++++++++
 android/bt_adapter.c    |   59 ++++++
 android/bt_adapter.h    |   60 ++++++
 android/hal.h           |   18 ++
 android/hal_bluetooth.c |  411 +++++++++++++++++++++++++++++++++++++
 android/hal_bt_sock.c   |   84 ++++++++
 android/hal_msg.h       |  260 ++++++++++++++++++++++++
 android/main.c          |  511 +++++++++++++++++++++++++++++++++++++++++++++++
 android/main.h          |   25 +++
 configure.ac            |    4 +
 11 files changed, 1604 insertions(+), 2 deletions(-)
 create mode 100644 android/bt_adapter.c
 create mode 100644 android/bt_adapter.h
 create mode 100644 android/hal.h
 create mode 100644 android/hal_bluetooth.c
 create mode 100644 android/hal_bt_sock.c
 create mode 100644 android/hal_msg.h
 create mode 100644 android/main.h

-- 
1.7.10.4


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

* [RFCv2 01/14] android: Add Adapter Bluetooth HAL template
  2013-10-01 15:03 [RFCv2 00/14] Basic code for Android BlueZ Andrei Emeltchenko
@ 2013-10-01 15:03 ` Andrei Emeltchenko
  2013-10-01 15:03 ` [RFCv2 02/14] android: Add Socket " Andrei Emeltchenko
                   ` (12 subsequent siblings)
  13 siblings, 0 replies; 20+ messages in thread
From: Andrei Emeltchenko @ 2013-10-01 15:03 UTC (permalink / raw)
  To: linux-bluetooth

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

Add template for bluetooth.h Android HAL.
---
 android/Android.mk      |   19 +++
 android/hal_bluetooth.c |  348 +++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 367 insertions(+)
 create mode 100644 android/hal_bluetooth.c

diff --git a/android/Android.mk b/android/Android.mk
index 5d09f00..ca9501f 100644
--- a/android/Android.mk
+++ b/android/Android.mk
@@ -23,3 +23,22 @@ LOCAL_SHARED_LIBRARIES := \
 LOCAL_MODULE := bluezd
 
 include $(BUILD_EXECUTABLE)
+
+#
+# bluetooth.default.so HAL
+#
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := \
+	hal_bluetooth.c \
+
+LOCAL_SHARED_LIBRARIES := \
+	libcutils \
+
+LOCAL_MODULE := bluetooth.default
+LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_CLASS := SHARED_LIBRARIES
+
+include $(BUILD_SHARED_LIBRARY)
diff --git a/android/hal_bluetooth.c b/android/hal_bluetooth.c
new file mode 100644
index 0000000..9970374
--- /dev/null
+++ b/android/hal_bluetooth.c
@@ -0,0 +1,348 @@
+/*
+ * Copyright (C) 2013 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <stdbool.h>
+
+#include <hardware/bluetooth.h>
+
+#define LOG_TAG "BlueZ"
+#include <cutils/log.h>
+
+bt_callbacks_t *bt_hal_cbacks = NULL;
+
+static bool interface_ready(void)
+{
+	return bt_hal_cbacks != NULL;
+}
+
+static int init(bt_callbacks_t *callbacks)
+{
+	ALOGD(__func__);
+
+	if (interface_ready() == true)
+		return BT_STATUS_SUCCESS;
+
+	/* store reference to user callbacks */
+	bt_hal_cbacks = callbacks;
+
+	/* TODO: Init here bluezd task */
+
+	return BT_STATUS_UNSUPPORTED;
+}
+
+static int enable(void)
+{
+	ALOGD(__func__);
+
+	return BT_STATUS_UNSUPPORTED;
+}
+
+static int disable(void)
+{
+	ALOGD(__func__);
+
+	if (interface_ready() == false)
+		return BT_STATUS_NOT_READY;
+
+	return BT_STATUS_UNSUPPORTED;
+}
+
+static void cleanup(void)
+{
+	ALOGD(__func__);
+
+	if (interface_ready() == false)
+		return;
+
+	bt_hal_cbacks = NULL;
+}
+
+static int get_adapter_properties(void)
+{
+	ALOGD(__func__);
+
+	if (interface_ready() == false)
+		return BT_STATUS_NOT_READY;
+
+	return BT_STATUS_UNSUPPORTED;
+}
+
+static int get_adapter_property(bt_property_type_t type)
+{
+	ALOGD(__func__);
+
+	if (interface_ready() == false)
+		return BT_STATUS_NOT_READY;
+
+	return BT_STATUS_UNSUPPORTED;
+}
+
+static int set_adapter_property(const bt_property_t *property)
+{
+	ALOGD(__func__);
+
+	if (interface_ready() == false)
+		return BT_STATUS_NOT_READY;
+
+	if (property == NULL)
+		return BT_STATUS_PARM_INVALID;
+
+	return BT_STATUS_UNSUPPORTED;
+}
+
+static int get_remote_device_properties(bt_bdaddr_t *remote_addr)
+{
+	ALOGD(__func__);
+
+	if (interface_ready() == false)
+		return BT_STATUS_NOT_READY;
+
+	return BT_STATUS_UNSUPPORTED;
+}
+
+static int get_remote_device_property(bt_bdaddr_t *remote_addr,
+						bt_property_type_t type)
+{
+	ALOGD(__func__);
+
+	if (interface_ready() == false)
+		return BT_STATUS_NOT_READY;
+
+	return BT_STATUS_UNSUPPORTED;
+}
+
+static int set_remote_device_property(bt_bdaddr_t *remote_addr,
+						const bt_property_t *property)
+{
+	ALOGD(__func__);
+
+	/* sanity check */
+	if (interface_ready() == false)
+		return BT_STATUS_NOT_READY;
+
+	return BT_STATUS_UNSUPPORTED;
+}
+
+static int get_remote_service_record(bt_bdaddr_t *remote_addr, bt_uuid_t *uuid)
+{
+	ALOGD(__func__);
+
+	if (interface_ready() == false)
+		return BT_STATUS_NOT_READY;
+
+	return BT_STATUS_UNSUPPORTED;
+}
+
+static int get_remote_services(bt_bdaddr_t *remote_addr)
+{
+	ALOGD(__func__);
+
+	if (interface_ready() == false)
+		return BT_STATUS_NOT_READY;
+
+	return BT_STATUS_UNSUPPORTED;
+}
+
+static int start_discovery(void)
+{
+	ALOGD(__func__);
+
+	if (interface_ready() == false)
+		return BT_STATUS_NOT_READY;
+
+	return BT_STATUS_UNSUPPORTED;
+}
+
+static int cancel_discovery(void)
+{
+	ALOGD(__func__);
+
+	if (interface_ready() == false)
+		return BT_STATUS_NOT_READY;
+
+	return BT_STATUS_UNSUPPORTED;
+}
+
+static int create_bond(const bt_bdaddr_t *bd_addr)
+{
+	ALOGD(__func__);
+
+	if (interface_ready() == false)
+		return BT_STATUS_NOT_READY;
+
+	if (bd_addr == NULL)
+		return BT_STATUS_PARM_INVALID;
+
+	return BT_STATUS_UNSUPPORTED;
+}
+
+static int cancel_bond(const bt_bdaddr_t *bd_addr)
+{
+	ALOGD(__func__);
+
+	if (interface_ready() == false)
+		return BT_STATUS_NOT_READY;
+
+	return BT_STATUS_UNSUPPORTED;
+}
+
+static int remove_bond(const bt_bdaddr_t *bd_addr)
+{
+	ALOGD(__func__);
+
+	if (interface_ready() == false)
+		return BT_STATUS_NOT_READY;
+
+	return BT_STATUS_UNSUPPORTED;
+}
+
+static int pin_reply(const bt_bdaddr_t *bd_addr, uint8_t accept,
+				uint8_t pin_len, bt_pin_code_t *pin_code)
+{
+	ALOGD(__func__);
+
+	if (interface_ready() == false)
+		return BT_STATUS_NOT_READY;
+
+	return BT_STATUS_UNSUPPORTED;
+}
+
+static int ssp_reply(const bt_bdaddr_t *bd_addr, bt_ssp_variant_t variant,
+					uint8_t accept, uint32_t passkey)
+{
+
+	ALOGD(__func__);
+
+	if (interface_ready() == false)
+		return BT_STATUS_NOT_READY;
+
+	if (bd_addr == NULL)
+		return BT_STATUS_PARM_INVALID;
+
+	return BT_STATUS_UNSUPPORTED;
+}
+
+static const void *get_profile_interface(const char *profile_id)
+{
+	ALOGD("%s: %s", __func__, profile_id);
+
+	if (interface_ready() == false)
+		return NULL;
+
+	return NULL;
+}
+
+static int dut_mode_configure(uint8_t enable)
+{
+	ALOGD(__func__);
+
+	if (interface_ready() == false)
+		return BT_STATUS_NOT_READY;
+
+	return BT_STATUS_UNSUPPORTED;
+}
+
+static int dut_mode_send(uint16_t opcode, uint8_t *buf, uint8_t len)
+{
+	ALOGD(__func__);
+
+	if (interface_ready() == false)
+		return BT_STATUS_NOT_READY;
+
+	return BT_STATUS_UNSUPPORTED;
+}
+
+/**
+ * HAL Interface declaration
+ */
+static const bt_interface_t bluetooth_if = {
+	sizeof(bt_interface_t),
+	init,
+	enable,
+	disable,
+	cleanup,
+	get_adapter_properties,
+	get_adapter_property,
+	set_adapter_property,
+	get_remote_device_properties,
+	get_remote_device_property,
+	set_remote_device_property,
+	get_remote_service_record,
+	get_remote_services,
+	start_discovery,
+	cancel_discovery,
+	create_bond,
+	remove_bond,
+	cancel_bond,
+	pin_reply,
+	ssp_reply,
+	get_profile_interface,
+	dut_mode_configure,
+	dut_mode_send
+};
+
+static const bt_interface_t *get_bluetooth_interface(void)
+{
+	ALOGD(__func__);
+
+	return &bluetooth_if;
+}
+
+static int close_bluetooth(struct hw_device_t *device)
+{
+	ALOGD(__func__);
+
+	cleanup();
+
+	return 0;
+}
+
+static int open_bluetooth(const struct hw_module_t *module, char const *name,
+					struct hw_device_t **device)
+{
+	bluetooth_device_t *dev = malloc(sizeof(bluetooth_device_t));
+
+	ALOGD(__func__);
+
+	memset(dev, 0, sizeof(bluetooth_device_t));
+	dev->common.tag = HARDWARE_DEVICE_TAG;
+	dev->common.version = 0;
+	dev->common.module = (struct hw_module_t *) module;
+	dev->common.close = close_bluetooth;
+	dev->get_bluetooth_interface = get_bluetooth_interface;
+
+	*device = (struct hw_device_t *) dev;
+
+	return 0;
+}
+
+static struct hw_module_methods_t bluetooth_module_methods = {
+	.open = open_bluetooth,
+};
+
+struct hw_module_t HAL_MODULE_INFO_SYM = {
+	.tag = HARDWARE_MODULE_TAG,
+	.version_major = 1,
+	.version_minor = 0,
+	.id = BT_HARDWARE_MODULE_ID,
+	.name = "BlueZ Bluetooth stack",
+	.author = "Intel Corporation",
+	.methods = &bluetooth_module_methods
+};
-- 
1.7.10.4


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

* [RFCv2 02/14] android: Add Socket Bluetooth HAL template
  2013-10-01 15:03 [RFCv2 00/14] Basic code for Android BlueZ Andrei Emeltchenko
  2013-10-01 15:03 ` [RFCv2 01/14] android: Add Adapter Bluetooth HAL template Andrei Emeltchenko
@ 2013-10-01 15:03 ` Andrei Emeltchenko
  2013-10-01 15:03 ` [RFCv2 03/14] android: Enable Socket interface Andrei Emeltchenko
                   ` (11 subsequent siblings)
  13 siblings, 0 replies; 20+ messages in thread
From: Andrei Emeltchenko @ 2013-10-01 15:03 UTC (permalink / raw)
  To: linux-bluetooth

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

bt_sock HAL handles Bluetooth sockets for Android.
---
 android/Android.mk    |    1 +
 android/hal_bt_sock.c |   84 +++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 85 insertions(+)
 create mode 100644 android/hal_bt_sock.c

diff --git a/android/Android.mk b/android/Android.mk
index ca9501f..93de803 100644
--- a/android/Android.mk
+++ b/android/Android.mk
@@ -32,6 +32,7 @@ include $(CLEAR_VARS)
 
 LOCAL_SRC_FILES := \
 	hal_bluetooth.c \
+	hal_bt_sock.c \
 
 LOCAL_SHARED_LIBRARIES := \
 	libcutils \
diff --git a/android/hal_bt_sock.c b/android/hal_bt_sock.c
new file mode 100644
index 0000000..cbb42d1
--- /dev/null
+++ b/android/hal_bt_sock.c
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2013 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <stdlib.h>
+
+#include <hardware/bluetooth.h>
+#include <hardware/bt_sock.h>
+
+#define LOG_TAG "BlueZ"
+#include <cutils/log.h>
+
+static bt_status_t btsock_listen_rfcomm(const char *service_name,
+					const uint8_t *uuid, int chan,
+					int *sock, int flags)
+{
+	ALOGD(__func__);
+
+	return BT_STATUS_UNSUPPORTED;
+}
+
+static bt_status_t listen(btsock_type_t type, const char *service_name,
+					const uint8_t *uuid, int chan,
+					int *sock, int flags)
+{
+	if ((uuid == NULL && chan <= 0) || sock == NULL) {
+		ALOGE("%s: invalid params: uuid %p, chan %d, sock %p",
+						__func__, uuid, chan, sock);
+		return BT_STATUS_PARM_INVALID;
+	}
+
+	ALOGD("%s: uuid %p chan %d sock %p type %d service_name %s",
+			__func__, uuid, chan, sock, type, service_name);
+
+	switch (type) {
+	case BTSOCK_RFCOMM:
+		return btsock_listen_rfcomm(service_name, uuid, chan,
+								sock, flags);
+	default:
+		ALOGE("%s: Socket type %d not supported", __func__, type);
+	}
+
+	return BT_STATUS_UNSUPPORTED;
+}
+
+static bt_status_t connect(const bt_bdaddr_t *bdaddr, btsock_type_t type,
+					const uint8_t *uuid, int chan,
+					int *sock, int flags)
+{
+	if ((uuid == NULL && chan <= 0) || bdaddr == NULL || sock == NULL) {
+		ALOGE("invalid params: bd_addr %p, uuid %p, chan %d, sock %p",
+					bdaddr, uuid, chan, sock);
+		return BT_STATUS_PARM_INVALID;
+	}
+
+	ALOGD("%s: uuid %p chan %d sock %p type %d", __func__, uuid, chan,
+								sock, type);
+
+	return BT_STATUS_UNSUPPORTED;
+}
+
+static btsock_interface_t btsock_if = {
+	sizeof(btsock_if),
+	listen,
+	connect
+};
+
+btsock_interface_t *bt_get_sock_interface(void)
+{
+	return &btsock_if;
+}
-- 
1.7.10.4


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

* [RFCv2 03/14] android: Enable Socket interface
  2013-10-01 15:03 [RFCv2 00/14] Basic code for Android BlueZ Andrei Emeltchenko
  2013-10-01 15:03 ` [RFCv2 01/14] android: Add Adapter Bluetooth HAL template Andrei Emeltchenko
  2013-10-01 15:03 ` [RFCv2 02/14] android: Add Socket " Andrei Emeltchenko
@ 2013-10-01 15:03 ` Andrei Emeltchenko
  2013-10-01 15:03 ` [RFCv2 04/14] android: Start Android Bluetooth daemon Andrei Emeltchenko
                   ` (10 subsequent siblings)
  13 siblings, 0 replies; 20+ messages in thread
From: Andrei Emeltchenko @ 2013-10-01 15:03 UTC (permalink / raw)
  To: linux-bluetooth

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

Returns socket interface, use header hal.h to avoid externs.
---
 android/hal.h           |   18 ++++++++++++++++++
 android/hal_bluetooth.c |   11 +++++++++++
 2 files changed, 29 insertions(+)
 create mode 100644 android/hal.h

diff --git a/android/hal.h b/android/hal.h
new file mode 100644
index 0000000..40fbf03
--- /dev/null
+++ b/android/hal.h
@@ -0,0 +1,18 @@
+/*
+ * Copyright (C) 2013 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+btsock_interface_t *bt_get_sock_interface(void);
diff --git a/android/hal_bluetooth.c b/android/hal_bluetooth.c
index 9970374..00f3e8d 100644
--- a/android/hal_bluetooth.c
+++ b/android/hal_bluetooth.c
@@ -21,10 +21,13 @@
 #include <stdbool.h>
 
 #include <hardware/bluetooth.h>
+#include <hardware/bt_sock.h>
 
 #define LOG_TAG "BlueZ"
 #include <cutils/log.h>
 
+#include "hal.h"
+
 bt_callbacks_t *bt_hal_cbacks = NULL;
 
 static bool interface_ready(void)
@@ -32,6 +35,11 @@ static bool interface_ready(void)
 	return bt_hal_cbacks != NULL;
 }
 
+static bool is_profile(const char *profile, const char *str)
+{
+	return strcmp(profile, str) == 0;
+}
+
 static int init(bt_callbacks_t *callbacks)
 {
 	ALOGD(__func__);
@@ -246,6 +254,9 @@ static const void *get_profile_interface(const char *profile_id)
 	if (interface_ready() == false)
 		return NULL;
 
+	if (is_profile(profile_id, BT_PROFILE_SOCKETS_ID))
+		return bt_get_sock_interface();
+
 	return NULL;
 }
 
-- 
1.7.10.4


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

* [RFCv2 04/14] android: Start Android Bluetooth daemon
  2013-10-01 15:03 [RFCv2 00/14] Basic code for Android BlueZ Andrei Emeltchenko
                   ` (2 preceding siblings ...)
  2013-10-01 15:03 ` [RFCv2 03/14] android: Enable Socket interface Andrei Emeltchenko
@ 2013-10-01 15:03 ` Andrei Emeltchenko
  2013-10-01 15:03 ` [RFCv2 05/14] android: Add basic mgmt initialization sequence Andrei Emeltchenko
                   ` (9 subsequent siblings)
  13 siblings, 0 replies; 20+ messages in thread
From: Andrei Emeltchenko @ 2013-10-01 15:03 UTC (permalink / raw)
  To: linux-bluetooth

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

Start Android Bluetooth daemon from HAL init(). Make sure
that daemon is in "running" state.
---
 android/hal_bluetooth.c |   54 ++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 53 insertions(+), 1 deletion(-)

diff --git a/android/hal_bluetooth.c b/android/hal_bluetooth.c
index 00f3e8d..f8139a7 100644
--- a/android/hal_bluetooth.c
+++ b/android/hal_bluetooth.c
@@ -23,11 +23,16 @@
 #include <hardware/bluetooth.h>
 #include <hardware/bt_sock.h>
 
+#include <cutils/sockets.h>
+#include <cutils/properties.h>
+
 #define LOG_TAG "BlueZ"
 #include <cutils/log.h>
 
 #include "hal.h"
 
+#define ANDROID_BLUEZ "btd"
+
 bt_callbacks_t *bt_hal_cbacks = NULL;
 
 static bool interface_ready(void)
@@ -35,6 +40,49 @@ static bool interface_ready(void)
 	return bt_hal_cbacks != NULL;
 }
 
+static bool is_running(const char *service_name)
+{
+	char val[PROPERTY_VALUE_MAX];
+	char name[PROPERTY_KEY_MAX];
+	int ret;
+
+	ALOGI(__func__);
+
+	ret = snprintf(name, sizeof(name), "init.svc.%s", service_name);
+	if (ret > PROPERTY_KEY_MAX - 1) {
+		ALOGD("Service name '%s' is too long", service_name);
+		return false;
+	}
+
+	if (property_get(name, val, NULL)) {
+		if (strcmp(val, "running") == 0)
+			return true;
+	}
+
+	return false;
+}
+
+static bool start_bt_daemon(void)
+{
+	int tries = 40; /* wait 4 seconds for completion */
+
+	ALOGI(__func__);
+
+	/* Start Android Bluetooth daemon service */
+	property_set("ctl.start", ANDROID_BLUEZ);
+
+	while (tries-- > 0) {
+		if (is_running(ANDROID_BLUEZ) == true) {
+			ALOGI("Android BlueZ daemon started");
+			return true;
+		}
+
+		usleep(100000);
+	}
+
+	return false;
+}
+
 static bool is_profile(const char *profile, const char *str)
 {
 	return strcmp(profile, str) == 0;
@@ -50,7 +98,11 @@ static int init(bt_callbacks_t *callbacks)
 	/* store reference to user callbacks */
 	bt_hal_cbacks = callbacks;
 
-	/* TODO: Init here bluezd task */
+	if (start_bt_daemon() == true) {
+		/* TODO: open channel */
+
+		return BT_STATUS_SUCCESS;
+	}
 
 	return BT_STATUS_UNSUPPORTED;
 }
-- 
1.7.10.4


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

* [RFCv2 05/14] android: Add basic mgmt initialization sequence
  2013-10-01 15:03 [RFCv2 00/14] Basic code for Android BlueZ Andrei Emeltchenko
                   ` (3 preceding siblings ...)
  2013-10-01 15:03 ` [RFCv2 04/14] android: Start Android Bluetooth daemon Andrei Emeltchenko
@ 2013-10-01 15:03 ` Andrei Emeltchenko
  2013-10-01 15:03 ` [RFCv2 06/14] android: Create HAL API header skeleton Andrei Emeltchenko
                   ` (8 subsequent siblings)
  13 siblings, 0 replies; 20+ messages in thread
From: Andrei Emeltchenko @ 2013-10-01 15:03 UTC (permalink / raw)
  To: linux-bluetooth

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

Initialize bluetooth controller via mgmt interface.
---
 Makefile.android   |    4 +-
 android/Android.mk |   11 +++
 android/main.c     |  189 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 203 insertions(+), 1 deletion(-)

diff --git a/Makefile.android b/Makefile.android
index 8f65dbf..3e6fec0 100644
--- a/Makefile.android
+++ b/Makefile.android
@@ -2,6 +2,8 @@
 if ANDROID_DAEMON
 noinst_PROGRAMS += android/bluezd
 
-android_bluezd_SOURCES = android/main.c src/log.c
+android_bluezd_SOURCES = android/main.c src/log.c \
+				src/shared/util.h src/shared/util.c \
+				src/shared/mgmt.h src/shared/mgmt.c
 android_bluezd_LDADD = @GLIB_LIBS@
 endif
diff --git a/android/Android.mk b/android/Android.mk
index 93de803..99c497a 100644
--- a/android/Android.mk
+++ b/android/Android.mk
@@ -9,14 +9,25 @@ include $(CLEAR_VARS)
 LOCAL_SRC_FILES := \
 	log.c \
 	main.c \
+	../src/shared/mgmt.c \
+	../src/shared/util.c \
 
 LOCAL_C_INCLUDES := \
 	$(call include-path-for, glib) \
 	$(call include-path-for, glib)/glib \
+
+LOCAL_C_INCLUDES += \
+	$(LOCAL_PATH)/../ \
 	$(LOCAL_PATH)/../src \
 
 LOCAL_CFLAGS := -DVERSION=\"$(BLUEZ_VERSION)\"
 
+# to suppress the "pointer of type 'void *' used in arithmetic" warning
+LOCAL_CFLAGS += -Wno-pointer-arith
+
+# Define missing flags for Android 4.2
+LOCAL_CFLAGS += -DSOCK_CLOEXEC=02000000 -DSOCK_NONBLOCK=04000
+
 LOCAL_SHARED_LIBRARIES := \
 	libglib \
 
diff --git a/android/main.c b/android/main.c
index ef62b3d..4792919 100644
--- a/android/main.c
+++ b/android/main.c
@@ -25,6 +25,7 @@
 #include <config.h>
 #endif
 
+#include <stdbool.h>
 #include <signal.h>
 #include <stdint.h>
 #include <stdio.h>
@@ -36,9 +37,17 @@
 #include "log.h"
 #include "hcid.h"
 
+#include "lib/bluetooth.h"
+#include "lib/mgmt.h"
+#include "src/shared/mgmt.h"
+
 #define SHUTDOWN_GRACE_SECONDS 10
 
 static GMainLoop *event_loop;
+static struct mgmt *mgmt_if = NULL;
+
+static uint8_t mgmt_version = 0;
+static uint8_t mgmt_revision = 0;
 
 void btd_exit(void)
 {
@@ -106,6 +115,183 @@ 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 */
+
+	/**
+	 * Register all event notification handlers for controller.
+	 *
+	 * The handlers are registered after a succcesful read of the
+	 * controller info. From now on they can track updates and
+	 * notifications.
+	 */
+}
+
+
+static void mgmt_index_added_event(uint16_t index, uint16_t length,
+					const void *param, void *user_data)
+{
+	info("%s: index %u", __func__, index);
+
+	DBG("sending read info command for index %u", index);
+
+	if (mgmt_send(mgmt_if, MGMT_OP_READ_INFO, index, 0, NULL,
+					read_info_complete, NULL, NULL) > 0)
+		return;
+
+	error("Failed to read adapter info for index %u", index);
+
+}
+
+static void mgmt_index_removed_event(uint16_t index, uint16_t length,
+					const void *param, void *user_data)
+{
+	info("%s: index %u", __func__, index);
+}
+
+static void read_index_list_complete(uint8_t status, uint16_t length,
+					const void *param, void *user_data)
+{
+	const struct mgmt_rp_read_index_list *rp = param;
+	uint16_t num;
+	int i;
+
+	info(__func__);
+
+	if (status != MGMT_STATUS_SUCCESS) {
+		error("%s: Failed to read index list: %s (0x%02x)",
+					__func__, mgmt_errstr(status), status);
+		return;
+	}
+
+	if (length < sizeof(*rp)) {
+		error("%s: Wrong size of read index list response", __func__);
+		return;
+	}
+
+	num = btohs(rp->num_controllers);
+
+	DBG("%s: Number of controllers: %d", __func__, num);
+
+	if (num * sizeof(uint16_t) + sizeof(*rp) != length) {
+		error("%s: Incorrect pkt size for index list rsp", __func__);
+		return;
+	}
+
+	for (i = 0; i < num; i++) {
+		uint16_t index;
+
+		index = btohs(rp->index[i]);
+
+		DBG("%s: Found index %u", __func__, index);
+
+		/**
+		 * Use index added event notification.
+		 */
+		mgmt_index_added_event(index, 0, NULL, NULL);
+	}
+}
+
+
+static void read_commands_complete(uint8_t status, uint16_t length,
+					const void *param, void *user_data)
+{
+	const struct mgmt_rp_read_commands *rp = param;
+	uint16_t num_commands, num_events;
+
+	info(__func__);
+
+	if (status != MGMT_STATUS_SUCCESS) {
+		error("Failed to read supported commands: %s (0x%02x)",
+						mgmt_errstr(status), status);
+		return;
+	}
+
+	if (length < sizeof(*rp)) {
+		error("Wrong size of read commands response");
+		return;
+	}
+
+	num_commands = btohs(rp->num_commands);
+	num_events = btohs(rp->num_events);
+
+	DBG("Number of commands: %d", num_commands);
+	DBG("Number of events: %d", num_events);
+}
+
+static void read_version_complete(uint8_t status, uint16_t length,
+					const void *param, void *user_data)
+{
+	const struct mgmt_rp_read_version *rp = param;
+
+	info(__func__);
+
+	if (status != MGMT_STATUS_SUCCESS) {
+		error("Failed to read version information: %s (0x%02x)",
+						mgmt_errstr(status), status);
+		return;
+	}
+
+	if (length < sizeof(*rp)) {
+		error("Wrong size response");
+		return;
+	}
+
+	mgmt_version = rp->version;
+	mgmt_revision = btohs(rp->revision);
+
+	info("Bluetooth management interface %u.%u initialized",
+						mgmt_version, mgmt_revision);
+
+	if (mgmt_version < 1) {
+		error("Version 1.0 or later of management interface required");
+		abort();
+	}
+
+	DBG("sending read supported commands command");
+
+	mgmt_send(mgmt_if, MGMT_OP_READ_COMMANDS, MGMT_INDEX_NONE, 0, NULL,
+					read_commands_complete, NULL, NULL);
+
+	mgmt_register(mgmt_if, MGMT_EV_INDEX_ADDED, MGMT_INDEX_NONE,
+					mgmt_index_added_event, NULL, NULL);
+	mgmt_register(mgmt_if, MGMT_EV_INDEX_REMOVED, MGMT_INDEX_NONE,
+					mgmt_index_removed_event, NULL, NULL);
+
+	DBG("sending read index list command");
+
+	if (mgmt_send(mgmt_if, MGMT_OP_READ_INDEX_LIST, MGMT_INDEX_NONE, 0,
+			NULL, read_index_list_complete, NULL, NULL) > 0)
+		return;
+
+	error("Failed to read controller index list");
+}
+
+static bool init_mgmt_interface(void)
+{
+	mgmt_if = mgmt_new_default();
+	if (mgmt_if == NULL) {
+		error("Failed to access management interface");
+		return false;
+	}
+
+	if (mgmt_send(mgmt_if, MGMT_OP_READ_VERSION, MGMT_INDEX_NONE, 0, NULL,
+				read_version_complete, NULL, NULL) == 0) {
+		error("Error sending READ_VERSION mgmt command");
+		return false;
+	}
+
+	return true;
+}
+
+static void cleanup_mgmt_interface(void)
+{
+	mgmt_unref(mgmt_if);
+	mgmt_if = NULL;
+}
+
 int main(int argc, char *argv[])
 {
 	GOptionContext *context;
@@ -144,10 +330,13 @@ int main(int argc, char *argv[])
 	/* no need to keep parsed option in memory */
 	free_options();
 
+	init_mgmt_interface();
+
 	DBG("Entering main loop");
 
 	g_main_loop_run(event_loop);
 
+	cleanup_mgmt_interface();
 	g_main_loop_unref(event_loop);
 
 	info("Exit");
-- 
1.7.10.4


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

* [RFCv2 06/14] android: Create HAL API header skeleton
  2013-10-01 15:03 [RFCv2 00/14] Basic code for Android BlueZ Andrei Emeltchenko
                   ` (4 preceding siblings ...)
  2013-10-01 15:03 ` [RFCv2 05/14] android: Add basic mgmt initialization sequence Andrei Emeltchenko
@ 2013-10-01 15:03 ` Andrei Emeltchenko
  2013-10-03 14:07   ` Szymon Janc
  2013-10-01 15:03 ` [RFCv2 07/14] android: Add adapter and device struct for BlueZ daemon Andrei Emeltchenko
                   ` (7 subsequent siblings)
  13 siblings, 1 reply; 20+ messages in thread
From: Andrei Emeltchenko @ 2013-10-01 15:03 UTC (permalink / raw)
  To: linux-bluetooth

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

Header describes the protocol between Android HAL threads and BlueZ
daemon.
---
 android/hal_msg.h |  260 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 260 insertions(+)
 create mode 100644 android/hal_msg.h

diff --git a/android/hal_msg.h b/android/hal_msg.h
new file mode 100644
index 0000000..2d4436a
--- /dev/null
+++ b/android/hal_msg.h
@@ -0,0 +1,260 @@
+/*
+ *
+ *  BlueZ - Bluetooth protocol stack for Linux
+ *
+ *  Copyright (C) 2013  Intel Corporation. All rights reserved.
+ *
+ *
+ *  This library is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Lesser General Public
+ *  License as published by the Free Software Foundation; either
+ *  version 2.1 of the License, or (at your option) any later version.
+ *
+ *  This library is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Lesser General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Lesser General Public
+ *  License along with this library; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ */
+
+#ifndef __packed
+#define __packed __attribute__((packed))
+#endif
+
+typedef struct {
+	uint8_t b[6];
+} __packed __bdaddr_t;
+
+struct hal_msg_hdr {
+	uint8_t service_id;
+	uint8_t opcode;
+	uint16_t len;
+	uint8_t payload[0];
+} __packed;
+
+#define HAL_SERVICE_ID_CORE		0
+#define HAL_SERVICE_ID_BLUETOOTH	1
+#define HAL_SERVICE_ID_HIDHOST		3
+#define HAL_SERVICE_ID_PAN		4
+#define HAL_SERVICE_ID_HANDSFREE	5
+#define HAL_SERVICE_ID_AD2P		6
+#define HAL_SERVICE_ID_HEALTH		7
+#define HAL_SERVICE_ID_AVRCP		8
+#define HAL_SERVICE_ID_GATT		9
+
+/* Core Service */
+
+struct hal_msg_rsp {
+	struct hal_msg_hdr hdr;
+	uint8_t status;
+} __packed;
+
+#define HAL_MSG_OP_ERROR		0x00
+struct hal_msg_rp_error {
+	uint8_t status;
+} __packed;
+
+#define HAL_MSG_OP_REGISTER_MODULE	0x02
+struct hal_msg_cp_register_module {
+	uint8_t service_id;
+} __packed;
+
+struct hal_msg_rp_register_module {
+	uint8_t service_id;
+} __packed;
+
+#define HAL_MSG_OP_UNREGISTER_MODULE	0x03
+struct hal_msg_cp_unregister_module {
+	uint8_t service_id;
+} __packed;
+
+/* Bluetooth Core HAL API */
+
+#define HAL_MSG_OP_BT_ENABLE		0x01
+
+#define HAL_MSG_OP_BT_DISABLE		0x02
+
+#define HAL_MSG_OP_BT_GET_ADAPTER_PROPS	0x03
+
+#define HAL_MSG_OP_BT_GET_ADAPTER_PROP	0x04
+struct hal_msg_cp_bt_get_adapter_prop {
+	uint8_t type;
+} __packed;
+
+#define HAL_MSG_OP_BT_SET_ADAPTER_PROP	0x05
+struct hal_msg_cp_bt_set_adapter_prop {
+	uint8_t type;
+	uint16_t len;
+	uint8_t val[0];
+} __packed;
+
+#define HAL_MSG_OP_BT_GET_REMOTE_DEVICE_PROPS	0x06
+struct hal_msg_cp_bt_get_remote_device_props {
+	__bdaddr_t bdaddr;
+} __packed;
+
+#define HAL_MSG_OP_BT_GET_REMOTE_DEVICE_PROP	0x07
+struct hal_msg_cp_bt_get_remote_device_prop {
+	__bdaddr_t bdaddr;
+	uint8_t type;
+} __packed;
+
+#define HAL_MSG_OP_BT_SET_REMOTE_DEVICE_PROP	0x08
+struct hal_msg_cp_bt_set_remote_device_prop {
+	__bdaddr_t bdaddr;
+	uint8_t type;
+	uint16_t len;
+	uint8_t val[0];
+} __packed;
+
+#define HAL_MSG_OP_BT_GET_REMOTE_SERVICE_REC	0x09
+struct hal_msg_cp_bt_get_remote_service_rec {
+	__bdaddr_t bdaddr;
+	uint8_t uuid[16];
+} __packed;
+
+#define HAL_MSG_OP_BT_GET_REMOTE_SERVICE	0x0a
+struct hal_msg_cp_bt_get_remote_service {
+	__bdaddr_t bdaddr;
+} __packed;
+
+#define HAL_MSG_OP_BT_START_DISCOVERY	0x0b
+
+#define HAL_MSG_OP_BT_CANCEL_DISCOVERY	0x0c
+
+#define HAL_MSG_OP_BT_CREATE_BOND	0x0d
+struct hal_msg_cp_bt_create_bond {
+	__bdaddr_t bdaddr;
+} __packed;
+
+#define HAL_MSG_OP_BT_REMOVE_BOND	0x0d
+struct hal_msg_cp_bt_remove_bond {
+	__bdaddr_t bdaddr;
+} __packed;
+
+#define HAL_MSG_OP_BT_CANCEL_BOND	0x0f
+struct hal_msg_cp_bt_cancel_bond {
+	__bdaddr_t bdaddr;
+} __packed;
+
+#define HAL_MSG_OP_BT_PIN_REPLY		0x10
+struct hal_msg_cp_bt_pin_reply {
+	__bdaddr_t bdaddr;
+	uint8_t accept;
+	uint8_t pin_len;
+	uint8_t pin_code[16];
+} __packed;
+
+#define HAL_MSG_OP_BT_SSP_REPLY		0x11
+struct hal_msg_cp_bt_ssp_reply {
+	__bdaddr_t bdaddr;
+	uint8_t ssp_variant;
+	uint8_t accept;
+	uint32_t passkey;
+} __packed;
+
+#define HAL_MSG_OP_BT_DUT_MODE_CONF	0x12
+struct hal_msg_cp_bt_dut_mode_conf {
+	uint8_t enable;
+} __packed;
+
+#define HAL_MSG_OP_BT_DUT_MODE_SEND	0x13
+struct hal_msg_cp_bt_dut_mode_send {
+	uint16_t opcode;
+	uint8_t len;
+	uint8_t data[0];
+} __packed;
+
+#define HAL_MSG_OP_BT_LE_TEST_MODE	0x14
+struct hal_msg_cp_bt_le_test_mode {
+	uint16_t opcode;
+	uint8_t len;
+	uint8_t data[0];
+} __packed;
+
+/* Notifications and confirmations */
+
+#define HAL_MSG_EV_BT_ERROR			0x80
+
+#define HAL_MSG_EV_BT_ADAPTER_STATE_CHANGED	0x81
+struct hal_msg_ev_bt_adapter_state_changed {
+	uint8_t state;
+} __packed;
+
+#define HAL_MSG_EV_BT_ADAPTER_PROPS_CHANGED	0x82
+struct hal_property {
+	uint8_t type;
+	uint16_t len;
+	uint8_t val[0];
+} __packed;
+struct hal_msg_ev_bt_adapter_props_changed {
+	uint8_t status;
+	uint8_t num_props;
+	struct hal_property props[0];
+} __packed;
+
+#define HAL_MSG_EV_BT_REMOTE_DEVICE_PROPS	0x83
+struct hal_msg_ev_bt_remote_device_props {
+	uint8_t status;
+	__bdaddr_t bdaddr;
+	uint8_t num_props;
+	struct hal_property props[0];
+} __packed;
+
+#define HAL_MSG_EV_BT_DEVICE_FOUND		0x84
+struct hal_msg_ev_bt_device_found {
+	uint8_t num_props;
+	struct hal_property props[0];
+} __packed;
+
+#define HAL_MSG_EV_BT_DISCOVERY_STATE_CHANGED	0x85
+struct hal_msg_ev_bt_discovery_state_changed {
+	uint8_t state;
+} __packed;
+
+#define HAL_MSG_EV_BT_PIN_REQUEST		0x86
+struct hal_msg_ev_bt_pin_request {
+	__bdaddr_t bdaddr;
+	uint8_t name[249 - 1];
+	uint8_t class_of_dev[3];
+} __packed;
+
+#define HAL_MSG_EV_BT_SSP_REQUEST		0x87
+struct hal_msg_ev_bt_ssp_request {
+	__bdaddr_t bdaddr;
+	uint8_t name[249 - 1];
+	uint8_t class_of_dev[3];
+	uint8_t pairing_variant;
+	uint32_t passkey;
+} __packed;
+
+#define HAL_MSG_EV_BT_BOND_STATE_CHANGED	0x88
+struct hal_msg_ev_bt_bond_state_changed {
+	uint8_t status;
+	__bdaddr_t bdaddr;
+	uint8_t state;
+} __packed;
+
+#define HAL_MSG_EV_BT_ACL_STATE_CHANGED		0x89
+struct hal_msg_ev_bt_acl_state_changed {
+	uint8_t status;
+	__bdaddr_t bdaddr;
+	uint8_t state;
+} __packed;
+
+#define HAL_MSG_EV_BT_DUT_MODE_RECEIVE		0x8a
+struct hal_msg_ev_bt_dut_mode_receive {
+	uint16_t opcode;
+	uint8_t len;
+	uint8_t data[0];
+} __packed;
+
+#define HAL_MSG_EV_BT_LE_TEST_MODE		0x8b
+struct hal_msg_ev_bt_le_test_mode {
+	uint8_t status;
+	uint16_t num_packets;
+} __packed;
-- 
1.7.10.4


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

* [RFCv2 07/14] android: Add adapter and device struct for BlueZ daemon
  2013-10-01 15:03 [RFCv2 00/14] Basic code for Android BlueZ Andrei Emeltchenko
                   ` (5 preceding siblings ...)
  2013-10-01 15:03 ` [RFCv2 06/14] android: Create HAL API header skeleton Andrei Emeltchenko
@ 2013-10-01 15:03 ` Andrei Emeltchenko
  2013-10-01 15:03 ` [RFCv2 08/14] android: Add Android Makefile for libbluetooth Andrei Emeltchenko
                   ` (6 subsequent siblings)
  13 siblings, 0 replies; 20+ messages in thread
From: Andrei Emeltchenko @ 2013-10-01 15:03 UTC (permalink / raw)
  To: linux-bluetooth

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

Adapter structure in BlueZ daemon keeps track of default adapter
and device structure keeps track about found devices.
---
 android/bt_adapter.c |   56 ++++++++++++++++++++++++++++++++++++++++++++++
 android/bt_adapter.h |   60 ++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 116 insertions(+)
 create mode 100644 android/bt_adapter.c
 create mode 100644 android/bt_adapter.h

diff --git a/android/bt_adapter.c b/android/bt_adapter.c
new file mode 100644
index 0000000..e21d50c
--- /dev/null
+++ b/android/bt_adapter.c
@@ -0,0 +1,56 @@
+/*
+ *
+ *  BlueZ - Bluetooth protocol stack for Linux
+ *
+ *  Copyright (C) 2013  Intel Corporation. All rights reserved.
+ *
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ */
+
+#include "bt_adapter.h"
+#include "log.h"
+#include "src/shared/mgmt.h"
+
+struct bt_adapter *bt_adapter_new(uint16_t index, struct mgmt *mgmt_if)
+{
+	struct bt_adapter *adapter;
+
+	adapter = g_try_new0(struct bt_adapter, 1);
+	if (!adapter)
+		return NULL;
+
+	adapter->dev_id = index;
+	adapter->mgmt = mgmt_ref(mgmt_if);
+
+	return adapter;
+}
+
+void adapter_start(struct bt_adapter *adapter)
+{
+	DBG("enabled %u", adapter->dev_id);
+
+	/* TODO: CB: report scan mode */
+
+	/* TODO: SDP start here */
+
+	/* TODO: CB: report state on */
+}
+
+void adapter_stop(struct bt_adapter *adapter)
+{
+	DBG("disabled %u", adapter->dev_id);
+}
diff --git a/android/bt_adapter.h b/android/bt_adapter.h
new file mode 100644
index 0000000..6877cc7
--- /dev/null
+++ b/android/bt_adapter.h
@@ -0,0 +1,60 @@
+/*
+ *
+ *  BlueZ - Bluetooth protocol stack for Linux
+ *
+ *  Copyright (C) 2013  Intel Corporation. All rights reserved.
+ *
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <glib.h>
+
+#include "lib/bluetooth.h"
+
+struct bt_device {
+	int refcnt;
+
+	bdaddr_t bdaddr;
+	uint8_t bdaddr_type;
+	uint32_t cod;
+	char *name;
+};
+
+struct bt_adapter {
+	int refcnt;
+
+	uint16_t dev_id;
+	struct mgmt *mgmt;
+	bdaddr_t bdaddr;
+	uint32_t dev_class;
+
+	char *name;
+	char *short_name;
+
+	uint32_t supported_settings;
+	uint32_t current_settings;
+
+	GList *found_devices;
+};
+
+struct bt_adapter *bt_adapter_new(uint16_t index, struct mgmt *mgmt_if);
+
+void adapter_start(struct bt_adapter *adapter);
+void adapter_stop(struct bt_adapter *adapter);
-- 
1.7.10.4


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

* [RFCv2 08/14] android: Add Android Makefile for libbluetooth
  2013-10-01 15:03 [RFCv2 00/14] Basic code for Android BlueZ Andrei Emeltchenko
                   ` (6 preceding siblings ...)
  2013-10-01 15:03 ` [RFCv2 07/14] android: Add adapter and device struct for BlueZ daemon Andrei Emeltchenko
@ 2013-10-01 15:03 ` Andrei Emeltchenko
  2013-10-01 15:03 ` [RFCv2 09/14] android: sdp: Reuse BlueZ SDP server in Android Andrei Emeltchenko
                   ` (5 subsequent siblings)
  13 siblings, 0 replies; 20+ messages in thread
From: Andrei Emeltchenko @ 2013-10-01 15:03 UTC (permalink / raw)
  To: linux-bluetooth

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

Build libbluetooth library for Android.
---
 android/Android.mk |   55 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 55 insertions(+)

diff --git a/android/Android.mk b/android/Android.mk
index 99c497a..11ac204 100644
--- a/android/Android.mk
+++ b/android/Android.mk
@@ -54,3 +54,58 @@ LOCAL_MODULE_TAGS := optional
 LOCAL_MODULE_CLASS := SHARED_LIBRARIES
 
 include $(BUILD_SHARED_LIBRARY)
+
+#
+# libbluetooth library
+#
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := \
+	../lib/bluetooth.c \
+	../lib/sdp.c \
+	../lib/hci.c \
+	../lib/uuid.c \
+
+LOCAL_C_INCLUDES := \
+	$(LOCAL_PATH)/../lib/ \
+	$(LOCAL_PATH)/../src/shared \
+
+LOCAL_C_INCLUDES += \
+	$(call include-path-for, glib) \
+	$(call include-path-for, glib)/glib \
+
+LOCAL_CFLAGS += -O3
+
+# to suppress the "pointer of type 'void *' used in arithmetic" warning
+LOCAL_CFLAGS += -Wno-pointer-arith
+
+# to suppress the "missing initializer near initialization" warning
+LOCAL_CFLAGS += -Wno-missing-field-initializers
+
+# to suppress the "may be used uninitialized in this function" warning
+LOCAL_CFLAGS += -Wno-maybe-uninitialized
+
+# Define missing flags for Android 4.2
+LOCAL_CFLAGS += -DSOCK_CLOEXEC=02000000 -DSOCK_NONBLOCK=04000
+
+lib_headers := \
+	bluetooth.h \
+	hci.h \
+	hci_lib.h \
+	sco.h \
+	l2cap.h \
+	sdp.h \
+	sdp_lib.h \
+	rfcomm.h \
+	bnep.h \
+	cmtp.h \
+	hidp.h \
+
+$(shell mkdir -p $(LOCAL_PATH)/bluetooth)
+
+$(foreach file,$(lib_headers), $(shell ln -sf ../$(file) $(LOCAL_PATH)/bluetooth/$(file)))
+
+LOCAL_MODULE := libbluetooth
+
+include $(BUILD_SHARED_LIBRARY)
-- 
1.7.10.4


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

* [RFCv2 09/14] android: sdp: Reuse BlueZ SDP server in Android
  2013-10-01 15:03 [RFCv2 00/14] Basic code for Android BlueZ Andrei Emeltchenko
                   ` (7 preceding siblings ...)
  2013-10-01 15:03 ` [RFCv2 08/14] android: Add Android Makefile for libbluetooth Andrei Emeltchenko
@ 2013-10-01 15:03 ` Andrei Emeltchenko
  2013-10-03 11:23   ` Szymon Janc
  2013-10-01 15:03 ` [RFCv2 10/14] android: Add cap to bind to port < 1024 Andrei Emeltchenko
                   ` (4 subsequent siblings)
  13 siblings, 1 reply; 20+ messages in thread
From: Andrei Emeltchenko @ 2013-10-01 15:03 UTC (permalink / raw)
  To: linux-bluetooth

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

Reuse existing SDP server code in Android GPL daemon.
---
 Makefile.android     |    7 +++++--
 android/Android.mk   |    7 +++++++
 android/bt_adapter.c |    5 ++++-
 android/main.c       |   29 +++++++++++++++++++++++++++++
 android/main.h       |   25 +++++++++++++++++++++++++
 5 files changed, 70 insertions(+), 3 deletions(-)
 create mode 100644 android/main.h

diff --git a/Makefile.android b/Makefile.android
index 3e6fec0..bf82928 100644
--- a/Makefile.android
+++ b/Makefile.android
@@ -3,7 +3,10 @@ if ANDROID_DAEMON
 noinst_PROGRAMS += android/bluezd
 
 android_bluezd_SOURCES = android/main.c src/log.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
-android_bluezd_LDADD = @GLIB_LIBS@
+				src/shared/mgmt.h src/shared/mgmt.c \
+				android/bt_adapter.h android/bt_adapter.c
+android_bluezd_LDADD = lib/libbluetooth-internal.la @GLIB_LIBS@
 endif
diff --git a/android/Android.mk b/android/Android.mk
index 11ac204..b0a531f 100644
--- a/android/Android.mk
+++ b/android/Android.mk
@@ -11,6 +11,11 @@ LOCAL_SRC_FILES := \
 	main.c \
 	../src/shared/mgmt.c \
 	../src/shared/util.c \
+	bt_adapter.c \
+	../src/sdpd-database.c \
+	../src/sdpd-service.c \
+	../src/sdpd-request.c \
+	../src/sdpd-server.c \
 
 LOCAL_C_INCLUDES := \
 	$(call include-path-for, glib) \
@@ -19,6 +24,7 @@ LOCAL_C_INCLUDES := \
 LOCAL_C_INCLUDES += \
 	$(LOCAL_PATH)/../ \
 	$(LOCAL_PATH)/../src \
+	$(LOCAL_PATH)/../lib \
 
 LOCAL_CFLAGS := -DVERSION=\"$(BLUEZ_VERSION)\"
 
@@ -30,6 +36,7 @@ LOCAL_CFLAGS += -DSOCK_CLOEXEC=02000000 -DSOCK_NONBLOCK=04000
 
 LOCAL_SHARED_LIBRARIES := \
 	libglib \
+	libbluetooth \
 
 LOCAL_MODULE := bluezd
 
diff --git a/android/bt_adapter.c b/android/bt_adapter.c
index e21d50c..5016243 100644
--- a/android/bt_adapter.c
+++ b/android/bt_adapter.c
@@ -23,6 +23,7 @@
 
 #include "bt_adapter.h"
 #include "log.h"
+#include "main.h"
 #include "src/shared/mgmt.h"
 
 struct bt_adapter *bt_adapter_new(uint16_t index, struct mgmt *mgmt_if)
@@ -45,7 +46,7 @@ void adapter_start(struct bt_adapter *adapter)
 
 	/* TODO: CB: report scan mode */
 
-	/* TODO: SDP start here */
+	sdp_start();
 
 	/* TODO: CB: report state on */
 }
@@ -53,4 +54,6 @@ void adapter_start(struct bt_adapter *adapter)
 void adapter_stop(struct bt_adapter *adapter)
 {
 	DBG("disabled %u", adapter->dev_id);
+
+	sdp_stop();
 }
diff --git a/android/main.c b/android/main.c
index 4792919..db435f9 100644
--- a/android/main.c
+++ b/android/main.c
@@ -36,6 +36,8 @@
 
 #include "log.h"
 #include "hcid.h"
+#include "sdpd.h"
+#include "main.h"
 
 #include "lib/bluetooth.h"
 #include "lib/mgmt.h"
@@ -43,12 +45,39 @@
 
 #define SHUTDOWN_GRACE_SECONDS 10
 
+struct main_opts main_opts;
+
 static GMainLoop *event_loop;
 static struct mgmt *mgmt_if = NULL;
 
 static uint8_t mgmt_version = 0;
 static uint8_t mgmt_revision = 0;
 
+GList *adapter_list = NULL;
+struct bt_adapter *default_adapter = NULL;
+
+int sdp_start(void)
+{
+	DBG("");
+
+	/* TODO: add logic */
+
+	/* sdpd-server use these settings */
+	memset(&main_opts, 0, sizeof(main_opts));
+
+	/* Use params: mtu = 0, flags = 0 */
+	return start_sdp_server(0, 0);
+}
+
+void sdp_stop(void)
+{
+	DBG("");
+
+	/* TODO: add logic */
+
+	stop_sdp_server();
+}
+
 void btd_exit(void)
 {
 	g_main_loop_quit(event_loop);
diff --git a/android/main.h b/android/main.h
new file mode 100644
index 0000000..6ecad14
--- /dev/null
+++ b/android/main.h
@@ -0,0 +1,25 @@
+/*
+ *
+ *  BlueZ - Bluetooth protocol stack for Linux
+ *
+ *  Copyright (C) 2013  Intel Corporation. All rights reserved.
+ *
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ */
+
+int sdp_start(void);
+void sdp_stop(void);
-- 
1.7.10.4


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

* [RFCv2 10/14] android: Add cap to bind to port < 1024
  2013-10-01 15:03 [RFCv2 00/14] Basic code for Android BlueZ Andrei Emeltchenko
                   ` (8 preceding siblings ...)
  2013-10-01 15:03 ` [RFCv2 09/14] android: sdp: Reuse BlueZ SDP server in Android Andrei Emeltchenko
@ 2013-10-01 15:03 ` Andrei Emeltchenko
  2013-10-01 15:03 ` [RFCv2 11/14] android: Implement read_info_complete callback Andrei Emeltchenko
                   ` (3 subsequent siblings)
  13 siblings, 0 replies; 20+ messages in thread
From: Andrei Emeltchenko @ 2013-10-01 15:03 UTC (permalink / raw)
  To: linux-bluetooth

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

For SDP server we need to bind to lower port, acquire this capability.
---
 android/main.c |   63 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 configure.ac   |    4 ++++
 2 files changed, 67 insertions(+)

diff --git a/android/main.c b/android/main.c
index db435f9..36f9c1a 100644
--- a/android/main.c
+++ b/android/main.c
@@ -31,6 +31,22 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <unistd.h>
+#include <errno.h>
+#include <sys/prctl.h>
+#include <linux/capability.h>
+
+/**
+ * Include <sys/capability.h> for host build and
+ * also for Android 4.3 when it is added to bionic
+ */
+#if !defined(__ANDROID_API__) || (__ANDROID_API__ > 17)
+#include <sys/capability.h>
+#endif
+
+#if defined(__ANDROID_API__)
+#include <private/android_filesystem_config.h>
+#endif
 
 #include <glib.h>
 
@@ -321,6 +337,50 @@ static void cleanup_mgmt_interface(void)
 	mgmt_if = NULL;
 }
 
+static bool android_set_aid_and_cap()
+{
+	struct __user_cap_header_struct header;
+	struct __user_cap_data_struct cap;
+
+	DBG("pid %d uid %d gid %d", getpid(), getuid(), getgid());
+
+	header.version = _LINUX_CAPABILITY_VERSION;
+	header.pid = getpid();
+	if (capget(&header, &cap) < 0)
+		error("%s: capget(): %s", __func__, strerror(errno));
+	else
+		DBG("Caps: eff: 0x%x, perm: 0x%x, inh: 0x%x", cap.effective,
+					cap.permitted, cap.inheritable);
+
+#if defined(__ANDROID_API__)
+	if (setgid(AID_BLUETOOTH) < 0) {
+		error("%s: setgid(): %s", __func__, strerror(errno));
+		return false;
+	}
+
+	if (setuid(AID_BLUETOOTH) < 0) {
+		error("%s: setuid(): %s", __func__, strerror(errno));
+		return false;
+	}
+#endif
+
+	prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0);
+
+	header.version = _LINUX_CAPABILITY_VERSION;
+	header.pid = 0;
+
+	cap.effective = cap.permitted = cap.inheritable =
+		CAP_TO_MASK(CAP_NET_ADMIN) |
+		CAP_TO_MASK(CAP_NET_BIND_SERVICE);
+
+	if (capset(&header, &cap)) {
+		error("%s: capset(): %s", __func__, strerror(errno));
+		return false;
+	}
+
+	return true;
+}
+
 int main(int argc, char *argv[])
 {
 	GOptionContext *context;
@@ -359,6 +419,9 @@ int main(int argc, char *argv[])
 	/* no need to keep parsed option in memory */
 	free_options();
 
+	if (android_set_aid_and_cap() == false)
+		exit(EXIT_FAILURE);
+
 	init_mgmt_interface();
 
 	DBG("Entering main loop");
diff --git a/configure.ac b/configure.ac
index 3b7a5d9..af418d3 100644
--- a/configure.ac
+++ b/configure.ac
@@ -247,4 +247,8 @@ AC_ARG_ENABLE(android-daemon, AC_HELP_STRING([--enable-android-daemon],
 					[android_daemon=${enableval}])
 AM_CONDITIONAL(ANDROID_DAEMON, test "${android_daemon}" = "yes")
 
+if (test "${android_daemon}" = "yes"); then
+	AC_CHECK_LIB(cap, capget, dummy=yes, AC_MSG_ERROR(libcap is required))
+fi
+
 AC_OUTPUT(Makefile src/bluetoothd.8 lib/bluez.pc)
-- 
1.7.10.4


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

* [RFCv2 11/14] android: Implement read_info_complete callback
  2013-10-01 15:03 [RFCv2 00/14] Basic code for Android BlueZ Andrei Emeltchenko
                   ` (9 preceding siblings ...)
  2013-10-01 15:03 ` [RFCv2 10/14] android: Add cap to bind to port < 1024 Andrei Emeltchenko
@ 2013-10-01 15:03 ` Andrei Emeltchenko
  2013-10-01 15:03 ` [RFCv2 12/14] android: Handle mgmt changed events Andrei Emeltchenko
                   ` (2 subsequent siblings)
  13 siblings, 0 replies; 20+ messages in thread
From: Andrei Emeltchenko @ 2013-10-01 15:03 UTC (permalink / raw)
  To: linux-bluetooth

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

Handle read info complete callback from mgmt interface.
---
 android/main.c |  100 +++++++++++++++++++++++++++++++++++++++++++++++++-------
 1 file changed, 88 insertions(+), 12 deletions(-)

diff --git a/android/main.c b/android/main.c
index 36f9c1a..29389d5 100644
--- a/android/main.c
+++ b/android/main.c
@@ -54,6 +54,7 @@
 #include "hcid.h"
 #include "sdpd.h"
 #include "main.h"
+#include "bt_adapter.h"
 
 #include "lib/bluetooth.h"
 #include "lib/mgmt.h"
@@ -160,34 +161,109 @@ static GOptionEntry options[] = {
 	{ NULL }
 };
 
-static void read_info_complete(uint8_t status, uint16_t length,
+static void load_link_keys_complete(uint8_t status, uint16_t length,
 					const void *param, void *user_data)
 {
-	/* TODO: Store Controller information */
-
-	/**
-	 * Register all event notification handlers for controller.
-	 *
-	 * The handlers are registered after a succcesful read of the
-	 * controller info. From now on they can track updates and
-	 * notifications.
-	 */
+	DBG("status %u", status);
+}
+
+static void load_link_keys(struct bt_adapter *adapter, GSList *keys)
+{
+	struct mgmt_cp_load_link_keys *cp;
+	uint16_t key_len = g_slist_length(keys);
+	struct mgmt_link_key_info *key;
+	uint16_t len;
+
+	DBG("");
+
+	len = sizeof(*cp) + key_len * sizeof(*key);
+	cp = malloc(len);
+	if (cp == NULL) {
+		error("%s: Not enough memory for link keys loading", __func__);
+		return;
+	}
+
+	cp->debug_keys = 0;
+	cp->key_count = htobs(key_len);
+
+	mgmt_send(adapter->mgmt, MGMT_OP_LOAD_LINK_KEYS, adapter->dev_id, 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)
+{
+	const struct mgmt_rp_read_info *rp = param;
+
+	DBG("");
+
+	if (status != MGMT_STATUS_SUCCESS) {
+		error("Failed to read info for index %u: %s (0x%02x)",
+			default_adapter->dev_id, 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) == 0) {
+		error("No Bluetooth address for index %u",
+						default_adapter->dev_id);
+		goto failed;
+	}
+
+	/* Store adapter information */
+	bacpy(&default_adapter->bdaddr, &rp->bdaddr);
+	default_adapter->dev_class = rp->dev_class[0] |
+						(rp->dev_class[1] << 8) |
+						(rp->dev_class[2] << 16);
+	default_adapter->name = g_strdup((const char *) rp->name);
+	default_adapter->short_name = g_strdup((const char *) rp->short_name);
+
+	default_adapter->supported_settings = btohs(rp->supported_settings);
+	default_adapter->current_settings = btohs(rp->current_settings);
+
+	/* TODO: Register all event notification handlers */
+
+	if (default_adapter->current_settings & MGMT_SETTING_POWERED)
+		adapter_start(default_adapter);
+
+	/* dummy link keys loading */
+	load_link_keys(default_adapter, NULL);
+
+	return;
+
+failed:
+	default_adapter = NULL;
+}
 
 static void mgmt_index_added_event(uint16_t index, uint16_t length,
 					const void *param, void *user_data)
 {
 	info("%s: index %u", __func__, index);
 
+	if (default_adapter == NULL) {
+		DBG("skip event for index %d", index);
+		return;
+	}
+
+	default_adapter = bt_adapter_new(index, mgmt_if);
+	if (default_adapter == NULL) {
+		error("Unable to create new adapter for index %u", index);
+		return;
+	}
+
 	DBG("sending read info command for index %u", index);
 
 	if (mgmt_send(mgmt_if, MGMT_OP_READ_INFO, index, 0, NULL,
-					read_info_complete, NULL, NULL) > 0)
+				read_info_complete, NULL, NULL) > 0)
 		return;
 
 	error("Failed to read adapter info for index %u", index);
-
 }
 
 static void mgmt_index_removed_event(uint16_t index, uint16_t length,
-- 
1.7.10.4


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

* [RFCv2 12/14] android: Handle mgmt changed events
  2013-10-01 15:03 [RFCv2 00/14] Basic code for Android BlueZ Andrei Emeltchenko
                   ` (10 preceding siblings ...)
  2013-10-01 15:03 ` [RFCv2 11/14] android: Implement read_info_complete callback Andrei Emeltchenko
@ 2013-10-01 15:03 ` Andrei Emeltchenko
  2013-10-01 15:03 ` [RFCv2 13/14] android: Add makefile for hciconfig Andrei Emeltchenko
  2013-10-01 15:03 ` [RFCv2 14/14] android: Add makefile for hcitool Andrei Emeltchenko
  13 siblings, 0 replies; 20+ messages in thread
From: Andrei Emeltchenko @ 2013-10-01 15:03 UTC (permalink / raw)
  To: linux-bluetooth

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

Add code handling changing adapter settings.
---
 android/main.c |  154 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 154 insertions(+)

diff --git a/android/main.c b/android/main.c
index 29389d5..3af1b96 100644
--- a/android/main.c
+++ b/android/main.c
@@ -167,6 +167,159 @@ static void load_link_keys_complete(uint8_t status, uint16_t length,
 	DBG("status %u", status);
 }
 
+static void mgmt_local_name_changed_event(uint16_t index, uint16_t length,
+					const void *param, void *user_data)
+{
+	struct bt_adapter *adapter = user_data;
+	const struct mgmt_cp_set_local_name *rp = param;
+
+	if (length < sizeof(*rp)) {
+		error("Wrong size of local name changed parameters");
+		return;
+	}
+
+	if (adapter != default_adapter) {
+		error("Wrong adapter %p", adapter);
+		return;
+	}
+
+	if (!g_strcmp0(adapter->short_name, (const char *) rp->short_name) &&
+			!g_strcmp0(adapter->name, (const char *) rp->name))
+		return;
+
+	DBG("name: %s short name: %s", rp->name, rp->short_name);
+
+	g_free(adapter->name);
+	adapter->name = g_strdup((const char *) rp->name);
+
+	g_free(adapter->short_name);
+	adapter->short_name = g_strdup((const char *) rp->short_name);
+
+	/* TODO Update services if needed */
+}
+
+static void settings_changed_connectable(struct bt_adapter *adapter)
+{
+	/* TODO */
+}
+
+static void settings_changed_discoverable(struct bt_adapter *adapter)
+{
+	/* TODO */
+}
+
+static void settings_changed(struct bt_adapter *adapter, uint32_t settings)
+{
+	uint32_t changed_mask;
+
+	changed_mask = adapter->current_settings ^ settings;
+
+	adapter->current_settings = settings;
+
+	DBG("0x%08x", changed_mask);
+
+	if (changed_mask & MGMT_SETTING_POWERED) {
+		info("Powered");
+
+		if (adapter->current_settings & MGMT_SETTING_POWERED)
+			adapter_start(adapter);
+		else
+			adapter_stop(adapter);
+	}
+
+	/* Seems not needed for Android */
+	if (changed_mask & MGMT_SETTING_PAIRABLE)
+		DBG("Pairable");
+
+	/*
+	 * There are only 2 scan modes:
+	 * CONNECTABLE and CONNECTABLE_DISCOVERABLE
+	 */
+	if (changed_mask & MGMT_SETTING_CONNECTABLE) {
+		DBG("Connectable");
+
+		settings_changed_connectable(adapter);
+	}
+
+	if (changed_mask & MGMT_SETTING_DISCOVERABLE) {
+		DBG("Discoverable");
+
+		settings_changed_discoverable(adapter);
+	}
+}
+
+static void new_settings_callback(uint16_t index, uint16_t length,
+					const void *param, void *user_data)
+{
+	struct bt_adapter *adapter = user_data;
+	uint32_t settings;
+
+	if (length < sizeof(settings)) {
+		error("Wrong size of new settings parameters");
+		return;
+	}
+
+	if (adapter != default_adapter) {
+		error("Wrong adapter %p", adapter);
+		return;
+	}
+
+	settings = bt_get_le32(param);
+
+	DBG("settings: 0x%8.8x -> 0x%8.8x", adapter->current_settings,
+								settings);
+
+	if (settings == adapter->current_settings)
+		return;
+
+	settings_changed(adapter, settings);
+}
+
+static void mgmt_dev_class_changed_event(uint16_t index, uint16_t length,
+					const void *param, void *user_data)
+{
+	struct bt_adapter *adapter = user_data;
+	const struct mgmt_cod *rp = param;
+	uint32_t dev_class;
+
+	if (length < sizeof(*rp)) {
+		error("Wrong size of class of device changed parameters");
+		return;
+	}
+
+	if (adapter != default_adapter) {
+		error("Wrong adapter %p", adapter);
+		return;
+	}
+
+	dev_class = rp->val[0] | (rp->val[1] << 8) | (rp->val[2] << 16);
+
+	if (dev_class == adapter->dev_class)
+		return;
+
+	DBG("Class: 0x%06x", dev_class);
+
+	adapter->dev_class = dev_class;
+
+	/* TODO: Inform prop change: Class */
+
+	/* TODO: Gatt attrib set*/
+}
+
+static void register_mgmt_handlers(struct bt_adapter *adapter)
+{
+	mgmt_register(adapter->mgmt, MGMT_EV_NEW_SETTINGS, adapter->dev_id,
+					new_settings_callback, adapter, NULL);
+
+	mgmt_register(adapter->mgmt, MGMT_EV_CLASS_OF_DEV_CHANGED,
+			adapter->dev_id, mgmt_dev_class_changed_event,
+			adapter, NULL);
+
+	mgmt_register(adapter->mgmt, MGMT_EV_LOCAL_NAME_CHANGED,
+			adapter->dev_id, mgmt_local_name_changed_event,
+			adapter, NULL);
+}
+
 static void load_link_keys(struct bt_adapter *adapter, GSList *keys)
 {
 	struct mgmt_cp_load_link_keys *cp;
@@ -228,6 +381,7 @@ static void read_info_complete(uint8_t status, uint16_t length,
 	default_adapter->current_settings = btohs(rp->current_settings);
 
 	/* TODO: Register all event notification handlers */
+	register_mgmt_handlers(default_adapter);
 
 	if (default_adapter->current_settings & MGMT_SETTING_POWERED)
 		adapter_start(default_adapter);
-- 
1.7.10.4


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

* [RFCv2 13/14] android: Add makefile for hciconfig
  2013-10-01 15:03 [RFCv2 00/14] Basic code for Android BlueZ Andrei Emeltchenko
                   ` (11 preceding siblings ...)
  2013-10-01 15:03 ` [RFCv2 12/14] android: Handle mgmt changed events Andrei Emeltchenko
@ 2013-10-01 15:03 ` Andrei Emeltchenko
  2013-10-01 15:03 ` [RFCv2 14/14] android: Add makefile for hcitool Andrei Emeltchenko
  13 siblings, 0 replies; 20+ messages in thread
From: Andrei Emeltchenko @ 2013-10-01 15:03 UTC (permalink / raw)
  To: linux-bluetooth

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

---
 android/Android.mk |   34 ++++++++++++++++++++++++++++++++++
 1 file changed, 34 insertions(+)

diff --git a/android/Android.mk b/android/Android.mk
index b0a531f..9a38701 100644
--- a/android/Android.mk
+++ b/android/Android.mk
@@ -116,3 +116,37 @@ $(foreach file,$(lib_headers), $(shell ln -sf ../$(file) $(LOCAL_PATH)/bluetooth
 LOCAL_MODULE := libbluetooth
 
 include $(BUILD_SHARED_LIBRARY)
+
+#
+# hciconfig
+#
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := \
+	../tools/csr.c \
+	../tools/csr_h4.c \
+	../tools/hciconfig.c \
+
+LOCAL_C_INCLUDES := \
+	$(LOCAL_PATH)/../lib \
+	$(LOCAL_PATH)/../src \
+
+LOCAL_C_INCLUDES += \
+	$(call include-path-for, glib) \
+	$(call include-path-for, glib)/glib \
+
+LOCAL_SHARED_LIBRARIES := \
+	libbluetooth
+
+# to suppress the "pointer of type 'void *' used in arithmetic" warning
+LOCAL_CFLAGS := -Wno-pointer-arith
+
+# to suppress the "warning: missing initializer near initialization.." warning
+LOCAL_CFLAGS += -Wno-missing-field-initializers
+
+LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
+LOCAL_MODULE_TAGS := eng
+LOCAL_MODULE := hciconfig
+
+include $(BUILD_EXECUTABLE)
-- 
1.7.10.4


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

* [RFCv2 14/14] android: Add makefile for hcitool
  2013-10-01 15:03 [RFCv2 00/14] Basic code for Android BlueZ Andrei Emeltchenko
                   ` (12 preceding siblings ...)
  2013-10-01 15:03 ` [RFCv2 13/14] android: Add makefile for hciconfig Andrei Emeltchenko
@ 2013-10-01 15:03 ` Andrei Emeltchenko
  13 siblings, 0 replies; 20+ messages in thread
From: Andrei Emeltchenko @ 2013-10-01 15:03 UTC (permalink / raw)
  To: linux-bluetooth

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

---
 android/Android.mk |   38 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 38 insertions(+)

diff --git a/android/Android.mk b/android/Android.mk
index 9a38701..5fe9c58 100644
--- a/android/Android.mk
+++ b/android/Android.mk
@@ -150,3 +150,41 @@ LOCAL_MODULE_TAGS := eng
 LOCAL_MODULE := hciconfig
 
 include $(BUILD_EXECUTABLE)
+
+#
+# hcitool
+#
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := \
+	../tools/hcitool.c \
+	../src/oui.c \
+
+LOCAL_C_INCLUDES := \
+	$(LOCAL_PATH)/../lib \
+	$(LOCAL_PATH)/../src \
+
+LOCAL_C_INCLUDES += \
+	$(call include-path-for, glib) \
+	$(call include-path-for, glib)/glib \
+
+LOCAL_CFLAGS := \
+	-DSTORAGEDIR=\"/tmp\" \
+	-DVERSION=\"$(BLUEZ_VERSION)\"
+
+# to suppress the "pointer of type 'void *' used in arithmetic" warning
+LOCAL_CFLAGS += -Wno-pointer-arith
+
+# to suppress the "warning: missing initializer near initialization.." warning
+LOCAL_CFLAGS += -Wno-missing-field-initializers
+
+LOCAL_SHARED_LIBRARIES := \
+	libbluetooth \
+	libglib \
+
+LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
+LOCAL_MODULE_TAGS := eng
+LOCAL_MODULE := hcitool
+
+include $(BUILD_EXECUTABLE)
-- 
1.7.10.4


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

* Re: [RFCv2 09/14] android: sdp: Reuse BlueZ SDP server in Android
  2013-10-01 15:03 ` [RFCv2 09/14] android: sdp: Reuse BlueZ SDP server in Android Andrei Emeltchenko
@ 2013-10-03 11:23   ` Szymon Janc
  2013-10-03 11:35     ` Andrei Emeltchenko
  0 siblings, 1 reply; 20+ messages in thread
From: Szymon Janc @ 2013-10-03 11:23 UTC (permalink / raw)
  To: Andrei Emeltchenko; +Cc: linux-bluetooth

Hi Andrei,

> From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
> 
> Reuse existing SDP server code in Android GPL daemon.
> ---
>  Makefile.android     |    7 +++++--
>  android/Android.mk   |    7 +++++++
>  android/bt_adapter.c |    5 ++++-
>  android/main.c       |   29 +++++++++++++++++++++++++++++
>  android/main.h       |   25 +++++++++++++++++++++++++
>  5 files changed, 70 insertions(+), 3 deletions(-)
>  create mode 100644 android/main.h
> 
> diff --git a/Makefile.android b/Makefile.android
> index 3e6fec0..bf82928 100644
> --- a/Makefile.android
> +++ b/Makefile.android
> @@ -3,7 +3,10 @@ if ANDROID_DAEMON
>  noinst_PROGRAMS += android/bluezd
>  
>  android_bluezd_SOURCES = android/main.c src/log.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
> -android_bluezd_LDADD = @GLIB_LIBS@
> +				src/shared/mgmt.h src/shared/mgmt.c \
> +				android/bt_adapter.h android/bt_adapter.c
> +android_bluezd_LDADD = lib/libbluetooth-internal.la @GLIB_LIBS@
>  endif
> diff --git a/android/Android.mk b/android/Android.mk
> index 11ac204..b0a531f 100644
> --- a/android/Android.mk
> +++ b/android/Android.mk
> @@ -11,6 +11,11 @@ LOCAL_SRC_FILES := \
>  	main.c \
>  	../src/shared/mgmt.c \
>  	../src/shared/util.c \
> +	bt_adapter.c \
> +	../src/sdpd-database.c \
> +	../src/sdpd-service.c \
> +	../src/sdpd-request.c \
> +	../src/sdpd-server.c \
>  
>  LOCAL_C_INCLUDES := \
>  	$(call include-path-for, glib) \
> @@ -19,6 +24,7 @@ LOCAL_C_INCLUDES := \
>  LOCAL_C_INCLUDES += \
>  	$(LOCAL_PATH)/../ \
>  	$(LOCAL_PATH)/../src \
> +	$(LOCAL_PATH)/../lib \
>  
>  LOCAL_CFLAGS := -DVERSION=\"$(BLUEZ_VERSION)\"
>  
> @@ -30,6 +36,7 @@ LOCAL_CFLAGS += -DSOCK_CLOEXEC=02000000 -DSOCK_NONBLOCK=04000
>  
>  LOCAL_SHARED_LIBRARIES := \
>  	libglib \
> +	libbluetooth \
>  
>  LOCAL_MODULE := bluezd
>  
> diff --git a/android/bt_adapter.c b/android/bt_adapter.c
> index e21d50c..5016243 100644
> --- a/android/bt_adapter.c
> +++ b/android/bt_adapter.c
> @@ -23,6 +23,7 @@
>  
>  #include "bt_adapter.h"
>  #include "log.h"
> +#include "main.h"
>  #include "src/shared/mgmt.h"
>  
>  struct bt_adapter *bt_adapter_new(uint16_t index, struct mgmt *mgmt_if)
> @@ -45,7 +46,7 @@ void adapter_start(struct bt_adapter *adapter)
>  
>  	/* TODO: CB: report scan mode */
>  
> -	/* TODO: SDP start here */
> +	sdp_start();

Why not just start it when daemon starts? Just like in original daemon?

>  
>  	/* TODO: CB: report state on */
>  }
> @@ -53,4 +54,6 @@ void adapter_start(struct bt_adapter *adapter)
>  void adapter_stop(struct bt_adapter *adapter)
>  {
>  	DBG("disabled %u", adapter->dev_id);
> +
> +	sdp_stop();
>  }
> diff --git a/android/main.c b/android/main.c
> index 4792919..db435f9 100644
> --- a/android/main.c
> +++ b/android/main.c
> @@ -36,6 +36,8 @@
>  
>  #include "log.h"
>  #include "hcid.h"
> +#include "sdpd.h"
> +#include "main.h"
>  
>  #include "lib/bluetooth.h"
>  #include "lib/mgmt.h"
> @@ -43,12 +45,39 @@
>  
>  #define SHUTDOWN_GRACE_SECONDS 10
>  
> +struct main_opts main_opts;
> +
>  static GMainLoop *event_loop;
>  static struct mgmt *mgmt_if = NULL;
>  
>  static uint8_t mgmt_version = 0;
>  static uint8_t mgmt_revision = 0;
>  
> +GList *adapter_list = NULL;
> +struct bt_adapter *default_adapter = NULL;
> +
> +int sdp_start(void)
> +{
> +	DBG("");
> +
> +	/* TODO: add logic */
> +
> +	/* sdpd-server use these settings */
> +	memset(&main_opts, 0, sizeof(main_opts));
> +
> +	/* Use params: mtu = 0, flags = 0 */
> +	return start_sdp_server(0, 0);
> +}
> +
> +void sdp_stop(void)
> +{
> +	DBG("");
> +
> +	/* TODO: add logic */
> +
> +	stop_sdp_server();
> +}
> +
>  void btd_exit(void)
>  {
>  	g_main_loop_quit(event_loop);
> diff --git a/android/main.h b/android/main.h
> new file mode 100644
> index 0000000..6ecad14
> --- /dev/null
> +++ b/android/main.h
> @@ -0,0 +1,25 @@
> +/*
> + *
> + *  BlueZ - Bluetooth protocol stack for Linux
> + *
> + *  Copyright (C) 2013  Intel Corporation. All rights reserved.
> + *
> + *
> + *  This program is free software; you can redistribute it and/or modify
> + *  it under the terms of the GNU General Public License as published by
> + *  the Free Software Foundation; either version 2 of the License, or
> + *  (at your option) any later version.
> + *
> + *  This program is distributed in the hope that it will be useful,
> + *  but WITHOUT ANY WARRANTY; without even the implied warranty of
> + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + *  GNU General Public License for more details.
> + *
> + *  You should have received a copy of the GNU General Public License
> + *  along with this program; if not, write to the Free Software
> + *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
> + *
> + */
> +
> +int sdp_start(void);
> +void sdp_stop(void);
> 

-- 
BR
Szymon Janc



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

* Re: [RFCv2 09/14] android: sdp: Reuse BlueZ SDP server in Android
  2013-10-03 11:23   ` Szymon Janc
@ 2013-10-03 11:35     ` Andrei Emeltchenko
  2013-10-03 11:47       ` Szymon Janc
  0 siblings, 1 reply; 20+ messages in thread
From: Andrei Emeltchenko @ 2013-10-03 11:35 UTC (permalink / raw)
  To: Szymon Janc; +Cc: linux-bluetooth

Hi Szymon,

On Thu, Oct 03, 2013 at 04:23:02AM -0700, Szymon Janc wrote:
> Hi Andrei,
> 
> > From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
> > 
> > Reuse existing SDP server code in Android GPL daemon.
> > ---
> >  Makefile.android     |    7 +++++--
> >  android/Android.mk   |    7 +++++++
> >  android/bt_adapter.c |    5 ++++-
> >  android/main.c       |   29 +++++++++++++++++++++++++++++
> >  android/main.h       |   25 +++++++++++++++++++++++++
> >  5 files changed, 70 insertions(+), 3 deletions(-)
> >  create mode 100644 android/main.h
> > 
> > diff --git a/Makefile.android b/Makefile.android
> > index 3e6fec0..bf82928 100644
> > --- a/Makefile.android
> > +++ b/Makefile.android
> > @@ -3,7 +3,10 @@ if ANDROID_DAEMON
> >  noinst_PROGRAMS += android/bluezd
> >  
> >  android_bluezd_SOURCES = android/main.c src/log.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
> > -android_bluezd_LDADD = @GLIB_LIBS@
> > +				src/shared/mgmt.h src/shared/mgmt.c \
> > +				android/bt_adapter.h android/bt_adapter.c
> > +android_bluezd_LDADD = lib/libbluetooth-internal.la @GLIB_LIBS@
> >  endif
> > diff --git a/android/Android.mk b/android/Android.mk
> > index 11ac204..b0a531f 100644
> > --- a/android/Android.mk
> > +++ b/android/Android.mk
> > @@ -11,6 +11,11 @@ LOCAL_SRC_FILES := \
> >  	main.c \
> >  	../src/shared/mgmt.c \
> >  	../src/shared/util.c \
> > +	bt_adapter.c \
> > +	../src/sdpd-database.c \
> > +	../src/sdpd-service.c \
> > +	../src/sdpd-request.c \
> > +	../src/sdpd-server.c \
> >  
> >  LOCAL_C_INCLUDES := \
> >  	$(call include-path-for, glib) \
> > @@ -19,6 +24,7 @@ LOCAL_C_INCLUDES := \
> >  LOCAL_C_INCLUDES += \
> >  	$(LOCAL_PATH)/../ \
> >  	$(LOCAL_PATH)/../src \
> > +	$(LOCAL_PATH)/../lib \
> >  
> >  LOCAL_CFLAGS := -DVERSION=\"$(BLUEZ_VERSION)\"
> >  
> > @@ -30,6 +36,7 @@ LOCAL_CFLAGS += -DSOCK_CLOEXEC=02000000 -DSOCK_NONBLOCK=04000
> >  
> >  LOCAL_SHARED_LIBRARIES := \
> >  	libglib \
> > +	libbluetooth \
> >  
> >  LOCAL_MODULE := bluezd
> >  
> > diff --git a/android/bt_adapter.c b/android/bt_adapter.c
> > index e21d50c..5016243 100644
> > --- a/android/bt_adapter.c
> > +++ b/android/bt_adapter.c
> > @@ -23,6 +23,7 @@
> >  
> >  #include "bt_adapter.h"
> >  #include "log.h"
> > +#include "main.h"
> >  #include "src/shared/mgmt.h"
> >  
> >  struct bt_adapter *bt_adapter_new(uint16_t index, struct mgmt *mgmt_if)
> > @@ -45,7 +46,7 @@ void adapter_start(struct bt_adapter *adapter)
> >  
> >  	/* TODO: CB: report scan mode */
> >  
> > -	/* TODO: SDP start here */
> > +	sdp_start();
> 
> Why not just start it when daemon starts? Just like in original daemon?
>

Can it start without adapter initialized? How can I open L2CAP socket?

Best regards 
Andrei Emeltchenko 


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

* Re: [RFCv2 09/14] android: sdp: Reuse BlueZ SDP server in Android
  2013-10-03 11:35     ` Andrei Emeltchenko
@ 2013-10-03 11:47       ` Szymon Janc
  0 siblings, 0 replies; 20+ messages in thread
From: Szymon Janc @ 2013-10-03 11:47 UTC (permalink / raw)
  To: Andrei Emeltchenko; +Cc: linux-bluetooth

Hi Andrei,

> > > From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
> > > 
> > > Reuse existing SDP server code in Android GPL daemon.
> > > ---
> > >  Makefile.android     |    7 +++++--
> > >  android/Android.mk   |    7 +++++++
> > >  android/bt_adapter.c |    5 ++++-
> > >  android/main.c       |   29 +++++++++++++++++++++++++++++
> > >  android/main.h       |   25 +++++++++++++++++++++++++
> > >  5 files changed, 70 insertions(+), 3 deletions(-)
> > >  create mode 100644 android/main.h
> > > 
> > > diff --git a/Makefile.android b/Makefile.android
> > > index 3e6fec0..bf82928 100644
> > > --- a/Makefile.android
> > > +++ b/Makefile.android
> > > @@ -3,7 +3,10 @@ if ANDROID_DAEMON
> > >  noinst_PROGRAMS += android/bluezd
> > >  
> > >  android_bluezd_SOURCES = android/main.c src/log.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
> > > -android_bluezd_LDADD = @GLIB_LIBS@
> > > +				src/shared/mgmt.h src/shared/mgmt.c \
> > > +				android/bt_adapter.h android/bt_adapter.c
> > > +android_bluezd_LDADD = lib/libbluetooth-internal.la @GLIB_LIBS@
> > >  endif
> > > diff --git a/android/Android.mk b/android/Android.mk
> > > index 11ac204..b0a531f 100644
> > > --- a/android/Android.mk
> > > +++ b/android/Android.mk
> > > @@ -11,6 +11,11 @@ LOCAL_SRC_FILES := \
> > >  	main.c \
> > >  	../src/shared/mgmt.c \
> > >  	../src/shared/util.c \
> > > +	bt_adapter.c \
> > > +	../src/sdpd-database.c \
> > > +	../src/sdpd-service.c \
> > > +	../src/sdpd-request.c \
> > > +	../src/sdpd-server.c \
> > >  
> > >  LOCAL_C_INCLUDES := \
> > >  	$(call include-path-for, glib) \
> > > @@ -19,6 +24,7 @@ LOCAL_C_INCLUDES := \
> > >  LOCAL_C_INCLUDES += \
> > >  	$(LOCAL_PATH)/../ \
> > >  	$(LOCAL_PATH)/../src \
> > > +	$(LOCAL_PATH)/../lib \
> > >  
> > >  LOCAL_CFLAGS := -DVERSION=\"$(BLUEZ_VERSION)\"
> > >  
> > > @@ -30,6 +36,7 @@ LOCAL_CFLAGS += -DSOCK_CLOEXEC=02000000 -DSOCK_NONBLOCK=04000
> > >  
> > >  LOCAL_SHARED_LIBRARIES := \
> > >  	libglib \
> > > +	libbluetooth \
> > >  
> > >  LOCAL_MODULE := bluezd
> > >  
> > > diff --git a/android/bt_adapter.c b/android/bt_adapter.c
> > > index e21d50c..5016243 100644
> > > --- a/android/bt_adapter.c
> > > +++ b/android/bt_adapter.c
> > > @@ -23,6 +23,7 @@
> > >  
> > >  #include "bt_adapter.h"
> > >  #include "log.h"
> > > +#include "main.h"
> > >  #include "src/shared/mgmt.h"
> > >  
> > >  struct bt_adapter *bt_adapter_new(uint16_t index, struct mgmt *mgmt_if)
> > > @@ -45,7 +46,7 @@ void adapter_start(struct bt_adapter *adapter)
> > >  
> > >  	/* TODO: CB: report scan mode */
> > >  
> > > -	/* TODO: SDP start here */
> > > +	sdp_start();
> > 
> > Why not just start it when daemon starts? Just like in original daemon?
> >
> 
> Can it start without adapter initialized? How can I open L2CAP socket?

It binds to BDADDR_ANY address.

-- 
BR
Szymon Janc


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

* Re: [RFCv2 06/14] android: Create HAL API header skeleton
  2013-10-01 15:03 ` [RFCv2 06/14] android: Create HAL API header skeleton Andrei Emeltchenko
@ 2013-10-03 14:07   ` Szymon Janc
  2013-10-04  7:16     ` Andrei Emeltchenko
  0 siblings, 1 reply; 20+ messages in thread
From: Szymon Janc @ 2013-10-03 14:07 UTC (permalink / raw)
  To: Andrei Emeltchenko; +Cc: linux-bluetooth

Hi Andrei,

> From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
> 
> Header describes the protocol between Android HAL threads and BlueZ
> daemon.
> ---
>  android/hal_msg.h |  260 +++++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 260 insertions(+)
>  create mode 100644 android/hal_msg.h
> 
> diff --git a/android/hal_msg.h b/android/hal_msg.h
> new file mode 100644
> index 0000000..2d4436a
> --- /dev/null
> +++ b/android/hal_msg.h
> @@ -0,0 +1,260 @@
> +/*
> + *
> + *  BlueZ - Bluetooth protocol stack for Linux
> + *
> + *  Copyright (C) 2013  Intel Corporation. All rights reserved.
> + *
> + *
> + *  This library is free software; you can redistribute it and/or
> + *  modify it under the terms of the GNU Lesser General Public
> + *  License as published by the Free Software Foundation; either
> + *  version 2.1 of the License, or (at your option) any later version.
> + *
> + *  This library is distributed in the hope that it will be useful,
> + *  but WITHOUT ANY WARRANTY; without even the implied warranty of
> + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> + *  Lesser General Public License for more details.
> + *
> + *  You should have received a copy of the GNU Lesser General Public
> + *  License along with this library; if not, write to the Free Software
> + *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
> + *
> + */
> +
> +#ifndef __packed
> +#define __packed __attribute__((packed))
> +#endif
> +
> +typedef struct {
> +	uint8_t b[6];
> +} __packed __bdaddr_t;
> +
> +struct hal_msg_hdr {
> +	uint8_t service_id;
> +	uint8_t opcode;
> +	uint16_t len;
> +	uint8_t payload[0];
> +} __packed;
> +
> +#define HAL_SERVICE_ID_CORE		0
> +#define HAL_SERVICE_ID_BLUETOOTH	1

SOCK (id 2) is missing here

> +#define HAL_SERVICE_ID_HIDHOST		3
> +#define HAL_SERVICE_ID_PAN		4
> +#define HAL_SERVICE_ID_HANDSFREE	5
> +#define HAL_SERVICE_ID_AD2P		6
> +#define HAL_SERVICE_ID_HEALTH		7
> +#define HAL_SERVICE_ID_AVRCP		8
> +#define HAL_SERVICE_ID_GATT		9
> +
> +/* Core Service */
> +
> +struct hal_msg_rsp {
> +	struct hal_msg_hdr hdr;
> +	uint8_t status;
> +} __packed;

Non-error response to request has no status field, just header.

> +
> +#define HAL_MSG_OP_ERROR		0x00
> +struct hal_msg_rp_error {
> +	uint8_t status;
> +} __packed;
> +
> +#define HAL_MSG_OP_REGISTER_MODULE	0x02

Should be 0x01

> +struct hal_msg_cp_register_module {
> +	uint8_t service_id;
> +} __packed;
> +
> +struct hal_msg_rp_register_module {
> +	uint8_t service_id;
> +} __packed;
> +
> +#define HAL_MSG_OP_UNREGISTER_MODULE	0x03

Should be 0x02

> +struct hal_msg_cp_unregister_module {
> +	uint8_t service_id;
> +} __packed;
> +
> +/* Bluetooth Core HAL API */
> +
> +#define HAL_MSG_OP_BT_ENABLE		0x01
> +
> +#define HAL_MSG_OP_BT_DISABLE		0x02
> +
> +#define HAL_MSG_OP_BT_GET_ADAPTER_PROPS	0x03
> +
> +#define HAL_MSG_OP_BT_GET_ADAPTER_PROP	0x04
> +struct hal_msg_cp_bt_get_adapter_prop {
> +	uint8_t type;
> +} __packed;
> +
> +#define HAL_MSG_OP_BT_SET_ADAPTER_PROP	0x05
> +struct hal_msg_cp_bt_set_adapter_prop {
> +	uint8_t type;
> +	uint16_t len;
> +	uint8_t val[0];
> +} __packed;
> +
> +#define HAL_MSG_OP_BT_GET_REMOTE_DEVICE_PROPS	0x06
> +struct hal_msg_cp_bt_get_remote_device_props {
> +	__bdaddr_t bdaddr;
> +} __packed;
> +
> +#define HAL_MSG_OP_BT_GET_REMOTE_DEVICE_PROP	0x07
> +struct hal_msg_cp_bt_get_remote_device_prop {
> +	__bdaddr_t bdaddr;
> +	uint8_t type;
> +} __packed;
> +
> +#define HAL_MSG_OP_BT_SET_REMOTE_DEVICE_PROP	0x08
> +struct hal_msg_cp_bt_set_remote_device_prop {
> +	__bdaddr_t bdaddr;
> +	uint8_t type;
> +	uint16_t len;
> +	uint8_t val[0];
> +} __packed;
> +
> +#define HAL_MSG_OP_BT_GET_REMOTE_SERVICE_REC	0x09
> +struct hal_msg_cp_bt_get_remote_service_rec {
> +	__bdaddr_t bdaddr;
> +	uint8_t uuid[16];
> +} __packed;
> +
> +#define HAL_MSG_OP_BT_GET_REMOTE_SERVICE	0x0a
> +struct hal_msg_cp_bt_get_remote_service {
> +	__bdaddr_t bdaddr;
> +} __packed;
> +
> +#define HAL_MSG_OP_BT_START_DISCOVERY	0x0b
> +
> +#define HAL_MSG_OP_BT_CANCEL_DISCOVERY	0x0c
> +
> +#define HAL_MSG_OP_BT_CREATE_BOND	0x0d
> +struct hal_msg_cp_bt_create_bond {
> +	__bdaddr_t bdaddr;
> +} __packed;
> +
> +#define HAL_MSG_OP_BT_REMOVE_BOND	0x0d
> +struct hal_msg_cp_bt_remove_bond {
> +	__bdaddr_t bdaddr;
> +} __packed;
> +
> +#define HAL_MSG_OP_BT_CANCEL_BOND	0x0f
> +struct hal_msg_cp_bt_cancel_bond {
> +	__bdaddr_t bdaddr;
> +} __packed;
> +
> +#define HAL_MSG_OP_BT_PIN_REPLY		0x10
> +struct hal_msg_cp_bt_pin_reply {
> +	__bdaddr_t bdaddr;
> +	uint8_t accept;
> +	uint8_t pin_len;
> +	uint8_t pin_code[16];
> +} __packed;
> +
> +#define HAL_MSG_OP_BT_SSP_REPLY		0x11
> +struct hal_msg_cp_bt_ssp_reply {
> +	__bdaddr_t bdaddr;
> +	uint8_t ssp_variant;
> +	uint8_t accept;
> +	uint32_t passkey;
> +} __packed;
> +
> +#define HAL_MSG_OP_BT_DUT_MODE_CONF	0x12
> +struct hal_msg_cp_bt_dut_mode_conf {
> +	uint8_t enable;
> +} __packed;
> +
> +#define HAL_MSG_OP_BT_DUT_MODE_SEND	0x13
> +struct hal_msg_cp_bt_dut_mode_send {
> +	uint16_t opcode;
> +	uint8_t len;
> +	uint8_t data[0];
> +} __packed;
> +
> +#define HAL_MSG_OP_BT_LE_TEST_MODE	0x14
> +struct hal_msg_cp_bt_le_test_mode {
> +	uint16_t opcode;
> +	uint8_t len;
> +	uint8_t data[0];
> +} __packed;
> +
> +/* Notifications and confirmations */
> +
> +#define HAL_MSG_EV_BT_ERROR			0x80
> +
> +#define HAL_MSG_EV_BT_ADAPTER_STATE_CHANGED	0x81
> +struct hal_msg_ev_bt_adapter_state_changed {
> +	uint8_t state;
> +} __packed;
> +
> +#define HAL_MSG_EV_BT_ADAPTER_PROPS_CHANGED	0x82
> +struct hal_property {
> +	uint8_t type;
> +	uint16_t len;
> +	uint8_t val[0];
> +} __packed;
> +struct hal_msg_ev_bt_adapter_props_changed {
> +	uint8_t status;
> +	uint8_t num_props;
> +	struct hal_property props[0];
> +} __packed;
> +
> +#define HAL_MSG_EV_BT_REMOTE_DEVICE_PROPS	0x83
> +struct hal_msg_ev_bt_remote_device_props {
> +	uint8_t status;
> +	__bdaddr_t bdaddr;
> +	uint8_t num_props;
> +	struct hal_property props[0];
> +} __packed;
> +
> +#define HAL_MSG_EV_BT_DEVICE_FOUND		0x84
> +struct hal_msg_ev_bt_device_found {
> +	uint8_t num_props;
> +	struct hal_property props[0];
> +} __packed;
> +
> +#define HAL_MSG_EV_BT_DISCOVERY_STATE_CHANGED	0x85
> +struct hal_msg_ev_bt_discovery_state_changed {
> +	uint8_t state;
> +} __packed;
> +
> +#define HAL_MSG_EV_BT_PIN_REQUEST		0x86
> +struct hal_msg_ev_bt_pin_request {
> +	__bdaddr_t bdaddr;
> +	uint8_t name[249 - 1];
> +	uint8_t class_of_dev[3];
> +} __packed;
> +
> +#define HAL_MSG_EV_BT_SSP_REQUEST		0x87
> +struct hal_msg_ev_bt_ssp_request {
> +	__bdaddr_t bdaddr;
> +	uint8_t name[249 - 1];
> +	uint8_t class_of_dev[3];
> +	uint8_t pairing_variant;
> +	uint32_t passkey;
> +} __packed;
> +
> +#define HAL_MSG_EV_BT_BOND_STATE_CHANGED	0x88
> +struct hal_msg_ev_bt_bond_state_changed {
> +	uint8_t status;
> +	__bdaddr_t bdaddr;
> +	uint8_t state;
> +} __packed;
> +
> +#define HAL_MSG_EV_BT_ACL_STATE_CHANGED		0x89
> +struct hal_msg_ev_bt_acl_state_changed {
> +	uint8_t status;
> +	__bdaddr_t bdaddr;
> +	uint8_t state;
> +} __packed;
> +
> +#define HAL_MSG_EV_BT_DUT_MODE_RECEIVE		0x8a
> +struct hal_msg_ev_bt_dut_mode_receive {
> +	uint16_t opcode;
> +	uint8_t len;
> +	uint8_t data[0];
> +} __packed;
> +
> +#define HAL_MSG_EV_BT_LE_TEST_MODE		0x8b
> +struct hal_msg_ev_bt_le_test_mode {
> +	uint8_t status;
> +	uint16_t num_packets;
> +} __packed;
> 

-- 
BR
Szymon Janc


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

* Re: [RFCv2 06/14] android: Create HAL API header skeleton
  2013-10-03 14:07   ` Szymon Janc
@ 2013-10-04  7:16     ` Andrei Emeltchenko
  0 siblings, 0 replies; 20+ messages in thread
From: Andrei Emeltchenko @ 2013-10-04  7:16 UTC (permalink / raw)
  To: Szymon Janc; +Cc: linux-bluetooth

Hi All,

On Thu, Oct 03, 2013 at 04:07:08PM +0200, Szymon Janc wrote:
> > +
> > +/* Core Service */
> > +
> > +struct hal_msg_rsp {
> > +	struct hal_msg_hdr hdr;
> > +	uint8_t status;
> > +} __packed;
> 
> Non-error response to request has no status field, just header.

I have removed the structure in the following patches but I still have
doubts that this is a good approach.

So in a case of error we get:

struct error_rsp {
	struct hal_msg_hdr hdr;
	uint8_t status;
}

and in a case of success we get:

struct rsp {
        struct hal_msg_hdr hdr;
}

Does it make sense to omit status? We could read error_rsp and check
status for error while in the current design we have to check for size
received. Are we gonna save uint8_t?

Best regards 
Andrei Emeltchenko 


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

end of thread, other threads:[~2013-10-04  7:16 UTC | newest]

Thread overview: 20+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-10-01 15:03 [RFCv2 00/14] Basic code for Android BlueZ Andrei Emeltchenko
2013-10-01 15:03 ` [RFCv2 01/14] android: Add Adapter Bluetooth HAL template Andrei Emeltchenko
2013-10-01 15:03 ` [RFCv2 02/14] android: Add Socket " Andrei Emeltchenko
2013-10-01 15:03 ` [RFCv2 03/14] android: Enable Socket interface Andrei Emeltchenko
2013-10-01 15:03 ` [RFCv2 04/14] android: Start Android Bluetooth daemon Andrei Emeltchenko
2013-10-01 15:03 ` [RFCv2 05/14] android: Add basic mgmt initialization sequence Andrei Emeltchenko
2013-10-01 15:03 ` [RFCv2 06/14] android: Create HAL API header skeleton Andrei Emeltchenko
2013-10-03 14:07   ` Szymon Janc
2013-10-04  7:16     ` Andrei Emeltchenko
2013-10-01 15:03 ` [RFCv2 07/14] android: Add adapter and device struct for BlueZ daemon Andrei Emeltchenko
2013-10-01 15:03 ` [RFCv2 08/14] android: Add Android Makefile for libbluetooth Andrei Emeltchenko
2013-10-01 15:03 ` [RFCv2 09/14] android: sdp: Reuse BlueZ SDP server in Android Andrei Emeltchenko
2013-10-03 11:23   ` Szymon Janc
2013-10-03 11:35     ` Andrei Emeltchenko
2013-10-03 11:47       ` Szymon Janc
2013-10-01 15:03 ` [RFCv2 10/14] android: Add cap to bind to port < 1024 Andrei Emeltchenko
2013-10-01 15:03 ` [RFCv2 11/14] android: Implement read_info_complete callback Andrei Emeltchenko
2013-10-01 15:03 ` [RFCv2 12/14] android: Handle mgmt changed events Andrei Emeltchenko
2013-10-01 15:03 ` [RFCv2 13/14] android: Add makefile for hciconfig Andrei Emeltchenko
2013-10-01 15:03 ` [RFCv2 14/14] android: Add makefile for hcitool Andrei Emeltchenko

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox