mgmt.c 114.5 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

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

727 728 729
	if (test_bit(HCI_LIMITED_DISCOVERABLE, &hdev->dev_flags))
		cod[1] |= 0x20;

730
	if (memcmp(cod, hdev->dev_class, 3) == 0)
731
		return;
732

733
	hci_req_add(req, HCI_OP_WRITE_CLASS_OF_DEV, sizeof(cod), cod);
734 735
}

736 737 738
static void service_cache_off(struct work_struct *work)
{
	struct hci_dev *hdev = container_of(work, struct hci_dev,
739
					    service_cache.work);
740
	struct hci_request req;
741

742
	if (!test_and_clear_bit(HCI_SERVICE_CACHE, &hdev->dev_flags))
743 744
		return;

745 746
	hci_req_init(&req, hdev);

747 748
	hci_dev_lock(hdev);

749 750
	update_eir(&req);
	update_class(&req);
751 752

	hci_dev_unlock(hdev);
753 754

	hci_req_run(&req, NULL);
755 756
}

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

762
	INIT_DELAYED_WORK(&hdev->service_cache, service_cache_off);
763

764 765 766 767 768 769
	/* 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);
770 771
}

772
static int read_controller_info(struct sock *sk, struct hci_dev *hdev,
773
				void *data, u16 data_len)
774
{
775
	struct mgmt_rp_read_info rp;
776

777
	BT_DBG("sock %p %s", sk, hdev->name);
778

779
	hci_dev_lock(hdev);
780

781 782
	memset(&rp, 0, sizeof(rp));

783
	bacpy(&rp.bdaddr, &hdev->bdaddr);
784

785
	rp.version = hdev->hci_ver;
786
	rp.manufacturer = cpu_to_le16(hdev->manufacturer);
787 788 789

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

791
	memcpy(rp.dev_class, hdev->dev_class, 3);
792

793
	memcpy(rp.name, hdev->dev_name, sizeof(hdev->dev_name));
794
	memcpy(rp.short_name, hdev->short_name, sizeof(hdev->short_name));
795

796
	hci_dev_unlock(hdev);
797

798
	return cmd_complete(sk, hdev->id, MGMT_OP_READ_INFO, 0, &rp,
799
			    sizeof(rp));
800 801
}

802 803 804
static void mgmt_pending_free(struct pending_cmd *cmd)
{
	sock_put(cmd->sk);
805
	kfree(cmd->param);
806 807 808
	kfree(cmd);
}

809
static struct pending_cmd *mgmt_pending_add(struct sock *sk, u16 opcode,
810 811
					    struct hci_dev *hdev, void *data,
					    u16 len)
812 813 814
{
	struct pending_cmd *cmd;

815
	cmd = kmalloc(sizeof(*cmd), GFP_KERNEL);
816
	if (!cmd)
817
		return NULL;
818 819

	cmd->opcode = opcode;
820
	cmd->index = hdev->id;
821

822
	cmd->param = kmalloc(len, GFP_KERNEL);
823
	if (!cmd->param) {
824
		kfree(cmd);
825
		return NULL;
826 827
	}

828 829
	if (data)
		memcpy(cmd->param, data, len);
830 831 832 833

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

834
	list_add(&cmd->list, &hdev->mgmt_pending);
835

836
	return cmd;
837 838
}

839
static void mgmt_pending_foreach(u16 opcode, struct hci_dev *hdev,
840 841
				 void (*cb)(struct pending_cmd *cmd,
					    void *data),
842
				 void *data)
843
{
844
	struct pending_cmd *cmd, *tmp;
845

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

		cb(cmd, data);
	}
}

854
static struct pending_cmd *mgmt_pending_find(u16 opcode, struct hci_dev *hdev)
855
{
856
	struct pending_cmd *cmd;
857

858
	list_for_each_entry(cmd, &hdev->mgmt_pending, list) {
859 860
		if (cmd->opcode == opcode)
			return cmd;
861 862 863 864 865
	}

	return NULL;
}

866
static void mgmt_pending_remove(struct pending_cmd *cmd)
867 868 869 870 871
{
	list_del(&cmd->list);
	mgmt_pending_free(cmd);
}

872
static int send_settings_rsp(struct sock *sk, u16 opcode, struct hci_dev *hdev)
873
{
874
	__le32 settings = cpu_to_le32(get_current_settings(hdev));
875

876
	return cmd_complete(sk, hdev->id, opcode, 0, &settings,
877
			    sizeof(settings));
878 879
}

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

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

889 890 891 892
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_POWERED,
				  MGMT_STATUS_INVALID_PARAMS);

893
	hci_dev_lock(hdev);
894

895 896 897 898 899 900
	if (mgmt_pending_find(MGMT_OP_SET_POWERED, hdev)) {
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_POWERED,
				 MGMT_STATUS_BUSY);
		goto failed;
	}

901 902 903 904
	if (test_and_clear_bit(HCI_AUTO_OFF, &hdev->dev_flags)) {
		cancel_delayed_work(&hdev->power_off);

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

912
	if (!!cp->val == hdev_is_powered(hdev)) {
913
		err = send_settings_rsp(sk, MGMT_OP_SET_POWERED, hdev);
914 915 916
		goto failed;
	}

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

923
	if (cp->val)
924
		queue_work(hdev->req_workqueue, &hdev->power_on);
925
	else
926
		queue_work(hdev->req_workqueue, &hdev->power_off.work);
927

928
	err = 0;
929 930

failed:
931
	hci_dev_unlock(hdev);
932
	return err;
933 934
}

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

941
	skb = alloc_skb(sizeof(*hdr) + data_len, GFP_KERNEL);
942 943 944 945 946 947 948 949
	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
950
		hdr->index = __constant_cpu_to_le16(MGMT_INDEX_NONE);
951 952 953 954 955
	hdr->len = cpu_to_le16(data_len);

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

956 957 958
	/* Time stamp */
	__net_timestamp(skb);

959 960 961 962 963 964 965 966 967 968 969 970 971 972 973
	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);
}

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 1001 1002 1003
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);
}

1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023
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;
}

1024 1025 1026 1027
static void set_discoverable_complete(struct hci_dev *hdev, u8 status)
{
	struct pending_cmd *cmd;
	struct mgmt_mode *cp;
1028
	struct hci_request req;
1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045
	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;
1046
	if (cp->val) {
1047 1048
		changed = !test_and_set_bit(HCI_DISCOVERABLE,
					    &hdev->dev_flags);
1049 1050 1051 1052 1053 1054 1055

		if (hdev->discov_timeout > 0) {
			int to = msecs_to_jiffies(hdev->discov_timeout * 1000);
			queue_delayed_work(hdev->workqueue, &hdev->discov_off,
					   to);
		}
	} else {
1056 1057
		changed = test_and_clear_bit(HCI_DISCOVERABLE,
					     &hdev->dev_flags);
1058
	}
1059 1060 1061 1062 1063 1064

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

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

1065 1066 1067 1068 1069 1070 1071 1072
	/* When the discoverable mode gets changed, make sure
	 * that class of device has the limited discoverable
	 * bit correctly set.
	 */
	hci_req_init(&req, hdev);
	update_class(&req);
	hci_req_run(&req, NULL);

1073 1074 1075 1076 1077 1078 1079
remove_cmd:
	mgmt_pending_remove(cmd);

unlock:
	hci_dev_unlock(hdev);
}

1080
static int set_discoverable(struct sock *sk, struct hci_dev *hdev, void *data,
1081
			    u16 len)
1082
{
1083
	struct mgmt_cp_set_discoverable *cp = data;
1084
	struct pending_cmd *cmd;
1085
	struct hci_request req;
1086
	u16 timeout;
1087
	u8 scan, status;
1088 1089
	int err;

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

1092 1093
	status = mgmt_bredr_support(hdev);
	if (status)
1094
		return cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
1095
				  status);
1096

1097 1098 1099 1100
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
				  MGMT_STATUS_INVALID_PARAMS);

1101
	timeout = __le16_to_cpu(cp->timeout);
1102
	if (!cp->val && timeout > 0)
1103
		return cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
1104
				  MGMT_STATUS_INVALID_PARAMS);
1105

1106
	hci_dev_lock(hdev);
1107

1108
	if (!hdev_is_powered(hdev) && timeout > 0) {
1109
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
1110
				 MGMT_STATUS_NOT_POWERED);
1111 1112 1113
		goto failed;
	}

1114
	if (mgmt_pending_find(MGMT_OP_SET_DISCOVERABLE, hdev) ||
1115
	    mgmt_pending_find(MGMT_OP_SET_CONNECTABLE, hdev)) {
1116
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
1117
				 MGMT_STATUS_BUSY);
1118 1119 1120
		goto failed;
	}

1121
	if (!test_bit(HCI_CONNECTABLE, &hdev->dev_flags)) {
1122
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
1123
				 MGMT_STATUS_REJECTED);
1124 1125 1126 1127
		goto failed;
	}

	if (!hdev_is_powered(hdev)) {
1128 1129 1130 1131 1132 1133 1134
		bool changed = false;

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

1135
		err = send_settings_rsp(sk, MGMT_OP_SET_DISCOVERABLE, hdev);
1136 1137 1138 1139 1140 1141
		if (err < 0)
			goto failed;

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

1142 1143 1144 1145
		goto failed;
	}

	if (!!cp->val == test_bit(HCI_DISCOVERABLE, &hdev->dev_flags)) {
1146 1147
		cancel_delayed_work(&hdev->discov_off);
		hdev->discov_timeout = timeout;
1148

1149 1150
		if (cp->val && hdev->discov_timeout > 0) {
			int to = msecs_to_jiffies(hdev->discov_timeout * 1000);
1151
			queue_delayed_work(hdev->workqueue, &hdev->discov_off,
1152
					   to);
1153 1154
		}

1155
		err = send_settings_rsp(sk, MGMT_OP_SET_DISCOVERABLE, hdev);
1156 1157 1158
		goto failed;
	}

1159
	cmd = mgmt_pending_add(sk, MGMT_OP_SET_DISCOVERABLE, hdev, data, len);
1160 1161
	if (!cmd) {
		err = -ENOMEM;
1162
		goto failed;
1163
	}
1164

1165 1166
	hci_req_init(&req, hdev);

1167 1168
	scan = SCAN_PAGE;

1169
	if (cp->val)
1170
		scan |= SCAN_INQUIRY;
1171
	else
1172
		cancel_delayed_work(&hdev->discov_off);
1173

1174 1175 1176
	hci_req_add(&req, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);

	err = hci_req_run(&req, set_discoverable_complete);
1177
	if (err < 0)
1178
		mgmt_pending_remove(cmd);
1179

1180
	if (cp->val)
1181
		hdev->discov_timeout = timeout;
1182

1183
failed:
1184
	hci_dev_unlock(hdev);
1185 1186 1187
	return err;
}

1188 1189
static void write_fast_connectable(struct hci_request *req, bool enable)
{
1190
	struct hci_dev *hdev = req->hdev;
1191 1192 1193
	struct hci_cp_write_page_scan_activity acp;
	u8 type;

1194 1195 1196
	if (hdev->hci_ver < BLUETOOTH_VER_1_2)
		return;

1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210
	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);

1211 1212 1213 1214 1215 1216 1217
	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);
1218 1219
}

1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238
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;
}

1239 1240 1241 1242 1243 1244 1245 1246 1247
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);
1248
	cp.type = get_adv_type(hdev);
1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266
	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);
}

1267 1268 1269
static void set_connectable_complete(struct hci_dev *hdev, u8 status)
{
	struct pending_cmd *cmd;
1270 1271
	struct mgmt_mode *cp;
	bool changed;
1272 1273 1274 1275 1276 1277 1278 1279 1280

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

	hci_dev_lock(hdev);

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

1281 1282 1283 1284 1285 1286
	if (status) {
		u8 mgmt_err = mgmt_status(status);
		cmd_status(cmd->sk, cmd->index, cmd->opcode, mgmt_err);
		goto remove_cmd;
	}

1287 1288 1289 1290 1291 1292
	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);

1293 1294
	send_settings_rsp(cmd->sk, MGMT_OP_SET_CONNECTABLE, hdev);

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

1298
remove_cmd:
1299 1300 1301 1302 1303 1304
	mgmt_pending_remove(cmd);

unlock:
	hci_dev_unlock(hdev);
}

1305
static int set_connectable(struct sock *sk, struct hci_dev *hdev, void *data,
1306
			   u16 len)
1307
{
1308
	struct mgmt_mode *cp = data;
1309
	struct pending_cmd *cmd;
1310
	struct hci_request req;
1311
	u8 scan;
1312 1313
	int err;

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

1316 1317
	if (!test_bit(HCI_LE_ENABLED, &hdev->dev_flags) &&
	    !test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags))
1318
		return cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE,
1319
				  MGMT_STATUS_REJECTED);
1320

1321 1322 1323 1324
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE,
				  MGMT_STATUS_INVALID_PARAMS);

1325
	hci_dev_lock(hdev);
1326

1327
	if (!hdev_is_powered(hdev)) {
1328 1329 1330 1331 1332
		bool changed = false;

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

1333
		if (cp->val) {
1334
			set_bit(HCI_CONNECTABLE, &hdev->dev_flags);
1335
		} else {
1336 1337 1338
			clear_bit(HCI_CONNECTABLE, &hdev->dev_flags);
			clear_bit(HCI_DISCOVERABLE, &hdev->dev_flags);
		}
1339

1340
		err = send_settings_rsp(sk, MGMT_OP_SET_CONNECTABLE, hdev);
1341 1342 1343 1344 1345 1346
		if (err < 0)
			goto failed;

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

1347 1348 1349
		goto failed;
	}

1350
	if (mgmt_pending_find(MGMT_OP_SET_DISCOVERABLE, hdev) ||
1351
	    mgmt_pending_find(MGMT_OP_SET_CONNECTABLE, hdev)) {
1352
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE,
1353
				 MGMT_STATUS_BUSY);
1354 1355 1356
		goto failed;
	}

1357
	cmd = mgmt_pending_add(sk, MGMT_OP_SET_CONNECTABLE, hdev, data, len);
1358 1359
	if (!cmd) {
		err = -ENOMEM;
1360
		goto failed;
1361
	}
1362

1363
	hci_req_init(&req, hdev);
1364

1365 1366 1367 1368 1369 1370 1371 1372
	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) &&
1373
			    hdev->discov_timeout > 0)
1374 1375
				cancel_delayed_work(&hdev->discov_off);
		}
1376

1377 1378
		hci_req_add(&req, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);
	}
1379

1380 1381 1382 1383 1384 1385 1386
	/* 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))
1387 1388
		write_fast_connectable(&req, false);

1389 1390 1391 1392 1393 1394
	if (test_bit(HCI_ADVERTISING, &hdev->dev_flags) &&
	    hci_conn_num(hdev, LE_LINK) == 0) {
		disable_advertising(&req);
		enable_advertising(&req);
	}

1395
	err = hci_req_run(&req, set_connectable_complete);
1396
	if (err < 0) {
1397
		mgmt_pending_remove(cmd);
1398 1399 1400 1401 1402
		if (err == -ENODATA)
			err = send_settings_rsp(sk, MGMT_OP_SET_CONNECTABLE,
						hdev);
		goto failed;
	}
1403 1404

failed:
1405
	hci_dev_unlock(hdev);
1406 1407 1408
	return err;
}

1409
static int set_pairable(struct sock *sk, struct hci_dev *hdev, void *data,
1410
			u16 len)
1411
{
1412
	struct mgmt_mode *cp = data;
1413
	bool changed;
1414 1415
	int err;

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

1418 1419 1420 1421
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_PAIRABLE,
				  MGMT_STATUS_INVALID_PARAMS);

1422
	hci_dev_lock(hdev);
1423 1424

	if (cp->val)
1425
		changed = !test_and_set_bit(HCI_PAIRABLE, &hdev->dev_flags);
1426
	else
1427
		changed = test_and_clear_bit(HCI_PAIRABLE, &hdev->dev_flags);
1428

1429
	err = send_settings_rsp(sk, MGMT_OP_SET_PAIRABLE, hdev);
1430
	if (err < 0)
1431
		goto unlock;
1432

1433 1434
	if (changed)
		err = new_settings(hdev, sk);
1435

1436
unlock:
1437
	hci_dev_unlock(hdev);
1438 1439 1440
	return err;
}

1441 1442
static int set_link_security(struct sock *sk, struct hci_dev *hdev, void *data,
			     u16 len)
1443 1444 1445
{
	struct mgmt_mode *cp = data;
	struct pending_cmd *cmd;
1446
	u8 val, status;
1447 1448
	int err;

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

1451 1452
	status = mgmt_bredr_support(hdev);
	if (status)
1453
		return cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY,
1454
				  status);
1455

1456 1457 1458 1459
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY,
				  MGMT_STATUS_INVALID_PARAMS);

1460 1461
	hci_dev_lock(hdev);

1462
	if (!hdev_is_powered(hdev)) {
1463 1464 1465
		bool changed = false;

		if (!!cp->val != test_bit(HCI_LINK_SECURITY,
1466
					  &hdev->dev_flags)) {
1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477
			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);

1478 1479 1480 1481
		goto failed;
	}

	if (mgmt_pending_find(MGMT_OP_SET_LINK_SECURITY, hdev)) {
1482
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY,
1483
				 MGMT_STATUS_BUSY);
1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510
		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;
}

1511
static int set_ssp(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
1512 1513 1514
{
	struct mgmt_mode *cp = data;
	struct pending_cmd *cmd;
1515
	u8 status;
1516 1517
	int err;

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

1520 1521 1522 1523
	status = mgmt_bredr_support(hdev);
	if (status)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_SSP, status);

1524 1525 1526
	if (!lmp_ssp_capable(hdev))
		return cmd_status(sk, hdev->id, MGMT_OP_SET_SSP,
				  MGMT_STATUS_NOT_SUPPORTED);
1527

1528 1529 1530 1531
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_SSP,
				  MGMT_STATUS_INVALID_PARAMS);

1532
	hci_dev_lock(hdev);
1533

1534
	if (!hdev_is_powered(hdev)) {
1535
		bool changed;
1536

1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547
		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);
1548 1549 1550 1551 1552 1553 1554 1555 1556
		}

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

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

1557 1558 1559
		goto failed;
	}

1560 1561
	if (mgmt_pending_find(MGMT_OP_SET_SSP, hdev) ||
	    mgmt_pending_find(MGMT_OP_SET_HS, hdev)) {
1562 1563
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_SSP,
				 MGMT_STATUS_BUSY);
1564 1565 1566
		goto failed;
	}

1567
	if (!!cp->val == test_bit(HCI_SSP_ENABLED, &hdev->dev_flags)) {
1568 1569 1570 1571 1572 1573 1574 1575 1576 1577
		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;
	}

1578
	err = hci_send_cmd(hdev, HCI_OP_WRITE_SSP_MODE, 1, &cp->val);
1579 1580 1581 1582 1583 1584 1585 1586 1587 1588
	if (err < 0) {
		mgmt_pending_remove(cmd);
		goto failed;
	}

failed:
	hci_dev_unlock(hdev);
	return err;
}

1589
static int set_hs(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
1590 1591
{
	struct mgmt_mode *cp = data;
1592
	bool changed;
1593
	u8 status;
1594
	int err;
1595

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

1598 1599 1600
	status = mgmt_bredr_support(hdev);
	if (status)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_HS, status);
1601

1602 1603 1604 1605 1606 1607 1608 1609
	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);

1610 1611 1612 1613
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_HS,
				  MGMT_STATUS_INVALID_PARAMS);

1614 1615
	hci_dev_lock(hdev);

1616
	if (cp->val) {
1617
		changed = !test_and_set_bit(HCI_HS_ENABLED, &hdev->dev_flags);
1618 1619 1620 1621 1622 1623 1624
	} else {
		if (hdev_is_powered(hdev)) {
			err = cmd_status(sk, hdev->id, MGMT_OP_SET_HS,
					 MGMT_STATUS_REJECTED);
			goto unlock;
		}

1625
		changed = test_and_clear_bit(HCI_HS_ENABLED, &hdev->dev_flags);
1626
	}
1627 1628 1629 1630 1631 1632 1633

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

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

1635 1636 1637
unlock:
	hci_dev_unlock(hdev);
	return err;
1638 1639
}

1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657
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);
1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674

	/* 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);
	}
1675 1676
}

1677
static int set_le(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
1678 1679 1680 1681
{
	struct mgmt_mode *cp = data;
	struct hci_cp_write_le_host_supported hci_cp;
	struct pending_cmd *cmd;
1682
	struct hci_request req;
1683
	int err;
1684
	u8 val, enabled;
1685

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

1688 1689 1690
	if (!lmp_le_capable(hdev))
		return cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
				  MGMT_STATUS_NOT_SUPPORTED);
1691

1692 1693 1694 1695
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
				  MGMT_STATUS_INVALID_PARAMS);

1696
	/* LE-only devices do not allow toggling LE on/off */
1697
	if (!test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags))
1698 1699 1700
		return cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
				  MGMT_STATUS_REJECTED);

1701
	hci_dev_lock(hdev);
1702 1703

	val = !!cp->val;
1704
	enabled = lmp_host_le_capable(hdev);
1705

1706
	if (!hdev_is_powered(hdev) || val == enabled) {
1707 1708 1709 1710 1711 1712 1713
		bool changed = false;

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

1714 1715
		if (!val && test_bit(HCI_ADVERTISING, &hdev->dev_flags)) {
			clear_bit(HCI_ADVERTISING, &hdev->dev_flags);
1716 1717 1718
			changed = true;
		}

1719 1720
		err = send_settings_rsp(sk, MGMT_OP_SET_LE, hdev);
		if (err < 0)
1721
			goto unlock;
1722 1723 1724 1725

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

1726
		goto unlock;
1727 1728
	}

1729 1730
	if (mgmt_pending_find(MGMT_OP_SET_LE, hdev) ||
	    mgmt_pending_find(MGMT_OP_SET_ADVERTISING, hdev)) {
1731
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
1732
				 MGMT_STATUS_BUSY);
1733
		goto unlock;
1734 1735 1736 1737 1738
	}

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

1742 1743
	hci_req_init(&req, hdev);

1744 1745 1746 1747
	memset(&hci_cp, 0, sizeof(hci_cp));

	if (val) {
		hci_cp.le = val;
1748
		hci_cp.simul = lmp_le_br_capable(hdev);
1749 1750 1751
	} else {
		if (test_bit(HCI_ADVERTISING, &hdev->dev_flags))
			disable_advertising(&req);
1752 1753
	}

1754 1755 1756 1757
	hci_req_add(&req, HCI_OP_WRITE_LE_HOST_SUPPORTED, sizeof(hci_cp),
		    &hci_cp);

	err = hci_req_run(&req, le_enable_complete);
1758
	if (err < 0)
1759 1760
		mgmt_pending_remove(cmd);

1761 1762
unlock:
	hci_dev_unlock(hdev);
1763 1764 1765
	return err;
}

1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788
/* 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;
}

1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807
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;
}

1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833
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);
}

1834
static int add_uuid(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
1835
{
1836
	struct mgmt_cp_add_uuid *cp = data;
1837
	struct pending_cmd *cmd;
1838
	struct hci_request req;
1839 1840 1841
	struct bt_uuid *uuid;
	int err;

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

1844
	hci_dev_lock(hdev);
1845

1846
	if (pending_eir_or_class(hdev)) {
1847
		err = cmd_status(sk, hdev->id, MGMT_OP_ADD_UUID,
1848
				 MGMT_STATUS_BUSY);
1849 1850 1851
		goto failed;
	}

1852
	uuid = kmalloc(sizeof(*uuid), GFP_KERNEL);
1853 1854 1855 1856 1857 1858
	if (!uuid) {
		err = -ENOMEM;
		goto failed;
	}

	memcpy(uuid->uuid, cp->uuid, 16);
1859
	uuid->svc_hint = cp->svc_hint;
1860
	uuid->size = get_uuid_size(cp->uuid);
1861

1862
	list_add_tail(&uuid->list, &hdev->uuids);
1863

1864
	hci_req_init(&req, hdev);
1865

1866 1867 1868
	update_class(&req);
	update_eir(&req);

1869 1870 1871 1872
	err = hci_req_run(&req, add_uuid_complete);
	if (err < 0) {
		if (err != -ENODATA)
			goto failed;
1873

1874
		err = cmd_complete(sk, hdev->id, MGMT_OP_ADD_UUID, 0,
1875
				   hdev->dev_class, 3);
1876 1877 1878 1879
		goto failed;
	}

	cmd = mgmt_pending_add(sk, MGMT_OP_ADD_UUID, hdev, data, len);
1880
	if (!cmd) {
1881
		err = -ENOMEM;
1882 1883 1884 1885
		goto failed;
	}

	err = 0;
1886 1887

failed:
1888
	hci_dev_unlock(hdev);
1889 1890 1891
	return err;
}

1892 1893 1894 1895 1896 1897
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)) {
1898 1899
		queue_delayed_work(hdev->workqueue, &hdev->service_cache,
				   CACHE_TIMEOUT);
1900 1901 1902 1903 1904 1905
		return true;
	}

	return false;
}

1906 1907 1908 1909 1910 1911 1912
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);
}

1913
static int remove_uuid(struct sock *sk, struct hci_dev *hdev, void *data,
1914
		       u16 len)
1915
{
1916
	struct mgmt_cp_remove_uuid *cp = data;
1917
	struct pending_cmd *cmd;
1918
	struct bt_uuid *match, *tmp;
1919
	u8 bt_uuid_any[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
1920
	struct hci_request req;
1921 1922
	int err, found;

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

1925
	hci_dev_lock(hdev);
1926

1927
	if (pending_eir_or_class(hdev)) {
1928
		err = cmd_status(sk, hdev->id, MGMT_OP_REMOVE_UUID,
1929
				 MGMT_STATUS_BUSY);
1930 1931 1932
		goto unlock;
	}

1933 1934
	if (memcmp(cp->uuid, bt_uuid_any, 16) == 0) {
		err = hci_uuids_clear(hdev);
1935

1936
		if (enable_service_cache(hdev)) {
1937
			err = cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_UUID,
1938
					   0, hdev->dev_class, 3);
1939 1940
			goto unlock;
		}
1941

1942
		goto update_class;
1943 1944 1945 1946
	}

	found = 0;

1947
	list_for_each_entry_safe(match, tmp, &hdev->uuids, list) {
1948 1949 1950 1951
		if (memcmp(match->uuid, cp->uuid, 16) != 0)
			continue;

		list_del(&match->list);
1952
		kfree(match);
1953 1954 1955 1956
		found++;
	}

	if (found == 0) {
1957
		err = cmd_status(sk, hdev->id, MGMT_OP_REMOVE_UUID,
1958
				 MGMT_STATUS_INVALID_PARAMS);
1959 1960 1961
		goto unlock;
	}

1962
update_class:
1963
	hci_req_init(&req, hdev);
1964

1965 1966 1967
	update_class(&req);
	update_eir(&req);

1968 1969 1970 1971
	err = hci_req_run(&req, remove_uuid_complete);
	if (err < 0) {
		if (err != -ENODATA)
			goto unlock;
1972

1973
		err = cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_UUID, 0,
1974
				   hdev->dev_class, 3);
1975 1976 1977 1978
		goto unlock;
	}

	cmd = mgmt_pending_add(sk, MGMT_OP_REMOVE_UUID, hdev, data, len);
1979
	if (!cmd) {
1980
		err = -ENOMEM;
1981 1982 1983 1984
		goto unlock;
	}

	err = 0;
1985 1986

unlock:
1987
	hci_dev_unlock(hdev);
1988 1989 1990
	return err;
}

1991 1992 1993 1994 1995 1996 1997
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);
}

1998
static int set_dev_class(struct sock *sk, struct hci_dev *hdev, void *data,
1999
			 u16 len)
2000
{
2001
	struct mgmt_cp_set_dev_class *cp = data;
2002
	struct pending_cmd *cmd;
2003
	struct hci_request req;
2004 2005
	int err;

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

2008
	if (!lmp_bredr_capable(hdev))
2009 2010
		return cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS,
				  MGMT_STATUS_NOT_SUPPORTED);
2011

2012
	hci_dev_lock(hdev);
2013

2014 2015 2016 2017 2018
	if (pending_eir_or_class(hdev)) {
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS,
				 MGMT_STATUS_BUSY);
		goto unlock;
	}
2019

2020 2021 2022 2023 2024
	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;
	}
2025

2026 2027 2028
	hdev->major_class = cp->major;
	hdev->minor_class = cp->minor;

2029
	if (!hdev_is_powered(hdev)) {
2030
		err = cmd_complete(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, 0,
2031
				   hdev->dev_class, 3);
2032 2033 2034
		goto unlock;
	}

2035 2036
	hci_req_init(&req, hdev);

2037
	if (test_and_clear_bit(HCI_SERVICE_CACHE, &hdev->dev_flags)) {
2038 2039 2040
		hci_dev_unlock(hdev);
		cancel_delayed_work_sync(&hdev->service_cache);
		hci_dev_lock(hdev);
2041
		update_eir(&req);
2042
	}
2043

2044 2045
	update_class(&req);

2046 2047 2048 2049
	err = hci_req_run(&req, set_class_complete);
	if (err < 0) {
		if (err != -ENODATA)
			goto unlock;
2050

2051
		err = cmd_complete(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, 0,
2052
				   hdev->dev_class, 3);
2053 2054 2055 2056
		goto unlock;
	}

	cmd = mgmt_pending_add(sk, MGMT_OP_SET_DEV_CLASS, hdev, data, len);
2057
	if (!cmd) {
2058
		err = -ENOMEM;
2059 2060 2061 2062
		goto unlock;
	}

	err = 0;
2063

2064
unlock:
2065
	hci_dev_unlock(hdev);
2066 2067 2068
	return err;
}

2069
static int load_link_keys(struct sock *sk, struct hci_dev *hdev, void *data,
2070
			  u16 len)
2071
{
2072
	struct mgmt_cp_load_link_keys *cp = data;
2073
	u16 key_count, expected_len;
2074
	int i;
2075

2076 2077 2078 2079 2080 2081
	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);

2082
	key_count = __le16_to_cpu(cp->key_count);
2083

2084 2085
	expected_len = sizeof(*cp) + key_count *
					sizeof(struct mgmt_link_key_info);
2086
	if (expected_len != len) {
2087
		BT_ERR("load_link_keys: expected %u bytes, got %u bytes",
2088
		       len, expected_len);
2089
		return cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS,
2090
				  MGMT_STATUS_INVALID_PARAMS);
2091 2092
	}

2093 2094 2095 2096
	if (cp->debug_keys != 0x00 && cp->debug_keys != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS,
				  MGMT_STATUS_INVALID_PARAMS);

2097
	BT_DBG("%s debug_keys %u key_count %u", hdev->name, cp->debug_keys,
2098
	       key_count);
2099

2100 2101 2102 2103 2104 2105 2106 2107
	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);
	}

2108
	hci_dev_lock(hdev);
2109 2110 2111 2112

	hci_link_keys_clear(hdev);

	if (cp->debug_keys)
2113
		set_bit(HCI_DEBUG_KEYS, &hdev->dev_flags);
2114
	else
2115
		clear_bit(HCI_DEBUG_KEYS, &hdev->dev_flags);
2116

2117
	for (i = 0; i < key_count; i++) {
2118
		struct mgmt_link_key_info *key = &cp->keys[i];
2119

2120
		hci_add_link_key(hdev, NULL, 0, &key->addr.bdaddr, key->val,
2121
				 key->type, key->pin_len);
2122 2123
	}

2124
	cmd_complete(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS, 0, NULL, 0);
2125

2126
	hci_dev_unlock(hdev);
2127

2128
	return 0;
2129 2130
}

2131
static int device_unpaired(struct hci_dev *hdev, bdaddr_t *bdaddr,
2132
			   u8 addr_type, struct sock *skip_sk)
2133 2134 2135 2136 2137 2138 2139
{
	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),
2140
			  skip_sk);
2141 2142
}

2143
static int unpair_device(struct sock *sk, struct hci_dev *hdev, void *data,
2144
			 u16 len)
2145
{
2146 2147
	struct mgmt_cp_unpair_device *cp = data;
	struct mgmt_rp_unpair_device rp;
2148 2149
	struct hci_cp_disconnect dc;
	struct pending_cmd *cmd;
2150 2151 2152
	struct hci_conn *conn;
	int err;

2153
	memset(&rp, 0, sizeof(rp));
2154 2155
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;
2156

2157 2158 2159 2160 2161
	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));

2162 2163 2164 2165 2166
	if (cp->disconnect != 0x00 && cp->disconnect != 0x01)
		return cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
				    MGMT_STATUS_INVALID_PARAMS,
				    &rp, sizeof(rp));

2167 2168
	hci_dev_lock(hdev);

2169
	if (!hdev_is_powered(hdev)) {
2170
		err = cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
2171
				   MGMT_STATUS_NOT_POWERED, &rp, sizeof(rp));
2172 2173 2174
		goto unlock;
	}

2175
	if (cp->addr.type == BDADDR_BREDR)
2176 2177 2178
		err = hci_remove_link_key(hdev, &cp->addr.bdaddr);
	else
		err = hci_remove_ltk(hdev, &cp->addr.bdaddr);
2179

2180
	if (err < 0) {
2181
		err = cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
2182
				   MGMT_STATUS_NOT_PAIRED, &rp, sizeof(rp));
2183 2184 2185
		goto unlock;
	}

2186
	if (cp->disconnect) {
2187
		if (cp->addr.type == BDADDR_BREDR)
2188
			conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK,
2189
						       &cp->addr.bdaddr);
2190 2191
		else
			conn = hci_conn_hash_lookup_ba(hdev, LE_LINK,
2192
						       &cp->addr.bdaddr);
2193 2194 2195
	} else {
		conn = NULL;
	}
2196

2197
	if (!conn) {
2198
		err = cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE, 0,
2199
				   &rp, sizeof(rp));
2200
		device_unpaired(hdev, &cp->addr.bdaddr, cp->addr.type, sk);
2201 2202
		goto unlock;
	}
2203

2204
	cmd = mgmt_pending_add(sk, MGMT_OP_UNPAIR_DEVICE, hdev, cp,
2205
			       sizeof(*cp));
2206 2207 2208
	if (!cmd) {
		err = -ENOMEM;
		goto unlock;
2209 2210
	}

2211
	dc.handle = cpu_to_le16(conn->handle);
2212 2213 2214 2215 2216
	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);

2217
unlock:
2218
	hci_dev_unlock(hdev);
2219 2220 2221
	return err;
}

2222
static int disconnect(struct sock *sk, struct hci_dev *hdev, void *data,
2223
		      u16 len)
2224
{
2225
	struct mgmt_cp_disconnect *cp = data;
2226
	struct mgmt_rp_disconnect rp;
2227
	struct hci_cp_disconnect dc;
2228
	struct pending_cmd *cmd;
2229 2230 2231 2232 2233
	struct hci_conn *conn;
	int err;

	BT_DBG("");

2234 2235 2236 2237
	memset(&rp, 0, sizeof(rp));
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;

2238
	if (!bdaddr_type_is_valid(cp->addr.type))
2239 2240 2241
		return cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
				    MGMT_STATUS_INVALID_PARAMS,
				    &rp, sizeof(rp));
2242

2243
	hci_dev_lock(hdev);
2244 2245

	if (!test_bit(HCI_UP, &hdev->flags)) {
2246 2247
		err = cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
				   MGMT_STATUS_NOT_POWERED, &rp, sizeof(rp));
2248 2249 2250
		goto failed;
	}

2251
	if (mgmt_pending_find(MGMT_OP_DISCONNECT, hdev)) {
2252 2253
		err = cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
				   MGMT_STATUS_BUSY, &rp, sizeof(rp));
2254 2255 2256
		goto failed;
	}

2257
	if (cp->addr.type == BDADDR_BREDR)
2258 2259
		conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK,
					       &cp->addr.bdaddr);
2260 2261
	else
		conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &cp->addr.bdaddr);
2262

2263
	if (!conn || conn->state == BT_OPEN || conn->state == BT_CLOSED) {
2264 2265
		err = cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
				   MGMT_STATUS_NOT_CONNECTED, &rp, sizeof(rp));
2266 2267 2268
		goto failed;
	}

2269
	cmd = mgmt_pending_add(sk, MGMT_OP_DISCONNECT, hdev, data, len);
2270 2271
	if (!cmd) {
		err = -ENOMEM;
2272
		goto failed;
2273
	}
2274

2275
	dc.handle = cpu_to_le16(conn->handle);
2276
	dc.reason = HCI_ERROR_REMOTE_USER_TERM;
2277 2278 2279

	err = hci_send_cmd(hdev, HCI_OP_DISCONNECT, sizeof(dc), &dc);
	if (err < 0)
2280
		mgmt_pending_remove(cmd);
2281 2282

failed:
2283
	hci_dev_unlock(hdev);
2284 2285 2286
	return err;
}

2287
static u8 link_to_bdaddr(u8 link_type, u8 addr_type)
2288 2289 2290
{
	switch (link_type) {
	case LE_LINK:
2291 2292
		switch (addr_type) {
		case ADDR_LE_DEV_PUBLIC:
2293
			return BDADDR_LE_PUBLIC;
2294

2295
		default:
2296
			/* Fallback to LE Random address type */
2297
			return BDADDR_LE_RANDOM;
2298
		}
2299

2300
	default:
2301
		/* Fallback to BR/EDR type */
2302
		return BDADDR_BREDR;
2303 2304 2305
	}
}

2306 2307
static int get_connections(struct sock *sk, struct hci_dev *hdev, void *data,
			   u16 data_len)
2308 2309
{
	struct mgmt_rp_get_connections *rp;
2310
	struct hci_conn *c;
2311
	size_t rp_len;
2312 2313
	int err;
	u16 i;
2314 2315 2316

	BT_DBG("");

2317
	hci_dev_lock(hdev);
2318

2319
	if (!hdev_is_powered(hdev)) {
2320
		err = cmd_status(sk, hdev->id, MGMT_OP_GET_CONNECTIONS,
2321
				 MGMT_STATUS_NOT_POWERED);
2322 2323 2324
		goto unlock;
	}

2325
	i = 0;
2326 2327
	list_for_each_entry(c, &hdev->conn_hash.list, list) {
		if (test_bit(HCI_CONN_MGMT_CONNECTED, &c->flags))
2328
			i++;
2329 2330
	}

2331
	rp_len = sizeof(*rp) + (i * sizeof(struct mgmt_addr_info));
2332
	rp = kmalloc(rp_len, GFP_KERNEL);
2333
	if (!rp) {
2334 2335 2336 2337 2338
		err = -ENOMEM;
		goto unlock;
	}

	i = 0;
2339
	list_for_each_entry(c, &hdev->conn_hash.list, list) {
2340 2341
		if (!test_bit(HCI_CONN_MGMT_CONNECTED, &c->flags))
			continue;
2342
		bacpy(&rp->addr[i].bdaddr, &c->dst);
2343
		rp->addr[i].type = link_to_bdaddr(c->type, c->dst_type);
2344
		if (c->type == SCO_LINK || c->type == ESCO_LINK)
2345 2346 2347 2348
			continue;
		i++;
	}

2349
	rp->conn_count = cpu_to_le16(i);
2350

2351 2352
	/* Recalculate length in case of filtered SCO connections, etc */
	rp_len = sizeof(*rp) + (i * sizeof(struct mgmt_addr_info));
2353

2354
	err = cmd_complete(sk, hdev->id, MGMT_OP_GET_CONNECTIONS, 0, rp,
2355
			   rp_len);
2356

2357
	kfree(rp);
2358 2359

unlock:
2360
	hci_dev_unlock(hdev);
2361 2362 2363
	return err;
}

2364
static int send_pin_code_neg_reply(struct sock *sk, struct hci_dev *hdev,
2365
				   struct mgmt_cp_pin_code_neg_reply *cp)
2366 2367 2368 2369
{
	struct pending_cmd *cmd;
	int err;

2370
	cmd = mgmt_pending_add(sk, MGMT_OP_PIN_CODE_NEG_REPLY, hdev, cp,
2371
			       sizeof(*cp));
2372 2373 2374
	if (!cmd)
		return -ENOMEM;

2375
	err = hci_send_cmd(hdev, HCI_OP_PIN_CODE_NEG_REPLY,
2376
			   sizeof(cp->addr.bdaddr), &cp->addr.bdaddr);
2377 2378 2379 2380 2381 2382
	if (err < 0)
		mgmt_pending_remove(cmd);

	return err;
}

2383
static int pin_code_reply(struct sock *sk, struct hci_dev *hdev, void *data,
2384
			  u16 len)
2385
{
2386
	struct hci_conn *conn;
2387
	struct mgmt_cp_pin_code_reply *cp = data;
2388
	struct hci_cp_pin_code_reply reply;
2389
	struct pending_cmd *cmd;
2390 2391 2392 2393
	int err;

	BT_DBG("");

2394
	hci_dev_lock(hdev);
2395

2396
	if (!hdev_is_powered(hdev)) {
2397
		err = cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
2398
				 MGMT_STATUS_NOT_POWERED);
2399 2400 2401
		goto failed;
	}

2402
	conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->addr.bdaddr);
2403
	if (!conn) {
2404
		err = cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
2405
				 MGMT_STATUS_NOT_CONNECTED);
2406 2407 2408 2409
		goto failed;
	}

	if (conn->pending_sec_level == BT_SECURITY_HIGH && cp->pin_len != 16) {
2410 2411 2412
		struct mgmt_cp_pin_code_neg_reply ncp;

		memcpy(&ncp.addr, &cp->addr, sizeof(ncp.addr));
2413 2414 2415

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

2416
		err = send_pin_code_neg_reply(sk, hdev, &ncp);
2417
		if (err >= 0)
2418
			err = cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
2419
					 MGMT_STATUS_INVALID_PARAMS);
2420 2421 2422 2423

		goto failed;
	}

2424
	cmd = mgmt_pending_add(sk, MGMT_OP_PIN_CODE_REPLY, hdev, data, len);
2425 2426
	if (!cmd) {
		err = -ENOMEM;
2427
		goto failed;
2428
	}
2429

2430
	bacpy(&reply.bdaddr, &cp->addr.bdaddr);
2431
	reply.pin_len = cp->pin_len;
2432
	memcpy(reply.pin_code, cp->pin_code, sizeof(reply.pin_code));
2433 2434 2435

	err = hci_send_cmd(hdev, HCI_OP_PIN_CODE_REPLY, sizeof(reply), &reply);
	if (err < 0)
2436
		mgmt_pending_remove(cmd);
2437 2438

failed:
2439
	hci_dev_unlock(hdev);
2440 2441 2442
	return err;
}

2443 2444
static int set_io_capability(struct sock *sk, struct hci_dev *hdev, void *data,
			     u16 len)
2445
{
2446
	struct mgmt_cp_set_io_capability *cp = data;
2447 2448 2449

	BT_DBG("");

2450
	hci_dev_lock(hdev);
2451 2452 2453 2454

	hdev->io_capability = cp->io_capability;

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

2457
	hci_dev_unlock(hdev);
2458

2459 2460
	return cmd_complete(sk, hdev->id, MGMT_OP_SET_IO_CAPABILITY, 0, NULL,
			    0);
2461 2462
}

2463
static struct pending_cmd *find_pairing(struct hci_conn *conn)
2464 2465
{
	struct hci_dev *hdev = conn->hdev;
2466
	struct pending_cmd *cmd;
2467

2468
	list_for_each_entry(cmd, &hdev->mgmt_pending, list) {
2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485
		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;

2486
	bacpy(&rp.addr.bdaddr, &conn->dst);
2487
	rp.addr.type = link_to_bdaddr(conn->type, conn->dst_type);
2488

2489
	cmd_complete(cmd->sk, cmd->index, MGMT_OP_PAIR_DEVICE, status,
2490
		     &rp, sizeof(rp));
2491 2492 2493 2494 2495 2496

	/* 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;

2497
	hci_conn_drop(conn);
2498

2499
	mgmt_pending_remove(cmd);
2500 2501 2502 2503 2504 2505 2506 2507 2508
}

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

	BT_DBG("status %u", status);

	cmd = find_pairing(conn);
2509
	if (!cmd)
2510
		BT_DBG("Unable to find a pending command");
2511
	else
2512
		pairing_complete(cmd, mgmt_status(status));
2513 2514
}

2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530
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));
}

2531
static int pair_device(struct sock *sk, struct hci_dev *hdev, void *data,
2532
		       u16 len)
2533
{
2534
	struct mgmt_cp_pair_device *cp = data;
2535
	struct mgmt_rp_pair_device rp;
2536 2537 2538 2539 2540 2541 2542
	struct pending_cmd *cmd;
	u8 sec_level, auth_type;
	struct hci_conn *conn;
	int err;

	BT_DBG("");

2543 2544 2545 2546
	memset(&rp, 0, sizeof(rp));
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;

2547 2548 2549 2550 2551
	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));

2552
	hci_dev_lock(hdev);
2553

2554
	if (!hdev_is_powered(hdev)) {
2555 2556
		err = cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
				   MGMT_STATUS_NOT_POWERED, &rp, sizeof(rp));
2557 2558 2559
		goto unlock;
	}

2560 2561
	sec_level = BT_SECURITY_MEDIUM;
	if (cp->io_cap == 0x03)
2562
		auth_type = HCI_AT_DEDICATED_BONDING;
2563
	else
2564 2565
		auth_type = HCI_AT_DEDICATED_BONDING_MITM;

2566
	if (cp->addr.type == BDADDR_BREDR)
2567 2568
		conn = hci_connect(hdev, ACL_LINK, &cp->addr.bdaddr,
				   cp->addr.type, sec_level, auth_type);
2569
	else
2570 2571
		conn = hci_connect(hdev, LE_LINK, &cp->addr.bdaddr,
				   cp->addr.type, sec_level, auth_type);
2572

2573
	if (IS_ERR(conn)) {
2574 2575 2576 2577 2578 2579 2580
		int status;

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

2581
		err = cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
2582
				   status, &rp,
2583
				   sizeof(rp));
2584 2585 2586 2587
		goto unlock;
	}

	if (conn->connect_cfm_cb) {
2588
		hci_conn_drop(conn);
2589
		err = cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
2590
				   MGMT_STATUS_BUSY, &rp, sizeof(rp));
2591 2592 2593
		goto unlock;
	}

2594
	cmd = mgmt_pending_add(sk, MGMT_OP_PAIR_DEVICE, hdev, data, len);
2595 2596
	if (!cmd) {
		err = -ENOMEM;
2597
		hci_conn_drop(conn);
2598 2599 2600
		goto unlock;
	}

2601
	/* For LE, just connecting isn't a proof that the pairing finished */
2602
	if (cp->addr.type == BDADDR_BREDR)
2603
		conn->connect_cfm_cb = pairing_complete_cb;
2604 2605
	else
		conn->connect_cfm_cb = le_connect_complete_cb;
2606

2607 2608 2609 2610 2611 2612
	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 &&
2613
	    hci_conn_security(conn, sec_level, auth_type))
2614 2615 2616 2617 2618
		pairing_complete(cmd, 0);

	err = 0;

unlock:
2619
	hci_dev_unlock(hdev);
2620 2621 2622
	return err;
}

2623 2624
static int cancel_pair_device(struct sock *sk, struct hci_dev *hdev, void *data,
			      u16 len)
2625
{
2626
	struct mgmt_addr_info *addr = data;
2627 2628 2629 2630 2631 2632 2633 2634
	struct pending_cmd *cmd;
	struct hci_conn *conn;
	int err;

	BT_DBG("");

	hci_dev_lock(hdev);

2635
	if (!hdev_is_powered(hdev)) {
2636
		err = cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE,
2637
				 MGMT_STATUS_NOT_POWERED);
2638 2639 2640
		goto unlock;
	}

2641 2642
	cmd = mgmt_pending_find(MGMT_OP_PAIR_DEVICE, hdev);
	if (!cmd) {
2643
		err = cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE,
2644
				 MGMT_STATUS_INVALID_PARAMS);
2645 2646 2647 2648 2649 2650
		goto unlock;
	}

	conn = cmd->user_data;

	if (bacmp(&addr->bdaddr, &conn->dst) != 0) {
2651
		err = cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE,
2652
				 MGMT_STATUS_INVALID_PARAMS);
2653 2654 2655 2656 2657
		goto unlock;
	}

	pairing_complete(cmd, MGMT_STATUS_CANCELLED);

2658
	err = cmd_complete(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE, 0,
2659
			   addr, sizeof(*addr));
2660 2661 2662 2663 2664
unlock:
	hci_dev_unlock(hdev);
	return err;
}

2665
static int user_pairing_resp(struct sock *sk, struct hci_dev *hdev,
2666
			     struct mgmt_addr_info *addr, u16 mgmt_op,
2667
			     u16 hci_op, __le32 passkey)
2668 2669
{
	struct pending_cmd *cmd;
2670
	struct hci_conn *conn;
2671 2672
	int err;

2673
	hci_dev_lock(hdev);
2674

2675
	if (!hdev_is_powered(hdev)) {
2676 2677 2678
		err = cmd_complete(sk, hdev->id, mgmt_op,
				   MGMT_STATUS_NOT_POWERED, addr,
				   sizeof(*addr));
2679
		goto done;
2680 2681
	}

2682 2683
	if (addr->type == BDADDR_BREDR)
		conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &addr->bdaddr);
2684
	else
2685
		conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &addr->bdaddr);
2686 2687

	if (!conn) {
2688 2689 2690
		err = cmd_complete(sk, hdev->id, mgmt_op,
				   MGMT_STATUS_NOT_CONNECTED, addr,
				   sizeof(*addr));
2691 2692
		goto done;
	}
2693

2694
	if (addr->type == BDADDR_LE_PUBLIC || addr->type == BDADDR_LE_RANDOM) {
2695
		/* Continue with pairing via SMP */
2696 2697 2698
		err = smp_user_confirm_reply(conn, mgmt_op, passkey);

		if (!err)
2699 2700 2701
			err = cmd_complete(sk, hdev->id, mgmt_op,
					   MGMT_STATUS_SUCCESS, addr,
					   sizeof(*addr));
2702
		else
2703 2704 2705
			err = cmd_complete(sk, hdev->id, mgmt_op,
					   MGMT_STATUS_FAILED, addr,
					   sizeof(*addr));
2706 2707 2708 2709

		goto done;
	}

2710
	cmd = mgmt_pending_add(sk, mgmt_op, hdev, addr, sizeof(*addr));
2711 2712
	if (!cmd) {
		err = -ENOMEM;
2713
		goto done;
2714 2715
	}

2716
	/* Continue with pairing via HCI */
2717 2718 2719
	if (hci_op == HCI_OP_USER_PASSKEY_REPLY) {
		struct hci_cp_user_passkey_reply cp;

2720
		bacpy(&cp.bdaddr, &addr->bdaddr);
2721 2722 2723
		cp.passkey = passkey;
		err = hci_send_cmd(hdev, hci_op, sizeof(cp), &cp);
	} else
2724 2725
		err = hci_send_cmd(hdev, hci_op, sizeof(addr->bdaddr),
				   &addr->bdaddr);
2726

2727 2728
	if (err < 0)
		mgmt_pending_remove(cmd);
2729

2730
done:
2731
	hci_dev_unlock(hdev);
2732 2733 2734
	return err;
}

2735 2736 2737 2738 2739 2740 2741
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("");

2742
	return user_pairing_resp(sk, hdev, &cp->addr,
2743 2744 2745 2746
				MGMT_OP_PIN_CODE_NEG_REPLY,
				HCI_OP_PIN_CODE_NEG_REPLY, 0);
}

2747 2748
static int user_confirm_reply(struct sock *sk, struct hci_dev *hdev, void *data,
			      u16 len)
2749
{
2750
	struct mgmt_cp_user_confirm_reply *cp = data;
2751 2752 2753 2754

	BT_DBG("");

	if (len != sizeof(*cp))
2755
		return cmd_status(sk, hdev->id, MGMT_OP_USER_CONFIRM_REPLY,
2756
				  MGMT_STATUS_INVALID_PARAMS);
2757

2758
	return user_pairing_resp(sk, hdev, &cp->addr,
2759 2760
				 MGMT_OP_USER_CONFIRM_REPLY,
				 HCI_OP_USER_CONFIRM_REPLY, 0);
2761 2762
}

2763
static int user_confirm_neg_reply(struct sock *sk, struct hci_dev *hdev,
2764
				  void *data, u16 len)
2765
{
2766
	struct mgmt_cp_user_confirm_neg_reply *cp = data;
2767 2768 2769

	BT_DBG("");

2770
	return user_pairing_resp(sk, hdev, &cp->addr,
2771 2772
				 MGMT_OP_USER_CONFIRM_NEG_REPLY,
				 HCI_OP_USER_CONFIRM_NEG_REPLY, 0);
2773 2774
}

2775 2776
static int user_passkey_reply(struct sock *sk, struct hci_dev *hdev, void *data,
			      u16 len)
2777
{
2778
	struct mgmt_cp_user_passkey_reply *cp = data;
2779 2780 2781

	BT_DBG("");

2782
	return user_pairing_resp(sk, hdev, &cp->addr,
2783 2784
				 MGMT_OP_USER_PASSKEY_REPLY,
				 HCI_OP_USER_PASSKEY_REPLY, cp->passkey);
2785 2786
}

2787
static int user_passkey_neg_reply(struct sock *sk, struct hci_dev *hdev,
2788
				  void *data, u16 len)
2789
{
2790
	struct mgmt_cp_user_passkey_neg_reply *cp = data;
2791 2792 2793

	BT_DBG("");

2794
	return user_pairing_resp(sk, hdev, &cp->addr,
2795 2796
				 MGMT_OP_USER_PASSKEY_NEG_REPLY,
				 HCI_OP_USER_PASSKEY_NEG_REPLY, 0);
2797 2798
}

2799
static void update_name(struct hci_request *req)
2800
{
2801
	struct hci_dev *hdev = req->hdev;
2802 2803
	struct hci_cp_write_local_name cp;

2804
	memcpy(cp.name, hdev->dev_name, sizeof(cp.name));
2805

2806
	hci_req_add(req, HCI_OP_WRITE_LOCAL_NAME, sizeof(cp), &cp);
2807 2808
}

2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836
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);
}

2837
static int set_local_name(struct sock *sk, struct hci_dev *hdev, void *data,
2838
			  u16 len)
2839
{
2840
	struct mgmt_cp_set_local_name *cp = data;
2841
	struct pending_cmd *cmd;
2842
	struct hci_request req;
2843 2844 2845 2846
	int err;

	BT_DBG("");

2847
	hci_dev_lock(hdev);
2848

2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859
	/* 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;
	}

2860
	memcpy(hdev->short_name, cp->short_name, sizeof(hdev->short_name));
2861

2862
	if (!hdev_is_powered(hdev)) {
2863
		memcpy(hdev->dev_name, cp->name, sizeof(hdev->dev_name));
2864 2865

		err = cmd_complete(sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, 0,
2866
				   data, len);
2867 2868 2869 2870
		if (err < 0)
			goto failed;

		err = mgmt_event(MGMT_EV_LOCAL_NAME_CHANGED, hdev, data, len,
2871
				 sk);
2872

2873 2874 2875
		goto failed;
	}

2876
	cmd = mgmt_pending_add(sk, MGMT_OP_SET_LOCAL_NAME, hdev, data, len);
2877 2878 2879 2880 2881
	if (!cmd) {
		err = -ENOMEM;
		goto failed;
	}

2882 2883
	memcpy(hdev->dev_name, cp->name, sizeof(hdev->dev_name));

2884
	hci_req_init(&req, hdev);
2885 2886 2887 2888 2889 2890 2891

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

	if (lmp_le_capable(hdev))
2892
		update_ad(&req);
2893

2894
	err = hci_req_run(&req, set_name_complete);
2895 2896 2897 2898
	if (err < 0)
		mgmt_pending_remove(cmd);

failed:
2899
	hci_dev_unlock(hdev);
2900 2901 2902
	return err;
}

2903
static int read_local_oob_data(struct sock *sk, struct hci_dev *hdev,
2904
			       void *data, u16 data_len)
2905 2906 2907 2908
{
	struct pending_cmd *cmd;
	int err;

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

2911
	hci_dev_lock(hdev);
2912

2913
	if (!hdev_is_powered(hdev)) {
2914
		err = cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
2915
				 MGMT_STATUS_NOT_POWERED);
2916 2917 2918
		goto unlock;
	}

2919
	if (!lmp_ssp_capable(hdev)) {
2920
		err = cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
2921
				 MGMT_STATUS_NOT_SUPPORTED);
2922 2923 2924
		goto unlock;
	}

2925
	if (mgmt_pending_find(MGMT_OP_READ_LOCAL_OOB_DATA, hdev)) {
2926
		err = cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
2927
				 MGMT_STATUS_BUSY);
2928 2929 2930
		goto unlock;
	}

2931
	cmd = mgmt_pending_add(sk, MGMT_OP_READ_LOCAL_OOB_DATA, hdev, NULL, 0);
2932 2933 2934 2935 2936 2937 2938 2939 2940 2941
	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:
2942
	hci_dev_unlock(hdev);
2943 2944 2945
	return err;
}

2946
static int add_remote_oob_data(struct sock *sk, struct hci_dev *hdev,
2947
			       void *data, u16 len)
2948
{
2949
	struct mgmt_cp_add_remote_oob_data *cp = data;
2950
	u8 status;
2951 2952
	int err;

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

2955
	hci_dev_lock(hdev);
2956

2957
	err = hci_add_remote_oob_data(hdev, &cp->addr.bdaddr, cp->hash,
2958
				      cp->randomizer);
2959
	if (err < 0)
2960
		status = MGMT_STATUS_FAILED;
2961
	else
2962
		status = MGMT_STATUS_SUCCESS;
2963

2964
	err = cmd_complete(sk, hdev->id, MGMT_OP_ADD_REMOTE_OOB_DATA, status,
2965
			   &cp->addr, sizeof(cp->addr));
2966

2967
	hci_dev_unlock(hdev);
2968 2969 2970
	return err;
}

2971
static int remove_remote_oob_data(struct sock *sk, struct hci_dev *hdev,
2972
				  void *data, u16 len)
2973
{
2974
	struct mgmt_cp_remove_remote_oob_data *cp = data;
2975
	u8 status;
2976 2977
	int err;

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

2980
	hci_dev_lock(hdev);
2981

2982
	err = hci_remove_remote_oob_data(hdev, &cp->addr.bdaddr);
2983
	if (err < 0)
2984
		status = MGMT_STATUS_INVALID_PARAMS;
2985
	else
2986
		status = MGMT_STATUS_SUCCESS;
2987

2988
	err = cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_REMOTE_OOB_DATA,
2989
			   status, &cp->addr, sizeof(cp->addr));
2990

2991
	hci_dev_unlock(hdev);
2992 2993 2994
	return err;
}

2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015
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;
}

3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033
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,
3034
				   DISCOV_LE_TIMEOUT);
3035 3036 3037 3038
		break;

	case DISCOV_TYPE_INTERLEAVED:
		queue_delayed_work(hdev->workqueue, &hdev->le_scan_disable,
3039
				   DISCOV_INTERLEAVED_TIMEOUT);
3040 3041 3042 3043 3044 3045 3046 3047 3048 3049
		break;

	case DISCOV_TYPE_BREDR:
		break;

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

3050
static int start_discovery(struct sock *sk, struct hci_dev *hdev,
3051
			   void *data, u16 len)
3052
{
3053
	struct mgmt_cp_start_discovery *cp = data;
3054
	struct pending_cmd *cmd;
3055 3056 3057 3058 3059 3060
	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 };
3061
	u8 status;
3062 3063
	int err;

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

3066
	hci_dev_lock(hdev);
3067

3068
	if (!hdev_is_powered(hdev)) {
3069
		err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
3070
				 MGMT_STATUS_NOT_POWERED);
3071 3072 3073
		goto failed;
	}

3074 3075 3076 3077 3078 3079
	if (test_bit(HCI_PERIODIC_INQ, &hdev->dev_flags)) {
		err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
				 MGMT_STATUS_BUSY);
		goto failed;
	}

3080
	if (hdev->discovery.state != DISCOVERY_STOPPED) {
3081
		err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
3082
				 MGMT_STATUS_BUSY);
3083 3084 3085
		goto failed;
	}

3086
	cmd = mgmt_pending_add(sk, MGMT_OP_START_DISCOVERY, hdev, NULL, 0);
3087 3088 3089 3090 3091
	if (!cmd) {
		err = -ENOMEM;
		goto failed;
	}

A
Andre Guedes 已提交
3092 3093
	hdev->discovery.type = cp->type;

3094 3095
	hci_req_init(&req, hdev);

A
Andre Guedes 已提交
3096
	switch (hdev->discovery.type) {
3097
	case DISCOV_TYPE_BREDR:
3098 3099
		status = mgmt_bredr_support(hdev);
		if (status) {
3100
			err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
3101
					 status);
3102 3103 3104 3105
			mgmt_pending_remove(cmd);
			goto failed;
		}

3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116
		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));
3117
		inq_cp.length = DISCOV_BREDR_INQUIRY_LEN;
3118
		hci_req_add(&req, HCI_OP_INQUIRY, sizeof(inq_cp), &inq_cp);
3119 3120 3121
		break;

	case DISCOV_TYPE_LE:
3122
	case DISCOV_TYPE_INTERLEAVED:
3123 3124
		status = mgmt_le_support(hdev);
		if (status) {
3125
			err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
3126
					 status);
3127 3128 3129 3130
			mgmt_pending_remove(cmd);
			goto failed;
		}

3131
		if (hdev->discovery.type == DISCOV_TYPE_INTERLEAVED &&
3132
		    !test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags)) {
3133 3134 3135 3136 3137 3138
			err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
					 MGMT_STATUS_NOT_SUPPORTED);
			mgmt_pending_remove(cmd);
			goto failed;
		}

3139
		if (test_bit(HCI_ADVERTISING, &hdev->dev_flags)) {
3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154
			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;
3155 3156
		param_cp.interval = cpu_to_le16(DISCOV_LE_SCAN_INT);
		param_cp.window = cpu_to_le16(DISCOV_LE_SCAN_WIN);
3157 3158 3159 3160
		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;
3161 3162 3163 3164 3165 3166 3167 3168
		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);
3169 3170
		break;

3171
	default:
3172 3173 3174 3175
		err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
				 MGMT_STATUS_INVALID_PARAMS);
		mgmt_pending_remove(cmd);
		goto failed;
3176
	}
3177

3178
	err = hci_req_run(&req, start_discovery_complete);
3179 3180
	if (err < 0)
		mgmt_pending_remove(cmd);
3181 3182
	else
		hci_discovery_set_state(hdev, DISCOVERY_STARTING);
3183 3184

failed:
3185
	hci_dev_unlock(hdev);
3186 3187 3188
	return err;
}

3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204
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;
}

3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221
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);
}

3222
static int stop_discovery(struct sock *sk, struct hci_dev *hdev, void *data,
3223
			  u16 len)
3224
{
3225
	struct mgmt_cp_stop_discovery *mgmt_cp = data;
3226
	struct pending_cmd *cmd;
3227 3228
	struct hci_cp_remote_name_req_cancel cp;
	struct inquiry_entry *e;
3229 3230
	struct hci_request req;
	struct hci_cp_le_set_scan_enable enable_cp;
3231 3232
	int err;

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

3235
	hci_dev_lock(hdev);
3236

3237
	if (!hci_discovery_active(hdev)) {
3238
		err = cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY,
3239 3240
				   MGMT_STATUS_REJECTED, &mgmt_cp->type,
				   sizeof(mgmt_cp->type));
3241 3242 3243 3244
		goto unlock;
	}

	if (hdev->discovery.type != mgmt_cp->type) {
3245
		err = cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY,
3246 3247
				   MGMT_STATUS_INVALID_PARAMS, &mgmt_cp->type,
				   sizeof(mgmt_cp->type));
3248
		goto unlock;
3249 3250
	}

3251
	cmd = mgmt_pending_add(sk, MGMT_OP_STOP_DISCOVERY, hdev, NULL, 0);
3252 3253
	if (!cmd) {
		err = -ENOMEM;
3254 3255 3256
		goto unlock;
	}

3257 3258
	hci_req_init(&req, hdev);

3259 3260
	switch (hdev->discovery.state) {
	case DISCOVERY_FINDING:
3261 3262 3263 3264 3265 3266 3267 3268 3269 3270
		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);
		}
3271

3272 3273 3274 3275
		break;

	case DISCOVERY_RESOLVING:
		e = hci_inquiry_cache_lookup_resolve(hdev, BDADDR_ANY,
3276
						     NAME_PENDING);
3277
		if (!e) {
3278
			mgmt_pending_remove(cmd);
3279 3280 3281 3282 3283 3284 3285
			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;
		}
3286

3287
		bacpy(&cp.bdaddr, &e->data.bdaddr);
3288 3289
		hci_req_add(&req, HCI_OP_REMOTE_NAME_REQ_CANCEL, sizeof(cp),
			    &cp);
3290 3291 3292 3293 3294

		break;

	default:
		BT_DBG("unknown discovery state %u", hdev->discovery.state);
3295 3296 3297 3298 3299 3300

		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;
3301 3302
	}

3303
	err = hci_req_run(&req, stop_discovery_complete);
3304 3305
	if (err < 0)
		mgmt_pending_remove(cmd);
3306 3307
	else
		hci_discovery_set_state(hdev, DISCOVERY_STOPPING);
3308

3309
unlock:
3310
	hci_dev_unlock(hdev);
3311 3312 3313
	return err;
}

3314
static int confirm_name(struct sock *sk, struct hci_dev *hdev, void *data,
3315
			u16 len)
3316
{
3317
	struct mgmt_cp_confirm_name *cp = data;
3318 3319 3320
	struct inquiry_entry *e;
	int err;

3321
	BT_DBG("%s", hdev->name);
3322 3323 3324

	hci_dev_lock(hdev);

3325
	if (!hci_discovery_active(hdev)) {
3326
		err = cmd_status(sk, hdev->id, MGMT_OP_CONFIRM_NAME,
3327
				 MGMT_STATUS_FAILED);
3328 3329 3330
		goto failed;
	}

3331
	e = hci_inquiry_cache_lookup_unknown(hdev, &cp->addr.bdaddr);
3332
	if (!e) {
3333
		err = cmd_status(sk, hdev->id, MGMT_OP_CONFIRM_NAME,
3334
				 MGMT_STATUS_INVALID_PARAMS);
3335 3336 3337 3338 3339 3340 3341 3342
		goto failed;
	}

	if (cp->name_known) {
		e->name_state = NAME_KNOWN;
		list_del(&e->list);
	} else {
		e->name_state = NAME_NEEDED;
3343
		hci_inquiry_cache_update_resolve(hdev, e);
3344 3345
	}

3346 3347
	err = cmd_complete(sk, hdev->id, MGMT_OP_CONFIRM_NAME, 0, &cp->addr,
			   sizeof(cp->addr));
3348 3349 3350 3351 3352 3353

failed:
	hci_dev_unlock(hdev);
	return err;
}

3354
static int block_device(struct sock *sk, struct hci_dev *hdev, void *data,
3355
			u16 len)
3356
{
3357
	struct mgmt_cp_block_device *cp = data;
3358
	u8 status;
3359 3360
	int err;

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

3363
	if (!bdaddr_type_is_valid(cp->addr.type))
3364 3365 3366
		return cmd_complete(sk, hdev->id, MGMT_OP_BLOCK_DEVICE,
				    MGMT_STATUS_INVALID_PARAMS,
				    &cp->addr, sizeof(cp->addr));
3367

3368
	hci_dev_lock(hdev);
3369

3370
	err = hci_blacklist_add(hdev, &cp->addr.bdaddr, cp->addr.type);
3371
	if (err < 0)
3372
		status = MGMT_STATUS_FAILED;
3373
	else
3374
		status = MGMT_STATUS_SUCCESS;
3375

3376
	err = cmd_complete(sk, hdev->id, MGMT_OP_BLOCK_DEVICE, status,
3377
			   &cp->addr, sizeof(cp->addr));
3378

3379
	hci_dev_unlock(hdev);
3380 3381 3382 3383

	return err;
}

3384
static int unblock_device(struct sock *sk, struct hci_dev *hdev, void *data,
3385
			  u16 len)
3386
{
3387
	struct mgmt_cp_unblock_device *cp = data;
3388
	u8 status;
3389 3390
	int err;

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

3393
	if (!bdaddr_type_is_valid(cp->addr.type))
3394 3395 3396
		return cmd_complete(sk, hdev->id, MGMT_OP_UNBLOCK_DEVICE,
				    MGMT_STATUS_INVALID_PARAMS,
				    &cp->addr, sizeof(cp->addr));
3397

3398
	hci_dev_lock(hdev);
3399

3400
	err = hci_blacklist_del(hdev, &cp->addr.bdaddr, cp->addr.type);
3401
	if (err < 0)
3402
		status = MGMT_STATUS_INVALID_PARAMS;
3403
	else
3404
		status = MGMT_STATUS_SUCCESS;
3405

3406
	err = cmd_complete(sk, hdev->id, MGMT_OP_UNBLOCK_DEVICE, status,
3407
			   &cp->addr, sizeof(cp->addr));
3408

3409
	hci_dev_unlock(hdev);
3410 3411 3412 3413

	return err;
}

3414 3415 3416 3417
static int set_device_id(struct sock *sk, struct hci_dev *hdev, void *data,
			 u16 len)
{
	struct mgmt_cp_set_device_id *cp = data;
3418
	struct hci_request req;
3419
	int err;
3420
	__u16 source;
3421 3422 3423

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

3424 3425 3426 3427 3428 3429
	source = __le16_to_cpu(cp->source);

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

3430 3431
	hci_dev_lock(hdev);

3432
	hdev->devid_source = source;
3433 3434 3435 3436 3437 3438
	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);

3439 3440 3441
	hci_req_init(&req, hdev);
	update_eir(&req);
	hci_req_run(&req, NULL);
3442 3443 3444 3445 3446 3447

	hci_dev_unlock(hdev);

	return err;
}

3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468
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);
}

3469 3470
static int set_advertising(struct sock *sk, struct hci_dev *hdev, void *data,
			   u16 len)
3471 3472 3473 3474
{
	struct mgmt_mode *cp = data;
	struct pending_cmd *cmd;
	struct hci_request req;
3475
	u8 val, enabled, status;
3476 3477 3478 3479
	int err;

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

3480 3481
	status = mgmt_le_support(hdev);
	if (status)
3482
		return cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING,
3483
				  status);
3484 3485 3486 3487 3488 3489 3490 3491

	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;
3492
	enabled = test_bit(HCI_ADVERTISING, &hdev->dev_flags);
3493

3494 3495 3496 3497 3498 3499
	/* 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 ||
3500
	    hci_conn_num(hdev, LE_LINK) > 0) {
3501 3502
		bool changed = false;

3503 3504
		if (val != test_bit(HCI_ADVERTISING, &hdev->dev_flags)) {
			change_bit(HCI_ADVERTISING, &hdev->dev_flags);
3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532
			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);

3533 3534 3535 3536
	if (val)
		enable_advertising(&req);
	else
		disable_advertising(&req);
3537 3538 3539 3540 3541 3542 3543 3544 3545 3546

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

unlock:
	hci_dev_unlock(hdev);
	return err;
}

3547 3548 3549 3550 3551 3552 3553 3554
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);

3555
	if (!lmp_le_capable(hdev))
3556
		return cmd_status(sk, hdev->id, MGMT_OP_SET_STATIC_ADDRESS,
3557
				  MGMT_STATUS_NOT_SUPPORTED);
3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586

	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;
}

3587 3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611
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);

3612 3613 3614 3615
	if (window > interval)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS,
				  MGMT_STATUS_INVALID_PARAMS);

3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627
	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;
}

3628 3629 3630 3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643
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 {
3644 3645 3646 3647 3648 3649 3650
		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);

3651 3652 3653 3654 3655 3656 3657 3658 3659 3660
		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);
}

3661
static int set_fast_connectable(struct sock *sk, struct hci_dev *hdev,
3662
				void *data, u16 len)
3663
{
3664
	struct mgmt_mode *cp = data;
3665 3666
	struct pending_cmd *cmd;
	struct hci_request req;
3667 3668
	int err;

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

3671 3672
	if (!test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags) ||
	    hdev->hci_ver < BLUETOOTH_VER_1_2)
3673 3674 3675
		return cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
				  MGMT_STATUS_NOT_SUPPORTED);

3676 3677 3678 3679
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
				  MGMT_STATUS_INVALID_PARAMS);

3680
	if (!hdev_is_powered(hdev))
3681
		return cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
3682
				  MGMT_STATUS_NOT_POWERED);
3683 3684

	if (!test_bit(HCI_CONNECTABLE, &hdev->dev_flags))
3685
		return cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
3686
				  MGMT_STATUS_REJECTED);
3687 3688 3689

	hci_dev_lock(hdev);

3690 3691 3692 3693 3694 3695
	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;
	}

3696 3697 3698 3699 3700 3701
	if (!!cp->val == test_bit(HCI_FAST_CONNECTABLE, &hdev->dev_flags)) {
		err = send_settings_rsp(sk, MGMT_OP_SET_FAST_CONNECTABLE,
					hdev);
		goto unlock;
	}

3702 3703 3704 3705 3706
	cmd = mgmt_pending_add(sk, MGMT_OP_SET_FAST_CONNECTABLE, hdev,
			       data, len);
	if (!cmd) {
		err = -ENOMEM;
		goto unlock;
3707 3708
	}

3709 3710
	hci_req_init(&req, hdev);

3711
	write_fast_connectable(&req, cp->val);
3712 3713

	err = hci_req_run(&req, fast_connectable_complete);
3714
	if (err < 0) {
3715
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
3716
				 MGMT_STATUS_FAILED);
3717
		mgmt_pending_remove(cmd);
3718 3719
	}

3720
unlock:
3721
	hci_dev_unlock(hdev);
3722

3723 3724 3725
	return err;
}

3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745
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);
}

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 3827 3828 3829 3830 3831 3832 3833 3834 3835 3836 3837 3838 3839 3840 3841 3842 3843
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;
	}

3844
	/* We need to flip the bit already here so that update_ad
3845 3846 3847 3848 3849
	 * generates the correct flags.
	 */
	set_bit(HCI_BREDR_ENABLED, &hdev->dev_flags);

	hci_req_init(&req, hdev);
3850 3851 3852 3853

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

3854
	update_ad(&req);
3855

3856 3857 3858 3859 3860 3861 3862 3863 3864
	err = hci_req_run(&req, set_bredr_complete);
	if (err < 0)
		mgmt_pending_remove(cmd);

unlock:
	hci_dev_unlock(hdev);
	return err;
}

3865 3866
static bool ltk_is_valid(struct mgmt_ltk_info *key)
{
3867 3868
	if (key->authenticated != 0x00 && key->authenticated != 0x01)
		return false;
3869 3870
	if (key->master != 0x00 && key->master != 0x01)
		return false;
3871 3872
	if (!bdaddr_type_is_le(key->addr.type))
		return false;
3873 3874 3875
	return true;
}

3876
static int load_long_term_keys(struct sock *sk, struct hci_dev *hdev,
3877
			       void *cp_data, u16 len)
3878 3879 3880
{
	struct mgmt_cp_load_long_term_keys *cp = cp_data;
	u16 key_count, expected_len;
3881
	int i, err;
3882

3883 3884 3885 3886 3887 3888
	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);

3889
	key_count = __le16_to_cpu(cp->key_count);
3890 3891 3892 3893 3894

	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",
3895
		       len, expected_len);
3896
		return cmd_status(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS,
3897
				  MGMT_STATUS_INVALID_PARAMS);
3898 3899
	}

3900
	BT_DBG("%s key_count %u", hdev->name, key_count);
3901

3902 3903 3904
	for (i = 0; i < key_count; i++) {
		struct mgmt_ltk_info *key = &cp->keys[i];

3905
		if (!ltk_is_valid(key))
3906 3907 3908 3909 3910
			return cmd_status(sk, hdev->id,
					  MGMT_OP_LOAD_LONG_TERM_KEYS,
					  MGMT_STATUS_INVALID_PARAMS);
	}

3911 3912 3913 3914 3915 3916
	hci_dev_lock(hdev);

	hci_smp_ltks_clear(hdev);

	for (i = 0; i < key_count; i++) {
		struct mgmt_ltk_info *key = &cp->keys[i];
3917 3918 3919 3920 3921 3922
		u8 type, addr_type;

		if (key->addr.type == BDADDR_LE_PUBLIC)
			addr_type = ADDR_LE_DEV_PUBLIC;
		else
			addr_type = ADDR_LE_DEV_RANDOM;
3923 3924 3925 3926 3927 3928

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

3929
		hci_add_ltk(hdev, &key->addr.bdaddr, addr_type,
3930 3931
			    type, 0, key->authenticated, key->val,
			    key->enc_size, key->ediv, key->rand);
3932 3933
	}

3934 3935 3936
	err = cmd_complete(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS, 0,
			   NULL, 0);

3937 3938
	hci_dev_unlock(hdev);

3939
	return err;
3940 3941
}

3942
static const struct mgmt_handler {
3943 3944
	int (*func) (struct sock *sk, struct hci_dev *hdev, void *data,
		     u16 data_len);
3945 3946
	bool var_len;
	size_t data_len;
3947 3948
} mgmt_handlers[] = {
	{ NULL }, /* 0x0000 (no command) */
3949 3950 3951 3952 3953 3954 3955 3956 3957 3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977 3978 3979 3980 3981 3982 3983 3984 3985 3986 3987
	{ 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 },
3988
	{ set_device_id,          false, MGMT_SET_DEVICE_ID_SIZE },
3989
	{ set_advertising,        false, MGMT_SETTING_SIZE },
3990
	{ set_bredr,              false, MGMT_SETTING_SIZE },
3991
	{ set_static_address,     false, MGMT_SET_STATIC_ADDRESS_SIZE },
3992
	{ set_scan_params,        false, MGMT_SET_SCAN_PARAMS_SIZE },
3993 3994 3995
};


3996 3997
int mgmt_control(struct sock *sk, struct msghdr *msg, size_t msglen)
{
3998 3999
	void *buf;
	u8 *cp;
4000
	struct mgmt_hdr *hdr;
4001
	u16 opcode, index, len;
4002
	struct hci_dev *hdev = NULL;
4003
	const struct mgmt_handler *handler;
4004 4005 4006 4007 4008 4009 4010
	int err;

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

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

4011
	buf = kmalloc(msglen, GFP_KERNEL);
4012 4013 4014 4015 4016 4017 4018 4019
	if (!buf)
		return -ENOMEM;

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

4020
	hdr = buf;
4021 4022 4023
	opcode = __le16_to_cpu(hdr->opcode);
	index = __le16_to_cpu(hdr->index);
	len = __le16_to_cpu(hdr->len);
4024 4025 4026 4027 4028 4029

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

4030
	if (index != MGMT_INDEX_NONE) {
4031 4032 4033
		hdev = hci_dev_get(index);
		if (!hdev) {
			err = cmd_status(sk, index, opcode,
4034
					 MGMT_STATUS_INVALID_INDEX);
4035 4036
			goto done;
		}
4037

4038 4039
		if (test_bit(HCI_SETUP, &hdev->dev_flags) ||
		    test_bit(HCI_USER_CHANNEL, &hdev->dev_flags)) {
4040 4041 4042 4043
			err = cmd_status(sk, index, opcode,
					 MGMT_STATUS_INVALID_INDEX);
			goto done;
		}
4044 4045
	}

4046
	if (opcode >= ARRAY_SIZE(mgmt_handlers) ||
4047
	    mgmt_handlers[opcode].func == NULL) {
4048
		BT_DBG("Unknown op %u", opcode);
4049
		err = cmd_status(sk, index, opcode,
4050
				 MGMT_STATUS_UNKNOWN_COMMAND);
4051 4052 4053 4054
		goto done;
	}

	if ((hdev && opcode < MGMT_OP_READ_INFO) ||
4055
	    (!hdev && opcode >= MGMT_OP_READ_INFO)) {
4056
		err = cmd_status(sk, index, opcode,
4057
				 MGMT_STATUS_INVALID_INDEX);
4058
		goto done;
4059 4060
	}

4061 4062 4063
	handler = &mgmt_handlers[opcode];

	if ((handler->var_len && len < handler->data_len) ||
4064
	    (!handler->var_len && len != handler->data_len)) {
4065
		err = cmd_status(sk, index, opcode,
4066
				 MGMT_STATUS_INVALID_PARAMS);
4067 4068 4069
		goto done;
	}

4070 4071 4072 4073 4074
	if (hdev)
		mgmt_init_hdev(sk, hdev);

	cp = buf + sizeof(*hdr);

4075
	err = handler->func(sk, hdev, cp, len);
4076 4077 4078
	if (err < 0)
		goto done;

4079 4080 4081
	err = msglen;

done:
4082 4083 4084
	if (hdev)
		hci_dev_put(hdev);

4085 4086 4087
	kfree(buf);
	return err;
}
4088

4089
void mgmt_index_added(struct hci_dev *hdev)
4090
{
4091
	if (hdev->dev_type != HCI_BREDR)
4092
		return;
4093

4094
	mgmt_event(MGMT_EV_INDEX_ADDED, hdev, NULL, 0, NULL);
4095 4096
}

4097
void mgmt_index_removed(struct hci_dev *hdev)
4098
{
4099
	u8 status = MGMT_STATUS_INVALID_INDEX;
4100

4101
	if (hdev->dev_type != HCI_BREDR)
4102
		return;
4103

4104
	mgmt_pending_foreach(0, hdev, cmd_status_rsp, &status);
4105

4106
	mgmt_event(MGMT_EV_INDEX_REMOVED, hdev, NULL, 0, NULL);
4107 4108
}

4109 4110 4111 4112 4113 4114 4115 4116 4117 4118 4119 4120 4121 4122 4123 4124 4125 4126
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);
}

4127
static int powered_update_hci(struct hci_dev *hdev)
4128
{
4129
	struct hci_request req;
4130
	u8 link_sec;
4131

4132 4133
	hci_req_init(&req, hdev);

4134 4135 4136
	if (test_bit(HCI_SSP_ENABLED, &hdev->dev_flags) &&
	    !lmp_host_ssp_capable(hdev)) {
		u8 ssp = 1;
4137

4138
		hci_req_add(&req, HCI_OP_WRITE_SSP_MODE, 1, &ssp);
4139
	}
4140

4141 4142
	if (test_bit(HCI_LE_ENABLED, &hdev->dev_flags) &&
	    lmp_bredr_capable(hdev)) {
4143
		struct hci_cp_write_le_host_supported cp;
4144

4145 4146
		cp.le = 1;
		cp.simul = lmp_le_br_capable(hdev);
4147

4148 4149 4150 4151 4152
		/* 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))
4153 4154
			hci_req_add(&req, HCI_OP_WRITE_LE_HOST_SUPPORTED,
				    sizeof(cp), &cp);
4155
	}
4156

4157 4158 4159 4160 4161
	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);
4162

4163 4164 4165 4166 4167 4168 4169
		/* 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);

4170 4171
		if (test_bit(HCI_ADVERTISING, &hdev->dev_flags))
			enable_advertising(&req);
4172 4173
	}

4174 4175
	link_sec = test_bit(HCI_LINK_SECURITY, &hdev->dev_flags);
	if (link_sec != test_bit(HCI_AUTH, &hdev->flags))
4176 4177
		hci_req_add(&req, HCI_OP_WRITE_AUTH_ENABLE,
			    sizeof(link_sec), &link_sec);
4178

4179
	if (lmp_bredr_capable(hdev)) {
4180 4181
		if (test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags))
			set_bredr_scan(&req);
4182
		update_class(&req);
4183
		update_name(&req);
4184
		update_eir(&req);
4185
	}
4186

4187
	return hci_req_run(&req, powered_complete);
4188
}
4189

4190 4191 4192
int mgmt_powered(struct hci_dev *hdev, u8 powered)
{
	struct cmd_lookup match = { NULL, hdev };
4193 4194
	u8 status_not_powered = MGMT_STATUS_NOT_POWERED;
	u8 zero_cod[] = { 0, 0, 0 };
4195
	int err;
4196

4197 4198 4199 4200
	if (!test_bit(HCI_MGMT, &hdev->dev_flags))
		return 0;

	if (powered) {
4201 4202
		if (powered_update_hci(hdev) == 0)
			return 0;
4203

4204 4205 4206
		mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, settings_rsp,
				     &match);
		goto new_settings;
4207 4208
	}

4209 4210 4211 4212 4213 4214 4215 4216
	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:
4217
	err = new_settings(hdev, match.sk);
4218 4219 4220 4221

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

4222
	return err;
4223
}
4224

4225
void mgmt_set_powered_failed(struct hci_dev *hdev, int err)
4226 4227 4228 4229 4230 4231
{
	struct pending_cmd *cmd;
	u8 status;

	cmd = mgmt_pending_find(MGMT_OP_SET_POWERED, hdev);
	if (!cmd)
4232
		return;
4233 4234 4235 4236 4237 4238

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

4239
	cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_POWERED, status);
4240 4241 4242 4243

	mgmt_pending_remove(cmd);
}

4244
void mgmt_discoverable(struct hci_dev *hdev, u8 discoverable)
4245
{
4246
	bool changed;
4247

4248 4249 4250 4251 4252
	/* 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))
4253
		return;
4254

4255 4256 4257 4258
	if (discoverable)
		changed = !test_and_set_bit(HCI_DISCOVERABLE, &hdev->dev_flags);
	else
		changed = test_and_clear_bit(HCI_DISCOVERABLE, &hdev->dev_flags);
4259

4260
	if (changed)
4261
		new_settings(hdev, NULL);
4262
}
4263

4264
void mgmt_connectable(struct hci_dev *hdev, u8 connectable)
4265
{
4266
	bool changed;
4267

4268 4269 4270 4271 4272
	/* 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))
4273
		return;
4274

4275 4276 4277 4278
	if (connectable)
		changed = !test_and_set_bit(HCI_CONNECTABLE, &hdev->dev_flags);
	else
		changed = test_and_clear_bit(HCI_CONNECTABLE, &hdev->dev_flags);
4279

4280
	if (changed)
4281
		new_settings(hdev, NULL);
4282
}
4283

4284
void mgmt_write_scan_failed(struct hci_dev *hdev, u8 scan, u8 status)
4285
{
4286 4287
	u8 mgmt_err = mgmt_status(status);

4288
	if (scan & SCAN_PAGE)
4289
		mgmt_pending_foreach(MGMT_OP_SET_CONNECTABLE, hdev,
4290
				     cmd_status_rsp, &mgmt_err);
4291 4292

	if (scan & SCAN_INQUIRY)
4293
		mgmt_pending_foreach(MGMT_OP_SET_DISCOVERABLE, hdev,
4294
				     cmd_status_rsp, &mgmt_err);
4295 4296
}

4297 4298
int mgmt_new_link_key(struct hci_dev *hdev, struct link_key *key,
		      bool persistent)
4299
{
4300
	struct mgmt_ev_new_link_key ev;
4301

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

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

4311
	return mgmt_event(MGMT_EV_NEW_LINK_KEY, hdev, &ev, sizeof(ev), NULL);
4312
}
4313

4314 4315 4316 4317 4318 4319 4320 4321
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);
4322
	ev.key.addr.type = link_to_bdaddr(LE_LINK, key->bdaddr_type);
4323 4324 4325 4326 4327 4328 4329 4330 4331 4332
	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));

4333 4334
	return mgmt_event(MGMT_EV_NEW_LONG_TERM_KEY, hdev, &ev, sizeof(ev),
			  NULL);
4335 4336
}

4337 4338 4339
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)
4340
{
4341 4342 4343
	char buf[512];
	struct mgmt_ev_device_connected *ev = (void *) buf;
	u16 eir_len = 0;
4344

4345
	bacpy(&ev->addr.bdaddr, bdaddr);
4346
	ev->addr.type = link_to_bdaddr(link_type, addr_type);
4347

4348
	ev->flags = __cpu_to_le32(flags);
4349

4350 4351
	if (name_len > 0)
		eir_len = eir_append_data(ev->eir, 0, EIR_NAME_COMPLETE,
4352
					  name, name_len);
4353 4354

	if (dev_class && memcmp(dev_class, "\0\0\0", 3) != 0)
4355
		eir_len = eir_append_data(ev->eir, eir_len,
4356
					  EIR_CLASS_OF_DEV, dev_class, 3);
4357

4358
	ev->eir_len = cpu_to_le16(eir_len);
4359

4360 4361
	mgmt_event(MGMT_EV_DEVICE_CONNECTED, hdev, buf,
		    sizeof(*ev) + eir_len, NULL);
4362 4363
}

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

4370 4371
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;
4372

4373
	cmd_complete(cmd->sk, cmd->index, MGMT_OP_DISCONNECT, 0, &rp,
4374
		     sizeof(rp));
4375 4376 4377 4378

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

4379
	mgmt_pending_remove(cmd);
4380 4381
}

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

	memset(&rp, 0, sizeof(rp));
4389 4390
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;
4391

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

4394
	cmd_complete(cmd->sk, cmd->index, cmd->opcode, 0, &rp, sizeof(rp));
4395 4396 4397 4398

	mgmt_pending_remove(cmd);
}

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

4405
	mgmt_pending_foreach(MGMT_OP_DISCONNECT, hdev, disconnect_rsp, &sk);
4406

4407 4408 4409
	bacpy(&ev.addr.bdaddr, bdaddr);
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
	ev.reason = reason;
4410

4411
	mgmt_event(MGMT_EV_DEVICE_DISCONNECTED, hdev, &ev, sizeof(ev), sk);
4412 4413

	if (sk)
4414
		sock_put(sk);
4415

4416
	mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE, hdev, unpair_device_rsp,
4417
			     hdev);
4418 4419
}

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

4426 4427 4428
	mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE, hdev, unpair_device_rsp,
			     hdev);

4429
	cmd = mgmt_pending_find(MGMT_OP_DISCONNECT, hdev);
4430
	if (!cmd)
4431
		return;
4432

4433
	bacpy(&rp.addr.bdaddr, bdaddr);
4434
	rp.addr.type = link_to_bdaddr(link_type, addr_type);
4435

4436 4437
	cmd_complete(cmd->sk, cmd->index, MGMT_OP_DISCONNECT,
		     mgmt_status(status), &rp, sizeof(rp));
4438

4439
	mgmt_pending_remove(cmd);
4440
}
4441

4442 4443
void mgmt_connect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
			 u8 addr_type, u8 status)
4444 4445 4446
{
	struct mgmt_ev_connect_failed ev;

4447
	bacpy(&ev.addr.bdaddr, bdaddr);
4448
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
4449
	ev.status = mgmt_status(status);
4450

4451
	mgmt_event(MGMT_EV_CONNECT_FAILED, hdev, &ev, sizeof(ev), NULL);
4452
}
4453

4454
int mgmt_pin_code_request(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 secure)
4455 4456 4457
{
	struct mgmt_ev_pin_code_request ev;

4458
	bacpy(&ev.addr.bdaddr, bdaddr);
4459
	ev.addr.type = BDADDR_BREDR;
4460
	ev.secure = secure;
4461

4462
	return mgmt_event(MGMT_EV_PIN_CODE_REQUEST, hdev, &ev, sizeof(ev),
4463
			  NULL);
4464 4465
}

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

4473
	cmd = mgmt_pending_find(MGMT_OP_PIN_CODE_REPLY, hdev);
4474 4475 4476
	if (!cmd)
		return -ENOENT;

4477
	bacpy(&rp.addr.bdaddr, bdaddr);
4478
	rp.addr.type = BDADDR_BREDR;
4479

4480
	err = cmd_complete(cmd->sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
4481
			   mgmt_status(status), &rp, sizeof(rp));
4482

4483
	mgmt_pending_remove(cmd);
4484 4485 4486 4487

	return err;
}

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

4495
	cmd = mgmt_pending_find(MGMT_OP_PIN_CODE_NEG_REPLY, hdev);
4496 4497 4498
	if (!cmd)
		return -ENOENT;

4499
	bacpy(&rp.addr.bdaddr, bdaddr);
4500
	rp.addr.type = BDADDR_BREDR;
4501

4502
	err = cmd_complete(cmd->sk, hdev->id, MGMT_OP_PIN_CODE_NEG_REPLY,
4503
			   mgmt_status(status), &rp, sizeof(rp));
4504

4505
	mgmt_pending_remove(cmd);
4506 4507 4508

	return err;
}
4509

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

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

4518
	bacpy(&ev.addr.bdaddr, bdaddr);
4519
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
4520
	ev.confirm_hint = confirm_hint;
4521
	ev.value = value;
4522

4523
	return mgmt_event(MGMT_EV_USER_CONFIRM_REQUEST, hdev, &ev, sizeof(ev),
4524
			  NULL);
4525 4526
}

4527
int mgmt_user_passkey_request(struct hci_dev *hdev, bdaddr_t *bdaddr,
4528
			      u8 link_type, u8 addr_type)
4529 4530 4531 4532 4533
{
	struct mgmt_ev_user_passkey_request ev;

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

4534
	bacpy(&ev.addr.bdaddr, bdaddr);
4535
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
4536 4537

	return mgmt_event(MGMT_EV_USER_PASSKEY_REQUEST, hdev, &ev, sizeof(ev),
4538
			  NULL);
4539 4540
}

4541
static int user_pairing_resp_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
4542 4543
				      u8 link_type, u8 addr_type, u8 status,
				      u8 opcode)
4544 4545 4546 4547 4548
{
	struct pending_cmd *cmd;
	struct mgmt_rp_user_confirm_reply rp;
	int err;

4549
	cmd = mgmt_pending_find(opcode, hdev);
4550 4551 4552
	if (!cmd)
		return -ENOENT;

4553
	bacpy(&rp.addr.bdaddr, bdaddr);
4554
	rp.addr.type = link_to_bdaddr(link_type, addr_type);
4555
	err = cmd_complete(cmd->sk, hdev->id, opcode, mgmt_status(status),
4556
			   &rp, sizeof(rp));
4557

4558
	mgmt_pending_remove(cmd);
4559 4560 4561 4562

	return err;
}

4563
int mgmt_user_confirm_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
4564
				     u8 link_type, u8 addr_type, u8 status)
4565
{
4566
	return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
4567
					  status, MGMT_OP_USER_CONFIRM_REPLY);
4568 4569
}

4570
int mgmt_user_confirm_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
4571
					 u8 link_type, u8 addr_type, u8 status)
4572
{
4573
	return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
4574 4575
					  status,
					  MGMT_OP_USER_CONFIRM_NEG_REPLY);
4576
}
4577

4578
int mgmt_user_passkey_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
4579
				     u8 link_type, u8 addr_type, u8 status)
4580
{
4581
	return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
4582
					  status, MGMT_OP_USER_PASSKEY_REPLY);
4583 4584
}

4585
int mgmt_user_passkey_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
4586
					 u8 link_type, u8 addr_type, u8 status)
4587
{
4588
	return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
4589 4590
					  status,
					  MGMT_OP_USER_PASSKEY_NEG_REPLY);
4591 4592
}

4593 4594 4595 4596 4597 4598 4599 4600 4601 4602 4603 4604 4605 4606 4607 4608
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);
}

4609
int mgmt_auth_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
4610
		     u8 addr_type, u8 status)
4611 4612 4613
{
	struct mgmt_ev_auth_failed ev;

4614
	bacpy(&ev.addr.bdaddr, bdaddr);
4615
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
4616
	ev.status = mgmt_status(status);
4617

4618
	return mgmt_event(MGMT_EV_AUTH_FAILED, hdev, &ev, sizeof(ev), NULL);
4619
}
4620

4621 4622 4623
int mgmt_auth_enable_complete(struct hci_dev *hdev, u8 status)
{
	struct cmd_lookup match = { NULL, hdev };
4624 4625
	bool changed = false;
	int err = 0;
4626 4627 4628 4629

	if (status) {
		u8 mgmt_err = mgmt_status(status);
		mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev,
4630
				     cmd_status_rsp, &mgmt_err);
4631 4632 4633
		return 0;
	}

4634 4635 4636 4637 4638 4639 4640 4641
	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;
	}

4642
	mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev, settings_rsp,
4643
			     &match);
4644

4645 4646
	if (changed)
		err = new_settings(hdev, match.sk);
4647 4648 4649 4650 4651 4652 4653

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

	return err;
}

4654
static void clear_eir(struct hci_request *req)
4655
{
4656
	struct hci_dev *hdev = req->hdev;
4657 4658
	struct hci_cp_write_eir cp;

4659
	if (!lmp_ext_inq_capable(hdev))
4660
		return;
4661

4662 4663
	memset(hdev->eir, 0, sizeof(hdev->eir));

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

4666
	hci_req_add(req, HCI_OP_WRITE_EIR, sizeof(cp), &cp);
4667 4668
}

4669
int mgmt_ssp_enable_complete(struct hci_dev *hdev, u8 enable, u8 status)
4670 4671
{
	struct cmd_lookup match = { NULL, hdev };
4672
	struct hci_request req;
4673 4674
	bool changed = false;
	int err = 0;
4675 4676 4677

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

		if (enable && test_and_clear_bit(HCI_SSP_ENABLED,
4680 4681
						 &hdev->dev_flags)) {
			clear_bit(HCI_HS_ENABLED, &hdev->dev_flags);
4682
			err = new_settings(hdev, NULL);
4683
		}
4684

4685 4686
		mgmt_pending_foreach(MGMT_OP_SET_SSP, hdev, cmd_status_rsp,
				     &mgmt_err);
4687 4688 4689 4690 4691

		return err;
	}

	if (enable) {
4692
		changed = !test_and_set_bit(HCI_SSP_ENABLED, &hdev->dev_flags);
4693
	} else {
4694 4695 4696 4697 4698 4699
		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);
4700 4701 4702 4703
	}

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

4704 4705
	if (changed)
		err = new_settings(hdev, match.sk);
4706

4707
	if (match.sk)
4708 4709
		sock_put(match.sk);

4710 4711
	hci_req_init(&req, hdev);

4712
	if (test_bit(HCI_SSP_ENABLED, &hdev->dev_flags))
4713
		update_eir(&req);
4714
	else
4715 4716 4717
		clear_eir(&req);

	hci_req_run(&req, NULL);
4718

4719 4720 4721
	return err;
}

4722
static void sk_lookup(struct pending_cmd *cmd, void *data)
4723 4724 4725 4726 4727 4728 4729 4730 4731
{
	struct cmd_lookup *match = data;

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

4732
int mgmt_set_class_of_dev_complete(struct hci_dev *hdev, u8 *dev_class,
4733
				   u8 status)
4734
{
4735 4736
	struct cmd_lookup match = { NULL, hdev, mgmt_status(status) };
	int err = 0;
4737

4738 4739 4740
	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);
4741 4742

	if (!status)
4743 4744
		err = mgmt_event(MGMT_EV_CLASS_OF_DEV_CHANGED, hdev, dev_class,
				 3, NULL);
4745 4746 4747

	if (match.sk)
		sock_put(match.sk);
4748 4749 4750 4751

	return err;
}

4752
int mgmt_set_local_name_complete(struct hci_dev *hdev, u8 *name, u8 status)
4753 4754
{
	struct mgmt_cp_set_local_name ev;
4755
	struct pending_cmd *cmd;
4756

4757 4758
	if (status)
		return 0;
4759 4760 4761

	memset(&ev, 0, sizeof(ev));
	memcpy(ev.name, name, HCI_MAX_NAME_LENGTH);
4762
	memcpy(ev.short_name, hdev->short_name, HCI_MAX_SHORT_NAME_LENGTH);
4763

4764
	cmd = mgmt_pending_find(MGMT_OP_SET_LOCAL_NAME, hdev);
4765 4766
	if (!cmd) {
		memcpy(hdev->dev_name, name, sizeof(hdev->dev_name));
4767

4768 4769 4770 4771 4772
		/* 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;
4773
	}
4774

4775 4776
	return mgmt_event(MGMT_EV_LOCAL_NAME_CHANGED, hdev, &ev, sizeof(ev),
			  cmd ? cmd->sk : NULL);
4777
}
4778

4779
int mgmt_read_local_oob_data_reply_complete(struct hci_dev *hdev, u8 *hash,
4780
					    u8 *randomizer, u8 status)
4781 4782 4783 4784
{
	struct pending_cmd *cmd;
	int err;

4785
	BT_DBG("%s status %u", hdev->name, status);
4786

4787
	cmd = mgmt_pending_find(MGMT_OP_READ_LOCAL_OOB_DATA, hdev);
4788 4789 4790 4791
	if (!cmd)
		return -ENOENT;

	if (status) {
4792 4793
		err = cmd_status(cmd->sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
				 mgmt_status(status));
4794 4795 4796 4797 4798 4799
	} else {
		struct mgmt_rp_read_local_oob_data rp;

		memcpy(rp.hash, hash, sizeof(rp.hash));
		memcpy(rp.randomizer, randomizer, sizeof(rp.randomizer));

4800
		err = cmd_complete(cmd->sk, hdev->id,
4801 4802
				   MGMT_OP_READ_LOCAL_OOB_DATA, 0, &rp,
				   sizeof(rp));
4803 4804 4805 4806 4807 4808
	}

	mgmt_pending_remove(cmd);

	return err;
}
4809

4810 4811 4812
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)
4813
{
4814 4815
	char buf[512];
	struct mgmt_ev_device_found *ev = (void *) buf;
4816
	size_t ev_size;
4817

4818
	if (!hci_discovery_active(hdev))
4819
		return;
4820

4821 4822
	/* Leave 5 bytes for a potential CoD field */
	if (sizeof(*ev) + eir_len + 5 > sizeof(buf))
4823
		return;
4824

4825 4826
	memset(buf, 0, sizeof(buf));

4827
	bacpy(&ev->addr.bdaddr, bdaddr);
4828
	ev->addr.type = link_to_bdaddr(link_type, addr_type);
4829
	ev->rssi = rssi;
4830
	if (cfm_name)
4831
		ev->flags |= __constant_cpu_to_le32(MGMT_DEV_FOUND_CONFIRM_NAME);
4832
	if (!ssp)
4833
		ev->flags |= __constant_cpu_to_le32(MGMT_DEV_FOUND_LEGACY_PAIRING);
4834

4835
	if (eir_len > 0)
4836
		memcpy(ev->eir, eir, eir_len);
4837

4838 4839
	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,
4840
					  dev_class, 3);
4841

4842
	ev->eir_len = cpu_to_le16(eir_len);
4843
	ev_size = sizeof(*ev) + eir_len;
4844

4845
	mgmt_event(MGMT_EV_DEVICE_FOUND, hdev, ev, ev_size, NULL);
4846
}
4847

4848 4849
void mgmt_remote_name(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
		      u8 addr_type, s8 rssi, u8 *name, u8 name_len)
4850
{
4851 4852 4853
	struct mgmt_ev_device_found *ev;
	char buf[sizeof(*ev) + HCI_MAX_NAME_LENGTH + 2];
	u16 eir_len;
4854

4855
	ev = (struct mgmt_ev_device_found *) buf;
4856

4857 4858 4859
	memset(buf, 0, sizeof(buf));

	bacpy(&ev->addr.bdaddr, bdaddr);
4860
	ev->addr.type = link_to_bdaddr(link_type, addr_type);
4861 4862 4863
	ev->rssi = rssi;

	eir_len = eir_append_data(ev->eir, 0, EIR_NAME_COMPLETE, name,
4864
				  name_len);
4865

4866
	ev->eir_len = cpu_to_le16(eir_len);
4867

4868
	mgmt_event(MGMT_EV_DEVICE_FOUND, hdev, ev, sizeof(*ev) + eir_len, NULL);
4869
}
4870

4871
void mgmt_discovering(struct hci_dev *hdev, u8 discovering)
4872
{
4873
	struct mgmt_ev_discovering ev;
4874 4875
	struct pending_cmd *cmd;

4876 4877
	BT_DBG("%s discovering %u", hdev->name, discovering);

4878
	if (discovering)
4879
		cmd = mgmt_pending_find(MGMT_OP_START_DISCOVERY, hdev);
4880
	else
4881
		cmd = mgmt_pending_find(MGMT_OP_STOP_DISCOVERY, hdev);
4882 4883

	if (cmd != NULL) {
4884 4885
		u8 type = hdev->discovery.type;

4886 4887
		cmd_complete(cmd->sk, hdev->id, cmd->opcode, 0, &type,
			     sizeof(type));
4888 4889 4890
		mgmt_pending_remove(cmd);
	}

4891 4892 4893 4894
	memset(&ev, 0, sizeof(ev));
	ev.type = hdev->discovery.type;
	ev.discovering = discovering;

4895
	mgmt_event(MGMT_EV_DISCOVERING, hdev, &ev, sizeof(ev), NULL);
4896
}
4897

4898
int mgmt_device_blocked(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type)
4899 4900 4901 4902
{
	struct pending_cmd *cmd;
	struct mgmt_ev_device_blocked ev;

4903
	cmd = mgmt_pending_find(MGMT_OP_BLOCK_DEVICE, hdev);
4904

4905 4906
	bacpy(&ev.addr.bdaddr, bdaddr);
	ev.addr.type = type;
4907

4908
	return mgmt_event(MGMT_EV_DEVICE_BLOCKED, hdev, &ev, sizeof(ev),
4909
			  cmd ? cmd->sk : NULL);
4910 4911
}

4912
int mgmt_device_unblocked(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type)
4913 4914 4915 4916
{
	struct pending_cmd *cmd;
	struct mgmt_ev_device_unblocked ev;

4917
	cmd = mgmt_pending_find(MGMT_OP_UNBLOCK_DEVICE, hdev);
4918

4919 4920
	bacpy(&ev.addr.bdaddr, bdaddr);
	ev.addr.type = type;
4921

4922
	return mgmt_event(MGMT_EV_DEVICE_UNBLOCKED, hdev, &ev, sizeof(ev),
4923
			  cmd ? cmd->sk : NULL);
4924
}
4925 4926 4927 4928 4929 4930 4931 4932

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);
4933
		new_settings(hdev, NULL);
4934 4935 4936 4937 4938 4939 4940
	}
}

void mgmt_reenable_advertising(struct hci_dev *hdev)
{
	struct hci_request req;

4941
	if (hci_conn_num(hdev, LE_LINK) > 0)
4942 4943 4944 4945 4946 4947 4948 4949 4950 4951 4952 4953 4954
		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);
4955
		new_settings(hdev, NULL);
4956 4957
	}
}