mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-07 13:43:51 +00:00
Bluetooth: hci_core: Detect if an ACL packet is in fact an ISO packet
Because some transports don't have a dedicated type for ISO packets (see14202eff21
) they may use ACL type when in fact they are ISO packets. In the past this was left for the driver to detect such thing but it creates a problem when using the likes of btproxy when used by a VM as the host would not be aware of the connection the guest is doing it won't be able to detect such behavior, so this make bt_recv_frame detect when it happens as it is the common interface to all drivers including guest VMs. Fixes:14202eff21
("Bluetooth: btusb: Detect if an ACL packet is in fact an ISO packet") Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This commit is contained in:
parent
3c44a431d6
commit
876e78104f
@ -2871,10 +2871,25 @@ int hci_recv_frame(struct hci_dev *hdev, struct sk_buff *skb)
|
|||||||
return -ENXIO;
|
return -ENXIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hci_skb_pkt_type(skb) != HCI_EVENT_PKT &&
|
switch (hci_skb_pkt_type(skb)) {
|
||||||
hci_skb_pkt_type(skb) != HCI_ACLDATA_PKT &&
|
case HCI_EVENT_PKT:
|
||||||
hci_skb_pkt_type(skb) != HCI_SCODATA_PKT &&
|
break;
|
||||||
hci_skb_pkt_type(skb) != HCI_ISODATA_PKT) {
|
case HCI_ACLDATA_PKT:
|
||||||
|
/* Detect if ISO packet has been sent as ACL */
|
||||||
|
if (hci_conn_num(hdev, ISO_LINK)) {
|
||||||
|
__u16 handle = __le16_to_cpu(hci_acl_hdr(skb)->handle);
|
||||||
|
__u8 type;
|
||||||
|
|
||||||
|
type = hci_conn_lookup_type(hdev, hci_handle(handle));
|
||||||
|
if (type == ISO_LINK)
|
||||||
|
hci_skb_pkt_type(skb) = HCI_ISODATA_PKT;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case HCI_SCODATA_PKT:
|
||||||
|
break;
|
||||||
|
case HCI_ISODATA_PKT:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
kfree_skb(skb);
|
kfree_skb(skb);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user