提交 876e7810 编写于 作者: L Luiz Augusto von Dentz

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
(see 14202eff) 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: 14202eff ("Bluetooth: btusb: Detect if an ACL packet is in fact an ISO packet")
Signed-off-by: NLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
上级 3c44a431
...@@ -2871,10 +2871,25 @@ int hci_recv_frame(struct hci_dev *hdev, struct sk_buff *skb) ...@@ -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;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册