From: "Frédéric Danis" <frederic.danis@collabora.com>
To: linux-bluetooth@vger.kernel.org
Subject: [PATCH BlueZ v3 1/8] client/btpclient: Add BTP_EV_BAP_ASE_FOUND support
Date: Thu, 10 Sep 2026 10:49:10 +0200 [thread overview]
Message-ID: <20260910084917.23512-2-frederic.danis@collabora.com> (raw)
In-Reply-To: <20260910084917.23512-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-10 8:49 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-10 8:49 [PATCH BlueZ v3 0/8] client/btpclient: Add BAP/ASCS/PACS support for auto-pts BAP tests Frédéric Danis
2026-09-10 8:49 ` Frédéric Danis [this message]
2026-09-10 8:49 ` [PATCH BlueZ v3 2/8] client/btpclient: Get Codec capabilities on ASE reply Frédéric Danis
2026-09-10 8:49 ` [PATCH BlueZ v3 3/8] client/btpclient: Add ASCS BTP support Frédéric Danis
2026-09-10 8:49 ` [PATCH BlueZ v3 4/8] client/btpclient: Add BTP_OP_PACS_SET_LOCATION support Frédéric Danis
2026-09-10 8:49 ` [PATCH BlueZ v3 5/8] client/btpclient: Add BTP_OP_BAP_SEND support Frédéric Danis
2026-09-10 8:49 ` [PATCH BlueZ v3 6/8] client/btpclient: Add ASCS support for BAP/UCL/STR/* tests Frédéric Danis
2026-09-10 8:49 ` [PATCH BlueZ v3 7/8] client/btpclient: CIG/CIS assignment based on Client/Server role Frédéric Danis
2026-09-10 8:49 ` [PATCH BlueZ v3 8/8] client/btpclient: Add stream auto acquire for BAP/USR/STR/* tests Frédéric Danis
2026-09-10 16:30 ` [PATCH BlueZ v3 0/8] client/btpclient: Add BAP/ASCS/PACS support for auto-pts BAP tests patchwork-bot+bluetooth
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=20260910084917.23512-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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.