From ac849dce9ef3aab7322c54229bc2fd7bc123aba0 Mon Sep 17 00:00:00 2001 From: Johan Hedberg Date: Wed, 8 Dec 2010 00:21:07 +0200 Subject: [PATCH] --- yaml --- r: 225511 b: refs/heads/master c: a40c406cbdd28dcca3483065bc2ba794cf5aaab7 h: refs/heads/master i: 225509: 35432657eb3f22494ee9d418b5b9e8311e896b79 225507: 828c9d9c76b38d982d6639593ae77318318044d8 225503: 3b70a2b3e5d038c7ebeab508f1b32659529e6e2a v: v3 --- [refs] | 2 +- trunk/include/net/bluetooth/bluetooth.h | 1 + trunk/net/bluetooth/hci_sock.c | 10 +++++++++- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index a251d5eb39fc..b3f037a6b2db 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 0381101fd6a73c7d6b545044dc1472d019fc64e3 +refs/heads/master: a40c406cbdd28dcca3483065bc2ba794cf5aaab7 diff --git a/trunk/include/net/bluetooth/bluetooth.h b/trunk/include/net/bluetooth/bluetooth.h index d81ea7997701..0c5e72503b77 100644 --- a/trunk/include/net/bluetooth/bluetooth.h +++ b/trunk/include/net/bluetooth/bluetooth.h @@ -144,6 +144,7 @@ struct bt_skb_cb { __u8 tx_seq; __u8 retries; __u8 sar; + unsigned short channel; }; #define bt_cb(skb) ((struct bt_skb_cb *)((skb)->cb)) diff --git a/trunk/net/bluetooth/hci_sock.c b/trunk/net/bluetooth/hci_sock.c index 207be7abda9f..f6c18abab797 100644 --- a/trunk/net/bluetooth/hci_sock.c +++ b/trunk/net/bluetooth/hci_sock.c @@ -104,6 +104,12 @@ void hci_send_to_sock(struct hci_dev *hdev, struct sk_buff *skb) if (skb->sk == sk) continue; + if (bt_cb(skb)->channel != hci_pi(sk)->channel) + continue; + + if (bt_cb(skb)->channel == HCI_CHANNEL_CONTROL) + goto clone; + /* Apply filter */ flt = &hci_pi(sk)->filter; @@ -127,12 +133,14 @@ void hci_send_to_sock(struct hci_dev *hdev, struct sk_buff *skb) continue; } +clone: nskb = skb_clone(skb, GFP_ATOMIC); if (!nskb) continue; /* Put type byte before the data */ - memcpy(skb_push(nskb, 1), &bt_cb(nskb)->pkt_type, 1); + if (bt_cb(skb)->channel == HCI_CHANNEL_RAW) + memcpy(skb_push(nskb, 1), &bt_cb(nskb)->pkt_type, 1); if (sock_queue_rcv_skb(sk, nskb)) kfree_skb(nskb);