Bluetooth: audio: Enable auto ATT MTU Exchange for BASS and unicast client

This enables automatic MTU exchange for services that require MTU size
bigger than default ATT MTU to operate.

Signed-off-by: Mariusz Skamra <mariusz.skamra@codecoup.pl>
This commit is contained in:
Mariusz Skamra 2022-03-22 11:05:23 +01:00 committed by Carles Cufí
commit 6eafc64855
5 changed files with 24 additions and 87 deletions

View file

@ -31,7 +31,6 @@ NET_BUF_POOL_FIXED_DEFINE(tx_pool, 1,
static struct bt_audio_lc3_preset preset_16_2_1 = BT_AUDIO_LC3_UNICAST_PRESET_16_2_1; static struct bt_audio_lc3_preset preset_16_2_1 = BT_AUDIO_LC3_UNICAST_PRESET_16_2_1;
static K_SEM_DEFINE(sem_connected, 0, 1); static K_SEM_DEFINE(sem_connected, 0, 1);
static K_SEM_DEFINE(sem_mtu_exchanged, 0, 1);
static K_SEM_DEFINE(sem_sink_discovered, 0, 1); static K_SEM_DEFINE(sem_sink_discovered, 0, 1);
static K_SEM_DEFINE(sem_stream_configured, 0, 1); static K_SEM_DEFINE(sem_stream_configured, 0, 1);
static K_SEM_DEFINE(sem_stream_qos, 0, 1); static K_SEM_DEFINE(sem_stream_qos, 0, 1);
@ -334,17 +333,6 @@ static void discover_sink_cb(struct bt_conn *conn,
k_sem_give(&sem_sink_discovered); k_sem_give(&sem_sink_discovered);
} }
static void gatt_mtu_cb(struct bt_conn *conn, uint8_t err,
struct bt_gatt_exchange_params *params)
{
if (err != 0) {
printk("Failed to exchange MTU (%u)\n", err);
return;
}
k_sem_give(&sem_mtu_exchanged);
}
static void connected(struct bt_conn *conn, uint8_t err) static void connected(struct bt_conn *conn, uint8_t err)
{ {
char addr[BT_ADDR_LE_STR_LEN]; char addr[BT_ADDR_LE_STR_LEN];
@ -424,28 +412,6 @@ static int scan_and_connect(void)
return 0; return 0;
} }
static int exchange_mtu(void)
{
struct bt_gatt_exchange_params mtu_params = {
.func = gatt_mtu_cb
};
int err;
err = bt_gatt_exchange_mtu(default_conn, &mtu_params);
if (err != 0) {
printk("Failed to exchange MTU %d\n", err);
return err;
}
err = k_sem_take(&sem_mtu_exchanged, K_FOREVER);
if (err != 0) {
printk("failed to take sem_mtu_exchanged (err %d)\n", err);
return err;
}
return 0;
}
static int discover_sink(void) static int discover_sink(void)
{ {
static struct bt_audio_discover_params params; static struct bt_audio_discover_params params;
@ -579,13 +545,6 @@ void main(void)
} }
printk("Connected\n"); printk("Connected\n");
printk("Initiating MTU exchange\n");
err = exchange_mtu();
if (err != 0) {
return;
}
printk("MTU exchanged\n");
printk("Discovering sink\n"); printk("Discovering sink\n");
err = discover_sink(); err = discover_sink();
if (err != 0) { if (err != 0) {

View file

@ -32,6 +32,7 @@ config BT_AUDIO_UNICAST_CLIENT
select BT_CENTRAL select BT_CENTRAL
select BT_GATT_CLIENT select BT_GATT_CLIENT
select BT_GATT_AUTO_DISCOVER_CCC select BT_GATT_AUTO_DISCOVER_CCC
select BT_GATT_AUTO_UPDATE_MTU
help help
This option enables support for Bluetooth Unicast Audio Client This option enables support for Bluetooth Unicast Audio Client
using Isochronous channels. using Isochronous channels.

View file

@ -65,6 +65,7 @@ config BT_BASS_CLIENT
select BT_ISO_SYNC_RECEIVER select BT_ISO_SYNC_RECEIVER
select BT_GATT_CLIENT select BT_GATT_CLIENT
select BT_GATT_AUTO_DISCOVER_CCC select BT_GATT_AUTO_DISCOVER_CCC
select BT_GATT_AUTO_UPDATE_MTU
help help
This option enables support for the Broadcast Audio Scan Service This option enables support for the Broadcast Audio Scan Service
client. client.

View file

@ -226,17 +226,6 @@ static struct bt_bass_client_cb bass_cbs = {
.rem_src = bass_client_rem_src_cb, .rem_src = bass_client_rem_src_cb,
}; };
static void mtu_cb(struct bt_conn *conn, uint8_t err,
struct bt_gatt_exchange_params *params)
{
if (err != 0) {
FAIL("Failed to exchange MTU (%u)\n", err);
return;
}
g_mtu_exchanged = true;
}
static void connected(struct bt_conn *conn, uint8_t err) static void connected(struct bt_conn *conn, uint8_t err)
{ {
char addr[BT_ADDR_LE_STR_LEN]; char addr[BT_ADDR_LE_STR_LEN];
@ -258,6 +247,15 @@ static struct bt_conn_cb conn_callbacks = {
.disconnected = disconnected, .disconnected = disconnected,
}; };
static void att_mtu_updated(struct bt_conn *conn, uint16_t tx, uint16_t rx)
{
g_mtu_exchanged = true;
}
static struct bt_gatt_cb gatt_callbacks = {
.att_mtu_updated = att_mtu_updated,
};
static void sync_cb(struct bt_le_per_adv_sync *sync, static void sync_cb(struct bt_le_per_adv_sync *sync,
struct bt_le_per_adv_sync_synced_info *info) struct bt_le_per_adv_sync_synced_info *info)
{ {
@ -310,18 +308,6 @@ static struct bt_le_per_adv_sync_cb sync_callbacks = {
static void test_exchange_mtu(void) static void test_exchange_mtu(void)
{ {
static struct bt_gatt_exchange_params mtu_params = {
.func = mtu_cb,
};
int err;
printk("Exchanging MTU\n");
err = bt_gatt_exchange_mtu(g_conn, &mtu_params);
if (err != 0) {
FAIL("Failed to exchange MTU %d\n", err);
return;
}
WAIT_FOR(g_mtu_exchanged); WAIT_FOR(g_mtu_exchanged);
printk("MTU exchanged\n"); printk("MTU exchanged\n");
} }
@ -495,6 +481,7 @@ static void test_main(void)
} }
bt_conn_cb_register(&conn_callbacks); bt_conn_cb_register(&conn_callbacks);
bt_gatt_cb_register(&gatt_callbacks);
bt_bass_client_register_cb(&bass_cbs); bt_bass_client_register_cb(&bass_cbs);
bt_le_per_adv_sync_cb_register(&sync_callbacks); bt_le_per_adv_sync_cb_register(&sync_callbacks);

View file

@ -153,18 +153,6 @@ static void discover_sink_cb(struct bt_conn *conn,
} }
} }
static void gatt_mtu_cb(struct bt_conn *conn, uint8_t err,
struct bt_gatt_exchange_params *params)
{
if (err != 0) {
FAIL("Failed to exchange MTU (%u)\n", err);
return;
}
printk("MTU exchanged\n");
SET_FLAG(flag_mtu_exchanged);
}
static void connected(struct bt_conn *conn, uint8_t err) static void connected(struct bt_conn *conn, uint8_t err)
{ {
char addr[BT_ADDR_LE_STR_LEN]; char addr[BT_ADDR_LE_STR_LEN];
@ -188,6 +176,16 @@ BT_CONN_CB_DEFINE(conn_callbacks) = {
.disconnected = disconnected, .disconnected = disconnected,
}; };
static void att_mtu_updated(struct bt_conn *conn, uint16_t tx, uint16_t rx)
{
printk("MTU exchanged\n");
SET_FLAG(flag_mtu_exchanged);
}
static struct bt_gatt_cb gatt_callbacks = {
.att_mtu_updated = att_mtu_updated,
};
static void init(void) static void init(void)
{ {
int err; int err;
@ -201,6 +199,8 @@ static void init(void)
for (size_t i = 0; i < ARRAY_SIZE(g_streams); i++) { for (size_t i = 0; i < ARRAY_SIZE(g_streams); i++) {
g_streams[i].ops = &stream_ops; g_streams[i].ops = &stream_ops;
} }
bt_gatt_cb_register(&gatt_callbacks);
} }
static void scan_and_connect(void) static void scan_and_connect(void)
@ -219,17 +219,6 @@ static void scan_and_connect(void)
static void exchange_mtu(void) static void exchange_mtu(void)
{ {
struct bt_gatt_exchange_params mtu_params = {
.func = gatt_mtu_cb
};
int err;
err = bt_gatt_exchange_mtu(default_conn, &mtu_params);
if (err != 0) {
FAIL("Failed to exchange MTU %d\n", err);
return;
}
WAIT_FOR_FLAG(flag_mtu_exchanged); WAIT_FOR_FLAG(flag_mtu_exchanged);
} }