Re: [PATCH BlueZ bluez v3] bap: Start BIG sync after receiving BIGInfo
Yang Li <[email protected]> Wed, 29 Jul 2026 09:19:26 +0800
| Newsgroups | org.kernel.vger.linux-bluetooth |
|---|---|
| Message-ID | <[email protected]> |
Hi, > [ EXTERNAL EMAIL ] > > On Tue, 2026-07-28 at 14:26 +0800, Yang Li via B4 Relay wrote: >> From: Yang Li <[email protected]> >> >> The current implementation starts BIG sync before receiving a BIGInfo >> report. According to the Bluetooth Core Specification, BIG sync >> should >> only be initiated after BIGInfo has been received. >> >> Starting BIG sync too early may cause unexpected controller behavior. >> >> Trigger BIG sync from the BIGInfo callback, following the same >> approach >> used by the short PA flow. >> >> Fixes: https://github.com/bluez/bluez/issues/2345 >> >> Signed-off-by: Yang Li <[email protected]> >> --- >> Changes in v3: >> - Fixed coding style warning. >> - Link to v2: >> https://patch.msgid.link/[email protected] >> >> Changes in v2: >> - Fixed build error. >> - Link to v1: >> https://patch.msgid.link/[email protected] >> --- >> profiles/audio/bap.c | 25 +++++++++++++++++++++---- >> 1 file changed, 21 insertions(+), 4 deletions(-) >> >> diff --git a/profiles/audio/bap.c b/profiles/audio/bap.c >> index dd4b3c8ff..473e4cfc2 100644 >> --- a/profiles/audio/bap.c >> +++ b/profiles/audio/bap.c >> @@ -3650,7 +3650,8 @@ static void setup_refresh_qos(void *data, void >> *user_data) >> setup->qos = *bt_bap_stream_get_qos(stream); >> } >> >> -static void iso_do_big_sync(GIOChannel *io, void *user_data) >> +static gboolean iso_do_big_sync(GIOChannel *io, GIOCondition cond, >> + void *user_data) > The return here is for: > "The function should return FALSE if the event source should be > removed." > Not success or failure. > > See: > https://docs.gtk.org/glib/callback.IOFunc.html > https://docs.gtk.org/glib/func.io_add_watch.html Well, I got it, but this patch has been applied, I will send the new one to fix it. > >> { >> GError *err = NULL; >> struct bap_setup *setup = user_data; >> @@ -3659,7 +3660,7 @@ static void iso_do_big_sync(GIOChannel *io, >> void *user_data) >> struct bt_iso_qos qos; >> struct queue *links = bt_bap_stream_io_get_links(setup- >>> stream); >> - DBG("PA Sync done"); >> + DBG("BIG info received, do BIG sync"); >> >> g_io_channel_unref(data->listen_io); >> g_io_channel_shutdown(data->listen_io, TRUE, NULL); >> @@ -3682,6 +3683,7 @@ static void iso_do_big_sync(GIOChannel *io, >> void *user_data) >> BT_IO_OPT_INVALID)) { >> error("bt_io_set: %s", err->message); >> g_error_free(err); >> + return FALSE; > This is wrong, this should be TRUE or better G_SOURCE_REMOVE. > >> } >> >> if (!bt_io_bcast_accept(io, >> @@ -3692,16 +3694,31 @@ static void iso_do_big_sync(GIOChannel *io, >> void *user_data) >> iso_bc_addr.bc_bis, BT_IO_OPT_INVALID)) { >> error("bt_io_bcast_accept: %s", err->message); >> g_error_free(err); >> + return FALSE; > Here too. > >> } >> + >> + return TRUE; >> +} >> + >> +static void long_pa_sync_confirm_cb(GIOChannel *io, void *user_data) >> +{ >> + struct bap_setup *setup = user_data; >> + struct bap_data *data = setup->data; >> + >> + DBG("Long PA Sync done"); >> + >> + /* store io and add watch that will call iso_do_big_sync */ >> + data->io_id = g_io_add_watch(io, G_IO_OUT, iso_do_big_sync, >> + setup); >> } >> >> static void pa_and_big_sync(struct bap_setup *setup) >> { >> GError *err = NULL; >> struct bap_data *bap_data = setup->data; >> - >> DBG("Create PA sync with this source"); >> - bap_data->listen_io = bt_io_listen(NULL, iso_do_big_sync, >> setup, >> + >> + bap_data->listen_io = bt_io_listen(NULL, >> long_pa_sync_confirm_cb, setup, >> NULL, &err, >> BT_IO_OPT_SOURCE_BDADDR, >> btd_adapter_get_address(bap_data->adapter), >> >> --- >> base-commit: 89d477bb5494eef0b24e5667be62f854da250a97 >> change-id: 20260724-big_sync-45c24ec09121 >> >> Best regards,