Re: [PATCH BlueZ bluez v3] bap: Start BIG sync after receiving BIGInfo

Bastien Nocera <[email protected]> Tue, 28 Jul 2026 18:01:09 +0200
Newsgroups org.kernel.vger.linux-bluetooth
Message-ID <[email protected]>

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

>  {
>  	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,