mgmt.c 119.4 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
static struct pending_cmd *mgmt_pending_find(u16 opcode, struct hci_dev *hdev)
{
	struct pending_cmd *cmd;

	list_for_each_entry(cmd, &hdev->mgmt_pending, list) {
		if (cmd->opcode == opcode)
			return cmd;
	}

	return NULL;
}

551 552
static u8 create_scan_rsp_data(struct hci_dev *hdev, u8 *ptr)
{
553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574
	u8 ad_len = 0;
	size_t name_len;

	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;
575 576 577 578 579 580 581 582
}

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

583
	if (!test_bit(HCI_LE_ENABLED, &hdev->dev_flags))
584 585 586 587 588 589
		return;

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

	len = create_scan_rsp_data(hdev, cp.data);

590 591
	if (hdev->scan_rsp_data_len == len &&
	    memcmp(cp.data, hdev->scan_rsp_data, len) == 0)
592 593
		return;

594 595
	memcpy(hdev->scan_rsp_data, cp.data, sizeof(cp.data));
	hdev->scan_rsp_data_len = len;
596 597 598 599 600 601

	cp.length = len;

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

602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625
static u8 get_adv_discov_flags(struct hci_dev *hdev)
{
	struct pending_cmd *cmd;

	/* If there's a pending mgmt command the flags will not yet have
	 * their final values, so check for this first.
	 */
	cmd = mgmt_pending_find(MGMT_OP_SET_DISCOVERABLE, hdev);
	if (cmd) {
		struct mgmt_mode *cp = cmd->param;
		if (cp->val == 0x01)
			return LE_AD_GENERAL;
		else if (cp->val == 0x02)
			return LE_AD_LIMITED;
	} else {
		if (test_bit(HCI_LIMITED_DISCOVERABLE, &hdev->dev_flags))
			return LE_AD_LIMITED;
		else if (test_bit(HCI_DISCOVERABLE, &hdev->dev_flags))
			return LE_AD_GENERAL;
	}

	return 0;
}

626
static u8 create_adv_data(struct hci_dev *hdev, u8 *ptr)
627 628 629
{
	u8 ad_len = 0, flags = 0;

630
	flags |= get_adv_discov_flags(hdev);
631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663

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

	return ad_len;
}

664
static void update_adv_data(struct hci_request *req)
665 666 667 668 669
{
	struct hci_dev *hdev = req->hdev;
	struct hci_cp_le_set_adv_data cp;
	u8 len;

670
	if (!test_bit(HCI_LE_ENABLED, &hdev->dev_flags))
671 672 673 674
		return;

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

675
	len = create_adv_data(hdev, cp.data);
676 677 678 679 680 681 682 683 684 685 686 687 688

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

689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711
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);
	}

712
	if (hdev->inq_tx_power != HCI_TX_POWER_INVALID) {
713 714 715 716 717 718 719
		ptr[0] = 2;
		ptr[1] = EIR_TX_POWER;
		ptr[2] = (u8) hdev->inq_tx_power;

		ptr += 3;
	}

720 721 722 723 724 725 726 727 728 729 730 731
	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;
	}

732
	ptr = create_uuid16_list(hdev, ptr, HCI_MAX_EIR_LENGTH - (ptr - data));
733
	ptr = create_uuid32_list(hdev, ptr, HCI_MAX_EIR_LENGTH - (ptr - data));
734
	ptr = create_uuid128_list(hdev, ptr, HCI_MAX_EIR_LENGTH - (ptr - data));
735 736
}

737
static void update_eir(struct hci_request *req)
738
{
739
	struct hci_dev *hdev = req->hdev;
740 741
	struct hci_cp_write_eir cp;

742
	if (!hdev_is_powered(hdev))
743
		return;
744

745
	if (!lmp_ext_inq_capable(hdev))
746
		return;
747

748
	if (!test_bit(HCI_SSP_ENABLED, &hdev->dev_flags))
749
		return;
750

751
	if (test_bit(HCI_SERVICE_CACHE, &hdev->dev_flags))
752
		return;
753 754 755 756 757 758

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

	create_eir(hdev, cp.data);

	if (memcmp(cp.data, hdev->eir, sizeof(cp.data)) == 0)
759
		return;
760 761 762

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

763
	hci_req_add(req, HCI_OP_WRITE_EIR, sizeof(cp), &cp);
764 765 766 767 768 769 770 771 772 773 774 775 776
}

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

777
static void update_class(struct hci_request *req)
778
{
779
	struct hci_dev *hdev = req->hdev;
780 781 782 783
	u8 cod[3];

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

784
	if (!hdev_is_powered(hdev))
785
		return;
786

787 788 789
	if (!test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags))
		return;

790
	if (test_bit(HCI_SERVICE_CACHE, &hdev->dev_flags))
791
		return;
792 793 794 795 796

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

797 798 799
	if (test_bit(HCI_LIMITED_DISCOVERABLE, &hdev->dev_flags))
		cod[1] |= 0x20;

800
	if (memcmp(cod, hdev->dev_class, 3) == 0)
801
		return;
802

803
	hci_req_add(req, HCI_OP_WRITE_CLASS_OF_DEV, sizeof(cod), cod);
804 805
}

806 807 808
static void service_cache_off(struct work_struct *work)
{
	struct hci_dev *hdev = container_of(work, struct hci_dev,
809
					    service_cache.work);
810
	struct hci_request req;
811

812
	if (!test_and_clear_bit(HCI_SERVICE_CACHE, &hdev->dev_flags))
813 814
		return;

815 816
	hci_req_init(&req, hdev);

817 818
	hci_dev_lock(hdev);

819 820
	update_eir(&req);
	update_class(&req);
821 822

	hci_dev_unlock(hdev);
823 824

	hci_req_run(&req, NULL);
825 826
}

827
static void mgmt_init_hdev(struct sock *sk, struct hci_dev *hdev)
828
{
829
	if (test_and_set_bit(HCI_MGMT, &hdev->dev_flags))
830 831
		return;

832
	INIT_DELAYED_WORK(&hdev->service_cache, service_cache_off);
833

834 835 836 837 838 839
	/* 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);
840 841
}

842
static int read_controller_info(struct sock *sk, struct hci_dev *hdev,
843
				void *data, u16 data_len)
844
{
845
	struct mgmt_rp_read_info rp;
846

847
	BT_DBG("sock %p %s", sk, hdev->name);
848

849
	hci_dev_lock(hdev);
850

851 852
	memset(&rp, 0, sizeof(rp));

853
	bacpy(&rp.bdaddr, &hdev->bdaddr);
854

855
	rp.version = hdev->hci_ver;
856
	rp.manufacturer = cpu_to_le16(hdev->manufacturer);
857 858 859

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

861
	memcpy(rp.dev_class, hdev->dev_class, 3);
862

863
	memcpy(rp.name, hdev->dev_name, sizeof(hdev->dev_name));
864
	memcpy(rp.short_name, hdev->short_name, sizeof(hdev->short_name));
865

866
	hci_dev_unlock(hdev);
867

868
	return cmd_complete(sk, hdev->id, MGMT_OP_READ_INFO, 0, &rp,
869
			    sizeof(rp));
870 871
}

872 873 874
static void mgmt_pending_free(struct pending_cmd *cmd)
{
	sock_put(cmd->sk);
875
	kfree(cmd->param);
876 877 878
	kfree(cmd);
}

879
static struct pending_cmd *mgmt_pending_add(struct sock *sk, u16 opcode,
880 881
					    struct hci_dev *hdev, void *data,
					    u16 len)
882 883 884
{
	struct pending_cmd *cmd;

885
	cmd = kmalloc(sizeof(*cmd), GFP_KERNEL);
886
	if (!cmd)
887
		return NULL;
888 889

	cmd->opcode = opcode;
890
	cmd->index = hdev->id;
891

892
	cmd->param = kmalloc(len, GFP_KERNEL);
893
	if (!cmd->param) {
894
		kfree(cmd);
895
		return NULL;
896 897
	}

898 899
	if (data)
		memcpy(cmd->param, data, len);
900 901 902 903

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

904
	list_add(&cmd->list, &hdev->mgmt_pending);
905

906
	return cmd;
907 908
}

909
static void mgmt_pending_foreach(u16 opcode, struct hci_dev *hdev,
910 911
				 void (*cb)(struct pending_cmd *cmd,
					    void *data),
912
				 void *data)
913
{
914
	struct pending_cmd *cmd, *tmp;
915

916
	list_for_each_entry_safe(cmd, tmp, &hdev->mgmt_pending, list) {
917
		if (opcode > 0 && cmd->opcode != opcode)
918 919 920 921 922 923
			continue;

		cb(cmd, data);
	}
}

924
static void mgmt_pending_remove(struct pending_cmd *cmd)
925 926 927 928 929
{
	list_del(&cmd->list);
	mgmt_pending_free(cmd);
}

930
static int send_settings_rsp(struct sock *sk, u16 opcode, struct hci_dev *hdev)
931
{
932
	__le32 settings = cpu_to_le32(get_current_settings(hdev));
933

934
	return cmd_complete(sk, hdev->id, opcode, 0, &settings,
935
			    sizeof(settings));
936 937
}

938
static int set_powered(struct sock *sk, struct hci_dev *hdev, void *data,
939
		       u16 len)
940
{
941
	struct mgmt_mode *cp = data;
942
	struct pending_cmd *cmd;
943
	int err;
944

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

947 948 949 950
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_POWERED,
				  MGMT_STATUS_INVALID_PARAMS);

951
	hci_dev_lock(hdev);
952

953 954 955 956 957 958
	if (mgmt_pending_find(MGMT_OP_SET_POWERED, hdev)) {
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_POWERED,
				 MGMT_STATUS_BUSY);
		goto failed;
	}

959 960 961 962
	if (test_and_clear_bit(HCI_AUTO_OFF, &hdev->dev_flags)) {
		cancel_delayed_work(&hdev->power_off);

		if (cp->val) {
963 964 965
			mgmt_pending_add(sk, MGMT_OP_SET_POWERED, hdev,
					 data, len);
			err = mgmt_powered(hdev, 1);
966 967 968 969
			goto failed;
		}
	}

970
	if (!!cp->val == hdev_is_powered(hdev)) {
971
		err = send_settings_rsp(sk, MGMT_OP_SET_POWERED, hdev);
972 973 974
		goto failed;
	}

975
	cmd = mgmt_pending_add(sk, MGMT_OP_SET_POWERED, hdev, data, len);
976 977
	if (!cmd) {
		err = -ENOMEM;
978
		goto failed;
979
	}
980

981
	if (cp->val)
982
		queue_work(hdev->req_workqueue, &hdev->power_on);
983
	else
984
		queue_work(hdev->req_workqueue, &hdev->power_off.work);
985

986
	err = 0;
987 988

failed:
989
	hci_dev_unlock(hdev);
990
	return err;
991 992
}

993 994
static int mgmt_event(u16 event, struct hci_dev *hdev, void *data, u16 data_len,
		      struct sock *skip_sk)
995 996 997 998
{
	struct sk_buff *skb;
	struct mgmt_hdr *hdr;

999
	skb = alloc_skb(sizeof(*hdr) + data_len, GFP_KERNEL);
1000 1001 1002 1003 1004 1005 1006 1007
	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
1008
		hdr->index = __constant_cpu_to_le16(MGMT_INDEX_NONE);
1009 1010 1011 1012 1013
	hdr->len = cpu_to_le16(data_len);

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

1014 1015 1016
	/* Time stamp */
	__net_timestamp(skb);

1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031
	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);
}

1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061
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);
}

1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081
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;
}

1082 1083 1084 1085
static void set_discoverable_complete(struct hci_dev *hdev, u8 status)
{
	struct pending_cmd *cmd;
	struct mgmt_mode *cp;
1086
	struct hci_request req;
1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099
	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);
1100
		clear_bit(HCI_LIMITED_DISCOVERABLE, &hdev->dev_flags);
1101 1102 1103 1104
		goto remove_cmd;
	}

	cp = cmd->param;
1105
	if (cp->val) {
1106 1107
		changed = !test_and_set_bit(HCI_DISCOVERABLE,
					    &hdev->dev_flags);
1108 1109 1110 1111 1112 1113 1114

		if (hdev->discov_timeout > 0) {
			int to = msecs_to_jiffies(hdev->discov_timeout * 1000);
			queue_delayed_work(hdev->workqueue, &hdev->discov_off,
					   to);
		}
	} else {
1115 1116
		changed = test_and_clear_bit(HCI_DISCOVERABLE,
					     &hdev->dev_flags);
1117
	}
1118 1119 1120 1121 1122 1123

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

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

1124 1125 1126 1127 1128 1129 1130 1131
	/* 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);

1132 1133 1134 1135 1136 1137 1138
remove_cmd:
	mgmt_pending_remove(cmd);

unlock:
	hci_dev_unlock(hdev);
}

1139
static int set_discoverable(struct sock *sk, struct hci_dev *hdev, void *data,
1140
			    u16 len)
1141
{
1142
	struct mgmt_cp_set_discoverable *cp = data;
1143
	struct pending_cmd *cmd;
1144
	struct hci_request req;
1145
	u16 timeout;
1146
	u8 scan;
1147 1148
	int err;

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

1151 1152
	if (!test_bit(HCI_LE_ENABLED, &hdev->dev_flags) &&
	    !test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags))
1153
		return cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
1154
				  MGMT_STATUS_REJECTED);
1155

1156
	if (cp->val != 0x00 && cp->val != 0x01 && cp->val != 0x02)
1157 1158 1159
		return cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
				  MGMT_STATUS_INVALID_PARAMS);

1160
	timeout = __le16_to_cpu(cp->timeout);
1161 1162 1163 1164 1165 1166

	/* Disabling discoverable requires that no timeout is set,
	 * and enabling limited discoverable requires a timeout.
	 */
	if ((cp->val == 0x00 && timeout > 0) ||
	    (cp->val == 0x02 && timeout == 0))
1167
		return cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
1168
				  MGMT_STATUS_INVALID_PARAMS);
1169

1170
	hci_dev_lock(hdev);
1171

1172
	if (!hdev_is_powered(hdev) && timeout > 0) {
1173
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
1174
				 MGMT_STATUS_NOT_POWERED);
1175 1176 1177
		goto failed;
	}

1178
	if (mgmt_pending_find(MGMT_OP_SET_DISCOVERABLE, hdev) ||
1179
	    mgmt_pending_find(MGMT_OP_SET_CONNECTABLE, hdev)) {
1180
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
1181
				 MGMT_STATUS_BUSY);
1182 1183 1184
		goto failed;
	}

1185
	if (!test_bit(HCI_CONNECTABLE, &hdev->dev_flags)) {
1186
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
1187
				 MGMT_STATUS_REJECTED);
1188 1189 1190 1191
		goto failed;
	}

	if (!hdev_is_powered(hdev)) {
1192 1193
		bool changed = false;

1194 1195 1196 1197
		/* Setting limited discoverable when powered off is
		 * not a valid operation since it requires a timeout
		 * and so no need to check HCI_LIMITED_DISCOVERABLE.
		 */
1198 1199 1200 1201 1202
		if (!!cp->val != test_bit(HCI_DISCOVERABLE, &hdev->dev_flags)) {
			change_bit(HCI_DISCOVERABLE, &hdev->dev_flags);
			changed = true;
		}

1203
		err = send_settings_rsp(sk, MGMT_OP_SET_DISCOVERABLE, hdev);
1204 1205 1206 1207 1208 1209
		if (err < 0)
			goto failed;

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

1210 1211 1212
		goto failed;
	}

1213 1214 1215 1216 1217 1218 1219
	/* If the current mode is the same, then just update the timeout
	 * value with the new value. And if only the timeout gets updated,
	 * then no need for any HCI transactions.
	 */
	if (!!cp->val == test_bit(HCI_DISCOVERABLE, &hdev->dev_flags) &&
	    (cp->val == 0x02) == test_bit(HCI_LIMITED_DISCOVERABLE,
					  &hdev->dev_flags)) {
1220 1221
		cancel_delayed_work(&hdev->discov_off);
		hdev->discov_timeout = timeout;
1222

1223 1224
		if (cp->val && hdev->discov_timeout > 0) {
			int to = msecs_to_jiffies(hdev->discov_timeout * 1000);
1225
			queue_delayed_work(hdev->workqueue, &hdev->discov_off,
1226
					   to);
1227 1228
		}

1229
		err = send_settings_rsp(sk, MGMT_OP_SET_DISCOVERABLE, hdev);
1230 1231 1232
		goto failed;
	}

1233
	cmd = mgmt_pending_add(sk, MGMT_OP_SET_DISCOVERABLE, hdev, data, len);
1234 1235
	if (!cmd) {
		err = -ENOMEM;
1236
		goto failed;
1237
	}
1238

1239 1240 1241 1242 1243 1244 1245
	/* Cancel any potential discoverable timeout that might be
	 * still active and store new timeout value. The arming of
	 * the timeout happens in the complete handler.
	 */
	cancel_delayed_work(&hdev->discov_off);
	hdev->discov_timeout = timeout;

1246 1247 1248 1249 1250 1251
	/* Limited discoverable mode */
	if (cp->val == 0x02)
		set_bit(HCI_LIMITED_DISCOVERABLE, &hdev->dev_flags);
	else
		clear_bit(HCI_LIMITED_DISCOVERABLE, &hdev->dev_flags);

1252 1253
	hci_req_init(&req, hdev);

1254 1255 1256 1257 1258 1259
	/* The procedure for LE-only controllers is much simpler - just
	 * update the advertising data.
	 */
	if (!test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags))
		goto update_ad;

1260 1261
	scan = SCAN_PAGE;

1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284
	if (cp->val) {
		struct hci_cp_write_current_iac_lap hci_cp;

		if (cp->val == 0x02) {
			/* Limited discoverable mode */
			hci_cp.num_iac = 2;
			hci_cp.iac_lap[0] = 0x00;	/* LIAC */
			hci_cp.iac_lap[1] = 0x8b;
			hci_cp.iac_lap[2] = 0x9e;
			hci_cp.iac_lap[3] = 0x33;	/* GIAC */
			hci_cp.iac_lap[4] = 0x8b;
			hci_cp.iac_lap[5] = 0x9e;
		} else {
			/* General discoverable mode */
			hci_cp.num_iac = 1;
			hci_cp.iac_lap[0] = 0x33;	/* GIAC */
			hci_cp.iac_lap[1] = 0x8b;
			hci_cp.iac_lap[2] = 0x9e;
		}

		hci_req_add(&req, HCI_OP_WRITE_CURRENT_IAC_LAP,
			    (hci_cp.num_iac * 3) + 1, &hci_cp);

1285
		scan |= SCAN_INQUIRY;
1286 1287 1288
	} else {
		clear_bit(HCI_LIMITED_DISCOVERABLE, &hdev->dev_flags);
	}
1289

1290
	hci_req_add(&req, HCI_OP_WRITE_SCAN_ENABLE, sizeof(scan), &scan);
1291

1292 1293 1294
update_ad:
	update_adv_data(&req);

1295
	err = hci_req_run(&req, set_discoverable_complete);
1296
	if (err < 0)
1297
		mgmt_pending_remove(cmd);
1298 1299

failed:
1300
	hci_dev_unlock(hdev);
1301 1302 1303
	return err;
}

1304 1305
static void write_fast_connectable(struct hci_request *req, bool enable)
{
1306
	struct hci_dev *hdev = req->hdev;
1307 1308 1309
	struct hci_cp_write_page_scan_activity acp;
	u8 type;

1310 1311 1312
	if (hdev->hci_ver < BLUETOOTH_VER_1_2)
		return;

1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326
	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);

1327 1328 1329 1330 1331 1332 1333
	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);
1334 1335
}

1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354
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;
}

1355 1356 1357 1358 1359 1360 1361 1362 1363
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);
1364
	cp.type = get_adv_type(hdev);
1365
	cp.own_address_type = hdev->own_addr_type;
1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379
	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);
}

1380 1381 1382
static void set_connectable_complete(struct hci_dev *hdev, u8 status)
{
	struct pending_cmd *cmd;
1383 1384
	struct mgmt_mode *cp;
	bool changed;
1385 1386 1387 1388 1389 1390 1391 1392 1393

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

	hci_dev_lock(hdev);

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

1394 1395 1396 1397 1398 1399
	if (status) {
		u8 mgmt_err = mgmt_status(status);
		cmd_status(cmd->sk, cmd->index, cmd->opcode, mgmt_err);
		goto remove_cmd;
	}

1400 1401 1402 1403 1404 1405
	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);

1406 1407
	send_settings_rsp(cmd->sk, MGMT_OP_SET_CONNECTABLE, hdev);

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

1411
remove_cmd:
1412 1413 1414 1415 1416 1417
	mgmt_pending_remove(cmd);

unlock:
	hci_dev_unlock(hdev);
}

1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443
static int set_connectable_update_settings(struct hci_dev *hdev,
					   struct sock *sk, u8 val)
{
	bool changed = false;
	int err;

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

	if (val) {
		set_bit(HCI_CONNECTABLE, &hdev->dev_flags);
	} else {
		clear_bit(HCI_CONNECTABLE, &hdev->dev_flags);
		clear_bit(HCI_DISCOVERABLE, &hdev->dev_flags);
	}

	err = send_settings_rsp(sk, MGMT_OP_SET_CONNECTABLE, hdev);
	if (err < 0)
		return err;

	if (changed)
		return new_settings(hdev, sk);

	return 0;
}

1444
static int set_connectable(struct sock *sk, struct hci_dev *hdev, void *data,
1445
			   u16 len)
1446
{
1447
	struct mgmt_mode *cp = data;
1448
	struct pending_cmd *cmd;
1449
	struct hci_request req;
1450
	u8 scan;
1451 1452
	int err;

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

1455 1456
	if (!test_bit(HCI_LE_ENABLED, &hdev->dev_flags) &&
	    !test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags))
1457
		return cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE,
1458
				  MGMT_STATUS_REJECTED);
1459

1460 1461 1462 1463
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE,
				  MGMT_STATUS_INVALID_PARAMS);

1464
	hci_dev_lock(hdev);
1465

1466
	if (!hdev_is_powered(hdev)) {
1467
		err = set_connectable_update_settings(hdev, sk, cp->val);
1468 1469 1470
		goto failed;
	}

1471
	if (mgmt_pending_find(MGMT_OP_SET_DISCOVERABLE, hdev) ||
1472
	    mgmt_pending_find(MGMT_OP_SET_CONNECTABLE, hdev)) {
1473
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE,
1474
				 MGMT_STATUS_BUSY);
1475 1476 1477
		goto failed;
	}

1478
	cmd = mgmt_pending_add(sk, MGMT_OP_SET_CONNECTABLE, hdev, data, len);
1479 1480
	if (!cmd) {
		err = -ENOMEM;
1481
		goto failed;
1482
	}
1483

1484
	hci_req_init(&req, hdev);
1485

1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496
	/* If BR/EDR is not enabled and we disable advertising as a
	 * by-product of disabling connectable, we need to update the
	 * advertising flags.
	 */
	if (!test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags)) {
		if (!cp->val) {
			clear_bit(HCI_LIMITED_DISCOVERABLE, &hdev->dev_flags);
			clear_bit(HCI_DISCOVERABLE, &hdev->dev_flags);
		}
		update_adv_data(&req);
	} else if (cp->val != test_bit(HCI_PSCAN, &hdev->flags)) {
1497 1498 1499 1500 1501 1502
		if (cp->val) {
			scan = SCAN_PAGE;
		} else {
			scan = 0;

			if (test_bit(HCI_ISCAN, &hdev->flags) &&
1503
			    hdev->discov_timeout > 0)
1504 1505
				cancel_delayed_work(&hdev->discov_off);
		}
1506

1507 1508
		hci_req_add(&req, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);
	}
1509

1510 1511 1512 1513 1514 1515 1516
	/* 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))
1517 1518
		write_fast_connectable(&req, false);

1519 1520 1521 1522 1523 1524
	if (test_bit(HCI_ADVERTISING, &hdev->dev_flags) &&
	    hci_conn_num(hdev, LE_LINK) == 0) {
		disable_advertising(&req);
		enable_advertising(&req);
	}

1525
	err = hci_req_run(&req, set_connectable_complete);
1526
	if (err < 0) {
1527
		mgmt_pending_remove(cmd);
1528
		if (err == -ENODATA)
1529 1530
			err = set_connectable_update_settings(hdev, sk,
							      cp->val);
1531 1532
		goto failed;
	}
1533 1534

failed:
1535
	hci_dev_unlock(hdev);
1536 1537 1538
	return err;
}

1539
static int set_pairable(struct sock *sk, struct hci_dev *hdev, void *data,
1540
			u16 len)
1541
{
1542
	struct mgmt_mode *cp = data;
1543
	bool changed;
1544 1545
	int err;

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

1548 1549 1550 1551
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_PAIRABLE,
				  MGMT_STATUS_INVALID_PARAMS);

1552
	hci_dev_lock(hdev);
1553 1554

	if (cp->val)
1555
		changed = !test_and_set_bit(HCI_PAIRABLE, &hdev->dev_flags);
1556
	else
1557
		changed = test_and_clear_bit(HCI_PAIRABLE, &hdev->dev_flags);
1558

1559
	err = send_settings_rsp(sk, MGMT_OP_SET_PAIRABLE, hdev);
1560
	if (err < 0)
1561
		goto unlock;
1562

1563 1564
	if (changed)
		err = new_settings(hdev, sk);
1565

1566
unlock:
1567
	hci_dev_unlock(hdev);
1568 1569 1570
	return err;
}

1571 1572
static int set_link_security(struct sock *sk, struct hci_dev *hdev, void *data,
			     u16 len)
1573 1574 1575
{
	struct mgmt_mode *cp = data;
	struct pending_cmd *cmd;
1576
	u8 val, status;
1577 1578
	int err;

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

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

1586 1587 1588 1589
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY,
				  MGMT_STATUS_INVALID_PARAMS);

1590 1591
	hci_dev_lock(hdev);

1592
	if (!hdev_is_powered(hdev)) {
1593 1594 1595
		bool changed = false;

		if (!!cp->val != test_bit(HCI_LINK_SECURITY,
1596
					  &hdev->dev_flags)) {
1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607
			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);

1608 1609 1610 1611
		goto failed;
	}

	if (mgmt_pending_find(MGMT_OP_SET_LINK_SECURITY, hdev)) {
1612
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY,
1613
				 MGMT_STATUS_BUSY);
1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640
		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;
}

1641
static int set_ssp(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
1642 1643 1644
{
	struct mgmt_mode *cp = data;
	struct pending_cmd *cmd;
1645
	u8 status;
1646 1647
	int err;

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

1650 1651 1652 1653
	status = mgmt_bredr_support(hdev);
	if (status)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_SSP, status);

1654 1655 1656
	if (!lmp_ssp_capable(hdev))
		return cmd_status(sk, hdev->id, MGMT_OP_SET_SSP,
				  MGMT_STATUS_NOT_SUPPORTED);
1657

1658 1659 1660 1661
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_SSP,
				  MGMT_STATUS_INVALID_PARAMS);

1662
	hci_dev_lock(hdev);
1663

1664
	if (!hdev_is_powered(hdev)) {
1665
		bool changed;
1666

1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677
		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);
1678 1679 1680 1681 1682 1683 1684 1685 1686
		}

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

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

1687 1688 1689
		goto failed;
	}

1690 1691
	if (mgmt_pending_find(MGMT_OP_SET_SSP, hdev) ||
	    mgmt_pending_find(MGMT_OP_SET_HS, hdev)) {
1692 1693
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_SSP,
				 MGMT_STATUS_BUSY);
1694 1695 1696
		goto failed;
	}

1697
	if (!!cp->val == test_bit(HCI_SSP_ENABLED, &hdev->dev_flags)) {
1698 1699 1700 1701 1702 1703 1704 1705 1706 1707
		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;
	}

1708
	err = hci_send_cmd(hdev, HCI_OP_WRITE_SSP_MODE, 1, &cp->val);
1709 1710 1711 1712 1713 1714 1715 1716 1717 1718
	if (err < 0) {
		mgmt_pending_remove(cmd);
		goto failed;
	}

failed:
	hci_dev_unlock(hdev);
	return err;
}

1719
static int set_hs(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
1720 1721
{
	struct mgmt_mode *cp = data;
1722
	bool changed;
1723
	u8 status;
1724
	int err;
1725

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

1728 1729 1730
	status = mgmt_bredr_support(hdev);
	if (status)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_HS, status);
1731

1732 1733 1734 1735 1736 1737 1738 1739
	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);

1740 1741 1742 1743
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_HS,
				  MGMT_STATUS_INVALID_PARAMS);

1744 1745
	hci_dev_lock(hdev);

1746
	if (cp->val) {
1747
		changed = !test_and_set_bit(HCI_HS_ENABLED, &hdev->dev_flags);
1748 1749 1750 1751 1752 1753 1754
	} else {
		if (hdev_is_powered(hdev)) {
			err = cmd_status(sk, hdev->id, MGMT_OP_SET_HS,
					 MGMT_STATUS_REJECTED);
			goto unlock;
		}

1755
		changed = test_and_clear_bit(HCI_HS_ENABLED, &hdev->dev_flags);
1756
	}
1757 1758 1759 1760 1761 1762 1763

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

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

1765 1766 1767
unlock:
	hci_dev_unlock(hdev);
	return err;
1768 1769
}

1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787
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);
1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799

	/* 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);
1800
		update_adv_data(&req);
1801
		update_scan_rsp_data(&req);
1802 1803 1804 1805
		hci_req_run(&req, NULL);

		hci_dev_unlock(hdev);
	}
1806 1807
}

1808
static int set_le(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
1809 1810 1811 1812
{
	struct mgmt_mode *cp = data;
	struct hci_cp_write_le_host_supported hci_cp;
	struct pending_cmd *cmd;
1813
	struct hci_request req;
1814
	int err;
1815
	u8 val, enabled;
1816

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

1819 1820 1821
	if (!lmp_le_capable(hdev))
		return cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
				  MGMT_STATUS_NOT_SUPPORTED);
1822

1823 1824 1825 1826
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
				  MGMT_STATUS_INVALID_PARAMS);

1827
	/* LE-only devices do not allow toggling LE on/off */
1828
	if (!test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags))
1829 1830 1831
		return cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
				  MGMT_STATUS_REJECTED);

1832
	hci_dev_lock(hdev);
1833 1834

	val = !!cp->val;
1835
	enabled = lmp_host_le_capable(hdev);
1836

1837
	if (!hdev_is_powered(hdev) || val == enabled) {
1838 1839 1840 1841 1842 1843 1844
		bool changed = false;

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

1845 1846
		if (!val && test_bit(HCI_ADVERTISING, &hdev->dev_flags)) {
			clear_bit(HCI_ADVERTISING, &hdev->dev_flags);
1847 1848 1849
			changed = true;
		}

1850 1851
		err = send_settings_rsp(sk, MGMT_OP_SET_LE, hdev);
		if (err < 0)
1852
			goto unlock;
1853 1854 1855 1856

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

1857
		goto unlock;
1858 1859
	}

1860 1861
	if (mgmt_pending_find(MGMT_OP_SET_LE, hdev) ||
	    mgmt_pending_find(MGMT_OP_SET_ADVERTISING, hdev)) {
1862
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
1863
				 MGMT_STATUS_BUSY);
1864
		goto unlock;
1865 1866 1867 1868 1869
	}

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

1873 1874
	hci_req_init(&req, hdev);

1875 1876 1877 1878
	memset(&hci_cp, 0, sizeof(hci_cp));

	if (val) {
		hci_cp.le = val;
1879
		hci_cp.simul = lmp_le_br_capable(hdev);
1880 1881 1882
	} else {
		if (test_bit(HCI_ADVERTISING, &hdev->dev_flags))
			disable_advertising(&req);
1883 1884
	}

1885 1886 1887 1888
	hci_req_add(&req, HCI_OP_WRITE_LE_HOST_SUPPORTED, sizeof(hci_cp),
		    &hci_cp);

	err = hci_req_run(&req, le_enable_complete);
1889
	if (err < 0)
1890 1891
		mgmt_pending_remove(cmd);

1892 1893
unlock:
	hci_dev_unlock(hdev);
1894 1895 1896
	return err;
}

1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919
/* 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;
}

1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938
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;
}

1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964
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);
}

1965
static int add_uuid(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
1966
{
1967
	struct mgmt_cp_add_uuid *cp = data;
1968
	struct pending_cmd *cmd;
1969
	struct hci_request req;
1970 1971 1972
	struct bt_uuid *uuid;
	int err;

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

1975
	hci_dev_lock(hdev);
1976

1977
	if (pending_eir_or_class(hdev)) {
1978
		err = cmd_status(sk, hdev->id, MGMT_OP_ADD_UUID,
1979
				 MGMT_STATUS_BUSY);
1980 1981 1982
		goto failed;
	}

1983
	uuid = kmalloc(sizeof(*uuid), GFP_KERNEL);
1984 1985 1986 1987 1988 1989
	if (!uuid) {
		err = -ENOMEM;
		goto failed;
	}

	memcpy(uuid->uuid, cp->uuid, 16);
1990
	uuid->svc_hint = cp->svc_hint;
1991
	uuid->size = get_uuid_size(cp->uuid);
1992

1993
	list_add_tail(&uuid->list, &hdev->uuids);
1994

1995
	hci_req_init(&req, hdev);
1996

1997 1998 1999
	update_class(&req);
	update_eir(&req);

2000 2001 2002 2003
	err = hci_req_run(&req, add_uuid_complete);
	if (err < 0) {
		if (err != -ENODATA)
			goto failed;
2004

2005
		err = cmd_complete(sk, hdev->id, MGMT_OP_ADD_UUID, 0,
2006
				   hdev->dev_class, 3);
2007 2008 2009 2010
		goto failed;
	}

	cmd = mgmt_pending_add(sk, MGMT_OP_ADD_UUID, hdev, data, len);
2011
	if (!cmd) {
2012
		err = -ENOMEM;
2013 2014 2015 2016
		goto failed;
	}

	err = 0;
2017 2018

failed:
2019
	hci_dev_unlock(hdev);
2020 2021 2022
	return err;
}

2023 2024 2025 2026 2027 2028
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)) {
2029 2030
		queue_delayed_work(hdev->workqueue, &hdev->service_cache,
				   CACHE_TIMEOUT);
2031 2032 2033 2034 2035 2036
		return true;
	}

	return false;
}

2037 2038 2039 2040 2041 2042 2043
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);
}

2044
static int remove_uuid(struct sock *sk, struct hci_dev *hdev, void *data,
2045
		       u16 len)
2046
{
2047
	struct mgmt_cp_remove_uuid *cp = data;
2048
	struct pending_cmd *cmd;
2049
	struct bt_uuid *match, *tmp;
2050
	u8 bt_uuid_any[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
2051
	struct hci_request req;
2052 2053
	int err, found;

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

2056
	hci_dev_lock(hdev);
2057

2058
	if (pending_eir_or_class(hdev)) {
2059
		err = cmd_status(sk, hdev->id, MGMT_OP_REMOVE_UUID,
2060
				 MGMT_STATUS_BUSY);
2061 2062 2063
		goto unlock;
	}

2064 2065
	if (memcmp(cp->uuid, bt_uuid_any, 16) == 0) {
		err = hci_uuids_clear(hdev);
2066

2067
		if (enable_service_cache(hdev)) {
2068
			err = cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_UUID,
2069
					   0, hdev->dev_class, 3);
2070 2071
			goto unlock;
		}
2072

2073
		goto update_class;
2074 2075 2076 2077
	}

	found = 0;

2078
	list_for_each_entry_safe(match, tmp, &hdev->uuids, list) {
2079 2080 2081 2082
		if (memcmp(match->uuid, cp->uuid, 16) != 0)
			continue;

		list_del(&match->list);
2083
		kfree(match);
2084 2085 2086 2087
		found++;
	}

	if (found == 0) {
2088
		err = cmd_status(sk, hdev->id, MGMT_OP_REMOVE_UUID,
2089
				 MGMT_STATUS_INVALID_PARAMS);
2090 2091 2092
		goto unlock;
	}

2093
update_class:
2094
	hci_req_init(&req, hdev);
2095

2096 2097 2098
	update_class(&req);
	update_eir(&req);

2099 2100 2101 2102
	err = hci_req_run(&req, remove_uuid_complete);
	if (err < 0) {
		if (err != -ENODATA)
			goto unlock;
2103

2104
		err = cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_UUID, 0,
2105
				   hdev->dev_class, 3);
2106 2107 2108 2109
		goto unlock;
	}

	cmd = mgmt_pending_add(sk, MGMT_OP_REMOVE_UUID, hdev, data, len);
2110
	if (!cmd) {
2111
		err = -ENOMEM;
2112 2113 2114 2115
		goto unlock;
	}

	err = 0;
2116 2117

unlock:
2118
	hci_dev_unlock(hdev);
2119 2120 2121
	return err;
}

2122 2123 2124 2125 2126 2127 2128
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);
}

2129
static int set_dev_class(struct sock *sk, struct hci_dev *hdev, void *data,
2130
			 u16 len)
2131
{
2132
	struct mgmt_cp_set_dev_class *cp = data;
2133
	struct pending_cmd *cmd;
2134
	struct hci_request req;
2135 2136
	int err;

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

2139
	if (!lmp_bredr_capable(hdev))
2140 2141
		return cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS,
				  MGMT_STATUS_NOT_SUPPORTED);
2142

2143
	hci_dev_lock(hdev);
2144

2145 2146 2147 2148 2149
	if (pending_eir_or_class(hdev)) {
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS,
				 MGMT_STATUS_BUSY);
		goto unlock;
	}
2150

2151 2152 2153 2154 2155
	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;
	}
2156

2157 2158 2159
	hdev->major_class = cp->major;
	hdev->minor_class = cp->minor;

2160
	if (!hdev_is_powered(hdev)) {
2161
		err = cmd_complete(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, 0,
2162
				   hdev->dev_class, 3);
2163 2164 2165
		goto unlock;
	}

2166 2167
	hci_req_init(&req, hdev);

2168
	if (test_and_clear_bit(HCI_SERVICE_CACHE, &hdev->dev_flags)) {
2169 2170 2171
		hci_dev_unlock(hdev);
		cancel_delayed_work_sync(&hdev->service_cache);
		hci_dev_lock(hdev);
2172
		update_eir(&req);
2173
	}
2174

2175 2176
	update_class(&req);

2177 2178 2179 2180
	err = hci_req_run(&req, set_class_complete);
	if (err < 0) {
		if (err != -ENODATA)
			goto unlock;
2181

2182
		err = cmd_complete(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, 0,
2183
				   hdev->dev_class, 3);
2184 2185 2186 2187
		goto unlock;
	}

	cmd = mgmt_pending_add(sk, MGMT_OP_SET_DEV_CLASS, hdev, data, len);
2188
	if (!cmd) {
2189
		err = -ENOMEM;
2190 2191 2192 2193
		goto unlock;
	}

	err = 0;
2194

2195
unlock:
2196
	hci_dev_unlock(hdev);
2197 2198 2199
	return err;
}

2200
static int load_link_keys(struct sock *sk, struct hci_dev *hdev, void *data,
2201
			  u16 len)
2202
{
2203
	struct mgmt_cp_load_link_keys *cp = data;
2204
	u16 key_count, expected_len;
2205
	int i;
2206

2207 2208 2209 2210 2211 2212
	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);

2213
	key_count = __le16_to_cpu(cp->key_count);
2214

2215 2216
	expected_len = sizeof(*cp) + key_count *
					sizeof(struct mgmt_link_key_info);
2217
	if (expected_len != len) {
2218
		BT_ERR("load_link_keys: expected %u bytes, got %u bytes",
2219
		       len, expected_len);
2220
		return cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS,
2221
				  MGMT_STATUS_INVALID_PARAMS);
2222 2223
	}

2224 2225 2226 2227
	if (cp->debug_keys != 0x00 && cp->debug_keys != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS,
				  MGMT_STATUS_INVALID_PARAMS);

2228
	BT_DBG("%s debug_keys %u key_count %u", hdev->name, cp->debug_keys,
2229
	       key_count);
2230

2231 2232 2233 2234 2235 2236 2237 2238
	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);
	}

2239
	hci_dev_lock(hdev);
2240 2241 2242 2243

	hci_link_keys_clear(hdev);

	if (cp->debug_keys)
2244
		set_bit(HCI_DEBUG_KEYS, &hdev->dev_flags);
2245
	else
2246
		clear_bit(HCI_DEBUG_KEYS, &hdev->dev_flags);
2247

2248
	for (i = 0; i < key_count; i++) {
2249
		struct mgmt_link_key_info *key = &cp->keys[i];
2250

2251
		hci_add_link_key(hdev, NULL, 0, &key->addr.bdaddr, key->val,
2252
				 key->type, key->pin_len);
2253 2254
	}

2255
	cmd_complete(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS, 0, NULL, 0);
2256

2257
	hci_dev_unlock(hdev);
2258

2259
	return 0;
2260 2261
}

2262
static int device_unpaired(struct hci_dev *hdev, bdaddr_t *bdaddr,
2263
			   u8 addr_type, struct sock *skip_sk)
2264 2265 2266 2267 2268 2269 2270
{
	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),
2271
			  skip_sk);
2272 2273
}

2274
static int unpair_device(struct sock *sk, struct hci_dev *hdev, void *data,
2275
			 u16 len)
2276
{
2277 2278
	struct mgmt_cp_unpair_device *cp = data;
	struct mgmt_rp_unpair_device rp;
2279 2280
	struct hci_cp_disconnect dc;
	struct pending_cmd *cmd;
2281 2282 2283
	struct hci_conn *conn;
	int err;

2284
	memset(&rp, 0, sizeof(rp));
2285 2286
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;
2287

2288 2289 2290 2291 2292
	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));

2293 2294 2295 2296 2297
	if (cp->disconnect != 0x00 && cp->disconnect != 0x01)
		return cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
				    MGMT_STATUS_INVALID_PARAMS,
				    &rp, sizeof(rp));

2298 2299
	hci_dev_lock(hdev);

2300
	if (!hdev_is_powered(hdev)) {
2301
		err = cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
2302
				   MGMT_STATUS_NOT_POWERED, &rp, sizeof(rp));
2303 2304 2305
		goto unlock;
	}

2306
	if (cp->addr.type == BDADDR_BREDR)
2307 2308 2309
		err = hci_remove_link_key(hdev, &cp->addr.bdaddr);
	else
		err = hci_remove_ltk(hdev, &cp->addr.bdaddr);
2310

2311
	if (err < 0) {
2312
		err = cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
2313
				   MGMT_STATUS_NOT_PAIRED, &rp, sizeof(rp));
2314 2315 2316
		goto unlock;
	}

2317
	if (cp->disconnect) {
2318
		if (cp->addr.type == BDADDR_BREDR)
2319
			conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK,
2320
						       &cp->addr.bdaddr);
2321 2322
		else
			conn = hci_conn_hash_lookup_ba(hdev, LE_LINK,
2323
						       &cp->addr.bdaddr);
2324 2325 2326
	} else {
		conn = NULL;
	}
2327

2328
	if (!conn) {
2329
		err = cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE, 0,
2330
				   &rp, sizeof(rp));
2331
		device_unpaired(hdev, &cp->addr.bdaddr, cp->addr.type, sk);
2332 2333
		goto unlock;
	}
2334

2335
	cmd = mgmt_pending_add(sk, MGMT_OP_UNPAIR_DEVICE, hdev, cp,
2336
			       sizeof(*cp));
2337 2338 2339
	if (!cmd) {
		err = -ENOMEM;
		goto unlock;
2340 2341
	}

2342
	dc.handle = cpu_to_le16(conn->handle);
2343 2344 2345 2346 2347
	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);

2348
unlock:
2349
	hci_dev_unlock(hdev);
2350 2351 2352
	return err;
}

2353
static int disconnect(struct sock *sk, struct hci_dev *hdev, void *data,
2354
		      u16 len)
2355
{
2356
	struct mgmt_cp_disconnect *cp = data;
2357
	struct mgmt_rp_disconnect rp;
2358
	struct hci_cp_disconnect dc;
2359
	struct pending_cmd *cmd;
2360 2361 2362 2363 2364
	struct hci_conn *conn;
	int err;

	BT_DBG("");

2365 2366 2367 2368
	memset(&rp, 0, sizeof(rp));
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;

2369
	if (!bdaddr_type_is_valid(cp->addr.type))
2370 2371 2372
		return cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
				    MGMT_STATUS_INVALID_PARAMS,
				    &rp, sizeof(rp));
2373

2374
	hci_dev_lock(hdev);
2375 2376

	if (!test_bit(HCI_UP, &hdev->flags)) {
2377 2378
		err = cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
				   MGMT_STATUS_NOT_POWERED, &rp, sizeof(rp));
2379 2380 2381
		goto failed;
	}

2382
	if (mgmt_pending_find(MGMT_OP_DISCONNECT, hdev)) {
2383 2384
		err = cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
				   MGMT_STATUS_BUSY, &rp, sizeof(rp));
2385 2386 2387
		goto failed;
	}

2388
	if (cp->addr.type == BDADDR_BREDR)
2389 2390
		conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK,
					       &cp->addr.bdaddr);
2391 2392
	else
		conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &cp->addr.bdaddr);
2393

2394
	if (!conn || conn->state == BT_OPEN || conn->state == BT_CLOSED) {
2395 2396
		err = cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
				   MGMT_STATUS_NOT_CONNECTED, &rp, sizeof(rp));
2397 2398 2399
		goto failed;
	}

2400
	cmd = mgmt_pending_add(sk, MGMT_OP_DISCONNECT, hdev, data, len);
2401 2402
	if (!cmd) {
		err = -ENOMEM;
2403
		goto failed;
2404
	}
2405

2406
	dc.handle = cpu_to_le16(conn->handle);
2407
	dc.reason = HCI_ERROR_REMOTE_USER_TERM;
2408 2409 2410

	err = hci_send_cmd(hdev, HCI_OP_DISCONNECT, sizeof(dc), &dc);
	if (err < 0)
2411
		mgmt_pending_remove(cmd);
2412 2413

failed:
2414
	hci_dev_unlock(hdev);
2415 2416 2417
	return err;
}

2418
static u8 link_to_bdaddr(u8 link_type, u8 addr_type)
2419 2420 2421
{
	switch (link_type) {
	case LE_LINK:
2422 2423
		switch (addr_type) {
		case ADDR_LE_DEV_PUBLIC:
2424
			return BDADDR_LE_PUBLIC;
2425

2426
		default:
2427
			/* Fallback to LE Random address type */
2428
			return BDADDR_LE_RANDOM;
2429
		}
2430

2431
	default:
2432
		/* Fallback to BR/EDR type */
2433
		return BDADDR_BREDR;
2434 2435 2436
	}
}

2437 2438
static int get_connections(struct sock *sk, struct hci_dev *hdev, void *data,
			   u16 data_len)
2439 2440
{
	struct mgmt_rp_get_connections *rp;
2441
	struct hci_conn *c;
2442
	size_t rp_len;
2443 2444
	int err;
	u16 i;
2445 2446 2447

	BT_DBG("");

2448
	hci_dev_lock(hdev);
2449

2450
	if (!hdev_is_powered(hdev)) {
2451
		err = cmd_status(sk, hdev->id, MGMT_OP_GET_CONNECTIONS,
2452
				 MGMT_STATUS_NOT_POWERED);
2453 2454 2455
		goto unlock;
	}

2456
	i = 0;
2457 2458
	list_for_each_entry(c, &hdev->conn_hash.list, list) {
		if (test_bit(HCI_CONN_MGMT_CONNECTED, &c->flags))
2459
			i++;
2460 2461
	}

2462
	rp_len = sizeof(*rp) + (i * sizeof(struct mgmt_addr_info));
2463
	rp = kmalloc(rp_len, GFP_KERNEL);
2464
	if (!rp) {
2465 2466 2467 2468 2469
		err = -ENOMEM;
		goto unlock;
	}

	i = 0;
2470
	list_for_each_entry(c, &hdev->conn_hash.list, list) {
2471 2472
		if (!test_bit(HCI_CONN_MGMT_CONNECTED, &c->flags))
			continue;
2473
		bacpy(&rp->addr[i].bdaddr, &c->dst);
2474
		rp->addr[i].type = link_to_bdaddr(c->type, c->dst_type);
2475
		if (c->type == SCO_LINK || c->type == ESCO_LINK)
2476 2477 2478 2479
			continue;
		i++;
	}

2480
	rp->conn_count = cpu_to_le16(i);
2481

2482 2483
	/* Recalculate length in case of filtered SCO connections, etc */
	rp_len = sizeof(*rp) + (i * sizeof(struct mgmt_addr_info));
2484

2485
	err = cmd_complete(sk, hdev->id, MGMT_OP_GET_CONNECTIONS, 0, rp,
2486
			   rp_len);
2487

2488
	kfree(rp);
2489 2490

unlock:
2491
	hci_dev_unlock(hdev);
2492 2493 2494
	return err;
}

2495
static int send_pin_code_neg_reply(struct sock *sk, struct hci_dev *hdev,
2496
				   struct mgmt_cp_pin_code_neg_reply *cp)
2497 2498 2499 2500
{
	struct pending_cmd *cmd;
	int err;

2501
	cmd = mgmt_pending_add(sk, MGMT_OP_PIN_CODE_NEG_REPLY, hdev, cp,
2502
			       sizeof(*cp));
2503 2504 2505
	if (!cmd)
		return -ENOMEM;

2506
	err = hci_send_cmd(hdev, HCI_OP_PIN_CODE_NEG_REPLY,
2507
			   sizeof(cp->addr.bdaddr), &cp->addr.bdaddr);
2508 2509 2510 2511 2512 2513
	if (err < 0)
		mgmt_pending_remove(cmd);

	return err;
}

2514
static int pin_code_reply(struct sock *sk, struct hci_dev *hdev, void *data,
2515
			  u16 len)
2516
{
2517
	struct hci_conn *conn;
2518
	struct mgmt_cp_pin_code_reply *cp = data;
2519
	struct hci_cp_pin_code_reply reply;
2520
	struct pending_cmd *cmd;
2521 2522 2523 2524
	int err;

	BT_DBG("");

2525
	hci_dev_lock(hdev);
2526

2527
	if (!hdev_is_powered(hdev)) {
2528
		err = cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
2529
				 MGMT_STATUS_NOT_POWERED);
2530 2531 2532
		goto failed;
	}

2533
	conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->addr.bdaddr);
2534
	if (!conn) {
2535
		err = cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
2536
				 MGMT_STATUS_NOT_CONNECTED);
2537 2538 2539 2540
		goto failed;
	}

	if (conn->pending_sec_level == BT_SECURITY_HIGH && cp->pin_len != 16) {
2541 2542 2543
		struct mgmt_cp_pin_code_neg_reply ncp;

		memcpy(&ncp.addr, &cp->addr, sizeof(ncp.addr));
2544 2545 2546

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

2547
		err = send_pin_code_neg_reply(sk, hdev, &ncp);
2548
		if (err >= 0)
2549
			err = cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
2550
					 MGMT_STATUS_INVALID_PARAMS);
2551 2552 2553 2554

		goto failed;
	}

2555
	cmd = mgmt_pending_add(sk, MGMT_OP_PIN_CODE_REPLY, hdev, data, len);
2556 2557
	if (!cmd) {
		err = -ENOMEM;
2558
		goto failed;
2559
	}
2560

2561
	bacpy(&reply.bdaddr, &cp->addr.bdaddr);
2562
	reply.pin_len = cp->pin_len;
2563
	memcpy(reply.pin_code, cp->pin_code, sizeof(reply.pin_code));
2564 2565 2566

	err = hci_send_cmd(hdev, HCI_OP_PIN_CODE_REPLY, sizeof(reply), &reply);
	if (err < 0)
2567
		mgmt_pending_remove(cmd);
2568 2569

failed:
2570
	hci_dev_unlock(hdev);
2571 2572 2573
	return err;
}

2574 2575
static int set_io_capability(struct sock *sk, struct hci_dev *hdev, void *data,
			     u16 len)
2576
{
2577
	struct mgmt_cp_set_io_capability *cp = data;
2578 2579 2580

	BT_DBG("");

2581
	hci_dev_lock(hdev);
2582 2583 2584 2585

	hdev->io_capability = cp->io_capability;

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

2588
	hci_dev_unlock(hdev);
2589

2590 2591
	return cmd_complete(sk, hdev->id, MGMT_OP_SET_IO_CAPABILITY, 0, NULL,
			    0);
2592 2593
}

2594
static struct pending_cmd *find_pairing(struct hci_conn *conn)
2595 2596
{
	struct hci_dev *hdev = conn->hdev;
2597
	struct pending_cmd *cmd;
2598

2599
	list_for_each_entry(cmd, &hdev->mgmt_pending, list) {
2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616
		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;

2617
	bacpy(&rp.addr.bdaddr, &conn->dst);
2618
	rp.addr.type = link_to_bdaddr(conn->type, conn->dst_type);
2619

2620
	cmd_complete(cmd->sk, cmd->index, MGMT_OP_PAIR_DEVICE, status,
2621
		     &rp, sizeof(rp));
2622 2623 2624 2625 2626 2627

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

2628
	hci_conn_drop(conn);
2629

2630
	mgmt_pending_remove(cmd);
2631 2632 2633 2634 2635 2636 2637 2638 2639
}

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

	BT_DBG("status %u", status);

	cmd = find_pairing(conn);
2640
	if (!cmd)
2641
		BT_DBG("Unable to find a pending command");
2642
	else
2643
		pairing_complete(cmd, mgmt_status(status));
2644 2645
}

2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661
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));
}

2662
static int pair_device(struct sock *sk, struct hci_dev *hdev, void *data,
2663
		       u16 len)
2664
{
2665
	struct mgmt_cp_pair_device *cp = data;
2666
	struct mgmt_rp_pair_device rp;
2667 2668 2669 2670 2671 2672 2673
	struct pending_cmd *cmd;
	u8 sec_level, auth_type;
	struct hci_conn *conn;
	int err;

	BT_DBG("");

2674 2675 2676 2677
	memset(&rp, 0, sizeof(rp));
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;

2678 2679 2680 2681 2682
	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));

2683
	hci_dev_lock(hdev);
2684

2685
	if (!hdev_is_powered(hdev)) {
2686 2687
		err = cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
				   MGMT_STATUS_NOT_POWERED, &rp, sizeof(rp));
2688 2689 2690
		goto unlock;
	}

2691 2692
	sec_level = BT_SECURITY_MEDIUM;
	if (cp->io_cap == 0x03)
2693
		auth_type = HCI_AT_DEDICATED_BONDING;
2694
	else
2695 2696
		auth_type = HCI_AT_DEDICATED_BONDING_MITM;

2697
	if (cp->addr.type == BDADDR_BREDR)
2698 2699
		conn = hci_connect(hdev, ACL_LINK, &cp->addr.bdaddr,
				   cp->addr.type, sec_level, auth_type);
2700
	else
2701 2702
		conn = hci_connect(hdev, LE_LINK, &cp->addr.bdaddr,
				   cp->addr.type, sec_level, auth_type);
2703

2704
	if (IS_ERR(conn)) {
2705 2706 2707 2708 2709 2710 2711
		int status;

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

2712
		err = cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
2713
				   status, &rp,
2714
				   sizeof(rp));
2715 2716 2717 2718
		goto unlock;
	}

	if (conn->connect_cfm_cb) {
2719
		hci_conn_drop(conn);
2720
		err = cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
2721
				   MGMT_STATUS_BUSY, &rp, sizeof(rp));
2722 2723 2724
		goto unlock;
	}

2725
	cmd = mgmt_pending_add(sk, MGMT_OP_PAIR_DEVICE, hdev, data, len);
2726 2727
	if (!cmd) {
		err = -ENOMEM;
2728
		hci_conn_drop(conn);
2729 2730 2731
		goto unlock;
	}

2732
	/* For LE, just connecting isn't a proof that the pairing finished */
2733
	if (cp->addr.type == BDADDR_BREDR)
2734
		conn->connect_cfm_cb = pairing_complete_cb;
2735 2736
	else
		conn->connect_cfm_cb = le_connect_complete_cb;
2737

2738 2739 2740 2741 2742 2743
	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 &&
2744
	    hci_conn_security(conn, sec_level, auth_type))
2745 2746 2747 2748 2749
		pairing_complete(cmd, 0);

	err = 0;

unlock:
2750
	hci_dev_unlock(hdev);
2751 2752 2753
	return err;
}

2754 2755
static int cancel_pair_device(struct sock *sk, struct hci_dev *hdev, void *data,
			      u16 len)
2756
{
2757
	struct mgmt_addr_info *addr = data;
2758 2759 2760 2761 2762 2763 2764 2765
	struct pending_cmd *cmd;
	struct hci_conn *conn;
	int err;

	BT_DBG("");

	hci_dev_lock(hdev);

2766
	if (!hdev_is_powered(hdev)) {
2767
		err = cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE,
2768
				 MGMT_STATUS_NOT_POWERED);
2769 2770 2771
		goto unlock;
	}

2772 2773
	cmd = mgmt_pending_find(MGMT_OP_PAIR_DEVICE, hdev);
	if (!cmd) {
2774
		err = cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE,
2775
				 MGMT_STATUS_INVALID_PARAMS);
2776 2777 2778 2779 2780 2781
		goto unlock;
	}

	conn = cmd->user_data;

	if (bacmp(&addr->bdaddr, &conn->dst) != 0) {
2782
		err = cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE,
2783
				 MGMT_STATUS_INVALID_PARAMS);
2784 2785 2786 2787 2788
		goto unlock;
	}

	pairing_complete(cmd, MGMT_STATUS_CANCELLED);

2789
	err = cmd_complete(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE, 0,
2790
			   addr, sizeof(*addr));
2791 2792 2793 2794 2795
unlock:
	hci_dev_unlock(hdev);
	return err;
}

2796
static int user_pairing_resp(struct sock *sk, struct hci_dev *hdev,
2797
			     struct mgmt_addr_info *addr, u16 mgmt_op,
2798
			     u16 hci_op, __le32 passkey)
2799 2800
{
	struct pending_cmd *cmd;
2801
	struct hci_conn *conn;
2802 2803
	int err;

2804
	hci_dev_lock(hdev);
2805

2806
	if (!hdev_is_powered(hdev)) {
2807 2808 2809
		err = cmd_complete(sk, hdev->id, mgmt_op,
				   MGMT_STATUS_NOT_POWERED, addr,
				   sizeof(*addr));
2810
		goto done;
2811 2812
	}

2813 2814
	if (addr->type == BDADDR_BREDR)
		conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &addr->bdaddr);
2815
	else
2816
		conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &addr->bdaddr);
2817 2818

	if (!conn) {
2819 2820 2821
		err = cmd_complete(sk, hdev->id, mgmt_op,
				   MGMT_STATUS_NOT_CONNECTED, addr,
				   sizeof(*addr));
2822 2823
		goto done;
	}
2824

2825
	if (addr->type == BDADDR_LE_PUBLIC || addr->type == BDADDR_LE_RANDOM) {
2826
		/* Continue with pairing via SMP */
2827 2828 2829
		err = smp_user_confirm_reply(conn, mgmt_op, passkey);

		if (!err)
2830 2831 2832
			err = cmd_complete(sk, hdev->id, mgmt_op,
					   MGMT_STATUS_SUCCESS, addr,
					   sizeof(*addr));
2833
		else
2834 2835 2836
			err = cmd_complete(sk, hdev->id, mgmt_op,
					   MGMT_STATUS_FAILED, addr,
					   sizeof(*addr));
2837 2838 2839 2840

		goto done;
	}

2841
	cmd = mgmt_pending_add(sk, mgmt_op, hdev, addr, sizeof(*addr));
2842 2843
	if (!cmd) {
		err = -ENOMEM;
2844
		goto done;
2845 2846
	}

2847
	/* Continue with pairing via HCI */
2848 2849 2850
	if (hci_op == HCI_OP_USER_PASSKEY_REPLY) {
		struct hci_cp_user_passkey_reply cp;

2851
		bacpy(&cp.bdaddr, &addr->bdaddr);
2852 2853 2854
		cp.passkey = passkey;
		err = hci_send_cmd(hdev, hci_op, sizeof(cp), &cp);
	} else
2855 2856
		err = hci_send_cmd(hdev, hci_op, sizeof(addr->bdaddr),
				   &addr->bdaddr);
2857

2858 2859
	if (err < 0)
		mgmt_pending_remove(cmd);
2860

2861
done:
2862
	hci_dev_unlock(hdev);
2863 2864 2865
	return err;
}

2866 2867 2868 2869 2870 2871 2872
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("");

2873
	return user_pairing_resp(sk, hdev, &cp->addr,
2874 2875 2876 2877
				MGMT_OP_PIN_CODE_NEG_REPLY,
				HCI_OP_PIN_CODE_NEG_REPLY, 0);
}

2878 2879
static int user_confirm_reply(struct sock *sk, struct hci_dev *hdev, void *data,
			      u16 len)
2880
{
2881
	struct mgmt_cp_user_confirm_reply *cp = data;
2882 2883 2884 2885

	BT_DBG("");

	if (len != sizeof(*cp))
2886
		return cmd_status(sk, hdev->id, MGMT_OP_USER_CONFIRM_REPLY,
2887
				  MGMT_STATUS_INVALID_PARAMS);
2888

2889
	return user_pairing_resp(sk, hdev, &cp->addr,
2890 2891
				 MGMT_OP_USER_CONFIRM_REPLY,
				 HCI_OP_USER_CONFIRM_REPLY, 0);
2892 2893
}

2894
static int user_confirm_neg_reply(struct sock *sk, struct hci_dev *hdev,
2895
				  void *data, u16 len)
2896
{
2897
	struct mgmt_cp_user_confirm_neg_reply *cp = data;
2898 2899 2900

	BT_DBG("");

2901
	return user_pairing_resp(sk, hdev, &cp->addr,
2902 2903
				 MGMT_OP_USER_CONFIRM_NEG_REPLY,
				 HCI_OP_USER_CONFIRM_NEG_REPLY, 0);
2904 2905
}

2906 2907
static int user_passkey_reply(struct sock *sk, struct hci_dev *hdev, void *data,
			      u16 len)
2908
{
2909
	struct mgmt_cp_user_passkey_reply *cp = data;
2910 2911 2912

	BT_DBG("");

2913
	return user_pairing_resp(sk, hdev, &cp->addr,
2914 2915
				 MGMT_OP_USER_PASSKEY_REPLY,
				 HCI_OP_USER_PASSKEY_REPLY, cp->passkey);
2916 2917
}

2918
static int user_passkey_neg_reply(struct sock *sk, struct hci_dev *hdev,
2919
				  void *data, u16 len)
2920
{
2921
	struct mgmt_cp_user_passkey_neg_reply *cp = data;
2922 2923 2924

	BT_DBG("");

2925
	return user_pairing_resp(sk, hdev, &cp->addr,
2926 2927
				 MGMT_OP_USER_PASSKEY_NEG_REPLY,
				 HCI_OP_USER_PASSKEY_NEG_REPLY, 0);
2928 2929
}

2930
static void update_name(struct hci_request *req)
2931
{
2932
	struct hci_dev *hdev = req->hdev;
2933 2934
	struct hci_cp_write_local_name cp;

2935
	memcpy(cp.name, hdev->dev_name, sizeof(cp.name));
2936

2937
	hci_req_add(req, HCI_OP_WRITE_LOCAL_NAME, sizeof(cp), &cp);
2938 2939
}

2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967
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);
}

2968
static int set_local_name(struct sock *sk, struct hci_dev *hdev, void *data,
2969
			  u16 len)
2970
{
2971
	struct mgmt_cp_set_local_name *cp = data;
2972
	struct pending_cmd *cmd;
2973
	struct hci_request req;
2974 2975 2976 2977
	int err;

	BT_DBG("");

2978
	hci_dev_lock(hdev);
2979

2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990
	/* 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;
	}

2991
	memcpy(hdev->short_name, cp->short_name, sizeof(hdev->short_name));
2992

2993
	if (!hdev_is_powered(hdev)) {
2994
		memcpy(hdev->dev_name, cp->name, sizeof(hdev->dev_name));
2995 2996

		err = cmd_complete(sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, 0,
2997
				   data, len);
2998 2999 3000 3001
		if (err < 0)
			goto failed;

		err = mgmt_event(MGMT_EV_LOCAL_NAME_CHANGED, hdev, data, len,
3002
				 sk);
3003

3004 3005 3006
		goto failed;
	}

3007
	cmd = mgmt_pending_add(sk, MGMT_OP_SET_LOCAL_NAME, hdev, data, len);
3008 3009 3010 3011 3012
	if (!cmd) {
		err = -ENOMEM;
		goto failed;
	}

3013 3014
	memcpy(hdev->dev_name, cp->name, sizeof(hdev->dev_name));

3015
	hci_req_init(&req, hdev);
3016 3017 3018 3019 3020 3021

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

3022 3023 3024
	/* The name is stored in the scan response data and so
	 * no need to udpate the advertising data here.
	 */
3025
	if (lmp_le_capable(hdev))
3026
		update_scan_rsp_data(&req);
3027

3028
	err = hci_req_run(&req, set_name_complete);
3029 3030 3031 3032
	if (err < 0)
		mgmt_pending_remove(cmd);

failed:
3033
	hci_dev_unlock(hdev);
3034 3035 3036
	return err;
}

3037
static int read_local_oob_data(struct sock *sk, struct hci_dev *hdev,
3038
			       void *data, u16 data_len)
3039 3040 3041 3042
{
	struct pending_cmd *cmd;
	int err;

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

3045
	hci_dev_lock(hdev);
3046

3047
	if (!hdev_is_powered(hdev)) {
3048
		err = cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
3049
				 MGMT_STATUS_NOT_POWERED);
3050 3051 3052
		goto unlock;
	}

3053
	if (!lmp_ssp_capable(hdev)) {
3054
		err = cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
3055
				 MGMT_STATUS_NOT_SUPPORTED);
3056 3057 3058
		goto unlock;
	}

3059
	if (mgmt_pending_find(MGMT_OP_READ_LOCAL_OOB_DATA, hdev)) {
3060
		err = cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
3061
				 MGMT_STATUS_BUSY);
3062 3063 3064
		goto unlock;
	}

3065
	cmd = mgmt_pending_add(sk, MGMT_OP_READ_LOCAL_OOB_DATA, hdev, NULL, 0);
3066 3067 3068 3069 3070 3071 3072 3073 3074 3075
	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:
3076
	hci_dev_unlock(hdev);
3077 3078 3079
	return err;
}

3080
static int add_remote_oob_data(struct sock *sk, struct hci_dev *hdev,
3081
			       void *data, u16 len)
3082
{
3083
	struct mgmt_cp_add_remote_oob_data *cp = data;
3084
	u8 status;
3085 3086
	int err;

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

3089
	hci_dev_lock(hdev);
3090

3091
	err = hci_add_remote_oob_data(hdev, &cp->addr.bdaddr, cp->hash,
3092
				      cp->randomizer);
3093
	if (err < 0)
3094
		status = MGMT_STATUS_FAILED;
3095
	else
3096
		status = MGMT_STATUS_SUCCESS;
3097

3098
	err = cmd_complete(sk, hdev->id, MGMT_OP_ADD_REMOTE_OOB_DATA, status,
3099
			   &cp->addr, sizeof(cp->addr));
3100

3101
	hci_dev_unlock(hdev);
3102 3103 3104
	return err;
}

3105
static int remove_remote_oob_data(struct sock *sk, struct hci_dev *hdev,
3106
				  void *data, u16 len)
3107
{
3108
	struct mgmt_cp_remove_remote_oob_data *cp = data;
3109
	u8 status;
3110 3111
	int err;

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

3114
	hci_dev_lock(hdev);
3115

3116
	err = hci_remove_remote_oob_data(hdev, &cp->addr.bdaddr);
3117
	if (err < 0)
3118
		status = MGMT_STATUS_INVALID_PARAMS;
3119
	else
3120
		status = MGMT_STATUS_SUCCESS;
3121

3122
	err = cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_REMOTE_OOB_DATA,
3123
			   status, &cp->addr, sizeof(cp->addr));
3124

3125
	hci_dev_unlock(hdev);
3126 3127 3128
	return err;
}

3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149
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;
}

3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167
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,
3168
				   DISCOV_LE_TIMEOUT);
3169 3170 3171 3172
		break;

	case DISCOV_TYPE_INTERLEAVED:
		queue_delayed_work(hdev->workqueue, &hdev->le_scan_disable,
3173
				   DISCOV_INTERLEAVED_TIMEOUT);
3174 3175 3176 3177 3178 3179 3180 3181 3182 3183
		break;

	case DISCOV_TYPE_BREDR:
		break;

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

3184
static int start_discovery(struct sock *sk, struct hci_dev *hdev,
3185
			   void *data, u16 len)
3186
{
3187
	struct mgmt_cp_start_discovery *cp = data;
3188
	struct pending_cmd *cmd;
3189 3190 3191 3192 3193 3194
	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 };
3195
	u8 status;
3196 3197
	int err;

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

3200
	hci_dev_lock(hdev);
3201

3202
	if (!hdev_is_powered(hdev)) {
3203
		err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
3204
				 MGMT_STATUS_NOT_POWERED);
3205 3206 3207
		goto failed;
	}

3208 3209 3210 3211 3212 3213
	if (test_bit(HCI_PERIODIC_INQ, &hdev->dev_flags)) {
		err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
				 MGMT_STATUS_BUSY);
		goto failed;
	}

3214
	if (hdev->discovery.state != DISCOVERY_STOPPED) {
3215
		err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
3216
				 MGMT_STATUS_BUSY);
3217 3218 3219
		goto failed;
	}

3220
	cmd = mgmt_pending_add(sk, MGMT_OP_START_DISCOVERY, hdev, NULL, 0);
3221 3222 3223 3224 3225
	if (!cmd) {
		err = -ENOMEM;
		goto failed;
	}

A
Andre Guedes 已提交
3226 3227
	hdev->discovery.type = cp->type;

3228 3229
	hci_req_init(&req, hdev);

A
Andre Guedes 已提交
3230
	switch (hdev->discovery.type) {
3231
	case DISCOV_TYPE_BREDR:
3232 3233
		status = mgmt_bredr_support(hdev);
		if (status) {
3234
			err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
3235
					 status);
3236 3237 3238 3239
			mgmt_pending_remove(cmd);
			goto failed;
		}

3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250
		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));
3251
		inq_cp.length = DISCOV_BREDR_INQUIRY_LEN;
3252
		hci_req_add(&req, HCI_OP_INQUIRY, sizeof(inq_cp), &inq_cp);
3253 3254 3255
		break;

	case DISCOV_TYPE_LE:
3256
	case DISCOV_TYPE_INTERLEAVED:
3257 3258
		status = mgmt_le_support(hdev);
		if (status) {
3259
			err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
3260
					 status);
3261 3262 3263 3264
			mgmt_pending_remove(cmd);
			goto failed;
		}

3265
		if (hdev->discovery.type == DISCOV_TYPE_INTERLEAVED &&
3266
		    !test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags)) {
3267 3268 3269 3270 3271 3272
			err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
					 MGMT_STATUS_NOT_SUPPORTED);
			mgmt_pending_remove(cmd);
			goto failed;
		}

3273
		if (test_bit(HCI_ADVERTISING, &hdev->dev_flags)) {
3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288
			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;
3289 3290
		param_cp.interval = cpu_to_le16(DISCOV_LE_SCAN_INT);
		param_cp.window = cpu_to_le16(DISCOV_LE_SCAN_WIN);
3291
		param_cp.own_address_type = hdev->own_addr_type;
3292 3293 3294 3295 3296 3297 3298 3299
		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);
3300 3301
		break;

3302
	default:
3303 3304 3305 3306
		err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
				 MGMT_STATUS_INVALID_PARAMS);
		mgmt_pending_remove(cmd);
		goto failed;
3307
	}
3308

3309
	err = hci_req_run(&req, start_discovery_complete);
3310 3311
	if (err < 0)
		mgmt_pending_remove(cmd);
3312 3313
	else
		hci_discovery_set_state(hdev, DISCOVERY_STARTING);
3314 3315

failed:
3316
	hci_dev_unlock(hdev);
3317 3318 3319
	return err;
}

3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335
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;
}

3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352
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);
}

3353
static int stop_discovery(struct sock *sk, struct hci_dev *hdev, void *data,
3354
			  u16 len)
3355
{
3356
	struct mgmt_cp_stop_discovery *mgmt_cp = data;
3357
	struct pending_cmd *cmd;
3358 3359
	struct hci_cp_remote_name_req_cancel cp;
	struct inquiry_entry *e;
3360 3361
	struct hci_request req;
	struct hci_cp_le_set_scan_enable enable_cp;
3362 3363
	int err;

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

3366
	hci_dev_lock(hdev);
3367

3368
	if (!hci_discovery_active(hdev)) {
3369
		err = cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY,
3370 3371
				   MGMT_STATUS_REJECTED, &mgmt_cp->type,
				   sizeof(mgmt_cp->type));
3372 3373 3374 3375
		goto unlock;
	}

	if (hdev->discovery.type != mgmt_cp->type) {
3376
		err = cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY,
3377 3378
				   MGMT_STATUS_INVALID_PARAMS, &mgmt_cp->type,
				   sizeof(mgmt_cp->type));
3379
		goto unlock;
3380 3381
	}

3382
	cmd = mgmt_pending_add(sk, MGMT_OP_STOP_DISCOVERY, hdev, NULL, 0);
3383 3384
	if (!cmd) {
		err = -ENOMEM;
3385 3386 3387
		goto unlock;
	}

3388 3389
	hci_req_init(&req, hdev);

3390 3391
	switch (hdev->discovery.state) {
	case DISCOVERY_FINDING:
3392 3393 3394 3395 3396 3397 3398 3399 3400 3401
		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);
		}
3402

3403 3404 3405 3406
		break;

	case DISCOVERY_RESOLVING:
		e = hci_inquiry_cache_lookup_resolve(hdev, BDADDR_ANY,
3407
						     NAME_PENDING);
3408
		if (!e) {
3409
			mgmt_pending_remove(cmd);
3410 3411 3412 3413 3414 3415 3416
			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;
		}
3417

3418
		bacpy(&cp.bdaddr, &e->data.bdaddr);
3419 3420
		hci_req_add(&req, HCI_OP_REMOTE_NAME_REQ_CANCEL, sizeof(cp),
			    &cp);
3421 3422 3423 3424 3425

		break;

	default:
		BT_DBG("unknown discovery state %u", hdev->discovery.state);
3426 3427 3428 3429 3430 3431

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

3434
	err = hci_req_run(&req, stop_discovery_complete);
3435 3436
	if (err < 0)
		mgmt_pending_remove(cmd);
3437 3438
	else
		hci_discovery_set_state(hdev, DISCOVERY_STOPPING);
3439

3440
unlock:
3441
	hci_dev_unlock(hdev);
3442 3443 3444
	return err;
}

3445
static int confirm_name(struct sock *sk, struct hci_dev *hdev, void *data,
3446
			u16 len)
3447
{
3448
	struct mgmt_cp_confirm_name *cp = data;
3449 3450 3451
	struct inquiry_entry *e;
	int err;

3452
	BT_DBG("%s", hdev->name);
3453 3454 3455

	hci_dev_lock(hdev);

3456
	if (!hci_discovery_active(hdev)) {
3457
		err = cmd_status(sk, hdev->id, MGMT_OP_CONFIRM_NAME,
3458
				 MGMT_STATUS_FAILED);
3459 3460 3461
		goto failed;
	}

3462
	e = hci_inquiry_cache_lookup_unknown(hdev, &cp->addr.bdaddr);
3463
	if (!e) {
3464
		err = cmd_status(sk, hdev->id, MGMT_OP_CONFIRM_NAME,
3465
				 MGMT_STATUS_INVALID_PARAMS);
3466 3467 3468 3469 3470 3471 3472 3473
		goto failed;
	}

	if (cp->name_known) {
		e->name_state = NAME_KNOWN;
		list_del(&e->list);
	} else {
		e->name_state = NAME_NEEDED;
3474
		hci_inquiry_cache_update_resolve(hdev, e);
3475 3476
	}

3477 3478
	err = cmd_complete(sk, hdev->id, MGMT_OP_CONFIRM_NAME, 0, &cp->addr,
			   sizeof(cp->addr));
3479 3480 3481 3482 3483 3484

failed:
	hci_dev_unlock(hdev);
	return err;
}

3485
static int block_device(struct sock *sk, struct hci_dev *hdev, void *data,
3486
			u16 len)
3487
{
3488
	struct mgmt_cp_block_device *cp = data;
3489
	u8 status;
3490 3491
	int err;

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

3494
	if (!bdaddr_type_is_valid(cp->addr.type))
3495 3496 3497
		return cmd_complete(sk, hdev->id, MGMT_OP_BLOCK_DEVICE,
				    MGMT_STATUS_INVALID_PARAMS,
				    &cp->addr, sizeof(cp->addr));
3498

3499
	hci_dev_lock(hdev);
3500

3501
	err = hci_blacklist_add(hdev, &cp->addr.bdaddr, cp->addr.type);
3502
	if (err < 0)
3503
		status = MGMT_STATUS_FAILED;
3504
	else
3505
		status = MGMT_STATUS_SUCCESS;
3506

3507
	err = cmd_complete(sk, hdev->id, MGMT_OP_BLOCK_DEVICE, status,
3508
			   &cp->addr, sizeof(cp->addr));
3509

3510
	hci_dev_unlock(hdev);
3511 3512 3513 3514

	return err;
}

3515
static int unblock_device(struct sock *sk, struct hci_dev *hdev, void *data,
3516
			  u16 len)
3517
{
3518
	struct mgmt_cp_unblock_device *cp = data;
3519
	u8 status;
3520 3521
	int err;

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

3524
	if (!bdaddr_type_is_valid(cp->addr.type))
3525 3526 3527
		return cmd_complete(sk, hdev->id, MGMT_OP_UNBLOCK_DEVICE,
				    MGMT_STATUS_INVALID_PARAMS,
				    &cp->addr, sizeof(cp->addr));
3528

3529
	hci_dev_lock(hdev);
3530

3531
	err = hci_blacklist_del(hdev, &cp->addr.bdaddr, cp->addr.type);
3532
	if (err < 0)
3533
		status = MGMT_STATUS_INVALID_PARAMS;
3534
	else
3535
		status = MGMT_STATUS_SUCCESS;
3536

3537
	err = cmd_complete(sk, hdev->id, MGMT_OP_UNBLOCK_DEVICE, status,
3538
			   &cp->addr, sizeof(cp->addr));
3539

3540
	hci_dev_unlock(hdev);
3541 3542 3543 3544

	return err;
}

3545 3546 3547 3548
static int set_device_id(struct sock *sk, struct hci_dev *hdev, void *data,
			 u16 len)
{
	struct mgmt_cp_set_device_id *cp = data;
3549
	struct hci_request req;
3550
	int err;
3551
	__u16 source;
3552 3553 3554

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

3555 3556 3557 3558 3559 3560
	source = __le16_to_cpu(cp->source);

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

3561 3562
	hci_dev_lock(hdev);

3563
	hdev->devid_source = source;
3564 3565 3566 3567 3568 3569
	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);

3570 3571 3572
	hci_req_init(&req, hdev);
	update_eir(&req);
	hci_req_run(&req, NULL);
3573 3574 3575 3576 3577 3578

	hci_dev_unlock(hdev);

	return err;
}

3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599
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);
}

3600 3601
static int set_advertising(struct sock *sk, struct hci_dev *hdev, void *data,
			   u16 len)
3602 3603 3604 3605
{
	struct mgmt_mode *cp = data;
	struct pending_cmd *cmd;
	struct hci_request req;
3606
	u8 val, enabled, status;
3607 3608 3609 3610
	int err;

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

3611 3612
	status = mgmt_le_support(hdev);
	if (status)
3613
		return cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING,
3614
				  status);
3615 3616 3617 3618 3619 3620 3621 3622

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

3625 3626 3627 3628 3629 3630
	/* 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 ||
3631
	    hci_conn_num(hdev, LE_LINK) > 0) {
3632 3633
		bool changed = false;

3634 3635
		if (val != test_bit(HCI_ADVERTISING, &hdev->dev_flags)) {
			change_bit(HCI_ADVERTISING, &hdev->dev_flags);
3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 3659 3660 3661 3662 3663
			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);

3664 3665 3666 3667
	if (val)
		enable_advertising(&req);
	else
		disable_advertising(&req);
3668 3669 3670 3671 3672 3673 3674 3675 3676 3677

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

unlock:
	hci_dev_unlock(hdev);
	return err;
}

3678 3679 3680 3681 3682 3683 3684 3685
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);

3686
	if (!lmp_le_capable(hdev))
3687
		return cmd_status(sk, hdev->id, MGMT_OP_SET_STATIC_ADDRESS,
3688
				  MGMT_STATUS_NOT_SUPPORTED);
3689 3690 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715 3716 3717

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

3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742
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);

3743 3744 3745 3746
	if (window > interval)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS,
				  MGMT_STATUS_INVALID_PARAMS);

3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758
	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;
}

3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774
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 {
3775 3776 3777 3778 3779 3780 3781
		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);

3782 3783 3784 3785 3786 3787 3788 3789 3790 3791
		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);
}

3792
static int set_fast_connectable(struct sock *sk, struct hci_dev *hdev,
3793
				void *data, u16 len)
3794
{
3795
	struct mgmt_mode *cp = data;
3796 3797
	struct pending_cmd *cmd;
	struct hci_request req;
3798 3799
	int err;

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

3802 3803
	if (!test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags) ||
	    hdev->hci_ver < BLUETOOTH_VER_1_2)
3804 3805 3806
		return cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
				  MGMT_STATUS_NOT_SUPPORTED);

3807 3808 3809 3810
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
				  MGMT_STATUS_INVALID_PARAMS);

3811
	if (!hdev_is_powered(hdev))
3812
		return cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
3813
				  MGMT_STATUS_NOT_POWERED);
3814 3815

	if (!test_bit(HCI_CONNECTABLE, &hdev->dev_flags))
3816
		return cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
3817
				  MGMT_STATUS_REJECTED);
3818 3819 3820

	hci_dev_lock(hdev);

3821 3822 3823 3824 3825 3826
	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;
	}

3827 3828 3829 3830 3831 3832
	if (!!cp->val == test_bit(HCI_FAST_CONNECTABLE, &hdev->dev_flags)) {
		err = send_settings_rsp(sk, MGMT_OP_SET_FAST_CONNECTABLE,
					hdev);
		goto unlock;
	}

3833 3834 3835 3836 3837
	cmd = mgmt_pending_add(sk, MGMT_OP_SET_FAST_CONNECTABLE, hdev,
			       data, len);
	if (!cmd) {
		err = -ENOMEM;
		goto unlock;
3838 3839
	}

3840 3841
	hci_req_init(&req, hdev);

3842
	write_fast_connectable(&req, cp->val);
3843 3844

	err = hci_req_run(&req, fast_connectable_complete);
3845
	if (err < 0) {
3846
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
3847
				 MGMT_STATUS_FAILED);
3848
		mgmt_pending_remove(cmd);
3849 3850
	}

3851
unlock:
3852
	hci_dev_unlock(hdev);
3853

3854 3855 3856
	return err;
}

3857 3858 3859 3860 3861 3862 3863 3864 3865 3866 3867 3868 3869 3870 3871 3872 3873 3874 3875 3876
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);
}

3877 3878 3879 3880 3881 3882 3883 3884 3885 3886 3887 3888 3889 3890 3891 3892 3893 3894 3895 3896 3897 3898 3899 3900 3901 3902 3903 3904 3905 3906 3907 3908 3909 3910 3911 3912 3913 3914 3915 3916 3917 3918 3919 3920 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 3931 3932 3933 3934 3935 3936 3937 3938 3939 3940 3941 3942 3943 3944 3945 3946 3947 3948 3949 3950 3951 3952 3953 3954 3955 3956 3957 3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974
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;
	}

3975
	/* We need to flip the bit already here so that update_adv_data
3976 3977 3978 3979 3980
	 * generates the correct flags.
	 */
	set_bit(HCI_BREDR_ENABLED, &hdev->dev_flags);

	hci_req_init(&req, hdev);
3981 3982 3983 3984

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

3985 3986 3987
	/* Since only the advertising data flags will change, there
	 * is no need to update the scan response data.
	 */
3988
	update_adv_data(&req);
3989

3990 3991 3992 3993 3994 3995 3996 3997 3998
	err = hci_req_run(&req, set_bredr_complete);
	if (err < 0)
		mgmt_pending_remove(cmd);

unlock:
	hci_dev_unlock(hdev);
	return err;
}

3999 4000
static bool ltk_is_valid(struct mgmt_ltk_info *key)
{
4001 4002
	if (key->authenticated != 0x00 && key->authenticated != 0x01)
		return false;
4003 4004
	if (key->master != 0x00 && key->master != 0x01)
		return false;
4005 4006
	if (!bdaddr_type_is_le(key->addr.type))
		return false;
4007 4008 4009
	return true;
}

4010
static int load_long_term_keys(struct sock *sk, struct hci_dev *hdev,
4011
			       void *cp_data, u16 len)
4012 4013 4014
{
	struct mgmt_cp_load_long_term_keys *cp = cp_data;
	u16 key_count, expected_len;
4015
	int i, err;
4016

4017 4018 4019 4020 4021 4022
	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);

4023
	key_count = __le16_to_cpu(cp->key_count);
4024 4025 4026 4027 4028

	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",
4029
		       len, expected_len);
4030
		return cmd_status(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS,
4031
				  MGMT_STATUS_INVALID_PARAMS);
4032 4033
	}

4034
	BT_DBG("%s key_count %u", hdev->name, key_count);
4035

4036 4037 4038
	for (i = 0; i < key_count; i++) {
		struct mgmt_ltk_info *key = &cp->keys[i];

4039
		if (!ltk_is_valid(key))
4040 4041 4042 4043 4044
			return cmd_status(sk, hdev->id,
					  MGMT_OP_LOAD_LONG_TERM_KEYS,
					  MGMT_STATUS_INVALID_PARAMS);
	}

4045 4046 4047 4048 4049 4050
	hci_dev_lock(hdev);

	hci_smp_ltks_clear(hdev);

	for (i = 0; i < key_count; i++) {
		struct mgmt_ltk_info *key = &cp->keys[i];
4051 4052 4053 4054 4055 4056
		u8 type, addr_type;

		if (key->addr.type == BDADDR_LE_PUBLIC)
			addr_type = ADDR_LE_DEV_PUBLIC;
		else
			addr_type = ADDR_LE_DEV_RANDOM;
4057 4058 4059 4060 4061 4062

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

4063
		hci_add_ltk(hdev, &key->addr.bdaddr, addr_type,
4064 4065
			    type, 0, key->authenticated, key->val,
			    key->enc_size, key->ediv, key->rand);
4066 4067
	}

4068 4069 4070
	err = cmd_complete(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS, 0,
			   NULL, 0);

4071 4072
	hci_dev_unlock(hdev);

4073
	return err;
4074 4075
}

4076
static const struct mgmt_handler {
4077 4078
	int (*func) (struct sock *sk, struct hci_dev *hdev, void *data,
		     u16 data_len);
4079 4080
	bool var_len;
	size_t data_len;
4081 4082
} mgmt_handlers[] = {
	{ NULL }, /* 0x0000 (no command) */
4083 4084 4085 4086 4087 4088 4089 4090 4091 4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 4103 4104 4105 4106 4107 4108 4109 4110 4111 4112 4113 4114 4115 4116 4117 4118 4119 4120 4121
	{ 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 },
4122
	{ set_device_id,          false, MGMT_SET_DEVICE_ID_SIZE },
4123
	{ set_advertising,        false, MGMT_SETTING_SIZE },
4124
	{ set_bredr,              false, MGMT_SETTING_SIZE },
4125
	{ set_static_address,     false, MGMT_SET_STATIC_ADDRESS_SIZE },
4126
	{ set_scan_params,        false, MGMT_SET_SCAN_PARAMS_SIZE },
4127 4128 4129
};


4130 4131
int mgmt_control(struct sock *sk, struct msghdr *msg, size_t msglen)
{
4132 4133
	void *buf;
	u8 *cp;
4134
	struct mgmt_hdr *hdr;
4135
	u16 opcode, index, len;
4136
	struct hci_dev *hdev = NULL;
4137
	const struct mgmt_handler *handler;
4138 4139 4140 4141 4142 4143 4144
	int err;

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

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

4145
	buf = kmalloc(msglen, GFP_KERNEL);
4146 4147 4148 4149 4150 4151 4152 4153
	if (!buf)
		return -ENOMEM;

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

4154
	hdr = buf;
4155 4156 4157
	opcode = __le16_to_cpu(hdr->opcode);
	index = __le16_to_cpu(hdr->index);
	len = __le16_to_cpu(hdr->len);
4158 4159 4160 4161 4162 4163

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

4164
	if (index != MGMT_INDEX_NONE) {
4165 4166 4167
		hdev = hci_dev_get(index);
		if (!hdev) {
			err = cmd_status(sk, index, opcode,
4168
					 MGMT_STATUS_INVALID_INDEX);
4169 4170
			goto done;
		}
4171

4172 4173
		if (test_bit(HCI_SETUP, &hdev->dev_flags) ||
		    test_bit(HCI_USER_CHANNEL, &hdev->dev_flags)) {
4174 4175 4176 4177
			err = cmd_status(sk, index, opcode,
					 MGMT_STATUS_INVALID_INDEX);
			goto done;
		}
4178 4179
	}

4180
	if (opcode >= ARRAY_SIZE(mgmt_handlers) ||
4181
	    mgmt_handlers[opcode].func == NULL) {
4182
		BT_DBG("Unknown op %u", opcode);
4183
		err = cmd_status(sk, index, opcode,
4184
				 MGMT_STATUS_UNKNOWN_COMMAND);
4185 4186 4187 4188
		goto done;
	}

	if ((hdev && opcode < MGMT_OP_READ_INFO) ||
4189
	    (!hdev && opcode >= MGMT_OP_READ_INFO)) {
4190
		err = cmd_status(sk, index, opcode,
4191
				 MGMT_STATUS_INVALID_INDEX);
4192
		goto done;
4193 4194
	}

4195 4196 4197
	handler = &mgmt_handlers[opcode];

	if ((handler->var_len && len < handler->data_len) ||
4198
	    (!handler->var_len && len != handler->data_len)) {
4199
		err = cmd_status(sk, index, opcode,
4200
				 MGMT_STATUS_INVALID_PARAMS);
4201 4202 4203
		goto done;
	}

4204 4205 4206 4207 4208
	if (hdev)
		mgmt_init_hdev(sk, hdev);

	cp = buf + sizeof(*hdr);

4209
	err = handler->func(sk, hdev, cp, len);
4210 4211 4212
	if (err < 0)
		goto done;

4213 4214 4215
	err = msglen;

done:
4216 4217 4218
	if (hdev)
		hci_dev_put(hdev);

4219 4220 4221
	kfree(buf);
	return err;
}
4222

4223
void mgmt_index_added(struct hci_dev *hdev)
4224
{
4225
	if (hdev->dev_type != HCI_BREDR)
4226
		return;
4227

4228
	mgmt_event(MGMT_EV_INDEX_ADDED, hdev, NULL, 0, NULL);
4229 4230
}

4231
void mgmt_index_removed(struct hci_dev *hdev)
4232
{
4233
	u8 status = MGMT_STATUS_INVALID_INDEX;
4234

4235
	if (hdev->dev_type != HCI_BREDR)
4236
		return;
4237

4238
	mgmt_pending_foreach(0, hdev, cmd_status_rsp, &status);
4239

4240
	mgmt_event(MGMT_EV_INDEX_REMOVED, hdev, NULL, 0, NULL);
4241 4242
}

4243 4244 4245 4246 4247 4248 4249 4250 4251 4252 4253 4254 4255 4256 4257 4258 4259 4260
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);
}

4261
static int powered_update_hci(struct hci_dev *hdev)
4262
{
4263
	struct hci_request req;
4264
	u8 link_sec;
4265

4266 4267
	hci_req_init(&req, hdev);

4268 4269 4270
	if (test_bit(HCI_SSP_ENABLED, &hdev->dev_flags) &&
	    !lmp_host_ssp_capable(hdev)) {
		u8 ssp = 1;
4271

4272
		hci_req_add(&req, HCI_OP_WRITE_SSP_MODE, 1, &ssp);
4273
	}
4274

4275 4276
	if (test_bit(HCI_LE_ENABLED, &hdev->dev_flags) &&
	    lmp_bredr_capable(hdev)) {
4277
		struct hci_cp_write_le_host_supported cp;
4278

4279 4280
		cp.le = 1;
		cp.simul = lmp_le_br_capable(hdev);
4281

4282 4283 4284 4285 4286
		/* 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))
4287 4288
			hci_req_add(&req, HCI_OP_WRITE_LE_HOST_SUPPORTED,
				    sizeof(cp), &cp);
4289
	}
4290

4291 4292 4293 4294 4295
	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);
4296

4297 4298 4299 4300
		/* 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.
		 */
4301
		if (test_bit(HCI_LE_ENABLED, &hdev->dev_flags)) {
4302
			update_adv_data(&req);
4303 4304
			update_scan_rsp_data(&req);
		}
4305

4306 4307
		if (test_bit(HCI_ADVERTISING, &hdev->dev_flags))
			enable_advertising(&req);
4308 4309
	}

4310 4311
	link_sec = test_bit(HCI_LINK_SECURITY, &hdev->dev_flags);
	if (link_sec != test_bit(HCI_AUTH, &hdev->flags))
4312 4313
		hci_req_add(&req, HCI_OP_WRITE_AUTH_ENABLE,
			    sizeof(link_sec), &link_sec);
4314

4315
	if (lmp_bredr_capable(hdev)) {
4316 4317
		if (test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags))
			set_bredr_scan(&req);
4318
		update_class(&req);
4319
		update_name(&req);
4320
		update_eir(&req);
4321
	}
4322

4323
	return hci_req_run(&req, powered_complete);
4324
}
4325

4326 4327 4328
int mgmt_powered(struct hci_dev *hdev, u8 powered)
{
	struct cmd_lookup match = { NULL, hdev };
4329 4330
	u8 status_not_powered = MGMT_STATUS_NOT_POWERED;
	u8 zero_cod[] = { 0, 0, 0 };
4331
	int err;
4332

4333 4334 4335 4336
	if (!test_bit(HCI_MGMT, &hdev->dev_flags))
		return 0;

	if (powered) {
4337 4338
		if (powered_update_hci(hdev) == 0)
			return 0;
4339

4340 4341 4342
		mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, settings_rsp,
				     &match);
		goto new_settings;
4343 4344
	}

4345 4346 4347 4348 4349 4350 4351 4352
	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:
4353
	err = new_settings(hdev, match.sk);
4354 4355 4356 4357

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

4358
	return err;
4359
}
4360

4361
void mgmt_set_powered_failed(struct hci_dev *hdev, int err)
4362 4363 4364 4365 4366 4367
{
	struct pending_cmd *cmd;
	u8 status;

	cmd = mgmt_pending_find(MGMT_OP_SET_POWERED, hdev);
	if (!cmd)
4368
		return;
4369 4370 4371 4372 4373 4374

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

4375
	cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_POWERED, status);
4376 4377 4378 4379

	mgmt_pending_remove(cmd);
}

4380 4381 4382 4383 4384 4385 4386 4387 4388 4389 4390 4391
void mgmt_discoverable_timeout(struct hci_dev *hdev)
{
	struct hci_request req;

	hci_dev_lock(hdev);

	/* When discoverable timeout triggers, then just make sure
	 * the limited discoverable flag is cleared. Even in the case
	 * of a timeout triggered from general discoverable, it is
	 * safe to unconditionally clear the flag.
	 */
	clear_bit(HCI_LIMITED_DISCOVERABLE, &hdev->dev_flags);
4392
	clear_bit(HCI_DISCOVERABLE, &hdev->dev_flags);
4393 4394

	hci_req_init(&req, hdev);
4395 4396 4397 4398 4399
	if (test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags)) {
		u8 scan = SCAN_PAGE;
		hci_req_add(&req, HCI_OP_WRITE_SCAN_ENABLE,
			    sizeof(scan), &scan);
	}
4400
	update_class(&req);
4401
	update_adv_data(&req);
4402 4403 4404 4405
	hci_req_run(&req, NULL);

	hdev->discov_timeout = 0;

4406 4407
	new_settings(hdev, NULL);

4408 4409 4410
	hci_dev_unlock(hdev);
}

4411
void mgmt_discoverable(struct hci_dev *hdev, u8 discoverable)
4412
{
4413
	bool changed;
4414

4415 4416 4417 4418 4419
	/* 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))
4420
		return;
4421

4422
	if (discoverable) {
4423
		changed = !test_and_set_bit(HCI_DISCOVERABLE, &hdev->dev_flags);
4424 4425
	} else {
		clear_bit(HCI_LIMITED_DISCOVERABLE, &hdev->dev_flags);
4426
		changed = test_and_clear_bit(HCI_DISCOVERABLE, &hdev->dev_flags);
4427 4428 4429 4430 4431 4432 4433 4434 4435 4436 4437 4438
	}

	if (changed) {
		struct hci_request req;

		/* In case this change in discoverable was triggered by
		 * a disabling of connectable there could be a need to
		 * update the advertising flags.
		 */
		hci_req_init(&req, hdev);
		update_adv_data(&req);
		hci_req_run(&req, NULL);
4439

4440
		new_settings(hdev, NULL);
4441
	}
4442
}
4443

4444
void mgmt_connectable(struct hci_dev *hdev, u8 connectable)
4445
{
4446
	bool changed;
4447

4448 4449 4450 4451 4452
	/* 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))
4453
		return;
4454

4455 4456 4457 4458
	if (connectable)
		changed = !test_and_set_bit(HCI_CONNECTABLE, &hdev->dev_flags);
	else
		changed = test_and_clear_bit(HCI_CONNECTABLE, &hdev->dev_flags);
4459

4460
	if (changed)
4461
		new_settings(hdev, NULL);
4462
}
4463

4464
void mgmt_write_scan_failed(struct hci_dev *hdev, u8 scan, u8 status)
4465
{
4466 4467
	u8 mgmt_err = mgmt_status(status);

4468
	if (scan & SCAN_PAGE)
4469
		mgmt_pending_foreach(MGMT_OP_SET_CONNECTABLE, hdev,
4470
				     cmd_status_rsp, &mgmt_err);
4471 4472

	if (scan & SCAN_INQUIRY)
4473
		mgmt_pending_foreach(MGMT_OP_SET_DISCOVERABLE, hdev,
4474
				     cmd_status_rsp, &mgmt_err);
4475 4476
}

4477 4478
void mgmt_new_link_key(struct hci_dev *hdev, struct link_key *key,
		       bool persistent)
4479
{
4480
	struct mgmt_ev_new_link_key ev;
4481

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

4484
	ev.store_hint = persistent;
4485
	bacpy(&ev.key.addr.bdaddr, &key->bdaddr);
4486
	ev.key.addr.type = BDADDR_BREDR;
4487
	ev.key.type = key->type;
4488
	memcpy(ev.key.val, key->val, HCI_LINK_KEY_SIZE);
4489
	ev.key.pin_len = key->pin_len;
4490

4491
	mgmt_event(MGMT_EV_NEW_LINK_KEY, hdev, &ev, sizeof(ev), NULL);
4492
}
4493

4494
void mgmt_new_ltk(struct hci_dev *hdev, struct smp_ltk *key, u8 persistent)
4495 4496 4497 4498 4499 4500 4501
{
	struct mgmt_ev_new_long_term_key ev;

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

	ev.store_hint = persistent;
	bacpy(&ev.key.addr.bdaddr, &key->bdaddr);
4502
	ev.key.addr.type = link_to_bdaddr(LE_LINK, key->bdaddr_type);
4503 4504 4505 4506 4507 4508 4509 4510 4511 4512
	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));

4513
	mgmt_event(MGMT_EV_NEW_LONG_TERM_KEY, hdev, &ev, sizeof(ev), NULL);
4514 4515
}

4516 4517 4518 4519 4520 4521 4522 4523 4524 4525 4526
static inline u16 eir_append_data(u8 *eir, u16 eir_len, u8 type, u8 *data,
				  u8 data_len)
{
	eir[eir_len++] = sizeof(type) + data_len;
	eir[eir_len++] = type;
	memcpy(&eir[eir_len], data, data_len);
	eir_len += data_len;

	return eir_len;
}

4527 4528 4529
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)
4530
{
4531 4532 4533
	char buf[512];
	struct mgmt_ev_device_connected *ev = (void *) buf;
	u16 eir_len = 0;
4534

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

4538
	ev->flags = __cpu_to_le32(flags);
4539

4540 4541
	if (name_len > 0)
		eir_len = eir_append_data(ev->eir, 0, EIR_NAME_COMPLETE,
4542
					  name, name_len);
4543 4544

	if (dev_class && memcmp(dev_class, "\0\0\0", 3) != 0)
4545
		eir_len = eir_append_data(ev->eir, eir_len,
4546
					  EIR_CLASS_OF_DEV, dev_class, 3);
4547

4548
	ev->eir_len = cpu_to_le16(eir_len);
4549

4550 4551
	mgmt_event(MGMT_EV_DEVICE_CONNECTED, hdev, buf,
		    sizeof(*ev) + eir_len, NULL);
4552 4553
}

4554 4555
static void disconnect_rsp(struct pending_cmd *cmd, void *data)
{
4556
	struct mgmt_cp_disconnect *cp = cmd->param;
4557
	struct sock **sk = data;
4558
	struct mgmt_rp_disconnect rp;
4559

4560 4561
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;
4562

4563
	cmd_complete(cmd->sk, cmd->index, MGMT_OP_DISCONNECT, 0, &rp,
4564
		     sizeof(rp));
4565 4566 4567 4568

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

4569
	mgmt_pending_remove(cmd);
4570 4571
}

4572
static void unpair_device_rsp(struct pending_cmd *cmd, void *data)
4573
{
4574
	struct hci_dev *hdev = data;
4575 4576
	struct mgmt_cp_unpair_device *cp = cmd->param;
	struct mgmt_rp_unpair_device rp;
4577 4578

	memset(&rp, 0, sizeof(rp));
4579 4580
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;
4581

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

4584
	cmd_complete(cmd->sk, cmd->index, cmd->opcode, 0, &rp, sizeof(rp));
4585 4586 4587 4588

	mgmt_pending_remove(cmd);
}

4589 4590
void mgmt_device_disconnected(struct hci_dev *hdev, bdaddr_t *bdaddr,
			      u8 link_type, u8 addr_type, u8 reason)
4591
{
4592
	struct mgmt_ev_device_disconnected ev;
4593 4594
	struct sock *sk = NULL;

4595
	mgmt_pending_foreach(MGMT_OP_DISCONNECT, hdev, disconnect_rsp, &sk);
4596

4597 4598 4599
	bacpy(&ev.addr.bdaddr, bdaddr);
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
	ev.reason = reason;
4600

4601
	mgmt_event(MGMT_EV_DEVICE_DISCONNECTED, hdev, &ev, sizeof(ev), sk);
4602 4603

	if (sk)
4604
		sock_put(sk);
4605

4606
	mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE, hdev, unpair_device_rsp,
4607
			     hdev);
4608 4609
}

4610 4611
void mgmt_disconnect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr,
			    u8 link_type, u8 addr_type, u8 status)
4612
{
4613
	struct mgmt_rp_disconnect rp;
4614 4615
	struct pending_cmd *cmd;

4616 4617 4618
	mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE, hdev, unpair_device_rsp,
			     hdev);

4619
	cmd = mgmt_pending_find(MGMT_OP_DISCONNECT, hdev);
4620
	if (!cmd)
4621
		return;
4622

4623
	bacpy(&rp.addr.bdaddr, bdaddr);
4624
	rp.addr.type = link_to_bdaddr(link_type, addr_type);
4625

4626 4627
	cmd_complete(cmd->sk, cmd->index, MGMT_OP_DISCONNECT,
		     mgmt_status(status), &rp, sizeof(rp));
4628

4629
	mgmt_pending_remove(cmd);
4630
}
4631

4632 4633
void mgmt_connect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
			 u8 addr_type, u8 status)
4634 4635 4636
{
	struct mgmt_ev_connect_failed ev;

4637
	bacpy(&ev.addr.bdaddr, bdaddr);
4638
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
4639
	ev.status = mgmt_status(status);
4640

4641
	mgmt_event(MGMT_EV_CONNECT_FAILED, hdev, &ev, sizeof(ev), NULL);
4642
}
4643

4644
void mgmt_pin_code_request(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 secure)
4645 4646 4647
{
	struct mgmt_ev_pin_code_request ev;

4648
	bacpy(&ev.addr.bdaddr, bdaddr);
4649
	ev.addr.type = BDADDR_BREDR;
4650
	ev.secure = secure;
4651

4652
	mgmt_event(MGMT_EV_PIN_CODE_REQUEST, hdev, &ev, sizeof(ev), NULL);
4653 4654
}

4655 4656
void mgmt_pin_code_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
				  u8 status)
4657 4658
{
	struct pending_cmd *cmd;
4659
	struct mgmt_rp_pin_code_reply rp;
4660

4661
	cmd = mgmt_pending_find(MGMT_OP_PIN_CODE_REPLY, hdev);
4662
	if (!cmd)
4663
		return;
4664

4665
	bacpy(&rp.addr.bdaddr, bdaddr);
4666
	rp.addr.type = BDADDR_BREDR;
4667

4668 4669
	cmd_complete(cmd->sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
		     mgmt_status(status), &rp, sizeof(rp));
4670

4671
	mgmt_pending_remove(cmd);
4672 4673
}

4674 4675
void mgmt_pin_code_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
				      u8 status)
4676 4677
{
	struct pending_cmd *cmd;
4678
	struct mgmt_rp_pin_code_reply rp;
4679

4680
	cmd = mgmt_pending_find(MGMT_OP_PIN_CODE_NEG_REPLY, hdev);
4681
	if (!cmd)
4682
		return;
4683

4684
	bacpy(&rp.addr.bdaddr, bdaddr);
4685
	rp.addr.type = BDADDR_BREDR;
4686

4687 4688
	cmd_complete(cmd->sk, hdev->id, MGMT_OP_PIN_CODE_NEG_REPLY,
		     mgmt_status(status), &rp, sizeof(rp));
4689

4690
	mgmt_pending_remove(cmd);
4691
}
4692

4693
int mgmt_user_confirm_request(struct hci_dev *hdev, bdaddr_t *bdaddr,
4694 4695
			      u8 link_type, u8 addr_type, __le32 value,
			      u8 confirm_hint)
4696 4697 4698
{
	struct mgmt_ev_user_confirm_request ev;

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

4701
	bacpy(&ev.addr.bdaddr, bdaddr);
4702
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
4703
	ev.confirm_hint = confirm_hint;
4704
	ev.value = value;
4705

4706
	return mgmt_event(MGMT_EV_USER_CONFIRM_REQUEST, hdev, &ev, sizeof(ev),
4707
			  NULL);
4708 4709
}

4710
int mgmt_user_passkey_request(struct hci_dev *hdev, bdaddr_t *bdaddr,
4711
			      u8 link_type, u8 addr_type)
4712 4713 4714 4715 4716
{
	struct mgmt_ev_user_passkey_request ev;

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

4717
	bacpy(&ev.addr.bdaddr, bdaddr);
4718
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
4719 4720

	return mgmt_event(MGMT_EV_USER_PASSKEY_REQUEST, hdev, &ev, sizeof(ev),
4721
			  NULL);
4722 4723
}

4724
static int user_pairing_resp_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
4725 4726
				      u8 link_type, u8 addr_type, u8 status,
				      u8 opcode)
4727 4728 4729 4730 4731
{
	struct pending_cmd *cmd;
	struct mgmt_rp_user_confirm_reply rp;
	int err;

4732
	cmd = mgmt_pending_find(opcode, hdev);
4733 4734 4735
	if (!cmd)
		return -ENOENT;

4736
	bacpy(&rp.addr.bdaddr, bdaddr);
4737
	rp.addr.type = link_to_bdaddr(link_type, addr_type);
4738
	err = cmd_complete(cmd->sk, hdev->id, opcode, mgmt_status(status),
4739
			   &rp, sizeof(rp));
4740

4741
	mgmt_pending_remove(cmd);
4742 4743 4744 4745

	return err;
}

4746
int mgmt_user_confirm_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
4747
				     u8 link_type, u8 addr_type, u8 status)
4748
{
4749
	return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
4750
					  status, MGMT_OP_USER_CONFIRM_REPLY);
4751 4752
}

4753
int mgmt_user_confirm_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
4754
					 u8 link_type, u8 addr_type, u8 status)
4755
{
4756
	return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
4757 4758
					  status,
					  MGMT_OP_USER_CONFIRM_NEG_REPLY);
4759
}
4760

4761
int mgmt_user_passkey_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
4762
				     u8 link_type, u8 addr_type, u8 status)
4763
{
4764
	return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
4765
					  status, MGMT_OP_USER_PASSKEY_REPLY);
4766 4767
}

4768
int mgmt_user_passkey_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
4769
					 u8 link_type, u8 addr_type, u8 status)
4770
{
4771
	return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
4772 4773
					  status,
					  MGMT_OP_USER_PASSKEY_NEG_REPLY);
4774 4775
}

4776 4777 4778 4779 4780 4781 4782 4783 4784 4785 4786 4787 4788 4789 4790 4791
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);
}

4792 4793
void mgmt_auth_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
		      u8 addr_type, u8 status)
4794 4795 4796
{
	struct mgmt_ev_auth_failed ev;

4797
	bacpy(&ev.addr.bdaddr, bdaddr);
4798
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
4799
	ev.status = mgmt_status(status);
4800

4801
	mgmt_event(MGMT_EV_AUTH_FAILED, hdev, &ev, sizeof(ev), NULL);
4802
}
4803

4804
void mgmt_auth_enable_complete(struct hci_dev *hdev, u8 status)
4805 4806
{
	struct cmd_lookup match = { NULL, hdev };
4807
	bool changed;
4808 4809 4810 4811

	if (status) {
		u8 mgmt_err = mgmt_status(status);
		mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev,
4812
				     cmd_status_rsp, &mgmt_err);
4813
		return;
4814 4815
	}

4816 4817 4818 4819 4820 4821
	if (test_bit(HCI_AUTH, &hdev->flags))
		changed = !test_and_set_bit(HCI_LINK_SECURITY,
					    &hdev->dev_flags);
	else
		changed = test_and_clear_bit(HCI_LINK_SECURITY,
					     &hdev->dev_flags);
4822

4823
	mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev, settings_rsp,
4824
			     &match);
4825

4826
	if (changed)
4827
		new_settings(hdev, match.sk);
4828 4829 4830 4831 4832

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

4833
static void clear_eir(struct hci_request *req)
4834
{
4835
	struct hci_dev *hdev = req->hdev;
4836 4837
	struct hci_cp_write_eir cp;

4838
	if (!lmp_ext_inq_capable(hdev))
4839
		return;
4840

4841 4842
	memset(hdev->eir, 0, sizeof(hdev->eir));

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

4845
	hci_req_add(req, HCI_OP_WRITE_EIR, sizeof(cp), &cp);
4846 4847
}

4848
void mgmt_ssp_enable_complete(struct hci_dev *hdev, u8 enable, u8 status)
4849 4850
{
	struct cmd_lookup match = { NULL, hdev };
4851
	struct hci_request req;
4852
	bool changed = false;
4853 4854 4855

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

		if (enable && test_and_clear_bit(HCI_SSP_ENABLED,
4858 4859
						 &hdev->dev_flags)) {
			clear_bit(HCI_HS_ENABLED, &hdev->dev_flags);
4860
			new_settings(hdev, NULL);
4861
		}
4862

4863 4864
		mgmt_pending_foreach(MGMT_OP_SET_SSP, hdev, cmd_status_rsp,
				     &mgmt_err);
4865
		return;
4866 4867 4868
	}

	if (enable) {
4869
		changed = !test_and_set_bit(HCI_SSP_ENABLED, &hdev->dev_flags);
4870
	} else {
4871 4872 4873 4874 4875 4876
		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);
4877 4878 4879 4880
	}

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

4881
	if (changed)
4882
		new_settings(hdev, match.sk);
4883

4884
	if (match.sk)
4885 4886
		sock_put(match.sk);

4887 4888
	hci_req_init(&req, hdev);

4889
	if (test_bit(HCI_SSP_ENABLED, &hdev->dev_flags))
4890
		update_eir(&req);
4891
	else
4892 4893 4894
		clear_eir(&req);

	hci_req_run(&req, NULL);
4895 4896
}

4897
static void sk_lookup(struct pending_cmd *cmd, void *data)
4898 4899 4900 4901 4902 4903 4904 4905 4906
{
	struct cmd_lookup *match = data;

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

4907 4908
void mgmt_set_class_of_dev_complete(struct hci_dev *hdev, u8 *dev_class,
				    u8 status)
4909
{
4910
	struct cmd_lookup match = { NULL, hdev, mgmt_status(status) };
4911

4912 4913 4914
	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);
4915 4916

	if (!status)
4917 4918
		mgmt_event(MGMT_EV_CLASS_OF_DEV_CHANGED, hdev, dev_class, 3,
			   NULL);
4919 4920 4921

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

4924
void mgmt_set_local_name_complete(struct hci_dev *hdev, u8 *name, u8 status)
4925 4926
{
	struct mgmt_cp_set_local_name ev;
4927
	struct pending_cmd *cmd;
4928

4929
	if (status)
4930
		return;
4931 4932 4933

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

4936
	cmd = mgmt_pending_find(MGMT_OP_SET_LOCAL_NAME, hdev);
4937 4938
	if (!cmd) {
		memcpy(hdev->dev_name, name, sizeof(hdev->dev_name));
4939

4940 4941 4942 4943
		/* 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))
4944
			return;
4945
	}
4946

4947 4948
	mgmt_event(MGMT_EV_LOCAL_NAME_CHANGED, hdev, &ev, sizeof(ev),
		   cmd ? cmd->sk : NULL);
4949
}
4950

4951 4952
void mgmt_read_local_oob_data_reply_complete(struct hci_dev *hdev, u8 *hash,
					     u8 *randomizer, u8 status)
4953 4954 4955
{
	struct pending_cmd *cmd;

4956
	BT_DBG("%s status %u", hdev->name, status);
4957

4958
	cmd = mgmt_pending_find(MGMT_OP_READ_LOCAL_OOB_DATA, hdev);
4959
	if (!cmd)
4960
		return;
4961 4962

	if (status) {
4963 4964
		cmd_status(cmd->sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
			   mgmt_status(status));
4965 4966 4967 4968 4969 4970
	} else {
		struct mgmt_rp_read_local_oob_data rp;

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

4971 4972
		cmd_complete(cmd->sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
			     0, &rp, sizeof(rp));
4973 4974 4975 4976
	}

	mgmt_pending_remove(cmd);
}
4977

4978 4979 4980
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)
4981
{
4982 4983
	char buf[512];
	struct mgmt_ev_device_found *ev = (void *) buf;
4984
	size_t ev_size;
4985

4986
	if (!hci_discovery_active(hdev))
4987
		return;
4988

4989 4990
	/* Leave 5 bytes for a potential CoD field */
	if (sizeof(*ev) + eir_len + 5 > sizeof(buf))
4991
		return;
4992

4993 4994
	memset(buf, 0, sizeof(buf));

4995
	bacpy(&ev->addr.bdaddr, bdaddr);
4996
	ev->addr.type = link_to_bdaddr(link_type, addr_type);
4997
	ev->rssi = rssi;
4998
	if (cfm_name)
4999
		ev->flags |= __constant_cpu_to_le32(MGMT_DEV_FOUND_CONFIRM_NAME);
5000
	if (!ssp)
5001
		ev->flags |= __constant_cpu_to_le32(MGMT_DEV_FOUND_LEGACY_PAIRING);
5002

5003
	if (eir_len > 0)
5004
		memcpy(ev->eir, eir, eir_len);
5005

5006 5007
	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,
5008
					  dev_class, 3);
5009

5010
	ev->eir_len = cpu_to_le16(eir_len);
5011
	ev_size = sizeof(*ev) + eir_len;
5012

5013
	mgmt_event(MGMT_EV_DEVICE_FOUND, hdev, ev, ev_size, NULL);
5014
}
5015

5016 5017
void mgmt_remote_name(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
		      u8 addr_type, s8 rssi, u8 *name, u8 name_len)
5018
{
5019 5020 5021
	struct mgmt_ev_device_found *ev;
	char buf[sizeof(*ev) + HCI_MAX_NAME_LENGTH + 2];
	u16 eir_len;
5022

5023
	ev = (struct mgmt_ev_device_found *) buf;
5024

5025 5026 5027
	memset(buf, 0, sizeof(buf));

	bacpy(&ev->addr.bdaddr, bdaddr);
5028
	ev->addr.type = link_to_bdaddr(link_type, addr_type);
5029 5030 5031
	ev->rssi = rssi;

	eir_len = eir_append_data(ev->eir, 0, EIR_NAME_COMPLETE, name,
5032
				  name_len);
5033

5034
	ev->eir_len = cpu_to_le16(eir_len);
5035

5036
	mgmt_event(MGMT_EV_DEVICE_FOUND, hdev, ev, sizeof(*ev) + eir_len, NULL);
5037
}
5038

5039
void mgmt_discovering(struct hci_dev *hdev, u8 discovering)
5040
{
5041
	struct mgmt_ev_discovering ev;
5042 5043
	struct pending_cmd *cmd;

5044 5045
	BT_DBG("%s discovering %u", hdev->name, discovering);

5046
	if (discovering)
5047
		cmd = mgmt_pending_find(MGMT_OP_START_DISCOVERY, hdev);
5048
	else
5049
		cmd = mgmt_pending_find(MGMT_OP_STOP_DISCOVERY, hdev);
5050 5051

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

5054 5055
		cmd_complete(cmd->sk, hdev->id, cmd->opcode, 0, &type,
			     sizeof(type));
5056 5057 5058
		mgmt_pending_remove(cmd);
	}

5059 5060 5061 5062
	memset(&ev, 0, sizeof(ev));
	ev.type = hdev->discovery.type;
	ev.discovering = discovering;

5063
	mgmt_event(MGMT_EV_DISCOVERING, hdev, &ev, sizeof(ev), NULL);
5064
}
5065

5066
int mgmt_device_blocked(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type)
5067 5068 5069 5070
{
	struct pending_cmd *cmd;
	struct mgmt_ev_device_blocked ev;

5071
	cmd = mgmt_pending_find(MGMT_OP_BLOCK_DEVICE, hdev);
5072

5073 5074
	bacpy(&ev.addr.bdaddr, bdaddr);
	ev.addr.type = type;
5075

5076
	return mgmt_event(MGMT_EV_DEVICE_BLOCKED, hdev, &ev, sizeof(ev),
5077
			  cmd ? cmd->sk : NULL);
5078 5079
}

5080
int mgmt_device_unblocked(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type)
5081 5082 5083 5084
{
	struct pending_cmd *cmd;
	struct mgmt_ev_device_unblocked ev;

5085
	cmd = mgmt_pending_find(MGMT_OP_UNBLOCK_DEVICE, hdev);
5086

5087 5088
	bacpy(&ev.addr.bdaddr, bdaddr);
	ev.addr.type = type;
5089

5090
	return mgmt_event(MGMT_EV_DEVICE_UNBLOCKED, hdev, &ev, sizeof(ev),
5091
			  cmd ? cmd->sk : NULL);
5092
}
5093 5094 5095 5096 5097 5098 5099 5100

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);
5101
		new_settings(hdev, NULL);
5102 5103 5104 5105 5106 5107 5108
	}
}

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

5109
	if (hci_conn_num(hdev, LE_LINK) > 0)
5110 5111 5112 5113 5114 5115 5116 5117 5118 5119 5120 5121 5122
		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);
5123
		new_settings(hdev, NULL);
5124 5125
	}
}