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