]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
Bluetooth: hci_conn: Fix not matching by CIS ID
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Tue, 11 Apr 2023 23:14:25 +0000 (16:14 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 14 Jun 2023 09:16:46 +0000 (11:16 +0200)
[ Upstream commit c14516faede33c2c31da45cf950d55dbff42962e ]

This fixes only matching CIS by address which prevents creating new hcon
if upper layer is requesting a specific CIS ID.

Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
Stable-dep-of: 71e9588435c3 ("Bluetooth: ISO: use correct CIS order in Set CIG Parameters event")
Signed-off-by: Sasha Levin <sashal@kernel.org>
include/net/bluetooth/hci_core.h
net/bluetooth/hci_conn.c

index 9361e75b9299bfd9911ecdb6f3ee9c5c987e8f30..a08e8dc772e549c610c998059124ff72725e60e4 100644 (file)
@@ -1176,7 +1176,9 @@ static inline struct hci_conn *hci_conn_hash_lookup_le(struct hci_dev *hdev,
 
 static inline struct hci_conn *hci_conn_hash_lookup_cis(struct hci_dev *hdev,
                                                        bdaddr_t *ba,
-                                                       __u8 ba_type)
+                                                       __u8 ba_type,
+                                                       __u8 cig,
+                                                       __u8 id)
 {
        struct hci_conn_hash *h = &hdev->conn_hash;
        struct hci_conn  *c;
@@ -1187,6 +1189,14 @@ static inline struct hci_conn *hci_conn_hash_lookup_cis(struct hci_dev *hdev,
                if (c->type != ISO_LINK)
                        continue;
 
+               /* Match CIG ID if set */
+               if (cig != BT_ISO_QOS_CIG_UNSET && cig != c->iso_qos.ucast.cig)
+                       continue;
+
+               /* Match CIS ID if set */
+               if (id != BT_ISO_QOS_CIS_UNSET && id != c->iso_qos.ucast.cis)
+                       continue;
+
                if (ba_type == c->dst_type && !bacmp(&c->dst, ba)) {
                        rcu_read_unlock();
                        return c;
index 81aebbbe0b1eb52bfcd2fed708eacecb5a0dc1a9..163d52b9299942d93aee607ffe0a29463e7ebbec 100644 (file)
@@ -1846,7 +1846,8 @@ struct hci_conn *hci_bind_cis(struct hci_dev *hdev, bdaddr_t *dst,
 {
        struct hci_conn *cis;
 
-       cis = hci_conn_hash_lookup_cis(hdev, dst, dst_type);
+       cis = hci_conn_hash_lookup_cis(hdev, dst, dst_type, qos->ucast.cig,
+                                      qos->ucast.cis);
        if (!cis) {
                cis = hci_conn_add(hdev, ISO_LINK, dst, HCI_ROLE_MASTER);
                if (!cis)