mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-18 06:15:12 +00:00
Bluetooth: hci_conn: Fix CIS connection dst_type handling
hci_connect_cis and iso_connect_cis call hci_bind_cis inconsistently with dst_type being either ISO socket address type or the HCI type, but these values cannot be mixed like this. Fix this by using only the HCI type. CIS connection dst_type was also not initialized in hci_bind_cis, even though it is used in hci_conn_hash_lookup_cis to find existing connections. Set the value in hci_bind_cis, so that existing CIS connections are found e.g. when doing deferred socket connections, also when dst_type is not 0 (ADDR_LE_DEV_PUBLIC). Fixes: 26afbd826ee3 ("Bluetooth: Add initial implementation of CIS connections") Signed-off-by: Pauli Virtanen <pav@iki.fi> Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This commit is contained in:
parent
3aff8aaca4
commit
b36a234dc4
@ -1761,6 +1761,7 @@ struct hci_conn *hci_bind_cis(struct hci_dev *hdev, bdaddr_t *dst,
|
|||||||
if (!cis)
|
if (!cis)
|
||||||
return ERR_PTR(-ENOMEM);
|
return ERR_PTR(-ENOMEM);
|
||||||
cis->cleanup = cis_cleanup;
|
cis->cleanup = cis_cleanup;
|
||||||
|
cis->dst_type = dst_type;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cis->state == BT_CONNECTED)
|
if (cis->state == BT_CONNECTED)
|
||||||
@ -2140,12 +2141,6 @@ struct hci_conn *hci_connect_cis(struct hci_dev *hdev, bdaddr_t *dst,
|
|||||||
struct hci_conn *le;
|
struct hci_conn *le;
|
||||||
struct hci_conn *cis;
|
struct hci_conn *cis;
|
||||||
|
|
||||||
/* Convert from ISO socket address type to HCI address type */
|
|
||||||
if (dst_type == BDADDR_LE_PUBLIC)
|
|
||||||
dst_type = ADDR_LE_DEV_PUBLIC;
|
|
||||||
else
|
|
||||||
dst_type = ADDR_LE_DEV_RANDOM;
|
|
||||||
|
|
||||||
if (hci_dev_test_flag(hdev, HCI_ADVERTISING))
|
if (hci_dev_test_flag(hdev, HCI_ADVERTISING))
|
||||||
le = hci_connect_le(hdev, dst, dst_type, false,
|
le = hci_connect_le(hdev, dst, dst_type, false,
|
||||||
BT_SECURITY_LOW,
|
BT_SECURITY_LOW,
|
||||||
|
@ -235,6 +235,14 @@ static int iso_chan_add(struct iso_conn *conn, struct sock *sk,
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline u8 le_addr_type(u8 bdaddr_type)
|
||||||
|
{
|
||||||
|
if (bdaddr_type == BDADDR_LE_PUBLIC)
|
||||||
|
return ADDR_LE_DEV_PUBLIC;
|
||||||
|
else
|
||||||
|
return ADDR_LE_DEV_RANDOM;
|
||||||
|
}
|
||||||
|
|
||||||
static int iso_connect_bis(struct sock *sk)
|
static int iso_connect_bis(struct sock *sk)
|
||||||
{
|
{
|
||||||
struct iso_conn *conn;
|
struct iso_conn *conn;
|
||||||
@ -328,14 +336,16 @@ static int iso_connect_cis(struct sock *sk)
|
|||||||
/* Just bind if DEFER_SETUP has been set */
|
/* Just bind if DEFER_SETUP has been set */
|
||||||
if (test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) {
|
if (test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) {
|
||||||
hcon = hci_bind_cis(hdev, &iso_pi(sk)->dst,
|
hcon = hci_bind_cis(hdev, &iso_pi(sk)->dst,
|
||||||
iso_pi(sk)->dst_type, &iso_pi(sk)->qos);
|
le_addr_type(iso_pi(sk)->dst_type),
|
||||||
|
&iso_pi(sk)->qos);
|
||||||
if (IS_ERR(hcon)) {
|
if (IS_ERR(hcon)) {
|
||||||
err = PTR_ERR(hcon);
|
err = PTR_ERR(hcon);
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
hcon = hci_connect_cis(hdev, &iso_pi(sk)->dst,
|
hcon = hci_connect_cis(hdev, &iso_pi(sk)->dst,
|
||||||
iso_pi(sk)->dst_type, &iso_pi(sk)->qos);
|
le_addr_type(iso_pi(sk)->dst_type),
|
||||||
|
&iso_pi(sk)->qos);
|
||||||
if (IS_ERR(hcon)) {
|
if (IS_ERR(hcon)) {
|
||||||
err = PTR_ERR(hcon);
|
err = PTR_ERR(hcon);
|
||||||
goto done;
|
goto done;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user