Bluetooth: fix sparse & gcc warnings
[linux-2.6/linux-acpi-2.6/ibm-acpi-2.6.git] / net / bluetooth / mgmt.c
blob89bc36ae3120ee64ff196edef51c7047dcf2270f
1 /*
2 BlueZ - Bluetooth protocol stack for Linux
3 Copyright (C) 2010 Nokia Corporation
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;
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.
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.
23 /* Bluetooth HCI Management interface */
25 #include <linux/uaccess.h>
26 #include <asm/unaligned.h>
28 #include <net/bluetooth/bluetooth.h>
29 #include <net/bluetooth/hci_core.h>
30 #include <net/bluetooth/mgmt.h>
32 #define MGMT_VERSION 0
33 #define MGMT_REVISION 1
35 struct pending_cmd {
36 struct list_head list;
37 __u16 opcode;
38 int index;
39 void *param;
40 struct sock *sk;
41 void *user_data;
44 static LIST_HEAD(cmd_list);
46 static int cmd_status(struct sock *sk, u16 index, u16 cmd, u8 status)
48 struct sk_buff *skb;
49 struct mgmt_hdr *hdr;
50 struct mgmt_ev_cmd_status *ev;
52 BT_DBG("sock %p, index %u, cmd %u, status %u", sk, index, cmd, status);
54 skb = alloc_skb(sizeof(*hdr) + sizeof(*ev), GFP_ATOMIC);
55 if (!skb)
56 return -ENOMEM;
58 hdr = (void *) skb_put(skb, sizeof(*hdr));
60 hdr->opcode = cpu_to_le16(MGMT_EV_CMD_STATUS);
61 hdr->index = cpu_to_le16(index);
62 hdr->len = cpu_to_le16(sizeof(*ev));
64 ev = (void *) skb_put(skb, sizeof(*ev));
65 ev->status = status;
66 put_unaligned_le16(cmd, &ev->opcode);
68 if (sock_queue_rcv_skb(sk, skb) < 0)
69 kfree_skb(skb);
71 return 0;
74 static int cmd_complete(struct sock *sk, u16 index, u16 cmd, void *rp,
75 size_t rp_len)
77 struct sk_buff *skb;
78 struct mgmt_hdr *hdr;
79 struct mgmt_ev_cmd_complete *ev;
81 BT_DBG("sock %p", sk);
83 skb = alloc_skb(sizeof(*hdr) + sizeof(*ev) + rp_len, GFP_ATOMIC);
84 if (!skb)
85 return -ENOMEM;
87 hdr = (void *) skb_put(skb, sizeof(*hdr));
89 hdr->opcode = cpu_to_le16(MGMT_EV_CMD_COMPLETE);
90 hdr->index = cpu_to_le16(index);
91 hdr->len = cpu_to_le16(sizeof(*ev) + rp_len);
93 ev = (void *) skb_put(skb, sizeof(*ev) + rp_len);
94 put_unaligned_le16(cmd, &ev->opcode);
96 if (rp)
97 memcpy(ev->data, rp, rp_len);
99 if (sock_queue_rcv_skb(sk, skb) < 0)
100 kfree_skb(skb);
102 return 0;
105 static int read_version(struct sock *sk)
107 struct mgmt_rp_read_version rp;
109 BT_DBG("sock %p", sk);
111 rp.version = MGMT_VERSION;
112 put_unaligned_le16(MGMT_REVISION, &rp.revision);
114 return cmd_complete(sk, MGMT_INDEX_NONE, MGMT_OP_READ_VERSION, &rp,
115 sizeof(rp));
118 static int read_index_list(struct sock *sk)
120 struct mgmt_rp_read_index_list *rp;
121 struct list_head *p;
122 size_t rp_len;
123 u16 count;
124 int i, err;
126 BT_DBG("sock %p", sk);
128 read_lock(&hci_dev_list_lock);
130 count = 0;
131 list_for_each(p, &hci_dev_list) {
132 count++;
135 rp_len = sizeof(*rp) + (2 * count);
136 rp = kmalloc(rp_len, GFP_ATOMIC);
137 if (!rp) {
138 read_unlock(&hci_dev_list_lock);
139 return -ENOMEM;
142 put_unaligned_le16(count, &rp->num_controllers);
144 i = 0;
145 list_for_each(p, &hci_dev_list) {
146 struct hci_dev *d = list_entry(p, struct hci_dev, list);
148 hci_del_off_timer(d);
150 set_bit(HCI_MGMT, &d->flags);
152 if (test_bit(HCI_SETUP, &d->flags))
153 continue;
155 put_unaligned_le16(d->id, &rp->index[i++]);
156 BT_DBG("Added hci%u", d->id);
159 read_unlock(&hci_dev_list_lock);
161 err = cmd_complete(sk, MGMT_INDEX_NONE, MGMT_OP_READ_INDEX_LIST, rp,
162 rp_len);
164 kfree(rp);
166 return err;
169 static int read_controller_info(struct sock *sk, u16 index)
171 struct mgmt_rp_read_info rp;
172 struct hci_dev *hdev;
174 BT_DBG("sock %p hci%u", sk, index);
176 hdev = hci_dev_get(index);
177 if (!hdev)
178 return cmd_status(sk, index, MGMT_OP_READ_INFO, ENODEV);
180 hci_del_off_timer(hdev);
182 hci_dev_lock(hdev);
184 set_bit(HCI_MGMT, &hdev->flags);
186 memset(&rp, 0, sizeof(rp));
188 rp.type = hdev->dev_type;
190 rp.powered = test_bit(HCI_UP, &hdev->flags);
191 rp.connectable = test_bit(HCI_PSCAN, &hdev->flags);
192 rp.discoverable = test_bit(HCI_ISCAN, &hdev->flags);
193 rp.pairable = test_bit(HCI_PSCAN, &hdev->flags);
195 if (test_bit(HCI_AUTH, &hdev->flags))
196 rp.sec_mode = 3;
197 else if (hdev->ssp_mode > 0)
198 rp.sec_mode = 4;
199 else
200 rp.sec_mode = 2;
202 bacpy(&rp.bdaddr, &hdev->bdaddr);
203 memcpy(rp.features, hdev->features, 8);
204 memcpy(rp.dev_class, hdev->dev_class, 3);
205 put_unaligned_le16(hdev->manufacturer, &rp.manufacturer);
206 rp.hci_ver = hdev->hci_ver;
207 put_unaligned_le16(hdev->hci_rev, &rp.hci_rev);
209 memcpy(rp.name, hdev->dev_name, sizeof(hdev->dev_name));
211 hci_dev_unlock(hdev);
212 hci_dev_put(hdev);
214 return cmd_complete(sk, index, MGMT_OP_READ_INFO, &rp, sizeof(rp));
217 static void mgmt_pending_free(struct pending_cmd *cmd)
219 sock_put(cmd->sk);
220 kfree(cmd->param);
221 kfree(cmd);
224 static struct pending_cmd *mgmt_pending_add(struct sock *sk, u16 opcode,
225 u16 index, void *data, u16 len)
227 struct pending_cmd *cmd;
229 cmd = kmalloc(sizeof(*cmd), GFP_ATOMIC);
230 if (!cmd)
231 return NULL;
233 cmd->opcode = opcode;
234 cmd->index = index;
236 cmd->param = kmalloc(len, GFP_ATOMIC);
237 if (!cmd->param) {
238 kfree(cmd);
239 return NULL;
242 if (data)
243 memcpy(cmd->param, data, len);
245 cmd->sk = sk;
246 sock_hold(sk);
248 list_add(&cmd->list, &cmd_list);
250 return cmd;
253 static void mgmt_pending_foreach(u16 opcode, int index,
254 void (*cb)(struct pending_cmd *cmd, void *data),
255 void *data)
257 struct list_head *p, *n;
259 list_for_each_safe(p, n, &cmd_list) {
260 struct pending_cmd *cmd;
262 cmd = list_entry(p, struct pending_cmd, list);
264 if (cmd->opcode != opcode)
265 continue;
267 if (index >= 0 && cmd->index != index)
268 continue;
270 cb(cmd, data);
274 static struct pending_cmd *mgmt_pending_find(u16 opcode, int index)
276 struct list_head *p;
278 list_for_each(p, &cmd_list) {
279 struct pending_cmd *cmd;
281 cmd = list_entry(p, struct pending_cmd, list);
283 if (cmd->opcode != opcode)
284 continue;
286 if (index >= 0 && cmd->index != index)
287 continue;
289 return cmd;
292 return NULL;
295 static void mgmt_pending_remove(struct pending_cmd *cmd)
297 list_del(&cmd->list);
298 mgmt_pending_free(cmd);
301 static int set_powered(struct sock *sk, u16 index, unsigned char *data, u16 len)
303 struct mgmt_mode *cp;
304 struct hci_dev *hdev;
305 struct pending_cmd *cmd;
306 int err, up;
308 cp = (void *) data;
310 BT_DBG("request for hci%u", index);
312 if (len != sizeof(*cp))
313 return cmd_status(sk, index, MGMT_OP_SET_POWERED, EINVAL);
315 hdev = hci_dev_get(index);
316 if (!hdev)
317 return cmd_status(sk, index, MGMT_OP_SET_POWERED, ENODEV);
319 hci_dev_lock(hdev);
321 up = test_bit(HCI_UP, &hdev->flags);
322 if ((cp->val && up) || (!cp->val && !up)) {
323 err = cmd_status(sk, index, MGMT_OP_SET_POWERED, EALREADY);
324 goto failed;
327 if (mgmt_pending_find(MGMT_OP_SET_POWERED, index)) {
328 err = cmd_status(sk, index, MGMT_OP_SET_POWERED, EBUSY);
329 goto failed;
332 cmd = mgmt_pending_add(sk, MGMT_OP_SET_POWERED, index, data, len);
333 if (!cmd) {
334 err = -ENOMEM;
335 goto failed;
338 if (cp->val)
339 queue_work(hdev->workqueue, &hdev->power_on);
340 else
341 queue_work(hdev->workqueue, &hdev->power_off);
343 err = 0;
345 failed:
346 hci_dev_unlock(hdev);
347 hci_dev_put(hdev);
348 return err;
351 static int set_discoverable(struct sock *sk, u16 index, unsigned char *data,
352 u16 len)
354 struct mgmt_mode *cp;
355 struct hci_dev *hdev;
356 struct pending_cmd *cmd;
357 u8 scan;
358 int err;
360 cp = (void *) data;
362 BT_DBG("request for hci%u", index);
364 if (len != sizeof(*cp))
365 return cmd_status(sk, index, MGMT_OP_SET_DISCOVERABLE, EINVAL);
367 hdev = hci_dev_get(index);
368 if (!hdev)
369 return cmd_status(sk, index, MGMT_OP_SET_DISCOVERABLE, ENODEV);
371 hci_dev_lock(hdev);
373 if (!test_bit(HCI_UP, &hdev->flags)) {
374 err = cmd_status(sk, index, MGMT_OP_SET_DISCOVERABLE, ENETDOWN);
375 goto failed;
378 if (mgmt_pending_find(MGMT_OP_SET_DISCOVERABLE, index) ||
379 mgmt_pending_find(MGMT_OP_SET_CONNECTABLE, index)) {
380 err = cmd_status(sk, index, MGMT_OP_SET_DISCOVERABLE, EBUSY);
381 goto failed;
384 if (cp->val == test_bit(HCI_ISCAN, &hdev->flags) &&
385 test_bit(HCI_PSCAN, &hdev->flags)) {
386 err = cmd_status(sk, index, MGMT_OP_SET_DISCOVERABLE, EALREADY);
387 goto failed;
390 cmd = mgmt_pending_add(sk, MGMT_OP_SET_DISCOVERABLE, index, data, len);
391 if (!cmd) {
392 err = -ENOMEM;
393 goto failed;
396 scan = SCAN_PAGE;
398 if (cp->val)
399 scan |= SCAN_INQUIRY;
401 err = hci_send_cmd(hdev, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);
402 if (err < 0)
403 mgmt_pending_remove(cmd);
405 failed:
406 hci_dev_unlock(hdev);
407 hci_dev_put(hdev);
409 return err;
412 static int set_connectable(struct sock *sk, u16 index, unsigned char *data,
413 u16 len)
415 struct mgmt_mode *cp;
416 struct hci_dev *hdev;
417 struct pending_cmd *cmd;
418 u8 scan;
419 int err;
421 cp = (void *) data;
423 BT_DBG("request for hci%u", index);
425 if (len != sizeof(*cp))
426 return cmd_status(sk, index, MGMT_OP_SET_CONNECTABLE, EINVAL);
428 hdev = hci_dev_get(index);
429 if (!hdev)
430 return cmd_status(sk, index, MGMT_OP_SET_CONNECTABLE, ENODEV);
432 hci_dev_lock(hdev);
434 if (!test_bit(HCI_UP, &hdev->flags)) {
435 err = cmd_status(sk, index, MGMT_OP_SET_CONNECTABLE, ENETDOWN);
436 goto failed;
439 if (mgmt_pending_find(MGMT_OP_SET_DISCOVERABLE, index) ||
440 mgmt_pending_find(MGMT_OP_SET_CONNECTABLE, index)) {
441 err = cmd_status(sk, index, MGMT_OP_SET_CONNECTABLE, EBUSY);
442 goto failed;
445 if (cp->val == test_bit(HCI_PSCAN, &hdev->flags)) {
446 err = cmd_status(sk, index, MGMT_OP_SET_CONNECTABLE, EALREADY);
447 goto failed;
450 cmd = mgmt_pending_add(sk, MGMT_OP_SET_CONNECTABLE, index, data, len);
451 if (!cmd) {
452 err = -ENOMEM;
453 goto failed;
456 if (cp->val)
457 scan = SCAN_PAGE;
458 else
459 scan = 0;
461 err = hci_send_cmd(hdev, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);
462 if (err < 0)
463 mgmt_pending_remove(cmd);
465 failed:
466 hci_dev_unlock(hdev);
467 hci_dev_put(hdev);
469 return err;
472 static int mgmt_event(u16 event, u16 index, void *data, u16 data_len,
473 struct sock *skip_sk)
475 struct sk_buff *skb;
476 struct mgmt_hdr *hdr;
478 skb = alloc_skb(sizeof(*hdr) + data_len, GFP_ATOMIC);
479 if (!skb)
480 return -ENOMEM;
482 bt_cb(skb)->channel = HCI_CHANNEL_CONTROL;
484 hdr = (void *) skb_put(skb, sizeof(*hdr));
485 hdr->opcode = cpu_to_le16(event);
486 hdr->index = cpu_to_le16(index);
487 hdr->len = cpu_to_le16(data_len);
489 if (data)
490 memcpy(skb_put(skb, data_len), data, data_len);
492 hci_send_to_sock(NULL, skb, skip_sk);
493 kfree_skb(skb);
495 return 0;
498 static int send_mode_rsp(struct sock *sk, u16 opcode, u16 index, u8 val)
500 struct mgmt_mode rp;
502 rp.val = val;
504 return cmd_complete(sk, index, opcode, &rp, sizeof(rp));
507 static int set_pairable(struct sock *sk, u16 index, unsigned char *data,
508 u16 len)
510 struct mgmt_mode *cp, ev;
511 struct hci_dev *hdev;
512 int err;
514 cp = (void *) data;
516 BT_DBG("request for hci%u", index);
518 if (len != sizeof(*cp))
519 return cmd_status(sk, index, MGMT_OP_SET_PAIRABLE, EINVAL);
521 hdev = hci_dev_get(index);
522 if (!hdev)
523 return cmd_status(sk, index, MGMT_OP_SET_PAIRABLE, ENODEV);
525 hci_dev_lock(hdev);
527 if (cp->val)
528 set_bit(HCI_PAIRABLE, &hdev->flags);
529 else
530 clear_bit(HCI_PAIRABLE, &hdev->flags);
532 err = send_mode_rsp(sk, MGMT_OP_SET_PAIRABLE, index, cp->val);
533 if (err < 0)
534 goto failed;
536 ev.val = cp->val;
538 err = mgmt_event(MGMT_EV_PAIRABLE, index, &ev, sizeof(ev), sk);
540 failed:
541 hci_dev_unlock(hdev);
542 hci_dev_put(hdev);
544 return err;
547 #define EIR_FLAGS 0x01 /* flags */
548 #define EIR_UUID16_SOME 0x02 /* 16-bit UUID, more available */
549 #define EIR_UUID16_ALL 0x03 /* 16-bit UUID, all listed */
550 #define EIR_UUID32_SOME 0x04 /* 32-bit UUID, more available */
551 #define EIR_UUID32_ALL 0x05 /* 32-bit UUID, all listed */
552 #define EIR_UUID128_SOME 0x06 /* 128-bit UUID, more available */
553 #define EIR_UUID128_ALL 0x07 /* 128-bit UUID, all listed */
554 #define EIR_NAME_SHORT 0x08 /* shortened local name */
555 #define EIR_NAME_COMPLETE 0x09 /* complete local name */
556 #define EIR_TX_POWER 0x0A /* transmit power level */
557 #define EIR_DEVICE_ID 0x10 /* device ID */
559 #define PNP_INFO_SVCLASS_ID 0x1200
561 static u8 bluetooth_base_uuid[] = {
562 0xFB, 0x34, 0x9B, 0x5F, 0x80, 0x00, 0x00, 0x80,
563 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
566 static u16 get_uuid16(u8 *uuid128)
568 u32 val;
569 int i;
571 for (i = 0; i < 12; i++) {
572 if (bluetooth_base_uuid[i] != uuid128[i])
573 return 0;
576 memcpy(&val, &uuid128[12], 4);
578 val = le32_to_cpu(val);
579 if (val > 0xffff)
580 return 0;
582 return (u16) val;
585 static void create_eir(struct hci_dev *hdev, u8 *data)
587 u8 *ptr = data;
588 u16 eir_len = 0;
589 u16 uuid16_list[HCI_MAX_EIR_LENGTH / sizeof(u16)];
590 int i, truncated = 0;
591 struct list_head *p;
592 size_t name_len;
594 name_len = strlen(hdev->dev_name);
596 if (name_len > 0) {
597 /* EIR Data type */
598 if (name_len > 48) {
599 name_len = 48;
600 ptr[1] = EIR_NAME_SHORT;
601 } else
602 ptr[1] = EIR_NAME_COMPLETE;
604 /* EIR Data length */
605 ptr[0] = name_len + 1;
607 memcpy(ptr + 2, hdev->dev_name, name_len);
609 eir_len += (name_len + 2);
610 ptr += (name_len + 2);
613 memset(uuid16_list, 0, sizeof(uuid16_list));
615 /* Group all UUID16 types */
616 list_for_each(p, &hdev->uuids) {
617 struct bt_uuid *uuid = list_entry(p, struct bt_uuid, list);
618 u16 uuid16;
620 uuid16 = get_uuid16(uuid->uuid);
621 if (uuid16 == 0)
622 return;
624 if (uuid16 < 0x1100)
625 continue;
627 if (uuid16 == PNP_INFO_SVCLASS_ID)
628 continue;
630 /* Stop if not enough space to put next UUID */
631 if (eir_len + 2 + sizeof(u16) > HCI_MAX_EIR_LENGTH) {
632 truncated = 1;
633 break;
636 /* Check for duplicates */
637 for (i = 0; uuid16_list[i] != 0; i++)
638 if (uuid16_list[i] == uuid16)
639 break;
641 if (uuid16_list[i] == 0) {
642 uuid16_list[i] = uuid16;
643 eir_len += sizeof(u16);
647 if (uuid16_list[0] != 0) {
648 u8 *length = ptr;
650 /* EIR Data type */
651 ptr[1] = truncated ? EIR_UUID16_SOME : EIR_UUID16_ALL;
653 ptr += 2;
654 eir_len += 2;
656 for (i = 0; uuid16_list[i] != 0; i++) {
657 *ptr++ = (uuid16_list[i] & 0x00ff);
658 *ptr++ = (uuid16_list[i] & 0xff00) >> 8;
661 /* EIR Data length */
662 *length = (i * sizeof(u16)) + 1;
666 static int update_eir(struct hci_dev *hdev)
668 struct hci_cp_write_eir cp;
670 if (!(hdev->features[6] & LMP_EXT_INQ))
671 return 0;
673 if (hdev->ssp_mode == 0)
674 return 0;
676 if (test_bit(HCI_SERVICE_CACHE, &hdev->flags))
677 return 0;
679 memset(&cp, 0, sizeof(cp));
681 create_eir(hdev, cp.data);
683 if (memcmp(cp.data, hdev->eir, sizeof(cp.data)) == 0)
684 return 0;
686 memcpy(hdev->eir, cp.data, sizeof(cp.data));
688 return hci_send_cmd(hdev, HCI_OP_WRITE_EIR, sizeof(cp), &cp);
691 static u8 get_service_classes(struct hci_dev *hdev)
693 struct list_head *p;
694 u8 val = 0;
696 list_for_each(p, &hdev->uuids) {
697 struct bt_uuid *uuid = list_entry(p, struct bt_uuid, list);
699 val |= uuid->svc_hint;
702 return val;
705 static int update_class(struct hci_dev *hdev)
707 u8 cod[3];
709 BT_DBG("%s", hdev->name);
711 if (test_bit(HCI_SERVICE_CACHE, &hdev->flags))
712 return 0;
714 cod[0] = hdev->minor_class;
715 cod[1] = hdev->major_class;
716 cod[2] = get_service_classes(hdev);
718 if (memcmp(cod, hdev->dev_class, 3) == 0)
719 return 0;
721 return hci_send_cmd(hdev, HCI_OP_WRITE_CLASS_OF_DEV, sizeof(cod), cod);
724 static int add_uuid(struct sock *sk, u16 index, unsigned char *data, u16 len)
726 struct mgmt_cp_add_uuid *cp;
727 struct hci_dev *hdev;
728 struct bt_uuid *uuid;
729 int err;
731 cp = (void *) data;
733 BT_DBG("request for hci%u", index);
735 if (len != sizeof(*cp))
736 return cmd_status(sk, index, MGMT_OP_ADD_UUID, EINVAL);
738 hdev = hci_dev_get(index);
739 if (!hdev)
740 return cmd_status(sk, index, MGMT_OP_ADD_UUID, ENODEV);
742 hci_dev_lock(hdev);
744 uuid = kmalloc(sizeof(*uuid), GFP_ATOMIC);
745 if (!uuid) {
746 err = -ENOMEM;
747 goto failed;
750 memcpy(uuid->uuid, cp->uuid, 16);
751 uuid->svc_hint = cp->svc_hint;
753 list_add(&uuid->list, &hdev->uuids);
755 err = update_class(hdev);
756 if (err < 0)
757 goto failed;
759 err = update_eir(hdev);
760 if (err < 0)
761 goto failed;
763 err = cmd_complete(sk, index, MGMT_OP_ADD_UUID, NULL, 0);
765 failed:
766 hci_dev_unlock(hdev);
767 hci_dev_put(hdev);
769 return err;
772 static int remove_uuid(struct sock *sk, u16 index, unsigned char *data, u16 len)
774 struct list_head *p, *n;
775 struct mgmt_cp_remove_uuid *cp;
776 struct hci_dev *hdev;
777 u8 bt_uuid_any[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
778 int err, found;
780 cp = (void *) data;
782 BT_DBG("request for hci%u", index);
784 if (len != sizeof(*cp))
785 return cmd_status(sk, index, MGMT_OP_REMOVE_UUID, EINVAL);
787 hdev = hci_dev_get(index);
788 if (!hdev)
789 return cmd_status(sk, index, MGMT_OP_REMOVE_UUID, ENODEV);
791 hci_dev_lock(hdev);
793 if (memcmp(cp->uuid, bt_uuid_any, 16) == 0) {
794 err = hci_uuids_clear(hdev);
795 goto unlock;
798 found = 0;
800 list_for_each_safe(p, n, &hdev->uuids) {
801 struct bt_uuid *match = list_entry(p, struct bt_uuid, list);
803 if (memcmp(match->uuid, cp->uuid, 16) != 0)
804 continue;
806 list_del(&match->list);
807 found++;
810 if (found == 0) {
811 err = cmd_status(sk, index, MGMT_OP_REMOVE_UUID, ENOENT);
812 goto unlock;
815 err = update_class(hdev);
816 if (err < 0)
817 goto unlock;
819 err = update_eir(hdev);
820 if (err < 0)
821 goto unlock;
823 err = cmd_complete(sk, index, MGMT_OP_REMOVE_UUID, NULL, 0);
825 unlock:
826 hci_dev_unlock(hdev);
827 hci_dev_put(hdev);
829 return err;
832 static int set_dev_class(struct sock *sk, u16 index, unsigned char *data,
833 u16 len)
835 struct hci_dev *hdev;
836 struct mgmt_cp_set_dev_class *cp;
837 int err;
839 cp = (void *) data;
841 BT_DBG("request for hci%u", index);
843 if (len != sizeof(*cp))
844 return cmd_status(sk, index, MGMT_OP_SET_DEV_CLASS, EINVAL);
846 hdev = hci_dev_get(index);
847 if (!hdev)
848 return cmd_status(sk, index, MGMT_OP_SET_DEV_CLASS, ENODEV);
850 hci_dev_lock(hdev);
852 hdev->major_class = cp->major;
853 hdev->minor_class = cp->minor;
855 err = update_class(hdev);
857 if (err == 0)
858 err = cmd_complete(sk, index, MGMT_OP_SET_DEV_CLASS, NULL, 0);
860 hci_dev_unlock(hdev);
861 hci_dev_put(hdev);
863 return err;
866 static int set_service_cache(struct sock *sk, u16 index, unsigned char *data,
867 u16 len)
869 struct hci_dev *hdev;
870 struct mgmt_cp_set_service_cache *cp;
871 int err;
873 cp = (void *) data;
875 if (len != sizeof(*cp))
876 return cmd_status(sk, index, MGMT_OP_SET_SERVICE_CACHE, EINVAL);
878 hdev = hci_dev_get(index);
879 if (!hdev)
880 return cmd_status(sk, index, MGMT_OP_SET_SERVICE_CACHE, ENODEV);
882 hci_dev_lock(hdev);
884 BT_DBG("hci%u enable %d", index, cp->enable);
886 if (cp->enable) {
887 set_bit(HCI_SERVICE_CACHE, &hdev->flags);
888 err = 0;
889 } else {
890 clear_bit(HCI_SERVICE_CACHE, &hdev->flags);
891 err = update_class(hdev);
892 if (err == 0)
893 err = update_eir(hdev);
896 if (err == 0)
897 err = cmd_complete(sk, index, MGMT_OP_SET_SERVICE_CACHE, NULL,
900 hci_dev_unlock(hdev);
901 hci_dev_put(hdev);
903 return err;
906 static int load_keys(struct sock *sk, u16 index, unsigned char *data, u16 len)
908 struct hci_dev *hdev;
909 struct mgmt_cp_load_keys *cp;
910 u16 key_count, expected_len;
911 int i;
913 cp = (void *) data;
915 if (len < sizeof(*cp))
916 return -EINVAL;
918 key_count = get_unaligned_le16(&cp->key_count);
920 expected_len = sizeof(*cp) + key_count * sizeof(struct mgmt_key_info);
921 if (expected_len != len) {
922 BT_ERR("load_keys: expected %u bytes, got %u bytes",
923 len, expected_len);
924 return -EINVAL;
927 hdev = hci_dev_get(index);
928 if (!hdev)
929 return cmd_status(sk, index, MGMT_OP_LOAD_KEYS, ENODEV);
931 BT_DBG("hci%u debug_keys %u key_count %u", index, cp->debug_keys,
932 key_count);
934 hci_dev_lock(hdev);
936 hci_link_keys_clear(hdev);
938 set_bit(HCI_LINK_KEYS, &hdev->flags);
940 if (cp->debug_keys)
941 set_bit(HCI_DEBUG_KEYS, &hdev->flags);
942 else
943 clear_bit(HCI_DEBUG_KEYS, &hdev->flags);
945 for (i = 0; i < key_count; i++) {
946 struct mgmt_key_info *key = &cp->keys[i];
948 hci_add_link_key(hdev, NULL, 0, &key->bdaddr, key->val, key->type,
949 key->pin_len);
952 hci_dev_unlock(hdev);
953 hci_dev_put(hdev);
955 return 0;
958 static int remove_key(struct sock *sk, u16 index, unsigned char *data, u16 len)
960 struct hci_dev *hdev;
961 struct mgmt_cp_remove_key *cp;
962 struct hci_conn *conn;
963 int err;
965 cp = (void *) data;
967 if (len != sizeof(*cp))
968 return cmd_status(sk, index, MGMT_OP_REMOVE_KEY, EINVAL);
970 hdev = hci_dev_get(index);
971 if (!hdev)
972 return cmd_status(sk, index, MGMT_OP_REMOVE_KEY, ENODEV);
974 hci_dev_lock(hdev);
976 err = hci_remove_link_key(hdev, &cp->bdaddr);
977 if (err < 0) {
978 err = cmd_status(sk, index, MGMT_OP_REMOVE_KEY, -err);
979 goto unlock;
982 err = 0;
984 if (!test_bit(HCI_UP, &hdev->flags) || !cp->disconnect)
985 goto unlock;
987 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
988 if (conn) {
989 struct hci_cp_disconnect dc;
991 put_unaligned_le16(conn->handle, &dc.handle);
992 dc.reason = 0x13; /* Remote User Terminated Connection */
993 err = hci_send_cmd(hdev, HCI_OP_DISCONNECT, 0, NULL);
996 unlock:
997 hci_dev_unlock(hdev);
998 hci_dev_put(hdev);
1000 return err;
1003 static int disconnect(struct sock *sk, u16 index, unsigned char *data, u16 len)
1005 struct hci_dev *hdev;
1006 struct mgmt_cp_disconnect *cp;
1007 struct hci_cp_disconnect dc;
1008 struct pending_cmd *cmd;
1009 struct hci_conn *conn;
1010 int err;
1012 BT_DBG("");
1014 cp = (void *) data;
1016 if (len != sizeof(*cp))
1017 return cmd_status(sk, index, MGMT_OP_DISCONNECT, EINVAL);
1019 hdev = hci_dev_get(index);
1020 if (!hdev)
1021 return cmd_status(sk, index, MGMT_OP_DISCONNECT, ENODEV);
1023 hci_dev_lock(hdev);
1025 if (!test_bit(HCI_UP, &hdev->flags)) {
1026 err = cmd_status(sk, index, MGMT_OP_DISCONNECT, ENETDOWN);
1027 goto failed;
1030 if (mgmt_pending_find(MGMT_OP_DISCONNECT, index)) {
1031 err = cmd_status(sk, index, MGMT_OP_DISCONNECT, EBUSY);
1032 goto failed;
1035 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr);
1036 if (!conn)
1037 conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &cp->bdaddr);
1039 if (!conn) {
1040 err = cmd_status(sk, index, MGMT_OP_DISCONNECT, ENOTCONN);
1041 goto failed;
1044 cmd = mgmt_pending_add(sk, MGMT_OP_DISCONNECT, index, data, len);
1045 if (!cmd) {
1046 err = -ENOMEM;
1047 goto failed;
1050 put_unaligned_le16(conn->handle, &dc.handle);
1051 dc.reason = 0x13; /* Remote User Terminated Connection */
1053 err = hci_send_cmd(hdev, HCI_OP_DISCONNECT, sizeof(dc), &dc);
1054 if (err < 0)
1055 mgmt_pending_remove(cmd);
1057 failed:
1058 hci_dev_unlock(hdev);
1059 hci_dev_put(hdev);
1061 return err;
1064 static int get_connections(struct sock *sk, u16 index)
1066 struct mgmt_rp_get_connections *rp;
1067 struct hci_dev *hdev;
1068 struct list_head *p;
1069 size_t rp_len;
1070 u16 count;
1071 int i, err;
1073 BT_DBG("");
1075 hdev = hci_dev_get(index);
1076 if (!hdev)
1077 return cmd_status(sk, index, MGMT_OP_GET_CONNECTIONS, ENODEV);
1079 hci_dev_lock(hdev);
1081 count = 0;
1082 list_for_each(p, &hdev->conn_hash.list) {
1083 count++;
1086 rp_len = sizeof(*rp) + (count * sizeof(bdaddr_t));
1087 rp = kmalloc(rp_len, GFP_ATOMIC);
1088 if (!rp) {
1089 err = -ENOMEM;
1090 goto unlock;
1093 put_unaligned_le16(count, &rp->conn_count);
1095 i = 0;
1096 list_for_each(p, &hdev->conn_hash.list) {
1097 struct hci_conn *c = list_entry(p, struct hci_conn, list);
1099 bacpy(&rp->conn[i++], &c->dst);
1102 err = cmd_complete(sk, index, MGMT_OP_GET_CONNECTIONS, rp, rp_len);
1104 unlock:
1105 kfree(rp);
1106 hci_dev_unlock(hdev);
1107 hci_dev_put(hdev);
1108 return err;
1111 static int pin_code_reply(struct sock *sk, u16 index, unsigned char *data,
1112 u16 len)
1114 struct hci_dev *hdev;
1115 struct mgmt_cp_pin_code_reply *cp;
1116 struct hci_cp_pin_code_reply reply;
1117 struct pending_cmd *cmd;
1118 int err;
1120 BT_DBG("");
1122 cp = (void *) data;
1124 if (len != sizeof(*cp))
1125 return cmd_status(sk, index, MGMT_OP_PIN_CODE_REPLY, EINVAL);
1127 hdev = hci_dev_get(index);
1128 if (!hdev)
1129 return cmd_status(sk, index, MGMT_OP_PIN_CODE_REPLY, ENODEV);
1131 hci_dev_lock(hdev);
1133 if (!test_bit(HCI_UP, &hdev->flags)) {
1134 err = cmd_status(sk, index, MGMT_OP_PIN_CODE_REPLY, ENETDOWN);
1135 goto failed;
1138 cmd = mgmt_pending_add(sk, MGMT_OP_PIN_CODE_REPLY, index, data, len);
1139 if (!cmd) {
1140 err = -ENOMEM;
1141 goto failed;
1144 bacpy(&reply.bdaddr, &cp->bdaddr);
1145 reply.pin_len = cp->pin_len;
1146 memcpy(reply.pin_code, cp->pin_code, 16);
1148 err = hci_send_cmd(hdev, HCI_OP_PIN_CODE_REPLY, sizeof(reply), &reply);
1149 if (err < 0)
1150 mgmt_pending_remove(cmd);
1152 failed:
1153 hci_dev_unlock(hdev);
1154 hci_dev_put(hdev);
1156 return err;
1159 static int pin_code_neg_reply(struct sock *sk, u16 index, unsigned char *data,
1160 u16 len)
1162 struct hci_dev *hdev;
1163 struct mgmt_cp_pin_code_neg_reply *cp;
1164 struct pending_cmd *cmd;
1165 int err;
1167 BT_DBG("");
1169 cp = (void *) data;
1171 if (len != sizeof(*cp))
1172 return cmd_status(sk, index, MGMT_OP_PIN_CODE_NEG_REPLY,
1173 EINVAL);
1175 hdev = hci_dev_get(index);
1176 if (!hdev)
1177 return cmd_status(sk, index, MGMT_OP_PIN_CODE_NEG_REPLY,
1178 ENODEV);
1180 hci_dev_lock(hdev);
1182 if (!test_bit(HCI_UP, &hdev->flags)) {
1183 err = cmd_status(sk, index, MGMT_OP_PIN_CODE_NEG_REPLY,
1184 ENETDOWN);
1185 goto failed;
1188 cmd = mgmt_pending_add(sk, MGMT_OP_PIN_CODE_NEG_REPLY, index,
1189 data, len);
1190 if (!cmd) {
1191 err = -ENOMEM;
1192 goto failed;
1195 err = hci_send_cmd(hdev, HCI_OP_PIN_CODE_NEG_REPLY, sizeof(cp->bdaddr),
1196 &cp->bdaddr);
1197 if (err < 0)
1198 mgmt_pending_remove(cmd);
1200 failed:
1201 hci_dev_unlock(hdev);
1202 hci_dev_put(hdev);
1204 return err;
1207 static int set_io_capability(struct sock *sk, u16 index, unsigned char *data,
1208 u16 len)
1210 struct hci_dev *hdev;
1211 struct mgmt_cp_set_io_capability *cp;
1213 BT_DBG("");
1215 cp = (void *) data;
1217 if (len != sizeof(*cp))
1218 return cmd_status(sk, index, MGMT_OP_SET_IO_CAPABILITY, EINVAL);
1220 hdev = hci_dev_get(index);
1221 if (!hdev)
1222 return cmd_status(sk, index, MGMT_OP_SET_IO_CAPABILITY, ENODEV);
1224 hci_dev_lock(hdev);
1226 hdev->io_capability = cp->io_capability;
1228 BT_DBG("%s IO capability set to 0x%02x", hdev->name,
1229 hdev->io_capability);
1231 hci_dev_unlock(hdev);
1232 hci_dev_put(hdev);
1234 return cmd_complete(sk, index, MGMT_OP_SET_IO_CAPABILITY, NULL, 0);
1237 static inline struct pending_cmd *find_pairing(struct hci_conn *conn)
1239 struct hci_dev *hdev = conn->hdev;
1240 struct list_head *p;
1242 list_for_each(p, &cmd_list) {
1243 struct pending_cmd *cmd;
1245 cmd = list_entry(p, struct pending_cmd, list);
1247 if (cmd->opcode != MGMT_OP_PAIR_DEVICE)
1248 continue;
1250 if (cmd->index != hdev->id)
1251 continue;
1253 if (cmd->user_data != conn)
1254 continue;
1256 return cmd;
1259 return NULL;
1262 static void pairing_complete(struct pending_cmd *cmd, u8 status)
1264 struct mgmt_rp_pair_device rp;
1265 struct hci_conn *conn = cmd->user_data;
1267 bacpy(&rp.bdaddr, &conn->dst);
1268 rp.status = status;
1270 cmd_complete(cmd->sk, cmd->index, MGMT_OP_PAIR_DEVICE, &rp, sizeof(rp));
1272 /* So we don't get further callbacks for this connection */
1273 conn->connect_cfm_cb = NULL;
1274 conn->security_cfm_cb = NULL;
1275 conn->disconn_cfm_cb = NULL;
1277 hci_conn_put(conn);
1279 mgmt_pending_remove(cmd);
1282 static void pairing_complete_cb(struct hci_conn *conn, u8 status)
1284 struct pending_cmd *cmd;
1286 BT_DBG("status %u", status);
1288 cmd = find_pairing(conn);
1289 if (!cmd) {
1290 BT_DBG("Unable to find a pending command");
1291 return;
1294 pairing_complete(cmd, status);
1297 static int pair_device(struct sock *sk, u16 index, unsigned char *data, u16 len)
1299 struct hci_dev *hdev;
1300 struct mgmt_cp_pair_device *cp;
1301 struct pending_cmd *cmd;
1302 u8 sec_level, auth_type;
1303 struct hci_conn *conn;
1304 int err;
1306 BT_DBG("");
1308 cp = (void *) data;
1310 if (len != sizeof(*cp))
1311 return cmd_status(sk, index, MGMT_OP_PAIR_DEVICE, EINVAL);
1313 hdev = hci_dev_get(index);
1314 if (!hdev)
1315 return cmd_status(sk, index, MGMT_OP_PAIR_DEVICE, ENODEV);
1317 hci_dev_lock(hdev);
1319 if (cp->io_cap == 0x03) {
1320 sec_level = BT_SECURITY_MEDIUM;
1321 auth_type = HCI_AT_DEDICATED_BONDING;
1322 } else {
1323 sec_level = BT_SECURITY_HIGH;
1324 auth_type = HCI_AT_DEDICATED_BONDING_MITM;
1327 conn = hci_connect(hdev, ACL_LINK, &cp->bdaddr, sec_level, auth_type);
1328 if (IS_ERR(conn)) {
1329 err = PTR_ERR(conn);
1330 goto unlock;
1333 if (conn->connect_cfm_cb) {
1334 hci_conn_put(conn);
1335 err = cmd_status(sk, index, MGMT_OP_PAIR_DEVICE, EBUSY);
1336 goto unlock;
1339 cmd = mgmt_pending_add(sk, MGMT_OP_PAIR_DEVICE, index, data, len);
1340 if (!cmd) {
1341 err = -ENOMEM;
1342 hci_conn_put(conn);
1343 goto unlock;
1346 conn->connect_cfm_cb = pairing_complete_cb;
1347 conn->security_cfm_cb = pairing_complete_cb;
1348 conn->disconn_cfm_cb = pairing_complete_cb;
1349 conn->io_capability = cp->io_cap;
1350 cmd->user_data = conn;
1352 if (conn->state == BT_CONNECTED &&
1353 hci_conn_security(conn, sec_level, auth_type))
1354 pairing_complete(cmd, 0);
1356 err = 0;
1358 unlock:
1359 hci_dev_unlock(hdev);
1360 hci_dev_put(hdev);
1362 return err;
1365 static int user_confirm_reply(struct sock *sk, u16 index, unsigned char *data,
1366 u16 len, int success)
1368 struct mgmt_cp_user_confirm_reply *cp = (void *) data;
1369 u16 mgmt_op, hci_op;
1370 struct pending_cmd *cmd;
1371 struct hci_dev *hdev;
1372 int err;
1374 BT_DBG("");
1376 if (success) {
1377 mgmt_op = MGMT_OP_USER_CONFIRM_REPLY;
1378 hci_op = HCI_OP_USER_CONFIRM_REPLY;
1379 } else {
1380 mgmt_op = MGMT_OP_USER_CONFIRM_NEG_REPLY;
1381 hci_op = HCI_OP_USER_CONFIRM_NEG_REPLY;
1384 if (len != sizeof(*cp))
1385 return cmd_status(sk, index, mgmt_op, EINVAL);
1387 hdev = hci_dev_get(index);
1388 if (!hdev)
1389 return cmd_status(sk, index, mgmt_op, ENODEV);
1391 hci_dev_lock(hdev);
1393 if (!test_bit(HCI_UP, &hdev->flags)) {
1394 err = cmd_status(sk, index, mgmt_op, ENETDOWN);
1395 goto failed;
1398 cmd = mgmt_pending_add(sk, mgmt_op, index, data, len);
1399 if (!cmd) {
1400 err = -ENOMEM;
1401 goto failed;
1404 err = hci_send_cmd(hdev, hci_op, sizeof(cp->bdaddr), &cp->bdaddr);
1405 if (err < 0)
1406 mgmt_pending_remove(cmd);
1408 failed:
1409 hci_dev_unlock(hdev);
1410 hci_dev_put(hdev);
1412 return err;
1415 static int set_local_name(struct sock *sk, u16 index, unsigned char *data,
1416 u16 len)
1418 struct mgmt_cp_set_local_name *mgmt_cp = (void *) data;
1419 struct hci_cp_write_local_name hci_cp;
1420 struct hci_dev *hdev;
1421 struct pending_cmd *cmd;
1422 int err;
1424 BT_DBG("");
1426 if (len != sizeof(*mgmt_cp))
1427 return cmd_status(sk, index, MGMT_OP_SET_LOCAL_NAME, EINVAL);
1429 hdev = hci_dev_get(index);
1430 if (!hdev)
1431 return cmd_status(sk, index, MGMT_OP_SET_LOCAL_NAME, ENODEV);
1433 hci_dev_lock(hdev);
1435 cmd = mgmt_pending_add(sk, MGMT_OP_SET_LOCAL_NAME, index, data, len);
1436 if (!cmd) {
1437 err = -ENOMEM;
1438 goto failed;
1441 memcpy(hci_cp.name, mgmt_cp->name, sizeof(hci_cp.name));
1442 err = hci_send_cmd(hdev, HCI_OP_WRITE_LOCAL_NAME, sizeof(hci_cp),
1443 &hci_cp);
1444 if (err < 0)
1445 mgmt_pending_remove(cmd);
1447 failed:
1448 hci_dev_unlock(hdev);
1449 hci_dev_put(hdev);
1451 return err;
1454 static int read_local_oob_data(struct sock *sk, u16 index)
1456 struct hci_dev *hdev;
1457 struct pending_cmd *cmd;
1458 int err;
1460 BT_DBG("hci%u", index);
1462 hdev = hci_dev_get(index);
1463 if (!hdev)
1464 return cmd_status(sk, index, MGMT_OP_READ_LOCAL_OOB_DATA,
1465 ENODEV);
1467 hci_dev_lock(hdev);
1469 if (!test_bit(HCI_UP, &hdev->flags)) {
1470 err = cmd_status(sk, index, MGMT_OP_READ_LOCAL_OOB_DATA,
1471 ENETDOWN);
1472 goto unlock;
1475 if (!(hdev->features[6] & LMP_SIMPLE_PAIR)) {
1476 err = cmd_status(sk, index, MGMT_OP_READ_LOCAL_OOB_DATA,
1477 EOPNOTSUPP);
1478 goto unlock;
1481 if (mgmt_pending_find(MGMT_OP_READ_LOCAL_OOB_DATA, index)) {
1482 err = cmd_status(sk, index, MGMT_OP_READ_LOCAL_OOB_DATA, EBUSY);
1483 goto unlock;
1486 cmd = mgmt_pending_add(sk, MGMT_OP_READ_LOCAL_OOB_DATA, index, NULL, 0);
1487 if (!cmd) {
1488 err = -ENOMEM;
1489 goto unlock;
1492 err = hci_send_cmd(hdev, HCI_OP_READ_LOCAL_OOB_DATA, 0, NULL);
1493 if (err < 0)
1494 mgmt_pending_remove(cmd);
1496 unlock:
1497 hci_dev_unlock(hdev);
1498 hci_dev_put(hdev);
1500 return err;
1503 static int add_remote_oob_data(struct sock *sk, u16 index, unsigned char *data,
1504 u16 len)
1506 struct hci_dev *hdev;
1507 struct mgmt_cp_add_remote_oob_data *cp = (void *) data;
1508 int err;
1510 BT_DBG("hci%u ", index);
1512 if (len != sizeof(*cp))
1513 return cmd_status(sk, index, MGMT_OP_ADD_REMOTE_OOB_DATA,
1514 EINVAL);
1516 hdev = hci_dev_get(index);
1517 if (!hdev)
1518 return cmd_status(sk, index, MGMT_OP_ADD_REMOTE_OOB_DATA,
1519 ENODEV);
1521 hci_dev_lock(hdev);
1523 err = hci_add_remote_oob_data(hdev, &cp->bdaddr, cp->hash,
1524 cp->randomizer);
1525 if (err < 0)
1526 err = cmd_status(sk, index, MGMT_OP_ADD_REMOTE_OOB_DATA, -err);
1527 else
1528 err = cmd_complete(sk, index, MGMT_OP_ADD_REMOTE_OOB_DATA, NULL,
1531 hci_dev_unlock(hdev);
1532 hci_dev_put(hdev);
1534 return err;
1537 static int remove_remote_oob_data(struct sock *sk, u16 index,
1538 unsigned char *data, u16 len)
1540 struct hci_dev *hdev;
1541 struct mgmt_cp_remove_remote_oob_data *cp = (void *) data;
1542 int err;
1544 BT_DBG("hci%u ", index);
1546 if (len != sizeof(*cp))
1547 return cmd_status(sk, index, MGMT_OP_REMOVE_REMOTE_OOB_DATA,
1548 EINVAL);
1550 hdev = hci_dev_get(index);
1551 if (!hdev)
1552 return cmd_status(sk, index, MGMT_OP_REMOVE_REMOTE_OOB_DATA,
1553 ENODEV);
1555 hci_dev_lock(hdev);
1557 err = hci_remove_remote_oob_data(hdev, &cp->bdaddr);
1558 if (err < 0)
1559 err = cmd_status(sk, index, MGMT_OP_REMOVE_REMOTE_OOB_DATA,
1560 -err);
1561 else
1562 err = cmd_complete(sk, index, MGMT_OP_REMOVE_REMOTE_OOB_DATA,
1563 NULL, 0);
1565 hci_dev_unlock(hdev);
1566 hci_dev_put(hdev);
1568 return err;
1571 static int start_discovery(struct sock *sk, u16 index)
1573 u8 lap[3] = { 0x33, 0x8b, 0x9e };
1574 struct hci_cp_inquiry cp;
1575 struct pending_cmd *cmd;
1576 struct hci_dev *hdev;
1577 int err;
1579 BT_DBG("hci%u", index);
1581 hdev = hci_dev_get(index);
1582 if (!hdev)
1583 return cmd_status(sk, index, MGMT_OP_START_DISCOVERY, ENODEV);
1585 hci_dev_lock_bh(hdev);
1587 cmd = mgmt_pending_add(sk, MGMT_OP_START_DISCOVERY, index, NULL, 0);
1588 if (!cmd) {
1589 err = -ENOMEM;
1590 goto failed;
1593 memset(&cp, 0, sizeof(cp));
1594 memcpy(&cp.lap, lap, 3);
1595 cp.length = 0x08;
1596 cp.num_rsp = 0x00;
1598 err = hci_send_cmd(hdev, HCI_OP_INQUIRY, sizeof(cp), &cp);
1599 if (err < 0)
1600 mgmt_pending_remove(cmd);
1602 failed:
1603 hci_dev_unlock_bh(hdev);
1604 hci_dev_put(hdev);
1606 return err;
1609 static int stop_discovery(struct sock *sk, u16 index)
1611 struct hci_dev *hdev;
1612 struct pending_cmd *cmd;
1613 int err;
1615 BT_DBG("hci%u", index);
1617 hdev = hci_dev_get(index);
1618 if (!hdev)
1619 return cmd_status(sk, index, MGMT_OP_STOP_DISCOVERY, ENODEV);
1621 hci_dev_lock_bh(hdev);
1623 cmd = mgmt_pending_add(sk, MGMT_OP_STOP_DISCOVERY, index, NULL, 0);
1624 if (!cmd) {
1625 err = -ENOMEM;
1626 goto failed;
1629 err = hci_send_cmd(hdev, HCI_OP_INQUIRY_CANCEL, 0, NULL);
1630 if (err < 0)
1631 mgmt_pending_remove(cmd);
1633 failed:
1634 hci_dev_unlock_bh(hdev);
1635 hci_dev_put(hdev);
1637 return err;
1640 int mgmt_control(struct sock *sk, struct msghdr *msg, size_t msglen)
1642 unsigned char *buf;
1643 struct mgmt_hdr *hdr;
1644 u16 opcode, index, len;
1645 int err;
1647 BT_DBG("got %zu bytes", msglen);
1649 if (msglen < sizeof(*hdr))
1650 return -EINVAL;
1652 buf = kmalloc(msglen, GFP_KERNEL);
1653 if (!buf)
1654 return -ENOMEM;
1656 if (memcpy_fromiovec(buf, msg->msg_iov, msglen)) {
1657 err = -EFAULT;
1658 goto done;
1661 hdr = (struct mgmt_hdr *) buf;
1662 opcode = get_unaligned_le16(&hdr->opcode);
1663 index = get_unaligned_le16(&hdr->index);
1664 len = get_unaligned_le16(&hdr->len);
1666 if (len != msglen - sizeof(*hdr)) {
1667 err = -EINVAL;
1668 goto done;
1671 switch (opcode) {
1672 case MGMT_OP_READ_VERSION:
1673 err = read_version(sk);
1674 break;
1675 case MGMT_OP_READ_INDEX_LIST:
1676 err = read_index_list(sk);
1677 break;
1678 case MGMT_OP_READ_INFO:
1679 err = read_controller_info(sk, index);
1680 break;
1681 case MGMT_OP_SET_POWERED:
1682 err = set_powered(sk, index, buf + sizeof(*hdr), len);
1683 break;
1684 case MGMT_OP_SET_DISCOVERABLE:
1685 err = set_discoverable(sk, index, buf + sizeof(*hdr), len);
1686 break;
1687 case MGMT_OP_SET_CONNECTABLE:
1688 err = set_connectable(sk, index, buf + sizeof(*hdr), len);
1689 break;
1690 case MGMT_OP_SET_PAIRABLE:
1691 err = set_pairable(sk, index, buf + sizeof(*hdr), len);
1692 break;
1693 case MGMT_OP_ADD_UUID:
1694 err = add_uuid(sk, index, buf + sizeof(*hdr), len);
1695 break;
1696 case MGMT_OP_REMOVE_UUID:
1697 err = remove_uuid(sk, index, buf + sizeof(*hdr), len);
1698 break;
1699 case MGMT_OP_SET_DEV_CLASS:
1700 err = set_dev_class(sk, index, buf + sizeof(*hdr), len);
1701 break;
1702 case MGMT_OP_SET_SERVICE_CACHE:
1703 err = set_service_cache(sk, index, buf + sizeof(*hdr), len);
1704 break;
1705 case MGMT_OP_LOAD_KEYS:
1706 err = load_keys(sk, index, buf + sizeof(*hdr), len);
1707 break;
1708 case MGMT_OP_REMOVE_KEY:
1709 err = remove_key(sk, index, buf + sizeof(*hdr), len);
1710 break;
1711 case MGMT_OP_DISCONNECT:
1712 err = disconnect(sk, index, buf + sizeof(*hdr), len);
1713 break;
1714 case MGMT_OP_GET_CONNECTIONS:
1715 err = get_connections(sk, index);
1716 break;
1717 case MGMT_OP_PIN_CODE_REPLY:
1718 err = pin_code_reply(sk, index, buf + sizeof(*hdr), len);
1719 break;
1720 case MGMT_OP_PIN_CODE_NEG_REPLY:
1721 err = pin_code_neg_reply(sk, index, buf + sizeof(*hdr), len);
1722 break;
1723 case MGMT_OP_SET_IO_CAPABILITY:
1724 err = set_io_capability(sk, index, buf + sizeof(*hdr), len);
1725 break;
1726 case MGMT_OP_PAIR_DEVICE:
1727 err = pair_device(sk, index, buf + sizeof(*hdr), len);
1728 break;
1729 case MGMT_OP_USER_CONFIRM_REPLY:
1730 err = user_confirm_reply(sk, index, buf + sizeof(*hdr), len, 1);
1731 break;
1732 case MGMT_OP_USER_CONFIRM_NEG_REPLY:
1733 err = user_confirm_reply(sk, index, buf + sizeof(*hdr), len, 0);
1734 break;
1735 case MGMT_OP_SET_LOCAL_NAME:
1736 err = set_local_name(sk, index, buf + sizeof(*hdr), len);
1737 break;
1738 case MGMT_OP_READ_LOCAL_OOB_DATA:
1739 err = read_local_oob_data(sk, index);
1740 break;
1741 case MGMT_OP_ADD_REMOTE_OOB_DATA:
1742 err = add_remote_oob_data(sk, index, buf + sizeof(*hdr), len);
1743 break;
1744 case MGMT_OP_REMOVE_REMOTE_OOB_DATA:
1745 err = remove_remote_oob_data(sk, index, buf + sizeof(*hdr),
1746 len);
1747 break;
1748 case MGMT_OP_START_DISCOVERY:
1749 err = start_discovery(sk, index);
1750 break;
1751 case MGMT_OP_STOP_DISCOVERY:
1752 err = stop_discovery(sk, index);
1753 break;
1754 default:
1755 BT_DBG("Unknown op %u", opcode);
1756 err = cmd_status(sk, index, opcode, 0x01);
1757 break;
1760 if (err < 0)
1761 goto done;
1763 err = msglen;
1765 done:
1766 kfree(buf);
1767 return err;
1770 int mgmt_index_added(u16 index)
1772 return mgmt_event(MGMT_EV_INDEX_ADDED, index, NULL, 0, NULL);
1775 int mgmt_index_removed(u16 index)
1777 return mgmt_event(MGMT_EV_INDEX_REMOVED, index, NULL, 0, NULL);
1780 struct cmd_lookup {
1781 u8 val;
1782 struct sock *sk;
1785 static void mode_rsp(struct pending_cmd *cmd, void *data)
1787 struct mgmt_mode *cp = cmd->param;
1788 struct cmd_lookup *match = data;
1790 if (cp->val != match->val)
1791 return;
1793 send_mode_rsp(cmd->sk, cmd->opcode, cmd->index, cp->val);
1795 list_del(&cmd->list);
1797 if (match->sk == NULL) {
1798 match->sk = cmd->sk;
1799 sock_hold(match->sk);
1802 mgmt_pending_free(cmd);
1805 int mgmt_powered(u16 index, u8 powered)
1807 struct mgmt_mode ev;
1808 struct cmd_lookup match = { powered, NULL };
1809 int ret;
1811 mgmt_pending_foreach(MGMT_OP_SET_POWERED, index, mode_rsp, &match);
1813 ev.val = powered;
1815 ret = mgmt_event(MGMT_EV_POWERED, index, &ev, sizeof(ev), match.sk);
1817 if (match.sk)
1818 sock_put(match.sk);
1820 return ret;
1823 int mgmt_discoverable(u16 index, u8 discoverable)
1825 struct mgmt_mode ev;
1826 struct cmd_lookup match = { discoverable, NULL };
1827 int ret;
1829 mgmt_pending_foreach(MGMT_OP_SET_DISCOVERABLE, index, mode_rsp, &match);
1831 ev.val = discoverable;
1833 ret = mgmt_event(MGMT_EV_DISCOVERABLE, index, &ev, sizeof(ev),
1834 match.sk);
1836 if (match.sk)
1837 sock_put(match.sk);
1839 return ret;
1842 int mgmt_connectable(u16 index, u8 connectable)
1844 struct mgmt_mode ev;
1845 struct cmd_lookup match = { connectable, NULL };
1846 int ret;
1848 mgmt_pending_foreach(MGMT_OP_SET_CONNECTABLE, index, mode_rsp, &match);
1850 ev.val = connectable;
1852 ret = mgmt_event(MGMT_EV_CONNECTABLE, index, &ev, sizeof(ev), match.sk);
1854 if (match.sk)
1855 sock_put(match.sk);
1857 return ret;
1860 int mgmt_new_key(u16 index, struct link_key *key, u8 persistent)
1862 struct mgmt_ev_new_key ev;
1864 memset(&ev, 0, sizeof(ev));
1866 ev.store_hint = persistent;
1867 bacpy(&ev.key.bdaddr, &key->bdaddr);
1868 ev.key.type = key->type;
1869 memcpy(ev.key.val, key->val, 16);
1870 ev.key.pin_len = key->pin_len;
1872 return mgmt_event(MGMT_EV_NEW_KEY, index, &ev, sizeof(ev), NULL);
1875 int mgmt_connected(u16 index, bdaddr_t *bdaddr)
1877 struct mgmt_ev_connected ev;
1879 bacpy(&ev.bdaddr, bdaddr);
1881 return mgmt_event(MGMT_EV_CONNECTED, index, &ev, sizeof(ev), NULL);
1884 static void disconnect_rsp(struct pending_cmd *cmd, void *data)
1886 struct mgmt_cp_disconnect *cp = cmd->param;
1887 struct sock **sk = data;
1888 struct mgmt_rp_disconnect rp;
1890 bacpy(&rp.bdaddr, &cp->bdaddr);
1892 cmd_complete(cmd->sk, cmd->index, MGMT_OP_DISCONNECT, &rp, sizeof(rp));
1894 *sk = cmd->sk;
1895 sock_hold(*sk);
1897 mgmt_pending_remove(cmd);
1900 int mgmt_disconnected(u16 index, bdaddr_t *bdaddr)
1902 struct mgmt_ev_disconnected ev;
1903 struct sock *sk = NULL;
1904 int err;
1906 mgmt_pending_foreach(MGMT_OP_DISCONNECT, index, disconnect_rsp, &sk);
1908 bacpy(&ev.bdaddr, bdaddr);
1910 err = mgmt_event(MGMT_EV_DISCONNECTED, index, &ev, sizeof(ev), sk);
1912 if (sk)
1913 sock_put(sk);
1915 return err;
1918 int mgmt_disconnect_failed(u16 index)
1920 struct pending_cmd *cmd;
1921 int err;
1923 cmd = mgmt_pending_find(MGMT_OP_DISCONNECT, index);
1924 if (!cmd)
1925 return -ENOENT;
1927 err = cmd_status(cmd->sk, index, MGMT_OP_DISCONNECT, EIO);
1929 mgmt_pending_remove(cmd);
1931 return err;
1934 int mgmt_connect_failed(u16 index, bdaddr_t *bdaddr, u8 status)
1936 struct mgmt_ev_connect_failed ev;
1938 bacpy(&ev.bdaddr, bdaddr);
1939 ev.status = status;
1941 return mgmt_event(MGMT_EV_CONNECT_FAILED, index, &ev, sizeof(ev), NULL);
1944 int mgmt_pin_code_request(u16 index, bdaddr_t *bdaddr, u8 secure)
1946 struct mgmt_ev_pin_code_request ev;
1948 bacpy(&ev.bdaddr, bdaddr);
1949 ev.secure = secure;
1951 return mgmt_event(MGMT_EV_PIN_CODE_REQUEST, index, &ev, sizeof(ev),
1952 NULL);
1955 int mgmt_pin_code_reply_complete(u16 index, bdaddr_t *bdaddr, u8 status)
1957 struct pending_cmd *cmd;
1958 struct mgmt_rp_pin_code_reply rp;
1959 int err;
1961 cmd = mgmt_pending_find(MGMT_OP_PIN_CODE_REPLY, index);
1962 if (!cmd)
1963 return -ENOENT;
1965 bacpy(&rp.bdaddr, bdaddr);
1966 rp.status = status;
1968 err = cmd_complete(cmd->sk, index, MGMT_OP_PIN_CODE_REPLY, &rp,
1969 sizeof(rp));
1971 mgmt_pending_remove(cmd);
1973 return err;
1976 int mgmt_pin_code_neg_reply_complete(u16 index, bdaddr_t *bdaddr, u8 status)
1978 struct pending_cmd *cmd;
1979 struct mgmt_rp_pin_code_reply rp;
1980 int err;
1982 cmd = mgmt_pending_find(MGMT_OP_PIN_CODE_NEG_REPLY, index);
1983 if (!cmd)
1984 return -ENOENT;
1986 bacpy(&rp.bdaddr, bdaddr);
1987 rp.status = status;
1989 err = cmd_complete(cmd->sk, index, MGMT_OP_PIN_CODE_NEG_REPLY, &rp,
1990 sizeof(rp));
1992 mgmt_pending_remove(cmd);
1994 return err;
1997 int mgmt_user_confirm_request(u16 index, bdaddr_t *bdaddr, __le32 value,
1998 u8 confirm_hint)
2000 struct mgmt_ev_user_confirm_request ev;
2002 BT_DBG("hci%u", index);
2004 bacpy(&ev.bdaddr, bdaddr);
2005 ev.confirm_hint = confirm_hint;
2006 put_unaligned_le32(value, &ev.value);
2008 return mgmt_event(MGMT_EV_USER_CONFIRM_REQUEST, index, &ev, sizeof(ev),
2009 NULL);
2012 static int confirm_reply_complete(u16 index, bdaddr_t *bdaddr, u8 status,
2013 u8 opcode)
2015 struct pending_cmd *cmd;
2016 struct mgmt_rp_user_confirm_reply rp;
2017 int err;
2019 cmd = mgmt_pending_find(opcode, index);
2020 if (!cmd)
2021 return -ENOENT;
2023 bacpy(&rp.bdaddr, bdaddr);
2024 rp.status = status;
2025 err = cmd_complete(cmd->sk, index, opcode, &rp, sizeof(rp));
2027 mgmt_pending_remove(cmd);
2029 return err;
2032 int mgmt_user_confirm_reply_complete(u16 index, bdaddr_t *bdaddr, u8 status)
2034 return confirm_reply_complete(index, bdaddr, status,
2035 MGMT_OP_USER_CONFIRM_REPLY);
2038 int mgmt_user_confirm_neg_reply_complete(u16 index, bdaddr_t *bdaddr, u8 status)
2040 return confirm_reply_complete(index, bdaddr, status,
2041 MGMT_OP_USER_CONFIRM_NEG_REPLY);
2044 int mgmt_auth_failed(u16 index, bdaddr_t *bdaddr, u8 status)
2046 struct mgmt_ev_auth_failed ev;
2048 bacpy(&ev.bdaddr, bdaddr);
2049 ev.status = status;
2051 return mgmt_event(MGMT_EV_AUTH_FAILED, index, &ev, sizeof(ev), NULL);
2054 int mgmt_set_local_name_complete(u16 index, u8 *name, u8 status)
2056 struct pending_cmd *cmd;
2057 struct hci_dev *hdev;
2058 struct mgmt_cp_set_local_name ev;
2059 int err;
2061 memset(&ev, 0, sizeof(ev));
2062 memcpy(ev.name, name, HCI_MAX_NAME_LENGTH);
2064 cmd = mgmt_pending_find(MGMT_OP_SET_LOCAL_NAME, index);
2065 if (!cmd)
2066 goto send_event;
2068 if (status) {
2069 err = cmd_status(cmd->sk, index, MGMT_OP_SET_LOCAL_NAME, EIO);
2070 goto failed;
2073 hdev = hci_dev_get(index);
2074 if (hdev) {
2075 hci_dev_lock_bh(hdev);
2076 update_eir(hdev);
2077 hci_dev_unlock_bh(hdev);
2078 hci_dev_put(hdev);
2081 err = cmd_complete(cmd->sk, index, MGMT_OP_SET_LOCAL_NAME, &ev,
2082 sizeof(ev));
2083 if (err < 0)
2084 goto failed;
2086 send_event:
2087 err = mgmt_event(MGMT_EV_LOCAL_NAME_CHANGED, index, &ev, sizeof(ev),
2088 cmd ? cmd->sk : NULL);
2090 failed:
2091 if (cmd)
2092 mgmt_pending_remove(cmd);
2093 return err;
2096 int mgmt_read_local_oob_data_reply_complete(u16 index, u8 *hash, u8 *randomizer,
2097 u8 status)
2099 struct pending_cmd *cmd;
2100 int err;
2102 BT_DBG("hci%u status %u", index, status);
2104 cmd = mgmt_pending_find(MGMT_OP_READ_LOCAL_OOB_DATA, index);
2105 if (!cmd)
2106 return -ENOENT;
2108 if (status) {
2109 err = cmd_status(cmd->sk, index, MGMT_OP_READ_LOCAL_OOB_DATA,
2110 EIO);
2111 } else {
2112 struct mgmt_rp_read_local_oob_data rp;
2114 memcpy(rp.hash, hash, sizeof(rp.hash));
2115 memcpy(rp.randomizer, randomizer, sizeof(rp.randomizer));
2117 err = cmd_complete(cmd->sk, index, MGMT_OP_READ_LOCAL_OOB_DATA,
2118 &rp, sizeof(rp));
2121 mgmt_pending_remove(cmd);
2123 return err;
2126 int mgmt_device_found(u16 index, bdaddr_t *bdaddr, u8 *dev_class, s8 rssi,
2127 u8 *eir)
2129 struct mgmt_ev_device_found ev;
2131 memset(&ev, 0, sizeof(ev));
2133 bacpy(&ev.bdaddr, bdaddr);
2134 memcpy(ev.dev_class, dev_class, sizeof(ev.dev_class));
2135 ev.rssi = rssi;
2137 if (eir)
2138 memcpy(ev.eir, eir, sizeof(ev.eir));
2140 return mgmt_event(MGMT_EV_DEVICE_FOUND, index, &ev, sizeof(ev), NULL);
2143 int mgmt_remote_name(u16 index, bdaddr_t *bdaddr, u8 *name)
2145 struct mgmt_ev_remote_name ev;
2147 memset(&ev, 0, sizeof(ev));
2149 bacpy(&ev.bdaddr, bdaddr);
2150 memcpy(ev.name, name, HCI_MAX_NAME_LENGTH);
2152 return mgmt_event(MGMT_EV_REMOTE_NAME, index, &ev, sizeof(ev), NULL);
2155 int mgmt_discovering(u16 index, u8 discovering)
2157 return mgmt_event(MGMT_EV_DISCOVERING, index, &discovering,
2158 sizeof(discovering), NULL);