mgmt.c 119.7 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
	if (cp->val) {
		struct hci_cp_write_current_iac_lap hci_cp;

		if (cp->val == 0x02) {
			/* Limited discoverable mode */
1267
			hci_cp.num_iac = min_t(u8, hdev->num_iac, 2);
1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284
			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 (!test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags))
		return;

1313 1314 1315
	if (hdev->hci_ver < BLUETOOTH_VER_1_2)
		return;

1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329
	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);

1330 1331 1332 1333 1334 1335 1336
	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);
1337 1338
}

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

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

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

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

	hci_dev_lock(hdev);

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

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

1403 1404 1405 1406 1407 1408
	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);

1409 1410
	send_settings_rsp(cmd->sk, MGMT_OP_SET_CONNECTABLE, hdev);

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

1414
remove_cmd:
1415 1416 1417 1418 1419 1420
	mgmt_pending_remove(cmd);

unlock:
	hci_dev_unlock(hdev);
}

1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446
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;
}

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

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

1458 1459
	if (!test_bit(HCI_LE_ENABLED, &hdev->dev_flags) &&
	    !test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags))
1460
		return cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE,
1461
				  MGMT_STATUS_REJECTED);
1462

1463 1464 1465 1466
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE,
				  MGMT_STATUS_INVALID_PARAMS);

1467
	hci_dev_lock(hdev);
1468

1469
	if (!hdev_is_powered(hdev)) {
1470
		err = set_connectable_update_settings(hdev, sk, cp->val);
1471 1472 1473
		goto failed;
	}

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

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

1487
	hci_req_init(&req, hdev);
1488

1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499
	/* 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)) {
1500 1501 1502 1503 1504 1505
		if (cp->val) {
			scan = SCAN_PAGE;
		} else {
			scan = 0;

			if (test_bit(HCI_ISCAN, &hdev->flags) &&
1506
			    hdev->discov_timeout > 0)
1507 1508
				cancel_delayed_work(&hdev->discov_off);
		}
1509

1510 1511
		hci_req_add(&req, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);
	}
1512

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

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

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

failed:
1538
	hci_dev_unlock(hdev);
1539 1540 1541
	return err;
}

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

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

1551 1552 1553 1554
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_PAIRABLE,
				  MGMT_STATUS_INVALID_PARAMS);

1555
	hci_dev_lock(hdev);
1556 1557

	if (cp->val)
1558
		changed = !test_and_set_bit(HCI_PAIRABLE, &hdev->dev_flags);
1559
	else
1560
		changed = test_and_clear_bit(HCI_PAIRABLE, &hdev->dev_flags);
1561

1562
	err = send_settings_rsp(sk, MGMT_OP_SET_PAIRABLE, hdev);
1563
	if (err < 0)
1564
		goto unlock;
1565

1566 1567
	if (changed)
		err = new_settings(hdev, sk);
1568

1569
unlock:
1570
	hci_dev_unlock(hdev);
1571 1572 1573
	return err;
}

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

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

1584 1585
	status = mgmt_bredr_support(hdev);
	if (status)
1586
		return cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY,
1587
				  status);
1588

1589 1590 1591 1592
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY,
				  MGMT_STATUS_INVALID_PARAMS);

1593 1594
	hci_dev_lock(hdev);

1595
	if (!hdev_is_powered(hdev)) {
1596 1597 1598
		bool changed = false;

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

1611 1612 1613 1614
		goto failed;
	}

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

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

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

1653 1654 1655 1656
	status = mgmt_bredr_support(hdev);
	if (status)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_SSP, status);

1657 1658 1659
	if (!lmp_ssp_capable(hdev))
		return cmd_status(sk, hdev->id, MGMT_OP_SET_SSP,
				  MGMT_STATUS_NOT_SUPPORTED);
1660

1661 1662 1663 1664
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_SSP,
				  MGMT_STATUS_INVALID_PARAMS);

1665
	hci_dev_lock(hdev);
1666

1667
	if (!hdev_is_powered(hdev)) {
1668
		bool changed;
1669

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

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

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

1690 1691 1692
		goto failed;
	}

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

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

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

failed:
	hci_dev_unlock(hdev);
	return err;
}

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

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

1731 1732 1733
	status = mgmt_bredr_support(hdev);
	if (status)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_HS, status);
1734

1735 1736 1737 1738 1739 1740 1741 1742
	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);

1743 1744 1745 1746
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_HS,
				  MGMT_STATUS_INVALID_PARAMS);

1747 1748
	hci_dev_lock(hdev);

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

1758
		changed = test_and_clear_bit(HCI_HS_ENABLED, &hdev->dev_flags);
1759
	}
1760 1761 1762 1763 1764 1765 1766

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

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

1768 1769 1770
unlock:
	hci_dev_unlock(hdev);
	return err;
1771 1772
}

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

	/* 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);
1803
		update_adv_data(&req);
1804
		update_scan_rsp_data(&req);
1805 1806 1807 1808
		hci_req_run(&req, NULL);

		hci_dev_unlock(hdev);
	}
1809 1810
}

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

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

1822 1823 1824
	if (!lmp_le_capable(hdev))
		return cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
				  MGMT_STATUS_NOT_SUPPORTED);
1825

1826 1827 1828 1829
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
				  MGMT_STATUS_INVALID_PARAMS);

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

1835
	hci_dev_lock(hdev);
1836 1837

	val = !!cp->val;
1838
	enabled = lmp_host_le_capable(hdev);
1839

1840
	if (!hdev_is_powered(hdev) || val == enabled) {
1841 1842 1843 1844 1845 1846 1847
		bool changed = false;

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

1848 1849
		if (!val && test_bit(HCI_ADVERTISING, &hdev->dev_flags)) {
			clear_bit(HCI_ADVERTISING, &hdev->dev_flags);
1850 1851 1852
			changed = true;
		}

1853 1854
		err = send_settings_rsp(sk, MGMT_OP_SET_LE, hdev);
		if (err < 0)
1855
			goto unlock;
1856 1857 1858 1859

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

1860
		goto unlock;
1861 1862
	}

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

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

1876 1877
	hci_req_init(&req, hdev);

1878 1879 1880 1881
	memset(&hci_cp, 0, sizeof(hci_cp));

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

1888 1889 1890 1891
	hci_req_add(&req, HCI_OP_WRITE_LE_HOST_SUPPORTED, sizeof(hci_cp),
		    &hci_cp);

	err = hci_req_run(&req, le_enable_complete);
1892
	if (err < 0)
1893 1894
		mgmt_pending_remove(cmd);

1895 1896
unlock:
	hci_dev_unlock(hdev);
1897 1898 1899
	return err;
}

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

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

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

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

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

1978
	hci_dev_lock(hdev);
1979

1980
	if (pending_eir_or_class(hdev)) {
1981
		err = cmd_status(sk, hdev->id, MGMT_OP_ADD_UUID,
1982
				 MGMT_STATUS_BUSY);
1983 1984 1985
		goto failed;
	}

1986
	uuid = kmalloc(sizeof(*uuid), GFP_KERNEL);
1987 1988 1989 1990 1991 1992
	if (!uuid) {
		err = -ENOMEM;
		goto failed;
	}

	memcpy(uuid->uuid, cp->uuid, 16);
1993
	uuid->svc_hint = cp->svc_hint;
1994
	uuid->size = get_uuid_size(cp->uuid);
1995

1996
	list_add_tail(&uuid->list, &hdev->uuids);
1997

1998
	hci_req_init(&req, hdev);
1999

2000 2001 2002
	update_class(&req);
	update_eir(&req);

2003 2004 2005 2006
	err = hci_req_run(&req, add_uuid_complete);
	if (err < 0) {
		if (err != -ENODATA)
			goto failed;
2007

2008
		err = cmd_complete(sk, hdev->id, MGMT_OP_ADD_UUID, 0,
2009
				   hdev->dev_class, 3);
2010 2011 2012 2013
		goto failed;
	}

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

	err = 0;
2020 2021

failed:
2022
	hci_dev_unlock(hdev);
2023 2024 2025
	return err;
}

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

	return false;
}

2040 2041 2042 2043 2044 2045 2046
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);
}

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

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

2059
	hci_dev_lock(hdev);
2060

2061
	if (pending_eir_or_class(hdev)) {
2062
		err = cmd_status(sk, hdev->id, MGMT_OP_REMOVE_UUID,
2063
				 MGMT_STATUS_BUSY);
2064 2065 2066
		goto unlock;
	}

2067 2068
	if (memcmp(cp->uuid, bt_uuid_any, 16) == 0) {
		err = hci_uuids_clear(hdev);
2069

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

2076
		goto update_class;
2077 2078 2079 2080
	}

	found = 0;

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

		list_del(&match->list);
2086
		kfree(match);
2087 2088 2089 2090
		found++;
	}

	if (found == 0) {
2091
		err = cmd_status(sk, hdev->id, MGMT_OP_REMOVE_UUID,
2092
				 MGMT_STATUS_INVALID_PARAMS);
2093 2094 2095
		goto unlock;
	}

2096
update_class:
2097
	hci_req_init(&req, hdev);
2098

2099 2100 2101
	update_class(&req);
	update_eir(&req);

2102 2103 2104 2105
	err = hci_req_run(&req, remove_uuid_complete);
	if (err < 0) {
		if (err != -ENODATA)
			goto unlock;
2106

2107
		err = cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_UUID, 0,
2108
				   hdev->dev_class, 3);
2109 2110 2111 2112
		goto unlock;
	}

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

	err = 0;
2119 2120

unlock:
2121
	hci_dev_unlock(hdev);
2122 2123 2124
	return err;
}

2125 2126 2127 2128 2129 2130 2131
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);
}

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

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

2142
	if (!lmp_bredr_capable(hdev))
2143 2144
		return cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS,
				  MGMT_STATUS_NOT_SUPPORTED);
2145

2146
	hci_dev_lock(hdev);
2147

2148 2149 2150 2151 2152
	if (pending_eir_or_class(hdev)) {
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS,
				 MGMT_STATUS_BUSY);
		goto unlock;
	}
2153

2154 2155 2156 2157 2158
	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;
	}
2159

2160 2161 2162
	hdev->major_class = cp->major;
	hdev->minor_class = cp->minor;

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

2169 2170
	hci_req_init(&req, hdev);

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

2178 2179
	update_class(&req);

2180 2181 2182 2183
	err = hci_req_run(&req, set_class_complete);
	if (err < 0) {
		if (err != -ENODATA)
			goto unlock;
2184

2185
		err = cmd_complete(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, 0,
2186
				   hdev->dev_class, 3);
2187 2188 2189 2190
		goto unlock;
	}

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

	err = 0;
2197

2198
unlock:
2199
	hci_dev_unlock(hdev);
2200 2201 2202
	return err;
}

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

2210 2211 2212 2213 2214 2215
	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);

2216
	key_count = __le16_to_cpu(cp->key_count);
2217

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

2227 2228 2229 2230
	if (cp->debug_keys != 0x00 && cp->debug_keys != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS,
				  MGMT_STATUS_INVALID_PARAMS);

2231
	BT_DBG("%s debug_keys %u key_count %u", hdev->name, cp->debug_keys,
2232
	       key_count);
2233

2234 2235 2236 2237 2238 2239 2240 2241
	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);
	}

2242
	hci_dev_lock(hdev);
2243 2244 2245 2246

	hci_link_keys_clear(hdev);

	if (cp->debug_keys)
2247
		set_bit(HCI_DEBUG_KEYS, &hdev->dev_flags);
2248
	else
2249
		clear_bit(HCI_DEBUG_KEYS, &hdev->dev_flags);
2250

2251
	for (i = 0; i < key_count; i++) {
2252
		struct mgmt_link_key_info *key = &cp->keys[i];
2253

2254
		hci_add_link_key(hdev, NULL, 0, &key->addr.bdaddr, key->val,
2255
				 key->type, key->pin_len);
2256 2257
	}

2258
	cmd_complete(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS, 0, NULL, 0);
2259

2260
	hci_dev_unlock(hdev);
2261

2262
	return 0;
2263 2264
}

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

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

2287
	memset(&rp, 0, sizeof(rp));
2288 2289
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;
2290

2291 2292 2293 2294 2295
	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));

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

2301 2302
	hci_dev_lock(hdev);

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

2309
	if (cp->addr.type == BDADDR_BREDR)
2310 2311 2312
		err = hci_remove_link_key(hdev, &cp->addr.bdaddr);
	else
		err = hci_remove_ltk(hdev, &cp->addr.bdaddr);
2313

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

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

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

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

2345
	dc.handle = cpu_to_le16(conn->handle);
2346 2347 2348 2349 2350
	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);

2351
unlock:
2352
	hci_dev_unlock(hdev);
2353 2354 2355
	return err;
}

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

	BT_DBG("");

2368 2369 2370 2371
	memset(&rp, 0, sizeof(rp));
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;

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

2377
	hci_dev_lock(hdev);
2378 2379

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

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

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

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

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

2409
	dc.handle = cpu_to_le16(conn->handle);
2410
	dc.reason = HCI_ERROR_REMOTE_USER_TERM;
2411 2412 2413

	err = hci_send_cmd(hdev, HCI_OP_DISCONNECT, sizeof(dc), &dc);
	if (err < 0)
2414
		mgmt_pending_remove(cmd);
2415 2416

failed:
2417
	hci_dev_unlock(hdev);
2418 2419 2420
	return err;
}

2421
static u8 link_to_bdaddr(u8 link_type, u8 addr_type)
2422 2423 2424
{
	switch (link_type) {
	case LE_LINK:
2425 2426
		switch (addr_type) {
		case ADDR_LE_DEV_PUBLIC:
2427
			return BDADDR_LE_PUBLIC;
2428

2429
		default:
2430
			/* Fallback to LE Random address type */
2431
			return BDADDR_LE_RANDOM;
2432
		}
2433

2434
	default:
2435
		/* Fallback to BR/EDR type */
2436
		return BDADDR_BREDR;
2437 2438 2439
	}
}

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

	BT_DBG("");

2451
	hci_dev_lock(hdev);
2452

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

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

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

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

2483
	rp->conn_count = cpu_to_le16(i);
2484

2485 2486
	/* Recalculate length in case of filtered SCO connections, etc */
	rp_len = sizeof(*rp) + (i * sizeof(struct mgmt_addr_info));
2487

2488
	err = cmd_complete(sk, hdev->id, MGMT_OP_GET_CONNECTIONS, 0, rp,
2489
			   rp_len);
2490

2491
	kfree(rp);
2492 2493

unlock:
2494
	hci_dev_unlock(hdev);
2495 2496 2497
	return err;
}

2498
static int send_pin_code_neg_reply(struct sock *sk, struct hci_dev *hdev,
2499
				   struct mgmt_cp_pin_code_neg_reply *cp)
2500 2501 2502 2503
{
	struct pending_cmd *cmd;
	int err;

2504
	cmd = mgmt_pending_add(sk, MGMT_OP_PIN_CODE_NEG_REPLY, hdev, cp,
2505
			       sizeof(*cp));
2506 2507 2508
	if (!cmd)
		return -ENOMEM;

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

	return err;
}

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

	BT_DBG("");

2528
	hci_dev_lock(hdev);
2529

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

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

	if (conn->pending_sec_level == BT_SECURITY_HIGH && cp->pin_len != 16) {
2544 2545 2546
		struct mgmt_cp_pin_code_neg_reply ncp;

		memcpy(&ncp.addr, &cp->addr, sizeof(ncp.addr));
2547 2548 2549

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

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

		goto failed;
	}

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

2564
	bacpy(&reply.bdaddr, &cp->addr.bdaddr);
2565
	reply.pin_len = cp->pin_len;
2566
	memcpy(reply.pin_code, cp->pin_code, sizeof(reply.pin_code));
2567 2568 2569

	err = hci_send_cmd(hdev, HCI_OP_PIN_CODE_REPLY, sizeof(reply), &reply);
	if (err < 0)
2570
		mgmt_pending_remove(cmd);
2571 2572

failed:
2573
	hci_dev_unlock(hdev);
2574 2575 2576
	return err;
}

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

	BT_DBG("");

2584
	hci_dev_lock(hdev);
2585 2586 2587 2588

	hdev->io_capability = cp->io_capability;

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

2591
	hci_dev_unlock(hdev);
2592

2593 2594
	return cmd_complete(sk, hdev->id, MGMT_OP_SET_IO_CAPABILITY, 0, NULL,
			    0);
2595 2596
}

2597
static struct pending_cmd *find_pairing(struct hci_conn *conn)
2598 2599
{
	struct hci_dev *hdev = conn->hdev;
2600
	struct pending_cmd *cmd;
2601

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

2620
	bacpy(&rp.addr.bdaddr, &conn->dst);
2621
	rp.addr.type = link_to_bdaddr(conn->type, conn->dst_type);
2622

2623
	cmd_complete(cmd->sk, cmd->index, MGMT_OP_PAIR_DEVICE, status,
2624
		     &rp, sizeof(rp));
2625 2626 2627 2628 2629 2630

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

2631
	hci_conn_drop(conn);
2632

2633
	mgmt_pending_remove(cmd);
2634 2635 2636 2637 2638 2639 2640 2641 2642
}

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

	BT_DBG("status %u", status);

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

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

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

	BT_DBG("");

2677 2678 2679 2680
	memset(&rp, 0, sizeof(rp));
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;

2681 2682 2683 2684 2685
	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));

2686
	hci_dev_lock(hdev);
2687

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

2694 2695
	sec_level = BT_SECURITY_MEDIUM;
	if (cp->io_cap == 0x03)
2696
		auth_type = HCI_AT_DEDICATED_BONDING;
2697
	else
2698 2699
		auth_type = HCI_AT_DEDICATED_BONDING_MITM;

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

2707
	if (IS_ERR(conn)) {
2708 2709 2710 2711 2712 2713 2714
		int status;

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

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

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

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

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

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

	err = 0;

unlock:
2753
	hci_dev_unlock(hdev);
2754 2755 2756
	return err;
}

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

	BT_DBG("");

	hci_dev_lock(hdev);

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

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

	conn = cmd->user_data;

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

	pairing_complete(cmd, MGMT_STATUS_CANCELLED);

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

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

2807
	hci_dev_lock(hdev);
2808

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

2816 2817
	if (addr->type == BDADDR_BREDR)
		conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &addr->bdaddr);
2818
	else
2819
		conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &addr->bdaddr);
2820 2821

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

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

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

		goto done;
	}

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

2850
	/* Continue with pairing via HCI */
2851 2852 2853
	if (hci_op == HCI_OP_USER_PASSKEY_REPLY) {
		struct hci_cp_user_passkey_reply cp;

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

2861 2862
	if (err < 0)
		mgmt_pending_remove(cmd);
2863

2864
done:
2865
	hci_dev_unlock(hdev);
2866 2867 2868
	return err;
}

2869 2870 2871 2872 2873 2874 2875
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("");

2876
	return user_pairing_resp(sk, hdev, &cp->addr,
2877 2878 2879 2880
				MGMT_OP_PIN_CODE_NEG_REPLY,
				HCI_OP_PIN_CODE_NEG_REPLY, 0);
}

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

	BT_DBG("");

	if (len != sizeof(*cp))
2889
		return cmd_status(sk, hdev->id, MGMT_OP_USER_CONFIRM_REPLY,
2890
				  MGMT_STATUS_INVALID_PARAMS);
2891

2892
	return user_pairing_resp(sk, hdev, &cp->addr,
2893 2894
				 MGMT_OP_USER_CONFIRM_REPLY,
				 HCI_OP_USER_CONFIRM_REPLY, 0);
2895 2896
}

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

	BT_DBG("");

2904
	return user_pairing_resp(sk, hdev, &cp->addr,
2905 2906
				 MGMT_OP_USER_CONFIRM_NEG_REPLY,
				 HCI_OP_USER_CONFIRM_NEG_REPLY, 0);
2907 2908
}

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

	BT_DBG("");

2916
	return user_pairing_resp(sk, hdev, &cp->addr,
2917 2918
				 MGMT_OP_USER_PASSKEY_REPLY,
				 HCI_OP_USER_PASSKEY_REPLY, cp->passkey);
2919 2920
}

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

	BT_DBG("");

2928
	return user_pairing_resp(sk, hdev, &cp->addr,
2929 2930
				 MGMT_OP_USER_PASSKEY_NEG_REPLY,
				 HCI_OP_USER_PASSKEY_NEG_REPLY, 0);
2931 2932
}

2933
static void update_name(struct hci_request *req)
2934
{
2935
	struct hci_dev *hdev = req->hdev;
2936 2937
	struct hci_cp_write_local_name cp;

2938
	memcpy(cp.name, hdev->dev_name, sizeof(cp.name));
2939

2940
	hci_req_add(req, HCI_OP_WRITE_LOCAL_NAME, sizeof(cp), &cp);
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 2968 2969 2970
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);
}

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

	BT_DBG("");

2981
	hci_dev_lock(hdev);
2982

2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993
	/* 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;
	}

2994
	memcpy(hdev->short_name, cp->short_name, sizeof(hdev->short_name));
2995

2996
	if (!hdev_is_powered(hdev)) {
2997
		memcpy(hdev->dev_name, cp->name, sizeof(hdev->dev_name));
2998 2999

		err = cmd_complete(sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, 0,
3000
				   data, len);
3001 3002 3003 3004
		if (err < 0)
			goto failed;

		err = mgmt_event(MGMT_EV_LOCAL_NAME_CHANGED, hdev, data, len,
3005
				 sk);
3006

3007 3008 3009
		goto failed;
	}

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

3016 3017
	memcpy(hdev->dev_name, cp->name, sizeof(hdev->dev_name));

3018
	hci_req_init(&req, hdev);
3019 3020 3021 3022 3023 3024

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

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

3031
	err = hci_req_run(&req, set_name_complete);
3032 3033 3034 3035
	if (err < 0)
		mgmt_pending_remove(cmd);

failed:
3036
	hci_dev_unlock(hdev);
3037 3038 3039
	return err;
}

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

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

3048
	hci_dev_lock(hdev);
3049

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

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

3062
	if (mgmt_pending_find(MGMT_OP_READ_LOCAL_OOB_DATA, hdev)) {
3063
		err = cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
3064
				 MGMT_STATUS_BUSY);
3065 3066 3067
		goto unlock;
	}

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

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

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

3092
	hci_dev_lock(hdev);
3093

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

3101
	err = cmd_complete(sk, hdev->id, MGMT_OP_ADD_REMOTE_OOB_DATA, status,
3102
			   &cp->addr, sizeof(cp->addr));
3103

3104
	hci_dev_unlock(hdev);
3105 3106 3107
	return err;
}

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

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

3117
	hci_dev_lock(hdev);
3118

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

3125
	err = cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_REMOTE_OOB_DATA,
3126
			   status, &cp->addr, sizeof(cp->addr));
3127

3128
	hci_dev_unlock(hdev);
3129 3130 3131
	return err;
}

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

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

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

	case DISCOV_TYPE_BREDR:
		break;

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

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

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

3203
	hci_dev_lock(hdev);
3204

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

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

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

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

A
Andre Guedes 已提交
3229 3230
	hdev->discovery.type = cp->type;

3231 3232
	hci_req_init(&req, hdev);

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

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

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

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

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

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

3312
	err = hci_req_run(&req, start_discovery_complete);
3313 3314
	if (err < 0)
		mgmt_pending_remove(cmd);
3315 3316
	else
		hci_discovery_set_state(hdev, DISCOVERY_STARTING);
3317 3318

failed:
3319
	hci_dev_unlock(hdev);
3320 3321 3322
	return err;
}

3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338
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;
}

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

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

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

3369
	hci_dev_lock(hdev);
3370

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

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

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

3391 3392
	hci_req_init(&req, hdev);

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

3406 3407 3408 3409
		break;

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

3421
		bacpy(&cp.bdaddr, &e->data.bdaddr);
3422 3423
		hci_req_add(&req, HCI_OP_REMOTE_NAME_REQ_CANCEL, sizeof(cp),
			    &cp);
3424 3425 3426 3427 3428

		break;

	default:
		BT_DBG("unknown discovery state %u", hdev->discovery.state);
3429 3430 3431 3432 3433 3434

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

3437
	err = hci_req_run(&req, stop_discovery_complete);
3438 3439
	if (err < 0)
		mgmt_pending_remove(cmd);
3440 3441
	else
		hci_discovery_set_state(hdev, DISCOVERY_STOPPING);
3442

3443
unlock:
3444
	hci_dev_unlock(hdev);
3445 3446 3447
	return err;
}

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

3455
	BT_DBG("%s", hdev->name);
3456 3457 3458

	hci_dev_lock(hdev);

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

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

	if (cp->name_known) {
		e->name_state = NAME_KNOWN;
		list_del(&e->list);
	} else {
		e->name_state = NAME_NEEDED;
3477
		hci_inquiry_cache_update_resolve(hdev, e);
3478 3479
	}

3480 3481
	err = cmd_complete(sk, hdev->id, MGMT_OP_CONFIRM_NAME, 0, &cp->addr,
			   sizeof(cp->addr));
3482 3483 3484 3485 3486 3487

failed:
	hci_dev_unlock(hdev);
	return err;
}

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

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

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

3502
	hci_dev_lock(hdev);
3503

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

3510
	err = cmd_complete(sk, hdev->id, MGMT_OP_BLOCK_DEVICE, status,
3511
			   &cp->addr, sizeof(cp->addr));
3512

3513
	hci_dev_unlock(hdev);
3514 3515 3516 3517

	return err;
}

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

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

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

3532
	hci_dev_lock(hdev);
3533

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

3540
	err = cmd_complete(sk, hdev->id, MGMT_OP_UNBLOCK_DEVICE, status,
3541
			   &cp->addr, sizeof(cp->addr));
3542

3543
	hci_dev_unlock(hdev);
3544 3545 3546 3547

	return err;
}

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

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

3558 3559 3560 3561 3562 3563
	source = __le16_to_cpu(cp->source);

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

3564 3565
	hci_dev_lock(hdev);

3566
	hdev->devid_source = source;
3567 3568 3569 3570 3571 3572
	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);

3573 3574 3575
	hci_req_init(&req, hdev);
	update_eir(&req);
	hci_req_run(&req, NULL);
3576 3577 3578 3579 3580 3581

	hci_dev_unlock(hdev);

	return err;
}

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

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

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

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

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

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

3637 3638
		if (val != test_bit(HCI_ADVERTISING, &hdev->dev_flags)) {
			change_bit(HCI_ADVERTISING, &hdev->dev_flags);
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 3664 3665 3666
			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);

3667 3668 3669 3670
	if (val)
		enable_advertising(&req);
	else
		disable_advertising(&req);
3671 3672 3673 3674 3675 3676 3677 3678 3679 3680

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

unlock:
	hci_dev_unlock(hdev);
	return err;
}

3681 3682 3683 3684 3685 3686 3687 3688
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);

3689
	if (!lmp_le_capable(hdev))
3690
		return cmd_status(sk, hdev->id, MGMT_OP_SET_STATIC_ADDRESS,
3691
				  MGMT_STATUS_NOT_SUPPORTED);
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 3718 3719 3720

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

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

3746 3747 3748 3749
	if (window > interval)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS,
				  MGMT_STATUS_INVALID_PARAMS);

3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761
	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;
}

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

3785 3786 3787 3788 3789 3790 3791 3792 3793 3794
		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);
}

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

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

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

3810 3811 3812 3813
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
				  MGMT_STATUS_INVALID_PARAMS);

3814
	if (!hdev_is_powered(hdev))
3815
		return cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
3816
				  MGMT_STATUS_NOT_POWERED);
3817 3818

	if (!test_bit(HCI_CONNECTABLE, &hdev->dev_flags))
3819
		return cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
3820
				  MGMT_STATUS_REJECTED);
3821 3822 3823

	hci_dev_lock(hdev);

3824 3825 3826 3827 3828 3829
	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;
	}

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

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

3843 3844
	hci_req_init(&req, hdev);

3845
	write_fast_connectable(&req, cp->val);
3846 3847

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

3854
unlock:
3855
	hci_dev_unlock(hdev);
3856

3857 3858 3859
	return err;
}

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

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 3975 3976 3977
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;
	}

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

	hci_req_init(&req, hdev);
3984 3985 3986 3987

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

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

3993 3994 3995 3996 3997 3998 3999 4000 4001
	err = hci_req_run(&req, set_bredr_complete);
	if (err < 0)
		mgmt_pending_remove(cmd);

unlock:
	hci_dev_unlock(hdev);
	return err;
}

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

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

4020 4021 4022 4023 4024 4025
	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);

4026
	key_count = __le16_to_cpu(cp->key_count);
4027 4028 4029 4030 4031

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

4037
	BT_DBG("%s key_count %u", hdev->name, key_count);
4038

4039 4040 4041
	for (i = 0; i < key_count; i++) {
		struct mgmt_ltk_info *key = &cp->keys[i];

4042
		if (!ltk_is_valid(key))
4043 4044 4045 4046 4047
			return cmd_status(sk, hdev->id,
					  MGMT_OP_LOAD_LONG_TERM_KEYS,
					  MGMT_STATUS_INVALID_PARAMS);
	}

4048 4049 4050 4051 4052 4053
	hci_dev_lock(hdev);

	hci_smp_ltks_clear(hdev);

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

		if (key->addr.type == BDADDR_LE_PUBLIC)
			addr_type = ADDR_LE_DEV_PUBLIC;
		else
			addr_type = ADDR_LE_DEV_RANDOM;
4060 4061 4062 4063 4064 4065

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

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

4071 4072 4073
	err = cmd_complete(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS, 0,
			   NULL, 0);

4074 4075
	hci_dev_unlock(hdev);

4076
	return err;
4077 4078
}

4079
static const struct mgmt_handler {
4080 4081
	int (*func) (struct sock *sk, struct hci_dev *hdev, void *data,
		     u16 data_len);
4082 4083
	bool var_len;
	size_t data_len;
4084 4085
} mgmt_handlers[] = {
	{ NULL }, /* 0x0000 (no command) */
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 4122 4123 4124
	{ 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 },
4125
	{ set_device_id,          false, MGMT_SET_DEVICE_ID_SIZE },
4126
	{ set_advertising,        false, MGMT_SETTING_SIZE },
4127
	{ set_bredr,              false, MGMT_SETTING_SIZE },
4128
	{ set_static_address,     false, MGMT_SET_STATIC_ADDRESS_SIZE },
4129
	{ set_scan_params,        false, MGMT_SET_SCAN_PARAMS_SIZE },
4130 4131 4132
};


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

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

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

4148
	buf = kmalloc(msglen, GFP_KERNEL);
4149 4150 4151 4152 4153 4154 4155 4156
	if (!buf)
		return -ENOMEM;

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

4157
	hdr = buf;
4158 4159 4160
	opcode = __le16_to_cpu(hdr->opcode);
	index = __le16_to_cpu(hdr->index);
	len = __le16_to_cpu(hdr->len);
4161 4162 4163 4164 4165 4166

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

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

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

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

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

4198 4199 4200
	handler = &mgmt_handlers[opcode];

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

4207 4208 4209 4210 4211
	if (hdev)
		mgmt_init_hdev(sk, hdev);

	cp = buf + sizeof(*hdr);

4212
	err = handler->func(sk, hdev, cp, len);
4213 4214 4215
	if (err < 0)
		goto done;

4216 4217 4218
	err = msglen;

done:
4219 4220 4221
	if (hdev)
		hci_dev_put(hdev);

4222 4223 4224
	kfree(buf);
	return err;
}
4225

4226
void mgmt_index_added(struct hci_dev *hdev)
4227
{
4228
	if (hdev->dev_type != HCI_BREDR)
4229
		return;
4230

4231
	mgmt_event(MGMT_EV_INDEX_ADDED, hdev, NULL, 0, NULL);
4232 4233
}

4234
void mgmt_index_removed(struct hci_dev *hdev)
4235
{
4236
	u8 status = MGMT_STATUS_INVALID_INDEX;
4237

4238
	if (hdev->dev_type != HCI_BREDR)
4239
		return;
4240

4241
	mgmt_pending_foreach(0, hdev, cmd_status_rsp, &status);
4242

4243
	mgmt_event(MGMT_EV_INDEX_REMOVED, hdev, NULL, 0, NULL);
4244 4245
}

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

4264
static int powered_update_hci(struct hci_dev *hdev)
4265
{
4266
	struct hci_request req;
4267
	u8 link_sec;
4268

4269 4270
	hci_req_init(&req, hdev);

4271 4272 4273
	if (test_bit(HCI_SSP_ENABLED, &hdev->dev_flags) &&
	    !lmp_host_ssp_capable(hdev)) {
		u8 ssp = 1;
4274

4275
		hci_req_add(&req, HCI_OP_WRITE_SSP_MODE, 1, &ssp);
4276
	}
4277

4278 4279
	if (test_bit(HCI_LE_ENABLED, &hdev->dev_flags) &&
	    lmp_bredr_capable(hdev)) {
4280
		struct hci_cp_write_le_host_supported cp;
4281

4282 4283
		cp.le = 1;
		cp.simul = lmp_le_br_capable(hdev);
4284

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

4294 4295 4296 4297 4298
	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);
4299

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

4309 4310
		if (test_bit(HCI_ADVERTISING, &hdev->dev_flags))
			enable_advertising(&req);
4311 4312
	}

4313 4314
	link_sec = test_bit(HCI_LINK_SECURITY, &hdev->dev_flags);
	if (link_sec != test_bit(HCI_AUTH, &hdev->flags))
4315 4316
		hci_req_add(&req, HCI_OP_WRITE_AUTH_ENABLE,
			    sizeof(link_sec), &link_sec);
4317

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

4326
	return hci_req_run(&req, powered_complete);
4327
}
4328

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

4336 4337 4338 4339
	if (!test_bit(HCI_MGMT, &hdev->dev_flags))
		return 0;

	if (powered) {
4340 4341
		if (powered_update_hci(hdev) == 0)
			return 0;
4342

4343 4344 4345
		mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, settings_rsp,
				     &match);
		goto new_settings;
4346 4347
	}

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

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

4361
	return err;
4362
}
4363

4364
void mgmt_set_powered_failed(struct hci_dev *hdev, int err)
4365 4366 4367 4368 4369 4370
{
	struct pending_cmd *cmd;
	u8 status;

	cmd = mgmt_pending_find(MGMT_OP_SET_POWERED, hdev);
	if (!cmd)
4371
		return;
4372 4373 4374 4375 4376 4377

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

4378
	cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_POWERED, status);
4379 4380 4381 4382

	mgmt_pending_remove(cmd);
}

4383 4384 4385 4386 4387 4388 4389 4390 4391 4392 4393 4394
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);
4395
	clear_bit(HCI_DISCOVERABLE, &hdev->dev_flags);
4396 4397

	hci_req_init(&req, hdev);
4398 4399 4400 4401 4402
	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);
	}
4403
	update_class(&req);
4404
	update_adv_data(&req);
4405 4406 4407 4408
	hci_req_run(&req, NULL);

	hdev->discov_timeout = 0;

4409 4410
	new_settings(hdev, NULL);

4411 4412 4413
	hci_dev_unlock(hdev);
}

4414
void mgmt_discoverable(struct hci_dev *hdev, u8 discoverable)
4415
{
4416
	bool changed;
4417

4418 4419 4420 4421 4422
	/* 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))
4423
		return;
4424

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

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

4443
		new_settings(hdev, NULL);
4444
	}
4445
}
4446

4447
void mgmt_connectable(struct hci_dev *hdev, u8 connectable)
4448
{
4449
	bool changed;
4450

4451 4452 4453 4454 4455
	/* 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))
4456
		return;
4457

4458 4459 4460 4461
	if (connectable)
		changed = !test_and_set_bit(HCI_CONNECTABLE, &hdev->dev_flags);
	else
		changed = test_and_clear_bit(HCI_CONNECTABLE, &hdev->dev_flags);
4462

4463
	if (changed)
4464
		new_settings(hdev, NULL);
4465
}
4466

4467
void mgmt_write_scan_failed(struct hci_dev *hdev, u8 scan, u8 status)
4468
{
4469 4470
	u8 mgmt_err = mgmt_status(status);

4471
	if (scan & SCAN_PAGE)
4472
		mgmt_pending_foreach(MGMT_OP_SET_CONNECTABLE, hdev,
4473
				     cmd_status_rsp, &mgmt_err);
4474 4475

	if (scan & SCAN_INQUIRY)
4476
		mgmt_pending_foreach(MGMT_OP_SET_DISCOVERABLE, hdev,
4477
				     cmd_status_rsp, &mgmt_err);
4478 4479
}

4480 4481
void mgmt_new_link_key(struct hci_dev *hdev, struct link_key *key,
		       bool persistent)
4482
{
4483
	struct mgmt_ev_new_link_key ev;
4484

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

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

4494
	mgmt_event(MGMT_EV_NEW_LINK_KEY, hdev, &ev, sizeof(ev), NULL);
4495
}
4496

4497
void mgmt_new_ltk(struct hci_dev *hdev, struct smp_ltk *key, u8 persistent)
4498 4499 4500 4501 4502 4503 4504
{
	struct mgmt_ev_new_long_term_key ev;

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

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

4516
	mgmt_event(MGMT_EV_NEW_LONG_TERM_KEY, hdev, &ev, sizeof(ev), NULL);
4517 4518
}

4519 4520 4521 4522 4523 4524 4525 4526 4527 4528 4529
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;
}

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

4538
	bacpy(&ev->addr.bdaddr, bdaddr);
4539
	ev->addr.type = link_to_bdaddr(link_type, addr_type);
4540

4541
	ev->flags = __cpu_to_le32(flags);
4542

4543 4544
	if (name_len > 0)
		eir_len = eir_append_data(ev->eir, 0, EIR_NAME_COMPLETE,
4545
					  name, name_len);
4546 4547

	if (dev_class && memcmp(dev_class, "\0\0\0", 3) != 0)
4548
		eir_len = eir_append_data(ev->eir, eir_len,
4549
					  EIR_CLASS_OF_DEV, dev_class, 3);
4550

4551
	ev->eir_len = cpu_to_le16(eir_len);
4552

4553 4554
	mgmt_event(MGMT_EV_DEVICE_CONNECTED, hdev, buf,
		    sizeof(*ev) + eir_len, NULL);
4555 4556
}

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

4563 4564
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;
4565

4566
	cmd_complete(cmd->sk, cmd->index, MGMT_OP_DISCONNECT, 0, &rp,
4567
		     sizeof(rp));
4568 4569 4570 4571

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

4572
	mgmt_pending_remove(cmd);
4573 4574
}

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

	memset(&rp, 0, sizeof(rp));
4582 4583
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;
4584

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

4587
	cmd_complete(cmd->sk, cmd->index, cmd->opcode, 0, &rp, sizeof(rp));
4588 4589 4590 4591

	mgmt_pending_remove(cmd);
}

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

4598 4599 4600
	if (link_type != ACL_LINK && link_type != LE_LINK)
		return;

4601
	mgmt_pending_foreach(MGMT_OP_DISCONNECT, hdev, disconnect_rsp, &sk);
4602

4603 4604 4605
	bacpy(&ev.addr.bdaddr, bdaddr);
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
	ev.reason = reason;
4606

4607
	mgmt_event(MGMT_EV_DEVICE_DISCONNECTED, hdev, &ev, sizeof(ev), sk);
4608 4609

	if (sk)
4610
		sock_put(sk);
4611

4612
	mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE, hdev, unpair_device_rsp,
4613
			     hdev);
4614 4615
}

4616 4617
void mgmt_disconnect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr,
			    u8 link_type, u8 addr_type, u8 status)
4618
{
4619 4620
	u8 bdaddr_type = link_to_bdaddr(link_type, addr_type);
	struct mgmt_cp_disconnect *cp;
4621
	struct mgmt_rp_disconnect rp;
4622 4623
	struct pending_cmd *cmd;

4624 4625 4626
	mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE, hdev, unpair_device_rsp,
			     hdev);

4627
	cmd = mgmt_pending_find(MGMT_OP_DISCONNECT, hdev);
4628
	if (!cmd)
4629
		return;
4630

4631 4632 4633 4634 4635 4636 4637 4638
	cp = cmd->param;

	if (bacmp(bdaddr, &cp->addr.bdaddr))
		return;

	if (cp->addr.type != bdaddr_type)
		return;

4639
	bacpy(&rp.addr.bdaddr, bdaddr);
4640
	rp.addr.type = bdaddr_type;
4641

4642 4643
	cmd_complete(cmd->sk, cmd->index, MGMT_OP_DISCONNECT,
		     mgmt_status(status), &rp, sizeof(rp));
4644

4645
	mgmt_pending_remove(cmd);
4646
}
4647

4648 4649
void mgmt_connect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
			 u8 addr_type, u8 status)
4650 4651 4652
{
	struct mgmt_ev_connect_failed ev;

4653
	bacpy(&ev.addr.bdaddr, bdaddr);
4654
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
4655
	ev.status = mgmt_status(status);
4656

4657
	mgmt_event(MGMT_EV_CONNECT_FAILED, hdev, &ev, sizeof(ev), NULL);
4658
}
4659

4660
void mgmt_pin_code_request(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 secure)
4661 4662 4663
{
	struct mgmt_ev_pin_code_request ev;

4664
	bacpy(&ev.addr.bdaddr, bdaddr);
4665
	ev.addr.type = BDADDR_BREDR;
4666
	ev.secure = secure;
4667

4668
	mgmt_event(MGMT_EV_PIN_CODE_REQUEST, hdev, &ev, sizeof(ev), NULL);
4669 4670
}

4671 4672
void mgmt_pin_code_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
				  u8 status)
4673 4674
{
	struct pending_cmd *cmd;
4675
	struct mgmt_rp_pin_code_reply rp;
4676

4677
	cmd = mgmt_pending_find(MGMT_OP_PIN_CODE_REPLY, hdev);
4678
	if (!cmd)
4679
		return;
4680

4681
	bacpy(&rp.addr.bdaddr, bdaddr);
4682
	rp.addr.type = BDADDR_BREDR;
4683

4684 4685
	cmd_complete(cmd->sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
		     mgmt_status(status), &rp, sizeof(rp));
4686

4687
	mgmt_pending_remove(cmd);
4688 4689
}

4690 4691
void mgmt_pin_code_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
				      u8 status)
4692 4693
{
	struct pending_cmd *cmd;
4694
	struct mgmt_rp_pin_code_reply rp;
4695

4696
	cmd = mgmt_pending_find(MGMT_OP_PIN_CODE_NEG_REPLY, hdev);
4697
	if (!cmd)
4698
		return;
4699

4700
	bacpy(&rp.addr.bdaddr, bdaddr);
4701
	rp.addr.type = BDADDR_BREDR;
4702

4703 4704
	cmd_complete(cmd->sk, hdev->id, MGMT_OP_PIN_CODE_NEG_REPLY,
		     mgmt_status(status), &rp, sizeof(rp));
4705

4706
	mgmt_pending_remove(cmd);
4707
}
4708

4709
int mgmt_user_confirm_request(struct hci_dev *hdev, bdaddr_t *bdaddr,
4710 4711
			      u8 link_type, u8 addr_type, __le32 value,
			      u8 confirm_hint)
4712 4713 4714
{
	struct mgmt_ev_user_confirm_request ev;

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

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

4722
	return mgmt_event(MGMT_EV_USER_CONFIRM_REQUEST, hdev, &ev, sizeof(ev),
4723
			  NULL);
4724 4725
}

4726
int mgmt_user_passkey_request(struct hci_dev *hdev, bdaddr_t *bdaddr,
4727
			      u8 link_type, u8 addr_type)
4728 4729 4730 4731 4732
{
	struct mgmt_ev_user_passkey_request ev;

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

4733
	bacpy(&ev.addr.bdaddr, bdaddr);
4734
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
4735 4736

	return mgmt_event(MGMT_EV_USER_PASSKEY_REQUEST, hdev, &ev, sizeof(ev),
4737
			  NULL);
4738 4739
}

4740
static int user_pairing_resp_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
4741 4742
				      u8 link_type, u8 addr_type, u8 status,
				      u8 opcode)
4743 4744 4745 4746 4747
{
	struct pending_cmd *cmd;
	struct mgmt_rp_user_confirm_reply rp;
	int err;

4748
	cmd = mgmt_pending_find(opcode, hdev);
4749 4750 4751
	if (!cmd)
		return -ENOENT;

4752
	bacpy(&rp.addr.bdaddr, bdaddr);
4753
	rp.addr.type = link_to_bdaddr(link_type, addr_type);
4754
	err = cmd_complete(cmd->sk, hdev->id, opcode, mgmt_status(status),
4755
			   &rp, sizeof(rp));
4756

4757
	mgmt_pending_remove(cmd);
4758 4759 4760 4761

	return err;
}

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

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

4777
int mgmt_user_passkey_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
4778
				     u8 link_type, u8 addr_type, u8 status)
4779
{
4780
	return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
4781
					  status, MGMT_OP_USER_PASSKEY_REPLY);
4782 4783
}

4784
int mgmt_user_passkey_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
4785
					 u8 link_type, u8 addr_type, u8 status)
4786
{
4787
	return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
4788 4789
					  status,
					  MGMT_OP_USER_PASSKEY_NEG_REPLY);
4790 4791
}

4792 4793 4794 4795 4796 4797 4798 4799 4800 4801 4802 4803 4804 4805 4806 4807
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);
}

4808 4809
void mgmt_auth_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
		      u8 addr_type, u8 status)
4810 4811 4812
{
	struct mgmt_ev_auth_failed ev;

4813
	bacpy(&ev.addr.bdaddr, bdaddr);
4814
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
4815
	ev.status = mgmt_status(status);
4816

4817
	mgmt_event(MGMT_EV_AUTH_FAILED, hdev, &ev, sizeof(ev), NULL);
4818
}
4819

4820
void mgmt_auth_enable_complete(struct hci_dev *hdev, u8 status)
4821 4822
{
	struct cmd_lookup match = { NULL, hdev };
4823
	bool changed;
4824 4825 4826 4827

	if (status) {
		u8 mgmt_err = mgmt_status(status);
		mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev,
4828
				     cmd_status_rsp, &mgmt_err);
4829
		return;
4830 4831
	}

4832 4833 4834 4835 4836 4837
	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);
4838

4839
	mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev, settings_rsp,
4840
			     &match);
4841

4842
	if (changed)
4843
		new_settings(hdev, match.sk);
4844 4845 4846 4847 4848

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

4849
static void clear_eir(struct hci_request *req)
4850
{
4851
	struct hci_dev *hdev = req->hdev;
4852 4853
	struct hci_cp_write_eir cp;

4854
	if (!lmp_ext_inq_capable(hdev))
4855
		return;
4856

4857 4858
	memset(hdev->eir, 0, sizeof(hdev->eir));

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

4861
	hci_req_add(req, HCI_OP_WRITE_EIR, sizeof(cp), &cp);
4862 4863
}

4864
void mgmt_ssp_enable_complete(struct hci_dev *hdev, u8 enable, u8 status)
4865 4866
{
	struct cmd_lookup match = { NULL, hdev };
4867
	struct hci_request req;
4868
	bool changed = false;
4869 4870 4871

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

		if (enable && test_and_clear_bit(HCI_SSP_ENABLED,
4874 4875
						 &hdev->dev_flags)) {
			clear_bit(HCI_HS_ENABLED, &hdev->dev_flags);
4876
			new_settings(hdev, NULL);
4877
		}
4878

4879 4880
		mgmt_pending_foreach(MGMT_OP_SET_SSP, hdev, cmd_status_rsp,
				     &mgmt_err);
4881
		return;
4882 4883 4884
	}

	if (enable) {
4885
		changed = !test_and_set_bit(HCI_SSP_ENABLED, &hdev->dev_flags);
4886
	} else {
4887 4888 4889 4890 4891 4892
		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);
4893 4894 4895 4896
	}

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

4897
	if (changed)
4898
		new_settings(hdev, match.sk);
4899

4900
	if (match.sk)
4901 4902
		sock_put(match.sk);

4903 4904
	hci_req_init(&req, hdev);

4905
	if (test_bit(HCI_SSP_ENABLED, &hdev->dev_flags))
4906
		update_eir(&req);
4907
	else
4908 4909 4910
		clear_eir(&req);

	hci_req_run(&req, NULL);
4911 4912
}

4913
static void sk_lookup(struct pending_cmd *cmd, void *data)
4914 4915 4916 4917 4918 4919 4920 4921 4922
{
	struct cmd_lookup *match = data;

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

4923 4924
void mgmt_set_class_of_dev_complete(struct hci_dev *hdev, u8 *dev_class,
				    u8 status)
4925
{
4926
	struct cmd_lookup match = { NULL, hdev, mgmt_status(status) };
4927

4928 4929 4930
	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);
4931 4932

	if (!status)
4933 4934
		mgmt_event(MGMT_EV_CLASS_OF_DEV_CHANGED, hdev, dev_class, 3,
			   NULL);
4935 4936 4937

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

4940
void mgmt_set_local_name_complete(struct hci_dev *hdev, u8 *name, u8 status)
4941 4942
{
	struct mgmt_cp_set_local_name ev;
4943
	struct pending_cmd *cmd;
4944

4945
	if (status)
4946
		return;
4947 4948 4949

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

4952
	cmd = mgmt_pending_find(MGMT_OP_SET_LOCAL_NAME, hdev);
4953 4954
	if (!cmd) {
		memcpy(hdev->dev_name, name, sizeof(hdev->dev_name));
4955

4956 4957 4958 4959
		/* 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))
4960
			return;
4961
	}
4962

4963 4964
	mgmt_event(MGMT_EV_LOCAL_NAME_CHANGED, hdev, &ev, sizeof(ev),
		   cmd ? cmd->sk : NULL);
4965
}
4966

4967 4968
void mgmt_read_local_oob_data_reply_complete(struct hci_dev *hdev, u8 *hash,
					     u8 *randomizer, u8 status)
4969 4970 4971
{
	struct pending_cmd *cmd;

4972
	BT_DBG("%s status %u", hdev->name, status);
4973

4974
	cmd = mgmt_pending_find(MGMT_OP_READ_LOCAL_OOB_DATA, hdev);
4975
	if (!cmd)
4976
		return;
4977 4978

	if (status) {
4979 4980
		cmd_status(cmd->sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
			   mgmt_status(status));
4981 4982 4983 4984 4985 4986
	} else {
		struct mgmt_rp_read_local_oob_data rp;

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

4987 4988
		cmd_complete(cmd->sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
			     0, &rp, sizeof(rp));
4989 4990 4991 4992
	}

	mgmt_pending_remove(cmd);
}
4993

4994 4995 4996
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)
4997
{
4998 4999
	char buf[512];
	struct mgmt_ev_device_found *ev = (void *) buf;
5000
	size_t ev_size;
5001

5002
	if (!hci_discovery_active(hdev))
5003
		return;
5004

5005 5006
	/* Leave 5 bytes for a potential CoD field */
	if (sizeof(*ev) + eir_len + 5 > sizeof(buf))
5007
		return;
5008

5009 5010
	memset(buf, 0, sizeof(buf));

5011
	bacpy(&ev->addr.bdaddr, bdaddr);
5012
	ev->addr.type = link_to_bdaddr(link_type, addr_type);
5013
	ev->rssi = rssi;
5014
	if (cfm_name)
5015
		ev->flags |= __constant_cpu_to_le32(MGMT_DEV_FOUND_CONFIRM_NAME);
5016
	if (!ssp)
5017
		ev->flags |= __constant_cpu_to_le32(MGMT_DEV_FOUND_LEGACY_PAIRING);
5018

5019
	if (eir_len > 0)
5020
		memcpy(ev->eir, eir, eir_len);
5021

5022 5023
	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,
5024
					  dev_class, 3);
5025

5026
	ev->eir_len = cpu_to_le16(eir_len);
5027
	ev_size = sizeof(*ev) + eir_len;
5028

5029
	mgmt_event(MGMT_EV_DEVICE_FOUND, hdev, ev, ev_size, NULL);
5030
}
5031

5032 5033
void mgmt_remote_name(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
		      u8 addr_type, s8 rssi, u8 *name, u8 name_len)
5034
{
5035 5036 5037
	struct mgmt_ev_device_found *ev;
	char buf[sizeof(*ev) + HCI_MAX_NAME_LENGTH + 2];
	u16 eir_len;
5038

5039
	ev = (struct mgmt_ev_device_found *) buf;
5040

5041 5042 5043
	memset(buf, 0, sizeof(buf));

	bacpy(&ev->addr.bdaddr, bdaddr);
5044
	ev->addr.type = link_to_bdaddr(link_type, addr_type);
5045 5046 5047
	ev->rssi = rssi;

	eir_len = eir_append_data(ev->eir, 0, EIR_NAME_COMPLETE, name,
5048
				  name_len);
5049

5050
	ev->eir_len = cpu_to_le16(eir_len);
5051

5052
	mgmt_event(MGMT_EV_DEVICE_FOUND, hdev, ev, sizeof(*ev) + eir_len, NULL);
5053
}
5054

5055
void mgmt_discovering(struct hci_dev *hdev, u8 discovering)
5056
{
5057
	struct mgmt_ev_discovering ev;
5058 5059
	struct pending_cmd *cmd;

5060 5061
	BT_DBG("%s discovering %u", hdev->name, discovering);

5062
	if (discovering)
5063
		cmd = mgmt_pending_find(MGMT_OP_START_DISCOVERY, hdev);
5064
	else
5065
		cmd = mgmt_pending_find(MGMT_OP_STOP_DISCOVERY, hdev);
5066 5067

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

5070 5071
		cmd_complete(cmd->sk, hdev->id, cmd->opcode, 0, &type,
			     sizeof(type));
5072 5073 5074
		mgmt_pending_remove(cmd);
	}

5075 5076 5077 5078
	memset(&ev, 0, sizeof(ev));
	ev.type = hdev->discovery.type;
	ev.discovering = discovering;

5079
	mgmt_event(MGMT_EV_DISCOVERING, hdev, &ev, sizeof(ev), NULL);
5080
}
5081

5082
int mgmt_device_blocked(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type)
5083 5084 5085 5086
{
	struct pending_cmd *cmd;
	struct mgmt_ev_device_blocked ev;

5087
	cmd = mgmt_pending_find(MGMT_OP_BLOCK_DEVICE, hdev);
5088

5089 5090
	bacpy(&ev.addr.bdaddr, bdaddr);
	ev.addr.type = type;
5091

5092
	return mgmt_event(MGMT_EV_DEVICE_BLOCKED, hdev, &ev, sizeof(ev),
5093
			  cmd ? cmd->sk : NULL);
5094 5095
}

5096
int mgmt_device_unblocked(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type)
5097 5098 5099 5100
{
	struct pending_cmd *cmd;
	struct mgmt_ev_device_unblocked ev;

5101
	cmd = mgmt_pending_find(MGMT_OP_UNBLOCK_DEVICE, hdev);
5102

5103 5104
	bacpy(&ev.addr.bdaddr, bdaddr);
	ev.addr.type = type;
5105

5106
	return mgmt_event(MGMT_EV_DEVICE_UNBLOCKED, hdev, &ev, sizeof(ev),
5107
			  cmd ? cmd->sk : NULL);
5108
}
5109 5110 5111 5112 5113 5114 5115 5116

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);
5117
		new_settings(hdev, NULL);
5118 5119 5120 5121 5122 5123 5124
	}
}

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

5125
	if (hci_conn_num(hdev, LE_LINK) > 0)
5126 5127 5128 5129 5130 5131 5132 5133 5134 5135 5136 5137 5138
		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);
5139
		new_settings(hdev, NULL);
5140 5141
	}
}