Bluetooth: Make hci_send_to_sock usable for management control sockets
In order to send data to management control sockets the function should: - skip checks intended for raw HCI data and stack internal events - make sure RAW HCI data or stack internal events don't go to management control sockets In order to accomplish this the patch adds a new member to the bluetooth skb private data to flag skb's that are destined for management control sockets. Signed-off-by: Johan Hedberg <johan.hedberg@nokia.com> Acked-by: Marcel Holtmann <marcel@holtmann.org> Signed-off-by: Gustavo F. Padovan <padovan@profusion.mobi>
This commit is contained in:
parent
0381101fd6
commit
a40c406cbd
@ -144,6 +144,7 @@ struct bt_skb_cb {
|
|||||||
__u8 tx_seq;
|
__u8 tx_seq;
|
||||||
__u8 retries;
|
__u8 retries;
|
||||||
__u8 sar;
|
__u8 sar;
|
||||||
|
unsigned short channel;
|
||||||
};
|
};
|
||||||
#define bt_cb(skb) ((struct bt_skb_cb *)((skb)->cb))
|
#define bt_cb(skb) ((struct bt_skb_cb *)((skb)->cb))
|
||||||
|
|
||||||
|
@ -104,6 +104,12 @@ void hci_send_to_sock(struct hci_dev *hdev, struct sk_buff *skb)
|
|||||||
if (skb->sk == sk)
|
if (skb->sk == sk)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if (bt_cb(skb)->channel != hci_pi(sk)->channel)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (bt_cb(skb)->channel == HCI_CHANNEL_CONTROL)
|
||||||
|
goto clone;
|
||||||
|
|
||||||
/* Apply filter */
|
/* Apply filter */
|
||||||
flt = &hci_pi(sk)->filter;
|
flt = &hci_pi(sk)->filter;
|
||||||
|
|
||||||
@ -127,12 +133,14 @@ void hci_send_to_sock(struct hci_dev *hdev, struct sk_buff *skb)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
clone:
|
||||||
nskb = skb_clone(skb, GFP_ATOMIC);
|
nskb = skb_clone(skb, GFP_ATOMIC);
|
||||||
if (!nskb)
|
if (!nskb)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* Put type byte before the data */
|
/* 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))
|
if (sock_queue_rcv_skb(sk, nskb))
|
||||||
kfree_skb(nskb);
|
kfree_skb(nskb);
|
||||||
|
Loading…
Reference in New Issue
Block a user