* [PATCH v3 1/5] android/bluetooth: Split devices list to devices and bonded_devices
From: Szymon Janc @ 2014-01-23 22:18 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Szymon Janc
In-Reply-To: <1390515490-29538-1-git-send-email-szymon.janc@gmail.com>
Bonded devices are permament until unbondedn. Non-bonded devices will
be held in (size limited) cache based on timestamp property so split
list to ease separation.
---
android/bluetooth.c | 48 ++++++++++++++++++++++++++++++++++++------------
1 file changed, 36 insertions(+), 12 deletions(-)
diff --git a/android/bluetooth.c b/android/bluetooth.c
index 4849dab..5d222e1 100644
--- a/android/bluetooth.c
+++ b/android/bluetooth.c
@@ -132,6 +132,8 @@ static const uint16_t uuid_list[] = {
static uint16_t option_index = MGMT_INDEX_NONE;
static struct mgmt *mgmt_if = NULL;
+
+static GSList *bonded_devices = NULL;
static GSList *devices = NULL;
/* This list contains addresses which are asked for records */
@@ -283,6 +285,10 @@ static struct device *find_device(const bdaddr_t *bdaddr)
{
GSList *l;
+ l = g_slist_find_custom(bonded_devices, bdaddr, device_match);
+ if (l)
+ return l->data;
+
l = g_slist_find_custom(devices, bdaddr, device_match);
if (l)
return l->data;
@@ -559,12 +565,30 @@ static void set_device_bond_state(const bdaddr_t *addr, uint8_t status,
if (!dev)
return;
- if (dev->bond_state != state) {
- dev->bond_state = state;
- send_bond_state_change(&dev->bdaddr, status, state);
+ if (dev->bond_state == state)
+ return;
- store_device_info(dev);
+ switch (state) {
+ case HAL_BOND_STATE_NONE:
+ if (dev->bond_state == HAL_BOND_STATE_BONDED) {
+ bonded_devices = g_slist_remove(bonded_devices, dev);
+ devices = g_slist_prepend(devices, dev);
+ }
+ break;
+ case HAL_BOND_STATE_BONDED:
+ devices = g_slist_remove(devices, dev);
+ bonded_devices = g_slist_prepend(bonded_devices, dev);
+ break;
+ case HAL_BOND_STATE_BONDING:
+ default:
+ break;
}
+
+ dev->bond_state = state;
+
+ store_device_info(dev);
+
+ send_bond_state_change(&dev->bdaddr, status, state);
}
static void send_device_property(const bdaddr_t *bdaddr, uint8_t type,
@@ -935,6 +959,7 @@ static void mgmt_discovering_event(uint16_t index, uint16_t length,
if (adapter.discovering) {
cp.state = HAL_DISCOVERY_STATE_STARTED;
} else {
+ g_slist_foreach(bonded_devices, clear_device_found, NULL);
g_slist_foreach(devices, clear_device_found, NULL);
cp.state = HAL_DISCOVERY_STATE_STOPPED;
}
@@ -2128,18 +2153,15 @@ static uint8_t get_adapter_scan_mode(void)
static uint8_t get_adapter_bonded_devices(void)
{
- uint8_t buf[sizeof(bdaddr_t) * g_slist_length(devices)];
+ uint8_t buf[sizeof(bdaddr_t) * g_slist_length(bonded_devices)];
int i = 0;
GSList *l;
DBG("");
- for (l = devices; l; l = g_slist_next(l)) {
+ for (l = bonded_devices; l; l = g_slist_next(l)) {
struct device *dev = l->data;
- if (dev->bond_state != HAL_BOND_STATE_BONDED)
- continue;
-
bdaddr2android(&dev->bdaddr, buf + (i * sizeof(bdaddr_t)));
i++;
}
@@ -2691,11 +2713,10 @@ static void send_bonded_devices_props(void)
{
GSList *l;
- for (l = devices; l; l = g_slist_next(l)) {
+ for (l = bonded_devices; l; l = g_slist_next(l)) {
struct device *dev = l->data;
- if (dev->bond_state == HAL_BOND_STATE_BONDED)
- get_remote_device_props(dev);
+ get_remote_device_props(dev);
}
}
@@ -3093,6 +3114,9 @@ void bt_bluetooth_unregister(void)
{
DBG("");
+ g_slist_free_full(bonded_devices, (GDestroyNotify) free_device);
+ bonded_devices = NULL;
+
g_slist_free_full(devices, (GDestroyNotify) free_device);
devices = NULL;
--
1.8.5.3
^ permalink raw reply related
* [PATCH v3 0/5] Remote device cache support
From: Szymon Janc @ 2014-01-23 22:18 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Szymon Janc
V3:
- bugfixes in cache handling
V2:
- keep cache in separate file
- patch 3/5 and 4/5 from V1 squashed to 3/4
V1:
- set cache limit to 300
- update timestamp of cached device
- rebased to master
- other minor fixes
Szymon Janc (5):
android/bluetooth: Split devices list to devices and bonded_devices
android/bluetooth: Use defines for settings and devices files paths
android/bluetooth: Add support for caching remote device info
android/bluetooth: Add support for loading caches devices from storage
android/bluetooth: Rename devices list to cached_devices
android/bluetooth.c | 246 ++++++++++++++++++++++++++++++++++++++--------------
1 file changed, 183 insertions(+), 63 deletions(-)
--
1.8.5.3
^ permalink raw reply
* [PATCH BlueZ 4/4] emulator: Fix crash if socket(AF_ALG) is not support by the kernel
From: Anderson Lizardo @ 2014-01-23 21:24 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Anderson Lizardo
In-Reply-To: <1390512281-26541-1-git-send-email-anderson.lizardo@openbossa.org>
On this situation, smp_stop() was being called with NULL pointer.
Crash detected by valgrind:
==7925== Invalid read of size 4
==7925== at 0x8052F18: smp_stop (smp.c:480)
==7925== by 0x8052542: bthost_stop (bthost.c:2073)
==7925== by 0x805521D: hciemu_unref (hciemu.c:372)
==7925== by 0x8058C65: test_post_teardown (android-tester.c:464)
==7925== by 0x8055DE7: tester_teardown_complete (tester.c:533)
==7925== by 0x8055501: teardown_callback (tester.c:312)
==7925== by 0x408348F: g_idle_dispatch (gmain.c:5250)
==7925== by 0x4086A75: g_main_context_dispatch (gmain.c:3065)
==7925== by 0x4086E14: g_main_context_iterate.isra.23 (gmain.c:3712)
==7925== by 0x40872FA: g_main_loop_run (gmain.c:3906)
==7925== by 0x41744D2: (below main) (libc-start.c:226)
==7925== Address 0x8 is not stack'd, malloc'd or (recently) free'd
---
emulator/bthost.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/emulator/bthost.c b/emulator/bthost.c
index c4603ae..3ff2a36 100644
--- a/emulator/bthost.c
+++ b/emulator/bthost.c
@@ -2070,6 +2070,8 @@ bool bthost_connect_rfcomm(struct bthost *bthost, uint16_t handle,
void bthost_stop(struct bthost *bthost)
{
- smp_stop(bthost->smp_data);
- bthost->smp_data = NULL;
+ if (bthost->smp_data) {
+ smp_stop(bthost->smp_data);
+ bthost->smp_data = NULL;
+ }
}
--
1.7.9.5
^ permalink raw reply related
* [PATCH BlueZ 3/4] android: Trivial replacement of tabs where spaces are expected
From: Anderson Lizardo @ 2014-01-23 21:24 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Anderson Lizardo
In-Reply-To: <1390512281-26541-1-git-send-email-anderson.lizardo@openbossa.org>
---
android/android-tester.c | 2 +-
android/hidhost.c | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/android/android-tester.c b/android/android-tester.c
index ba9137a..870ad8d 100644
--- a/android/android-tester.c
+++ b/android/android-tester.c
@@ -3459,7 +3459,7 @@ static void setup_hidhost_connect(const void *test_data)
bthost_write_scan_enable(bthost, 0x03);
}
-static void hid_discon_cb(bt_bdaddr_t *bd_addr, bthh_connection_state_t state)
+static void hid_discon_cb(bt_bdaddr_t *bd_addr, bthh_connection_state_t state)
{
if (state == BTHH_CONN_STATE_DISCONNECTED)
tester_test_passed();
diff --git a/android/hidhost.c b/android/hidhost.c
index c01c563..fd70a1c 100644
--- a/android/hidhost.c
+++ b/android/hidhost.c
@@ -375,7 +375,7 @@ static void bt_hid_notify_get_report(struct hid_device *dev, uint8_t *buf,
if (!((buf[0] == (HID_MSG_DATA | HID_DATA_TYPE_INPUT)) ||
(buf[0] == (HID_MSG_DATA | HID_DATA_TYPE_OUTPUT)) ||
- (buf[0] == (HID_MSG_DATA | HID_DATA_TYPE_FEATURE)))) {
+ (buf[0] == (HID_MSG_DATA | HID_DATA_TYPE_FEATURE)))) {
ev = g_malloc0(ev_len);
ev->status = buf[0];
bdaddr2android(&dev->dst, ev->bdaddr);
--
1.7.9.5
^ permalink raw reply related
* [PATCH BlueZ 2/4] android: Remove useless extra parenthesis
From: Anderson Lizardo @ 2014-01-23 21:24 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Anderson Lizardo
In-Reply-To: <1390512281-26541-1-git-send-email-anderson.lizardo@openbossa.org>
---
android/android-tester.c | 4 ++--
android/bluetooth.c | 2 +-
android/ipc-tester.c | 2 +-
3 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/android/android-tester.c b/android/android-tester.c
index e4f95ce..ba9137a 100644
--- a/android/android-tester.c
+++ b/android/android-tester.c
@@ -518,7 +518,7 @@ static void emulator(int pipe, int hci_index)
memset(buf, 0, sizeof(buf));
len = read(fd, buf, sizeof(buf));
- if (len <= 0 || (strcmp(buf, "bluetooth.start=daemon")))
+ if (len <= 0 || strcmp(buf, "bluetooth.start=daemon"))
goto failed;
close(pipe);
@@ -1985,7 +1985,7 @@ static bool setup(struct test_data *data)
data->bluetoothd_pid = pid;
len = read(signal_fd[0], buf, sizeof(buf));
- if (len <= 0 || (strcmp(buf, EMULATOR_SIGNAL))) {
+ if (len <= 0 || strcmp(buf, EMULATOR_SIGNAL)) {
close(signal_fd[0]);
return false;
}
diff --git a/android/bluetooth.c b/android/bluetooth.c
index 4849dab..e2bf668 100644
--- a/android/bluetooth.c
+++ b/android/bluetooth.c
@@ -68,7 +68,7 @@
#define DEFAULT_DISCOVERABLE_TIMEOUT 120
#define BASELEN_PROP_CHANGED (sizeof(struct hal_ev_adapter_props_changed) \
- + (sizeof(struct hal_property)))
+ + sizeof(struct hal_property))
#define BASELEN_REMOTE_DEV_PROP (sizeof(struct hal_ev_remote_device_props) \
+ sizeof(struct hal_property))
diff --git a/android/ipc-tester.c b/android/ipc-tester.c
index ed0dd10..8d3e44d 100644
--- a/android/ipc-tester.c
+++ b/android/ipc-tester.c
@@ -264,7 +264,7 @@ static void emulator(int pipe, int hci_index)
memset(buf, 0, sizeof(buf));
len = read(fd, buf, sizeof(buf));
- if (len <= 0 || (strcmp(buf, "ctl.start=bluetoothd")))
+ if (len <= 0 || strcmp(buf, "ctl.start=bluetoothd"))
goto failed;
close(pipe);
--
1.7.9.5
^ permalink raw reply related
* [PATCH BlueZ 1/4] android/tester: Fix crash on failure inside setup()
From: Anderson Lizardo @ 2014-01-23 21:24 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Anderson Lizardo
In-Reply-To: <1390512281-26541-1-git-send-email-anderson.lizardo@openbossa.org>
The various setup_* functions were still continuing even though setup()
failed and did not initialize data->if_bluetooth properly.
Also do a little refactoring by moving tester_setup_failed() calls to
the setup() callers, so they stay close to the other failure points and
not hidden deep into a helper function.
Crash detected by Valgrind:
==4959== Invalid read of size 4
==4959== at 0x805967A: setup_base (android-tester.c:2029)
==4959== by 0x8055541: setup_callback (tester.c:373)
==4959== by 0x408348F: g_idle_dispatch (gmain.c:5250)
==4959== by 0x4086A75: g_main_context_dispatch (gmain.c:3065)
==4959== by 0x4086E14: g_main_context_iterate.isra.23 (gmain.c:3712)
==4959== by 0x40872FA: g_main_loop_run (gmain.c:3906)
==4959== by 0x41744D2: (below main) (libc-start.c:226)
==4959== Address 0x4 is not stack'd, malloc'd or (recently) free'd
---
android/android-tester.c | 85 +++++++++++++++++++++++++---------------------
1 file changed, 46 insertions(+), 39 deletions(-)
diff --git a/android/android-tester.c b/android/android-tester.c
index aa953bf..e4f95ce 100644
--- a/android/android-tester.c
+++ b/android/android-tester.c
@@ -1951,8 +1951,7 @@ static bt_callbacks_t bt_callbacks = {
.le_test_mode_cb = NULL
};
-
-static void setup(struct test_data *data)
+static bool setup(struct test_data *data)
{
const hw_module_t *module;
hw_device_t *device;
@@ -1962,18 +1961,15 @@ static void setup(struct test_data *data)
int len;
int err;
- if (pipe(signal_fd)) {
- tester_setup_failed();
- return;
- }
+ if (pipe(signal_fd))
+ return false;
pid = fork();
if (pid < 0) {
close(signal_fd[0]);
close(signal_fd[1]);
- tester_setup_failed();
- return;
+ return false;
}
if (pid == 0) {
@@ -1991,32 +1987,27 @@ static void setup(struct test_data *data)
len = read(signal_fd[0], buf, sizeof(buf));
if (len <= 0 || (strcmp(buf, EMULATOR_SIGNAL))) {
close(signal_fd[0]);
- tester_setup_failed();
- return;
+ return false;
}
close(signal_fd[0]);
err = hw_get_module(BT_HARDWARE_MODULE_ID, &module);
- if (err) {
- tester_setup_failed();
- return;
- }
+ if (err)
+ return false;
err = module->methods->open(module, BT_HARDWARE_MODULE_ID, &device);
- if (err) {
- tester_setup_failed();
- return;
- }
+ if (err)
+ return false;
data->device = device;
data->if_bluetooth = ((bluetooth_device_t *)
device)->get_bluetooth_interface();
- if (!data->if_bluetooth) {
- tester_setup_failed();
- return;
- }
+ if (!data->if_bluetooth)
+ return false;
+
+ return true;
}
static void setup_base(const void *test_data)
@@ -2024,7 +2015,10 @@ static void setup_base(const void *test_data)
struct test_data *data = tester_get_data();
bt_status_t status;
- setup(data);
+ if (!setup(data)) {
+ tester_setup_failed();
+ return;
+ }
status = data->if_bluetooth->init(&bt_callbacks);
if (status != BT_STATUS_SUCCESS) {
@@ -2040,7 +2034,10 @@ static void setup_enabled_adapter(const void *test_data)
struct test_data *data = tester_get_data();
bt_status_t status;
- setup(data);
+ if (!setup(data)) {
+ tester_setup_failed();
+ return;
+ }
status = data->if_bluetooth->init(&bt_callbacks);
if (status != BT_STATUS_SUCCESS) {
@@ -2786,7 +2783,10 @@ static void setup_socket_interface(const void *test_data)
bt_status_t status;
const void *sock;
- setup(data);
+ if (!setup(data)) {
+ tester_setup_failed();
+ return;
+ }
status = data->if_bluetooth->init(&bt_socket_callbacks);
if (status != BT_STATUS_SUCCESS) {
@@ -2812,7 +2812,10 @@ static void setup_socket_interface_enabled(const void *test_data)
bt_status_t status;
const void *sock;
- setup(data);
+ if (!setup(data)) {
+ tester_setup_failed();
+ return;
+ }
status = data->if_bluetooth->init(&bt_socket_callbacks);
if (status != BT_STATUS_SUCCESS) {
@@ -3158,41 +3161,42 @@ static bthh_callbacks_t bthh_callbacks = {
.virtual_unplug_cb = hidhost_virual_unplug_cb
};
-static void setup_hidhost(const void *test_data)
+static bool setup_hidhost(const void *test_data)
{
struct test_data *data = tester_get_data();
bt_status_t status;
const void *hid;
- setup(data);
+ if (!setup(data))
+ return false;
status = data->if_bluetooth->init(&bt_callbacks);
if (status != BT_STATUS_SUCCESS) {
data->if_bluetooth = NULL;
- tester_setup_failed();
- return;
+ return false;
}
hid = data->if_bluetooth->get_profile_interface(BT_PROFILE_HIDHOST_ID);
- if (!hid) {
- tester_setup_failed();
- return;
- }
+ if (!hid)
+ return false;
data->if_hid = hid;
status = data->if_hid->init(&bthh_callbacks);
if (status != BT_STATUS_SUCCESS) {
data->if_hid = NULL;
- tester_setup_failed();
- return;
+ return false;
}
+
+ return true;
}
static void setup_hidhost_interface(const void *test_data)
{
- setup_hidhost(test_data);
- tester_setup_complete();
+ if (setup_hidhost(test_data))
+ tester_setup_complete();
+ else
+ tester_setup_failed();
}
#define HID_GET_REPORT_PROTOCOL 0x60
@@ -3437,7 +3441,10 @@ static void setup_hidhost_connect(const void *test_data)
struct test_data *data = tester_get_data();
struct bthost *bthost;
- setup_hidhost(test_data);
+ if (!setup_hidhost(test_data)) {
+ tester_setup_failed();
+ return;
+ }
bthost = hciemu_client_get_host(data->hciemu);
--
1.7.9.5
^ permalink raw reply related
* [PATCH BlueZ 0/4] android: Minor fixes
From: Anderson Lizardo @ 2014-01-23 21:24 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Anderson Lizardo
Hi,
This patch set contains 2 patches fixing problems found while trying to run
android-tester on a system with some features disabled on the kernel. Two other
patches are simple cleanups.
Best Regards
Anderson Lizardo
Anderson Lizardo (4):
android/tester: Fix crash on failure inside setup()
android: Remove useless extra parenthesis
android: Trivial replacement of tabs where spaces are expected
emulator: Fix crash if socket(AF_ALG) is not support by the kernel
android/android-tester.c | 91 +++++++++++++++++++++++++---------------------
android/bluetooth.c | 2 +-
android/hidhost.c | 2 +-
android/ipc-tester.c | 2 +-
emulator/bthost.c | 6 ++-
5 files changed, 56 insertions(+), 47 deletions(-)
--
1.7.9.5
^ permalink raw reply
* Re: [PATCH] android/audio: Fix for loading audio lib
From: Luiz Augusto von Dentz @ 2014-01-23 18:09 UTC (permalink / raw)
To: Lukasz Rymanowski; +Cc: linux-bluetooth@vger.kernel.org, Szymon Janc
In-Reply-To: <1390493791-23043-1-git-send-email-lukasz.rymanowski@tieto.com>
Hi Lukasz,
On Thu, Jan 23, 2014 at 6:16 PM, Lukasz Rymanowski
<lukasz.rymanowski@tieto.com> wrote:
> Issue visible when haltest loads audio.a2dp.default.so
>
>> HAL E: load:
>> module=/home/rymanluk/devel/kitkat/external/bluetooth/bluez/android/.libs/audio.a2dp.default.so
> /home/rymanluk/devel/kitkat/external/bluetooth/bluez/android/.libs/audio.a2dp.default.so:
> undefined symbol: clock_gettime
> hw_get_module_by_class returned -22
>
> ---
> android/Makefile.am | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/android/Makefile.am b/android/Makefile.am
> index e9d9db1..f85de20 100644
> --- a/android/Makefile.am
> +++ b/android/Makefile.am
> @@ -152,7 +152,7 @@ android_audio_a2dp_default_la_CFLAGS = $(AM_CFLAGS) -I$(srcdir)/android
> android_audio_a2dp_default_la_LIBADD = @SBC_LIBS@
>
> android_audio_a2dp_default_la_LDFLAGS = $(AM_LDFLAGS) -module -avoid-version \
> - -no-undefined -pthread
> + -no-undefined -pthread -lrt
>
> endif
>
> --
> 1.8.4
Applied, just had to fix a little but the description to state why
-lrt is needed.
--
Luiz Augusto von Dentz
^ permalink raw reply
* Re: [PATCH v2 1/2] android/hal-audio: Simplify and fix locking
From: Luiz Augusto von Dentz @ 2014-01-23 18:08 UTC (permalink / raw)
To: Szymon Janc; +Cc: linux-bluetooth@vger.kernel.org
In-Reply-To: <1390490548-19697-1-git-send-email-szymon.janc@tieto.com>
Hi Szymon,
On Thu, Jan 23, 2014 at 5:22 PM, Szymon Janc <szymon.janc@tieto.com> wrote:
> This fix various issues with locking like missing unlock on
> audio_ipc_cmd() return or accesing audio_sk without holding lock.
> close_thread is removed to simplify code and shutdown on listen_sk is
> used to indicate that that handler thread should stop.
> ---
> v2: fix missing unregister_endpoints() on audio_close
>
> android/hal-audio.c | 70 +++++++++++++++++++++++++++++------------------------
> 1 file changed, 38 insertions(+), 32 deletions(-)
>
> diff --git a/android/hal-audio.c b/android/hal-audio.c
> index 4326ccd..52f8894 100644
> --- a/android/hal-audio.c
> +++ b/android/hal-audio.c
> @@ -44,10 +44,8 @@ static const uint8_t a2dp_src_uuid[] = {
>
> static int listen_sk = -1;
> static int audio_sk = -1;
> -static bool close_thread = false;
>
> static pthread_t ipc_th = 0;
> -static pthread_mutex_t close_mutex = PTHREAD_MUTEX_INITIALIZER;
> static pthread_mutex_t sk_mutex = PTHREAD_MUTEX_INITIALIZER;
>
> #if __BYTE_ORDER == __LITTLE_ENDIAN
> @@ -487,14 +485,6 @@ static ssize_t sbc_write_data(void *codec_data, const void *buffer,
> return bytes;
> }
>
> -static void audio_ipc_cleanup(void)
> -{
> - if (audio_sk >= 0) {
> - shutdown(audio_sk, SHUT_RDWR);
> - audio_sk = -1;
> - }
> -}
> -
> static int audio_ipc_cmd(uint8_t service_id, uint8_t opcode, uint16_t len,
> void *param, size_t *rsp_len, void *rsp, int *fd)
> {
> @@ -506,6 +496,8 @@ static int audio_ipc_cmd(uint8_t service_id, uint8_t opcode, uint16_t len,
> struct hal_status s;
> size_t s_len = sizeof(s);
>
> + pthread_mutex_lock(&sk_mutex);
> +
> if (audio_sk < 0) {
> error("audio: Invalid cmd socket passed to audio_ipc_cmd");
> goto failed;
> @@ -533,12 +525,9 @@ static int audio_ipc_cmd(uint8_t service_id, uint8_t opcode, uint16_t len,
> msg.msg_iov = iv;
> msg.msg_iovlen = 2;
>
> - pthread_mutex_lock(&sk_mutex);
> -
> ret = sendmsg(audio_sk, &msg, 0);
> if (ret < 0) {
> error("audio: Sending command failed:%s", strerror(errno));
> - pthread_mutex_unlock(&sk_mutex);
> goto failed;
> }
>
> @@ -570,12 +559,9 @@ static int audio_ipc_cmd(uint8_t service_id, uint8_t opcode, uint16_t len,
> if (ret < 0) {
> error("audio: Receiving command response failed:%s",
> strerror(errno));
> - pthread_mutex_unlock(&sk_mutex);
> goto failed;
> }
>
> - pthread_mutex_unlock(&sk_mutex);
> -
> if (ret < (ssize_t) sizeof(cmd)) {
> error("audio: Too small response received(%zd bytes)", ret);
> goto failed;
> @@ -611,9 +597,13 @@ static int audio_ipc_cmd(uint8_t service_id, uint8_t opcode, uint16_t len,
> goto failed;
> }
>
> + pthread_mutex_unlock(&sk_mutex);
> +
> return s->code;
> }
>
> + pthread_mutex_unlock(&sk_mutex);
> +
> /* Receive auxiliary data in msg */
> if (fd) {
> struct cmsghdr *cmsg;
> @@ -638,7 +628,8 @@ static int audio_ipc_cmd(uint8_t service_id, uint8_t opcode, uint16_t len,
> failed:
> /* Some serious issue happen on IPC - recover */
> shutdown(audio_sk, SHUT_RDWR);
> - audio_sk = -1;
> + pthread_mutex_unlock(&sk_mutex);
> +
> return AUDIO_STATUS_FAILED;
> }
>
> @@ -1311,10 +1302,10 @@ static int audio_close(hw_device_t *device)
>
> DBG("");
>
> - pthread_mutex_lock(&close_mutex);
> - audio_ipc_cleanup();
> - close_thread = true;
> - pthread_mutex_unlock(&close_mutex);
> + unregister_endpoints();
> +
> + shutdown(listen_sk, SHUT_RDWR);
> + shutdown(audio_sk, SHUT_RDWR);
>
> pthread_join(ipc_th, NULL);
>
> @@ -1329,19 +1320,31 @@ static void *ipc_handler(void *data)
> {
> bool done = false;
> struct pollfd pfd;
> + int sk;
>
> DBG("");
>
> while (!done) {
> DBG("Waiting for connection ...");
> - audio_sk = accept(listen_sk, NULL, NULL);
> - if (audio_sk < 0) {
> +
> + sk = accept(listen_sk, NULL, NULL);
> + if (sk < 0) {
> int err = errno;
> - error("audio: Failed to accept socket: %d (%s)", err,
> - strerror(err));
> - continue;
> +
> + if (err == EINTR)
> + continue;
> +
> + if (err != ECONNABORTED && err != EINVAL)
> + error("audio: Failed to accept socket: %d (%s)",
> + err, strerror(err));
> +
> + break;
> }
>
> + pthread_mutex_lock(&sk_mutex);
> + audio_sk = sk;
> + pthread_mutex_unlock(&sk_mutex);
> +
> DBG("Audio IPC: Connected");
>
> if (register_endpoints() != AUDIO_STATUS_SUCCESS) {
> @@ -1349,7 +1352,12 @@ static void *ipc_handler(void *data)
>
> unregister_endpoints();
>
> + pthread_mutex_lock(&sk_mutex);
> shutdown(audio_sk, SHUT_RDWR);
> + close(audio_sk);
> + audio_sk = -1;
> + pthread_mutex_unlock(&sk_mutex);
> +
> continue;
> }
>
> @@ -1362,14 +1370,12 @@ static void *ipc_handler(void *data)
>
> if (pfd.revents & (POLLHUP | POLLERR | POLLNVAL)) {
> info("Audio HAL: Socket closed");
> +
> + pthread_mutex_lock(&sk_mutex);
> + close(audio_sk);
> audio_sk = -1;
> + pthread_mutex_unlock(&sk_mutex);
> }
> -
> - /*Check if audio_dev is closed */
> - pthread_mutex_lock(&close_mutex);
> - done = close_thread;
> - close_thread = false;
> - pthread_mutex_unlock(&close_mutex);
> }
>
> unregister_endpoints();
> --
> 1.8.3.2
Pushed, thanks.
--
Luiz Augusto von Dentz
^ permalink raw reply
* [RFC] android: Add support for Valgrind in debug variants
From: Andrzej Kaczmarek @ 2014-01-23 17:54 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Andrzej Kaczmarek
In-Reply-To: <1390499644-8027-1-git-send-email-andrzej.kaczmarek@tieto.com>
This patch automatically builds BlueZ in a way it can be easily run
with Valgrind which is available in AOSP tree.
For userdebug and eng variant, bluetoothd will have additional
dependency to necessary Valgrind modules and bluetoothd binary will not
be stripped. Special version of init.bluetooth.rc is also provided
which defines bluetoothd service to be run using Valgrind with proper
environment and it will be installed automatically as well.
---
android/Android.mk | 13 +++++++++++++
android/init.bluetooth.rc-debug | 39 +++++++++++++++++++++++++++++++++++++++
2 files changed, 52 insertions(+)
create mode 100644 android/init.bluetooth.rc-debug
diff --git a/android/Android.mk b/android/Android.mk
index c274295..55093d2 100644
--- a/android/Android.mk
+++ b/android/Android.mk
@@ -80,6 +80,15 @@ $(foreach file,$(lib_headers), $(shell ln -sf ../$(file) $(LOCAL_PATH)/bluez/lib
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := bluetoothd
+ifneq (,$(filter userdebug eng,$(TARGET_BUILD_VARIANT)))
+LOCAL_STRIP_MODULE := false
+LOCAL_REQUIRED_MODULES := valgrind \
+ memcheck-$(TARGET_ARCH)-linux \
+ vgpreload_core-$(TARGET_ARCH)-linux \
+ vgpreload_memcheck-$(TARGET_ARCH)-linux \
+ default.supp
+endif
+
include $(BUILD_EXECUTABLE)
#
@@ -294,7 +303,11 @@ include $(CLEAR_VARS)
LOCAL_MODULE := init.bluetooth.rc
LOCAL_MODULE_CLASS := ETC
+ifneq (,$(filter userdebug eng,$(TARGET_BUILD_VARIANT)))
+LOCAL_SRC_FILES := bluez/android/$(LOCAL_MODULE)-debug
+else
LOCAL_SRC_FILES := bluez/android/$(LOCAL_MODULE)
+endif
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT)
diff --git a/android/init.bluetooth.rc-debug b/android/init.bluetooth.rc-debug
new file mode 100644
index 0000000..c6c382c
--- /dev/null
+++ b/android/init.bluetooth.rc-debug
@@ -0,0 +1,39 @@
+# required permissions
+on boot
+ chown bluetooth bluetooth /data/misc/bluetooth
+ chown bluetooth bluetooth /dev/uhid
+
+# services
+on property:bluetooth.start=daemon
+ setprop bluetooth.start none
+ start bluetoothd
+
+on property:bluetooth.stop=daemon
+ setprop bluetooth.stop none
+ stop bluetoothd
+
+on property:bluetooth.start=snoop
+ setprop bluetooth.start none
+ start bluetoothd-snoop
+
+on property:bluetooth.stop=snoop
+ setprop bluetooth.stop none
+ stop bluetoothd-snoop
+
+service bluetoothd /system/bin/logwrapper /system/bin/valgrind --leak-check=full /system/bin/bluetoothd
+ setenv G_SLICE always-malloc
+ setenv G_DEBUG gc-friendly
+ class main
+ # init does not yet support setting capabilities so run as root,
+ # bluetoothd drop uid to bluetooth with the right linux capabilities
+ group bluetooth
+ disabled
+ oneshot
+
+service bluetoothd-snoop /system/bin/logwrapper /system/bin/bluetoothd-snoop
+ class main
+ # init does not yet support setting capabilities so run as root,
+ # bluetoothd-snoop drops unneeded linux capabilities
+ group nobody
+ disabled
+ oneshot
--
1.8.5.2
^ permalink raw reply related
* [RFC] Valgrind on Android
From: Andrzej Kaczmarek @ 2014-01-23 17:54 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Andrzej Kaczmarek
Hi,
This is patch I've been using for some time now to build BlueZ packages
in a way that bluetooth starts automatically via Valgrind, so no need
to hack this manually.
It's enabled automatically for userdebug and eng build which may be not
exactly what everybody wants, so other option could be to rely on some
fancy variable (VALGRIND_FOR_BLUEZ or sth) so those who want it enabled
may just define this in environment.
Andrzej Kaczmarek (1):
android: Add support for Valgrind in debug variants
android/Android.mk | 13 +++++++++++++
android/init.bluetooth.rc-debug | 39 +++++++++++++++++++++++++++++++++++++++
2 files changed, 52 insertions(+)
create mode 100644 android/init.bluetooth.rc-debug
--
1.8.5.2
^ permalink raw reply
* [PATCH] android/a2dp: Fix audio resume on started stream
From: Andrzej Kaczmarek @ 2014-01-23 16:59 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Andrzej Kaczmarek
In case stream is started from remote we'll receive Resume Stream IPC
when audio is already considered as started (i.e. on first write from
AudioFlinger). In such case we should not try to send AVDTP_START since
this will fail but just reply success over IPC instead.
---
android/a2dp.c | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/android/a2dp.c b/android/a2dp.c
index 572e0d1..10e43b1 100644
--- a/android/a2dp.c
+++ b/android/a2dp.c
@@ -1376,10 +1376,12 @@ static void bt_stream_resume(const void *buf, uint16_t len)
goto failed;
}
- err = avdtp_start(setup->dev->session, setup->stream);
- if (err < 0) {
- error("avdtp_start: %s", strerror(-err));
- goto failed;
+ if (setup->state != HAL_AUDIO_STARTED) {
+ err = avdtp_start(setup->dev->session, setup->stream);
+ if (err < 0) {
+ error("avdtp_start: %s", strerror(-err));
+ goto failed;
+ }
}
audio_ipc_send_rsp(AUDIO_OP_RESUME_STREAM, AUDIO_STATUS_SUCCESS);
--
1.8.5.2
^ permalink raw reply related
* [PATCH 10/10] android/tester: Add remove bond bad addr dev test case
From: Grzegorz Kolodziejczyk @ 2014-01-23 16:57 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1390496258-5480-1-git-send-email-grzegorz.kolodziejczyk@tieto.com>
This adds remove bond fail test case. Bad addres is given as a parametr
for remove bond hal function.
---
android/android-tester.c | 35 +++++++++++++++++++++++++++++++++++
1 file changed, 35 insertions(+)
diff --git a/android/android-tester.c b/android/android-tester.c
index 86a76d1..2272416 100644
--- a/android/android-tester.c
+++ b/android/android-tester.c
@@ -953,6 +953,15 @@ static void bond_remove_success_state_changed_cb(bt_status_t status,
}
}
+static void bond_remove_bad_addr_state_changed_cb(bt_status_t status,
+ bt_bdaddr_t *remote_bd_addr, bt_bond_state_t state)
+{
+ struct test_data *data = tester_get_data();
+
+ if (state == BT_BOND_STATE_NONE)
+ data->cb_count--;
+}
+
static void bond_state_changed_cb(bt_status_t status,
bt_bdaddr_t *remote_bd_addr, bt_bond_state_t state)
{
@@ -2181,6 +2190,13 @@ static const struct generic_data bt_bond_remove_success_test = {
.expected_adapter_status = BT_STATUS_SUCCESS,
};
+static const struct generic_data bt_bond_remove_bad_addr_test = {
+ .expected_hal_cb.bond_state_changed_cb =
+ bond_remove_bad_addr_state_changed_cb,
+ .expected_cb_count = 1,
+ .expected_adapter_status = BT_STATUS_SUCCESS,
+};
+
static bt_callbacks_t bt_callbacks = {
.size = sizeof(bt_callbacks),
.adapter_state_changed_cb = adapter_state_changed_cb,
@@ -3105,6 +3121,20 @@ static void test_bond_remove_success(const void *test_data)
data->if_bluetooth->start_discovery();
}
+static void test_bond_remove_bad_addr(const void *test_data)
+{
+ struct test_data *data = tester_get_data();
+ bt_status_t status;
+ bt_bdaddr_t bad_addr = {
+ .address = { 0x12, 0x34, 0x56, 0x78, 0x90, 0x12 }
+ };
+
+ init_test_conditions(data);
+
+ status = data->if_bluetooth->remove_bond(&bad_addr);
+ check_expected_status(status);
+}
+
/* Test Socket HAL */
static void adapter_socket_state_changed_cb(bt_state_t state)
@@ -4277,6 +4307,11 @@ int main(int argc, char *argv[])
setup_enabled_adapter,
test_bond_remove_success, teardown);
+ test_bredrle("Bluetooth Remove Bond - Bad Address",
+ &bt_bond_remove_bad_addr_test,
+ setup_enabled_adapter,
+ test_bond_remove_bad_addr, teardown);
+
test_bredrle("Socket Init", NULL, setup_socket_interface,
test_dummy, teardown);
--
1.8.5.2
^ permalink raw reply related
* [PATCH 09/10] android/tester: Add remove bond success test case
From: Grzegorz Kolodziejczyk @ 2014-01-23 16:57 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1390496258-5480-1-git-send-email-grzegorz.kolodziejczyk@tieto.com>
This adds remove bond success test case. SSP as pairing mode.
---
android/android-tester.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 51 insertions(+)
diff --git a/android/android-tester.c b/android/android-tester.c
index ee5f225..86a76d1 100644
--- a/android/android-tester.c
+++ b/android/android-tester.c
@@ -930,6 +930,29 @@ static void bond_test_state_changed_cb(bt_status_t status,
}
}
+static void bond_remove_success_state_changed_cb(bt_status_t status,
+ bt_bdaddr_t *remote_bd_addr, bt_bond_state_t state)
+{
+ struct test_data *data = tester_get_data();
+ bt_status_t remove_status;
+ uint8_t *bdaddr = (uint8_t *)hciemu_get_client_bdaddr(data->hciemu);
+ bt_bdaddr_t remote_addr;
+
+ bdaddr2android((const bdaddr_t *)bdaddr, &remote_addr.address);
+
+ if (state == BT_BOND_STATE_BONDED) {
+ data->cb_count--;
+ remove_status = data->if_bluetooth->remove_bond(&remote_addr);
+ check_expected_status(remove_status);
+ return;
+ }
+
+ if (state == BT_BOND_STATE_NONE) {
+ data->cb_count--;
+ check_cb_count();
+ }
+}
+
static void bond_state_changed_cb(bt_status_t status,
bt_bdaddr_t *remote_bd_addr, bt_bond_state_t state)
{
@@ -2150,6 +2173,14 @@ static const struct generic_data bt_bond_cancel_success_test = {
.expected_adapter_status = BT_STATUS_SUCCESS,
};
+static const struct generic_data bt_bond_remove_success_test = {
+ .expected_hal_cb.bond_state_changed_cb =
+ bond_remove_success_state_changed_cb,
+ .expected_hal_cb.ssp_request_cb = bond_create_ssp_success_request_cb,
+ .expected_cb_count = 4,
+ .expected_adapter_status = BT_STATUS_SUCCESS,
+};
+
static bt_callbacks_t bt_callbacks = {
.size = sizeof(bt_callbacks),
.adapter_state_changed_cb = adapter_state_changed_cb,
@@ -3059,6 +3090,21 @@ static void test_bond_cancel_success(const void *test_data)
data->if_bluetooth->start_discovery();
}
+static void test_bond_remove_success(const void *test_data)
+{
+ struct test_data *data = tester_get_data();
+ struct bthost *bthost = hciemu_client_get_host(data->hciemu);
+
+ init_test_conditions(data);
+
+ mgmt_register(data->mgmt, MGMT_EV_DEVICE_FOUND, data->mgmt_index,
+ bond_device_nostatus_found_callback, data, NULL);
+
+ bthost_write_ssp_mode(bthost, 0x01);
+
+ data->if_bluetooth->start_discovery();
+}
+
/* Test Socket HAL */
static void adapter_socket_state_changed_cb(bt_state_t state)
@@ -4226,6 +4272,11 @@ int main(int argc, char *argv[])
setup_enabled_adapter,
test_bond_cancel_success, teardown);
+ test_bredrle("Bluetooth Remove Bond - Success",
+ &bt_bond_remove_success_test,
+ setup_enabled_adapter,
+ test_bond_remove_success, teardown);
+
test_bredrle("Socket Init", NULL, setup_socket_interface,
test_dummy, teardown);
--
1.8.5.2
^ permalink raw reply related
* [PATCH 08/10] android/tester: Add cancel bond success test case
From: Grzegorz Kolodziejczyk @ 2014-01-23 16:57 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1390496258-5480-1-git-send-email-grzegorz.kolodziejczyk@tieto.com>
This adds cancel bond success test case. SSP as pairing mode.
---
android/android-tester.c | 45 +++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 45 insertions(+)
diff --git a/android/android-tester.c b/android/android-tester.c
index 3268904..ee5f225 100644
--- a/android/android-tester.c
+++ b/android/android-tester.c
@@ -1050,6 +1050,24 @@ static void bond_create_ssp_fail_request_cb(bt_bdaddr_t *remote_bd_addr,
bond_create_ssp_request_cb(remote_bd_addr, pairing_variant, accept);
}
+static void bond_cancel_success_ssp_request_cb(bt_bdaddr_t *remote_bd_addr,
+ bt_bdname_t *bd_name, uint32_t cod,
+ bt_ssp_variant_t pairing_variant,
+ uint32_t pass_key)
+{
+ struct test_data *data = tester_get_data();
+ uint8_t *bdaddr = (uint8_t *)hciemu_get_client_bdaddr(data->hciemu);
+ bt_bdaddr_t remote_addr;
+ bt_status_t status;
+
+ bdaddr2android((const bdaddr_t *)bdaddr, &remote_addr.address);
+
+ data->cb_count--;
+
+ status = data->if_bluetooth->cancel_bond(&remote_addr);
+ check_expected_status(status);
+}
+
static void ssp_request_cb(bt_bdaddr_t *remote_bd_addr, bt_bdname_t *bd_name,
uint32_t cod, bt_ssp_variant_t pairing_variant,
uint32_t pass_key)
@@ -2125,6 +2143,13 @@ static const struct generic_data bt_bond_create_bad_addr_success_test = {
.expected_adapter_status = MGMT_STATUS_CONNECT_FAILED,
};
+static const struct generic_data bt_bond_cancel_success_test = {
+ .expected_hal_cb.bond_state_changed_cb = bond_test_state_changed_cb,
+ .expected_hal_cb.ssp_request_cb = bond_cancel_success_ssp_request_cb,
+ .expected_cb_count = 4,
+ .expected_adapter_status = BT_STATUS_SUCCESS,
+};
+
static bt_callbacks_t bt_callbacks = {
.size = sizeof(bt_callbacks),
.adapter_state_changed_cb = adapter_state_changed_cb,
@@ -3019,6 +3044,21 @@ static void test_bond_create_bad_addr_success(const void *test_data)
data->if_bluetooth->create_bond(&bad_addr);
}
+static void test_bond_cancel_success(const void *test_data)
+{
+ struct test_data *data = tester_get_data();
+ struct bthost *bthost = hciemu_client_get_host(data->hciemu);
+
+ init_test_conditions(data);
+
+ mgmt_register(data->mgmt, MGMT_EV_DEVICE_FOUND, data->mgmt_index,
+ bond_device_nostatus_found_callback, data, NULL);
+
+ bthost_write_ssp_mode(bthost, 0x01);
+
+ data->if_bluetooth->start_discovery();
+}
+
/* Test Socket HAL */
static void adapter_socket_state_changed_cb(bt_state_t state)
@@ -4181,6 +4221,11 @@ int main(int argc, char *argv[])
setup_enabled_adapter,
test_bond_create_bad_addr_success, teardown);
+ test_bredrle("Bluetooth Cancel Bonding - Success",
+ &bt_bond_cancel_success_test,
+ setup_enabled_adapter,
+ test_bond_cancel_success, teardown);
+
test_bredrle("Socket Init", NULL, setup_socket_interface,
test_dummy, teardown);
--
1.8.5.2
^ permalink raw reply related
* [PATCH 07/10] android/tester: Add create bond with bad addr fail test case
From: Grzegorz Kolodziejczyk @ 2014-01-23 16:57 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1390496258-5480-1-git-send-email-grzegorz.kolodziejczyk@tieto.com>
This adds create bond with bad addr fail test case.
---
android/android-tester.c | 25 +++++++++++++++++++++++++
1 file changed, 25 insertions(+)
diff --git a/android/android-tester.c b/android/android-tester.c
index f31bf0f..3268904 100644
--- a/android/android-tester.c
+++ b/android/android-tester.c
@@ -2121,6 +2121,10 @@ static const struct generic_data bt_bond_create_no_disc_success_test = {
.expected_adapter_status = BT_STATUS_SUCCESS,
};
+static const struct generic_data bt_bond_create_bad_addr_success_test = {
+ .expected_adapter_status = MGMT_STATUS_CONNECT_FAILED,
+};
+
static bt_callbacks_t bt_callbacks = {
.size = sizeof(bt_callbacks),
.adapter_state_changed_cb = adapter_state_changed_cb,
@@ -2999,6 +3003,22 @@ static void test_bond_create_no_disc_success(const void *test_data)
check_expected_status(status);
}
+static void test_bond_create_bad_addr_success(const void *test_data)
+{
+ struct test_data *data = tester_get_data();
+ bt_bdaddr_t bad_addr = {
+ .address = { 0x12, 0x34, 0x56, 0x78, 0x90, 0x12 }
+ };
+
+ init_test_conditions(data);
+
+ mgmt_register(data->mgmt, MGMT_EV_CONNECT_FAILED, data->mgmt_index,
+ bond_device_auth_fail_callback, data,
+ NULL);
+
+ data->if_bluetooth->create_bond(&bad_addr);
+}
+
/* Test Socket HAL */
static void adapter_socket_state_changed_cb(bt_state_t state)
@@ -4156,6 +4176,11 @@ int main(int argc, char *argv[])
setup_enabled_adapter,
test_bond_create_no_disc_success, teardown);
+ test_bredrle("Bluetooth Create Bond - Bad Address",
+ &bt_bond_create_bad_addr_success_test,
+ setup_enabled_adapter,
+ test_bond_create_bad_addr_success, teardown);
+
test_bredrle("Socket Init", NULL, setup_socket_interface,
test_dummy, teardown);
--
1.8.5.2
^ permalink raw reply related
* [PATCH 06/10] android/tester: Add create bond with no discovery test case
From: Grzegorz Kolodziejczyk @ 2014-01-23 16:57 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1390496258-5480-1-git-send-email-grzegorz.kolodziejczyk@tieto.com>
This adds create bond with no discovery before create bond as NFC does.
SSP with confirm as authentication mode.
---
android/android-tester.c | 31 +++++++++++++++++++++++++++++++
1 file changed, 31 insertions(+)
diff --git a/android/android-tester.c b/android/android-tester.c
index 0d37fb3..f31bf0f 100644
--- a/android/android-tester.c
+++ b/android/android-tester.c
@@ -2114,6 +2114,13 @@ static const struct generic_data bt_bond_create_ssp_fail_test = {
.expected_adapter_status = MGMT_STATUS_AUTH_FAILED,
};
+static const struct generic_data bt_bond_create_no_disc_success_test = {
+ .expected_hal_cb.bond_state_changed_cb = bond_test_state_changed_cb,
+ .expected_hal_cb.ssp_request_cb = bond_create_ssp_success_request_cb,
+ .expected_cb_count = 3,
+ .expected_adapter_status = BT_STATUS_SUCCESS,
+};
+
static bt_callbacks_t bt_callbacks = {
.size = sizeof(bt_callbacks),
.adapter_state_changed_cb = adapter_state_changed_cb,
@@ -2973,6 +2980,25 @@ static void test_bond_create_ssp_fail(const void *test_data)
data->if_bluetooth->start_discovery();
}
+static void test_bond_create_no_disc_success(const void *test_data)
+{
+ struct test_data *data = tester_get_data();
+ struct bthost *bthost = hciemu_client_get_host(data->hciemu);
+
+ uint8_t *bdaddr = (uint8_t *)hciemu_get_client_bdaddr(data->hciemu);
+ bt_bdaddr_t remote_addr;
+ bt_status_t status;
+
+ init_test_conditions(data);
+
+ bdaddr2android((const bdaddr_t *)bdaddr, &remote_addr.address);
+
+ bthost_write_ssp_mode(bthost, 0x01);
+
+ status = data->if_bluetooth->create_bond(&remote_addr);
+ check_expected_status(status);
+}
+
/* Test Socket HAL */
static void adapter_socket_state_changed_cb(bt_state_t state)
@@ -4125,6 +4151,11 @@ int main(int argc, char *argv[])
setup_enabled_adapter,
test_bond_create_ssp_fail, teardown);
+ test_bredrle("Bluetooth Create Bond - No Discovery",
+ &bt_bond_create_no_disc_success_test,
+ setup_enabled_adapter,
+ test_bond_create_no_disc_success, teardown);
+
test_bredrle("Socket Init", NULL, setup_socket_interface,
test_dummy, teardown);
--
1.8.5.2
^ permalink raw reply related
* [PATCH 05/10] android/tester: Add create bond with SSP fail test case
From: Grzegorz Kolodziejczyk @ 2014-01-23 16:57 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1390496258-5480-1-git-send-email-grzegorz.kolodziejczyk@tieto.com>
This adds create bond with SSP fail test case. Confirm is set as SSP
pairing mode.
---
android/android-tester.c | 41 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 41 insertions(+)
diff --git a/android/android-tester.c b/android/android-tester.c
index 1ee1196..0d37fb3 100644
--- a/android/android-tester.c
+++ b/android/android-tester.c
@@ -1040,6 +1040,16 @@ static void bond_create_ssp_success_request_cb(bt_bdaddr_t *remote_bd_addr,
bond_create_ssp_request_cb(remote_bd_addr, pairing_variant, accept);
}
+static void bond_create_ssp_fail_request_cb(bt_bdaddr_t *remote_bd_addr,
+ bt_bdname_t *bd_name, uint32_t cod,
+ bt_ssp_variant_t pairing_variant,
+ uint32_t pass_key)
+{
+ bool accept = false;
+
+ bond_create_ssp_request_cb(remote_bd_addr, pairing_variant, accept);
+}
+
static void ssp_request_cb(bt_bdaddr_t *remote_bd_addr, bt_bdname_t *bd_name,
uint32_t cod, bt_ssp_variant_t pairing_variant,
uint32_t pass_key)
@@ -2097,6 +2107,13 @@ static const struct generic_data bt_bond_create_ssp_success_test = {
.expected_adapter_status = BT_STATUS_SUCCESS,
};
+static const struct generic_data bt_bond_create_ssp_fail_test = {
+ .expected_hal_cb.bond_state_changed_cb = bond_test_state_changed_cb,
+ .expected_hal_cb.ssp_request_cb = bond_create_ssp_fail_request_cb,
+ .expected_cb_count = 4,
+ .expected_adapter_status = MGMT_STATUS_AUTH_FAILED,
+};
+
static bt_callbacks_t bt_callbacks = {
.size = sizeof(bt_callbacks),
.adapter_state_changed_cb = adapter_state_changed_cb,
@@ -2937,6 +2954,25 @@ static void test_bond_create_ssp_success(const void *test_data)
data->if_bluetooth->start_discovery();
}
+static void test_bond_create_ssp_fail(const void *test_data)
+{
+ struct test_data *data = tester_get_data();
+ struct bthost *bthost = hciemu_client_get_host(data->hciemu);
+
+ init_test_conditions(data);
+
+ mgmt_register(data->mgmt, MGMT_EV_DEVICE_FOUND, data->mgmt_index,
+ bond_device_nostatus_found_callback,
+ data, NULL);
+ mgmt_register(data->mgmt, MGMT_EV_AUTH_FAILED, data->mgmt_index,
+ bond_device_auth_fail_callback, data,
+ NULL);
+
+ bthost_write_ssp_mode(bthost, 0x01);
+
+ data->if_bluetooth->start_discovery();
+}
+
/* Test Socket HAL */
static void adapter_socket_state_changed_cb(bt_state_t state)
@@ -4084,6 +4120,11 @@ int main(int argc, char *argv[])
setup_enabled_adapter,
test_bond_create_ssp_success, teardown);
+ test_bredrle("Bluetooth Create Bond SSP - Negative reply",
+ &bt_bond_create_ssp_fail_test,
+ setup_enabled_adapter,
+ test_bond_create_ssp_fail, teardown);
+
test_bredrle("Socket Init", NULL, setup_socket_interface,
test_dummy, teardown);
--
1.8.5.2
^ permalink raw reply related
* [PATCH 04/10] android/tester: Add create bond with SSP sucess test case
From: Grzegorz Kolodziejczyk @ 2014-01-23 16:57 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1390496258-5480-1-git-send-email-grzegorz.kolodziejczyk@tieto.com>
This adds create bond with SSP succes test case. Confirm is set as SSP
pairing mode.
---
android/android-tester.c | 81 +++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 80 insertions(+), 1 deletion(-)
diff --git a/android/android-tester.c b/android/android-tester.c
index defab30..1ee1196 100644
--- a/android/android-tester.c
+++ b/android/android-tester.c
@@ -1002,6 +1002,58 @@ static void pin_request_cb(bt_bdaddr_t *remote_bd_addr,
cod);
}
+static void bond_create_ssp_request_cb(const bt_bdaddr_t *remote_bd_addr,
+ bt_ssp_variant_t pairing_variant,
+ bool accept)
+{
+ bdaddr_t remote_addr;
+ struct test_data *data = tester_get_data();
+ struct mgmt_addr_info cp;
+ uint16_t opcode;
+
+ android2bdaddr(remote_bd_addr, &remote_addr);
+
+ if (pairing_variant == 0) { /* HAL_SSP_VARIANT_CONFIRM */
+ if (accept)
+ opcode = MGMT_OP_USER_CONFIRM_REPLY;
+ else
+ opcode = MGMT_OP_USER_CONFIRM_NEG_REPLY;
+
+ data->cb_count--;
+
+ bacpy(&cp.bdaddr, &remote_addr);
+ cp.type = BDADDR_BREDR;
+
+ mgmt_reply(data->mgmt, opcode, data->mgmt_index, sizeof(cp),
+ &cp, NULL, NULL, NULL);
+ } else
+ tester_test_failed();
+}
+
+static void bond_create_ssp_success_request_cb(bt_bdaddr_t *remote_bd_addr,
+ bt_bdname_t *bd_name, uint32_t cod,
+ bt_ssp_variant_t pairing_variant,
+ uint32_t pass_key)
+{
+ bool accept = true;
+
+ bond_create_ssp_request_cb(remote_bd_addr, pairing_variant, accept);
+}
+
+static void ssp_request_cb(bt_bdaddr_t *remote_bd_addr, bt_bdname_t *bd_name,
+ uint32_t cod, bt_ssp_variant_t pairing_variant,
+ uint32_t pass_key)
+{
+ struct test_data *data = tester_get_data();
+ const struct generic_data *test = data->test_data;
+
+ if (data->test_init_done &&
+ test->expected_hal_cb.ssp_request_cb) {
+ test->expected_hal_cb.ssp_request_cb(remote_bd_addr, bd_name,
+ cod, pairing_variant, pass_key);
+ }
+}
+
static bt_bdaddr_t enable_done_bdaddr_val = { {0x00} };
static char enable_done_bdname_val[] = "BlueZ for Android";
static bt_uuid_t enable_done_uuids_val = {
@@ -2038,6 +2090,13 @@ static const struct generic_data bt_bond_create_pin_fail_test = {
.expected_adapter_status = MGMT_STATUS_AUTH_FAILED,
};
+static const struct generic_data bt_bond_create_ssp_success_test = {
+ .expected_hal_cb.bond_state_changed_cb = bond_test_state_changed_cb,
+ .expected_hal_cb.ssp_request_cb = bond_create_ssp_success_request_cb,
+ .expected_cb_count = 4,
+ .expected_adapter_status = BT_STATUS_SUCCESS,
+};
+
static bt_callbacks_t bt_callbacks = {
.size = sizeof(bt_callbacks),
.adapter_state_changed_cb = adapter_state_changed_cb,
@@ -2046,7 +2105,7 @@ static bt_callbacks_t bt_callbacks = {
.device_found_cb = device_found_cb,
.discovery_state_changed_cb = discovery_state_changed_cb,
.pin_request_cb = pin_request_cb,
- .ssp_request_cb = NULL,
+ .ssp_request_cb = ssp_request_cb,
.bond_state_changed_cb = bond_state_changed_cb,
.acl_state_changed_cb = NULL,
.thread_evt_cb = NULL,
@@ -2863,6 +2922,21 @@ static void test_bond_create_pin_fail(const void *test_data)
data->if_bluetooth->start_discovery();
}
+static void test_bond_create_ssp_success(const void *test_data)
+{
+ struct test_data *data = tester_get_data();
+ struct bthost *bthost = hciemu_client_get_host(data->hciemu);
+
+ init_test_conditions(data);
+
+ mgmt_register(data->mgmt, MGMT_EV_DEVICE_FOUND, data->mgmt_index,
+ bond_device_found_callback, data, NULL);
+
+ bthost_write_ssp_mode(bthost, 0x01);
+
+ data->if_bluetooth->start_discovery();
+}
+
/* Test Socket HAL */
static void adapter_socket_state_changed_cb(bt_state_t state)
@@ -4005,6 +4079,11 @@ int main(int argc, char *argv[])
setup_enabled_adapter,
test_bond_create_pin_fail, teardown);
+ test_bredrle("Bluetooth Create Bond SSP - Success",
+ &bt_bond_create_ssp_success_test,
+ setup_enabled_adapter,
+ test_bond_create_ssp_success, teardown);
+
test_bredrle("Socket Init", NULL, setup_socket_interface,
test_dummy, teardown);
--
1.8.5.2
^ permalink raw reply related
* [PATCH 03/10] android/tester: Add create bond with PIN fail test case
From: Grzegorz Kolodziejczyk @ 2014-01-23 16:57 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1390496258-5480-1-git-send-email-grzegorz.kolodziejczyk@tieto.com>
This adds create bond with PIN fail test case.
---
android/android-tester.c | 85 ++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 85 insertions(+)
diff --git a/android/android-tester.c b/android/android-tester.c
index a3973af..defab30 100644
--- a/android/android-tester.c
+++ b/android/android-tester.c
@@ -966,6 +966,31 @@ static void bond_create_pin_success_request_cb(bt_bdaddr_t *remote_bd_addr,
sizeof(rp), &rp, NULL, NULL, NULL);
}
+static void bond_create_pin_fail_request_cb(bt_bdaddr_t *remote_bd_addr,
+ bt_bdname_t *bd_name, uint32_t cod)
+{
+ struct test_data *data = tester_get_data();
+ struct mgmt_cp_pin_code_reply rp;
+ bdaddr_t remote_addr;
+ static uint8_t bad_device_pin[] = { 0x31, 0x31, 0x31, 0x31 };
+ const void *pin_code = bad_device_pin;
+ uint8_t pin_len = 4;
+
+ memset(&rp, 0, sizeof(rp));
+
+ android2bdaddr(remote_bd_addr, &remote_addr);
+
+ data->cb_count--;
+
+ bacpy(&rp.addr.bdaddr, &remote_addr);
+ rp.addr.type = BDADDR_BREDR;
+ rp.pin_len = pin_len;
+ memcpy(rp.pin_code, pin_code, rp.pin_len);
+
+ mgmt_reply(data->mgmt, MGMT_OP_PIN_CODE_REPLY, data->mgmt_index,
+ sizeof(rp), &rp, NULL, NULL, NULL);
+}
+
static void pin_request_cb(bt_bdaddr_t *remote_bd_addr,
bt_bdname_t *bd_name, uint32_t cod)
{
@@ -2006,6 +2031,13 @@ static const struct generic_data bt_bond_create_pin_success_test = {
.expected_adapter_status = BT_STATUS_SUCCESS,
};
+static const struct generic_data bt_bond_create_pin_fail_test = {
+ .expected_hal_cb.bond_state_changed_cb = bond_test_state_changed_cb,
+ .expected_hal_cb.pin_request_cb = bond_create_pin_fail_request_cb,
+ .expected_cb_count = 4,
+ .expected_adapter_status = MGMT_STATUS_AUTH_FAILED,
+};
+
static bt_callbacks_t bt_callbacks = {
.size = sizeof(bt_callbacks),
.adapter_state_changed_cb = adapter_state_changed_cb,
@@ -2764,6 +2796,31 @@ static void bond_device_found_callback(uint16_t index, uint16_t length,
}
}
+static void bond_device_nostatus_found_callback(uint16_t index, uint16_t length,
+ const void *param,
+ void *user_data)
+{
+ struct test_data *data = tester_get_data();
+ uint8_t *bdaddr = (uint8_t *)hciemu_get_client_bdaddr(data->hciemu);
+ bt_bdaddr_t remote_addr;
+
+ bdaddr2android((const bdaddr_t *)bdaddr, &remote_addr.address);
+
+ if (data->cb_count == 4) {
+ data->cb_count--;
+ data->if_bluetooth->create_bond(&remote_addr);
+ }
+}
+
+static void bond_device_auth_fail_callback(uint16_t index, uint16_t length,
+ const void *param,
+ void *user_data)
+{
+ const struct mgmt_ev_auth_failed *ev = param;
+
+ check_expected_status(ev->status);
+}
+
static void test_bond_create_pin_success(const void *test_data)
{
struct test_data *data = tester_get_data();
@@ -2783,6 +2840,29 @@ static void test_bond_create_pin_success(const void *test_data)
data->if_bluetooth->start_discovery();
}
+static void test_bond_create_pin_fail(const void *test_data)
+{
+ struct test_data *data = tester_get_data();
+ struct bthost *bthost = hciemu_client_get_host(data->hciemu);
+
+ static uint8_t pair_device_pin[] = { 0x30, 0x30, 0x30, 0x30 };
+ const void *pin = pair_device_pin;
+ uint8_t pin_len = 4;
+
+ init_test_conditions(data);
+
+ mgmt_register(data->mgmt, MGMT_EV_DEVICE_FOUND, data->mgmt_index,
+ bond_device_nostatus_found_callback,
+ data, NULL);
+ mgmt_register(data->mgmt, MGMT_EV_AUTH_FAILED, data->mgmt_index,
+ bond_device_auth_fail_callback, data,
+ NULL);
+
+ bthost_set_pin_code(bthost, pin, pin_len);
+
+ data->if_bluetooth->start_discovery();
+}
+
/* Test Socket HAL */
static void adapter_socket_state_changed_cb(bt_state_t state)
@@ -3920,6 +4000,11 @@ int main(int argc, char *argv[])
setup_enabled_adapter,
test_bond_create_pin_success, teardown);
+ test_bredrle("Bluetooth Create Bond PIN - Bad PIN",
+ &bt_bond_create_pin_fail_test,
+ setup_enabled_adapter,
+ test_bond_create_pin_fail, teardown);
+
test_bredrle("Socket Init", NULL, setup_socket_interface,
test_dummy, teardown);
--
1.8.5.2
^ permalink raw reply related
* [PATCH 02/10] android/tester: Add create bond with PIN success test case
From: Grzegorz Kolodziejczyk @ 2014-01-23 16:57 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1390496258-5480-1-git-send-email-grzegorz.kolodziejczyk@tieto.com>
This adds create bond with PIN success test case.
---
android/android-tester.c | 123 ++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 121 insertions(+), 2 deletions(-)
diff --git a/android/android-tester.c b/android/android-tester.c
index 4bd48d6..a3973af 100644
--- a/android/android-tester.c
+++ b/android/android-tester.c
@@ -908,6 +908,75 @@ static void remote_device_properties_cb(bt_status_t status,
bd_addr, num_properties, properties);
}
+static void bond_test_state_changed_cb(bt_status_t status,
+ bt_bdaddr_t *remote_bd_addr, bt_bond_state_t state)
+{
+ struct test_data *data = tester_get_data();
+
+ switch (state) {
+ case BT_BOND_STATE_NONE:
+ data->cb_count--;
+ check_cb_count();
+ break;
+ case BT_BOND_STATE_BONDING:
+ data->cb_count--;
+ break;
+ case BT_BOND_STATE_BONDED:
+ data->cb_count--;
+ check_cb_count();
+ break;
+ default:
+ break;
+ }
+}
+
+static void bond_state_changed_cb(bt_status_t status,
+ bt_bdaddr_t *remote_bd_addr, bt_bond_state_t state)
+{
+ struct test_data *data = tester_get_data();
+ const struct generic_data *test = data->test_data;
+
+ if (data->test_init_done && test->expected_hal_cb.bond_state_changed_cb)
+ test->expected_hal_cb.bond_state_changed_cb(status,
+ remote_bd_addr, state);
+}
+
+static void bond_create_pin_success_request_cb(bt_bdaddr_t *remote_bd_addr,
+ bt_bdname_t *bd_name, uint32_t cod)
+{
+ struct test_data *data = tester_get_data();
+ struct mgmt_cp_pin_code_reply rp;
+ bdaddr_t remote_addr;
+ static uint8_t pair_device_pin[] = { 0x30, 0x30, 0x30, 0x30 };
+ const void *pin_code = pair_device_pin;
+ uint8_t pin_len = 4;
+
+ memset(&rp, 0, sizeof(rp));
+
+ data->cb_count--;
+
+ android2bdaddr(remote_bd_addr, &remote_addr);
+
+ bacpy(&rp.addr.bdaddr, &remote_addr);
+ rp.addr.type = BDADDR_BREDR;
+ rp.pin_len = pin_len;
+ memcpy(rp.pin_code, pin_code, rp.pin_len);
+
+ mgmt_reply(data->mgmt, MGMT_OP_PIN_CODE_REPLY, data->mgmt_index,
+ sizeof(rp), &rp, NULL, NULL, NULL);
+}
+
+static void pin_request_cb(bt_bdaddr_t *remote_bd_addr,
+ bt_bdname_t *bd_name, uint32_t cod)
+{
+ struct test_data *data = tester_get_data();
+ const struct generic_data *test = data->test_data;
+
+ if (data->test_init_done && test->expected_hal_cb.pin_request_cb)
+ test->expected_hal_cb.pin_request_cb(remote_bd_addr, bd_name,
+ cod);
+}
+
static bt_bdaddr_t enable_done_bdaddr_val = { {0x00} };
static char enable_done_bdname_val[] = "BlueZ for Android";
static bt_uuid_t enable_done_uuids_val = {
@@ -1930,6 +1999,13 @@ static const struct generic_data bt_dev_setprop_disctimeout_fail_test = {
.expected_adapter_status = BT_STATUS_FAIL,
};
+static const struct generic_data bt_bond_create_pin_success_test = {
+ .expected_hal_cb.bond_state_changed_cb = bond_test_state_changed_cb,
+ .expected_hal_cb.pin_request_cb = bond_create_pin_success_request_cb,
+ .expected_cb_count = 4,
+ .expected_adapter_status = BT_STATUS_SUCCESS,
+};
+
static bt_callbacks_t bt_callbacks = {
.size = sizeof(bt_callbacks),
.adapter_state_changed_cb = adapter_state_changed_cb,
@@ -1937,9 +2013,9 @@ static bt_callbacks_t bt_callbacks = {
.remote_device_properties_cb = remote_device_properties_cb,
.device_found_cb = device_found_cb,
.discovery_state_changed_cb = discovery_state_changed_cb,
- .pin_request_cb = NULL,
+ .pin_request_cb = pin_request_cb,
.ssp_request_cb = NULL,
- .bond_state_changed_cb = NULL,
+ .bond_state_changed_cb = bond_state_changed_cb,
.acl_state_changed_cb = NULL,
.thread_evt_cb = NULL,
.dut_mode_recv_cb = NULL,
@@ -2669,6 +2745,44 @@ static void test_dev_setprop_disctimeout_fail(const void *test_data)
data->if_bluetooth->start_discovery();
}
+
+static void bond_device_found_callback(uint16_t index, uint16_t length,
+ const void *param,
+ void *user_data)
+{
+ struct test_data *data = tester_get_data();
+ uint8_t *bdaddr = (uint8_t *)hciemu_get_client_bdaddr(data->hciemu);
+ bt_bdaddr_t remote_addr;
+ bt_status_t status;
+
+ bdaddr2android((const bdaddr_t *)bdaddr, &remote_addr.address);
+
+ if (data->cb_count == 4) {
+ data->cb_count--;
+ status = data->if_bluetooth->create_bond(&remote_addr);
+ check_expected_status(status);
+ }
+}
+
+static void test_bond_create_pin_success(const void *test_data)
+{
+ struct test_data *data = tester_get_data();
+ struct bthost *bthost = hciemu_client_get_host(data->hciemu);
+
+ static uint8_t pair_device_pin[] = { 0x30, 0x30, 0x30, 0x30 };
+ const void *pin = pair_device_pin;
+ uint8_t pin_len = 4;
+
+ init_test_conditions(data);
+
+ mgmt_register(data->mgmt, MGMT_EV_DEVICE_FOUND, data->mgmt_index,
+ bond_device_found_callback, data, NULL);
+
+ bthost_set_pin_code(bthost, pin, pin_len);
+
+ data->if_bluetooth->start_discovery();
+}
+
/* Test Socket HAL */
static void adapter_socket_state_changed_cb(bt_state_t state)
@@ -3801,6 +3915,11 @@ int main(int argc, char *argv[])
setup_enabled_adapter,
test_dev_setprop_disctimeout_fail, teardown);
+ test_bredrle("Bluetooth Create Bond PIN - Success",
+ &bt_bond_create_pin_success_test,
+ setup_enabled_adapter,
+ test_bond_create_pin_success, teardown);
+
test_bredrle("Socket Init", NULL, setup_socket_interface,
test_dummy, teardown);
--
1.8.5.2
^ permalink raw reply related
* [PATCH 01/10] android/tester: Coding style and syntax fix
From: Grzegorz Kolodziejczyk @ 2014-01-23 16:57 UTC (permalink / raw)
To: linux-bluetooth
Remove white spaces, break lines over 80 characters, redundand braces
for single statement blocks.
---
android/android-tester.c | 51 ++++++++++++++++++++++++------------------------
1 file changed, 26 insertions(+), 25 deletions(-)
diff --git a/android/android-tester.c b/android/android-tester.c
index 9a17612..4bd48d6 100644
--- a/android/android-tester.c
+++ b/android/android-tester.c
@@ -690,9 +690,8 @@ static void discovery_state_changed_cb(bt_discovery_state_t state)
struct test_data *data = tester_get_data();
const struct generic_data *test = data->test_data;
- if (test && test->expected_hal_cb.discovery_state_changed_cb) {
+ if (test && test->expected_hal_cb.discovery_state_changed_cb)
test->expected_hal_cb.discovery_state_changed_cb(state);
- }
}
static void discovery_device_found_cb(int num_properties,
@@ -837,10 +836,9 @@ static void device_found_cb(int num_properties, bt_property_t *properties)
struct test_data *data = tester_get_data();
const struct generic_data *test = data->test_data;
- if (data->test_init_done && test->expected_hal_cb.device_found_cb) {
+ if (data->test_init_done && test->expected_hal_cb.device_found_cb)
test->expected_hal_cb.device_found_cb(num_properties,
properties);
- }
}
static void check_count_properties_cb(bt_status_t status, int num_properties,
@@ -852,7 +850,6 @@ static void check_count_properties_cb(bt_status_t status, int num_properties,
check_expected_property(properties[i]);
}
-
static void adapter_properties_cb(bt_status_t status, int num_properties,
bt_property_t *properties)
{
@@ -860,11 +857,9 @@ static void adapter_properties_cb(bt_status_t status, int num_properties,
const struct generic_data *test = data->test_data;
if (data->test_init_done &&
- test->expected_hal_cb.adapter_properties_cb) {
- test->expected_hal_cb.adapter_properties_cb(
- status, num_properties,
- properties);
- }
+ test->expected_hal_cb.adapter_properties_cb)
+ test->expected_hal_cb.adapter_properties_cb(status,
+ num_properties, properties);
}
static void remote_test_device_properties_cb(bt_status_t status,
@@ -908,10 +903,9 @@ static void remote_device_properties_cb(bt_status_t status,
const struct generic_data *test = data->test_data;
if (data->test_init_done &&
- test->expected_hal_cb.remote_device_properties_cb) {
+ test->expected_hal_cb.remote_device_properties_cb)
test->expected_hal_cb.remote_device_properties_cb(status,
bd_addr, num_properties, properties);
- }
}
static bt_bdaddr_t enable_done_bdaddr_val = { {0x00} };
@@ -1324,7 +1318,8 @@ static struct priority_property setprop_scanmode_none_props[] = {
},
};
-static const struct generic_data bluetooth_setprop_scanmode_none_success2_test = {
+static const struct generic_data
+ bluetooth_setprop_scanmode_none_success2_test = {
.expected_hal_cb.adapter_properties_cb = check_count_properties_cb,
.expected_properties_num = 1,
.expected_properties = setprop_scanmode_none_props,
@@ -1951,7 +1946,6 @@ static bt_callbacks_t bt_callbacks = {
.le_test_mode_cb = NULL
};
-
static void setup(struct test_data *data)
{
const hw_module_t *module;
@@ -2093,7 +2087,8 @@ static void test_enable(const void *test_data)
init_test_conditions(data);
- bdaddr2android((const bdaddr_t *)bdaddr, &enable_done_bdaddr_val.address);
+ bdaddr2android((const bdaddr_t *)bdaddr,
+ &enable_done_bdaddr_val.address);
adapter_status = data->if_bluetooth->enable();
check_expected_status(adapter_status);
@@ -2108,7 +2103,8 @@ static void test_enable_done(const void *test_data)
init_test_conditions(data);
- bdaddr2android((const bdaddr_t *)bdaddr, &enable_done_bdaddr_val.address);
+ bdaddr2android((const bdaddr_t *)bdaddr,
+ &enable_done_bdaddr_val.address);
adapter_status = data->if_bluetooth->enable();
check_expected_status(adapter_status);
@@ -2170,7 +2166,8 @@ static void test_getprop_bdaddr_success(const void *test_data)
init_test_conditions(data);
- bdaddr2android((const bdaddr_t *)bdaddr, &test_getprop_bdaddr_val.address);
+ bdaddr2android((const bdaddr_t *)bdaddr,
+ &test_getprop_bdaddr_val.address);
adapter_status = data->if_bluetooth->get_adapter_property(prop.type);
check_expected_status(adapter_status);
@@ -3374,7 +3371,6 @@ static void emu_powered_complete(uint16_t opcode, uint8_t status,
bt_status = data->if_hid->connect(&bdaddr);
if (bt_status != BT_STATUS_SUCCESS)
tester_setup_failed();
-
}
static void setup_hidhost_connect(const void *test_data)
@@ -3535,15 +3531,20 @@ int main(int argc, char *argv[])
test_bredrle("Bluetooth Init", NULL, setup_base, test_dummy, teardown);
- test_bredrle("Bluetooth Enable - Success", &bluetooth_enable_success_test,
- setup_base, test_enable, teardown);
+ test_bredrle("Bluetooth Enable - Success",
+ &bluetooth_enable_success_test,
+ setup_base, test_enable,
+ teardown);
test_bredrle("Bluetooth Enable - Success 2",
- &bluetooth_enable_success2_test, setup_enabled_adapter,
- test_enable_done, teardown);
-
- test_bredrle("Bluetooth Disable - Success", &bluetooth_disable_success_test,
- setup_enabled_adapter, test_disable, teardown);
+ &bluetooth_enable_success2_test,
+ setup_enabled_adapter,
+ test_enable_done, teardown);
+
+ test_bredrle("Bluetooth Disable - Success",
+ &bluetooth_disable_success_test,
+ setup_enabled_adapter,
+ test_disable, teardown);
test_bredrle("Bluetooth Set BDNAME - Success",
&bluetooth_setprop_bdname_success_test,
--
1.8.5.2
^ permalink raw reply related
* Re: [PATCH] android/a2dp: Free device outside of notify function
From: Luiz Augusto von Dentz @ 2014-01-23 16:43 UTC (permalink / raw)
To: Andrei Emeltchenko; +Cc: linux-bluetooth@vger.kernel.org
In-Reply-To: <1390490779-28954-1-git-send-email-Andrei.Emeltchenko.news@gmail.com>
Hi Andrei,
On Thu, Jan 23, 2014 at 5:26 PM, Andrei Emeltchenko
<Andrei.Emeltchenko.news@gmail.com> wrote:
> From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
>
> device_free() was used inside notify_state() function based on parameter
> which makes it complex to follow. Change logic so that notify_state()
> only notifies and the other code makes device_free().
> ---
> android/a2dp.c | 10 +++++-----
> 1 file changed, 5 insertions(+), 5 deletions(-)
>
> diff --git a/android/a2dp.c b/android/a2dp.c
> index 572e0d1..d043c04 100644
> --- a/android/a2dp.c
> +++ b/android/a2dp.c
> @@ -189,11 +189,6 @@ static void bt_a2dp_notify_state(struct a2dp_device *dev, uint8_t state)
>
> ipc_send_notif(HAL_SERVICE_ID_A2DP, HAL_EV_A2DP_CONN_STATE, sizeof(ev),
> &ev);
> -
> - if (state != HAL_A2DP_STATE_DISCONNECTED)
> - return;
> -
> - a2dp_device_free(dev);
> }
>
> static void bt_audio_notify_state(struct a2dp_setup *setup, uint8_t state)
> @@ -221,6 +216,7 @@ static void disconnect_cb(void *user_data)
> struct a2dp_device *dev = user_data;
>
> bt_a2dp_notify_state(dev, HAL_A2DP_STATE_DISCONNECTED);
> + a2dp_device_free(dev);
> }
>
> static int sbc_check_config(void *caps, uint8_t caps_len, void *conf,
> @@ -460,6 +456,7 @@ static gboolean idle_timeout(gpointer user_data)
>
> error("avdtp_discover: %s", strerror(-err));
> bt_a2dp_notify_state(dev, HAL_A2DP_STATE_DISCONNECTED);
> + a2dp_device_free(dev);
>
> return FALSE;
> }
> @@ -474,6 +471,7 @@ static void signaling_connect_cb(GIOChannel *chan, GError *err,
>
> if (err) {
> bt_a2dp_notify_state(dev, HAL_A2DP_STATE_DISCONNECTED);
> + a2dp_device_free(dev);
> error("%s", err->message);
> return;
> }
> @@ -519,6 +517,7 @@ static void signaling_connect_cb(GIOChannel *chan, GError *err,
>
> failed:
> bt_a2dp_notify_state(dev, HAL_A2DP_STATE_DISCONNECTED);
> + a2dp_device_free(dev);
> }
>
> static void bt_a2dp_connect(const void *buf, uint16_t len)
> @@ -581,6 +580,7 @@ static void bt_a2dp_disconnect(const void *buf, uint16_t len)
>
> if (dev->io) {
> bt_a2dp_notify_state(dev, HAL_A2DP_STATE_DISCONNECTED);
> + a2dp_device_free(dev);
> goto failed;
> }
>
> --
> 1.8.3.2
It used to be like that and we changed because now you have to call
a2dp_device_free in all places where bt_a2dp_notify_state(dev,
HAL_A2DP_STATE_DISCONNECTED); is called.
--
Luiz Augusto von Dentz
^ permalink raw reply
* [PATCH BlueZ 8/8] android/AVRCP: Add initial socket handling
From: Luiz Augusto von Dentz @ 2014-01-23 16:39 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1390495198-28400-1-git-send-email-luiz.dentz@gmail.com>
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This adds the initial socket listening and handling incoming connections.
---
android/avrcp.c | 128 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 128 insertions(+)
diff --git a/android/avrcp.c b/android/avrcp.c
index 02dbb68..a230ab8 100644
--- a/android/avrcp.c
+++ b/android/avrcp.c
@@ -28,6 +28,7 @@
#include <stdbool.h>
#include <glib.h>
+#include "btio/btio.h"
#include "lib/bluetooth.h"
#include "lib/sdp.h"
#include "lib/sdp_lib.h"
@@ -36,6 +37,7 @@
#include "avrcp.h"
#include "hal-msg.h"
#include "ipc.h"
+#include "avctp.h"
#define L2CAP_PSM_AVCTP 0x17
@@ -46,6 +48,13 @@
static bdaddr_t adapter_addr;
static uint32_t record_id = 0;
+static GSList *devices = NULL;
+static GIOChannel *server = NULL;
+
+struct avrcp_device {
+ bdaddr_t dst;
+ struct avctp *session;
+};
static const struct ipc_handler cmd_handlers[] = {
};
@@ -118,14 +127,124 @@ static sdp_record_t *avrcp_record(void)
return record;
}
+static void avrcp_device_free(void *data)
+{
+ struct avrcp_device *dev = data;
+
+ if (dev->session)
+ avctp_shutdown(dev->session);
+
+ devices = g_slist_remove(devices, dev);
+ g_free(dev);
+}
+
+static struct avrcp_device *avrcp_device_new(const bdaddr_t *dst)
+{
+ struct avrcp_device *dev;
+
+ dev = g_new0(struct avrcp_device, 1);
+ bacpy(&dev->dst, dst);
+ devices = g_slist_prepend(devices, dev);
+
+ return dev;
+}
+
+static int device_cmp(gconstpointer s, gconstpointer user_data)
+{
+ const struct avrcp_device *dev = s;
+ const bdaddr_t *dst = user_data;
+
+ return bacmp(&dev->dst, dst);
+}
+
+static void disconnect_cb(void *data)
+{
+ struct avrcp_device *dev = data;
+
+ DBG("");
+
+ dev->session = NULL;
+
+ avrcp_device_free(dev);
+}
+
+static void connect_cb(GIOChannel *chan, GError *err, gpointer user_data)
+{
+ struct avrcp_device *dev;
+ bdaddr_t src, dst;
+ char address[18];
+ uint16_t imtu, omtu;
+ GError *gerr = NULL;
+ GSList *l;
+ int fd;
+
+ if (err) {
+ error("%s", err->message);
+ return;
+ }
+
+ bt_io_get(chan, &gerr,
+ BT_IO_OPT_SOURCE_BDADDR, &src,
+ BT_IO_OPT_DEST_BDADDR, &dst,
+ BT_IO_OPT_IMTU, &imtu,
+ BT_IO_OPT_OMTU, &omtu,
+ BT_IO_OPT_INVALID);
+ if (gerr) {
+ error("%s", gerr->message);
+ g_error_free(gerr);
+ g_io_channel_shutdown(chan, TRUE, NULL);
+ return;
+ }
+
+ ba2str(&dst, address);
+ DBG("Incoming connection from %s", address);
+
+ l = g_slist_find_custom(devices, &dst, device_cmp);
+ if (l) {
+ error("Unexpected connection");
+ return;
+ }
+
+ fd = g_io_channel_unix_get_fd(chan);
+
+ dev = avrcp_device_new(&dst);
+ dev->session = avctp_new(fd, imtu, omtu, 0x0100);
+
+ if (!dev->session) {
+ avrcp_device_free(dev);
+ return;
+ }
+
+ avctp_set_destroy_cb(dev->session, disconnect_cb, dev);
+
+ /* FIXME: get the real name of the device */
+ avctp_init_uinput(dev->session, "bluetooth", address);
+
+ g_io_channel_set_close_on_unref(chan, FALSE);
+
+ DBG("%s connected", address);
+}
+
bool bt_avrcp_register(const bdaddr_t *addr)
{
+ GError *err = NULL;
sdp_record_t *rec;
DBG("");
bacpy(&adapter_addr, addr);
+ server = bt_io_listen(connect_cb, NULL, NULL, NULL, &err,
+ BT_IO_OPT_SOURCE_BDADDR, &adapter_addr,
+ BT_IO_OPT_PSM, L2CAP_PSM_AVCTP,
+ BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_MEDIUM,
+ BT_IO_OPT_INVALID);
+ if (!server) {
+ error("Failed to listen on AVDTP channel: %s", err->message);
+ g_error_free(err);
+ return false;
+ }
+
rec = avrcp_record();
if (!rec) {
error("Failed to allocate AVRCP record");
@@ -149,8 +268,17 @@ void bt_avrcp_unregister(void)
{
DBG("");
+ g_slist_free_full(devices, avrcp_device_free);
+ devices = NULL;
+
ipc_unregister(HAL_SERVICE_ID_AVRCP);
bt_adapter_remove_record(record_id);
record_id = 0;
+
+ if (server) {
+ g_io_channel_shutdown(server, TRUE, NULL);
+ g_io_channel_unref(server);
+ server = NULL;
+ }
}
--
1.8.4.2
^ permalink raw reply related
* [PATCH BlueZ 7/8] android/AVCTP: Add avctp_set_destroy_cb
From: Luiz Augusto von Dentz @ 2014-01-23 16:39 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1390495198-28400-1-git-send-email-luiz.dentz@gmail.com>
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This adds avctp_set_destroy_cb that can be use to set a callback when
the AVCTP has been disconnected.
---
android/avctp.c | 13 +++++++++++++
android/avctp.h | 3 +++
2 files changed, 16 insertions(+)
diff --git a/android/avctp.c b/android/avctp.c
index a31dcc6..87e26be 100644
--- a/android/avctp.c
+++ b/android/avctp.c
@@ -175,6 +175,9 @@ struct avctp {
uint8_t key_quirks[256];
struct key_pressed key;
uint16_t version;
+
+ avctp_destroy_cb_t destroy;
+ void *data;
};
struct avctp_passthrough_handler {
@@ -1446,6 +1449,13 @@ int avctp_connect_browsing(struct avctp *session, int fd, size_t imtu,
return 0;
}
+void avctp_set_destroy_cb(struct avctp *session, avctp_destroy_cb_t cb,
+ void *user_data)
+{
+ session->destroy = cb;
+ session->data = user_data;
+}
+
void avctp_shutdown(struct avctp *session)
{
if (!session)
@@ -1457,6 +1467,9 @@ void avctp_shutdown(struct avctp *session)
if (session->control)
avctp_channel_destroy(session->control);
+ if (session->destroy)
+ session->destroy(session->data);
+
if (session->key.timer > 0)
g_source_remove(session->key.timer);
diff --git a/android/avctp.h b/android/avctp.h
index 99aaf95..a22bf13 100644
--- a/android/avctp.h
+++ b/android/avctp.h
@@ -103,6 +103,9 @@ typedef size_t (*avctp_browsing_pdu_cb) (struct avctp *session,
typedef void (*avctp_destroy_cb_t) (void *user_data);
struct avctp *avctp_new(int fd, size_t imtu, size_t omtu, uint16_t version);
+void avctp_set_destroy_cb(struct avctp *session, avctp_destroy_cb_t cb,
+ void *user_data);
+
int avctp_init_uinput(struct avctp *session, const char *name,
const char *address);
int avctp_connect_browsing(struct avctp *session, int fd, size_t imtu,
--
1.8.4.2
^ permalink raw reply related
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