Bluetooth: Add discovering event to the Management interface
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / net / bluetooth / mgmt.c
CommitLineData
0381101f
JH
1/*
2 BlueZ - Bluetooth protocol stack for Linux
3 Copyright (C) 2010 Nokia Corporation
4
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License version 2 as
7 published by the Free Software Foundation;
8
9 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
10 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
11 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
12 IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
13 CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
14 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17
18 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
19 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
20 SOFTWARE IS DISCLAIMED.
21*/
22
23/* Bluetooth HCI Management interface */
24
72359753 25#include <linux/uaccess.h>
0381101f
JH
26#include <asm/unaligned.h>
27
28#include <net/bluetooth/bluetooth.h>
29#include <net/bluetooth/hci_core.h>
30#include <net/bluetooth/mgmt.h>
31
02d98129
JH
32#define MGMT_VERSION 0
33#define MGMT_REVISION 1
34
eec8d2bc
JH
35struct pending_cmd {
36 struct list_head list;
37 __u16 opcode;
38 int index;
c68fb7ff 39 void *param;
eec8d2bc 40 struct sock *sk;
e9a416b5 41 void *user_data;
eec8d2bc
JH
42};
43
44LIST_HEAD(cmd_list);
45
4e51eae9 46static int cmd_status(struct sock *sk, u16 index, u16 cmd, u8 status)
f7b64e69
JH
47{
48 struct sk_buff *skb;
49 struct mgmt_hdr *hdr;
50 struct mgmt_ev_cmd_status *ev;
51
34eb525c 52 BT_DBG("sock %p, index %u, cmd %u, status %u", sk, index, cmd, status);
f7b64e69
JH
53
54 skb = alloc_skb(sizeof(*hdr) + sizeof(*ev), GFP_ATOMIC);
55 if (!skb)
56 return -ENOMEM;
57
58 hdr = (void *) skb_put(skb, sizeof(*hdr));
59
60 hdr->opcode = cpu_to_le16(MGMT_EV_CMD_STATUS);
4e51eae9 61 hdr->index = cpu_to_le16(index);
f7b64e69
JH
62 hdr->len = cpu_to_le16(sizeof(*ev));
63
64 ev = (void *) skb_put(skb, sizeof(*ev));
65 ev->status = status;
66 put_unaligned_le16(cmd, &ev->opcode);
67
68 if (sock_queue_rcv_skb(sk, skb) < 0)
69 kfree_skb(skb);
70
71 return 0;
72}
73
4e51eae9
SJ
74static int cmd_complete(struct sock *sk, u16 index, u16 cmd, void *rp,
75 size_t rp_len)
02d98129
JH
76{
77 struct sk_buff *skb;
78 struct mgmt_hdr *hdr;
79 struct mgmt_ev_cmd_complete *ev;
02d98129
JH
80
81 BT_DBG("sock %p", sk);
82
a38528f1 83 skb = alloc_skb(sizeof(*hdr) + sizeof(*ev) + rp_len, GFP_ATOMIC);
02d98129
JH
84 if (!skb)
85 return -ENOMEM;
86
87 hdr = (void *) skb_put(skb, sizeof(*hdr));
02d98129 88
a38528f1 89 hdr->opcode = cpu_to_le16(MGMT_EV_CMD_COMPLETE);
4e51eae9 90 hdr->index = cpu_to_le16(index);
a38528f1 91 hdr->len = cpu_to_le16(sizeof(*ev) + rp_len);
02d98129 92
a38528f1
JH
93 ev = (void *) skb_put(skb, sizeof(*ev) + rp_len);
94 put_unaligned_le16(cmd, &ev->opcode);
8020c16a
SJ
95
96 if (rp)
97 memcpy(ev->data, rp, rp_len);
02d98129
JH
98
99 if (sock_queue_rcv_skb(sk, skb) < 0)
100 kfree_skb(skb);
101
102 return 0;
103}
104
a38528f1
JH
105static int read_version(struct sock *sk)
106{
107 struct mgmt_rp_read_version rp;
108
109 BT_DBG("sock %p", sk);
110
111 rp.version = MGMT_VERSION;
112 put_unaligned_le16(MGMT_REVISION, &rp.revision);
113
4e51eae9
SJ
114 return cmd_complete(sk, MGMT_INDEX_NONE, MGMT_OP_READ_VERSION, &rp,
115 sizeof(rp));
a38528f1
JH
116}
117
faba42eb
JH
118static int read_index_list(struct sock *sk)
119{
faba42eb
JH
120 struct mgmt_rp_read_index_list *rp;
121 struct list_head *p;
a38528f1 122 size_t rp_len;
faba42eb 123 u16 count;
a38528f1 124 int i, err;
faba42eb
JH
125
126 BT_DBG("sock %p", sk);
127
128 read_lock(&hci_dev_list_lock);
129
130 count = 0;
131 list_for_each(p, &hci_dev_list) {
132 count++;
133 }
134
a38528f1
JH
135 rp_len = sizeof(*rp) + (2 * count);
136 rp = kmalloc(rp_len, GFP_ATOMIC);
137 if (!rp) {
b2c60d42 138 read_unlock(&hci_dev_list_lock);
faba42eb 139 return -ENOMEM;
b2c60d42 140 }
faba42eb 141
faba42eb
JH
142 put_unaligned_le16(count, &rp->num_controllers);
143
144 i = 0;
145 list_for_each(p, &hci_dev_list) {
146 struct hci_dev *d = list_entry(p, struct hci_dev, list);
ab81cbf9
JH
147
148 hci_del_off_timer(d);
149
ebc99feb
JH
150 set_bit(HCI_MGMT, &d->flags);
151
ab81cbf9
JH
152 if (test_bit(HCI_SETUP, &d->flags))
153 continue;
154
faba42eb
JH
155 put_unaligned_le16(d->id, &rp->index[i++]);
156 BT_DBG("Added hci%u", d->id);
157 }
158
159 read_unlock(&hci_dev_list_lock);
160
4e51eae9
SJ
161 err = cmd_complete(sk, MGMT_INDEX_NONE, MGMT_OP_READ_INDEX_LIST, rp,
162 rp_len);
faba42eb 163
a38528f1
JH
164 kfree(rp);
165
166 return err;
faba42eb
JH
167}
168
4e51eae9 169static int read_controller_info(struct sock *sk, u16 index)
0381101f 170{
a38528f1 171 struct mgmt_rp_read_info rp;
f7b64e69 172 struct hci_dev *hdev;
0381101f 173
4e51eae9 174 BT_DBG("sock %p hci%u", sk, index);
f7b64e69 175
4e51eae9 176 hdev = hci_dev_get(index);
a38528f1 177 if (!hdev)
4e51eae9 178 return cmd_status(sk, index, MGMT_OP_READ_INFO, ENODEV);
f7b64e69 179
ab81cbf9
JH
180 hci_del_off_timer(hdev);
181
1322901d 182 hci_dev_lock(hdev);
f7b64e69 183
ebc99feb
JH
184 set_bit(HCI_MGMT, &hdev->flags);
185
dc4fe30b
JH
186 memset(&rp, 0, sizeof(rp));
187
a38528f1 188 rp.type = hdev->dev_type;
f7b64e69 189
a38528f1
JH
190 rp.powered = test_bit(HCI_UP, &hdev->flags);
191 rp.connectable = test_bit(HCI_PSCAN, &hdev->flags);
192 rp.discoverable = test_bit(HCI_ISCAN, &hdev->flags);
193 rp.pairable = test_bit(HCI_PSCAN, &hdev->flags);
f7b64e69
JH
194
195 if (test_bit(HCI_AUTH, &hdev->flags))
a38528f1 196 rp.sec_mode = 3;
f7b64e69 197 else if (hdev->ssp_mode > 0)
a38528f1 198 rp.sec_mode = 4;
f7b64e69 199 else
a38528f1 200 rp.sec_mode = 2;
f7b64e69 201
a38528f1
JH
202 bacpy(&rp.bdaddr, &hdev->bdaddr);
203 memcpy(rp.features, hdev->features, 8);
204 memcpy(rp.dev_class, hdev->dev_class, 3);
205 put_unaligned_le16(hdev->manufacturer, &rp.manufacturer);
206 rp.hci_ver = hdev->hci_ver;
207 put_unaligned_le16(hdev->hci_rev, &rp.hci_rev);
f7b64e69 208
dc4fe30b
JH
209 memcpy(rp.name, hdev->dev_name, sizeof(hdev->dev_name));
210
1322901d 211 hci_dev_unlock(hdev);
f7b64e69 212 hci_dev_put(hdev);
0381101f 213
4e51eae9 214 return cmd_complete(sk, index, MGMT_OP_READ_INFO, &rp, sizeof(rp));
0381101f
JH
215}
216
eec8d2bc
JH
217static void mgmt_pending_free(struct pending_cmd *cmd)
218{
219 sock_put(cmd->sk);
c68fb7ff 220 kfree(cmd->param);
eec8d2bc
JH
221 kfree(cmd);
222}
223
366a0336
JH
224static struct pending_cmd *mgmt_pending_add(struct sock *sk, u16 opcode,
225 u16 index, void *data, u16 len)
eec8d2bc
JH
226{
227 struct pending_cmd *cmd;
228
229 cmd = kmalloc(sizeof(*cmd), GFP_ATOMIC);
230 if (!cmd)
366a0336 231 return NULL;
eec8d2bc
JH
232
233 cmd->opcode = opcode;
234 cmd->index = index;
235
c68fb7ff
SJ
236 cmd->param = kmalloc(len, GFP_ATOMIC);
237 if (!cmd->param) {
eec8d2bc 238 kfree(cmd);
366a0336 239 return NULL;
eec8d2bc
JH
240 }
241
8fce6357
SJ
242 if (data)
243 memcpy(cmd->param, data, len);
eec8d2bc
JH
244
245 cmd->sk = sk;
246 sock_hold(sk);
247
248 list_add(&cmd->list, &cmd_list);
249
366a0336 250 return cmd;
eec8d2bc
JH
251}
252
253static void mgmt_pending_foreach(u16 opcode, int index,
254 void (*cb)(struct pending_cmd *cmd, void *data),
255 void *data)
256{
257 struct list_head *p, *n;
258
259 list_for_each_safe(p, n, &cmd_list) {
260 struct pending_cmd *cmd;
261
262 cmd = list_entry(p, struct pending_cmd, list);
263
264 if (cmd->opcode != opcode)
265 continue;
266
267 if (index >= 0 && cmd->index != index)
268 continue;
269
270 cb(cmd, data);
271 }
272}
273
274static struct pending_cmd *mgmt_pending_find(u16 opcode, int index)
275{
276 struct list_head *p;
277
278 list_for_each(p, &cmd_list) {
279 struct pending_cmd *cmd;
280
281 cmd = list_entry(p, struct pending_cmd, list);
282
283 if (cmd->opcode != opcode)
284 continue;
285
286 if (index >= 0 && cmd->index != index)
287 continue;
288
289 return cmd;
290 }
291
292 return NULL;
293}
294
a664b5bc 295static void mgmt_pending_remove(struct pending_cmd *cmd)
73f22f62 296{
73f22f62
JH
297 list_del(&cmd->list);
298 mgmt_pending_free(cmd);
299}
300
4e51eae9 301static int set_powered(struct sock *sk, u16 index, unsigned char *data, u16 len)
eec8d2bc 302{
72a734ec 303 struct mgmt_mode *cp;
eec8d2bc 304 struct hci_dev *hdev;
366a0336 305 struct pending_cmd *cmd;
366a0336 306 int err, up;
eec8d2bc
JH
307
308 cp = (void *) data;
eec8d2bc 309
4e51eae9 310 BT_DBG("request for hci%u", index);
eec8d2bc 311
bdce7baf
SJ
312 if (len != sizeof(*cp))
313 return cmd_status(sk, index, MGMT_OP_SET_POWERED, EINVAL);
314
4e51eae9 315 hdev = hci_dev_get(index);
eec8d2bc 316 if (!hdev)
4e51eae9 317 return cmd_status(sk, index, MGMT_OP_SET_POWERED, ENODEV);
eec8d2bc 318
1322901d 319 hci_dev_lock(hdev);
eec8d2bc
JH
320
321 up = test_bit(HCI_UP, &hdev->flags);
72a734ec 322 if ((cp->val && up) || (!cp->val && !up)) {
4e51eae9 323 err = cmd_status(sk, index, MGMT_OP_SET_POWERED, EALREADY);
eec8d2bc
JH
324 goto failed;
325 }
326
4e51eae9
SJ
327 if (mgmt_pending_find(MGMT_OP_SET_POWERED, index)) {
328 err = cmd_status(sk, index, MGMT_OP_SET_POWERED, EBUSY);
eec8d2bc
JH
329 goto failed;
330 }
331
4e51eae9 332 cmd = mgmt_pending_add(sk, MGMT_OP_SET_POWERED, index, data, len);
366a0336
JH
333 if (!cmd) {
334 err = -ENOMEM;
eec8d2bc 335 goto failed;
366a0336 336 }
eec8d2bc 337
72a734ec 338 if (cp->val)
eec8d2bc
JH
339 queue_work(hdev->workqueue, &hdev->power_on);
340 else
341 queue_work(hdev->workqueue, &hdev->power_off);
342
366a0336 343 err = 0;
eec8d2bc
JH
344
345failed:
1322901d 346 hci_dev_unlock(hdev);
eec8d2bc 347 hci_dev_put(hdev);
366a0336 348 return err;
eec8d2bc
JH
349}
350
4e51eae9
SJ
351static int set_discoverable(struct sock *sk, u16 index, unsigned char *data,
352 u16 len)
73f22f62 353{
72a734ec 354 struct mgmt_mode *cp;
73f22f62 355 struct hci_dev *hdev;
366a0336 356 struct pending_cmd *cmd;
73f22f62
JH
357 u8 scan;
358 int err;
359
360 cp = (void *) data;
73f22f62 361
4e51eae9 362 BT_DBG("request for hci%u", index);
73f22f62 363
bdce7baf
SJ
364 if (len != sizeof(*cp))
365 return cmd_status(sk, index, MGMT_OP_SET_DISCOVERABLE, EINVAL);
366
4e51eae9 367 hdev = hci_dev_get(index);
73f22f62 368 if (!hdev)
4e51eae9 369 return cmd_status(sk, index, MGMT_OP_SET_DISCOVERABLE, ENODEV);
73f22f62 370
1322901d 371 hci_dev_lock(hdev);
73f22f62
JH
372
373 if (!test_bit(HCI_UP, &hdev->flags)) {
4e51eae9 374 err = cmd_status(sk, index, MGMT_OP_SET_DISCOVERABLE, ENETDOWN);
73f22f62
JH
375 goto failed;
376 }
377
4e51eae9
SJ
378 if (mgmt_pending_find(MGMT_OP_SET_DISCOVERABLE, index) ||
379 mgmt_pending_find(MGMT_OP_SET_CONNECTABLE, index)) {
380 err = cmd_status(sk, index, MGMT_OP_SET_DISCOVERABLE, EBUSY);
73f22f62
JH
381 goto failed;
382 }
383
72a734ec 384 if (cp->val == test_bit(HCI_ISCAN, &hdev->flags) &&
73f22f62 385 test_bit(HCI_PSCAN, &hdev->flags)) {
4e51eae9 386 err = cmd_status(sk, index, MGMT_OP_SET_DISCOVERABLE, EALREADY);
73f22f62
JH
387 goto failed;
388 }
389
4e51eae9 390 cmd = mgmt_pending_add(sk, MGMT_OP_SET_DISCOVERABLE, index, data, len);
366a0336
JH
391 if (!cmd) {
392 err = -ENOMEM;
73f22f62 393 goto failed;
366a0336 394 }
73f22f62
JH
395
396 scan = SCAN_PAGE;
397
72a734ec 398 if (cp->val)
73f22f62
JH
399 scan |= SCAN_INQUIRY;
400
401 err = hci_send_cmd(hdev, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);
402 if (err < 0)
a664b5bc 403 mgmt_pending_remove(cmd);
73f22f62
JH
404
405failed:
1322901d 406 hci_dev_unlock(hdev);
73f22f62
JH
407 hci_dev_put(hdev);
408
409 return err;
410}
411
4e51eae9
SJ
412static int set_connectable(struct sock *sk, u16 index, unsigned char *data,
413 u16 len)
9fbcbb45 414{
72a734ec 415 struct mgmt_mode *cp;
9fbcbb45 416 struct hci_dev *hdev;
366a0336 417 struct pending_cmd *cmd;
9fbcbb45
JH
418 u8 scan;
419 int err;
420
421 cp = (void *) data;
9fbcbb45 422
4e51eae9 423 BT_DBG("request for hci%u", index);
9fbcbb45 424
bdce7baf
SJ
425 if (len != sizeof(*cp))
426 return cmd_status(sk, index, MGMT_OP_SET_CONNECTABLE, EINVAL);
427
4e51eae9 428 hdev = hci_dev_get(index);
9fbcbb45 429 if (!hdev)
4e51eae9 430 return cmd_status(sk, index, MGMT_OP_SET_CONNECTABLE, ENODEV);
9fbcbb45 431
1322901d 432 hci_dev_lock(hdev);
9fbcbb45
JH
433
434 if (!test_bit(HCI_UP, &hdev->flags)) {
4e51eae9 435 err = cmd_status(sk, index, MGMT_OP_SET_CONNECTABLE, ENETDOWN);
9fbcbb45
JH
436 goto failed;
437 }
438
4e51eae9
SJ
439 if (mgmt_pending_find(MGMT_OP_SET_DISCOVERABLE, index) ||
440 mgmt_pending_find(MGMT_OP_SET_CONNECTABLE, index)) {
441 err = cmd_status(sk, index, MGMT_OP_SET_CONNECTABLE, EBUSY);
9fbcbb45
JH
442 goto failed;
443 }
444
72a734ec 445 if (cp->val == test_bit(HCI_PSCAN, &hdev->flags)) {
4e51eae9 446 err = cmd_status(sk, index, MGMT_OP_SET_CONNECTABLE, EALREADY);
9fbcbb45
JH
447 goto failed;
448 }
449
4e51eae9 450 cmd = mgmt_pending_add(sk, MGMT_OP_SET_CONNECTABLE, index, data, len);
366a0336
JH
451 if (!cmd) {
452 err = -ENOMEM;
9fbcbb45 453 goto failed;
366a0336 454 }
9fbcbb45 455
72a734ec 456 if (cp->val)
9fbcbb45
JH
457 scan = SCAN_PAGE;
458 else
459 scan = 0;
460
461 err = hci_send_cmd(hdev, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);
462 if (err < 0)
a664b5bc 463 mgmt_pending_remove(cmd);
9fbcbb45
JH
464
465failed:
1322901d 466 hci_dev_unlock(hdev);
9fbcbb45
JH
467 hci_dev_put(hdev);
468
469 return err;
470}
471
4e51eae9
SJ
472static int mgmt_event(u16 event, u16 index, void *data, u16 data_len,
473 struct sock *skip_sk)
c542a06c
JH
474{
475 struct sk_buff *skb;
476 struct mgmt_hdr *hdr;
477
478 skb = alloc_skb(sizeof(*hdr) + data_len, GFP_ATOMIC);
479 if (!skb)
480 return -ENOMEM;
481
482 bt_cb(skb)->channel = HCI_CHANNEL_CONTROL;
483
484 hdr = (void *) skb_put(skb, sizeof(*hdr));
485 hdr->opcode = cpu_to_le16(event);
4e51eae9 486 hdr->index = cpu_to_le16(index);
c542a06c
JH
487 hdr->len = cpu_to_le16(data_len);
488
4e51eae9
SJ
489 if (data)
490 memcpy(skb_put(skb, data_len), data, data_len);
c542a06c
JH
491
492 hci_send_to_sock(NULL, skb, skip_sk);
493 kfree_skb(skb);
494
495 return 0;
496}
497
053f0211
JH
498static int send_mode_rsp(struct sock *sk, u16 opcode, u16 index, u8 val)
499{
a38528f1 500 struct mgmt_mode rp;
053f0211 501
a38528f1 502 rp.val = val;
053f0211 503
4e51eae9 504 return cmd_complete(sk, index, opcode, &rp, sizeof(rp));
053f0211
JH
505}
506
4e51eae9
SJ
507static int set_pairable(struct sock *sk, u16 index, unsigned char *data,
508 u16 len)
c542a06c
JH
509{
510 struct mgmt_mode *cp, ev;
511 struct hci_dev *hdev;
c542a06c
JH
512 int err;
513
514 cp = (void *) data;
c542a06c 515
4e51eae9 516 BT_DBG("request for hci%u", index);
c542a06c 517
bdce7baf
SJ
518 if (len != sizeof(*cp))
519 return cmd_status(sk, index, MGMT_OP_SET_PAIRABLE, EINVAL);
520
4e51eae9 521 hdev = hci_dev_get(index);
c542a06c 522 if (!hdev)
4e51eae9 523 return cmd_status(sk, index, MGMT_OP_SET_PAIRABLE, ENODEV);
c542a06c 524
1322901d 525 hci_dev_lock(hdev);
c542a06c
JH
526
527 if (cp->val)
528 set_bit(HCI_PAIRABLE, &hdev->flags);
529 else
530 clear_bit(HCI_PAIRABLE, &hdev->flags);
531
4e51eae9 532 err = send_mode_rsp(sk, MGMT_OP_SET_PAIRABLE, index, cp->val);
c542a06c
JH
533 if (err < 0)
534 goto failed;
535
c542a06c
JH
536 ev.val = cp->val;
537
4e51eae9 538 err = mgmt_event(MGMT_EV_PAIRABLE, index, &ev, sizeof(ev), sk);
c542a06c
JH
539
540failed:
1322901d 541 hci_dev_unlock(hdev);
c542a06c
JH
542 hci_dev_put(hdev);
543
544 return err;
545}
546
80a1e1db
JH
547#define EIR_FLAGS 0x01 /* flags */
548#define EIR_UUID16_SOME 0x02 /* 16-bit UUID, more available */
549#define EIR_UUID16_ALL 0x03 /* 16-bit UUID, all listed */
550#define EIR_UUID32_SOME 0x04 /* 32-bit UUID, more available */
551#define EIR_UUID32_ALL 0x05 /* 32-bit UUID, all listed */
552#define EIR_UUID128_SOME 0x06 /* 128-bit UUID, more available */
553#define EIR_UUID128_ALL 0x07 /* 128-bit UUID, all listed */
554#define EIR_NAME_SHORT 0x08 /* shortened local name */
555#define EIR_NAME_COMPLETE 0x09 /* complete local name */
556#define EIR_TX_POWER 0x0A /* transmit power level */
557#define EIR_DEVICE_ID 0x10 /* device ID */
558
559#define PNP_INFO_SVCLASS_ID 0x1200
560
561static u8 bluetooth_base_uuid[] = {
562 0xFB, 0x34, 0x9B, 0x5F, 0x80, 0x00, 0x00, 0x80,
563 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
564};
565
566static u16 get_uuid16(u8 *uuid128)
567{
568 u32 val;
569 int i;
570
571 for (i = 0; i < 12; i++) {
572 if (bluetooth_base_uuid[i] != uuid128[i])
573 return 0;
574 }
575
576 memcpy(&val, &uuid128[12], 4);
577
578 val = le32_to_cpu(val);
579 if (val > 0xffff)
580 return 0;
581
582 return (u16) val;
583}
584
585static void create_eir(struct hci_dev *hdev, u8 *data)
586{
587 u8 *ptr = data;
588 u16 eir_len = 0;
589 u16 uuid16_list[HCI_MAX_EIR_LENGTH / sizeof(u16)];
590 int i, truncated = 0;
591 struct list_head *p;
592 size_t name_len;
593
594 name_len = strlen(hdev->dev_name);
595
596 if (name_len > 0) {
597 /* EIR Data type */
598 if (name_len > 48) {
599 name_len = 48;
600 ptr[1] = EIR_NAME_SHORT;
601 } else
602 ptr[1] = EIR_NAME_COMPLETE;
603
604 /* EIR Data length */
605 ptr[0] = name_len + 1;
606
607 memcpy(ptr + 2, hdev->dev_name, name_len);
608
609 eir_len += (name_len + 2);
610 ptr += (name_len + 2);
611 }
612
613 memset(uuid16_list, 0, sizeof(uuid16_list));
614
615 /* Group all UUID16 types */
616 list_for_each(p, &hdev->uuids) {
617 struct bt_uuid *uuid = list_entry(p, struct bt_uuid, list);
618 u16 uuid16;
619
620 uuid16 = get_uuid16(uuid->uuid);
621 if (uuid16 == 0)
622 return;
623
624 if (uuid16 < 0x1100)
625 continue;
626
627 if (uuid16 == PNP_INFO_SVCLASS_ID)
628 continue;
629
630 /* Stop if not enough space to put next UUID */
631 if (eir_len + 2 + sizeof(u16) > HCI_MAX_EIR_LENGTH) {
632 truncated = 1;
633 break;
634 }
635
636 /* Check for duplicates */
637 for (i = 0; uuid16_list[i] != 0; i++)
638 if (uuid16_list[i] == uuid16)
639 break;
640
641 if (uuid16_list[i] == 0) {
642 uuid16_list[i] = uuid16;
643 eir_len += sizeof(u16);
644 }
645 }
646
647 if (uuid16_list[0] != 0) {
648 u8 *length = ptr;
649
650 /* EIR Data type */
651 ptr[1] = truncated ? EIR_UUID16_SOME : EIR_UUID16_ALL;
652
653 ptr += 2;
654 eir_len += 2;
655
656 for (i = 0; uuid16_list[i] != 0; i++) {
657 *ptr++ = (uuid16_list[i] & 0x00ff);
658 *ptr++ = (uuid16_list[i] & 0xff00) >> 8;
659 }
660
661 /* EIR Data length */
662 *length = (i * sizeof(u16)) + 1;
663 }
664}
665
666static int update_eir(struct hci_dev *hdev)
667{
668 struct hci_cp_write_eir cp;
669
670 if (!(hdev->features[6] & LMP_EXT_INQ))
671 return 0;
672
673 if (hdev->ssp_mode == 0)
674 return 0;
675
676 if (test_bit(HCI_SERVICE_CACHE, &hdev->flags))
677 return 0;
678
679 memset(&cp, 0, sizeof(cp));
680
681 create_eir(hdev, cp.data);
682
683 if (memcmp(cp.data, hdev->eir, sizeof(cp.data)) == 0)
684 return 0;
685
686 memcpy(hdev->eir, cp.data, sizeof(cp.data));
687
688 return hci_send_cmd(hdev, HCI_OP_WRITE_EIR, sizeof(cp), &cp);
689}
690
1aff6f09
JH
691static u8 get_service_classes(struct hci_dev *hdev)
692{
693 struct list_head *p;
694 u8 val = 0;
695
696 list_for_each(p, &hdev->uuids) {
697 struct bt_uuid *uuid = list_entry(p, struct bt_uuid, list);
698
699 val |= uuid->svc_hint;
700 }
701
702 return val;
703}
704
705static int update_class(struct hci_dev *hdev)
706{
707 u8 cod[3];
708
709 BT_DBG("%s", hdev->name);
710
711 if (test_bit(HCI_SERVICE_CACHE, &hdev->flags))
712 return 0;
713
714 cod[0] = hdev->minor_class;
715 cod[1] = hdev->major_class;
716 cod[2] = get_service_classes(hdev);
717
718 if (memcmp(cod, hdev->dev_class, 3) == 0)
719 return 0;
720
721 return hci_send_cmd(hdev, HCI_OP_WRITE_CLASS_OF_DEV, sizeof(cod), cod);
722}
723
4e51eae9 724static int add_uuid(struct sock *sk, u16 index, unsigned char *data, u16 len)
2aeb9a1a
JH
725{
726 struct mgmt_cp_add_uuid *cp;
727 struct hci_dev *hdev;
728 struct bt_uuid *uuid;
2aeb9a1a
JH
729 int err;
730
731 cp = (void *) data;
2aeb9a1a 732
4e51eae9 733 BT_DBG("request for hci%u", index);
2aeb9a1a 734
bdce7baf
SJ
735 if (len != sizeof(*cp))
736 return cmd_status(sk, index, MGMT_OP_ADD_UUID, EINVAL);
737
4e51eae9 738 hdev = hci_dev_get(index);
2aeb9a1a 739 if (!hdev)
4e51eae9 740 return cmd_status(sk, index, MGMT_OP_ADD_UUID, ENODEV);
2aeb9a1a 741
1322901d 742 hci_dev_lock(hdev);
2aeb9a1a
JH
743
744 uuid = kmalloc(sizeof(*uuid), GFP_ATOMIC);
745 if (!uuid) {
746 err = -ENOMEM;
747 goto failed;
748 }
749
750 memcpy(uuid->uuid, cp->uuid, 16);
1aff6f09 751 uuid->svc_hint = cp->svc_hint;
2aeb9a1a
JH
752
753 list_add(&uuid->list, &hdev->uuids);
754
1aff6f09
JH
755 err = update_class(hdev);
756 if (err < 0)
757 goto failed;
758
80a1e1db
JH
759 err = update_eir(hdev);
760 if (err < 0)
761 goto failed;
762
4e51eae9 763 err = cmd_complete(sk, index, MGMT_OP_ADD_UUID, NULL, 0);
2aeb9a1a
JH
764
765failed:
1322901d 766 hci_dev_unlock(hdev);
2aeb9a1a
JH
767 hci_dev_put(hdev);
768
769 return err;
770}
771
4e51eae9 772static int remove_uuid(struct sock *sk, u16 index, unsigned char *data, u16 len)
2aeb9a1a
JH
773{
774 struct list_head *p, *n;
779cb850 775 struct mgmt_cp_remove_uuid *cp;
2aeb9a1a
JH
776 struct hci_dev *hdev;
777 u8 bt_uuid_any[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
2aeb9a1a
JH
778 int err, found;
779
780 cp = (void *) data;
2aeb9a1a 781
4e51eae9 782 BT_DBG("request for hci%u", index);
2aeb9a1a 783
bdce7baf
SJ
784 if (len != sizeof(*cp))
785 return cmd_status(sk, index, MGMT_OP_REMOVE_UUID, EINVAL);
786
4e51eae9 787 hdev = hci_dev_get(index);
2aeb9a1a 788 if (!hdev)
4e51eae9 789 return cmd_status(sk, index, MGMT_OP_REMOVE_UUID, ENODEV);
2aeb9a1a 790
1322901d 791 hci_dev_lock(hdev);
2aeb9a1a
JH
792
793 if (memcmp(cp->uuid, bt_uuid_any, 16) == 0) {
794 err = hci_uuids_clear(hdev);
795 goto unlock;
796 }
797
798 found = 0;
799
800 list_for_each_safe(p, n, &hdev->uuids) {
801 struct bt_uuid *match = list_entry(p, struct bt_uuid, list);
802
803 if (memcmp(match->uuid, cp->uuid, 16) != 0)
804 continue;
805
806 list_del(&match->list);
807 found++;
808 }
809
810 if (found == 0) {
4e51eae9 811 err = cmd_status(sk, index, MGMT_OP_REMOVE_UUID, ENOENT);
2aeb9a1a
JH
812 goto unlock;
813 }
814
1aff6f09
JH
815 err = update_class(hdev);
816 if (err < 0)
817 goto unlock;
818
80a1e1db
JH
819 err = update_eir(hdev);
820 if (err < 0)
821 goto unlock;
822
4e51eae9 823 err = cmd_complete(sk, index, MGMT_OP_REMOVE_UUID, NULL, 0);
2aeb9a1a
JH
824
825unlock:
1322901d 826 hci_dev_unlock(hdev);
2aeb9a1a
JH
827 hci_dev_put(hdev);
828
829 return err;
830}
831
4e51eae9
SJ
832static int set_dev_class(struct sock *sk, u16 index, unsigned char *data,
833 u16 len)
1aff6f09
JH
834{
835 struct hci_dev *hdev;
836 struct mgmt_cp_set_dev_class *cp;
1aff6f09
JH
837 int err;
838
839 cp = (void *) data;
1aff6f09 840
4e51eae9 841 BT_DBG("request for hci%u", index);
1aff6f09 842
bdce7baf
SJ
843 if (len != sizeof(*cp))
844 return cmd_status(sk, index, MGMT_OP_SET_DEV_CLASS, EINVAL);
845
4e51eae9 846 hdev = hci_dev_get(index);
1aff6f09 847 if (!hdev)
4e51eae9 848 return cmd_status(sk, index, MGMT_OP_SET_DEV_CLASS, ENODEV);
1aff6f09 849
1322901d 850 hci_dev_lock(hdev);
1aff6f09
JH
851
852 hdev->major_class = cp->major;
853 hdev->minor_class = cp->minor;
854
855 err = update_class(hdev);
856
857 if (err == 0)
4e51eae9 858 err = cmd_complete(sk, index, MGMT_OP_SET_DEV_CLASS, NULL, 0);
1aff6f09 859
1322901d 860 hci_dev_unlock(hdev);
1aff6f09
JH
861 hci_dev_put(hdev);
862
863 return err;
864}
865
4e51eae9
SJ
866static int set_service_cache(struct sock *sk, u16 index, unsigned char *data,
867 u16 len)
1aff6f09
JH
868{
869 struct hci_dev *hdev;
870 struct mgmt_cp_set_service_cache *cp;
1aff6f09
JH
871 int err;
872
873 cp = (void *) data;
1aff6f09 874
bdce7baf 875 if (len != sizeof(*cp))
b8534e0f 876 return cmd_status(sk, index, MGMT_OP_SET_SERVICE_CACHE, EINVAL);
bdce7baf 877
4e51eae9 878 hdev = hci_dev_get(index);
1aff6f09 879 if (!hdev)
4e51eae9 880 return cmd_status(sk, index, MGMT_OP_SET_SERVICE_CACHE, ENODEV);
1aff6f09 881
1322901d 882 hci_dev_lock(hdev);
1aff6f09 883
4e51eae9 884 BT_DBG("hci%u enable %d", index, cp->enable);
1aff6f09
JH
885
886 if (cp->enable) {
887 set_bit(HCI_SERVICE_CACHE, &hdev->flags);
888 err = 0;
889 } else {
890 clear_bit(HCI_SERVICE_CACHE, &hdev->flags);
891 err = update_class(hdev);
80a1e1db
JH
892 if (err == 0)
893 err = update_eir(hdev);
1aff6f09
JH
894 }
895
896 if (err == 0)
4e51eae9
SJ
897 err = cmd_complete(sk, index, MGMT_OP_SET_SERVICE_CACHE, NULL,
898 0);
1aff6f09 899
1322901d 900 hci_dev_unlock(hdev);
1aff6f09
JH
901 hci_dev_put(hdev);
902
903 return err;
904}
905
4e51eae9 906static int load_keys(struct sock *sk, u16 index, unsigned char *data, u16 len)
55ed8ca1
JH
907{
908 struct hci_dev *hdev;
909 struct mgmt_cp_load_keys *cp;
4e51eae9 910 u16 key_count, expected_len;
55ed8ca1
JH
911 int i;
912
913 cp = (void *) data;
bdce7baf
SJ
914
915 if (len < sizeof(*cp))
916 return -EINVAL;
917
55ed8ca1
JH
918 key_count = get_unaligned_le16(&cp->key_count);
919
920 expected_len = sizeof(*cp) + key_count * sizeof(struct mgmt_key_info);
921 if (expected_len != len) {
922 BT_ERR("load_keys: expected %u bytes, got %u bytes",
923 len, expected_len);
924 return -EINVAL;
925 }
926
4e51eae9 927 hdev = hci_dev_get(index);
55ed8ca1 928 if (!hdev)
4e51eae9 929 return cmd_status(sk, index, MGMT_OP_LOAD_KEYS, ENODEV);
55ed8ca1 930
4e51eae9 931 BT_DBG("hci%u debug_keys %u key_count %u", index, cp->debug_keys,
55ed8ca1
JH
932 key_count);
933
1322901d 934 hci_dev_lock(hdev);
55ed8ca1
JH
935
936 hci_link_keys_clear(hdev);
937
938 set_bit(HCI_LINK_KEYS, &hdev->flags);
939
940 if (cp->debug_keys)
941 set_bit(HCI_DEBUG_KEYS, &hdev->flags);
942 else
943 clear_bit(HCI_DEBUG_KEYS, &hdev->flags);
944
945 for (i = 0; i < key_count; i++) {
946 struct mgmt_key_info *key = &cp->keys[i];
947
948 hci_add_link_key(hdev, 0, &key->bdaddr, key->val, key->type,
949 key->pin_len);
950 }
951
1322901d 952 hci_dev_unlock(hdev);
55ed8ca1
JH
953 hci_dev_put(hdev);
954
955 return 0;
956}
957
4e51eae9 958static int remove_key(struct sock *sk, u16 index, unsigned char *data, u16 len)
55ed8ca1
JH
959{
960 struct hci_dev *hdev;
961 struct mgmt_cp_remove_key *cp;
962 struct hci_conn *conn;
55ed8ca1
JH
963 int err;
964
965 cp = (void *) data;
55ed8ca1 966
bdce7baf
SJ
967 if (len != sizeof(*cp))
968 return cmd_status(sk, index, MGMT_OP_REMOVE_KEY, EINVAL);
969
4e51eae9 970 hdev = hci_dev_get(index);
55ed8ca1 971 if (!hdev)
4e51eae9 972 return cmd_status(sk, index, MGMT_OP_REMOVE_KEY, ENODEV);
55ed8ca1 973
1322901d 974 hci_dev_lock(hdev);
55ed8ca1
JH
975
976 err = hci_remove_link_key(hdev, &cp->bdaddr);
977 if (err < 0) {
4e51eae9 978 err = cmd_status(sk, index, MGMT_OP_REMOVE_KEY, -err);
55ed8ca1
JH
979 goto unlock;
980 }
981
982 err = 0;
983
984 if (!test_bit(HCI_UP, &hdev->flags) || !cp->disconnect)
985 goto unlock;
986
987 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
988 if (conn) {
989 struct hci_cp_disconnect dc;
990
991 put_unaligned_le16(conn->handle, &dc.handle);
992 dc.reason = 0x13; /* Remote User Terminated Connection */
993 err = hci_send_cmd(hdev, HCI_OP_DISCONNECT, 0, NULL);
994 }
995
996unlock:
1322901d 997 hci_dev_unlock(hdev);
55ed8ca1
JH
998 hci_dev_put(hdev);
999
1000 return err;
1001}
1002
4e51eae9 1003static int disconnect(struct sock *sk, u16 index, unsigned char *data, u16 len)
8962ee74
JH
1004{
1005 struct hci_dev *hdev;
1006 struct mgmt_cp_disconnect *cp;
1007 struct hci_cp_disconnect dc;
366a0336 1008 struct pending_cmd *cmd;
8962ee74 1009 struct hci_conn *conn;
8962ee74
JH
1010 int err;
1011
1012 BT_DBG("");
1013
1014 cp = (void *) data;
8962ee74 1015
bdce7baf
SJ
1016 if (len != sizeof(*cp))
1017 return cmd_status(sk, index, MGMT_OP_DISCONNECT, EINVAL);
1018
4e51eae9 1019 hdev = hci_dev_get(index);
8962ee74 1020 if (!hdev)
4e51eae9 1021 return cmd_status(sk, index, MGMT_OP_DISCONNECT, ENODEV);
8962ee74 1022
1322901d 1023 hci_dev_lock(hdev);
8962ee74
JH
1024
1025 if (!test_bit(HCI_UP, &hdev->flags)) {
4e51eae9 1026 err = cmd_status(sk, index, MGMT_OP_DISCONNECT, ENETDOWN);
8962ee74
JH
1027 goto failed;
1028 }
1029
4e51eae9
SJ
1030 if (mgmt_pending_find(MGMT_OP_DISCONNECT, index)) {
1031 err = cmd_status(sk, index, MGMT_OP_DISCONNECT, EBUSY);
8962ee74
JH
1032 goto failed;
1033 }
1034
1035 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
1036 if (!conn) {
4e51eae9 1037 err = cmd_status(sk, index, MGMT_OP_DISCONNECT, ENOTCONN);
8962ee74
JH
1038 goto failed;
1039 }
1040
4e51eae9 1041 cmd = mgmt_pending_add(sk, MGMT_OP_DISCONNECT, index, data, len);
366a0336
JH
1042 if (!cmd) {
1043 err = -ENOMEM;
8962ee74 1044 goto failed;
366a0336 1045 }
8962ee74
JH
1046
1047 put_unaligned_le16(conn->handle, &dc.handle);
1048 dc.reason = 0x13; /* Remote User Terminated Connection */
1049
1050 err = hci_send_cmd(hdev, HCI_OP_DISCONNECT, sizeof(dc), &dc);
1051 if (err < 0)
a664b5bc 1052 mgmt_pending_remove(cmd);
8962ee74
JH
1053
1054failed:
1322901d 1055 hci_dev_unlock(hdev);
8962ee74
JH
1056 hci_dev_put(hdev);
1057
1058 return err;
1059}
1060
8ce6284e 1061static int get_connections(struct sock *sk, u16 index)
2784eb41 1062{
2784eb41
JH
1063 struct mgmt_rp_get_connections *rp;
1064 struct hci_dev *hdev;
1065 struct list_head *p;
a38528f1 1066 size_t rp_len;
4e51eae9 1067 u16 count;
2784eb41
JH
1068 int i, err;
1069
1070 BT_DBG("");
1071
4e51eae9 1072 hdev = hci_dev_get(index);
2784eb41 1073 if (!hdev)
4e51eae9 1074 return cmd_status(sk, index, MGMT_OP_GET_CONNECTIONS, ENODEV);
2784eb41 1075
1322901d 1076 hci_dev_lock(hdev);
2784eb41
JH
1077
1078 count = 0;
1079 list_for_each(p, &hdev->conn_hash.list) {
1080 count++;
1081 }
1082
a38528f1
JH
1083 rp_len = sizeof(*rp) + (count * sizeof(bdaddr_t));
1084 rp = kmalloc(rp_len, GFP_ATOMIC);
1085 if (!rp) {
2784eb41
JH
1086 err = -ENOMEM;
1087 goto unlock;
1088 }
1089
2784eb41
JH
1090 put_unaligned_le16(count, &rp->conn_count);
1091
1092 read_lock(&hci_dev_list_lock);
1093
1094 i = 0;
1095 list_for_each(p, &hdev->conn_hash.list) {
1096 struct hci_conn *c = list_entry(p, struct hci_conn, list);
1097
1098 bacpy(&rp->conn[i++], &c->dst);
1099 }
1100
1101 read_unlock(&hci_dev_list_lock);
1102
4e51eae9 1103 err = cmd_complete(sk, index, MGMT_OP_GET_CONNECTIONS, rp, rp_len);
2784eb41
JH
1104
1105unlock:
a38528f1 1106 kfree(rp);
1322901d 1107 hci_dev_unlock(hdev);
2784eb41
JH
1108 hci_dev_put(hdev);
1109 return err;
1110}
1111
4e51eae9
SJ
1112static int pin_code_reply(struct sock *sk, u16 index, unsigned char *data,
1113 u16 len)
980e1a53
JH
1114{
1115 struct hci_dev *hdev;
1116 struct mgmt_cp_pin_code_reply *cp;
1117 struct hci_cp_pin_code_reply reply;
366a0336 1118 struct pending_cmd *cmd;
980e1a53
JH
1119 int err;
1120
1121 BT_DBG("");
1122
1123 cp = (void *) data;
980e1a53 1124
bdce7baf
SJ
1125 if (len != sizeof(*cp))
1126 return cmd_status(sk, index, MGMT_OP_PIN_CODE_REPLY, EINVAL);
1127
4e51eae9 1128 hdev = hci_dev_get(index);
980e1a53 1129 if (!hdev)
4e51eae9 1130 return cmd_status(sk, index, MGMT_OP_PIN_CODE_REPLY, ENODEV);
980e1a53 1131
1322901d 1132 hci_dev_lock(hdev);
980e1a53
JH
1133
1134 if (!test_bit(HCI_UP, &hdev->flags)) {
4e51eae9 1135 err = cmd_status(sk, index, MGMT_OP_PIN_CODE_REPLY, ENETDOWN);
980e1a53
JH
1136 goto failed;
1137 }
1138
4e51eae9 1139 cmd = mgmt_pending_add(sk, MGMT_OP_PIN_CODE_REPLY, index, data, len);
366a0336
JH
1140 if (!cmd) {
1141 err = -ENOMEM;
980e1a53 1142 goto failed;
366a0336 1143 }
980e1a53
JH
1144
1145 bacpy(&reply.bdaddr, &cp->bdaddr);
1146 reply.pin_len = cp->pin_len;
1147 memcpy(reply.pin_code, cp->pin_code, 16);
1148
1149 err = hci_send_cmd(hdev, HCI_OP_PIN_CODE_REPLY, sizeof(reply), &reply);
1150 if (err < 0)
a664b5bc 1151 mgmt_pending_remove(cmd);
980e1a53
JH
1152
1153failed:
1322901d 1154 hci_dev_unlock(hdev);
980e1a53
JH
1155 hci_dev_put(hdev);
1156
1157 return err;
1158}
1159
4e51eae9
SJ
1160static int pin_code_neg_reply(struct sock *sk, u16 index, unsigned char *data,
1161 u16 len)
980e1a53
JH
1162{
1163 struct hci_dev *hdev;
1164 struct mgmt_cp_pin_code_neg_reply *cp;
366a0336 1165 struct pending_cmd *cmd;
980e1a53
JH
1166 int err;
1167
1168 BT_DBG("");
1169
1170 cp = (void *) data;
980e1a53 1171
bdce7baf
SJ
1172 if (len != sizeof(*cp))
1173 return cmd_status(sk, index, MGMT_OP_PIN_CODE_NEG_REPLY,
1174 EINVAL);
1175
4e51eae9 1176 hdev = hci_dev_get(index);
980e1a53 1177 if (!hdev)
4e51eae9
SJ
1178 return cmd_status(sk, index, MGMT_OP_PIN_CODE_NEG_REPLY,
1179 ENODEV);
980e1a53 1180
1322901d 1181 hci_dev_lock(hdev);
980e1a53
JH
1182
1183 if (!test_bit(HCI_UP, &hdev->flags)) {
4e51eae9
SJ
1184 err = cmd_status(sk, index, MGMT_OP_PIN_CODE_NEG_REPLY,
1185 ENETDOWN);
980e1a53
JH
1186 goto failed;
1187 }
1188
4e51eae9 1189 cmd = mgmt_pending_add(sk, MGMT_OP_PIN_CODE_NEG_REPLY, index,
980e1a53 1190 data, len);
366a0336
JH
1191 if (!cmd) {
1192 err = -ENOMEM;
980e1a53 1193 goto failed;
366a0336 1194 }
980e1a53 1195
3cf2a4f6 1196 err = hci_send_cmd(hdev, HCI_OP_PIN_CODE_NEG_REPLY, sizeof(cp->bdaddr),
980e1a53
JH
1197 &cp->bdaddr);
1198 if (err < 0)
a664b5bc 1199 mgmt_pending_remove(cmd);
980e1a53
JH
1200
1201failed:
1322901d 1202 hci_dev_unlock(hdev);
980e1a53
JH
1203 hci_dev_put(hdev);
1204
1205 return err;
1206}
1207
4e51eae9
SJ
1208static int set_io_capability(struct sock *sk, u16 index, unsigned char *data,
1209 u16 len)
17fa4b9d
JH
1210{
1211 struct hci_dev *hdev;
1212 struct mgmt_cp_set_io_capability *cp;
17fa4b9d
JH
1213
1214 BT_DBG("");
1215
1216 cp = (void *) data;
17fa4b9d 1217
bdce7baf 1218 if (len != sizeof(*cp))
b8534e0f 1219 return cmd_status(sk, index, MGMT_OP_SET_IO_CAPABILITY, EINVAL);
bdce7baf 1220
4e51eae9 1221 hdev = hci_dev_get(index);
17fa4b9d 1222 if (!hdev)
4e51eae9 1223 return cmd_status(sk, index, MGMT_OP_SET_IO_CAPABILITY, ENODEV);
17fa4b9d 1224
1322901d 1225 hci_dev_lock(hdev);
17fa4b9d
JH
1226
1227 hdev->io_capability = cp->io_capability;
1228
1229 BT_DBG("%s IO capability set to 0x%02x", hdev->name,
b8534e0f 1230 hdev->io_capability);
17fa4b9d 1231
1322901d 1232 hci_dev_unlock(hdev);
17fa4b9d
JH
1233 hci_dev_put(hdev);
1234
4e51eae9 1235 return cmd_complete(sk, index, MGMT_OP_SET_IO_CAPABILITY, NULL, 0);
17fa4b9d
JH
1236}
1237
e9a416b5
JH
1238static inline struct pending_cmd *find_pairing(struct hci_conn *conn)
1239{
1240 struct hci_dev *hdev = conn->hdev;
1241 struct list_head *p;
1242
1243 list_for_each(p, &cmd_list) {
1244 struct pending_cmd *cmd;
1245
1246 cmd = list_entry(p, struct pending_cmd, list);
1247
1248 if (cmd->opcode != MGMT_OP_PAIR_DEVICE)
1249 continue;
1250
1251 if (cmd->index != hdev->id)
1252 continue;
1253
1254 if (cmd->user_data != conn)
1255 continue;
1256
1257 return cmd;
1258 }
1259
1260 return NULL;
1261}
1262
1263static void pairing_complete(struct pending_cmd *cmd, u8 status)
1264{
1265 struct mgmt_rp_pair_device rp;
1266 struct hci_conn *conn = cmd->user_data;
1267
e9a416b5
JH
1268 bacpy(&rp.bdaddr, &conn->dst);
1269 rp.status = status;
1270
4e51eae9 1271 cmd_complete(cmd->sk, cmd->index, MGMT_OP_PAIR_DEVICE, &rp, sizeof(rp));
e9a416b5
JH
1272
1273 /* So we don't get further callbacks for this connection */
1274 conn->connect_cfm_cb = NULL;
1275 conn->security_cfm_cb = NULL;
1276 conn->disconn_cfm_cb = NULL;
1277
1278 hci_conn_put(conn);
1279
a664b5bc 1280 mgmt_pending_remove(cmd);
e9a416b5
JH
1281}
1282
1283static void pairing_complete_cb(struct hci_conn *conn, u8 status)
1284{
1285 struct pending_cmd *cmd;
1286
1287 BT_DBG("status %u", status);
1288
1289 cmd = find_pairing(conn);
1290 if (!cmd) {
1291 BT_DBG("Unable to find a pending command");
1292 return;
1293 }
1294
1295 pairing_complete(cmd, status);
1296}
1297
4e51eae9 1298static int pair_device(struct sock *sk, u16 index, unsigned char *data, u16 len)
e9a416b5
JH
1299{
1300 struct hci_dev *hdev;
1301 struct mgmt_cp_pair_device *cp;
1302 struct pending_cmd *cmd;
1303 u8 sec_level, auth_type;
1304 struct hci_conn *conn;
e9a416b5
JH
1305 int err;
1306
1307 BT_DBG("");
1308
1309 cp = (void *) data;
e9a416b5 1310
bdce7baf
SJ
1311 if (len != sizeof(*cp))
1312 return cmd_status(sk, index, MGMT_OP_PAIR_DEVICE, EINVAL);
1313
4e51eae9 1314 hdev = hci_dev_get(index);
e9a416b5 1315 if (!hdev)
4e51eae9 1316 return cmd_status(sk, index, MGMT_OP_PAIR_DEVICE, ENODEV);
e9a416b5 1317
1322901d 1318 hci_dev_lock(hdev);
e9a416b5
JH
1319
1320 if (cp->io_cap == 0x03) {
1321 sec_level = BT_SECURITY_MEDIUM;
1322 auth_type = HCI_AT_DEDICATED_BONDING;
1323 } else {
1324 sec_level = BT_SECURITY_HIGH;
1325 auth_type = HCI_AT_DEDICATED_BONDING_MITM;
1326 }
1327
1328 conn = hci_connect(hdev, ACL_LINK, &cp->bdaddr, sec_level, auth_type);
30e76272
VT
1329 if (IS_ERR(conn)) {
1330 err = PTR_ERR(conn);
e9a416b5
JH
1331 goto unlock;
1332 }
1333
1334 if (conn->connect_cfm_cb) {
1335 hci_conn_put(conn);
4e51eae9 1336 err = cmd_status(sk, index, MGMT_OP_PAIR_DEVICE, EBUSY);
e9a416b5
JH
1337 goto unlock;
1338 }
1339
4e51eae9 1340 cmd = mgmt_pending_add(sk, MGMT_OP_PAIR_DEVICE, index, data, len);
e9a416b5
JH
1341 if (!cmd) {
1342 err = -ENOMEM;
1343 hci_conn_put(conn);
1344 goto unlock;
1345 }
1346
1347 conn->connect_cfm_cb = pairing_complete_cb;
1348 conn->security_cfm_cb = pairing_complete_cb;
1349 conn->disconn_cfm_cb = pairing_complete_cb;
1350 conn->io_capability = cp->io_cap;
1351 cmd->user_data = conn;
1352
1353 if (conn->state == BT_CONNECTED &&
1354 hci_conn_security(conn, sec_level, auth_type))
1355 pairing_complete(cmd, 0);
1356
1357 err = 0;
1358
1359unlock:
1322901d 1360 hci_dev_unlock(hdev);
e9a416b5
JH
1361 hci_dev_put(hdev);
1362
1363 return err;
1364}
1365
4e51eae9
SJ
1366static int user_confirm_reply(struct sock *sk, u16 index, unsigned char *data,
1367 u16 len, int success)
a5c29683
JH
1368{
1369 struct mgmt_cp_user_confirm_reply *cp = (void *) data;
4e51eae9 1370 u16 mgmt_op, hci_op;
a5c29683
JH
1371 struct pending_cmd *cmd;
1372 struct hci_dev *hdev;
1373 int err;
1374
1375 BT_DBG("");
1376
a5c29683
JH
1377 if (success) {
1378 mgmt_op = MGMT_OP_USER_CONFIRM_REPLY;
1379 hci_op = HCI_OP_USER_CONFIRM_REPLY;
1380 } else {
1381 mgmt_op = MGMT_OP_USER_CONFIRM_NEG_REPLY;
1382 hci_op = HCI_OP_USER_CONFIRM_NEG_REPLY;
1383 }
1384
bdce7baf
SJ
1385 if (len != sizeof(*cp))
1386 return cmd_status(sk, index, mgmt_op, EINVAL);
1387
4e51eae9 1388 hdev = hci_dev_get(index);
a5c29683 1389 if (!hdev)
4e51eae9 1390 return cmd_status(sk, index, mgmt_op, ENODEV);
a5c29683 1391
1322901d 1392 hci_dev_lock(hdev);
08ba5382 1393
a5c29683 1394 if (!test_bit(HCI_UP, &hdev->flags)) {
4e51eae9 1395 err = cmd_status(sk, index, mgmt_op, ENETDOWN);
a5c29683
JH
1396 goto failed;
1397 }
1398
4e51eae9 1399 cmd = mgmt_pending_add(sk, mgmt_op, index, data, len);
a5c29683
JH
1400 if (!cmd) {
1401 err = -ENOMEM;
1402 goto failed;
1403 }
1404
1405 err = hci_send_cmd(hdev, hci_op, sizeof(cp->bdaddr), &cp->bdaddr);
a664b5bc
JH
1406 if (err < 0)
1407 mgmt_pending_remove(cmd);
a5c29683
JH
1408
1409failed:
1322901d 1410 hci_dev_unlock(hdev);
a5c29683
JH
1411 hci_dev_put(hdev);
1412
1413 return err;
1414}
1415
b312b161
JH
1416static int set_local_name(struct sock *sk, u16 index, unsigned char *data,
1417 u16 len)
1418{
1419 struct mgmt_cp_set_local_name *mgmt_cp = (void *) data;
1420 struct hci_cp_write_local_name hci_cp;
1421 struct hci_dev *hdev;
1422 struct pending_cmd *cmd;
1423 int err;
1424
1425 BT_DBG("");
1426
1427 if (len != sizeof(*mgmt_cp))
1428 return cmd_status(sk, index, MGMT_OP_SET_LOCAL_NAME, EINVAL);
1429
1430 hdev = hci_dev_get(index);
1431 if (!hdev)
1432 return cmd_status(sk, index, MGMT_OP_SET_LOCAL_NAME, ENODEV);
1433
1322901d 1434 hci_dev_lock(hdev);
b312b161
JH
1435
1436 cmd = mgmt_pending_add(sk, MGMT_OP_SET_LOCAL_NAME, index, data, len);
1437 if (!cmd) {
1438 err = -ENOMEM;
1439 goto failed;
1440 }
1441
1442 memcpy(hci_cp.name, mgmt_cp->name, sizeof(hci_cp.name));
1443 err = hci_send_cmd(hdev, HCI_OP_WRITE_LOCAL_NAME, sizeof(hci_cp),
1444 &hci_cp);
1445 if (err < 0)
1446 mgmt_pending_remove(cmd);
1447
1448failed:
1322901d 1449 hci_dev_unlock(hdev);
b312b161
JH
1450 hci_dev_put(hdev);
1451
1452 return err;
1453}
1454
c35938b2
SJ
1455static int read_local_oob_data(struct sock *sk, u16 index)
1456{
1457 struct hci_dev *hdev;
1458 struct pending_cmd *cmd;
1459 int err;
1460
1461 BT_DBG("hci%u", index);
1462
1463 hdev = hci_dev_get(index);
1464 if (!hdev)
1465 return cmd_status(sk, index, MGMT_OP_READ_LOCAL_OOB_DATA,
1466 ENODEV);
1467
1322901d 1468 hci_dev_lock(hdev);
c35938b2
SJ
1469
1470 if (!test_bit(HCI_UP, &hdev->flags)) {
1471 err = cmd_status(sk, index, MGMT_OP_READ_LOCAL_OOB_DATA,
1472 ENETDOWN);
1473 goto unlock;
1474 }
1475
1476 if (!(hdev->features[6] & LMP_SIMPLE_PAIR)) {
1477 err = cmd_status(sk, index, MGMT_OP_READ_LOCAL_OOB_DATA,
1478 EOPNOTSUPP);
1479 goto unlock;
1480 }
1481
1482 if (mgmt_pending_find(MGMT_OP_READ_LOCAL_OOB_DATA, index)) {
1483 err = cmd_status(sk, index, MGMT_OP_READ_LOCAL_OOB_DATA, EBUSY);
1484 goto unlock;
1485 }
1486
1487 cmd = mgmt_pending_add(sk, MGMT_OP_READ_LOCAL_OOB_DATA, index, NULL, 0);
1488 if (!cmd) {
1489 err = -ENOMEM;
1490 goto unlock;
1491 }
1492
1493 err = hci_send_cmd(hdev, HCI_OP_READ_LOCAL_OOB_DATA, 0, NULL);
1494 if (err < 0)
1495 mgmt_pending_remove(cmd);
1496
1497unlock:
1322901d 1498 hci_dev_unlock(hdev);
c35938b2
SJ
1499 hci_dev_put(hdev);
1500
1501 return err;
1502}
1503
2763eda6
SJ
1504static int add_remote_oob_data(struct sock *sk, u16 index, unsigned char *data,
1505 u16 len)
1506{
1507 struct hci_dev *hdev;
1508 struct mgmt_cp_add_remote_oob_data *cp = (void *) data;
1509 int err;
1510
1511 BT_DBG("hci%u ", index);
1512
1513 if (len != sizeof(*cp))
1514 return cmd_status(sk, index, MGMT_OP_ADD_REMOTE_OOB_DATA,
1515 EINVAL);
1516
1517 hdev = hci_dev_get(index);
1518 if (!hdev)
1519 return cmd_status(sk, index, MGMT_OP_ADD_REMOTE_OOB_DATA,
1520 ENODEV);
1521
1322901d 1522 hci_dev_lock(hdev);
2763eda6
SJ
1523
1524 err = hci_add_remote_oob_data(hdev, &cp->bdaddr, cp->hash,
1525 cp->randomizer);
1526 if (err < 0)
1527 err = cmd_status(sk, index, MGMT_OP_ADD_REMOTE_OOB_DATA, -err);
1528 else
1529 err = cmd_complete(sk, index, MGMT_OP_ADD_REMOTE_OOB_DATA, NULL,
1530 0);
1531
1322901d 1532 hci_dev_unlock(hdev);
2763eda6
SJ
1533 hci_dev_put(hdev);
1534
1535 return err;
1536}
1537
1538static int remove_remote_oob_data(struct sock *sk, u16 index,
1539 unsigned char *data, u16 len)
1540{
1541 struct hci_dev *hdev;
1542 struct mgmt_cp_remove_remote_oob_data *cp = (void *) data;
1543 int err;
1544
1545 BT_DBG("hci%u ", index);
1546
1547 if (len != sizeof(*cp))
1548 return cmd_status(sk, index, MGMT_OP_REMOVE_REMOTE_OOB_DATA,
1549 EINVAL);
1550
1551 hdev = hci_dev_get(index);
1552 if (!hdev)
1553 return cmd_status(sk, index, MGMT_OP_REMOVE_REMOTE_OOB_DATA,
1554 ENODEV);
1555
1322901d 1556 hci_dev_lock(hdev);
2763eda6
SJ
1557
1558 err = hci_remove_remote_oob_data(hdev, &cp->bdaddr);
1559 if (err < 0)
1560 err = cmd_status(sk, index, MGMT_OP_REMOVE_REMOTE_OOB_DATA,
1561 -err);
1562 else
1563 err = cmd_complete(sk, index, MGMT_OP_REMOVE_REMOTE_OOB_DATA,
1564 NULL, 0);
1565
1322901d 1566 hci_dev_unlock(hdev);
2763eda6
SJ
1567 hci_dev_put(hdev);
1568
1569 return err;
1570}
1571
14a53664
JH
1572static int start_discovery(struct sock *sk, u16 index)
1573{
1574 u8 lap[3] = { 0x33, 0x8b, 0x9e };
1575 struct hci_cp_inquiry cp;
1576 struct pending_cmd *cmd;
1577 struct hci_dev *hdev;
1578 int err;
1579
1580 BT_DBG("hci%u", index);
1581
1582 hdev = hci_dev_get(index);
1583 if (!hdev)
1584 return cmd_status(sk, index, MGMT_OP_START_DISCOVERY, ENODEV);
1585
1586 hci_dev_lock_bh(hdev);
1587
1588 cmd = mgmt_pending_add(sk, MGMT_OP_START_DISCOVERY, index, NULL, 0);
1589 if (!cmd) {
1590 err = -ENOMEM;
1591 goto failed;
1592 }
1593
1594 memset(&cp, 0, sizeof(cp));
1595 memcpy(&cp.lap, lap, 3);
1596 cp.length = 0x08;
1597 cp.num_rsp = 0x00;
1598
1599 err = hci_send_cmd(hdev, HCI_OP_INQUIRY, sizeof(cp), &cp);
1600 if (err < 0)
1601 mgmt_pending_remove(cmd);
1602
1603failed:
1604 hci_dev_unlock_bh(hdev);
1605 hci_dev_put(hdev);
1606
1607 return err;
1608}
1609
1610static int stop_discovery(struct sock *sk, u16 index)
1611{
1612 struct hci_dev *hdev;
1613 struct pending_cmd *cmd;
1614 int err;
1615
1616 BT_DBG("hci%u", index);
1617
1618 hdev = hci_dev_get(index);
1619 if (!hdev)
1620 return cmd_status(sk, index, MGMT_OP_STOP_DISCOVERY, ENODEV);
1621
1622 hci_dev_lock_bh(hdev);
1623
1624 cmd = mgmt_pending_add(sk, MGMT_OP_STOP_DISCOVERY, index, NULL, 0);
1625 if (!cmd) {
1626 err = -ENOMEM;
1627 goto failed;
1628 }
1629
1630 err = hci_send_cmd(hdev, HCI_OP_INQUIRY_CANCEL, 0, NULL);
1631 if (err < 0)
1632 mgmt_pending_remove(cmd);
1633
1634failed:
1635 hci_dev_unlock_bh(hdev);
1636 hci_dev_put(hdev);
1637
1638 return err;
1639}
1640
0381101f
JH
1641int mgmt_control(struct sock *sk, struct msghdr *msg, size_t msglen)
1642{
1643 unsigned char *buf;
1644 struct mgmt_hdr *hdr;
4e51eae9 1645 u16 opcode, index, len;
0381101f
JH
1646 int err;
1647
1648 BT_DBG("got %zu bytes", msglen);
1649
1650 if (msglen < sizeof(*hdr))
1651 return -EINVAL;
1652
e63a15ec 1653 buf = kmalloc(msglen, GFP_KERNEL);
0381101f
JH
1654 if (!buf)
1655 return -ENOMEM;
1656
1657 if (memcpy_fromiovec(buf, msg->msg_iov, msglen)) {
1658 err = -EFAULT;
1659 goto done;
1660 }
1661
1662 hdr = (struct mgmt_hdr *) buf;
1663 opcode = get_unaligned_le16(&hdr->opcode);
4e51eae9 1664 index = get_unaligned_le16(&hdr->index);
0381101f
JH
1665 len = get_unaligned_le16(&hdr->len);
1666
1667 if (len != msglen - sizeof(*hdr)) {
1668 err = -EINVAL;
1669 goto done;
1670 }
1671
1672 switch (opcode) {
02d98129
JH
1673 case MGMT_OP_READ_VERSION:
1674 err = read_version(sk);
1675 break;
faba42eb
JH
1676 case MGMT_OP_READ_INDEX_LIST:
1677 err = read_index_list(sk);
1678 break;
f7b64e69 1679 case MGMT_OP_READ_INFO:
4e51eae9 1680 err = read_controller_info(sk, index);
f7b64e69 1681 break;
eec8d2bc 1682 case MGMT_OP_SET_POWERED:
4e51eae9 1683 err = set_powered(sk, index, buf + sizeof(*hdr), len);
eec8d2bc 1684 break;
73f22f62 1685 case MGMT_OP_SET_DISCOVERABLE:
4e51eae9 1686 err = set_discoverable(sk, index, buf + sizeof(*hdr), len);
73f22f62 1687 break;
9fbcbb45 1688 case MGMT_OP_SET_CONNECTABLE:
4e51eae9 1689 err = set_connectable(sk, index, buf + sizeof(*hdr), len);
9fbcbb45 1690 break;
c542a06c 1691 case MGMT_OP_SET_PAIRABLE:
4e51eae9 1692 err = set_pairable(sk, index, buf + sizeof(*hdr), len);
c542a06c 1693 break;
2aeb9a1a 1694 case MGMT_OP_ADD_UUID:
4e51eae9 1695 err = add_uuid(sk, index, buf + sizeof(*hdr), len);
2aeb9a1a
JH
1696 break;
1697 case MGMT_OP_REMOVE_UUID:
4e51eae9 1698 err = remove_uuid(sk, index, buf + sizeof(*hdr), len);
2aeb9a1a 1699 break;
1aff6f09 1700 case MGMT_OP_SET_DEV_CLASS:
4e51eae9 1701 err = set_dev_class(sk, index, buf + sizeof(*hdr), len);
1aff6f09
JH
1702 break;
1703 case MGMT_OP_SET_SERVICE_CACHE:
4e51eae9 1704 err = set_service_cache(sk, index, buf + sizeof(*hdr), len);
1aff6f09 1705 break;
55ed8ca1 1706 case MGMT_OP_LOAD_KEYS:
4e51eae9 1707 err = load_keys(sk, index, buf + sizeof(*hdr), len);
55ed8ca1
JH
1708 break;
1709 case MGMT_OP_REMOVE_KEY:
4e51eae9 1710 err = remove_key(sk, index, buf + sizeof(*hdr), len);
55ed8ca1 1711 break;
8962ee74 1712 case MGMT_OP_DISCONNECT:
4e51eae9 1713 err = disconnect(sk, index, buf + sizeof(*hdr), len);
8962ee74 1714 break;
2784eb41 1715 case MGMT_OP_GET_CONNECTIONS:
8ce6284e 1716 err = get_connections(sk, index);
2784eb41 1717 break;
980e1a53 1718 case MGMT_OP_PIN_CODE_REPLY:
4e51eae9 1719 err = pin_code_reply(sk, index, buf + sizeof(*hdr), len);
980e1a53
JH
1720 break;
1721 case MGMT_OP_PIN_CODE_NEG_REPLY:
4e51eae9 1722 err = pin_code_neg_reply(sk, index, buf + sizeof(*hdr), len);
980e1a53 1723 break;
17fa4b9d 1724 case MGMT_OP_SET_IO_CAPABILITY:
4e51eae9 1725 err = set_io_capability(sk, index, buf + sizeof(*hdr), len);
17fa4b9d 1726 break;
e9a416b5 1727 case MGMT_OP_PAIR_DEVICE:
4e51eae9 1728 err = pair_device(sk, index, buf + sizeof(*hdr), len);
e9a416b5 1729 break;
a5c29683 1730 case MGMT_OP_USER_CONFIRM_REPLY:
4e51eae9 1731 err = user_confirm_reply(sk, index, buf + sizeof(*hdr), len, 1);
a5c29683
JH
1732 break;
1733 case MGMT_OP_USER_CONFIRM_NEG_REPLY:
4e51eae9 1734 err = user_confirm_reply(sk, index, buf + sizeof(*hdr), len, 0);
a5c29683 1735 break;
b312b161
JH
1736 case MGMT_OP_SET_LOCAL_NAME:
1737 err = set_local_name(sk, index, buf + sizeof(*hdr), len);
1738 break;
c35938b2
SJ
1739 case MGMT_OP_READ_LOCAL_OOB_DATA:
1740 err = read_local_oob_data(sk, index);
1741 break;
2763eda6
SJ
1742 case MGMT_OP_ADD_REMOTE_OOB_DATA:
1743 err = add_remote_oob_data(sk, index, buf + sizeof(*hdr), len);
1744 break;
1745 case MGMT_OP_REMOVE_REMOTE_OOB_DATA:
1746 err = remove_remote_oob_data(sk, index, buf + sizeof(*hdr),
1747 len);
1748 break;
14a53664
JH
1749 case MGMT_OP_START_DISCOVERY:
1750 err = start_discovery(sk, index);
1751 break;
1752 case MGMT_OP_STOP_DISCOVERY:
1753 err = stop_discovery(sk, index);
1754 break;
0381101f
JH
1755 default:
1756 BT_DBG("Unknown op %u", opcode);
4e51eae9 1757 err = cmd_status(sk, index, opcode, 0x01);
0381101f
JH
1758 break;
1759 }
1760
e41d8b4e
JH
1761 if (err < 0)
1762 goto done;
1763
0381101f
JH
1764 err = msglen;
1765
1766done:
1767 kfree(buf);
1768 return err;
1769}
c71e97bf 1770
c71e97bf
JH
1771int mgmt_index_added(u16 index)
1772{
4e51eae9 1773 return mgmt_event(MGMT_EV_INDEX_ADDED, index, NULL, 0, NULL);
c71e97bf
JH
1774}
1775
1776int mgmt_index_removed(u16 index)
1777{
4e51eae9 1778 return mgmt_event(MGMT_EV_INDEX_REMOVED, index, NULL, 0, NULL);
eec8d2bc
JH
1779}
1780
73f22f62 1781struct cmd_lookup {
72a734ec 1782 u8 val;
eec8d2bc
JH
1783 struct sock *sk;
1784};
1785
72a734ec 1786static void mode_rsp(struct pending_cmd *cmd, void *data)
eec8d2bc 1787{
c68fb7ff 1788 struct mgmt_mode *cp = cmd->param;
73f22f62 1789 struct cmd_lookup *match = data;
eec8d2bc 1790
72a734ec 1791 if (cp->val != match->val)
eec8d2bc
JH
1792 return;
1793
053f0211 1794 send_mode_rsp(cmd->sk, cmd->opcode, cmd->index, cp->val);
eec8d2bc
JH
1795
1796 list_del(&cmd->list);
1797
1798 if (match->sk == NULL) {
1799 match->sk = cmd->sk;
1800 sock_hold(match->sk);
1801 }
1802
1803 mgmt_pending_free(cmd);
c71e97bf 1804}
5add6af8
JH
1805
1806int mgmt_powered(u16 index, u8 powered)
1807{
72a734ec 1808 struct mgmt_mode ev;
73f22f62 1809 struct cmd_lookup match = { powered, NULL };
eec8d2bc 1810 int ret;
5add6af8 1811
72a734ec 1812 mgmt_pending_foreach(MGMT_OP_SET_POWERED, index, mode_rsp, &match);
5add6af8 1813
72a734ec 1814 ev.val = powered;
eec8d2bc 1815
4e51eae9 1816 ret = mgmt_event(MGMT_EV_POWERED, index, &ev, sizeof(ev), match.sk);
eec8d2bc
JH
1817
1818 if (match.sk)
1819 sock_put(match.sk);
1820
1821 return ret;
5add6af8 1822}
73f22f62 1823
73f22f62
JH
1824int mgmt_discoverable(u16 index, u8 discoverable)
1825{
72a734ec 1826 struct mgmt_mode ev;
73f22f62
JH
1827 struct cmd_lookup match = { discoverable, NULL };
1828 int ret;
1829
b8534e0f 1830 mgmt_pending_foreach(MGMT_OP_SET_DISCOVERABLE, index, mode_rsp, &match);
72a734ec 1831
72a734ec 1832 ev.val = discoverable;
73f22f62 1833
4e51eae9
SJ
1834 ret = mgmt_event(MGMT_EV_DISCOVERABLE, index, &ev, sizeof(ev),
1835 match.sk);
73f22f62
JH
1836
1837 if (match.sk)
1838 sock_put(match.sk);
1839
1840 return ret;
1841}
9fbcbb45 1842
9fbcbb45
JH
1843int mgmt_connectable(u16 index, u8 connectable)
1844{
72a734ec 1845 struct mgmt_mode ev;
9fbcbb45
JH
1846 struct cmd_lookup match = { connectable, NULL };
1847 int ret;
1848
72a734ec 1849 mgmt_pending_foreach(MGMT_OP_SET_CONNECTABLE, index, mode_rsp, &match);
9fbcbb45 1850
72a734ec 1851 ev.val = connectable;
9fbcbb45 1852
4e51eae9 1853 ret = mgmt_event(MGMT_EV_CONNECTABLE, index, &ev, sizeof(ev), match.sk);
9fbcbb45
JH
1854
1855 if (match.sk)
1856 sock_put(match.sk);
1857
1858 return ret;
1859}
55ed8ca1
JH
1860
1861int mgmt_new_key(u16 index, struct link_key *key, u8 old_key_type)
1862{
1863 struct mgmt_ev_new_key ev;
1864
1865 memset(&ev, 0, sizeof(ev));
1866
55ed8ca1
JH
1867 bacpy(&ev.key.bdaddr, &key->bdaddr);
1868 ev.key.type = key->type;
1869 memcpy(ev.key.val, key->val, 16);
1870 ev.key.pin_len = key->pin_len;
1871 ev.old_key_type = old_key_type;
1872
4e51eae9 1873 return mgmt_event(MGMT_EV_NEW_KEY, index, &ev, sizeof(ev), NULL);
55ed8ca1 1874}
f7520543
JH
1875
1876int mgmt_connected(u16 index, bdaddr_t *bdaddr)
1877{
1878 struct mgmt_ev_connected ev;
1879
f7520543
JH
1880 bacpy(&ev.bdaddr, bdaddr);
1881
4e51eae9 1882 return mgmt_event(MGMT_EV_CONNECTED, index, &ev, sizeof(ev), NULL);
f7520543
JH
1883}
1884
8962ee74
JH
1885static void disconnect_rsp(struct pending_cmd *cmd, void *data)
1886{
c68fb7ff 1887 struct mgmt_cp_disconnect *cp = cmd->param;
8962ee74 1888 struct sock **sk = data;
a38528f1 1889 struct mgmt_rp_disconnect rp;
8962ee74 1890
a38528f1 1891 bacpy(&rp.bdaddr, &cp->bdaddr);
8962ee74 1892
4e51eae9 1893 cmd_complete(cmd->sk, cmd->index, MGMT_OP_DISCONNECT, &rp, sizeof(rp));
8962ee74
JH
1894
1895 *sk = cmd->sk;
1896 sock_hold(*sk);
1897
a664b5bc 1898 mgmt_pending_remove(cmd);
8962ee74
JH
1899}
1900
f7520543
JH
1901int mgmt_disconnected(u16 index, bdaddr_t *bdaddr)
1902{
1903 struct mgmt_ev_disconnected ev;
8962ee74
JH
1904 struct sock *sk = NULL;
1905 int err;
1906
1907 mgmt_pending_foreach(MGMT_OP_DISCONNECT, index, disconnect_rsp, &sk);
f7520543 1908
f7520543
JH
1909 bacpy(&ev.bdaddr, bdaddr);
1910
4e51eae9 1911 err = mgmt_event(MGMT_EV_DISCONNECTED, index, &ev, sizeof(ev), sk);
8962ee74
JH
1912
1913 if (sk)
1914 sock_put(sk);
1915
1916 return err;
1917}
1918
1919int mgmt_disconnect_failed(u16 index)
1920{
1921 struct pending_cmd *cmd;
1922 int err;
1923
1924 cmd = mgmt_pending_find(MGMT_OP_DISCONNECT, index);
1925 if (!cmd)
1926 return -ENOENT;
1927
4e51eae9 1928 err = cmd_status(cmd->sk, index, MGMT_OP_DISCONNECT, EIO);
8962ee74 1929
a664b5bc 1930 mgmt_pending_remove(cmd);
8962ee74
JH
1931
1932 return err;
f7520543 1933}
17d5c04c
JH
1934
1935int mgmt_connect_failed(u16 index, bdaddr_t *bdaddr, u8 status)
1936{
1937 struct mgmt_ev_connect_failed ev;
1938
17d5c04c
JH
1939 bacpy(&ev.bdaddr, bdaddr);
1940 ev.status = status;
1941
4e51eae9 1942 return mgmt_event(MGMT_EV_CONNECT_FAILED, index, &ev, sizeof(ev), NULL);
17d5c04c 1943}
980e1a53
JH
1944
1945int mgmt_pin_code_request(u16 index, bdaddr_t *bdaddr)
1946{
1947 struct mgmt_ev_pin_code_request ev;
1948
980e1a53
JH
1949 bacpy(&ev.bdaddr, bdaddr);
1950
4e51eae9
SJ
1951 return mgmt_event(MGMT_EV_PIN_CODE_REQUEST, index, &ev, sizeof(ev),
1952 NULL);
980e1a53
JH
1953}
1954
1955int mgmt_pin_code_reply_complete(u16 index, bdaddr_t *bdaddr, u8 status)
1956{
1957 struct pending_cmd *cmd;
ac56fb13 1958 struct mgmt_rp_pin_code_reply rp;
980e1a53
JH
1959 int err;
1960
1961 cmd = mgmt_pending_find(MGMT_OP_PIN_CODE_REPLY, index);
1962 if (!cmd)
1963 return -ENOENT;
1964
ac56fb13
JH
1965 bacpy(&rp.bdaddr, bdaddr);
1966 rp.status = status;
1967
4e51eae9
SJ
1968 err = cmd_complete(cmd->sk, index, MGMT_OP_PIN_CODE_REPLY, &rp,
1969 sizeof(rp));
980e1a53 1970
a664b5bc 1971 mgmt_pending_remove(cmd);
980e1a53
JH
1972
1973 return err;
1974}
1975
1976int mgmt_pin_code_neg_reply_complete(u16 index, bdaddr_t *bdaddr, u8 status)
1977{
1978 struct pending_cmd *cmd;
ac56fb13 1979 struct mgmt_rp_pin_code_reply rp;
980e1a53
JH
1980 int err;
1981
1982 cmd = mgmt_pending_find(MGMT_OP_PIN_CODE_NEG_REPLY, index);
1983 if (!cmd)
1984 return -ENOENT;
1985
ac56fb13
JH
1986 bacpy(&rp.bdaddr, bdaddr);
1987 rp.status = status;
1988
4e51eae9
SJ
1989 err = cmd_complete(cmd->sk, index, MGMT_OP_PIN_CODE_NEG_REPLY, &rp,
1990 sizeof(rp));
980e1a53 1991
a664b5bc 1992 mgmt_pending_remove(cmd);
980e1a53
JH
1993
1994 return err;
1995}
a5c29683
JH
1996
1997int mgmt_user_confirm_request(u16 index, bdaddr_t *bdaddr, __le32 value)
1998{
1999 struct mgmt_ev_user_confirm_request ev;
2000
2001 BT_DBG("hci%u", index);
2002
a5c29683
JH
2003 bacpy(&ev.bdaddr, bdaddr);
2004 put_unaligned_le32(value, &ev.value);
2005
4e51eae9
SJ
2006 return mgmt_event(MGMT_EV_USER_CONFIRM_REQUEST, index, &ev, sizeof(ev),
2007 NULL);
a5c29683
JH
2008}
2009
2010static int confirm_reply_complete(u16 index, bdaddr_t *bdaddr, u8 status,
2011 u8 opcode)
2012{
2013 struct pending_cmd *cmd;
2014 struct mgmt_rp_user_confirm_reply rp;
2015 int err;
2016
2017 cmd = mgmt_pending_find(opcode, index);
2018 if (!cmd)
2019 return -ENOENT;
2020
a5c29683
JH
2021 bacpy(&rp.bdaddr, bdaddr);
2022 rp.status = status;
4e51eae9 2023 err = cmd_complete(cmd->sk, index, opcode, &rp, sizeof(rp));
a5c29683 2024
a664b5bc 2025 mgmt_pending_remove(cmd);
a5c29683
JH
2026
2027 return err;
2028}
2029
2030int mgmt_user_confirm_reply_complete(u16 index, bdaddr_t *bdaddr, u8 status)
2031{
2032 return confirm_reply_complete(index, bdaddr, status,
2033 MGMT_OP_USER_CONFIRM_REPLY);
2034}
2035
b8534e0f 2036int mgmt_user_confirm_neg_reply_complete(u16 index, bdaddr_t *bdaddr, u8 status)
a5c29683
JH
2037{
2038 return confirm_reply_complete(index, bdaddr, status,
2039 MGMT_OP_USER_CONFIRM_NEG_REPLY);
2040}
2a611692
JH
2041
2042int mgmt_auth_failed(u16 index, bdaddr_t *bdaddr, u8 status)
2043{
2044 struct mgmt_ev_auth_failed ev;
2045
2a611692
JH
2046 bacpy(&ev.bdaddr, bdaddr);
2047 ev.status = status;
2048
4e51eae9 2049 return mgmt_event(MGMT_EV_AUTH_FAILED, index, &ev, sizeof(ev), NULL);
2a611692 2050}
b312b161
JH
2051
2052int mgmt_set_local_name_complete(u16 index, u8 *name, u8 status)
2053{
2054 struct pending_cmd *cmd;
80a1e1db 2055 struct hci_dev *hdev;
b312b161
JH
2056 struct mgmt_cp_set_local_name ev;
2057 int err;
2058
2059 memset(&ev, 0, sizeof(ev));
2060 memcpy(ev.name, name, HCI_MAX_NAME_LENGTH);
2061
2062 cmd = mgmt_pending_find(MGMT_OP_SET_LOCAL_NAME, index);
2063 if (!cmd)
2064 goto send_event;
2065
2066 if (status) {
2067 err = cmd_status(cmd->sk, index, MGMT_OP_SET_LOCAL_NAME, EIO);
2068 goto failed;
2069 }
2070
80a1e1db
JH
2071 hdev = hci_dev_get(index);
2072 if (hdev) {
2073 hci_dev_lock_bh(hdev);
2074 update_eir(hdev);
2075 hci_dev_unlock_bh(hdev);
2076 hci_dev_put(hdev);
2077 }
2078
b312b161
JH
2079 err = cmd_complete(cmd->sk, index, MGMT_OP_SET_LOCAL_NAME, &ev,
2080 sizeof(ev));
2081 if (err < 0)
2082 goto failed;
2083
2084send_event:
2085 err = mgmt_event(MGMT_EV_LOCAL_NAME_CHANGED, index, &ev, sizeof(ev),
2086 cmd ? cmd->sk : NULL);
2087
2088failed:
2089 if (cmd)
2090 mgmt_pending_remove(cmd);
2091 return err;
2092}
c35938b2
SJ
2093
2094int mgmt_read_local_oob_data_reply_complete(u16 index, u8 *hash, u8 *randomizer,
2095 u8 status)
2096{
2097 struct pending_cmd *cmd;
2098 int err;
2099
2100 BT_DBG("hci%u status %u", index, status);
2101
2102 cmd = mgmt_pending_find(MGMT_OP_READ_LOCAL_OOB_DATA, index);
2103 if (!cmd)
2104 return -ENOENT;
2105
2106 if (status) {
2107 err = cmd_status(cmd->sk, index, MGMT_OP_READ_LOCAL_OOB_DATA,
2108 EIO);
2109 } else {
2110 struct mgmt_rp_read_local_oob_data rp;
2111
2112 memcpy(rp.hash, hash, sizeof(rp.hash));
2113 memcpy(rp.randomizer, randomizer, sizeof(rp.randomizer));
2114
2115 err = cmd_complete(cmd->sk, index, MGMT_OP_READ_LOCAL_OOB_DATA,
2116 &rp, sizeof(rp));
2117 }
2118
2119 mgmt_pending_remove(cmd);
2120
2121 return err;
2122}
e17acd40
JH
2123
2124int mgmt_device_found(u16 index, bdaddr_t *bdaddr, u8 *dev_class, s8 rssi,
2125 u8 *eir)
2126{
2127 struct mgmt_ev_device_found ev;
2128
2129 memset(&ev, 0, sizeof(ev));
2130
2131 bacpy(&ev.bdaddr, bdaddr);
2132 memcpy(ev.dev_class, dev_class, sizeof(ev.dev_class));
2133 ev.rssi = rssi;
2134
2135 if (eir)
2136 memcpy(ev.eir, eir, sizeof(ev.eir));
2137
2138 return mgmt_event(MGMT_EV_DEVICE_FOUND, index, &ev, sizeof(ev), NULL);
2139}
a88a9652
JH
2140
2141int mgmt_remote_name(u16 index, bdaddr_t *bdaddr, u8 *name)
2142{
2143 struct mgmt_ev_remote_name ev;
2144
2145 memset(&ev, 0, sizeof(ev));
2146
2147 bacpy(&ev.bdaddr, bdaddr);
2148 memcpy(ev.name, name, HCI_MAX_NAME_LENGTH);
2149
2150 return mgmt_event(MGMT_EV_REMOTE_NAME, index, &ev, sizeof(ev), NULL);
2151}
314b2381
JH
2152
2153int mgmt_discovering(u16 index, u8 discovering)
2154{
2155 return mgmt_event(MGMT_EV_DISCOVERING, index, &discovering,
2156 sizeof(discovering), NULL);
2157}