mgmt.c 114.2 KB
Newer Older
1 2
/*
   BlueZ - Bluetooth protocol stack for Linux
3

4
   Copyright (C) 2010  Nokia Corporation
5
   Copyright (C) 2011-2012 Intel Corporation
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License version 2 as
   published by the Free Software Foundation;

   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
   IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
   CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
   OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
   COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
   SOFTWARE IS DISCLAIMED.
*/

/* Bluetooth HCI Management interface */

27
#include <linux/module.h>
28 29 30 31 32
#include <asm/unaligned.h>

#include <net/bluetooth/bluetooth.h>
#include <net/bluetooth/hci_core.h>
#include <net/bluetooth/mgmt.h>
33 34

#include "smp.h"
35

36
#define MGMT_VERSION	1
37
#define MGMT_REVISION	4
38

39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
static const u16 mgmt_commands[] = {
	MGMT_OP_READ_INDEX_LIST,
	MGMT_OP_READ_INFO,
	MGMT_OP_SET_POWERED,
	MGMT_OP_SET_DISCOVERABLE,
	MGMT_OP_SET_CONNECTABLE,
	MGMT_OP_SET_FAST_CONNECTABLE,
	MGMT_OP_SET_PAIRABLE,
	MGMT_OP_SET_LINK_SECURITY,
	MGMT_OP_SET_SSP,
	MGMT_OP_SET_HS,
	MGMT_OP_SET_LE,
	MGMT_OP_SET_DEV_CLASS,
	MGMT_OP_SET_LOCAL_NAME,
	MGMT_OP_ADD_UUID,
	MGMT_OP_REMOVE_UUID,
	MGMT_OP_LOAD_LINK_KEYS,
	MGMT_OP_LOAD_LONG_TERM_KEYS,
	MGMT_OP_DISCONNECT,
	MGMT_OP_GET_CONNECTIONS,
	MGMT_OP_PIN_CODE_REPLY,
	MGMT_OP_PIN_CODE_NEG_REPLY,
	MGMT_OP_SET_IO_CAPABILITY,
	MGMT_OP_PAIR_DEVICE,
	MGMT_OP_CANCEL_PAIR_DEVICE,
	MGMT_OP_UNPAIR_DEVICE,
	MGMT_OP_USER_CONFIRM_REPLY,
	MGMT_OP_USER_CONFIRM_NEG_REPLY,
	MGMT_OP_USER_PASSKEY_REPLY,
	MGMT_OP_USER_PASSKEY_NEG_REPLY,
	MGMT_OP_READ_LOCAL_OOB_DATA,
	MGMT_OP_ADD_REMOTE_OOB_DATA,
	MGMT_OP_REMOVE_REMOTE_OOB_DATA,
	MGMT_OP_START_DISCOVERY,
	MGMT_OP_STOP_DISCOVERY,
	MGMT_OP_CONFIRM_NAME,
	MGMT_OP_BLOCK_DEVICE,
	MGMT_OP_UNBLOCK_DEVICE,
77
	MGMT_OP_SET_DEVICE_ID,
78
	MGMT_OP_SET_ADVERTISING,
79
	MGMT_OP_SET_BREDR,
80
	MGMT_OP_SET_STATIC_ADDRESS,
81
	MGMT_OP_SET_SCAN_PARAMS,
82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
};

static const u16 mgmt_events[] = {
	MGMT_EV_CONTROLLER_ERROR,
	MGMT_EV_INDEX_ADDED,
	MGMT_EV_INDEX_REMOVED,
	MGMT_EV_NEW_SETTINGS,
	MGMT_EV_CLASS_OF_DEV_CHANGED,
	MGMT_EV_LOCAL_NAME_CHANGED,
	MGMT_EV_NEW_LINK_KEY,
	MGMT_EV_NEW_LONG_TERM_KEY,
	MGMT_EV_DEVICE_CONNECTED,
	MGMT_EV_DEVICE_DISCONNECTED,
	MGMT_EV_CONNECT_FAILED,
	MGMT_EV_PIN_CODE_REQUEST,
	MGMT_EV_USER_CONFIRM_REQUEST,
	MGMT_EV_USER_PASSKEY_REQUEST,
	MGMT_EV_AUTH_FAILED,
	MGMT_EV_DEVICE_FOUND,
	MGMT_EV_DISCOVERING,
	MGMT_EV_DEVICE_BLOCKED,
	MGMT_EV_DEVICE_UNBLOCKED,
	MGMT_EV_DEVICE_UNPAIRED,
105
	MGMT_EV_PASSKEY_NOTIFY,
106 107
};

108
#define CACHE_TIMEOUT	msecs_to_jiffies(2 * 1000)
109

110 111 112
#define hdev_is_powered(hdev) (test_bit(HCI_UP, &hdev->flags) && \
				!test_bit(HCI_AUTO_OFF, &hdev->dev_flags))

113 114
struct pending_cmd {
	struct list_head list;
115
	u16 opcode;
116
	int index;
117
	void *param;
118
	struct sock *sk;
119
	void *user_data;
120 121
};

122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194
/* HCI to MGMT error code conversion table */
static u8 mgmt_status_table[] = {
	MGMT_STATUS_SUCCESS,
	MGMT_STATUS_UNKNOWN_COMMAND,	/* Unknown Command */
	MGMT_STATUS_NOT_CONNECTED,	/* No Connection */
	MGMT_STATUS_FAILED,		/* Hardware Failure */
	MGMT_STATUS_CONNECT_FAILED,	/* Page Timeout */
	MGMT_STATUS_AUTH_FAILED,	/* Authentication Failed */
	MGMT_STATUS_NOT_PAIRED,		/* PIN or Key Missing */
	MGMT_STATUS_NO_RESOURCES,	/* Memory Full */
	MGMT_STATUS_TIMEOUT,		/* Connection Timeout */
	MGMT_STATUS_NO_RESOURCES,	/* Max Number of Connections */
	MGMT_STATUS_NO_RESOURCES,	/* Max Number of SCO Connections */
	MGMT_STATUS_ALREADY_CONNECTED,	/* ACL Connection Exists */
	MGMT_STATUS_BUSY,		/* Command Disallowed */
	MGMT_STATUS_NO_RESOURCES,	/* Rejected Limited Resources */
	MGMT_STATUS_REJECTED,		/* Rejected Security */
	MGMT_STATUS_REJECTED,		/* Rejected Personal */
	MGMT_STATUS_TIMEOUT,		/* Host Timeout */
	MGMT_STATUS_NOT_SUPPORTED,	/* Unsupported Feature */
	MGMT_STATUS_INVALID_PARAMS,	/* Invalid Parameters */
	MGMT_STATUS_DISCONNECTED,	/* OE User Ended Connection */
	MGMT_STATUS_NO_RESOURCES,	/* OE Low Resources */
	MGMT_STATUS_DISCONNECTED,	/* OE Power Off */
	MGMT_STATUS_DISCONNECTED,	/* Connection Terminated */
	MGMT_STATUS_BUSY,		/* Repeated Attempts */
	MGMT_STATUS_REJECTED,		/* Pairing Not Allowed */
	MGMT_STATUS_FAILED,		/* Unknown LMP PDU */
	MGMT_STATUS_NOT_SUPPORTED,	/* Unsupported Remote Feature */
	MGMT_STATUS_REJECTED,		/* SCO Offset Rejected */
	MGMT_STATUS_REJECTED,		/* SCO Interval Rejected */
	MGMT_STATUS_REJECTED,		/* Air Mode Rejected */
	MGMT_STATUS_INVALID_PARAMS,	/* Invalid LMP Parameters */
	MGMT_STATUS_FAILED,		/* Unspecified Error */
	MGMT_STATUS_NOT_SUPPORTED,	/* Unsupported LMP Parameter Value */
	MGMT_STATUS_FAILED,		/* Role Change Not Allowed */
	MGMT_STATUS_TIMEOUT,		/* LMP Response Timeout */
	MGMT_STATUS_FAILED,		/* LMP Error Transaction Collision */
	MGMT_STATUS_FAILED,		/* LMP PDU Not Allowed */
	MGMT_STATUS_REJECTED,		/* Encryption Mode Not Accepted */
	MGMT_STATUS_FAILED,		/* Unit Link Key Used */
	MGMT_STATUS_NOT_SUPPORTED,	/* QoS Not Supported */
	MGMT_STATUS_TIMEOUT,		/* Instant Passed */
	MGMT_STATUS_NOT_SUPPORTED,	/* Pairing Not Supported */
	MGMT_STATUS_FAILED,		/* Transaction Collision */
	MGMT_STATUS_INVALID_PARAMS,	/* Unacceptable Parameter */
	MGMT_STATUS_REJECTED,		/* QoS Rejected */
	MGMT_STATUS_NOT_SUPPORTED,	/* Classification Not Supported */
	MGMT_STATUS_REJECTED,		/* Insufficient Security */
	MGMT_STATUS_INVALID_PARAMS,	/* Parameter Out Of Range */
	MGMT_STATUS_BUSY,		/* Role Switch Pending */
	MGMT_STATUS_FAILED,		/* Slot Violation */
	MGMT_STATUS_FAILED,		/* Role Switch Failed */
	MGMT_STATUS_INVALID_PARAMS,	/* EIR Too Large */
	MGMT_STATUS_NOT_SUPPORTED,	/* Simple Pairing Not Supported */
	MGMT_STATUS_BUSY,		/* Host Busy Pairing */
	MGMT_STATUS_REJECTED,		/* Rejected, No Suitable Channel */
	MGMT_STATUS_BUSY,		/* Controller Busy */
	MGMT_STATUS_INVALID_PARAMS,	/* Unsuitable Connection Interval */
	MGMT_STATUS_TIMEOUT,		/* Directed Advertising Timeout */
	MGMT_STATUS_AUTH_FAILED,	/* Terminated Due to MIC Failure */
	MGMT_STATUS_CONNECT_FAILED,	/* Connection Establishment Failed */
	MGMT_STATUS_CONNECT_FAILED,	/* MAC Connection Failed */
};

static u8 mgmt_status(u8 hci_status)
{
	if (hci_status < ARRAY_SIZE(mgmt_status_table))
		return mgmt_status_table[hci_status];

	return MGMT_STATUS_FAILED;
}

195
static int cmd_status(struct sock *sk, u16 index, u16 cmd, u8 status)
196 197 198 199
{
	struct sk_buff *skb;
	struct mgmt_hdr *hdr;
	struct mgmt_ev_cmd_status *ev;
200
	int err;
201

202
	BT_DBG("sock %p, index %u, cmd %u, status %u", sk, index, cmd, status);
203

204
	skb = alloc_skb(sizeof(*hdr) + sizeof(*ev), GFP_KERNEL);
205 206 207 208 209
	if (!skb)
		return -ENOMEM;

	hdr = (void *) skb_put(skb, sizeof(*hdr));

210
	hdr->opcode = __constant_cpu_to_le16(MGMT_EV_CMD_STATUS);
211
	hdr->index = cpu_to_le16(index);
212 213 214 215
	hdr->len = cpu_to_le16(sizeof(*ev));

	ev = (void *) skb_put(skb, sizeof(*ev));
	ev->status = status;
216
	ev->opcode = cpu_to_le16(cmd);
217

218 219
	err = sock_queue_rcv_skb(sk, skb);
	if (err < 0)
220 221
		kfree_skb(skb);

222
	return err;
223 224
}

225
static int cmd_complete(struct sock *sk, u16 index, u16 cmd, u8 status,
226
			void *rp, size_t rp_len)
227 228 229 230
{
	struct sk_buff *skb;
	struct mgmt_hdr *hdr;
	struct mgmt_ev_cmd_complete *ev;
231
	int err;
232 233 234

	BT_DBG("sock %p", sk);

235
	skb = alloc_skb(sizeof(*hdr) + sizeof(*ev) + rp_len, GFP_KERNEL);
236 237 238 239 240
	if (!skb)
		return -ENOMEM;

	hdr = (void *) skb_put(skb, sizeof(*hdr));

241
	hdr->opcode = __constant_cpu_to_le16(MGMT_EV_CMD_COMPLETE);
242
	hdr->index = cpu_to_le16(index);
243
	hdr->len = cpu_to_le16(sizeof(*ev) + rp_len);
244

245
	ev = (void *) skb_put(skb, sizeof(*ev) + rp_len);
246
	ev->opcode = cpu_to_le16(cmd);
247
	ev->status = status;
248 249 250

	if (rp)
		memcpy(ev->data, rp, rp_len);
251

252 253
	err = sock_queue_rcv_skb(sk, skb);
	if (err < 0)
254 255
		kfree_skb(skb);

256
	return err;
257 258
}

259 260
static int read_version(struct sock *sk, struct hci_dev *hdev, void *data,
			u16 data_len)
261 262 263 264 265 266
{
	struct mgmt_rp_read_version rp;

	BT_DBG("sock %p", sk);

	rp.version = MGMT_VERSION;
267
	rp.revision = __constant_cpu_to_le16(MGMT_REVISION);
268

269
	return cmd_complete(sk, MGMT_INDEX_NONE, MGMT_OP_READ_VERSION, 0, &rp,
270
			    sizeof(rp));
271 272
}

273 274
static int read_commands(struct sock *sk, struct hci_dev *hdev, void *data,
			 u16 data_len)
275 276
{
	struct mgmt_rp_read_commands *rp;
277 278
	const u16 num_commands = ARRAY_SIZE(mgmt_commands);
	const u16 num_events = ARRAY_SIZE(mgmt_events);
279
	__le16 *opcode;
280 281 282 283 284 285 286 287 288 289 290
	size_t rp_size;
	int i, err;

	BT_DBG("sock %p", sk);

	rp_size = sizeof(*rp) + ((num_commands + num_events) * sizeof(u16));

	rp = kmalloc(rp_size, GFP_KERNEL);
	if (!rp)
		return -ENOMEM;

291 292
	rp->num_commands = __constant_cpu_to_le16(num_commands);
	rp->num_events = __constant_cpu_to_le16(num_events);
293 294 295 296 297 298 299

	for (i = 0, opcode = rp->opcodes; i < num_commands; i++, opcode++)
		put_unaligned_le16(mgmt_commands[i], opcode);

	for (i = 0; i < num_events; i++, opcode++)
		put_unaligned_le16(mgmt_events[i], opcode);

300
	err = cmd_complete(sk, MGMT_INDEX_NONE, MGMT_OP_READ_COMMANDS, 0, rp,
301
			   rp_size);
302 303 304 305 306
	kfree(rp);

	return err;
}

307 308
static int read_index_list(struct sock *sk, struct hci_dev *hdev, void *data,
			   u16 data_len)
309 310
{
	struct mgmt_rp_read_index_list *rp;
311
	struct hci_dev *d;
312
	size_t rp_len;
313
	u16 count;
314
	int err;
315 316 317 318 319 320

	BT_DBG("sock %p", sk);

	read_lock(&hci_dev_list_lock);

	count = 0;
321
	list_for_each_entry(d, &hci_dev_list, list) {
322 323
		if (d->dev_type == HCI_BREDR)
			count++;
324 325
	}

326 327 328
	rp_len = sizeof(*rp) + (2 * count);
	rp = kmalloc(rp_len, GFP_ATOMIC);
	if (!rp) {
329
		read_unlock(&hci_dev_list_lock);
330
		return -ENOMEM;
331
	}
332

333
	count = 0;
334
	list_for_each_entry(d, &hci_dev_list, list) {
335
		if (test_bit(HCI_SETUP, &d->dev_flags))
336 337
			continue;

338 339 340
		if (test_bit(HCI_USER_CHANNEL, &d->dev_flags))
			continue;

341 342 343 344
		if (d->dev_type == HCI_BREDR) {
			rp->index[count++] = cpu_to_le16(d->id);
			BT_DBG("Added hci%u", d->id);
		}
345 346
	}

347 348 349
	rp->num_controllers = cpu_to_le16(count);
	rp_len = sizeof(*rp) + (2 * count);

350 351
	read_unlock(&hci_dev_list_lock);

352
	err = cmd_complete(sk, MGMT_INDEX_NONE, MGMT_OP_READ_INDEX_LIST, 0, rp,
353
			   rp_len);
354

355 356 357
	kfree(rp);

	return err;
358 359
}

360 361 362 363 364 365 366
static u32 get_supported_settings(struct hci_dev *hdev)
{
	u32 settings = 0;

	settings |= MGMT_SETTING_POWERED;
	settings |= MGMT_SETTING_PAIRABLE;

367
	if (lmp_bredr_capable(hdev)) {
368
		settings |= MGMT_SETTING_CONNECTABLE;
369 370
		if (hdev->hci_ver >= BLUETOOTH_VER_1_2)
			settings |= MGMT_SETTING_FAST_CONNECTABLE;
371
		settings |= MGMT_SETTING_DISCOVERABLE;
372 373
		settings |= MGMT_SETTING_BREDR;
		settings |= MGMT_SETTING_LINK_SECURITY;
374 375 376 377 378

		if (lmp_ssp_capable(hdev)) {
			settings |= MGMT_SETTING_SSP;
			settings |= MGMT_SETTING_HS;
		}
379
	}
380

381
	if (lmp_le_capable(hdev)) {
382
		settings |= MGMT_SETTING_LE;
383 384
		settings |= MGMT_SETTING_ADVERTISING;
	}
385 386 387 388 389 390 391 392

	return settings;
}

static u32 get_current_settings(struct hci_dev *hdev)
{
	u32 settings = 0;

393
	if (hdev_is_powered(hdev))
394 395
		settings |= MGMT_SETTING_POWERED;

396
	if (test_bit(HCI_CONNECTABLE, &hdev->dev_flags))
397 398
		settings |= MGMT_SETTING_CONNECTABLE;

399 400 401
	if (test_bit(HCI_FAST_CONNECTABLE, &hdev->dev_flags))
		settings |= MGMT_SETTING_FAST_CONNECTABLE;

402
	if (test_bit(HCI_DISCOVERABLE, &hdev->dev_flags))
403 404
		settings |= MGMT_SETTING_DISCOVERABLE;

405
	if (test_bit(HCI_PAIRABLE, &hdev->dev_flags))
406 407
		settings |= MGMT_SETTING_PAIRABLE;

408
	if (test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags))
409 410
		settings |= MGMT_SETTING_BREDR;

411
	if (test_bit(HCI_LE_ENABLED, &hdev->dev_flags))
412 413
		settings |= MGMT_SETTING_LE;

414
	if (test_bit(HCI_LINK_SECURITY, &hdev->dev_flags))
415 416
		settings |= MGMT_SETTING_LINK_SECURITY;

417
	if (test_bit(HCI_SSP_ENABLED, &hdev->dev_flags))
418 419
		settings |= MGMT_SETTING_SSP;

420 421 422
	if (test_bit(HCI_HS_ENABLED, &hdev->dev_flags))
		settings |= MGMT_SETTING_HS;

423
	if (test_bit(HCI_ADVERTISING, &hdev->dev_flags))
424 425
		settings |= MGMT_SETTING_ADVERTISING;

426 427 428
	return settings;
}

429 430
#define PNP_INFO_SVCLASS_ID		0x1200

431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472
static u8 *create_uuid16_list(struct hci_dev *hdev, u8 *data, ptrdiff_t len)
{
	u8 *ptr = data, *uuids_start = NULL;
	struct bt_uuid *uuid;

	if (len < 4)
		return ptr;

	list_for_each_entry(uuid, &hdev->uuids, list) {
		u16 uuid16;

		if (uuid->size != 16)
			continue;

		uuid16 = get_unaligned_le16(&uuid->uuid[12]);
		if (uuid16 < 0x1100)
			continue;

		if (uuid16 == PNP_INFO_SVCLASS_ID)
			continue;

		if (!uuids_start) {
			uuids_start = ptr;
			uuids_start[0] = 1;
			uuids_start[1] = EIR_UUID16_ALL;
			ptr += 2;
		}

		/* Stop if not enough space to put next UUID */
		if ((ptr - data) + sizeof(u16) > len) {
			uuids_start[1] = EIR_UUID16_SOME;
			break;
		}

		*ptr++ = (uuid16 & 0x00ff);
		*ptr++ = (uuid16 & 0xff00) >> 8;
		uuids_start[0] += sizeof(uuid16);
	}

	return ptr;
}

473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505
static u8 *create_uuid32_list(struct hci_dev *hdev, u8 *data, ptrdiff_t len)
{
	u8 *ptr = data, *uuids_start = NULL;
	struct bt_uuid *uuid;

	if (len < 6)
		return ptr;

	list_for_each_entry(uuid, &hdev->uuids, list) {
		if (uuid->size != 32)
			continue;

		if (!uuids_start) {
			uuids_start = ptr;
			uuids_start[0] = 1;
			uuids_start[1] = EIR_UUID32_ALL;
			ptr += 2;
		}

		/* Stop if not enough space to put next UUID */
		if ((ptr - data) + sizeof(u32) > len) {
			uuids_start[1] = EIR_UUID32_SOME;
			break;
		}

		memcpy(ptr, &uuid->uuid[12], sizeof(u32));
		ptr += sizeof(u32);
		uuids_start[0] += sizeof(u32);
	}

	return ptr;
}

506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538
static u8 *create_uuid128_list(struct hci_dev *hdev, u8 *data, ptrdiff_t len)
{
	u8 *ptr = data, *uuids_start = NULL;
	struct bt_uuid *uuid;

	if (len < 18)
		return ptr;

	list_for_each_entry(uuid, &hdev->uuids, list) {
		if (uuid->size != 128)
			continue;

		if (!uuids_start) {
			uuids_start = ptr;
			uuids_start[0] = 1;
			uuids_start[1] = EIR_UUID128_ALL;
			ptr += 2;
		}

		/* Stop if not enough space to put next UUID */
		if ((ptr - data) + 16 > len) {
			uuids_start[1] = EIR_UUID128_SOME;
			break;
		}

		memcpy(ptr, uuid->uuid, 16);
		ptr += 16;
		uuids_start[0] += 16;
	}

	return ptr;
}

539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621
static u8 create_ad(struct hci_dev *hdev, u8 *ptr)
{
	u8 ad_len = 0, flags = 0;
	size_t name_len;

	if (test_bit(HCI_ADVERTISING, &hdev->dev_flags))
		flags |= LE_AD_GENERAL;

	if (test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags)) {
		if (lmp_le_br_capable(hdev))
			flags |= LE_AD_SIM_LE_BREDR_CTRL;
		if (lmp_host_le_br_capable(hdev))
			flags |= LE_AD_SIM_LE_BREDR_HOST;
	} else {
		flags |= LE_AD_NO_BREDR;
	}

	if (flags) {
		BT_DBG("adv flags 0x%02x", flags);

		ptr[0] = 2;
		ptr[1] = EIR_FLAGS;
		ptr[2] = flags;

		ad_len += 3;
		ptr += 3;
	}

	if (hdev->adv_tx_power != HCI_TX_POWER_INVALID) {
		ptr[0] = 2;
		ptr[1] = EIR_TX_POWER;
		ptr[2] = (u8) hdev->adv_tx_power;

		ad_len += 3;
		ptr += 3;
	}

	name_len = strlen(hdev->dev_name);
	if (name_len > 0) {
		size_t max_len = HCI_MAX_AD_LENGTH - ad_len - 2;

		if (name_len > max_len) {
			name_len = max_len;
			ptr[1] = EIR_NAME_SHORT;
		} else
			ptr[1] = EIR_NAME_COMPLETE;

		ptr[0] = name_len + 1;

		memcpy(ptr + 2, hdev->dev_name, name_len);

		ad_len += (name_len + 2);
		ptr += (name_len + 2);
	}

	return ad_len;
}

static void update_ad(struct hci_request *req)
{
	struct hci_dev *hdev = req->hdev;
	struct hci_cp_le_set_adv_data cp;
	u8 len;

	if (!lmp_le_capable(hdev))
		return;

	memset(&cp, 0, sizeof(cp));

	len = create_ad(hdev, cp.data);

	if (hdev->adv_data_len == len &&
	    memcmp(cp.data, hdev->adv_data, len) == 0)
		return;

	memcpy(hdev->adv_data, cp.data, sizeof(cp.data));
	hdev->adv_data_len = len;

	cp.length = len;

	hci_req_add(req, HCI_OP_LE_SET_ADV_DATA, sizeof(cp), &cp);
}

622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644
static void create_eir(struct hci_dev *hdev, u8 *data)
{
	u8 *ptr = data;
	size_t name_len;

	name_len = strlen(hdev->dev_name);

	if (name_len > 0) {
		/* EIR Data type */
		if (name_len > 48) {
			name_len = 48;
			ptr[1] = EIR_NAME_SHORT;
		} else
			ptr[1] = EIR_NAME_COMPLETE;

		/* EIR Data length */
		ptr[0] = name_len + 1;

		memcpy(ptr + 2, hdev->dev_name, name_len);

		ptr += (name_len + 2);
	}

645
	if (hdev->inq_tx_power != HCI_TX_POWER_INVALID) {
646 647 648 649 650 651 652
		ptr[0] = 2;
		ptr[1] = EIR_TX_POWER;
		ptr[2] = (u8) hdev->inq_tx_power;

		ptr += 3;
	}

653 654 655 656 657 658 659 660 661 662 663 664
	if (hdev->devid_source > 0) {
		ptr[0] = 9;
		ptr[1] = EIR_DEVICE_ID;

		put_unaligned_le16(hdev->devid_source, ptr + 2);
		put_unaligned_le16(hdev->devid_vendor, ptr + 4);
		put_unaligned_le16(hdev->devid_product, ptr + 6);
		put_unaligned_le16(hdev->devid_version, ptr + 8);

		ptr += 10;
	}

665
	ptr = create_uuid16_list(hdev, ptr, HCI_MAX_EIR_LENGTH - (ptr - data));
666
	ptr = create_uuid32_list(hdev, ptr, HCI_MAX_EIR_LENGTH - (ptr - data));
667
	ptr = create_uuid128_list(hdev, ptr, HCI_MAX_EIR_LENGTH - (ptr - data));
668 669
}

670
static void update_eir(struct hci_request *req)
671
{
672
	struct hci_dev *hdev = req->hdev;
673 674
	struct hci_cp_write_eir cp;

675
	if (!hdev_is_powered(hdev))
676
		return;
677

678
	if (!lmp_ext_inq_capable(hdev))
679
		return;
680

681
	if (!test_bit(HCI_SSP_ENABLED, &hdev->dev_flags))
682
		return;
683

684
	if (test_bit(HCI_SERVICE_CACHE, &hdev->dev_flags))
685
		return;
686 687 688 689 690 691

	memset(&cp, 0, sizeof(cp));

	create_eir(hdev, cp.data);

	if (memcmp(cp.data, hdev->eir, sizeof(cp.data)) == 0)
692
		return;
693 694 695

	memcpy(hdev->eir, cp.data, sizeof(cp.data));

696
	hci_req_add(req, HCI_OP_WRITE_EIR, sizeof(cp), &cp);
697 698 699 700 701 702 703 704 705 706 707 708 709
}

static u8 get_service_classes(struct hci_dev *hdev)
{
	struct bt_uuid *uuid;
	u8 val = 0;

	list_for_each_entry(uuid, &hdev->uuids, list)
		val |= uuid->svc_hint;

	return val;
}

710
static void update_class(struct hci_request *req)
711
{
712
	struct hci_dev *hdev = req->hdev;
713 714 715 716
	u8 cod[3];

	BT_DBG("%s", hdev->name);

717
	if (!hdev_is_powered(hdev))
718
		return;
719

720
	if (test_bit(HCI_SERVICE_CACHE, &hdev->dev_flags))
721
		return;
722 723 724 725 726 727

	cod[0] = hdev->minor_class;
	cod[1] = hdev->major_class;
	cod[2] = get_service_classes(hdev);

	if (memcmp(cod, hdev->dev_class, 3) == 0)
728
		return;
729

730
	hci_req_add(req, HCI_OP_WRITE_CLASS_OF_DEV, sizeof(cod), cod);
731 732
}

733 734 735
static void service_cache_off(struct work_struct *work)
{
	struct hci_dev *hdev = container_of(work, struct hci_dev,
736
					    service_cache.work);
737
	struct hci_request req;
738

739
	if (!test_and_clear_bit(HCI_SERVICE_CACHE, &hdev->dev_flags))
740 741
		return;

742 743
	hci_req_init(&req, hdev);

744 745
	hci_dev_lock(hdev);

746 747
	update_eir(&req);
	update_class(&req);
748 749

	hci_dev_unlock(hdev);
750 751

	hci_req_run(&req, NULL);
752 753
}

754
static void mgmt_init_hdev(struct sock *sk, struct hci_dev *hdev)
755
{
756
	if (test_and_set_bit(HCI_MGMT, &hdev->dev_flags))
757 758
		return;

759
	INIT_DELAYED_WORK(&hdev->service_cache, service_cache_off);
760

761 762 763 764 765 766
	/* Non-mgmt controlled devices get this bit set
	 * implicitly so that pairing works for them, however
	 * for mgmt we require user-space to explicitly enable
	 * it
	 */
	clear_bit(HCI_PAIRABLE, &hdev->dev_flags);
767 768
}

769
static int read_controller_info(struct sock *sk, struct hci_dev *hdev,
770
				void *data, u16 data_len)
771
{
772
	struct mgmt_rp_read_info rp;
773

774
	BT_DBG("sock %p %s", sk, hdev->name);
775

776
	hci_dev_lock(hdev);
777

778 779
	memset(&rp, 0, sizeof(rp));

780
	bacpy(&rp.bdaddr, &hdev->bdaddr);
781

782
	rp.version = hdev->hci_ver;
783
	rp.manufacturer = cpu_to_le16(hdev->manufacturer);
784 785 786

	rp.supported_settings = cpu_to_le32(get_supported_settings(hdev));
	rp.current_settings = cpu_to_le32(get_current_settings(hdev));
787

788
	memcpy(rp.dev_class, hdev->dev_class, 3);
789

790
	memcpy(rp.name, hdev->dev_name, sizeof(hdev->dev_name));
791
	memcpy(rp.short_name, hdev->short_name, sizeof(hdev->short_name));
792

793
	hci_dev_unlock(hdev);
794

795
	return cmd_complete(sk, hdev->id, MGMT_OP_READ_INFO, 0, &rp,
796
			    sizeof(rp));
797 798
}

799 800 801
static void mgmt_pending_free(struct pending_cmd *cmd)
{
	sock_put(cmd->sk);
802
	kfree(cmd->param);
803 804 805
	kfree(cmd);
}

806
static struct pending_cmd *mgmt_pending_add(struct sock *sk, u16 opcode,
807 808
					    struct hci_dev *hdev, void *data,
					    u16 len)
809 810 811
{
	struct pending_cmd *cmd;

812
	cmd = kmalloc(sizeof(*cmd), GFP_KERNEL);
813
	if (!cmd)
814
		return NULL;
815 816

	cmd->opcode = opcode;
817
	cmd->index = hdev->id;
818

819
	cmd->param = kmalloc(len, GFP_KERNEL);
820
	if (!cmd->param) {
821
		kfree(cmd);
822
		return NULL;
823 824
	}

825 826
	if (data)
		memcpy(cmd->param, data, len);
827 828 829 830

	cmd->sk = sk;
	sock_hold(sk);

831
	list_add(&cmd->list, &hdev->mgmt_pending);
832

833
	return cmd;
834 835
}

836
static void mgmt_pending_foreach(u16 opcode, struct hci_dev *hdev,
837 838
				 void (*cb)(struct pending_cmd *cmd,
					    void *data),
839
				 void *data)
840
{
841
	struct pending_cmd *cmd, *tmp;
842

843
	list_for_each_entry_safe(cmd, tmp, &hdev->mgmt_pending, list) {
844
		if (opcode > 0 && cmd->opcode != opcode)
845 846 847 848 849 850
			continue;

		cb(cmd, data);
	}
}

851
static struct pending_cmd *mgmt_pending_find(u16 opcode, struct hci_dev *hdev)
852
{
853
	struct pending_cmd *cmd;
854

855
	list_for_each_entry(cmd, &hdev->mgmt_pending, list) {
856 857
		if (cmd->opcode == opcode)
			return cmd;
858 859 860 861 862
	}

	return NULL;
}

863
static void mgmt_pending_remove(struct pending_cmd *cmd)
864 865 866 867 868
{
	list_del(&cmd->list);
	mgmt_pending_free(cmd);
}

869
static int send_settings_rsp(struct sock *sk, u16 opcode, struct hci_dev *hdev)
870
{
871
	__le32 settings = cpu_to_le32(get_current_settings(hdev));
872

873
	return cmd_complete(sk, hdev->id, opcode, 0, &settings,
874
			    sizeof(settings));
875 876
}

877
static int set_powered(struct sock *sk, struct hci_dev *hdev, void *data,
878
		       u16 len)
879
{
880
	struct mgmt_mode *cp = data;
881
	struct pending_cmd *cmd;
882
	int err;
883

884
	BT_DBG("request for %s", hdev->name);
885

886 887 888 889
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_POWERED,
				  MGMT_STATUS_INVALID_PARAMS);

890
	hci_dev_lock(hdev);
891

892 893 894 895 896 897
	if (mgmt_pending_find(MGMT_OP_SET_POWERED, hdev)) {
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_POWERED,
				 MGMT_STATUS_BUSY);
		goto failed;
	}

898 899 900 901
	if (test_and_clear_bit(HCI_AUTO_OFF, &hdev->dev_flags)) {
		cancel_delayed_work(&hdev->power_off);

		if (cp->val) {
902 903 904
			mgmt_pending_add(sk, MGMT_OP_SET_POWERED, hdev,
					 data, len);
			err = mgmt_powered(hdev, 1);
905 906 907 908
			goto failed;
		}
	}

909
	if (!!cp->val == hdev_is_powered(hdev)) {
910
		err = send_settings_rsp(sk, MGMT_OP_SET_POWERED, hdev);
911 912 913
		goto failed;
	}

914
	cmd = mgmt_pending_add(sk, MGMT_OP_SET_POWERED, hdev, data, len);
915 916
	if (!cmd) {
		err = -ENOMEM;
917
		goto failed;
918
	}
919

920
	if (cp->val)
921
		queue_work(hdev->req_workqueue, &hdev->power_on);
922
	else
923
		queue_work(hdev->req_workqueue, &hdev->power_off.work);
924

925
	err = 0;
926 927

failed:
928
	hci_dev_unlock(hdev);
929
	return err;
930 931
}

932 933
static int mgmt_event(u16 event, struct hci_dev *hdev, void *data, u16 data_len,
		      struct sock *skip_sk)
934 935 936 937
{
	struct sk_buff *skb;
	struct mgmt_hdr *hdr;

938
	skb = alloc_skb(sizeof(*hdr) + data_len, GFP_KERNEL);
939 940 941 942 943 944 945 946
	if (!skb)
		return -ENOMEM;

	hdr = (void *) skb_put(skb, sizeof(*hdr));
	hdr->opcode = cpu_to_le16(event);
	if (hdev)
		hdr->index = cpu_to_le16(hdev->id);
	else
947
		hdr->index = __constant_cpu_to_le16(MGMT_INDEX_NONE);
948 949 950 951 952
	hdr->len = cpu_to_le16(data_len);

	if (data)
		memcpy(skb_put(skb, data_len), data, data_len);

953 954 955
	/* Time stamp */
	__net_timestamp(skb);

956 957 958 959 960 961 962 963 964 965 966 967 968 969 970
	hci_send_to_control(skb, skip_sk);
	kfree_skb(skb);

	return 0;
}

static int new_settings(struct hci_dev *hdev, struct sock *skip)
{
	__le32 ev;

	ev = cpu_to_le32(get_current_settings(hdev));

	return mgmt_event(MGMT_EV_NEW_SETTINGS, hdev, &ev, sizeof(ev), skip);
}

971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000
struct cmd_lookup {
	struct sock *sk;
	struct hci_dev *hdev;
	u8 mgmt_status;
};

static void settings_rsp(struct pending_cmd *cmd, void *data)
{
	struct cmd_lookup *match = data;

	send_settings_rsp(cmd->sk, cmd->opcode, match->hdev);

	list_del(&cmd->list);

	if (match->sk == NULL) {
		match->sk = cmd->sk;
		sock_hold(match->sk);
	}

	mgmt_pending_free(cmd);
}

static void cmd_status_rsp(struct pending_cmd *cmd, void *data)
{
	u8 *status = data;

	cmd_status(cmd->sk, cmd->index, cmd->opcode, *status);
	mgmt_pending_remove(cmd);
}

1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020
static u8 mgmt_bredr_support(struct hci_dev *hdev)
{
	if (!lmp_bredr_capable(hdev))
		return MGMT_STATUS_NOT_SUPPORTED;
	else if (!test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags))
		return MGMT_STATUS_REJECTED;
	else
		return MGMT_STATUS_SUCCESS;
}

static u8 mgmt_le_support(struct hci_dev *hdev)
{
	if (!lmp_le_capable(hdev))
		return MGMT_STATUS_NOT_SUPPORTED;
	else if (!test_bit(HCI_LE_ENABLED, &hdev->dev_flags))
		return MGMT_STATUS_REJECTED;
	else
		return MGMT_STATUS_SUCCESS;
}

1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060
static void set_discoverable_complete(struct hci_dev *hdev, u8 status)
{
	struct pending_cmd *cmd;
	struct mgmt_mode *cp;
	bool changed;

	BT_DBG("status 0x%02x", status);

	hci_dev_lock(hdev);

	cmd = mgmt_pending_find(MGMT_OP_SET_DISCOVERABLE, hdev);
	if (!cmd)
		goto unlock;

	if (status) {
		u8 mgmt_err = mgmt_status(status);
		cmd_status(cmd->sk, cmd->index, cmd->opcode, mgmt_err);
		goto remove_cmd;
	}

	cp = cmd->param;
	if (cp->val)
		changed = !test_and_set_bit(HCI_DISCOVERABLE,
					    &hdev->dev_flags);
	else
		changed = test_and_clear_bit(HCI_DISCOVERABLE,
					     &hdev->dev_flags);

	send_settings_rsp(cmd->sk, MGMT_OP_SET_DISCOVERABLE, hdev);

	if (changed)
		new_settings(hdev, cmd->sk);

remove_cmd:
	mgmt_pending_remove(cmd);

unlock:
	hci_dev_unlock(hdev);
}

1061
static int set_discoverable(struct sock *sk, struct hci_dev *hdev, void *data,
1062
			    u16 len)
1063
{
1064
	struct mgmt_cp_set_discoverable *cp = data;
1065
	struct pending_cmd *cmd;
1066
	struct hci_request req;
1067
	u16 timeout;
1068
	u8 scan, status;
1069 1070
	int err;

1071
	BT_DBG("request for %s", hdev->name);
1072

1073 1074
	status = mgmt_bredr_support(hdev);
	if (status)
1075
		return cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
1076
				  status);
1077

1078 1079 1080 1081
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
				  MGMT_STATUS_INVALID_PARAMS);

1082
	timeout = __le16_to_cpu(cp->timeout);
1083
	if (!cp->val && timeout > 0)
1084
		return cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
1085
				  MGMT_STATUS_INVALID_PARAMS);
1086

1087
	hci_dev_lock(hdev);
1088

1089
	if (!hdev_is_powered(hdev) && timeout > 0) {
1090
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
1091
				 MGMT_STATUS_NOT_POWERED);
1092 1093 1094
		goto failed;
	}

1095
	if (mgmt_pending_find(MGMT_OP_SET_DISCOVERABLE, hdev) ||
1096
	    mgmt_pending_find(MGMT_OP_SET_CONNECTABLE, hdev)) {
1097
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
1098
				 MGMT_STATUS_BUSY);
1099 1100 1101
		goto failed;
	}

1102
	if (!test_bit(HCI_CONNECTABLE, &hdev->dev_flags)) {
1103
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
1104
				 MGMT_STATUS_REJECTED);
1105 1106 1107 1108
		goto failed;
	}

	if (!hdev_is_powered(hdev)) {
1109 1110 1111 1112 1113 1114 1115
		bool changed = false;

		if (!!cp->val != test_bit(HCI_DISCOVERABLE, &hdev->dev_flags)) {
			change_bit(HCI_DISCOVERABLE, &hdev->dev_flags);
			changed = true;
		}

1116
		err = send_settings_rsp(sk, MGMT_OP_SET_DISCOVERABLE, hdev);
1117 1118 1119 1120 1121 1122
		if (err < 0)
			goto failed;

		if (changed)
			err = new_settings(hdev, sk);

1123 1124 1125 1126
		goto failed;
	}

	if (!!cp->val == test_bit(HCI_DISCOVERABLE, &hdev->dev_flags)) {
1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137
		if (hdev->discov_timeout > 0) {
			cancel_delayed_work(&hdev->discov_off);
			hdev->discov_timeout = 0;
		}

		if (cp->val && timeout > 0) {
			hdev->discov_timeout = timeout;
			queue_delayed_work(hdev->workqueue, &hdev->discov_off,
				msecs_to_jiffies(hdev->discov_timeout * 1000));
		}

1138
		err = send_settings_rsp(sk, MGMT_OP_SET_DISCOVERABLE, hdev);
1139 1140 1141
		goto failed;
	}

1142
	cmd = mgmt_pending_add(sk, MGMT_OP_SET_DISCOVERABLE, hdev, data, len);
1143 1144
	if (!cmd) {
		err = -ENOMEM;
1145
		goto failed;
1146
	}
1147

1148 1149
	hci_req_init(&req, hdev);

1150 1151
	scan = SCAN_PAGE;

1152
	if (cp->val)
1153
		scan |= SCAN_INQUIRY;
1154
	else
1155
		cancel_delayed_work(&hdev->discov_off);
1156

1157 1158 1159
	hci_req_add(&req, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);

	err = hci_req_run(&req, set_discoverable_complete);
1160
	if (err < 0)
1161
		mgmt_pending_remove(cmd);
1162

1163
	if (cp->val)
1164
		hdev->discov_timeout = timeout;
1165

1166
failed:
1167
	hci_dev_unlock(hdev);
1168 1169 1170
	return err;
}

1171 1172
static void write_fast_connectable(struct hci_request *req, bool enable)
{
1173
	struct hci_dev *hdev = req->hdev;
1174 1175 1176
	struct hci_cp_write_page_scan_activity acp;
	u8 type;

1177 1178 1179
	if (hdev->hci_ver < BLUETOOTH_VER_1_2)
		return;

1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193
	if (enable) {
		type = PAGE_SCAN_TYPE_INTERLACED;

		/* 160 msec page scan interval */
		acp.interval = __constant_cpu_to_le16(0x0100);
	} else {
		type = PAGE_SCAN_TYPE_STANDARD;	/* default */

		/* default 1.28 sec page scan */
		acp.interval = __constant_cpu_to_le16(0x0800);
	}

	acp.window = __constant_cpu_to_le16(0x0012);

1194 1195 1196 1197 1198 1199 1200
	if (__cpu_to_le16(hdev->page_scan_interval) != acp.interval ||
	    __cpu_to_le16(hdev->page_scan_window) != acp.window)
		hci_req_add(req, HCI_OP_WRITE_PAGE_SCAN_ACTIVITY,
			    sizeof(acp), &acp);

	if (hdev->page_scan_type != type)
		hci_req_add(req, HCI_OP_WRITE_PAGE_SCAN_TYPE, 1, &type);
1201 1202
}

1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221
static u8 get_adv_type(struct hci_dev *hdev)
{
	struct pending_cmd *cmd;
	bool connectable;

	/* If there's a pending mgmt command the flag will not yet have
	 * it's final value, so check for this first.
	 */
	cmd = mgmt_pending_find(MGMT_OP_SET_CONNECTABLE, hdev);
	if (cmd) {
		struct mgmt_mode *cp = cmd->param;
		connectable = !!cp->val;
	} else {
		connectable = test_bit(HCI_CONNECTABLE, &hdev->dev_flags);
	}

	return connectable ? LE_ADV_IND : LE_ADV_NONCONN_IND;
}

1222 1223 1224 1225 1226 1227 1228 1229 1230
static void enable_advertising(struct hci_request *req)
{
	struct hci_dev *hdev = req->hdev;
	struct hci_cp_le_set_adv_param cp;
	u8 enable = 0x01;

	memset(&cp, 0, sizeof(cp));
	cp.min_interval = __constant_cpu_to_le16(0x0800);
	cp.max_interval = __constant_cpu_to_le16(0x0800);
1231
	cp.type = get_adv_type(hdev);
1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249
	if (bacmp(&hdev->bdaddr, BDADDR_ANY))
		cp.own_address_type = ADDR_LE_DEV_PUBLIC;
	else
		cp.own_address_type = ADDR_LE_DEV_RANDOM;
	cp.channel_map = 0x07;

	hci_req_add(req, HCI_OP_LE_SET_ADV_PARAM, sizeof(cp), &cp);

	hci_req_add(req, HCI_OP_LE_SET_ADV_ENABLE, sizeof(enable), &enable);
}

static void disable_advertising(struct hci_request *req)
{
	u8 enable = 0x00;

	hci_req_add(req, HCI_OP_LE_SET_ADV_ENABLE, sizeof(enable), &enable);
}

1250 1251 1252
static void set_connectable_complete(struct hci_dev *hdev, u8 status)
{
	struct pending_cmd *cmd;
1253 1254
	struct mgmt_mode *cp;
	bool changed;
1255 1256 1257 1258 1259 1260 1261 1262 1263

	BT_DBG("status 0x%02x", status);

	hci_dev_lock(hdev);

	cmd = mgmt_pending_find(MGMT_OP_SET_CONNECTABLE, hdev);
	if (!cmd)
		goto unlock;

1264 1265 1266 1267 1268 1269
	if (status) {
		u8 mgmt_err = mgmt_status(status);
		cmd_status(cmd->sk, cmd->index, cmd->opcode, mgmt_err);
		goto remove_cmd;
	}

1270 1271 1272 1273 1274 1275
	cp = cmd->param;
	if (cp->val)
		changed = !test_and_set_bit(HCI_CONNECTABLE, &hdev->dev_flags);
	else
		changed = test_and_clear_bit(HCI_CONNECTABLE, &hdev->dev_flags);

1276 1277
	send_settings_rsp(cmd->sk, MGMT_OP_SET_CONNECTABLE, hdev);

1278 1279 1280
	if (changed)
		new_settings(hdev, cmd->sk);

1281
remove_cmd:
1282 1283 1284 1285 1286 1287
	mgmt_pending_remove(cmd);

unlock:
	hci_dev_unlock(hdev);
}

1288
static int set_connectable(struct sock *sk, struct hci_dev *hdev, void *data,
1289
			   u16 len)
1290
{
1291
	struct mgmt_mode *cp = data;
1292
	struct pending_cmd *cmd;
1293
	struct hci_request req;
1294
	u8 scan;
1295 1296
	int err;

1297
	BT_DBG("request for %s", hdev->name);
1298

1299 1300
	if (!test_bit(HCI_LE_ENABLED, &hdev->dev_flags) &&
	    !test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags))
1301
		return cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE,
1302
				  MGMT_STATUS_REJECTED);
1303

1304 1305 1306 1307
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE,
				  MGMT_STATUS_INVALID_PARAMS);

1308
	hci_dev_lock(hdev);
1309

1310
	if (!hdev_is_powered(hdev)) {
1311 1312 1313 1314 1315
		bool changed = false;

		if (!!cp->val != test_bit(HCI_CONNECTABLE, &hdev->dev_flags))
			changed = true;

1316
		if (cp->val) {
1317
			set_bit(HCI_CONNECTABLE, &hdev->dev_flags);
1318
		} else {
1319 1320 1321
			clear_bit(HCI_CONNECTABLE, &hdev->dev_flags);
			clear_bit(HCI_DISCOVERABLE, &hdev->dev_flags);
		}
1322

1323
		err = send_settings_rsp(sk, MGMT_OP_SET_CONNECTABLE, hdev);
1324 1325 1326 1327 1328 1329
		if (err < 0)
			goto failed;

		if (changed)
			err = new_settings(hdev, sk);

1330 1331 1332
		goto failed;
	}

1333
	if (mgmt_pending_find(MGMT_OP_SET_DISCOVERABLE, hdev) ||
1334
	    mgmt_pending_find(MGMT_OP_SET_CONNECTABLE, hdev)) {
1335
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE,
1336
				 MGMT_STATUS_BUSY);
1337 1338 1339
		goto failed;
	}

1340
	cmd = mgmt_pending_add(sk, MGMT_OP_SET_CONNECTABLE, hdev, data, len);
1341 1342
	if (!cmd) {
		err = -ENOMEM;
1343
		goto failed;
1344
	}
1345

1346
	hci_req_init(&req, hdev);
1347

1348 1349 1350 1351 1352 1353 1354 1355
	if (test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags) &&
	    cp->val != test_bit(HCI_PSCAN, &hdev->flags)) {
		if (cp->val) {
			scan = SCAN_PAGE;
		} else {
			scan = 0;

			if (test_bit(HCI_ISCAN, &hdev->flags) &&
1356
			    hdev->discov_timeout > 0)
1357 1358
				cancel_delayed_work(&hdev->discov_off);
		}
1359

1360 1361
		hci_req_add(&req, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);
	}
1362

1363 1364 1365 1366 1367 1368 1369
	/* If we're going from non-connectable to connectable or
	 * vice-versa when fast connectable is enabled ensure that fast
	 * connectable gets disabled. write_fast_connectable won't do
	 * anything if the page scan parameters are already what they
	 * should be.
	 */
	if (cp->val || test_bit(HCI_FAST_CONNECTABLE, &hdev->dev_flags))
1370 1371
		write_fast_connectable(&req, false);

1372 1373 1374 1375 1376 1377
	if (test_bit(HCI_ADVERTISING, &hdev->dev_flags) &&
	    hci_conn_num(hdev, LE_LINK) == 0) {
		disable_advertising(&req);
		enable_advertising(&req);
	}

1378
	err = hci_req_run(&req, set_connectable_complete);
1379
	if (err < 0) {
1380
		mgmt_pending_remove(cmd);
1381 1382 1383 1384 1385
		if (err == -ENODATA)
			err = send_settings_rsp(sk, MGMT_OP_SET_CONNECTABLE,
						hdev);
		goto failed;
	}
1386 1387

failed:
1388
	hci_dev_unlock(hdev);
1389 1390 1391
	return err;
}

1392
static int set_pairable(struct sock *sk, struct hci_dev *hdev, void *data,
1393
			u16 len)
1394
{
1395
	struct mgmt_mode *cp = data;
1396
	bool changed;
1397 1398
	int err;

1399
	BT_DBG("request for %s", hdev->name);
1400

1401 1402 1403 1404
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_PAIRABLE,
				  MGMT_STATUS_INVALID_PARAMS);

1405
	hci_dev_lock(hdev);
1406 1407

	if (cp->val)
1408
		changed = !test_and_set_bit(HCI_PAIRABLE, &hdev->dev_flags);
1409
	else
1410
		changed = test_and_clear_bit(HCI_PAIRABLE, &hdev->dev_flags);
1411

1412
	err = send_settings_rsp(sk, MGMT_OP_SET_PAIRABLE, hdev);
1413
	if (err < 0)
1414
		goto unlock;
1415

1416 1417
	if (changed)
		err = new_settings(hdev, sk);
1418

1419
unlock:
1420
	hci_dev_unlock(hdev);
1421 1422 1423
	return err;
}

1424 1425
static int set_link_security(struct sock *sk, struct hci_dev *hdev, void *data,
			     u16 len)
1426 1427 1428
{
	struct mgmt_mode *cp = data;
	struct pending_cmd *cmd;
1429
	u8 val, status;
1430 1431
	int err;

1432
	BT_DBG("request for %s", hdev->name);
1433

1434 1435
	status = mgmt_bredr_support(hdev);
	if (status)
1436
		return cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY,
1437
				  status);
1438

1439 1440 1441 1442
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY,
				  MGMT_STATUS_INVALID_PARAMS);

1443 1444
	hci_dev_lock(hdev);

1445
	if (!hdev_is_powered(hdev)) {
1446 1447 1448
		bool changed = false;

		if (!!cp->val != test_bit(HCI_LINK_SECURITY,
1449
					  &hdev->dev_flags)) {
1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460
			change_bit(HCI_LINK_SECURITY, &hdev->dev_flags);
			changed = true;
		}

		err = send_settings_rsp(sk, MGMT_OP_SET_LINK_SECURITY, hdev);
		if (err < 0)
			goto failed;

		if (changed)
			err = new_settings(hdev, sk);

1461 1462 1463 1464
		goto failed;
	}

	if (mgmt_pending_find(MGMT_OP_SET_LINK_SECURITY, hdev)) {
1465
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY,
1466
				 MGMT_STATUS_BUSY);
1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493
		goto failed;
	}

	val = !!cp->val;

	if (test_bit(HCI_AUTH, &hdev->flags) == val) {
		err = send_settings_rsp(sk, MGMT_OP_SET_LINK_SECURITY, hdev);
		goto failed;
	}

	cmd = mgmt_pending_add(sk, MGMT_OP_SET_LINK_SECURITY, hdev, data, len);
	if (!cmd) {
		err = -ENOMEM;
		goto failed;
	}

	err = hci_send_cmd(hdev, HCI_OP_WRITE_AUTH_ENABLE, sizeof(val), &val);
	if (err < 0) {
		mgmt_pending_remove(cmd);
		goto failed;
	}

failed:
	hci_dev_unlock(hdev);
	return err;
}

1494
static int set_ssp(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
1495 1496 1497
{
	struct mgmt_mode *cp = data;
	struct pending_cmd *cmd;
1498
	u8 status;
1499 1500
	int err;

1501
	BT_DBG("request for %s", hdev->name);
1502

1503 1504 1505 1506
	status = mgmt_bredr_support(hdev);
	if (status)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_SSP, status);

1507 1508 1509
	if (!lmp_ssp_capable(hdev))
		return cmd_status(sk, hdev->id, MGMT_OP_SET_SSP,
				  MGMT_STATUS_NOT_SUPPORTED);
1510

1511 1512 1513 1514
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_SSP,
				  MGMT_STATUS_INVALID_PARAMS);

1515
	hci_dev_lock(hdev);
1516

1517
	if (!hdev_is_powered(hdev)) {
1518
		bool changed;
1519

1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530
		if (cp->val) {
			changed = !test_and_set_bit(HCI_SSP_ENABLED,
						    &hdev->dev_flags);
		} else {
			changed = test_and_clear_bit(HCI_SSP_ENABLED,
						     &hdev->dev_flags);
			if (!changed)
				changed = test_and_clear_bit(HCI_HS_ENABLED,
							     &hdev->dev_flags);
			else
				clear_bit(HCI_HS_ENABLED, &hdev->dev_flags);
1531 1532 1533 1534 1535 1536 1537 1538 1539
		}

		err = send_settings_rsp(sk, MGMT_OP_SET_SSP, hdev);
		if (err < 0)
			goto failed;

		if (changed)
			err = new_settings(hdev, sk);

1540 1541 1542
		goto failed;
	}

1543 1544
	if (mgmt_pending_find(MGMT_OP_SET_SSP, hdev) ||
	    mgmt_pending_find(MGMT_OP_SET_HS, hdev)) {
1545 1546
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_SSP,
				 MGMT_STATUS_BUSY);
1547 1548 1549
		goto failed;
	}

1550
	if (!!cp->val == test_bit(HCI_SSP_ENABLED, &hdev->dev_flags)) {
1551 1552 1553 1554 1555 1556 1557 1558 1559 1560
		err = send_settings_rsp(sk, MGMT_OP_SET_SSP, hdev);
		goto failed;
	}

	cmd = mgmt_pending_add(sk, MGMT_OP_SET_SSP, hdev, data, len);
	if (!cmd) {
		err = -ENOMEM;
		goto failed;
	}

1561
	err = hci_send_cmd(hdev, HCI_OP_WRITE_SSP_MODE, 1, &cp->val);
1562 1563 1564 1565 1566 1567 1568 1569 1570 1571
	if (err < 0) {
		mgmt_pending_remove(cmd);
		goto failed;
	}

failed:
	hci_dev_unlock(hdev);
	return err;
}

1572
static int set_hs(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
1573 1574
{
	struct mgmt_mode *cp = data;
1575
	bool changed;
1576
	u8 status;
1577
	int err;
1578

1579
	BT_DBG("request for %s", hdev->name);
1580

1581 1582 1583
	status = mgmt_bredr_support(hdev);
	if (status)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_HS, status);
1584

1585 1586 1587 1588 1589 1590 1591 1592
	if (!lmp_ssp_capable(hdev))
		return cmd_status(sk, hdev->id, MGMT_OP_SET_HS,
				  MGMT_STATUS_NOT_SUPPORTED);

	if (!test_bit(HCI_SSP_ENABLED, &hdev->dev_flags))
		return cmd_status(sk, hdev->id, MGMT_OP_SET_HS,
				  MGMT_STATUS_REJECTED);

1593 1594 1595 1596
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_HS,
				  MGMT_STATUS_INVALID_PARAMS);

1597 1598
	hci_dev_lock(hdev);

1599
	if (cp->val) {
1600
		changed = !test_and_set_bit(HCI_HS_ENABLED, &hdev->dev_flags);
1601 1602 1603 1604 1605 1606 1607
	} else {
		if (hdev_is_powered(hdev)) {
			err = cmd_status(sk, hdev->id, MGMT_OP_SET_HS,
					 MGMT_STATUS_REJECTED);
			goto unlock;
		}

1608
		changed = test_and_clear_bit(HCI_HS_ENABLED, &hdev->dev_flags);
1609
	}
1610 1611 1612 1613 1614 1615 1616

	err = send_settings_rsp(sk, MGMT_OP_SET_HS, hdev);
	if (err < 0)
		goto unlock;

	if (changed)
		err = new_settings(hdev, sk);
1617

1618 1619 1620
unlock:
	hci_dev_unlock(hdev);
	return err;
1621 1622
}

1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640
static void le_enable_complete(struct hci_dev *hdev, u8 status)
{
	struct cmd_lookup match = { NULL, hdev };

	if (status) {
		u8 mgmt_err = mgmt_status(status);

		mgmt_pending_foreach(MGMT_OP_SET_LE, hdev, cmd_status_rsp,
				     &mgmt_err);
		return;
	}

	mgmt_pending_foreach(MGMT_OP_SET_LE, hdev, settings_rsp, &match);

	new_settings(hdev, match.sk);

	if (match.sk)
		sock_put(match.sk);
1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657

	/* Make sure the controller has a good default for
	 * advertising data. Restrict the update to when LE
	 * has actually been enabled. During power on, the
	 * update in powered_update_hci will take care of it.
	 */
	if (test_bit(HCI_LE_ENABLED, &hdev->dev_flags)) {
		struct hci_request req;

		hci_dev_lock(hdev);

		hci_req_init(&req, hdev);
		update_ad(&req);
		hci_req_run(&req, NULL);

		hci_dev_unlock(hdev);
	}
1658 1659
}

1660
static int set_le(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
1661 1662 1663 1664
{
	struct mgmt_mode *cp = data;
	struct hci_cp_write_le_host_supported hci_cp;
	struct pending_cmd *cmd;
1665
	struct hci_request req;
1666
	int err;
1667
	u8 val, enabled;
1668

1669
	BT_DBG("request for %s", hdev->name);
1670

1671 1672 1673
	if (!lmp_le_capable(hdev))
		return cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
				  MGMT_STATUS_NOT_SUPPORTED);
1674

1675 1676 1677 1678
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
				  MGMT_STATUS_INVALID_PARAMS);

1679
	/* LE-only devices do not allow toggling LE on/off */
1680
	if (!test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags))
1681 1682 1683
		return cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
				  MGMT_STATUS_REJECTED);

1684
	hci_dev_lock(hdev);
1685 1686

	val = !!cp->val;
1687
	enabled = lmp_host_le_capable(hdev);
1688

1689
	if (!hdev_is_powered(hdev) || val == enabled) {
1690 1691 1692 1693 1694 1695 1696
		bool changed = false;

		if (val != test_bit(HCI_LE_ENABLED, &hdev->dev_flags)) {
			change_bit(HCI_LE_ENABLED, &hdev->dev_flags);
			changed = true;
		}

1697 1698
		if (!val && test_bit(HCI_ADVERTISING, &hdev->dev_flags)) {
			clear_bit(HCI_ADVERTISING, &hdev->dev_flags);
1699 1700 1701
			changed = true;
		}

1702 1703
		err = send_settings_rsp(sk, MGMT_OP_SET_LE, hdev);
		if (err < 0)
1704
			goto unlock;
1705 1706 1707 1708

		if (changed)
			err = new_settings(hdev, sk);

1709
		goto unlock;
1710 1711
	}

1712 1713
	if (mgmt_pending_find(MGMT_OP_SET_LE, hdev) ||
	    mgmt_pending_find(MGMT_OP_SET_ADVERTISING, hdev)) {
1714
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
1715
				 MGMT_STATUS_BUSY);
1716
		goto unlock;
1717 1718 1719 1720 1721
	}

	cmd = mgmt_pending_add(sk, MGMT_OP_SET_LE, hdev, data, len);
	if (!cmd) {
		err = -ENOMEM;
1722
		goto unlock;
1723 1724
	}

1725 1726
	hci_req_init(&req, hdev);

1727 1728 1729 1730
	memset(&hci_cp, 0, sizeof(hci_cp));

	if (val) {
		hci_cp.le = val;
1731
		hci_cp.simul = lmp_le_br_capable(hdev);
1732 1733 1734
	} else {
		if (test_bit(HCI_ADVERTISING, &hdev->dev_flags))
			disable_advertising(&req);
1735 1736
	}

1737 1738 1739 1740
	hci_req_add(&req, HCI_OP_WRITE_LE_HOST_SUPPORTED, sizeof(hci_cp),
		    &hci_cp);

	err = hci_req_run(&req, le_enable_complete);
1741
	if (err < 0)
1742 1743
		mgmt_pending_remove(cmd);

1744 1745
unlock:
	hci_dev_unlock(hdev);
1746 1747 1748
	return err;
}

1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771
/* This is a helper function to test for pending mgmt commands that can
 * cause CoD or EIR HCI commands. We can only allow one such pending
 * mgmt command at a time since otherwise we cannot easily track what
 * the current values are, will be, and based on that calculate if a new
 * HCI command needs to be sent and if yes with what value.
 */
static bool pending_eir_or_class(struct hci_dev *hdev)
{
	struct pending_cmd *cmd;

	list_for_each_entry(cmd, &hdev->mgmt_pending, list) {
		switch (cmd->opcode) {
		case MGMT_OP_ADD_UUID:
		case MGMT_OP_REMOVE_UUID:
		case MGMT_OP_SET_DEV_CLASS:
		case MGMT_OP_SET_POWERED:
			return true;
		}
	}

	return false;
}

1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790
static const u8 bluetooth_base_uuid[] = {
			0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80,
			0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};

static u8 get_uuid_size(const u8 *uuid)
{
	u32 val;

	if (memcmp(uuid, bluetooth_base_uuid, 12))
		return 128;

	val = get_unaligned_le32(&uuid[12]);
	if (val > 0xffff)
		return 32;

	return 16;
}

1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816
static void mgmt_class_complete(struct hci_dev *hdev, u16 mgmt_op, u8 status)
{
	struct pending_cmd *cmd;

	hci_dev_lock(hdev);

	cmd = mgmt_pending_find(mgmt_op, hdev);
	if (!cmd)
		goto unlock;

	cmd_complete(cmd->sk, cmd->index, cmd->opcode, mgmt_status(status),
		     hdev->dev_class, 3);

	mgmt_pending_remove(cmd);

unlock:
	hci_dev_unlock(hdev);
}

static void add_uuid_complete(struct hci_dev *hdev, u8 status)
{
	BT_DBG("status 0x%02x", status);

	mgmt_class_complete(hdev, MGMT_OP_ADD_UUID, status);
}

1817
static int add_uuid(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
1818
{
1819
	struct mgmt_cp_add_uuid *cp = data;
1820
	struct pending_cmd *cmd;
1821
	struct hci_request req;
1822 1823 1824
	struct bt_uuid *uuid;
	int err;

1825
	BT_DBG("request for %s", hdev->name);
1826

1827
	hci_dev_lock(hdev);
1828

1829
	if (pending_eir_or_class(hdev)) {
1830
		err = cmd_status(sk, hdev->id, MGMT_OP_ADD_UUID,
1831
				 MGMT_STATUS_BUSY);
1832 1833 1834
		goto failed;
	}

1835
	uuid = kmalloc(sizeof(*uuid), GFP_KERNEL);
1836 1837 1838 1839 1840 1841
	if (!uuid) {
		err = -ENOMEM;
		goto failed;
	}

	memcpy(uuid->uuid, cp->uuid, 16);
1842
	uuid->svc_hint = cp->svc_hint;
1843
	uuid->size = get_uuid_size(cp->uuid);
1844

1845
	list_add_tail(&uuid->list, &hdev->uuids);
1846

1847
	hci_req_init(&req, hdev);
1848

1849 1850 1851
	update_class(&req);
	update_eir(&req);

1852 1853 1854 1855
	err = hci_req_run(&req, add_uuid_complete);
	if (err < 0) {
		if (err != -ENODATA)
			goto failed;
1856

1857
		err = cmd_complete(sk, hdev->id, MGMT_OP_ADD_UUID, 0,
1858
				   hdev->dev_class, 3);
1859 1860 1861 1862
		goto failed;
	}

	cmd = mgmt_pending_add(sk, MGMT_OP_ADD_UUID, hdev, data, len);
1863
	if (!cmd) {
1864
		err = -ENOMEM;
1865 1866 1867 1868
		goto failed;
	}

	err = 0;
1869 1870

failed:
1871
	hci_dev_unlock(hdev);
1872 1873 1874
	return err;
}

1875 1876 1877 1878 1879 1880
static bool enable_service_cache(struct hci_dev *hdev)
{
	if (!hdev_is_powered(hdev))
		return false;

	if (!test_and_set_bit(HCI_SERVICE_CACHE, &hdev->dev_flags)) {
1881 1882
		queue_delayed_work(hdev->workqueue, &hdev->service_cache,
				   CACHE_TIMEOUT);
1883 1884 1885 1886 1887 1888
		return true;
	}

	return false;
}

1889 1890 1891 1892 1893 1894 1895
static void remove_uuid_complete(struct hci_dev *hdev, u8 status)
{
	BT_DBG("status 0x%02x", status);

	mgmt_class_complete(hdev, MGMT_OP_REMOVE_UUID, status);
}

1896
static int remove_uuid(struct sock *sk, struct hci_dev *hdev, void *data,
1897
		       u16 len)
1898
{
1899
	struct mgmt_cp_remove_uuid *cp = data;
1900
	struct pending_cmd *cmd;
1901
	struct bt_uuid *match, *tmp;
1902
	u8 bt_uuid_any[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
1903
	struct hci_request req;
1904 1905
	int err, found;

1906
	BT_DBG("request for %s", hdev->name);
1907

1908
	hci_dev_lock(hdev);
1909

1910
	if (pending_eir_or_class(hdev)) {
1911
		err = cmd_status(sk, hdev->id, MGMT_OP_REMOVE_UUID,
1912
				 MGMT_STATUS_BUSY);
1913 1914 1915
		goto unlock;
	}

1916 1917
	if (memcmp(cp->uuid, bt_uuid_any, 16) == 0) {
		err = hci_uuids_clear(hdev);
1918

1919
		if (enable_service_cache(hdev)) {
1920
			err = cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_UUID,
1921
					   0, hdev->dev_class, 3);
1922 1923
			goto unlock;
		}
1924

1925
		goto update_class;
1926 1927 1928 1929
	}

	found = 0;

1930
	list_for_each_entry_safe(match, tmp, &hdev->uuids, list) {
1931 1932 1933 1934
		if (memcmp(match->uuid, cp->uuid, 16) != 0)
			continue;

		list_del(&match->list);
1935
		kfree(match);
1936 1937 1938 1939
		found++;
	}

	if (found == 0) {
1940
		err = cmd_status(sk, hdev->id, MGMT_OP_REMOVE_UUID,
1941
				 MGMT_STATUS_INVALID_PARAMS);
1942 1943 1944
		goto unlock;
	}

1945
update_class:
1946
	hci_req_init(&req, hdev);
1947

1948 1949 1950
	update_class(&req);
	update_eir(&req);

1951 1952 1953 1954
	err = hci_req_run(&req, remove_uuid_complete);
	if (err < 0) {
		if (err != -ENODATA)
			goto unlock;
1955

1956
		err = cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_UUID, 0,
1957
				   hdev->dev_class, 3);
1958 1959 1960 1961
		goto unlock;
	}

	cmd = mgmt_pending_add(sk, MGMT_OP_REMOVE_UUID, hdev, data, len);
1962
	if (!cmd) {
1963
		err = -ENOMEM;
1964 1965 1966 1967
		goto unlock;
	}

	err = 0;
1968 1969

unlock:
1970
	hci_dev_unlock(hdev);
1971 1972 1973
	return err;
}

1974 1975 1976 1977 1978 1979 1980
static void set_class_complete(struct hci_dev *hdev, u8 status)
{
	BT_DBG("status 0x%02x", status);

	mgmt_class_complete(hdev, MGMT_OP_SET_DEV_CLASS, status);
}

1981
static int set_dev_class(struct sock *sk, struct hci_dev *hdev, void *data,
1982
			 u16 len)
1983
{
1984
	struct mgmt_cp_set_dev_class *cp = data;
1985
	struct pending_cmd *cmd;
1986
	struct hci_request req;
1987 1988
	int err;

1989
	BT_DBG("request for %s", hdev->name);
1990

1991
	if (!lmp_bredr_capable(hdev))
1992 1993
		return cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS,
				  MGMT_STATUS_NOT_SUPPORTED);
1994

1995
	hci_dev_lock(hdev);
1996

1997 1998 1999 2000 2001
	if (pending_eir_or_class(hdev)) {
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS,
				 MGMT_STATUS_BUSY);
		goto unlock;
	}
2002

2003 2004 2005 2006 2007
	if ((cp->minor & 0x03) != 0 || (cp->major & 0xe0) != 0) {
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS,
				 MGMT_STATUS_INVALID_PARAMS);
		goto unlock;
	}
2008

2009 2010 2011
	hdev->major_class = cp->major;
	hdev->minor_class = cp->minor;

2012
	if (!hdev_is_powered(hdev)) {
2013
		err = cmd_complete(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, 0,
2014
				   hdev->dev_class, 3);
2015 2016 2017
		goto unlock;
	}

2018 2019
	hci_req_init(&req, hdev);

2020
	if (test_and_clear_bit(HCI_SERVICE_CACHE, &hdev->dev_flags)) {
2021 2022 2023
		hci_dev_unlock(hdev);
		cancel_delayed_work_sync(&hdev->service_cache);
		hci_dev_lock(hdev);
2024
		update_eir(&req);
2025
	}
2026

2027 2028
	update_class(&req);

2029 2030 2031 2032
	err = hci_req_run(&req, set_class_complete);
	if (err < 0) {
		if (err != -ENODATA)
			goto unlock;
2033

2034
		err = cmd_complete(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, 0,
2035
				   hdev->dev_class, 3);
2036 2037 2038 2039
		goto unlock;
	}

	cmd = mgmt_pending_add(sk, MGMT_OP_SET_DEV_CLASS, hdev, data, len);
2040
	if (!cmd) {
2041
		err = -ENOMEM;
2042 2043 2044 2045
		goto unlock;
	}

	err = 0;
2046

2047
unlock:
2048
	hci_dev_unlock(hdev);
2049 2050 2051
	return err;
}

2052
static int load_link_keys(struct sock *sk, struct hci_dev *hdev, void *data,
2053
			  u16 len)
2054
{
2055
	struct mgmt_cp_load_link_keys *cp = data;
2056
	u16 key_count, expected_len;
2057
	int i;
2058

2059 2060 2061 2062 2063 2064
	BT_DBG("request for %s", hdev->name);

	if (!lmp_bredr_capable(hdev))
		return cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS,
				  MGMT_STATUS_NOT_SUPPORTED);

2065
	key_count = __le16_to_cpu(cp->key_count);
2066

2067 2068
	expected_len = sizeof(*cp) + key_count *
					sizeof(struct mgmt_link_key_info);
2069
	if (expected_len != len) {
2070
		BT_ERR("load_link_keys: expected %u bytes, got %u bytes",
2071
		       len, expected_len);
2072
		return cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS,
2073
				  MGMT_STATUS_INVALID_PARAMS);
2074 2075
	}

2076 2077 2078 2079
	if (cp->debug_keys != 0x00 && cp->debug_keys != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS,
				  MGMT_STATUS_INVALID_PARAMS);

2080
	BT_DBG("%s debug_keys %u key_count %u", hdev->name, cp->debug_keys,
2081
	       key_count);
2082

2083 2084 2085 2086 2087 2088 2089 2090
	for (i = 0; i < key_count; i++) {
		struct mgmt_link_key_info *key = &cp->keys[i];

		if (key->addr.type != BDADDR_BREDR)
			return cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS,
					  MGMT_STATUS_INVALID_PARAMS);
	}

2091
	hci_dev_lock(hdev);
2092 2093 2094 2095

	hci_link_keys_clear(hdev);

	if (cp->debug_keys)
2096
		set_bit(HCI_DEBUG_KEYS, &hdev->dev_flags);
2097
	else
2098
		clear_bit(HCI_DEBUG_KEYS, &hdev->dev_flags);
2099

2100
	for (i = 0; i < key_count; i++) {
2101
		struct mgmt_link_key_info *key = &cp->keys[i];
2102

2103
		hci_add_link_key(hdev, NULL, 0, &key->addr.bdaddr, key->val,
2104
				 key->type, key->pin_len);
2105 2106
	}

2107
	cmd_complete(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS, 0, NULL, 0);
2108

2109
	hci_dev_unlock(hdev);
2110

2111
	return 0;
2112 2113
}

2114
static int device_unpaired(struct hci_dev *hdev, bdaddr_t *bdaddr,
2115
			   u8 addr_type, struct sock *skip_sk)
2116 2117 2118 2119 2120 2121 2122
{
	struct mgmt_ev_device_unpaired ev;

	bacpy(&ev.addr.bdaddr, bdaddr);
	ev.addr.type = addr_type;

	return mgmt_event(MGMT_EV_DEVICE_UNPAIRED, hdev, &ev, sizeof(ev),
2123
			  skip_sk);
2124 2125
}

2126
static int unpair_device(struct sock *sk, struct hci_dev *hdev, void *data,
2127
			 u16 len)
2128
{
2129 2130
	struct mgmt_cp_unpair_device *cp = data;
	struct mgmt_rp_unpair_device rp;
2131 2132
	struct hci_cp_disconnect dc;
	struct pending_cmd *cmd;
2133 2134 2135
	struct hci_conn *conn;
	int err;

2136
	memset(&rp, 0, sizeof(rp));
2137 2138
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;
2139

2140 2141 2142 2143 2144
	if (!bdaddr_type_is_valid(cp->addr.type))
		return cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
				    MGMT_STATUS_INVALID_PARAMS,
				    &rp, sizeof(rp));

2145 2146 2147 2148 2149
	if (cp->disconnect != 0x00 && cp->disconnect != 0x01)
		return cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
				    MGMT_STATUS_INVALID_PARAMS,
				    &rp, sizeof(rp));

2150 2151
	hci_dev_lock(hdev);

2152
	if (!hdev_is_powered(hdev)) {
2153
		err = cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
2154
				   MGMT_STATUS_NOT_POWERED, &rp, sizeof(rp));
2155 2156 2157
		goto unlock;
	}

2158
	if (cp->addr.type == BDADDR_BREDR)
2159 2160 2161
		err = hci_remove_link_key(hdev, &cp->addr.bdaddr);
	else
		err = hci_remove_ltk(hdev, &cp->addr.bdaddr);
2162

2163
	if (err < 0) {
2164
		err = cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
2165
				   MGMT_STATUS_NOT_PAIRED, &rp, sizeof(rp));
2166 2167 2168
		goto unlock;
	}

2169
	if (cp->disconnect) {
2170
		if (cp->addr.type == BDADDR_BREDR)
2171
			conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK,
2172
						       &cp->addr.bdaddr);
2173 2174
		else
			conn = hci_conn_hash_lookup_ba(hdev, LE_LINK,
2175
						       &cp->addr.bdaddr);
2176 2177 2178
	} else {
		conn = NULL;
	}
2179

2180
	if (!conn) {
2181
		err = cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE, 0,
2182
				   &rp, sizeof(rp));
2183
		device_unpaired(hdev, &cp->addr.bdaddr, cp->addr.type, sk);
2184 2185
		goto unlock;
	}
2186

2187
	cmd = mgmt_pending_add(sk, MGMT_OP_UNPAIR_DEVICE, hdev, cp,
2188
			       sizeof(*cp));
2189 2190 2191
	if (!cmd) {
		err = -ENOMEM;
		goto unlock;
2192 2193
	}

2194
	dc.handle = cpu_to_le16(conn->handle);
2195 2196 2197 2198 2199
	dc.reason = 0x13; /* Remote User Terminated Connection */
	err = hci_send_cmd(hdev, HCI_OP_DISCONNECT, sizeof(dc), &dc);
	if (err < 0)
		mgmt_pending_remove(cmd);

2200
unlock:
2201
	hci_dev_unlock(hdev);
2202 2203 2204
	return err;
}

2205
static int disconnect(struct sock *sk, struct hci_dev *hdev, void *data,
2206
		      u16 len)
2207
{
2208
	struct mgmt_cp_disconnect *cp = data;
2209
	struct mgmt_rp_disconnect rp;
2210
	struct hci_cp_disconnect dc;
2211
	struct pending_cmd *cmd;
2212 2213 2214 2215 2216
	struct hci_conn *conn;
	int err;

	BT_DBG("");

2217 2218 2219 2220
	memset(&rp, 0, sizeof(rp));
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;

2221
	if (!bdaddr_type_is_valid(cp->addr.type))
2222 2223 2224
		return cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
				    MGMT_STATUS_INVALID_PARAMS,
				    &rp, sizeof(rp));
2225

2226
	hci_dev_lock(hdev);
2227 2228

	if (!test_bit(HCI_UP, &hdev->flags)) {
2229 2230
		err = cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
				   MGMT_STATUS_NOT_POWERED, &rp, sizeof(rp));
2231 2232 2233
		goto failed;
	}

2234
	if (mgmt_pending_find(MGMT_OP_DISCONNECT, hdev)) {
2235 2236
		err = cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
				   MGMT_STATUS_BUSY, &rp, sizeof(rp));
2237 2238 2239
		goto failed;
	}

2240
	if (cp->addr.type == BDADDR_BREDR)
2241 2242
		conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK,
					       &cp->addr.bdaddr);
2243 2244
	else
		conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &cp->addr.bdaddr);
2245

2246
	if (!conn || conn->state == BT_OPEN || conn->state == BT_CLOSED) {
2247 2248
		err = cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
				   MGMT_STATUS_NOT_CONNECTED, &rp, sizeof(rp));
2249 2250 2251
		goto failed;
	}

2252
	cmd = mgmt_pending_add(sk, MGMT_OP_DISCONNECT, hdev, data, len);
2253 2254
	if (!cmd) {
		err = -ENOMEM;
2255
		goto failed;
2256
	}
2257

2258
	dc.handle = cpu_to_le16(conn->handle);
2259
	dc.reason = HCI_ERROR_REMOTE_USER_TERM;
2260 2261 2262

	err = hci_send_cmd(hdev, HCI_OP_DISCONNECT, sizeof(dc), &dc);
	if (err < 0)
2263
		mgmt_pending_remove(cmd);
2264 2265

failed:
2266
	hci_dev_unlock(hdev);
2267 2268 2269
	return err;
}

2270
static u8 link_to_bdaddr(u8 link_type, u8 addr_type)
2271 2272 2273
{
	switch (link_type) {
	case LE_LINK:
2274 2275
		switch (addr_type) {
		case ADDR_LE_DEV_PUBLIC:
2276
			return BDADDR_LE_PUBLIC;
2277

2278
		default:
2279
			/* Fallback to LE Random address type */
2280
			return BDADDR_LE_RANDOM;
2281
		}
2282

2283
	default:
2284
		/* Fallback to BR/EDR type */
2285
		return BDADDR_BREDR;
2286 2287 2288
	}
}

2289 2290
static int get_connections(struct sock *sk, struct hci_dev *hdev, void *data,
			   u16 data_len)
2291 2292
{
	struct mgmt_rp_get_connections *rp;
2293
	struct hci_conn *c;
2294
	size_t rp_len;
2295 2296
	int err;
	u16 i;
2297 2298 2299

	BT_DBG("");

2300
	hci_dev_lock(hdev);
2301

2302
	if (!hdev_is_powered(hdev)) {
2303
		err = cmd_status(sk, hdev->id, MGMT_OP_GET_CONNECTIONS,
2304
				 MGMT_STATUS_NOT_POWERED);
2305 2306 2307
		goto unlock;
	}

2308
	i = 0;
2309 2310
	list_for_each_entry(c, &hdev->conn_hash.list, list) {
		if (test_bit(HCI_CONN_MGMT_CONNECTED, &c->flags))
2311
			i++;
2312 2313
	}

2314
	rp_len = sizeof(*rp) + (i * sizeof(struct mgmt_addr_info));
2315
	rp = kmalloc(rp_len, GFP_KERNEL);
2316
	if (!rp) {
2317 2318 2319 2320 2321
		err = -ENOMEM;
		goto unlock;
	}

	i = 0;
2322
	list_for_each_entry(c, &hdev->conn_hash.list, list) {
2323 2324
		if (!test_bit(HCI_CONN_MGMT_CONNECTED, &c->flags))
			continue;
2325
		bacpy(&rp->addr[i].bdaddr, &c->dst);
2326
		rp->addr[i].type = link_to_bdaddr(c->type, c->dst_type);
2327
		if (c->type == SCO_LINK || c->type == ESCO_LINK)
2328 2329 2330 2331
			continue;
		i++;
	}

2332
	rp->conn_count = cpu_to_le16(i);
2333

2334 2335
	/* Recalculate length in case of filtered SCO connections, etc */
	rp_len = sizeof(*rp) + (i * sizeof(struct mgmt_addr_info));
2336

2337
	err = cmd_complete(sk, hdev->id, MGMT_OP_GET_CONNECTIONS, 0, rp,
2338
			   rp_len);
2339

2340
	kfree(rp);
2341 2342

unlock:
2343
	hci_dev_unlock(hdev);
2344 2345 2346
	return err;
}

2347
static int send_pin_code_neg_reply(struct sock *sk, struct hci_dev *hdev,
2348
				   struct mgmt_cp_pin_code_neg_reply *cp)
2349 2350 2351 2352
{
	struct pending_cmd *cmd;
	int err;

2353
	cmd = mgmt_pending_add(sk, MGMT_OP_PIN_CODE_NEG_REPLY, hdev, cp,
2354
			       sizeof(*cp));
2355 2356 2357
	if (!cmd)
		return -ENOMEM;

2358
	err = hci_send_cmd(hdev, HCI_OP_PIN_CODE_NEG_REPLY,
2359
			   sizeof(cp->addr.bdaddr), &cp->addr.bdaddr);
2360 2361 2362 2363 2364 2365
	if (err < 0)
		mgmt_pending_remove(cmd);

	return err;
}

2366
static int pin_code_reply(struct sock *sk, struct hci_dev *hdev, void *data,
2367
			  u16 len)
2368
{
2369
	struct hci_conn *conn;
2370
	struct mgmt_cp_pin_code_reply *cp = data;
2371
	struct hci_cp_pin_code_reply reply;
2372
	struct pending_cmd *cmd;
2373 2374 2375 2376
	int err;

	BT_DBG("");

2377
	hci_dev_lock(hdev);
2378

2379
	if (!hdev_is_powered(hdev)) {
2380
		err = cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
2381
				 MGMT_STATUS_NOT_POWERED);
2382 2383 2384
		goto failed;
	}

2385
	conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->addr.bdaddr);
2386
	if (!conn) {
2387
		err = cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
2388
				 MGMT_STATUS_NOT_CONNECTED);
2389 2390 2391 2392
		goto failed;
	}

	if (conn->pending_sec_level == BT_SECURITY_HIGH && cp->pin_len != 16) {
2393 2394 2395
		struct mgmt_cp_pin_code_neg_reply ncp;

		memcpy(&ncp.addr, &cp->addr, sizeof(ncp.addr));
2396 2397 2398

		BT_ERR("PIN code is not 16 bytes long");

2399
		err = send_pin_code_neg_reply(sk, hdev, &ncp);
2400
		if (err >= 0)
2401
			err = cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
2402
					 MGMT_STATUS_INVALID_PARAMS);
2403 2404 2405 2406

		goto failed;
	}

2407
	cmd = mgmt_pending_add(sk, MGMT_OP_PIN_CODE_REPLY, hdev, data, len);
2408 2409
	if (!cmd) {
		err = -ENOMEM;
2410
		goto failed;
2411
	}
2412

2413
	bacpy(&reply.bdaddr, &cp->addr.bdaddr);
2414
	reply.pin_len = cp->pin_len;
2415
	memcpy(reply.pin_code, cp->pin_code, sizeof(reply.pin_code));
2416 2417 2418

	err = hci_send_cmd(hdev, HCI_OP_PIN_CODE_REPLY, sizeof(reply), &reply);
	if (err < 0)
2419
		mgmt_pending_remove(cmd);
2420 2421

failed:
2422
	hci_dev_unlock(hdev);
2423 2424 2425
	return err;
}

2426 2427
static int set_io_capability(struct sock *sk, struct hci_dev *hdev, void *data,
			     u16 len)
2428
{
2429
	struct mgmt_cp_set_io_capability *cp = data;
2430 2431 2432

	BT_DBG("");

2433
	hci_dev_lock(hdev);
2434 2435 2436 2437

	hdev->io_capability = cp->io_capability;

	BT_DBG("%s IO capability set to 0x%02x", hdev->name,
2438
	       hdev->io_capability);
2439

2440
	hci_dev_unlock(hdev);
2441

2442 2443
	return cmd_complete(sk, hdev->id, MGMT_OP_SET_IO_CAPABILITY, 0, NULL,
			    0);
2444 2445
}

2446
static struct pending_cmd *find_pairing(struct hci_conn *conn)
2447 2448
{
	struct hci_dev *hdev = conn->hdev;
2449
	struct pending_cmd *cmd;
2450

2451
	list_for_each_entry(cmd, &hdev->mgmt_pending, list) {
2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468
		if (cmd->opcode != MGMT_OP_PAIR_DEVICE)
			continue;

		if (cmd->user_data != conn)
			continue;

		return cmd;
	}

	return NULL;
}

static void pairing_complete(struct pending_cmd *cmd, u8 status)
{
	struct mgmt_rp_pair_device rp;
	struct hci_conn *conn = cmd->user_data;

2469
	bacpy(&rp.addr.bdaddr, &conn->dst);
2470
	rp.addr.type = link_to_bdaddr(conn->type, conn->dst_type);
2471

2472
	cmd_complete(cmd->sk, cmd->index, MGMT_OP_PAIR_DEVICE, status,
2473
		     &rp, sizeof(rp));
2474 2475 2476 2477 2478 2479

	/* So we don't get further callbacks for this connection */
	conn->connect_cfm_cb = NULL;
	conn->security_cfm_cb = NULL;
	conn->disconn_cfm_cb = NULL;

2480
	hci_conn_drop(conn);
2481

2482
	mgmt_pending_remove(cmd);
2483 2484 2485 2486 2487 2488 2489 2490 2491
}

static void pairing_complete_cb(struct hci_conn *conn, u8 status)
{
	struct pending_cmd *cmd;

	BT_DBG("status %u", status);

	cmd = find_pairing(conn);
2492
	if (!cmd)
2493
		BT_DBG("Unable to find a pending command");
2494
	else
2495
		pairing_complete(cmd, mgmt_status(status));
2496 2497
}

2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513
static void le_connect_complete_cb(struct hci_conn *conn, u8 status)
{
	struct pending_cmd *cmd;

	BT_DBG("status %u", status);

	if (!status)
		return;

	cmd = find_pairing(conn);
	if (!cmd)
		BT_DBG("Unable to find a pending command");
	else
		pairing_complete(cmd, mgmt_status(status));
}

2514
static int pair_device(struct sock *sk, struct hci_dev *hdev, void *data,
2515
		       u16 len)
2516
{
2517
	struct mgmt_cp_pair_device *cp = data;
2518
	struct mgmt_rp_pair_device rp;
2519 2520 2521 2522 2523 2524 2525
	struct pending_cmd *cmd;
	u8 sec_level, auth_type;
	struct hci_conn *conn;
	int err;

	BT_DBG("");

2526 2527 2528 2529
	memset(&rp, 0, sizeof(rp));
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;

2530 2531 2532 2533 2534
	if (!bdaddr_type_is_valid(cp->addr.type))
		return cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
				    MGMT_STATUS_INVALID_PARAMS,
				    &rp, sizeof(rp));

2535
	hci_dev_lock(hdev);
2536

2537
	if (!hdev_is_powered(hdev)) {
2538 2539
		err = cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
				   MGMT_STATUS_NOT_POWERED, &rp, sizeof(rp));
2540 2541 2542
		goto unlock;
	}

2543 2544
	sec_level = BT_SECURITY_MEDIUM;
	if (cp->io_cap == 0x03)
2545
		auth_type = HCI_AT_DEDICATED_BONDING;
2546
	else
2547 2548
		auth_type = HCI_AT_DEDICATED_BONDING_MITM;

2549
	if (cp->addr.type == BDADDR_BREDR)
2550 2551
		conn = hci_connect(hdev, ACL_LINK, &cp->addr.bdaddr,
				   cp->addr.type, sec_level, auth_type);
2552
	else
2553 2554
		conn = hci_connect(hdev, LE_LINK, &cp->addr.bdaddr,
				   cp->addr.type, sec_level, auth_type);
2555

2556
	if (IS_ERR(conn)) {
2557 2558 2559 2560 2561 2562 2563
		int status;

		if (PTR_ERR(conn) == -EBUSY)
			status = MGMT_STATUS_BUSY;
		else
			status = MGMT_STATUS_CONNECT_FAILED;

2564
		err = cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
2565
				   status, &rp,
2566
				   sizeof(rp));
2567 2568 2569 2570
		goto unlock;
	}

	if (conn->connect_cfm_cb) {
2571
		hci_conn_drop(conn);
2572
		err = cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
2573
				   MGMT_STATUS_BUSY, &rp, sizeof(rp));
2574 2575 2576
		goto unlock;
	}

2577
	cmd = mgmt_pending_add(sk, MGMT_OP_PAIR_DEVICE, hdev, data, len);
2578 2579
	if (!cmd) {
		err = -ENOMEM;
2580
		hci_conn_drop(conn);
2581 2582 2583
		goto unlock;
	}

2584
	/* For LE, just connecting isn't a proof that the pairing finished */
2585
	if (cp->addr.type == BDADDR_BREDR)
2586
		conn->connect_cfm_cb = pairing_complete_cb;
2587 2588
	else
		conn->connect_cfm_cb = le_connect_complete_cb;
2589

2590 2591 2592 2593 2594 2595
	conn->security_cfm_cb = pairing_complete_cb;
	conn->disconn_cfm_cb = pairing_complete_cb;
	conn->io_capability = cp->io_cap;
	cmd->user_data = conn;

	if (conn->state == BT_CONNECTED &&
2596
	    hci_conn_security(conn, sec_level, auth_type))
2597 2598 2599 2600 2601
		pairing_complete(cmd, 0);

	err = 0;

unlock:
2602
	hci_dev_unlock(hdev);
2603 2604 2605
	return err;
}

2606 2607
static int cancel_pair_device(struct sock *sk, struct hci_dev *hdev, void *data,
			      u16 len)
2608
{
2609
	struct mgmt_addr_info *addr = data;
2610 2611 2612 2613 2614 2615 2616 2617
	struct pending_cmd *cmd;
	struct hci_conn *conn;
	int err;

	BT_DBG("");

	hci_dev_lock(hdev);

2618
	if (!hdev_is_powered(hdev)) {
2619
		err = cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE,
2620
				 MGMT_STATUS_NOT_POWERED);
2621 2622 2623
		goto unlock;
	}

2624 2625
	cmd = mgmt_pending_find(MGMT_OP_PAIR_DEVICE, hdev);
	if (!cmd) {
2626
		err = cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE,
2627
				 MGMT_STATUS_INVALID_PARAMS);
2628 2629 2630 2631 2632 2633
		goto unlock;
	}

	conn = cmd->user_data;

	if (bacmp(&addr->bdaddr, &conn->dst) != 0) {
2634
		err = cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE,
2635
				 MGMT_STATUS_INVALID_PARAMS);
2636 2637 2638 2639 2640
		goto unlock;
	}

	pairing_complete(cmd, MGMT_STATUS_CANCELLED);

2641
	err = cmd_complete(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE, 0,
2642
			   addr, sizeof(*addr));
2643 2644 2645 2646 2647
unlock:
	hci_dev_unlock(hdev);
	return err;
}

2648
static int user_pairing_resp(struct sock *sk, struct hci_dev *hdev,
2649
			     struct mgmt_addr_info *addr, u16 mgmt_op,
2650
			     u16 hci_op, __le32 passkey)
2651 2652
{
	struct pending_cmd *cmd;
2653
	struct hci_conn *conn;
2654 2655
	int err;

2656
	hci_dev_lock(hdev);
2657

2658
	if (!hdev_is_powered(hdev)) {
2659 2660 2661
		err = cmd_complete(sk, hdev->id, mgmt_op,
				   MGMT_STATUS_NOT_POWERED, addr,
				   sizeof(*addr));
2662
		goto done;
2663 2664
	}

2665 2666
	if (addr->type == BDADDR_BREDR)
		conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &addr->bdaddr);
2667
	else
2668
		conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &addr->bdaddr);
2669 2670

	if (!conn) {
2671 2672 2673
		err = cmd_complete(sk, hdev->id, mgmt_op,
				   MGMT_STATUS_NOT_CONNECTED, addr,
				   sizeof(*addr));
2674 2675
		goto done;
	}
2676

2677
	if (addr->type == BDADDR_LE_PUBLIC || addr->type == BDADDR_LE_RANDOM) {
2678
		/* Continue with pairing via SMP */
2679 2680 2681
		err = smp_user_confirm_reply(conn, mgmt_op, passkey);

		if (!err)
2682 2683 2684
			err = cmd_complete(sk, hdev->id, mgmt_op,
					   MGMT_STATUS_SUCCESS, addr,
					   sizeof(*addr));
2685
		else
2686 2687 2688
			err = cmd_complete(sk, hdev->id, mgmt_op,
					   MGMT_STATUS_FAILED, addr,
					   sizeof(*addr));
2689 2690 2691 2692

		goto done;
	}

2693
	cmd = mgmt_pending_add(sk, mgmt_op, hdev, addr, sizeof(*addr));
2694 2695
	if (!cmd) {
		err = -ENOMEM;
2696
		goto done;
2697 2698
	}

2699
	/* Continue with pairing via HCI */
2700 2701 2702
	if (hci_op == HCI_OP_USER_PASSKEY_REPLY) {
		struct hci_cp_user_passkey_reply cp;

2703
		bacpy(&cp.bdaddr, &addr->bdaddr);
2704 2705 2706
		cp.passkey = passkey;
		err = hci_send_cmd(hdev, hci_op, sizeof(cp), &cp);
	} else
2707 2708
		err = hci_send_cmd(hdev, hci_op, sizeof(addr->bdaddr),
				   &addr->bdaddr);
2709

2710 2711
	if (err < 0)
		mgmt_pending_remove(cmd);
2712

2713
done:
2714
	hci_dev_unlock(hdev);
2715 2716 2717
	return err;
}

2718 2719 2720 2721 2722 2723 2724
static int pin_code_neg_reply(struct sock *sk, struct hci_dev *hdev,
			      void *data, u16 len)
{
	struct mgmt_cp_pin_code_neg_reply *cp = data;

	BT_DBG("");

2725
	return user_pairing_resp(sk, hdev, &cp->addr,
2726 2727 2728 2729
				MGMT_OP_PIN_CODE_NEG_REPLY,
				HCI_OP_PIN_CODE_NEG_REPLY, 0);
}

2730 2731
static int user_confirm_reply(struct sock *sk, struct hci_dev *hdev, void *data,
			      u16 len)
2732
{
2733
	struct mgmt_cp_user_confirm_reply *cp = data;
2734 2735 2736 2737

	BT_DBG("");

	if (len != sizeof(*cp))
2738
		return cmd_status(sk, hdev->id, MGMT_OP_USER_CONFIRM_REPLY,
2739
				  MGMT_STATUS_INVALID_PARAMS);
2740

2741
	return user_pairing_resp(sk, hdev, &cp->addr,
2742 2743
				 MGMT_OP_USER_CONFIRM_REPLY,
				 HCI_OP_USER_CONFIRM_REPLY, 0);
2744 2745
}

2746
static int user_confirm_neg_reply(struct sock *sk, struct hci_dev *hdev,
2747
				  void *data, u16 len)
2748
{
2749
	struct mgmt_cp_user_confirm_neg_reply *cp = data;
2750 2751 2752

	BT_DBG("");

2753
	return user_pairing_resp(sk, hdev, &cp->addr,
2754 2755
				 MGMT_OP_USER_CONFIRM_NEG_REPLY,
				 HCI_OP_USER_CONFIRM_NEG_REPLY, 0);
2756 2757
}

2758 2759
static int user_passkey_reply(struct sock *sk, struct hci_dev *hdev, void *data,
			      u16 len)
2760
{
2761
	struct mgmt_cp_user_passkey_reply *cp = data;
2762 2763 2764

	BT_DBG("");

2765
	return user_pairing_resp(sk, hdev, &cp->addr,
2766 2767
				 MGMT_OP_USER_PASSKEY_REPLY,
				 HCI_OP_USER_PASSKEY_REPLY, cp->passkey);
2768 2769
}

2770
static int user_passkey_neg_reply(struct sock *sk, struct hci_dev *hdev,
2771
				  void *data, u16 len)
2772
{
2773
	struct mgmt_cp_user_passkey_neg_reply *cp = data;
2774 2775 2776

	BT_DBG("");

2777
	return user_pairing_resp(sk, hdev, &cp->addr,
2778 2779
				 MGMT_OP_USER_PASSKEY_NEG_REPLY,
				 HCI_OP_USER_PASSKEY_NEG_REPLY, 0);
2780 2781
}

2782
static void update_name(struct hci_request *req)
2783
{
2784
	struct hci_dev *hdev = req->hdev;
2785 2786
	struct hci_cp_write_local_name cp;

2787
	memcpy(cp.name, hdev->dev_name, sizeof(cp.name));
2788

2789
	hci_req_add(req, HCI_OP_WRITE_LOCAL_NAME, sizeof(cp), &cp);
2790 2791
}

2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819
static void set_name_complete(struct hci_dev *hdev, u8 status)
{
	struct mgmt_cp_set_local_name *cp;
	struct pending_cmd *cmd;

	BT_DBG("status 0x%02x", status);

	hci_dev_lock(hdev);

	cmd = mgmt_pending_find(MGMT_OP_SET_LOCAL_NAME, hdev);
	if (!cmd)
		goto unlock;

	cp = cmd->param;

	if (status)
		cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_LOCAL_NAME,
			   mgmt_status(status));
	else
		cmd_complete(cmd->sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, 0,
			     cp, sizeof(*cp));

	mgmt_pending_remove(cmd);

unlock:
	hci_dev_unlock(hdev);
}

2820
static int set_local_name(struct sock *sk, struct hci_dev *hdev, void *data,
2821
			  u16 len)
2822
{
2823
	struct mgmt_cp_set_local_name *cp = data;
2824
	struct pending_cmd *cmd;
2825
	struct hci_request req;
2826 2827 2828 2829
	int err;

	BT_DBG("");

2830
	hci_dev_lock(hdev);
2831

2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842
	/* If the old values are the same as the new ones just return a
	 * direct command complete event.
	 */
	if (!memcmp(hdev->dev_name, cp->name, sizeof(hdev->dev_name)) &&
	    !memcmp(hdev->short_name, cp->short_name,
		    sizeof(hdev->short_name))) {
		err = cmd_complete(sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, 0,
				   data, len);
		goto failed;
	}

2843
	memcpy(hdev->short_name, cp->short_name, sizeof(hdev->short_name));
2844

2845
	if (!hdev_is_powered(hdev)) {
2846
		memcpy(hdev->dev_name, cp->name, sizeof(hdev->dev_name));
2847 2848

		err = cmd_complete(sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, 0,
2849
				   data, len);
2850 2851 2852 2853
		if (err < 0)
			goto failed;

		err = mgmt_event(MGMT_EV_LOCAL_NAME_CHANGED, hdev, data, len,
2854
				 sk);
2855

2856 2857 2858
		goto failed;
	}

2859
	cmd = mgmt_pending_add(sk, MGMT_OP_SET_LOCAL_NAME, hdev, data, len);
2860 2861 2862 2863 2864
	if (!cmd) {
		err = -ENOMEM;
		goto failed;
	}

2865 2866
	memcpy(hdev->dev_name, cp->name, sizeof(hdev->dev_name));

2867
	hci_req_init(&req, hdev);
2868 2869 2870 2871 2872 2873 2874

	if (lmp_bredr_capable(hdev)) {
		update_name(&req);
		update_eir(&req);
	}

	if (lmp_le_capable(hdev))
2875
		update_ad(&req);
2876

2877
	err = hci_req_run(&req, set_name_complete);
2878 2879 2880 2881
	if (err < 0)
		mgmt_pending_remove(cmd);

failed:
2882
	hci_dev_unlock(hdev);
2883 2884 2885
	return err;
}

2886
static int read_local_oob_data(struct sock *sk, struct hci_dev *hdev,
2887
			       void *data, u16 data_len)
2888 2889 2890 2891
{
	struct pending_cmd *cmd;
	int err;

2892
	BT_DBG("%s", hdev->name);
2893

2894
	hci_dev_lock(hdev);
2895

2896
	if (!hdev_is_powered(hdev)) {
2897
		err = cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
2898
				 MGMT_STATUS_NOT_POWERED);
2899 2900 2901
		goto unlock;
	}

2902
	if (!lmp_ssp_capable(hdev)) {
2903
		err = cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
2904
				 MGMT_STATUS_NOT_SUPPORTED);
2905 2906 2907
		goto unlock;
	}

2908
	if (mgmt_pending_find(MGMT_OP_READ_LOCAL_OOB_DATA, hdev)) {
2909
		err = cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
2910
				 MGMT_STATUS_BUSY);
2911 2912 2913
		goto unlock;
	}

2914
	cmd = mgmt_pending_add(sk, MGMT_OP_READ_LOCAL_OOB_DATA, hdev, NULL, 0);
2915 2916 2917 2918 2919 2920 2921 2922 2923 2924
	if (!cmd) {
		err = -ENOMEM;
		goto unlock;
	}

	err = hci_send_cmd(hdev, HCI_OP_READ_LOCAL_OOB_DATA, 0, NULL);
	if (err < 0)
		mgmt_pending_remove(cmd);

unlock:
2925
	hci_dev_unlock(hdev);
2926 2927 2928
	return err;
}

2929
static int add_remote_oob_data(struct sock *sk, struct hci_dev *hdev,
2930
			       void *data, u16 len)
2931
{
2932
	struct mgmt_cp_add_remote_oob_data *cp = data;
2933
	u8 status;
2934 2935
	int err;

2936
	BT_DBG("%s ", hdev->name);
2937

2938
	hci_dev_lock(hdev);
2939

2940
	err = hci_add_remote_oob_data(hdev, &cp->addr.bdaddr, cp->hash,
2941
				      cp->randomizer);
2942
	if (err < 0)
2943
		status = MGMT_STATUS_FAILED;
2944
	else
2945
		status = MGMT_STATUS_SUCCESS;
2946

2947
	err = cmd_complete(sk, hdev->id, MGMT_OP_ADD_REMOTE_OOB_DATA, status,
2948
			   &cp->addr, sizeof(cp->addr));
2949

2950
	hci_dev_unlock(hdev);
2951 2952 2953
	return err;
}

2954
static int remove_remote_oob_data(struct sock *sk, struct hci_dev *hdev,
2955
				  void *data, u16 len)
2956
{
2957
	struct mgmt_cp_remove_remote_oob_data *cp = data;
2958
	u8 status;
2959 2960
	int err;

2961
	BT_DBG("%s", hdev->name);
2962

2963
	hci_dev_lock(hdev);
2964

2965
	err = hci_remove_remote_oob_data(hdev, &cp->addr.bdaddr);
2966
	if (err < 0)
2967
		status = MGMT_STATUS_INVALID_PARAMS;
2968
	else
2969
		status = MGMT_STATUS_SUCCESS;
2970

2971
	err = cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_REMOTE_OOB_DATA,
2972
			   status, &cp->addr, sizeof(cp->addr));
2973

2974
	hci_dev_unlock(hdev);
2975 2976 2977
	return err;
}

2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998
static int mgmt_start_discovery_failed(struct hci_dev *hdev, u8 status)
{
	struct pending_cmd *cmd;
	u8 type;
	int err;

	hci_discovery_set_state(hdev, DISCOVERY_STOPPED);

	cmd = mgmt_pending_find(MGMT_OP_START_DISCOVERY, hdev);
	if (!cmd)
		return -ENOENT;

	type = hdev->discovery.type;

	err = cmd_complete(cmd->sk, hdev->id, cmd->opcode, mgmt_status(status),
			   &type, sizeof(type));
	mgmt_pending_remove(cmd);

	return err;
}

2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016
static void start_discovery_complete(struct hci_dev *hdev, u8 status)
{
	BT_DBG("status %d", status);

	if (status) {
		hci_dev_lock(hdev);
		mgmt_start_discovery_failed(hdev, status);
		hci_dev_unlock(hdev);
		return;
	}

	hci_dev_lock(hdev);
	hci_discovery_set_state(hdev, DISCOVERY_FINDING);
	hci_dev_unlock(hdev);

	switch (hdev->discovery.type) {
	case DISCOV_TYPE_LE:
		queue_delayed_work(hdev->workqueue, &hdev->le_scan_disable,
3017
				   DISCOV_LE_TIMEOUT);
3018 3019 3020 3021
		break;

	case DISCOV_TYPE_INTERLEAVED:
		queue_delayed_work(hdev->workqueue, &hdev->le_scan_disable,
3022
				   DISCOV_INTERLEAVED_TIMEOUT);
3023 3024 3025 3026 3027 3028 3029 3030 3031 3032
		break;

	case DISCOV_TYPE_BREDR:
		break;

	default:
		BT_ERR("Invalid discovery type %d", hdev->discovery.type);
	}
}

3033
static int start_discovery(struct sock *sk, struct hci_dev *hdev,
3034
			   void *data, u16 len)
3035
{
3036
	struct mgmt_cp_start_discovery *cp = data;
3037
	struct pending_cmd *cmd;
3038 3039 3040 3041 3042 3043
	struct hci_cp_le_set_scan_param param_cp;
	struct hci_cp_le_set_scan_enable enable_cp;
	struct hci_cp_inquiry inq_cp;
	struct hci_request req;
	/* General inquiry access code (GIAC) */
	u8 lap[3] = { 0x33, 0x8b, 0x9e };
3044
	u8 status;
3045 3046
	int err;

3047
	BT_DBG("%s", hdev->name);
3048

3049
	hci_dev_lock(hdev);
3050

3051
	if (!hdev_is_powered(hdev)) {
3052
		err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
3053
				 MGMT_STATUS_NOT_POWERED);
3054 3055 3056
		goto failed;
	}

3057 3058 3059 3060 3061 3062
	if (test_bit(HCI_PERIODIC_INQ, &hdev->dev_flags)) {
		err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
				 MGMT_STATUS_BUSY);
		goto failed;
	}

3063
	if (hdev->discovery.state != DISCOVERY_STOPPED) {
3064
		err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
3065
				 MGMT_STATUS_BUSY);
3066 3067 3068
		goto failed;
	}

3069
	cmd = mgmt_pending_add(sk, MGMT_OP_START_DISCOVERY, hdev, NULL, 0);
3070 3071 3072 3073 3074
	if (!cmd) {
		err = -ENOMEM;
		goto failed;
	}

A
Andre Guedes 已提交
3075 3076
	hdev->discovery.type = cp->type;

3077 3078
	hci_req_init(&req, hdev);

A
Andre Guedes 已提交
3079
	switch (hdev->discovery.type) {
3080
	case DISCOV_TYPE_BREDR:
3081 3082
		status = mgmt_bredr_support(hdev);
		if (status) {
3083
			err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
3084
					 status);
3085 3086 3087 3088
			mgmt_pending_remove(cmd);
			goto failed;
		}

3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099
		if (test_bit(HCI_INQUIRY, &hdev->flags)) {
			err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
					 MGMT_STATUS_BUSY);
			mgmt_pending_remove(cmd);
			goto failed;
		}

		hci_inquiry_cache_flush(hdev);

		memset(&inq_cp, 0, sizeof(inq_cp));
		memcpy(&inq_cp.lap, lap, sizeof(inq_cp.lap));
3100
		inq_cp.length = DISCOV_BREDR_INQUIRY_LEN;
3101
		hci_req_add(&req, HCI_OP_INQUIRY, sizeof(inq_cp), &inq_cp);
3102 3103 3104
		break;

	case DISCOV_TYPE_LE:
3105
	case DISCOV_TYPE_INTERLEAVED:
3106 3107
		status = mgmt_le_support(hdev);
		if (status) {
3108
			err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
3109
					 status);
3110 3111 3112 3113
			mgmt_pending_remove(cmd);
			goto failed;
		}

3114
		if (hdev->discovery.type == DISCOV_TYPE_INTERLEAVED &&
3115
		    !test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags)) {
3116 3117 3118 3119 3120 3121
			err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
					 MGMT_STATUS_NOT_SUPPORTED);
			mgmt_pending_remove(cmd);
			goto failed;
		}

3122
		if (test_bit(HCI_ADVERTISING, &hdev->dev_flags)) {
3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137
			err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
					 MGMT_STATUS_REJECTED);
			mgmt_pending_remove(cmd);
			goto failed;
		}

		if (test_bit(HCI_LE_SCAN, &hdev->dev_flags)) {
			err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
					 MGMT_STATUS_BUSY);
			mgmt_pending_remove(cmd);
			goto failed;
		}

		memset(&param_cp, 0, sizeof(param_cp));
		param_cp.type = LE_SCAN_ACTIVE;
3138 3139
		param_cp.interval = cpu_to_le16(DISCOV_LE_SCAN_INT);
		param_cp.window = cpu_to_le16(DISCOV_LE_SCAN_WIN);
3140 3141 3142 3143
		if (bacmp(&hdev->bdaddr, BDADDR_ANY))
			param_cp.own_address_type = ADDR_LE_DEV_PUBLIC;
		else
			param_cp.own_address_type = ADDR_LE_DEV_RANDOM;
3144 3145 3146 3147 3148 3149 3150 3151
		hci_req_add(&req, HCI_OP_LE_SET_SCAN_PARAM, sizeof(param_cp),
			    &param_cp);

		memset(&enable_cp, 0, sizeof(enable_cp));
		enable_cp.enable = LE_SCAN_ENABLE;
		enable_cp.filter_dup = LE_SCAN_FILTER_DUP_ENABLE;
		hci_req_add(&req, HCI_OP_LE_SET_SCAN_ENABLE, sizeof(enable_cp),
			    &enable_cp);
3152 3153
		break;

3154
	default:
3155 3156 3157 3158
		err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
				 MGMT_STATUS_INVALID_PARAMS);
		mgmt_pending_remove(cmd);
		goto failed;
3159
	}
3160

3161
	err = hci_req_run(&req, start_discovery_complete);
3162 3163
	if (err < 0)
		mgmt_pending_remove(cmd);
3164 3165
	else
		hci_discovery_set_state(hdev, DISCOVERY_STARTING);
3166 3167

failed:
3168
	hci_dev_unlock(hdev);
3169 3170 3171
	return err;
}

3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187
static int mgmt_stop_discovery_failed(struct hci_dev *hdev, u8 status)
{
	struct pending_cmd *cmd;
	int err;

	cmd = mgmt_pending_find(MGMT_OP_STOP_DISCOVERY, hdev);
	if (!cmd)
		return -ENOENT;

	err = cmd_complete(cmd->sk, hdev->id, cmd->opcode, mgmt_status(status),
			   &hdev->discovery.type, sizeof(hdev->discovery.type));
	mgmt_pending_remove(cmd);

	return err;
}

3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204
static void stop_discovery_complete(struct hci_dev *hdev, u8 status)
{
	BT_DBG("status %d", status);

	hci_dev_lock(hdev);

	if (status) {
		mgmt_stop_discovery_failed(hdev, status);
		goto unlock;
	}

	hci_discovery_set_state(hdev, DISCOVERY_STOPPED);

unlock:
	hci_dev_unlock(hdev);
}

3205
static int stop_discovery(struct sock *sk, struct hci_dev *hdev, void *data,
3206
			  u16 len)
3207
{
3208
	struct mgmt_cp_stop_discovery *mgmt_cp = data;
3209
	struct pending_cmd *cmd;
3210 3211
	struct hci_cp_remote_name_req_cancel cp;
	struct inquiry_entry *e;
3212 3213
	struct hci_request req;
	struct hci_cp_le_set_scan_enable enable_cp;
3214 3215
	int err;

3216
	BT_DBG("%s", hdev->name);
3217

3218
	hci_dev_lock(hdev);
3219

3220
	if (!hci_discovery_active(hdev)) {
3221
		err = cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY,
3222 3223
				   MGMT_STATUS_REJECTED, &mgmt_cp->type,
				   sizeof(mgmt_cp->type));
3224 3225 3226 3227
		goto unlock;
	}

	if (hdev->discovery.type != mgmt_cp->type) {
3228
		err = cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY,
3229 3230
				   MGMT_STATUS_INVALID_PARAMS, &mgmt_cp->type,
				   sizeof(mgmt_cp->type));
3231
		goto unlock;
3232 3233
	}

3234
	cmd = mgmt_pending_add(sk, MGMT_OP_STOP_DISCOVERY, hdev, NULL, 0);
3235 3236
	if (!cmd) {
		err = -ENOMEM;
3237 3238 3239
		goto unlock;
	}

3240 3241
	hci_req_init(&req, hdev);

3242 3243
	switch (hdev->discovery.state) {
	case DISCOVERY_FINDING:
3244 3245 3246 3247 3248 3249 3250 3251 3252 3253
		if (test_bit(HCI_INQUIRY, &hdev->flags)) {
			hci_req_add(&req, HCI_OP_INQUIRY_CANCEL, 0, NULL);
		} else {
			cancel_delayed_work(&hdev->le_scan_disable);

			memset(&enable_cp, 0, sizeof(enable_cp));
			enable_cp.enable = LE_SCAN_DISABLE;
			hci_req_add(&req, HCI_OP_LE_SET_SCAN_ENABLE,
				    sizeof(enable_cp), &enable_cp);
		}
3254

3255 3256 3257 3258
		break;

	case DISCOVERY_RESOLVING:
		e = hci_inquiry_cache_lookup_resolve(hdev, BDADDR_ANY,
3259
						     NAME_PENDING);
3260
		if (!e) {
3261
			mgmt_pending_remove(cmd);
3262 3263 3264 3265 3266 3267 3268
			err = cmd_complete(sk, hdev->id,
					   MGMT_OP_STOP_DISCOVERY, 0,
					   &mgmt_cp->type,
					   sizeof(mgmt_cp->type));
			hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
			goto unlock;
		}
3269

3270
		bacpy(&cp.bdaddr, &e->data.bdaddr);
3271 3272
		hci_req_add(&req, HCI_OP_REMOTE_NAME_REQ_CANCEL, sizeof(cp),
			    &cp);
3273 3274 3275 3276 3277

		break;

	default:
		BT_DBG("unknown discovery state %u", hdev->discovery.state);
3278 3279 3280 3281 3282 3283

		mgmt_pending_remove(cmd);
		err = cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY,
				   MGMT_STATUS_FAILED, &mgmt_cp->type,
				   sizeof(mgmt_cp->type));
		goto unlock;
3284 3285
	}

3286
	err = hci_req_run(&req, stop_discovery_complete);
3287 3288
	if (err < 0)
		mgmt_pending_remove(cmd);
3289 3290
	else
		hci_discovery_set_state(hdev, DISCOVERY_STOPPING);
3291

3292
unlock:
3293
	hci_dev_unlock(hdev);
3294 3295 3296
	return err;
}

3297
static int confirm_name(struct sock *sk, struct hci_dev *hdev, void *data,
3298
			u16 len)
3299
{
3300
	struct mgmt_cp_confirm_name *cp = data;
3301 3302 3303
	struct inquiry_entry *e;
	int err;

3304
	BT_DBG("%s", hdev->name);
3305 3306 3307

	hci_dev_lock(hdev);

3308
	if (!hci_discovery_active(hdev)) {
3309
		err = cmd_status(sk, hdev->id, MGMT_OP_CONFIRM_NAME,
3310
				 MGMT_STATUS_FAILED);
3311 3312 3313
		goto failed;
	}

3314
	e = hci_inquiry_cache_lookup_unknown(hdev, &cp->addr.bdaddr);
3315
	if (!e) {
3316
		err = cmd_status(sk, hdev->id, MGMT_OP_CONFIRM_NAME,
3317
				 MGMT_STATUS_INVALID_PARAMS);
3318 3319 3320 3321 3322 3323 3324 3325
		goto failed;
	}

	if (cp->name_known) {
		e->name_state = NAME_KNOWN;
		list_del(&e->list);
	} else {
		e->name_state = NAME_NEEDED;
3326
		hci_inquiry_cache_update_resolve(hdev, e);
3327 3328
	}

3329 3330
	err = cmd_complete(sk, hdev->id, MGMT_OP_CONFIRM_NAME, 0, &cp->addr,
			   sizeof(cp->addr));
3331 3332 3333 3334 3335 3336

failed:
	hci_dev_unlock(hdev);
	return err;
}

3337
static int block_device(struct sock *sk, struct hci_dev *hdev, void *data,
3338
			u16 len)
3339
{
3340
	struct mgmt_cp_block_device *cp = data;
3341
	u8 status;
3342 3343
	int err;

3344
	BT_DBG("%s", hdev->name);
3345

3346
	if (!bdaddr_type_is_valid(cp->addr.type))
3347 3348 3349
		return cmd_complete(sk, hdev->id, MGMT_OP_BLOCK_DEVICE,
				    MGMT_STATUS_INVALID_PARAMS,
				    &cp->addr, sizeof(cp->addr));
3350

3351
	hci_dev_lock(hdev);
3352

3353
	err = hci_blacklist_add(hdev, &cp->addr.bdaddr, cp->addr.type);
3354
	if (err < 0)
3355
		status = MGMT_STATUS_FAILED;
3356
	else
3357
		status = MGMT_STATUS_SUCCESS;
3358

3359
	err = cmd_complete(sk, hdev->id, MGMT_OP_BLOCK_DEVICE, status,
3360
			   &cp->addr, sizeof(cp->addr));
3361

3362
	hci_dev_unlock(hdev);
3363 3364 3365 3366

	return err;
}

3367
static int unblock_device(struct sock *sk, struct hci_dev *hdev, void *data,
3368
			  u16 len)
3369
{
3370
	struct mgmt_cp_unblock_device *cp = data;
3371
	u8 status;
3372 3373
	int err;

3374
	BT_DBG("%s", hdev->name);
3375

3376
	if (!bdaddr_type_is_valid(cp->addr.type))
3377 3378 3379
		return cmd_complete(sk, hdev->id, MGMT_OP_UNBLOCK_DEVICE,
				    MGMT_STATUS_INVALID_PARAMS,
				    &cp->addr, sizeof(cp->addr));
3380

3381
	hci_dev_lock(hdev);
3382

3383
	err = hci_blacklist_del(hdev, &cp->addr.bdaddr, cp->addr.type);
3384
	if (err < 0)
3385
		status = MGMT_STATUS_INVALID_PARAMS;
3386
	else
3387
		status = MGMT_STATUS_SUCCESS;
3388

3389
	err = cmd_complete(sk, hdev->id, MGMT_OP_UNBLOCK_DEVICE, status,
3390
			   &cp->addr, sizeof(cp->addr));
3391

3392
	hci_dev_unlock(hdev);
3393 3394 3395 3396

	return err;
}

3397 3398 3399 3400
static int set_device_id(struct sock *sk, struct hci_dev *hdev, void *data,
			 u16 len)
{
	struct mgmt_cp_set_device_id *cp = data;
3401
	struct hci_request req;
3402
	int err;
3403
	__u16 source;
3404 3405 3406

	BT_DBG("%s", hdev->name);

3407 3408 3409 3410 3411 3412
	source = __le16_to_cpu(cp->source);

	if (source > 0x0002)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_DEVICE_ID,
				  MGMT_STATUS_INVALID_PARAMS);

3413 3414
	hci_dev_lock(hdev);

3415
	hdev->devid_source = source;
3416 3417 3418 3419 3420 3421
	hdev->devid_vendor = __le16_to_cpu(cp->vendor);
	hdev->devid_product = __le16_to_cpu(cp->product);
	hdev->devid_version = __le16_to_cpu(cp->version);

	err = cmd_complete(sk, hdev->id, MGMT_OP_SET_DEVICE_ID, 0, NULL, 0);

3422 3423 3424
	hci_req_init(&req, hdev);
	update_eir(&req);
	hci_req_run(&req, NULL);
3425 3426 3427 3428 3429 3430

	hci_dev_unlock(hdev);

	return err;
}

3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451
static void set_advertising_complete(struct hci_dev *hdev, u8 status)
{
	struct cmd_lookup match = { NULL, hdev };

	if (status) {
		u8 mgmt_err = mgmt_status(status);

		mgmt_pending_foreach(MGMT_OP_SET_ADVERTISING, hdev,
				     cmd_status_rsp, &mgmt_err);
		return;
	}

	mgmt_pending_foreach(MGMT_OP_SET_ADVERTISING, hdev, settings_rsp,
			     &match);

	new_settings(hdev, match.sk);

	if (match.sk)
		sock_put(match.sk);
}

3452 3453
static int set_advertising(struct sock *sk, struct hci_dev *hdev, void *data,
			   u16 len)
3454 3455 3456 3457
{
	struct mgmt_mode *cp = data;
	struct pending_cmd *cmd;
	struct hci_request req;
3458
	u8 val, enabled, status;
3459 3460 3461 3462
	int err;

	BT_DBG("request for %s", hdev->name);

3463 3464
	status = mgmt_le_support(hdev);
	if (status)
3465
		return cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING,
3466
				  status);
3467 3468 3469 3470 3471 3472 3473 3474

	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING,
				  MGMT_STATUS_INVALID_PARAMS);

	hci_dev_lock(hdev);

	val = !!cp->val;
3475
	enabled = test_bit(HCI_ADVERTISING, &hdev->dev_flags);
3476

3477 3478 3479 3480 3481 3482
	/* The following conditions are ones which mean that we should
	 * not do any HCI communication but directly send a mgmt
	 * response to user space (after toggling the flag if
	 * necessary).
	 */
	if (!hdev_is_powered(hdev) || val == enabled ||
3483
	    hci_conn_num(hdev, LE_LINK) > 0) {
3484 3485
		bool changed = false;

3486 3487
		if (val != test_bit(HCI_ADVERTISING, &hdev->dev_flags)) {
			change_bit(HCI_ADVERTISING, &hdev->dev_flags);
3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515
			changed = true;
		}

		err = send_settings_rsp(sk, MGMT_OP_SET_ADVERTISING, hdev);
		if (err < 0)
			goto unlock;

		if (changed)
			err = new_settings(hdev, sk);

		goto unlock;
	}

	if (mgmt_pending_find(MGMT_OP_SET_ADVERTISING, hdev) ||
	    mgmt_pending_find(MGMT_OP_SET_LE, hdev)) {
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING,
				 MGMT_STATUS_BUSY);
		goto unlock;
	}

	cmd = mgmt_pending_add(sk, MGMT_OP_SET_ADVERTISING, hdev, data, len);
	if (!cmd) {
		err = -ENOMEM;
		goto unlock;
	}

	hci_req_init(&req, hdev);

3516 3517 3518 3519
	if (val)
		enable_advertising(&req);
	else
		disable_advertising(&req);
3520 3521 3522 3523 3524 3525 3526 3527 3528 3529

	err = hci_req_run(&req, set_advertising_complete);
	if (err < 0)
		mgmt_pending_remove(cmd);

unlock:
	hci_dev_unlock(hdev);
	return err;
}

3530 3531 3532 3533 3534 3535 3536 3537
static int set_static_address(struct sock *sk, struct hci_dev *hdev,
			      void *data, u16 len)
{
	struct mgmt_cp_set_static_address *cp = data;
	int err;

	BT_DBG("%s", hdev->name);

3538
	if (!lmp_le_capable(hdev))
3539
		return cmd_status(sk, hdev->id, MGMT_OP_SET_STATIC_ADDRESS,
3540
				  MGMT_STATUS_NOT_SUPPORTED);
3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569

	if (hdev_is_powered(hdev))
		return cmd_status(sk, hdev->id, MGMT_OP_SET_STATIC_ADDRESS,
				  MGMT_STATUS_REJECTED);

	if (bacmp(&cp->bdaddr, BDADDR_ANY)) {
		if (!bacmp(&cp->bdaddr, BDADDR_NONE))
			return cmd_status(sk, hdev->id,
					  MGMT_OP_SET_STATIC_ADDRESS,
					  MGMT_STATUS_INVALID_PARAMS);

		/* Two most significant bits shall be set */
		if ((cp->bdaddr.b[5] & 0xc0) != 0xc0)
			return cmd_status(sk, hdev->id,
					  MGMT_OP_SET_STATIC_ADDRESS,
					  MGMT_STATUS_INVALID_PARAMS);
	}

	hci_dev_lock(hdev);

	bacpy(&hdev->static_addr, &cp->bdaddr);

	err = cmd_complete(sk, hdev->id, MGMT_OP_SET_STATIC_ADDRESS, 0, NULL, 0);

	hci_dev_unlock(hdev);

	return err;
}

3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594
static int set_scan_params(struct sock *sk, struct hci_dev *hdev,
			   void *data, u16 len)
{
	struct mgmt_cp_set_scan_params *cp = data;
	__u16 interval, window;
	int err;

	BT_DBG("%s", hdev->name);

	if (!lmp_le_capable(hdev))
		return cmd_status(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS,
				  MGMT_STATUS_NOT_SUPPORTED);

	interval = __le16_to_cpu(cp->interval);

	if (interval < 0x0004 || interval > 0x4000)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS,
				  MGMT_STATUS_INVALID_PARAMS);

	window = __le16_to_cpu(cp->window);

	if (window < 0x0004 || window > 0x4000)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS,
				  MGMT_STATUS_INVALID_PARAMS);

3595 3596 3597 3598
	if (window > interval)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS,
				  MGMT_STATUS_INVALID_PARAMS);

3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610
	hci_dev_lock(hdev);

	hdev->le_scan_interval = interval;
	hdev->le_scan_window = window;

	err = cmd_complete(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS, 0, NULL, 0);

	hci_dev_unlock(hdev);

	return err;
}

3611 3612 3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626
static void fast_connectable_complete(struct hci_dev *hdev, u8 status)
{
	struct pending_cmd *cmd;

	BT_DBG("status 0x%02x", status);

	hci_dev_lock(hdev);

	cmd = mgmt_pending_find(MGMT_OP_SET_FAST_CONNECTABLE, hdev);
	if (!cmd)
		goto unlock;

	if (status) {
		cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
			   mgmt_status(status));
	} else {
3627 3628 3629 3630 3631 3632 3633
		struct mgmt_mode *cp = cmd->param;

		if (cp->val)
			set_bit(HCI_FAST_CONNECTABLE, &hdev->dev_flags);
		else
			clear_bit(HCI_FAST_CONNECTABLE, &hdev->dev_flags);

3634 3635 3636 3637 3638 3639 3640 3641 3642 3643
		send_settings_rsp(cmd->sk, MGMT_OP_SET_FAST_CONNECTABLE, hdev);
		new_settings(hdev, cmd->sk);
	}

	mgmt_pending_remove(cmd);

unlock:
	hci_dev_unlock(hdev);
}

3644
static int set_fast_connectable(struct sock *sk, struct hci_dev *hdev,
3645
				void *data, u16 len)
3646
{
3647
	struct mgmt_mode *cp = data;
3648 3649
	struct pending_cmd *cmd;
	struct hci_request req;
3650 3651
	int err;

3652
	BT_DBG("%s", hdev->name);
3653

3654 3655
	if (!test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags) ||
	    hdev->hci_ver < BLUETOOTH_VER_1_2)
3656 3657 3658
		return cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
				  MGMT_STATUS_NOT_SUPPORTED);

3659 3660 3661 3662
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
				  MGMT_STATUS_INVALID_PARAMS);

3663
	if (!hdev_is_powered(hdev))
3664
		return cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
3665
				  MGMT_STATUS_NOT_POWERED);
3666 3667

	if (!test_bit(HCI_CONNECTABLE, &hdev->dev_flags))
3668
		return cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
3669
				  MGMT_STATUS_REJECTED);
3670 3671 3672

	hci_dev_lock(hdev);

3673 3674 3675 3676 3677 3678
	if (mgmt_pending_find(MGMT_OP_SET_FAST_CONNECTABLE, hdev)) {
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
				 MGMT_STATUS_BUSY);
		goto unlock;
	}

3679 3680 3681 3682 3683 3684
	if (!!cp->val == test_bit(HCI_FAST_CONNECTABLE, &hdev->dev_flags)) {
		err = send_settings_rsp(sk, MGMT_OP_SET_FAST_CONNECTABLE,
					hdev);
		goto unlock;
	}

3685 3686 3687 3688 3689
	cmd = mgmt_pending_add(sk, MGMT_OP_SET_FAST_CONNECTABLE, hdev,
			       data, len);
	if (!cmd) {
		err = -ENOMEM;
		goto unlock;
3690 3691
	}

3692 3693
	hci_req_init(&req, hdev);

3694
	write_fast_connectable(&req, cp->val);
3695 3696

	err = hci_req_run(&req, fast_connectable_complete);
3697
	if (err < 0) {
3698
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
3699
				 MGMT_STATUS_FAILED);
3700
		mgmt_pending_remove(cmd);
3701 3702
	}

3703
unlock:
3704
	hci_dev_unlock(hdev);
3705

3706 3707 3708
	return err;
}

3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 3728
static void set_bredr_scan(struct hci_request *req)
{
	struct hci_dev *hdev = req->hdev;
	u8 scan = 0;

	/* Ensure that fast connectable is disabled. This function will
	 * not do anything if the page scan parameters are already what
	 * they should be.
	 */
	write_fast_connectable(req, false);

	if (test_bit(HCI_CONNECTABLE, &hdev->dev_flags))
		scan |= SCAN_PAGE;
	if (test_bit(HCI_DISCOVERABLE, &hdev->dev_flags))
		scan |= SCAN_INQUIRY;

	if (scan)
		hci_req_add(req, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);
}

3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 3801 3802 3803 3804 3805 3806 3807 3808 3809 3810 3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 3822 3823 3824 3825 3826
static void set_bredr_complete(struct hci_dev *hdev, u8 status)
{
	struct pending_cmd *cmd;

	BT_DBG("status 0x%02x", status);

	hci_dev_lock(hdev);

	cmd = mgmt_pending_find(MGMT_OP_SET_BREDR, hdev);
	if (!cmd)
		goto unlock;

	if (status) {
		u8 mgmt_err = mgmt_status(status);

		/* We need to restore the flag if related HCI commands
		 * failed.
		 */
		clear_bit(HCI_BREDR_ENABLED, &hdev->dev_flags);

		cmd_status(cmd->sk, cmd->index, cmd->opcode, mgmt_err);
	} else {
		send_settings_rsp(cmd->sk, MGMT_OP_SET_BREDR, hdev);
		new_settings(hdev, cmd->sk);
	}

	mgmt_pending_remove(cmd);

unlock:
	hci_dev_unlock(hdev);
}

static int set_bredr(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
{
	struct mgmt_mode *cp = data;
	struct pending_cmd *cmd;
	struct hci_request req;
	int err;

	BT_DBG("request for %s", hdev->name);

	if (!lmp_bredr_capable(hdev) || !lmp_le_capable(hdev))
		return cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR,
				  MGMT_STATUS_NOT_SUPPORTED);

	if (!test_bit(HCI_LE_ENABLED, &hdev->dev_flags))
		return cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR,
				  MGMT_STATUS_REJECTED);

	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR,
				  MGMT_STATUS_INVALID_PARAMS);

	hci_dev_lock(hdev);

	if (cp->val == test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags)) {
		err = send_settings_rsp(sk, MGMT_OP_SET_BREDR, hdev);
		goto unlock;
	}

	if (!hdev_is_powered(hdev)) {
		if (!cp->val) {
			clear_bit(HCI_DISCOVERABLE, &hdev->dev_flags);
			clear_bit(HCI_SSP_ENABLED, &hdev->dev_flags);
			clear_bit(HCI_LINK_SECURITY, &hdev->dev_flags);
			clear_bit(HCI_FAST_CONNECTABLE, &hdev->dev_flags);
			clear_bit(HCI_HS_ENABLED, &hdev->dev_flags);
		}

		change_bit(HCI_BREDR_ENABLED, &hdev->dev_flags);

		err = send_settings_rsp(sk, MGMT_OP_SET_BREDR, hdev);
		if (err < 0)
			goto unlock;

		err = new_settings(hdev, sk);
		goto unlock;
	}

	/* Reject disabling when powered on */
	if (!cp->val) {
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR,
				 MGMT_STATUS_REJECTED);
		goto unlock;
	}

	if (mgmt_pending_find(MGMT_OP_SET_BREDR, hdev)) {
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR,
				 MGMT_STATUS_BUSY);
		goto unlock;
	}

	cmd = mgmt_pending_add(sk, MGMT_OP_SET_BREDR, hdev, data, len);
	if (!cmd) {
		err = -ENOMEM;
		goto unlock;
	}

3827
	/* We need to flip the bit already here so that update_ad
3828 3829 3830 3831 3832
	 * generates the correct flags.
	 */
	set_bit(HCI_BREDR_ENABLED, &hdev->dev_flags);

	hci_req_init(&req, hdev);
3833 3834 3835 3836

	if (test_bit(HCI_CONNECTABLE, &hdev->dev_flags))
		set_bredr_scan(&req);

3837
	update_ad(&req);
3838

3839 3840 3841 3842 3843 3844 3845 3846 3847
	err = hci_req_run(&req, set_bredr_complete);
	if (err < 0)
		mgmt_pending_remove(cmd);

unlock:
	hci_dev_unlock(hdev);
	return err;
}

3848 3849
static bool ltk_is_valid(struct mgmt_ltk_info *key)
{
3850 3851
	if (key->authenticated != 0x00 && key->authenticated != 0x01)
		return false;
3852 3853
	if (key->master != 0x00 && key->master != 0x01)
		return false;
3854 3855
	if (!bdaddr_type_is_le(key->addr.type))
		return false;
3856 3857 3858
	return true;
}

3859
static int load_long_term_keys(struct sock *sk, struct hci_dev *hdev,
3860
			       void *cp_data, u16 len)
3861 3862 3863
{
	struct mgmt_cp_load_long_term_keys *cp = cp_data;
	u16 key_count, expected_len;
3864
	int i, err;
3865

3866 3867 3868 3869 3870 3871
	BT_DBG("request for %s", hdev->name);

	if (!lmp_le_capable(hdev))
		return cmd_status(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS,
				  MGMT_STATUS_NOT_SUPPORTED);

3872
	key_count = __le16_to_cpu(cp->key_count);
3873 3874 3875 3876 3877

	expected_len = sizeof(*cp) + key_count *
					sizeof(struct mgmt_ltk_info);
	if (expected_len != len) {
		BT_ERR("load_keys: expected %u bytes, got %u bytes",
3878
		       len, expected_len);
3879
		return cmd_status(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS,
3880
				  MGMT_STATUS_INVALID_PARAMS);
3881 3882
	}

3883
	BT_DBG("%s key_count %u", hdev->name, key_count);
3884

3885 3886 3887
	for (i = 0; i < key_count; i++) {
		struct mgmt_ltk_info *key = &cp->keys[i];

3888
		if (!ltk_is_valid(key))
3889 3890 3891 3892 3893
			return cmd_status(sk, hdev->id,
					  MGMT_OP_LOAD_LONG_TERM_KEYS,
					  MGMT_STATUS_INVALID_PARAMS);
	}

3894 3895 3896 3897 3898 3899
	hci_dev_lock(hdev);

	hci_smp_ltks_clear(hdev);

	for (i = 0; i < key_count; i++) {
		struct mgmt_ltk_info *key = &cp->keys[i];
3900 3901 3902 3903 3904 3905
		u8 type, addr_type;

		if (key->addr.type == BDADDR_LE_PUBLIC)
			addr_type = ADDR_LE_DEV_PUBLIC;
		else
			addr_type = ADDR_LE_DEV_RANDOM;
3906 3907 3908 3909 3910 3911

		if (key->master)
			type = HCI_SMP_LTK;
		else
			type = HCI_SMP_LTK_SLAVE;

3912
		hci_add_ltk(hdev, &key->addr.bdaddr, addr_type,
3913 3914
			    type, 0, key->authenticated, key->val,
			    key->enc_size, key->ediv, key->rand);
3915 3916
	}

3917 3918 3919
	err = cmd_complete(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS, 0,
			   NULL, 0);

3920 3921
	hci_dev_unlock(hdev);

3922
	return err;
3923 3924
}

3925
static const struct mgmt_handler {
3926 3927
	int (*func) (struct sock *sk, struct hci_dev *hdev, void *data,
		     u16 data_len);
3928 3929
	bool var_len;
	size_t data_len;
3930 3931
} mgmt_handlers[] = {
	{ NULL }, /* 0x0000 (no command) */
3932 3933 3934 3935 3936 3937 3938 3939 3940 3941 3942 3943 3944 3945 3946 3947 3948 3949 3950 3951 3952 3953 3954 3955 3956 3957 3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970
	{ read_version,           false, MGMT_READ_VERSION_SIZE },
	{ read_commands,          false, MGMT_READ_COMMANDS_SIZE },
	{ read_index_list,        false, MGMT_READ_INDEX_LIST_SIZE },
	{ read_controller_info,   false, MGMT_READ_INFO_SIZE },
	{ set_powered,            false, MGMT_SETTING_SIZE },
	{ set_discoverable,       false, MGMT_SET_DISCOVERABLE_SIZE },
	{ set_connectable,        false, MGMT_SETTING_SIZE },
	{ set_fast_connectable,   false, MGMT_SETTING_SIZE },
	{ set_pairable,           false, MGMT_SETTING_SIZE },
	{ set_link_security,      false, MGMT_SETTING_SIZE },
	{ set_ssp,                false, MGMT_SETTING_SIZE },
	{ set_hs,                 false, MGMT_SETTING_SIZE },
	{ set_le,                 false, MGMT_SETTING_SIZE },
	{ set_dev_class,          false, MGMT_SET_DEV_CLASS_SIZE },
	{ set_local_name,         false, MGMT_SET_LOCAL_NAME_SIZE },
	{ add_uuid,               false, MGMT_ADD_UUID_SIZE },
	{ remove_uuid,            false, MGMT_REMOVE_UUID_SIZE },
	{ load_link_keys,         true,  MGMT_LOAD_LINK_KEYS_SIZE },
	{ load_long_term_keys,    true,  MGMT_LOAD_LONG_TERM_KEYS_SIZE },
	{ disconnect,             false, MGMT_DISCONNECT_SIZE },
	{ get_connections,        false, MGMT_GET_CONNECTIONS_SIZE },
	{ pin_code_reply,         false, MGMT_PIN_CODE_REPLY_SIZE },
	{ pin_code_neg_reply,     false, MGMT_PIN_CODE_NEG_REPLY_SIZE },
	{ set_io_capability,      false, MGMT_SET_IO_CAPABILITY_SIZE },
	{ pair_device,            false, MGMT_PAIR_DEVICE_SIZE },
	{ cancel_pair_device,     false, MGMT_CANCEL_PAIR_DEVICE_SIZE },
	{ unpair_device,          false, MGMT_UNPAIR_DEVICE_SIZE },
	{ user_confirm_reply,     false, MGMT_USER_CONFIRM_REPLY_SIZE },
	{ user_confirm_neg_reply, false, MGMT_USER_CONFIRM_NEG_REPLY_SIZE },
	{ user_passkey_reply,     false, MGMT_USER_PASSKEY_REPLY_SIZE },
	{ user_passkey_neg_reply, false, MGMT_USER_PASSKEY_NEG_REPLY_SIZE },
	{ read_local_oob_data,    false, MGMT_READ_LOCAL_OOB_DATA_SIZE },
	{ add_remote_oob_data,    false, MGMT_ADD_REMOTE_OOB_DATA_SIZE },
	{ remove_remote_oob_data, false, MGMT_REMOVE_REMOTE_OOB_DATA_SIZE },
	{ start_discovery,        false, MGMT_START_DISCOVERY_SIZE },
	{ stop_discovery,         false, MGMT_STOP_DISCOVERY_SIZE },
	{ confirm_name,           false, MGMT_CONFIRM_NAME_SIZE },
	{ block_device,           false, MGMT_BLOCK_DEVICE_SIZE },
	{ unblock_device,         false, MGMT_UNBLOCK_DEVICE_SIZE },
3971
	{ set_device_id,          false, MGMT_SET_DEVICE_ID_SIZE },
3972
	{ set_advertising,        false, MGMT_SETTING_SIZE },
3973
	{ set_bredr,              false, MGMT_SETTING_SIZE },
3974
	{ set_static_address,     false, MGMT_SET_STATIC_ADDRESS_SIZE },
3975
	{ set_scan_params,        false, MGMT_SET_SCAN_PARAMS_SIZE },
3976 3977 3978
};


3979 3980
int mgmt_control(struct sock *sk, struct msghdr *msg, size_t msglen)
{
3981 3982
	void *buf;
	u8 *cp;
3983
	struct mgmt_hdr *hdr;
3984
	u16 opcode, index, len;
3985
	struct hci_dev *hdev = NULL;
3986
	const struct mgmt_handler *handler;
3987 3988 3989 3990 3991 3992 3993
	int err;

	BT_DBG("got %zu bytes", msglen);

	if (msglen < sizeof(*hdr))
		return -EINVAL;

3994
	buf = kmalloc(msglen, GFP_KERNEL);
3995 3996 3997 3998 3999 4000 4001 4002
	if (!buf)
		return -ENOMEM;

	if (memcpy_fromiovec(buf, msg->msg_iov, msglen)) {
		err = -EFAULT;
		goto done;
	}

4003
	hdr = buf;
4004 4005 4006
	opcode = __le16_to_cpu(hdr->opcode);
	index = __le16_to_cpu(hdr->index);
	len = __le16_to_cpu(hdr->len);
4007 4008 4009 4010 4011 4012

	if (len != msglen - sizeof(*hdr)) {
		err = -EINVAL;
		goto done;
	}

4013
	if (index != MGMT_INDEX_NONE) {
4014 4015 4016
		hdev = hci_dev_get(index);
		if (!hdev) {
			err = cmd_status(sk, index, opcode,
4017
					 MGMT_STATUS_INVALID_INDEX);
4018 4019
			goto done;
		}
4020

4021 4022
		if (test_bit(HCI_SETUP, &hdev->dev_flags) ||
		    test_bit(HCI_USER_CHANNEL, &hdev->dev_flags)) {
4023 4024 4025 4026
			err = cmd_status(sk, index, opcode,
					 MGMT_STATUS_INVALID_INDEX);
			goto done;
		}
4027 4028
	}

4029
	if (opcode >= ARRAY_SIZE(mgmt_handlers) ||
4030
	    mgmt_handlers[opcode].func == NULL) {
4031
		BT_DBG("Unknown op %u", opcode);
4032
		err = cmd_status(sk, index, opcode,
4033
				 MGMT_STATUS_UNKNOWN_COMMAND);
4034 4035 4036 4037
		goto done;
	}

	if ((hdev && opcode < MGMT_OP_READ_INFO) ||
4038
	    (!hdev && opcode >= MGMT_OP_READ_INFO)) {
4039
		err = cmd_status(sk, index, opcode,
4040
				 MGMT_STATUS_INVALID_INDEX);
4041
		goto done;
4042 4043
	}

4044 4045 4046
	handler = &mgmt_handlers[opcode];

	if ((handler->var_len && len < handler->data_len) ||
4047
	    (!handler->var_len && len != handler->data_len)) {
4048
		err = cmd_status(sk, index, opcode,
4049
				 MGMT_STATUS_INVALID_PARAMS);
4050 4051 4052
		goto done;
	}

4053 4054 4055 4056 4057
	if (hdev)
		mgmt_init_hdev(sk, hdev);

	cp = buf + sizeof(*hdr);

4058
	err = handler->func(sk, hdev, cp, len);
4059 4060 4061
	if (err < 0)
		goto done;

4062 4063 4064
	err = msglen;

done:
4065 4066 4067
	if (hdev)
		hci_dev_put(hdev);

4068 4069 4070
	kfree(buf);
	return err;
}
4071

4072
void mgmt_index_added(struct hci_dev *hdev)
4073
{
4074
	if (hdev->dev_type != HCI_BREDR)
4075
		return;
4076

4077
	mgmt_event(MGMT_EV_INDEX_ADDED, hdev, NULL, 0, NULL);
4078 4079
}

4080
void mgmt_index_removed(struct hci_dev *hdev)
4081
{
4082
	u8 status = MGMT_STATUS_INVALID_INDEX;
4083

4084
	if (hdev->dev_type != HCI_BREDR)
4085
		return;
4086

4087
	mgmt_pending_foreach(0, hdev, cmd_status_rsp, &status);
4088

4089
	mgmt_event(MGMT_EV_INDEX_REMOVED, hdev, NULL, 0, NULL);
4090 4091
}

4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 4103 4104 4105 4106 4107 4108 4109
static void powered_complete(struct hci_dev *hdev, u8 status)
{
	struct cmd_lookup match = { NULL, hdev };

	BT_DBG("status 0x%02x", status);

	hci_dev_lock(hdev);

	mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, settings_rsp, &match);

	new_settings(hdev, match.sk);

	hci_dev_unlock(hdev);

	if (match.sk)
		sock_put(match.sk);
}

4110
static int powered_update_hci(struct hci_dev *hdev)
4111
{
4112
	struct hci_request req;
4113
	u8 link_sec;
4114

4115 4116
	hci_req_init(&req, hdev);

4117 4118 4119
	if (test_bit(HCI_SSP_ENABLED, &hdev->dev_flags) &&
	    !lmp_host_ssp_capable(hdev)) {
		u8 ssp = 1;
4120

4121
		hci_req_add(&req, HCI_OP_WRITE_SSP_MODE, 1, &ssp);
4122
	}
4123

4124 4125
	if (test_bit(HCI_LE_ENABLED, &hdev->dev_flags) &&
	    lmp_bredr_capable(hdev)) {
4126
		struct hci_cp_write_le_host_supported cp;
4127

4128 4129
		cp.le = 1;
		cp.simul = lmp_le_br_capable(hdev);
4130

4131 4132 4133 4134 4135
		/* Check first if we already have the right
		 * host state (host features set)
		 */
		if (cp.le != lmp_host_le_capable(hdev) ||
		    cp.simul != lmp_host_le_br_capable(hdev))
4136 4137
			hci_req_add(&req, HCI_OP_WRITE_LE_HOST_SUPPORTED,
				    sizeof(cp), &cp);
4138
	}
4139

4140 4141 4142 4143 4144
	if (lmp_le_capable(hdev)) {
		/* Set random address to static address if configured */
		if (bacmp(&hdev->static_addr, BDADDR_ANY))
			hci_req_add(&req, HCI_OP_LE_SET_RANDOM_ADDR, 6,
				    &hdev->static_addr);
4145

4146 4147 4148 4149 4150 4151 4152
		/* Make sure the controller has a good default for
		 * advertising data. This also applies to the case
		 * where BR/EDR was toggled during the AUTO_OFF phase.
		 */
		if (test_bit(HCI_LE_ENABLED, &hdev->dev_flags))
			update_ad(&req);

4153 4154
		if (test_bit(HCI_ADVERTISING, &hdev->dev_flags))
			enable_advertising(&req);
4155 4156
	}

4157 4158
	link_sec = test_bit(HCI_LINK_SECURITY, &hdev->dev_flags);
	if (link_sec != test_bit(HCI_AUTH, &hdev->flags))
4159 4160
		hci_req_add(&req, HCI_OP_WRITE_AUTH_ENABLE,
			    sizeof(link_sec), &link_sec);
4161

4162
	if (lmp_bredr_capable(hdev)) {
4163 4164
		if (test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags))
			set_bredr_scan(&req);
4165
		update_class(&req);
4166
		update_name(&req);
4167
		update_eir(&req);
4168
	}
4169

4170
	return hci_req_run(&req, powered_complete);
4171
}
4172

4173 4174 4175
int mgmt_powered(struct hci_dev *hdev, u8 powered)
{
	struct cmd_lookup match = { NULL, hdev };
4176 4177
	u8 status_not_powered = MGMT_STATUS_NOT_POWERED;
	u8 zero_cod[] = { 0, 0, 0 };
4178
	int err;
4179

4180 4181 4182 4183
	if (!test_bit(HCI_MGMT, &hdev->dev_flags))
		return 0;

	if (powered) {
4184 4185
		if (powered_update_hci(hdev) == 0)
			return 0;
4186

4187 4188 4189
		mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, settings_rsp,
				     &match);
		goto new_settings;
4190 4191
	}

4192 4193 4194 4195 4196 4197 4198 4199
	mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, settings_rsp, &match);
	mgmt_pending_foreach(0, hdev, cmd_status_rsp, &status_not_powered);

	if (memcmp(hdev->dev_class, zero_cod, sizeof(zero_cod)) != 0)
		mgmt_event(MGMT_EV_CLASS_OF_DEV_CHANGED, hdev,
			   zero_cod, sizeof(zero_cod), NULL);

new_settings:
4200
	err = new_settings(hdev, match.sk);
4201 4202 4203 4204

	if (match.sk)
		sock_put(match.sk);

4205
	return err;
4206
}
4207

4208
void mgmt_set_powered_failed(struct hci_dev *hdev, int err)
4209 4210 4211 4212 4213 4214
{
	struct pending_cmd *cmd;
	u8 status;

	cmd = mgmt_pending_find(MGMT_OP_SET_POWERED, hdev);
	if (!cmd)
4215
		return;
4216 4217 4218 4219 4220 4221

	if (err == -ERFKILL)
		status = MGMT_STATUS_RFKILLED;
	else
		status = MGMT_STATUS_FAILED;

4222
	cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_POWERED, status);
4223 4224 4225 4226

	mgmt_pending_remove(cmd);
}

4227
int mgmt_discoverable(struct hci_dev *hdev, u8 discoverable)
4228
{
4229 4230
	bool changed = false;
	int err = 0;
4231

4232 4233 4234 4235 4236 4237 4238
	/* Nothing needed here if there's a pending command since that
	 * commands request completion callback takes care of everything
	 * necessary.
	 */
	if (mgmt_pending_find(MGMT_OP_SET_DISCOVERABLE, hdev))
		return 0;

4239 4240 4241 4242 4243 4244 4245
	if (discoverable) {
		if (!test_and_set_bit(HCI_DISCOVERABLE, &hdev->dev_flags))
			changed = true;
	} else {
		if (test_and_clear_bit(HCI_DISCOVERABLE, &hdev->dev_flags))
			changed = true;
	}
4246

4247
	if (changed)
4248
		err = new_settings(hdev, NULL);
4249

4250
	return err;
4251
}
4252

4253
int mgmt_connectable(struct hci_dev *hdev, u8 connectable)
4254
{
4255 4256
	bool changed = false;
	int err = 0;
4257

4258 4259 4260 4261 4262 4263 4264
	/* Nothing needed here if there's a pending command since that
	 * commands request completion callback takes care of everything
	 * necessary.
	 */
	if (mgmt_pending_find(MGMT_OP_SET_CONNECTABLE, hdev))
		return 0;

4265 4266 4267 4268 4269 4270 4271
	if (connectable) {
		if (!test_and_set_bit(HCI_CONNECTABLE, &hdev->dev_flags))
			changed = true;
	} else {
		if (test_and_clear_bit(HCI_CONNECTABLE, &hdev->dev_flags))
			changed = true;
	}
4272

4273
	if (changed)
4274
		err = new_settings(hdev, NULL);
4275

4276
	return err;
4277
}
4278

4279
int mgmt_write_scan_failed(struct hci_dev *hdev, u8 scan, u8 status)
4280
{
4281 4282
	u8 mgmt_err = mgmt_status(status);

4283
	if (scan & SCAN_PAGE)
4284
		mgmt_pending_foreach(MGMT_OP_SET_CONNECTABLE, hdev,
4285
				     cmd_status_rsp, &mgmt_err);
4286 4287

	if (scan & SCAN_INQUIRY)
4288
		mgmt_pending_foreach(MGMT_OP_SET_DISCOVERABLE, hdev,
4289
				     cmd_status_rsp, &mgmt_err);
4290 4291 4292 4293

	return 0;
}

4294 4295
int mgmt_new_link_key(struct hci_dev *hdev, struct link_key *key,
		      bool persistent)
4296
{
4297
	struct mgmt_ev_new_link_key ev;
4298

4299
	memset(&ev, 0, sizeof(ev));
4300

4301
	ev.store_hint = persistent;
4302
	bacpy(&ev.key.addr.bdaddr, &key->bdaddr);
4303
	ev.key.addr.type = BDADDR_BREDR;
4304
	ev.key.type = key->type;
4305
	memcpy(ev.key.val, key->val, HCI_LINK_KEY_SIZE);
4306
	ev.key.pin_len = key->pin_len;
4307

4308
	return mgmt_event(MGMT_EV_NEW_LINK_KEY, hdev, &ev, sizeof(ev), NULL);
4309
}
4310

4311 4312 4313 4314 4315 4316 4317 4318
int mgmt_new_ltk(struct hci_dev *hdev, struct smp_ltk *key, u8 persistent)
{
	struct mgmt_ev_new_long_term_key ev;

	memset(&ev, 0, sizeof(ev));

	ev.store_hint = persistent;
	bacpy(&ev.key.addr.bdaddr, &key->bdaddr);
4319
	ev.key.addr.type = link_to_bdaddr(LE_LINK, key->bdaddr_type);
4320 4321 4322 4323 4324 4325 4326 4327 4328 4329
	ev.key.authenticated = key->authenticated;
	ev.key.enc_size = key->enc_size;
	ev.key.ediv = key->ediv;

	if (key->type == HCI_SMP_LTK)
		ev.key.master = 1;

	memcpy(ev.key.rand, key->rand, sizeof(key->rand));
	memcpy(ev.key.val, key->val, sizeof(key->val));

4330 4331
	return mgmt_event(MGMT_EV_NEW_LONG_TERM_KEY, hdev, &ev, sizeof(ev),
			  NULL);
4332 4333
}

4334 4335 4336
void mgmt_device_connected(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
			   u8 addr_type, u32 flags, u8 *name, u8 name_len,
			   u8 *dev_class)
4337
{
4338 4339 4340
	char buf[512];
	struct mgmt_ev_device_connected *ev = (void *) buf;
	u16 eir_len = 0;
4341

4342
	bacpy(&ev->addr.bdaddr, bdaddr);
4343
	ev->addr.type = link_to_bdaddr(link_type, addr_type);
4344

4345
	ev->flags = __cpu_to_le32(flags);
4346

4347 4348
	if (name_len > 0)
		eir_len = eir_append_data(ev->eir, 0, EIR_NAME_COMPLETE,
4349
					  name, name_len);
4350 4351

	if (dev_class && memcmp(dev_class, "\0\0\0", 3) != 0)
4352
		eir_len = eir_append_data(ev->eir, eir_len,
4353
					  EIR_CLASS_OF_DEV, dev_class, 3);
4354

4355
	ev->eir_len = cpu_to_le16(eir_len);
4356

4357 4358
	mgmt_event(MGMT_EV_DEVICE_CONNECTED, hdev, buf,
		    sizeof(*ev) + eir_len, NULL);
4359 4360
}

4361 4362
static void disconnect_rsp(struct pending_cmd *cmd, void *data)
{
4363
	struct mgmt_cp_disconnect *cp = cmd->param;
4364
	struct sock **sk = data;
4365
	struct mgmt_rp_disconnect rp;
4366

4367 4368
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;
4369

4370
	cmd_complete(cmd->sk, cmd->index, MGMT_OP_DISCONNECT, 0, &rp,
4371
		     sizeof(rp));
4372 4373 4374 4375

	*sk = cmd->sk;
	sock_hold(*sk);

4376
	mgmt_pending_remove(cmd);
4377 4378
}

4379
static void unpair_device_rsp(struct pending_cmd *cmd, void *data)
4380
{
4381
	struct hci_dev *hdev = data;
4382 4383
	struct mgmt_cp_unpair_device *cp = cmd->param;
	struct mgmt_rp_unpair_device rp;
4384 4385

	memset(&rp, 0, sizeof(rp));
4386 4387
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;
4388

4389 4390
	device_unpaired(hdev, &cp->addr.bdaddr, cp->addr.type, cmd->sk);

4391
	cmd_complete(cmd->sk, cmd->index, cmd->opcode, 0, &rp, sizeof(rp));
4392 4393 4394 4395

	mgmt_pending_remove(cmd);
}

4396 4397
void mgmt_device_disconnected(struct hci_dev *hdev, bdaddr_t *bdaddr,
			      u8 link_type, u8 addr_type, u8 reason)
4398
{
4399
	struct mgmt_ev_device_disconnected ev;
4400 4401
	struct sock *sk = NULL;

4402
	mgmt_pending_foreach(MGMT_OP_DISCONNECT, hdev, disconnect_rsp, &sk);
4403

4404 4405 4406
	bacpy(&ev.addr.bdaddr, bdaddr);
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
	ev.reason = reason;
4407

4408
	mgmt_event(MGMT_EV_DEVICE_DISCONNECTED, hdev, &ev, sizeof(ev), sk);
4409 4410

	if (sk)
4411
		sock_put(sk);
4412

4413
	mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE, hdev, unpair_device_rsp,
4414
			     hdev);
4415 4416
}

4417 4418
void mgmt_disconnect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr,
			    u8 link_type, u8 addr_type, u8 status)
4419
{
4420
	struct mgmt_rp_disconnect rp;
4421 4422
	struct pending_cmd *cmd;

4423 4424 4425
	mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE, hdev, unpair_device_rsp,
			     hdev);

4426
	cmd = mgmt_pending_find(MGMT_OP_DISCONNECT, hdev);
4427
	if (!cmd)
4428
		return;
4429

4430
	bacpy(&rp.addr.bdaddr, bdaddr);
4431
	rp.addr.type = link_to_bdaddr(link_type, addr_type);
4432

4433 4434
	cmd_complete(cmd->sk, cmd->index, MGMT_OP_DISCONNECT,
		     mgmt_status(status), &rp, sizeof(rp));
4435

4436
	mgmt_pending_remove(cmd);
4437
}
4438

4439 4440
void mgmt_connect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
			 u8 addr_type, u8 status)
4441 4442 4443
{
	struct mgmt_ev_connect_failed ev;

4444
	bacpy(&ev.addr.bdaddr, bdaddr);
4445
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
4446
	ev.status = mgmt_status(status);
4447

4448
	mgmt_event(MGMT_EV_CONNECT_FAILED, hdev, &ev, sizeof(ev), NULL);
4449
}
4450

4451
int mgmt_pin_code_request(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 secure)
4452 4453 4454
{
	struct mgmt_ev_pin_code_request ev;

4455
	bacpy(&ev.addr.bdaddr, bdaddr);
4456
	ev.addr.type = BDADDR_BREDR;
4457
	ev.secure = secure;
4458

4459
	return mgmt_event(MGMT_EV_PIN_CODE_REQUEST, hdev, &ev, sizeof(ev),
4460
			  NULL);
4461 4462
}

4463
int mgmt_pin_code_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
4464
				 u8 status)
4465 4466
{
	struct pending_cmd *cmd;
4467
	struct mgmt_rp_pin_code_reply rp;
4468 4469
	int err;

4470
	cmd = mgmt_pending_find(MGMT_OP_PIN_CODE_REPLY, hdev);
4471 4472 4473
	if (!cmd)
		return -ENOENT;

4474
	bacpy(&rp.addr.bdaddr, bdaddr);
4475
	rp.addr.type = BDADDR_BREDR;
4476

4477
	err = cmd_complete(cmd->sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
4478
			   mgmt_status(status), &rp, sizeof(rp));
4479

4480
	mgmt_pending_remove(cmd);
4481 4482 4483 4484

	return err;
}

4485
int mgmt_pin_code_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
4486
				     u8 status)
4487 4488
{
	struct pending_cmd *cmd;
4489
	struct mgmt_rp_pin_code_reply rp;
4490 4491
	int err;

4492
	cmd = mgmt_pending_find(MGMT_OP_PIN_CODE_NEG_REPLY, hdev);
4493 4494 4495
	if (!cmd)
		return -ENOENT;

4496
	bacpy(&rp.addr.bdaddr, bdaddr);
4497
	rp.addr.type = BDADDR_BREDR;
4498

4499
	err = cmd_complete(cmd->sk, hdev->id, MGMT_OP_PIN_CODE_NEG_REPLY,
4500
			   mgmt_status(status), &rp, sizeof(rp));
4501

4502
	mgmt_pending_remove(cmd);
4503 4504 4505

	return err;
}
4506

4507
int mgmt_user_confirm_request(struct hci_dev *hdev, bdaddr_t *bdaddr,
4508 4509
			      u8 link_type, u8 addr_type, __le32 value,
			      u8 confirm_hint)
4510 4511 4512
{
	struct mgmt_ev_user_confirm_request ev;

4513
	BT_DBG("%s", hdev->name);
4514

4515
	bacpy(&ev.addr.bdaddr, bdaddr);
4516
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
4517
	ev.confirm_hint = confirm_hint;
4518
	ev.value = value;
4519

4520
	return mgmt_event(MGMT_EV_USER_CONFIRM_REQUEST, hdev, &ev, sizeof(ev),
4521
			  NULL);
4522 4523
}

4524
int mgmt_user_passkey_request(struct hci_dev *hdev, bdaddr_t *bdaddr,
4525
			      u8 link_type, u8 addr_type)
4526 4527 4528 4529 4530
{
	struct mgmt_ev_user_passkey_request ev;

	BT_DBG("%s", hdev->name);

4531
	bacpy(&ev.addr.bdaddr, bdaddr);
4532
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
4533 4534

	return mgmt_event(MGMT_EV_USER_PASSKEY_REQUEST, hdev, &ev, sizeof(ev),
4535
			  NULL);
4536 4537
}

4538
static int user_pairing_resp_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
4539 4540
				      u8 link_type, u8 addr_type, u8 status,
				      u8 opcode)
4541 4542 4543 4544 4545
{
	struct pending_cmd *cmd;
	struct mgmt_rp_user_confirm_reply rp;
	int err;

4546
	cmd = mgmt_pending_find(opcode, hdev);
4547 4548 4549
	if (!cmd)
		return -ENOENT;

4550
	bacpy(&rp.addr.bdaddr, bdaddr);
4551
	rp.addr.type = link_to_bdaddr(link_type, addr_type);
4552
	err = cmd_complete(cmd->sk, hdev->id, opcode, mgmt_status(status),
4553
			   &rp, sizeof(rp));
4554

4555
	mgmt_pending_remove(cmd);
4556 4557 4558 4559

	return err;
}

4560
int mgmt_user_confirm_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
4561
				     u8 link_type, u8 addr_type, u8 status)
4562
{
4563
	return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
4564
					  status, MGMT_OP_USER_CONFIRM_REPLY);
4565 4566
}

4567
int mgmt_user_confirm_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
4568
					 u8 link_type, u8 addr_type, u8 status)
4569
{
4570
	return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
4571 4572
					  status,
					  MGMT_OP_USER_CONFIRM_NEG_REPLY);
4573
}
4574

4575
int mgmt_user_passkey_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
4576
				     u8 link_type, u8 addr_type, u8 status)
4577
{
4578
	return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
4579
					  status, MGMT_OP_USER_PASSKEY_REPLY);
4580 4581
}

4582
int mgmt_user_passkey_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
4583
					 u8 link_type, u8 addr_type, u8 status)
4584
{
4585
	return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
4586 4587
					  status,
					  MGMT_OP_USER_PASSKEY_NEG_REPLY);
4588 4589
}

4590 4591 4592 4593 4594 4595 4596 4597 4598 4599 4600 4601 4602 4603 4604 4605
int mgmt_user_passkey_notify(struct hci_dev *hdev, bdaddr_t *bdaddr,
			     u8 link_type, u8 addr_type, u32 passkey,
			     u8 entered)
{
	struct mgmt_ev_passkey_notify ev;

	BT_DBG("%s", hdev->name);

	bacpy(&ev.addr.bdaddr, bdaddr);
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
	ev.passkey = __cpu_to_le32(passkey);
	ev.entered = entered;

	return mgmt_event(MGMT_EV_PASSKEY_NOTIFY, hdev, &ev, sizeof(ev), NULL);
}

4606
int mgmt_auth_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
4607
		     u8 addr_type, u8 status)
4608 4609 4610
{
	struct mgmt_ev_auth_failed ev;

4611
	bacpy(&ev.addr.bdaddr, bdaddr);
4612
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
4613
	ev.status = mgmt_status(status);
4614

4615
	return mgmt_event(MGMT_EV_AUTH_FAILED, hdev, &ev, sizeof(ev), NULL);
4616
}
4617

4618 4619 4620
int mgmt_auth_enable_complete(struct hci_dev *hdev, u8 status)
{
	struct cmd_lookup match = { NULL, hdev };
4621 4622
	bool changed = false;
	int err = 0;
4623 4624 4625 4626

	if (status) {
		u8 mgmt_err = mgmt_status(status);
		mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev,
4627
				     cmd_status_rsp, &mgmt_err);
4628 4629 4630
		return 0;
	}

4631 4632 4633 4634 4635 4636 4637 4638
	if (test_bit(HCI_AUTH, &hdev->flags)) {
		if (!test_and_set_bit(HCI_LINK_SECURITY, &hdev->dev_flags))
			changed = true;
	} else {
		if (test_and_clear_bit(HCI_LINK_SECURITY, &hdev->dev_flags))
			changed = true;
	}

4639
	mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev, settings_rsp,
4640
			     &match);
4641

4642 4643
	if (changed)
		err = new_settings(hdev, match.sk);
4644 4645 4646 4647 4648 4649 4650

	if (match.sk)
		sock_put(match.sk);

	return err;
}

4651
static void clear_eir(struct hci_request *req)
4652
{
4653
	struct hci_dev *hdev = req->hdev;
4654 4655
	struct hci_cp_write_eir cp;

4656
	if (!lmp_ext_inq_capable(hdev))
4657
		return;
4658

4659 4660
	memset(hdev->eir, 0, sizeof(hdev->eir));

4661 4662
	memset(&cp, 0, sizeof(cp));

4663
	hci_req_add(req, HCI_OP_WRITE_EIR, sizeof(cp), &cp);
4664 4665
}

4666
int mgmt_ssp_enable_complete(struct hci_dev *hdev, u8 enable, u8 status)
4667 4668
{
	struct cmd_lookup match = { NULL, hdev };
4669
	struct hci_request req;
4670 4671
	bool changed = false;
	int err = 0;
4672 4673 4674

	if (status) {
		u8 mgmt_err = mgmt_status(status);
4675 4676

		if (enable && test_and_clear_bit(HCI_SSP_ENABLED,
4677 4678
						 &hdev->dev_flags)) {
			clear_bit(HCI_HS_ENABLED, &hdev->dev_flags);
4679
			err = new_settings(hdev, NULL);
4680
		}
4681

4682 4683
		mgmt_pending_foreach(MGMT_OP_SET_SSP, hdev, cmd_status_rsp,
				     &mgmt_err);
4684 4685 4686 4687 4688

		return err;
	}

	if (enable) {
4689
		changed = !test_and_set_bit(HCI_SSP_ENABLED, &hdev->dev_flags);
4690
	} else {
4691 4692 4693 4694 4695 4696
		changed = test_and_clear_bit(HCI_SSP_ENABLED, &hdev->dev_flags);
		if (!changed)
			changed = test_and_clear_bit(HCI_HS_ENABLED,
						     &hdev->dev_flags);
		else
			clear_bit(HCI_HS_ENABLED, &hdev->dev_flags);
4697 4698 4699 4700
	}

	mgmt_pending_foreach(MGMT_OP_SET_SSP, hdev, settings_rsp, &match);

4701 4702
	if (changed)
		err = new_settings(hdev, match.sk);
4703

4704
	if (match.sk)
4705 4706
		sock_put(match.sk);

4707 4708
	hci_req_init(&req, hdev);

4709
	if (test_bit(HCI_SSP_ENABLED, &hdev->dev_flags))
4710
		update_eir(&req);
4711
	else
4712 4713 4714
		clear_eir(&req);

	hci_req_run(&req, NULL);
4715

4716 4717 4718
	return err;
}

4719
static void sk_lookup(struct pending_cmd *cmd, void *data)
4720 4721 4722 4723 4724 4725 4726 4727 4728
{
	struct cmd_lookup *match = data;

	if (match->sk == NULL) {
		match->sk = cmd->sk;
		sock_hold(match->sk);
	}
}

4729
int mgmt_set_class_of_dev_complete(struct hci_dev *hdev, u8 *dev_class,
4730
				   u8 status)
4731
{
4732 4733
	struct cmd_lookup match = { NULL, hdev, mgmt_status(status) };
	int err = 0;
4734

4735 4736 4737
	mgmt_pending_foreach(MGMT_OP_SET_DEV_CLASS, hdev, sk_lookup, &match);
	mgmt_pending_foreach(MGMT_OP_ADD_UUID, hdev, sk_lookup, &match);
	mgmt_pending_foreach(MGMT_OP_REMOVE_UUID, hdev, sk_lookup, &match);
4738 4739

	if (!status)
4740 4741
		err = mgmt_event(MGMT_EV_CLASS_OF_DEV_CHANGED, hdev, dev_class,
				 3, NULL);
4742 4743 4744

	if (match.sk)
		sock_put(match.sk);
4745 4746 4747 4748

	return err;
}

4749
int mgmt_set_local_name_complete(struct hci_dev *hdev, u8 *name, u8 status)
4750 4751
{
	struct mgmt_cp_set_local_name ev;
4752
	struct pending_cmd *cmd;
4753

4754 4755
	if (status)
		return 0;
4756 4757 4758

	memset(&ev, 0, sizeof(ev));
	memcpy(ev.name, name, HCI_MAX_NAME_LENGTH);
4759
	memcpy(ev.short_name, hdev->short_name, HCI_MAX_SHORT_NAME_LENGTH);
4760

4761
	cmd = mgmt_pending_find(MGMT_OP_SET_LOCAL_NAME, hdev);
4762 4763
	if (!cmd) {
		memcpy(hdev->dev_name, name, sizeof(hdev->dev_name));
4764

4765 4766 4767 4768 4769
		/* If this is a HCI command related to powering on the
		 * HCI dev don't send any mgmt signals.
		 */
		if (mgmt_pending_find(MGMT_OP_SET_POWERED, hdev))
			return 0;
4770
	}
4771

4772 4773
	return mgmt_event(MGMT_EV_LOCAL_NAME_CHANGED, hdev, &ev, sizeof(ev),
			  cmd ? cmd->sk : NULL);
4774
}
4775

4776
int mgmt_read_local_oob_data_reply_complete(struct hci_dev *hdev, u8 *hash,
4777
					    u8 *randomizer, u8 status)
4778 4779 4780 4781
{
	struct pending_cmd *cmd;
	int err;

4782
	BT_DBG("%s status %u", hdev->name, status);
4783

4784
	cmd = mgmt_pending_find(MGMT_OP_READ_LOCAL_OOB_DATA, hdev);
4785 4786 4787 4788
	if (!cmd)
		return -ENOENT;

	if (status) {
4789 4790
		err = cmd_status(cmd->sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
				 mgmt_status(status));
4791 4792 4793 4794 4795 4796
	} else {
		struct mgmt_rp_read_local_oob_data rp;

		memcpy(rp.hash, hash, sizeof(rp.hash));
		memcpy(rp.randomizer, randomizer, sizeof(rp.randomizer));

4797
		err = cmd_complete(cmd->sk, hdev->id,
4798 4799
				   MGMT_OP_READ_LOCAL_OOB_DATA, 0, &rp,
				   sizeof(rp));
4800 4801 4802 4803 4804 4805
	}

	mgmt_pending_remove(cmd);

	return err;
}
4806

4807 4808 4809
void mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
		       u8 addr_type, u8 *dev_class, s8 rssi, u8 cfm_name, u8
		       ssp, u8 *eir, u16 eir_len)
4810
{
4811 4812
	char buf[512];
	struct mgmt_ev_device_found *ev = (void *) buf;
4813
	size_t ev_size;
4814

4815
	if (!hci_discovery_active(hdev))
4816
		return;
4817

4818 4819
	/* Leave 5 bytes for a potential CoD field */
	if (sizeof(*ev) + eir_len + 5 > sizeof(buf))
4820
		return;
4821

4822 4823
	memset(buf, 0, sizeof(buf));

4824
	bacpy(&ev->addr.bdaddr, bdaddr);
4825
	ev->addr.type = link_to_bdaddr(link_type, addr_type);
4826
	ev->rssi = rssi;
4827
	if (cfm_name)
4828
		ev->flags |= __constant_cpu_to_le32(MGMT_DEV_FOUND_CONFIRM_NAME);
4829
	if (!ssp)
4830
		ev->flags |= __constant_cpu_to_le32(MGMT_DEV_FOUND_LEGACY_PAIRING);
4831

4832
	if (eir_len > 0)
4833
		memcpy(ev->eir, eir, eir_len);
4834

4835 4836
	if (dev_class && !eir_has_data_type(ev->eir, eir_len, EIR_CLASS_OF_DEV))
		eir_len = eir_append_data(ev->eir, eir_len, EIR_CLASS_OF_DEV,
4837
					  dev_class, 3);
4838

4839
	ev->eir_len = cpu_to_le16(eir_len);
4840
	ev_size = sizeof(*ev) + eir_len;
4841

4842
	mgmt_event(MGMT_EV_DEVICE_FOUND, hdev, ev, ev_size, NULL);
4843
}
4844

4845 4846
void mgmt_remote_name(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
		      u8 addr_type, s8 rssi, u8 *name, u8 name_len)
4847
{
4848 4849 4850
	struct mgmt_ev_device_found *ev;
	char buf[sizeof(*ev) + HCI_MAX_NAME_LENGTH + 2];
	u16 eir_len;
4851

4852
	ev = (struct mgmt_ev_device_found *) buf;
4853

4854 4855 4856
	memset(buf, 0, sizeof(buf));

	bacpy(&ev->addr.bdaddr, bdaddr);
4857
	ev->addr.type = link_to_bdaddr(link_type, addr_type);
4858 4859 4860
	ev->rssi = rssi;

	eir_len = eir_append_data(ev->eir, 0, EIR_NAME_COMPLETE, name,
4861
				  name_len);
4862

4863
	ev->eir_len = cpu_to_le16(eir_len);
4864

4865
	mgmt_event(MGMT_EV_DEVICE_FOUND, hdev, ev, sizeof(*ev) + eir_len, NULL);
4866
}
4867

4868
void mgmt_discovering(struct hci_dev *hdev, u8 discovering)
4869
{
4870
	struct mgmt_ev_discovering ev;
4871 4872
	struct pending_cmd *cmd;

4873 4874
	BT_DBG("%s discovering %u", hdev->name, discovering);

4875
	if (discovering)
4876
		cmd = mgmt_pending_find(MGMT_OP_START_DISCOVERY, hdev);
4877
	else
4878
		cmd = mgmt_pending_find(MGMT_OP_STOP_DISCOVERY, hdev);
4879 4880

	if (cmd != NULL) {
4881 4882
		u8 type = hdev->discovery.type;

4883 4884
		cmd_complete(cmd->sk, hdev->id, cmd->opcode, 0, &type,
			     sizeof(type));
4885 4886 4887
		mgmt_pending_remove(cmd);
	}

4888 4889 4890 4891
	memset(&ev, 0, sizeof(ev));
	ev.type = hdev->discovery.type;
	ev.discovering = discovering;

4892
	mgmt_event(MGMT_EV_DISCOVERING, hdev, &ev, sizeof(ev), NULL);
4893
}
4894

4895
int mgmt_device_blocked(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type)
4896 4897 4898 4899
{
	struct pending_cmd *cmd;
	struct mgmt_ev_device_blocked ev;

4900
	cmd = mgmt_pending_find(MGMT_OP_BLOCK_DEVICE, hdev);
4901

4902 4903
	bacpy(&ev.addr.bdaddr, bdaddr);
	ev.addr.type = type;
4904

4905
	return mgmt_event(MGMT_EV_DEVICE_BLOCKED, hdev, &ev, sizeof(ev),
4906
			  cmd ? cmd->sk : NULL);
4907 4908
}

4909
int mgmt_device_unblocked(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type)
4910 4911 4912 4913
{
	struct pending_cmd *cmd;
	struct mgmt_ev_device_unblocked ev;

4914
	cmd = mgmt_pending_find(MGMT_OP_UNBLOCK_DEVICE, hdev);
4915

4916 4917
	bacpy(&ev.addr.bdaddr, bdaddr);
	ev.addr.type = type;
4918

4919
	return mgmt_event(MGMT_EV_DEVICE_UNBLOCKED, hdev, &ev, sizeof(ev),
4920
			  cmd ? cmd->sk : NULL);
4921
}
4922 4923 4924 4925 4926 4927 4928 4929

static void adv_enable_complete(struct hci_dev *hdev, u8 status)
{
	BT_DBG("%s status %u", hdev->name, status);

	/* Clear the advertising mgmt setting if we failed to re-enable it */
	if (status) {
		clear_bit(HCI_ADVERTISING, &hdev->dev_flags);
4930
		new_settings(hdev, NULL);
4931 4932 4933 4934 4935 4936 4937
	}
}

void mgmt_reenable_advertising(struct hci_dev *hdev)
{
	struct hci_request req;

4938
	if (hci_conn_num(hdev, LE_LINK) > 0)
4939 4940 4941 4942 4943 4944 4945 4946 4947 4948 4949 4950 4951
		return;

	if (!test_bit(HCI_ADVERTISING, &hdev->dev_flags))
		return;

	hci_req_init(&req, hdev);
	enable_advertising(&req);

	/* If this fails we have no option but to let user space know
	 * that we've disabled advertising.
	 */
	if (hci_req_run(&req, adv_enable_complete) < 0) {
		clear_bit(HCI_ADVERTISING, &hdev->dev_flags);
4952
		new_settings(hdev, NULL);
4953 4954
	}
}