tipc: Fix problem with broadcast link synchronization between nodes
[cascardo/linux.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/kernel.h>
26 #include <linux/uaccess.h>
27 #include <linux/module.h>
28 #include <asm/unaligned.h>
29
30 #include <net/bluetooth/bluetooth.h>
31 #include <net/bluetooth/hci_core.h>
32 #include <net/bluetooth/mgmt.h>
33 #include <net/bluetooth/smp.h>
34
35 #define MGMT_VERSION    0
36 #define MGMT_REVISION   1
37
38 #define INQUIRY_LEN_BREDR 0x08 /* TGAP(100) */
39
40 #define SERVICE_CACHE_TIMEOUT (5 * 1000)
41
42 struct pending_cmd {
43         struct list_head list;
44         u16 opcode;
45         int index;
46         void *param;
47         struct sock *sk;
48         void *user_data;
49 };
50
51 /* HCI to MGMT error code conversion table */
52 static u8 mgmt_status_table[] = {
53         MGMT_STATUS_SUCCESS,
54         MGMT_STATUS_UNKNOWN_COMMAND,    /* Unknown Command */
55         MGMT_STATUS_NOT_CONNECTED,      /* No Connection */
56         MGMT_STATUS_FAILED,             /* Hardware Failure */
57         MGMT_STATUS_CONNECT_FAILED,     /* Page Timeout */
58         MGMT_STATUS_AUTH_FAILED,        /* Authentication Failed */
59         MGMT_STATUS_NOT_PAIRED,         /* PIN or Key Missing */
60         MGMT_STATUS_NO_RESOURCES,       /* Memory Full */
61         MGMT_STATUS_TIMEOUT,            /* Connection Timeout */
62         MGMT_STATUS_NO_RESOURCES,       /* Max Number of Connections */
63         MGMT_STATUS_NO_RESOURCES,       /* Max Number of SCO Connections */
64         MGMT_STATUS_ALREADY_CONNECTED,  /* ACL Connection Exists */
65         MGMT_STATUS_BUSY,               /* Command Disallowed */
66         MGMT_STATUS_NO_RESOURCES,       /* Rejected Limited Resources */
67         MGMT_STATUS_REJECTED,           /* Rejected Security */
68         MGMT_STATUS_REJECTED,           /* Rejected Personal */
69         MGMT_STATUS_TIMEOUT,            /* Host Timeout */
70         MGMT_STATUS_NOT_SUPPORTED,      /* Unsupported Feature */
71         MGMT_STATUS_INVALID_PARAMS,     /* Invalid Parameters */
72         MGMT_STATUS_DISCONNECTED,       /* OE User Ended Connection */
73         MGMT_STATUS_NO_RESOURCES,       /* OE Low Resources */
74         MGMT_STATUS_DISCONNECTED,       /* OE Power Off */
75         MGMT_STATUS_DISCONNECTED,       /* Connection Terminated */
76         MGMT_STATUS_BUSY,               /* Repeated Attempts */
77         MGMT_STATUS_REJECTED,           /* Pairing Not Allowed */
78         MGMT_STATUS_FAILED,             /* Unknown LMP PDU */
79         MGMT_STATUS_NOT_SUPPORTED,      /* Unsupported Remote Feature */
80         MGMT_STATUS_REJECTED,           /* SCO Offset Rejected */
81         MGMT_STATUS_REJECTED,           /* SCO Interval Rejected */
82         MGMT_STATUS_REJECTED,           /* Air Mode Rejected */
83         MGMT_STATUS_INVALID_PARAMS,     /* Invalid LMP Parameters */
84         MGMT_STATUS_FAILED,             /* Unspecified Error */
85         MGMT_STATUS_NOT_SUPPORTED,      /* Unsupported LMP Parameter Value */
86         MGMT_STATUS_FAILED,             /* Role Change Not Allowed */
87         MGMT_STATUS_TIMEOUT,            /* LMP Response Timeout */
88         MGMT_STATUS_FAILED,             /* LMP Error Transaction Collision */
89         MGMT_STATUS_FAILED,             /* LMP PDU Not Allowed */
90         MGMT_STATUS_REJECTED,           /* Encryption Mode Not Accepted */
91         MGMT_STATUS_FAILED,             /* Unit Link Key Used */
92         MGMT_STATUS_NOT_SUPPORTED,      /* QoS Not Supported */
93         MGMT_STATUS_TIMEOUT,            /* Instant Passed */
94         MGMT_STATUS_NOT_SUPPORTED,      /* Pairing Not Supported */
95         MGMT_STATUS_FAILED,             /* Transaction Collision */
96         MGMT_STATUS_INVALID_PARAMS,     /* Unacceptable Parameter */
97         MGMT_STATUS_REJECTED,           /* QoS Rejected */
98         MGMT_STATUS_NOT_SUPPORTED,      /* Classification Not Supported */
99         MGMT_STATUS_REJECTED,           /* Insufficient Security */
100         MGMT_STATUS_INVALID_PARAMS,     /* Parameter Out Of Range */
101         MGMT_STATUS_BUSY,               /* Role Switch Pending */
102         MGMT_STATUS_FAILED,             /* Slot Violation */
103         MGMT_STATUS_FAILED,             /* Role Switch Failed */
104         MGMT_STATUS_INVALID_PARAMS,     /* EIR Too Large */
105         MGMT_STATUS_NOT_SUPPORTED,      /* Simple Pairing Not Supported */
106         MGMT_STATUS_BUSY,               /* Host Busy Pairing */
107         MGMT_STATUS_REJECTED,           /* Rejected, No Suitable Channel */
108         MGMT_STATUS_BUSY,               /* Controller Busy */
109         MGMT_STATUS_INVALID_PARAMS,     /* Unsuitable Connection Interval */
110         MGMT_STATUS_TIMEOUT,            /* Directed Advertising Timeout */
111         MGMT_STATUS_AUTH_FAILED,        /* Terminated Due to MIC Failure */
112         MGMT_STATUS_CONNECT_FAILED,     /* Connection Establishment Failed */
113         MGMT_STATUS_CONNECT_FAILED,     /* MAC Connection Failed */
114 };
115
116 static u8 mgmt_status(u8 hci_status)
117 {
118         if (hci_status < ARRAY_SIZE(mgmt_status_table))
119                 return mgmt_status_table[hci_status];
120
121         return MGMT_STATUS_FAILED;
122 }
123
124 static int cmd_status(struct sock *sk, u16 index, u16 cmd, u8 status)
125 {
126         struct sk_buff *skb;
127         struct mgmt_hdr *hdr;
128         struct mgmt_ev_cmd_status *ev;
129         int err;
130
131         BT_DBG("sock %p, index %u, cmd %u, status %u", sk, index, cmd, status);
132
133         skb = alloc_skb(sizeof(*hdr) + sizeof(*ev), GFP_ATOMIC);
134         if (!skb)
135                 return -ENOMEM;
136
137         hdr = (void *) skb_put(skb, sizeof(*hdr));
138
139         hdr->opcode = cpu_to_le16(MGMT_EV_CMD_STATUS);
140         hdr->index = cpu_to_le16(index);
141         hdr->len = cpu_to_le16(sizeof(*ev));
142
143         ev = (void *) skb_put(skb, sizeof(*ev));
144         ev->status = status;
145         put_unaligned_le16(cmd, &ev->opcode);
146
147         err = sock_queue_rcv_skb(sk, skb);
148         if (err < 0)
149                 kfree_skb(skb);
150
151         return err;
152 }
153
154 static int cmd_complete(struct sock *sk, u16 index, u16 cmd, void *rp,
155                                                                 size_t rp_len)
156 {
157         struct sk_buff *skb;
158         struct mgmt_hdr *hdr;
159         struct mgmt_ev_cmd_complete *ev;
160         int err;
161
162         BT_DBG("sock %p", sk);
163
164         skb = alloc_skb(sizeof(*hdr) + sizeof(*ev) + rp_len, GFP_ATOMIC);
165         if (!skb)
166                 return -ENOMEM;
167
168         hdr = (void *) skb_put(skb, sizeof(*hdr));
169
170         hdr->opcode = cpu_to_le16(MGMT_EV_CMD_COMPLETE);
171         hdr->index = cpu_to_le16(index);
172         hdr->len = cpu_to_le16(sizeof(*ev) + rp_len);
173
174         ev = (void *) skb_put(skb, sizeof(*ev) + rp_len);
175         put_unaligned_le16(cmd, &ev->opcode);
176
177         if (rp)
178                 memcpy(ev->data, rp, rp_len);
179
180         err = sock_queue_rcv_skb(sk, skb);
181         if (err < 0)
182                 kfree_skb(skb);
183
184         return err;;
185 }
186
187 static int read_version(struct sock *sk)
188 {
189         struct mgmt_rp_read_version rp;
190
191         BT_DBG("sock %p", sk);
192
193         rp.version = MGMT_VERSION;
194         put_unaligned_le16(MGMT_REVISION, &rp.revision);
195
196         return cmd_complete(sk, MGMT_INDEX_NONE, MGMT_OP_READ_VERSION, &rp,
197                                                                 sizeof(rp));
198 }
199
200 static int read_index_list(struct sock *sk)
201 {
202         struct mgmt_rp_read_index_list *rp;
203         struct list_head *p;
204         struct hci_dev *d;
205         size_t rp_len;
206         u16 count;
207         int i, err;
208
209         BT_DBG("sock %p", sk);
210
211         read_lock(&hci_dev_list_lock);
212
213         count = 0;
214         list_for_each(p, &hci_dev_list) {
215                 count++;
216         }
217
218         rp_len = sizeof(*rp) + (2 * count);
219         rp = kmalloc(rp_len, GFP_ATOMIC);
220         if (!rp) {
221                 read_unlock(&hci_dev_list_lock);
222                 return -ENOMEM;
223         }
224
225         put_unaligned_le16(count, &rp->num_controllers);
226
227         i = 0;
228         list_for_each_entry(d, &hci_dev_list, list) {
229                 if (test_and_clear_bit(HCI_AUTO_OFF, &d->flags))
230                         cancel_delayed_work(&d->power_off);
231
232                 if (test_bit(HCI_SETUP, &d->flags))
233                         continue;
234
235                 put_unaligned_le16(d->id, &rp->index[i++]);
236                 BT_DBG("Added hci%u", d->id);
237         }
238
239         read_unlock(&hci_dev_list_lock);
240
241         err = cmd_complete(sk, MGMT_INDEX_NONE, MGMT_OP_READ_INDEX_LIST, rp,
242                                                                         rp_len);
243
244         kfree(rp);
245
246         return err;
247 }
248
249 static u32 get_supported_settings(struct hci_dev *hdev)
250 {
251         u32 settings = 0;
252
253         settings |= MGMT_SETTING_POWERED;
254         settings |= MGMT_SETTING_CONNECTABLE;
255         settings |= MGMT_SETTING_FAST_CONNECTABLE;
256         settings |= MGMT_SETTING_DISCOVERABLE;
257         settings |= MGMT_SETTING_PAIRABLE;
258
259         if (hdev->features[6] & LMP_SIMPLE_PAIR)
260                 settings |= MGMT_SETTING_SSP;
261
262         if (!(hdev->features[4] & LMP_NO_BREDR)) {
263                 settings |= MGMT_SETTING_BREDR;
264                 settings |= MGMT_SETTING_LINK_SECURITY;
265         }
266
267         if (hdev->features[4] & LMP_LE)
268                 settings |= MGMT_SETTING_LE;
269
270         return settings;
271 }
272
273 static u32 get_current_settings(struct hci_dev *hdev)
274 {
275         u32 settings = 0;
276
277         if (test_bit(HCI_UP, &hdev->flags))
278                 settings |= MGMT_SETTING_POWERED;
279         else
280                 return settings;
281
282         if (test_bit(HCI_PSCAN, &hdev->flags))
283                 settings |= MGMT_SETTING_CONNECTABLE;
284
285         if (test_bit(HCI_ISCAN, &hdev->flags))
286                 settings |= MGMT_SETTING_DISCOVERABLE;
287
288         if (test_bit(HCI_PAIRABLE, &hdev->flags))
289                 settings |= MGMT_SETTING_PAIRABLE;
290
291         if (!(hdev->features[4] & LMP_NO_BREDR))
292                 settings |= MGMT_SETTING_BREDR;
293
294         if (hdev->host_features[0] & LMP_HOST_LE)
295                 settings |= MGMT_SETTING_LE;
296
297         if (test_bit(HCI_AUTH, &hdev->flags))
298                 settings |= MGMT_SETTING_LINK_SECURITY;
299
300         if (hdev->ssp_mode > 0)
301                 settings |= MGMT_SETTING_SSP;
302
303         return settings;
304 }
305
306 #define EIR_FLAGS               0x01 /* flags */
307 #define EIR_UUID16_SOME         0x02 /* 16-bit UUID, more available */
308 #define EIR_UUID16_ALL          0x03 /* 16-bit UUID, all listed */
309 #define EIR_UUID32_SOME         0x04 /* 32-bit UUID, more available */
310 #define EIR_UUID32_ALL          0x05 /* 32-bit UUID, all listed */
311 #define EIR_UUID128_SOME        0x06 /* 128-bit UUID, more available */
312 #define EIR_UUID128_ALL         0x07 /* 128-bit UUID, all listed */
313 #define EIR_NAME_SHORT          0x08 /* shortened local name */
314 #define EIR_NAME_COMPLETE       0x09 /* complete local name */
315 #define EIR_TX_POWER            0x0A /* transmit power level */
316 #define EIR_DEVICE_ID           0x10 /* device ID */
317
318 #define PNP_INFO_SVCLASS_ID             0x1200
319
320 static u8 bluetooth_base_uuid[] = {
321                         0xFB, 0x34, 0x9B, 0x5F, 0x80, 0x00, 0x00, 0x80,
322                         0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
323 };
324
325 static u16 get_uuid16(u8 *uuid128)
326 {
327         u32 val;
328         int i;
329
330         for (i = 0; i < 12; i++) {
331                 if (bluetooth_base_uuid[i] != uuid128[i])
332                         return 0;
333         }
334
335         memcpy(&val, &uuid128[12], 4);
336
337         val = le32_to_cpu(val);
338         if (val > 0xffff)
339                 return 0;
340
341         return (u16) val;
342 }
343
344 static void create_eir(struct hci_dev *hdev, u8 *data)
345 {
346         u8 *ptr = data;
347         u16 eir_len = 0;
348         u16 uuid16_list[HCI_MAX_EIR_LENGTH / sizeof(u16)];
349         int i, truncated = 0;
350         struct bt_uuid *uuid;
351         size_t name_len;
352
353         name_len = strlen(hdev->dev_name);
354
355         if (name_len > 0) {
356                 /* EIR Data type */
357                 if (name_len > 48) {
358                         name_len = 48;
359                         ptr[1] = EIR_NAME_SHORT;
360                 } else
361                         ptr[1] = EIR_NAME_COMPLETE;
362
363                 /* EIR Data length */
364                 ptr[0] = name_len + 1;
365
366                 memcpy(ptr + 2, hdev->dev_name, name_len);
367
368                 eir_len += (name_len + 2);
369                 ptr += (name_len + 2);
370         }
371
372         memset(uuid16_list, 0, sizeof(uuid16_list));
373
374         /* Group all UUID16 types */
375         list_for_each_entry(uuid, &hdev->uuids, list) {
376                 u16 uuid16;
377
378                 uuid16 = get_uuid16(uuid->uuid);
379                 if (uuid16 == 0)
380                         return;
381
382                 if (uuid16 < 0x1100)
383                         continue;
384
385                 if (uuid16 == PNP_INFO_SVCLASS_ID)
386                         continue;
387
388                 /* Stop if not enough space to put next UUID */
389                 if (eir_len + 2 + sizeof(u16) > HCI_MAX_EIR_LENGTH) {
390                         truncated = 1;
391                         break;
392                 }
393
394                 /* Check for duplicates */
395                 for (i = 0; uuid16_list[i] != 0; i++)
396                         if (uuid16_list[i] == uuid16)
397                                 break;
398
399                 if (uuid16_list[i] == 0) {
400                         uuid16_list[i] = uuid16;
401                         eir_len += sizeof(u16);
402                 }
403         }
404
405         if (uuid16_list[0] != 0) {
406                 u8 *length = ptr;
407
408                 /* EIR Data type */
409                 ptr[1] = truncated ? EIR_UUID16_SOME : EIR_UUID16_ALL;
410
411                 ptr += 2;
412                 eir_len += 2;
413
414                 for (i = 0; uuid16_list[i] != 0; i++) {
415                         *ptr++ = (uuid16_list[i] & 0x00ff);
416                         *ptr++ = (uuid16_list[i] & 0xff00) >> 8;
417                 }
418
419                 /* EIR Data length */
420                 *length = (i * sizeof(u16)) + 1;
421         }
422 }
423
424 static int update_eir(struct hci_dev *hdev)
425 {
426         struct hci_cp_write_eir cp;
427
428         if (!(hdev->features[6] & LMP_EXT_INQ))
429                 return 0;
430
431         if (hdev->ssp_mode == 0)
432                 return 0;
433
434         if (test_bit(HCI_SERVICE_CACHE, &hdev->flags))
435                 return 0;
436
437         memset(&cp, 0, sizeof(cp));
438
439         create_eir(hdev, cp.data);
440
441         if (memcmp(cp.data, hdev->eir, sizeof(cp.data)) == 0)
442                 return 0;
443
444         memcpy(hdev->eir, cp.data, sizeof(cp.data));
445
446         return hci_send_cmd(hdev, HCI_OP_WRITE_EIR, sizeof(cp), &cp);
447 }
448
449 static u8 get_service_classes(struct hci_dev *hdev)
450 {
451         struct bt_uuid *uuid;
452         u8 val = 0;
453
454         list_for_each_entry(uuid, &hdev->uuids, list)
455                 val |= uuid->svc_hint;
456
457         return val;
458 }
459
460 static int update_class(struct hci_dev *hdev)
461 {
462         u8 cod[3];
463
464         BT_DBG("%s", hdev->name);
465
466         if (test_bit(HCI_SERVICE_CACHE, &hdev->flags))
467                 return 0;
468
469         cod[0] = hdev->minor_class;
470         cod[1] = hdev->major_class;
471         cod[2] = get_service_classes(hdev);
472
473         if (memcmp(cod, hdev->dev_class, 3) == 0)
474                 return 0;
475
476         return hci_send_cmd(hdev, HCI_OP_WRITE_CLASS_OF_DEV, sizeof(cod), cod);
477 }
478
479 static void service_cache_off(struct work_struct *work)
480 {
481         struct hci_dev *hdev = container_of(work, struct hci_dev,
482                                                         service_cache.work);
483
484         if (!test_and_clear_bit(HCI_SERVICE_CACHE, &hdev->flags))
485                 return;
486
487         hci_dev_lock(hdev);
488
489         update_eir(hdev);
490         update_class(hdev);
491
492         hci_dev_unlock(hdev);
493 }
494
495 static void mgmt_init_hdev(struct hci_dev *hdev)
496 {
497         if (!test_and_set_bit(HCI_MGMT, &hdev->flags))
498                 INIT_DELAYED_WORK(&hdev->service_cache, service_cache_off);
499
500         if (!test_and_set_bit(HCI_SERVICE_CACHE, &hdev->flags))
501                 schedule_delayed_work(&hdev->service_cache,
502                                 msecs_to_jiffies(SERVICE_CACHE_TIMEOUT));
503 }
504
505 static int read_controller_info(struct sock *sk, u16 index)
506 {
507         struct mgmt_rp_read_info rp;
508         struct hci_dev *hdev;
509
510         BT_DBG("sock %p hci%u", sk, index);
511
512         hdev = hci_dev_get(index);
513         if (!hdev)
514                 return cmd_status(sk, index, MGMT_OP_READ_INFO,
515                                                 MGMT_STATUS_INVALID_PARAMS);
516
517         if (test_and_clear_bit(HCI_AUTO_OFF, &hdev->flags))
518                 cancel_delayed_work_sync(&hdev->power_off);
519
520         hci_dev_lock(hdev);
521
522         if (test_and_clear_bit(HCI_PI_MGMT_INIT, &hci_pi(sk)->flags))
523                 mgmt_init_hdev(hdev);
524
525         memset(&rp, 0, sizeof(rp));
526
527         bacpy(&rp.bdaddr, &hdev->bdaddr);
528
529         rp.version = hdev->hci_ver;
530
531         put_unaligned_le16(hdev->manufacturer, &rp.manufacturer);
532
533         rp.supported_settings = cpu_to_le32(get_supported_settings(hdev));
534         rp.current_settings = cpu_to_le32(get_current_settings(hdev));
535
536         memcpy(rp.dev_class, hdev->dev_class, 3);
537
538         memcpy(rp.name, hdev->dev_name, sizeof(hdev->dev_name));
539
540         hci_dev_unlock(hdev);
541         hci_dev_put(hdev);
542
543         return cmd_complete(sk, index, MGMT_OP_READ_INFO, &rp, sizeof(rp));
544 }
545
546 static void mgmt_pending_free(struct pending_cmd *cmd)
547 {
548         sock_put(cmd->sk);
549         kfree(cmd->param);
550         kfree(cmd);
551 }
552
553 static struct pending_cmd *mgmt_pending_add(struct sock *sk, u16 opcode,
554                                                         struct hci_dev *hdev,
555                                                         void *data, u16 len)
556 {
557         struct pending_cmd *cmd;
558
559         cmd = kmalloc(sizeof(*cmd), GFP_ATOMIC);
560         if (!cmd)
561                 return NULL;
562
563         cmd->opcode = opcode;
564         cmd->index = hdev->id;
565
566         cmd->param = kmalloc(len, GFP_ATOMIC);
567         if (!cmd->param) {
568                 kfree(cmd);
569                 return NULL;
570         }
571
572         if (data)
573                 memcpy(cmd->param, data, len);
574
575         cmd->sk = sk;
576         sock_hold(sk);
577
578         list_add(&cmd->list, &hdev->mgmt_pending);
579
580         return cmd;
581 }
582
583 static void mgmt_pending_foreach(u16 opcode, struct hci_dev *hdev,
584                                 void (*cb)(struct pending_cmd *cmd, void *data),
585                                 void *data)
586 {
587         struct list_head *p, *n;
588
589         list_for_each_safe(p, n, &hdev->mgmt_pending) {
590                 struct pending_cmd *cmd;
591
592                 cmd = list_entry(p, struct pending_cmd, list);
593
594                 if (opcode > 0 && cmd->opcode != opcode)
595                         continue;
596
597                 cb(cmd, data);
598         }
599 }
600
601 static struct pending_cmd *mgmt_pending_find(u16 opcode, struct hci_dev *hdev)
602 {
603         struct pending_cmd *cmd;
604
605         list_for_each_entry(cmd, &hdev->mgmt_pending, list) {
606                 if (cmd->opcode == opcode)
607                         return cmd;
608         }
609
610         return NULL;
611 }
612
613 static void mgmt_pending_remove(struct pending_cmd *cmd)
614 {
615         list_del(&cmd->list);
616         mgmt_pending_free(cmd);
617 }
618
619 static int send_settings_rsp(struct sock *sk, u16 opcode, struct hci_dev *hdev)
620 {
621         __le32 settings = cpu_to_le32(get_current_settings(hdev));
622
623         return cmd_complete(sk, hdev->id, opcode, &settings, sizeof(settings));
624 }
625
626 static int set_powered(struct sock *sk, u16 index, unsigned char *data, u16 len)
627 {
628         struct mgmt_mode *cp;
629         struct hci_dev *hdev;
630         struct pending_cmd *cmd;
631         int err, up;
632
633         cp = (void *) data;
634
635         BT_DBG("request for hci%u", index);
636
637         if (len != sizeof(*cp))
638                 return cmd_status(sk, index, MGMT_OP_SET_POWERED,
639                                                 MGMT_STATUS_INVALID_PARAMS);
640
641         hdev = hci_dev_get(index);
642         if (!hdev)
643                 return cmd_status(sk, index, MGMT_OP_SET_POWERED,
644                                                 MGMT_STATUS_INVALID_PARAMS);
645
646         hci_dev_lock(hdev);
647
648         up = test_bit(HCI_UP, &hdev->flags);
649         if ((cp->val && up) || (!cp->val && !up)) {
650                 err = send_settings_rsp(sk, MGMT_OP_SET_POWERED, hdev);
651                 goto failed;
652         }
653
654         if (mgmt_pending_find(MGMT_OP_SET_POWERED, hdev)) {
655                 err = cmd_status(sk, index, MGMT_OP_SET_POWERED,
656                                                         MGMT_STATUS_BUSY);
657                 goto failed;
658         }
659
660         cmd = mgmt_pending_add(sk, MGMT_OP_SET_POWERED, hdev, data, len);
661         if (!cmd) {
662                 err = -ENOMEM;
663                 goto failed;
664         }
665
666         if (cp->val)
667                 schedule_work(&hdev->power_on);
668         else
669                 schedule_work(&hdev->power_off.work);
670
671         err = 0;
672
673 failed:
674         hci_dev_unlock(hdev);
675         hci_dev_put(hdev);
676         return err;
677 }
678
679 static int set_discoverable(struct sock *sk, u16 index, unsigned char *data,
680                                                                         u16 len)
681 {
682         struct mgmt_cp_set_discoverable *cp;
683         struct hci_dev *hdev;
684         struct pending_cmd *cmd;
685         u8 scan;
686         int err;
687
688         cp = (void *) data;
689
690         BT_DBG("request for hci%u", index);
691
692         if (len != sizeof(*cp))
693                 return cmd_status(sk, index, MGMT_OP_SET_DISCOVERABLE,
694                                                 MGMT_STATUS_INVALID_PARAMS);
695
696         hdev = hci_dev_get(index);
697         if (!hdev)
698                 return cmd_status(sk, index, MGMT_OP_SET_DISCOVERABLE,
699                                                 MGMT_STATUS_INVALID_PARAMS);
700
701         hci_dev_lock(hdev);
702
703         if (!test_bit(HCI_UP, &hdev->flags)) {
704                 err = cmd_status(sk, index, MGMT_OP_SET_DISCOVERABLE,
705                                                 MGMT_STATUS_NOT_POWERED);
706                 goto failed;
707         }
708
709         if (mgmt_pending_find(MGMT_OP_SET_DISCOVERABLE, hdev) ||
710                         mgmt_pending_find(MGMT_OP_SET_CONNECTABLE, hdev)) {
711                 err = cmd_status(sk, index, MGMT_OP_SET_DISCOVERABLE,
712                                                         MGMT_STATUS_BUSY);
713                 goto failed;
714         }
715
716         if (cp->val == test_bit(HCI_ISCAN, &hdev->flags) &&
717                                         test_bit(HCI_PSCAN, &hdev->flags)) {
718                 err = send_settings_rsp(sk, MGMT_OP_SET_DISCOVERABLE, hdev);
719                 goto failed;
720         }
721
722         cmd = mgmt_pending_add(sk, MGMT_OP_SET_DISCOVERABLE, hdev, data, len);
723         if (!cmd) {
724                 err = -ENOMEM;
725                 goto failed;
726         }
727
728         scan = SCAN_PAGE;
729
730         if (cp->val)
731                 scan |= SCAN_INQUIRY;
732         else
733                 cancel_delayed_work(&hdev->discov_off);
734
735         err = hci_send_cmd(hdev, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);
736         if (err < 0)
737                 mgmt_pending_remove(cmd);
738
739         if (cp->val)
740                 hdev->discov_timeout = get_unaligned_le16(&cp->timeout);
741
742 failed:
743         hci_dev_unlock(hdev);
744         hci_dev_put(hdev);
745
746         return err;
747 }
748
749 static int set_connectable(struct sock *sk, u16 index, unsigned char *data,
750                                                                         u16 len)
751 {
752         struct mgmt_mode *cp;
753         struct hci_dev *hdev;
754         struct pending_cmd *cmd;
755         u8 scan;
756         int err;
757
758         cp = (void *) data;
759
760         BT_DBG("request for hci%u", index);
761
762         if (len != sizeof(*cp))
763                 return cmd_status(sk, index, MGMT_OP_SET_CONNECTABLE,
764                                                 MGMT_STATUS_INVALID_PARAMS);
765
766         hdev = hci_dev_get(index);
767         if (!hdev)
768                 return cmd_status(sk, index, MGMT_OP_SET_CONNECTABLE,
769                                                 MGMT_STATUS_INVALID_PARAMS);
770
771         hci_dev_lock(hdev);
772
773         if (!test_bit(HCI_UP, &hdev->flags)) {
774                 err = cmd_status(sk, index, MGMT_OP_SET_CONNECTABLE,
775                                                 MGMT_STATUS_NOT_POWERED);
776                 goto failed;
777         }
778
779         if (mgmt_pending_find(MGMT_OP_SET_DISCOVERABLE, hdev) ||
780                         mgmt_pending_find(MGMT_OP_SET_CONNECTABLE, hdev)) {
781                 err = cmd_status(sk, index, MGMT_OP_SET_CONNECTABLE,
782                                                         MGMT_STATUS_BUSY);
783                 goto failed;
784         }
785
786         if (cp->val == test_bit(HCI_PSCAN, &hdev->flags)) {
787                 err = send_settings_rsp(sk, MGMT_OP_SET_CONNECTABLE, hdev);
788                 goto failed;
789         }
790
791         cmd = mgmt_pending_add(sk, MGMT_OP_SET_CONNECTABLE, hdev, data, len);
792         if (!cmd) {
793                 err = -ENOMEM;
794                 goto failed;
795         }
796
797         if (cp->val)
798                 scan = SCAN_PAGE;
799         else
800                 scan = 0;
801
802         err = hci_send_cmd(hdev, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);
803         if (err < 0)
804                 mgmt_pending_remove(cmd);
805
806 failed:
807         hci_dev_unlock(hdev);
808         hci_dev_put(hdev);
809
810         return err;
811 }
812
813 static int mgmt_event(u16 event, struct hci_dev *hdev, void *data,
814                                         u16 data_len, struct sock *skip_sk)
815 {
816         struct sk_buff *skb;
817         struct mgmt_hdr *hdr;
818
819         skb = alloc_skb(sizeof(*hdr) + data_len, GFP_ATOMIC);
820         if (!skb)
821                 return -ENOMEM;
822
823         bt_cb(skb)->channel = HCI_CHANNEL_CONTROL;
824
825         hdr = (void *) skb_put(skb, sizeof(*hdr));
826         hdr->opcode = cpu_to_le16(event);
827         if (hdev)
828                 hdr->index = cpu_to_le16(hdev->id);
829         else
830                 hdr->index = cpu_to_le16(MGMT_INDEX_NONE);
831         hdr->len = cpu_to_le16(data_len);
832
833         if (data)
834                 memcpy(skb_put(skb, data_len), data, data_len);
835
836         hci_send_to_sock(NULL, skb, skip_sk);
837         kfree_skb(skb);
838
839         return 0;
840 }
841
842 static int set_pairable(struct sock *sk, u16 index, unsigned char *data,
843                                                                         u16 len)
844 {
845         struct mgmt_mode *cp;
846         struct hci_dev *hdev;
847         __le32 ev;
848         int err;
849
850         cp = (void *) data;
851
852         BT_DBG("request for hci%u", index);
853
854         if (len != sizeof(*cp))
855                 return cmd_status(sk, index, MGMT_OP_SET_PAIRABLE,
856                                                 MGMT_STATUS_INVALID_PARAMS);
857
858         hdev = hci_dev_get(index);
859         if (!hdev)
860                 return cmd_status(sk, index, MGMT_OP_SET_PAIRABLE,
861                                                 MGMT_STATUS_INVALID_PARAMS);
862
863         hci_dev_lock(hdev);
864
865         if (cp->val)
866                 set_bit(HCI_PAIRABLE, &hdev->flags);
867         else
868                 clear_bit(HCI_PAIRABLE, &hdev->flags);
869
870         err = send_settings_rsp(sk, MGMT_OP_SET_PAIRABLE, hdev);
871         if (err < 0)
872                 goto failed;
873
874         ev = cpu_to_le32(get_current_settings(hdev));
875
876         err = mgmt_event(MGMT_EV_NEW_SETTINGS, hdev, &ev, sizeof(ev), sk);
877
878 failed:
879         hci_dev_unlock(hdev);
880         hci_dev_put(hdev);
881
882         return err;
883 }
884
885 static int add_uuid(struct sock *sk, u16 index, unsigned char *data, u16 len)
886 {
887         struct mgmt_cp_add_uuid *cp;
888         struct hci_dev *hdev;
889         struct bt_uuid *uuid;
890         int err;
891
892         cp = (void *) data;
893
894         BT_DBG("request for hci%u", index);
895
896         if (len != sizeof(*cp))
897                 return cmd_status(sk, index, MGMT_OP_ADD_UUID,
898                                                 MGMT_STATUS_INVALID_PARAMS);
899
900         hdev = hci_dev_get(index);
901         if (!hdev)
902                 return cmd_status(sk, index, MGMT_OP_ADD_UUID,
903                                                 MGMT_STATUS_INVALID_PARAMS);
904
905         hci_dev_lock(hdev);
906
907         uuid = kmalloc(sizeof(*uuid), GFP_ATOMIC);
908         if (!uuid) {
909                 err = -ENOMEM;
910                 goto failed;
911         }
912
913         memcpy(uuid->uuid, cp->uuid, 16);
914         uuid->svc_hint = cp->svc_hint;
915
916         list_add(&uuid->list, &hdev->uuids);
917
918         err = update_class(hdev);
919         if (err < 0)
920                 goto failed;
921
922         err = update_eir(hdev);
923         if (err < 0)
924                 goto failed;
925
926         err = cmd_complete(sk, index, MGMT_OP_ADD_UUID, NULL, 0);
927
928 failed:
929         hci_dev_unlock(hdev);
930         hci_dev_put(hdev);
931
932         return err;
933 }
934
935 static int remove_uuid(struct sock *sk, u16 index, unsigned char *data, u16 len)
936 {
937         struct list_head *p, *n;
938         struct mgmt_cp_remove_uuid *cp;
939         struct hci_dev *hdev;
940         u8 bt_uuid_any[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
941         int err, found;
942
943         cp = (void *) data;
944
945         BT_DBG("request for hci%u", index);
946
947         if (len != sizeof(*cp))
948                 return cmd_status(sk, index, MGMT_OP_REMOVE_UUID,
949                                                 MGMT_STATUS_INVALID_PARAMS);
950
951         hdev = hci_dev_get(index);
952         if (!hdev)
953                 return cmd_status(sk, index, MGMT_OP_REMOVE_UUID,
954                                                 MGMT_STATUS_INVALID_PARAMS);
955
956         hci_dev_lock(hdev);
957
958         if (memcmp(cp->uuid, bt_uuid_any, 16) == 0) {
959                 err = hci_uuids_clear(hdev);
960                 goto unlock;
961         }
962
963         found = 0;
964
965         list_for_each_safe(p, n, &hdev->uuids) {
966                 struct bt_uuid *match = list_entry(p, struct bt_uuid, list);
967
968                 if (memcmp(match->uuid, cp->uuid, 16) != 0)
969                         continue;
970
971                 list_del(&match->list);
972                 found++;
973         }
974
975         if (found == 0) {
976                 err = cmd_status(sk, index, MGMT_OP_REMOVE_UUID,
977                                                 MGMT_STATUS_INVALID_PARAMS);
978                 goto unlock;
979         }
980
981         err = update_class(hdev);
982         if (err < 0)
983                 goto unlock;
984
985         err = update_eir(hdev);
986         if (err < 0)
987                 goto unlock;
988
989         err = cmd_complete(sk, index, MGMT_OP_REMOVE_UUID, NULL, 0);
990
991 unlock:
992         hci_dev_unlock(hdev);
993         hci_dev_put(hdev);
994
995         return err;
996 }
997
998 static int set_dev_class(struct sock *sk, u16 index, unsigned char *data,
999                                                                         u16 len)
1000 {
1001         struct hci_dev *hdev;
1002         struct mgmt_cp_set_dev_class *cp;
1003         int err;
1004
1005         cp = (void *) data;
1006
1007         BT_DBG("request for hci%u", index);
1008
1009         if (len != sizeof(*cp))
1010                 return cmd_status(sk, index, MGMT_OP_SET_DEV_CLASS,
1011                                                 MGMT_STATUS_INVALID_PARAMS);
1012
1013         hdev = hci_dev_get(index);
1014         if (!hdev)
1015                 return cmd_status(sk, index, MGMT_OP_SET_DEV_CLASS,
1016                                                 MGMT_STATUS_INVALID_PARAMS);
1017
1018         hci_dev_lock(hdev);
1019
1020         hdev->major_class = cp->major;
1021         hdev->minor_class = cp->minor;
1022
1023         if (test_and_clear_bit(HCI_SERVICE_CACHE, &hdev->flags)) {
1024                 hci_dev_unlock(hdev);
1025                 cancel_delayed_work_sync(&hdev->service_cache);
1026                 hci_dev_lock(hdev);
1027                 update_eir(hdev);
1028         }
1029
1030         err = update_class(hdev);
1031
1032         if (err == 0)
1033                 err = cmd_complete(sk, index, MGMT_OP_SET_DEV_CLASS, NULL, 0);
1034
1035         hci_dev_unlock(hdev);
1036         hci_dev_put(hdev);
1037
1038         return err;
1039 }
1040
1041 static int load_link_keys(struct sock *sk, u16 index, unsigned char *data,
1042                                                                 u16 len)
1043 {
1044         struct hci_dev *hdev;
1045         struct mgmt_cp_load_link_keys *cp;
1046         u16 key_count, expected_len;
1047         int i;
1048
1049         cp = (void *) data;
1050
1051         if (len < sizeof(*cp))
1052                 return cmd_status(sk, index, MGMT_OP_LOAD_LINK_KEYS,
1053                                                 MGMT_STATUS_INVALID_PARAMS);
1054
1055         key_count = get_unaligned_le16(&cp->key_count);
1056
1057         expected_len = sizeof(*cp) + key_count *
1058                                         sizeof(struct mgmt_link_key_info);
1059         if (expected_len != len) {
1060                 BT_ERR("load_link_keys: expected %u bytes, got %u bytes",
1061                                                         len, expected_len);
1062                 return cmd_status(sk, index, MGMT_OP_LOAD_LINK_KEYS,
1063                                                 MGMT_STATUS_INVALID_PARAMS);
1064         }
1065
1066         hdev = hci_dev_get(index);
1067         if (!hdev)
1068                 return cmd_status(sk, index, MGMT_OP_LOAD_LINK_KEYS,
1069                                                 MGMT_STATUS_INVALID_PARAMS);
1070
1071         BT_DBG("hci%u debug_keys %u key_count %u", index, cp->debug_keys,
1072                                                                 key_count);
1073
1074         hci_dev_lock(hdev);
1075
1076         hci_link_keys_clear(hdev);
1077
1078         set_bit(HCI_LINK_KEYS, &hdev->flags);
1079
1080         if (cp->debug_keys)
1081                 set_bit(HCI_DEBUG_KEYS, &hdev->flags);
1082         else
1083                 clear_bit(HCI_DEBUG_KEYS, &hdev->flags);
1084
1085         for (i = 0; i < key_count; i++) {
1086                 struct mgmt_link_key_info *key = &cp->keys[i];
1087
1088                 hci_add_link_key(hdev, NULL, 0, &key->bdaddr, key->val, key->type,
1089                                                                 key->pin_len);
1090         }
1091
1092         cmd_complete(sk, index, MGMT_OP_LOAD_LINK_KEYS, NULL, 0);
1093
1094         hci_dev_unlock(hdev);
1095         hci_dev_put(hdev);
1096
1097         return 0;
1098 }
1099
1100 static int remove_keys(struct sock *sk, u16 index, unsigned char *data,
1101                                                                 u16 len)
1102 {
1103         struct hci_dev *hdev;
1104         struct mgmt_cp_remove_keys *cp;
1105         struct mgmt_rp_remove_keys rp;
1106         struct hci_cp_disconnect dc;
1107         struct pending_cmd *cmd;
1108         struct hci_conn *conn;
1109         int err;
1110
1111         cp = (void *) data;
1112
1113         if (len != sizeof(*cp))
1114                 return cmd_status(sk, index, MGMT_OP_REMOVE_KEYS,
1115                                                 MGMT_STATUS_INVALID_PARAMS);
1116
1117         hdev = hci_dev_get(index);
1118         if (!hdev)
1119                 return cmd_status(sk, index, MGMT_OP_REMOVE_KEYS,
1120                                                 MGMT_STATUS_INVALID_PARAMS);
1121
1122         hci_dev_lock(hdev);
1123
1124         memset(&rp, 0, sizeof(rp));
1125         bacpy(&rp.bdaddr, &cp->bdaddr);
1126         rp.status = MGMT_STATUS_FAILED;
1127
1128         err = hci_remove_link_key(hdev, &cp->bdaddr);
1129         if (err < 0) {
1130                 rp.status = MGMT_STATUS_NOT_PAIRED;
1131                 goto unlock;
1132         }
1133
1134         if (!test_bit(HCI_UP, &hdev->flags) || !cp->disconnect) {
1135                 err = cmd_complete(sk, index, MGMT_OP_REMOVE_KEYS, &rp,
1136                                                                 sizeof(rp));
1137                 goto unlock;
1138         }
1139
1140         conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
1141         if (!conn) {
1142                 err = cmd_complete(sk, index, MGMT_OP_REMOVE_KEYS, &rp,
1143                                                                 sizeof(rp));
1144                 goto unlock;
1145         }
1146
1147         cmd = mgmt_pending_add(sk, MGMT_OP_REMOVE_KEYS, hdev, cp, sizeof(*cp));
1148         if (!cmd) {
1149                 err = -ENOMEM;
1150                 goto unlock;
1151         }
1152
1153         put_unaligned_le16(conn->handle, &dc.handle);
1154         dc.reason = 0x13; /* Remote User Terminated Connection */
1155         err = hci_send_cmd(hdev, HCI_OP_DISCONNECT, sizeof(dc), &dc);
1156         if (err < 0)
1157                 mgmt_pending_remove(cmd);
1158
1159 unlock:
1160         if (err < 0)
1161                 err = cmd_complete(sk, index, MGMT_OP_REMOVE_KEYS, &rp,
1162                                                                 sizeof(rp));
1163         hci_dev_unlock(hdev);
1164         hci_dev_put(hdev);
1165
1166         return err;
1167 }
1168
1169 static int disconnect(struct sock *sk, u16 index, unsigned char *data, u16 len)
1170 {
1171         struct hci_dev *hdev;
1172         struct mgmt_cp_disconnect *cp;
1173         struct hci_cp_disconnect dc;
1174         struct pending_cmd *cmd;
1175         struct hci_conn *conn;
1176         int err;
1177
1178         BT_DBG("");
1179
1180         cp = (void *) data;
1181
1182         if (len != sizeof(*cp))
1183                 return cmd_status(sk, index, MGMT_OP_DISCONNECT,
1184                                                 MGMT_STATUS_INVALID_PARAMS);
1185
1186         hdev = hci_dev_get(index);
1187         if (!hdev)
1188                 return cmd_status(sk, index, MGMT_OP_DISCONNECT,
1189                                                 MGMT_STATUS_INVALID_PARAMS);
1190
1191         hci_dev_lock(hdev);
1192
1193         if (!test_bit(HCI_UP, &hdev->flags)) {
1194                 err = cmd_status(sk, index, MGMT_OP_DISCONNECT,
1195                                                 MGMT_STATUS_NOT_POWERED);
1196                 goto failed;
1197         }
1198
1199         if (mgmt_pending_find(MGMT_OP_DISCONNECT, hdev)) {
1200                 err = cmd_status(sk, index, MGMT_OP_DISCONNECT,
1201                                                         MGMT_STATUS_BUSY);
1202                 goto failed;
1203         }
1204
1205         conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
1206         if (!conn)
1207                 conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &cp->bdaddr);
1208
1209         if (!conn) {
1210                 err = cmd_status(sk, index, MGMT_OP_DISCONNECT,
1211                                                 MGMT_STATUS_NOT_CONNECTED);
1212                 goto failed;
1213         }
1214
1215         cmd = mgmt_pending_add(sk, MGMT_OP_DISCONNECT, hdev, data, len);
1216         if (!cmd) {
1217                 err = -ENOMEM;
1218                 goto failed;
1219         }
1220
1221         put_unaligned_le16(conn->handle, &dc.handle);
1222         dc.reason = 0x13; /* Remote User Terminated Connection */
1223
1224         err = hci_send_cmd(hdev, HCI_OP_DISCONNECT, sizeof(dc), &dc);
1225         if (err < 0)
1226                 mgmt_pending_remove(cmd);
1227
1228 failed:
1229         hci_dev_unlock(hdev);
1230         hci_dev_put(hdev);
1231
1232         return err;
1233 }
1234
1235 static u8 link_to_mgmt(u8 link_type, u8 addr_type)
1236 {
1237         switch (link_type) {
1238         case LE_LINK:
1239                 switch (addr_type) {
1240                 case ADDR_LE_DEV_PUBLIC:
1241                         return MGMT_ADDR_LE_PUBLIC;
1242                 case ADDR_LE_DEV_RANDOM:
1243                         return MGMT_ADDR_LE_RANDOM;
1244                 default:
1245                         return MGMT_ADDR_INVALID;
1246                 }
1247         case ACL_LINK:
1248                 return MGMT_ADDR_BREDR;
1249         default:
1250                 return MGMT_ADDR_INVALID;
1251         }
1252 }
1253
1254 static int get_connections(struct sock *sk, u16 index)
1255 {
1256         struct mgmt_rp_get_connections *rp;
1257         struct hci_dev *hdev;
1258         struct hci_conn *c;
1259         struct list_head *p;
1260         size_t rp_len;
1261         u16 count;
1262         int i, err;
1263
1264         BT_DBG("");
1265
1266         hdev = hci_dev_get(index);
1267         if (!hdev)
1268                 return cmd_status(sk, index, MGMT_OP_GET_CONNECTIONS,
1269                                                 MGMT_STATUS_INVALID_PARAMS);
1270
1271         hci_dev_lock(hdev);
1272
1273         count = 0;
1274         list_for_each(p, &hdev->conn_hash.list) {
1275                 count++;
1276         }
1277
1278         rp_len = sizeof(*rp) + (count * sizeof(struct mgmt_addr_info));
1279         rp = kmalloc(rp_len, GFP_ATOMIC);
1280         if (!rp) {
1281                 err = -ENOMEM;
1282                 goto unlock;
1283         }
1284
1285         put_unaligned_le16(count, &rp->conn_count);
1286
1287         i = 0;
1288         list_for_each_entry(c, &hdev->conn_hash.list, list) {
1289                 bacpy(&rp->addr[i].bdaddr, &c->dst);
1290                 rp->addr[i].type = link_to_mgmt(c->type, c->dst_type);
1291                 if (rp->addr[i].type == MGMT_ADDR_INVALID)
1292                         continue;
1293                 i++;
1294         }
1295
1296         /* Recalculate length in case of filtered SCO connections, etc */
1297         rp_len = sizeof(*rp) + (i * sizeof(struct mgmt_addr_info));
1298
1299         err = cmd_complete(sk, index, MGMT_OP_GET_CONNECTIONS, rp, rp_len);
1300
1301 unlock:
1302         kfree(rp);
1303         hci_dev_unlock(hdev);
1304         hci_dev_put(hdev);
1305         return err;
1306 }
1307
1308 static int send_pin_code_neg_reply(struct sock *sk, u16 index,
1309                 struct hci_dev *hdev, struct mgmt_cp_pin_code_neg_reply *cp)
1310 {
1311         struct pending_cmd *cmd;
1312         int err;
1313
1314         cmd = mgmt_pending_add(sk, MGMT_OP_PIN_CODE_NEG_REPLY, hdev, cp,
1315                                                                 sizeof(*cp));
1316         if (!cmd)
1317                 return -ENOMEM;
1318
1319         err = hci_send_cmd(hdev, HCI_OP_PIN_CODE_NEG_REPLY, sizeof(cp->bdaddr),
1320                                                                 &cp->bdaddr);
1321         if (err < 0)
1322                 mgmt_pending_remove(cmd);
1323
1324         return err;
1325 }
1326
1327 static int pin_code_reply(struct sock *sk, u16 index, unsigned char *data,
1328                                                                         u16 len)
1329 {
1330         struct hci_dev *hdev;
1331         struct hci_conn *conn;
1332         struct mgmt_cp_pin_code_reply *cp;
1333         struct mgmt_cp_pin_code_neg_reply ncp;
1334         struct hci_cp_pin_code_reply reply;
1335         struct pending_cmd *cmd;
1336         int err;
1337
1338         BT_DBG("");
1339
1340         cp = (void *) data;
1341
1342         if (len != sizeof(*cp))
1343                 return cmd_status(sk, index, MGMT_OP_PIN_CODE_REPLY,
1344                                                 MGMT_STATUS_INVALID_PARAMS);
1345
1346         hdev = hci_dev_get(index);
1347         if (!hdev)
1348                 return cmd_status(sk, index, MGMT_OP_PIN_CODE_REPLY,
1349                                                 MGMT_STATUS_INVALID_PARAMS);
1350
1351         hci_dev_lock(hdev);
1352
1353         if (!test_bit(HCI_UP, &hdev->flags)) {
1354                 err = cmd_status(sk, index, MGMT_OP_PIN_CODE_REPLY,
1355                                                 MGMT_STATUS_NOT_POWERED);
1356                 goto failed;
1357         }
1358
1359         conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
1360         if (!conn) {
1361                 err = cmd_status(sk, index, MGMT_OP_PIN_CODE_REPLY,
1362                                                 MGMT_STATUS_NOT_CONNECTED);
1363                 goto failed;
1364         }
1365
1366         if (conn->pending_sec_level == BT_SECURITY_HIGH && cp->pin_len != 16) {
1367                 bacpy(&ncp.bdaddr, &cp->bdaddr);
1368
1369                 BT_ERR("PIN code is not 16 bytes long");
1370
1371                 err = send_pin_code_neg_reply(sk, index, hdev, &ncp);
1372                 if (err >= 0)
1373                         err = cmd_status(sk, index, MGMT_OP_PIN_CODE_REPLY,
1374                                                 MGMT_STATUS_INVALID_PARAMS);
1375
1376                 goto failed;
1377         }
1378
1379         cmd = mgmt_pending_add(sk, MGMT_OP_PIN_CODE_REPLY, hdev, data, len);
1380         if (!cmd) {
1381                 err = -ENOMEM;
1382                 goto failed;
1383         }
1384
1385         bacpy(&reply.bdaddr, &cp->bdaddr);
1386         reply.pin_len = cp->pin_len;
1387         memcpy(reply.pin_code, cp->pin_code, sizeof(reply.pin_code));
1388
1389         err = hci_send_cmd(hdev, HCI_OP_PIN_CODE_REPLY, sizeof(reply), &reply);
1390         if (err < 0)
1391                 mgmt_pending_remove(cmd);
1392
1393 failed:
1394         hci_dev_unlock(hdev);
1395         hci_dev_put(hdev);
1396
1397         return err;
1398 }
1399
1400 static int pin_code_neg_reply(struct sock *sk, u16 index, unsigned char *data,
1401                                                                         u16 len)
1402 {
1403         struct hci_dev *hdev;
1404         struct mgmt_cp_pin_code_neg_reply *cp;
1405         int err;
1406
1407         BT_DBG("");
1408
1409         cp = (void *) data;
1410
1411         if (len != sizeof(*cp))
1412                 return cmd_status(sk, index, MGMT_OP_PIN_CODE_NEG_REPLY,
1413                                                 MGMT_STATUS_INVALID_PARAMS);
1414
1415         hdev = hci_dev_get(index);
1416         if (!hdev)
1417                 return cmd_status(sk, index, MGMT_OP_PIN_CODE_NEG_REPLY,
1418                                                 MGMT_STATUS_INVALID_PARAMS);
1419
1420         hci_dev_lock(hdev);
1421
1422         if (!test_bit(HCI_UP, &hdev->flags)) {
1423                 err = cmd_status(sk, index, MGMT_OP_PIN_CODE_NEG_REPLY,
1424                                                 MGMT_STATUS_NOT_POWERED);
1425                 goto failed;
1426         }
1427
1428         err = send_pin_code_neg_reply(sk, index, hdev, cp);
1429
1430 failed:
1431         hci_dev_unlock(hdev);
1432         hci_dev_put(hdev);
1433
1434         return err;
1435 }
1436
1437 static int set_io_capability(struct sock *sk, u16 index, unsigned char *data,
1438                                                                         u16 len)
1439 {
1440         struct hci_dev *hdev;
1441         struct mgmt_cp_set_io_capability *cp;
1442
1443         BT_DBG("");
1444
1445         cp = (void *) data;
1446
1447         if (len != sizeof(*cp))
1448                 return cmd_status(sk, index, MGMT_OP_SET_IO_CAPABILITY,
1449                                                 MGMT_STATUS_INVALID_PARAMS);
1450
1451         hdev = hci_dev_get(index);
1452         if (!hdev)
1453                 return cmd_status(sk, index, MGMT_OP_SET_IO_CAPABILITY,
1454                                                 MGMT_STATUS_INVALID_PARAMS);
1455
1456         hci_dev_lock(hdev);
1457
1458         hdev->io_capability = cp->io_capability;
1459
1460         BT_DBG("%s IO capability set to 0x%02x", hdev->name,
1461                                                         hdev->io_capability);
1462
1463         hci_dev_unlock(hdev);
1464         hci_dev_put(hdev);
1465
1466         return cmd_complete(sk, index, MGMT_OP_SET_IO_CAPABILITY, NULL, 0);
1467 }
1468
1469 static inline struct pending_cmd *find_pairing(struct hci_conn *conn)
1470 {
1471         struct hci_dev *hdev = conn->hdev;
1472         struct pending_cmd *cmd;
1473
1474         list_for_each_entry(cmd, &hdev->mgmt_pending, list) {
1475                 if (cmd->opcode != MGMT_OP_PAIR_DEVICE)
1476                         continue;
1477
1478                 if (cmd->user_data != conn)
1479                         continue;
1480
1481                 return cmd;
1482         }
1483
1484         return NULL;
1485 }
1486
1487 static void pairing_complete(struct pending_cmd *cmd, u8 status)
1488 {
1489         struct mgmt_rp_pair_device rp;
1490         struct hci_conn *conn = cmd->user_data;
1491
1492         bacpy(&rp.addr.bdaddr, &conn->dst);
1493         rp.addr.type = link_to_mgmt(conn->type, conn->dst_type);
1494         rp.status = status;
1495
1496         cmd_complete(cmd->sk, cmd->index, MGMT_OP_PAIR_DEVICE, &rp, sizeof(rp));
1497
1498         /* So we don't get further callbacks for this connection */
1499         conn->connect_cfm_cb = NULL;
1500         conn->security_cfm_cb = NULL;
1501         conn->disconn_cfm_cb = NULL;
1502
1503         hci_conn_put(conn);
1504
1505         mgmt_pending_remove(cmd);
1506 }
1507
1508 static void pairing_complete_cb(struct hci_conn *conn, u8 status)
1509 {
1510         struct pending_cmd *cmd;
1511
1512         BT_DBG("status %u", status);
1513
1514         cmd = find_pairing(conn);
1515         if (!cmd)
1516                 BT_DBG("Unable to find a pending command");
1517         else
1518                 pairing_complete(cmd, status);
1519 }
1520
1521 static int pair_device(struct sock *sk, u16 index, unsigned char *data, u16 len)
1522 {
1523         struct hci_dev *hdev;
1524         struct mgmt_cp_pair_device *cp;
1525         struct mgmt_rp_pair_device rp;
1526         struct pending_cmd *cmd;
1527         u8 sec_level, auth_type;
1528         struct hci_conn *conn;
1529         int err;
1530
1531         BT_DBG("");
1532
1533         cp = (void *) data;
1534
1535         if (len != sizeof(*cp))
1536                 return cmd_status(sk, index, MGMT_OP_PAIR_DEVICE,
1537                                                 MGMT_STATUS_INVALID_PARAMS);
1538
1539         hdev = hci_dev_get(index);
1540         if (!hdev)
1541                 return cmd_status(sk, index, MGMT_OP_PAIR_DEVICE,
1542                                                 MGMT_STATUS_INVALID_PARAMS);
1543
1544         hci_dev_lock(hdev);
1545
1546         sec_level = BT_SECURITY_MEDIUM;
1547         if (cp->io_cap == 0x03)
1548                 auth_type = HCI_AT_DEDICATED_BONDING;
1549         else
1550                 auth_type = HCI_AT_DEDICATED_BONDING_MITM;
1551
1552         if (cp->addr.type == MGMT_ADDR_BREDR)
1553                 conn = hci_connect(hdev, ACL_LINK, &cp->addr.bdaddr, sec_level,
1554                                                                 auth_type);
1555         else
1556                 conn = hci_connect(hdev, LE_LINK, &cp->addr.bdaddr, sec_level,
1557                                                                 auth_type);
1558
1559         memset(&rp, 0, sizeof(rp));
1560         bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
1561         rp.addr.type = cp->addr.type;
1562
1563         if (IS_ERR(conn)) {
1564                 rp.status = -PTR_ERR(conn);
1565                 err = cmd_complete(sk, index, MGMT_OP_PAIR_DEVICE,
1566                                                         &rp, sizeof(rp));
1567                 goto unlock;
1568         }
1569
1570         if (conn->connect_cfm_cb) {
1571                 hci_conn_put(conn);
1572                 rp.status = EBUSY;
1573                 err = cmd_complete(sk, index, MGMT_OP_PAIR_DEVICE,
1574                                                         &rp, sizeof(rp));
1575                 goto unlock;
1576         }
1577
1578         cmd = mgmt_pending_add(sk, MGMT_OP_PAIR_DEVICE, hdev, data, len);
1579         if (!cmd) {
1580                 err = -ENOMEM;
1581                 hci_conn_put(conn);
1582                 goto unlock;
1583         }
1584
1585         /* For LE, just connecting isn't a proof that the pairing finished */
1586         if (cp->addr.type == MGMT_ADDR_BREDR)
1587                 conn->connect_cfm_cb = pairing_complete_cb;
1588
1589         conn->security_cfm_cb = pairing_complete_cb;
1590         conn->disconn_cfm_cb = pairing_complete_cb;
1591         conn->io_capability = cp->io_cap;
1592         cmd->user_data = conn;
1593
1594         if (conn->state == BT_CONNECTED &&
1595                                 hci_conn_security(conn, sec_level, auth_type))
1596                 pairing_complete(cmd, 0);
1597
1598         err = 0;
1599
1600 unlock:
1601         hci_dev_unlock(hdev);
1602         hci_dev_put(hdev);
1603
1604         return err;
1605 }
1606
1607 static int user_pairing_resp(struct sock *sk, u16 index, bdaddr_t *bdaddr,
1608                                         u16 mgmt_op, u16 hci_op, __le32 passkey)
1609 {
1610         struct pending_cmd *cmd;
1611         struct hci_dev *hdev;
1612         struct hci_conn *conn;
1613         int err;
1614
1615         hdev = hci_dev_get(index);
1616         if (!hdev)
1617                 return cmd_status(sk, index, mgmt_op,
1618                                                 MGMT_STATUS_INVALID_PARAMS);
1619
1620         hci_dev_lock(hdev);
1621
1622         if (!test_bit(HCI_UP, &hdev->flags)) {
1623                 err = cmd_status(sk, index, mgmt_op, MGMT_STATUS_NOT_POWERED);
1624                 goto done;
1625         }
1626
1627         /*
1628          * Check for an existing ACL link, if present pair via
1629          * HCI commands.
1630          *
1631          * If no ACL link is present, check for an LE link and if
1632          * present, pair via the SMP engine.
1633          *
1634          * If neither ACL nor LE links are present, fail with error.
1635          */
1636         conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, bdaddr);
1637         if (!conn) {
1638                 conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, bdaddr);
1639                 if (!conn) {
1640                         err = cmd_status(sk, index, mgmt_op,
1641                                                 MGMT_STATUS_NOT_CONNECTED);
1642                         goto done;
1643                 }
1644
1645                 /* Continue with pairing via SMP */
1646                 err = smp_user_confirm_reply(conn, mgmt_op, passkey);
1647
1648                 if (!err)
1649                         err = cmd_status(sk, index, mgmt_op,
1650                                                         MGMT_STATUS_SUCCESS);
1651                 else
1652                         err = cmd_status(sk, index, mgmt_op,
1653                                                         MGMT_STATUS_FAILED);
1654
1655                 goto done;
1656         }
1657
1658         cmd = mgmt_pending_add(sk, mgmt_op, hdev, bdaddr, sizeof(*bdaddr));
1659         if (!cmd) {
1660                 err = -ENOMEM;
1661                 goto done;
1662         }
1663
1664         /* Continue with pairing via HCI */
1665         if (hci_op == HCI_OP_USER_PASSKEY_REPLY) {
1666                 struct hci_cp_user_passkey_reply cp;
1667
1668                 bacpy(&cp.bdaddr, bdaddr);
1669                 cp.passkey = passkey;
1670                 err = hci_send_cmd(hdev, hci_op, sizeof(cp), &cp);
1671         } else
1672                 err = hci_send_cmd(hdev, hci_op, sizeof(*bdaddr), bdaddr);
1673
1674         if (err < 0)
1675                 mgmt_pending_remove(cmd);
1676
1677 done:
1678         hci_dev_unlock(hdev);
1679         hci_dev_put(hdev);
1680
1681         return err;
1682 }
1683
1684 static int user_confirm_reply(struct sock *sk, u16 index, void *data, u16 len)
1685 {
1686         struct mgmt_cp_user_confirm_reply *cp = (void *) data;
1687
1688         BT_DBG("");
1689
1690         if (len != sizeof(*cp))
1691                 return cmd_status(sk, index, MGMT_OP_USER_CONFIRM_REPLY,
1692                                                 MGMT_STATUS_INVALID_PARAMS);
1693
1694         return user_pairing_resp(sk, index, &cp->bdaddr,
1695                         MGMT_OP_USER_CONFIRM_REPLY,
1696                         HCI_OP_USER_CONFIRM_REPLY, 0);
1697 }
1698
1699 static int user_confirm_neg_reply(struct sock *sk, u16 index, void *data,
1700                                                                         u16 len)
1701 {
1702         struct mgmt_cp_user_confirm_neg_reply *cp = data;
1703
1704         BT_DBG("");
1705
1706         if (len != sizeof(*cp))
1707                 return cmd_status(sk, index, MGMT_OP_USER_CONFIRM_NEG_REPLY,
1708                                                 MGMT_STATUS_INVALID_PARAMS);
1709
1710         return user_pairing_resp(sk, index, &cp->bdaddr,
1711                         MGMT_OP_USER_CONFIRM_NEG_REPLY,
1712                         HCI_OP_USER_CONFIRM_NEG_REPLY, 0);
1713 }
1714
1715 static int user_passkey_reply(struct sock *sk, u16 index, void *data, u16 len)
1716 {
1717         struct mgmt_cp_user_passkey_reply *cp = (void *) data;
1718
1719         BT_DBG("");
1720
1721         if (len != sizeof(*cp))
1722                 return cmd_status(sk, index, MGMT_OP_USER_PASSKEY_REPLY,
1723                                                                         EINVAL);
1724
1725         return user_pairing_resp(sk, index, &cp->bdaddr,
1726                         MGMT_OP_USER_PASSKEY_REPLY,
1727                         HCI_OP_USER_PASSKEY_REPLY, cp->passkey);
1728 }
1729
1730 static int user_passkey_neg_reply(struct sock *sk, u16 index, void *data,
1731                                                                         u16 len)
1732 {
1733         struct mgmt_cp_user_passkey_neg_reply *cp = (void *) data;
1734
1735         BT_DBG("");
1736
1737         if (len != sizeof(*cp))
1738                 return cmd_status(sk, index, MGMT_OP_USER_PASSKEY_NEG_REPLY,
1739                                                                         EINVAL);
1740
1741         return user_pairing_resp(sk, index, &cp->bdaddr,
1742                         MGMT_OP_USER_PASSKEY_NEG_REPLY,
1743                         HCI_OP_USER_PASSKEY_NEG_REPLY, 0);
1744 }
1745
1746 static int set_local_name(struct sock *sk, u16 index, unsigned char *data,
1747                                                                 u16 len)
1748 {
1749         struct mgmt_cp_set_local_name *mgmt_cp = (void *) data;
1750         struct hci_cp_write_local_name hci_cp;
1751         struct hci_dev *hdev;
1752         struct pending_cmd *cmd;
1753         int err;
1754
1755         BT_DBG("");
1756
1757         if (len != sizeof(*mgmt_cp))
1758                 return cmd_status(sk, index, MGMT_OP_SET_LOCAL_NAME,
1759                                                 MGMT_STATUS_INVALID_PARAMS);
1760
1761         hdev = hci_dev_get(index);
1762         if (!hdev)
1763                 return cmd_status(sk, index, MGMT_OP_SET_LOCAL_NAME,
1764                                                 MGMT_STATUS_INVALID_PARAMS);
1765
1766         hci_dev_lock(hdev);
1767
1768         cmd = mgmt_pending_add(sk, MGMT_OP_SET_LOCAL_NAME, hdev, data, len);
1769         if (!cmd) {
1770                 err = -ENOMEM;
1771                 goto failed;
1772         }
1773
1774         memcpy(hci_cp.name, mgmt_cp->name, sizeof(hci_cp.name));
1775         err = hci_send_cmd(hdev, HCI_OP_WRITE_LOCAL_NAME, sizeof(hci_cp),
1776                                                                 &hci_cp);
1777         if (err < 0)
1778                 mgmt_pending_remove(cmd);
1779
1780 failed:
1781         hci_dev_unlock(hdev);
1782         hci_dev_put(hdev);
1783
1784         return err;
1785 }
1786
1787 static int read_local_oob_data(struct sock *sk, u16 index)
1788 {
1789         struct hci_dev *hdev;
1790         struct pending_cmd *cmd;
1791         int err;
1792
1793         BT_DBG("hci%u", index);
1794
1795         hdev = hci_dev_get(index);
1796         if (!hdev)
1797                 return cmd_status(sk, index, MGMT_OP_READ_LOCAL_OOB_DATA,
1798                                                 MGMT_STATUS_INVALID_PARAMS);
1799
1800         hci_dev_lock(hdev);
1801
1802         if (!test_bit(HCI_UP, &hdev->flags)) {
1803                 err = cmd_status(sk, index, MGMT_OP_READ_LOCAL_OOB_DATA,
1804                                                 MGMT_STATUS_NOT_POWERED);
1805                 goto unlock;
1806         }
1807
1808         if (!(hdev->features[6] & LMP_SIMPLE_PAIR)) {
1809                 err = cmd_status(sk, index, MGMT_OP_READ_LOCAL_OOB_DATA,
1810                                                 MGMT_STATUS_NOT_SUPPORTED);
1811                 goto unlock;
1812         }
1813
1814         if (mgmt_pending_find(MGMT_OP_READ_LOCAL_OOB_DATA, hdev)) {
1815                 err = cmd_status(sk, index, MGMT_OP_READ_LOCAL_OOB_DATA,
1816                                                         MGMT_STATUS_BUSY);
1817                 goto unlock;
1818         }
1819
1820         cmd = mgmt_pending_add(sk, MGMT_OP_READ_LOCAL_OOB_DATA, hdev, NULL, 0);
1821         if (!cmd) {
1822                 err = -ENOMEM;
1823                 goto unlock;
1824         }
1825
1826         err = hci_send_cmd(hdev, HCI_OP_READ_LOCAL_OOB_DATA, 0, NULL);
1827         if (err < 0)
1828                 mgmt_pending_remove(cmd);
1829
1830 unlock:
1831         hci_dev_unlock(hdev);
1832         hci_dev_put(hdev);
1833
1834         return err;
1835 }
1836
1837 static int add_remote_oob_data(struct sock *sk, u16 index, unsigned char *data,
1838                                                                         u16 len)
1839 {
1840         struct hci_dev *hdev;
1841         struct mgmt_cp_add_remote_oob_data *cp = (void *) data;
1842         int err;
1843
1844         BT_DBG("hci%u ", index);
1845
1846         if (len != sizeof(*cp))
1847                 return cmd_status(sk, index, MGMT_OP_ADD_REMOTE_OOB_DATA,
1848                                                 MGMT_STATUS_INVALID_PARAMS);
1849
1850         hdev = hci_dev_get(index);
1851         if (!hdev)
1852                 return cmd_status(sk, index, MGMT_OP_ADD_REMOTE_OOB_DATA,
1853                                                 MGMT_STATUS_INVALID_PARAMS);
1854
1855         hci_dev_lock(hdev);
1856
1857         err = hci_add_remote_oob_data(hdev, &cp->bdaddr, cp->hash,
1858                                                                 cp->randomizer);
1859         if (err < 0)
1860                 err = cmd_status(sk, index, MGMT_OP_ADD_REMOTE_OOB_DATA,
1861                                                         MGMT_STATUS_FAILED);
1862         else
1863                 err = cmd_complete(sk, index, MGMT_OP_ADD_REMOTE_OOB_DATA, NULL,
1864                                                                         0);
1865
1866         hci_dev_unlock(hdev);
1867         hci_dev_put(hdev);
1868
1869         return err;
1870 }
1871
1872 static int remove_remote_oob_data(struct sock *sk, u16 index,
1873                                                 unsigned char *data, u16 len)
1874 {
1875         struct hci_dev *hdev;
1876         struct mgmt_cp_remove_remote_oob_data *cp = (void *) data;
1877         int err;
1878
1879         BT_DBG("hci%u ", index);
1880
1881         if (len != sizeof(*cp))
1882                 return cmd_status(sk, index, MGMT_OP_REMOVE_REMOTE_OOB_DATA,
1883                                                 MGMT_STATUS_INVALID_PARAMS);
1884
1885         hdev = hci_dev_get(index);
1886         if (!hdev)
1887                 return cmd_status(sk, index, MGMT_OP_REMOVE_REMOTE_OOB_DATA,
1888                                                 MGMT_STATUS_INVALID_PARAMS);
1889
1890         hci_dev_lock(hdev);
1891
1892         err = hci_remove_remote_oob_data(hdev, &cp->bdaddr);
1893         if (err < 0)
1894                 err = cmd_status(sk, index, MGMT_OP_REMOVE_REMOTE_OOB_DATA,
1895                                                 MGMT_STATUS_INVALID_PARAMS);
1896         else
1897                 err = cmd_complete(sk, index, MGMT_OP_REMOVE_REMOTE_OOB_DATA,
1898                                                                 NULL, 0);
1899
1900         hci_dev_unlock(hdev);
1901         hci_dev_put(hdev);
1902
1903         return err;
1904 }
1905
1906 static int start_discovery(struct sock *sk, u16 index,
1907                                                 unsigned char *data, u16 len)
1908 {
1909         struct mgmt_cp_start_discovery *cp = (void *) data;
1910         struct pending_cmd *cmd;
1911         struct hci_dev *hdev;
1912         int err;
1913
1914         BT_DBG("hci%u", index);
1915
1916         if (len != sizeof(*cp))
1917                 return cmd_status(sk, index, MGMT_OP_START_DISCOVERY,
1918                                                 MGMT_STATUS_INVALID_PARAMS);
1919
1920         hdev = hci_dev_get(index);
1921         if (!hdev)
1922                 return cmd_status(sk, index, MGMT_OP_START_DISCOVERY,
1923                                                 MGMT_STATUS_INVALID_PARAMS);
1924
1925         hci_dev_lock(hdev);
1926
1927         if (!test_bit(HCI_UP, &hdev->flags)) {
1928                 err = cmd_status(sk, index, MGMT_OP_START_DISCOVERY,
1929                                                 MGMT_STATUS_NOT_POWERED);
1930                 goto failed;
1931         }
1932
1933         cmd = mgmt_pending_add(sk, MGMT_OP_START_DISCOVERY, hdev, NULL, 0);
1934         if (!cmd) {
1935                 err = -ENOMEM;
1936                 goto failed;
1937         }
1938
1939         err = hci_do_inquiry(hdev, INQUIRY_LEN_BREDR);
1940         if (err < 0)
1941                 mgmt_pending_remove(cmd);
1942
1943 failed:
1944         hci_dev_unlock(hdev);
1945         hci_dev_put(hdev);
1946
1947         return err;
1948 }
1949
1950 static int stop_discovery(struct sock *sk, u16 index)
1951 {
1952         struct hci_dev *hdev;
1953         struct pending_cmd *cmd;
1954         int err;
1955
1956         BT_DBG("hci%u", index);
1957
1958         hdev = hci_dev_get(index);
1959         if (!hdev)
1960                 return cmd_status(sk, index, MGMT_OP_STOP_DISCOVERY,
1961                                                 MGMT_STATUS_INVALID_PARAMS);
1962
1963         hci_dev_lock(hdev);
1964
1965         cmd = mgmt_pending_add(sk, MGMT_OP_STOP_DISCOVERY, hdev, NULL, 0);
1966         if (!cmd) {
1967                 err = -ENOMEM;
1968                 goto failed;
1969         }
1970
1971         err = hci_cancel_inquiry(hdev);
1972         if (err < 0)
1973                 mgmt_pending_remove(cmd);
1974
1975 failed:
1976         hci_dev_unlock(hdev);
1977         hci_dev_put(hdev);
1978
1979         return err;
1980 }
1981
1982 static int block_device(struct sock *sk, u16 index, unsigned char *data,
1983                                                                 u16 len)
1984 {
1985         struct hci_dev *hdev;
1986         struct mgmt_cp_block_device *cp = (void *) data;
1987         int err;
1988
1989         BT_DBG("hci%u", index);
1990
1991         if (len != sizeof(*cp))
1992                 return cmd_status(sk, index, MGMT_OP_BLOCK_DEVICE,
1993                                                 MGMT_STATUS_INVALID_PARAMS);
1994
1995         hdev = hci_dev_get(index);
1996         if (!hdev)
1997                 return cmd_status(sk, index, MGMT_OP_BLOCK_DEVICE,
1998                                                 MGMT_STATUS_INVALID_PARAMS);
1999
2000         hci_dev_lock(hdev);
2001
2002         err = hci_blacklist_add(hdev, &cp->bdaddr);
2003         if (err < 0)
2004                 err = cmd_status(sk, index, MGMT_OP_BLOCK_DEVICE,
2005                                                         MGMT_STATUS_FAILED);
2006         else
2007                 err = cmd_complete(sk, index, MGMT_OP_BLOCK_DEVICE,
2008                                                         NULL, 0);
2009
2010         hci_dev_unlock(hdev);
2011         hci_dev_put(hdev);
2012
2013         return err;
2014 }
2015
2016 static int unblock_device(struct sock *sk, u16 index, unsigned char *data,
2017                                                                 u16 len)
2018 {
2019         struct hci_dev *hdev;
2020         struct mgmt_cp_unblock_device *cp = (void *) data;
2021         int err;
2022
2023         BT_DBG("hci%u", index);
2024
2025         if (len != sizeof(*cp))
2026                 return cmd_status(sk, index, MGMT_OP_UNBLOCK_DEVICE,
2027                                                 MGMT_STATUS_INVALID_PARAMS);
2028
2029         hdev = hci_dev_get(index);
2030         if (!hdev)
2031                 return cmd_status(sk, index, MGMT_OP_UNBLOCK_DEVICE,
2032                                                 MGMT_STATUS_INVALID_PARAMS);
2033
2034         hci_dev_lock(hdev);
2035
2036         err = hci_blacklist_del(hdev, &cp->bdaddr);
2037
2038         if (err < 0)
2039                 err = cmd_status(sk, index, MGMT_OP_UNBLOCK_DEVICE,
2040                                                 MGMT_STATUS_INVALID_PARAMS);
2041         else
2042                 err = cmd_complete(sk, index, MGMT_OP_UNBLOCK_DEVICE,
2043                                                                 NULL, 0);
2044
2045         hci_dev_unlock(hdev);
2046         hci_dev_put(hdev);
2047
2048         return err;
2049 }
2050
2051 static int set_fast_connectable(struct sock *sk, u16 index,
2052                                         unsigned char *data, u16 len)
2053 {
2054         struct hci_dev *hdev;
2055         struct mgmt_mode *cp = (void *) data;
2056         struct hci_cp_write_page_scan_activity acp;
2057         u8 type;
2058         int err;
2059
2060         BT_DBG("hci%u", index);
2061
2062         if (len != sizeof(*cp))
2063                 return cmd_status(sk, index, MGMT_OP_SET_FAST_CONNECTABLE,
2064                                                 MGMT_STATUS_INVALID_PARAMS);
2065
2066         hdev = hci_dev_get(index);
2067         if (!hdev)
2068                 return cmd_status(sk, index, MGMT_OP_SET_FAST_CONNECTABLE,
2069                                                 MGMT_STATUS_INVALID_PARAMS);
2070
2071         hci_dev_lock(hdev);
2072
2073         if (cp->val) {
2074                 type = PAGE_SCAN_TYPE_INTERLACED;
2075                 acp.interval = 0x0024;  /* 22.5 msec page scan interval */
2076         } else {
2077                 type = PAGE_SCAN_TYPE_STANDARD; /* default */
2078                 acp.interval = 0x0800;  /* default 1.28 sec page scan */
2079         }
2080
2081         acp.window = 0x0012;    /* default 11.25 msec page scan window */
2082
2083         err = hci_send_cmd(hdev, HCI_OP_WRITE_PAGE_SCAN_ACTIVITY,
2084                                                 sizeof(acp), &acp);
2085         if (err < 0) {
2086                 err = cmd_status(sk, index, MGMT_OP_SET_FAST_CONNECTABLE,
2087                                                         MGMT_STATUS_FAILED);
2088                 goto done;
2089         }
2090
2091         err = hci_send_cmd(hdev, HCI_OP_WRITE_PAGE_SCAN_TYPE, 1, &type);
2092         if (err < 0) {
2093                 err = cmd_status(sk, index, MGMT_OP_SET_FAST_CONNECTABLE,
2094                                                         MGMT_STATUS_FAILED);
2095                 goto done;
2096         }
2097
2098         err = cmd_complete(sk, index, MGMT_OP_SET_FAST_CONNECTABLE,
2099                                                         NULL, 0);
2100 done:
2101         hci_dev_unlock(hdev);
2102         hci_dev_put(hdev);
2103
2104         return err;
2105 }
2106
2107 int mgmt_control(struct sock *sk, struct msghdr *msg, size_t msglen)
2108 {
2109         unsigned char *buf;
2110         struct mgmt_hdr *hdr;
2111         u16 opcode, index, len;
2112         int err;
2113
2114         BT_DBG("got %zu bytes", msglen);
2115
2116         if (msglen < sizeof(*hdr))
2117                 return -EINVAL;
2118
2119         buf = kmalloc(msglen, GFP_KERNEL);
2120         if (!buf)
2121                 return -ENOMEM;
2122
2123         if (memcpy_fromiovec(buf, msg->msg_iov, msglen)) {
2124                 err = -EFAULT;
2125                 goto done;
2126         }
2127
2128         hdr = (struct mgmt_hdr *) buf;
2129         opcode = get_unaligned_le16(&hdr->opcode);
2130         index = get_unaligned_le16(&hdr->index);
2131         len = get_unaligned_le16(&hdr->len);
2132
2133         if (len != msglen - sizeof(*hdr)) {
2134                 err = -EINVAL;
2135                 goto done;
2136         }
2137
2138         switch (opcode) {
2139         case MGMT_OP_READ_VERSION:
2140                 err = read_version(sk);
2141                 break;
2142         case MGMT_OP_READ_INDEX_LIST:
2143                 err = read_index_list(sk);
2144                 break;
2145         case MGMT_OP_READ_INFO:
2146                 err = read_controller_info(sk, index);
2147                 break;
2148         case MGMT_OP_SET_POWERED:
2149                 err = set_powered(sk, index, buf + sizeof(*hdr), len);
2150                 break;
2151         case MGMT_OP_SET_DISCOVERABLE:
2152                 err = set_discoverable(sk, index, buf + sizeof(*hdr), len);
2153                 break;
2154         case MGMT_OP_SET_CONNECTABLE:
2155                 err = set_connectable(sk, index, buf + sizeof(*hdr), len);
2156                 break;
2157         case MGMT_OP_SET_FAST_CONNECTABLE:
2158                 err = set_fast_connectable(sk, index, buf + sizeof(*hdr),
2159                                                                 len);
2160                 break;
2161         case MGMT_OP_SET_PAIRABLE:
2162                 err = set_pairable(sk, index, buf + sizeof(*hdr), len);
2163                 break;
2164         case MGMT_OP_ADD_UUID:
2165                 err = add_uuid(sk, index, buf + sizeof(*hdr), len);
2166                 break;
2167         case MGMT_OP_REMOVE_UUID:
2168                 err = remove_uuid(sk, index, buf + sizeof(*hdr), len);
2169                 break;
2170         case MGMT_OP_SET_DEV_CLASS:
2171                 err = set_dev_class(sk, index, buf + sizeof(*hdr), len);
2172                 break;
2173         case MGMT_OP_LOAD_LINK_KEYS:
2174                 err = load_link_keys(sk, index, buf + sizeof(*hdr), len);
2175                 break;
2176         case MGMT_OP_REMOVE_KEYS:
2177                 err = remove_keys(sk, index, buf + sizeof(*hdr), len);
2178                 break;
2179         case MGMT_OP_DISCONNECT:
2180                 err = disconnect(sk, index, buf + sizeof(*hdr), len);
2181                 break;
2182         case MGMT_OP_GET_CONNECTIONS:
2183                 err = get_connections(sk, index);
2184                 break;
2185         case MGMT_OP_PIN_CODE_REPLY:
2186                 err = pin_code_reply(sk, index, buf + sizeof(*hdr), len);
2187                 break;
2188         case MGMT_OP_PIN_CODE_NEG_REPLY:
2189                 err = pin_code_neg_reply(sk, index, buf + sizeof(*hdr), len);
2190                 break;
2191         case MGMT_OP_SET_IO_CAPABILITY:
2192                 err = set_io_capability(sk, index, buf + sizeof(*hdr), len);
2193                 break;
2194         case MGMT_OP_PAIR_DEVICE:
2195                 err = pair_device(sk, index, buf + sizeof(*hdr), len);
2196                 break;
2197         case MGMT_OP_USER_CONFIRM_REPLY:
2198                 err = user_confirm_reply(sk, index, buf + sizeof(*hdr), len);
2199                 break;
2200         case MGMT_OP_USER_CONFIRM_NEG_REPLY:
2201                 err = user_confirm_neg_reply(sk, index, buf + sizeof(*hdr),
2202                                                                         len);
2203                 break;
2204         case MGMT_OP_USER_PASSKEY_REPLY:
2205                 err = user_passkey_reply(sk, index, buf + sizeof(*hdr), len);
2206                 break;
2207         case MGMT_OP_USER_PASSKEY_NEG_REPLY:
2208                 err = user_passkey_neg_reply(sk, index, buf + sizeof(*hdr),
2209                                                                         len);
2210                 break;
2211         case MGMT_OP_SET_LOCAL_NAME:
2212                 err = set_local_name(sk, index, buf + sizeof(*hdr), len);
2213                 break;
2214         case MGMT_OP_READ_LOCAL_OOB_DATA:
2215                 err = read_local_oob_data(sk, index);
2216                 break;
2217         case MGMT_OP_ADD_REMOTE_OOB_DATA:
2218                 err = add_remote_oob_data(sk, index, buf + sizeof(*hdr), len);
2219                 break;
2220         case MGMT_OP_REMOVE_REMOTE_OOB_DATA:
2221                 err = remove_remote_oob_data(sk, index, buf + sizeof(*hdr),
2222                                                                         len);
2223                 break;
2224         case MGMT_OP_START_DISCOVERY:
2225                 err = start_discovery(sk, index, buf + sizeof(*hdr), len);
2226                 break;
2227         case MGMT_OP_STOP_DISCOVERY:
2228                 err = stop_discovery(sk, index);
2229                 break;
2230         case MGMT_OP_BLOCK_DEVICE:
2231                 err = block_device(sk, index, buf + sizeof(*hdr), len);
2232                 break;
2233         case MGMT_OP_UNBLOCK_DEVICE:
2234                 err = unblock_device(sk, index, buf + sizeof(*hdr), len);
2235                 break;
2236         default:
2237                 BT_DBG("Unknown op %u", opcode);
2238                 err = cmd_status(sk, index, opcode,
2239                                                 MGMT_STATUS_UNKNOWN_COMMAND);
2240                 break;
2241         }
2242
2243         if (err < 0)
2244                 goto done;
2245
2246         err = msglen;
2247
2248 done:
2249         kfree(buf);
2250         return err;
2251 }
2252
2253 static void cmd_status_rsp(struct pending_cmd *cmd, void *data)
2254 {
2255         u8 *status = data;
2256
2257         cmd_status(cmd->sk, cmd->index, cmd->opcode, *status);
2258         mgmt_pending_remove(cmd);
2259 }
2260
2261 int mgmt_index_added(struct hci_dev *hdev)
2262 {
2263         return mgmt_event(MGMT_EV_INDEX_ADDED, hdev, NULL, 0, NULL);
2264 }
2265
2266 int mgmt_index_removed(struct hci_dev *hdev)
2267 {
2268         u8 status = ENODEV;
2269
2270         mgmt_pending_foreach(0, hdev, cmd_status_rsp, &status);
2271
2272         return mgmt_event(MGMT_EV_INDEX_REMOVED, hdev, NULL, 0, NULL);
2273 }
2274
2275 struct cmd_lookup {
2276         u8 val;
2277         struct sock *sk;
2278         struct hci_dev *hdev;
2279 };
2280
2281 static void settings_rsp(struct pending_cmd *cmd, void *data)
2282 {
2283         struct cmd_lookup *match = data;
2284
2285         send_settings_rsp(cmd->sk, cmd->opcode, match->hdev);
2286
2287         list_del(&cmd->list);
2288
2289         if (match->sk == NULL) {
2290                 match->sk = cmd->sk;
2291                 sock_hold(match->sk);
2292         }
2293
2294         mgmt_pending_free(cmd);
2295 }
2296
2297 int mgmt_powered(struct hci_dev *hdev, u8 powered)
2298 {
2299         struct cmd_lookup match = { powered, NULL, hdev };
2300         __le32 ev;
2301         int ret;
2302
2303         mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, settings_rsp, &match);
2304
2305         if (!powered) {
2306                 u8 status = ENETDOWN;
2307                 mgmt_pending_foreach(0, hdev, cmd_status_rsp, &status);
2308         }
2309
2310         ev = cpu_to_le32(get_current_settings(hdev));
2311
2312         ret = mgmt_event(MGMT_EV_NEW_SETTINGS, hdev, &ev, sizeof(ev),
2313                                                                 match.sk);
2314
2315         if (match.sk)
2316                 sock_put(match.sk);
2317
2318         return ret;
2319 }
2320
2321 int mgmt_discoverable(struct hci_dev *hdev, u8 discoverable)
2322 {
2323         struct cmd_lookup match = { discoverable, NULL, hdev };
2324         __le32 ev;
2325         int ret;
2326
2327         mgmt_pending_foreach(MGMT_OP_SET_DISCOVERABLE, hdev, settings_rsp, &match);
2328
2329         ev = cpu_to_le32(get_current_settings(hdev));
2330
2331         ret = mgmt_event(MGMT_EV_NEW_SETTINGS, hdev, &ev, sizeof(ev),
2332                                                                 match.sk);
2333         if (match.sk)
2334                 sock_put(match.sk);
2335
2336         return ret;
2337 }
2338
2339 int mgmt_connectable(struct hci_dev *hdev, u8 connectable)
2340 {
2341         __le32 ev;
2342         struct cmd_lookup match = { connectable, NULL, hdev };
2343         int ret;
2344
2345         mgmt_pending_foreach(MGMT_OP_SET_CONNECTABLE, hdev, settings_rsp,
2346                                                                 &match);
2347
2348         ev = cpu_to_le32(get_current_settings(hdev));
2349
2350         ret = mgmt_event(MGMT_EV_NEW_SETTINGS, hdev, &ev, sizeof(ev), match.sk);
2351
2352         if (match.sk)
2353                 sock_put(match.sk);
2354
2355         return ret;
2356 }
2357
2358 int mgmt_write_scan_failed(struct hci_dev *hdev, u8 scan, u8 status)
2359 {
2360         u8 mgmt_err = mgmt_status(status);
2361
2362         if (scan & SCAN_PAGE)
2363                 mgmt_pending_foreach(MGMT_OP_SET_CONNECTABLE, hdev,
2364                                                 cmd_status_rsp, &mgmt_err);
2365
2366         if (scan & SCAN_INQUIRY)
2367                 mgmt_pending_foreach(MGMT_OP_SET_DISCOVERABLE, hdev,
2368                                                 cmd_status_rsp, &mgmt_err);
2369
2370         return 0;
2371 }
2372
2373 int mgmt_new_link_key(struct hci_dev *hdev, struct link_key *key,
2374                                                                 u8 persistent)
2375 {
2376         struct mgmt_ev_new_link_key ev;
2377
2378         memset(&ev, 0, sizeof(ev));
2379
2380         ev.store_hint = persistent;
2381         bacpy(&ev.key.bdaddr, &key->bdaddr);
2382         ev.key.type = key->type;
2383         memcpy(ev.key.val, key->val, 16);
2384         ev.key.pin_len = key->pin_len;
2385
2386         return mgmt_event(MGMT_EV_NEW_LINK_KEY, hdev, &ev, sizeof(ev), NULL);
2387 }
2388
2389 int mgmt_connected(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
2390                                                                 u8 addr_type)
2391 {
2392         struct mgmt_addr_info ev;
2393
2394         bacpy(&ev.bdaddr, bdaddr);
2395         ev.type = link_to_mgmt(link_type, addr_type);
2396
2397         return mgmt_event(MGMT_EV_CONNECTED, hdev, &ev, sizeof(ev), NULL);
2398 }
2399
2400 static void disconnect_rsp(struct pending_cmd *cmd, void *data)
2401 {
2402         struct mgmt_cp_disconnect *cp = cmd->param;
2403         struct sock **sk = data;
2404         struct mgmt_rp_disconnect rp;
2405
2406         bacpy(&rp.bdaddr, &cp->bdaddr);
2407         rp.status = 0;
2408
2409         cmd_complete(cmd->sk, cmd->index, MGMT_OP_DISCONNECT, &rp, sizeof(rp));
2410
2411         *sk = cmd->sk;
2412         sock_hold(*sk);
2413
2414         mgmt_pending_remove(cmd);
2415 }
2416
2417 static void remove_keys_rsp(struct pending_cmd *cmd, void *data)
2418 {
2419         u8 *status = data;
2420         struct mgmt_cp_remove_keys *cp = cmd->param;
2421         struct mgmt_rp_remove_keys rp;
2422
2423         memset(&rp, 0, sizeof(rp));
2424         bacpy(&rp.bdaddr, &cp->bdaddr);
2425         if (status != NULL)
2426                 rp.status = *status;
2427
2428         cmd_complete(cmd->sk, cmd->index, MGMT_OP_REMOVE_KEYS, &rp,
2429                                                                 sizeof(rp));
2430
2431         mgmt_pending_remove(cmd);
2432 }
2433
2434 int mgmt_disconnected(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
2435                                                                 u8 addr_type)
2436 {
2437         struct mgmt_addr_info ev;
2438         struct sock *sk = NULL;
2439         int err;
2440
2441         mgmt_pending_foreach(MGMT_OP_DISCONNECT, hdev, disconnect_rsp, &sk);
2442
2443         bacpy(&ev.bdaddr, bdaddr);
2444         ev.type = link_to_mgmt(link_type, addr_type);
2445
2446         err = mgmt_event(MGMT_EV_DISCONNECTED, hdev, &ev, sizeof(ev), sk);
2447
2448         if (sk)
2449                 sock_put(sk);
2450
2451         mgmt_pending_foreach(MGMT_OP_REMOVE_KEYS, hdev, remove_keys_rsp, NULL);
2452
2453         return err;
2454 }
2455
2456 int mgmt_disconnect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 status)
2457 {
2458         struct pending_cmd *cmd;
2459         u8 mgmt_err = mgmt_status(status);
2460         int err;
2461
2462         cmd = mgmt_pending_find(MGMT_OP_DISCONNECT, hdev);
2463         if (!cmd)
2464                 return -ENOENT;
2465
2466         if (bdaddr) {
2467                 struct mgmt_rp_disconnect rp;
2468
2469                 bacpy(&rp.bdaddr, bdaddr);
2470                 rp.status = status;
2471
2472                 err = cmd_complete(cmd->sk, cmd->index, MGMT_OP_DISCONNECT,
2473                                                         &rp, sizeof(rp));
2474         } else
2475                 err = cmd_status(cmd->sk, hdev->id, MGMT_OP_DISCONNECT,
2476                                                                 mgmt_err);
2477
2478         mgmt_pending_remove(cmd);
2479
2480         return err;
2481 }
2482
2483 int mgmt_connect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
2484                                                 u8 addr_type, u8 status)
2485 {
2486         struct mgmt_ev_connect_failed ev;
2487
2488         bacpy(&ev.addr.bdaddr, bdaddr);
2489         ev.addr.type = link_to_mgmt(link_type, addr_type);
2490         ev.status = mgmt_status(status);
2491
2492         return mgmt_event(MGMT_EV_CONNECT_FAILED, hdev, &ev, sizeof(ev), NULL);
2493 }
2494
2495 int mgmt_pin_code_request(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 secure)
2496 {
2497         struct mgmt_ev_pin_code_request ev;
2498
2499         bacpy(&ev.bdaddr, bdaddr);
2500         ev.secure = secure;
2501
2502         return mgmt_event(MGMT_EV_PIN_CODE_REQUEST, hdev, &ev, sizeof(ev),
2503                                                                         NULL);
2504 }
2505
2506 int mgmt_pin_code_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
2507                                                                 u8 status)
2508 {
2509         struct pending_cmd *cmd;
2510         struct mgmt_rp_pin_code_reply rp;
2511         int err;
2512
2513         cmd = mgmt_pending_find(MGMT_OP_PIN_CODE_REPLY, hdev);
2514         if (!cmd)
2515                 return -ENOENT;
2516
2517         bacpy(&rp.bdaddr, bdaddr);
2518         rp.status = mgmt_status(status);
2519
2520         err = cmd_complete(cmd->sk, hdev->id, MGMT_OP_PIN_CODE_REPLY, &rp,
2521                                                                 sizeof(rp));
2522
2523         mgmt_pending_remove(cmd);
2524
2525         return err;
2526 }
2527
2528 int mgmt_pin_code_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
2529                                                                 u8 status)
2530 {
2531         struct pending_cmd *cmd;
2532         struct mgmt_rp_pin_code_reply rp;
2533         int err;
2534
2535         cmd = mgmt_pending_find(MGMT_OP_PIN_CODE_NEG_REPLY, hdev);
2536         if (!cmd)
2537                 return -ENOENT;
2538
2539         bacpy(&rp.bdaddr, bdaddr);
2540         rp.status = mgmt_status(status);
2541
2542         err = cmd_complete(cmd->sk, hdev->id, MGMT_OP_PIN_CODE_NEG_REPLY, &rp,
2543                                                                 sizeof(rp));
2544
2545         mgmt_pending_remove(cmd);
2546
2547         return err;
2548 }
2549
2550 int mgmt_user_confirm_request(struct hci_dev *hdev, bdaddr_t *bdaddr,
2551                                                 __le32 value, u8 confirm_hint)
2552 {
2553         struct mgmt_ev_user_confirm_request ev;
2554
2555         BT_DBG("%s", hdev->name);
2556
2557         bacpy(&ev.bdaddr, bdaddr);
2558         ev.confirm_hint = confirm_hint;
2559         put_unaligned_le32(value, &ev.value);
2560
2561         return mgmt_event(MGMT_EV_USER_CONFIRM_REQUEST, hdev, &ev, sizeof(ev),
2562                                                                         NULL);
2563 }
2564
2565 int mgmt_user_passkey_request(struct hci_dev *hdev, bdaddr_t *bdaddr)
2566 {
2567         struct mgmt_ev_user_passkey_request ev;
2568
2569         BT_DBG("%s", hdev->name);
2570
2571         bacpy(&ev.bdaddr, bdaddr);
2572
2573         return mgmt_event(MGMT_EV_USER_PASSKEY_REQUEST, hdev, &ev, sizeof(ev),
2574                                                                         NULL);
2575 }
2576
2577 static int user_pairing_resp_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
2578                                                         u8 status, u8 opcode)
2579 {
2580         struct pending_cmd *cmd;
2581         struct mgmt_rp_user_confirm_reply rp;
2582         int err;
2583
2584         cmd = mgmt_pending_find(opcode, hdev);
2585         if (!cmd)
2586                 return -ENOENT;
2587
2588         bacpy(&rp.bdaddr, bdaddr);
2589         rp.status = mgmt_status(status);
2590         err = cmd_complete(cmd->sk, hdev->id, opcode, &rp, sizeof(rp));
2591
2592         mgmt_pending_remove(cmd);
2593
2594         return err;
2595 }
2596
2597 int mgmt_user_confirm_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
2598                                                                 u8 status)
2599 {
2600         return user_pairing_resp_complete(hdev, bdaddr, status,
2601                                                 MGMT_OP_USER_CONFIRM_REPLY);
2602 }
2603
2604 int mgmt_user_confirm_neg_reply_complete(struct hci_dev *hdev,
2605                                                 bdaddr_t *bdaddr, u8 status)
2606 {
2607         return user_pairing_resp_complete(hdev, bdaddr, status,
2608                                         MGMT_OP_USER_CONFIRM_NEG_REPLY);
2609 }
2610
2611 int mgmt_user_passkey_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
2612                                                                 u8 status)
2613 {
2614         return user_pairing_resp_complete(hdev, bdaddr, status,
2615                                                 MGMT_OP_USER_PASSKEY_REPLY);
2616 }
2617
2618 int mgmt_user_passkey_neg_reply_complete(struct hci_dev *hdev,
2619                                                 bdaddr_t *bdaddr, u8 status)
2620 {
2621         return user_pairing_resp_complete(hdev, bdaddr, status,
2622                                         MGMT_OP_USER_PASSKEY_NEG_REPLY);
2623 }
2624
2625 int mgmt_auth_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 status)
2626 {
2627         struct mgmt_ev_auth_failed ev;
2628
2629         bacpy(&ev.bdaddr, bdaddr);
2630         ev.status = mgmt_status(status);
2631
2632         return mgmt_event(MGMT_EV_AUTH_FAILED, hdev, &ev, sizeof(ev), NULL);
2633 }
2634
2635 int mgmt_set_local_name_complete(struct hci_dev *hdev, u8 *name, u8 status)
2636 {
2637         struct pending_cmd *cmd;
2638         struct mgmt_cp_set_local_name ev;
2639         int err;
2640
2641         memset(&ev, 0, sizeof(ev));
2642         memcpy(ev.name, name, HCI_MAX_NAME_LENGTH);
2643
2644         cmd = mgmt_pending_find(MGMT_OP_SET_LOCAL_NAME, hdev);
2645         if (!cmd)
2646                 goto send_event;
2647
2648         if (status) {
2649                 err = cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_LOCAL_NAME,
2650                                                         mgmt_status(status));
2651                 goto failed;
2652         }
2653
2654         update_eir(hdev);
2655
2656         err = cmd_complete(cmd->sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, &ev,
2657                                                                 sizeof(ev));
2658         if (err < 0)
2659                 goto failed;
2660
2661 send_event:
2662         err = mgmt_event(MGMT_EV_LOCAL_NAME_CHANGED, hdev, &ev, sizeof(ev),
2663                                                         cmd ? cmd->sk : NULL);
2664
2665 failed:
2666         if (cmd)
2667                 mgmt_pending_remove(cmd);
2668         return err;
2669 }
2670
2671 int mgmt_read_local_oob_data_reply_complete(struct hci_dev *hdev, u8 *hash,
2672                                                 u8 *randomizer, u8 status)
2673 {
2674         struct pending_cmd *cmd;
2675         int err;
2676
2677         BT_DBG("%s status %u", hdev->name, status);
2678
2679         cmd = mgmt_pending_find(MGMT_OP_READ_LOCAL_OOB_DATA, hdev);
2680         if (!cmd)
2681                 return -ENOENT;
2682
2683         if (status) {
2684                 err = cmd_status(cmd->sk, hdev->id,
2685                                                 MGMT_OP_READ_LOCAL_OOB_DATA,
2686                                                 mgmt_status(status));
2687         } else {
2688                 struct mgmt_rp_read_local_oob_data rp;
2689
2690                 memcpy(rp.hash, hash, sizeof(rp.hash));
2691                 memcpy(rp.randomizer, randomizer, sizeof(rp.randomizer));
2692
2693                 err = cmd_complete(cmd->sk, hdev->id,
2694                                                 MGMT_OP_READ_LOCAL_OOB_DATA,
2695                                                 &rp, sizeof(rp));
2696         }
2697
2698         mgmt_pending_remove(cmd);
2699
2700         return err;
2701 }
2702
2703 int mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
2704                                 u8 addr_type, u8 *dev_class, s8 rssi, u8 *eir)
2705 {
2706         struct mgmt_ev_device_found ev;
2707
2708         memset(&ev, 0, sizeof(ev));
2709
2710         bacpy(&ev.addr.bdaddr, bdaddr);
2711         ev.addr.type = link_to_mgmt(link_type, addr_type);
2712         ev.rssi = rssi;
2713
2714         if (eir)
2715                 memcpy(ev.eir, eir, sizeof(ev.eir));
2716
2717         if (dev_class)
2718                 memcpy(ev.dev_class, dev_class, sizeof(ev.dev_class));
2719
2720         return mgmt_event(MGMT_EV_DEVICE_FOUND, hdev, &ev, sizeof(ev), NULL);
2721 }
2722
2723 int mgmt_remote_name(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 *name)
2724 {
2725         struct mgmt_ev_remote_name ev;
2726
2727         memset(&ev, 0, sizeof(ev));
2728
2729         bacpy(&ev.bdaddr, bdaddr);
2730         memcpy(ev.name, name, HCI_MAX_NAME_LENGTH);
2731
2732         return mgmt_event(MGMT_EV_REMOTE_NAME, hdev, &ev, sizeof(ev), NULL);
2733 }
2734
2735 int mgmt_start_discovery_failed(struct hci_dev *hdev, u8 status)
2736 {
2737         struct pending_cmd *cmd;
2738         int err;
2739
2740         cmd = mgmt_pending_find(MGMT_OP_START_DISCOVERY, hdev);
2741         if (!cmd)
2742                 return -ENOENT;
2743
2744         err = cmd_status(cmd->sk, hdev->id, cmd->opcode, mgmt_status(status));
2745         mgmt_pending_remove(cmd);
2746
2747         return err;
2748 }
2749
2750 int mgmt_stop_discovery_failed(struct hci_dev *hdev, u8 status)
2751 {
2752         struct pending_cmd *cmd;
2753         int err;
2754
2755         cmd = mgmt_pending_find(MGMT_OP_STOP_DISCOVERY, hdev);
2756         if (!cmd)
2757                 return -ENOENT;
2758
2759         err = cmd_status(cmd->sk, hdev->id, cmd->opcode, mgmt_status(status));
2760         mgmt_pending_remove(cmd);
2761
2762         return err;
2763 }
2764
2765 int mgmt_discovering(struct hci_dev *hdev, u8 discovering)
2766 {
2767         struct pending_cmd *cmd;
2768
2769         if (discovering)
2770                 cmd = mgmt_pending_find(MGMT_OP_START_DISCOVERY, hdev);
2771         else
2772                 cmd = mgmt_pending_find(MGMT_OP_STOP_DISCOVERY, hdev);
2773
2774         if (cmd != NULL) {
2775                 cmd_complete(cmd->sk, hdev->id, cmd->opcode, NULL, 0);
2776                 mgmt_pending_remove(cmd);
2777         }
2778
2779         return mgmt_event(MGMT_EV_DISCOVERING, hdev, &discovering,
2780                                                 sizeof(discovering), NULL);
2781 }
2782
2783 int mgmt_device_blocked(struct hci_dev *hdev, bdaddr_t *bdaddr)
2784 {
2785         struct pending_cmd *cmd;
2786         struct mgmt_ev_device_blocked ev;
2787
2788         cmd = mgmt_pending_find(MGMT_OP_BLOCK_DEVICE, hdev);
2789
2790         bacpy(&ev.bdaddr, bdaddr);
2791
2792         return mgmt_event(MGMT_EV_DEVICE_BLOCKED, hdev, &ev, sizeof(ev),
2793                                                         cmd ? cmd->sk : NULL);
2794 }
2795
2796 int mgmt_device_unblocked(struct hci_dev *hdev, bdaddr_t *bdaddr)
2797 {
2798         struct pending_cmd *cmd;
2799         struct mgmt_ev_device_unblocked ev;
2800
2801         cmd = mgmt_pending_find(MGMT_OP_UNBLOCK_DEVICE, hdev);
2802
2803         bacpy(&ev.bdaddr, bdaddr);
2804
2805         return mgmt_event(MGMT_EV_DEVICE_UNBLOCKED, hdev, &ev, sizeof(ev),
2806                                                         cmd ? cmd->sk : NULL);
2807 }