From: "Frédéric Danis" <frederic.danis@collabora.com>
To: linux-bluetooth@vger.kernel.org
Subject: [PATCH BlueZ v2 2/8] client/btpclient: Get Codec capabilities on ASE reply
Date: Tue, 8 Sep 2026 19:06:27 +0200 [thread overview]
Message-ID: <20260908170633.510244-3-frederic.danis@collabora.com> (raw)
In-Reply-To: <20260908170633.510244-1-frederic.danis@collabora.com>
---
Makefile.tools | 2 +-
client/btpclient/bap.c | 94 ++++++++++++++++++++++++++++++++++++++++--
src/shared/btp.h | 12 ++++++
3 files changed, 104 insertions(+), 4 deletions(-)
diff --git a/Makefile.tools b/Makefile.tools
index 4c97d990a..41473d63f 100644
--- a/Makefile.tools
+++ b/Makefile.tools
@@ -567,7 +567,7 @@ noinst_PROGRAMS += client/btpclient/btpclient client/btpclient/btpclientctl
client_btpclient_btpclient_SOURCES = client/btpclient/btpclient.c \
client/btpclient/btpclient.h \
- src/shared/btp.c src/shared/btp.h \
+ src/shared/btp.c src/shared/btp.h src/shared/bap-defs.h \
client/btpclient/bap.c client/btpclient/bap.h \
client/btpclient/core.c client/btpclient/core.h \
client/btpclient/gap.c client/btpclient/gap.h \
diff --git a/client/btpclient/bap.c b/client/btpclient/bap.c
index cdbae4ac2..d30d931f1 100644
--- a/client/btpclient/bap.c
+++ b/client/btpclient/bap.c
@@ -17,6 +17,7 @@
#include "bluetooth/bluetooth.h"
#include "bluetooth/uuid.h"
+#include "src/shared/bap-defs.h"
#include "src/shared/btp.h"
#include "btpclient.h"
#include "bap.h"
@@ -59,6 +60,13 @@ failed:
btp_send_error(btp, BTP_BAP_SERVICE, index, BTP_ERROR_FAIL);
}
+static bool match_attribute_uuid(const void *attr, const void *uuid)
+{
+ const struct gatt_attribute *attribute = attr;
+
+ return !bt_uuid_cmp(&attribute->uuid, uuid);
+}
+
static void btp_bap_discover(uint8_t index, const void *param, uint16_t length,
void *user_data)
{
@@ -110,17 +118,17 @@ static void bap_charac_read_setup(struct l_dbus_message *message,
l_dbus_message_builder_destroy(builder);
}
-static void bap_read_ase_reply(struct l_dbus_proxy *proxy,
+static void bap_read_pac_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 btp_bap_codec_cap_found_ev *rp;
struct l_dbus_message_iter iter;
uint8_t *data;
- uint32_t n;
+ uint32_t n, i, capa_length;
if (l_dbus_message_is_error(result)) {
const char *name, *desc;
@@ -141,6 +149,73 @@ static void bap_read_ase_reply(struct l_dbus_proxy *proxy,
goto failed;
}
+ rp = l_new(struct btp_bap_codec_cap_found_ev, 1);
+ rp->address_type = device->address_type;
+ rp->address = device->address;
+ rp->dir = ase->dir;
+ rp->coding_format = data[1];
+ capa_length = data[6];
+ i = 0;
+ while (i < capa_length) {
+ struct bt_ltv *ltv = (struct bt_ltv *)(data + i + 7);
+
+ if ((i + ltv->len >= capa_length) || (!ltv->len))
+ goto failed;
+
+ if (ltv->type == 0x01)
+ rp->frequencies = bt_get_le16(ltv->value);
+ else if (ltv->type == 0x02)
+ rp->frame_durations = ltv->value[0];
+ else if (ltv->type == 0x03)
+ rp->channel_counts = ltv->value[0];
+ else if (ltv->type == 0x04)
+ rp->octets_per_frame = bt_get_le32(ltv->value);
+
+ i += ltv->len + 1;
+ }
+
+ btp_send(btp, BTP_BAP_SERVICE, BTP_BAP_EV_CODEC_CAP_FOUND,
+ adapter->index, sizeof(struct btp_bap_codec_cap_found_ev), rp);
+
+ free(rp);
+
+ return;
+
+failed:
+ btp_send_error(btp, BTP_BAP_SERVICE, adapter->index, BTP_ERROR_FAIL);
+}
+
+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;
+ bt_uuid_t uuid;
+ struct gatt_attribute *attribute;
+
+ 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);
+
+ goto failed;
+ }
+
+ 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);
@@ -154,6 +229,19 @@ static void bap_read_ase_reply(struct l_dbus_proxy *proxy,
free(rp);
+ if (bt_uuid16_cmp(&ase->uuid, ASE_SINK_UUID))
+ bt_uuid16_create(&uuid, PAC_SINK_CHRC_UUID);
+ else
+ bt_uuid16_create(&uuid, PAC_SOURCE_CHRC_UUID);
+ attribute = l_queue_find(device->characteristics,
+ match_attribute_uuid, &uuid);
+ if (!attribute)
+ goto failed;
+
+ l_dbus_proxy_method_call(attribute->proxy, "ReadValue",
+ bap_charac_read_setup, bap_read_pac_reply,
+ ase, NULL);
+
return;
failed:
diff --git a/src/shared/btp.h b/src/shared/btp.h
index 9757301f2..100308de1 100644
--- a/src/shared/btp.h
+++ b/src/shared/btp.h
@@ -443,6 +443,18 @@ struct btp_bap_discovery_completed_ev {
uint8_t status;
} __packed;
+#define BTP_BAP_EV_CODEC_CAP_FOUND 0x81
+struct btp_bap_codec_cap_found_ev {
+ uint8_t address_type;
+ bdaddr_t address;
+ uint8_t dir;
+ uint8_t coding_format;
+ uint16_t frequencies;
+ uint8_t frame_durations;
+ uint32_t octets_per_frame;
+ uint8_t channel_counts;
+} __packed;
+
#define BTP_EV_BAP_ASE_FOUND 0x82
struct btp_bap_ase_found_ev {
uint8_t address_type;
--
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 ` [PATCH BlueZ v2 1/8] client/btpclient: Add BTP_EV_BAP_ASE_FOUND support Frédéric Danis
2026-09-08 17:59 ` client/btpclient: Add BAP/ASCS/PACS support for auto-pts BAP tests bluez.test.bot
2026-09-08 17:06 ` Frédéric Danis [this message]
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-3-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.