diff options
Diffstat (limited to 'net/bluetooth/hci_core.c')
| -rw-r--r-- | net/bluetooth/hci_core.c | 23 | 
1 files changed, 19 insertions, 4 deletions
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c index b65c3aabcd53..334e308451f5 100644 --- a/net/bluetooth/hci_core.c +++ b/net/bluetooth/hci_core.c @@ -2871,10 +2871,25 @@ int hci_recv_frame(struct hci_dev *hdev, struct sk_buff *skb)  		return -ENXIO;  	} -	if (hci_skb_pkt_type(skb) != HCI_EVENT_PKT && -	    hci_skb_pkt_type(skb) != HCI_ACLDATA_PKT && -	    hci_skb_pkt_type(skb) != HCI_SCODATA_PKT && -	    hci_skb_pkt_type(skb) != HCI_ISODATA_PKT) { +	switch (hci_skb_pkt_type(skb)) { +	case HCI_EVENT_PKT: +		break; +	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);  		return -EINVAL;  	}  |