blob: ba5d45f8aac13e097a72f232dc25d619654d2d41 [file] [log] [blame]
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002 BlueZ - Bluetooth protocol stack for Linux
3 Copyright (C) 2000-2001 Qualcomm Incorporated
4
5 Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License version 2 as
9 published by the Free Software Foundation;
10
11 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
12 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
13 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
14 IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +090015 CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
16 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
Linus Torvalds1da177e2005-04-16 15:20:36 -070018 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +090020 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
21 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
Linus Torvalds1da177e2005-04-16 15:20:36 -070022 SOFTWARE IS DISCLAIMED.
23*/
24
25/* Bluetooth HCI sockets. */
26
Gustavo Padovan8c520a52012-05-23 04:04:22 -030027#include <linux/export.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070028#include <asm/unaligned.h>
29
30#include <net/bluetooth/bluetooth.h>
31#include <net/bluetooth/hci_core.h>
Marcel Holtmanncd82e612012-02-20 20:34:38 +010032#include <net/bluetooth/hci_mon.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070033
Marcel Holtmanncd82e612012-02-20 20:34:38 +010034static atomic_t monitor_promisc = ATOMIC_INIT(0);
35
Linus Torvalds1da177e2005-04-16 15:20:36 -070036/* ----- HCI socket interface ----- */
37
Marcel Holtmann863def52014-07-11 05:41:00 +020038/* Socket info */
39#define hci_pi(sk) ((struct hci_pinfo *) sk)
40
41struct hci_pinfo {
42 struct bt_sock bt;
43 struct hci_dev *hdev;
44 struct hci_filter filter;
45 __u32 cmsg_mask;
46 unsigned short channel;
47};
48
Linus Torvalds1da177e2005-04-16 15:20:36 -070049static inline int hci_test_bit(int nr, void *addr)
50{
51 return *((__u32 *) addr + (nr >> 5)) & ((__u32) 1 << (nr & 31));
52}
53
54/* Security filter */
Marcel Holtmann3ad254f2014-07-11 05:36:39 +020055#define HCI_SFLT_MAX_OGF 5
56
57struct hci_sec_filter {
58 __u32 type_mask;
59 __u32 event_mask[2];
60 __u32 ocf_mask[HCI_SFLT_MAX_OGF + 1][4];
61};
62
Marcel Holtmann7e67c112014-07-11 05:36:40 +020063static const struct hci_sec_filter hci_sec_filter = {
Linus Torvalds1da177e2005-04-16 15:20:36 -070064 /* Packet types */
65 0x10,
66 /* Events */
Marcel Holtmanndd7f5522005-10-28 19:20:53 +020067 { 0x1000d9fe, 0x0000b00c },
Linus Torvalds1da177e2005-04-16 15:20:36 -070068 /* Commands */
69 {
70 { 0x0 },
71 /* OGF_LINK_CTL */
Marcel Holtmann7c631a62007-09-09 08:39:43 +020072 { 0xbe000006, 0x00000001, 0x00000000, 0x00 },
Linus Torvalds1da177e2005-04-16 15:20:36 -070073 /* OGF_LINK_POLICY */
Marcel Holtmann7c631a62007-09-09 08:39:43 +020074 { 0x00005200, 0x00000000, 0x00000000, 0x00 },
Linus Torvalds1da177e2005-04-16 15:20:36 -070075 /* OGF_HOST_CTL */
Marcel Holtmann7c631a62007-09-09 08:39:43 +020076 { 0xaab00200, 0x2b402aaa, 0x05220154, 0x00 },
Linus Torvalds1da177e2005-04-16 15:20:36 -070077 /* OGF_INFO_PARAM */
Marcel Holtmann7c631a62007-09-09 08:39:43 +020078 { 0x000002be, 0x00000000, 0x00000000, 0x00 },
Linus Torvalds1da177e2005-04-16 15:20:36 -070079 /* OGF_STATUS_PARAM */
Marcel Holtmann7c631a62007-09-09 08:39:43 +020080 { 0x000000ea, 0x00000000, 0x00000000, 0x00 }
Linus Torvalds1da177e2005-04-16 15:20:36 -070081 }
82};
83
84static struct bt_sock_list hci_sk_list = {
Robert P. J. Dayd5fb2962008-03-28 16:17:38 -070085 .lock = __RW_LOCK_UNLOCKED(hci_sk_list.lock)
Linus Torvalds1da177e2005-04-16 15:20:36 -070086};
87
Marcel Holtmannf81fe642013-08-25 23:25:15 -070088static bool is_filtered_packet(struct sock *sk, struct sk_buff *skb)
89{
90 struct hci_filter *flt;
91 int flt_type, flt_event;
92
93 /* Apply filter */
94 flt = &hci_pi(sk)->filter;
95
96 if (bt_cb(skb)->pkt_type == HCI_VENDOR_PKT)
97 flt_type = 0;
98 else
99 flt_type = bt_cb(skb)->pkt_type & HCI_FLT_TYPE_BITS;
100
101 if (!test_bit(flt_type, &flt->type_mask))
102 return true;
103
104 /* Extra filter for event packets only */
105 if (bt_cb(skb)->pkt_type != HCI_EVENT_PKT)
106 return false;
107
108 flt_event = (*(__u8 *)skb->data & HCI_FLT_EVENT_BITS);
109
110 if (!hci_test_bit(flt_event, &flt->event_mask))
111 return true;
112
113 /* Check filter only when opcode is set */
114 if (!flt->opcode)
115 return false;
116
117 if (flt_event == HCI_EV_CMD_COMPLETE &&
118 flt->opcode != get_unaligned((__le16 *)(skb->data + 3)))
119 return true;
120
121 if (flt_event == HCI_EV_CMD_STATUS &&
122 flt->opcode != get_unaligned((__le16 *)(skb->data + 4)))
123 return true;
124
125 return false;
126}
127
Linus Torvalds1da177e2005-04-16 15:20:36 -0700128/* Send frame to RAW socket */
Marcel Holtmann470fe1b2012-02-20 14:50:30 +0100129void hci_send_to_sock(struct hci_dev *hdev, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700130{
131 struct sock *sk;
Marcel Holtmanne0edf372012-02-20 14:50:36 +0100132 struct sk_buff *skb_copy = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700133
134 BT_DBG("hdev %p len %d", hdev, skb->len);
135
136 read_lock(&hci_sk_list.lock);
Marcel Holtmann470fe1b2012-02-20 14:50:30 +0100137
Sasha Levinb67bfe02013-02-27 17:06:00 -0800138 sk_for_each(sk, &hci_sk_list.head) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700139 struct sk_buff *nskb;
140
141 if (sk->sk_state != BT_BOUND || hci_pi(sk)->hdev != hdev)
142 continue;
143
144 /* Don't send frame to the socket it came from */
145 if (skb->sk == sk)
146 continue;
147
Marcel Holtmann23500182013-08-26 21:40:52 -0700148 if (hci_pi(sk)->channel == HCI_CHANNEL_RAW) {
149 if (is_filtered_packet(sk, skb))
150 continue;
151 } else if (hci_pi(sk)->channel == HCI_CHANNEL_USER) {
152 if (!bt_cb(skb)->incoming)
153 continue;
154 if (bt_cb(skb)->pkt_type != HCI_EVENT_PKT &&
155 bt_cb(skb)->pkt_type != HCI_ACLDATA_PKT &&
156 bt_cb(skb)->pkt_type != HCI_SCODATA_PKT)
157 continue;
158 } else {
159 /* Don't send frame to other channel types */
Johan Hedberga40c4062010-12-08 00:21:07 +0200160 continue;
Marcel Holtmann23500182013-08-26 21:40:52 -0700161 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700162
Marcel Holtmanne0edf372012-02-20 14:50:36 +0100163 if (!skb_copy) {
164 /* Create a private copy with headroom */
Octavian Purdilabad93e92014-06-12 01:36:26 +0300165 skb_copy = __pskb_copy_fclone(skb, 1, GFP_ATOMIC, true);
Marcel Holtmanne0edf372012-02-20 14:50:36 +0100166 if (!skb_copy)
167 continue;
168
169 /* Put type byte before the data */
170 memcpy(skb_push(skb_copy, 1), &bt_cb(skb)->pkt_type, 1);
171 }
172
173 nskb = skb_clone(skb_copy, GFP_ATOMIC);
Andrei Emeltchenko70f230202010-12-01 16:58:25 +0200174 if (!nskb)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700175 continue;
176
Linus Torvalds1da177e2005-04-16 15:20:36 -0700177 if (sock_queue_rcv_skb(sk, nskb))
178 kfree_skb(nskb);
179 }
Marcel Holtmann470fe1b2012-02-20 14:50:30 +0100180
181 read_unlock(&hci_sk_list.lock);
Marcel Holtmanne0edf372012-02-20 14:50:36 +0100182
183 kfree_skb(skb_copy);
Marcel Holtmann470fe1b2012-02-20 14:50:30 +0100184}
185
Johan Hedberg71290692015-02-20 13:26:23 +0200186/* Send frame to sockets with specific channel */
187void hci_send_to_channel(unsigned short channel, struct sk_buff *skb,
188 struct sock *skip_sk)
Marcel Holtmann470fe1b2012-02-20 14:50:30 +0100189{
190 struct sock *sk;
Marcel Holtmann470fe1b2012-02-20 14:50:30 +0100191
Johan Hedberg71290692015-02-20 13:26:23 +0200192 BT_DBG("channel %u len %d", channel, skb->len);
Marcel Holtmann470fe1b2012-02-20 14:50:30 +0100193
194 read_lock(&hci_sk_list.lock);
195
Sasha Levinb67bfe02013-02-27 17:06:00 -0800196 sk_for_each(sk, &hci_sk_list.head) {
Marcel Holtmann470fe1b2012-02-20 14:50:30 +0100197 struct sk_buff *nskb;
198
199 /* Skip the original socket */
200 if (sk == skip_sk)
201 continue;
202
203 if (sk->sk_state != BT_BOUND)
204 continue;
205
Johan Hedberg71290692015-02-20 13:26:23 +0200206 if (hci_pi(sk)->channel != channel)
Marcel Holtmann470fe1b2012-02-20 14:50:30 +0100207 continue;
208
209 nskb = skb_clone(skb, GFP_ATOMIC);
210 if (!nskb)
211 continue;
212
213 if (sock_queue_rcv_skb(sk, nskb))
214 kfree_skb(nskb);
215 }
216
Linus Torvalds1da177e2005-04-16 15:20:36 -0700217 read_unlock(&hci_sk_list.lock);
218}
219
Marcel Holtmannd7f72f62015-01-11 19:33:32 -0800220static void queue_monitor_skb(struct sk_buff *skb)
221{
222 struct sock *sk;
223
224 BT_DBG("len %d", skb->len);
225
226 read_lock(&hci_sk_list.lock);
227
228 sk_for_each(sk, &hci_sk_list.head) {
229 struct sk_buff *nskb;
230
231 if (sk->sk_state != BT_BOUND)
232 continue;
233
234 if (hci_pi(sk)->channel != HCI_CHANNEL_MONITOR)
235 continue;
236
237 nskb = skb_clone(skb, GFP_ATOMIC);
238 if (!nskb)
239 continue;
240
241 if (sock_queue_rcv_skb(sk, nskb))
242 kfree_skb(nskb);
243 }
244
245 read_unlock(&hci_sk_list.lock);
246}
247
Marcel Holtmanncd82e612012-02-20 20:34:38 +0100248/* Send frame to monitor socket */
249void hci_send_to_monitor(struct hci_dev *hdev, struct sk_buff *skb)
250{
Marcel Holtmanncd82e612012-02-20 20:34:38 +0100251 struct sk_buff *skb_copy = NULL;
Marcel Holtmann2b531292015-01-11 19:33:31 -0800252 struct hci_mon_hdr *hdr;
Marcel Holtmanncd82e612012-02-20 20:34:38 +0100253 __le16 opcode;
254
255 if (!atomic_read(&monitor_promisc))
256 return;
257
258 BT_DBG("hdev %p len %d", hdev, skb->len);
259
260 switch (bt_cb(skb)->pkt_type) {
261 case HCI_COMMAND_PKT:
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700262 opcode = cpu_to_le16(HCI_MON_COMMAND_PKT);
Marcel Holtmanncd82e612012-02-20 20:34:38 +0100263 break;
264 case HCI_EVENT_PKT:
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700265 opcode = cpu_to_le16(HCI_MON_EVENT_PKT);
Marcel Holtmanncd82e612012-02-20 20:34:38 +0100266 break;
267 case HCI_ACLDATA_PKT:
268 if (bt_cb(skb)->incoming)
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700269 opcode = cpu_to_le16(HCI_MON_ACL_RX_PKT);
Marcel Holtmanncd82e612012-02-20 20:34:38 +0100270 else
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700271 opcode = cpu_to_le16(HCI_MON_ACL_TX_PKT);
Marcel Holtmanncd82e612012-02-20 20:34:38 +0100272 break;
273 case HCI_SCODATA_PKT:
274 if (bt_cb(skb)->incoming)
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700275 opcode = cpu_to_le16(HCI_MON_SCO_RX_PKT);
Marcel Holtmanncd82e612012-02-20 20:34:38 +0100276 else
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700277 opcode = cpu_to_le16(HCI_MON_SCO_TX_PKT);
Marcel Holtmanncd82e612012-02-20 20:34:38 +0100278 break;
279 default:
280 return;
281 }
282
Marcel Holtmann2b531292015-01-11 19:33:31 -0800283 /* Create a private copy with headroom */
284 skb_copy = __pskb_copy_fclone(skb, HCI_MON_HDR_SIZE, GFP_ATOMIC, true);
285 if (!skb_copy)
286 return;
287
288 /* Put header before the data */
289 hdr = (void *) skb_push(skb_copy, HCI_MON_HDR_SIZE);
290 hdr->opcode = opcode;
291 hdr->index = cpu_to_le16(hdev->id);
292 hdr->len = cpu_to_le16(skb->len);
293
Marcel Holtmannd7f72f62015-01-11 19:33:32 -0800294 queue_monitor_skb(skb_copy);
Marcel Holtmanncd82e612012-02-20 20:34:38 +0100295 kfree_skb(skb_copy);
296}
297
Marcel Holtmanncd82e612012-02-20 20:34:38 +0100298static struct sk_buff *create_monitor_event(struct hci_dev *hdev, int event)
299{
300 struct hci_mon_hdr *hdr;
301 struct hci_mon_new_index *ni;
302 struct sk_buff *skb;
303 __le16 opcode;
304
305 switch (event) {
306 case HCI_DEV_REG:
307 skb = bt_skb_alloc(HCI_MON_NEW_INDEX_SIZE, GFP_ATOMIC);
308 if (!skb)
309 return NULL;
310
311 ni = (void *) skb_put(skb, HCI_MON_NEW_INDEX_SIZE);
312 ni->type = hdev->dev_type;
313 ni->bus = hdev->bus;
314 bacpy(&ni->bdaddr, &hdev->bdaddr);
315 memcpy(ni->name, hdev->name, 8);
316
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700317 opcode = cpu_to_le16(HCI_MON_NEW_INDEX);
Marcel Holtmanncd82e612012-02-20 20:34:38 +0100318 break;
319
320 case HCI_DEV_UNREG:
321 skb = bt_skb_alloc(0, GFP_ATOMIC);
322 if (!skb)
323 return NULL;
324
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700325 opcode = cpu_to_le16(HCI_MON_DEL_INDEX);
Marcel Holtmanncd82e612012-02-20 20:34:38 +0100326 break;
327
328 default:
329 return NULL;
330 }
331
332 __net_timestamp(skb);
333
334 hdr = (void *) skb_push(skb, HCI_MON_HDR_SIZE);
335 hdr->opcode = opcode;
336 hdr->index = cpu_to_le16(hdev->id);
337 hdr->len = cpu_to_le16(skb->len - HCI_MON_HDR_SIZE);
338
339 return skb;
340}
341
342static void send_monitor_replay(struct sock *sk)
343{
344 struct hci_dev *hdev;
345
346 read_lock(&hci_dev_list_lock);
347
348 list_for_each_entry(hdev, &hci_dev_list, list) {
349 struct sk_buff *skb;
350
351 skb = create_monitor_event(hdev, HCI_DEV_REG);
352 if (!skb)
353 continue;
354
355 if (sock_queue_rcv_skb(sk, skb))
356 kfree_skb(skb);
357 }
358
359 read_unlock(&hci_dev_list_lock);
360}
361
Marcel Holtmann040030e2012-02-20 14:50:37 +0100362/* Generate internal stack event */
363static void hci_si_event(struct hci_dev *hdev, int type, int dlen, void *data)
364{
365 struct hci_event_hdr *hdr;
366 struct hci_ev_stack_internal *ev;
367 struct sk_buff *skb;
368
369 skb = bt_skb_alloc(HCI_EVENT_HDR_SIZE + sizeof(*ev) + dlen, GFP_ATOMIC);
370 if (!skb)
371 return;
372
373 hdr = (void *) skb_put(skb, HCI_EVENT_HDR_SIZE);
374 hdr->evt = HCI_EV_STACK_INTERNAL;
375 hdr->plen = sizeof(*ev) + dlen;
376
377 ev = (void *) skb_put(skb, sizeof(*ev) + dlen);
378 ev->type = type;
379 memcpy(ev->data, data, dlen);
380
381 bt_cb(skb)->incoming = 1;
382 __net_timestamp(skb);
383
384 bt_cb(skb)->pkt_type = HCI_EVENT_PKT;
Marcel Holtmann040030e2012-02-20 14:50:37 +0100385 hci_send_to_sock(hdev, skb);
386 kfree_skb(skb);
387}
388
389void hci_sock_dev_event(struct hci_dev *hdev, int event)
390{
391 struct hci_ev_si_device ev;
392
393 BT_DBG("hdev %s event %d", hdev->name, event);
394
Marcel Holtmanncd82e612012-02-20 20:34:38 +0100395 /* Send event to monitor */
396 if (atomic_read(&monitor_promisc)) {
397 struct sk_buff *skb;
398
399 skb = create_monitor_event(hdev, event);
400 if (skb) {
Marcel Holtmann41e91e72015-01-11 19:33:33 -0800401 queue_monitor_skb(skb);
Marcel Holtmanncd82e612012-02-20 20:34:38 +0100402 kfree_skb(skb);
403 }
404 }
405
Marcel Holtmann040030e2012-02-20 14:50:37 +0100406 /* Send event to sockets */
407 ev.event = event;
408 ev.dev_id = hdev->id;
409 hci_si_event(NULL, HCI_EV_SI_DEVICE, sizeof(ev), &ev);
410
411 if (event == HCI_DEV_UNREG) {
412 struct sock *sk;
Marcel Holtmann040030e2012-02-20 14:50:37 +0100413
414 /* Detach sockets from device */
415 read_lock(&hci_sk_list.lock);
Sasha Levinb67bfe02013-02-27 17:06:00 -0800416 sk_for_each(sk, &hci_sk_list.head) {
Marcel Holtmann040030e2012-02-20 14:50:37 +0100417 bh_lock_sock_nested(sk);
418 if (hci_pi(sk)->hdev == hdev) {
419 hci_pi(sk)->hdev = NULL;
420 sk->sk_err = EPIPE;
421 sk->sk_state = BT_OPEN;
422 sk->sk_state_change(sk);
423
424 hci_dev_put(hdev);
425 }
426 bh_unlock_sock(sk);
427 }
428 read_unlock(&hci_sk_list.lock);
429 }
430}
431
Linus Torvalds1da177e2005-04-16 15:20:36 -0700432static int hci_sock_release(struct socket *sock)
433{
434 struct sock *sk = sock->sk;
Marcel Holtmann7b005bd2006-02-13 11:40:03 +0100435 struct hci_dev *hdev;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700436
437 BT_DBG("sock %p sk %p", sock, sk);
438
439 if (!sk)
440 return 0;
441
Marcel Holtmann7b005bd2006-02-13 11:40:03 +0100442 hdev = hci_pi(sk)->hdev;
443
Marcel Holtmanncd82e612012-02-20 20:34:38 +0100444 if (hci_pi(sk)->channel == HCI_CHANNEL_MONITOR)
445 atomic_dec(&monitor_promisc);
446
Linus Torvalds1da177e2005-04-16 15:20:36 -0700447 bt_sock_unlink(&hci_sk_list, sk);
448
449 if (hdev) {
Marcel Holtmann23500182013-08-26 21:40:52 -0700450 if (hci_pi(sk)->channel == HCI_CHANNEL_USER) {
Marcel Holtmann0602a8a2014-07-02 21:30:54 +0200451 mgmt_index_added(hdev);
Marcel Holtmann23500182013-08-26 21:40:52 -0700452 clear_bit(HCI_USER_CHANNEL, &hdev->dev_flags);
453 hci_dev_close(hdev->id);
454 }
455
Linus Torvalds1da177e2005-04-16 15:20:36 -0700456 atomic_dec(&hdev->promisc);
457 hci_dev_put(hdev);
458 }
459
460 sock_orphan(sk);
461
462 skb_queue_purge(&sk->sk_receive_queue);
463 skb_queue_purge(&sk->sk_write_queue);
464
465 sock_put(sk);
466 return 0;
467}
468
Antti Julkub2a66aa2011-06-15 12:01:14 +0300469static int hci_sock_blacklist_add(struct hci_dev *hdev, void __user *arg)
Johan Hedbergf0358562010-05-18 13:20:32 +0200470{
471 bdaddr_t bdaddr;
Antti Julku5e762442011-08-25 16:48:02 +0300472 int err;
Johan Hedbergf0358562010-05-18 13:20:32 +0200473
474 if (copy_from_user(&bdaddr, arg, sizeof(bdaddr)))
475 return -EFAULT;
476
Gustavo F. Padovan09fd0de2011-06-17 13:03:21 -0300477 hci_dev_lock(hdev);
Antti Julku5e762442011-08-25 16:48:02 +0300478
Johan Hedbergdcc36c12014-07-09 12:59:13 +0300479 err = hci_bdaddr_list_add(&hdev->blacklist, &bdaddr, BDADDR_BREDR);
Antti Julku5e762442011-08-25 16:48:02 +0300480
Gustavo F. Padovan09fd0de2011-06-17 13:03:21 -0300481 hci_dev_unlock(hdev);
Antti Julku5e762442011-08-25 16:48:02 +0300482
483 return err;
Johan Hedbergf0358562010-05-18 13:20:32 +0200484}
485
Antti Julkub2a66aa2011-06-15 12:01:14 +0300486static int hci_sock_blacklist_del(struct hci_dev *hdev, void __user *arg)
Johan Hedbergf0358562010-05-18 13:20:32 +0200487{
488 bdaddr_t bdaddr;
Antti Julku5e762442011-08-25 16:48:02 +0300489 int err;
Johan Hedbergf0358562010-05-18 13:20:32 +0200490
491 if (copy_from_user(&bdaddr, arg, sizeof(bdaddr)))
492 return -EFAULT;
493
Gustavo F. Padovan09fd0de2011-06-17 13:03:21 -0300494 hci_dev_lock(hdev);
Antti Julku5e762442011-08-25 16:48:02 +0300495
Johan Hedbergdcc36c12014-07-09 12:59:13 +0300496 err = hci_bdaddr_list_del(&hdev->blacklist, &bdaddr, BDADDR_BREDR);
Antti Julku5e762442011-08-25 16:48:02 +0300497
Gustavo F. Padovan09fd0de2011-06-17 13:03:21 -0300498 hci_dev_unlock(hdev);
Antti Julku5e762442011-08-25 16:48:02 +0300499
500 return err;
Johan Hedbergf0358562010-05-18 13:20:32 +0200501}
502
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900503/* Ioctls that require bound socket */
Gustavo Padovan6039aa732012-05-23 04:04:18 -0300504static int hci_sock_bound_ioctl(struct sock *sk, unsigned int cmd,
505 unsigned long arg)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700506{
507 struct hci_dev *hdev = hci_pi(sk)->hdev;
508
509 if (!hdev)
510 return -EBADFD;
511
Marcel Holtmann0736cfa2013-08-26 21:40:51 -0700512 if (test_bit(HCI_USER_CHANNEL, &hdev->dev_flags))
513 return -EBUSY;
514
Marcel Holtmann4a964402014-07-02 19:10:33 +0200515 if (test_bit(HCI_UNCONFIGURED, &hdev->dev_flags))
Marcel Holtmannfee746b2014-06-29 12:13:05 +0200516 return -EOPNOTSUPP;
517
Marcel Holtmann5b69bef52013-10-10 10:02:08 -0700518 if (hdev->dev_type != HCI_BREDR)
519 return -EOPNOTSUPP;
520
Linus Torvalds1da177e2005-04-16 15:20:36 -0700521 switch (cmd) {
522 case HCISETRAW:
523 if (!capable(CAP_NET_ADMIN))
Zhao Hongjiangbf5b30b2012-09-20 22:37:25 +0000524 return -EPERM;
Marcel Holtmanndb596682014-04-16 20:04:38 -0700525 return -EOPNOTSUPP;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700526
Linus Torvalds1da177e2005-04-16 15:20:36 -0700527 case HCIGETCONNINFO:
Marcel Holtmann40be4922008-07-14 20:13:50 +0200528 return hci_get_conn_info(hdev, (void __user *) arg);
529
530 case HCIGETAUTHINFO:
531 return hci_get_auth_info(hdev, (void __user *) arg);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700532
Johan Hedbergf0358562010-05-18 13:20:32 +0200533 case HCIBLOCKADDR:
534 if (!capable(CAP_NET_ADMIN))
Zhao Hongjiangbf5b30b2012-09-20 22:37:25 +0000535 return -EPERM;
Antti Julkub2a66aa2011-06-15 12:01:14 +0300536 return hci_sock_blacklist_add(hdev, (void __user *) arg);
Johan Hedbergf0358562010-05-18 13:20:32 +0200537
538 case HCIUNBLOCKADDR:
539 if (!capable(CAP_NET_ADMIN))
Zhao Hongjiangbf5b30b2012-09-20 22:37:25 +0000540 return -EPERM;
Antti Julkub2a66aa2011-06-15 12:01:14 +0300541 return hci_sock_blacklist_del(hdev, (void __user *) arg);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700542 }
Marcel Holtmann0736cfa2013-08-26 21:40:51 -0700543
Marcel Holtmann324d36e2013-10-10 10:50:06 -0700544 return -ENOIOCTLCMD;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700545}
546
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -0300547static int hci_sock_ioctl(struct socket *sock, unsigned int cmd,
548 unsigned long arg)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700549{
Marcel Holtmann40be4922008-07-14 20:13:50 +0200550 void __user *argp = (void __user *) arg;
Marcel Holtmann0736cfa2013-08-26 21:40:51 -0700551 struct sock *sk = sock->sk;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700552 int err;
553
554 BT_DBG("cmd %x arg %lx", cmd, arg);
555
Marcel Holtmannc1c4f952013-08-26 09:39:55 -0700556 lock_sock(sk);
557
558 if (hci_pi(sk)->channel != HCI_CHANNEL_RAW) {
559 err = -EBADFD;
560 goto done;
561 }
562
563 release_sock(sk);
564
Linus Torvalds1da177e2005-04-16 15:20:36 -0700565 switch (cmd) {
566 case HCIGETDEVLIST:
567 return hci_get_dev_list(argp);
568
569 case HCIGETDEVINFO:
570 return hci_get_dev_info(argp);
571
572 case HCIGETCONNLIST:
573 return hci_get_conn_list(argp);
574
575 case HCIDEVUP:
576 if (!capable(CAP_NET_ADMIN))
Zhao Hongjiangbf5b30b2012-09-20 22:37:25 +0000577 return -EPERM;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700578 return hci_dev_open(arg);
579
580 case HCIDEVDOWN:
581 if (!capable(CAP_NET_ADMIN))
Zhao Hongjiangbf5b30b2012-09-20 22:37:25 +0000582 return -EPERM;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700583 return hci_dev_close(arg);
584
585 case HCIDEVRESET:
586 if (!capable(CAP_NET_ADMIN))
Zhao Hongjiangbf5b30b2012-09-20 22:37:25 +0000587 return -EPERM;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700588 return hci_dev_reset(arg);
589
590 case HCIDEVRESTAT:
591 if (!capable(CAP_NET_ADMIN))
Zhao Hongjiangbf5b30b2012-09-20 22:37:25 +0000592 return -EPERM;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700593 return hci_dev_reset_stat(arg);
594
595 case HCISETSCAN:
596 case HCISETAUTH:
597 case HCISETENCRYPT:
598 case HCISETPTYPE:
599 case HCISETLINKPOL:
600 case HCISETLINKMODE:
601 case HCISETACLMTU:
602 case HCISETSCOMTU:
603 if (!capable(CAP_NET_ADMIN))
Zhao Hongjiangbf5b30b2012-09-20 22:37:25 +0000604 return -EPERM;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700605 return hci_dev_cmd(cmd, argp);
606
607 case HCIINQUIRY:
608 return hci_inquiry(argp);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700609 }
Marcel Holtmannc1c4f952013-08-26 09:39:55 -0700610
611 lock_sock(sk);
612
613 err = hci_sock_bound_ioctl(sk, cmd, arg);
614
615done:
616 release_sock(sk);
617 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700618}
619
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -0300620static int hci_sock_bind(struct socket *sock, struct sockaddr *addr,
621 int addr_len)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700622{
Johan Hedberg03811012010-12-08 00:21:06 +0200623 struct sockaddr_hci haddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700624 struct sock *sk = sock->sk;
625 struct hci_dev *hdev = NULL;
Johan Hedberg03811012010-12-08 00:21:06 +0200626 int len, err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700627
628 BT_DBG("sock %p sk %p", sock, sk);
629
Johan Hedberg03811012010-12-08 00:21:06 +0200630 if (!addr)
631 return -EINVAL;
632
633 memset(&haddr, 0, sizeof(haddr));
634 len = min_t(unsigned int, sizeof(haddr), addr_len);
635 memcpy(&haddr, addr, len);
636
637 if (haddr.hci_family != AF_BLUETOOTH)
638 return -EINVAL;
639
Linus Torvalds1da177e2005-04-16 15:20:36 -0700640 lock_sock(sk);
641
Marcel Holtmann7cc2ade2012-02-20 14:50:35 +0100642 if (sk->sk_state == BT_BOUND) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700643 err = -EALREADY;
644 goto done;
645 }
646
Marcel Holtmann7cc2ade2012-02-20 14:50:35 +0100647 switch (haddr.hci_channel) {
648 case HCI_CHANNEL_RAW:
649 if (hci_pi(sk)->hdev) {
650 err = -EALREADY;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700651 goto done;
652 }
653
Marcel Holtmann7cc2ade2012-02-20 14:50:35 +0100654 if (haddr.hci_dev != HCI_DEV_NONE) {
655 hdev = hci_dev_get(haddr.hci_dev);
656 if (!hdev) {
657 err = -ENODEV;
658 goto done;
659 }
660
661 atomic_inc(&hdev->promisc);
662 }
663
664 hci_pi(sk)->hdev = hdev;
665 break;
666
Marcel Holtmann23500182013-08-26 21:40:52 -0700667 case HCI_CHANNEL_USER:
668 if (hci_pi(sk)->hdev) {
669 err = -EALREADY;
670 goto done;
671 }
672
673 if (haddr.hci_dev == HCI_DEV_NONE) {
674 err = -EINVAL;
675 goto done;
676 }
677
Marcel Holtmann10a8b862013-10-01 22:59:24 -0700678 if (!capable(CAP_NET_ADMIN)) {
Marcel Holtmann23500182013-08-26 21:40:52 -0700679 err = -EPERM;
680 goto done;
681 }
682
683 hdev = hci_dev_get(haddr.hci_dev);
684 if (!hdev) {
685 err = -ENODEV;
686 goto done;
687 }
688
689 if (test_bit(HCI_UP, &hdev->flags) ||
690 test_bit(HCI_INIT, &hdev->flags) ||
Marcel Holtmannd603b762014-07-06 12:11:14 +0200691 test_bit(HCI_SETUP, &hdev->dev_flags) ||
692 test_bit(HCI_CONFIG, &hdev->dev_flags)) {
Marcel Holtmann23500182013-08-26 21:40:52 -0700693 err = -EBUSY;
694 hci_dev_put(hdev);
695 goto done;
696 }
697
698 if (test_and_set_bit(HCI_USER_CHANNEL, &hdev->dev_flags)) {
699 err = -EUSERS;
700 hci_dev_put(hdev);
701 goto done;
702 }
703
Marcel Holtmann0602a8a2014-07-02 21:30:54 +0200704 mgmt_index_removed(hdev);
Marcel Holtmann23500182013-08-26 21:40:52 -0700705
706 err = hci_dev_open(hdev->id);
707 if (err) {
708 clear_bit(HCI_USER_CHANNEL, &hdev->dev_flags);
Marcel Holtmann0602a8a2014-07-02 21:30:54 +0200709 mgmt_index_added(hdev);
Marcel Holtmann23500182013-08-26 21:40:52 -0700710 hci_dev_put(hdev);
711 goto done;
712 }
713
714 atomic_inc(&hdev->promisc);
715
716 hci_pi(sk)->hdev = hdev;
717 break;
718
Marcel Holtmann7cc2ade2012-02-20 14:50:35 +0100719 case HCI_CHANNEL_CONTROL:
Marcel Holtmann4b95a242012-02-20 21:24:37 +0100720 if (haddr.hci_dev != HCI_DEV_NONE) {
Marcel Holtmann7cc2ade2012-02-20 14:50:35 +0100721 err = -EINVAL;
722 goto done;
723 }
724
Marcel Holtmann801f13b2012-02-20 20:54:10 +0100725 if (!capable(CAP_NET_ADMIN)) {
726 err = -EPERM;
727 goto done;
728 }
729
Marcel Holtmann7cc2ade2012-02-20 14:50:35 +0100730 break;
731
Marcel Holtmanncd82e612012-02-20 20:34:38 +0100732 case HCI_CHANNEL_MONITOR:
733 if (haddr.hci_dev != HCI_DEV_NONE) {
734 err = -EINVAL;
735 goto done;
736 }
737
738 if (!capable(CAP_NET_RAW)) {
739 err = -EPERM;
740 goto done;
741 }
742
743 send_monitor_replay(sk);
744
745 atomic_inc(&monitor_promisc);
746 break;
747
Marcel Holtmann7cc2ade2012-02-20 14:50:35 +0100748 default:
749 err = -EINVAL;
750 goto done;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700751 }
752
Marcel Holtmann7cc2ade2012-02-20 14:50:35 +0100753
Johan Hedberg03811012010-12-08 00:21:06 +0200754 hci_pi(sk)->channel = haddr.hci_channel;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700755 sk->sk_state = BT_BOUND;
756
757done:
758 release_sock(sk);
759 return err;
760}
761
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -0300762static int hci_sock_getname(struct socket *sock, struct sockaddr *addr,
763 int *addr_len, int peer)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700764{
765 struct sockaddr_hci *haddr = (struct sockaddr_hci *) addr;
766 struct sock *sk = sock->sk;
Marcel Holtmann9d4b68b2013-08-26 00:20:37 -0700767 struct hci_dev *hdev;
768 int err = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700769
770 BT_DBG("sock %p sk %p", sock, sk);
771
Marcel Holtmann06f43cb2013-08-26 00:06:30 -0700772 if (peer)
773 return -EOPNOTSUPP;
774
Linus Torvalds1da177e2005-04-16 15:20:36 -0700775 lock_sock(sk);
776
Marcel Holtmann9d4b68b2013-08-26 00:20:37 -0700777 hdev = hci_pi(sk)->hdev;
778 if (!hdev) {
779 err = -EBADFD;
780 goto done;
781 }
782
Linus Torvalds1da177e2005-04-16 15:20:36 -0700783 *addr_len = sizeof(*haddr);
784 haddr->hci_family = AF_BLUETOOTH;
Marcel Holtmann7b005bd2006-02-13 11:40:03 +0100785 haddr->hci_dev = hdev->id;
Marcel Holtmann9d4b68b2013-08-26 00:20:37 -0700786 haddr->hci_channel= hci_pi(sk)->channel;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700787
Marcel Holtmann9d4b68b2013-08-26 00:20:37 -0700788done:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700789 release_sock(sk);
Marcel Holtmann9d4b68b2013-08-26 00:20:37 -0700790 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700791}
792
Gustavo Padovan6039aa732012-05-23 04:04:18 -0300793static void hci_sock_cmsg(struct sock *sk, struct msghdr *msg,
794 struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700795{
796 __u32 mask = hci_pi(sk)->cmsg_mask;
797
Marcel Holtmann0d48d932005-08-09 20:30:28 -0700798 if (mask & HCI_CMSG_DIR) {
799 int incoming = bt_cb(skb)->incoming;
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -0300800 put_cmsg(msg, SOL_HCI, HCI_CMSG_DIR, sizeof(incoming),
801 &incoming);
Marcel Holtmann0d48d932005-08-09 20:30:28 -0700802 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700803
Patrick McHardya61bbcf2005-08-14 17:24:31 -0700804 if (mask & HCI_CMSG_TSTAMP) {
Johann Felix Sodenf6e623a2010-02-15 22:23:48 +0100805#ifdef CONFIG_COMPAT
806 struct compat_timeval ctv;
807#endif
Patrick McHardya61bbcf2005-08-14 17:24:31 -0700808 struct timeval tv;
Marcel Holtmann767c5eb2007-09-09 08:39:34 +0200809 void *data;
810 int len;
Patrick McHardya61bbcf2005-08-14 17:24:31 -0700811
812 skb_get_timestamp(skb, &tv);
Marcel Holtmann767c5eb2007-09-09 08:39:34 +0200813
David S. Miller1da97f82007-09-12 14:10:58 +0200814 data = &tv;
815 len = sizeof(tv);
816#ifdef CONFIG_COMPAT
H. J. Luda88cea2012-02-10 14:12:15 -0800817 if (!COMPAT_USE_64BIT_TIME &&
818 (msg->msg_flags & MSG_CMSG_COMPAT)) {
Marcel Holtmann767c5eb2007-09-09 08:39:34 +0200819 ctv.tv_sec = tv.tv_sec;
820 ctv.tv_usec = tv.tv_usec;
821 data = &ctv;
822 len = sizeof(ctv);
Marcel Holtmann767c5eb2007-09-09 08:39:34 +0200823 }
David S. Miller1da97f82007-09-12 14:10:58 +0200824#endif
Marcel Holtmann767c5eb2007-09-09 08:39:34 +0200825
826 put_cmsg(msg, SOL_HCI, HCI_CMSG_TSTAMP, len, data);
Patrick McHardya61bbcf2005-08-14 17:24:31 -0700827 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700828}
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900829
830static int hci_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
Gustavo Padovan3bb3c752012-05-17 00:36:22 -0300831 struct msghdr *msg, size_t len, int flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700832{
833 int noblock = flags & MSG_DONTWAIT;
834 struct sock *sk = sock->sk;
835 struct sk_buff *skb;
836 int copied, err;
837
838 BT_DBG("sock %p, sk %p", sock, sk);
839
840 if (flags & (MSG_OOB))
841 return -EOPNOTSUPP;
842
843 if (sk->sk_state == BT_CLOSED)
844 return 0;
845
Andrei Emeltchenko70f230202010-12-01 16:58:25 +0200846 skb = skb_recv_datagram(sk, flags, noblock, &err);
847 if (!skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700848 return err;
849
Linus Torvalds1da177e2005-04-16 15:20:36 -0700850 copied = skb->len;
851 if (len < copied) {
852 msg->msg_flags |= MSG_TRUNC;
853 copied = len;
854 }
855
Arnaldo Carvalho de Melobadff6d2007-03-13 13:06:52 -0300856 skb_reset_transport_header(skb);
David S. Miller51f3d022014-11-05 16:46:40 -0500857 err = skb_copy_datagram_msg(skb, 0, msg, copied);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700858
Marcel Holtmann3a208622012-02-20 14:50:34 +0100859 switch (hci_pi(sk)->channel) {
860 case HCI_CHANNEL_RAW:
861 hci_sock_cmsg(sk, msg, skb);
862 break;
Marcel Holtmann23500182013-08-26 21:40:52 -0700863 case HCI_CHANNEL_USER:
Marcel Holtmann97e0bde2012-02-22 13:49:28 +0100864 case HCI_CHANNEL_CONTROL:
Marcel Holtmanncd82e612012-02-20 20:34:38 +0100865 case HCI_CHANNEL_MONITOR:
866 sock_recv_timestamp(msg, sk, skb);
867 break;
Marcel Holtmann3a208622012-02-20 14:50:34 +0100868 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700869
870 skb_free_datagram(sk, skb);
871
872 return err ? : copied;
873}
874
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900875static int hci_sock_sendmsg(struct kiocb *iocb, struct socket *sock,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700876 struct msghdr *msg, size_t len)
877{
878 struct sock *sk = sock->sk;
879 struct hci_dev *hdev;
880 struct sk_buff *skb;
881 int err;
882
883 BT_DBG("sock %p sk %p", sock, sk);
884
885 if (msg->msg_flags & MSG_OOB)
886 return -EOPNOTSUPP;
887
888 if (msg->msg_flags & ~(MSG_DONTWAIT|MSG_NOSIGNAL|MSG_ERRQUEUE))
889 return -EINVAL;
890
891 if (len < 4 || len > HCI_MAX_FRAME_SIZE)
892 return -EINVAL;
893
894 lock_sock(sk);
895
Johan Hedberg03811012010-12-08 00:21:06 +0200896 switch (hci_pi(sk)->channel) {
897 case HCI_CHANNEL_RAW:
Marcel Holtmann23500182013-08-26 21:40:52 -0700898 case HCI_CHANNEL_USER:
Johan Hedberg03811012010-12-08 00:21:06 +0200899 break;
900 case HCI_CHANNEL_CONTROL:
901 err = mgmt_control(sk, msg, len);
902 goto done;
Marcel Holtmanncd82e612012-02-20 20:34:38 +0100903 case HCI_CHANNEL_MONITOR:
904 err = -EOPNOTSUPP;
905 goto done;
Johan Hedberg03811012010-12-08 00:21:06 +0200906 default:
907 err = -EINVAL;
908 goto done;
909 }
910
Andrei Emeltchenko70f230202010-12-01 16:58:25 +0200911 hdev = hci_pi(sk)->hdev;
912 if (!hdev) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700913 err = -EBADFD;
914 goto done;
915 }
916
Marcel Holtmann7e21add2009-11-18 01:05:00 +0100917 if (!test_bit(HCI_UP, &hdev->flags)) {
918 err = -ENETDOWN;
919 goto done;
920 }
921
Andrei Emeltchenko70f230202010-12-01 16:58:25 +0200922 skb = bt_skb_send_alloc(sk, len, msg->msg_flags & MSG_DONTWAIT, &err);
923 if (!skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700924 goto done;
925
Al Viro6ce8e9c2014-04-06 21:25:44 -0400926 if (memcpy_from_msg(skb_put(skb, len), msg, len)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700927 err = -EFAULT;
928 goto drop;
929 }
930
Marcel Holtmann0d48d932005-08-09 20:30:28 -0700931 bt_cb(skb)->pkt_type = *((unsigned char *) skb->data);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700932 skb_pull(skb, 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700933
Marcel Holtmann1bc5ad12013-12-17 03:21:25 -0800934 if (hci_pi(sk)->channel == HCI_CHANNEL_USER) {
935 /* No permission check is needed for user channel
936 * since that gets enforced when binding the socket.
937 *
938 * However check that the packet type is valid.
939 */
940 if (bt_cb(skb)->pkt_type != HCI_COMMAND_PKT &&
941 bt_cb(skb)->pkt_type != HCI_ACLDATA_PKT &&
942 bt_cb(skb)->pkt_type != HCI_SCODATA_PKT) {
943 err = -EINVAL;
944 goto drop;
945 }
946
947 skb_queue_tail(&hdev->raw_q, skb);
948 queue_work(hdev->workqueue, &hdev->tx_work);
949 } else if (bt_cb(skb)->pkt_type == HCI_COMMAND_PKT) {
Harvey Harrison83985312008-05-02 16:25:46 -0700950 u16 opcode = get_unaligned_le16(skb->data);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700951 u16 ogf = hci_opcode_ogf(opcode);
952 u16 ocf = hci_opcode_ocf(opcode);
953
954 if (((ogf > HCI_SFLT_MAX_OGF) ||
Gustavo Padovan3bb3c752012-05-17 00:36:22 -0300955 !hci_test_bit(ocf & HCI_FLT_OCF_BITS,
956 &hci_sec_filter.ocf_mask[ogf])) &&
957 !capable(CAP_NET_RAW)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700958 err = -EPERM;
959 goto drop;
960 }
961
Marcel Holtmannfee746b2014-06-29 12:13:05 +0200962 if (ogf == 0x3f) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700963 skb_queue_tail(&hdev->raw_q, skb);
Gustavo F. Padovan3eff45e2011-12-15 00:50:02 -0200964 queue_work(hdev->workqueue, &hdev->tx_work);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700965 } else {
Stephen Hemminger49c922b2014-10-27 21:12:20 -0700966 /* Stand-alone HCI commands must be flagged as
Johan Hedberg11714b32013-03-05 20:37:47 +0200967 * single-command requests.
968 */
969 bt_cb(skb)->req.start = true;
970
Linus Torvalds1da177e2005-04-16 15:20:36 -0700971 skb_queue_tail(&hdev->cmd_q, skb);
Gustavo F. Padovanc347b762011-12-14 23:53:47 -0200972 queue_work(hdev->workqueue, &hdev->cmd_work);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700973 }
974 } else {
975 if (!capable(CAP_NET_RAW)) {
976 err = -EPERM;
977 goto drop;
978 }
979
980 skb_queue_tail(&hdev->raw_q, skb);
Gustavo F. Padovan3eff45e2011-12-15 00:50:02 -0200981 queue_work(hdev->workqueue, &hdev->tx_work);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700982 }
983
984 err = len;
985
986done:
987 release_sock(sk);
988 return err;
989
990drop:
991 kfree_skb(skb);
992 goto done;
993}
994
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -0300995static int hci_sock_setsockopt(struct socket *sock, int level, int optname,
996 char __user *optval, unsigned int len)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700997{
998 struct hci_ufilter uf = { .opcode = 0 };
999 struct sock *sk = sock->sk;
1000 int err = 0, opt = 0;
1001
1002 BT_DBG("sk %p, opt %d", sk, optname);
1003
1004 lock_sock(sk);
1005
Marcel Holtmann2f39cdb2012-02-20 14:50:32 +01001006 if (hci_pi(sk)->channel != HCI_CHANNEL_RAW) {
Marcel Holtmannc2371e82013-08-26 09:29:39 -07001007 err = -EBADFD;
Marcel Holtmann2f39cdb2012-02-20 14:50:32 +01001008 goto done;
1009 }
1010
Linus Torvalds1da177e2005-04-16 15:20:36 -07001011 switch (optname) {
1012 case HCI_DATA_DIR:
1013 if (get_user(opt, (int __user *)optval)) {
1014 err = -EFAULT;
1015 break;
1016 }
1017
1018 if (opt)
1019 hci_pi(sk)->cmsg_mask |= HCI_CMSG_DIR;
1020 else
1021 hci_pi(sk)->cmsg_mask &= ~HCI_CMSG_DIR;
1022 break;
1023
1024 case HCI_TIME_STAMP:
1025 if (get_user(opt, (int __user *)optval)) {
1026 err = -EFAULT;
1027 break;
1028 }
1029
1030 if (opt)
1031 hci_pi(sk)->cmsg_mask |= HCI_CMSG_TSTAMP;
1032 else
1033 hci_pi(sk)->cmsg_mask &= ~HCI_CMSG_TSTAMP;
1034 break;
1035
1036 case HCI_FILTER:
Marcel Holtmann0878b662007-05-05 00:35:59 +02001037 {
1038 struct hci_filter *f = &hci_pi(sk)->filter;
1039
1040 uf.type_mask = f->type_mask;
1041 uf.opcode = f->opcode;
1042 uf.event_mask[0] = *((u32 *) f->event_mask + 0);
1043 uf.event_mask[1] = *((u32 *) f->event_mask + 1);
1044 }
1045
Linus Torvalds1da177e2005-04-16 15:20:36 -07001046 len = min_t(unsigned int, len, sizeof(uf));
1047 if (copy_from_user(&uf, optval, len)) {
1048 err = -EFAULT;
1049 break;
1050 }
1051
1052 if (!capable(CAP_NET_RAW)) {
1053 uf.type_mask &= hci_sec_filter.type_mask;
1054 uf.event_mask[0] &= *((u32 *) hci_sec_filter.event_mask + 0);
1055 uf.event_mask[1] &= *((u32 *) hci_sec_filter.event_mask + 1);
1056 }
1057
1058 {
1059 struct hci_filter *f = &hci_pi(sk)->filter;
1060
1061 f->type_mask = uf.type_mask;
1062 f->opcode = uf.opcode;
1063 *((u32 *) f->event_mask + 0) = uf.event_mask[0];
1064 *((u32 *) f->event_mask + 1) = uf.event_mask[1];
1065 }
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001066 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001067
1068 default:
1069 err = -ENOPROTOOPT;
1070 break;
1071 }
1072
Marcel Holtmann2f39cdb2012-02-20 14:50:32 +01001073done:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001074 release_sock(sk);
1075 return err;
1076}
1077
Gustavo Padovan8fc9ced2012-05-23 04:04:21 -03001078static int hci_sock_getsockopt(struct socket *sock, int level, int optname,
1079 char __user *optval, int __user *optlen)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001080{
1081 struct hci_ufilter uf;
1082 struct sock *sk = sock->sk;
Marcel Holtmanncedc5462012-02-20 14:50:33 +01001083 int len, opt, err = 0;
1084
1085 BT_DBG("sk %p, opt %d", sk, optname);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001086
1087 if (get_user(len, optlen))
1088 return -EFAULT;
1089
Marcel Holtmanncedc5462012-02-20 14:50:33 +01001090 lock_sock(sk);
1091
1092 if (hci_pi(sk)->channel != HCI_CHANNEL_RAW) {
Marcel Holtmannc2371e82013-08-26 09:29:39 -07001093 err = -EBADFD;
Marcel Holtmanncedc5462012-02-20 14:50:33 +01001094 goto done;
1095 }
1096
Linus Torvalds1da177e2005-04-16 15:20:36 -07001097 switch (optname) {
1098 case HCI_DATA_DIR:
1099 if (hci_pi(sk)->cmsg_mask & HCI_CMSG_DIR)
1100 opt = 1;
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001101 else
Linus Torvalds1da177e2005-04-16 15:20:36 -07001102 opt = 0;
1103
1104 if (put_user(opt, optval))
Marcel Holtmanncedc5462012-02-20 14:50:33 +01001105 err = -EFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001106 break;
1107
1108 case HCI_TIME_STAMP:
1109 if (hci_pi(sk)->cmsg_mask & HCI_CMSG_TSTAMP)
1110 opt = 1;
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001111 else
Linus Torvalds1da177e2005-04-16 15:20:36 -07001112 opt = 0;
1113
1114 if (put_user(opt, optval))
Marcel Holtmanncedc5462012-02-20 14:50:33 +01001115 err = -EFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001116 break;
1117
1118 case HCI_FILTER:
1119 {
1120 struct hci_filter *f = &hci_pi(sk)->filter;
1121
Mathias Krausee15ca9a2012-08-15 11:31:46 +00001122 memset(&uf, 0, sizeof(uf));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001123 uf.type_mask = f->type_mask;
1124 uf.opcode = f->opcode;
1125 uf.event_mask[0] = *((u32 *) f->event_mask + 0);
1126 uf.event_mask[1] = *((u32 *) f->event_mask + 1);
1127 }
1128
1129 len = min_t(unsigned int, len, sizeof(uf));
1130 if (copy_to_user(optval, &uf, len))
Marcel Holtmanncedc5462012-02-20 14:50:33 +01001131 err = -EFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001132 break;
1133
1134 default:
Marcel Holtmanncedc5462012-02-20 14:50:33 +01001135 err = -ENOPROTOOPT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001136 break;
1137 }
1138
Marcel Holtmanncedc5462012-02-20 14:50:33 +01001139done:
1140 release_sock(sk);
1141 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001142}
1143
Eric Dumazet90ddc4f2005-12-22 12:49:22 -08001144static const struct proto_ops hci_sock_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001145 .family = PF_BLUETOOTH,
1146 .owner = THIS_MODULE,
1147 .release = hci_sock_release,
1148 .bind = hci_sock_bind,
1149 .getname = hci_sock_getname,
1150 .sendmsg = hci_sock_sendmsg,
1151 .recvmsg = hci_sock_recvmsg,
1152 .ioctl = hci_sock_ioctl,
1153 .poll = datagram_poll,
1154 .listen = sock_no_listen,
1155 .shutdown = sock_no_shutdown,
1156 .setsockopt = hci_sock_setsockopt,
1157 .getsockopt = hci_sock_getsockopt,
1158 .connect = sock_no_connect,
1159 .socketpair = sock_no_socketpair,
1160 .accept = sock_no_accept,
1161 .mmap = sock_no_mmap
1162};
1163
1164static struct proto hci_sk_proto = {
1165 .name = "HCI",
1166 .owner = THIS_MODULE,
1167 .obj_size = sizeof(struct hci_pinfo)
1168};
1169
Eric Paris3f378b62009-11-05 22:18:14 -08001170static int hci_sock_create(struct net *net, struct socket *sock, int protocol,
1171 int kern)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001172{
1173 struct sock *sk;
1174
1175 BT_DBG("sock %p", sock);
1176
1177 if (sock->type != SOCK_RAW)
1178 return -ESOCKTNOSUPPORT;
1179
1180 sock->ops = &hci_sock_ops;
1181
Pavel Emelyanov6257ff22007-11-01 00:39:31 -07001182 sk = sk_alloc(net, PF_BLUETOOTH, GFP_ATOMIC, &hci_sk_proto);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001183 if (!sk)
1184 return -ENOMEM;
1185
1186 sock_init_data(sock, sk);
1187
1188 sock_reset_flag(sk, SOCK_ZAPPED);
1189
1190 sk->sk_protocol = protocol;
1191
1192 sock->state = SS_UNCONNECTED;
1193 sk->sk_state = BT_OPEN;
1194
1195 bt_sock_link(&hci_sk_list, sk);
1196 return 0;
1197}
1198
Stephen Hemmingerec1b4cf2009-10-05 05:58:39 +00001199static const struct net_proto_family hci_sock_family_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001200 .family = PF_BLUETOOTH,
1201 .owner = THIS_MODULE,
1202 .create = hci_sock_create,
1203};
1204
Linus Torvalds1da177e2005-04-16 15:20:36 -07001205int __init hci_sock_init(void)
1206{
1207 int err;
1208
Marcel Holtmannb0a8e282015-01-11 15:18:17 -08001209 BUILD_BUG_ON(sizeof(struct sockaddr_hci) > sizeof(struct sockaddr));
1210
Linus Torvalds1da177e2005-04-16 15:20:36 -07001211 err = proto_register(&hci_sk_proto, 0);
1212 if (err < 0)
1213 return err;
1214
1215 err = bt_sock_register(BTPROTO_HCI, &hci_sock_family_ops);
Masatake YAMATOf7c86632012-07-26 01:28:36 +09001216 if (err < 0) {
1217 BT_ERR("HCI socket registration failed");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001218 goto error;
Masatake YAMATOf7c86632012-07-26 01:28:36 +09001219 }
1220
Al Virob0316612013-04-04 19:14:33 -04001221 err = bt_procfs_init(&init_net, "hci", &hci_sk_list, NULL);
Masatake YAMATOf7c86632012-07-26 01:28:36 +09001222 if (err < 0) {
1223 BT_ERR("Failed to create HCI proc file");
1224 bt_sock_unregister(BTPROTO_HCI);
1225 goto error;
1226 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001227
Linus Torvalds1da177e2005-04-16 15:20:36 -07001228 BT_INFO("HCI socket layer initialized");
1229
1230 return 0;
1231
1232error:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001233 proto_unregister(&hci_sk_proto);
1234 return err;
1235}
1236
Anand Gadiyarb7440a142011-02-22 12:43:09 +05301237void hci_sock_cleanup(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001238{
Masatake YAMATOf7c86632012-07-26 01:28:36 +09001239 bt_procfs_cleanup(&init_net, "hci");
David Herrmann5e9d7f82013-02-24 19:36:51 +01001240 bt_sock_unregister(BTPROTO_HCI);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001241 proto_unregister(&hci_sk_proto);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001242}