]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
Bluetooth: ISO: Update hci_conn_hash_lookup_big for Broadcast slave
authorIulia Tanasescu <iulia.tanasescu@nxp.com>
Fri, 1 Nov 2024 08:23:39 +0000 (10:23 +0200)
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Thu, 14 Nov 2024 20:37:31 +0000 (15:37 -0500)
Currently, hci_conn_hash_lookup_big only checks for BIS master connections,
by filtering out connections with the destination address set. This commit
updates this function to also consider BIS slave connections, since it is
also used for a Broadcast Receiver to set an available BIG handle before
issuing the LE BIG Create Sync command.

Signed-off-by: Iulia Tanasescu <iulia.tanasescu@nxp.com>
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
include/net/bluetooth/hci_core.h
net/bluetooth/hci_event.c
net/bluetooth/iso.c

index c95f7e6ba2551403a174746cad0519f3e6cc50a8..ea798f07c5a2d6e90c2dc2581922edeee2de4113 100644 (file)
@@ -1285,7 +1285,17 @@ static inline struct hci_conn *hci_conn_hash_lookup_big(struct hci_dev *hdev,
        rcu_read_lock();
 
        list_for_each_entry_rcu(c, &h->list, list) {
-               if (bacmp(&c->dst, BDADDR_ANY) || c->type != ISO_LINK)
+               if (c->type != ISO_LINK)
+                       continue;
+
+               /* An ISO_LINK hcon with BDADDR_ANY as destination
+                * address is a Broadcast connection. A Broadcast
+                * slave connection is associated with a PA train,
+                * so the sync_handle can be used to differentiate
+                * from unicast.
+                */
+               if (bacmp(&c->dst, BDADDR_ANY) &&
+                   c->sync_handle == HCI_SYNC_HANDLE_INVALID)
                        continue;
 
                if (handle == c->iso_qos.bcast.big) {
index 2b5ba8acd1d84aa238314981ead231b916e1b418..aca121408369a5013691086fa658bff15ad72950 100644 (file)
@@ -6965,6 +6965,7 @@ static void hci_le_big_sync_established_evt(struct hci_dev *hdev, void *data,
                        /* Mark PA sync as established */
                        set_bit(HCI_CONN_PA_SYNC, &bis->flags);
 
+               bis->sync_handle = conn->sync_handle;
                bis->iso_qos.bcast.big = ev->handle;
                memset(&interval, 0, sizeof(interval));
                memcpy(&interval, ev->latency, sizeof(ev->latency));
index 9499ddfd25e70c4f01ac8dbfa4911bd520aa9e35..9e119da43147908543db7e4780e417c7d0cecfb1 100644 (file)
@@ -1839,7 +1839,6 @@ static void iso_conn_ready(struct iso_conn *conn)
                if (!bacmp(&hcon->dst, BDADDR_ANY)) {
                        bacpy(&hcon->dst, &iso_pi(parent)->dst);
                        hcon->dst_type = iso_pi(parent)->dst_type;
-                       hcon->sync_handle = iso_pi(parent)->sync_handle;
                }
 
                if (ev3) {