From: "Frédéric Danis" <frederic.danis@collabora.com>
To: linux-bluetooth@vger.kernel.org
Subject: [PATCH BlueZ v2 1/8] client/btpclient: Add BTP_EV_BAP_ASE_FOUND support
Date: Tue, 8 Sep 2026 19:06:26 +0200 [thread overview]
Message-ID: <20260908170633.510244-2-frederic.danis@collabora.com> (raw)
In-Reply-To: <20260908170633.510244-1-frederic.danis@collabora.com>
This is used at least for BAP/UCL/SCC/BV-004-C and BAP/UCL/SCC/BV-019-C
tests.
---
client/btpclient/bap.c | 109 +++++++++++++++++++++++++++++++++++
client/btpclient/bap.h | 2 +
client/btpclient/btpclient.c | 6 ++
client/btpclient/btpclient.h | 8 +++
src/shared/btp.h | 11 ++++
5 files changed, 136 insertions(+)
diff --git a/client/btpclient/bap.c b/client/btpclient/bap.c
index 0302fc1c0..cdbae4ac2 100644
--- a/client/btpclient/bap.c
+++ b/client/btpclient/bap.c
@@ -96,6 +96,115 @@ failed:
btp_send_error(btp, BTP_BAP_SERVICE, index, status);
}
+static void bap_charac_read_setup(struct l_dbus_message *message,
+ void *user_data)
+{
+ struct l_dbus_message_builder *builder;
+
+ builder = l_dbus_message_builder_new(message);
+ l_dbus_message_builder_enter_array(builder, "{sv}");
+ l_dbus_message_builder_enter_dict(builder, "sv");
+ l_dbus_message_builder_leave_dict(builder);
+ l_dbus_message_builder_leave_array(builder);
+ l_dbus_message_builder_finalize(builder);
+ l_dbus_message_builder_destroy(builder);
+}
+
+static void bap_read_ase_reply(struct l_dbus_proxy *proxy,
+ struct l_dbus_message *result,
+ void *user_data)
+{
+ struct btp_ase *ase = user_data;
+ struct btp_device *device = ase->device;
+ struct btp_adapter *adapter = find_adapter_by_device(device);
+ struct btp_bap_ase_found_ev *rp;
+ struct l_dbus_message_iter iter;
+ uint8_t *data;
+ uint32_t n;
+
+ if (l_dbus_message_is_error(result)) {
+ const char *name, *desc;
+
+ l_dbus_message_get_error(result, &name, &desc);
+ l_error("Failed to read value (%s), %s", name, desc);
+
+ btp_send_error(btp, BTP_BAP_SERVICE, adapter->index,
+ BTP_ERROR_FAIL);
+ return;
+ }
+
+ if (!l_dbus_message_get_arguments(result, "ay", &iter))
+ goto failed;
+
+ if (!l_dbus_message_iter_get_fixed_array(&iter, &data, &n)) {
+ l_debug("Cannot read value");
+ goto failed;
+ }
+
+ ase->ase_id = data[0];
+
+ rp = l_new(struct btp_bap_ase_found_ev, 1);
+ rp->address_type = device->address_type;
+ rp->address = device->address;
+ rp->dir = ase->dir;
+ rp->ase_id = data[0];
+
+ btp_send(btp, BTP_BAP_SERVICE, BTP_EV_BAP_ASE_FOUND, adapter->index,
+ sizeof(struct btp_bap_ase_found_ev), rp);
+
+ free(rp);
+
+ return;
+
+failed:
+ btp_send_error(btp, BTP_BAP_SERVICE, adapter->index, BTP_ERROR_FAIL);
+}
+
+void bap_proxy_added(struct l_dbus_proxy *proxy, void *user_data)
+{
+ struct btp_device *device = user_data;
+ const char *interface = l_dbus_proxy_get_interface(proxy);
+
+ if (!strcmp(interface, "org.bluez.GattCharacteristic1")) {
+ char *str, str_uuid[MAX_LEN_UUID_STR];
+ bt_uuid_t uuid;
+ struct btp_ase *ase;
+
+ if (!l_dbus_proxy_get_property(proxy, "UUID", "s", &str))
+ return;
+
+ bt_uuid16_create(&uuid, ASE_SINK_UUID);
+ bt_uuid_to_string(&uuid, str_uuid, MAX_LEN_UUID_STR);
+ if (!bt_uuid_strcmp(str, str_uuid)) {
+ ase = l_new(struct btp_ase, 1);
+ ase->device = device;
+ ase->dir = BTP_BAP_DIR_SINK;
+ ase->uuid = uuid;
+ l_queue_push_tail(device->ases, ase);
+
+ l_dbus_proxy_method_call(proxy, "ReadValue",
+ bap_charac_read_setup,
+ bap_read_ase_reply,
+ ase, NULL);
+ }
+
+ bt_uuid16_create(&uuid, ASE_SOURCE_UUID);
+ bt_uuid_to_string(&uuid, str_uuid, MAX_LEN_UUID_STR);
+ if (!bt_uuid_strcmp(str, str_uuid)) {
+ ase = l_new(struct btp_ase, 1);
+ ase->device = device;
+ ase->dir = BTP_BAP_DIR_SOURCE;
+ ase->uuid = uuid;
+ l_queue_push_tail(device->ases, ase);
+
+ l_dbus_proxy_method_call(proxy, "ReadValue",
+ bap_charac_read_setup,
+ bap_read_ase_reply,
+ ase, NULL);
+ }
+ }
+}
+
bool bap_register_service(struct btp *btp_, struct l_dbus *dbus_,
struct l_dbus_client *client)
{
diff --git a/client/btpclient/bap.h b/client/btpclient/bap.h
index 2b7a218b5..7fea19f8b 100644
--- a/client/btpclient/bap.h
+++ b/client/btpclient/bap.h
@@ -11,3 +11,5 @@ bool bap_register_service(struct btp *btp_, struct l_dbus *dbus_,
struct l_dbus_client *client);
void bap_unregister_service(struct btp *btp);
bool bap_is_service_registered(void);
+
+void bap_proxy_added(struct l_dbus_proxy *proxy, void *user_data);
diff --git a/client/btpclient/btpclient.c b/client/btpclient/btpclient.c
index 0d124bc7a..c0aa13287 100644
--- a/client/btpclient/btpclient.c
+++ b/client/btpclient/btpclient.c
@@ -25,6 +25,7 @@
#include "bluetooth/uuid.h"
#include "src/shared/btp.h"
#include "btpclient.h"
+#include "bap.h"
#include "core.h"
#include "gap.h"
#include "gatt.h"
@@ -347,6 +348,7 @@ static void signal_handler(uint32_t signo, void *user_data)
static void btp_device_free(struct btp_device *device)
{
+ l_queue_destroy(device->ases, l_free);
l_queue_destroy(device->services, l_free);
l_queue_destroy(device->characteristics, l_free);
l_queue_destroy(device->descriptors, l_free);
@@ -444,6 +446,7 @@ static void proxy_added(struct l_dbus_proxy *proxy, void *user_data)
device->services = l_queue_new();
device->characteristics = l_queue_new();
device->descriptors = l_queue_new();
+ device->ases = l_queue_new();
l_queue_push_tail(adapter->devices, device);
@@ -545,6 +548,9 @@ static void proxy_added(struct l_dbus_proxy *proxy, void *user_data)
}
l_queue_push_tail(device->characteristics, attribute);
+
+ if (bap_is_service_registered())
+ bap_proxy_added(proxy, device);
}
if (!strcmp(interface, "org.bluez.GattDescriptor1")) {
diff --git a/client/btpclient/btpclient.h b/client/btpclient/btpclient.h
index 8a5ea2172..74ca7278c 100644
--- a/client/btpclient/btpclient.h
+++ b/client/btpclient/btpclient.h
@@ -26,6 +26,14 @@ struct btp_device {
struct l_queue *services;
struct l_queue *characteristics;
struct l_queue *descriptors;
+ struct l_queue *ases;
+};
+
+struct btp_ase {
+ struct btp_device *device;
+ bt_uuid_t uuid;
+ uint8_t dir;
+ uint8_t ase_id;
};
struct btp_agent {
diff --git a/src/shared/btp.h b/src/shared/btp.h
index 5590bb51f..9757301f2 100644
--- a/src/shared/btp.h
+++ b/src/shared/btp.h
@@ -425,6 +425,9 @@ struct btp_gatt_write_rp {
uint8_t att_response;
} __packed;
+#define BTP_BAP_DIR_SINK 0x01
+#define BTP_BAP_DIR_SOURCE 0x02
+
#define BTP_OP_BAP_READ_SUPPORTED_COMMANDS 0x01
#define BTP_OP_BAP_DISCOVER 0x02
@@ -440,6 +443,14 @@ struct btp_bap_discovery_completed_ev {
uint8_t status;
} __packed;
+#define BTP_EV_BAP_ASE_FOUND 0x82
+struct btp_bap_ase_found_ev {
+ uint8_t address_type;
+ bdaddr_t address;
+ uint8_t dir;
+ uint8_t ase_id;
+} __packed;
+
struct btp;
typedef void (*btp_destroy_func_t)(void *user_data);
--
2.43.0
next prev parent reply other threads:[~2026-09-08 17:06 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-08 17:06 [PATCH BlueZ v2 0/8] client/btpclient: Add BAP/ASCS/PACS support for auto-pts BAP tests Frédéric Danis
2026-09-08 17:06 ` Frédéric Danis [this message]
2026-09-08 17:59 ` bluez.test.bot
2026-09-08 17:06 ` [PATCH BlueZ v2 2/8] client/btpclient: Get Codec capabilities on ASE reply Frédéric Danis
2026-09-08 17:06 ` [PATCH BlueZ v2 3/8] client/btpclient: Add ASCS BTP support Frédéric Danis
2026-09-08 17:06 ` [PATCH BlueZ v2 4/8] client/btpclient: Add BTP_OP_PACS_SET_LOCATION support Frédéric Danis
2026-09-08 17:06 ` [PATCH BlueZ v2 5/8] client/btpclient: Add BTP_OP_BAP_SEND support Frédéric Danis
2026-09-08 17:06 ` [PATCH BlueZ v2 6/8] client/btpclient: Add ASCS support for BAP/UCL/STR/* tests Frédéric Danis
2026-09-08 17:06 ` [PATCH BlueZ v2 7/8] client/btpclient: Defer CIG/CIS assignment based on Client/Server role Frédéric Danis
2026-09-08 17:06 ` [PATCH BlueZ v2 8/8] client/btpclient: Add stream auto acquire for BAP/USR/STR/* tests Frédéric Danis
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260908170633.510244-2-frederic.danis@collabora.com \
--to=frederic.danis@collabora.com \
--cc=linux-bluetooth@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox