* [RFCv2 10/14] android: Add cap to bind to port < 1024
From: Andrei Emeltchenko @ 2013-10-01 15:03 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1380639799-25790-1-git-send-email-Andrei.Emeltchenko.news@gmail.com>
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
* [RFCv2 09/14] android: sdp: Reuse BlueZ SDP server in Android
From: Andrei Emeltchenko @ 2013-10-01 15:03 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1380639799-25790-1-git-send-email-Andrei.Emeltchenko.news@gmail.com>
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
* [RFCv2 08/14] android: Add Android Makefile for libbluetooth
From: Andrei Emeltchenko @ 2013-10-01 15:03 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1380639799-25790-1-git-send-email-Andrei.Emeltchenko.news@gmail.com>
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
* [RFCv2 07/14] android: Add adapter and device struct for BlueZ daemon
From: Andrei Emeltchenko @ 2013-10-01 15:03 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1380639799-25790-1-git-send-email-Andrei.Emeltchenko.news@gmail.com>
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
* [RFCv2 06/14] android: Create HAL API header skeleton
From: Andrei Emeltchenko @ 2013-10-01 15:03 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1380639799-25790-1-git-send-email-Andrei.Emeltchenko.news@gmail.com>
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
* [RFCv2 05/14] android: Add basic mgmt initialization sequence
From: Andrei Emeltchenko @ 2013-10-01 15:03 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1380639799-25790-1-git-send-email-Andrei.Emeltchenko.news@gmail.com>
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
* [RFCv2 04/14] android: Start Android Bluetooth daemon
From: Andrei Emeltchenko @ 2013-10-01 15:03 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1380639799-25790-1-git-send-email-Andrei.Emeltchenko.news@gmail.com>
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
* [RFCv2 03/14] android: Enable Socket interface
From: Andrei Emeltchenko @ 2013-10-01 15:03 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1380639799-25790-1-git-send-email-Andrei.Emeltchenko.news@gmail.com>
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
* [RFCv2 02/14] android: Add Socket Bluetooth HAL template
From: Andrei Emeltchenko @ 2013-10-01 15:03 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1380639799-25790-1-git-send-email-Andrei.Emeltchenko.news@gmail.com>
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
* [RFCv2 01/14] android: Add Adapter Bluetooth HAL template
From: Andrei Emeltchenko @ 2013-10-01 15:03 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1380639799-25790-1-git-send-email-Andrei.Emeltchenko.news@gmail.com>
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
* [RFCv2 00/14] Basic code for Android BlueZ
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
* [PATCH] Bluetooth: Require CAP_NET_ADMIN for HCI User Channel operation
From: Marcel Holtmann @ 2013-10-01 14:40 UTC (permalink / raw)
To: linux-bluetooth
The HCI User Channel operation is an admin operation that puts the
device into promiscuous mode for single use. It is more suitable
to require CAP_NET_ADMIN than CAP_NET_RAW.
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
---
net/bluetooth/hci_sock.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/net/bluetooth/hci_sock.c b/net/bluetooth/hci_sock.c
index c09e976..5798861 100644
--- a/net/bluetooth/hci_sock.c
+++ b/net/bluetooth/hci_sock.c
@@ -687,7 +687,7 @@ static int hci_sock_bind(struct socket *sock, struct sockaddr *addr,
goto done;
}
- if (!capable(CAP_NET_RAW)) {
+ if (!capable(CAP_NET_ADMIN)) {
err = -EPERM;
goto done;
}
--
1.8.3.1
^ permalink raw reply related
* [PATCH BlueZ] lib: Fix invalid "whitespace" on company identifier string
From: Anderson Lizardo @ 2013-10-01 14:11 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Anderson Lizardo
Somehow, the invalid multibyte sequence "\xC2\xA0" (which is displayed
as a whitespace) was inserted on a company identifier string. Fix this
to avoid a bogus diff when running tools/update_compids.sh.
---
lib/bluetooth.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/bluetooth.c b/lib/bluetooth.c
index bdc611a..62c5c00 100644
--- a/lib/bluetooth.c
+++ b/lib/bluetooth.c
@@ -682,7 +682,7 @@ const char *bt_compidtostr(int compid)
case 210:
return "Dialog Semiconductor B.V.";
case 211:
- return "Taixingbang Technology (HK) Co,. LTD.";
+ return "Taixingbang Technology (HK) Co,. LTD.";
case 212:
return "Kawantech";
case 213:
--
1.7.9.5
^ permalink raw reply related
* [PATCH v4 7/7] build: Add logging system
From: Frederic Danis @ 2013-10-01 12:58 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1380632319-7701-1-git-send-email-frederic.danis@linux.intel.com>
---
Makefile.android | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Makefile.android b/Makefile.android
index e792c10..e161e6d 100644
--- a/Makefile.android
+++ b/Makefile.android
@@ -1,8 +1,8 @@
if ANDROID
noinst_PROGRAMS += android/bluetoothd
-android_bluetoothd_SOURCES = android/main.c
+android_bluetoothd_SOURCES = android/main.c src/log.c
android_bluetoothd_LDADD = @GLIB_LIBS@
endif
-EXTRA_DIST += android/Android.mk
+EXTRA_DIST += android/Android.mk android/log.c
--
1.7.9.5
^ permalink raw reply related
* [PATCH v4 6/7] android-build: Add logging system
From: Frederic Danis @ 2013-10-01 12:58 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1380632319-7701-1-git-send-email-frederic.danis@linux.intel.com>
---
android/Android.mk | 2 ++
1 file changed, 2 insertions(+)
diff --git a/android/Android.mk b/android/Android.mk
index fc3d6c2..ec820ac 100644
--- a/android/Android.mk
+++ b/android/Android.mk
@@ -14,10 +14,12 @@ include $(CLEAR_VARS)
LOCAL_SRC_FILES := \
main.c \
+ log.c \
LOCAL_C_INCLUDES := \
$(call include-path-for, glib) \
$(call include-path-for, glib)/glib \
+ $(LOCAL_PATH)/../src \
LOCAL_CFLAGS := -DVERSION=\"$(BLUEZ_VERSION)\"
--
1.7.9.5
^ permalink raw reply related
* [PATCH v4 5/7] android: Android version of log.c
From: Frederic Danis @ 2013-10-01 12:58 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1380632319-7701-1-git-send-email-frederic.danis@linux.intel.com>
---
android/log.c | 172 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
android/main.c | 34 +++++++++++
2 files changed, 206 insertions(+)
create mode 100644 android/log.c
diff --git a/android/log.c b/android/log.c
new file mode 100644
index 0000000..908f883
--- /dev/null
+++ b/android/log.c
@@ -0,0 +1,172 @@
+/*
+ *
+ * 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
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <unistd.h>
+#include <sys/uio.h>
+
+#include <glib.h>
+
+#include "log.h"
+
+#define LOG_DEBUG 3
+#define LOG_INFO 4
+#define LOG_WARN 5
+#define LOG_ERR 6
+
+static const char tag[] = "BlueZ";
+static int system_fd;
+
+static void android_log(int pri, const char *fmt, va_list ap)
+{
+ char *msg;
+ struct iovec vec[3];
+
+ if (system_fd == -1)
+ return;
+
+ msg = g_strdup_vprintf(fmt, ap);
+
+ vec[0].iov_base = (unsigned char *) &pri;
+ vec[0].iov_len = 1;
+ vec[1].iov_base = (void *) tag;
+ vec[1].iov_len = strlen(tag) + 1;
+ vec[2].iov_base = (void *) msg;
+ vec[2].iov_len = strlen(msg) + 1;
+
+ writev(system_fd, vec, 3);
+
+ g_free(msg);
+}
+
+void info(const char *format, ...)
+{
+ va_list ap;
+
+ va_start(ap, format);
+
+ android_log(LOG_INFO, format, ap);
+
+ va_end(ap);
+}
+
+void warn(const char *format, ...)
+{
+ va_list ap;
+
+ va_start(ap, format);
+
+ android_log(LOG_WARN, format, ap);
+
+ va_end(ap);
+}
+
+void error(const char *format, ...)
+{
+ va_list ap;
+
+ va_start(ap, format);
+
+ android_log(LOG_ERR, format, ap);
+
+ va_end(ap);
+}
+
+void btd_debug(const char *format, ...)
+{
+ va_list ap;
+
+ va_start(ap, format);
+
+ android_log(LOG_DEBUG, format, ap);
+
+ va_end(ap);
+}
+
+extern struct btd_debug_desc __start___debug[];
+extern struct btd_debug_desc __stop___debug[];
+
+static char **enabled = NULL;
+
+static gboolean is_enabled(struct btd_debug_desc *desc)
+{
+ int i;
+
+ if (enabled == NULL)
+ return 0;
+
+ for (i = 0; enabled[i] != NULL; i++)
+ if (desc->file != NULL && g_pattern_match_simple(enabled[i],
+ desc->file) == TRUE)
+ return 1;
+
+ return 0;
+}
+
+void __btd_enable_debug(struct btd_debug_desc *start,
+ struct btd_debug_desc *stop)
+{
+ struct btd_debug_desc *desc;
+
+ if (start == NULL || stop == NULL)
+ return;
+
+ for (desc = start; desc < stop; desc++) {
+ if (is_enabled(desc))
+ desc->flags |= BTD_DEBUG_FLAG_PRINT;
+ }
+}
+
+void __btd_toggle_debug(void)
+{
+ struct btd_debug_desc *desc;
+
+ for (desc = __start___debug; desc < __stop___debug; desc++)
+ desc->flags |= BTD_DEBUG_FLAG_PRINT;
+}
+
+void __btd_log_init(const char *debug, int detach)
+{
+ if (debug != NULL)
+ enabled = g_strsplit_set(debug, ":, ", 0);
+
+ __btd_enable_debug(__start___debug, __stop___debug);
+
+ system_fd = open("/dev/log/system", O_WRONLY);
+
+ info("Bluetooth daemon %s", VERSION);
+}
+
+void __btd_log_cleanup(void)
+{
+ close(system_fd);
+ system_fd = -1;
+
+ g_strfreev(enabled);
+}
diff --git a/android/main.c b/android/main.c
index 1dba2d4..c0a56b1 100644
--- a/android/main.c
+++ b/android/main.c
@@ -34,6 +34,8 @@
#include <glib.h>
+#include "log.h"
+
#define SHUTDOWN_GRACE_SECONDS 10
static GMainLoop *event_loop;
@@ -57,10 +59,31 @@ static void sig_term(int sig)
__terminated = true;
}
+static char *option_debug = NULL;
static gboolean option_detach = TRUE;
static gboolean option_version = FALSE;
+static void free_options(void)
+{
+ g_free(option_debug);
+ option_debug = NULL;
+}
+
+static gboolean parse_debug(const char *key, const char *value,
+ gpointer user_data, GError **error)
+{
+ if (value)
+ option_debug = g_strdup(value);
+ else
+ option_debug = g_strdup("*");
+
+ return TRUE;
+}
+
static GOptionEntry options[] = {
+ { "debug", 'd', G_OPTION_FLAG_OPTIONAL_ARG,
+ G_OPTION_ARG_CALLBACK, parse_debug,
+ "Specify debug options to enable", "DEBUG" },
{ "nodetach", 'n', G_OPTION_FLAG_REVERSE,
G_OPTION_ARG_NONE, &option_detach,
"Run with logging in foreground", NULL },
@@ -102,9 +125,20 @@ int main(int argc, char *argv[])
sigaction(SIGINT, &sa, NULL);
sigaction(SIGTERM, &sa, NULL);
+ __btd_log_init(option_debug, option_detach);
+
+ /* no need to keep parsed option in memory */
+ free_options();
+
+ DBG("Entering main loop");
+
g_main_loop_run(event_loop);
g_main_loop_unref(event_loop);
+ info("Exit");
+
+ __btd_log_cleanup();
+
return EXIT_SUCCESS;
}
--
1.7.9.5
^ permalink raw reply related
* [PATCH v4 4/7] build: Add BlueZ Android daemon
From: Frederic Danis @ 2013-10-01 12:58 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1380632319-7701-1-git-send-email-frederic.danis@linux.intel.com>
---
.gitignore | 2 ++
Makefile.android | 7 +++++++
2 files changed, 9 insertions(+)
diff --git a/.gitignore b/.gitignore
index 8a25a3e..3707209 100644
--- a/.gitignore
+++ b/.gitignore
@@ -98,3 +98,5 @@ unit/test-gobex-packet
unit/test-gobex-transfer
unit/test-*.log
unit/test-*.trs
+
+android/bluetoothd
diff --git a/Makefile.android b/Makefile.android
index 56fa9a7..e792c10 100644
--- a/Makefile.android
+++ b/Makefile.android
@@ -1 +1,8 @@
+if ANDROID
+noinst_PROGRAMS += android/bluetoothd
+
+android_bluetoothd_SOURCES = android/main.c
+android_bluetoothd_LDADD = @GLIB_LIBS@
+endif
+
EXTRA_DIST += android/Android.mk
--
1.7.9.5
^ permalink raw reply related
* [PATCH v4 3/7] android-build: Add BlueZ Android daemon
From: Frederic Danis @ 2013-10-01 12:58 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1380632319-7701-1-git-send-email-frederic.danis@linux.intel.com>
Define local mapping to glib path, otherwise this has to be inside central
place in the build repository.
---
android/Android.mk | 25 +++++++++++++++++++++++++
1 file changed, 25 insertions(+)
diff --git a/android/Android.mk b/android/Android.mk
index 183f7e2..fc3d6c2 100644
--- a/android/Android.mk
+++ b/android/Android.mk
@@ -2,3 +2,28 @@ LOCAL_PATH := $(call my-dir)
# Retrieve BlueZ version from configure.ac file
BLUEZ_VERSION := $(shell grep ^AC_INIT $(LOCAL_PATH)/../configure.ac | cpp -P -D'AC_INIT(_,v)=v')
+
+# Specify pathmap for glib
+pathmap_INCL += glib:external/bluetooth/glib
+
+#
+# Android BlueZ daemon (bluetoothd)
+#
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := \
+ main.c \
+
+LOCAL_C_INCLUDES := \
+ $(call include-path-for, glib) \
+ $(call include-path-for, glib)/glib \
+
+LOCAL_CFLAGS := -DVERSION=\"$(BLUEZ_VERSION)\"
+
+LOCAL_SHARED_LIBRARIES := \
+ libglib \
+
+LOCAL_MODULE := bluetoothd
+
+include $(BUILD_EXECUTABLE)
--
1.7.9.5
^ permalink raw reply related
* [PATCH v4 2/7] android: Add skeleton of BlueZ Android daemon
From: Frederic Danis @ 2013-10-01 12:58 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1380632319-7701-1-git-send-email-frederic.danis@linux.intel.com>
---
android/main.c | 110 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 110 insertions(+)
create mode 100644 android/main.c
diff --git a/android/main.c b/android/main.c
new file mode 100644
index 0000000..1dba2d4
--- /dev/null
+++ b/android/main.c
@@ -0,0 +1,110 @@
+/*
+ *
+ * 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
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <signal.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <string.h>
+
+#include <glib.h>
+
+#define SHUTDOWN_GRACE_SECONDS 10
+
+static GMainLoop *event_loop;
+
+static gboolean quit_eventloop(gpointer user_data)
+{
+ g_main_loop_quit(event_loop);
+
+ return FALSE;
+}
+
+static void sig_term(int sig)
+{
+ static bool __terminated = false;
+
+ if (!__terminated) {
+ g_timeout_add_seconds(SHUTDOWN_GRACE_SECONDS,
+ quit_eventloop, NULL);
+ }
+
+ __terminated = true;
+}
+
+static gboolean option_detach = TRUE;
+static gboolean option_version = FALSE;
+
+static GOptionEntry options[] = {
+ { "nodetach", 'n', G_OPTION_FLAG_REVERSE,
+ G_OPTION_ARG_NONE, &option_detach,
+ "Run with logging in foreground", NULL },
+ { "version", 'v', 0, G_OPTION_ARG_NONE, &option_version,
+ "Show version information and exit", NULL },
+ { NULL }
+};
+
+int main(int argc, char *argv[])
+{
+ GOptionContext *context;
+ GError *err = NULL;
+ struct sigaction sa;
+
+ context = g_option_context_new(NULL);
+ g_option_context_add_main_entries(context, options, NULL);
+
+ if (g_option_context_parse(context, &argc, &argv, &err) == FALSE) {
+ if (err != NULL) {
+ g_printerr("%s\n", err->message);
+ g_error_free(err);
+ } else
+ g_printerr("An unknown error occurred\n");
+
+ exit(EXIT_FAILURE);
+ }
+
+ g_option_context_free(context);
+
+ if (option_version == TRUE) {
+ printf("%s\n", VERSION);
+ exit(EXIT_SUCCESS);
+ }
+
+ event_loop = g_main_loop_new(NULL, FALSE);
+
+ memset(&sa, 0, sizeof(sa));
+ sa.sa_handler = sig_term;
+ sigaction(SIGINT, &sa, NULL);
+ sigaction(SIGTERM, &sa, NULL);
+
+ g_main_loop_run(event_loop);
+
+ g_main_loop_unref(event_loop);
+
+ return EXIT_SUCCESS;
+}
--
1.7.9.5
^ permalink raw reply related
* [PATCH v4 1/7] build: Add skeleton for BlueZ Android
From: Frederic Danis @ 2013-10-01 12:58 UTC (permalink / raw)
To: linux-bluetooth
Retrieve Bluetooth version from configure.ac.
---
Makefile.am | 4 +++-
Makefile.android | 1 +
android/Android.mk | 4 ++++
bootstrap-configure | 1 +
configure.ac | 5 +++++
5 files changed, 14 insertions(+), 1 deletion(-)
create mode 100644 Makefile.android
create mode 100644 android/Android.mk
diff --git a/Makefile.am b/Makefile.am
index 4e4b1c5..51204f4 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -179,6 +179,7 @@ test_scripts =
include Makefile.tools
include Makefile.obexd
+include Makefile.android
if HID2HCI
rulesdir = @UDEV_DIR@/rules.d
@@ -293,7 +294,8 @@ pkgconfig_DATA = lib/bluez.pc
endif
DISTCHECK_CONFIGURE_FLAGS = --disable-datafiles --enable-library \
- --disable-systemd --disable-udev
+ --disable-systemd --disable-udev \
+ --enable-android
DISTCLEANFILES = $(pkgconfig_DATA)
diff --git a/Makefile.android b/Makefile.android
new file mode 100644
index 0000000..56fa9a7
--- /dev/null
+++ b/Makefile.android
@@ -0,0 +1 @@
+EXTRA_DIST += android/Android.mk
diff --git a/android/Android.mk b/android/Android.mk
new file mode 100644
index 0000000..183f7e2
--- /dev/null
+++ b/android/Android.mk
@@ -0,0 +1,4 @@
+LOCAL_PATH := $(call my-dir)
+
+# Retrieve BlueZ version from configure.ac file
+BLUEZ_VERSION := $(shell grep ^AC_INIT $(LOCAL_PATH)/../configure.ac | cpp -P -D'AC_INIT(_,v)=v')
diff --git a/bootstrap-configure b/bootstrap-configure
index 7a6e7d1..dc36311 100755
--- a/bootstrap-configure
+++ b/bootstrap-configure
@@ -12,4 +12,5 @@ fi
--sysconfdir=/etc \
--localstatedir=/var \
--enable-experimental \
+ --enable-android \
--disable-datafiles $*
diff --git a/configure.ac b/configure.ac
index 41c2935..7b1f64a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -242,4 +242,9 @@ AC_DEFINE_UNQUOTED(CONFIGDIR, "${configdir}",
[Directory for the configuration files])
AC_SUBST(CONFIGDIR, "${configdir}")
+AC_ARG_ENABLE(android, AC_HELP_STRING([--enable-android],
+ [enable BlueZ for Android]),
+ [enable_android=${enableval}])
+AM_CONDITIONAL(ANDROID, test "${enable_android}" = "yes")
+
AC_OUTPUT(Makefile src/bluetoothd.8 lib/bluez.pc)
--
1.7.9.5
^ permalink raw reply related
* Re: [PATCH 2/2] Bluetooth: Fix workqueue synchronization in hci_dev_open
From: Marcel Holtmann @ 2013-10-01 12:57 UTC (permalink / raw)
To: johan.hedberg; +Cc: linux-bluetooth
In-Reply-To: <1380625828-19538-3-git-send-email-johan.hedberg@gmail.com>
Hi Johan,
> When hci_sock.c calls hci_dev_open it needs to ensure that there isn't
> pending work in progress, such as that which is scheduled for the
> initial setup procedure or the one for automatically powering off after
> the setup procedure. This adds the necessary calls to ensure that any
> previously scheduled work is completed before attempting to call
> hci_dev_do_open.
>
> This patch fixes a race with old user space versions where we might
> receive a HCIDEVUP ioctl before the setup procedure has been completed.
> When that happens the setup procedures callback may fail early and leave
> the device in an inconsistent state, causing e.g. the setup callback to
> be (incorrectly) called more than once.
> ---
> net/bluetooth/hci_core.c | 5 +++++
> 1 file changed, 5 insertions(+)
you might want to sign off your patch ;)
>
> diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
> index fc63e78..a216dcf 100644
> --- a/net/bluetooth/hci_core.c
> +++ b/net/bluetooth/hci_core.c
> @@ -1227,6 +1227,11 @@ int hci_dev_open(__u16 dev)
> if (!hdev)
> return -ENODEV;
>
> + if (test_and_clear_bit(HCI_AUTO_OFF, &hdev->dev_flags))
> + cancel_delayed_work(&hdev->power_off);
> +
> + flush_workqueue(hdev->req_workqueue);
> +
> err = hci_dev_do_open(hdev);
And I think we should have a comment here on why we are doing this. Just to remind ourselves.
Regards
Marcel
^ permalink raw reply
* Re: [PATCH 1/2] Bluetooth: Refactor hci_dev_open to a separate hci_dev_do_open function
From: Marcel Holtmann @ 2013-10-01 12:56 UTC (permalink / raw)
To: johan.hedberg; +Cc: linux-bluetooth
In-Reply-To: <1380625828-19538-2-git-send-email-johan.hedberg@gmail.com>
Hi Johan,
> The requirements of an external call to hci_dev_open from hci_sock.c are
> different to that from within hci_core.c. In the former case we want to
> flush any pending work in hdev->req_workqueue whereas in the latter we
> don't (since there we are already calling from within the workqueue
> itself). This patch does the necessary refactoring to a separate
> hci_dev_do_open function (analogous to hci_dev_do_close) but does not
> yet introduce the synchronizations relating to the workqueue usage.
>
> Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
> ---
> net/bluetooth/hci_core.c | 30 ++++++++++++++++++++----------
> 1 file changed, 20 insertions(+), 10 deletions(-)
Acked-by: Marcel Holtmann <marcel@holtmann.org>
Regards
Marcel
^ permalink raw reply
* [RFC] android: Add initial Android Bluetooth HAL protocol API doc
From: Szymon Janc @ 2013-10-01 12:07 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Szymon Janc
This IPC is used to communicate Android BlueZ daemon and HAL.
Currently specified are BT HAL "bluetooth" (BT_HARDWARE_MODULE_ID)
and following profile HALs:
"socket" (BT_PROFILE_SOCKETS_ID)
"hidhost" (BT_PROFILE_HIDHOST_ID)
"pan" (BT_PROFILE_PAN_ID)
"handsfree" (BT_PROFILE_HANDSFREE_ID)
"ad2p" (BT_PROFILE_ADVANCED_AUDIO_ID)
"health" (BT_PROFILE_HEALTH_ID)
---
android/hal-ipc-api.txt | 1247 +++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 1247 insertions(+)
create mode 100644 android/hal-ipc-api.txt
diff --git a/android/hal-ipc-api.txt b/android/hal-ipc-api.txt
new file mode 100644
index 0000000..9a8b770
--- /dev/null
+++ b/android/hal-ipc-api.txt
@@ -0,0 +1,1247 @@
+Android HAL protocol for Bluetooth
+==================================
+
+The Android HAL daemon for Bluetooth functionality implements the Unix socket
+server protocol around /run/bluetooth/daemon (tentative location) or Linux
+abstract sockets (tentative name).
+
+The daemon is single threaded and uses a mainloop for scheduling and general
+operation.
+
+The protocol is SOCK_SEQPACKET based and follows a strict PDU specification
+with a generic header and initial registration exchange. The communication
+is driven from the HAL with command/response exchanges. The daemon will use
+notification to signal events. The protocol is single PDU exchanged based,
+meaning every command requires a response. Notification does not require
+any confirmation. Not handling this PDU exchange leads to a disconnection of
+the socket.
+
+Command/response and notification use separate sockets. First connected socket
+is used for command/response, second for notification. All services are
+multi-plexed over same pair of sockets. Separation is done to ease
+implementation of simple HAL library with dedicated thread for handling
+notification.
+
+This strict protocol requirement is done to match C based callbacks and
+callout functions that are running in a thread inside the HAL and might
+block.
+
+ .--Android--. .--Android--.
+ | daemon | | HAL |
+ | | Command | |
+ | | <-------------------------- | |
+ | | | |
+ | | --------------------------> | |
+ | | Response | |
+ | | | |
+ | | | |
+ | | Notification | |
+ | | --------------------------> | |
+ | | | |
+ '-----------' '-----------'
+
+Every packet will follow the basic header to support simple multi-plexing
+over the same socket. It will also support a basic control channel with service
+id 0.
+
+ 0 8 16 24 31
+ +--------------+--------------+--------------+--------------+
+ | Service ID | Opcode | Data Length |
+ +--------------+--------------+-----------------------------+
+ | |
+
+The unique service ID is assigned by this specification for each HAL.
+
+As general rule of thumb, the opcode for command matches the opcode for a
+response. Or the opcode 0x00 for an error is returned.
+
+Notification opcodes start from 0x80.
+
+All command/response opcodes have the least significant bit not set. And all
+notifications have the least significant bit set.
+
+The HAL modules only have the job to map the callback and event functions
+to the protocol. They do not need to do anything else. Below is an example
+of a sample transaction for the Bluetooth Core HAL and enabling of an
+adapter.
+
+ HAL Daemon
+ ----------------------------------------------------
+
+ call enable() --> command 0x01
+ return enable() <-- response 0x01
+
+ call adapter_state_changed() <-- notification 0x81
+ return adapter_state_changed()
+
+When the Android hardware framework calls into the Bluetooth Core HAL
+and executes the enable() callback, the HAL module sends the enable
+command with opcode 0x01 to the daemon. As soon as the daemon responds,
+the callback will return with the appropriate result.
+
+After the daemon switched on the adapter, it will send a notification
+with opcode 0x81 to the HAL module.
+
+The Bluetooth Core HAL and Bluetooth Socket HAL are guaranteed to be
+available from the daemon. All other HAL modules are optional.
+
+When the Bluetooth Core HAL init() function is called, it should open
+the socket and register both "bluetooth" and "socket" service modules. It is
+required to register "socket" service at the same time since the HAL module
+does not have its own init() function.
+
+When new profiles are initiated, the get_profile_interface() callback
+will load the profile and during init() of the profile, it should register the
+specific service.
+
+ Bluetooth main thread Daemon
+ -------------------------------------------------------
+
+ init() --> open command socket
+ --> open notification socket
+ --> register module "bluetooth"
+ --> register module "socket"
+
+ get_profile_interface() --> return profile struct
+ --> continue on Handsfree thread
+
+
+ Handsfree thread Daemon
+ --------------------------------------------------------
+
+ init() --> register module handsfree
+
+
+Core Service (ID 0)
+===================
+
+ Opcode 0x00 - Error response
+
+ Response parameters: Error (1 octet)
+
+ Opcode 0x01 - Register module command/response
+
+ Command parameters: Service id (1 octet)
+ Response parameters: <none>
+
+ In case a command is sent for an undeclared service ID, it will
+ be rejected. Also there will be no notifications for undeclared
+ service ID.
+
+ In case of an error, the error response will be returned.
+
+ Opcode 0x02 - Unregister module command/response
+
+ Command parameters: Service id (1 octet)
+ Response parameters: <none>
+
+ In case of an error, the error response will be returned.
+
+
+Bluetooth Core HAL (ID 1)
+=========================
+
+Android HAL name: "bluetooth" (BT_HARDWARE_MODULE_ID)
+
+Commands and responses:
+
+ Opcode 0x00 - Error response
+
+ Response parameters: Status (1 octet)
+
+ Opcode 0x01 - Enable command/response
+
+ Command parameters: <none>
+ Response parameters: <none>
+
+ In case of an error, the error response will be returned.
+
+ Opcode 0x02 - Disable command/response
+
+ Command parameters: <none>
+ Response parameters: <none>
+
+ In case of an error, the error response will be returned.
+
+ Opcode 0x03 - Get Adapter Properties command/response
+
+ Command parameters: <none>
+ Response parameters: <none>
+
+ In case of an error, the error response will be returned.
+
+ Opcode 0x04 - Get Adapter Property command/response
+
+ Command parameters: Property type (1 octet)
+ Response parameters: <none>
+
+ In case of an error, the error response will be returned.
+
+ Opcode 0x05 - Set Adapter Property command/response
+
+ Command parameters: Property type (1 octet)
+ Property length (2 octets)
+ Property value (variable)
+ Response parameters: <none>
+
+ In case of an error, the error response will be returned.
+
+ Opcode 0x06 - Get Remote Device Properties command/response
+
+ Command parameters: Remote address (6 octets)
+ Response parameters: <none>
+
+ In case of an error, the error response will be returned.
+
+ Opcode 0x07 - Get Remote Device Property command/response
+
+ Command parameters: Remote address (6 octets)
+ Property type (1 octet)
+ Response parameters: <none>
+
+ In case of an error, the error response will be returned.
+
+ Opcode 0x08 - Set Remote Device Property command/response
+
+ Command parameters: Remote address (6 octets)
+ Property type (1 octet)
+ Property length (2 octets)
+ Property value (variable)
+ Response parameters: <none>
+
+ In case of an error, the error response will be returned.
+
+ Opcode 0x09 - Get Remote Service Record command/response
+
+ Command parameters: Remote address (6 octets)
+ UUID (16 octets)
+ Response parameters: <none>
+
+ In case of an error, the error response will be returned.
+
+ Opcode 0x0a - Get Remote Services command/response
+
+ Command parameters: Remote address (6 octets)
+ Response parameters: <none>
+
+ In case of an error, the error response will be returned.
+
+ Opcode 0x0b - Start Discovery command/response
+
+ Command parameters: <none>
+ Response parameters: <none>
+
+ In case of an error, the error response will be returned.
+
+ Opcode 0x0c - Cancel Discovery command/response
+
+ Command parameters: <none>
+ Response parameters: <none>
+
+ In case of an error, the error response will be returned.
+
+ Opcode 0x0d - Create Bond command/response
+
+ Command parameters: Remote address (6 octets)
+ Response parameters: <none>
+
+ In case of an error, the error response will be returned.
+
+ Opcode 0x0e - Remove Bond command/response
+
+ Command parameters: Remote address (6 octets)
+ Response parameters: <none>
+
+ In case of an error, the error response will be returned.
+
+ Opcode 0x0f - Cancel Bond command/response
+
+ Command parameters: Remote address (6 octets)
+ Response parameters: <none>
+
+ In case of an error, the error response will be returned.
+
+ Opcode 0x10 - PIN Reply command/response
+
+ Command parameters: Remote address (6 octets)
+ Accept (1 octet)
+ PIN length (1 octet)
+ PIN code (16 octets)
+ Response parameters: <none>
+
+ In case of an error, the error response will be returned.
+
+ Opcode 0x11 - SSP Reply command/response
+
+ Command parameters: Remote address (6 octets)
+ SSP variant (1 octet)
+ Accept (1 octet)
+ Passkey (4 octets)
+ Response parameters: <none>
+
+ In case of an error, the error response will be returned.
+
+ Opcode 0x12 - DUT Mode Configure command/response
+
+ Command parameters: Enable (1 octet)
+ Response parameters: <none>
+
+ In case of an error, the error response will be returned.
+
+ Opcode 0x13 - DUT Mode Send command/response
+
+ Command parameters: Opcode (2 octets)
+ Length (1 octet)
+ Data (variable)
+ Response parameters: <none>
+
+ In case of an error, the error response will be returned.
+
+ Opcode 0x14 - LE Test Mode command/response
+
+ Command parameters: Opcode (2 octets)
+ Length (1 octet)
+ Data (variable)
+ Response parameters: <none>
+
+ In case of an error, the error response will be returned.
+
+Notifications:
+
+ Opcode 0x81 - Adapter State Changed notification
+
+ Notifications parameters: State (1 octect)
+
+ Opcode 0x82 - Adapter Properties Changed notification
+
+ Notification parameters: Status (1 octect)
+ Num properties (1 octet)
+ Type[i] (1 octect)
+ Length[i] (2 octets)
+ Value[i] (variable)
+
+ Opcode 0x83 - Remote Device Properties notification
+
+ Notification parameters: Status (1 octect)
+ Remote address (6 octets)
+ Num properties (1 octet)
+ Type[i] (1 octect)
+ Length[i] (2 octets)
+ Value[i] (variable)
+
+ Opcode 0x84 - Device Found notification
+
+ Notification parameters: Num properties (1 octet)
+ Type[i] (1 octect)
+ Length[i] (2 octets)
+ Value[i] (variable)
+
+ Opcode 0x85 - Discovery State Changed notification
+
+ Notifications parameters: State (1 octect)
+
+ Opcode 0x86 - PIN Request notification
+
+ Notification parameters: Remote address (6 octets)
+ Remote name (249 octets)
+ Class of device (3 octets)
+
+ Opcode 0x87 - SSP Request notification
+
+ Notification parameters: Remote address (6 octets)
+ Remote name (249 octets)
+ Class of device (3 octets)
+ Pairing variant (1 octet)
+ Passkey (4 octets)
+
+ Opcode 0x88 - Bond State Changed notification
+
+ Notification parameters: Status (1 octect)
+ Remote address (6 octets)
+ Bond state (1 octet)
+
+ Opcode 0x89 - ACL State Changed notification
+
+ Notification parameters: Status (1 octect)
+ Remote address (6 octets)
+ ACL state (1 octet)
+
+ Opcode 0x8a - DUT Mode Receive notification
+
+ Notification parameters: Opcode (2 octects)
+ Length (1 octet)
+ Data (variable)
+
+ Opcode 0x8b - LE Test Mode notification
+
+ Notification parameters: Status (1 octect)
+ Num packets (2 octets)
+
+
+Bluetooth Socket HAL (ID 2)
+===========================
+
+Android HAL name:: "socket" (BT_PROFILE_SOCKETS_ID)
+
+Commands and responses:
+
+ Opcode 0x00 - Error response
+
+ Response parameters: Status (1 octet)
+
+ Valid status values: 0x01 = Fail
+ 0x02 = Not ready
+ 0x03 = No memory
+ 0x04 = Busy
+ 0x05 = Done (already completed)
+ 0x06 = Unsupported
+ 0x07 = Parameter invalid
+ 0x08 = Unhandled
+ 0x09 = Authentication failure
+ 0x0a = Remote device down
+
+ Opcode 0x01 - Listen command/response
+
+ Command parameters: Socket type (1 octet)
+ Service name (256 octets)
+ Service UUID (16 octets)
+ Channel (2 octets)
+ Socket flags (1 octet)
+ Response parameters: File descriptor (inline)
+
+ Valid socket types: 0x01 = RFCOMM
+ 0x02 = SCO
+ 0x03 = L2CAP
+
+ Valid socket flags: 0x01 = Encrypt
+ 0x02 = Auth
+
+ In case of an error, the error response will be returned.
+
+ Opcode 0x02 - Connect command/response
+
+ Command parameters: Remote address (6 octets)
+ Socket type (1 octet)
+ Service UUID (16 octets)
+ Channel (2 octets)
+ Socket flags (1 octet)
+ Response parameters: File descriptor (inline)
+
+ Valid socket types: 0x01 = RFCOMM
+ 0x02 = SCO
+ 0x03 = L2CAP
+
+ Valid socket flags: 0x01 = Encrypt
+ 0x02 = Auth
+
+ In case of an error, the error response will be returned.
+
+
+Bluetooth HID Host HAL (ID 3)
+============================
+
+Android HAL name: "hidhost" (BT_PROFILE_HIDHOST_ID)
+
+Commands and responses:
+
+ Opcode 0x00 - Error response
+
+ Response parameters: Status (1 octet)
+
+ Valid status values: 0x01 = Fail
+ 0x02 = Not ready
+ 0x03 = No memory
+ 0x04 = Busy
+ 0x05 = Done (already completed)
+ 0x06 = Unsupported
+ 0x07 = Parameter invalid
+ 0x08 = Unhandled
+ 0x09 = Authentication failure
+ 0x0a = Remote device down
+
+ Opcode 0x01 - Connect command/response
+
+ Command parameters: Remote address (6 octets)
+ Response parameters: <none>
+
+ In case of an error, the error response will be returned.
+
+ Opcode 0x02 - Disconnect command/response
+
+ Command parameters: Remote address (6 octets)
+ Response parameters: <none>
+
+ In case of an error, the error response will be returned.
+
+ Opcode 0x03 - Virtual Unplug command/response
+
+ Command parameters: Remote address (6 octets)
+ Response parameters: <none>
+
+ In case of an error, the error response will be returned.
+
+ Opcode 0x04 - Set Info command/response
+
+ Command parameters: Remote address (6 octets)
+ Attribute mask (2 octets)
+ Subclass (1 octet)
+ Application ID (1 octet)
+ Vendor ID (2 octets)
+ Product ID (2 octets)
+ Version (2 octets)
+ Country code (1 octet)
+ Descriptor length (2 octet)
+ Descriptor value (884 octets)
+ Response parameters: <none>
+
+ In case of an error, the error response will be returned.
+
+ Opcode 0x05 - Get Protocol command/response
+
+ Command parameters: Remote address (6 octets)
+ Protocol mode (1 octet)
+ Response parameters: <none>
+
+ Valid protocol modes: 0x00 = Report
+ 0x01 = Boot
+ 0xff = Unsupported
+
+ In case of an error, the error response will be returned.
+
+ Opcode 0x06 - Set Protocol command/response
+
+ Command parameters: Remote address (6 octets)
+ Protocol mode (1 octet)
+ Response parameters: <none>
+
+ Valid protocol modes: 0x00 = Report
+ 0x01 = Boot
+ 0xff = Unsupported
+
+ In case of an error, the error response will be returned.
+
+ Opcode 0x07 - Get Report command/response
+
+ Command parameters: Remote address (6 octets)
+ Report type (1 octet)
+ Report ID (1 octet)
+ Buffer size (2 octet)
+ Response parameters: <none>
+
+ Valid report types: 0x01 = Input
+ 0x02 = Output
+ 0x03 = Feature
+
+ In case of an error, the error response will be returned.
+
+ Opcode 0x08 - Set Report command/response
+
+ Command parameters: Remote address (6 octets)
+ Report type (1 octet)
+ ...
+ Response parameters: <none>
+
+ Valid report types: 0x01 = Input
+ 0x02 = Output
+ 0x03 = Feature
+
+ In case of an error, the error response will be returned.
+
+ Opcode 0x09 - Send Data command/response
+
+ Command parameters: Remote address (6 octets)
+ ...
+ Response parameters: <none>
+
+ In case of an error, the error response will be returned.
+
+Notifications:
+
+ Opcode 0x81 - Connection State notification
+
+ Notification parameters: Remote address (6 octets)
+
+ Valid connection states: 0x00 = Connected
+ 0x01 = Connecting
+ 0x02 = Disconnected
+ 0x03 = Disconnecting
+ 0x04 = Failed - Mouse from host
+ 0x05 = Failed - Keyboard from host
+ 0x06 = Failed - Too many devices
+ 0x07 = Failed - No HID driver
+ 0x08 = Failed - generic
+ 0x09 = Unknown
+
+ Opcode 0x82 - HID Info notification
+
+ Notification parameters: Remote address (6 octets)
+ Attribute mask (2 octets)
+ Subclass (1 octet)
+ Application ID (1 octet)
+ Vendor ID (2 octets)
+ Product ID (2 octets)
+ Version (2 octets)
+ Country code (1 octet)
+ Descriptor length (2 octet)
+ Descriptor value (884 octets)
+
+ Opcode 0x83 - Protocol Mode notification
+
+ Notification parameters: Remote address (6 octets)
+ Status (1 octet)
+ Protocol mode (1 octet)
+
+ Valid protocol modes: 0x00 = Report
+ 0x01 = Boot
+ 0xff = Unsupported
+
+ Opcode 0x84 - Idle Time notification
+
+ Notification parameters: Remote address (6 octets)
+ Status (1 octet)
+ Idle time (2 octets)
+
+ Opcode 0x85 - Get Report notification
+
+ Notification parameters: Remote address (6 octets)
+ Status (1 octet)
+ Report length (2 octets)
+ Report data (variable)
+
+ Opcode 0x86 - Virtual Unplug notification
+
+ Notification parameters: Remote address (6 octets)
+ Status (1 octet)
+
+ Valid status values: 0x00 = Ok
+ 0x01 = Handshake - Device not ready
+ 0x02 = Handshake - Invalid report ID
+ 0x03 = Handshake - Transaction not SPT
+ 0x04 = Handshake - Invalid parameter
+ 0x05 = Handshake - Generic error
+ 0x06 = General error
+ 0x07 = SDP error
+ 0x08 = Set protocol error
+ 0x09 = Device database full
+ 0x0a = Device type not supported
+ 0x0b = No resources
+ 0x0c = Authentication failed
+ 0x0d = HDL
+
+
+Bluetooth PAN HAL (ID 4)
+========================
+
+Android HAL name: "pan" (BT_PROFILE_PAN_ID)
+
+Commands and responses:
+
+ Opcode 0x00 - Error response
+
+ Response parameters: Status (1 octet)
+
+ Valid status values: 0x01 = Fail
+ 0x02 = Not ready
+ 0x03 = No memory
+ 0x04 = Busy
+ 0x05 = Done (already completed)
+ 0x06 = Unsupported
+ 0x07 = Parameter invalid
+ 0x08 = Unhandled
+ 0x09 = Authentication failure
+ 0x0a = Remote device down
+
+ Opcode 0x01 - Enable command/response
+
+ Command parameters: Local role (1 octet)
+ Response parameters: <none>
+
+ Valid role values: 0x00 = None
+ 0x01 = NAP
+ 0x02 = PANU
+
+ In case of an error, the error response will be returned.
+
+ Opcode 0x02 - Get Local Role command/response
+
+ Command parameters: <none>
+ Response parameters: Local role (1 octet)
+
+ Valid role values: 0x00 = None
+ 0x01 = NAP
+ 0x02 = PANU
+
+ In case of an error, the error response will be returned.
+
+ Opcode 0x03 - Connect command/response
+
+ Command parameters: Remote address (6 octets)
+ Local role (1 octet)
+ Remote role (1 octet)
+ Response parameters: <none>
+
+ Valid role values: 0x01 = NAP
+ 0x02 = PANU
+
+ In case of an error, the error response will be returned.
+
+ Opcode 0x04 - Disconnect command/response
+
+ Command parameters: Remote address (6 octets)
+ Response parameters: <none>
+
+ In case of an error, the error response will be returned.
+
+Notifications:
+
+ Opcode 0x81 - Control State notification
+
+ Notification parameters: Control state (1 octect)
+ Status (1 octet)
+ Local role (1 octet)
+ Interface name (17 octet)
+
+ Valid control states: 0x00 = Enabled
+ 0x01 = Disabled
+
+ Valid role values: 0x00 = None
+ 0x01 = NAP
+ 0x02 = PANU
+
+ Opcode 0x82 - Connection State notification
+
+ Notification parameters: Connection state (1 octect)
+ Status (1 octet)
+ Remote address (6 octets)
+ Local role (1 octet)
+ Remote role (1 octet)
+
+ Valid connection states: 0x00 = Connected
+ 0x01 = Connecting
+ 0x02 = Disconnected
+ 0x03 = Disconnecting
+
+ Valid role values: 0x01 = NAP
+ 0x02 = PANU
+
+
+Bluetooth Handsfree HAL (ID 5)
+==============================
+
+Android HAL name: "handsfree" (BT_PROFILE_HANDSFREE_ID)
+
+ Opcode 0x00 - Error response
+
+ Response parameters: Status (1 octet)
+
+ Valid status values: 0x01 = Fail
+ 0x02 = Not ready
+ 0x03 = No memory
+ 0x04 = Busy
+ 0x05 = Done (already completed)
+ 0x06 = Unsupported
+ 0x07 = Parameter invalid
+ 0x08 = Unhandled
+ 0x09 = Authentication failure
+ 0x0a = Remote device down
+
+ Opcode 0x01 - Connect command/response
+
+ Command parameters: Remote address (6 octets)
+ Response parameters: <none>
+
+ In case of an error, the error response will be returned.
+
+ Opcode 0x02 - Disconnect command/response
+
+ Command parameters: Remote address (6 octets)
+ Response parameters: <none>
+
+ In case of an error, the error response will be returned.
+
+ Opcode 0x03 - Connect Audio command/response
+
+ Command parameters: Remote address (6 octets)
+ Response parameters: <none>
+
+ In case of an error, the error response will be returned.
+
+ Opcode 0x04 - Disconnect Audio command/response
+
+ Command parameters: Remote address (6 octets)
+ Response parameters: <none>
+
+ In case of an error, the error response will be returned.
+
+ Opcode 0x05 - Start Voice Recognition command/response
+
+ Command parameters: <none>
+ Response parameters: <none>
+
+ In case of an error, the error response will be returned.
+
+ Opcode 0x06 - Stop Voice Recognition command/response
+
+ Command parameters: <none>
+ Response parameters: <none>
+
+ In case of an error, the error response will be returned.
+
+ Opcode 0x07 - Volume Control command/response
+
+ Command parameters: Volume type (1 octet)
+ Volume (1 octet)
+ Response parameters: <none>
+
+ Valid volume types: 0x00 = Speaker
+ 0x01 = Microphone
+
+ In case of an error, the error response will be returned.
+
+ Opcode 0x08 - Device Status Notification command/response
+
+ Command parameters: Network state (1 octet)
+ Service type (1 octet)
+ Signal strength (1 octet)
+ Battery level (1 octet)
+ Response parameters: <none>
+
+ Valid network states: 0x00 = Not available
+ 0x01 = Available
+
+ Valid service types: 0x00 = Home network
+ 0x01 = Roaming network
+
+ In case of an error, the error response will be returned.
+
+ Opcode 0x09 - COPS Response command/response
+
+ Command parameters: COPS command response (string)
+ Response parameters: <none>
+
+ In case of an error, the error response will be returned.
+
+ Opcode 0x0a - CIND Response command/response
+
+ Command parameters: Service (1 octet)
+ Number of active calls (1 octet)
+ Number of held calls (1 octet)
+ Call setup state (1 octet)
+ Signal strength (1 octet)
+ Roaming indicator (1 octet)
+ Battery level (1 octet)
+ Response parameters: <none>
+
+ Valid call setup states: 0x00 = Active
+ 0x01 = Held
+ 0x02 = Dialing
+ 0x03 = Alerting
+ 0x04 = Incoming
+ 0x05 = Waiting
+ 0x06 = Idle
+
+ In case of an error, the error response will be returned.
+
+ Opcode 0x0b - Formatted AT Response command/response
+
+ Command parameters: Pre-formatted AT response (string)
+ Response parameters: <none>
+
+ In case of an error, the error response will be returned.
+
+ Opcode 0x0c - AT Response command/response
+
+ Command parameters: Response code (1 octet)
+ Error code (1 octet)
+ Response parameters: <none>
+
+ Valid response codes: 0x00 = ERROR
+ 0x01 = OK
+
+ In case of an error, the error response will be returned.
+
+ Opcode 0x0d - CLCC Response command/response
+
+ Command parameters: Call index (1 octet)
+ Call direction (1 octet)
+ Call state (1 octet)
+ Call mode (1 octet)
+ Call multiparty type (1 octet)
+ Call number type (1 octet)
+ Call number (variable)
+ Response parameters: <none>
+
+ Valid call directions: 0x00 = Outgoing
+ 0x01 = Incoming
+
+ Valid call states: 0x00 = Active
+ 0x01 = Held
+ 0x02 = Dialing
+ 0x03 = Alerting
+ 0x04 = Incoming
+ 0x05 = Waiting
+ 0x06 = Idle
+
+ Valid call modes: 0x00 = Voice
+ 0x01 = Data
+ 0x02 = Fax
+
+ Valid multiparty types: 0x00 = Single call
+ 0x01 = Multiparty call
+
+ Valid number types: 0x81 = Unknown
+ 0x91 = International
+
+ In case of an error, the error response will be returned.
+
+ Opcode 0x0e - Phone Status Change command/response
+
+ Command parameters: Number of active calls (1 octet)
+ Number of held calls (1 octet)
+ Call setup state (1 octet)
+ Call number type (1 octet)
+ Call number (variable)
+ Response parameters: <none>
+
+ Valid call setup states: 0x00 = Active
+ 0x01 = Held
+ 0x02 = Dialing
+ 0x03 = Alerting
+ 0x04 = Incoming
+ 0x05 = Waiting
+ 0x06 = Idle
+
+ Valid number types: 0x81 = Unknown
+ 0x91 = International
+
+ In case of an error, the error response will be returned.
+
+Notifications:
+
+ Opcode 0x81 - Connection State notification
+
+ Notification parameters: Connection state (1 octect)
+ Remote address (6 octets)
+
+ Valid connection states: 0x00 = Disconnected
+ 0x01 = Connecting
+ 0x02 = Connected
+ 0x03 = SLC connected
+ 0x04 = Disconnecting
+
+ Opcode 0x82 - Audio State notification
+
+ Notification parameters: Audio state (1 octect)
+ Remote address (6 octets)
+
+ Valid audio states: 0x00 = Disconnected
+ 0x01 = Connecting
+ 0x02 = Connected
+ 0x03 = Disconnecting
+
+ Opcode 0x83 - Voice Recognition Command notification
+
+ Notification parameters: Voice recognition state (1 octet)
+
+ Valid voice recognition states: 0x00 = Stopped
+ 0x01 = Started
+
+ Opcode 0x84 - Answer Call Command notification
+
+ Notification parameters: <none>
+
+ Opcode 0x85 - Hangup Call Command notification
+
+ Notification parameters: <none>
+
+ Opcode 0x86 - Volume Command notification
+
+ Notification parameters: Volume type (1 octet)
+
+ Valid volume types: 0x00 = Speaker
+ 0x01 = Microphone
+
+ Opcode 0x87 - Dial Call Command notification
+
+ Notification parameters: Number (string)
+
+ Opcode 0x88 - DTMF Command notification
+
+ Notification parameters: Tone (1 octet)
+
+ Opcode 0x89 - NREC Command notification
+
+ Notification parameters: NREC types (1 octet)
+
+ Valid NREC types: 0x00 = Stop
+ 0x01 = Start
+
+ Opcode 0x8a - CHLD Command notification
+
+ Notification parameters: NREC types (1 octet)
+
+ Valid CHLD types: 0x00 = Release and hold
+ 0x01 = Release active and accept held
+ 0x02 = Hold active and accept held
+ 0x03 = Add held call to conference
+
+ Opcode 0x8b - CNUM Command notification
+
+ Notification parameters: <none>
+
+ Opcode 0x8c - CIND Command notification
+
+ Notification parameters: <none>
+
+ Opcode 0x8d - COPS Command notification
+
+ Notification parameters: <none>
+
+ Opcode 0x8e - CLCC Command notification
+
+ Notification parameters: <none>
+
+ Opcode 0x8f - Unknown AT Command notification
+
+ Notification parameters: AT command (string)
+
+ Opcode 0x90 - Key Pressed Command notification
+
+ Notification parameters: <none>
+
+
+Bluetooth Advanced Audio HAL (ID 6)
+===================================
+
+Android HAL name: "ad2p" (BT_PROFILE_ADVANCED_AUDIO_ID)
+
+Commands and responses:
+
+ Opcode 0x00 - Error response
+
+ Response parameters: Status (1 octet)
+
+ Valid status values: 0x01 = Fail
+ 0x02 = Not ready
+ 0x03 = No memory
+ 0x04 = Busy
+ 0x05 = Done (already completed)
+ 0x06 = Unsupported
+ 0x07 = Parameter invalid
+ 0x08 = Unhandled
+ 0x09 = Authentication failure
+ 0x0a = Remote device down
+
+ Opcode 0x01 - Connect command/response
+
+ Command parameters: Remote address (6 octets)
+ Response parameters: <none>
+
+ In case of an error, the error response will be returned.
+
+ Opcode 0x02 - Disconnect command/response
+
+ Command parameters: Remote address (6 octets)
+ Response parameters: <none>
+
+ In case of an error, the error response will be returned.
+
+Notifications:
+
+ Opcode 0x81 - Connection State notification
+
+ Notification parameters: Connection state (1 octect)
+ Remote address (6 octets)
+
+ Valid connection states: 0x00 = Disconnected
+ 0x01 = Connecting
+ 0x02 = Connected
+ 0x03 = Disconnecting
+
+ Opcode 0x82 - Audio State notification
+
+ Notification parameters: Audio state (1 octect)
+ Remote address (6 octets)
+
+ Valid connection states: 0x00 = Remote suspend
+ 0x01 = Stopped
+ 0x02 = Started
+
+
+Bluetooth Health HAL (ID 7)
+===========================
+
+Android HAL name: "health" (BT_PROFILE_HEALTH_ID)
+
+ Opcode 0x00 - Error response
+
+ Response parameters: Status (1 octet)
+
+ Valid status values: 0x01 = Fail
+ 0x02 = Not ready
+ 0x03 = No memory
+ 0x04 = Busy
+ 0x05 = Done (already completed)
+ 0x06 = Unsupported
+ 0x07 = Parameter invalid
+ 0x08 = Unhandled
+ 0x09 = Authentication failure
+ 0x0a = Remote device down
+
+ Opcode 0x01 - Register Application command/response
+
+ Command parameters: Application name (string)
+ Provider name (string)
+ Service name (string)
+ Service description (string)
+ Number of MDEP (1 octet)
+ MDEP Role[i] (1 octet)
+ Data type[i] (1 octet)
+ Channel type[i] (1 octet)
+ MDEP description (string)
+ Response parameters: Application ID (2 octets)
+
+ In case of an error, the error response will be returned.
+
+ Opcode 0x02 - Unregister Application command/response
+
+ Command parameters: Application ID (2 octets)
+ Response parameters: <none>
+
+ In case of an error, the error response will be returned.
+
+ Opcode 0x03 - Connect Channel command/response
+
+ Command parameters: Application ID (2 octets)
+ Remote address (6 octets)
+ MDEP index (1 octet)
+ Response parameters: Channel ID (2 octets)
+
+ In case of an error, the error response will be returned.
+
+ Opcode 0x04 - Destroy Channel command/response
+
+ Command parameters: Channel ID (2 octets)
+ Response parameters: <none>
+
+ In case of an error, the error response will be returned.
+
+Notifications:
+
+ Opcode 0x81 - Application Registration State notification
+
+ Notification parameters: Application ID (2 octects)
+ Application state (1 octet)
+
+ Valid application states: 0x00 = Registration success
+ 0x01 = Registration failed
+ 0x02 = Deregistration success
+ 0x03 = Deregistration failed
+
+ Opcode 0x82 - Channel State notification
+
+ Notification parameters: Application ID (2 octects)
+ Remote address (6 octets)
+ MDEP index (1 octet)
+ Channel ID (2 octets)
+ Channel state (1 octet)
+ File descriptor (inline)
+
+ Valid channel states: 0x00 = Connecting
+ 0x01 = Connected
+ 0x02 = Disconnecting
+ 0x03 = Disconnected
+ 0x04 = Destroyed
+
+
+Bluetooth Remote Control HAL (ID 8)
+===================================
+
+Android HAL name: "avrcp" (BT_PROFILE_AV_RC_ID)
+
+ Opcode 0x00 - Error response
+ Opcode 0x01 - Get Play Status command/response
+ Opcode 0x02 - List Player Application Attributes command/response
+ Opcode 0x03 - List Player Application Values command/response
+ Opcode 0x04 - Get Player Application Values command/response
+ Opcode 0x05 - Get Player Application Attributes Text command/response
+ Opcode 0x06 - Get Player Application Values Text command/response
+ Opcode 0x07 - Get Element Attributes Text command/response
+ Opcode 0x08 - Set Player Attributes Value command/response
+ Opcode 0x09 - Register Notification command/response
+
+ Opcode 0x81 - Get Play Status notification
+ Opcode 0x82 - List Player Application Attributes notification
+ ...
+
+
+Bluetooth GATT HAL (ID 9)
+=========================
+
+Android HAL name: "gatt" (BT_PROFILE_GATT_ID)
+
+ Opcode 0x00 - Error response
+ Opcode 0x01 - Register Client command/response
+ Opcode 0x02 - Unregister Client command/response
+ Opcode 0x03 - Scan command/response
+ Opcode 0x04 - Connect Device command/response
+ Opcode 0x05 - Disconnect Device command/response
+ Opcode 0x06 - Refresh command/response
+ Opcode 0x07 - Search Service command/response
+ Opcode 0x08 - Get Included Service command/response
+ Opcode 0x09 - Get Characteristic command/response
+ Opcode 0x0a - Get Descriptor command/response
+ Opcode 0x0b - Read Characteristic command/response
+ Opcode 0x0c - Write Characteristic command/response
+ Opcode 0x0d - Read Descriptor command/response
+ Opcode 0x0e - Write Descriptor command/response
+ Opcode 0x0f - Execute Write command/response
+ Opcode 0x10 - Register For Notification command/response
+ Opcode 0x11 - Deregister For Notification command/response
+ Opcode 0x12 - Read Remote RSSI command/response
+ Opcode 0x13 - Get Device Type command/response
+ Opcode 0x14 - Test Command command/response
+ Opcode 0x15 - Register Server command/response
+ Opcode 0x16 - Unregister Server command/response
+ Opcode 0x17 - Connect Peripheral command/response
+ Opcode 0x18 - Disconnect Peripheral command/response
+ Opcode 0x19 - Add Service command/response
+ Opcode 0x1a - Add Included Service command/response
+ Opcode 0x1b - Add Characteristic command/response
+ Opcode 0x1c - Add Descriptor command/response
+ Opcode 0x1d - Start Service command/response
+ Opcode 0x1e - Stop Service command/response
+ Opcode 0x1f - Delete Service command/response
+ Opcode 0x20 - Send Indication command/response
+ Opcode 0x21 - Send Response command/response
+
+ Opcode 0x81 - Register Client notification
+ Opcode 0x82 - Scan Result notification
+ Opcode 0x83 - Connect Device notification
+ Opcode 0x84 - Disconnect Device notification
+ Opcode 0x85 - Search Complete notification
+ Opcode 0x86 - Search Result notification
+ Opcode 0x87 - Get Characteristic notification
+ Opcode 0x88 - Get Descriptor notification
+ Opcode 0x89 - Get Included Service notification
+ Opcode 0x8a - Register For Notification notification
+ Opcode 0x8b - Notify notification
+ Opcode 0x8c - Read Characteristic notification
+ Opcode 0x8d - Write Characteristic notification
+ Opcode 0x8e - Execute Write notification
+ Opcode 0x8f - Read Descriptor notification
+ Opcode 0x90 - Write Descriptor notification
+ Opcode 0x91 - Read Remote RSSI notification
+ Opcode 0x92 - Register Server notification
+ Opcode 0x93 - Connection notification
+ Opcode 0x94 - Service Added notification
+ Opcode 0x95 - Included Service Added notification
+ Opcode 0x96 - Characteristic Added notification
+ Opcode 0x97 - Descriptor Added notification
+ Opcode 0x98 - Service Started notification
+ Opcode 0x99 - Service Stopped notification
+ Opcode 0x9a - Service Deleted notification
+ Opcode 0x9b - Request Read notification
+ Opcode 0x9c - Request Write notification
+ Opcode 0x9d - Request Execute Write notification
+ Opcode 0x9e - Response Confirmation notification
--
1.8.4
^ permalink raw reply related
* [PATCH] sdp: Check for correct pkt size received instead of error
From: Andrei Emeltchenko @ 2013-10-01 11:57 UTC (permalink / raw)
To: linux-bluetooth
From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
Check that the full header is received in recv().
---
src/sdpd-server.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/sdpd-server.c b/src/sdpd-server.c
index 7b1351f..10e46a1 100644
--- a/src/sdpd-server.c
+++ b/src/sdpd-server.c
@@ -166,7 +166,7 @@ static gboolean io_session_event(GIOChannel *chan, GIOCondition cond, gpointer d
}
len = recv(sk, &hdr, sizeof(sdp_pdu_hdr_t), MSG_PEEK);
- if (len <= 0) {
+ if (len != sizeof(sdp_pdu_hdr_t)) {
sdp_svcdb_collect_all(sk);
return FALSE;
}
--
1.7.10.4
^ permalink raw reply related
* Re: [PATCH v5 1/2] Bluetooth: btmrvl: add setup handler
From: Johan Hedberg @ 2013-10-01 11:13 UTC (permalink / raw)
To: Bing Zhao
Cc: Marcel Holtmann, linux-bluetooth@vger.kernel.org development,
Gustavo F. Padovan, linux-wireless@vger.kernel.org Wireless,
Mike Frysinger, Hyuckjoo Lee, Amitkumar Karwar
In-Reply-To: <B3090D30-6F81-4E12-8F58-E650F77BB72E@holtmann.org>
Hi Marcel & Bing,
On Thu, Sep 26, 2013, Marcel Holtmann wrote:
> >> You're right that we're missing the clearing of the HCI_SETUP flag for
> >> such a scenario. Could you try the attached patch. It should fix the
> >
> > We have tested your patch. Yes, it fixes the problem. Thanks!
>
> then lets get a proper version with full commit message explaining the
> issue merged upstream. As I said, this is a real bug we need to fix.
I've just sent a new patch set titled "[PATCH 0/2] Bluetooth: Fix
hci_dev_open race condition". Bing, could you please test this with your
original setup so we ensure that the issue is still properly handled.
Johan
^ permalink raw reply
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox