[PATCH BlueZ v3 1/8] client/btpclient: Add BTP_EV_BAP_ASE_FOUND support
From: Frédéric Danis <hidden>
Date: 2026-09-10 08:49:24
Subsystem:
the rest · Maintainer:
Linus Torvalds
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