Bluetooth: btusb: Detect if an ACL packet is in fact an ISO packet
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Mon, 28 Oct 2019 18:25:02 +0000 (20:25 +0200)
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Sat, 23 Jul 2022 00:14:37 +0000 (17:14 -0700)
Fix up the packet type if ISO packets are sent over the bulk endpoint.

Note: This is a stopgap since the Bluetooth specification currently
doesn't define any endpoint to transport ISO packets.

Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
drivers/bluetooth/btusb.c

index 2f4231f..15caa64 100644 (file)
@@ -911,11 +911,21 @@ static int btusb_recv_bulk(struct btusb_data *data, void *buffer, int count)
                hci_skb_expect(skb) -= len;
 
                if (skb->len == HCI_ACL_HDR_SIZE) {
+                       __u16 handle = __le16_to_cpu(hci_acl_hdr(skb)->handle);
                        __le16 dlen = hci_acl_hdr(skb)->dlen;
+                       __u8 type;
 
                        /* Complete ACL header */
                        hci_skb_expect(skb) = __le16_to_cpu(dlen);
 
+                       /* Detect if ISO packet has been sent over bulk */
+                       if (hci_conn_num(data->hdev, ISO_LINK)) {
+                               type = hci_conn_lookup_type(data->hdev,
+                                                           hci_handle(handle));
+                               if (type == ISO_LINK)
+                                       hci_skb_pkt_type(skb) = HCI_ISODATA_PKT;
+                       }
+
                        if (skb_tailroom(skb) < hci_skb_expect(skb)) {
                                kfree_skb(skb);
                                skb = NULL;