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

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

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

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

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

/* Bluetooth HCI Management interface */

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

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

35 36
bool enable_hs;

37
#define MGMT_VERSION	1
38
#define MGMT_REVISION	3
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 77
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,
78
	MGMT_OP_SET_DEVICE_ID,
79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
};

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,
102
	MGMT_EV_PASSKEY_NOTIFY,
103 104
};

105 106 107 108 109 110 111 112
/*
 * These LE scan and inquiry parameters were chosen according to LE General
 * Discovery Procedure specification.
 */
#define LE_SCAN_TYPE			0x01
#define LE_SCAN_WIN			0x12
#define LE_SCAN_INT			0x12
#define LE_SCAN_TIMEOUT_LE_ONLY		10240	/* TGAP(gen_disc_scan_min) */
113
#define LE_SCAN_TIMEOUT_BREDR_LE	5120	/* TGAP(100)/2 */
114

A
Andre Guedes 已提交
115
#define INQUIRY_LEN_BREDR		0x08	/* TGAP(100) */
116
#define INQUIRY_LEN_BREDR_LE		0x04	/* TGAP(100)/2 */
A
Andre Guedes 已提交
117

118
#define CACHE_TIMEOUT	msecs_to_jiffies(2 * 1000)
119

120 121 122
#define hdev_is_powered(hdev) (test_bit(HCI_UP, &hdev->flags) && \
				!test_bit(HCI_AUTO_OFF, &hdev->dev_flags))

123 124
struct pending_cmd {
	struct list_head list;
125
	u16 opcode;
126
	int index;
127
	void *param;
128
	struct sock *sk;
129
	void *user_data;
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 195 196
/* 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 */
};

197 198 199 200 201
bool mgmt_valid_hdev(struct hci_dev *hdev)
{
	return hdev->dev_type == HCI_BREDR;
}

202 203 204 205 206 207 208 209
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;
}

210
static int cmd_status(struct sock *sk, u16 index, u16 cmd, u8 status)
211 212 213 214
{
	struct sk_buff *skb;
	struct mgmt_hdr *hdr;
	struct mgmt_ev_cmd_status *ev;
215
	int err;
216

217
	BT_DBG("sock %p, index %u, cmd %u, status %u", sk, index, cmd, status);
218

219
	skb = alloc_skb(sizeof(*hdr) + sizeof(*ev), GFP_KERNEL);
220 221 222 223 224
	if (!skb)
		return -ENOMEM;

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

225
	hdr->opcode = __constant_cpu_to_le16(MGMT_EV_CMD_STATUS);
226
	hdr->index = cpu_to_le16(index);
227 228 229 230
	hdr->len = cpu_to_le16(sizeof(*ev));

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

233 234
	err = sock_queue_rcv_skb(sk, skb);
	if (err < 0)
235 236
		kfree_skb(skb);

237
	return err;
238 239
}

240
static int cmd_complete(struct sock *sk, u16 index, u16 cmd, u8 status,
241
			void *rp, size_t rp_len)
242 243 244 245
{
	struct sk_buff *skb;
	struct mgmt_hdr *hdr;
	struct mgmt_ev_cmd_complete *ev;
246
	int err;
247 248 249

	BT_DBG("sock %p", sk);

250
	skb = alloc_skb(sizeof(*hdr) + sizeof(*ev) + rp_len, GFP_KERNEL);
251 252 253 254 255
	if (!skb)
		return -ENOMEM;

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

256
	hdr->opcode = __constant_cpu_to_le16(MGMT_EV_CMD_COMPLETE);
257
	hdr->index = cpu_to_le16(index);
258
	hdr->len = cpu_to_le16(sizeof(*ev) + rp_len);
259

260
	ev = (void *) skb_put(skb, sizeof(*ev) + rp_len);
261
	ev->opcode = cpu_to_le16(cmd);
262
	ev->status = status;
263 264 265

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

267 268
	err = sock_queue_rcv_skb(sk, skb);
	if (err < 0)
269 270
		kfree_skb(skb);

271
	return err;
272 273
}

274 275
static int read_version(struct sock *sk, struct hci_dev *hdev, void *data,
			u16 data_len)
276 277 278 279 280 281
{
	struct mgmt_rp_read_version rp;

	BT_DBG("sock %p", sk);

	rp.version = MGMT_VERSION;
282
	rp.revision = __constant_cpu_to_le16(MGMT_REVISION);
283

284
	return cmd_complete(sk, MGMT_INDEX_NONE, MGMT_OP_READ_VERSION, 0, &rp,
285
			    sizeof(rp));
286 287
}

288 289
static int read_commands(struct sock *sk, struct hci_dev *hdev, void *data,
			 u16 data_len)
290 291
{
	struct mgmt_rp_read_commands *rp;
292 293
	const u16 num_commands = ARRAY_SIZE(mgmt_commands);
	const u16 num_events = ARRAY_SIZE(mgmt_events);
294
	__le16 *opcode;
295 296 297 298 299 300 301 302 303 304 305
	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;

306 307
	rp->num_commands = __constant_cpu_to_le16(num_commands);
	rp->num_events = __constant_cpu_to_le16(num_events);
308 309 310 311 312 313 314

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

315
	err = cmd_complete(sk, MGMT_INDEX_NONE, MGMT_OP_READ_COMMANDS, 0, rp,
316
			   rp_size);
317 318 319 320 321
	kfree(rp);

	return err;
}

322 323
static int read_index_list(struct sock *sk, struct hci_dev *hdev, void *data,
			   u16 data_len)
324 325
{
	struct mgmt_rp_read_index_list *rp;
326
	struct hci_dev *d;
327
	size_t rp_len;
328
	u16 count;
329
	int err;
330 331 332 333 334 335

	BT_DBG("sock %p", sk);

	read_lock(&hci_dev_list_lock);

	count = 0;
336 337 338 339
	list_for_each_entry(d, &hci_dev_list, list) {
		if (!mgmt_valid_hdev(d))
			continue;

340 341 342
		count++;
	}

343 344 345
	rp_len = sizeof(*rp) + (2 * count);
	rp = kmalloc(rp_len, GFP_ATOMIC);
	if (!rp) {
346
		read_unlock(&hci_dev_list_lock);
347
		return -ENOMEM;
348
	}
349

350
	count = 0;
351
	list_for_each_entry(d, &hci_dev_list, list) {
352
		if (test_bit(HCI_SETUP, &d->dev_flags))
353 354
			continue;

355 356 357
		if (!mgmt_valid_hdev(d))
			continue;

358
		rp->index[count++] = cpu_to_le16(d->id);
359 360 361
		BT_DBG("Added hci%u", d->id);
	}

362 363 364
	rp->num_controllers = cpu_to_le16(count);
	rp_len = sizeof(*rp) + (2 * count);

365 366
	read_unlock(&hci_dev_list_lock);

367
	err = cmd_complete(sk, MGMT_INDEX_NONE, MGMT_OP_READ_INDEX_LIST, 0, rp,
368
			   rp_len);
369

370 371 372
	kfree(rp);

	return err;
373 374
}

375 376 377 378 379 380 381
static u32 get_supported_settings(struct hci_dev *hdev)
{
	u32 settings = 0;

	settings |= MGMT_SETTING_POWERED;
	settings |= MGMT_SETTING_PAIRABLE;

382
	if (lmp_ssp_capable(hdev))
383 384
		settings |= MGMT_SETTING_SSP;

385
	if (lmp_bredr_capable(hdev)) {
386 387 388
		settings |= MGMT_SETTING_CONNECTABLE;
		settings |= MGMT_SETTING_FAST_CONNECTABLE;
		settings |= MGMT_SETTING_DISCOVERABLE;
389 390 391 392
		settings |= MGMT_SETTING_BREDR;
		settings |= MGMT_SETTING_LINK_SECURITY;
	}

393 394 395
	if (enable_hs)
		settings |= MGMT_SETTING_HS;

396
	if (lmp_le_capable(hdev))
397
		settings |= MGMT_SETTING_LE;
398 399 400 401 402 403 404 405

	return settings;
}

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

406
	if (hdev_is_powered(hdev))
407 408
		settings |= MGMT_SETTING_POWERED;

409
	if (test_bit(HCI_CONNECTABLE, &hdev->dev_flags))
410 411
		settings |= MGMT_SETTING_CONNECTABLE;

412
	if (test_bit(HCI_DISCOVERABLE, &hdev->dev_flags))
413 414
		settings |= MGMT_SETTING_DISCOVERABLE;

415
	if (test_bit(HCI_PAIRABLE, &hdev->dev_flags))
416 417
		settings |= MGMT_SETTING_PAIRABLE;

418
	if (lmp_bredr_capable(hdev))
419 420
		settings |= MGMT_SETTING_BREDR;

421
	if (test_bit(HCI_LE_ENABLED, &hdev->dev_flags))
422 423
		settings |= MGMT_SETTING_LE;

424
	if (test_bit(HCI_LINK_SECURITY, &hdev->dev_flags))
425 426
		settings |= MGMT_SETTING_LINK_SECURITY;

427
	if (test_bit(HCI_SSP_ENABLED, &hdev->dev_flags))
428 429
		settings |= MGMT_SETTING_SSP;

430 431 432
	if (test_bit(HCI_HS_ENABLED, &hdev->dev_flags))
		settings |= MGMT_SETTING_HS;

433 434 435
	return settings;
}

436 437
#define PNP_INFO_SVCLASS_ID		0x1200

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 473 474 475 476 477 478 479
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;
}

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 506 507 508 509 510 511 512
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;
}

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 539 540 541 542 543 544 545
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;
}

546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568
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);
	}

569
	if (hdev->inq_tx_power != HCI_TX_POWER_INVALID) {
570 571 572 573 574 575 576
		ptr[0] = 2;
		ptr[1] = EIR_TX_POWER;
		ptr[2] = (u8) hdev->inq_tx_power;

		ptr += 3;
	}

577 578 579 580 581 582 583 584 585 586 587 588
	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;
	}

589
	ptr = create_uuid16_list(hdev, ptr, HCI_MAX_EIR_LENGTH - (ptr - data));
590
	ptr = create_uuid32_list(hdev, ptr, HCI_MAX_EIR_LENGTH - (ptr - data));
591
	ptr = create_uuid128_list(hdev, ptr, HCI_MAX_EIR_LENGTH - (ptr - data));
592 593 594 595 596 597
}

static int update_eir(struct hci_dev *hdev)
{
	struct hci_cp_write_eir cp;

598
	if (!hdev_is_powered(hdev))
599 600
		return 0;

601
	if (!lmp_ext_inq_capable(hdev))
602 603
		return 0;

604
	if (!test_bit(HCI_SSP_ENABLED, &hdev->dev_flags))
605 606
		return 0;

607
	if (test_bit(HCI_SERVICE_CACHE, &hdev->dev_flags))
608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635
		return 0;

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

	create_eir(hdev, cp.data);

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

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

	return hci_send_cmd(hdev, HCI_OP_WRITE_EIR, sizeof(cp), &cp);
}

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

static int update_class(struct hci_dev *hdev)
{
	u8 cod[3];
636
	int err;
637 638 639

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

640
	if (!hdev_is_powered(hdev))
641 642
		return 0;

643
	if (test_bit(HCI_SERVICE_CACHE, &hdev->dev_flags))
644 645 646 647 648 649 650 651 652
		return 0;

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

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

653 654 655 656 657
	err = hci_send_cmd(hdev, HCI_OP_WRITE_CLASS_OF_DEV, sizeof(cod), cod);
	if (err == 0)
		set_bit(HCI_PENDING_CLASS, &hdev->dev_flags);

	return err;
658 659
}

660 661 662
static void service_cache_off(struct work_struct *work)
{
	struct hci_dev *hdev = container_of(work, struct hci_dev,
663
					    service_cache.work);
664

665
	if (!test_and_clear_bit(HCI_SERVICE_CACHE, &hdev->dev_flags))
666 667 668 669 670 671 672 673 674 675
		return;

	hci_dev_lock(hdev);

	update_eir(hdev);
	update_class(hdev);

	hci_dev_unlock(hdev);
}

676
static void mgmt_init_hdev(struct sock *sk, struct hci_dev *hdev)
677
{
678
	if (test_and_set_bit(HCI_MGMT, &hdev->dev_flags))
679 680
		return;

681
	INIT_DELAYED_WORK(&hdev->service_cache, service_cache_off);
682

683 684 685 686 687 688
	/* 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);
689 690
}

691
static int read_controller_info(struct sock *sk, struct hci_dev *hdev,
692
				void *data, u16 data_len)
693
{
694
	struct mgmt_rp_read_info rp;
695

696
	BT_DBG("sock %p %s", sk, hdev->name);
697

698
	hci_dev_lock(hdev);
699

700 701
	memset(&rp, 0, sizeof(rp));

702
	bacpy(&rp.bdaddr, &hdev->bdaddr);
703

704
	rp.version = hdev->hci_ver;
705
	rp.manufacturer = cpu_to_le16(hdev->manufacturer);
706 707 708

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

710
	memcpy(rp.dev_class, hdev->dev_class, 3);
711

712
	memcpy(rp.name, hdev->dev_name, sizeof(hdev->dev_name));
713
	memcpy(rp.short_name, hdev->short_name, sizeof(hdev->short_name));
714

715
	hci_dev_unlock(hdev);
716

717
	return cmd_complete(sk, hdev->id, MGMT_OP_READ_INFO, 0, &rp,
718
			    sizeof(rp));
719 720
}

721 722 723
static void mgmt_pending_free(struct pending_cmd *cmd)
{
	sock_put(cmd->sk);
724
	kfree(cmd->param);
725 726 727
	kfree(cmd);
}

728
static struct pending_cmd *mgmt_pending_add(struct sock *sk, u16 opcode,
729 730
					    struct hci_dev *hdev, void *data,
					    u16 len)
731 732 733
{
	struct pending_cmd *cmd;

734
	cmd = kmalloc(sizeof(*cmd), GFP_KERNEL);
735
	if (!cmd)
736
		return NULL;
737 738

	cmd->opcode = opcode;
739
	cmd->index = hdev->id;
740

741
	cmd->param = kmalloc(len, GFP_KERNEL);
742
	if (!cmd->param) {
743
		kfree(cmd);
744
		return NULL;
745 746
	}

747 748
	if (data)
		memcpy(cmd->param, data, len);
749 750 751 752

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

753
	list_add(&cmd->list, &hdev->mgmt_pending);
754

755
	return cmd;
756 757
}

758
static void mgmt_pending_foreach(u16 opcode, struct hci_dev *hdev,
759 760
				 void (*cb)(struct pending_cmd *cmd,
					    void *data),
761
				 void *data)
762 763 764
{
	struct list_head *p, *n;

765
	list_for_each_safe(p, n, &hdev->mgmt_pending) {
766 767 768 769
		struct pending_cmd *cmd;

		cmd = list_entry(p, struct pending_cmd, list);

770
		if (opcode > 0 && cmd->opcode != opcode)
771 772 773 774 775 776
			continue;

		cb(cmd, data);
	}
}

777
static struct pending_cmd *mgmt_pending_find(u16 opcode, struct hci_dev *hdev)
778
{
779
	struct pending_cmd *cmd;
780

781
	list_for_each_entry(cmd, &hdev->mgmt_pending, list) {
782 783
		if (cmd->opcode == opcode)
			return cmd;
784 785 786 787 788
	}

	return NULL;
}

789
static void mgmt_pending_remove(struct pending_cmd *cmd)
790 791 792 793 794
{
	list_del(&cmd->list);
	mgmt_pending_free(cmd);
}

795
static int send_settings_rsp(struct sock *sk, u16 opcode, struct hci_dev *hdev)
796
{
797
	__le32 settings = cpu_to_le32(get_current_settings(hdev));
798

799
	return cmd_complete(sk, hdev->id, opcode, 0, &settings,
800
			    sizeof(settings));
801 802
}

803
static int set_powered(struct sock *sk, struct hci_dev *hdev, void *data,
804
		       u16 len)
805
{
806
	struct mgmt_mode *cp = data;
807
	struct pending_cmd *cmd;
808
	int err;
809

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

812 813 814 815
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_POWERED,
				  MGMT_STATUS_INVALID_PARAMS);

816
	hci_dev_lock(hdev);
817

818 819 820 821
	if (test_and_clear_bit(HCI_AUTO_OFF, &hdev->dev_flags)) {
		cancel_delayed_work(&hdev->power_off);

		if (cp->val) {
822 823 824
			mgmt_pending_add(sk, MGMT_OP_SET_POWERED, hdev,
					 data, len);
			err = mgmt_powered(hdev, 1);
825 826 827 828
			goto failed;
		}
	}

829
	if (!!cp->val == hdev_is_powered(hdev)) {
830
		err = send_settings_rsp(sk, MGMT_OP_SET_POWERED, hdev);
831 832 833
		goto failed;
	}

834
	if (mgmt_pending_find(MGMT_OP_SET_POWERED, hdev)) {
835
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_POWERED,
836
				 MGMT_STATUS_BUSY);
837 838 839
		goto failed;
	}

840
	cmd = mgmt_pending_add(sk, MGMT_OP_SET_POWERED, hdev, data, len);
841 842
	if (!cmd) {
		err = -ENOMEM;
843
		goto failed;
844
	}
845

846
	if (cp->val)
847
		queue_work(hdev->req_workqueue, &hdev->power_on);
848
	else
849
		queue_work(hdev->req_workqueue, &hdev->power_off.work);
850

851
	err = 0;
852 853

failed:
854
	hci_dev_unlock(hdev);
855
	return err;
856 857
}

858 859
static int mgmt_event(u16 event, struct hci_dev *hdev, void *data, u16 data_len,
		      struct sock *skip_sk)
860 861 862 863
{
	struct sk_buff *skb;
	struct mgmt_hdr *hdr;

864
	skb = alloc_skb(sizeof(*hdr) + data_len, GFP_KERNEL);
865 866 867 868 869 870 871 872
	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
873
		hdr->index = __constant_cpu_to_le16(MGMT_INDEX_NONE);
874 875 876 877 878
	hdr->len = cpu_to_le16(data_len);

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

879 880 881
	/* Time stamp */
	__net_timestamp(skb);

882 883 884 885 886 887 888 889 890 891 892 893 894 895 896
	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);
}

897
static int set_discoverable(struct sock *sk, struct hci_dev *hdev, void *data,
898
			    u16 len)
899
{
900
	struct mgmt_cp_set_discoverable *cp = data;
901
	struct pending_cmd *cmd;
902
	u16 timeout;
903 904 905
	u8 scan;
	int err;

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

908 909 910 911
	if (!lmp_bredr_capable(hdev))
		return cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
				 MGMT_STATUS_NOT_SUPPORTED);

912 913 914 915
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
				  MGMT_STATUS_INVALID_PARAMS);

916
	timeout = __le16_to_cpu(cp->timeout);
917
	if (!cp->val && timeout > 0)
918
		return cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
919
				  MGMT_STATUS_INVALID_PARAMS);
920

921
	hci_dev_lock(hdev);
922

923
	if (!hdev_is_powered(hdev) && timeout > 0) {
924
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
925
				 MGMT_STATUS_NOT_POWERED);
926 927 928
		goto failed;
	}

929
	if (mgmt_pending_find(MGMT_OP_SET_DISCOVERABLE, hdev) ||
930
	    mgmt_pending_find(MGMT_OP_SET_CONNECTABLE, hdev)) {
931
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
932
				 MGMT_STATUS_BUSY);
933 934 935
		goto failed;
	}

936
	if (!test_bit(HCI_CONNECTABLE, &hdev->dev_flags)) {
937
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
938
				 MGMT_STATUS_REJECTED);
939 940 941 942
		goto failed;
	}

	if (!hdev_is_powered(hdev)) {
943 944 945 946 947 948 949
		bool changed = false;

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

950
		err = send_settings_rsp(sk, MGMT_OP_SET_DISCOVERABLE, hdev);
951 952 953 954 955 956
		if (err < 0)
			goto failed;

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

957 958 959 960
		goto failed;
	}

	if (!!cp->val == test_bit(HCI_DISCOVERABLE, &hdev->dev_flags)) {
961 962 963 964 965 966 967 968 969 970 971
		if (hdev->discov_timeout > 0) {
			cancel_delayed_work(&hdev->discov_off);
			hdev->discov_timeout = 0;
		}

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

972
		err = send_settings_rsp(sk, MGMT_OP_SET_DISCOVERABLE, hdev);
973 974 975
		goto failed;
	}

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

	scan = SCAN_PAGE;

984
	if (cp->val)
985
		scan |= SCAN_INQUIRY;
986
	else
987
		cancel_delayed_work(&hdev->discov_off);
988 989 990

	err = hci_send_cmd(hdev, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);
	if (err < 0)
991
		mgmt_pending_remove(cmd);
992

993
	if (cp->val)
994
		hdev->discov_timeout = timeout;
995

996
failed:
997
	hci_dev_unlock(hdev);
998 999 1000
	return err;
}

1001
static int set_connectable(struct sock *sk, struct hci_dev *hdev, void *data,
1002
			   u16 len)
1003
{
1004
	struct mgmt_mode *cp = data;
1005
	struct pending_cmd *cmd;
1006 1007 1008
	u8 scan;
	int err;

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

1011 1012 1013 1014
	if (!lmp_bredr_capable(hdev))
		return cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE,
				  MGMT_STATUS_NOT_SUPPORTED);

1015 1016 1017 1018
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE,
				  MGMT_STATUS_INVALID_PARAMS);

1019
	hci_dev_lock(hdev);
1020

1021
	if (!hdev_is_powered(hdev)) {
1022 1023 1024 1025 1026
		bool changed = false;

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

1027
		if (cp->val) {
1028
			set_bit(HCI_CONNECTABLE, &hdev->dev_flags);
1029
		} else {
1030 1031 1032
			clear_bit(HCI_CONNECTABLE, &hdev->dev_flags);
			clear_bit(HCI_DISCOVERABLE, &hdev->dev_flags);
		}
1033

1034
		err = send_settings_rsp(sk, MGMT_OP_SET_CONNECTABLE, hdev);
1035 1036 1037 1038 1039 1040
		if (err < 0)
			goto failed;

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

1041 1042 1043
		goto failed;
	}

1044
	if (mgmt_pending_find(MGMT_OP_SET_DISCOVERABLE, hdev) ||
1045
	    mgmt_pending_find(MGMT_OP_SET_CONNECTABLE, hdev)) {
1046
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE,
1047
				 MGMT_STATUS_BUSY);
1048 1049 1050
		goto failed;
	}

1051
	if (!!cp->val == test_bit(HCI_PSCAN, &hdev->flags)) {
1052
		err = send_settings_rsp(sk, MGMT_OP_SET_CONNECTABLE, hdev);
1053 1054 1055
		goto failed;
	}

1056
	cmd = mgmt_pending_add(sk, MGMT_OP_SET_CONNECTABLE, hdev, data, len);
1057 1058
	if (!cmd) {
		err = -ENOMEM;
1059
		goto failed;
1060
	}
1061

1062
	if (cp->val) {
1063
		scan = SCAN_PAGE;
1064
	} else {
1065 1066
		scan = 0;

1067
		if (test_bit(HCI_ISCAN, &hdev->flags) &&
1068
		    hdev->discov_timeout > 0)
1069 1070 1071
			cancel_delayed_work(&hdev->discov_off);
	}

1072 1073
	err = hci_send_cmd(hdev, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);
	if (err < 0)
1074
		mgmt_pending_remove(cmd);
1075 1076

failed:
1077
	hci_dev_unlock(hdev);
1078 1079 1080
	return err;
}

1081
static int set_pairable(struct sock *sk, struct hci_dev *hdev, void *data,
1082
			u16 len)
1083
{
1084
	struct mgmt_mode *cp = data;
1085 1086
	int err;

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

1089 1090 1091 1092
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_PAIRABLE,
				  MGMT_STATUS_INVALID_PARAMS);

1093
	hci_dev_lock(hdev);
1094 1095

	if (cp->val)
1096
		set_bit(HCI_PAIRABLE, &hdev->dev_flags);
1097
	else
1098
		clear_bit(HCI_PAIRABLE, &hdev->dev_flags);
1099

1100
	err = send_settings_rsp(sk, MGMT_OP_SET_PAIRABLE, hdev);
1101 1102 1103
	if (err < 0)
		goto failed;

1104
	err = new_settings(hdev, sk);
1105 1106

failed:
1107
	hci_dev_unlock(hdev);
1108 1109 1110
	return err;
}

1111 1112
static int set_link_security(struct sock *sk, struct hci_dev *hdev, void *data,
			     u16 len)
1113 1114 1115
{
	struct mgmt_mode *cp = data;
	struct pending_cmd *cmd;
1116
	u8 val;
1117 1118
	int err;

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

1121 1122 1123 1124
	if (!lmp_bredr_capable(hdev))
		return cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY,
				  MGMT_STATUS_NOT_SUPPORTED);

1125 1126 1127 1128
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY,
				  MGMT_STATUS_INVALID_PARAMS);

1129 1130
	hci_dev_lock(hdev);

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

		if (!!cp->val != test_bit(HCI_LINK_SECURITY,
1135
					  &hdev->dev_flags)) {
1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146
			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);

1147 1148 1149 1150
		goto failed;
	}

	if (mgmt_pending_find(MGMT_OP_SET_LINK_SECURITY, hdev)) {
1151
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY,
1152
				 MGMT_STATUS_BUSY);
1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179
		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;
}

1180
static int set_ssp(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
1181 1182 1183
{
	struct mgmt_mode *cp = data;
	struct pending_cmd *cmd;
1184
	u8 val;
1185 1186
	int err;

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

1189 1190 1191
	if (!lmp_ssp_capable(hdev))
		return cmd_status(sk, hdev->id, MGMT_OP_SET_SSP,
				  MGMT_STATUS_NOT_SUPPORTED);
1192

1193 1194 1195 1196
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_SSP,
				  MGMT_STATUS_INVALID_PARAMS);

1197
	hci_dev_lock(hdev);
1198

1199 1200
	val = !!cp->val;

1201
	if (!hdev_is_powered(hdev)) {
1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215
		bool changed = false;

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

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

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

1216 1217 1218 1219
		goto failed;
	}

	if (mgmt_pending_find(MGMT_OP_SET_SSP, hdev)) {
1220 1221
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_SSP,
				 MGMT_STATUS_BUSY);
1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246
		goto failed;
	}

	if (test_bit(HCI_SSP_ENABLED, &hdev->dev_flags) == val) {
		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;
	}

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

failed:
	hci_dev_unlock(hdev);
	return err;
}

1247
static int set_hs(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
1248 1249 1250
{
	struct mgmt_mode *cp = data;

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

1253 1254
	if (!enable_hs)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_HS,
1255
				  MGMT_STATUS_NOT_SUPPORTED);
1256

1257 1258 1259 1260
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_HS,
				  MGMT_STATUS_INVALID_PARAMS);

1261 1262 1263 1264 1265
	if (cp->val)
		set_bit(HCI_HS_ENABLED, &hdev->dev_flags);
	else
		clear_bit(HCI_HS_ENABLED, &hdev->dev_flags);

1266
	return send_settings_rsp(sk, MGMT_OP_SET_HS, hdev);
1267 1268
}

1269
static int set_le(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
1270 1271 1272 1273 1274
{
	struct mgmt_mode *cp = data;
	struct hci_cp_write_le_host_supported hci_cp;
	struct pending_cmd *cmd;
	int err;
1275
	u8 val, enabled;
1276

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

1279 1280 1281
	if (!lmp_le_capable(hdev))
		return cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
				  MGMT_STATUS_NOT_SUPPORTED);
1282

1283 1284 1285 1286
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
				  MGMT_STATUS_INVALID_PARAMS);

1287
	hci_dev_lock(hdev);
1288 1289

	val = !!cp->val;
1290
	enabled = lmp_host_le_capable(hdev);
1291

1292
	if (!hdev_is_powered(hdev) || val == enabled) {
1293 1294 1295 1296 1297 1298 1299 1300 1301
		bool changed = false;

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

		err = send_settings_rsp(sk, MGMT_OP_SET_LE, hdev);
		if (err < 0)
1302
			goto unlock;
1303 1304 1305 1306

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

1307
		goto unlock;
1308 1309 1310
	}

	if (mgmt_pending_find(MGMT_OP_SET_LE, hdev)) {
1311
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
1312
				 MGMT_STATUS_BUSY);
1313
		goto unlock;
1314 1315 1316 1317 1318
	}

	cmd = mgmt_pending_add(sk, MGMT_OP_SET_LE, hdev, data, len);
	if (!cmd) {
		err = -ENOMEM;
1319
		goto unlock;
1320 1321 1322 1323 1324 1325
	}

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

	if (val) {
		hci_cp.le = val;
1326
		hci_cp.simul = lmp_le_br_capable(hdev);
1327 1328
	}

1329 1330
	err = hci_send_cmd(hdev, HCI_OP_WRITE_LE_HOST_SUPPORTED, sizeof(hci_cp),
			   &hci_cp);
1331
	if (err < 0)
1332 1333
		mgmt_pending_remove(cmd);

1334 1335
unlock:
	hci_dev_unlock(hdev);
1336 1337 1338
	return err;
}

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

1358
static int add_uuid(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
1359
{
1360
	struct mgmt_cp_add_uuid *cp = data;
1361
	struct pending_cmd *cmd;
1362 1363 1364
	struct bt_uuid *uuid;
	int err;

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

1367
	hci_dev_lock(hdev);
1368

1369
	if (test_bit(HCI_PENDING_CLASS, &hdev->dev_flags)) {
1370
		err = cmd_status(sk, hdev->id, MGMT_OP_ADD_UUID,
1371
				 MGMT_STATUS_BUSY);
1372 1373 1374
		goto failed;
	}

1375
	uuid = kmalloc(sizeof(*uuid), GFP_KERNEL);
1376 1377 1378 1379 1380 1381
	if (!uuid) {
		err = -ENOMEM;
		goto failed;
	}

	memcpy(uuid->uuid, cp->uuid, 16);
1382
	uuid->svc_hint = cp->svc_hint;
1383
	uuid->size = get_uuid_size(cp->uuid);
1384

1385
	list_add_tail(&uuid->list, &hdev->uuids);
1386

1387 1388 1389 1390
	err = update_class(hdev);
	if (err < 0)
		goto failed;

1391 1392 1393 1394
	err = update_eir(hdev);
	if (err < 0)
		goto failed;

1395
	if (!test_bit(HCI_PENDING_CLASS, &hdev->dev_flags)) {
1396
		err = cmd_complete(sk, hdev->id, MGMT_OP_ADD_UUID, 0,
1397
				   hdev->dev_class, 3);
1398 1399 1400 1401
		goto failed;
	}

	cmd = mgmt_pending_add(sk, MGMT_OP_ADD_UUID, hdev, data, len);
1402
	if (!cmd)
1403
		err = -ENOMEM;
1404 1405

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

1410 1411 1412 1413 1414 1415
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)) {
1416 1417
		queue_delayed_work(hdev->workqueue, &hdev->service_cache,
				   CACHE_TIMEOUT);
1418 1419 1420 1421 1422 1423
		return true;
	}

	return false;
}

1424
static int remove_uuid(struct sock *sk, struct hci_dev *hdev, void *data,
1425
		       u16 len)
1426
{
1427
	struct mgmt_cp_remove_uuid *cp = data;
1428
	struct pending_cmd *cmd;
1429
	struct bt_uuid *match, *tmp;
1430 1431 1432
	u8 bt_uuid_any[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
	int err, found;

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

1435
	hci_dev_lock(hdev);
1436

1437
	if (test_bit(HCI_PENDING_CLASS, &hdev->dev_flags)) {
1438
		err = cmd_status(sk, hdev->id, MGMT_OP_REMOVE_UUID,
1439
				 MGMT_STATUS_BUSY);
1440 1441 1442
		goto unlock;
	}

1443 1444
	if (memcmp(cp->uuid, bt_uuid_any, 16) == 0) {
		err = hci_uuids_clear(hdev);
1445

1446
		if (enable_service_cache(hdev)) {
1447
			err = cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_UUID,
1448
					   0, hdev->dev_class, 3);
1449 1450
			goto unlock;
		}
1451

1452
		goto update_class;
1453 1454 1455 1456
	}

	found = 0;

1457
	list_for_each_entry_safe(match, tmp, &hdev->uuids, list) {
1458 1459 1460 1461
		if (memcmp(match->uuid, cp->uuid, 16) != 0)
			continue;

		list_del(&match->list);
1462
		kfree(match);
1463 1464 1465 1466
		found++;
	}

	if (found == 0) {
1467
		err = cmd_status(sk, hdev->id, MGMT_OP_REMOVE_UUID,
1468
				 MGMT_STATUS_INVALID_PARAMS);
1469 1470 1471
		goto unlock;
	}

1472
update_class:
1473 1474 1475 1476
	err = update_class(hdev);
	if (err < 0)
		goto unlock;

1477 1478 1479 1480
	err = update_eir(hdev);
	if (err < 0)
		goto unlock;

1481
	if (!test_bit(HCI_PENDING_CLASS, &hdev->dev_flags)) {
1482
		err = cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_UUID, 0,
1483
				   hdev->dev_class, 3);
1484 1485 1486 1487
		goto unlock;
	}

	cmd = mgmt_pending_add(sk, MGMT_OP_REMOVE_UUID, hdev, data, len);
1488
	if (!cmd)
1489
		err = -ENOMEM;
1490 1491

unlock:
1492
	hci_dev_unlock(hdev);
1493 1494 1495
	return err;
}

1496
static int set_dev_class(struct sock *sk, struct hci_dev *hdev, void *data,
1497
			 u16 len)
1498
{
1499
	struct mgmt_cp_set_dev_class *cp = data;
1500
	struct pending_cmd *cmd;
1501 1502
	int err;

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

1505 1506 1507
	if (!lmp_bredr_capable(hdev))
		return cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS,
				  MGMT_STATUS_NOT_SUPPORTED);
1508

1509 1510 1511
	if (test_bit(HCI_PENDING_CLASS, &hdev->dev_flags))
		return cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS,
				  MGMT_STATUS_BUSY);
1512

1513 1514 1515
	if ((cp->minor & 0x03) != 0 || (cp->major & 0xe0) != 0)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS,
				  MGMT_STATUS_INVALID_PARAMS);
1516

1517
	hci_dev_lock(hdev);
1518

1519 1520 1521
	hdev->major_class = cp->major;
	hdev->minor_class = cp->minor;

1522
	if (!hdev_is_powered(hdev)) {
1523
		err = cmd_complete(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, 0,
1524
				   hdev->dev_class, 3);
1525 1526 1527
		goto unlock;
	}

1528
	if (test_and_clear_bit(HCI_SERVICE_CACHE, &hdev->dev_flags)) {
1529 1530 1531
		hci_dev_unlock(hdev);
		cancel_delayed_work_sync(&hdev->service_cache);
		hci_dev_lock(hdev);
1532
		update_eir(hdev);
1533
	}
1534

1535
	err = update_class(hdev);
1536 1537
	if (err < 0)
		goto unlock;
1538

1539
	if (!test_bit(HCI_PENDING_CLASS, &hdev->dev_flags)) {
1540
		err = cmd_complete(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, 0,
1541
				   hdev->dev_class, 3);
1542 1543 1544 1545
		goto unlock;
	}

	cmd = mgmt_pending_add(sk, MGMT_OP_SET_DEV_CLASS, hdev, data, len);
1546
	if (!cmd)
1547
		err = -ENOMEM;
1548

1549
unlock:
1550
	hci_dev_unlock(hdev);
1551 1552 1553
	return err;
}

1554
static int load_link_keys(struct sock *sk, struct hci_dev *hdev, void *data,
1555
			  u16 len)
1556
{
1557
	struct mgmt_cp_load_link_keys *cp = data;
1558
	u16 key_count, expected_len;
1559
	int i;
1560

1561
	key_count = __le16_to_cpu(cp->key_count);
1562

1563 1564
	expected_len = sizeof(*cp) + key_count *
					sizeof(struct mgmt_link_key_info);
1565
	if (expected_len != len) {
1566
		BT_ERR("load_link_keys: expected %u bytes, got %u bytes",
1567
		       len, expected_len);
1568
		return cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS,
1569
				  MGMT_STATUS_INVALID_PARAMS);
1570 1571
	}

1572 1573 1574 1575
	if (cp->debug_keys != 0x00 && cp->debug_keys != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS,
				  MGMT_STATUS_INVALID_PARAMS);

1576
	BT_DBG("%s debug_keys %u key_count %u", hdev->name, cp->debug_keys,
1577
	       key_count);
1578

1579 1580 1581 1582 1583 1584 1585 1586
	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);
	}

1587
	hci_dev_lock(hdev);
1588 1589 1590

	hci_link_keys_clear(hdev);

1591
	set_bit(HCI_LINK_KEYS, &hdev->dev_flags);
1592 1593

	if (cp->debug_keys)
1594
		set_bit(HCI_DEBUG_KEYS, &hdev->dev_flags);
1595
	else
1596
		clear_bit(HCI_DEBUG_KEYS, &hdev->dev_flags);
1597

1598
	for (i = 0; i < key_count; i++) {
1599
		struct mgmt_link_key_info *key = &cp->keys[i];
1600

1601
		hci_add_link_key(hdev, NULL, 0, &key->addr.bdaddr, key->val,
1602
				 key->type, key->pin_len);
1603 1604
	}

1605
	cmd_complete(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS, 0, NULL, 0);
1606

1607
	hci_dev_unlock(hdev);
1608

1609
	return 0;
1610 1611
}

1612
static int device_unpaired(struct hci_dev *hdev, bdaddr_t *bdaddr,
1613
			   u8 addr_type, struct sock *skip_sk)
1614 1615 1616 1617 1618 1619 1620
{
	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),
1621
			  skip_sk);
1622 1623
}

1624
static int unpair_device(struct sock *sk, struct hci_dev *hdev, void *data,
1625
			 u16 len)
1626
{
1627 1628
	struct mgmt_cp_unpair_device *cp = data;
	struct mgmt_rp_unpair_device rp;
1629 1630
	struct hci_cp_disconnect dc;
	struct pending_cmd *cmd;
1631 1632 1633
	struct hci_conn *conn;
	int err;

1634
	memset(&rp, 0, sizeof(rp));
1635 1636
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;
1637

1638 1639 1640 1641 1642
	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));

1643 1644 1645 1646 1647
	if (cp->disconnect != 0x00 && cp->disconnect != 0x01)
		return cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
				    MGMT_STATUS_INVALID_PARAMS,
				    &rp, sizeof(rp));

1648 1649
	hci_dev_lock(hdev);

1650
	if (!hdev_is_powered(hdev)) {
1651
		err = cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
1652
				   MGMT_STATUS_NOT_POWERED, &rp, sizeof(rp));
1653 1654 1655
		goto unlock;
	}

1656
	if (cp->addr.type == BDADDR_BREDR)
1657 1658 1659
		err = hci_remove_link_key(hdev, &cp->addr.bdaddr);
	else
		err = hci_remove_ltk(hdev, &cp->addr.bdaddr);
1660

1661
	if (err < 0) {
1662
		err = cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
1663
				   MGMT_STATUS_NOT_PAIRED, &rp, sizeof(rp));
1664 1665 1666
		goto unlock;
	}

1667
	if (cp->disconnect) {
1668
		if (cp->addr.type == BDADDR_BREDR)
1669
			conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK,
1670
						       &cp->addr.bdaddr);
1671 1672
		else
			conn = hci_conn_hash_lookup_ba(hdev, LE_LINK,
1673
						       &cp->addr.bdaddr);
1674 1675 1676
	} else {
		conn = NULL;
	}
1677

1678
	if (!conn) {
1679
		err = cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE, 0,
1680
				   &rp, sizeof(rp));
1681
		device_unpaired(hdev, &cp->addr.bdaddr, cp->addr.type, sk);
1682 1683
		goto unlock;
	}
1684

1685
	cmd = mgmt_pending_add(sk, MGMT_OP_UNPAIR_DEVICE, hdev, cp,
1686
			       sizeof(*cp));
1687 1688 1689
	if (!cmd) {
		err = -ENOMEM;
		goto unlock;
1690 1691
	}

1692
	dc.handle = cpu_to_le16(conn->handle);
1693 1694 1695 1696 1697
	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);

1698
unlock:
1699
	hci_dev_unlock(hdev);
1700 1701 1702
	return err;
}

1703
static int disconnect(struct sock *sk, struct hci_dev *hdev, void *data,
1704
		      u16 len)
1705
{
1706
	struct mgmt_cp_disconnect *cp = data;
1707
	struct mgmt_rp_disconnect rp;
1708
	struct hci_cp_disconnect dc;
1709
	struct pending_cmd *cmd;
1710 1711 1712 1713 1714
	struct hci_conn *conn;
	int err;

	BT_DBG("");

1715 1716 1717 1718
	memset(&rp, 0, sizeof(rp));
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;

1719
	if (!bdaddr_type_is_valid(cp->addr.type))
1720 1721 1722
		return cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
				    MGMT_STATUS_INVALID_PARAMS,
				    &rp, sizeof(rp));
1723

1724
	hci_dev_lock(hdev);
1725 1726

	if (!test_bit(HCI_UP, &hdev->flags)) {
1727 1728
		err = cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
				   MGMT_STATUS_NOT_POWERED, &rp, sizeof(rp));
1729 1730 1731
		goto failed;
	}

1732
	if (mgmt_pending_find(MGMT_OP_DISCONNECT, hdev)) {
1733 1734
		err = cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
				   MGMT_STATUS_BUSY, &rp, sizeof(rp));
1735 1736 1737
		goto failed;
	}

1738
	if (cp->addr.type == BDADDR_BREDR)
1739 1740
		conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK,
					       &cp->addr.bdaddr);
1741 1742
	else
		conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &cp->addr.bdaddr);
1743

1744
	if (!conn || conn->state == BT_OPEN || conn->state == BT_CLOSED) {
1745 1746
		err = cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
				   MGMT_STATUS_NOT_CONNECTED, &rp, sizeof(rp));
1747 1748 1749
		goto failed;
	}

1750
	cmd = mgmt_pending_add(sk, MGMT_OP_DISCONNECT, hdev, data, len);
1751 1752
	if (!cmd) {
		err = -ENOMEM;
1753
		goto failed;
1754
	}
1755

1756
	dc.handle = cpu_to_le16(conn->handle);
1757
	dc.reason = HCI_ERROR_REMOTE_USER_TERM;
1758 1759 1760

	err = hci_send_cmd(hdev, HCI_OP_DISCONNECT, sizeof(dc), &dc);
	if (err < 0)
1761
		mgmt_pending_remove(cmd);
1762 1763

failed:
1764
	hci_dev_unlock(hdev);
1765 1766 1767
	return err;
}

1768
static u8 link_to_bdaddr(u8 link_type, u8 addr_type)
1769 1770 1771
{
	switch (link_type) {
	case LE_LINK:
1772 1773
		switch (addr_type) {
		case ADDR_LE_DEV_PUBLIC:
1774
			return BDADDR_LE_PUBLIC;
1775

1776
		default:
1777
			/* Fallback to LE Random address type */
1778
			return BDADDR_LE_RANDOM;
1779
		}
1780

1781
	default:
1782
		/* Fallback to BR/EDR type */
1783
		return BDADDR_BREDR;
1784 1785 1786
	}
}

1787 1788
static int get_connections(struct sock *sk, struct hci_dev *hdev, void *data,
			   u16 data_len)
1789 1790
{
	struct mgmt_rp_get_connections *rp;
1791
	struct hci_conn *c;
1792
	size_t rp_len;
1793 1794
	int err;
	u16 i;
1795 1796 1797

	BT_DBG("");

1798
	hci_dev_lock(hdev);
1799

1800
	if (!hdev_is_powered(hdev)) {
1801
		err = cmd_status(sk, hdev->id, MGMT_OP_GET_CONNECTIONS,
1802
				 MGMT_STATUS_NOT_POWERED);
1803 1804 1805
		goto unlock;
	}

1806
	i = 0;
1807 1808
	list_for_each_entry(c, &hdev->conn_hash.list, list) {
		if (test_bit(HCI_CONN_MGMT_CONNECTED, &c->flags))
1809
			i++;
1810 1811
	}

1812
	rp_len = sizeof(*rp) + (i * sizeof(struct mgmt_addr_info));
1813
	rp = kmalloc(rp_len, GFP_KERNEL);
1814
	if (!rp) {
1815 1816 1817 1818 1819
		err = -ENOMEM;
		goto unlock;
	}

	i = 0;
1820
	list_for_each_entry(c, &hdev->conn_hash.list, list) {
1821 1822
		if (!test_bit(HCI_CONN_MGMT_CONNECTED, &c->flags))
			continue;
1823
		bacpy(&rp->addr[i].bdaddr, &c->dst);
1824
		rp->addr[i].type = link_to_bdaddr(c->type, c->dst_type);
1825
		if (c->type == SCO_LINK || c->type == ESCO_LINK)
1826 1827 1828 1829
			continue;
		i++;
	}

1830
	rp->conn_count = cpu_to_le16(i);
1831

1832 1833
	/* Recalculate length in case of filtered SCO connections, etc */
	rp_len = sizeof(*rp) + (i * sizeof(struct mgmt_addr_info));
1834

1835
	err = cmd_complete(sk, hdev->id, MGMT_OP_GET_CONNECTIONS, 0, rp,
1836
			   rp_len);
1837

1838
	kfree(rp);
1839 1840

unlock:
1841
	hci_dev_unlock(hdev);
1842 1843 1844
	return err;
}

1845
static int send_pin_code_neg_reply(struct sock *sk, struct hci_dev *hdev,
1846
				   struct mgmt_cp_pin_code_neg_reply *cp)
1847 1848 1849 1850
{
	struct pending_cmd *cmd;
	int err;

1851
	cmd = mgmt_pending_add(sk, MGMT_OP_PIN_CODE_NEG_REPLY, hdev, cp,
1852
			       sizeof(*cp));
1853 1854 1855
	if (!cmd)
		return -ENOMEM;

1856
	err = hci_send_cmd(hdev, HCI_OP_PIN_CODE_NEG_REPLY,
1857
			   sizeof(cp->addr.bdaddr), &cp->addr.bdaddr);
1858 1859 1860 1861 1862 1863
	if (err < 0)
		mgmt_pending_remove(cmd);

	return err;
}

1864
static int pin_code_reply(struct sock *sk, struct hci_dev *hdev, void *data,
1865
			  u16 len)
1866
{
1867
	struct hci_conn *conn;
1868
	struct mgmt_cp_pin_code_reply *cp = data;
1869
	struct hci_cp_pin_code_reply reply;
1870
	struct pending_cmd *cmd;
1871 1872 1873 1874
	int err;

	BT_DBG("");

1875
	hci_dev_lock(hdev);
1876

1877
	if (!hdev_is_powered(hdev)) {
1878
		err = cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
1879
				 MGMT_STATUS_NOT_POWERED);
1880 1881 1882
		goto failed;
	}

1883
	conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->addr.bdaddr);
1884
	if (!conn) {
1885
		err = cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
1886
				 MGMT_STATUS_NOT_CONNECTED);
1887 1888 1889 1890
		goto failed;
	}

	if (conn->pending_sec_level == BT_SECURITY_HIGH && cp->pin_len != 16) {
1891 1892 1893
		struct mgmt_cp_pin_code_neg_reply ncp;

		memcpy(&ncp.addr, &cp->addr, sizeof(ncp.addr));
1894 1895 1896

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

1897
		err = send_pin_code_neg_reply(sk, hdev, &ncp);
1898
		if (err >= 0)
1899
			err = cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
1900
					 MGMT_STATUS_INVALID_PARAMS);
1901 1902 1903 1904

		goto failed;
	}

1905
	cmd = mgmt_pending_add(sk, MGMT_OP_PIN_CODE_REPLY, hdev, data, len);
1906 1907
	if (!cmd) {
		err = -ENOMEM;
1908
		goto failed;
1909
	}
1910

1911
	bacpy(&reply.bdaddr, &cp->addr.bdaddr);
1912
	reply.pin_len = cp->pin_len;
1913
	memcpy(reply.pin_code, cp->pin_code, sizeof(reply.pin_code));
1914 1915 1916

	err = hci_send_cmd(hdev, HCI_OP_PIN_CODE_REPLY, sizeof(reply), &reply);
	if (err < 0)
1917
		mgmt_pending_remove(cmd);
1918 1919

failed:
1920
	hci_dev_unlock(hdev);
1921 1922 1923
	return err;
}

1924 1925
static int set_io_capability(struct sock *sk, struct hci_dev *hdev, void *data,
			     u16 len)
1926
{
1927
	struct mgmt_cp_set_io_capability *cp = data;
1928 1929 1930

	BT_DBG("");

1931
	hci_dev_lock(hdev);
1932 1933 1934 1935

	hdev->io_capability = cp->io_capability;

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

1938
	hci_dev_unlock(hdev);
1939

1940 1941
	return cmd_complete(sk, hdev->id, MGMT_OP_SET_IO_CAPABILITY, 0, NULL,
			    0);
1942 1943
}

1944
static struct pending_cmd *find_pairing(struct hci_conn *conn)
1945 1946
{
	struct hci_dev *hdev = conn->hdev;
1947
	struct pending_cmd *cmd;
1948

1949
	list_for_each_entry(cmd, &hdev->mgmt_pending, list) {
1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966
		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;

1967
	bacpy(&rp.addr.bdaddr, &conn->dst);
1968
	rp.addr.type = link_to_bdaddr(conn->type, conn->dst_type);
1969

1970
	cmd_complete(cmd->sk, cmd->index, MGMT_OP_PAIR_DEVICE, status,
1971
		     &rp, sizeof(rp));
1972 1973 1974 1975 1976 1977 1978 1979

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

	hci_conn_put(conn);

1980
	mgmt_pending_remove(cmd);
1981 1982 1983 1984 1985 1986 1987 1988 1989
}

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

	BT_DBG("status %u", status);

	cmd = find_pairing(conn);
1990
	if (!cmd)
1991
		BT_DBG("Unable to find a pending command");
1992
	else
1993
		pairing_complete(cmd, mgmt_status(status));
1994 1995
}

1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011
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));
}

2012
static int pair_device(struct sock *sk, struct hci_dev *hdev, void *data,
2013
		       u16 len)
2014
{
2015
	struct mgmt_cp_pair_device *cp = data;
2016
	struct mgmt_rp_pair_device rp;
2017 2018 2019 2020 2021 2022 2023
	struct pending_cmd *cmd;
	u8 sec_level, auth_type;
	struct hci_conn *conn;
	int err;

	BT_DBG("");

2024 2025 2026 2027
	memset(&rp, 0, sizeof(rp));
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;

2028 2029 2030 2031 2032
	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));

2033
	hci_dev_lock(hdev);
2034

2035
	if (!hdev_is_powered(hdev)) {
2036 2037
		err = cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
				   MGMT_STATUS_NOT_POWERED, &rp, sizeof(rp));
2038 2039 2040
		goto unlock;
	}

2041 2042
	sec_level = BT_SECURITY_MEDIUM;
	if (cp->io_cap == 0x03)
2043
		auth_type = HCI_AT_DEDICATED_BONDING;
2044
	else
2045 2046
		auth_type = HCI_AT_DEDICATED_BONDING_MITM;

2047
	if (cp->addr.type == BDADDR_BREDR)
2048 2049
		conn = hci_connect(hdev, ACL_LINK, &cp->addr.bdaddr,
				   cp->addr.type, sec_level, auth_type);
2050
	else
2051 2052
		conn = hci_connect(hdev, LE_LINK, &cp->addr.bdaddr,
				   cp->addr.type, sec_level, auth_type);
2053

2054
	if (IS_ERR(conn)) {
2055 2056 2057 2058 2059 2060 2061
		int status;

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

2062
		err = cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
2063
				   status, &rp,
2064
				   sizeof(rp));
2065 2066 2067 2068 2069
		goto unlock;
	}

	if (conn->connect_cfm_cb) {
		hci_conn_put(conn);
2070
		err = cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
2071
				   MGMT_STATUS_BUSY, &rp, sizeof(rp));
2072 2073 2074
		goto unlock;
	}

2075
	cmd = mgmt_pending_add(sk, MGMT_OP_PAIR_DEVICE, hdev, data, len);
2076 2077 2078 2079 2080 2081
	if (!cmd) {
		err = -ENOMEM;
		hci_conn_put(conn);
		goto unlock;
	}

2082
	/* For LE, just connecting isn't a proof that the pairing finished */
2083
	if (cp->addr.type == BDADDR_BREDR)
2084
		conn->connect_cfm_cb = pairing_complete_cb;
2085 2086
	else
		conn->connect_cfm_cb = le_connect_complete_cb;
2087

2088 2089 2090 2091 2092 2093
	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 &&
2094
	    hci_conn_security(conn, sec_level, auth_type))
2095 2096 2097 2098 2099
		pairing_complete(cmd, 0);

	err = 0;

unlock:
2100
	hci_dev_unlock(hdev);
2101 2102 2103
	return err;
}

2104 2105
static int cancel_pair_device(struct sock *sk, struct hci_dev *hdev, void *data,
			      u16 len)
2106
{
2107
	struct mgmt_addr_info *addr = data;
2108 2109 2110 2111 2112 2113 2114 2115
	struct pending_cmd *cmd;
	struct hci_conn *conn;
	int err;

	BT_DBG("");

	hci_dev_lock(hdev);

2116
	if (!hdev_is_powered(hdev)) {
2117
		err = cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE,
2118
				 MGMT_STATUS_NOT_POWERED);
2119 2120 2121
		goto unlock;
	}

2122 2123
	cmd = mgmt_pending_find(MGMT_OP_PAIR_DEVICE, hdev);
	if (!cmd) {
2124
		err = cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE,
2125
				 MGMT_STATUS_INVALID_PARAMS);
2126 2127 2128 2129 2130 2131
		goto unlock;
	}

	conn = cmd->user_data;

	if (bacmp(&addr->bdaddr, &conn->dst) != 0) {
2132
		err = cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE,
2133
				 MGMT_STATUS_INVALID_PARAMS);
2134 2135 2136 2137 2138
		goto unlock;
	}

	pairing_complete(cmd, MGMT_STATUS_CANCELLED);

2139
	err = cmd_complete(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE, 0,
2140
			   addr, sizeof(*addr));
2141 2142 2143 2144 2145
unlock:
	hci_dev_unlock(hdev);
	return err;
}

2146
static int user_pairing_resp(struct sock *sk, struct hci_dev *hdev,
2147 2148
			     bdaddr_t *bdaddr, u8 type, u16 mgmt_op,
			     u16 hci_op, __le32 passkey)
2149 2150
{
	struct pending_cmd *cmd;
2151
	struct hci_conn *conn;
2152 2153
	int err;

2154
	hci_dev_lock(hdev);
2155

2156
	if (!hdev_is_powered(hdev)) {
2157
		err = cmd_status(sk, hdev->id, mgmt_op,
2158
				 MGMT_STATUS_NOT_POWERED);
2159
		goto done;
2160 2161
	}

2162
	if (type == BDADDR_BREDR)
2163 2164
		conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, bdaddr);
	else
2165
		conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, bdaddr);
2166 2167

	if (!conn) {
2168
		err = cmd_status(sk, hdev->id, mgmt_op,
2169
				 MGMT_STATUS_NOT_CONNECTED);
2170 2171
		goto done;
	}
2172

2173
	if (type == BDADDR_LE_PUBLIC || type == BDADDR_LE_RANDOM) {
2174
		/* Continue with pairing via SMP */
2175 2176 2177
		err = smp_user_confirm_reply(conn, mgmt_op, passkey);

		if (!err)
2178
			err = cmd_status(sk, hdev->id, mgmt_op,
2179
					 MGMT_STATUS_SUCCESS);
2180
		else
2181
			err = cmd_status(sk, hdev->id, mgmt_op,
2182
					 MGMT_STATUS_FAILED);
2183 2184 2185 2186

		goto done;
	}

2187
	cmd = mgmt_pending_add(sk, mgmt_op, hdev, bdaddr, sizeof(*bdaddr));
2188 2189
	if (!cmd) {
		err = -ENOMEM;
2190
		goto done;
2191 2192
	}

2193
	/* Continue with pairing via HCI */
2194 2195 2196 2197 2198 2199 2200 2201 2202
	if (hci_op == HCI_OP_USER_PASSKEY_REPLY) {
		struct hci_cp_user_passkey_reply cp;

		bacpy(&cp.bdaddr, bdaddr);
		cp.passkey = passkey;
		err = hci_send_cmd(hdev, hci_op, sizeof(cp), &cp);
	} else
		err = hci_send_cmd(hdev, hci_op, sizeof(*bdaddr), bdaddr);

2203 2204
	if (err < 0)
		mgmt_pending_remove(cmd);
2205

2206
done:
2207
	hci_dev_unlock(hdev);
2208 2209 2210
	return err;
}

2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222
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("");

	return user_pairing_resp(sk, hdev, &cp->addr.bdaddr, cp->addr.type,
				MGMT_OP_PIN_CODE_NEG_REPLY,
				HCI_OP_PIN_CODE_NEG_REPLY, 0);
}

2223 2224
static int user_confirm_reply(struct sock *sk, struct hci_dev *hdev, void *data,
			      u16 len)
2225
{
2226
	struct mgmt_cp_user_confirm_reply *cp = data;
2227 2228 2229 2230

	BT_DBG("");

	if (len != sizeof(*cp))
2231
		return cmd_status(sk, hdev->id, MGMT_OP_USER_CONFIRM_REPLY,
2232
				  MGMT_STATUS_INVALID_PARAMS);
2233

2234
	return user_pairing_resp(sk, hdev, &cp->addr.bdaddr, cp->addr.type,
2235 2236
				 MGMT_OP_USER_CONFIRM_REPLY,
				 HCI_OP_USER_CONFIRM_REPLY, 0);
2237 2238
}

2239
static int user_confirm_neg_reply(struct sock *sk, struct hci_dev *hdev,
2240
				  void *data, u16 len)
2241
{
2242
	struct mgmt_cp_user_confirm_neg_reply *cp = data;
2243 2244 2245

	BT_DBG("");

2246
	return user_pairing_resp(sk, hdev, &cp->addr.bdaddr, cp->addr.type,
2247 2248
				 MGMT_OP_USER_CONFIRM_NEG_REPLY,
				 HCI_OP_USER_CONFIRM_NEG_REPLY, 0);
2249 2250
}

2251 2252
static int user_passkey_reply(struct sock *sk, struct hci_dev *hdev, void *data,
			      u16 len)
2253
{
2254
	struct mgmt_cp_user_passkey_reply *cp = data;
2255 2256 2257

	BT_DBG("");

2258
	return user_pairing_resp(sk, hdev, &cp->addr.bdaddr, cp->addr.type,
2259 2260
				 MGMT_OP_USER_PASSKEY_REPLY,
				 HCI_OP_USER_PASSKEY_REPLY, cp->passkey);
2261 2262
}

2263
static int user_passkey_neg_reply(struct sock *sk, struct hci_dev *hdev,
2264
				  void *data, u16 len)
2265
{
2266
	struct mgmt_cp_user_passkey_neg_reply *cp = data;
2267 2268 2269

	BT_DBG("");

2270
	return user_pairing_resp(sk, hdev, &cp->addr.bdaddr, cp->addr.type,
2271 2272
				 MGMT_OP_USER_PASSKEY_NEG_REPLY,
				 HCI_OP_USER_PASSKEY_NEG_REPLY, 0);
2273 2274
}

2275 2276 2277 2278 2279 2280 2281 2282 2283
static int update_name(struct hci_dev *hdev, const char *name)
{
	struct hci_cp_write_local_name cp;

	memcpy(cp.name, name, sizeof(cp.name));

	return hci_send_cmd(hdev, HCI_OP_WRITE_LOCAL_NAME, sizeof(cp), &cp);
}

2284
static int set_local_name(struct sock *sk, struct hci_dev *hdev, void *data,
2285
			  u16 len)
2286
{
2287
	struct mgmt_cp_set_local_name *cp = data;
2288 2289 2290 2291 2292
	struct pending_cmd *cmd;
	int err;

	BT_DBG("");

2293
	hci_dev_lock(hdev);
2294

2295
	memcpy(hdev->short_name, cp->short_name, sizeof(hdev->short_name));
2296

2297
	if (!hdev_is_powered(hdev)) {
2298
		memcpy(hdev->dev_name, cp->name, sizeof(hdev->dev_name));
2299 2300

		err = cmd_complete(sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, 0,
2301
				   data, len);
2302 2303 2304 2305
		if (err < 0)
			goto failed;

		err = mgmt_event(MGMT_EV_LOCAL_NAME_CHANGED, hdev, data, len,
2306
				 sk);
2307

2308 2309 2310
		goto failed;
	}

2311
	cmd = mgmt_pending_add(sk, MGMT_OP_SET_LOCAL_NAME, hdev, data, len);
2312 2313 2314 2315 2316
	if (!cmd) {
		err = -ENOMEM;
		goto failed;
	}

2317
	err = update_name(hdev, cp->name);
2318 2319 2320 2321
	if (err < 0)
		mgmt_pending_remove(cmd);

failed:
2322
	hci_dev_unlock(hdev);
2323 2324 2325
	return err;
}

2326
static int read_local_oob_data(struct sock *sk, struct hci_dev *hdev,
2327
			       void *data, u16 data_len)
2328 2329 2330 2331
{
	struct pending_cmd *cmd;
	int err;

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

2334
	hci_dev_lock(hdev);
2335

2336
	if (!hdev_is_powered(hdev)) {
2337
		err = cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
2338
				 MGMT_STATUS_NOT_POWERED);
2339 2340 2341
		goto unlock;
	}

2342
	if (!lmp_ssp_capable(hdev)) {
2343
		err = cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
2344
				 MGMT_STATUS_NOT_SUPPORTED);
2345 2346 2347
		goto unlock;
	}

2348
	if (mgmt_pending_find(MGMT_OP_READ_LOCAL_OOB_DATA, hdev)) {
2349
		err = cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
2350
				 MGMT_STATUS_BUSY);
2351 2352 2353
		goto unlock;
	}

2354
	cmd = mgmt_pending_add(sk, MGMT_OP_READ_LOCAL_OOB_DATA, hdev, NULL, 0);
2355 2356 2357 2358 2359 2360 2361 2362 2363 2364
	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:
2365
	hci_dev_unlock(hdev);
2366 2367 2368
	return err;
}

2369
static int add_remote_oob_data(struct sock *sk, struct hci_dev *hdev,
2370
			       void *data, u16 len)
2371
{
2372
	struct mgmt_cp_add_remote_oob_data *cp = data;
2373
	u8 status;
2374 2375
	int err;

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

2378
	hci_dev_lock(hdev);
2379

2380
	err = hci_add_remote_oob_data(hdev, &cp->addr.bdaddr, cp->hash,
2381
				      cp->randomizer);
2382
	if (err < 0)
2383
		status = MGMT_STATUS_FAILED;
2384
	else
2385
		status = MGMT_STATUS_SUCCESS;
2386

2387
	err = cmd_complete(sk, hdev->id, MGMT_OP_ADD_REMOTE_OOB_DATA, status,
2388
			   &cp->addr, sizeof(cp->addr));
2389

2390
	hci_dev_unlock(hdev);
2391 2392 2393
	return err;
}

2394
static int remove_remote_oob_data(struct sock *sk, struct hci_dev *hdev,
2395
				  void *data, u16 len)
2396
{
2397
	struct mgmt_cp_remove_remote_oob_data *cp = data;
2398
	u8 status;
2399 2400
	int err;

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

2403
	hci_dev_lock(hdev);
2404

2405
	err = hci_remove_remote_oob_data(hdev, &cp->addr.bdaddr);
2406
	if (err < 0)
2407
		status = MGMT_STATUS_INVALID_PARAMS;
2408
	else
2409
		status = MGMT_STATUS_SUCCESS;
2410

2411
	err = cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_REMOTE_OOB_DATA,
2412
			   status, &cp->addr, sizeof(cp->addr));
2413

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

2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434
int mgmt_interleaved_discovery(struct hci_dev *hdev)
{
	int err;

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

	hci_dev_lock(hdev);

	err = hci_do_inquiry(hdev, INQUIRY_LEN_BREDR_LE);
	if (err < 0)
		hci_discovery_set_state(hdev, DISCOVERY_STOPPED);

	hci_dev_unlock(hdev);

	return err;
}

2435
static int start_discovery(struct sock *sk, struct hci_dev *hdev,
2436
			   void *data, u16 len)
2437
{
2438
	struct mgmt_cp_start_discovery *cp = data;
2439 2440 2441
	struct pending_cmd *cmd;
	int err;

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

2444
	hci_dev_lock(hdev);
2445

2446
	if (!hdev_is_powered(hdev)) {
2447
		err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
2448
				 MGMT_STATUS_NOT_POWERED);
2449 2450 2451
		goto failed;
	}

2452 2453 2454 2455 2456 2457
	if (test_bit(HCI_PERIODIC_INQ, &hdev->dev_flags)) {
		err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
				 MGMT_STATUS_BUSY);
		goto failed;
	}

2458
	if (hdev->discovery.state != DISCOVERY_STOPPED) {
2459
		err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
2460
				 MGMT_STATUS_BUSY);
2461 2462 2463
		goto failed;
	}

2464
	cmd = mgmt_pending_add(sk, MGMT_OP_START_DISCOVERY, hdev, NULL, 0);
2465 2466 2467 2468 2469
	if (!cmd) {
		err = -ENOMEM;
		goto failed;
	}

A
Andre Guedes 已提交
2470 2471 2472
	hdev->discovery.type = cp->type;

	switch (hdev->discovery.type) {
2473
	case DISCOV_TYPE_BREDR:
2474 2475 2476 2477 2478 2479 2480 2481
		if (!lmp_bredr_capable(hdev)) {
			err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
					 MGMT_STATUS_NOT_SUPPORTED);
			mgmt_pending_remove(cmd);
			goto failed;
		}

		err = hci_do_inquiry(hdev, INQUIRY_LEN_BREDR);
2482 2483 2484
		break;

	case DISCOV_TYPE_LE:
2485 2486 2487 2488 2489 2490 2491 2492 2493
		if (!lmp_host_le_capable(hdev)) {
			err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
					 MGMT_STATUS_NOT_SUPPORTED);
			mgmt_pending_remove(cmd);
			goto failed;
		}

		err = hci_le_scan(hdev, LE_SCAN_TYPE, LE_SCAN_INT,
				  LE_SCAN_WIN, LE_SCAN_TIMEOUT_LE_ONLY);
2494 2495
		break;

2496
	case DISCOV_TYPE_INTERLEAVED:
2497 2498 2499 2500 2501 2502 2503 2504 2505
		if (!lmp_host_le_capable(hdev) || !lmp_bredr_capable(hdev)) {
			err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
					 MGMT_STATUS_NOT_SUPPORTED);
			mgmt_pending_remove(cmd);
			goto failed;
		}

		err = hci_le_scan(hdev, LE_SCAN_TYPE, LE_SCAN_INT, LE_SCAN_WIN,
				  LE_SCAN_TIMEOUT_BREDR_LE);
2506 2507
		break;

2508
	default:
2509 2510 2511 2512
		err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
				 MGMT_STATUS_INVALID_PARAMS);
		mgmt_pending_remove(cmd);
		goto failed;
2513
	}
2514

2515 2516
	if (err < 0)
		mgmt_pending_remove(cmd);
2517 2518
	else
		hci_discovery_set_state(hdev, DISCOVERY_STARTING);
2519 2520

failed:
2521
	hci_dev_unlock(hdev);
2522 2523 2524
	return err;
}

2525
static int stop_discovery(struct sock *sk, struct hci_dev *hdev, void *data,
2526
			  u16 len)
2527
{
2528
	struct mgmt_cp_stop_discovery *mgmt_cp = data;
2529
	struct pending_cmd *cmd;
2530 2531
	struct hci_cp_remote_name_req_cancel cp;
	struct inquiry_entry *e;
2532 2533
	int err;

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

2536
	hci_dev_lock(hdev);
2537

2538
	if (!hci_discovery_active(hdev)) {
2539
		err = cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY,
2540 2541
				   MGMT_STATUS_REJECTED, &mgmt_cp->type,
				   sizeof(mgmt_cp->type));
2542 2543 2544 2545
		goto unlock;
	}

	if (hdev->discovery.type != mgmt_cp->type) {
2546
		err = cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY,
2547 2548
				   MGMT_STATUS_INVALID_PARAMS, &mgmt_cp->type,
				   sizeof(mgmt_cp->type));
2549
		goto unlock;
2550 2551
	}

2552
	cmd = mgmt_pending_add(sk, MGMT_OP_STOP_DISCOVERY, hdev, NULL, 0);
2553 2554
	if (!cmd) {
		err = -ENOMEM;
2555 2556 2557
		goto unlock;
	}

2558 2559
	switch (hdev->discovery.state) {
	case DISCOVERY_FINDING:
2560 2561 2562 2563 2564
		if (test_bit(HCI_INQUIRY, &hdev->flags))
			err = hci_cancel_inquiry(hdev);
		else
			err = hci_cancel_le_scan(hdev);

2565 2566 2567 2568
		break;

	case DISCOVERY_RESOLVING:
		e = hci_inquiry_cache_lookup_resolve(hdev, BDADDR_ANY,
2569
						     NAME_PENDING);
2570
		if (!e) {
2571
			mgmt_pending_remove(cmd);
2572 2573 2574 2575 2576 2577 2578
			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;
		}
2579

2580 2581 2582 2583 2584 2585 2586 2587 2588
		bacpy(&cp.bdaddr, &e->data.bdaddr);
		err = hci_send_cmd(hdev, HCI_OP_REMOTE_NAME_REQ_CANCEL,
				   sizeof(cp), &cp);

		break;

	default:
		BT_DBG("unknown discovery state %u", hdev->discovery.state);
		err = -EFAULT;
2589 2590 2591 2592
	}

	if (err < 0)
		mgmt_pending_remove(cmd);
2593 2594
	else
		hci_discovery_set_state(hdev, DISCOVERY_STOPPING);
2595

2596
unlock:
2597
	hci_dev_unlock(hdev);
2598 2599 2600
	return err;
}

2601
static int confirm_name(struct sock *sk, struct hci_dev *hdev, void *data,
2602
			u16 len)
2603
{
2604
	struct mgmt_cp_confirm_name *cp = data;
2605 2606 2607
	struct inquiry_entry *e;
	int err;

2608
	BT_DBG("%s", hdev->name);
2609 2610 2611

	hci_dev_lock(hdev);

2612
	if (!hci_discovery_active(hdev)) {
2613
		err = cmd_status(sk, hdev->id, MGMT_OP_CONFIRM_NAME,
2614
				 MGMT_STATUS_FAILED);
2615 2616 2617
		goto failed;
	}

2618
	e = hci_inquiry_cache_lookup_unknown(hdev, &cp->addr.bdaddr);
2619
	if (!e) {
2620
		err = cmd_status(sk, hdev->id, MGMT_OP_CONFIRM_NAME,
2621
				 MGMT_STATUS_INVALID_PARAMS);
2622 2623 2624 2625 2626 2627 2628 2629
		goto failed;
	}

	if (cp->name_known) {
		e->name_state = NAME_KNOWN;
		list_del(&e->list);
	} else {
		e->name_state = NAME_NEEDED;
2630
		hci_inquiry_cache_update_resolve(hdev, e);
2631 2632
	}

2633 2634
	err = cmd_complete(sk, hdev->id, MGMT_OP_CONFIRM_NAME, 0, &cp->addr,
			   sizeof(cp->addr));
2635 2636 2637 2638 2639 2640

failed:
	hci_dev_unlock(hdev);
	return err;
}

2641
static int block_device(struct sock *sk, struct hci_dev *hdev, void *data,
2642
			u16 len)
2643
{
2644
	struct mgmt_cp_block_device *cp = data;
2645
	u8 status;
2646 2647
	int err;

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

2650
	if (!bdaddr_type_is_valid(cp->addr.type))
2651 2652 2653
		return cmd_complete(sk, hdev->id, MGMT_OP_BLOCK_DEVICE,
				    MGMT_STATUS_INVALID_PARAMS,
				    &cp->addr, sizeof(cp->addr));
2654

2655
	hci_dev_lock(hdev);
2656

2657
	err = hci_blacklist_add(hdev, &cp->addr.bdaddr, cp->addr.type);
2658
	if (err < 0)
2659
		status = MGMT_STATUS_FAILED;
2660
	else
2661
		status = MGMT_STATUS_SUCCESS;
2662

2663
	err = cmd_complete(sk, hdev->id, MGMT_OP_BLOCK_DEVICE, status,
2664
			   &cp->addr, sizeof(cp->addr));
2665

2666
	hci_dev_unlock(hdev);
2667 2668 2669 2670

	return err;
}

2671
static int unblock_device(struct sock *sk, struct hci_dev *hdev, void *data,
2672
			  u16 len)
2673
{
2674
	struct mgmt_cp_unblock_device *cp = data;
2675
	u8 status;
2676 2677
	int err;

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

2680
	if (!bdaddr_type_is_valid(cp->addr.type))
2681 2682 2683
		return cmd_complete(sk, hdev->id, MGMT_OP_UNBLOCK_DEVICE,
				    MGMT_STATUS_INVALID_PARAMS,
				    &cp->addr, sizeof(cp->addr));
2684

2685
	hci_dev_lock(hdev);
2686

2687
	err = hci_blacklist_del(hdev, &cp->addr.bdaddr, cp->addr.type);
2688
	if (err < 0)
2689
		status = MGMT_STATUS_INVALID_PARAMS;
2690
	else
2691
		status = MGMT_STATUS_SUCCESS;
2692

2693
	err = cmd_complete(sk, hdev->id, MGMT_OP_UNBLOCK_DEVICE, status,
2694
			   &cp->addr, sizeof(cp->addr));
2695

2696
	hci_dev_unlock(hdev);
2697 2698 2699 2700

	return err;
}

2701 2702 2703 2704 2705
static int set_device_id(struct sock *sk, struct hci_dev *hdev, void *data,
			 u16 len)
{
	struct mgmt_cp_set_device_id *cp = data;
	int err;
2706
	__u16 source;
2707 2708 2709

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

2710 2711 2712 2713 2714 2715
	source = __le16_to_cpu(cp->source);

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

2716 2717
	hci_dev_lock(hdev);

2718
	hdev->devid_source = source;
2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731
	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);

	update_eir(hdev);

	hci_dev_unlock(hdev);

	return err;
}

2732
static int set_fast_connectable(struct sock *sk, struct hci_dev *hdev,
2733
				void *data, u16 len)
2734
{
2735
	struct mgmt_mode *cp = data;
2736 2737 2738 2739
	struct hci_cp_write_page_scan_activity acp;
	u8 type;
	int err;

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

2742 2743 2744 2745
	if (!lmp_bredr_capable(hdev))
		return cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
				  MGMT_STATUS_NOT_SUPPORTED);

2746 2747 2748 2749
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
				  MGMT_STATUS_INVALID_PARAMS);

2750
	if (!hdev_is_powered(hdev))
2751
		return cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
2752
				  MGMT_STATUS_NOT_POWERED);
2753 2754

	if (!test_bit(HCI_CONNECTABLE, &hdev->dev_flags))
2755
		return cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
2756
				  MGMT_STATUS_REJECTED);
2757 2758 2759

	hci_dev_lock(hdev);

2760
	if (cp->val) {
2761
		type = PAGE_SCAN_TYPE_INTERLACED;
2762

2763 2764
		/* 160 msec page scan interval */
		acp.interval = __constant_cpu_to_le16(0x0100);
2765 2766
	} else {
		type = PAGE_SCAN_TYPE_STANDARD;	/* default */
2767 2768 2769

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

2772 2773
	/* default 11.25 msec page scan window */
	acp.window = __constant_cpu_to_le16(0x0012);
2774

2775 2776
	err = hci_send_cmd(hdev, HCI_OP_WRITE_PAGE_SCAN_ACTIVITY, sizeof(acp),
			   &acp);
2777
	if (err < 0) {
2778
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
2779
				 MGMT_STATUS_FAILED);
2780 2781 2782 2783 2784
		goto done;
	}

	err = hci_send_cmd(hdev, HCI_OP_WRITE_PAGE_SCAN_TYPE, 1, &type);
	if (err < 0) {
2785
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
2786
				 MGMT_STATUS_FAILED);
2787 2788 2789
		goto done;
	}

2790
	err = cmd_complete(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE, 0,
2791
			   NULL, 0);
2792 2793 2794 2795 2796
done:
	hci_dev_unlock(hdev);
	return err;
}

2797 2798
static bool ltk_is_valid(struct mgmt_ltk_info *key)
{
2799 2800
	if (key->authenticated != 0x00 && key->authenticated != 0x01)
		return false;
2801 2802
	if (key->master != 0x00 && key->master != 0x01)
		return false;
2803 2804
	if (!bdaddr_type_is_le(key->addr.type))
		return false;
2805 2806 2807
	return true;
}

2808
static int load_long_term_keys(struct sock *sk, struct hci_dev *hdev,
2809
			       void *cp_data, u16 len)
2810 2811 2812
{
	struct mgmt_cp_load_long_term_keys *cp = cp_data;
	u16 key_count, expected_len;
2813
	int i, err;
2814

2815
	key_count = __le16_to_cpu(cp->key_count);
2816 2817 2818 2819 2820

	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",
2821
		       len, expected_len);
2822
		return cmd_status(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS,
2823
				  MGMT_STATUS_INVALID_PARAMS);
2824 2825
	}

2826
	BT_DBG("%s key_count %u", hdev->name, key_count);
2827

2828 2829 2830
	for (i = 0; i < key_count; i++) {
		struct mgmt_ltk_info *key = &cp->keys[i];

2831
		if (!ltk_is_valid(key))
2832 2833 2834 2835 2836
			return cmd_status(sk, hdev->id,
					  MGMT_OP_LOAD_LONG_TERM_KEYS,
					  MGMT_STATUS_INVALID_PARAMS);
	}

2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849
	hci_dev_lock(hdev);

	hci_smp_ltks_clear(hdev);

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

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

2850
		hci_add_ltk(hdev, &key->addr.bdaddr,
2851
			    bdaddr_to_le(key->addr.type),
2852 2853
			    type, 0, key->authenticated, key->val,
			    key->enc_size, key->ediv, key->rand);
2854 2855
	}

2856 2857 2858
	err = cmd_complete(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS, 0,
			   NULL, 0);

2859 2860
	hci_dev_unlock(hdev);

2861
	return err;
2862 2863
}

2864
static const struct mgmt_handler {
2865 2866
	int (*func) (struct sock *sk, struct hci_dev *hdev, void *data,
		     u16 data_len);
2867 2868
	bool var_len;
	size_t data_len;
2869 2870
} mgmt_handlers[] = {
	{ NULL }, /* 0x0000 (no command) */
2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909
	{ 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 },
2910
	{ set_device_id,          false, MGMT_SET_DEVICE_ID_SIZE },
2911 2912 2913
};


2914 2915
int mgmt_control(struct sock *sk, struct msghdr *msg, size_t msglen)
{
2916 2917
	void *buf;
	u8 *cp;
2918
	struct mgmt_hdr *hdr;
2919
	u16 opcode, index, len;
2920
	struct hci_dev *hdev = NULL;
2921
	const struct mgmt_handler *handler;
2922 2923 2924 2925 2926 2927 2928
	int err;

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

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

2929
	buf = kmalloc(msglen, GFP_KERNEL);
2930 2931 2932 2933 2934 2935 2936 2937
	if (!buf)
		return -ENOMEM;

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

2938
	hdr = buf;
2939 2940 2941
	opcode = __le16_to_cpu(hdr->opcode);
	index = __le16_to_cpu(hdr->index);
	len = __le16_to_cpu(hdr->len);
2942 2943 2944 2945 2946 2947

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

2948
	if (index != MGMT_INDEX_NONE) {
2949 2950 2951
		hdev = hci_dev_get(index);
		if (!hdev) {
			err = cmd_status(sk, index, opcode,
2952
					 MGMT_STATUS_INVALID_INDEX);
2953 2954 2955 2956
			goto done;
		}
	}

2957
	if (opcode >= ARRAY_SIZE(mgmt_handlers) ||
2958
	    mgmt_handlers[opcode].func == NULL) {
2959
		BT_DBG("Unknown op %u", opcode);
2960
		err = cmd_status(sk, index, opcode,
2961
				 MGMT_STATUS_UNKNOWN_COMMAND);
2962 2963 2964 2965
		goto done;
	}

	if ((hdev && opcode < MGMT_OP_READ_INFO) ||
2966
	    (!hdev && opcode >= MGMT_OP_READ_INFO)) {
2967
		err = cmd_status(sk, index, opcode,
2968
				 MGMT_STATUS_INVALID_INDEX);
2969
		goto done;
2970 2971
	}

2972 2973 2974
	handler = &mgmt_handlers[opcode];

	if ((handler->var_len && len < handler->data_len) ||
2975
	    (!handler->var_len && len != handler->data_len)) {
2976
		err = cmd_status(sk, index, opcode,
2977
				 MGMT_STATUS_INVALID_PARAMS);
2978 2979 2980
		goto done;
	}

2981 2982 2983 2984 2985
	if (hdev)
		mgmt_init_hdev(sk, hdev);

	cp = buf + sizeof(*hdr);

2986
	err = handler->func(sk, hdev, cp, len);
2987 2988 2989
	if (err < 0)
		goto done;

2990 2991 2992
	err = msglen;

done:
2993 2994 2995
	if (hdev)
		hci_dev_put(hdev);

2996 2997 2998
	kfree(buf);
	return err;
}
2999

3000 3001 3002 3003 3004 3005 3006 3007
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);
}

3008
int mgmt_index_added(struct hci_dev *hdev)
3009
{
3010 3011 3012
	if (!mgmt_valid_hdev(hdev))
		return -ENOTSUPP;

3013
	return mgmt_event(MGMT_EV_INDEX_ADDED, hdev, NULL, 0, NULL);
3014 3015
}

3016
int mgmt_index_removed(struct hci_dev *hdev)
3017
{
3018
	u8 status = MGMT_STATUS_INVALID_INDEX;
3019

3020 3021 3022
	if (!mgmt_valid_hdev(hdev))
		return -ENOTSUPP;

3023
	mgmt_pending_foreach(0, hdev, cmd_status_rsp, &status);
3024

3025
	return mgmt_event(MGMT_EV_INDEX_REMOVED, hdev, NULL, 0, NULL);
3026 3027
}

3028
struct cmd_lookup {
3029
	struct sock *sk;
3030
	struct hci_dev *hdev;
3031
	u8 mgmt_status;
3032 3033
};

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

3038
	send_settings_rsp(cmd->sk, cmd->opcode, match->hdev);
3039 3040 3041 3042 3043 3044 3045 3046 3047

	list_del(&cmd->list);

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

	mgmt_pending_free(cmd);
3048
}
3049

3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064
static int set_bredr_scan(struct hci_dev *hdev)
{
	u8 scan = 0;

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

	if (!scan)
		return 0;

	return hci_send_cmd(hdev, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);
}

3065
int mgmt_powered(struct hci_dev *hdev, u8 powered)
3066
{
3067
	struct cmd_lookup match = { NULL, hdev };
3068
	int err;
3069

3070 3071 3072
	if (!test_bit(HCI_MGMT, &hdev->dev_flags))
		return 0;

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

3075
	if (powered) {
3076 3077
		u8 link_sec;

3078 3079
		if (test_bit(HCI_SSP_ENABLED, &hdev->dev_flags) &&
		    !lmp_host_ssp_capable(hdev)) {
3080 3081 3082 3083 3084
			u8 ssp = 1;

			hci_send_cmd(hdev, HCI_OP_WRITE_SSP_MODE, 1, &ssp);
		}

3085 3086 3087 3088
		if (test_bit(HCI_LE_ENABLED, &hdev->dev_flags)) {
			struct hci_cp_write_le_host_supported cp;

			cp.le = 1;
3089
			cp.simul = lmp_le_br_capable(hdev);
3090

3091 3092 3093
			/* Check first if we already have the right
			 * host state (host features set)
			 */
3094 3095
			if (cp.le != lmp_host_le_capable(hdev) ||
			    cp.simul != lmp_host_le_br_capable(hdev))
3096 3097 3098
				hci_send_cmd(hdev,
					     HCI_OP_WRITE_LE_HOST_SUPPORTED,
					     sizeof(cp), &cp);
3099 3100
		}

3101 3102 3103 3104 3105
		link_sec = test_bit(HCI_LINK_SECURITY, &hdev->dev_flags);
		if (link_sec != test_bit(HCI_AUTH, &hdev->flags))
			hci_send_cmd(hdev, HCI_OP_WRITE_AUTH_ENABLE,
				     sizeof(link_sec), &link_sec);

3106 3107 3108 3109 3110 3111
		if (lmp_bredr_capable(hdev)) {
			set_bredr_scan(hdev);
			update_class(hdev);
			update_name(hdev, hdev->dev_name);
			update_eir(hdev);
		}
3112
	} else {
3113
		u8 status = MGMT_STATUS_NOT_POWERED;
3114 3115
		u8 zero_cod[] = { 0, 0, 0 };

3116
		mgmt_pending_foreach(0, hdev, cmd_status_rsp, &status);
3117 3118 3119 3120

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

3123
	err = new_settings(hdev, match.sk);
3124 3125 3126 3127

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

3128
	return err;
3129
}
3130

3131
int mgmt_discoverable(struct hci_dev *hdev, u8 discoverable)
3132
{
3133
	struct cmd_lookup match = { NULL, hdev };
3134 3135
	bool changed = false;
	int err = 0;
3136

3137 3138 3139 3140 3141 3142 3143
	if (discoverable) {
		if (!test_and_set_bit(HCI_DISCOVERABLE, &hdev->dev_flags))
			changed = true;
	} else {
		if (test_and_clear_bit(HCI_DISCOVERABLE, &hdev->dev_flags))
			changed = true;
	}
3144

3145
	mgmt_pending_foreach(MGMT_OP_SET_DISCOVERABLE, hdev, settings_rsp,
3146
			     &match);
3147

3148 3149
	if (changed)
		err = new_settings(hdev, match.sk);
3150

3151 3152 3153
	if (match.sk)
		sock_put(match.sk);

3154
	return err;
3155
}
3156

3157
int mgmt_connectable(struct hci_dev *hdev, u8 connectable)
3158
{
3159
	struct cmd_lookup match = { NULL, hdev };
3160 3161
	bool changed = false;
	int err = 0;
3162

3163 3164 3165 3166 3167 3168 3169
	if (connectable) {
		if (!test_and_set_bit(HCI_CONNECTABLE, &hdev->dev_flags))
			changed = true;
	} else {
		if (test_and_clear_bit(HCI_CONNECTABLE, &hdev->dev_flags))
			changed = true;
	}
3170

3171
	mgmt_pending_foreach(MGMT_OP_SET_CONNECTABLE, hdev, settings_rsp,
3172
			     &match);
3173

3174 3175
	if (changed)
		err = new_settings(hdev, match.sk);
3176 3177 3178 3179

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

3180
	return err;
3181
}
3182

3183
int mgmt_write_scan_failed(struct hci_dev *hdev, u8 scan, u8 status)
3184
{
3185 3186
	u8 mgmt_err = mgmt_status(status);

3187
	if (scan & SCAN_PAGE)
3188
		mgmt_pending_foreach(MGMT_OP_SET_CONNECTABLE, hdev,
3189
				     cmd_status_rsp, &mgmt_err);
3190 3191

	if (scan & SCAN_INQUIRY)
3192
		mgmt_pending_foreach(MGMT_OP_SET_DISCOVERABLE, hdev,
3193
				     cmd_status_rsp, &mgmt_err);
3194 3195 3196 3197

	return 0;
}

3198 3199
int mgmt_new_link_key(struct hci_dev *hdev, struct link_key *key,
		      bool persistent)
3200
{
3201
	struct mgmt_ev_new_link_key ev;
3202

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

3205
	ev.store_hint = persistent;
3206
	bacpy(&ev.key.addr.bdaddr, &key->bdaddr);
3207
	ev.key.addr.type = BDADDR_BREDR;
3208
	ev.key.type = key->type;
3209
	memcpy(ev.key.val, key->val, HCI_LINK_KEY_SIZE);
3210
	ev.key.pin_len = key->pin_len;
3211

3212
	return mgmt_event(MGMT_EV_NEW_LINK_KEY, hdev, &ev, sizeof(ev), NULL);
3213
}
3214

3215 3216 3217 3218 3219 3220 3221 3222
int mgmt_new_ltk(struct hci_dev *hdev, struct smp_ltk *key, u8 persistent)
{
	struct mgmt_ev_new_long_term_key ev;

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

	ev.store_hint = persistent;
	bacpy(&ev.key.addr.bdaddr, &key->bdaddr);
3223
	ev.key.addr.type = link_to_bdaddr(LE_LINK, key->bdaddr_type);
3224 3225 3226 3227 3228 3229 3230 3231 3232 3233
	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));

3234 3235
	return mgmt_event(MGMT_EV_NEW_LONG_TERM_KEY, hdev, &ev, sizeof(ev),
			  NULL);
3236 3237
}

3238
int mgmt_device_connected(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
3239 3240
			  u8 addr_type, u32 flags, u8 *name, u8 name_len,
			  u8 *dev_class)
3241
{
3242 3243 3244
	char buf[512];
	struct mgmt_ev_device_connected *ev = (void *) buf;
	u16 eir_len = 0;
3245

3246
	bacpy(&ev->addr.bdaddr, bdaddr);
3247
	ev->addr.type = link_to_bdaddr(link_type, addr_type);
3248

3249
	ev->flags = __cpu_to_le32(flags);
3250

3251 3252
	if (name_len > 0)
		eir_len = eir_append_data(ev->eir, 0, EIR_NAME_COMPLETE,
3253
					  name, name_len);
3254 3255

	if (dev_class && memcmp(dev_class, "\0\0\0", 3) != 0)
3256
		eir_len = eir_append_data(ev->eir, eir_len,
3257
					  EIR_CLASS_OF_DEV, dev_class, 3);
3258

3259
	ev->eir_len = cpu_to_le16(eir_len);
3260 3261

	return mgmt_event(MGMT_EV_DEVICE_CONNECTED, hdev, buf,
3262
			  sizeof(*ev) + eir_len, NULL);
3263 3264
}

3265 3266
static void disconnect_rsp(struct pending_cmd *cmd, void *data)
{
3267
	struct mgmt_cp_disconnect *cp = cmd->param;
3268
	struct sock **sk = data;
3269
	struct mgmt_rp_disconnect rp;
3270

3271 3272
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;
3273

3274
	cmd_complete(cmd->sk, cmd->index, MGMT_OP_DISCONNECT, 0, &rp,
3275
		     sizeof(rp));
3276 3277 3278 3279

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

3280
	mgmt_pending_remove(cmd);
3281 3282
}

3283
static void unpair_device_rsp(struct pending_cmd *cmd, void *data)
3284
{
3285
	struct hci_dev *hdev = data;
3286 3287
	struct mgmt_cp_unpair_device *cp = cmd->param;
	struct mgmt_rp_unpair_device rp;
3288 3289

	memset(&rp, 0, sizeof(rp));
3290 3291
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;
3292

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

3295
	cmd_complete(cmd->sk, cmd->index, cmd->opcode, 0, &rp, sizeof(rp));
3296 3297 3298 3299

	mgmt_pending_remove(cmd);
}

3300
int mgmt_device_disconnected(struct hci_dev *hdev, bdaddr_t *bdaddr,
3301
			     u8 link_type, u8 addr_type, u8 reason)
3302
{
3303
	struct mgmt_ev_device_disconnected ev;
3304 3305 3306
	struct sock *sk = NULL;
	int err;

3307
	mgmt_pending_foreach(MGMT_OP_DISCONNECT, hdev, disconnect_rsp, &sk);
3308

3309 3310 3311
	bacpy(&ev.addr.bdaddr, bdaddr);
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
	ev.reason = reason;
3312

3313
	err = mgmt_event(MGMT_EV_DEVICE_DISCONNECTED, hdev, &ev, sizeof(ev),
3314
			 sk);
3315 3316

	if (sk)
3317
		sock_put(sk);
3318

3319
	mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE, hdev, unpair_device_rsp,
3320
			     hdev);
3321

3322 3323 3324
	return err;
}

3325
int mgmt_disconnect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr,
3326
			   u8 link_type, u8 addr_type, u8 status)
3327
{
3328
	struct mgmt_rp_disconnect rp;
3329 3330 3331
	struct pending_cmd *cmd;
	int err;

3332 3333 3334
	mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE, hdev, unpair_device_rsp,
			     hdev);

3335
	cmd = mgmt_pending_find(MGMT_OP_DISCONNECT, hdev);
3336 3337 3338
	if (!cmd)
		return -ENOENT;

3339
	bacpy(&rp.addr.bdaddr, bdaddr);
3340
	rp.addr.type = link_to_bdaddr(link_type, addr_type);
3341

3342
	err = cmd_complete(cmd->sk, cmd->index, MGMT_OP_DISCONNECT,
3343
			   mgmt_status(status), &rp, sizeof(rp));
3344

3345
	mgmt_pending_remove(cmd);
3346 3347

	return err;
3348
}
3349

3350
int mgmt_connect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
3351
			u8 addr_type, u8 status)
3352 3353 3354
{
	struct mgmt_ev_connect_failed ev;

3355
	bacpy(&ev.addr.bdaddr, bdaddr);
3356
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
3357
	ev.status = mgmt_status(status);
3358

3359
	return mgmt_event(MGMT_EV_CONNECT_FAILED, hdev, &ev, sizeof(ev), NULL);
3360
}
3361

3362
int mgmt_pin_code_request(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 secure)
3363 3364 3365
{
	struct mgmt_ev_pin_code_request ev;

3366
	bacpy(&ev.addr.bdaddr, bdaddr);
3367
	ev.addr.type = BDADDR_BREDR;
3368
	ev.secure = secure;
3369

3370
	return mgmt_event(MGMT_EV_PIN_CODE_REQUEST, hdev, &ev, sizeof(ev),
3371
			  NULL);
3372 3373
}

3374
int mgmt_pin_code_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
3375
				 u8 status)
3376 3377
{
	struct pending_cmd *cmd;
3378
	struct mgmt_rp_pin_code_reply rp;
3379 3380
	int err;

3381
	cmd = mgmt_pending_find(MGMT_OP_PIN_CODE_REPLY, hdev);
3382 3383 3384
	if (!cmd)
		return -ENOENT;

3385
	bacpy(&rp.addr.bdaddr, bdaddr);
3386
	rp.addr.type = BDADDR_BREDR;
3387

3388
	err = cmd_complete(cmd->sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
3389
			   mgmt_status(status), &rp, sizeof(rp));
3390

3391
	mgmt_pending_remove(cmd);
3392 3393 3394 3395

	return err;
}

3396
int mgmt_pin_code_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
3397
				     u8 status)
3398 3399
{
	struct pending_cmd *cmd;
3400
	struct mgmt_rp_pin_code_reply rp;
3401 3402
	int err;

3403
	cmd = mgmt_pending_find(MGMT_OP_PIN_CODE_NEG_REPLY, hdev);
3404 3405 3406
	if (!cmd)
		return -ENOENT;

3407
	bacpy(&rp.addr.bdaddr, bdaddr);
3408
	rp.addr.type = BDADDR_BREDR;
3409

3410
	err = cmd_complete(cmd->sk, hdev->id, MGMT_OP_PIN_CODE_NEG_REPLY,
3411
			   mgmt_status(status), &rp, sizeof(rp));
3412

3413
	mgmt_pending_remove(cmd);
3414 3415 3416

	return err;
}
3417

3418
int mgmt_user_confirm_request(struct hci_dev *hdev, bdaddr_t *bdaddr,
3419 3420
			      u8 link_type, u8 addr_type, __le32 value,
			      u8 confirm_hint)
3421 3422 3423
{
	struct mgmt_ev_user_confirm_request ev;

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

3426
	bacpy(&ev.addr.bdaddr, bdaddr);
3427
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
3428
	ev.confirm_hint = confirm_hint;
3429
	ev.value = value;
3430

3431
	return mgmt_event(MGMT_EV_USER_CONFIRM_REQUEST, hdev, &ev, sizeof(ev),
3432
			  NULL);
3433 3434
}

3435
int mgmt_user_passkey_request(struct hci_dev *hdev, bdaddr_t *bdaddr,
3436
			      u8 link_type, u8 addr_type)
3437 3438 3439 3440 3441
{
	struct mgmt_ev_user_passkey_request ev;

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

3442
	bacpy(&ev.addr.bdaddr, bdaddr);
3443
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
3444 3445

	return mgmt_event(MGMT_EV_USER_PASSKEY_REQUEST, hdev, &ev, sizeof(ev),
3446
			  NULL);
3447 3448
}

3449
static int user_pairing_resp_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
3450 3451
				      u8 link_type, u8 addr_type, u8 status,
				      u8 opcode)
3452 3453 3454 3455 3456
{
	struct pending_cmd *cmd;
	struct mgmt_rp_user_confirm_reply rp;
	int err;

3457
	cmd = mgmt_pending_find(opcode, hdev);
3458 3459 3460
	if (!cmd)
		return -ENOENT;

3461
	bacpy(&rp.addr.bdaddr, bdaddr);
3462
	rp.addr.type = link_to_bdaddr(link_type, addr_type);
3463
	err = cmd_complete(cmd->sk, hdev->id, opcode, mgmt_status(status),
3464
			   &rp, sizeof(rp));
3465

3466
	mgmt_pending_remove(cmd);
3467 3468 3469 3470

	return err;
}

3471
int mgmt_user_confirm_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
3472
				     u8 link_type, u8 addr_type, u8 status)
3473
{
3474
	return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
3475
					  status, MGMT_OP_USER_CONFIRM_REPLY);
3476 3477
}

3478
int mgmt_user_confirm_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
3479
					 u8 link_type, u8 addr_type, u8 status)
3480
{
3481
	return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
3482 3483
					  status,
					  MGMT_OP_USER_CONFIRM_NEG_REPLY);
3484
}
3485

3486
int mgmt_user_passkey_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
3487
				     u8 link_type, u8 addr_type, u8 status)
3488
{
3489
	return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
3490
					  status, MGMT_OP_USER_PASSKEY_REPLY);
3491 3492
}

3493
int mgmt_user_passkey_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
3494
					 u8 link_type, u8 addr_type, u8 status)
3495
{
3496
	return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
3497 3498
					  status,
					  MGMT_OP_USER_PASSKEY_NEG_REPLY);
3499 3500
}

3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516
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);
}

3517
int mgmt_auth_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
3518
		     u8 addr_type, u8 status)
3519 3520 3521
{
	struct mgmt_ev_auth_failed ev;

3522
	bacpy(&ev.addr.bdaddr, bdaddr);
3523
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
3524
	ev.status = mgmt_status(status);
3525

3526
	return mgmt_event(MGMT_EV_AUTH_FAILED, hdev, &ev, sizeof(ev), NULL);
3527
}
3528

3529 3530 3531
int mgmt_auth_enable_complete(struct hci_dev *hdev, u8 status)
{
	struct cmd_lookup match = { NULL, hdev };
3532 3533
	bool changed = false;
	int err = 0;
3534 3535 3536 3537

	if (status) {
		u8 mgmt_err = mgmt_status(status);
		mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev,
3538
				     cmd_status_rsp, &mgmt_err);
3539 3540 3541
		return 0;
	}

3542 3543 3544 3545 3546 3547 3548 3549
	if (test_bit(HCI_AUTH, &hdev->flags)) {
		if (!test_and_set_bit(HCI_LINK_SECURITY, &hdev->dev_flags))
			changed = true;
	} else {
		if (test_and_clear_bit(HCI_LINK_SECURITY, &hdev->dev_flags))
			changed = true;
	}

3550
	mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev, settings_rsp,
3551
			     &match);
3552

3553 3554
	if (changed)
		err = new_settings(hdev, match.sk);
3555 3556 3557 3558 3559 3560 3561

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

	return err;
}

3562 3563 3564 3565
static int clear_eir(struct hci_dev *hdev)
{
	struct hci_cp_write_eir cp;

3566
	if (!lmp_ext_inq_capable(hdev))
3567 3568
		return 0;

3569 3570
	memset(hdev->eir, 0, sizeof(hdev->eir));

3571 3572 3573 3574 3575
	memset(&cp, 0, sizeof(cp));

	return hci_send_cmd(hdev, HCI_OP_WRITE_EIR, sizeof(cp), &cp);
}

3576
int mgmt_ssp_enable_complete(struct hci_dev *hdev, u8 enable, u8 status)
3577 3578
{
	struct cmd_lookup match = { NULL, hdev };
3579 3580
	bool changed = false;
	int err = 0;
3581 3582 3583

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

		if (enable && test_and_clear_bit(HCI_SSP_ENABLED,
3586
						 &hdev->dev_flags))
3587 3588
			err = new_settings(hdev, NULL);

3589 3590
		mgmt_pending_foreach(MGMT_OP_SET_SSP, hdev, cmd_status_rsp,
				     &mgmt_err);
3591 3592 3593 3594 3595 3596 3597 3598 3599 3600

		return err;
	}

	if (enable) {
		if (!test_and_set_bit(HCI_SSP_ENABLED, &hdev->dev_flags))
			changed = true;
	} else {
		if (test_and_clear_bit(HCI_SSP_ENABLED, &hdev->dev_flags))
			changed = true;
3601 3602 3603 3604
	}

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

3605 3606
	if (changed)
		err = new_settings(hdev, match.sk);
3607

3608
	if (match.sk)
3609 3610
		sock_put(match.sk);

3611 3612 3613 3614
	if (test_bit(HCI_SSP_ENABLED, &hdev->dev_flags))
		update_eir(hdev);
	else
		clear_eir(hdev);
3615

3616 3617 3618
	return err;
}

3619 3620 3621 3622 3623
static void class_rsp(struct pending_cmd *cmd, void *data)
{
	struct cmd_lookup *match = data;

	cmd_complete(cmd->sk, cmd->index, cmd->opcode, match->mgmt_status,
3624
		     match->hdev->dev_class, 3);
3625 3626 3627 3628 3629 3630 3631 3632 3633 3634 3635

	list_del(&cmd->list);

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

	mgmt_pending_free(cmd);
}

3636
int mgmt_set_class_of_dev_complete(struct hci_dev *hdev, u8 *dev_class,
3637
				   u8 status)
3638
{
3639 3640
	struct cmd_lookup match = { NULL, hdev, mgmt_status(status) };
	int err = 0;
3641

3642 3643
	clear_bit(HCI_PENDING_CLASS, &hdev->dev_flags);

3644 3645 3646 3647 3648
	mgmt_pending_foreach(MGMT_OP_SET_DEV_CLASS, hdev, class_rsp, &match);
	mgmt_pending_foreach(MGMT_OP_ADD_UUID, hdev, class_rsp, &match);
	mgmt_pending_foreach(MGMT_OP_REMOVE_UUID, hdev, class_rsp, &match);

	if (!status)
3649 3650
		err = mgmt_event(MGMT_EV_CLASS_OF_DEV_CHANGED, hdev, dev_class,
				 3, NULL);
3651 3652 3653

	if (match.sk)
		sock_put(match.sk);
3654 3655 3656 3657

	return err;
}

3658
int mgmt_set_local_name_complete(struct hci_dev *hdev, u8 *name, u8 status)
3659 3660 3661
{
	struct pending_cmd *cmd;
	struct mgmt_cp_set_local_name ev;
3662 3663 3664 3665 3666 3667 3668
	bool changed = false;
	int err = 0;

	if (memcmp(name, hdev->dev_name, sizeof(hdev->dev_name)) != 0) {
		memcpy(hdev->dev_name, name, sizeof(hdev->dev_name));
		changed = true;
	}
3669 3670 3671

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

3674
	cmd = mgmt_pending_find(MGMT_OP_SET_LOCAL_NAME, hdev);
3675 3676 3677
	if (!cmd)
		goto send_event;

3678 3679 3680 3681
	/* Always assume that either the short or the complete name has
	 * changed if there was a pending mgmt command */
	changed = true;

3682
	if (status) {
3683
		err = cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_LOCAL_NAME,
3684
				 mgmt_status(status));
3685 3686 3687
		goto failed;
	}

3688
	err = cmd_complete(cmd->sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, 0, &ev,
3689
			   sizeof(ev));
3690 3691 3692 3693
	if (err < 0)
		goto failed;

send_event:
3694 3695
	if (changed)
		err = mgmt_event(MGMT_EV_LOCAL_NAME_CHANGED, hdev, &ev,
3696
				 sizeof(ev), cmd ? cmd->sk : NULL);
3697

3698 3699 3700 3701 3702 3703
	/* EIR is taken care of separately when powering on the
	 * adapter so only update them here if this is a name change
	 * unrelated to power on.
	 */
	if (!test_bit(HCI_INIT, &hdev->flags))
		update_eir(hdev);
3704 3705 3706 3707 3708 3709

failed:
	if (cmd)
		mgmt_pending_remove(cmd);
	return err;
}
3710

3711
int mgmt_read_local_oob_data_reply_complete(struct hci_dev *hdev, u8 *hash,
3712
					    u8 *randomizer, u8 status)
3713 3714 3715 3716
{
	struct pending_cmd *cmd;
	int err;

3717
	BT_DBG("%s status %u", hdev->name, status);
3718

3719
	cmd = mgmt_pending_find(MGMT_OP_READ_LOCAL_OOB_DATA, hdev);
3720 3721 3722 3723
	if (!cmd)
		return -ENOENT;

	if (status) {
3724 3725
		err = cmd_status(cmd->sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
				 mgmt_status(status));
3726 3727 3728 3729 3730 3731
	} else {
		struct mgmt_rp_read_local_oob_data rp;

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

3732
		err = cmd_complete(cmd->sk, hdev->id,
3733 3734
				   MGMT_OP_READ_LOCAL_OOB_DATA, 0, &rp,
				   sizeof(rp));
3735 3736 3737 3738 3739 3740
	}

	mgmt_pending_remove(cmd);

	return err;
}
3741

3742 3743 3744 3745 3746 3747 3748 3749 3750 3751
int mgmt_le_enable_complete(struct hci_dev *hdev, u8 enable, u8 status)
{
	struct cmd_lookup match = { NULL, hdev };
	bool changed = false;
	int err = 0;

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

		if (enable && test_and_clear_bit(HCI_LE_ENABLED,
3752
						 &hdev->dev_flags))
3753
			err = new_settings(hdev, NULL);
3754

3755 3756
		mgmt_pending_foreach(MGMT_OP_SET_LE, hdev, cmd_status_rsp,
				     &mgmt_err);
3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 3775 3776 3777 3778 3779

		return err;
	}

	if (enable) {
		if (!test_and_set_bit(HCI_LE_ENABLED, &hdev->dev_flags))
			changed = true;
	} else {
		if (test_and_clear_bit(HCI_LE_ENABLED, &hdev->dev_flags))
			changed = true;
	}

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

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

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

	return err;
}

3780
int mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
3781 3782
		      u8 addr_type, u8 *dev_class, s8 rssi, u8 cfm_name, u8
		      ssp, u8 *eir, u16 eir_len)
3783
{
3784 3785
	char buf[512];
	struct mgmt_ev_device_found *ev = (void *) buf;
3786
	size_t ev_size;
3787

3788 3789
	/* Leave 5 bytes for a potential CoD field */
	if (sizeof(*ev) + eir_len + 5 > sizeof(buf))
3790 3791
		return -EINVAL;

3792 3793
	memset(buf, 0, sizeof(buf));

3794
	bacpy(&ev->addr.bdaddr, bdaddr);
3795
	ev->addr.type = link_to_bdaddr(link_type, addr_type);
3796
	ev->rssi = rssi;
3797
	if (cfm_name)
3798
		ev->flags |= __constant_cpu_to_le32(MGMT_DEV_FOUND_CONFIRM_NAME);
3799
	if (!ssp)
3800
		ev->flags |= __constant_cpu_to_le32(MGMT_DEV_FOUND_LEGACY_PAIRING);
3801

3802
	if (eir_len > 0)
3803
		memcpy(ev->eir, eir, eir_len);
3804

3805 3806
	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,
3807
					  dev_class, 3);
3808

3809
	ev->eir_len = cpu_to_le16(eir_len);
3810
	ev_size = sizeof(*ev) + eir_len;
3811

3812
	return mgmt_event(MGMT_EV_DEVICE_FOUND, hdev, ev, ev_size, NULL);
3813
}
3814

3815
int mgmt_remote_name(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
3816
		     u8 addr_type, s8 rssi, u8 *name, u8 name_len)
3817
{
3818 3819 3820
	struct mgmt_ev_device_found *ev;
	char buf[sizeof(*ev) + HCI_MAX_NAME_LENGTH + 2];
	u16 eir_len;
3821

3822
	ev = (struct mgmt_ev_device_found *) buf;
3823

3824 3825 3826
	memset(buf, 0, sizeof(buf));

	bacpy(&ev->addr.bdaddr, bdaddr);
3827
	ev->addr.type = link_to_bdaddr(link_type, addr_type);
3828 3829 3830
	ev->rssi = rssi;

	eir_len = eir_append_data(ev->eir, 0, EIR_NAME_COMPLETE, name,
3831
				  name_len);
3832

3833
	ev->eir_len = cpu_to_le16(eir_len);
3834

3835
	return mgmt_event(MGMT_EV_DEVICE_FOUND, hdev, ev,
3836
			  sizeof(*ev) + eir_len, NULL);
3837
}
3838

3839
int mgmt_start_discovery_failed(struct hci_dev *hdev, u8 status)
3840 3841
{
	struct pending_cmd *cmd;
3842
	u8 type;
3843 3844
	int err;

3845 3846
	hci_discovery_set_state(hdev, DISCOVERY_STOPPED);

3847
	cmd = mgmt_pending_find(MGMT_OP_START_DISCOVERY, hdev);
3848 3849 3850
	if (!cmd)
		return -ENOENT;

3851 3852 3853
	type = hdev->discovery.type;

	err = cmd_complete(cmd->sk, hdev->id, cmd->opcode, mgmt_status(status),
3854
			   &type, sizeof(type));
3855 3856 3857 3858 3859
	mgmt_pending_remove(cmd);

	return err;
}

3860 3861 3862 3863 3864 3865 3866 3867 3868
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;

3869
	err = cmd_complete(cmd->sk, hdev->id, cmd->opcode, mgmt_status(status),
3870
			   &hdev->discovery.type, sizeof(hdev->discovery.type));
3871 3872 3873 3874 3875
	mgmt_pending_remove(cmd);

	return err;
}

3876
int mgmt_discovering(struct hci_dev *hdev, u8 discovering)
3877
{
3878
	struct mgmt_ev_discovering ev;
3879 3880
	struct pending_cmd *cmd;

3881 3882
	BT_DBG("%s discovering %u", hdev->name, discovering);

3883
	if (discovering)
3884
		cmd = mgmt_pending_find(MGMT_OP_START_DISCOVERY, hdev);
3885
	else
3886
		cmd = mgmt_pending_find(MGMT_OP_STOP_DISCOVERY, hdev);
3887 3888

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

3891 3892
		cmd_complete(cmd->sk, hdev->id, cmd->opcode, 0, &type,
			     sizeof(type));
3893 3894 3895
		mgmt_pending_remove(cmd);
	}

3896 3897 3898 3899 3900
	memset(&ev, 0, sizeof(ev));
	ev.type = hdev->discovery.type;
	ev.discovering = discovering;

	return mgmt_event(MGMT_EV_DISCOVERING, hdev, &ev, sizeof(ev), NULL);
3901
}
3902

3903
int mgmt_device_blocked(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type)
3904 3905 3906 3907
{
	struct pending_cmd *cmd;
	struct mgmt_ev_device_blocked ev;

3908
	cmd = mgmt_pending_find(MGMT_OP_BLOCK_DEVICE, hdev);
3909

3910 3911
	bacpy(&ev.addr.bdaddr, bdaddr);
	ev.addr.type = type;
3912

3913
	return mgmt_event(MGMT_EV_DEVICE_BLOCKED, hdev, &ev, sizeof(ev),
3914
			  cmd ? cmd->sk : NULL);
3915 3916
}

3917
int mgmt_device_unblocked(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type)
3918 3919 3920 3921
{
	struct pending_cmd *cmd;
	struct mgmt_ev_device_unblocked ev;

3922
	cmd = mgmt_pending_find(MGMT_OP_UNBLOCK_DEVICE, hdev);
3923

3924 3925
	bacpy(&ev.addr.bdaddr, bdaddr);
	ev.addr.type = type;
3926

3927
	return mgmt_event(MGMT_EV_DEVICE_UNBLOCKED, hdev, &ev, sizeof(ev),
3928
			  cmd ? cmd->sk : NULL);
3929
}
3930 3931 3932

module_param(enable_hs, bool, 0644);
MODULE_PARM_DESC(enable_hs, "Enable High Speed support");