Skip to content

Commit

Permalink
Bluetooth: Make hci_send_to_sock usable for management control sockets
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Johan Hedberg authored and Gustavo F. Padovan committed Dec 8, 2010
1 parent 0381101 commit a40c406
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 1 deletion.
1 change: 1 addition & 0 deletions include/net/bluetooth/bluetooth.h
Original file line number Diff line number Diff line change
Expand Up @@ -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))

Expand Down
10 changes: 9 additions & 1 deletion net/bluetooth/hci_sock.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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);
Expand Down

0 comments on commit a40c406

Please sign in to comment.