* [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* 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
* [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* 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
* [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