Linux bluetooth development
 help / color / mirror / Atom feed
* Re: [PATCHv3 06/15] android: Add basic mgmt initialization sequence
From: Marcel Holtmann @ 2013-10-09 19:30 UTC (permalink / raw)
  To: Andrei Emeltchenko; +Cc: linux-bluetooth
In-Reply-To: <1381243883-2745-7-git-send-email-Andrei.Emeltchenko.news@gmail.com>

Hi Andrei,

> 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 e161e6d..9a2c486 100644
> --- a/Makefile.android
> +++ b/Makefile.android
> @@ -1,7 +1,9 @@
> if ANDROID
> noinst_PROGRAMS += android/bluetoothd
> 
> -android_bluetoothd_SOURCES = android/main.c src/log.c
> +android_bluetoothd_SOURCES = android/main.c src/log.c \
> +				src/shared/util.h src/shared/util.c \
> +				src/shared/mgmt.h src/shared/mgmt.c
> android_bluetoothd_LDADD = @GLIB_LIBS@
> endif
> 
> diff --git a/android/Android.mk b/android/Android.mk
> index 2cabff4..f5fd863 100644
> --- a/android/Android.mk
> +++ b/android/Android.mk
> @@ -15,10 +15,15 @@ include $(CLEAR_VARS)
> LOCAL_SRC_FILES := \
> 	main.c \
> 	log.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 \

do we need these nested includes actually? We could also just fix the includes. BlueZ historically has not been good with clear includes. I started to fix this, but it seems I have not gotten to all of them yet.

> 
> LOCAL_CFLAGS := -DVERSION=\"$(BLUEZ_VERSION)\"
> @@ -26,6 +31,12 @@ LOCAL_CFLAGS := -DVERSION=\"$(BLUEZ_VERSION)\"
> # to suppress the "warning: missing initializer near initialization.." warning
> LOCAL_CFLAGS += -Wno-missing-field-initializers
> 
> +# to suppress the "pointer of type 'void *' used in arithmetic" warning
> +LOCAL_CFLAGS += -Wno-pointer-arith

Why do we need to suppress these warning. Can we not just fix them.

> +
> +# Define missing flags for Android 4.2
> +LOCAL_CFLAGS += -DSOCK_CLOEXEC=02000000 -DSOCK_NONBLOCK=04000
> +

This thing is dangerous. Do we really bother with Android 4.2 support and can not rely on a newer version that has this fixed properly in bionic.

> LOCAL_SHARED_LIBRARIES := \
> 	libglib \
> 
> diff --git a/android/main.c b/android/main.c
> index f75b0a8..3580ac7 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 "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;
> 
> static gboolean quit_eventloop(gpointer user_data)
> {
> @@ -67,6 +76,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.
> +	 */

This is not our comment style.

> +}
> +
> +
> +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);
> +
> +}

I prefer if we focus on one controller index and one controller index only. There is no need to bother reading information from controllers that we will never use.

> +
> +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);
> +	}

Same here. Lets just pick one controller and be done with it.

> +}
> +
> +

Avoid double empty lines.

> +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__);

These can not be info() ever. Make them DBG().

> +
> +	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);
> +}

When copying code from src/adapter.c can we please at least be smart about it. Code that has no benefit should not be run. If it is currently not used, then leave it out for now.

> +
> +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)
> +{

If you are not using the return value, then do not return it.

> +	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;
> @@ -100,10 +286,13 @@ int main(int argc, char *argv[])
> 	sigaction(SIGINT, &sa, NULL);
> 	sigaction(SIGTERM, &sa, NULL);
> 
> +	init_mgmt_interface();
> +
> 	DBG("Entering main loop");
> 
> 	g_main_loop_run(event_loop);
> 
> +	cleanup_mgmt_interface();
> 	g_main_loop_unref(event_loop);
> 
> 	info("Exit");

Regards

Marcel


^ permalink raw reply

* Re: [PATCHv3 05/15] android: Start Android Bluetooth daemon
From: Marcel Holtmann @ 2013-10-09 19:19 UTC (permalink / raw)
  To: Andrei Emeltchenko; +Cc: linux-bluetooth
In-Reply-To: <1381243883-2745-6-git-send-email-Andrei.Emeltchenko.news@gmail.com>

Hi Andrei,

> 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 |   50 ++++++++++++++++++++++++++++++++++++++++++++---
> 1 file changed, 47 insertions(+), 3 deletions(-)
> 
> diff --git a/android/hal_bluetooth.c b/android/hal_bluetooth.c
> index 00f3e8d..f1e306f 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 "bluetoothd"
> +

I think a more fitting name would we SERVICE_NAME or similar.

> bt_callbacks_t *bt_hal_cbacks = NULL;
> 
> static bool interface_ready(void)
> @@ -35,6 +40,42 @@ static bool interface_ready(void)
> 	return bt_hal_cbacks != NULL;
> }
> 
> +static bool is_svc_running(void)
> +{
> +	char val[PROPERTY_VALUE_MAX];
> +	int ret;

Is this variable used anywhere.

> +
> +	ALOGD(__func__);
> +
> +	if (property_get("init.svc." ANDROID_BLUEZ, val, NULL)) {
> +		if (strcmp(val, "running") == 0)

These days I rather do !strcmp.

> +			return true;
> +	}
> +
> +	return false;
> +}
> +
> +static bool start_bt_daemon(void)
> +{
> +	int tries = 40; /* wait 4 seconds for completion */
> +
> +	ALOGD(__func__);
> +
> +	/* Start Android Bluetooth daemon service */
> +	property_set("ctl.start", ANDROID_BLUEZ);
> +
> +	while (tries-- > 0) {
> +		if (is_svc_running() == true) {

We test with just if (is_svc_running()) these days.

> +			ALOGI("Android BlueZ daemon started");
> +			return true;
> +		}
> +
> +		usleep(100000);
> +	}
> +
> +	return false;
> +}

if you are using is_svc_running only in this one function, then why not just do it all in one function and be done with it.

> +
> static bool is_profile(const char *profile, const char *str)
> {
> 	return strcmp(profile, str) == 0;
> @@ -47,10 +88,13 @@ static int init(bt_callbacks_t *callbacks)
> 	if (interface_ready() == true)
> 		return BT_STATUS_SUCCESS;
> 
> -	/* store reference to user callbacks */
> -	bt_hal_cbacks = callbacks;
> +	if (start_bt_daemon() == true) {
> +		/* TODO: open channel */
> 
> -	/* TODO: Init here bluezd task */
> +		bt_hal_cbacks = callbacks;
> +
> +		return BT_STATUS_SUCCESS;
> +	}
> 
> 	return BT_STATUS_UNSUPPORTED;
> }

Regards

Marcel


^ permalink raw reply

* Re: [PATCHv3 04/15] android: Enable Socket interface
From: Marcel Holtmann @ 2013-10-09 19:15 UTC (permalink / raw)
  To: Andrei Emeltchenko; +Cc: linux-bluetooth
In-Reply-To: <1381243883-2745-5-git-send-email-Andrei.Emeltchenko.news@gmail.com>

Hi Andrei,

> 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();
> +

just use if (!strcmp(profile_id, BT_PROFILE…) here. It is as short and does not obfuscate with a function that does exactly the same anyway.

Regards

Marcel


^ permalink raw reply

* Re: [PATCHv3 03/15] android: Add Socket Bluetooth HAL template
From: Marcel Holtmann @ 2013-10-09 19:14 UTC (permalink / raw)
  To: Andrei Emeltchenko; +Cc: linux-bluetooth
In-Reply-To: <1381243883-2745-4-git-send-email-Andrei.Emeltchenko.news@gmail.com>

Hi Andrei,

> 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 7adbbcd..2cabff4 100644
> --- a/android/Android.mk
> +++ b/android/Android.mk
> @@ -41,6 +41,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) {

we are moving away from uuid == NULL checks. Use !uuid instead.

> +		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);

I normally expect that even the default statement has a break; at the end.

> +	}
> +
> +	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 = {

Is this an Android issue in how they defined the APIs or why are these not static const.

> +	sizeof(btsock_if),
> +	listen,
> +	connect
> +};
> +
> +btsock_interface_t *bt_get_sock_interface(void)
> +{
> +	return &btsock_if;
> +}

Regards

Marcel


^ permalink raw reply

* Re: [PATCHv3 01/15] android: Supress missing initializers warnings
From: Marcel Holtmann @ 2013-10-09 19:11 UTC (permalink / raw)
  To: Andrei Emeltchenko; +Cc: linux-bluetooth
In-Reply-To: <1381243883-2745-2-git-send-email-Andrei.Emeltchenko.news@gmail.com>

Hi Andrei,

> These types of warnings are disabled in BlueZ makeifiles
> 
> main.c:67:2: warning: missing initializer [-Wmissing-field-initializers]
> main.c:67:2: warning: (near initialization for 'options[1].short_name')
> 	[-Wmissing-field-initializers]
> ---
> android/Android.mk |    3 +++
> 1 file changed, 3 insertions(+)
> 
> diff --git a/android/Android.mk b/android/Android.mk
> index ec820ac..5498b41 100644
> --- a/android/Android.mk
> +++ b/android/Android.mk
> @@ -23,6 +23,9 @@ LOCAL_C_INCLUDES := \
> 
> LOCAL_CFLAGS := -DVERSION=\"$(BLUEZ_VERSION)\"
> 
> +# to suppress the "warning: missing initializer near initialization.." warning
> +LOCAL_CFLAGS += -Wno-missing-field-initializers
> +

why are we doing this and not fixing the actual warning?

Regards

Marcel


^ permalink raw reply

* Re: [PATCH BlueZ 1/7] core/profile: Fix MNS record version
From: Johan Hedberg @ 2013-10-09 15:42 UTC (permalink / raw)
  To: Luiz Augusto von Dentz; +Cc: linux-bluetooth
In-Reply-To: <1381317105-10729-1-git-send-email-luiz.dentz@gmail.com>

Hi Luiz,

On Wed, Oct 09, 2013, Luiz Augusto von Dentz wrote:
> To be able to use OBEX over L2CAP the version number should be at least
> 0x102, in addition to that ERTM mode should be used to comply to
> GOEP 2.0.
> ---
>  src/profile.c | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)

All patches in this set have been applied. Thanks.

Johan

^ permalink raw reply

* Possible problem with btusb suspend resume handling
From: Hans de Goede @ 2013-10-09 15:10 UTC (permalink / raw)
  To: linux-bluetooth

Hi,

While reviewing all users of usb_anchor-s (because of some
usb_anchor fixes I've been writing), I noticed that btusb normally
puts to be transmitted urbs on an anchor called tx_anchor and then
submits them, unless suspended, then they are put on an anchor called
deferred without being submitted.

On resume any urbs on the deferred anchor get removed from the deferred
anchor, and submitted to the device.

But unlike other drivers which similar constructs, btusb does not
move put them on the tx_anchor when submitting then from the resume
handler.

So after a resume with deferred transmits, there will be tx urbs in
flight which are not anchored on the tx_anchor. I believe this is
a bug, but I don't know the code well enough to be sure.

Regards,

Hans

^ permalink raw reply

* [PATCH BlueZ 7/7] tools/hcidump: Fix parsing for service class 0x110f
From: Luiz Augusto von Dentz @ 2013-10-09 11:16 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

According to assigned number 0x110f is AV Remote Controller not VCP.
---
 tools/parser/sdp.c | 3 +--
 tools/parser/sdp.h | 3 +--
 2 files changed, 2 insertions(+), 4 deletions(-)

diff --git a/tools/parser/sdp.c b/tools/parser/sdp.c
index b48e3ff..0e28328 100644
--- a/tools/parser/sdp.c
+++ b/tools/parser/sdp.c
@@ -121,7 +121,7 @@ static sdp_uuid_nam_lookup_table_t sdp_uuid_nam_lookup_table[] = {
 	{ SDP_UUID_AV_REMOTE_TARGET,         "AVRemTarget"  }, /* AVRCP */
 	{ SDP_UUID_ADVANCED_AUDIO,           "AdvAudio"     }, /* A2DP */
 	{ SDP_UUID_AV_REMOTE,                "AVRemote"     }, /* AVRCP */
-	{ SDP_UUID_VIDEO_CONFERENCING,       "VideoConf"    }, /* VCP */
+	{ SDP_UUID_AV_REMOTE_CONTROLLER,     "AVRemCt"      }, /* AVRCP */
 	{ SDP_UUID_INTERCOM,                 "Intercom"     },
 	{ SDP_UUID_FAX,                      "Fax"          },
 	{ SDP_UUID_HEADSET_AUDIO_GATEWAY,    "Headset AG"   },
@@ -145,7 +145,6 @@ static sdp_uuid_nam_lookup_table_t sdp_uuid_nam_lookup_table[] = {
 	{ SDP_UUID_HCR_PRINT,                "HCRPrint"     }, /* HCRP */
 	{ SDP_UUID_HCR_SCAN,                 "HCRScan"      }, /* HCRP */
 	{ SDP_UUID_COMMON_ISDN_ACCESS,       "CIP"          }, /* CIP */
-	{ SDP_UUID_VIDEO_CONFERENCING_GW,    "VideoConf GW" }, /* VCP */
 	{ SDP_UUID_UDI_MT,                   "UDI MT"       }, /* UDI */
 	{ SDP_UUID_UDI_TA,                   "UDI TA"       }, /* UDI */
 	{ SDP_UUID_AUDIO_VIDEO,              "AudioVideo"   }, /* VCP */
diff --git a/tools/parser/sdp.h b/tools/parser/sdp.h
index 41fc209..ed55a23 100644
--- a/tools/parser/sdp.h
+++ b/tools/parser/sdp.h
@@ -66,7 +66,7 @@
 #define SDP_UUID_AV_REMOTE_TARGET                      0x110c /* AVRCP */
 #define SDP_UUID_ADVANCED_AUDIO                        0x110d /* A2DP */
 #define SDP_UUID_AV_REMOTE                             0x110e /* AVRCP */
-#define SDP_UUID_VIDEO_CONFERENCING                    0x110f /* VCP */
+#define SDP_UUID_AV_REMOTE_CONTROLLER                  0x110f /* AVRCP */
 #define SDP_UUID_INTERCOM                              0x1110
 #define SDP_UUID_FAX                                   0x1111
 #define SDP_UUID_HEADSET_AUDIO_GATEWAY                 0x1112
@@ -93,7 +93,6 @@
 #define SDP_UUID_HCR_PRINT                             0x1126 /* HCRP */
 #define SDP_UUID_HCR_SCAN                              0x1127 /* HCRP */
 #define SDP_UUID_COMMON_ISDN_ACCESS                    0x1128 /* CIP */
-#define SDP_UUID_VIDEO_CONFERENCING_GW                 0x1129 /* VCP */
 #define SDP_UUID_UDI_MT                                0x112a /* UDI */
 #define SDP_UUID_UDI_TA                                0x112b /* UDI */
 #define SDP_UUID_AUDIO_VIDEO                           0x112c /* VCP */
-- 
1.8.3.1


^ permalink raw reply related

* [PATCH BlueZ 7/7] tools/hcidump: Fix parsing for service class 0x110f
From: Luiz Augusto von Dentz @ 2013-10-09 11:11 UTC (permalink / raw)
  To: linux-bluetooth
In-Reply-To: <1381317105-10729-1-git-send-email-luiz.dentz@gmail.com>

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

According to assigned number 0x110f is AV Remote Controller not VCP.
---
 tools/parser/sdp.c | 3 +--
 tools/parser/sdp.h | 3 +--
 2 files changed, 2 insertions(+), 4 deletions(-)

diff --git a/tools/parser/sdp.c b/tools/parser/sdp.c
index b48e3ff..29708e3 100644
--- a/tools/parser/sdp.c
+++ b/tools/parser/sdp.c
@@ -121,7 +121,7 @@ static sdp_uuid_nam_lookup_table_t sdp_uuid_nam_lookup_table[] = {
 	{ SDP_UUID_AV_REMOTE_TARGET,         "AVRemTarget"  }, /* AVRCP */
 	{ SDP_UUID_ADVANCED_AUDIO,           "AdvAudio"     }, /* A2DP */
 	{ SDP_UUID_AV_REMOTE,                "AVRemote"     }, /* AVRCP */
-	{ SDP_UUID_VIDEO_CONFERENCING,       "VideoConf"    }, /* VCP */
+	{ SDP_UUID_AV_REMOTE,                "AVRemCt"      }, /* AVRCP */
 	{ SDP_UUID_INTERCOM,                 "Intercom"     },
 	{ SDP_UUID_FAX,                      "Fax"          },
 	{ SDP_UUID_HEADSET_AUDIO_GATEWAY,    "Headset AG"   },
@@ -145,7 +145,6 @@ static sdp_uuid_nam_lookup_table_t sdp_uuid_nam_lookup_table[] = {
 	{ SDP_UUID_HCR_PRINT,                "HCRPrint"     }, /* HCRP */
 	{ SDP_UUID_HCR_SCAN,                 "HCRScan"      }, /* HCRP */
 	{ SDP_UUID_COMMON_ISDN_ACCESS,       "CIP"          }, /* CIP */
-	{ SDP_UUID_VIDEO_CONFERENCING_GW,    "VideoConf GW" }, /* VCP */
 	{ SDP_UUID_UDI_MT,                   "UDI MT"       }, /* UDI */
 	{ SDP_UUID_UDI_TA,                   "UDI TA"       }, /* UDI */
 	{ SDP_UUID_AUDIO_VIDEO,              "AudioVideo"   }, /* VCP */
diff --git a/tools/parser/sdp.h b/tools/parser/sdp.h
index 41fc209..ed55a23 100644
--- a/tools/parser/sdp.h
+++ b/tools/parser/sdp.h
@@ -66,7 +66,7 @@
 #define SDP_UUID_AV_REMOTE_TARGET                      0x110c /* AVRCP */
 #define SDP_UUID_ADVANCED_AUDIO                        0x110d /* A2DP */
 #define SDP_UUID_AV_REMOTE                             0x110e /* AVRCP */
-#define SDP_UUID_VIDEO_CONFERENCING                    0x110f /* VCP */
+#define SDP_UUID_AV_REMOTE_CONTROLLER                  0x110f /* AVRCP */
 #define SDP_UUID_INTERCOM                              0x1110
 #define SDP_UUID_FAX                                   0x1111
 #define SDP_UUID_HEADSET_AUDIO_GATEWAY                 0x1112
@@ -93,7 +93,6 @@
 #define SDP_UUID_HCR_PRINT                             0x1126 /* HCRP */
 #define SDP_UUID_HCR_SCAN                              0x1127 /* HCRP */
 #define SDP_UUID_COMMON_ISDN_ACCESS                    0x1128 /* CIP */
-#define SDP_UUID_VIDEO_CONFERENCING_GW                 0x1129 /* VCP */
 #define SDP_UUID_UDI_MT                                0x112a /* UDI */
 #define SDP_UUID_UDI_TA                                0x112b /* UDI */
 #define SDP_UUID_AUDIO_VIDEO                           0x112c /* VCP */
-- 
1.8.3.1


^ permalink raw reply related

* [PATCH BlueZ 6/7] tools/sdptool: Fix parsing for service class 0x110f
From: Luiz Augusto von Dentz @ 2013-10-09 11:11 UTC (permalink / raw)
  To: linux-bluetooth
In-Reply-To: <1381317105-10729-1-git-send-email-luiz.dentz@gmail.com>

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

According to assigned number 0x110f is AV Remote Controller not VCP.
---
 tools/sdptool.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/tools/sdptool.c b/tools/sdptool.c
index c241655..f985b1e 100644
--- a/tools/sdptool.c
+++ b/tools/sdptool.c
@@ -286,7 +286,7 @@ static struct uuid_def uuid16_names[] = {
 	{ 0x110c, "RemoteControlTarget", NULL, 0 },
 	{ 0x110d, "AdvancedAudio", NULL, 0 },
 	{ 0x110e, "RemoteControl", NULL, 0 },
-	{ 0x110f, "VideoConferencing", NULL, 0 },
+	{ 0x110f, "RemoteControlController", NULL, 0 },
 	{ 0x1110, "Intercom", NULL, 0 },
 	{ 0x1111, "Fax", NULL, 0 },
 	{ 0x1112, "HeadsetAudioGateway", NULL, 0 },
@@ -316,7 +316,6 @@ static struct uuid_def uuid16_names[] = {
 	{ 0x1126, "HCR_Print (HCR)", NULL, 0 },
 	{ 0x1127, "HCR_Scan (HCR)", NULL, 0 },
 	{ 0x1128, "Common ISDN Access (CIP)", NULL, 0 },
-	{ 0x1129, "VideoConferencingGW (VCP)", NULL, 0 },
 	{ 0x112a, "UDI-MT", NULL, 0 },
 	{ 0x112b, "UDI-TA", NULL, 0 },
 	{ 0x112c, "Audio/Video", NULL, 0 },
-- 
1.8.3.1


^ permalink raw reply related

* [PATCH BlueZ 5/7] profiles/AVRCP: Add AV Remote Controller service class id to CT
From: Luiz Augusto von Dentz @ 2013-10-09 11:11 UTC (permalink / raw)
  To: linux-bluetooth
In-Reply-To: <1381317105-10729-1-git-send-email-luiz.dentz@gmail.com>

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

Both AV Remote and AV Remote Controller service classes are mandatory
by AVRCP CT role from 1.3 onwards. Also the assigned numbers page mention
that AV Remote must appear before AV Remote Controller:

  "The AVRCP specification v1.3 and later require that 0x110E also be
  included in the ServiceClassIDList before 0x110F for backwards
  compatibility."
---
 profiles/audio/avrcp.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/profiles/audio/avrcp.c b/profiles/audio/avrcp.c
index b1b2ae6..296067c 100644
--- a/profiles/audio/avrcp.c
+++ b/profiles/audio/avrcp.c
@@ -263,7 +263,7 @@ static void avrcp_register_notification(struct avrcp *session, uint8_t event);
 static sdp_record_t *avrcp_ct_record(void)
 {
 	sdp_list_t *svclass_id, *pfseq, *apseq, *apseq1, *root;
-	uuid_t root_uuid, l2cap, avctp, avrct;
+	uuid_t root_uuid, l2cap, avctp, avrct, avrctr;
 	sdp_profile_desc_t profile[1];
 	sdp_list_t *aproto, *aproto1, *proto[2], *proto1[2];
 	sdp_record_t *record;
@@ -287,6 +287,8 @@ static sdp_record_t *avrcp_ct_record(void)
 	/* Service Class ID List */
 	sdp_uuid16_create(&avrct, AV_REMOTE_SVCLASS_ID);
 	svclass_id = sdp_list_append(0, &avrct);
+	sdp_uuid16_create(&avrctr, AV_REMOTE_CONTROLLER_SVCLASS_ID);
+	svclass_id = sdp_list_append(svclass_id, &avrctr);
 	sdp_set_service_classes(record, svclass_id);
 
 	/* Protocol Descriptor List */
-- 
1.8.3.1


^ permalink raw reply related

* [PATCH BlueZ 4/7] lib/sdp: Replace VIDEO_CONF_SVCLASS_ID with AV_REMOTE_CONTROLLER_SVCLASS_ID
From: Luiz Augusto von Dentz @ 2013-10-09 11:11 UTC (permalink / raw)
  To: linux-bluetooth
In-Reply-To: <1381317105-10729-1-git-send-email-luiz.dentz@gmail.com>

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

VCP apparently was never adopted so 0x110f was latter reused by AVRCP 1.3
controller as per current assigned numbers page:

https://www.bluetooth.org/en-us/specification/assigned-numbers/service-discovery
---
 lib/sdp.c         | 2 +-
 lib/sdp.h         | 2 +-
 src/glib-helper.c | 1 -
 3 files changed, 2 insertions(+), 3 deletions(-)

diff --git a/lib/sdp.c b/lib/sdp.c
index 1405c50..cbdf15e 100644
--- a/lib/sdp.c
+++ b/lib/sdp.c
@@ -125,7 +125,7 @@ static struct tupla ServiceClass[] = {
 	{ AV_REMOTE_TARGET_SVCLASS_ID,		"AV Remote Target"		},
 	{ ADVANCED_AUDIO_SVCLASS_ID,		"Advanced Audio"		},
 	{ AV_REMOTE_SVCLASS_ID,			"AV Remote"			},
-	{ VIDEO_CONF_SVCLASS_ID,		"Video Conferencing"		},
+	{ AV_REMOTE_CONTROLLER_SVCLASS_ID,	"AV Remote Controller"		},
 	{ INTERCOM_SVCLASS_ID,			"Intercom"			},
 	{ FAX_SVCLASS_ID,			"Fax"				},
 	{ HEADSET_AGW_SVCLASS_ID,		"Headset Audio Gateway"		},
diff --git a/lib/sdp.h b/lib/sdp.h
index 4ef2176..f2f2484 100644
--- a/lib/sdp.h
+++ b/lib/sdp.h
@@ -95,7 +95,7 @@ extern "C" {
 #define AV_REMOTE_TARGET_SVCLASS_ID	0x110c
 #define ADVANCED_AUDIO_SVCLASS_ID	0x110d
 #define AV_REMOTE_SVCLASS_ID		0x110e
-#define VIDEO_CONF_SVCLASS_ID		0x110f
+#define AV_REMOTE_CONTROLLER_SVCLASS_ID	0x110f
 #define INTERCOM_SVCLASS_ID		0x1110
 #define FAX_SVCLASS_ID			0x1111
 #define HEADSET_AGW_SVCLASS_ID		0x1112
diff --git a/src/glib-helper.c b/src/glib-helper.c
index a9a9a6e..4a020e9 100644
--- a/src/glib-helper.c
+++ b/src/glib-helper.c
@@ -103,7 +103,6 @@ static struct {
 	const char	*name;
 	uint16_t	class;
 } bt_services[] = {
-	{ "vcp",	VIDEO_CONF_SVCLASS_ID		},
 	{ "pbap",	PBAP_SVCLASS_ID			},
 	{ "sap",	SAP_SVCLASS_ID			},
 	{ "ftp",	OBEX_FILETRANS_SVCLASS_ID	},
-- 
1.8.3.1


^ permalink raw reply related

* [PATCH BlueZ 3/7] obexd/MAP: Fix parsing message handles as decimal numbers
From: Luiz Augusto von Dentz @ 2013-10-09 11:11 UTC (permalink / raw)
  To: linux-bluetooth
In-Reply-To: <1381317105-10729-1-git-send-email-luiz.dentz@gmail.com>

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

The spec clearly states the handles are hexadecimal:

MAP 1.2 - Page 29

  ""handle" is the message handle in hexadecimal representation with up
  to 16 digits; leading zero digits may be used so the MCE shall accept
  both handles with and without leading zeros (e.g.,"00000012345678AB"
  or "12345678AB")."
---
 obexd/client/map.c | 12 ++++++------
 obexd/client/mns.c |  2 +-
 2 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/obexd/client/map.c b/obexd/client/map.c
index 9d90a92..d2d3d81 100644
--- a/obexd/client/map.c
+++ b/obexd/client/map.c
@@ -435,7 +435,7 @@ static DBusMessage *map_msg_get(DBusConnection *connection,
 	GError *err = NULL;
 	DBusMessage *reply;
 	GObexApparam *apparam;
-	char handle[21];
+	char handle[17];
 
 	if (dbus_message_get_args(message, NULL,
 				DBUS_TYPE_STRING, &target_file,
@@ -444,7 +444,7 @@ static DBusMessage *map_msg_get(DBusConnection *connection,
 		return g_dbus_create_error(message,
 				ERROR_INTERFACE ".InvalidArguments", NULL);
 
-	if (snprintf(handle, sizeof(handle), "%" PRIu64, msg->handle) < 0)
+	if (snprintf(handle, sizeof(handle), "%" PRIx64, msg->handle) < 0)
 		goto fail;
 
 	transfer = obc_transfer_get("x-bt/message", handle, target_file, &err);
@@ -730,7 +730,7 @@ static void set_status(const GDBusPropertyTable *property,
 	GError *err = NULL;
 	GObexApparam *apparam;
 	char contents[1];
-	char handle[21];
+	char handle[17];
 
 	if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_BOOLEAN) {
 		g_dbus_pending_property_error(id,
@@ -743,7 +743,7 @@ static void set_status(const GDBusPropertyTable *property,
 
 	contents[0] = FILLER_BYTE;
 
-	if (snprintf(handle, sizeof(handle), "%" PRIu64, msg->handle) < 0)
+	if (snprintf(handle, sizeof(handle), "%" PRIx64, msg->handle) < 0)
 		goto fail;
 
 	transfer = obc_transfer_put("x-bt/messageStatus", handle, NULL,
@@ -1110,7 +1110,7 @@ static void msg_element(GMarkupParseContext *ctxt, const char *element,
 			break;
 	}
 
-	handle = strtoull(values[i], NULL, 10);
+	handle = strtoull(values[i], NULL, 16);
 
 	msg = g_hash_table_lookup(data->messages, &handle);
 	if (msg == NULL) {
@@ -1897,7 +1897,7 @@ static void map_handle_notification(struct map_event *event, void *user_data)
 
 	DBG("Event report for %s:%d", obc_session_get_destination(map->session),
 							map->mas_instance_id);
-	DBG("type=%x handle=%" PRIu64 " folder=%s old_folder=%s msg_type=%s",
+	DBG("type=%x handle=%" PRIx64 " folder=%s old_folder=%s msg_type=%s",
 		event->type, event->handle, event->folder, event->old_folder,
 		event->msg_type);
 
diff --git a/obexd/client/mns.c b/obexd/client/mns.c
index 2d2730d..d638886 100644
--- a/obexd/client/mns.c
+++ b/obexd/client/mns.c
@@ -185,7 +185,7 @@ static void parse_event_report_type(struct map_event *event, const char *value)
 static void parse_event_report_handle(struct map_event *event,
 							const char *value)
 {
-	event->handle = strtoull(value, NULL, 10);
+	event->handle = strtoull(value, NULL, 16);
 }
 
 static void parse_event_report_folder(struct map_event *event,
-- 
1.8.3.1


^ permalink raw reply related

* [PATCH BlueZ 2/7] obexd/MAP: Fix sending \0 after filler byte
From: Luiz Augusto von Dentz @ 2013-10-09 11:11 UTC (permalink / raw)
  To: linux-bluetooth
In-Reply-To: <1381317105-10729-1-git-send-email-luiz.dentz@gmail.com>

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

It is not necessary to append \0 after the filler byte (0x30), the spec
just talk about the a byte not bytes.
---
 obexd/client/map.c | 9 +++------
 1 file changed, 3 insertions(+), 6 deletions(-)

diff --git a/obexd/client/map.c b/obexd/client/map.c
index 4373d74..9d90a92 100644
--- a/obexd/client/map.c
+++ b/obexd/client/map.c
@@ -729,7 +729,7 @@ static void set_status(const GDBusPropertyTable *property,
 	gboolean value;
 	GError *err = NULL;
 	GObexApparam *apparam;
-	char contents[2];
+	char contents[1];
 	char handle[21];
 
 	if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_BOOLEAN) {
@@ -742,7 +742,6 @@ static void set_status(const GDBusPropertyTable *property,
 	dbus_message_iter_get_basic(iter, &value);
 
 	contents[0] = FILLER_BYTE;
-	contents[1] = '\0';
 
 	if (snprintf(handle, sizeof(handle), "%" PRIu64, msg->handle) < 0)
 		goto fail;
@@ -1612,13 +1611,12 @@ static DBusMessage *map_update_inbox(DBusConnection *connection,
 {
 	struct map_data *map = user_data;
 	DBusMessage *reply;
-	char contents[2];
+	char contents[1];
 	struct obc_transfer *transfer;
 	GError *err = NULL;
 	struct pending_request *request;
 
 	contents[0] = FILLER_BYTE;
-	contents[1] = '\0';
 
 	transfer = obc_transfer_put("x-bt/MAP-messageUpdate", NULL, NULL,
 						contents, sizeof(contents),
@@ -1935,7 +1933,7 @@ static bool set_notification_registration(struct map_data *map, bool status)
 	struct obc_transfer *transfer;
 	GError *err = NULL;
 	GObexApparam *apparam;
-	char contents[2];
+	char contents[1];
 	const char *address;
 
 	address = obc_session_get_destination(map->session);
@@ -1951,7 +1949,6 @@ static bool set_notification_registration(struct map_data *map, bool status)
 	}
 
 	contents[0] = FILLER_BYTE;
-	contents[1] = '\0';
 
 	transfer = obc_transfer_put("x-bt/MAP-NotificationRegistration", NULL,
 					NULL, contents, sizeof(contents), &err);
-- 
1.8.3.1


^ permalink raw reply related

* [PATCH BlueZ 1/7] core/profile: Fix MNS record version
From: Luiz Augusto von Dentz @ 2013-10-09 11:11 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

To be able to use OBEX over L2CAP the version number should be at least
0x102, in addition to that ERTM mode should be used to comply to
GOEP 2.0.
---
 src/profile.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/profile.c b/src/profile.c
index e2473a6..6e769c6 100644
--- a/src/profile.c
+++ b/src/profile.c
@@ -1996,9 +1996,10 @@ static struct default_settings {
 		.name		= "Message Notification",
 		.channel	= MNS_DEFAULT_CHANNEL,
 		.psm		= BTD_PROFILE_PSM_AUTO,
+		.mode		= BT_IO_MODE_ERTM,
 		.authorize	= true,
 		.get_record	= get_mns_record,
-		.version	= 0x0100
+		.version	= 0x0102
 	},
 };
 
-- 
1.8.3.1


^ permalink raw reply related

* [PATCHv3 15/15] android: Add makefile for hcitool
From: Andrei Emeltchenko @ 2013-10-08 14:51 UTC (permalink / raw)
  To: linux-bluetooth
In-Reply-To: <1381243883-2745-1-git-send-email-Andrei.Emeltchenko.news@gmail.com>

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

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

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


^ permalink raw reply related

* [PATCHv3 14/15] android: Add makefile for hciconfig
From: Andrei Emeltchenko @ 2013-10-08 14:51 UTC (permalink / raw)
  To: linux-bluetooth
In-Reply-To: <1381243883-2745-1-git-send-email-Andrei.Emeltchenko.news@gmail.com>

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

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

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


^ permalink raw reply related

* [PATCHv3 13/15] android: Handle mgmt changed events
From: Andrei Emeltchenko @ 2013-10-08 14:51 UTC (permalink / raw)
  To: linux-bluetooth
In-Reply-To: <1381243883-2745-1-git-send-email-Andrei.Emeltchenko.news@gmail.com>

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

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

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


^ permalink raw reply related

* [PATCHv3 12/15] android: Implement read_info_complete callback
From: Andrei Emeltchenko @ 2013-10-08 14:51 UTC (permalink / raw)
  To: linux-bluetooth
In-Reply-To: <1381243883-2745-1-git-send-email-Andrei.Emeltchenko.news@gmail.com>

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

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

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


^ permalink raw reply related

* [PATCHv3 11/15] android: Add cap to bind to port < 1024
From: Andrei Emeltchenko @ 2013-10-08 14:51 UTC (permalink / raw)
  To: linux-bluetooth
In-Reply-To: <1381243883-2745-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 |   71 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 configure.ac   |    4 ++++
 2 files changed, 75 insertions(+)

diff --git a/android/main.c b/android/main.c
index 7968ed0..a100013 100644
--- a/android/main.c
+++ b/android/main.c
@@ -32,6 +32,22 @@
 #include <stdlib.h>
 #include <stdbool.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) || (PLATFORM_SDK_VERSION > 17)
+#include <sys/capability.h>
+#endif
+
+#if defined(ANDROID)
+#include <private/android_filesystem_config.h>
+#endif
 
 #include <glib.h>
 
@@ -279,6 +295,58 @@ static void cleanup_mgmt_interface(void)
 	mgmt_if = NULL;
 }
 
+static bool android_set_aid_and_cap(void)
+{
+	struct __user_cap_header_struct header;
+	struct __user_cap_data_struct cap;
+#if defined(ANDROID)
+	gid_t groups[] = {AID_NET_BT, AID_NET_BT_ADMIN, AID_NET_ADMIN};
+#endif
+
+	DBG("pid %d uid %d gid %d", getpid(), getuid(), getgid());
+
+	header.version = _LINUX_CAPABILITY_VERSION;
+
+	prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0);
+
+#if defined(ANDROID)
+	if (setgid(AID_BLUETOOTH) < 0)
+		warn("%s: setgid(): %s", __func__, strerror(errno));
+
+	if (setuid(AID_BLUETOOTH) < 0)
+		warn("%s: setuid(): %s", __func__, strerror(errno));
+#endif
+
+	header.version = _LINUX_CAPABILITY_VERSION;
+	header.pid = 0;
+
+	cap.effective = cap.permitted =
+		CAP_TO_MASK(CAP_SETGID) |
+		CAP_TO_MASK(CAP_NET_RAW) |
+		CAP_TO_MASK(CAP_NET_ADMIN) |
+		CAP_TO_MASK(CAP_NET_BIND_SERVICE);
+	cap.inheritable = 0;
+
+	if (capset(&header, &cap) < 0) {
+		error("%s: capset(): %s", __func__, strerror(errno));
+		return false;
+	}
+
+#if defined(ANDROID)
+	if (setgroups(sizeof(groups)/sizeof(groups[0]), groups) < 0)
+		warn("%s: setgroups: %s", __func__, strerror(errno));
+#endif
+	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);
+
+	DBG("pid %d uid %d gid %d", getpid(), getuid(), getgid());
+
+	return true;
+}
+
 int main(int argc, char *argv[])
 {
 	GOptionContext *context;
@@ -312,6 +380,9 @@ int main(int argc, char *argv[])
 	sigaction(SIGINT, &sa, NULL);
 	sigaction(SIGTERM, &sa, NULL);
 
+	if (android_set_aid_and_cap() == false)
+		exit(EXIT_FAILURE);
+
 	init_mgmt_interface();
 	sdp_start();
 
diff --git a/configure.ac b/configure.ac
index 7b1f64a..5406434 100644
--- a/configure.ac
+++ b/configure.ac
@@ -247,4 +247,8 @@ AC_ARG_ENABLE(android, AC_HELP_STRING([--enable-android],
 					[enable_android=${enableval}])
 AM_CONDITIONAL(ANDROID, test "${enable_android}" = "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

* [PATCHv3 10/15] android: sdp: Reuse BlueZ SDP server in Android
From: Andrei Emeltchenko @ 2013-10-08 14:51 UTC (permalink / raw)
  To: linux-bluetooth
In-Reply-To: <1381243883-2745-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 |    2 --
 android/main.c       |   28 ++++++++++++++++++++++++++++
 4 files changed, 40 insertions(+), 4 deletions(-)

diff --git a/Makefile.android b/Makefile.android
index 9a2c486..d576b52 100644
--- a/Makefile.android
+++ b/Makefile.android
@@ -2,9 +2,12 @@ if ANDROID
 noinst_PROGRAMS += android/bluetoothd
 
 android_bluetoothd_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_bluetoothd_LDADD = @GLIB_LIBS@
+				src/shared/mgmt.h src/shared/mgmt.c \
+				android/bt_adapter.h android/bt_adapter.c
+android_bluetoothd_LDADD = lib/libbluetooth-internal.la @GLIB_LIBS@
 endif
 
 EXTRA_DIST += android/Android.mk android/log.c
diff --git a/android/Android.mk b/android/Android.mk
index 8f95a66..e7a70d0 100644
--- a/android/Android.mk
+++ b/android/Android.mk
@@ -17,6 +17,11 @@ LOCAL_SRC_FILES := \
 	log.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) \
@@ -25,6 +30,7 @@ LOCAL_C_INCLUDES := \
 LOCAL_C_INCLUDES += \
 	$(LOCAL_PATH)/../ \
 	$(LOCAL_PATH)/../src \
+	$(LOCAL_PATH)/../lib \
 
 LOCAL_CFLAGS := -DVERSION=\"$(BLUEZ_VERSION)\"
 
@@ -39,6 +45,7 @@ LOCAL_CFLAGS += -DSOCK_CLOEXEC=02000000 -DSOCK_NONBLOCK=04000
 
 LOCAL_SHARED_LIBRARIES := \
 	libglib \
+	libbluetooth \
 
 LOCAL_MODULE := bluetoothd
 LOCAL_REQUIRED_MODULES := libbluetooth
diff --git a/android/bt_adapter.c b/android/bt_adapter.c
index e21d50c..6b758bf 100644
--- a/android/bt_adapter.c
+++ b/android/bt_adapter.c
@@ -45,8 +45,6 @@ void adapter_start(struct bt_adapter *adapter)
 
 	/* TODO: CB: report scan mode */
 
-	/* TODO: SDP start here */
-
 	/* TODO: CB: report state on */
 }
 
diff --git a/android/main.c b/android/main.c
index 3580ac7..7968ed0 100644
--- a/android/main.c
+++ b/android/main.c
@@ -36,6 +36,8 @@
 #include <glib.h>
 
 #include "log.h"
+#include "hcid.h"
+#include "sdpd.h"
 
 #include "lib/bluetooth.h"
 #include "lib/mgmt.h"
@@ -43,12 +45,36 @@
 
 #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;
 
+static 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);
+}
+
+static void sdp_stop(void)
+{
+	DBG("");
+
+	/* TODO: add logic */
+
+	stop_sdp_server();
+}
+
 static gboolean quit_eventloop(gpointer user_data)
 {
 	g_main_loop_quit(event_loop);
@@ -287,11 +313,13 @@ int main(int argc, char *argv[])
 	sigaction(SIGTERM, &sa, NULL);
 
 	init_mgmt_interface();
+	sdp_start();
 
 	DBG("Entering main loop");
 
 	g_main_loop_run(event_loop);
 
+	sdp_stop();
 	cleanup_mgmt_interface();
 	g_main_loop_unref(event_loop);
 
-- 
1.7.10.4


^ permalink raw reply related

* [PATCHv3 09/15] android: Add Android Makefile for libbluetooth
From: Andrei Emeltchenko @ 2013-10-08 14:51 UTC (permalink / raw)
  To: linux-bluetooth
In-Reply-To: <1381243883-2745-1-git-send-email-Andrei.Emeltchenko.news@gmail.com>

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

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

diff --git a/android/Android.mk b/android/Android.mk
index f5fd863..8f95a66 100644
--- a/android/Android.mk
+++ b/android/Android.mk
@@ -41,6 +41,7 @@ LOCAL_SHARED_LIBRARIES := \
 	libglib \
 
 LOCAL_MODULE := bluetoothd
+LOCAL_REQUIRED_MODULES := libbluetooth
 
 include $(BUILD_EXECUTABLE)
 
@@ -63,3 +64,55 @@ 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
+
+# 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)/../lib/bluetooth)
+
+$(foreach file,$(lib_headers), $(shell ln -sf ../$(file) $(LOCAL_PATH)/../lib/bluetooth/$(file)))
+
+LOCAL_MODULE := libbluetooth
+
+include $(BUILD_SHARED_LIBRARY)
-- 
1.7.10.4


^ permalink raw reply related

* [PATCHv3 08/15] android: Add adapter and device struct for BlueZ daemon
From: Andrei Emeltchenko @ 2013-10-08 14:51 UTC (permalink / raw)
  To: linux-bluetooth
In-Reply-To: <1381243883-2745-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

* [PATCHv3 07/15] android: Create HAL API header skeleton
From: Andrei Emeltchenko @ 2013-10-08 14:51 UTC (permalink / raw)
  To: linux-bluetooth
In-Reply-To: <1381243883-2745-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 |  255 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 255 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..c6bc883
--- /dev/null
+++ b/android/hal_msg.h
@@ -0,0 +1,255 @@
+/*
+ *
+ *  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_SOCK		2
+#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 */
+
+#define HAL_MSG_OP_ERROR		0x00
+struct hal_msg_rp_error {
+	uint8_t status;
+} __packed;
+
+#define HAL_MSG_OP_REGISTER_MODULE	0x01
+struct hal_msg_cp_register_module {
+	uint8_t service_id;
+} __packed;
+struct hal_msg_rp_register_module {
+	uint8_t service_id;
+} __packed;
+
+#define HAL_MSG_OP_UNREGISTER_MODULE	0x02
+struct hal_msg_cp_unregister_module {
+	uint8_t service_id;
+} __packed;
+
+/* Bluetooth Core HAL API */
+
+#define HAL_MSG_OP_BT_ENABLE		0x01
+
+#define HAL_MSG_OP_BT_DISABLE		0x02
+
+#define HAL_MSG_OP_BT_GET_ADAPTER_PROPS	0x03
+
+#define HAL_MSG_OP_BT_GET_ADAPTER_PROP	0x04
+struct hal_msg_cp_bt_get_adapter_prop {
+	uint8_t type;
+} __packed;
+
+#define HAL_MSG_OP_BT_SET_ADAPTER_PROP	0x05
+struct hal_msg_cp_bt_set_adapter_prop {
+	uint8_t type;
+	uint16_t len;
+	uint8_t val[0];
+} __packed;
+
+#define HAL_MSG_OP_BT_GET_REMOTE_DEVICE_PROPS	0x06
+struct hal_msg_cp_bt_get_remote_device_props {
+	__bdaddr_t bdaddr;
+} __packed;
+
+#define HAL_MSG_OP_BT_GET_REMOTE_DEVICE_PROP	0x07
+struct hal_msg_cp_bt_get_remote_device_prop {
+	__bdaddr_t bdaddr;
+	uint8_t type;
+} __packed;
+
+#define HAL_MSG_OP_BT_SET_REMOTE_DEVICE_PROP	0x08
+struct hal_msg_cp_bt_set_remote_device_prop {
+	__bdaddr_t bdaddr;
+	uint8_t type;
+	uint16_t len;
+	uint8_t val[0];
+} __packed;
+
+#define HAL_MSG_OP_BT_GET_REMOTE_SERVICE_REC	0x09
+struct hal_msg_cp_bt_get_remote_service_rec {
+	__bdaddr_t bdaddr;
+	uint8_t uuid[16];
+} __packed;
+
+#define HAL_MSG_OP_BT_GET_REMOTE_SERVICE	0x0a
+struct hal_msg_cp_bt_get_remote_service {
+	__bdaddr_t bdaddr;
+} __packed;
+
+#define HAL_MSG_OP_BT_START_DISCOVERY	0x0b
+
+#define HAL_MSG_OP_BT_CANCEL_DISCOVERY	0x0c
+
+#define HAL_MSG_OP_BT_CREATE_BOND	0x0d
+struct hal_msg_cp_bt_create_bond {
+	__bdaddr_t bdaddr;
+} __packed;
+
+#define HAL_MSG_OP_BT_REMOVE_BOND	0x0d
+struct hal_msg_cp_bt_remove_bond {
+	__bdaddr_t bdaddr;
+} __packed;
+
+#define HAL_MSG_OP_BT_CANCEL_BOND	0x0f
+struct hal_msg_cp_bt_cancel_bond {
+	__bdaddr_t bdaddr;
+} __packed;
+
+#define HAL_MSG_OP_BT_PIN_REPLY		0x10
+struct hal_msg_cp_bt_pin_reply {
+	__bdaddr_t bdaddr;
+	uint8_t accept;
+	uint8_t pin_len;
+	uint8_t pin_code[16];
+} __packed;
+
+#define HAL_MSG_OP_BT_SSP_REPLY		0x11
+struct hal_msg_cp_bt_ssp_reply {
+	__bdaddr_t bdaddr;
+	uint8_t ssp_variant;
+	uint8_t accept;
+	uint32_t passkey;
+} __packed;
+
+#define HAL_MSG_OP_BT_DUT_MODE_CONF	0x12
+struct hal_msg_cp_bt_dut_mode_conf {
+	uint8_t enable;
+} __packed;
+
+#define HAL_MSG_OP_BT_DUT_MODE_SEND	0x13
+struct hal_msg_cp_bt_dut_mode_send {
+	uint16_t opcode;
+	uint8_t len;
+	uint8_t data[0];
+} __packed;
+
+#define HAL_MSG_OP_BT_LE_TEST_MODE	0x14
+struct hal_msg_cp_bt_le_test_mode {
+	uint16_t opcode;
+	uint8_t len;
+	uint8_t data[0];
+} __packed;
+
+/* Notifications and confirmations */
+
+#define HAL_MSG_EV_BT_ERROR			0x80
+
+#define HAL_MSG_EV_BT_ADAPTER_STATE_CHANGED	0x81
+struct hal_msg_ev_bt_adapter_state_changed {
+	uint8_t state;
+} __packed;
+
+#define HAL_MSG_EV_BT_ADAPTER_PROPS_CHANGED	0x82
+struct hal_property {
+	uint8_t type;
+	uint16_t len;
+	uint8_t val[0];
+} __packed;
+struct hal_msg_ev_bt_adapter_props_changed {
+	uint8_t status;
+	uint8_t num_props;
+	struct hal_property props[0];
+} __packed;
+
+#define HAL_MSG_EV_BT_REMOTE_DEVICE_PROPS	0x83
+struct hal_msg_ev_bt_remote_device_props {
+	uint8_t status;
+	__bdaddr_t bdaddr;
+	uint8_t num_props;
+	struct hal_property props[0];
+} __packed;
+
+#define HAL_MSG_EV_BT_DEVICE_FOUND		0x84
+struct hal_msg_ev_bt_device_found {
+	uint8_t num_props;
+	struct hal_property props[0];
+} __packed;
+
+#define HAL_MSG_EV_BT_DISCOVERY_STATE_CHANGED	0x85
+struct hal_msg_ev_bt_discovery_state_changed {
+	uint8_t state;
+} __packed;
+
+#define HAL_MSG_EV_BT_PIN_REQUEST		0x86
+struct hal_msg_ev_bt_pin_request {
+	__bdaddr_t bdaddr;
+	uint8_t name[249 - 1];
+	uint8_t class_of_dev[3];
+} __packed;
+
+#define HAL_MSG_EV_BT_SSP_REQUEST		0x87
+struct hal_msg_ev_bt_ssp_request {
+	__bdaddr_t bdaddr;
+	uint8_t name[249 - 1];
+	uint8_t class_of_dev[3];
+	uint8_t pairing_variant;
+	uint32_t passkey;
+} __packed;
+
+#define HAL_MSG_EV_BT_BOND_STATE_CHANGED	0x88
+struct hal_msg_ev_bt_bond_state_changed {
+	uint8_t status;
+	__bdaddr_t bdaddr;
+	uint8_t state;
+} __packed;
+
+#define HAL_MSG_EV_BT_ACL_STATE_CHANGED		0x89
+struct hal_msg_ev_bt_acl_state_changed {
+	uint8_t status;
+	__bdaddr_t bdaddr;
+	uint8_t state;
+} __packed;
+
+#define HAL_MSG_EV_BT_DUT_MODE_RECEIVE		0x8a
+struct hal_msg_ev_bt_dut_mode_receive {
+	uint16_t opcode;
+	uint8_t len;
+	uint8_t data[0];
+} __packed;
+
+#define HAL_MSG_EV_BT_LE_TEST_MODE		0x8b
+struct hal_msg_ev_bt_le_test_mode {
+	uint8_t status;
+	uint16_t num_packets;
+} __packed;
-- 
1.7.10.4


^ permalink raw reply related

* [PATCHv3 06/15] android: Add basic mgmt initialization sequence
From: Andrei Emeltchenko @ 2013-10-08 14:51 UTC (permalink / raw)
  To: linux-bluetooth
In-Reply-To: <1381243883-2745-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 e161e6d..9a2c486 100644
--- a/Makefile.android
+++ b/Makefile.android
@@ -1,7 +1,9 @@
 if ANDROID
 noinst_PROGRAMS += android/bluetoothd
 
-android_bluetoothd_SOURCES = android/main.c src/log.c
+android_bluetoothd_SOURCES = android/main.c src/log.c \
+				src/shared/util.h src/shared/util.c \
+				src/shared/mgmt.h src/shared/mgmt.c
 android_bluetoothd_LDADD = @GLIB_LIBS@
 endif
 
diff --git a/android/Android.mk b/android/Android.mk
index 2cabff4..f5fd863 100644
--- a/android/Android.mk
+++ b/android/Android.mk
@@ -15,10 +15,15 @@ include $(CLEAR_VARS)
 LOCAL_SRC_FILES := \
 	main.c \
 	log.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)\"
@@ -26,6 +31,12 @@ LOCAL_CFLAGS := -DVERSION=\"$(BLUEZ_VERSION)\"
 # to suppress the "warning: missing initializer near initialization.." warning
 LOCAL_CFLAGS += -Wno-missing-field-initializers
 
+# 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 f75b0a8..3580ac7 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 "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;
 
 static gboolean quit_eventloop(gpointer user_data)
 {
@@ -67,6 +76,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;
@@ -100,10 +286,13 @@ int main(int argc, char *argv[])
 	sigaction(SIGINT, &sa, NULL);
 	sigaction(SIGTERM, &sa, NULL);
 
+	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


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