Bluetooth: Add flags field and setting function for HCI sockets
[deliverable/linux.git] / net / bluetooth / hci_sock.c
CommitLineData
8e87d142 1/*
1da177e4
LT
2 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
8e87d142
YH
15 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
1da177e4
LT
18 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19
8e87d142
YH
20 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
21 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
1da177e4
LT
22 SOFTWARE IS DISCLAIMED.
23*/
24
25/* Bluetooth HCI sockets. */
26
8c520a59 27#include <linux/export.h>
1da177e4
LT
28#include <asm/unaligned.h>
29
30#include <net/bluetooth/bluetooth.h>
31#include <net/bluetooth/hci_core.h>
cd82e61c 32#include <net/bluetooth/hci_mon.h>
1da177e4 33
801c1e8d
JH
34static LIST_HEAD(mgmt_chan_list);
35static DEFINE_MUTEX(mgmt_chan_list_lock);
36
cd82e61c
MH
37static atomic_t monitor_promisc = ATOMIC_INIT(0);
38
1da177e4
LT
39/* ----- HCI socket interface ----- */
40
863def58
MH
41/* Socket info */
42#define hci_pi(sk) ((struct hci_pinfo *) sk)
43
44struct hci_pinfo {
45 struct bt_sock bt;
46 struct hci_dev *hdev;
47 struct hci_filter filter;
48 __u32 cmsg_mask;
49 unsigned short channel;
6befc644 50 unsigned long flags;
863def58
MH
51};
52
6befc644
MH
53void hci_sock_set_flag(struct sock *sk, int nr)
54{
55 set_bit(nr, &hci_pi(sk)->flags);
56}
57
58void hci_sock_clear_flag(struct sock *sk, int nr)
59{
60 clear_bit(nr, &hci_pi(sk)->flags);
61}
62
9391976a 63static inline int hci_test_bit(int nr, const void *addr)
1da177e4 64{
9391976a 65 return *((const __u32 *) addr + (nr >> 5)) & ((__u32) 1 << (nr & 31));
1da177e4
LT
66}
67
68/* Security filter */
3ad254f7
MH
69#define HCI_SFLT_MAX_OGF 5
70
71struct hci_sec_filter {
72 __u32 type_mask;
73 __u32 event_mask[2];
74 __u32 ocf_mask[HCI_SFLT_MAX_OGF + 1][4];
75};
76
7e67c112 77static const struct hci_sec_filter hci_sec_filter = {
1da177e4
LT
78 /* Packet types */
79 0x10,
80 /* Events */
dd7f5527 81 { 0x1000d9fe, 0x0000b00c },
1da177e4
LT
82 /* Commands */
83 {
84 { 0x0 },
85 /* OGF_LINK_CTL */
7c631a67 86 { 0xbe000006, 0x00000001, 0x00000000, 0x00 },
1da177e4 87 /* OGF_LINK_POLICY */
7c631a67 88 { 0x00005200, 0x00000000, 0x00000000, 0x00 },
1da177e4 89 /* OGF_HOST_CTL */
7c631a67 90 { 0xaab00200, 0x2b402aaa, 0x05220154, 0x00 },
1da177e4 91 /* OGF_INFO_PARAM */
7c631a67 92 { 0x000002be, 0x00000000, 0x00000000, 0x00 },
1da177e4 93 /* OGF_STATUS_PARAM */
7c631a67 94 { 0x000000ea, 0x00000000, 0x00000000, 0x00 }
1da177e4
LT
95 }
96};
97
98static struct bt_sock_list hci_sk_list = {
d5fb2962 99 .lock = __RW_LOCK_UNLOCKED(hci_sk_list.lock)
1da177e4
LT
100};
101
f81fe64f
MH
102static bool is_filtered_packet(struct sock *sk, struct sk_buff *skb)
103{
104 struct hci_filter *flt;
105 int flt_type, flt_event;
106
107 /* Apply filter */
108 flt = &hci_pi(sk)->filter;
109
110 if (bt_cb(skb)->pkt_type == HCI_VENDOR_PKT)
111 flt_type = 0;
112 else
113 flt_type = bt_cb(skb)->pkt_type & HCI_FLT_TYPE_BITS;
114
115 if (!test_bit(flt_type, &flt->type_mask))
116 return true;
117
118 /* Extra filter for event packets only */
119 if (bt_cb(skb)->pkt_type != HCI_EVENT_PKT)
120 return false;
121
122 flt_event = (*(__u8 *)skb->data & HCI_FLT_EVENT_BITS);
123
124 if (!hci_test_bit(flt_event, &flt->event_mask))
125 return true;
126
127 /* Check filter only when opcode is set */
128 if (!flt->opcode)
129 return false;
130
131 if (flt_event == HCI_EV_CMD_COMPLETE &&
132 flt->opcode != get_unaligned((__le16 *)(skb->data + 3)))
133 return true;
134
135 if (flt_event == HCI_EV_CMD_STATUS &&
136 flt->opcode != get_unaligned((__le16 *)(skb->data + 4)))
137 return true;
138
139 return false;
140}
141
1da177e4 142/* Send frame to RAW socket */
470fe1b5 143void hci_send_to_sock(struct hci_dev *hdev, struct sk_buff *skb)
1da177e4
LT
144{
145 struct sock *sk;
e0edf373 146 struct sk_buff *skb_copy = NULL;
1da177e4
LT
147
148 BT_DBG("hdev %p len %d", hdev, skb->len);
149
150 read_lock(&hci_sk_list.lock);
470fe1b5 151
b67bfe0d 152 sk_for_each(sk, &hci_sk_list.head) {
1da177e4
LT
153 struct sk_buff *nskb;
154
155 if (sk->sk_state != BT_BOUND || hci_pi(sk)->hdev != hdev)
156 continue;
157
158 /* Don't send frame to the socket it came from */
159 if (skb->sk == sk)
160 continue;
161
23500189
MH
162 if (hci_pi(sk)->channel == HCI_CHANNEL_RAW) {
163 if (is_filtered_packet(sk, skb))
164 continue;
165 } else if (hci_pi(sk)->channel == HCI_CHANNEL_USER) {
166 if (!bt_cb(skb)->incoming)
167 continue;
168 if (bt_cb(skb)->pkt_type != HCI_EVENT_PKT &&
169 bt_cb(skb)->pkt_type != HCI_ACLDATA_PKT &&
170 bt_cb(skb)->pkt_type != HCI_SCODATA_PKT)
171 continue;
172 } else {
173 /* Don't send frame to other channel types */
1da177e4 174 continue;
23500189 175 }
1da177e4 176
e0edf373
MH
177 if (!skb_copy) {
178 /* Create a private copy with headroom */
bad93e9d 179 skb_copy = __pskb_copy_fclone(skb, 1, GFP_ATOMIC, true);
e0edf373
MH
180 if (!skb_copy)
181 continue;
182
183 /* Put type byte before the data */
184 memcpy(skb_push(skb_copy, 1), &bt_cb(skb)->pkt_type, 1);
185 }
186
187 nskb = skb_clone(skb_copy, GFP_ATOMIC);
70f23020 188 if (!nskb)
1da177e4
LT
189 continue;
190
470fe1b5
MH
191 if (sock_queue_rcv_skb(sk, nskb))
192 kfree_skb(nskb);
193 }
194
195 read_unlock(&hci_sk_list.lock);
e0edf373
MH
196
197 kfree_skb(skb_copy);
470fe1b5
MH
198}
199
7129069e
JH
200/* Send frame to sockets with specific channel */
201void hci_send_to_channel(unsigned short channel, struct sk_buff *skb,
202 struct sock *skip_sk)
470fe1b5
MH
203{
204 struct sock *sk;
470fe1b5 205
7129069e 206 BT_DBG("channel %u len %d", channel, skb->len);
470fe1b5
MH
207
208 read_lock(&hci_sk_list.lock);
209
b67bfe0d 210 sk_for_each(sk, &hci_sk_list.head) {
470fe1b5
MH
211 struct sk_buff *nskb;
212
213 /* Skip the original socket */
214 if (sk == skip_sk)
215 continue;
216
217 if (sk->sk_state != BT_BOUND)
218 continue;
219
7129069e 220 if (hci_pi(sk)->channel != channel)
d7f72f61
MH
221 continue;
222
223 nskb = skb_clone(skb, GFP_ATOMIC);
224 if (!nskb)
225 continue;
226
227 if (sock_queue_rcv_skb(sk, nskb))
228 kfree_skb(nskb);
229 }
230
231 read_unlock(&hci_sk_list.lock);
232}
233
cd82e61c
MH
234/* Send frame to monitor socket */
235void hci_send_to_monitor(struct hci_dev *hdev, struct sk_buff *skb)
236{
cd82e61c 237 struct sk_buff *skb_copy = NULL;
2b531294 238 struct hci_mon_hdr *hdr;
cd82e61c
MH
239 __le16 opcode;
240
241 if (!atomic_read(&monitor_promisc))
242 return;
243
244 BT_DBG("hdev %p len %d", hdev, skb->len);
245
246 switch (bt_cb(skb)->pkt_type) {
247 case HCI_COMMAND_PKT:
dcf4adbf 248 opcode = cpu_to_le16(HCI_MON_COMMAND_PKT);
cd82e61c
MH
249 break;
250 case HCI_EVENT_PKT:
dcf4adbf 251 opcode = cpu_to_le16(HCI_MON_EVENT_PKT);
cd82e61c
MH
252 break;
253 case HCI_ACLDATA_PKT:
254 if (bt_cb(skb)->incoming)
dcf4adbf 255 opcode = cpu_to_le16(HCI_MON_ACL_RX_PKT);
cd82e61c 256 else
dcf4adbf 257 opcode = cpu_to_le16(HCI_MON_ACL_TX_PKT);
cd82e61c
MH
258 break;
259 case HCI_SCODATA_PKT:
260 if (bt_cb(skb)->incoming)
dcf4adbf 261 opcode = cpu_to_le16(HCI_MON_SCO_RX_PKT);
cd82e61c 262 else
dcf4adbf 263 opcode = cpu_to_le16(HCI_MON_SCO_TX_PKT);
cd82e61c
MH
264 break;
265 default:
266 return;
267 }
268
2b531294
MH
269 /* Create a private copy with headroom */
270 skb_copy = __pskb_copy_fclone(skb, HCI_MON_HDR_SIZE, GFP_ATOMIC, true);
271 if (!skb_copy)
272 return;
273
274 /* Put header before the data */
275 hdr = (void *) skb_push(skb_copy, HCI_MON_HDR_SIZE);
276 hdr->opcode = opcode;
277 hdr->index = cpu_to_le16(hdev->id);
278 hdr->len = cpu_to_le16(skb->len);
279
03f310ef 280 hci_send_to_channel(HCI_CHANNEL_MONITOR, skb_copy, NULL);
cd82e61c
MH
281 kfree_skb(skb_copy);
282}
283
cd82e61c
MH
284static struct sk_buff *create_monitor_event(struct hci_dev *hdev, int event)
285{
286 struct hci_mon_hdr *hdr;
287 struct hci_mon_new_index *ni;
288 struct sk_buff *skb;
289 __le16 opcode;
290
291 switch (event) {
292 case HCI_DEV_REG:
293 skb = bt_skb_alloc(HCI_MON_NEW_INDEX_SIZE, GFP_ATOMIC);
294 if (!skb)
295 return NULL;
296
297 ni = (void *) skb_put(skb, HCI_MON_NEW_INDEX_SIZE);
298 ni->type = hdev->dev_type;
299 ni->bus = hdev->bus;
300 bacpy(&ni->bdaddr, &hdev->bdaddr);
301 memcpy(ni->name, hdev->name, 8);
302
dcf4adbf 303 opcode = cpu_to_le16(HCI_MON_NEW_INDEX);
cd82e61c
MH
304 break;
305
306 case HCI_DEV_UNREG:
307 skb = bt_skb_alloc(0, GFP_ATOMIC);
308 if (!skb)
309 return NULL;
310
dcf4adbf 311 opcode = cpu_to_le16(HCI_MON_DEL_INDEX);
cd82e61c
MH
312 break;
313
314 default:
315 return NULL;
316 }
317
318 __net_timestamp(skb);
319
320 hdr = (void *) skb_push(skb, HCI_MON_HDR_SIZE);
321 hdr->opcode = opcode;
322 hdr->index = cpu_to_le16(hdev->id);
323 hdr->len = cpu_to_le16(skb->len - HCI_MON_HDR_SIZE);
324
325 return skb;
326}
327
328static void send_monitor_replay(struct sock *sk)
329{
330 struct hci_dev *hdev;
331
332 read_lock(&hci_dev_list_lock);
333
334 list_for_each_entry(hdev, &hci_dev_list, list) {
335 struct sk_buff *skb;
336
337 skb = create_monitor_event(hdev, HCI_DEV_REG);
338 if (!skb)
339 continue;
340
341 if (sock_queue_rcv_skb(sk, skb))
342 kfree_skb(skb);
343 }
344
345 read_unlock(&hci_dev_list_lock);
346}
347
040030ef
MH
348/* Generate internal stack event */
349static void hci_si_event(struct hci_dev *hdev, int type, int dlen, void *data)
350{
351 struct hci_event_hdr *hdr;
352 struct hci_ev_stack_internal *ev;
353 struct sk_buff *skb;
354
355 skb = bt_skb_alloc(HCI_EVENT_HDR_SIZE + sizeof(*ev) + dlen, GFP_ATOMIC);
356 if (!skb)
357 return;
358
359 hdr = (void *) skb_put(skb, HCI_EVENT_HDR_SIZE);
360 hdr->evt = HCI_EV_STACK_INTERNAL;
361 hdr->plen = sizeof(*ev) + dlen;
362
363 ev = (void *) skb_put(skb, sizeof(*ev) + dlen);
364 ev->type = type;
365 memcpy(ev->data, data, dlen);
366
367 bt_cb(skb)->incoming = 1;
368 __net_timestamp(skb);
369
370 bt_cb(skb)->pkt_type = HCI_EVENT_PKT;
040030ef
MH
371 hci_send_to_sock(hdev, skb);
372 kfree_skb(skb);
373}
374
375void hci_sock_dev_event(struct hci_dev *hdev, int event)
376{
377 struct hci_ev_si_device ev;
378
379 BT_DBG("hdev %s event %d", hdev->name, event);
380
cd82e61c
MH
381 /* Send event to monitor */
382 if (atomic_read(&monitor_promisc)) {
383 struct sk_buff *skb;
384
385 skb = create_monitor_event(hdev, event);
386 if (skb) {
03f310ef 387 hci_send_to_channel(HCI_CHANNEL_MONITOR, skb, NULL);
cd82e61c
MH
388 kfree_skb(skb);
389 }
390 }
391
040030ef
MH
392 /* Send event to sockets */
393 ev.event = event;
394 ev.dev_id = hdev->id;
395 hci_si_event(NULL, HCI_EV_SI_DEVICE, sizeof(ev), &ev);
396
397 if (event == HCI_DEV_UNREG) {
398 struct sock *sk;
040030ef
MH
399
400 /* Detach sockets from device */
401 read_lock(&hci_sk_list.lock);
b67bfe0d 402 sk_for_each(sk, &hci_sk_list.head) {
040030ef
MH
403 bh_lock_sock_nested(sk);
404 if (hci_pi(sk)->hdev == hdev) {
405 hci_pi(sk)->hdev = NULL;
406 sk->sk_err = EPIPE;
407 sk->sk_state = BT_OPEN;
408 sk->sk_state_change(sk);
409
410 hci_dev_put(hdev);
411 }
412 bh_unlock_sock(sk);
413 }
414 read_unlock(&hci_sk_list.lock);
415 }
416}
417
801c1e8d
JH
418static struct hci_mgmt_chan *__hci_mgmt_chan_find(unsigned short channel)
419{
420 struct hci_mgmt_chan *c;
421
422 list_for_each_entry(c, &mgmt_chan_list, list) {
423 if (c->channel == channel)
424 return c;
425 }
426
427 return NULL;
428}
429
430static struct hci_mgmt_chan *hci_mgmt_chan_find(unsigned short channel)
431{
432 struct hci_mgmt_chan *c;
433
434 mutex_lock(&mgmt_chan_list_lock);
435 c = __hci_mgmt_chan_find(channel);
436 mutex_unlock(&mgmt_chan_list_lock);
437
438 return c;
439}
440
441int hci_mgmt_chan_register(struct hci_mgmt_chan *c)
442{
443 if (c->channel < HCI_CHANNEL_CONTROL)
444 return -EINVAL;
445
446 mutex_lock(&mgmt_chan_list_lock);
447 if (__hci_mgmt_chan_find(c->channel)) {
448 mutex_unlock(&mgmt_chan_list_lock);
449 return -EALREADY;
450 }
451
452 list_add_tail(&c->list, &mgmt_chan_list);
453
454 mutex_unlock(&mgmt_chan_list_lock);
455
456 return 0;
457}
458EXPORT_SYMBOL(hci_mgmt_chan_register);
459
460void hci_mgmt_chan_unregister(struct hci_mgmt_chan *c)
461{
462 mutex_lock(&mgmt_chan_list_lock);
463 list_del(&c->list);
464 mutex_unlock(&mgmt_chan_list_lock);
465}
466EXPORT_SYMBOL(hci_mgmt_chan_unregister);
467
1da177e4
LT
468static int hci_sock_release(struct socket *sock)
469{
470 struct sock *sk = sock->sk;
7b005bd3 471 struct hci_dev *hdev;
1da177e4
LT
472
473 BT_DBG("sock %p sk %p", sock, sk);
474
475 if (!sk)
476 return 0;
477
7b005bd3
MH
478 hdev = hci_pi(sk)->hdev;
479
cd82e61c
MH
480 if (hci_pi(sk)->channel == HCI_CHANNEL_MONITOR)
481 atomic_dec(&monitor_promisc);
482
1da177e4
LT
483 bt_sock_unlink(&hci_sk_list, sk);
484
485 if (hdev) {
23500189 486 if (hci_pi(sk)->channel == HCI_CHANNEL_USER) {
0602a8ad 487 mgmt_index_added(hdev);
a358dc11 488 hci_dev_clear_flag(hdev, HCI_USER_CHANNEL);
23500189
MH
489 hci_dev_close(hdev->id);
490 }
491
1da177e4
LT
492 atomic_dec(&hdev->promisc);
493 hci_dev_put(hdev);
494 }
495
496 sock_orphan(sk);
497
498 skb_queue_purge(&sk->sk_receive_queue);
499 skb_queue_purge(&sk->sk_write_queue);
500
501 sock_put(sk);
502 return 0;
503}
504
b2a66aad 505static int hci_sock_blacklist_add(struct hci_dev *hdev, void __user *arg)
f0358568
JH
506{
507 bdaddr_t bdaddr;
5e762444 508 int err;
f0358568
JH
509
510 if (copy_from_user(&bdaddr, arg, sizeof(bdaddr)))
511 return -EFAULT;
512
09fd0de5 513 hci_dev_lock(hdev);
5e762444 514
dcc36c16 515 err = hci_bdaddr_list_add(&hdev->blacklist, &bdaddr, BDADDR_BREDR);
5e762444 516
09fd0de5 517 hci_dev_unlock(hdev);
5e762444
AJ
518
519 return err;
f0358568
JH
520}
521
b2a66aad 522static int hci_sock_blacklist_del(struct hci_dev *hdev, void __user *arg)
f0358568
JH
523{
524 bdaddr_t bdaddr;
5e762444 525 int err;
f0358568
JH
526
527 if (copy_from_user(&bdaddr, arg, sizeof(bdaddr)))
528 return -EFAULT;
529
09fd0de5 530 hci_dev_lock(hdev);
5e762444 531
dcc36c16 532 err = hci_bdaddr_list_del(&hdev->blacklist, &bdaddr, BDADDR_BREDR);
5e762444 533
09fd0de5 534 hci_dev_unlock(hdev);
5e762444
AJ
535
536 return err;
f0358568
JH
537}
538
8e87d142 539/* Ioctls that require bound socket */
6039aa73
GP
540static int hci_sock_bound_ioctl(struct sock *sk, unsigned int cmd,
541 unsigned long arg)
1da177e4
LT
542{
543 struct hci_dev *hdev = hci_pi(sk)->hdev;
544
545 if (!hdev)
546 return -EBADFD;
547
d7a5a11d 548 if (hci_dev_test_flag(hdev, HCI_USER_CHANNEL))
0736cfa8
MH
549 return -EBUSY;
550
d7a5a11d 551 if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED))
fee746b0
MH
552 return -EOPNOTSUPP;
553
5b69bef5
MH
554 if (hdev->dev_type != HCI_BREDR)
555 return -EOPNOTSUPP;
556
1da177e4
LT
557 switch (cmd) {
558 case HCISETRAW:
559 if (!capable(CAP_NET_ADMIN))
bf5b30b8 560 return -EPERM;
db596681 561 return -EOPNOTSUPP;
1da177e4 562
1da177e4 563 case HCIGETCONNINFO:
40be492f
MH
564 return hci_get_conn_info(hdev, (void __user *) arg);
565
566 case HCIGETAUTHINFO:
567 return hci_get_auth_info(hdev, (void __user *) arg);
1da177e4 568
f0358568
JH
569 case HCIBLOCKADDR:
570 if (!capable(CAP_NET_ADMIN))
bf5b30b8 571 return -EPERM;
b2a66aad 572 return hci_sock_blacklist_add(hdev, (void __user *) arg);
f0358568
JH
573
574 case HCIUNBLOCKADDR:
575 if (!capable(CAP_NET_ADMIN))
bf5b30b8 576 return -EPERM;
b2a66aad 577 return hci_sock_blacklist_del(hdev, (void __user *) arg);
1da177e4 578 }
0736cfa8 579
324d36ed 580 return -ENOIOCTLCMD;
1da177e4
LT
581}
582
8fc9ced3
GP
583static int hci_sock_ioctl(struct socket *sock, unsigned int cmd,
584 unsigned long arg)
1da177e4 585{
40be492f 586 void __user *argp = (void __user *) arg;
0736cfa8 587 struct sock *sk = sock->sk;
1da177e4
LT
588 int err;
589
590 BT_DBG("cmd %x arg %lx", cmd, arg);
591
c1c4f956
MH
592 lock_sock(sk);
593
594 if (hci_pi(sk)->channel != HCI_CHANNEL_RAW) {
595 err = -EBADFD;
596 goto done;
597 }
598
599 release_sock(sk);
600
1da177e4
LT
601 switch (cmd) {
602 case HCIGETDEVLIST:
603 return hci_get_dev_list(argp);
604
605 case HCIGETDEVINFO:
606 return hci_get_dev_info(argp);
607
608 case HCIGETCONNLIST:
609 return hci_get_conn_list(argp);
610
611 case HCIDEVUP:
612 if (!capable(CAP_NET_ADMIN))
bf5b30b8 613 return -EPERM;
1da177e4
LT
614 return hci_dev_open(arg);
615
616 case HCIDEVDOWN:
617 if (!capable(CAP_NET_ADMIN))
bf5b30b8 618 return -EPERM;
1da177e4
LT
619 return hci_dev_close(arg);
620
621 case HCIDEVRESET:
622 if (!capable(CAP_NET_ADMIN))
bf5b30b8 623 return -EPERM;
1da177e4
LT
624 return hci_dev_reset(arg);
625
626 case HCIDEVRESTAT:
627 if (!capable(CAP_NET_ADMIN))
bf5b30b8 628 return -EPERM;
1da177e4
LT
629 return hci_dev_reset_stat(arg);
630
631 case HCISETSCAN:
632 case HCISETAUTH:
633 case HCISETENCRYPT:
634 case HCISETPTYPE:
635 case HCISETLINKPOL:
636 case HCISETLINKMODE:
637 case HCISETACLMTU:
638 case HCISETSCOMTU:
639 if (!capable(CAP_NET_ADMIN))
bf5b30b8 640 return -EPERM;
1da177e4
LT
641 return hci_dev_cmd(cmd, argp);
642
643 case HCIINQUIRY:
644 return hci_inquiry(argp);
1da177e4 645 }
c1c4f956
MH
646
647 lock_sock(sk);
648
649 err = hci_sock_bound_ioctl(sk, cmd, arg);
650
651done:
652 release_sock(sk);
653 return err;
1da177e4
LT
654}
655
8fc9ced3
GP
656static int hci_sock_bind(struct socket *sock, struct sockaddr *addr,
657 int addr_len)
1da177e4 658{
0381101f 659 struct sockaddr_hci haddr;
1da177e4
LT
660 struct sock *sk = sock->sk;
661 struct hci_dev *hdev = NULL;
0381101f 662 int len, err = 0;
1da177e4
LT
663
664 BT_DBG("sock %p sk %p", sock, sk);
665
0381101f
JH
666 if (!addr)
667 return -EINVAL;
668
669 memset(&haddr, 0, sizeof(haddr));
670 len = min_t(unsigned int, sizeof(haddr), addr_len);
671 memcpy(&haddr, addr, len);
672
673 if (haddr.hci_family != AF_BLUETOOTH)
674 return -EINVAL;
675
1da177e4
LT
676 lock_sock(sk);
677
7cc2ade2 678 if (sk->sk_state == BT_BOUND) {
1da177e4
LT
679 err = -EALREADY;
680 goto done;
681 }
682
7cc2ade2
MH
683 switch (haddr.hci_channel) {
684 case HCI_CHANNEL_RAW:
685 if (hci_pi(sk)->hdev) {
686 err = -EALREADY;
1da177e4
LT
687 goto done;
688 }
689
7cc2ade2
MH
690 if (haddr.hci_dev != HCI_DEV_NONE) {
691 hdev = hci_dev_get(haddr.hci_dev);
692 if (!hdev) {
693 err = -ENODEV;
694 goto done;
695 }
696
697 atomic_inc(&hdev->promisc);
698 }
699
700 hci_pi(sk)->hdev = hdev;
701 break;
702
23500189
MH
703 case HCI_CHANNEL_USER:
704 if (hci_pi(sk)->hdev) {
705 err = -EALREADY;
706 goto done;
707 }
708
709 if (haddr.hci_dev == HCI_DEV_NONE) {
710 err = -EINVAL;
711 goto done;
712 }
713
10a8b86f 714 if (!capable(CAP_NET_ADMIN)) {
23500189
MH
715 err = -EPERM;
716 goto done;
717 }
718
719 hdev = hci_dev_get(haddr.hci_dev);
720 if (!hdev) {
721 err = -ENODEV;
722 goto done;
723 }
724
725 if (test_bit(HCI_UP, &hdev->flags) ||
726 test_bit(HCI_INIT, &hdev->flags) ||
d7a5a11d
MH
727 hci_dev_test_flag(hdev, HCI_SETUP) ||
728 hci_dev_test_flag(hdev, HCI_CONFIG)) {
23500189
MH
729 err = -EBUSY;
730 hci_dev_put(hdev);
731 goto done;
732 }
733
238be788 734 if (hci_dev_test_and_set_flag(hdev, HCI_USER_CHANNEL)) {
23500189
MH
735 err = -EUSERS;
736 hci_dev_put(hdev);
737 goto done;
738 }
739
0602a8ad 740 mgmt_index_removed(hdev);
23500189
MH
741
742 err = hci_dev_open(hdev->id);
743 if (err) {
a358dc11 744 hci_dev_clear_flag(hdev, HCI_USER_CHANNEL);
0602a8ad 745 mgmt_index_added(hdev);
23500189
MH
746 hci_dev_put(hdev);
747 goto done;
748 }
749
750 atomic_inc(&hdev->promisc);
751
752 hci_pi(sk)->hdev = hdev;
753 break;
754
cd82e61c
MH
755 case HCI_CHANNEL_MONITOR:
756 if (haddr.hci_dev != HCI_DEV_NONE) {
757 err = -EINVAL;
758 goto done;
759 }
760
761 if (!capable(CAP_NET_RAW)) {
762 err = -EPERM;
763 goto done;
764 }
765
766 send_monitor_replay(sk);
767
768 atomic_inc(&monitor_promisc);
769 break;
770
7cc2ade2 771 default:
801c1e8d
JH
772 if (!hci_mgmt_chan_find(haddr.hci_channel)) {
773 err = -EINVAL;
774 goto done;
775 }
776
777 if (haddr.hci_dev != HCI_DEV_NONE) {
778 err = -EINVAL;
779 goto done;
780 }
781
782 if (!capable(CAP_NET_ADMIN)) {
783 err = -EPERM;
784 goto done;
785 }
786
787 break;
1da177e4
LT
788 }
789
7cc2ade2 790
0381101f 791 hci_pi(sk)->channel = haddr.hci_channel;
1da177e4
LT
792 sk->sk_state = BT_BOUND;
793
794done:
795 release_sock(sk);
796 return err;
797}
798
8fc9ced3
GP
799static int hci_sock_getname(struct socket *sock, struct sockaddr *addr,
800 int *addr_len, int peer)
1da177e4
LT
801{
802 struct sockaddr_hci *haddr = (struct sockaddr_hci *) addr;
803 struct sock *sk = sock->sk;
9d4b68b2
MH
804 struct hci_dev *hdev;
805 int err = 0;
1da177e4
LT
806
807 BT_DBG("sock %p sk %p", sock, sk);
808
06f43cbc
MH
809 if (peer)
810 return -EOPNOTSUPP;
811
1da177e4
LT
812 lock_sock(sk);
813
9d4b68b2
MH
814 hdev = hci_pi(sk)->hdev;
815 if (!hdev) {
816 err = -EBADFD;
817 goto done;
818 }
819
1da177e4
LT
820 *addr_len = sizeof(*haddr);
821 haddr->hci_family = AF_BLUETOOTH;
7b005bd3 822 haddr->hci_dev = hdev->id;
9d4b68b2 823 haddr->hci_channel= hci_pi(sk)->channel;
1da177e4 824
9d4b68b2 825done:
1da177e4 826 release_sock(sk);
9d4b68b2 827 return err;
1da177e4
LT
828}
829
6039aa73
GP
830static void hci_sock_cmsg(struct sock *sk, struct msghdr *msg,
831 struct sk_buff *skb)
1da177e4
LT
832{
833 __u32 mask = hci_pi(sk)->cmsg_mask;
834
0d48d939
MH
835 if (mask & HCI_CMSG_DIR) {
836 int incoming = bt_cb(skb)->incoming;
8fc9ced3
GP
837 put_cmsg(msg, SOL_HCI, HCI_CMSG_DIR, sizeof(incoming),
838 &incoming);
0d48d939 839 }
1da177e4 840
a61bbcf2 841 if (mask & HCI_CMSG_TSTAMP) {
f6e623a6
JFS
842#ifdef CONFIG_COMPAT
843 struct compat_timeval ctv;
844#endif
a61bbcf2 845 struct timeval tv;
767c5eb5
MH
846 void *data;
847 int len;
a61bbcf2
PM
848
849 skb_get_timestamp(skb, &tv);
767c5eb5 850
1da97f83
DM
851 data = &tv;
852 len = sizeof(tv);
853#ifdef CONFIG_COMPAT
da88cea1
L
854 if (!COMPAT_USE_64BIT_TIME &&
855 (msg->msg_flags & MSG_CMSG_COMPAT)) {
767c5eb5
MH
856 ctv.tv_sec = tv.tv_sec;
857 ctv.tv_usec = tv.tv_usec;
858 data = &ctv;
859 len = sizeof(ctv);
767c5eb5 860 }
1da97f83 861#endif
767c5eb5
MH
862
863 put_cmsg(msg, SOL_HCI, HCI_CMSG_TSTAMP, len, data);
a61bbcf2 864 }
1da177e4 865}
8e87d142 866
1b784140
YX
867static int hci_sock_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
868 int flags)
1da177e4
LT
869{
870 int noblock = flags & MSG_DONTWAIT;
871 struct sock *sk = sock->sk;
872 struct sk_buff *skb;
873 int copied, err;
874
875 BT_DBG("sock %p, sk %p", sock, sk);
876
877 if (flags & (MSG_OOB))
878 return -EOPNOTSUPP;
879
880 if (sk->sk_state == BT_CLOSED)
881 return 0;
882
70f23020
AE
883 skb = skb_recv_datagram(sk, flags, noblock, &err);
884 if (!skb)
1da177e4
LT
885 return err;
886
1da177e4
LT
887 copied = skb->len;
888 if (len < copied) {
889 msg->msg_flags |= MSG_TRUNC;
890 copied = len;
891 }
892
badff6d0 893 skb_reset_transport_header(skb);
51f3d02b 894 err = skb_copy_datagram_msg(skb, 0, msg, copied);
1da177e4 895
3a208627
MH
896 switch (hci_pi(sk)->channel) {
897 case HCI_CHANNEL_RAW:
898 hci_sock_cmsg(sk, msg, skb);
899 break;
23500189 900 case HCI_CHANNEL_USER:
cd82e61c
MH
901 case HCI_CHANNEL_MONITOR:
902 sock_recv_timestamp(msg, sk, skb);
903 break;
801c1e8d
JH
904 default:
905 if (hci_mgmt_chan_find(hci_pi(sk)->channel))
906 sock_recv_timestamp(msg, sk, skb);
907 break;
3a208627 908 }
1da177e4
LT
909
910 skb_free_datagram(sk, skb);
911
912 return err ? : copied;
913}
914
1b784140
YX
915static int hci_sock_sendmsg(struct socket *sock, struct msghdr *msg,
916 size_t len)
1da177e4
LT
917{
918 struct sock *sk = sock->sk;
801c1e8d 919 struct hci_mgmt_chan *chan;
1da177e4
LT
920 struct hci_dev *hdev;
921 struct sk_buff *skb;
922 int err;
923
924 BT_DBG("sock %p sk %p", sock, sk);
925
926 if (msg->msg_flags & MSG_OOB)
927 return -EOPNOTSUPP;
928
929 if (msg->msg_flags & ~(MSG_DONTWAIT|MSG_NOSIGNAL|MSG_ERRQUEUE))
930 return -EINVAL;
931
932 if (len < 4 || len > HCI_MAX_FRAME_SIZE)
933 return -EINVAL;
934
935 lock_sock(sk);
936
0381101f
JH
937 switch (hci_pi(sk)->channel) {
938 case HCI_CHANNEL_RAW:
23500189 939 case HCI_CHANNEL_USER:
0381101f 940 break;
cd82e61c
MH
941 case HCI_CHANNEL_MONITOR:
942 err = -EOPNOTSUPP;
943 goto done;
0381101f 944 default:
801c1e8d
JH
945 mutex_lock(&mgmt_chan_list_lock);
946 chan = __hci_mgmt_chan_find(hci_pi(sk)->channel);
947 if (chan)
6d785aa3 948 err = mgmt_control(chan, sk, msg, len);
801c1e8d
JH
949 else
950 err = -EINVAL;
951
952 mutex_unlock(&mgmt_chan_list_lock);
0381101f
JH
953 goto done;
954 }
955
70f23020
AE
956 hdev = hci_pi(sk)->hdev;
957 if (!hdev) {
1da177e4
LT
958 err = -EBADFD;
959 goto done;
960 }
961
7e21addc
MH
962 if (!test_bit(HCI_UP, &hdev->flags)) {
963 err = -ENETDOWN;
964 goto done;
965 }
966
70f23020
AE
967 skb = bt_skb_send_alloc(sk, len, msg->msg_flags & MSG_DONTWAIT, &err);
968 if (!skb)
1da177e4
LT
969 goto done;
970
6ce8e9ce 971 if (memcpy_from_msg(skb_put(skb, len), msg, len)) {
1da177e4
LT
972 err = -EFAULT;
973 goto drop;
974 }
975
0d48d939 976 bt_cb(skb)->pkt_type = *((unsigned char *) skb->data);
1da177e4 977 skb_pull(skb, 1);
1da177e4 978
1bc5ad16
MH
979 if (hci_pi(sk)->channel == HCI_CHANNEL_USER) {
980 /* No permission check is needed for user channel
981 * since that gets enforced when binding the socket.
982 *
983 * However check that the packet type is valid.
984 */
985 if (bt_cb(skb)->pkt_type != HCI_COMMAND_PKT &&
986 bt_cb(skb)->pkt_type != HCI_ACLDATA_PKT &&
987 bt_cb(skb)->pkt_type != HCI_SCODATA_PKT) {
988 err = -EINVAL;
989 goto drop;
990 }
991
992 skb_queue_tail(&hdev->raw_q, skb);
993 queue_work(hdev->workqueue, &hdev->tx_work);
994 } else if (bt_cb(skb)->pkt_type == HCI_COMMAND_PKT) {
83985319 995 u16 opcode = get_unaligned_le16(skb->data);
1da177e4
LT
996 u16 ogf = hci_opcode_ogf(opcode);
997 u16 ocf = hci_opcode_ocf(opcode);
998
999 if (((ogf > HCI_SFLT_MAX_OGF) ||
3bb3c755
GP
1000 !hci_test_bit(ocf & HCI_FLT_OCF_BITS,
1001 &hci_sec_filter.ocf_mask[ogf])) &&
1002 !capable(CAP_NET_RAW)) {
1da177e4
LT
1003 err = -EPERM;
1004 goto drop;
1005 }
1006
fee746b0 1007 if (ogf == 0x3f) {
1da177e4 1008 skb_queue_tail(&hdev->raw_q, skb);
3eff45ea 1009 queue_work(hdev->workqueue, &hdev->tx_work);
1da177e4 1010 } else {
49c922bb 1011 /* Stand-alone HCI commands must be flagged as
11714b3d
JH
1012 * single-command requests.
1013 */
6368c235 1014 bt_cb(skb)->req_start = 1;
11714b3d 1015
1da177e4 1016 skb_queue_tail(&hdev->cmd_q, skb);
c347b765 1017 queue_work(hdev->workqueue, &hdev->cmd_work);
1da177e4
LT
1018 }
1019 } else {
1020 if (!capable(CAP_NET_RAW)) {
1021 err = -EPERM;
1022 goto drop;
1023 }
1024
1025 skb_queue_tail(&hdev->raw_q, skb);
3eff45ea 1026 queue_work(hdev->workqueue, &hdev->tx_work);
1da177e4
LT
1027 }
1028
1029 err = len;
1030
1031done:
1032 release_sock(sk);
1033 return err;
1034
1035drop:
1036 kfree_skb(skb);
1037 goto done;
1038}
1039
8fc9ced3
GP
1040static int hci_sock_setsockopt(struct socket *sock, int level, int optname,
1041 char __user *optval, unsigned int len)
1da177e4
LT
1042{
1043 struct hci_ufilter uf = { .opcode = 0 };
1044 struct sock *sk = sock->sk;
1045 int err = 0, opt = 0;
1046
1047 BT_DBG("sk %p, opt %d", sk, optname);
1048
1049 lock_sock(sk);
1050
2f39cdb7 1051 if (hci_pi(sk)->channel != HCI_CHANNEL_RAW) {
c2371e80 1052 err = -EBADFD;
2f39cdb7
MH
1053 goto done;
1054 }
1055
1da177e4
LT
1056 switch (optname) {
1057 case HCI_DATA_DIR:
1058 if (get_user(opt, (int __user *)optval)) {
1059 err = -EFAULT;
1060 break;
1061 }
1062
1063 if (opt)
1064 hci_pi(sk)->cmsg_mask |= HCI_CMSG_DIR;
1065 else
1066 hci_pi(sk)->cmsg_mask &= ~HCI_CMSG_DIR;
1067 break;
1068
1069 case HCI_TIME_STAMP:
1070 if (get_user(opt, (int __user *)optval)) {
1071 err = -EFAULT;
1072 break;
1073 }
1074
1075 if (opt)
1076 hci_pi(sk)->cmsg_mask |= HCI_CMSG_TSTAMP;
1077 else
1078 hci_pi(sk)->cmsg_mask &= ~HCI_CMSG_TSTAMP;
1079 break;
1080
1081 case HCI_FILTER:
0878b666
MH
1082 {
1083 struct hci_filter *f = &hci_pi(sk)->filter;
1084
1085 uf.type_mask = f->type_mask;
1086 uf.opcode = f->opcode;
1087 uf.event_mask[0] = *((u32 *) f->event_mask + 0);
1088 uf.event_mask[1] = *((u32 *) f->event_mask + 1);
1089 }
1090
1da177e4
LT
1091 len = min_t(unsigned int, len, sizeof(uf));
1092 if (copy_from_user(&uf, optval, len)) {
1093 err = -EFAULT;
1094 break;
1095 }
1096
1097 if (!capable(CAP_NET_RAW)) {
1098 uf.type_mask &= hci_sec_filter.type_mask;
1099 uf.event_mask[0] &= *((u32 *) hci_sec_filter.event_mask + 0);
1100 uf.event_mask[1] &= *((u32 *) hci_sec_filter.event_mask + 1);
1101 }
1102
1103 {
1104 struct hci_filter *f = &hci_pi(sk)->filter;
1105
1106 f->type_mask = uf.type_mask;
1107 f->opcode = uf.opcode;
1108 *((u32 *) f->event_mask + 0) = uf.event_mask[0];
1109 *((u32 *) f->event_mask + 1) = uf.event_mask[1];
1110 }
8e87d142 1111 break;
1da177e4
LT
1112
1113 default:
1114 err = -ENOPROTOOPT;
1115 break;
1116 }
1117
2f39cdb7 1118done:
1da177e4
LT
1119 release_sock(sk);
1120 return err;
1121}
1122
8fc9ced3
GP
1123static int hci_sock_getsockopt(struct socket *sock, int level, int optname,
1124 char __user *optval, int __user *optlen)
1da177e4
LT
1125{
1126 struct hci_ufilter uf;
1127 struct sock *sk = sock->sk;
cedc5469
MH
1128 int len, opt, err = 0;
1129
1130 BT_DBG("sk %p, opt %d", sk, optname);
1da177e4
LT
1131
1132 if (get_user(len, optlen))
1133 return -EFAULT;
1134
cedc5469
MH
1135 lock_sock(sk);
1136
1137 if (hci_pi(sk)->channel != HCI_CHANNEL_RAW) {
c2371e80 1138 err = -EBADFD;
cedc5469
MH
1139 goto done;
1140 }
1141
1da177e4
LT
1142 switch (optname) {
1143 case HCI_DATA_DIR:
1144 if (hci_pi(sk)->cmsg_mask & HCI_CMSG_DIR)
1145 opt = 1;
8e87d142 1146 else
1da177e4
LT
1147 opt = 0;
1148
1149 if (put_user(opt, optval))
cedc5469 1150 err = -EFAULT;
1da177e4
LT
1151 break;
1152
1153 case HCI_TIME_STAMP:
1154 if (hci_pi(sk)->cmsg_mask & HCI_CMSG_TSTAMP)
1155 opt = 1;
8e87d142 1156 else
1da177e4
LT
1157 opt = 0;
1158
1159 if (put_user(opt, optval))
cedc5469 1160 err = -EFAULT;
1da177e4
LT
1161 break;
1162
1163 case HCI_FILTER:
1164 {
1165 struct hci_filter *f = &hci_pi(sk)->filter;
1166
e15ca9a0 1167 memset(&uf, 0, sizeof(uf));
1da177e4
LT
1168 uf.type_mask = f->type_mask;
1169 uf.opcode = f->opcode;
1170 uf.event_mask[0] = *((u32 *) f->event_mask + 0);
1171 uf.event_mask[1] = *((u32 *) f->event_mask + 1);
1172 }
1173
1174 len = min_t(unsigned int, len, sizeof(uf));
1175 if (copy_to_user(optval, &uf, len))
cedc5469 1176 err = -EFAULT;
1da177e4
LT
1177 break;
1178
1179 default:
cedc5469 1180 err = -ENOPROTOOPT;
1da177e4
LT
1181 break;
1182 }
1183
cedc5469
MH
1184done:
1185 release_sock(sk);
1186 return err;
1da177e4
LT
1187}
1188
90ddc4f0 1189static const struct proto_ops hci_sock_ops = {
1da177e4
LT
1190 .family = PF_BLUETOOTH,
1191 .owner = THIS_MODULE,
1192 .release = hci_sock_release,
1193 .bind = hci_sock_bind,
1194 .getname = hci_sock_getname,
1195 .sendmsg = hci_sock_sendmsg,
1196 .recvmsg = hci_sock_recvmsg,
1197 .ioctl = hci_sock_ioctl,
1198 .poll = datagram_poll,
1199 .listen = sock_no_listen,
1200 .shutdown = sock_no_shutdown,
1201 .setsockopt = hci_sock_setsockopt,
1202 .getsockopt = hci_sock_getsockopt,
1203 .connect = sock_no_connect,
1204 .socketpair = sock_no_socketpair,
1205 .accept = sock_no_accept,
1206 .mmap = sock_no_mmap
1207};
1208
1209static struct proto hci_sk_proto = {
1210 .name = "HCI",
1211 .owner = THIS_MODULE,
1212 .obj_size = sizeof(struct hci_pinfo)
1213};
1214
3f378b68
EP
1215static int hci_sock_create(struct net *net, struct socket *sock, int protocol,
1216 int kern)
1da177e4
LT
1217{
1218 struct sock *sk;
1219
1220 BT_DBG("sock %p", sock);
1221
1222 if (sock->type != SOCK_RAW)
1223 return -ESOCKTNOSUPPORT;
1224
1225 sock->ops = &hci_sock_ops;
1226
6257ff21 1227 sk = sk_alloc(net, PF_BLUETOOTH, GFP_ATOMIC, &hci_sk_proto);
1da177e4
LT
1228 if (!sk)
1229 return -ENOMEM;
1230
1231 sock_init_data(sock, sk);
1232
1233 sock_reset_flag(sk, SOCK_ZAPPED);
1234
1235 sk->sk_protocol = protocol;
1236
1237 sock->state = SS_UNCONNECTED;
1238 sk->sk_state = BT_OPEN;
1239
1240 bt_sock_link(&hci_sk_list, sk);
1241 return 0;
1242}
1243
ec1b4cf7 1244static const struct net_proto_family hci_sock_family_ops = {
1da177e4
LT
1245 .family = PF_BLUETOOTH,
1246 .owner = THIS_MODULE,
1247 .create = hci_sock_create,
1248};
1249
1da177e4
LT
1250int __init hci_sock_init(void)
1251{
1252 int err;
1253
b0a8e282
MH
1254 BUILD_BUG_ON(sizeof(struct sockaddr_hci) > sizeof(struct sockaddr));
1255
1da177e4
LT
1256 err = proto_register(&hci_sk_proto, 0);
1257 if (err < 0)
1258 return err;
1259
1260 err = bt_sock_register(BTPROTO_HCI, &hci_sock_family_ops);
f7c86637
MY
1261 if (err < 0) {
1262 BT_ERR("HCI socket registration failed");
1da177e4 1263 goto error;
f7c86637
MY
1264 }
1265
b0316615 1266 err = bt_procfs_init(&init_net, "hci", &hci_sk_list, NULL);
f7c86637
MY
1267 if (err < 0) {
1268 BT_ERR("Failed to create HCI proc file");
1269 bt_sock_unregister(BTPROTO_HCI);
1270 goto error;
1271 }
1da177e4 1272
1da177e4
LT
1273 BT_INFO("HCI socket layer initialized");
1274
1275 return 0;
1276
1277error:
1da177e4
LT
1278 proto_unregister(&hci_sk_proto);
1279 return err;
1280}
1281
b7440a14 1282void hci_sock_cleanup(void)
1da177e4 1283{
f7c86637 1284 bt_procfs_cleanup(&init_net, "hci");
5e9d7f86 1285 bt_sock_unregister(BTPROTO_HCI);
1da177e4 1286 proto_unregister(&hci_sk_proto);
1da177e4 1287}
This page took 0.878863 seconds and 5 git commands to generate.