Skip to content

Commit

Permalink
Bluetooth: iso: Allow BIG re-sync
Browse files Browse the repository at this point in the history
A Broadcast Sink might require BIG sync to be terminated and
re-established multiple times, while keeping the same PA sync
handle active. This can be possible if the configuration of the
listening (PA sync) socket is reset once all bound BISes are
established and accepted by the user space:

1. The DEFER setup flag needs to be reset on the parent socket,
to allow another BIG create sync procedure to be started on socket
read.

2. The BT_SK_BIG_SYNC flag needs to be cleared on the parent socket,
to allow another BIG create sync command to be sent.

3. The socket state needs to transition from BT_LISTEN to BT_CONNECTED,
to mark that the listening process has completed and another one can
be started if needed.

Signed-off-by: Iulia Tanasescu <[email protected]>
Signed-off-by: Luiz Augusto von Dentz <[email protected]>
  • Loading branch information
iulia-tanasescu authored and Vudentz committed Dec 2, 2024
1 parent 389eeaf commit 47ebf09
Showing 1 changed file with 36 additions and 0 deletions.
36 changes: 36 additions & 0 deletions net/bluetooth/iso.c
Original file line number Diff line number Diff line change
Expand Up @@ -1268,6 +1268,42 @@ static int iso_sock_accept(struct socket *sock, struct socket *newsock,

BT_DBG("new socket %p", ch);

/* A Broadcast Sink might require BIG sync to be terminated
* and re-established multiple times, while keeping the same
* PA sync handle active. To allow this, once all BIS
* connections have been accepted on a PA sync parent socket,
* "reset" socket state, to allow future BIG re-sync procedures.
*/
if (test_bit(BT_SK_PA_SYNC, &iso_pi(sk)->flags)) {
/* Iterate through the list of bound BIS indices
* and clear each BIS as they are accepted by the
* user space, one by one.
*/
for (int i = 0; i < iso_pi(sk)->bc_num_bis; i++) {
if (iso_pi(sk)->bc_bis[i] > 0) {
iso_pi(sk)->bc_bis[i] = 0;
iso_pi(sk)->bc_num_bis--;
break;
}
}

if (iso_pi(sk)->bc_num_bis == 0) {
/* Once the last BIS was accepted, reset parent
* socket parameters to mark that the listening
* process for BIS connections has been completed:
*
* 1. Reset the DEFER setup flag on the parent sk.
* 2. Clear the flag marking that the BIG create
* sync command is pending.
* 3. Transition socket state from BT_LISTEN to
* BT_CONNECTED.
*/
set_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags);
clear_bit(BT_SK_BIG_SYNC, &iso_pi(sk)->flags);
sk->sk_state = BT_CONNECTED;
}
}

done:
release_sock(sk);
return err;
Expand Down

0 comments on commit 47ebf09

Please sign in to comment.