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)
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Mon, 24 Apr 2023 05:03:37 +0000 (22:03 -0700)
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>
include/net/bluetooth/hci_core.h
net/bluetooth/hci_conn.c

index 4fe1e71..a6c8aee 100644 (file)
@@ -1180,7 +1180,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;
@@ -1191,6 +1193,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 d8466ab..c215e98 100644 (file)
@@ -1841,7 +1841,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)