2022-11-09 22:32:10

by Luiz Augusto von Dentz

[permalink] [raw]
Subject: [PATCH BlueZ 1/4] shared/util: Add iovec helpers

From: Luiz Augusto von Dentz <[email protected]>

This adds iovec helpers functions.
---
src/shared/util.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++
src/shared/util.h | 6 ++++++
2 files changed, 59 insertions(+)

diff --git a/src/shared/util.c b/src/shared/util.c
index 0a0308cb0786..228044be459a 100644
--- a/src/shared/util.c
+++ b/src/shared/util.c
@@ -189,6 +189,59 @@ void util_clear_uid(uint64_t *bitmap, uint8_t id)
*bitmap &= ~(((uint64_t)1) << (id - 1));
}

+struct iovec *util_iov_dup(const struct iovec *iov, size_t cnt)
+{
+ struct iovec *dup;
+ size_t i;
+
+ if (!iov)
+ return NULL;
+
+ dup = new0(struct iovec, cnt);
+
+ for (i = 0; i < cnt; i++)
+ util_iov_memcpy(&dup[i], iov[i].iov_base, iov[i].iov_len);
+
+ return dup;
+}
+
+int util_iov_memcmp(const struct iovec *iov1, const struct iovec *iov2)
+{
+ if (!iov1)
+ return 1;
+
+ if (!iov2)
+ return -1;
+
+ if (iov1->iov_len != iov2->iov_len)
+ return iov1->iov_len - iov2->iov_len;
+
+ return memcmp(iov1->iov_base, iov2->iov_base, iov1->iov_len);
+}
+
+void util_iov_memcpy(struct iovec *iov, void *src, size_t len)
+{
+ if (!iov)
+ return;
+
+ iov->iov_base = realloc(iov->iov_base, len);
+ iov->iov_len = len;
+ memcpy(iov->iov_base, src, len);
+}
+
+void util_iov_free(struct iovec *iov, size_t cnt)
+{
+ size_t i;
+
+ if (!iov)
+ return;
+
+ for (i = 0; i < cnt; i++)
+ free(iov[i].iov_base);
+
+ free(iov);
+}
+
static const struct {
uint16_t uuid;
const char *str;
diff --git a/src/shared/util.h b/src/shared/util.h
index 554481e1e1ea..765a4e956636 100644
--- a/src/shared/util.h
+++ b/src/shared/util.h
@@ -15,6 +15,7 @@
#include <byteswap.h>
#include <string.h>
#include <sys/types.h>
+#include <sys/uio.h>

#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
#define BIT(n) (1 << (n))
@@ -109,6 +110,11 @@ ssize_t util_getrandom(void *buf, size_t buflen, unsigned int flags);
uint8_t util_get_uid(uint64_t *bitmap, uint8_t max);
void util_clear_uid(uint64_t *bitmap, uint8_t id);

+struct iovec *util_iov_dup(const struct iovec *iov, size_t cnt);
+int util_iov_memcmp(const struct iovec *iov1, const struct iovec *iov2);
+void util_iov_memcpy(struct iovec *iov, void *src, size_t len);
+void util_iov_free(struct iovec *iov, size_t cnt);
+
const char *bt_uuid16_to_str(uint16_t uuid);
const char *bt_uuid32_to_str(uint32_t uuid);
const char *bt_uuid128_to_str(const uint8_t uuid[16]);
--
2.37.3



2022-11-09 22:32:10

by Luiz Augusto von Dentz

[permalink] [raw]
Subject: [PATCH BlueZ 3/4] shared/bap: Fix crash when canceling requests

From: Luiz Augusto von Dentz <[email protected]>

If bt_bap_unref/bap_free is called while there is an ongoing pending
request it may endup calling into bap_notify_ready which will try to
notify ready callbacks while holding a reference, but in case the
reference is already 0 that means it would switch to 1 and back 0
causing a double free.

To prevent that bap_notify_ready now checks that the reference is not 0
with use of bt_bap_ref_safe.
---
src/shared/bap.c | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/src/shared/bap.c b/src/shared/bap.c
index c3c0d596fe91..1bb982fd080a 100644
--- a/src/shared/bap.c
+++ b/src/shared/bap.c
@@ -2721,6 +2721,14 @@ struct bt_bap *bt_bap_ref(struct bt_bap *bap)
return bap;
}

+static struct bt_bap *bt_bap_ref_safe(struct bt_bap *bap)
+{
+ if (!bap || !bap->ref_count)
+ return NULL;
+
+ return bt_bap_ref(bap);
+}
+
void bt_bap_unref(struct bt_bap *bap)
{
if (!bap)
@@ -2739,7 +2747,8 @@ static void bap_notify_ready(struct bt_bap *bap)
if (!queue_isempty(bap->pending))
return;

- bt_bap_ref(bap);
+ if (!bt_bap_ref_safe(bap))
+ return;

for (entry = queue_get_entries(bap->ready_cbs); entry;
entry = entry->next) {
--
2.37.3


2022-11-09 22:44:25

by Luiz Augusto von Dentz

[permalink] [raw]
Subject: [PATCH BlueZ 4/4] unit: Introduce test-bap

From: Luiz Augusto von Dentz <[email protected]>

Test Summary
------------
BAP/UCL/DISC/BV-01-C Passed
BAP/UCL/DISC/BV-02-C Passed
BAP/UCL/DISC/BV-06-C Passed
BAP/UCL/DISC/BV-05-C Passed
Total: 4, Passed: 4 (100.0%), Failed: 0, Not Run: 0
---
Makefile.am | 6 +
unit/test-bap.c | 488 ++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 494 insertions(+)
create mode 100644 unit/test-bap.c

diff --git a/Makefile.am b/Makefile.am
index 5fd137bbab4e..4ad2ca398d6b 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -569,6 +569,12 @@ unit_test_gattrib_LDADD = lib/libbluetooth-internal.la \
src/libshared-glib.la \
$(GLIB_LIBS) $(DBUS_LIBS) -ldl -lrt

+unit_tests += unit/test-bap
+
+unit_test_bap_SOURCES = unit/test-bap.c
+unit_test_bap_LDADD = src/libshared-glib.la \
+ lib/libbluetooth-internal.la $(GLIB_LIBS)
+
if MIDI
unit_tests += unit/test-midi
unit_test_midi_CPPFLAGS = $(AM_CPPFLAGS) $(ALSA_CFLAGS) -DMIDI_TEST
diff --git a/unit/test-bap.c b/unit/test-bap.c
new file mode 100644
index 000000000000..d012aff5bccc
--- /dev/null
+++ b/unit/test-bap.c
@@ -0,0 +1,488 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ *
+ * BlueZ - Bluetooth protocol stack for Linux
+ *
+ * Copyright (C) 2022 Intel Corporation.
+ *
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#define _GNU_SOURCE
+#include <unistd.h>
+#include <string.h>
+#include <sys/socket.h>
+#include <fcntl.h>
+
+#include <glib.h>
+
+#include "lib/bluetooth.h"
+#include "lib/uuid.h"
+#include "src/shared/util.h"
+#include "src/shared/io.h"
+#include "src/shared/tester.h"
+#include "src/shared/queue.h"
+#include "src/shared/att.h"
+#include "src/shared/gatt-db.h"
+#include "src/shared/gatt-client.h"
+#include "src/shared/bap.h"
+
+struct test_data {
+ struct bt_gatt_client *client;
+ struct bt_bap *bap;
+ size_t iovcnt;
+ struct iovec *iov;
+};
+
+#define iov_data(args...) ((const struct iovec[]) { args })
+
+#define define_test(name, function, args...) \
+ do { \
+ const struct iovec iov[] = { args }; \
+ static struct test_data data; \
+ data.iovcnt = ARRAY_SIZE(iov_data(args)); \
+ data.iov = util_iov_dup(iov, ARRAY_SIZE(iov_data(args))); \
+ tester_add(name, &data, test_setup, function, \
+ test_teardown); \
+ } while (0)
+
+static void client_ready_cb(bool success, uint8_t att_ecode, void *user_data)
+{
+ if (!success)
+ tester_setup_failed();
+ else
+ tester_setup_complete();
+}
+
+/* GATT Discover All procedure */
+static const struct iovec setup_data[] = {
+ /* ATT: Exchange MTU Response (0x03) len 2
+ * Server RX MTU: 64
+ */
+ IOV_DATA(0x02, 0x40, 0x00),
+ /* ATT: Exchange MTU Request (0x02) len 2
+ * Client RX MTU: 64
+ */
+ IOV_DATA(0x03, 0x40, 0x00),
+ /* ATT: Read By Type Request (0x08) len 6
+ * Handle range: 0x0001-0xffff
+ * Attribute type: Server Supported Features (0x2b3a)
+ */
+ IOV_DATA(0x08, 0x01, 0x00, 0xff, 0xff, 0x3a, 0x2b),
+ /* ATT: Error Response (0x01) len 4
+ * Read By Type Request (0x08)
+ * Handle: 0x0001
+ * Error: Attribute Not Found (0x0a)
+ */
+ IOV_DATA(0x01, 0x08, 0x01, 0x00, 0x0a),
+ /*
+ * ATT: Read By Group Type Request (0x10) len 6
+ * Handle range: 0x0001-0xffff
+ * Attribute group type: Primary Service (0x2800)
+ */
+ IOV_DATA(0x10, 0x01, 0x00, 0xff, 0xff, 0x00, 0x28),
+ /*
+ * ATT: Read By Group Type Response (0x11) len 37
+ * Attribute data length: 6
+ * Attribute group list: 2 entries
+ * Handle range: 0x0001-0x0013
+ * UUID: Published Audio Capabilities (0x1850)
+ * Handle range: 0x0014-0x0023
+ * UUID: Audio Stream Control (0x184e)
+ */
+ IOV_DATA(0x11, 0x06,
+ 0x01, 0x00, 0x13, 0x00, 0x50, 0x18,
+ 0x14, 0x00, 0x23, 0x00, 0x4e, 0x18),
+ /* ATT: Read By Group Type Request (0x10) len 6
+ * Handle range: 0x0024-0xffff
+ * Attribute group type: Primary Service (0x2800)
+ */
+ IOV_DATA(0x10, 0x24, 0x00, 0xff, 0xff, 0x00, 0x28),
+ /* ATT: Error Response (0x01) len 4
+ * Read By Group Type Request (0x10)
+ * Handle: 0x0024
+ * Error: Attribute Not Found (0x0a)
+ */
+ IOV_DATA(0x01, 0x10, 0x24, 0x00, 0x0a),
+ /* ATT: Read By Group Type Request (0x10) len 6
+ * Handle range: 0x0001-0xffff
+ * Attribute group type: Secondary Service (0x2801)
+ */
+ IOV_DATA(0x10, 0x01, 0x00, 0xff, 0xff, 0x01, 0x28),
+ /* ATT: Error Response (0x01) len 4
+ * Read By Group Type Request (0x10)
+ * Handle: 0x0001
+ * Error: Attribute Not Found (0x0a)
+ */
+ IOV_DATA(0x01, 0x10, 0x01, 0x00, 0x0a),
+ /* ATT: Read By Type Request (0x08) len 6
+ * Handle range: 0x0001-0x0023
+ * Attribute group type: Include (0x2802)
+ */
+ IOV_DATA(0x08, 0x01, 0x00, 0x23, 0x00, 0x02, 0x28),
+ /* ATT: Error Response (0x01) len 4
+ * Read By Group Type Request (0x10)
+ * Handle: 0x0001
+ * Error: Attribute Not Found (0x0a)
+ */
+ IOV_DATA(0x01, 0x08, 0x01, 0x00, 0x0a),
+ /* ATT: Read By Type Request (0x08) len 6
+ * Handle range: 0x0001-0x0023
+ * Attribute type: Characteristic (0x2803)
+ */
+ IOV_DATA(0x08, 0x01, 0x00, 0x23, 0x00, 0x03, 0x28),
+ /* ATT: Read By Type Response (0x09) len 57
+ * Attribute data length: 7
+ * Attribute data list: 8 entries
+ * Handle: 0x0002
+ * Value: 120300c92b
+ * Properties: 0x12
+ * Read (0x02)
+ * Notify (0x10)
+ * Value Handle: 0x0003
+ * Value UUID: Sink PAC (0x2bc9)
+ * Handle: 0x0005
+ * Value: 120600ca2b
+ * Properties: 0x12
+ * Read (0x02)
+ * Notify (0x10)
+ * Value Handle: 0x0006
+ * Value UUID: Sink Audio Locations (0x2bca)
+ * Handle: 0x0008
+ * Value: 120900cb2b
+ * Properties: 0x12
+ * Read (0x02)
+ * Notify (0x10)
+ * Value Handle: 0x0009
+ * Value UUID: Source PAC (0x2bcb)
+ * Handle: 0x000b
+ * Value: 120c00cc2b
+ * Properties: 0x12
+ * Read (0x02)
+ * Notify (0x10)
+ * Value Handle: 0x000c
+ * Value UUID: Source Audio Locations (0x2bcc)
+ * Handle: 0x000e
+ * Value: 120f00cd2b
+ * Properties: 0x12
+ * Read (0x02)
+ * Notify (0x10)
+ * Value Handle: 0x000f
+ * Value UUID: Available Audio Contexts (0x2bcd)
+ * Handle: 0x0011
+ * Value: 121200ce2b
+ * Properties: 0x12
+ * Read (0x02)
+ * Notify (0x10)
+ * Value Handle: 0x0012
+ * Value UUID: Supported Audio Contexts (0x2bce)
+ * Handle: 0x0015
+ * Value: 121600c42b
+ * Properties: 0x12
+ * Read (0x02)
+ * Notify (0x10)
+ * Value Handle: 0x0016
+ * Value UUID: Sink ASE (0x2bc4)
+ * Handle: 0x0018
+ * Value: 121900c42b
+ * Properties: 0x12
+ * Read (0x02)
+ * Notify (0x10)
+ * Value Handle: 0x0019
+ * Value UUID: Sink ASE (0x2bc4)
+ */
+ IOV_DATA(0x09, 0x07,
+ 0x02, 0x00, 0x12, 0x03, 0x00, 0xc9, 0x2b,
+ 0x05, 0x00, 0x12, 0x06, 0x00, 0xca, 0x2b,
+ 0x08, 0x00, 0x12, 0x09, 0x00, 0xcb, 0x2b,
+ 0x0b, 0x00, 0x12, 0x0c, 0x00, 0xcc, 0x2b,
+ 0x0e, 0x00, 0x12, 0x0f, 0x00, 0xcd, 0x2b,
+ 0x11, 0x00, 0x12, 0x12, 0x00, 0xce, 0x2b,
+ 0x15, 0x00, 0x12, 0x16, 0x00, 0xc4, 0x2b,
+ 0x18, 0x00, 0x12, 0x19, 0x00, 0xc4, 0x2b),
+ /* ATT: Read By Type Request (0x08) len 6
+ * Handle range: 0x0001-0x0023
+ * Attribute type: Characteristic (0x2803)
+ */
+ IOV_DATA(0x08, 0x19, 0x00, 0x23, 0x00, 0x03, 0x28),
+ /* ATT: Read By Type Response (0x09) len 22
+ * Attribute data length: 7
+ * Attribute data list: 3 entries
+ * Handle: 0x001b
+ * Value: 121c00c52b
+ * Properties: 0x12
+ * Read (0x02)
+ * Notify (0x10)
+ * Value Handle: 0x001c
+ * Value UUID: Source ASE (0x2bc5)
+ * Handle: 0x001e
+ * Value: 121f00c52b
+ * Properties: 0x12
+ * Read (0x02)
+ * Notify (0x10)
+ * Value Handle: 0x001f
+ * Value UUID: Source ASE (0x2bc5)
+ * Handle: 0x0021
+ * Value: 182200c62b
+ * Properties: 0x18
+ * Write (0x08)
+ * Notify (0x10)
+ * Value Handle: 0x0022
+ * Value UUID: ASE Control Point (0x2bc6)
+ */
+ IOV_DATA(0x09, 0x07,
+ 0x1b, 0x00, 0x12, 0x1c, 0x00, 0xc5, 0x2b,
+ 0x1e, 0x00, 0x12, 0x1f, 0x00, 0xc5, 0x2b,
+ 0x21, 0x00, 0x18, 0x22, 0x00, 0xc6, 0x2b),
+ /* ATT: Read By Type Request (0x08) len 6
+ * Handle range: 0x0022-0x0023
+ * Attribute type: Characteristic (0x2803)
+ */
+ IOV_DATA(0x08, 0x22, 0x00, 0x23, 0x00, 0x03, 0x28),
+ /* ATT: Error Response (0x01) len 4
+ * Read By Type Request (0x08)
+ * Handle: 0x0022
+ * Error: Attribute Not Found (0x0a)
+ */
+ IOV_DATA(0x01, 0x08, 0x23, 0x00, 0x0a),
+ /* ACL Data TX: Handle 42 flags 0x00 dlen 11
+ * ATT: Read By Type Request (0x08) len 6
+ * Handle range: 0x0001-0xffff
+ * Attribute type: Database Hash (0x2b2a)
+ */
+ IOV_DATA(0x08, 0x01, 0x00, 0xff, 0xff, 0x2a, 0x2b),
+ /* ATT: Error Response (0x01) len 4
+ * Read By Type Request (0x08)
+ * Handle: 0x0001
+ * Error: Attribute Not Found (0x0a)
+ */
+ IOV_DATA(0x01, 0x08, 0x01, 0x00, 0x0a),
+};
+
+static void print_debug(const char *str, void *user_data)
+{
+ const char *prefix = user_data;
+
+ if (tester_use_debug())
+ tester_debug("%s%s", prefix, str);
+}
+
+static void test_setup(const void *user_data)
+{
+ struct test_data *data = (void *)user_data;
+ struct bt_att *att;
+ struct gatt_db *db;
+ struct io *io;
+
+ io = tester_setup_io(setup_data, ARRAY_SIZE(setup_data));
+ g_assert(io);
+
+ att = bt_att_new(io_get_fd(io), false);
+ g_assert(att);
+
+ bt_att_set_debug(att, BT_ATT_DEBUG, print_debug, "bt_att:", NULL);
+
+ db = gatt_db_new();
+ g_assert(db);
+
+ data->client = bt_gatt_client_new(db, att, 64, 0);
+ g_assert(data->client);
+
+ bt_gatt_client_set_debug(data->client, print_debug, "bt_gatt_client:",
+ NULL);
+
+ bt_gatt_client_ready_register(data->client, client_ready_cb, data,
+ NULL);
+
+ bt_att_unref(att);
+ gatt_db_unref(db);
+}
+
+static void test_complete_cb(const void *user_data)
+{
+ tester_test_passed();
+}
+
+static void test_client(const void *user_data)
+{
+ struct test_data *data = (void *)user_data;
+ struct io *io;
+ struct gatt_db *db;
+
+ io = tester_setup_io(data->iov, data->iovcnt);
+ g_assert(io);
+
+ tester_io_set_complete_func(test_complete_cb);
+
+ db = gatt_db_new();
+ g_assert(db);
+
+ data->bap = bt_bap_new(db, bt_gatt_client_get_db(data->client));
+ g_assert(data->bap);
+
+ bt_bap_set_debug(data->bap, print_debug, "bt_bap:", NULL);
+
+ bt_bap_attach(data->bap, data->client);
+}
+
+static void test_teardown(const void *user_data)
+{
+ struct test_data *data = (void *)user_data;
+
+ bt_bap_unref(data->bap);
+ bt_gatt_client_unref(data->client);
+ util_iov_free(data->iov, data->iovcnt);
+
+ tester_teardown_complete();
+}
+
+/* ATT: Read Request (0x0a) len 2
+ * Handle: 0x0003 Type: Sink PAC (0x2bc9)
+ * ATT: Read Response (0x0b) len 24
+ * Value: 010600000000100301ff0002020302030305041e00f00000
+ * Handle: 0x0003 Type: Sink PAC (0x2bc9)
+ * Number of PAC(s): 1
+ * PAC #0:
+ * Codec: LC3 (0x06)
+ * Codec Specific Capabilities #0: len 0x03 type 0x01
+ * Sampling Frequencies: 0x00ff
+ * 8 Khz (0x0001)
+ * 11.25 Khz (0x0002)
+ * 16 Khz (0x0004)
+ * 22.05 Khz (0x0008)
+ * 24 Khz (0x0010)
+ * 32 Khz (0x0020)
+ * 44.1 Khz (0x0040)
+ * 48 Khz (0x0080)
+ * Codec Specific Capabilities #1: len 0x02 type 0x02
+ * Frame Duration: 0x0003
+ * 7.5 ms (0x01)
+ * 10 ms (0x02)
+ * Codec Specific Capabilities #2: len 0x02 type 0x03
+ * Audio Channel Count: 0x03
+ * 1 channel (0x01)
+ * 2 channels (0x02)
+ * Codec Specific Capabilities #3: len 0x05 type 0x04
+ * Frame Length: 30 (0x001e) - 240 (0x00f0)
+ * ATT: Read Request (0x0a) len 2
+ * Handle: 0x0006 Type: Sink Audio Location (0x2bca)
+ * ATT: Read Response (0x0b) len 4
+ * Value: 03000000
+ * Handle: 0x0006 Type: Sink Audio Locations (0x2bca)
+ * Location: 0x00000003
+ * Front Left (0x00000001)
+ * Front Right (0x00000002)
+ */
+#define DISC_SINK_PAC \
+ IOV_DATA(0x0a, 0x03, 0x00), \
+ IOV_DATA(0x0b, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, 0x10, 0x03, 0x01, \
+ 0xff, 0x00, 0x02, 0x02, 0x03, 0x02, 0x03, 0x03, 0x05, 0x04, \
+ 0x1e, 0x00, 0xf0, 0x00, 0x00), \
+ IOV_DATA(0x0a, 0x06, 0x00), \
+ IOV_DATA(0x0b, 0x03, 0x00, 0x00, 0x00)
+
+/* ATT: Read Request (0x0a) len 2
+ * Handle: 0x0009 Type: Source PAC (0x2bcb)
+ * ATT: Read Response (0x0b) len 24
+ * Value: 010600000000100301ff0002020302030305041e00f00000
+ * Handle: 0x0009 Type: Source PAC (0x2bcb)
+ * Number of PAC(s): 1
+ * PAC #0:
+ * Codec: LC3 (0x06)
+ * Codec Specific Capabilities #0: len 0x03 type 0x01
+ * Sampling Frequencies: 0x00ff
+ * 8 Khz (0x0001)
+ * 11.25 Khz (0x0002)
+ * 16 Khz (0x0004)
+ * 22.05 Khz (0x0008)
+ * 24 Khz (0x0010)
+ * 32 Khz (0x0020)
+ * 44.1 Khz (0x0040)
+ * 48 Khz (0x0080)
+ * Codec Specific Capabilities #1: len 0x02 type 0x02
+ * Frame Duration: 0x0003
+ * 7.5 ms (0x01)
+ * 10 ms (0x02)
+ * Codec Specific Capabilities #2: len 0x02 type 0x03
+ * Audio Channel Count: 0x03
+ * 1 channel (0x01)
+ * 2 channels (0x02)
+ * Codec Specific Capabilities #3: len 0x05 type 0x04
+ * Frame Length: 30 (0x001e) - 240 (0x00f0)
+ * ATT: Read Request (0x0a) len 2
+ * Handle: 0x000c Type: Source Audio Location (0x2bcc)
+ * ATT: Read Response (0x0b) len 4
+ * Value: 03000000
+ * Handle: 0x000c Type: Source Audio Locations (0x2bcc)
+ * Location: 0x00000003
+ * Front Left (0x00000001)
+ * Front Right (0x00000002)
+ */
+#define DISC_SOURCE_PAC \
+ DISC_SINK_PAC, \
+ IOV_DATA(0x0a, 0x09, 0x00), \
+ IOV_DATA(0x0b, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, 0x10, 0x03, 0x01, \
+ 0xff, 0x00, 0x02, 0x02, 0x03, 0x02, 0x03, 0x03, 0x05, 0x04, \
+ 0x1e, 0x00, 0xf0, 0x00, 0x00), \
+ IOV_DATA(0x0a, 0x0c, 0x00), \
+ IOV_DATA(0x0b, 0x03, 0x00, 0x00, 0x00)
+
+/* ATT: Read Request (0x0a) len 2
+ * Handle: 0x000f Type: Available Audio Contexts (0x2bcd)
+ * ATT: Read Response (0x0b) len 4
+ * Value: ff0f0e00
+ * Handle: 0x000f Type: Available Audio Contexts (0x2bcd)
+ */
+#define DISC_CTX \
+ DISC_SOURCE_PAC, \
+ IOV_DATA(0x0a, 0x0f, 0x00), \
+ IOV_DATA(0x0b, 0xff, 0x0f, 0x0e, 0x00)
+
+/* ATT: Read Request (0x0a) len 2
+ * Handle: 0x0012 Type: Supported Audio Contexts (0x2bce)
+ * ATT: Read Response (0x0b) len 4
+ * Value: ff0f0e00
+ * Handle: 0x0012 Type: Supported Audio Contexts (0x2bce)
+ */
+#define DISC_SUP_CTX \
+ DISC_CTX, \
+ IOV_DATA(0x0a, 0x12, 0x00), \
+ IOV_DATA(0x0b, 0xff, 0x0f, 0x0e, 0x00)
+
+static void test_disc(void)
+{
+ /* The IUT discovers the characteristics specified in the PAC
+ * Characteristic and Location Characteristic columns in Table 4.4.
+ * The IUT reads the values of the characteristics specified in the PAC
+ * Characteristic and Location Characteristic columns.
+ */
+ define_test("BAP/UCL/DISC/BV-01-C", test_client, DISC_SINK_PAC);
+ define_test("BAP/UCL/DISC/BV-02-C", test_client, DISC_SOURCE_PAC);
+
+ /* BAP/UCL/DISC/BV-06-C [Discover Available Audio Contexts]
+ *
+ * The IUT successfully reads the value of the Available Audio Contexts
+ * characteristic on the LowerTester.
+ */
+ define_test("BAP/UCL/DISC/BV-06-C", test_client, DISC_CTX);
+
+ /* BAP/UCL/DISC/BV-05-C [Discover Supported Audio Contexts]
+ *
+ * The IUT successfully reads the value of the Supported Audio Contexts
+ * characteristic on the Lower Tester.
+ */
+ define_test("BAP/UCL/DISC/BV-05-C", test_client, DISC_SUP_CTX);
+}
+
+int main(int argc, char *argv[])
+{
+ tester_init(&argc, &argv);
+
+ test_disc();
+
+ return tester_run();
+}
--
2.37.3


2022-11-09 23:48:59

by bluez.test.bot

[permalink] [raw]
Subject: RE: [BlueZ,1/4] shared/util: Add iovec helpers

This is automated email and please do not reply to this email!

Dear submitter,

Thank you for submitting the patches to the linux bluetooth mailing list.
This is a CI test results with your patch series:
PW Link:https://patchwork.kernel.org/project/bluetooth/list/?series=693816

---Test result---

Test Summary:
CheckPatch PASS 6.33 seconds
GitLint PASS 4.08 seconds
Prep - Setup ELL PASS 28.02 seconds
Build - Prep PASS 0.82 seconds
Build - Configure PASS 9.02 seconds
Build - Make PASS 878.85 seconds
Make Check PASS 11.77 seconds
Make Check w/Valgrind PASS 297.61 seconds
Make Distcheck PASS 244.45 seconds
Build w/ext ELL - Configure PASS 9.06 seconds
Build w/ext ELL - Make PASS 86.87 seconds
Incremental Build w/ patches PASS 411.79 seconds
Scan Build WARNING 1200.99 seconds

Details
##############################
Test: Scan Build - WARNING
Desc: Run Scan Build with patches
Output:
*****************************************************************************
The bugs reported by the scan-build may or may not be caused by your patches.
Please check the list and fix the bugs if they are caused by your patch.
*****************************************************************************
In file included from tools/mesh-gatt/crypto.c:32:
./src/shared/util.h:165:9: warning: 1st function call argument is an uninitialized value
return be32_to_cpu(get_unaligned((const uint32_t *) ptr));
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
./src/shared/util.h:31:26: note: expanded from macro 'be32_to_cpu'
#define be32_to_cpu(val) bswap_32(val)
^~~~~~~~~~~~~
/usr/include/byteswap.h:34:21: note: expanded from macro 'bswap_32'
#define bswap_32(x) __bswap_32 (x)
^~~~~~~~~~~~~~
In file included from tools/mesh-gatt/crypto.c:32:
./src/shared/util.h:175:9: warning: 1st function call argument is an uninitialized value
return be64_to_cpu(get_unaligned((const uint64_t *) ptr));
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
./src/shared/util.h:32:26: note: expanded from macro 'be64_to_cpu'
#define be64_to_cpu(val) bswap_64(val)
^~~~~~~~~~~~~
/usr/include/byteswap.h:37:21: note: expanded from macro 'bswap_64'
#define bswap_64(x) __bswap_64 (x)
^~~~~~~~~~~~~~
2 warnings generated.




---
Regards,
Linux Bluetooth

2022-11-15 19:54:10

by patchwork-bot+bluetooth

[permalink] [raw]
Subject: Re: [PATCH BlueZ 1/4] shared/util: Add iovec helpers

Hello:

This series was applied to bluetooth/bluez.git (master)
by Luiz Augusto von Dentz <[email protected]>:

On Wed, 9 Nov 2022 14:29:44 -0800 you wrote:
> From: Luiz Augusto von Dentz <[email protected]>
>
> This adds iovec helpers functions.
> ---
> src/shared/util.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++
> src/shared/util.h | 6 ++++++
> 2 files changed, 59 insertions(+)

Here is the summary with links:
- [BlueZ,1/4] shared/util: Add iovec helpers
(no matching commit)
- [BlueZ,2/4] shared/tester: Add tester_io_set_complete_func
https://git.kernel.org/pub/scm/bluetooth/bluez.git/?id=918c73acb778
- [BlueZ,3/4] shared/bap: Fix crash when canceling requests
https://git.kernel.org/pub/scm/bluetooth/bluez.git/?id=7fcd6889fb13
- [BlueZ,4/4] unit: Introduce test-bap
(no matching commit)

You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html