linux/net/bluetooth/mgmt.c
<<
>>
Prefs
   1/*
   2   BlueZ - Bluetooth protocol stack for Linux
   3
   4   Copyright (C) 2010  Nokia Corporation
   5   Copyright (C) 2011-2012 Intel Corporation
   6
   7   This program is free software; you can redistribute it and/or modify
   8   it under the terms of the GNU General Public License version 2 as
   9   published by the Free Software Foundation;
  10
  11   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  12   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  13   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
  14   IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
  15   CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
  16   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  17   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  18   OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  19
  20   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
  21   COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
  22   SOFTWARE IS DISCLAIMED.
  23*/
  24
  25/* Bluetooth HCI Management interface */
  26
  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
  35bool enable_hs;
  36
  37#define MGMT_VERSION    1
  38#define MGMT_REVISION   3
  39
  40static const u16 mgmt_commands[] = {
  41        MGMT_OP_READ_INDEX_LIST,
  42        MGMT_OP_READ_INFO,
  43        MGMT_OP_SET_POWERED,
  44        MGMT_OP_SET_DISCOVERABLE,
  45        MGMT_OP_SET_CONNECTABLE,
  46        MGMT_OP_SET_FAST_CONNECTABLE,
  47        MGMT_OP_SET_PAIRABLE,
  48        MGMT_OP_SET_LINK_SECURITY,
  49        MGMT_OP_SET_SSP,
  50        MGMT_OP_SET_HS,
  51        MGMT_OP_SET_LE,
  52        MGMT_OP_SET_DEV_CLASS,
  53        MGMT_OP_SET_LOCAL_NAME,
  54        MGMT_OP_ADD_UUID,
  55        MGMT_OP_REMOVE_UUID,
  56        MGMT_OP_LOAD_LINK_KEYS,
  57        MGMT_OP_LOAD_LONG_TERM_KEYS,
  58        MGMT_OP_DISCONNECT,
  59        MGMT_OP_GET_CONNECTIONS,
  60        MGMT_OP_PIN_CODE_REPLY,
  61        MGMT_OP_PIN_CODE_NEG_REPLY,
  62        MGMT_OP_SET_IO_CAPABILITY,
  63        MGMT_OP_PAIR_DEVICE,
  64        MGMT_OP_CANCEL_PAIR_DEVICE,
  65        MGMT_OP_UNPAIR_DEVICE,
  66        MGMT_OP_USER_CONFIRM_REPLY,
  67        MGMT_OP_USER_CONFIRM_NEG_REPLY,
  68        MGMT_OP_USER_PASSKEY_REPLY,
  69        MGMT_OP_USER_PASSKEY_NEG_REPLY,
  70        MGMT_OP_READ_LOCAL_OOB_DATA,
  71        MGMT_OP_ADD_REMOTE_OOB_DATA,
  72        MGMT_OP_REMOVE_REMOTE_OOB_DATA,
  73        MGMT_OP_START_DISCOVERY,
  74        MGMT_OP_STOP_DISCOVERY,
  75        MGMT_OP_CONFIRM_NAME,
  76        MGMT_OP_BLOCK_DEVICE,
  77        MGMT_OP_UNBLOCK_DEVICE,
  78        MGMT_OP_SET_DEVICE_ID,
  79};
  80
  81static const u16 mgmt_events[] = {
  82        MGMT_EV_CONTROLLER_ERROR,
  83        MGMT_EV_INDEX_ADDED,
  84        MGMT_EV_INDEX_REMOVED,
  85        MGMT_EV_NEW_SETTINGS,
  86        MGMT_EV_CLASS_OF_DEV_CHANGED,
  87        MGMT_EV_LOCAL_NAME_CHANGED,
  88        MGMT_EV_NEW_LINK_KEY,
  89        MGMT_EV_NEW_LONG_TERM_KEY,
  90        MGMT_EV_DEVICE_CONNECTED,
  91        MGMT_EV_DEVICE_DISCONNECTED,
  92        MGMT_EV_CONNECT_FAILED,
  93        MGMT_EV_PIN_CODE_REQUEST,
  94        MGMT_EV_USER_CONFIRM_REQUEST,
  95        MGMT_EV_USER_PASSKEY_REQUEST,
  96        MGMT_EV_AUTH_FAILED,
  97        MGMT_EV_DEVICE_FOUND,
  98        MGMT_EV_DISCOVERING,
  99        MGMT_EV_DEVICE_BLOCKED,
 100        MGMT_EV_DEVICE_UNBLOCKED,
 101        MGMT_EV_DEVICE_UNPAIRED,
 102        MGMT_EV_PASSKEY_NOTIFY,
 103};
 104
 105/*
 106 * These LE scan and inquiry parameters were chosen according to LE General
 107 * Discovery Procedure specification.
 108 */
 109#define LE_SCAN_TYPE                    0x01
 110#define LE_SCAN_WIN                     0x12
 111#define LE_SCAN_INT                     0x12
 112#define LE_SCAN_TIMEOUT_LE_ONLY         10240   /* TGAP(gen_disc_scan_min) */
 113#define LE_SCAN_TIMEOUT_BREDR_LE        5120    /* TGAP(100)/2 */
 114
 115#define INQUIRY_LEN_BREDR               0x08    /* TGAP(100) */
 116#define INQUIRY_LEN_BREDR_LE            0x04    /* TGAP(100)/2 */
 117
 118#define CACHE_TIMEOUT   msecs_to_jiffies(2 * 1000)
 119
 120#define hdev_is_powered(hdev) (test_bit(HCI_UP, &hdev->flags) && \
 121                                !test_bit(HCI_AUTO_OFF, &hdev->dev_flags))
 122
 123struct pending_cmd {
 124        struct list_head list;
 125        u16 opcode;
 126        int index;
 127        void *param;
 128        struct sock *sk;
 129        void *user_data;
 130};
 131
 132/* HCI to MGMT error code conversion table */
 133static u8 mgmt_status_table[] = {
 134        MGMT_STATUS_SUCCESS,
 135        MGMT_STATUS_UNKNOWN_COMMAND,    /* Unknown Command */
 136        MGMT_STATUS_NOT_CONNECTED,      /* No Connection */
 137        MGMT_STATUS_FAILED,             /* Hardware Failure */
 138        MGMT_STATUS_CONNECT_FAILED,     /* Page Timeout */
 139        MGMT_STATUS_AUTH_FAILED,        /* Authentication Failed */
 140        MGMT_STATUS_NOT_PAIRED,         /* PIN or Key Missing */
 141        MGMT_STATUS_NO_RESOURCES,       /* Memory Full */
 142        MGMT_STATUS_TIMEOUT,            /* Connection Timeout */
 143        MGMT_STATUS_NO_RESOURCES,       /* Max Number of Connections */
 144        MGMT_STATUS_NO_RESOURCES,       /* Max Number of SCO Connections */
 145        MGMT_STATUS_ALREADY_CONNECTED,  /* ACL Connection Exists */
 146        MGMT_STATUS_BUSY,               /* Command Disallowed */
 147        MGMT_STATUS_NO_RESOURCES,       /* Rejected Limited Resources */
 148        MGMT_STATUS_REJECTED,           /* Rejected Security */
 149        MGMT_STATUS_REJECTED,           /* Rejected Personal */
 150        MGMT_STATUS_TIMEOUT,            /* Host Timeout */
 151        MGMT_STATUS_NOT_SUPPORTED,      /* Unsupported Feature */
 152        MGMT_STATUS_INVALID_PARAMS,     /* Invalid Parameters */
 153        MGMT_STATUS_DISCONNECTED,       /* OE User Ended Connection */
 154        MGMT_STATUS_NO_RESOURCES,       /* OE Low Resources */
 155        MGMT_STATUS_DISCONNECTED,       /* OE Power Off */
 156        MGMT_STATUS_DISCONNECTED,       /* Connection Terminated */
 157        MGMT_STATUS_BUSY,               /* Repeated Attempts */
 158        MGMT_STATUS_REJECTED,           /* Pairing Not Allowed */
 159        MGMT_STATUS_FAILED,             /* Unknown LMP PDU */
 160        MGMT_STATUS_NOT_SUPPORTED,      /* Unsupported Remote Feature */
 161        MGMT_STATUS_REJECTED,           /* SCO Offset Rejected */
 162        MGMT_STATUS_REJECTED,           /* SCO Interval Rejected */
 163        MGMT_STATUS_REJECTED,           /* Air Mode Rejected */
 164        MGMT_STATUS_INVALID_PARAMS,     /* Invalid LMP Parameters */
 165        MGMT_STATUS_FAILED,             /* Unspecified Error */
 166        MGMT_STATUS_NOT_SUPPORTED,      /* Unsupported LMP Parameter Value */
 167        MGMT_STATUS_FAILED,             /* Role Change Not Allowed */
 168        MGMT_STATUS_TIMEOUT,            /* LMP Response Timeout */
 169        MGMT_STATUS_FAILED,             /* LMP Error Transaction Collision */
 170        MGMT_STATUS_FAILED,             /* LMP PDU Not Allowed */
 171        MGMT_STATUS_REJECTED,           /* Encryption Mode Not Accepted */
 172        MGMT_STATUS_FAILED,             /* Unit Link Key Used */
 173        MGMT_STATUS_NOT_SUPPORTED,      /* QoS Not Supported */
 174        MGMT_STATUS_TIMEOUT,            /* Instant Passed */
 175        MGMT_STATUS_NOT_SUPPORTED,      /* Pairing Not Supported */
 176        MGMT_STATUS_FAILED,             /* Transaction Collision */
 177        MGMT_STATUS_INVALID_PARAMS,     /* Unacceptable Parameter */
 178        MGMT_STATUS_REJECTED,           /* QoS Rejected */
 179        MGMT_STATUS_NOT_SUPPORTED,      /* Classification Not Supported */
 180        MGMT_STATUS_REJECTED,           /* Insufficient Security */
 181        MGMT_STATUS_INVALID_PARAMS,     /* Parameter Out Of Range */
 182        MGMT_STATUS_BUSY,               /* Role Switch Pending */
 183        MGMT_STATUS_FAILED,             /* Slot Violation */
 184        MGMT_STATUS_FAILED,             /* Role Switch Failed */
 185        MGMT_STATUS_INVALID_PARAMS,     /* EIR Too Large */
 186        MGMT_STATUS_NOT_SUPPORTED,      /* Simple Pairing Not Supported */
 187        MGMT_STATUS_BUSY,               /* Host Busy Pairing */
 188        MGMT_STATUS_REJECTED,           /* Rejected, No Suitable Channel */
 189        MGMT_STATUS_BUSY,               /* Controller Busy */
 190        MGMT_STATUS_INVALID_PARAMS,     /* Unsuitable Connection Interval */
 191        MGMT_STATUS_TIMEOUT,            /* Directed Advertising Timeout */
 192        MGMT_STATUS_AUTH_FAILED,        /* Terminated Due to MIC Failure */
 193        MGMT_STATUS_CONNECT_FAILED,     /* Connection Establishment Failed */
 194        MGMT_STATUS_CONNECT_FAILED,     /* MAC Connection Failed */
 195};
 196
 197bool mgmt_valid_hdev(struct hci_dev *hdev)
 198{
 199        return hdev->dev_type == HCI_BREDR;
 200}
 201
 202static u8 mgmt_status(u8 hci_status)
 203{
 204        if (hci_status < ARRAY_SIZE(mgmt_status_table))
 205                return mgmt_status_table[hci_status];
 206
 207        return MGMT_STATUS_FAILED;
 208}
 209
 210static int cmd_status(struct sock *sk, u16 index, u16 cmd, u8 status)
 211{
 212        struct sk_buff *skb;
 213        struct mgmt_hdr *hdr;
 214        struct mgmt_ev_cmd_status *ev;
 215        int err;
 216
 217        BT_DBG("sock %p, index %u, cmd %u, status %u", sk, index, cmd, status);
 218
 219        skb = alloc_skb(sizeof(*hdr) + sizeof(*ev), GFP_KERNEL);
 220        if (!skb)
 221                return -ENOMEM;
 222
 223        hdr = (void *) skb_put(skb, sizeof(*hdr));
 224
 225        hdr->opcode = __constant_cpu_to_le16(MGMT_EV_CMD_STATUS);
 226        hdr->index = cpu_to_le16(index);
 227        hdr->len = cpu_to_le16(sizeof(*ev));
 228
 229        ev = (void *) skb_put(skb, sizeof(*ev));
 230        ev->status = status;
 231        ev->opcode = cpu_to_le16(cmd);
 232
 233        err = sock_queue_rcv_skb(sk, skb);
 234        if (err < 0)
 235                kfree_skb(skb);
 236
 237        return err;
 238}
 239
 240static int cmd_complete(struct sock *sk, u16 index, u16 cmd, u8 status,
 241                        void *rp, size_t rp_len)
 242{
 243        struct sk_buff *skb;
 244        struct mgmt_hdr *hdr;
 245        struct mgmt_ev_cmd_complete *ev;
 246        int err;
 247
 248        BT_DBG("sock %p", sk);
 249
 250        skb = alloc_skb(sizeof(*hdr) + sizeof(*ev) + rp_len, GFP_KERNEL);
 251        if (!skb)
 252                return -ENOMEM;
 253
 254        hdr = (void *) skb_put(skb, sizeof(*hdr));
 255
 256        hdr->opcode = __constant_cpu_to_le16(MGMT_EV_CMD_COMPLETE);
 257        hdr->index = cpu_to_le16(index);
 258        hdr->len = cpu_to_le16(sizeof(*ev) + rp_len);
 259
 260        ev = (void *) skb_put(skb, sizeof(*ev) + rp_len);
 261        ev->opcode = cpu_to_le16(cmd);
 262        ev->status = status;
 263
 264        if (rp)
 265                memcpy(ev->data, rp, rp_len);
 266
 267        err = sock_queue_rcv_skb(sk, skb);
 268        if (err < 0)
 269                kfree_skb(skb);
 270
 271        return err;
 272}
 273
 274static int read_version(struct sock *sk, struct hci_dev *hdev, void *data,
 275                        u16 data_len)
 276{
 277        struct mgmt_rp_read_version rp;
 278
 279        BT_DBG("sock %p", sk);
 280
 281        rp.version = MGMT_VERSION;
 282        rp.revision = __constant_cpu_to_le16(MGMT_REVISION);
 283
 284        return cmd_complete(sk, MGMT_INDEX_NONE, MGMT_OP_READ_VERSION, 0, &rp,
 285                            sizeof(rp));
 286}
 287
 288static int read_commands(struct sock *sk, struct hci_dev *hdev, void *data,
 289                         u16 data_len)
 290{
 291        struct mgmt_rp_read_commands *rp;
 292        const u16 num_commands = ARRAY_SIZE(mgmt_commands);
 293        const u16 num_events = ARRAY_SIZE(mgmt_events);
 294        __le16 *opcode;
 295        size_t rp_size;
 296        int i, err;
 297
 298        BT_DBG("sock %p", sk);
 299
 300        rp_size = sizeof(*rp) + ((num_commands + num_events) * sizeof(u16));
 301
 302        rp = kmalloc(rp_size, GFP_KERNEL);
 303        if (!rp)
 304                return -ENOMEM;
 305
 306        rp->num_commands = __constant_cpu_to_le16(num_commands);
 307        rp->num_events = __constant_cpu_to_le16(num_events);
 308
 309        for (i = 0, opcode = rp->opcodes; i < num_commands; i++, opcode++)
 310                put_unaligned_le16(mgmt_commands[i], opcode);
 311
 312        for (i = 0; i < num_events; i++, opcode++)
 313                put_unaligned_le16(mgmt_events[i], opcode);
 314
 315        err = cmd_complete(sk, MGMT_INDEX_NONE, MGMT_OP_READ_COMMANDS, 0, rp,
 316                           rp_size);
 317        kfree(rp);
 318
 319        return err;
 320}
 321
 322static int read_index_list(struct sock *sk, struct hci_dev *hdev, void *data,
 323                           u16 data_len)
 324{
 325        struct mgmt_rp_read_index_list *rp;
 326        struct hci_dev *d;
 327        size_t rp_len;
 328        u16 count;
 329        int err;
 330
 331        BT_DBG("sock %p", sk);
 332
 333        read_lock(&hci_dev_list_lock);
 334
 335        count = 0;
 336        list_for_each_entry(d, &hci_dev_list, list) {
 337                if (!mgmt_valid_hdev(d))
 338                        continue;
 339
 340                count++;
 341        }
 342
 343        rp_len = sizeof(*rp) + (2 * count);
 344        rp = kmalloc(rp_len, GFP_ATOMIC);
 345        if (!rp) {
 346                read_unlock(&hci_dev_list_lock);
 347                return -ENOMEM;
 348        }
 349
 350        count = 0;
 351        list_for_each_entry(d, &hci_dev_list, list) {
 352                if (test_bit(HCI_SETUP, &d->dev_flags))
 353                        continue;
 354
 355                if (!mgmt_valid_hdev(d))
 356                        continue;
 357
 358                rp->index[count++] = cpu_to_le16(d->id);
 359                BT_DBG("Added hci%u", d->id);
 360        }
 361
 362        rp->num_controllers = cpu_to_le16(count);
 363        rp_len = sizeof(*rp) + (2 * count);
 364
 365        read_unlock(&hci_dev_list_lock);
 366
 367        err = cmd_complete(sk, MGMT_INDEX_NONE, MGMT_OP_READ_INDEX_LIST, 0, rp,
 368                           rp_len);
 369
 370        kfree(rp);
 371
 372        return err;
 373}
 374
 375static u32 get_supported_settings(struct hci_dev *hdev)
 376{
 377        u32 settings = 0;
 378
 379        settings |= MGMT_SETTING_POWERED;
 380        settings |= MGMT_SETTING_PAIRABLE;
 381
 382        if (lmp_ssp_capable(hdev))
 383                settings |= MGMT_SETTING_SSP;
 384
 385        if (lmp_bredr_capable(hdev)) {
 386                settings |= MGMT_SETTING_CONNECTABLE;
 387                settings |= MGMT_SETTING_FAST_CONNECTABLE;
 388                settings |= MGMT_SETTING_DISCOVERABLE;
 389                settings |= MGMT_SETTING_BREDR;
 390                settings |= MGMT_SETTING_LINK_SECURITY;
 391        }
 392
 393        if (enable_hs)
 394                settings |= MGMT_SETTING_HS;
 395
 396        if (lmp_le_capable(hdev))
 397                settings |= MGMT_SETTING_LE;
 398
 399        return settings;
 400}
 401
 402static u32 get_current_settings(struct hci_dev *hdev)
 403{
 404        u32 settings = 0;
 405
 406        if (hdev_is_powered(hdev))
 407                settings |= MGMT_SETTING_POWERED;
 408
 409        if (test_bit(HCI_CONNECTABLE, &hdev->dev_flags))
 410                settings |= MGMT_SETTING_CONNECTABLE;
 411
 412        if (test_bit(HCI_DISCOVERABLE, &hdev->dev_flags))
 413                settings |= MGMT_SETTING_DISCOVERABLE;
 414
 415        if (test_bit(HCI_PAIRABLE, &hdev->dev_flags))
 416                settings |= MGMT_SETTING_PAIRABLE;
 417
 418        if (lmp_bredr_capable(hdev))
 419                settings |= MGMT_SETTING_BREDR;
 420
 421        if (test_bit(HCI_LE_ENABLED, &hdev->dev_flags))
 422                settings |= MGMT_SETTING_LE;
 423
 424        if (test_bit(HCI_LINK_SECURITY, &hdev->dev_flags))
 425                settings |= MGMT_SETTING_LINK_SECURITY;
 426
 427        if (test_bit(HCI_SSP_ENABLED, &hdev->dev_flags))
 428                settings |= MGMT_SETTING_SSP;
 429
 430        if (test_bit(HCI_HS_ENABLED, &hdev->dev_flags))
 431                settings |= MGMT_SETTING_HS;
 432
 433        return settings;
 434}
 435
 436#define PNP_INFO_SVCLASS_ID             0x1200
 437
 438static u8 *create_uuid16_list(struct hci_dev *hdev, u8 *data, ptrdiff_t len)
 439{
 440        u8 *ptr = data, *uuids_start = NULL;
 441        struct bt_uuid *uuid;
 442
 443        if (len < 4)
 444                return ptr;
 445
 446        list_for_each_entry(uuid, &hdev->uuids, list) {
 447                u16 uuid16;
 448
 449                if (uuid->size != 16)
 450                        continue;
 451
 452                uuid16 = get_unaligned_le16(&uuid->uuid[12]);
 453                if (uuid16 < 0x1100)
 454                        continue;
 455
 456                if (uuid16 == PNP_INFO_SVCLASS_ID)
 457                        continue;
 458
 459                if (!uuids_start) {
 460                        uuids_start = ptr;
 461                        uuids_start[0] = 1;
 462                        uuids_start[1] = EIR_UUID16_ALL;
 463                        ptr += 2;
 464                }
 465
 466                /* Stop if not enough space to put next UUID */
 467                if ((ptr - data) + sizeof(u16) > len) {
 468                        uuids_start[1] = EIR_UUID16_SOME;
 469                        break;
 470                }
 471
 472                *ptr++ = (uuid16 & 0x00ff);
 473                *ptr++ = (uuid16 & 0xff00) >> 8;
 474                uuids_start[0] += sizeof(uuid16);
 475        }
 476
 477        return ptr;
 478}
 479
 480static u8 *create_uuid32_list(struct hci_dev *hdev, u8 *data, ptrdiff_t len)
 481{
 482        u8 *ptr = data, *uuids_start = NULL;
 483        struct bt_uuid *uuid;
 484
 485        if (len < 6)
 486                return ptr;
 487
 488        list_for_each_entry(uuid, &hdev->uuids, list) {
 489                if (uuid->size != 32)
 490                        continue;
 491
 492                if (!uuids_start) {
 493                        uuids_start = ptr;
 494                        uuids_start[0] = 1;
 495                        uuids_start[1] = EIR_UUID32_ALL;
 496                        ptr += 2;
 497                }
 498
 499                /* Stop if not enough space to put next UUID */
 500                if ((ptr - data) + sizeof(u32) > len) {
 501                        uuids_start[1] = EIR_UUID32_SOME;
 502                        break;
 503                }
 504
 505                memcpy(ptr, &uuid->uuid[12], sizeof(u32));
 506                ptr += sizeof(u32);
 507                uuids_start[0] += sizeof(u32);
 508        }
 509
 510        return ptr;
 511}
 512
 513static u8 *create_uuid128_list(struct hci_dev *hdev, u8 *data, ptrdiff_t len)
 514{
 515        u8 *ptr = data, *uuids_start = NULL;
 516        struct bt_uuid *uuid;
 517
 518        if (len < 18)
 519                return ptr;
 520
 521        list_for_each_entry(uuid, &hdev->uuids, list) {
 522                if (uuid->size != 128)
 523                        continue;
 524
 525                if (!uuids_start) {
 526                        uuids_start = ptr;
 527                        uuids_start[0] = 1;
 528                        uuids_start[1] = EIR_UUID128_ALL;
 529                        ptr += 2;
 530                }
 531
 532                /* Stop if not enough space to put next UUID */
 533                if ((ptr - data) + 16 > len) {
 534                        uuids_start[1] = EIR_UUID128_SOME;
 535                        break;
 536                }
 537
 538                memcpy(ptr, uuid->uuid, 16);
 539                ptr += 16;
 540                uuids_start[0] += 16;
 541        }
 542
 543        return ptr;
 544}
 545
 546static void create_eir(struct hci_dev *hdev, u8 *data)
 547{
 548        u8 *ptr = data;
 549        size_t name_len;
 550
 551        name_len = strlen(hdev->dev_name);
 552
 553        if (name_len > 0) {
 554                /* EIR Data type */
 555                if (name_len > 48) {
 556                        name_len = 48;
 557                        ptr[1] = EIR_NAME_SHORT;
 558                } else
 559                        ptr[1] = EIR_NAME_COMPLETE;
 560
 561                /* EIR Data length */
 562                ptr[0] = name_len + 1;
 563
 564                memcpy(ptr + 2, hdev->dev_name, name_len);
 565
 566                ptr += (name_len + 2);
 567        }
 568
 569        if (hdev->inq_tx_power != HCI_TX_POWER_INVALID) {
 570                ptr[0] = 2;
 571                ptr[1] = EIR_TX_POWER;
 572                ptr[2] = (u8) hdev->inq_tx_power;
 573
 574                ptr += 3;
 575        }
 576
 577        if (hdev->devid_source > 0) {
 578                ptr[0] = 9;
 579                ptr[1] = EIR_DEVICE_ID;
 580
 581                put_unaligned_le16(hdev->devid_source, ptr + 2);
 582                put_unaligned_le16(hdev->devid_vendor, ptr + 4);
 583                put_unaligned_le16(hdev->devid_product, ptr + 6);
 584                put_unaligned_le16(hdev->devid_version, ptr + 8);
 585
 586                ptr += 10;
 587        }
 588
 589        ptr = create_uuid16_list(hdev, ptr, HCI_MAX_EIR_LENGTH - (ptr - data));
 590        ptr = create_uuid32_list(hdev, ptr, HCI_MAX_EIR_LENGTH - (ptr - data));
 591        ptr = create_uuid128_list(hdev, ptr, HCI_MAX_EIR_LENGTH - (ptr - data));
 592}
 593
 594static int update_eir(struct hci_dev *hdev)
 595{
 596        struct hci_cp_write_eir cp;
 597
 598        if (!hdev_is_powered(hdev))
 599                return 0;
 600
 601        if (!lmp_ext_inq_capable(hdev))
 602                return 0;
 603
 604        if (!test_bit(HCI_SSP_ENABLED, &hdev->dev_flags))
 605                return 0;
 606
 607        if (test_bit(HCI_SERVICE_CACHE, &hdev->dev_flags))
 608                return 0;
 609
 610        memset(&cp, 0, sizeof(cp));
 611
 612        create_eir(hdev, cp.data);
 613
 614        if (memcmp(cp.data, hdev->eir, sizeof(cp.data)) == 0)
 615                return 0;
 616
 617        memcpy(hdev->eir, cp.data, sizeof(cp.data));
 618
 619        return hci_send_cmd(hdev, HCI_OP_WRITE_EIR, sizeof(cp), &cp);
 620}
 621
 622static u8 get_service_classes(struct hci_dev *hdev)
 623{
 624        struct bt_uuid *uuid;
 625        u8 val = 0;
 626
 627        list_for_each_entry(uuid, &hdev->uuids, list)
 628                val |= uuid->svc_hint;
 629
 630        return val;
 631}
 632
 633static int update_class(struct hci_dev *hdev)
 634{
 635        u8 cod[3];
 636        int err;
 637
 638        BT_DBG("%s", hdev->name);
 639
 640        if (!hdev_is_powered(hdev))
 641                return 0;
 642
 643        if (test_bit(HCI_SERVICE_CACHE, &hdev->dev_flags))
 644                return 0;
 645
 646        cod[0] = hdev->minor_class;
 647        cod[1] = hdev->major_class;
 648        cod[2] = get_service_classes(hdev);
 649
 650        if (memcmp(cod, hdev->dev_class, 3) == 0)
 651                return 0;
 652
 653        err = hci_send_cmd(hdev, HCI_OP_WRITE_CLASS_OF_DEV, sizeof(cod), cod);
 654        if (err == 0)
 655                set_bit(HCI_PENDING_CLASS, &hdev->dev_flags);
 656
 657        return err;
 658}
 659
 660static void service_cache_off(struct work_struct *work)
 661{
 662        struct hci_dev *hdev = container_of(work, struct hci_dev,
 663                                            service_cache.work);
 664
 665        if (!test_and_clear_bit(HCI_SERVICE_CACHE, &hdev->dev_flags))
 666                return;
 667
 668        hci_dev_lock(hdev);
 669
 670        update_eir(hdev);
 671        update_class(hdev);
 672
 673        hci_dev_unlock(hdev);
 674}
 675
 676static void mgmt_init_hdev(struct sock *sk, struct hci_dev *hdev)
 677{
 678        if (test_and_set_bit(HCI_MGMT, &hdev->dev_flags))
 679                return;
 680
 681        INIT_DELAYED_WORK(&hdev->service_cache, service_cache_off);
 682
 683        /* Non-mgmt controlled devices get this bit set
 684         * implicitly so that pairing works for them, however
 685         * for mgmt we require user-space to explicitly enable
 686         * it
 687         */
 688        clear_bit(HCI_PAIRABLE, &hdev->dev_flags);
 689}
 690
 691static int read_controller_info(struct sock *sk, struct hci_dev *hdev,
 692                                void *data, u16 data_len)
 693{
 694        struct mgmt_rp_read_info rp;
 695
 696        BT_DBG("sock %p %s", sk, hdev->name);
 697
 698        hci_dev_lock(hdev);
 699
 700        memset(&rp, 0, sizeof(rp));
 701
 702        bacpy(&rp.bdaddr, &hdev->bdaddr);
 703
 704        rp.version = hdev->hci_ver;
 705        rp.manufacturer = cpu_to_le16(hdev->manufacturer);
 706
 707        rp.supported_settings = cpu_to_le32(get_supported_settings(hdev));
 708        rp.current_settings = cpu_to_le32(get_current_settings(hdev));
 709
 710        memcpy(rp.dev_class, hdev->dev_class, 3);
 711
 712        memcpy(rp.name, hdev->dev_name, sizeof(hdev->dev_name));
 713        memcpy(rp.short_name, hdev->short_name, sizeof(hdev->short_name));
 714
 715        hci_dev_unlock(hdev);
 716
 717        return cmd_complete(sk, hdev->id, MGMT_OP_READ_INFO, 0, &rp,
 718                            sizeof(rp));
 719}
 720
 721static void mgmt_pending_free(struct pending_cmd *cmd)
 722{
 723        sock_put(cmd->sk);
 724        kfree(cmd->param);
 725        kfree(cmd);
 726}
 727
 728static struct pending_cmd *mgmt_pending_add(struct sock *sk, u16 opcode,
 729                                            struct hci_dev *hdev, void *data,
 730                                            u16 len)
 731{
 732        struct pending_cmd *cmd;
 733
 734        cmd = kmalloc(sizeof(*cmd), GFP_KERNEL);
 735        if (!cmd)
 736                return NULL;
 737
 738        cmd->opcode = opcode;
 739        cmd->index = hdev->id;
 740
 741        cmd->param = kmalloc(len, GFP_KERNEL);
 742        if (!cmd->param) {
 743                kfree(cmd);
 744                return NULL;
 745        }
 746
 747        if (data)
 748                memcpy(cmd->param, data, len);
 749
 750        cmd->sk = sk;
 751        sock_hold(sk);
 752
 753        list_add(&cmd->list, &hdev->mgmt_pending);
 754
 755        return cmd;
 756}
 757
 758static void mgmt_pending_foreach(u16 opcode, struct hci_dev *hdev,
 759                                 void (*cb)(struct pending_cmd *cmd,
 760                                            void *data),
 761                                 void *data)
 762{
 763        struct pending_cmd *cmd, *tmp;
 764
 765        list_for_each_entry_safe(cmd, tmp, &hdev->mgmt_pending, list) {
 766                if (opcode > 0 && cmd->opcode != opcode)
 767                        continue;
 768
 769                cb(cmd, data);
 770        }
 771}
 772
 773static struct pending_cmd *mgmt_pending_find(u16 opcode, struct hci_dev *hdev)
 774{
 775        struct pending_cmd *cmd;
 776
 777        list_for_each_entry(cmd, &hdev->mgmt_pending, list) {
 778                if (cmd->opcode == opcode)
 779                        return cmd;
 780        }
 781
 782        return NULL;
 783}
 784
 785static void mgmt_pending_remove(struct pending_cmd *cmd)
 786{
 787        list_del(&cmd->list);
 788        mgmt_pending_free(cmd);
 789}
 790
 791static int send_settings_rsp(struct sock *sk, u16 opcode, struct hci_dev *hdev)
 792{
 793        __le32 settings = cpu_to_le32(get_current_settings(hdev));
 794
 795        return cmd_complete(sk, hdev->id, opcode, 0, &settings,
 796                            sizeof(settings));
 797}
 798
 799static int set_powered(struct sock *sk, struct hci_dev *hdev, void *data,
 800                       u16 len)
 801{
 802        struct mgmt_mode *cp = data;
 803        struct pending_cmd *cmd;
 804        int err;
 805
 806        BT_DBG("request for %s", hdev->name);
 807
 808        if (cp->val != 0x00 && cp->val != 0x01)
 809                return cmd_status(sk, hdev->id, MGMT_OP_SET_POWERED,
 810                                  MGMT_STATUS_INVALID_PARAMS);
 811
 812        hci_dev_lock(hdev);
 813
 814        if (test_and_clear_bit(HCI_AUTO_OFF, &hdev->dev_flags)) {
 815                cancel_delayed_work(&hdev->power_off);
 816
 817                if (cp->val) {
 818                        mgmt_pending_add(sk, MGMT_OP_SET_POWERED, hdev,
 819                                         data, len);
 820                        err = mgmt_powered(hdev, 1);
 821                        goto failed;
 822                }
 823        }
 824
 825        if (!!cp->val == hdev_is_powered(hdev)) {
 826                err = send_settings_rsp(sk, MGMT_OP_SET_POWERED, hdev);
 827                goto failed;
 828        }
 829
 830        if (mgmt_pending_find(MGMT_OP_SET_POWERED, hdev)) {
 831                err = cmd_status(sk, hdev->id, MGMT_OP_SET_POWERED,
 832                                 MGMT_STATUS_BUSY);
 833                goto failed;
 834        }
 835
 836        cmd = mgmt_pending_add(sk, MGMT_OP_SET_POWERED, hdev, data, len);
 837        if (!cmd) {
 838                err = -ENOMEM;
 839                goto failed;
 840        }
 841
 842        if (cp->val)
 843                queue_work(hdev->req_workqueue, &hdev->power_on);
 844        else
 845                queue_work(hdev->req_workqueue, &hdev->power_off.work);
 846
 847        err = 0;
 848
 849failed:
 850        hci_dev_unlock(hdev);
 851        return err;
 852}
 853
 854static int mgmt_event(u16 event, struct hci_dev *hdev, void *data, u16 data_len,
 855                      struct sock *skip_sk)
 856{
 857        struct sk_buff *skb;
 858        struct mgmt_hdr *hdr;
 859
 860        skb = alloc_skb(sizeof(*hdr) + data_len, GFP_KERNEL);
 861        if (!skb)
 862                return -ENOMEM;
 863
 864        hdr = (void *) skb_put(skb, sizeof(*hdr));
 865        hdr->opcode = cpu_to_le16(event);
 866        if (hdev)
 867                hdr->index = cpu_to_le16(hdev->id);
 868        else
 869                hdr->index = __constant_cpu_to_le16(MGMT_INDEX_NONE);
 870        hdr->len = cpu_to_le16(data_len);
 871
 872        if (data)
 873                memcpy(skb_put(skb, data_len), data, data_len);
 874
 875        /* Time stamp */
 876        __net_timestamp(skb);
 877
 878        hci_send_to_control(skb, skip_sk);
 879        kfree_skb(skb);
 880
 881        return 0;
 882}
 883
 884static int new_settings(struct hci_dev *hdev, struct sock *skip)
 885{
 886        __le32 ev;
 887
 888        ev = cpu_to_le32(get_current_settings(hdev));
 889
 890        return mgmt_event(MGMT_EV_NEW_SETTINGS, hdev, &ev, sizeof(ev), skip);
 891}
 892
 893static int set_discoverable(struct sock *sk, struct hci_dev *hdev, void *data,
 894                            u16 len)
 895{
 896        struct mgmt_cp_set_discoverable *cp = data;
 897        struct pending_cmd *cmd;
 898        u16 timeout;
 899        u8 scan;
 900        int err;
 901
 902        BT_DBG("request for %s", hdev->name);
 903
 904        if (!lmp_bredr_capable(hdev))
 905                return cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
 906                                 MGMT_STATUS_NOT_SUPPORTED);
 907
 908        if (cp->val != 0x00 && cp->val != 0x01)
 909                return cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
 910                                  MGMT_STATUS_INVALID_PARAMS);
 911
 912        timeout = __le16_to_cpu(cp->timeout);
 913        if (!cp->val && timeout > 0)
 914                return cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
 915                                  MGMT_STATUS_INVALID_PARAMS);
 916
 917        hci_dev_lock(hdev);
 918
 919        if (!hdev_is_powered(hdev) && timeout > 0) {
 920                err = cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
 921                                 MGMT_STATUS_NOT_POWERED);
 922                goto failed;
 923        }
 924
 925        if (mgmt_pending_find(MGMT_OP_SET_DISCOVERABLE, hdev) ||
 926            mgmt_pending_find(MGMT_OP_SET_CONNECTABLE, hdev)) {
 927                err = cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
 928                                 MGMT_STATUS_BUSY);
 929                goto failed;
 930        }
 931
 932        if (!test_bit(HCI_CONNECTABLE, &hdev->dev_flags)) {
 933                err = cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
 934                                 MGMT_STATUS_REJECTED);
 935                goto failed;
 936        }
 937
 938        if (!hdev_is_powered(hdev)) {
 939                bool changed = false;
 940
 941                if (!!cp->val != test_bit(HCI_DISCOVERABLE, &hdev->dev_flags)) {
 942                        change_bit(HCI_DISCOVERABLE, &hdev->dev_flags);
 943                        changed = true;
 944                }
 945
 946                err = send_settings_rsp(sk, MGMT_OP_SET_DISCOVERABLE, hdev);
 947                if (err < 0)
 948                        goto failed;
 949
 950                if (changed)
 951                        err = new_settings(hdev, sk);
 952
 953                goto failed;
 954        }
 955
 956        if (!!cp->val == test_bit(HCI_DISCOVERABLE, &hdev->dev_flags)) {
 957                if (hdev->discov_timeout > 0) {
 958                        cancel_delayed_work(&hdev->discov_off);
 959                        hdev->discov_timeout = 0;
 960                }
 961
 962                if (cp->val && timeout > 0) {
 963                        hdev->discov_timeout = timeout;
 964                        queue_delayed_work(hdev->workqueue, &hdev->discov_off,
 965                                msecs_to_jiffies(hdev->discov_timeout * 1000));
 966                }
 967
 968                err = send_settings_rsp(sk, MGMT_OP_SET_DISCOVERABLE, hdev);
 969                goto failed;
 970        }
 971
 972        cmd = mgmt_pending_add(sk, MGMT_OP_SET_DISCOVERABLE, hdev, data, len);
 973        if (!cmd) {
 974                err = -ENOMEM;
 975                goto failed;
 976        }
 977
 978        scan = SCAN_PAGE;
 979
 980        if (cp->val)
 981                scan |= SCAN_INQUIRY;
 982        else
 983                cancel_delayed_work(&hdev->discov_off);
 984
 985        err = hci_send_cmd(hdev, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);
 986        if (err < 0)
 987                mgmt_pending_remove(cmd);
 988
 989        if (cp->val)
 990                hdev->discov_timeout = timeout;
 991
 992failed:
 993        hci_dev_unlock(hdev);
 994        return err;
 995}
 996
 997static int set_connectable(struct sock *sk, struct hci_dev *hdev, void *data,
 998                           u16 len)
 999{
1000        struct mgmt_mode *cp = data;
1001        struct pending_cmd *cmd;
1002        u8 scan;
1003        int err;
1004
1005        BT_DBG("request for %s", hdev->name);
1006
1007        if (!lmp_bredr_capable(hdev))
1008                return cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE,
1009                                  MGMT_STATUS_NOT_SUPPORTED);
1010
1011        if (cp->val != 0x00 && cp->val != 0x01)
1012                return cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE,
1013                                  MGMT_STATUS_INVALID_PARAMS);
1014
1015        hci_dev_lock(hdev);
1016
1017        if (!hdev_is_powered(hdev)) {
1018                bool changed = false;
1019
1020                if (!!cp->val != test_bit(HCI_CONNECTABLE, &hdev->dev_flags))
1021                        changed = true;
1022
1023                if (cp->val) {
1024                        set_bit(HCI_CONNECTABLE, &hdev->dev_flags);
1025                } else {
1026                        clear_bit(HCI_CONNECTABLE, &hdev->dev_flags);
1027                        clear_bit(HCI_DISCOVERABLE, &hdev->dev_flags);
1028                }
1029
1030                err = send_settings_rsp(sk, MGMT_OP_SET_CONNECTABLE, hdev);
1031                if (err < 0)
1032                        goto failed;
1033
1034                if (changed)
1035                        err = new_settings(hdev, sk);
1036
1037                goto failed;
1038        }
1039
1040        if (mgmt_pending_find(MGMT_OP_SET_DISCOVERABLE, hdev) ||
1041            mgmt_pending_find(MGMT_OP_SET_CONNECTABLE, hdev)) {
1042                err = cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE,
1043                                 MGMT_STATUS_BUSY);
1044                goto failed;
1045        }
1046
1047        if (!!cp->val == test_bit(HCI_PSCAN, &hdev->flags)) {
1048                err = send_settings_rsp(sk, MGMT_OP_SET_CONNECTABLE, hdev);
1049                goto failed;
1050        }
1051
1052        cmd = mgmt_pending_add(sk, MGMT_OP_SET_CONNECTABLE, hdev, data, len);
1053        if (!cmd) {
1054                err = -ENOMEM;
1055                goto failed;
1056        }
1057
1058        if (cp->val) {
1059                scan = SCAN_PAGE;
1060        } else {
1061                scan = 0;
1062
1063                if (test_bit(HCI_ISCAN, &hdev->flags) &&
1064                    hdev->discov_timeout > 0)
1065                        cancel_delayed_work(&hdev->discov_off);
1066        }
1067
1068        err = hci_send_cmd(hdev, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);
1069        if (err < 0)
1070                mgmt_pending_remove(cmd);
1071
1072failed:
1073        hci_dev_unlock(hdev);
1074        return err;
1075}
1076
1077static int set_pairable(struct sock *sk, struct hci_dev *hdev, void *data,
1078                        u16 len)
1079{
1080        struct mgmt_mode *cp = data;
1081        int err;
1082
1083        BT_DBG("request for %s", hdev->name);
1084
1085        if (cp->val != 0x00 && cp->val != 0x01)
1086                return cmd_status(sk, hdev->id, MGMT_OP_SET_PAIRABLE,
1087                                  MGMT_STATUS_INVALID_PARAMS);
1088
1089        hci_dev_lock(hdev);
1090
1091        if (cp->val)
1092                set_bit(HCI_PAIRABLE, &hdev->dev_flags);
1093        else
1094                clear_bit(HCI_PAIRABLE, &hdev->dev_flags);
1095
1096        err = send_settings_rsp(sk, MGMT_OP_SET_PAIRABLE, hdev);
1097        if (err < 0)
1098                goto failed;
1099
1100        err = new_settings(hdev, sk);
1101
1102failed:
1103        hci_dev_unlock(hdev);
1104        return err;
1105}
1106
1107static int set_link_security(struct sock *sk, struct hci_dev *hdev, void *data,
1108                             u16 len)
1109{
1110        struct mgmt_mode *cp = data;
1111        struct pending_cmd *cmd;
1112        u8 val;
1113        int err;
1114
1115        BT_DBG("request for %s", hdev->name);
1116
1117        if (!lmp_bredr_capable(hdev))
1118                return cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY,
1119                                  MGMT_STATUS_NOT_SUPPORTED);
1120
1121        if (cp->val != 0x00 && cp->val != 0x01)
1122                return cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY,
1123                                  MGMT_STATUS_INVALID_PARAMS);
1124
1125        hci_dev_lock(hdev);
1126
1127        if (!hdev_is_powered(hdev)) {
1128                bool changed = false;
1129
1130                if (!!cp->val != test_bit(HCI_LINK_SECURITY,
1131                                          &hdev->dev_flags)) {
1132                        change_bit(HCI_LINK_SECURITY, &hdev->dev_flags);
1133                        changed = true;
1134                }
1135
1136                err = send_settings_rsp(sk, MGMT_OP_SET_LINK_SECURITY, hdev);
1137                if (err < 0)
1138                        goto failed;
1139
1140                if (changed)
1141                        err = new_settings(hdev, sk);
1142
1143                goto failed;
1144        }
1145
1146        if (mgmt_pending_find(MGMT_OP_SET_LINK_SECURITY, hdev)) {
1147                err = cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY,
1148                                 MGMT_STATUS_BUSY);
1149                goto failed;
1150        }
1151
1152        val = !!cp->val;
1153
1154        if (test_bit(HCI_AUTH, &hdev->flags) == val) {
1155                err = send_settings_rsp(sk, MGMT_OP_SET_LINK_SECURITY, hdev);
1156                goto failed;
1157        }
1158
1159        cmd = mgmt_pending_add(sk, MGMT_OP_SET_LINK_SECURITY, hdev, data, len);
1160        if (!cmd) {
1161                err = -ENOMEM;
1162                goto failed;
1163        }
1164
1165        err = hci_send_cmd(hdev, HCI_OP_WRITE_AUTH_ENABLE, sizeof(val), &val);
1166        if (err < 0) {
1167                mgmt_pending_remove(cmd);
1168                goto failed;
1169        }
1170
1171failed:
1172        hci_dev_unlock(hdev);
1173        return err;
1174}
1175
1176static int set_ssp(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
1177{
1178        struct mgmt_mode *cp = data;
1179        struct pending_cmd *cmd;
1180        u8 val;
1181        int err;
1182
1183        BT_DBG("request for %s", hdev->name);
1184
1185        if (!lmp_ssp_capable(hdev))
1186                return cmd_status(sk, hdev->id, MGMT_OP_SET_SSP,
1187                                  MGMT_STATUS_NOT_SUPPORTED);
1188
1189        if (cp->val != 0x00 && cp->val != 0x01)
1190                return cmd_status(sk, hdev->id, MGMT_OP_SET_SSP,
1191                                  MGMT_STATUS_INVALID_PARAMS);
1192
1193        hci_dev_lock(hdev);
1194
1195        val = !!cp->val;
1196
1197        if (!hdev_is_powered(hdev)) {
1198                bool changed = false;
1199
1200                if (val != test_bit(HCI_SSP_ENABLED, &hdev->dev_flags)) {
1201                        change_bit(HCI_SSP_ENABLED, &hdev->dev_flags);
1202                        changed = true;
1203                }
1204
1205                err = send_settings_rsp(sk, MGMT_OP_SET_SSP, hdev);
1206                if (err < 0)
1207                        goto failed;
1208
1209                if (changed)
1210                        err = new_settings(hdev, sk);
1211
1212                goto failed;
1213        }
1214
1215        if (mgmt_pending_find(MGMT_OP_SET_SSP, hdev)) {
1216                err = cmd_status(sk, hdev->id, MGMT_OP_SET_SSP,
1217                                 MGMT_STATUS_BUSY);
1218                goto failed;
1219        }
1220
1221        if (test_bit(HCI_SSP_ENABLED, &hdev->dev_flags) == val) {
1222                err = send_settings_rsp(sk, MGMT_OP_SET_SSP, hdev);
1223                goto failed;
1224        }
1225
1226        cmd = mgmt_pending_add(sk, MGMT_OP_SET_SSP, hdev, data, len);
1227        if (!cmd) {
1228                err = -ENOMEM;
1229                goto failed;
1230        }
1231
1232        err = hci_send_cmd(hdev, HCI_OP_WRITE_SSP_MODE, sizeof(val), &val);
1233        if (err < 0) {
1234                mgmt_pending_remove(cmd);
1235                goto failed;
1236        }
1237
1238failed:
1239        hci_dev_unlock(hdev);
1240        return err;
1241}
1242
1243static int set_hs(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
1244{
1245        struct mgmt_mode *cp = data;
1246
1247        BT_DBG("request for %s", hdev->name);
1248
1249        if (!enable_hs)
1250                return cmd_status(sk, hdev->id, MGMT_OP_SET_HS,
1251                                  MGMT_STATUS_NOT_SUPPORTED);
1252
1253        if (cp->val != 0x00 && cp->val != 0x01)
1254                return cmd_status(sk, hdev->id, MGMT_OP_SET_HS,
1255                                  MGMT_STATUS_INVALID_PARAMS);
1256
1257        if (cp->val)
1258                set_bit(HCI_HS_ENABLED, &hdev->dev_flags);
1259        else
1260                clear_bit(HCI_HS_ENABLED, &hdev->dev_flags);
1261
1262        return send_settings_rsp(sk, MGMT_OP_SET_HS, hdev);
1263}
1264
1265static int set_le(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
1266{
1267        struct mgmt_mode *cp = data;
1268        struct hci_cp_write_le_host_supported hci_cp;
1269        struct pending_cmd *cmd;
1270        int err;
1271        u8 val, enabled;
1272
1273        BT_DBG("request for %s", hdev->name);
1274
1275        if (!lmp_le_capable(hdev))
1276                return cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
1277                                  MGMT_STATUS_NOT_SUPPORTED);
1278
1279        if (cp->val != 0x00 && cp->val != 0x01)
1280                return cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
1281                                  MGMT_STATUS_INVALID_PARAMS);
1282
1283        hci_dev_lock(hdev);
1284
1285        val = !!cp->val;
1286        enabled = lmp_host_le_capable(hdev);
1287
1288        if (!hdev_is_powered(hdev) || val == enabled) {
1289                bool changed = false;
1290
1291                if (val != test_bit(HCI_LE_ENABLED, &hdev->dev_flags)) {
1292                        change_bit(HCI_LE_ENABLED, &hdev->dev_flags);
1293                        changed = true;
1294                }
1295
1296                err = send_settings_rsp(sk, MGMT_OP_SET_LE, hdev);
1297                if (err < 0)
1298                        goto unlock;
1299
1300                if (changed)
1301                        err = new_settings(hdev, sk);
1302
1303                goto unlock;
1304        }
1305
1306        if (mgmt_pending_find(MGMT_OP_SET_LE, hdev)) {
1307                err = cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
1308                                 MGMT_STATUS_BUSY);
1309                goto unlock;
1310        }
1311
1312        cmd = mgmt_pending_add(sk, MGMT_OP_SET_LE, hdev, data, len);
1313        if (!cmd) {
1314                err = -ENOMEM;
1315                goto unlock;
1316        }
1317
1318        memset(&hci_cp, 0, sizeof(hci_cp));
1319
1320        if (val) {
1321                hci_cp.le = val;
1322                hci_cp.simul = lmp_le_br_capable(hdev);
1323        }
1324
1325        err = hci_send_cmd(hdev, HCI_OP_WRITE_LE_HOST_SUPPORTED, sizeof(hci_cp),
1326                           &hci_cp);
1327        if (err < 0)
1328                mgmt_pending_remove(cmd);
1329
1330unlock:
1331        hci_dev_unlock(hdev);
1332        return err;
1333}
1334
1335static const u8 bluetooth_base_uuid[] = {
1336                        0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80,
1337                        0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1338};
1339
1340static u8 get_uuid_size(const u8 *uuid)
1341{
1342        u32 val;
1343
1344        if (memcmp(uuid, bluetooth_base_uuid, 12))
1345                return 128;
1346
1347        val = get_unaligned_le32(&uuid[12]);
1348        if (val > 0xffff)
1349                return 32;
1350
1351        return 16;
1352}
1353
1354static int add_uuid(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
1355{
1356        struct mgmt_cp_add_uuid *cp = data;
1357        struct pending_cmd *cmd;
1358        struct bt_uuid *uuid;
1359        int err;
1360
1361        BT_DBG("request for %s", hdev->name);
1362
1363        hci_dev_lock(hdev);
1364
1365        if (test_bit(HCI_PENDING_CLASS, &hdev->dev_flags)) {
1366                err = cmd_status(sk, hdev->id, MGMT_OP_ADD_UUID,
1367                                 MGMT_STATUS_BUSY);
1368                goto failed;
1369        }
1370
1371        uuid = kmalloc(sizeof(*uuid), GFP_KERNEL);
1372        if (!uuid) {
1373                err = -ENOMEM;
1374                goto failed;
1375        }
1376
1377        memcpy(uuid->uuid, cp->uuid, 16);
1378        uuid->svc_hint = cp->svc_hint;
1379        uuid->size = get_uuid_size(cp->uuid);
1380
1381        list_add_tail(&uuid->list, &hdev->uuids);
1382
1383        err = update_class(hdev);
1384        if (err < 0)
1385                goto failed;
1386
1387        err = update_eir(hdev);
1388        if (err < 0)
1389                goto failed;
1390
1391        if (!test_bit(HCI_PENDING_CLASS, &hdev->dev_flags)) {
1392                err = cmd_complete(sk, hdev->id, MGMT_OP_ADD_UUID, 0,
1393                                   hdev->dev_class, 3);
1394                goto failed;
1395        }
1396
1397        cmd = mgmt_pending_add(sk, MGMT_OP_ADD_UUID, hdev, data, len);
1398        if (!cmd)
1399                err = -ENOMEM;
1400
1401failed:
1402        hci_dev_unlock(hdev);
1403        return err;
1404}
1405
1406static bool enable_service_cache(struct hci_dev *hdev)
1407{
1408        if (!hdev_is_powered(hdev))
1409                return false;
1410
1411        if (!test_and_set_bit(HCI_SERVICE_CACHE, &hdev->dev_flags)) {
1412                queue_delayed_work(hdev->workqueue, &hdev->service_cache,
1413                                   CACHE_TIMEOUT);
1414                return true;
1415        }
1416
1417        return false;
1418}
1419
1420static int remove_uuid(struct sock *sk, struct hci_dev *hdev, void *data,
1421                       u16 len)
1422{
1423        struct mgmt_cp_remove_uuid *cp = data;
1424        struct pending_cmd *cmd;
1425        struct bt_uuid *match, *tmp;
1426        u8 bt_uuid_any[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
1427        int err, found;
1428
1429        BT_DBG("request for %s", hdev->name);
1430
1431        hci_dev_lock(hdev);
1432
1433        if (test_bit(HCI_PENDING_CLASS, &hdev->dev_flags)) {
1434                err = cmd_status(sk, hdev->id, MGMT_OP_REMOVE_UUID,
1435                                 MGMT_STATUS_BUSY);
1436                goto unlock;
1437        }
1438
1439        if (memcmp(cp->uuid, bt_uuid_any, 16) == 0) {
1440                err = hci_uuids_clear(hdev);
1441
1442                if (enable_service_cache(hdev)) {
1443                        err = cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_UUID,
1444                                           0, hdev->dev_class, 3);
1445                        goto unlock;
1446                }
1447
1448                goto update_class;
1449        }
1450
1451        found = 0;
1452
1453        list_for_each_entry_safe(match, tmp, &hdev->uuids, list) {
1454                if (memcmp(match->uuid, cp->uuid, 16) != 0)
1455                        continue;
1456
1457                list_del(&match->list);
1458                kfree(match);
1459                found++;
1460        }
1461
1462        if (found == 0) {
1463                err = cmd_status(sk, hdev->id, MGMT_OP_REMOVE_UUID,
1464                                 MGMT_STATUS_INVALID_PARAMS);
1465                goto unlock;
1466        }
1467
1468update_class:
1469        err = update_class(hdev);
1470        if (err < 0)
1471                goto unlock;
1472
1473        err = update_eir(hdev);
1474        if (err < 0)
1475                goto unlock;
1476
1477        if (!test_bit(HCI_PENDING_CLASS, &hdev->dev_flags)) {
1478                err = cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_UUID, 0,
1479                                   hdev->dev_class, 3);
1480                goto unlock;
1481        }
1482
1483        cmd = mgmt_pending_add(sk, MGMT_OP_REMOVE_UUID, hdev, data, len);
1484        if (!cmd)
1485                err = -ENOMEM;
1486
1487unlock:
1488        hci_dev_unlock(hdev);
1489        return err;
1490}
1491
1492static int set_dev_class(struct sock *sk, struct hci_dev *hdev, void *data,
1493                         u16 len)
1494{
1495        struct mgmt_cp_set_dev_class *cp = data;
1496        struct pending_cmd *cmd;
1497        int err;
1498
1499        BT_DBG("request for %s", hdev->name);
1500
1501        if (!lmp_bredr_capable(hdev))
1502                return cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS,
1503                                  MGMT_STATUS_NOT_SUPPORTED);
1504
1505        if (test_bit(HCI_PENDING_CLASS, &hdev->dev_flags))
1506                return cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS,
1507                                  MGMT_STATUS_BUSY);
1508
1509        if ((cp->minor & 0x03) != 0 || (cp->major & 0xe0) != 0)
1510                return cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS,
1511                                  MGMT_STATUS_INVALID_PARAMS);
1512
1513        hci_dev_lock(hdev);
1514
1515        hdev->major_class = cp->major;
1516        hdev->minor_class = cp->minor;
1517
1518        if (!hdev_is_powered(hdev)) {
1519                err = cmd_complete(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, 0,
1520                                   hdev->dev_class, 3);
1521                goto unlock;
1522        }
1523
1524        if (test_and_clear_bit(HCI_SERVICE_CACHE, &hdev->dev_flags)) {
1525                hci_dev_unlock(hdev);
1526                cancel_delayed_work_sync(&hdev->service_cache);
1527                hci_dev_lock(hdev);
1528                update_eir(hdev);
1529        }
1530
1531        err = update_class(hdev);
1532        if (err < 0)
1533                goto unlock;
1534
1535        if (!test_bit(HCI_PENDING_CLASS, &hdev->dev_flags)) {
1536                err = cmd_complete(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, 0,
1537                                   hdev->dev_class, 3);
1538                goto unlock;
1539        }
1540
1541        cmd = mgmt_pending_add(sk, MGMT_OP_SET_DEV_CLASS, hdev, data, len);
1542        if (!cmd)
1543                err = -ENOMEM;
1544
1545unlock:
1546        hci_dev_unlock(hdev);
1547        return err;
1548}
1549
1550static int load_link_keys(struct sock *sk, struct hci_dev *hdev, void *data,
1551                          u16 len)
1552{
1553        struct mgmt_cp_load_link_keys *cp = data;
1554        u16 key_count, expected_len;
1555        int i;
1556
1557        key_count = __le16_to_cpu(cp->key_count);
1558
1559        expected_len = sizeof(*cp) + key_count *
1560                                        sizeof(struct mgmt_link_key_info);
1561        if (expected_len != len) {
1562                BT_ERR("load_link_keys: expected %u bytes, got %u bytes",
1563                       len, expected_len);
1564                return cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS,
1565                                  MGMT_STATUS_INVALID_PARAMS);
1566        }
1567
1568        if (cp->debug_keys != 0x00 && cp->debug_keys != 0x01)
1569                return cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS,
1570                                  MGMT_STATUS_INVALID_PARAMS);
1571
1572        BT_DBG("%s debug_keys %u key_count %u", hdev->name, cp->debug_keys,
1573               key_count);
1574
1575        for (i = 0; i < key_count; i++) {
1576                struct mgmt_link_key_info *key = &cp->keys[i];
1577
1578                if (key->addr.type != BDADDR_BREDR)
1579                        return cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS,
1580                                          MGMT_STATUS_INVALID_PARAMS);
1581        }
1582
1583        hci_dev_lock(hdev);
1584
1585        hci_link_keys_clear(hdev);
1586
1587        set_bit(HCI_LINK_KEYS, &hdev->dev_flags);
1588
1589        if (cp->debug_keys)
1590                set_bit(HCI_DEBUG_KEYS, &hdev->dev_flags);
1591        else
1592                clear_bit(HCI_DEBUG_KEYS, &hdev->dev_flags);
1593
1594        for (i = 0; i < key_count; i++) {
1595                struct mgmt_link_key_info *key = &cp->keys[i];
1596
1597                hci_add_link_key(hdev, NULL, 0, &key->addr.bdaddr, key->val,
1598                                 key->type, key->pin_len);
1599        }
1600
1601        cmd_complete(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS, 0, NULL, 0);
1602
1603        hci_dev_unlock(hdev);
1604
1605        return 0;
1606}
1607
1608static int device_unpaired(struct hci_dev *hdev, bdaddr_t *bdaddr,
1609                           u8 addr_type, struct sock *skip_sk)
1610{
1611        struct mgmt_ev_device_unpaired ev;
1612
1613        bacpy(&ev.addr.bdaddr, bdaddr);
1614        ev.addr.type = addr_type;
1615
1616        return mgmt_event(MGMT_EV_DEVICE_UNPAIRED, hdev, &ev, sizeof(ev),
1617                          skip_sk);
1618}
1619
1620static int unpair_device(struct sock *sk, struct hci_dev *hdev, void *data,
1621                         u16 len)
1622{
1623        struct mgmt_cp_unpair_device *cp = data;
1624        struct mgmt_rp_unpair_device rp;
1625        struct hci_cp_disconnect dc;
1626        struct pending_cmd *cmd;
1627        struct hci_conn *conn;
1628        int err;
1629
1630        memset(&rp, 0, sizeof(rp));
1631        bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
1632        rp.addr.type = cp->addr.type;
1633
1634        if (!bdaddr_type_is_valid(cp->addr.type))
1635                return cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
1636                                    MGMT_STATUS_INVALID_PARAMS,
1637                                    &rp, sizeof(rp));
1638
1639        if (cp->disconnect != 0x00 && cp->disconnect != 0x01)
1640                return cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
1641                                    MGMT_STATUS_INVALID_PARAMS,
1642                                    &rp, sizeof(rp));
1643
1644        hci_dev_lock(hdev);
1645
1646        if (!hdev_is_powered(hdev)) {
1647                err = cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
1648                                   MGMT_STATUS_NOT_POWERED, &rp, sizeof(rp));
1649                goto unlock;
1650        }
1651
1652        if (cp->addr.type == BDADDR_BREDR)
1653                err = hci_remove_link_key(hdev, &cp->addr.bdaddr);
1654        else
1655                err = hci_remove_ltk(hdev, &cp->addr.bdaddr);
1656
1657        if (err < 0) {
1658                err = cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
1659                                   MGMT_STATUS_NOT_PAIRED, &rp, sizeof(rp));
1660                goto unlock;
1661        }
1662
1663        if (cp->disconnect) {
1664                if (cp->addr.type == BDADDR_BREDR)
1665                        conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK,
1666                                                       &cp->addr.bdaddr);
1667                else
1668                        conn = hci_conn_hash_lookup_ba(hdev, LE_LINK,
1669                                                       &cp->addr.bdaddr);
1670        } else {
1671                conn = NULL;
1672        }
1673
1674        if (!conn) {
1675                err = cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE, 0,
1676                                   &rp, sizeof(rp));
1677                device_unpaired(hdev, &cp->addr.bdaddr, cp->addr.type, sk);
1678                goto unlock;
1679        }
1680
1681        cmd = mgmt_pending_add(sk, MGMT_OP_UNPAIR_DEVICE, hdev, cp,
1682                               sizeof(*cp));
1683        if (!cmd) {
1684                err = -ENOMEM;
1685                goto unlock;
1686        }
1687
1688        dc.handle = cpu_to_le16(conn->handle);
1689        dc.reason = 0x13; /* Remote User Terminated Connection */
1690        err = hci_send_cmd(hdev, HCI_OP_DISCONNECT, sizeof(dc), &dc);
1691        if (err < 0)
1692                mgmt_pending_remove(cmd);
1693
1694unlock:
1695        hci_dev_unlock(hdev);
1696        return err;
1697}
1698
1699static int disconnect(struct sock *sk, struct hci_dev *hdev, void *data,
1700                      u16 len)
1701{
1702        struct mgmt_cp_disconnect *cp = data;
1703        struct mgmt_rp_disconnect rp;
1704        struct hci_cp_disconnect dc;
1705        struct pending_cmd *cmd;
1706        struct hci_conn *conn;
1707        int err;
1708
1709        BT_DBG("");
1710
1711        memset(&rp, 0, sizeof(rp));
1712        bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
1713        rp.addr.type = cp->addr.type;
1714
1715        if (!bdaddr_type_is_valid(cp->addr.type))
1716                return cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
1717                                    MGMT_STATUS_INVALID_PARAMS,
1718                                    &rp, sizeof(rp));
1719
1720        hci_dev_lock(hdev);
1721
1722        if (!test_bit(HCI_UP, &hdev->flags)) {
1723                err = cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
1724                                   MGMT_STATUS_NOT_POWERED, &rp, sizeof(rp));
1725                goto failed;
1726        }
1727
1728        if (mgmt_pending_find(MGMT_OP_DISCONNECT, hdev)) {
1729                err = cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
1730                                   MGMT_STATUS_BUSY, &rp, sizeof(rp));
1731                goto failed;
1732        }
1733
1734        if (cp->addr.type == BDADDR_BREDR)
1735                conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK,
1736                                               &cp->addr.bdaddr);
1737        else
1738                conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &cp->addr.bdaddr);
1739
1740        if (!conn || conn->state == BT_OPEN || conn->state == BT_CLOSED) {
1741                err = cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
1742                                   MGMT_STATUS_NOT_CONNECTED, &rp, sizeof(rp));
1743                goto failed;
1744        }
1745
1746        cmd = mgmt_pending_add(sk, MGMT_OP_DISCONNECT, hdev, data, len);
1747        if (!cmd) {
1748                err = -ENOMEM;
1749                goto failed;
1750        }
1751
1752        dc.handle = cpu_to_le16(conn->handle);
1753        dc.reason = HCI_ERROR_REMOTE_USER_TERM;
1754
1755        err = hci_send_cmd(hdev, HCI_OP_DISCONNECT, sizeof(dc), &dc);
1756        if (err < 0)
1757                mgmt_pending_remove(cmd);
1758
1759failed:
1760        hci_dev_unlock(hdev);
1761        return err;
1762}
1763
1764static u8 link_to_bdaddr(u8 link_type, u8 addr_type)
1765{
1766        switch (link_type) {
1767        case LE_LINK:
1768                switch (addr_type) {
1769                case ADDR_LE_DEV_PUBLIC:
1770                        return BDADDR_LE_PUBLIC;
1771
1772                default:
1773                        /* Fallback to LE Random address type */
1774                        return BDADDR_LE_RANDOM;
1775                }
1776
1777        default:
1778                /* Fallback to BR/EDR type */
1779                return BDADDR_BREDR;
1780        }
1781}
1782
1783static int get_connections(struct sock *sk, struct hci_dev *hdev, void *data,
1784                           u16 data_len)
1785{
1786        struct mgmt_rp_get_connections *rp;
1787        struct hci_conn *c;
1788        size_t rp_len;
1789        int err;
1790        u16 i;
1791
1792        BT_DBG("");
1793
1794        hci_dev_lock(hdev);
1795
1796        if (!hdev_is_powered(hdev)) {
1797                err = cmd_status(sk, hdev->id, MGMT_OP_GET_CONNECTIONS,
1798                                 MGMT_STATUS_NOT_POWERED);
1799                goto unlock;
1800        }
1801
1802        i = 0;
1803        list_for_each_entry(c, &hdev->conn_hash.list, list) {
1804                if (test_bit(HCI_CONN_MGMT_CONNECTED, &c->flags))
1805                        i++;
1806        }
1807
1808        rp_len = sizeof(*rp) + (i * sizeof(struct mgmt_addr_info));
1809        rp = kmalloc(rp_len, GFP_KERNEL);
1810        if (!rp) {
1811                err = -ENOMEM;
1812                goto unlock;
1813        }
1814
1815        i = 0;
1816        list_for_each_entry(c, &hdev->conn_hash.list, list) {
1817                if (!test_bit(HCI_CONN_MGMT_CONNECTED, &c->flags))
1818                        continue;
1819                bacpy(&rp->addr[i].bdaddr, &c->dst);
1820                rp->addr[i].type = link_to_bdaddr(c->type, c->dst_type);
1821                if (c->type == SCO_LINK || c->type == ESCO_LINK)
1822                        continue;
1823                i++;
1824        }
1825
1826        rp->conn_count = cpu_to_le16(i);
1827
1828        /* Recalculate length in case of filtered SCO connections, etc */
1829        rp_len = sizeof(*rp) + (i * sizeof(struct mgmt_addr_info));
1830
1831        err = cmd_complete(sk, hdev->id, MGMT_OP_GET_CONNECTIONS, 0, rp,
1832                           rp_len);
1833
1834        kfree(rp);
1835
1836unlock:
1837        hci_dev_unlock(hdev);
1838        return err;
1839}
1840
1841static int send_pin_code_neg_reply(struct sock *sk, struct hci_dev *hdev,
1842                                   struct mgmt_cp_pin_code_neg_reply *cp)
1843{
1844        struct pending_cmd *cmd;
1845        int err;
1846
1847        cmd = mgmt_pending_add(sk, MGMT_OP_PIN_CODE_NEG_REPLY, hdev, cp,
1848                               sizeof(*cp));
1849        if (!cmd)
1850                return -ENOMEM;
1851
1852        err = hci_send_cmd(hdev, HCI_OP_PIN_CODE_NEG_REPLY,
1853                           sizeof(cp->addr.bdaddr), &cp->addr.bdaddr);
1854        if (err < 0)
1855                mgmt_pending_remove(cmd);
1856
1857        return err;
1858}
1859
1860static int pin_code_reply(struct sock *sk, struct hci_dev *hdev, void *data,
1861                          u16 len)
1862{
1863        struct hci_conn *conn;
1864        struct mgmt_cp_pin_code_reply *cp = data;
1865        struct hci_cp_pin_code_reply reply;
1866        struct pending_cmd *cmd;
1867        int err;
1868
1869        BT_DBG("");
1870
1871        hci_dev_lock(hdev);
1872
1873        if (!hdev_is_powered(hdev)) {
1874                err = cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
1875                                 MGMT_STATUS_NOT_POWERED);
1876                goto failed;
1877        }
1878
1879        conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->addr.bdaddr);
1880        if (!conn) {
1881                err = cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
1882                                 MGMT_STATUS_NOT_CONNECTED);
1883                goto failed;
1884        }
1885
1886        if (conn->pending_sec_level == BT_SECURITY_HIGH && cp->pin_len != 16) {
1887                struct mgmt_cp_pin_code_neg_reply ncp;
1888
1889                memcpy(&ncp.addr, &cp->addr, sizeof(ncp.addr));
1890
1891                BT_ERR("PIN code is not 16 bytes long");
1892
1893                err = send_pin_code_neg_reply(sk, hdev, &ncp);
1894                if (err >= 0)
1895                        err = cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
1896                                         MGMT_STATUS_INVALID_PARAMS);
1897
1898                goto failed;
1899        }
1900
1901        cmd = mgmt_pending_add(sk, MGMT_OP_PIN_CODE_REPLY, hdev, data, len);
1902        if (!cmd) {
1903                err = -ENOMEM;
1904                goto failed;
1905        }
1906
1907        bacpy(&reply.bdaddr, &cp->addr.bdaddr);
1908        reply.pin_len = cp->pin_len;
1909        memcpy(reply.pin_code, cp->pin_code, sizeof(reply.pin_code));
1910
1911        err = hci_send_cmd(hdev, HCI_OP_PIN_CODE_REPLY, sizeof(reply), &reply);
1912        if (err < 0)
1913                mgmt_pending_remove(cmd);
1914
1915failed:
1916        hci_dev_unlock(hdev);
1917        return err;
1918}
1919
1920static int set_io_capability(struct sock *sk, struct hci_dev *hdev, void *data,
1921                             u16 len)
1922{
1923        struct mgmt_cp_set_io_capability *cp = data;
1924
1925        BT_DBG("");
1926
1927        hci_dev_lock(hdev);
1928
1929        hdev->io_capability = cp->io_capability;
1930
1931        BT_DBG("%s IO capability set to 0x%02x", hdev->name,
1932               hdev->io_capability);
1933
1934        hci_dev_unlock(hdev);
1935
1936        return cmd_complete(sk, hdev->id, MGMT_OP_SET_IO_CAPABILITY, 0, NULL,
1937                            0);
1938}
1939
1940static struct pending_cmd *find_pairing(struct hci_conn *conn)
1941{
1942        struct hci_dev *hdev = conn->hdev;
1943        struct pending_cmd *cmd;
1944
1945        list_for_each_entry(cmd, &hdev->mgmt_pending, list) {
1946                if (cmd->opcode != MGMT_OP_PAIR_DEVICE)
1947                        continue;
1948
1949                if (cmd->user_data != conn)
1950                        continue;
1951
1952                return cmd;
1953        }
1954
1955        return NULL;
1956}
1957
1958static void pairing_complete(struct pending_cmd *cmd, u8 status)
1959{
1960        struct mgmt_rp_pair_device rp;
1961        struct hci_conn *conn = cmd->user_data;
1962
1963        bacpy(&rp.addr.bdaddr, &conn->dst);
1964        rp.addr.type = link_to_bdaddr(conn->type, conn->dst_type);
1965
1966        cmd_complete(cmd->sk, cmd->index, MGMT_OP_PAIR_DEVICE, status,
1967                     &rp, sizeof(rp));
1968
1969        /* So we don't get further callbacks for this connection */
1970        conn->connect_cfm_cb = NULL;
1971        conn->security_cfm_cb = NULL;
1972        conn->disconn_cfm_cb = NULL;
1973
1974        hci_conn_put(conn);
1975
1976        mgmt_pending_remove(cmd);
1977}
1978
1979static void pairing_complete_cb(struct hci_conn *conn, u8 status)
1980{
1981        struct pending_cmd *cmd;
1982
1983        BT_DBG("status %u", status);
1984
1985        cmd = find_pairing(conn);
1986        if (!cmd)
1987                BT_DBG("Unable to find a pending command");
1988        else
1989                pairing_complete(cmd, mgmt_status(status));
1990}
1991
1992static void le_connect_complete_cb(struct hci_conn *conn, u8 status)
1993{
1994        struct pending_cmd *cmd;
1995
1996        BT_DBG("status %u", status);
1997
1998        if (!status)
1999                return;
2000
2001        cmd = find_pairing(conn);
2002        if (!cmd)
2003                BT_DBG("Unable to find a pending command");
2004        else
2005                pairing_complete(cmd, mgmt_status(status));
2006}
2007
2008static int pair_device(struct sock *sk, struct hci_dev *hdev, void *data,
2009                       u16 len)
2010{
2011        struct mgmt_cp_pair_device *cp = data;
2012        struct mgmt_rp_pair_device rp;
2013        struct pending_cmd *cmd;
2014        u8 sec_level, auth_type;
2015        struct hci_conn *conn;
2016        int err;
2017
2018        BT_DBG("");
2019
2020        memset(&rp, 0, sizeof(rp));
2021        bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
2022        rp.addr.type = cp->addr.type;
2023
2024        if (!bdaddr_type_is_valid(cp->addr.type))
2025                return cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
2026                                    MGMT_STATUS_INVALID_PARAMS,
2027                                    &rp, sizeof(rp));
2028
2029        hci_dev_lock(hdev);
2030
2031        if (!hdev_is_powered(hdev)) {
2032                err = cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
2033                                   MGMT_STATUS_NOT_POWERED, &rp, sizeof(rp));
2034                goto unlock;
2035        }
2036
2037        sec_level = BT_SECURITY_MEDIUM;
2038        if (cp->io_cap == 0x03)
2039                auth_type = HCI_AT_DEDICATED_BONDING;
2040        else
2041                auth_type = HCI_AT_DEDICATED_BONDING_MITM;
2042
2043        if (cp->addr.type == BDADDR_BREDR)
2044                conn = hci_connect(hdev, ACL_LINK, &cp->addr.bdaddr,
2045                                   cp->addr.type, sec_level, auth_type);
2046        else
2047                conn = hci_connect(hdev, LE_LINK, &cp->addr.bdaddr,
2048                                   cp->addr.type, sec_level, auth_type);
2049
2050        if (IS_ERR(conn)) {
2051                int status;
2052
2053                if (PTR_ERR(conn) == -EBUSY)
2054                        status = MGMT_STATUS_BUSY;
2055                else
2056                        status = MGMT_STATUS_CONNECT_FAILED;
2057
2058                err = cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
2059                                   status, &rp,
2060                                   sizeof(rp));
2061                goto unlock;
2062        }
2063
2064        if (conn->connect_cfm_cb) {
2065                hci_conn_put(conn);
2066                err = cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
2067                                   MGMT_STATUS_BUSY, &rp, sizeof(rp));
2068                goto unlock;
2069        }
2070
2071        cmd = mgmt_pending_add(sk, MGMT_OP_PAIR_DEVICE, hdev, data, len);
2072        if (!cmd) {
2073                err = -ENOMEM;
2074                hci_conn_put(conn);
2075                goto unlock;
2076        }
2077
2078        /* For LE, just connecting isn't a proof that the pairing finished */
2079        if (cp->addr.type == BDADDR_BREDR)
2080                conn->connect_cfm_cb = pairing_complete_cb;
2081        else
2082                conn->connect_cfm_cb = le_connect_complete_cb;
2083
2084        conn->security_cfm_cb = pairing_complete_cb;
2085        conn->disconn_cfm_cb = pairing_complete_cb;
2086        conn->io_capability = cp->io_cap;
2087        cmd->user_data = conn;
2088
2089        if (conn->state == BT_CONNECTED &&
2090            hci_conn_security(conn, sec_level, auth_type))
2091                pairing_complete(cmd, 0);
2092
2093        err = 0;
2094
2095unlock:
2096        hci_dev_unlock(hdev);
2097        return err;
2098}
2099
2100static int cancel_pair_device(struct sock *sk, struct hci_dev *hdev, void *data,
2101                              u16 len)
2102{
2103        struct mgmt_addr_info *addr = data;
2104        struct pending_cmd *cmd;
2105        struct hci_conn *conn;
2106        int err;
2107
2108        BT_DBG("");
2109
2110        hci_dev_lock(hdev);
2111
2112        if (!hdev_is_powered(hdev)) {
2113                err = cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE,
2114                                 MGMT_STATUS_NOT_POWERED);
2115                goto unlock;
2116        }
2117
2118        cmd = mgmt_pending_find(MGMT_OP_PAIR_DEVICE, hdev);
2119        if (!cmd) {
2120                err = cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE,
2121                                 MGMT_STATUS_INVALID_PARAMS);
2122                goto unlock;
2123        }
2124
2125        conn = cmd->user_data;
2126
2127        if (bacmp(&addr->bdaddr, &conn->dst) != 0) {
2128                err = cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE,
2129                                 MGMT_STATUS_INVALID_PARAMS);
2130                goto unlock;
2131        }
2132
2133        pairing_complete(cmd, MGMT_STATUS_CANCELLED);
2134
2135        err = cmd_complete(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE, 0,
2136                           addr, sizeof(*addr));
2137unlock:
2138        hci_dev_unlock(hdev);
2139        return err;
2140}
2141
2142static int user_pairing_resp(struct sock *sk, struct hci_dev *hdev,
2143                             bdaddr_t *bdaddr, u8 type, u16 mgmt_op,
2144                             u16 hci_op, __le32 passkey)
2145{
2146        struct pending_cmd *cmd;
2147        struct hci_conn *conn;
2148        int err;
2149
2150        hci_dev_lock(hdev);
2151
2152        if (!hdev_is_powered(hdev)) {
2153                err = cmd_status(sk, hdev->id, mgmt_op,
2154                                 MGMT_STATUS_NOT_POWERED);
2155                goto done;
2156        }
2157
2158        if (type == BDADDR_BREDR)
2159                conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, bdaddr);
2160        else
2161                conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, bdaddr);
2162
2163        if (!conn) {
2164                err = cmd_status(sk, hdev->id, mgmt_op,
2165                                 MGMT_STATUS_NOT_CONNECTED);
2166                goto done;
2167        }
2168
2169        if (type == BDADDR_LE_PUBLIC || type == BDADDR_LE_RANDOM) {
2170                /* Continue with pairing via SMP */
2171                err = smp_user_confirm_reply(conn, mgmt_op, passkey);
2172
2173                if (!err)
2174                        err = cmd_status(sk, hdev->id, mgmt_op,
2175                                         MGMT_STATUS_SUCCESS);
2176                else
2177                        err = cmd_status(sk, hdev->id, mgmt_op,
2178                                         MGMT_STATUS_FAILED);
2179
2180                goto done;
2181        }
2182
2183        cmd = mgmt_pending_add(sk, mgmt_op, hdev, bdaddr, sizeof(*bdaddr));
2184        if (!cmd) {
2185                err = -ENOMEM;
2186                goto done;
2187        }
2188
2189        /* Continue with pairing via HCI */
2190        if (hci_op == HCI_OP_USER_PASSKEY_REPLY) {
2191                struct hci_cp_user_passkey_reply cp;
2192
2193                bacpy(&cp.bdaddr, bdaddr);
2194                cp.passkey = passkey;
2195                err = hci_send_cmd(hdev, hci_op, sizeof(cp), &cp);
2196        } else
2197                err = hci_send_cmd(hdev, hci_op, sizeof(*bdaddr), bdaddr);
2198
2199        if (err < 0)
2200                mgmt_pending_remove(cmd);
2201
2202done:
2203        hci_dev_unlock(hdev);
2204        return err;
2205}
2206
2207static int pin_code_neg_reply(struct sock *sk, struct hci_dev *hdev,
2208                              void *data, u16 len)
2209{
2210        struct mgmt_cp_pin_code_neg_reply *cp = data;
2211
2212        BT_DBG("");
2213
2214        return user_pairing_resp(sk, hdev, &cp->addr.bdaddr, cp->addr.type,
2215                                MGMT_OP_PIN_CODE_NEG_REPLY,
2216                                HCI_OP_PIN_CODE_NEG_REPLY, 0);
2217}
2218
2219static int user_confirm_reply(struct sock *sk, struct hci_dev *hdev, void *data,
2220                              u16 len)
2221{
2222        struct mgmt_cp_user_confirm_reply *cp = data;
2223
2224        BT_DBG("");
2225
2226        if (len != sizeof(*cp))
2227                return cmd_status(sk, hdev->id, MGMT_OP_USER_CONFIRM_REPLY,
2228                                  MGMT_STATUS_INVALID_PARAMS);
2229
2230        return user_pairing_resp(sk, hdev, &cp->addr.bdaddr, cp->addr.type,
2231                                 MGMT_OP_USER_CONFIRM_REPLY,
2232                                 HCI_OP_USER_CONFIRM_REPLY, 0);
2233}
2234
2235static int user_confirm_neg_reply(struct sock *sk, struct hci_dev *hdev,
2236                                  void *data, u16 len)
2237{
2238        struct mgmt_cp_user_confirm_neg_reply *cp = data;
2239
2240        BT_DBG("");
2241
2242        return user_pairing_resp(sk, hdev, &cp->addr.bdaddr, cp->addr.type,
2243                                 MGMT_OP_USER_CONFIRM_NEG_REPLY,
2244                                 HCI_OP_USER_CONFIRM_NEG_REPLY, 0);
2245}
2246
2247static int user_passkey_reply(struct sock *sk, struct hci_dev *hdev, void *data,
2248                              u16 len)
2249{
2250        struct mgmt_cp_user_passkey_reply *cp = data;
2251
2252        BT_DBG("");
2253
2254        return user_pairing_resp(sk, hdev, &cp->addr.bdaddr, cp->addr.type,
2255                                 MGMT_OP_USER_PASSKEY_REPLY,
2256                                 HCI_OP_USER_PASSKEY_REPLY, cp->passkey);
2257}
2258
2259static int user_passkey_neg_reply(struct sock *sk, struct hci_dev *hdev,
2260                                  void *data, u16 len)
2261{
2262        struct mgmt_cp_user_passkey_neg_reply *cp = data;
2263
2264        BT_DBG("");
2265
2266        return user_pairing_resp(sk, hdev, &cp->addr.bdaddr, cp->addr.type,
2267                                 MGMT_OP_USER_PASSKEY_NEG_REPLY,
2268                                 HCI_OP_USER_PASSKEY_NEG_REPLY, 0);
2269}
2270
2271static int update_name(struct hci_dev *hdev, const char *name)
2272{
2273        struct hci_cp_write_local_name cp;
2274
2275        memcpy(cp.name, name, sizeof(cp.name));
2276
2277        return hci_send_cmd(hdev, HCI_OP_WRITE_LOCAL_NAME, sizeof(cp), &cp);
2278}
2279
2280static int set_local_name(struct sock *sk, struct hci_dev *hdev, void *data,
2281                          u16 len)
2282{
2283        struct mgmt_cp_set_local_name *cp = data;
2284        struct pending_cmd *cmd;
2285        int err;
2286
2287        BT_DBG("");
2288
2289        hci_dev_lock(hdev);
2290
2291        memcpy(hdev->short_name, cp->short_name, sizeof(hdev->short_name));
2292
2293        if (!hdev_is_powered(hdev)) {
2294                memcpy(hdev->dev_name, cp->name, sizeof(hdev->dev_name));
2295
2296                err = cmd_complete(sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, 0,
2297                                   data, len);
2298                if (err < 0)
2299                        goto failed;
2300
2301                err = mgmt_event(MGMT_EV_LOCAL_NAME_CHANGED, hdev, data, len,
2302                                 sk);
2303
2304                goto failed;
2305        }
2306
2307        cmd = mgmt_pending_add(sk, MGMT_OP_SET_LOCAL_NAME, hdev, data, len);
2308        if (!cmd) {
2309                err = -ENOMEM;
2310                goto failed;
2311        }
2312
2313        err = update_name(hdev, cp->name);
2314        if (err < 0)
2315                mgmt_pending_remove(cmd);
2316
2317failed:
2318        hci_dev_unlock(hdev);
2319        return err;
2320}
2321
2322static int read_local_oob_data(struct sock *sk, struct hci_dev *hdev,
2323                               void *data, u16 data_len)
2324{
2325        struct pending_cmd *cmd;
2326        int err;
2327
2328        BT_DBG("%s", hdev->name);
2329
2330        hci_dev_lock(hdev);
2331
2332        if (!hdev_is_powered(hdev)) {
2333                err = cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
2334                                 MGMT_STATUS_NOT_POWERED);
2335                goto unlock;
2336        }
2337
2338        if (!lmp_ssp_capable(hdev)) {
2339                err = cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
2340                                 MGMT_STATUS_NOT_SUPPORTED);
2341                goto unlock;
2342        }
2343
2344        if (mgmt_pending_find(MGMT_OP_READ_LOCAL_OOB_DATA, hdev)) {
2345                err = cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
2346                                 MGMT_STATUS_BUSY);
2347                goto unlock;
2348        }
2349
2350        cmd = mgmt_pending_add(sk, MGMT_OP_READ_LOCAL_OOB_DATA, hdev, NULL, 0);
2351        if (!cmd) {
2352                err = -ENOMEM;
2353                goto unlock;
2354        }
2355
2356        err = hci_send_cmd(hdev, HCI_OP_READ_LOCAL_OOB_DATA, 0, NULL);
2357        if (err < 0)
2358                mgmt_pending_remove(cmd);
2359
2360unlock:
2361        hci_dev_unlock(hdev);
2362        return err;
2363}
2364
2365static int add_remote_oob_data(struct sock *sk, struct hci_dev *hdev,
2366                               void *data, u16 len)
2367{
2368        struct mgmt_cp_add_remote_oob_data *cp = data;
2369        u8 status;
2370        int err;
2371
2372        BT_DBG("%s ", hdev->name);
2373
2374        hci_dev_lock(hdev);
2375
2376        err = hci_add_remote_oob_data(hdev, &cp->addr.bdaddr, cp->hash,
2377                                      cp->randomizer);
2378        if (err < 0)
2379                status = MGMT_STATUS_FAILED;
2380        else
2381                status = MGMT_STATUS_SUCCESS;
2382
2383        err = cmd_complete(sk, hdev->id, MGMT_OP_ADD_REMOTE_OOB_DATA, status,
2384                           &cp->addr, sizeof(cp->addr));
2385
2386        hci_dev_unlock(hdev);
2387        return err;
2388}
2389
2390static int remove_remote_oob_data(struct sock *sk, struct hci_dev *hdev,
2391                                  void *data, u16 len)
2392{
2393        struct mgmt_cp_remove_remote_oob_data *cp = data;
2394        u8 status;
2395        int err;
2396
2397        BT_DBG("%s", hdev->name);
2398
2399        hci_dev_lock(hdev);
2400
2401        err = hci_remove_remote_oob_data(hdev, &cp->addr.bdaddr);
2402        if (err < 0)
2403                status = MGMT_STATUS_INVALID_PARAMS;
2404        else
2405                status = MGMT_STATUS_SUCCESS;
2406
2407        err = cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_REMOTE_OOB_DATA,
2408                           status, &cp->addr, sizeof(cp->addr));
2409
2410        hci_dev_unlock(hdev);
2411        return err;
2412}
2413
2414int mgmt_interleaved_discovery(struct hci_dev *hdev)
2415{
2416        int err;
2417
2418        BT_DBG("%s", hdev->name);
2419
2420        hci_dev_lock(hdev);
2421
2422        err = hci_do_inquiry(hdev, INQUIRY_LEN_BREDR_LE);
2423        if (err < 0)
2424                hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
2425
2426        hci_dev_unlock(hdev);
2427
2428        return err;
2429}
2430
2431static int start_discovery(struct sock *sk, struct hci_dev *hdev,
2432                           void *data, u16 len)
2433{
2434        struct mgmt_cp_start_discovery *cp = data;
2435        struct pending_cmd *cmd;
2436        int err;
2437
2438        BT_DBG("%s", hdev->name);
2439
2440        hci_dev_lock(hdev);
2441
2442        if (!hdev_is_powered(hdev)) {
2443                err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
2444                                 MGMT_STATUS_NOT_POWERED);
2445                goto failed;
2446        }
2447
2448        if (test_bit(HCI_PERIODIC_INQ, &hdev->dev_flags)) {
2449                err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
2450                                 MGMT_STATUS_BUSY);
2451                goto failed;
2452        }
2453
2454        if (hdev->discovery.state != DISCOVERY_STOPPED) {
2455                err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
2456                                 MGMT_STATUS_BUSY);
2457                goto failed;
2458        }
2459
2460        cmd = mgmt_pending_add(sk, MGMT_OP_START_DISCOVERY, hdev, NULL, 0);
2461        if (!cmd) {
2462                err = -ENOMEM;
2463                goto failed;
2464        }
2465
2466        hdev->discovery.type = cp->type;
2467
2468        switch (hdev->discovery.type) {
2469        case DISCOV_TYPE_BREDR:
2470                if (!lmp_bredr_capable(hdev)) {
2471                        err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
2472                                         MGMT_STATUS_NOT_SUPPORTED);
2473                        mgmt_pending_remove(cmd);
2474                        goto failed;
2475                }
2476
2477                err = hci_do_inquiry(hdev, INQUIRY_LEN_BREDR);
2478                break;
2479
2480        case DISCOV_TYPE_LE:
2481                if (!lmp_host_le_capable(hdev)) {
2482                        err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
2483                                         MGMT_STATUS_NOT_SUPPORTED);
2484                        mgmt_pending_remove(cmd);
2485                        goto failed;
2486                }
2487
2488                err = hci_le_scan(hdev, LE_SCAN_TYPE, LE_SCAN_INT,
2489                                  LE_SCAN_WIN, LE_SCAN_TIMEOUT_LE_ONLY);
2490                break;
2491
2492        case DISCOV_TYPE_INTERLEAVED:
2493                if (!lmp_host_le_capable(hdev) || !lmp_bredr_capable(hdev)) {
2494                        err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
2495                                         MGMT_STATUS_NOT_SUPPORTED);
2496                        mgmt_pending_remove(cmd);
2497                        goto failed;
2498                }
2499
2500                err = hci_le_scan(hdev, LE_SCAN_TYPE, LE_SCAN_INT, LE_SCAN_WIN,
2501                                  LE_SCAN_TIMEOUT_BREDR_LE);
2502                break;
2503
2504        default:
2505                err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
2506                                 MGMT_STATUS_INVALID_PARAMS);
2507                mgmt_pending_remove(cmd);
2508                goto failed;
2509        }
2510
2511        if (err < 0)
2512                mgmt_pending_remove(cmd);
2513        else
2514                hci_discovery_set_state(hdev, DISCOVERY_STARTING);
2515
2516failed:
2517        hci_dev_unlock(hdev);
2518        return err;
2519}
2520
2521static int stop_discovery(struct sock *sk, struct hci_dev *hdev, void *data,
2522                          u16 len)
2523{
2524        struct mgmt_cp_stop_discovery *mgmt_cp = data;
2525        struct pending_cmd *cmd;
2526        struct hci_cp_remote_name_req_cancel cp;
2527        struct inquiry_entry *e;
2528        int err;
2529
2530        BT_DBG("%s", hdev->name);
2531
2532        hci_dev_lock(hdev);
2533
2534        if (!hci_discovery_active(hdev)) {
2535                err = cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY,
2536                                   MGMT_STATUS_REJECTED, &mgmt_cp->type,
2537                                   sizeof(mgmt_cp->type));
2538                goto unlock;
2539        }
2540
2541        if (hdev->discovery.type != mgmt_cp->type) {
2542                err = cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY,
2543                                   MGMT_STATUS_INVALID_PARAMS, &mgmt_cp->type,
2544                                   sizeof(mgmt_cp->type));
2545                goto unlock;
2546        }
2547
2548        cmd = mgmt_pending_add(sk, MGMT_OP_STOP_DISCOVERY, hdev, NULL, 0);
2549        if (!cmd) {
2550                err = -ENOMEM;
2551                goto unlock;
2552        }
2553
2554        switch (hdev->discovery.state) {
2555        case DISCOVERY_FINDING:
2556                if (test_bit(HCI_INQUIRY, &hdev->flags))
2557                        err = hci_cancel_inquiry(hdev);
2558                else
2559                        err = hci_cancel_le_scan(hdev);
2560
2561                break;
2562
2563        case DISCOVERY_RESOLVING:
2564                e = hci_inquiry_cache_lookup_resolve(hdev, BDADDR_ANY,
2565                                                     NAME_PENDING);
2566                if (!e) {
2567                        mgmt_pending_remove(cmd);
2568                        err = cmd_complete(sk, hdev->id,
2569                                           MGMT_OP_STOP_DISCOVERY, 0,
2570                                           &mgmt_cp->type,
2571                                           sizeof(mgmt_cp->type));
2572                        hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
2573                        goto unlock;
2574                }
2575
2576                bacpy(&cp.bdaddr, &e->data.bdaddr);
2577                err = hci_send_cmd(hdev, HCI_OP_REMOTE_NAME_REQ_CANCEL,
2578                                   sizeof(cp), &cp);
2579
2580                break;
2581
2582        default:
2583                BT_DBG("unknown discovery state %u", hdev->discovery.state);
2584                err = -EFAULT;
2585        }
2586
2587        if (err < 0)
2588                mgmt_pending_remove(cmd);
2589        else
2590                hci_discovery_set_state(hdev, DISCOVERY_STOPPING);
2591
2592unlock:
2593        hci_dev_unlock(hdev);
2594        return err;
2595}
2596
2597static int confirm_name(struct sock *sk, struct hci_dev *hdev, void *data,
2598                        u16 len)
2599{
2600        struct mgmt_cp_confirm_name *cp = data;
2601        struct inquiry_entry *e;
2602        int err;
2603
2604        BT_DBG("%s", hdev->name);
2605
2606        hci_dev_lock(hdev);
2607
2608        if (!hci_discovery_active(hdev)) {
2609                err = cmd_status(sk, hdev->id, MGMT_OP_CONFIRM_NAME,
2610                                 MGMT_STATUS_FAILED);
2611                goto failed;
2612        }
2613
2614        e = hci_inquiry_cache_lookup_unknown(hdev, &cp->addr.bdaddr);
2615        if (!e) {
2616                err = cmd_status(sk, hdev->id, MGMT_OP_CONFIRM_NAME,
2617                                 MGMT_STATUS_INVALID_PARAMS);
2618                goto failed;
2619        }
2620
2621        if (cp->name_known) {
2622                e->name_state = NAME_KNOWN;
2623                list_del(&e->list);
2624        } else {
2625                e->name_state = NAME_NEEDED;
2626                hci_inquiry_cache_update_resolve(hdev, e);
2627        }
2628
2629        err = cmd_complete(sk, hdev->id, MGMT_OP_CONFIRM_NAME, 0, &cp->addr,
2630                           sizeof(cp->addr));
2631
2632failed:
2633        hci_dev_unlock(hdev);
2634        return err;
2635}
2636
2637static int block_device(struct sock *sk, struct hci_dev *hdev, void *data,
2638                        u16 len)
2639{
2640        struct mgmt_cp_block_device *cp = data;
2641        u8 status;
2642        int err;
2643
2644        BT_DBG("%s", hdev->name);
2645
2646        if (!bdaddr_type_is_valid(cp->addr.type))
2647                return cmd_complete(sk, hdev->id, MGMT_OP_BLOCK_DEVICE,
2648                                    MGMT_STATUS_INVALID_PARAMS,
2649                                    &cp->addr, sizeof(cp->addr));
2650
2651        hci_dev_lock(hdev);
2652
2653        err = hci_blacklist_add(hdev, &cp->addr.bdaddr, cp->addr.type);
2654        if (err < 0)
2655                status = MGMT_STATUS_FAILED;
2656        else
2657                status = MGMT_STATUS_SUCCESS;
2658
2659        err = cmd_complete(sk, hdev->id, MGMT_OP_BLOCK_DEVICE, status,
2660                           &cp->addr, sizeof(cp->addr));
2661
2662        hci_dev_unlock(hdev);
2663
2664        return err;
2665}
2666
2667static int unblock_device(struct sock *sk, struct hci_dev *hdev, void *data,
2668                          u16 len)
2669{
2670        struct mgmt_cp_unblock_device *cp = data;
2671        u8 status;
2672        int err;
2673
2674        BT_DBG("%s", hdev->name);
2675
2676        if (!bdaddr_type_is_valid(cp->addr.type))
2677                return cmd_complete(sk, hdev->id, MGMT_OP_UNBLOCK_DEVICE,
2678                                    MGMT_STATUS_INVALID_PARAMS,
2679                                    &cp->addr, sizeof(cp->addr));
2680
2681        hci_dev_lock(hdev);
2682
2683        err = hci_blacklist_del(hdev, &cp->addr.bdaddr, cp->addr.type);
2684        if (err < 0)
2685                status = MGMT_STATUS_INVALID_PARAMS;
2686        else
2687                status = MGMT_STATUS_SUCCESS;
2688
2689        err = cmd_complete(sk, hdev->id, MGMT_OP_UNBLOCK_DEVICE, status,
2690                           &cp->addr, sizeof(cp->addr));
2691
2692        hci_dev_unlock(hdev);
2693
2694        return err;
2695}
2696
2697static int set_device_id(struct sock *sk, struct hci_dev *hdev, void *data,
2698                         u16 len)
2699{
2700        struct mgmt_cp_set_device_id *cp = data;
2701        int err;
2702        __u16 source;
2703
2704        BT_DBG("%s", hdev->name);
2705
2706        source = __le16_to_cpu(cp->source);
2707
2708        if (source > 0x0002)
2709                return cmd_status(sk, hdev->id, MGMT_OP_SET_DEVICE_ID,
2710                                  MGMT_STATUS_INVALID_PARAMS);
2711
2712        hci_dev_lock(hdev);
2713
2714        hdev->devid_source = source;
2715        hdev->devid_vendor = __le16_to_cpu(cp->vendor);
2716        hdev->devid_product = __le16_to_cpu(cp->product);
2717        hdev->devid_version = __le16_to_cpu(cp->version);
2718
2719        err = cmd_complete(sk, hdev->id, MGMT_OP_SET_DEVICE_ID, 0, NULL, 0);
2720
2721        update_eir(hdev);
2722
2723        hci_dev_unlock(hdev);
2724
2725        return err;
2726}
2727
2728static int set_fast_connectable(struct sock *sk, struct hci_dev *hdev,
2729                                void *data, u16 len)
2730{
2731        struct mgmt_mode *cp = data;
2732        struct hci_cp_write_page_scan_activity acp;
2733        u8 type;
2734        int err;
2735
2736        BT_DBG("%s", hdev->name);
2737
2738        if (!lmp_bredr_capable(hdev))
2739                return cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
2740                                  MGMT_STATUS_NOT_SUPPORTED);
2741
2742        if (cp->val != 0x00 && cp->val != 0x01)
2743                return cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
2744                                  MGMT_STATUS_INVALID_PARAMS);
2745
2746        if (!hdev_is_powered(hdev))
2747                return cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
2748                                  MGMT_STATUS_NOT_POWERED);
2749
2750        if (!test_bit(HCI_CONNECTABLE, &hdev->dev_flags))
2751                return cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
2752                                  MGMT_STATUS_REJECTED);
2753
2754        hci_dev_lock(hdev);
2755
2756        if (cp->val) {
2757                type = PAGE_SCAN_TYPE_INTERLACED;
2758
2759                /* 160 msec page scan interval */
2760                acp.interval = __constant_cpu_to_le16(0x0100);
2761        } else {
2762                type = PAGE_SCAN_TYPE_STANDARD; /* default */
2763
2764                /* default 1.28 sec page scan */
2765                acp.interval = __constant_cpu_to_le16(0x0800);
2766        }
2767
2768        /* default 11.25 msec page scan window */
2769        acp.window = __constant_cpu_to_le16(0x0012);
2770
2771        err = hci_send_cmd(hdev, HCI_OP_WRITE_PAGE_SCAN_ACTIVITY, sizeof(acp),
2772                           &acp);
2773        if (err < 0) {
2774                err = cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
2775                                 MGMT_STATUS_FAILED);
2776                goto done;
2777        }
2778
2779        err = hci_send_cmd(hdev, HCI_OP_WRITE_PAGE_SCAN_TYPE, 1, &type);
2780        if (err < 0) {
2781                err = cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
2782                                 MGMT_STATUS_FAILED);
2783                goto done;
2784        }
2785
2786        err = cmd_complete(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE, 0,
2787                           NULL, 0);
2788done:
2789        hci_dev_unlock(hdev);
2790        return err;
2791}
2792
2793static bool ltk_is_valid(struct mgmt_ltk_info *key)
2794{
2795        if (key->authenticated != 0x00 && key->authenticated != 0x01)
2796                return false;
2797        if (key->master != 0x00 && key->master != 0x01)
2798                return false;
2799        if (!bdaddr_type_is_le(key->addr.type))
2800                return false;
2801        return true;
2802}
2803
2804static int load_long_term_keys(struct sock *sk, struct hci_dev *hdev,
2805                               void *cp_data, u16 len)
2806{
2807        struct mgmt_cp_load_long_term_keys *cp = cp_data;
2808        u16 key_count, expected_len;
2809        int i, err;
2810
2811        key_count = __le16_to_cpu(cp->key_count);
2812
2813        expected_len = sizeof(*cp) + key_count *
2814                                        sizeof(struct mgmt_ltk_info);
2815        if (expected_len != len) {
2816                BT_ERR("load_keys: expected %u bytes, got %u bytes",
2817                       len, expected_len);
2818                return cmd_status(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS,
2819                                  MGMT_STATUS_INVALID_PARAMS);
2820        }
2821
2822        BT_DBG("%s key_count %u", hdev->name, key_count);
2823
2824        for (i = 0; i < key_count; i++) {
2825                struct mgmt_ltk_info *key = &cp->keys[i];
2826
2827                if (!ltk_is_valid(key))
2828                        return cmd_status(sk, hdev->id,
2829                                          MGMT_OP_LOAD_LONG_TERM_KEYS,
2830                                          MGMT_STATUS_INVALID_PARAMS);
2831        }
2832
2833        hci_dev_lock(hdev);
2834
2835        hci_smp_ltks_clear(hdev);
2836
2837        for (i = 0; i < key_count; i++) {
2838                struct mgmt_ltk_info *key = &cp->keys[i];
2839                u8 type;
2840
2841                if (key->master)
2842                        type = HCI_SMP_LTK;
2843                else
2844                        type = HCI_SMP_LTK_SLAVE;
2845
2846                hci_add_ltk(hdev, &key->addr.bdaddr,
2847                            bdaddr_to_le(key->addr.type),
2848                            type, 0, key->authenticated, key->val,
2849                            key->enc_size, key->ediv, key->rand);
2850        }
2851
2852        err = cmd_complete(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS, 0,
2853                           NULL, 0);
2854
2855        hci_dev_unlock(hdev);
2856
2857        return err;
2858}
2859
2860static const struct mgmt_handler {
2861        int (*func) (struct sock *sk, struct hci_dev *hdev, void *data,
2862                     u16 data_len);
2863        bool var_len;
2864        size_t data_len;
2865} mgmt_handlers[] = {
2866        { NULL }, /* 0x0000 (no command) */
2867        { read_version,           false, MGMT_READ_VERSION_SIZE },
2868        { read_commands,          false, MGMT_READ_COMMANDS_SIZE },
2869        { read_index_list,        false, MGMT_READ_INDEX_LIST_SIZE },
2870        { read_controller_info,   false, MGMT_READ_INFO_SIZE },
2871        { set_powered,            false, MGMT_SETTING_SIZE },
2872        { set_discoverable,       false, MGMT_SET_DISCOVERABLE_SIZE },
2873        { set_connectable,        false, MGMT_SETTING_SIZE },
2874        { set_fast_connectable,   false, MGMT_SETTING_SIZE },
2875        { set_pairable,           false, MGMT_SETTING_SIZE },
2876        { set_link_security,      false, MGMT_SETTING_SIZE },
2877        { set_ssp,                false, MGMT_SETTING_SIZE },
2878        { set_hs,                 false, MGMT_SETTING_SIZE },
2879        { set_le,                 false, MGMT_SETTING_SIZE },
2880        { set_dev_class,          false, MGMT_SET_DEV_CLASS_SIZE },
2881        { set_local_name,         false, MGMT_SET_LOCAL_NAME_SIZE },
2882        { add_uuid,               false, MGMT_ADD_UUID_SIZE },
2883        { remove_uuid,            false, MGMT_REMOVE_UUID_SIZE },
2884        { load_link_keys,         true,  MGMT_LOAD_LINK_KEYS_SIZE },
2885        { load_long_term_keys,    true,  MGMT_LOAD_LONG_TERM_KEYS_SIZE },
2886        { disconnect,             false, MGMT_DISCONNECT_SIZE },
2887        { get_connections,        false, MGMT_GET_CONNECTIONS_SIZE },
2888        { pin_code_reply,         false, MGMT_PIN_CODE_REPLY_SIZE },
2889        { pin_code_neg_reply,     false, MGMT_PIN_CODE_NEG_REPLY_SIZE },
2890        { set_io_capability,      false, MGMT_SET_IO_CAPABILITY_SIZE },
2891        { pair_device,            false, MGMT_PAIR_DEVICE_SIZE },
2892        { cancel_pair_device,     false, MGMT_CANCEL_PAIR_DEVICE_SIZE },
2893        { unpair_device,          false, MGMT_UNPAIR_DEVICE_SIZE },
2894        { user_confirm_reply,     false, MGMT_USER_CONFIRM_REPLY_SIZE },
2895        { user_confirm_neg_reply, false, MGMT_USER_CONFIRM_NEG_REPLY_SIZE },
2896        { user_passkey_reply,     false, MGMT_USER_PASSKEY_REPLY_SIZE },
2897        { user_passkey_neg_reply, false, MGMT_USER_PASSKEY_NEG_REPLY_SIZE },
2898        { read_local_oob_data,    false, MGMT_READ_LOCAL_OOB_DATA_SIZE },
2899        { add_remote_oob_data,    false, MGMT_ADD_REMOTE_OOB_DATA_SIZE },
2900        { remove_remote_oob_data, false, MGMT_REMOVE_REMOTE_OOB_DATA_SIZE },
2901        { start_discovery,        false, MGMT_START_DISCOVERY_SIZE },
2902        { stop_discovery,         false, MGMT_STOP_DISCOVERY_SIZE },
2903        { confirm_name,           false, MGMT_CONFIRM_NAME_SIZE },
2904        { block_device,           false, MGMT_BLOCK_DEVICE_SIZE },
2905        { unblock_device,         false, MGMT_UNBLOCK_DEVICE_SIZE },
2906        { set_device_id,          false, MGMT_SET_DEVICE_ID_SIZE },
2907};
2908
2909
2910int mgmt_control(struct sock *sk, struct msghdr *msg, size_t msglen)
2911{
2912        void *buf;
2913        u8 *cp;
2914        struct mgmt_hdr *hdr;
2915        u16 opcode, index, len;
2916        struct hci_dev *hdev = NULL;
2917        const struct mgmt_handler *handler;
2918        int err;
2919
2920        BT_DBG("got %zu bytes", msglen);
2921
2922        if (msglen < sizeof(*hdr))
2923                return -EINVAL;
2924
2925        buf = kmalloc(msglen, GFP_KERNEL);
2926        if (!buf)
2927                return -ENOMEM;
2928
2929        if (memcpy_fromiovec(buf, msg->msg_iov, msglen)) {
2930                err = -EFAULT;
2931                goto done;
2932        }
2933
2934        hdr = buf;
2935        opcode = __le16_to_cpu(hdr->opcode);
2936        index = __le16_to_cpu(hdr->index);
2937        len = __le16_to_cpu(hdr->len);
2938
2939        if (len != msglen - sizeof(*hdr)) {
2940                err = -EINVAL;
2941                goto done;
2942        }
2943
2944        if (index != MGMT_INDEX_NONE) {
2945                hdev = hci_dev_get(index);
2946                if (!hdev) {
2947                        err = cmd_status(sk, index, opcode,
2948                                         MGMT_STATUS_INVALID_INDEX);
2949                        goto done;
2950                }
2951        }
2952
2953        if (opcode >= ARRAY_SIZE(mgmt_handlers) ||
2954            mgmt_handlers[opcode].func == NULL) {
2955                BT_DBG("Unknown op %u", opcode);
2956                err = cmd_status(sk, index, opcode,
2957                                 MGMT_STATUS_UNKNOWN_COMMAND);
2958                goto done;
2959        }
2960
2961        if ((hdev && opcode < MGMT_OP_READ_INFO) ||
2962            (!hdev && opcode >= MGMT_OP_READ_INFO)) {
2963                err = cmd_status(sk, index, opcode,
2964                                 MGMT_STATUS_INVALID_INDEX);
2965                goto done;
2966        }
2967
2968        handler = &mgmt_handlers[opcode];
2969
2970        if ((handler->var_len && len < handler->data_len) ||
2971            (!handler->var_len && len != handler->data_len)) {
2972                err = cmd_status(sk, index, opcode,
2973                                 MGMT_STATUS_INVALID_PARAMS);
2974                goto done;
2975        }
2976
2977        if (hdev)
2978                mgmt_init_hdev(sk, hdev);
2979
2980        cp = buf + sizeof(*hdr);
2981
2982        err = handler->func(sk, hdev, cp, len);
2983        if (err < 0)
2984                goto done;
2985
2986        err = msglen;
2987
2988done:
2989        if (hdev)
2990                hci_dev_put(hdev);
2991
2992        kfree(buf);
2993        return err;
2994}
2995
2996static void cmd_status_rsp(struct pending_cmd *cmd, void *data)
2997{
2998        u8 *status = data;
2999
3000        cmd_status(cmd->sk, cmd->index, cmd->opcode, *status);
3001        mgmt_pending_remove(cmd);
3002}
3003
3004int mgmt_index_added(struct hci_dev *hdev)
3005{
3006        if (!mgmt_valid_hdev(hdev))
3007                return -ENOTSUPP;
3008
3009        return mgmt_event(MGMT_EV_INDEX_ADDED, hdev, NULL, 0, NULL);
3010}
3011
3012int mgmt_index_removed(struct hci_dev *hdev)
3013{
3014        u8 status = MGMT_STATUS_INVALID_INDEX;
3015
3016        if (!mgmt_valid_hdev(hdev))
3017                return -ENOTSUPP;
3018
3019        mgmt_pending_foreach(0, hdev, cmd_status_rsp, &status);
3020
3021        return mgmt_event(MGMT_EV_INDEX_REMOVED, hdev, NULL, 0, NULL);
3022}
3023
3024struct cmd_lookup {
3025        struct sock *sk;
3026        struct hci_dev *hdev;
3027        u8 mgmt_status;
3028};
3029
3030static void settings_rsp(struct pending_cmd *cmd, void *data)
3031{
3032        struct cmd_lookup *match = data;
3033
3034        send_settings_rsp(cmd->sk, cmd->opcode, match->hdev);
3035
3036        list_del(&cmd->list);
3037
3038        if (match->sk == NULL) {
3039                match->sk = cmd->sk;
3040                sock_hold(match->sk);
3041        }
3042
3043        mgmt_pending_free(cmd);
3044}
3045
3046static int set_bredr_scan(struct hci_dev *hdev)
3047{
3048        u8 scan = 0;
3049
3050        if (test_bit(HCI_CONNECTABLE, &hdev->dev_flags))
3051                scan |= SCAN_PAGE;
3052        if (test_bit(HCI_DISCOVERABLE, &hdev->dev_flags))
3053                scan |= SCAN_INQUIRY;
3054
3055        if (!scan)
3056                return 0;
3057
3058        return hci_send_cmd(hdev, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);
3059}
3060
3061int mgmt_powered(struct hci_dev *hdev, u8 powered)
3062{
3063        struct cmd_lookup match = { NULL, hdev };
3064        int err;
3065
3066        if (!test_bit(HCI_MGMT, &hdev->dev_flags))
3067                return 0;
3068
3069        mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, settings_rsp, &match);
3070
3071        if (powered) {
3072                u8 link_sec;
3073
3074                if (test_bit(HCI_SSP_ENABLED, &hdev->dev_flags) &&
3075                    !lmp_host_ssp_capable(hdev)) {
3076                        u8 ssp = 1;
3077
3078                        hci_send_cmd(hdev, HCI_OP_WRITE_SSP_MODE, 1, &ssp);
3079                }
3080
3081                if (test_bit(HCI_LE_ENABLED, &hdev->dev_flags)) {
3082                        struct hci_cp_write_le_host_supported cp;
3083
3084                        cp.le = 1;
3085                        cp.simul = lmp_le_br_capable(hdev);
3086
3087                        /* Check first if we already have the right
3088                         * host state (host features set)
3089                         */
3090                        if (cp.le != lmp_host_le_capable(hdev) ||
3091                            cp.simul != lmp_host_le_br_capable(hdev))
3092                                hci_send_cmd(hdev,
3093                                             HCI_OP_WRITE_LE_HOST_SUPPORTED,
3094                                             sizeof(cp), &cp);
3095                }
3096
3097                link_sec = test_bit(HCI_LINK_SECURITY, &hdev->dev_flags);
3098                if (link_sec != test_bit(HCI_AUTH, &hdev->flags))
3099                        hci_send_cmd(hdev, HCI_OP_WRITE_AUTH_ENABLE,
3100                                     sizeof(link_sec), &link_sec);
3101
3102                if (lmp_bredr_capable(hdev)) {
3103                        set_bredr_scan(hdev);
3104                        update_class(hdev);
3105                        update_name(hdev, hdev->dev_name);
3106                        update_eir(hdev);
3107                }
3108        } else {
3109                u8 status = MGMT_STATUS_NOT_POWERED;
3110                u8 zero_cod[] = { 0, 0, 0 };
3111
3112                mgmt_pending_foreach(0, hdev, cmd_status_rsp, &status);
3113
3114                if (memcmp(hdev->dev_class, zero_cod, sizeof(zero_cod)) != 0)
3115                        mgmt_event(MGMT_EV_CLASS_OF_DEV_CHANGED, hdev,
3116                                   zero_cod, sizeof(zero_cod), NULL);
3117        }
3118
3119        err = new_settings(hdev, match.sk);
3120
3121        if (match.sk)
3122                sock_put(match.sk);
3123
3124        return err;
3125}
3126
3127int mgmt_discoverable(struct hci_dev *hdev, u8 discoverable)
3128{
3129        struct cmd_lookup match = { NULL, hdev };
3130        bool changed = false;
3131        int err = 0;
3132
3133        if (discoverable) {
3134                if (!test_and_set_bit(HCI_DISCOVERABLE, &hdev->dev_flags))
3135                        changed = true;
3136        } else {
3137                if (test_and_clear_bit(HCI_DISCOVERABLE, &hdev->dev_flags))
3138                        changed = true;
3139        }
3140
3141        mgmt_pending_foreach(MGMT_OP_SET_DISCOVERABLE, hdev, settings_rsp,
3142                             &match);
3143
3144        if (changed)
3145                err = new_settings(hdev, match.sk);
3146
3147        if (match.sk)
3148                sock_put(match.sk);
3149
3150        return err;
3151}
3152
3153int mgmt_connectable(struct hci_dev *hdev, u8 connectable)
3154{
3155        struct cmd_lookup match = { NULL, hdev };
3156        bool changed = false;
3157        int err = 0;
3158
3159        if (connectable) {
3160                if (!test_and_set_bit(HCI_CONNECTABLE, &hdev->dev_flags))
3161                        changed = true;
3162        } else {
3163                if (test_and_clear_bit(HCI_CONNECTABLE, &hdev->dev_flags))
3164                        changed = true;
3165        }
3166
3167        mgmt_pending_foreach(MGMT_OP_SET_CONNECTABLE, hdev, settings_rsp,
3168                             &match);
3169
3170        if (changed)
3171                err = new_settings(hdev, match.sk);
3172
3173        if (match.sk)
3174                sock_put(match.sk);
3175
3176        return err;
3177}
3178
3179int mgmt_write_scan_failed(struct hci_dev *hdev, u8 scan, u8 status)
3180{
3181        u8 mgmt_err = mgmt_status(status);
3182
3183        if (scan & SCAN_PAGE)
3184                mgmt_pending_foreach(MGMT_OP_SET_CONNECTABLE, hdev,
3185                                     cmd_status_rsp, &mgmt_err);
3186
3187        if (scan & SCAN_INQUIRY)
3188                mgmt_pending_foreach(MGMT_OP_SET_DISCOVERABLE, hdev,
3189                                     cmd_status_rsp, &mgmt_err);
3190
3191        return 0;
3192}
3193
3194int mgmt_new_link_key(struct hci_dev *hdev, struct link_key *key,
3195                      bool persistent)
3196{
3197        struct mgmt_ev_new_link_key ev;
3198
3199        memset(&ev, 0, sizeof(ev));
3200
3201        ev.store_hint = persistent;
3202        bacpy(&ev.key.addr.bdaddr, &key->bdaddr);
3203        ev.key.addr.type = BDADDR_BREDR;
3204        ev.key.type = key->type;
3205        memcpy(ev.key.val, key->val, HCI_LINK_KEY_SIZE);
3206        ev.key.pin_len = key->pin_len;
3207
3208        return mgmt_event(MGMT_EV_NEW_LINK_KEY, hdev, &ev, sizeof(ev), NULL);
3209}
3210
3211int mgmt_new_ltk(struct hci_dev *hdev, struct smp_ltk *key, u8 persistent)
3212{
3213        struct mgmt_ev_new_long_term_key ev;
3214
3215        memset(&ev, 0, sizeof(ev));
3216
3217        ev.store_hint = persistent;
3218        bacpy(&ev.key.addr.bdaddr, &key->bdaddr);
3219        ev.key.addr.type = link_to_bdaddr(LE_LINK, key->bdaddr_type);
3220        ev.key.authenticated = key->authenticated;
3221        ev.key.enc_size = key->enc_size;
3222        ev.key.ediv = key->ediv;
3223
3224        if (key->type == HCI_SMP_LTK)
3225                ev.key.master = 1;
3226
3227        memcpy(ev.key.rand, key->rand, sizeof(key->rand));
3228        memcpy(ev.key.val, key->val, sizeof(key->val));
3229
3230        return mgmt_event(MGMT_EV_NEW_LONG_TERM_KEY, hdev, &ev, sizeof(ev),
3231                          NULL);
3232}
3233
3234int mgmt_device_connected(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
3235                          u8 addr_type, u32 flags, u8 *name, u8 name_len,
3236                          u8 *dev_class)
3237{
3238        char buf[512];
3239        struct mgmt_ev_device_connected *ev = (void *) buf;
3240        u16 eir_len = 0;
3241
3242        bacpy(&ev->addr.bdaddr, bdaddr);
3243        ev->addr.type = link_to_bdaddr(link_type, addr_type);
3244
3245        ev->flags = __cpu_to_le32(flags);
3246
3247        if (name_len > 0)
3248                eir_len = eir_append_data(ev->eir, 0, EIR_NAME_COMPLETE,
3249                                          name, name_len);
3250
3251        if (dev_class && memcmp(dev_class, "\0\0\0", 3) != 0)
3252                eir_len = eir_append_data(ev->eir, eir_len,
3253                                          EIR_CLASS_OF_DEV, dev_class, 3);
3254
3255        ev->eir_len = cpu_to_le16(eir_len);
3256
3257        return mgmt_event(MGMT_EV_DEVICE_CONNECTED, hdev, buf,
3258                          sizeof(*ev) + eir_len, NULL);
3259}
3260
3261static void disconnect_rsp(struct pending_cmd *cmd, void *data)
3262{
3263        struct mgmt_cp_disconnect *cp = cmd->param;
3264        struct sock **sk = data;
3265        struct mgmt_rp_disconnect rp;
3266
3267        bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
3268        rp.addr.type = cp->addr.type;
3269
3270        cmd_complete(cmd->sk, cmd->index, MGMT_OP_DISCONNECT, 0, &rp,
3271                     sizeof(rp));
3272
3273        *sk = cmd->sk;
3274        sock_hold(*sk);
3275
3276        mgmt_pending_remove(cmd);
3277}
3278
3279static void unpair_device_rsp(struct pending_cmd *cmd, void *data)
3280{
3281        struct hci_dev *hdev = data;
3282        struct mgmt_cp_unpair_device *cp = cmd->param;
3283        struct mgmt_rp_unpair_device rp;
3284
3285        memset(&rp, 0, sizeof(rp));
3286        bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
3287        rp.addr.type = cp->addr.type;
3288
3289        device_unpaired(hdev, &cp->addr.bdaddr, cp->addr.type, cmd->sk);
3290
3291        cmd_complete(cmd->sk, cmd->index, cmd->opcode, 0, &rp, sizeof(rp));
3292
3293        mgmt_pending_remove(cmd);
3294}
3295
3296int mgmt_device_disconnected(struct hci_dev *hdev, bdaddr_t *bdaddr,
3297                             u8 link_type, u8 addr_type, u8 reason)
3298{
3299        struct mgmt_ev_device_disconnected ev;
3300        struct sock *sk = NULL;
3301        int err;
3302
3303        mgmt_pending_foreach(MGMT_OP_DISCONNECT, hdev, disconnect_rsp, &sk);
3304
3305        bacpy(&ev.addr.bdaddr, bdaddr);
3306        ev.addr.type = link_to_bdaddr(link_type, addr_type);
3307        ev.reason = reason;
3308
3309        err = mgmt_event(MGMT_EV_DEVICE_DISCONNECTED, hdev, &ev, sizeof(ev),
3310                         sk);
3311
3312        if (sk)
3313                sock_put(sk);
3314
3315        mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE, hdev, unpair_device_rsp,
3316                             hdev);
3317
3318        return err;
3319}
3320
3321int mgmt_disconnect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr,
3322                           u8 link_type, u8 addr_type, u8 status)
3323{
3324        struct mgmt_rp_disconnect rp;
3325        struct pending_cmd *cmd;
3326        int err;
3327
3328        mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE, hdev, unpair_device_rsp,
3329                             hdev);
3330
3331        cmd = mgmt_pending_find(MGMT_OP_DISCONNECT, hdev);
3332        if (!cmd)
3333                return -ENOENT;
3334
3335        bacpy(&rp.addr.bdaddr, bdaddr);
3336        rp.addr.type = link_to_bdaddr(link_type, addr_type);
3337
3338        err = cmd_complete(cmd->sk, cmd->index, MGMT_OP_DISCONNECT,
3339                           mgmt_status(status), &rp, sizeof(rp));
3340
3341        mgmt_pending_remove(cmd);
3342
3343        return err;
3344}
3345
3346int mgmt_connect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
3347                        u8 addr_type, u8 status)
3348{
3349        struct mgmt_ev_connect_failed ev;
3350
3351        bacpy(&ev.addr.bdaddr, bdaddr);
3352        ev.addr.type = link_to_bdaddr(link_type, addr_type);
3353        ev.status = mgmt_status(status);
3354
3355        return mgmt_event(MGMT_EV_CONNECT_FAILED, hdev, &ev, sizeof(ev), NULL);
3356}
3357
3358int mgmt_pin_code_request(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 secure)
3359{
3360        struct mgmt_ev_pin_code_request ev;
3361
3362        bacpy(&ev.addr.bdaddr, bdaddr);
3363        ev.addr.type = BDADDR_BREDR;
3364        ev.secure = secure;
3365
3366        return mgmt_event(MGMT_EV_PIN_CODE_REQUEST, hdev, &ev, sizeof(ev),
3367                          NULL);
3368}
3369
3370int mgmt_pin_code_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
3371                                 u8 status)
3372{
3373        struct pending_cmd *cmd;
3374        struct mgmt_rp_pin_code_reply rp;
3375        int err;
3376
3377        cmd = mgmt_pending_find(MGMT_OP_PIN_CODE_REPLY, hdev);
3378        if (!cmd)
3379                return -ENOENT;
3380
3381        bacpy(&rp.addr.bdaddr, bdaddr);
3382        rp.addr.type = BDADDR_BREDR;
3383
3384        err = cmd_complete(cmd->sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
3385                           mgmt_status(status), &rp, sizeof(rp));
3386
3387        mgmt_pending_remove(cmd);
3388
3389        return err;
3390}
3391
3392int mgmt_pin_code_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
3393                                     u8 status)
3394{
3395        struct pending_cmd *cmd;
3396        struct mgmt_rp_pin_code_reply rp;
3397        int err;
3398
3399        cmd = mgmt_pending_find(MGMT_OP_PIN_CODE_NEG_REPLY, hdev);
3400        if (!cmd)
3401                return -ENOENT;
3402
3403        bacpy(&rp.addr.bdaddr, bdaddr);
3404        rp.addr.type = BDADDR_BREDR;
3405
3406        err = cmd_complete(cmd->sk, hdev->id, MGMT_OP_PIN_CODE_NEG_REPLY,
3407                           mgmt_status(status), &rp, sizeof(rp));
3408
3409        mgmt_pending_remove(cmd);
3410
3411        return err;
3412}
3413
3414int mgmt_user_confirm_request(struct hci_dev *hdev, bdaddr_t *bdaddr,
3415                              u8 link_type, u8 addr_type, __le32 value,
3416                              u8 confirm_hint)
3417{
3418        struct mgmt_ev_user_confirm_request ev;
3419
3420        BT_DBG("%s", hdev->name);
3421
3422        bacpy(&ev.addr.bdaddr, bdaddr);
3423        ev.addr.type = link_to_bdaddr(link_type, addr_type);
3424        ev.confirm_hint = confirm_hint;
3425        ev.value = value;
3426
3427        return mgmt_event(MGMT_EV_USER_CONFIRM_REQUEST, hdev, &ev, sizeof(ev),
3428                          NULL);
3429}
3430
3431int mgmt_user_passkey_request(struct hci_dev *hdev, bdaddr_t *bdaddr,
3432                              u8 link_type, u8 addr_type)
3433{
3434        struct mgmt_ev_user_passkey_request ev;
3435
3436        BT_DBG("%s", hdev->name);
3437
3438        bacpy(&ev.addr.bdaddr, bdaddr);
3439        ev.addr.type = link_to_bdaddr(link_type, addr_type);
3440
3441        return mgmt_event(MGMT_EV_USER_PASSKEY_REQUEST, hdev, &ev, sizeof(ev),
3442                          NULL);
3443}
3444
3445static int user_pairing_resp_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
3446                                      u8 link_type, u8 addr_type, u8 status,
3447                                      u8 opcode)
3448{
3449        struct pending_cmd *cmd;
3450        struct mgmt_rp_user_confirm_reply rp;
3451        int err;
3452
3453        cmd = mgmt_pending_find(opcode, hdev);
3454        if (!cmd)
3455                return -ENOENT;
3456
3457        bacpy(&rp.addr.bdaddr, bdaddr);
3458        rp.addr.type = link_to_bdaddr(link_type, addr_type);
3459        err = cmd_complete(cmd->sk, hdev->id, opcode, mgmt_status(status),
3460                           &rp, sizeof(rp));
3461
3462        mgmt_pending_remove(cmd);
3463
3464        return err;
3465}
3466
3467int mgmt_user_confirm_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
3468                                     u8 link_type, u8 addr_type, u8 status)
3469{
3470        return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
3471                                          status, MGMT_OP_USER_CONFIRM_REPLY);
3472}
3473
3474int mgmt_user_confirm_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
3475                                         u8 link_type, u8 addr_type, u8 status)
3476{
3477        return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
3478                                          status,
3479                                          MGMT_OP_USER_CONFIRM_NEG_REPLY);
3480}
3481
3482int mgmt_user_passkey_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
3483                                     u8 link_type, u8 addr_type, u8 status)
3484{
3485        return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
3486                                          status, MGMT_OP_USER_PASSKEY_REPLY);
3487}
3488
3489int mgmt_user_passkey_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
3490                                         u8 link_type, u8 addr_type, u8 status)
3491{
3492        return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
3493                                          status,
3494                                          MGMT_OP_USER_PASSKEY_NEG_REPLY);
3495}
3496
3497int mgmt_user_passkey_notify(struct hci_dev *hdev, bdaddr_t *bdaddr,
3498                             u8 link_type, u8 addr_type, u32 passkey,
3499                             u8 entered)
3500{
3501        struct mgmt_ev_passkey_notify ev;
3502
3503        BT_DBG("%s", hdev->name);
3504
3505        bacpy(&ev.addr.bdaddr, bdaddr);
3506        ev.addr.type = link_to_bdaddr(link_type, addr_type);
3507        ev.passkey = __cpu_to_le32(passkey);
3508        ev.entered = entered;
3509
3510        return mgmt_event(MGMT_EV_PASSKEY_NOTIFY, hdev, &ev, sizeof(ev), NULL);
3511}
3512
3513int mgmt_auth_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
3514                     u8 addr_type, u8 status)
3515{
3516        struct mgmt_ev_auth_failed ev;
3517
3518        bacpy(&ev.addr.bdaddr, bdaddr);
3519        ev.addr.type = link_to_bdaddr(link_type, addr_type);
3520        ev.status = mgmt_status(status);
3521
3522        return mgmt_event(MGMT_EV_AUTH_FAILED, hdev, &ev, sizeof(ev), NULL);
3523}
3524
3525int mgmt_auth_enable_complete(struct hci_dev *hdev, u8 status)
3526{
3527        struct cmd_lookup match = { NULL, hdev };
3528        bool changed = false;
3529        int err = 0;
3530
3531        if (status) {
3532                u8 mgmt_err = mgmt_status(status);
3533                mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev,
3534                                     cmd_status_rsp, &mgmt_err);
3535                return 0;
3536        }
3537
3538        if (test_bit(HCI_AUTH, &hdev->flags)) {
3539                if (!test_and_set_bit(HCI_LINK_SECURITY, &hdev->dev_flags))
3540                        changed = true;
3541        } else {
3542                if (test_and_clear_bit(HCI_LINK_SECURITY, &hdev->dev_flags))
3543                        changed = true;
3544        }
3545
3546        mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev, settings_rsp,
3547                             &match);
3548
3549        if (changed)
3550                err = new_settings(hdev, match.sk);
3551
3552        if (match.sk)
3553                sock_put(match.sk);
3554
3555        return err;
3556}
3557
3558static int clear_eir(struct hci_dev *hdev)
3559{
3560        struct hci_cp_write_eir cp;
3561
3562        if (!lmp_ext_inq_capable(hdev))
3563                return 0;
3564
3565        memset(hdev->eir, 0, sizeof(hdev->eir));
3566
3567        memset(&cp, 0, sizeof(cp));
3568
3569        return hci_send_cmd(hdev, HCI_OP_WRITE_EIR, sizeof(cp), &cp);
3570}
3571
3572int mgmt_ssp_enable_complete(struct hci_dev *hdev, u8 enable, u8 status)
3573{
3574        struct cmd_lookup match = { NULL, hdev };
3575        bool changed = false;
3576        int err = 0;
3577
3578        if (status) {
3579                u8 mgmt_err = mgmt_status(status);
3580
3581                if (enable && test_and_clear_bit(HCI_SSP_ENABLED,
3582                                                 &hdev->dev_flags))
3583                        err = new_settings(hdev, NULL);
3584
3585                mgmt_pending_foreach(MGMT_OP_SET_SSP, hdev, cmd_status_rsp,
3586                                     &mgmt_err);
3587
3588                return err;
3589        }
3590
3591        if (enable) {
3592                if (!test_and_set_bit(HCI_SSP_ENABLED, &hdev->dev_flags))
3593                        changed = true;
3594        } else {
3595                if (test_and_clear_bit(HCI_SSP_ENABLED, &hdev->dev_flags))
3596                        changed = true;
3597        }
3598
3599        mgmt_pending_foreach(MGMT_OP_SET_SSP, hdev, settings_rsp, &match);
3600
3601        if (changed)
3602                err = new_settings(hdev, match.sk);
3603
3604        if (match.sk)
3605                sock_put(match.sk);
3606
3607        if (test_bit(HCI_SSP_ENABLED, &hdev->dev_flags))
3608                update_eir(hdev);
3609        else
3610                clear_eir(hdev);
3611
3612        return err;
3613}
3614
3615static void class_rsp(struct pending_cmd *cmd, void *data)
3616{
3617        struct cmd_lookup *match = data;
3618
3619        cmd_complete(cmd->sk, cmd->index, cmd->opcode, match->mgmt_status,
3620                     match->hdev->dev_class, 3);
3621
3622        list_del(&cmd->list);
3623
3624        if (match->sk == NULL) {
3625                match->sk = cmd->sk;
3626                sock_hold(match->sk);
3627        }
3628
3629        mgmt_pending_free(cmd);
3630}
3631
3632int mgmt_set_class_of_dev_complete(struct hci_dev *hdev, u8 *dev_class,
3633                                   u8 status)
3634{
3635        struct cmd_lookup match = { NULL, hdev, mgmt_status(status) };
3636        int err = 0;
3637
3638        clear_bit(HCI_PENDING_CLASS, &hdev->dev_flags);
3639
3640        mgmt_pending_foreach(MGMT_OP_SET_DEV_CLASS, hdev, class_rsp, &match);
3641        mgmt_pending_foreach(MGMT_OP_ADD_UUID, hdev, class_rsp, &match);
3642        mgmt_pending_foreach(MGMT_OP_REMOVE_UUID, hdev, class_rsp, &match);
3643
3644        if (!status)
3645                err = mgmt_event(MGMT_EV_CLASS_OF_DEV_CHANGED, hdev, dev_class,
3646                                 3, NULL);
3647
3648        if (match.sk)
3649                sock_put(match.sk);
3650
3651        return err;
3652}
3653
3654int mgmt_set_local_name_complete(struct hci_dev *hdev, u8 *name, u8 status)
3655{
3656        struct pending_cmd *cmd;
3657        struct mgmt_cp_set_local_name ev;
3658        bool changed = false;
3659        int err = 0;
3660
3661        if (memcmp(name, hdev->dev_name, sizeof(hdev->dev_name)) != 0) {
3662                memcpy(hdev->dev_name, name, sizeof(hdev->dev_name));
3663                changed = true;
3664        }
3665
3666        memset(&ev, 0, sizeof(ev));
3667        memcpy(ev.name, name, HCI_MAX_NAME_LENGTH);
3668        memcpy(ev.short_name, hdev->short_name, HCI_MAX_SHORT_NAME_LENGTH);
3669
3670        cmd = mgmt_pending_find(MGMT_OP_SET_LOCAL_NAME, hdev);
3671        if (!cmd)
3672                goto send_event;
3673
3674        /* Always assume that either the short or the complete name has
3675         * changed if there was a pending mgmt command */
3676        changed = true;
3677
3678        if (status) {
3679                err = cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_LOCAL_NAME,
3680                                 mgmt_status(status));
3681                goto failed;
3682        }
3683
3684        err = cmd_complete(cmd->sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, 0, &ev,
3685                           sizeof(ev));
3686        if (err < 0)
3687                goto failed;
3688
3689send_event:
3690        if (changed)
3691                err = mgmt_event(MGMT_EV_LOCAL_NAME_CHANGED, hdev, &ev,
3692                                 sizeof(ev), cmd ? cmd->sk : NULL);
3693
3694        /* EIR is taken care of separately when powering on the
3695         * adapter so only update them here if this is a name change
3696         * unrelated to power on.
3697         */
3698        if (!test_bit(HCI_INIT, &hdev->flags))
3699                update_eir(hdev);
3700
3701failed:
3702        if (cmd)
3703                mgmt_pending_remove(cmd);
3704        return err;
3705}
3706
3707int mgmt_read_local_oob_data_reply_complete(struct hci_dev *hdev, u8 *hash,
3708                                            u8 *randomizer, u8 status)
3709{
3710        struct pending_cmd *cmd;
3711        int err;
3712
3713        BT_DBG("%s status %u", hdev->name, status);
3714
3715        cmd = mgmt_pending_find(MGMT_OP_READ_LOCAL_OOB_DATA, hdev);
3716        if (!cmd)
3717                return -ENOENT;
3718
3719        if (status) {
3720                err = cmd_status(cmd->sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
3721                                 mgmt_status(status));
3722        } else {
3723                struct mgmt_rp_read_local_oob_data rp;
3724
3725                memcpy(rp.hash, hash, sizeof(rp.hash));
3726                memcpy(rp.randomizer, randomizer, sizeof(rp.randomizer));
3727
3728                err = cmd_complete(cmd->sk, hdev->id,
3729                                   MGMT_OP_READ_LOCAL_OOB_DATA, 0, &rp,
3730                                   sizeof(rp));
3731        }
3732
3733        mgmt_pending_remove(cmd);
3734
3735        return err;
3736}
3737
3738int mgmt_le_enable_complete(struct hci_dev *hdev, u8 enable, u8 status)
3739{
3740        struct cmd_lookup match = { NULL, hdev };
3741        bool changed = false;
3742        int err = 0;
3743
3744        if (status) {
3745                u8 mgmt_err = mgmt_status(status);
3746
3747                if (enable && test_and_clear_bit(HCI_LE_ENABLED,
3748                                                 &hdev->dev_flags))
3749                        err = new_settings(hdev, NULL);
3750
3751                mgmt_pending_foreach(MGMT_OP_SET_LE, hdev, cmd_status_rsp,
3752                                     &mgmt_err);
3753
3754                return err;
3755        }
3756
3757        if (enable) {
3758                if (!test_and_set_bit(HCI_LE_ENABLED, &hdev->dev_flags))
3759                        changed = true;
3760        } else {
3761                if (test_and_clear_bit(HCI_LE_ENABLED, &hdev->dev_flags))
3762                        changed = true;
3763        }
3764
3765        mgmt_pending_foreach(MGMT_OP_SET_LE, hdev, settings_rsp, &match);
3766
3767        if (changed)
3768                err = new_settings(hdev, match.sk);
3769
3770        if (match.sk)
3771                sock_put(match.sk);
3772
3773        return err;
3774}
3775
3776int mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
3777                      u8 addr_type, u8 *dev_class, s8 rssi, u8 cfm_name, u8
3778                      ssp, u8 *eir, u16 eir_len)
3779{
3780        char buf[512];
3781        struct mgmt_ev_device_found *ev = (void *) buf;
3782        size_t ev_size;
3783
3784        /* Leave 5 bytes for a potential CoD field */
3785        if (sizeof(*ev) + eir_len + 5 > sizeof(buf))
3786                return -EINVAL;
3787
3788        memset(buf, 0, sizeof(buf));
3789
3790        bacpy(&ev->addr.bdaddr, bdaddr);
3791        ev->addr.type = link_to_bdaddr(link_type, addr_type);
3792        ev->rssi = rssi;
3793        if (cfm_name)
3794                ev->flags |= __constant_cpu_to_le32(MGMT_DEV_FOUND_CONFIRM_NAME);
3795        if (!ssp)
3796                ev->flags |= __constant_cpu_to_le32(MGMT_DEV_FOUND_LEGACY_PAIRING);
3797
3798        if (eir_len > 0)
3799                memcpy(ev->eir, eir, eir_len);
3800
3801        if (dev_class && !eir_has_data_type(ev->eir, eir_len, EIR_CLASS_OF_DEV))
3802                eir_len = eir_append_data(ev->eir, eir_len, EIR_CLASS_OF_DEV,
3803                                          dev_class, 3);
3804
3805        ev->eir_len = cpu_to_le16(eir_len);
3806        ev_size = sizeof(*ev) + eir_len;
3807
3808        return mgmt_event(MGMT_EV_DEVICE_FOUND, hdev, ev, ev_size, NULL);
3809}
3810
3811int mgmt_remote_name(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
3812                     u8 addr_type, s8 rssi, u8 *name, u8 name_len)
3813{
3814        struct mgmt_ev_device_found *ev;
3815        char buf[sizeof(*ev) + HCI_MAX_NAME_LENGTH + 2];
3816        u16 eir_len;
3817
3818        ev = (struct mgmt_ev_device_found *) buf;
3819
3820        memset(buf, 0, sizeof(buf));
3821
3822        bacpy(&ev->addr.bdaddr, bdaddr);
3823        ev->addr.type = link_to_bdaddr(link_type, addr_type);
3824        ev->rssi = rssi;
3825
3826        eir_len = eir_append_data(ev->eir, 0, EIR_NAME_COMPLETE, name,
3827                                  name_len);
3828
3829        ev->eir_len = cpu_to_le16(eir_len);
3830
3831        return mgmt_event(MGMT_EV_DEVICE_FOUND, hdev, ev,
3832                          sizeof(*ev) + eir_len, NULL);
3833}
3834
3835int mgmt_start_discovery_failed(struct hci_dev *hdev, u8 status)
3836{
3837        struct pending_cmd *cmd;
3838        u8 type;
3839        int err;
3840
3841        hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
3842
3843        cmd = mgmt_pending_find(MGMT_OP_START_DISCOVERY, hdev);
3844        if (!cmd)
3845                return -ENOENT;
3846
3847        type = hdev->discovery.type;
3848
3849        err = cmd_complete(cmd->sk, hdev->id, cmd->opcode, mgmt_status(status),
3850                           &type, sizeof(type));
3851        mgmt_pending_remove(cmd);
3852
3853        return err;
3854}
3855
3856int mgmt_stop_discovery_failed(struct hci_dev *hdev, u8 status)
3857{
3858        struct pending_cmd *cmd;
3859        int err;
3860
3861        cmd = mgmt_pending_find(MGMT_OP_STOP_DISCOVERY, hdev);
3862        if (!cmd)
3863                return -ENOENT;
3864
3865        err = cmd_complete(cmd->sk, hdev->id, cmd->opcode, mgmt_status(status),
3866                           &hdev->discovery.type, sizeof(hdev->discovery.type));
3867        mgmt_pending_remove(cmd);
3868
3869        return err;
3870}
3871
3872int mgmt_discovering(struct hci_dev *hdev, u8 discovering)
3873{
3874        struct mgmt_ev_discovering ev;
3875        struct pending_cmd *cmd;
3876
3877        BT_DBG("%s discovering %u", hdev->name, discovering);
3878
3879        if (discovering)
3880                cmd = mgmt_pending_find(MGMT_OP_START_DISCOVERY, hdev);
3881        else
3882                cmd = mgmt_pending_find(MGMT_OP_STOP_DISCOVERY, hdev);
3883
3884        if (cmd != NULL) {
3885                u8 type = hdev->discovery.type;
3886
3887                cmd_complete(cmd->sk, hdev->id, cmd->opcode, 0, &type,
3888                             sizeof(type));
3889                mgmt_pending_remove(cmd);
3890        }
3891
3892        memset(&ev, 0, sizeof(ev));
3893        ev.type = hdev->discovery.type;
3894        ev.discovering = discovering;
3895
3896        return mgmt_event(MGMT_EV_DISCOVERING, hdev, &ev, sizeof(ev), NULL);
3897}
3898
3899int mgmt_device_blocked(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type)
3900{
3901        struct pending_cmd *cmd;
3902        struct mgmt_ev_device_blocked ev;
3903
3904        cmd = mgmt_pending_find(MGMT_OP_BLOCK_DEVICE, hdev);
3905
3906        bacpy(&ev.addr.bdaddr, bdaddr);
3907        ev.addr.type = type;
3908
3909        return mgmt_event(MGMT_EV_DEVICE_BLOCKED, hdev, &ev, sizeof(ev),
3910                          cmd ? cmd->sk : NULL);
3911}
3912
3913int mgmt_device_unblocked(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type)
3914{
3915        struct pending_cmd *cmd;
3916        struct mgmt_ev_device_unblocked ev;
3917
3918        cmd = mgmt_pending_find(MGMT_OP_UNBLOCK_DEVICE, hdev);
3919
3920        bacpy(&ev.addr.bdaddr, bdaddr);
3921        ev.addr.type = type;
3922
3923        return mgmt_event(MGMT_EV_DEVICE_UNBLOCKED, hdev, &ev, sizeof(ev),
3924                          cmd ? cmd->sk : NULL);
3925}
3926
3927module_param(enable_hs, bool, 0644);
3928MODULE_PARM_DESC(enable_hs, "Enable High Speed support");
3929