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

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

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

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

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

/* Bluetooth HCI Management interface */

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

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

#include "smp.h"
35

36
#define MGMT_VERSION	1
37
#define MGMT_REVISION	4
38

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

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,
104
	MGMT_EV_PASSKEY_NOTIFY,
105 106
};

107
#define CACHE_TIMEOUT	msecs_to_jiffies(2 * 1000)
108

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

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

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

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

	return MGMT_STATUS_FAILED;
}

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

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

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

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

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

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

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

221
	return err;
222 223
}

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

	BT_DBG("sock %p", sk);

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

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

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

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

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

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

255
	return err;
256 257
}

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

	BT_DBG("sock %p", sk);

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

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

272 273
static int read_commands(struct sock *sk, struct hci_dev *hdev, void *data,
			 u16 data_len)
274 275
{
	struct mgmt_rp_read_commands *rp;
276 277
	const u16 num_commands = ARRAY_SIZE(mgmt_commands);
	const u16 num_events = ARRAY_SIZE(mgmt_events);
278
	__le16 *opcode;
279 280 281 282 283 284 285 286 287 288 289
	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;

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

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

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

	return err;
}

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

	BT_DBG("sock %p", sk);

	read_lock(&hci_dev_list_lock);

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

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

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

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

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

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

349 350
	read_unlock(&hci_dev_list_lock);

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

354 355 356
	kfree(rp);

	return err;
357 358
}

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

	settings |= MGMT_SETTING_POWERED;
	settings |= MGMT_SETTING_PAIRABLE;

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

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

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

	return settings;
}

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

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

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

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

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

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

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

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

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

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

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

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

425 426 427
	return settings;
}

428 429
#define PNP_INFO_SVCLASS_ID		0x1200

430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471
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;
}

472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504
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;
}

505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537
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;
}

538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560
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);
	}

561
	if (hdev->inq_tx_power != HCI_TX_POWER_INVALID) {
562 563 564 565 566 567 568
		ptr[0] = 2;
		ptr[1] = EIR_TX_POWER;
		ptr[2] = (u8) hdev->inq_tx_power;

		ptr += 3;
	}

569 570 571 572 573 574 575 576 577 578 579 580
	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;
	}

581
	ptr = create_uuid16_list(hdev, ptr, HCI_MAX_EIR_LENGTH - (ptr - data));
582
	ptr = create_uuid32_list(hdev, ptr, HCI_MAX_EIR_LENGTH - (ptr - data));
583
	ptr = create_uuid128_list(hdev, ptr, HCI_MAX_EIR_LENGTH - (ptr - data));
584 585
}

586
static void update_eir(struct hci_request *req)
587
{
588
	struct hci_dev *hdev = req->hdev;
589 590
	struct hci_cp_write_eir cp;

591
	if (!hdev_is_powered(hdev))
592
		return;
593

594
	if (!lmp_ext_inq_capable(hdev))
595
		return;
596

597
	if (!test_bit(HCI_SSP_ENABLED, &hdev->dev_flags))
598
		return;
599

600
	if (test_bit(HCI_SERVICE_CACHE, &hdev->dev_flags))
601
		return;
602 603 604 605 606 607

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

	create_eir(hdev, cp.data);

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

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

612
	hci_req_add(req, HCI_OP_WRITE_EIR, sizeof(cp), &cp);
613 614 615 616 617 618 619 620 621 622 623 624 625
}

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

626
static void update_class(struct hci_request *req)
627
{
628
	struct hci_dev *hdev = req->hdev;
629 630 631 632
	u8 cod[3];

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

633
	if (!hdev_is_powered(hdev))
634
		return;
635

636
	if (test_bit(HCI_SERVICE_CACHE, &hdev->dev_flags))
637
		return;
638 639 640 641 642 643

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

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

646
	hci_req_add(req, HCI_OP_WRITE_CLASS_OF_DEV, sizeof(cod), cod);
647 648
}

649 650 651
static void service_cache_off(struct work_struct *work)
{
	struct hci_dev *hdev = container_of(work, struct hci_dev,
652
					    service_cache.work);
653
	struct hci_request req;
654

655
	if (!test_and_clear_bit(HCI_SERVICE_CACHE, &hdev->dev_flags))
656 657
		return;

658 659
	hci_req_init(&req, hdev);

660 661
	hci_dev_lock(hdev);

662 663
	update_eir(&req);
	update_class(&req);
664 665

	hci_dev_unlock(hdev);
666 667

	hci_req_run(&req, NULL);
668 669
}

670
static void mgmt_init_hdev(struct sock *sk, struct hci_dev *hdev)
671
{
672
	if (test_and_set_bit(HCI_MGMT, &hdev->dev_flags))
673 674
		return;

675
	INIT_DELAYED_WORK(&hdev->service_cache, service_cache_off);
676

677 678 679 680 681 682
	/* 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);
683 684
}

685
static int read_controller_info(struct sock *sk, struct hci_dev *hdev,
686
				void *data, u16 data_len)
687
{
688
	struct mgmt_rp_read_info rp;
689

690
	BT_DBG("sock %p %s", sk, hdev->name);
691

692
	hci_dev_lock(hdev);
693

694 695
	memset(&rp, 0, sizeof(rp));

696
	bacpy(&rp.bdaddr, &hdev->bdaddr);
697

698
	rp.version = hdev->hci_ver;
699
	rp.manufacturer = cpu_to_le16(hdev->manufacturer);
700 701 702

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

704
	memcpy(rp.dev_class, hdev->dev_class, 3);
705

706
	memcpy(rp.name, hdev->dev_name, sizeof(hdev->dev_name));
707
	memcpy(rp.short_name, hdev->short_name, sizeof(hdev->short_name));
708

709
	hci_dev_unlock(hdev);
710

711
	return cmd_complete(sk, hdev->id, MGMT_OP_READ_INFO, 0, &rp,
712
			    sizeof(rp));
713 714
}

715 716 717
static void mgmt_pending_free(struct pending_cmd *cmd)
{
	sock_put(cmd->sk);
718
	kfree(cmd->param);
719 720 721
	kfree(cmd);
}

722
static struct pending_cmd *mgmt_pending_add(struct sock *sk, u16 opcode,
723 724
					    struct hci_dev *hdev, void *data,
					    u16 len)
725 726 727
{
	struct pending_cmd *cmd;

728
	cmd = kmalloc(sizeof(*cmd), GFP_KERNEL);
729
	if (!cmd)
730
		return NULL;
731 732

	cmd->opcode = opcode;
733
	cmd->index = hdev->id;
734

735
	cmd->param = kmalloc(len, GFP_KERNEL);
736
	if (!cmd->param) {
737
		kfree(cmd);
738
		return NULL;
739 740
	}

741 742
	if (data)
		memcpy(cmd->param, data, len);
743 744 745 746

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

747
	list_add(&cmd->list, &hdev->mgmt_pending);
748

749
	return cmd;
750 751
}

752
static void mgmt_pending_foreach(u16 opcode, struct hci_dev *hdev,
753 754
				 void (*cb)(struct pending_cmd *cmd,
					    void *data),
755
				 void *data)
756
{
757
	struct pending_cmd *cmd, *tmp;
758

759
	list_for_each_entry_safe(cmd, tmp, &hdev->mgmt_pending, list) {
760
		if (opcode > 0 && cmd->opcode != opcode)
761 762 763 764 765 766
			continue;

		cb(cmd, data);
	}
}

767
static struct pending_cmd *mgmt_pending_find(u16 opcode, struct hci_dev *hdev)
768
{
769
	struct pending_cmd *cmd;
770

771
	list_for_each_entry(cmd, &hdev->mgmt_pending, list) {
772 773
		if (cmd->opcode == opcode)
			return cmd;
774 775 776 777 778
	}

	return NULL;
}

779
static void mgmt_pending_remove(struct pending_cmd *cmd)
780 781 782 783 784
{
	list_del(&cmd->list);
	mgmt_pending_free(cmd);
}

785
static int send_settings_rsp(struct sock *sk, u16 opcode, struct hci_dev *hdev)
786
{
787
	__le32 settings = cpu_to_le32(get_current_settings(hdev));
788

789
	return cmd_complete(sk, hdev->id, opcode, 0, &settings,
790
			    sizeof(settings));
791 792
}

793
static int set_powered(struct sock *sk, struct hci_dev *hdev, void *data,
794
		       u16 len)
795
{
796
	struct mgmt_mode *cp = data;
797
	struct pending_cmd *cmd;
798
	int err;
799

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

802 803 804 805
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_POWERED,
				  MGMT_STATUS_INVALID_PARAMS);

806
	hci_dev_lock(hdev);
807

808 809 810 811 812 813
	if (mgmt_pending_find(MGMT_OP_SET_POWERED, hdev)) {
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_POWERED,
				 MGMT_STATUS_BUSY);
		goto failed;
	}

814 815 816 817
	if (test_and_clear_bit(HCI_AUTO_OFF, &hdev->dev_flags)) {
		cancel_delayed_work(&hdev->power_off);

		if (cp->val) {
818 819 820
			mgmt_pending_add(sk, MGMT_OP_SET_POWERED, hdev,
					 data, len);
			err = mgmt_powered(hdev, 1);
821 822 823 824
			goto failed;
		}
	}

825
	if (!!cp->val == hdev_is_powered(hdev)) {
826
		err = send_settings_rsp(sk, MGMT_OP_SET_POWERED, hdev);
827 828 829
		goto failed;
	}

830
	cmd = mgmt_pending_add(sk, MGMT_OP_SET_POWERED, hdev, data, len);
831 832
	if (!cmd) {
		err = -ENOMEM;
833
		goto failed;
834
	}
835

836
	if (cp->val)
837
		queue_work(hdev->req_workqueue, &hdev->power_on);
838
	else
839
		queue_work(hdev->req_workqueue, &hdev->power_off.work);
840

841
	err = 0;
842 843

failed:
844
	hci_dev_unlock(hdev);
845
	return err;
846 847
}

848 849
static int mgmt_event(u16 event, struct hci_dev *hdev, void *data, u16 data_len,
		      struct sock *skip_sk)
850 851 852 853
{
	struct sk_buff *skb;
	struct mgmt_hdr *hdr;

854
	skb = alloc_skb(sizeof(*hdr) + data_len, GFP_KERNEL);
855 856 857 858 859 860 861 862
	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
863
		hdr->index = __constant_cpu_to_le16(MGMT_INDEX_NONE);
864 865 866 867 868
	hdr->len = cpu_to_le16(data_len);

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

869 870 871
	/* Time stamp */
	__net_timestamp(skb);

872 873 874 875 876 877 878 879 880 881 882 883 884 885 886
	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);
}

887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916
struct cmd_lookup {
	struct sock *sk;
	struct hci_dev *hdev;
	u8 mgmt_status;
};

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

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

	list_del(&cmd->list);

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

	mgmt_pending_free(cmd);
}

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

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

917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936
static u8 mgmt_bredr_support(struct hci_dev *hdev)
{
	if (!lmp_bredr_capable(hdev))
		return MGMT_STATUS_NOT_SUPPORTED;
	else if (!test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags))
		return MGMT_STATUS_REJECTED;
	else
		return MGMT_STATUS_SUCCESS;
}

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

937
static int set_discoverable(struct sock *sk, struct hci_dev *hdev, void *data,
938
			    u16 len)
939
{
940
	struct mgmt_cp_set_discoverable *cp = data;
941
	struct pending_cmd *cmd;
942
	u16 timeout;
943
	u8 scan, status;
944 945
	int err;

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

948 949
	status = mgmt_bredr_support(hdev);
	if (status)
950
		return cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
951
				  status);
952

953 954 955 956
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
				  MGMT_STATUS_INVALID_PARAMS);

957
	timeout = __le16_to_cpu(cp->timeout);
958
	if (!cp->val && timeout > 0)
959
		return cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
960
				  MGMT_STATUS_INVALID_PARAMS);
961

962
	hci_dev_lock(hdev);
963

964
	if (!hdev_is_powered(hdev) && timeout > 0) {
965
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
966
				 MGMT_STATUS_NOT_POWERED);
967 968 969
		goto failed;
	}

970
	if (mgmt_pending_find(MGMT_OP_SET_DISCOVERABLE, hdev) ||
971
	    mgmt_pending_find(MGMT_OP_SET_CONNECTABLE, hdev)) {
972
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
973
				 MGMT_STATUS_BUSY);
974 975 976
		goto failed;
	}

977
	if (!test_bit(HCI_CONNECTABLE, &hdev->dev_flags)) {
978
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
979
				 MGMT_STATUS_REJECTED);
980 981 982 983
		goto failed;
	}

	if (!hdev_is_powered(hdev)) {
984 985 986 987 988 989 990
		bool changed = false;

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

991
		err = send_settings_rsp(sk, MGMT_OP_SET_DISCOVERABLE, hdev);
992 993 994 995 996 997
		if (err < 0)
			goto failed;

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

998 999 1000 1001
		goto failed;
	}

	if (!!cp->val == test_bit(HCI_DISCOVERABLE, &hdev->dev_flags)) {
1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012
		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));
		}

1013
		err = send_settings_rsp(sk, MGMT_OP_SET_DISCOVERABLE, hdev);
1014 1015 1016
		goto failed;
	}

1017
	cmd = mgmt_pending_add(sk, MGMT_OP_SET_DISCOVERABLE, hdev, data, len);
1018 1019
	if (!cmd) {
		err = -ENOMEM;
1020
		goto failed;
1021
	}
1022 1023 1024

	scan = SCAN_PAGE;

1025
	if (cp->val)
1026
		scan |= SCAN_INQUIRY;
1027
	else
1028
		cancel_delayed_work(&hdev->discov_off);
1029 1030 1031

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

1034
	if (cp->val)
1035
		hdev->discov_timeout = timeout;
1036

1037
failed:
1038
	hci_dev_unlock(hdev);
1039 1040 1041
	return err;
}

1042 1043
static void write_fast_connectable(struct hci_request *req, bool enable)
{
1044
	struct hci_dev *hdev = req->hdev;
1045 1046 1047
	struct hci_cp_write_page_scan_activity acp;
	u8 type;

1048 1049 1050
	if (hdev->hci_ver < BLUETOOTH_VER_1_2)
		return;

1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064
	if (enable) {
		type = PAGE_SCAN_TYPE_INTERLACED;

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

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

	acp.window = __constant_cpu_to_le16(0x0012);

1065 1066 1067 1068 1069 1070 1071
	if (__cpu_to_le16(hdev->page_scan_interval) != acp.interval ||
	    __cpu_to_le16(hdev->page_scan_window) != acp.window)
		hci_req_add(req, HCI_OP_WRITE_PAGE_SCAN_ACTIVITY,
			    sizeof(acp), &acp);

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

1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093
static void set_connectable_complete(struct hci_dev *hdev, u8 status)
{
	struct pending_cmd *cmd;

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

	hci_dev_lock(hdev);

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

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

	mgmt_pending_remove(cmd);

unlock:
	hci_dev_unlock(hdev);
}

1094
static int set_connectable(struct sock *sk, struct hci_dev *hdev, void *data,
1095
			   u16 len)
1096
{
1097
	struct mgmt_mode *cp = data;
1098
	struct pending_cmd *cmd;
1099
	struct hci_request req;
1100
	u8 scan, status;
1101 1102
	int err;

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

1105 1106
	status = mgmt_bredr_support(hdev);
	if (status)
1107
		return cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE,
1108
				  status);
1109

1110 1111 1112 1113
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE,
				  MGMT_STATUS_INVALID_PARAMS);

1114
	hci_dev_lock(hdev);
1115

1116
	if (!hdev_is_powered(hdev)) {
1117 1118 1119 1120 1121
		bool changed = false;

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

1122
		if (cp->val) {
1123
			set_bit(HCI_CONNECTABLE, &hdev->dev_flags);
1124
		} else {
1125 1126 1127
			clear_bit(HCI_CONNECTABLE, &hdev->dev_flags);
			clear_bit(HCI_DISCOVERABLE, &hdev->dev_flags);
		}
1128

1129
		err = send_settings_rsp(sk, MGMT_OP_SET_CONNECTABLE, hdev);
1130 1131 1132 1133 1134 1135
		if (err < 0)
			goto failed;

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

1136 1137 1138
		goto failed;
	}

1139
	if (mgmt_pending_find(MGMT_OP_SET_DISCOVERABLE, hdev) ||
1140
	    mgmt_pending_find(MGMT_OP_SET_CONNECTABLE, hdev)) {
1141
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE,
1142
				 MGMT_STATUS_BUSY);
1143 1144 1145
		goto failed;
	}

1146
	if (!!cp->val == test_bit(HCI_PSCAN, &hdev->flags)) {
1147
		err = send_settings_rsp(sk, MGMT_OP_SET_CONNECTABLE, hdev);
1148 1149 1150
		goto failed;
	}

1151
	cmd = mgmt_pending_add(sk, MGMT_OP_SET_CONNECTABLE, hdev, data, len);
1152 1153
	if (!cmd) {
		err = -ENOMEM;
1154
		goto failed;
1155
	}
1156

1157
	if (cp->val) {
1158
		scan = SCAN_PAGE;
1159
	} else {
1160 1161
		scan = 0;

1162
		if (test_bit(HCI_ISCAN, &hdev->flags) &&
1163
		    hdev->discov_timeout > 0)
1164 1165 1166
			cancel_delayed_work(&hdev->discov_off);
	}

1167 1168 1169 1170
	hci_req_init(&req, hdev);

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

1171 1172 1173 1174 1175 1176 1177
	/* If we're going from non-connectable to connectable or
	 * vice-versa when fast connectable is enabled ensure that fast
	 * connectable gets disabled. write_fast_connectable won't do
	 * anything if the page scan parameters are already what they
	 * should be.
	 */
	if (cp->val || test_bit(HCI_FAST_CONNECTABLE, &hdev->dev_flags))
1178 1179
		write_fast_connectable(&req, false);

1180
	err = hci_req_run(&req, set_connectable_complete);
1181
	if (err < 0)
1182
		mgmt_pending_remove(cmd);
1183 1184

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

1189
static int set_pairable(struct sock *sk, struct hci_dev *hdev, void *data,
1190
			u16 len)
1191
{
1192
	struct mgmt_mode *cp = data;
1193
	bool changed;
1194 1195
	int err;

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

1198 1199 1200 1201
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_PAIRABLE,
				  MGMT_STATUS_INVALID_PARAMS);

1202
	hci_dev_lock(hdev);
1203 1204

	if (cp->val)
1205
		changed = !test_and_set_bit(HCI_PAIRABLE, &hdev->dev_flags);
1206
	else
1207
		changed = test_and_clear_bit(HCI_PAIRABLE, &hdev->dev_flags);
1208

1209
	err = send_settings_rsp(sk, MGMT_OP_SET_PAIRABLE, hdev);
1210
	if (err < 0)
1211
		goto unlock;
1212

1213 1214
	if (changed)
		err = new_settings(hdev, sk);
1215

1216
unlock:
1217
	hci_dev_unlock(hdev);
1218 1219 1220
	return err;
}

1221 1222
static int set_link_security(struct sock *sk, struct hci_dev *hdev, void *data,
			     u16 len)
1223 1224 1225
{
	struct mgmt_mode *cp = data;
	struct pending_cmd *cmd;
1226
	u8 val, status;
1227 1228
	int err;

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

1231 1232
	status = mgmt_bredr_support(hdev);
	if (status)
1233
		return cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY,
1234
				  status);
1235

1236 1237 1238 1239
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY,
				  MGMT_STATUS_INVALID_PARAMS);

1240 1241
	hci_dev_lock(hdev);

1242
	if (!hdev_is_powered(hdev)) {
1243 1244 1245
		bool changed = false;

		if (!!cp->val != test_bit(HCI_LINK_SECURITY,
1246
					  &hdev->dev_flags)) {
1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257
			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);

1258 1259 1260 1261
		goto failed;
	}

	if (mgmt_pending_find(MGMT_OP_SET_LINK_SECURITY, hdev)) {
1262
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY,
1263
				 MGMT_STATUS_BUSY);
1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290
		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;
}

1291
static int set_ssp(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
1292 1293 1294
{
	struct mgmt_mode *cp = data;
	struct pending_cmd *cmd;
1295
	u8 status;
1296 1297
	int err;

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

1300 1301 1302 1303
	status = mgmt_bredr_support(hdev);
	if (status)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_SSP, status);

1304 1305 1306
	if (!lmp_ssp_capable(hdev))
		return cmd_status(sk, hdev->id, MGMT_OP_SET_SSP,
				  MGMT_STATUS_NOT_SUPPORTED);
1307

1308 1309 1310 1311
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_SSP,
				  MGMT_STATUS_INVALID_PARAMS);

1312
	hci_dev_lock(hdev);
1313

1314
	if (!hdev_is_powered(hdev)) {
1315
		bool changed;
1316

1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327
		if (cp->val) {
			changed = !test_and_set_bit(HCI_SSP_ENABLED,
						    &hdev->dev_flags);
		} else {
			changed = test_and_clear_bit(HCI_SSP_ENABLED,
						     &hdev->dev_flags);
			if (!changed)
				changed = test_and_clear_bit(HCI_HS_ENABLED,
							     &hdev->dev_flags);
			else
				clear_bit(HCI_HS_ENABLED, &hdev->dev_flags);
1328 1329 1330 1331 1332 1333 1334 1335 1336
		}

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

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

1337 1338 1339
		goto failed;
	}

1340 1341
	if (mgmt_pending_find(MGMT_OP_SET_SSP, hdev) ||
	    mgmt_pending_find(MGMT_OP_SET_HS, hdev)) {
1342 1343
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_SSP,
				 MGMT_STATUS_BUSY);
1344 1345 1346
		goto failed;
	}

1347
	if (!!cp->val == test_bit(HCI_SSP_ENABLED, &hdev->dev_flags)) {
1348 1349 1350 1351 1352 1353 1354 1355 1356 1357
		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;
	}

1358
	err = hci_send_cmd(hdev, HCI_OP_WRITE_SSP_MODE, 1, &cp->val);
1359 1360 1361 1362 1363 1364 1365 1366 1367 1368
	if (err < 0) {
		mgmt_pending_remove(cmd);
		goto failed;
	}

failed:
	hci_dev_unlock(hdev);
	return err;
}

1369
static int set_hs(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
1370 1371
{
	struct mgmt_mode *cp = data;
1372
	bool changed;
1373
	u8 status;
1374
	int err;
1375

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

1378 1379 1380
	status = mgmt_bredr_support(hdev);
	if (status)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_HS, status);
1381

1382 1383 1384 1385 1386 1387 1388 1389
	if (!lmp_ssp_capable(hdev))
		return cmd_status(sk, hdev->id, MGMT_OP_SET_HS,
				  MGMT_STATUS_NOT_SUPPORTED);

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

1390 1391 1392 1393
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_HS,
				  MGMT_STATUS_INVALID_PARAMS);

1394 1395
	hci_dev_lock(hdev);

1396
	if (cp->val) {
1397
		changed = !test_and_set_bit(HCI_HS_ENABLED, &hdev->dev_flags);
1398 1399 1400 1401 1402 1403 1404
	} else {
		if (hdev_is_powered(hdev)) {
			err = cmd_status(sk, hdev->id, MGMT_OP_SET_HS,
					 MGMT_STATUS_REJECTED);
			goto unlock;
		}

1405
		changed = test_and_clear_bit(HCI_HS_ENABLED, &hdev->dev_flags);
1406
	}
1407 1408 1409 1410 1411 1412 1413

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

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

1415 1416 1417
unlock:
	hci_dev_unlock(hdev);
	return err;
1418 1419
}

1420 1421
static void enable_advertising(struct hci_request *req)
{
1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436
	struct hci_dev *hdev = req->hdev;
	struct hci_cp_le_set_adv_param cp;
	u8 enable = 0x01;

	memset(&cp, 0, sizeof(cp));
	cp.min_interval = __constant_cpu_to_le16(0x0800);
	cp.max_interval = __constant_cpu_to_le16(0x0800);
	cp.type = LE_ADV_IND;
	if (bacmp(&hdev->bdaddr, BDADDR_ANY))
		cp.own_address_type = ADDR_LE_DEV_PUBLIC;
	else
		cp.own_address_type = ADDR_LE_DEV_RANDOM;
	cp.channel_map = 0x07;

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

1438
	hci_req_add(req, HCI_OP_LE_SET_ADV_ENABLE, sizeof(enable), &enable);
1439 1440 1441 1442
}

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

1445
	hci_req_add(req, HCI_OP_LE_SET_ADV_ENABLE, sizeof(enable), &enable);
1446 1447
}

1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467
static void le_enable_complete(struct hci_dev *hdev, u8 status)
{
	struct cmd_lookup match = { NULL, hdev };

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

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

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

	new_settings(hdev, match.sk);

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

1468
static int set_le(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
1469 1470 1471 1472
{
	struct mgmt_mode *cp = data;
	struct hci_cp_write_le_host_supported hci_cp;
	struct pending_cmd *cmd;
1473
	struct hci_request req;
1474
	int err;
1475
	u8 val, enabled;
1476

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

1479 1480 1481
	if (!lmp_le_capable(hdev))
		return cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
				  MGMT_STATUS_NOT_SUPPORTED);
1482

1483 1484 1485 1486
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
				  MGMT_STATUS_INVALID_PARAMS);

1487
	/* LE-only devices do not allow toggling LE on/off */
1488
	if (!test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags))
1489 1490 1491
		return cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
				  MGMT_STATUS_REJECTED);

1492
	hci_dev_lock(hdev);
1493 1494

	val = !!cp->val;
1495
	enabled = lmp_host_le_capable(hdev);
1496

1497
	if (!hdev_is_powered(hdev) || val == enabled) {
1498 1499 1500 1501 1502 1503 1504
		bool changed = false;

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

1505 1506
		if (!val && test_bit(HCI_ADVERTISING, &hdev->dev_flags)) {
			clear_bit(HCI_ADVERTISING, &hdev->dev_flags);
1507 1508 1509
			changed = true;
		}

1510 1511
		err = send_settings_rsp(sk, MGMT_OP_SET_LE, hdev);
		if (err < 0)
1512
			goto unlock;
1513 1514 1515 1516

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

1517
		goto unlock;
1518 1519
	}

1520 1521
	if (mgmt_pending_find(MGMT_OP_SET_LE, hdev) ||
	    mgmt_pending_find(MGMT_OP_SET_ADVERTISING, hdev)) {
1522
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
1523
				 MGMT_STATUS_BUSY);
1524
		goto unlock;
1525 1526 1527 1528 1529
	}

	cmd = mgmt_pending_add(sk, MGMT_OP_SET_LE, hdev, data, len);
	if (!cmd) {
		err = -ENOMEM;
1530
		goto unlock;
1531 1532 1533 1534 1535 1536
	}

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

	if (val) {
		hci_cp.le = val;
1537
		hci_cp.simul = lmp_le_br_capable(hdev);
1538 1539
	}

1540 1541
	hci_req_init(&req, hdev);

1542 1543
	if (test_bit(HCI_ADVERTISING, &hdev->dev_flags) && !val)
		disable_advertising(&req);
1544

1545 1546 1547 1548
	hci_req_add(&req, HCI_OP_WRITE_LE_HOST_SUPPORTED, sizeof(hci_cp),
		    &hci_cp);

	err = hci_req_run(&req, le_enable_complete);
1549
	if (err < 0)
1550 1551
		mgmt_pending_remove(cmd);

1552 1553
unlock:
	hci_dev_unlock(hdev);
1554 1555 1556
	return err;
}

1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579
/* This is a helper function to test for pending mgmt commands that can
 * cause CoD or EIR HCI commands. We can only allow one such pending
 * mgmt command at a time since otherwise we cannot easily track what
 * the current values are, will be, and based on that calculate if a new
 * HCI command needs to be sent and if yes with what value.
 */
static bool pending_eir_or_class(struct hci_dev *hdev)
{
	struct pending_cmd *cmd;

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

	return false;
}

1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598
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;
}

1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624
static void mgmt_class_complete(struct hci_dev *hdev, u16 mgmt_op, u8 status)
{
	struct pending_cmd *cmd;

	hci_dev_lock(hdev);

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

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

	mgmt_pending_remove(cmd);

unlock:
	hci_dev_unlock(hdev);
}

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

	mgmt_class_complete(hdev, MGMT_OP_ADD_UUID, status);
}

1625
static int add_uuid(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
1626
{
1627
	struct mgmt_cp_add_uuid *cp = data;
1628
	struct pending_cmd *cmd;
1629
	struct hci_request req;
1630 1631 1632
	struct bt_uuid *uuid;
	int err;

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

1635
	hci_dev_lock(hdev);
1636

1637
	if (pending_eir_or_class(hdev)) {
1638
		err = cmd_status(sk, hdev->id, MGMT_OP_ADD_UUID,
1639
				 MGMT_STATUS_BUSY);
1640 1641 1642
		goto failed;
	}

1643
	uuid = kmalloc(sizeof(*uuid), GFP_KERNEL);
1644 1645 1646 1647 1648 1649
	if (!uuid) {
		err = -ENOMEM;
		goto failed;
	}

	memcpy(uuid->uuid, cp->uuid, 16);
1650
	uuid->svc_hint = cp->svc_hint;
1651
	uuid->size = get_uuid_size(cp->uuid);
1652

1653
	list_add_tail(&uuid->list, &hdev->uuids);
1654

1655
	hci_req_init(&req, hdev);
1656

1657 1658 1659
	update_class(&req);
	update_eir(&req);

1660 1661 1662 1663
	err = hci_req_run(&req, add_uuid_complete);
	if (err < 0) {
		if (err != -ENODATA)
			goto failed;
1664

1665
		err = cmd_complete(sk, hdev->id, MGMT_OP_ADD_UUID, 0,
1666
				   hdev->dev_class, 3);
1667 1668 1669 1670
		goto failed;
	}

	cmd = mgmt_pending_add(sk, MGMT_OP_ADD_UUID, hdev, data, len);
1671
	if (!cmd) {
1672
		err = -ENOMEM;
1673 1674 1675 1676
		goto failed;
	}

	err = 0;
1677 1678

failed:
1679
	hci_dev_unlock(hdev);
1680 1681 1682
	return err;
}

1683 1684 1685 1686 1687 1688
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)) {
1689 1690
		queue_delayed_work(hdev->workqueue, &hdev->service_cache,
				   CACHE_TIMEOUT);
1691 1692 1693 1694 1695 1696
		return true;
	}

	return false;
}

1697 1698 1699 1700 1701 1702 1703
static void remove_uuid_complete(struct hci_dev *hdev, u8 status)
{
	BT_DBG("status 0x%02x", status);

	mgmt_class_complete(hdev, MGMT_OP_REMOVE_UUID, status);
}

1704
static int remove_uuid(struct sock *sk, struct hci_dev *hdev, void *data,
1705
		       u16 len)
1706
{
1707
	struct mgmt_cp_remove_uuid *cp = data;
1708
	struct pending_cmd *cmd;
1709
	struct bt_uuid *match, *tmp;
1710
	u8 bt_uuid_any[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
1711
	struct hci_request req;
1712 1713
	int err, found;

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

1716
	hci_dev_lock(hdev);
1717

1718
	if (pending_eir_or_class(hdev)) {
1719
		err = cmd_status(sk, hdev->id, MGMT_OP_REMOVE_UUID,
1720
				 MGMT_STATUS_BUSY);
1721 1722 1723
		goto unlock;
	}

1724 1725
	if (memcmp(cp->uuid, bt_uuid_any, 16) == 0) {
		err = hci_uuids_clear(hdev);
1726

1727
		if (enable_service_cache(hdev)) {
1728
			err = cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_UUID,
1729
					   0, hdev->dev_class, 3);
1730 1731
			goto unlock;
		}
1732

1733
		goto update_class;
1734 1735 1736 1737
	}

	found = 0;

1738
	list_for_each_entry_safe(match, tmp, &hdev->uuids, list) {
1739 1740 1741 1742
		if (memcmp(match->uuid, cp->uuid, 16) != 0)
			continue;

		list_del(&match->list);
1743
		kfree(match);
1744 1745 1746 1747
		found++;
	}

	if (found == 0) {
1748
		err = cmd_status(sk, hdev->id, MGMT_OP_REMOVE_UUID,
1749
				 MGMT_STATUS_INVALID_PARAMS);
1750 1751 1752
		goto unlock;
	}

1753
update_class:
1754
	hci_req_init(&req, hdev);
1755

1756 1757 1758
	update_class(&req);
	update_eir(&req);

1759 1760 1761 1762
	err = hci_req_run(&req, remove_uuid_complete);
	if (err < 0) {
		if (err != -ENODATA)
			goto unlock;
1763

1764
		err = cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_UUID, 0,
1765
				   hdev->dev_class, 3);
1766 1767 1768 1769
		goto unlock;
	}

	cmd = mgmt_pending_add(sk, MGMT_OP_REMOVE_UUID, hdev, data, len);
1770
	if (!cmd) {
1771
		err = -ENOMEM;
1772 1773 1774 1775
		goto unlock;
	}

	err = 0;
1776 1777

unlock:
1778
	hci_dev_unlock(hdev);
1779 1780 1781
	return err;
}

1782 1783 1784 1785 1786 1787 1788
static void set_class_complete(struct hci_dev *hdev, u8 status)
{
	BT_DBG("status 0x%02x", status);

	mgmt_class_complete(hdev, MGMT_OP_SET_DEV_CLASS, status);
}

1789
static int set_dev_class(struct sock *sk, struct hci_dev *hdev, void *data,
1790
			 u16 len)
1791
{
1792
	struct mgmt_cp_set_dev_class *cp = data;
1793
	struct pending_cmd *cmd;
1794
	struct hci_request req;
1795 1796
	int err;

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

1799
	if (!lmp_bredr_capable(hdev))
1800 1801
		return cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS,
				  MGMT_STATUS_NOT_SUPPORTED);
1802

1803
	hci_dev_lock(hdev);
1804

1805 1806 1807 1808 1809
	if (pending_eir_or_class(hdev)) {
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS,
				 MGMT_STATUS_BUSY);
		goto unlock;
	}
1810

1811 1812 1813 1814 1815
	if ((cp->minor & 0x03) != 0 || (cp->major & 0xe0) != 0) {
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS,
				 MGMT_STATUS_INVALID_PARAMS);
		goto unlock;
	}
1816

1817 1818 1819
	hdev->major_class = cp->major;
	hdev->minor_class = cp->minor;

1820
	if (!hdev_is_powered(hdev)) {
1821
		err = cmd_complete(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, 0,
1822
				   hdev->dev_class, 3);
1823 1824 1825
		goto unlock;
	}

1826 1827
	hci_req_init(&req, hdev);

1828
	if (test_and_clear_bit(HCI_SERVICE_CACHE, &hdev->dev_flags)) {
1829 1830 1831
		hci_dev_unlock(hdev);
		cancel_delayed_work_sync(&hdev->service_cache);
		hci_dev_lock(hdev);
1832
		update_eir(&req);
1833
	}
1834

1835 1836
	update_class(&req);

1837 1838 1839 1840
	err = hci_req_run(&req, set_class_complete);
	if (err < 0) {
		if (err != -ENODATA)
			goto unlock;
1841

1842
		err = cmd_complete(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, 0,
1843
				   hdev->dev_class, 3);
1844 1845 1846 1847
		goto unlock;
	}

	cmd = mgmt_pending_add(sk, MGMT_OP_SET_DEV_CLASS, hdev, data, len);
1848
	if (!cmd) {
1849
		err = -ENOMEM;
1850 1851 1852 1853
		goto unlock;
	}

	err = 0;
1854

1855
unlock:
1856
	hci_dev_unlock(hdev);
1857 1858 1859
	return err;
}

1860
static int load_link_keys(struct sock *sk, struct hci_dev *hdev, void *data,
1861
			  u16 len)
1862
{
1863
	struct mgmt_cp_load_link_keys *cp = data;
1864
	u16 key_count, expected_len;
1865
	int i;
1866

1867 1868 1869 1870 1871 1872
	BT_DBG("request for %s", hdev->name);

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

1873
	key_count = __le16_to_cpu(cp->key_count);
1874

1875 1876
	expected_len = sizeof(*cp) + key_count *
					sizeof(struct mgmt_link_key_info);
1877
	if (expected_len != len) {
1878
		BT_ERR("load_link_keys: expected %u bytes, got %u bytes",
1879
		       len, expected_len);
1880
		return cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS,
1881
				  MGMT_STATUS_INVALID_PARAMS);
1882 1883
	}

1884 1885 1886 1887
	if (cp->debug_keys != 0x00 && cp->debug_keys != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS,
				  MGMT_STATUS_INVALID_PARAMS);

1888
	BT_DBG("%s debug_keys %u key_count %u", hdev->name, cp->debug_keys,
1889
	       key_count);
1890

1891 1892 1893 1894 1895 1896 1897 1898
	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);
	}

1899
	hci_dev_lock(hdev);
1900 1901 1902 1903

	hci_link_keys_clear(hdev);

	if (cp->debug_keys)
1904
		set_bit(HCI_DEBUG_KEYS, &hdev->dev_flags);
1905
	else
1906
		clear_bit(HCI_DEBUG_KEYS, &hdev->dev_flags);
1907

1908
	for (i = 0; i < key_count; i++) {
1909
		struct mgmt_link_key_info *key = &cp->keys[i];
1910

1911
		hci_add_link_key(hdev, NULL, 0, &key->addr.bdaddr, key->val,
1912
				 key->type, key->pin_len);
1913 1914
	}

1915
	cmd_complete(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS, 0, NULL, 0);
1916

1917
	hci_dev_unlock(hdev);
1918

1919
	return 0;
1920 1921
}

1922
static int device_unpaired(struct hci_dev *hdev, bdaddr_t *bdaddr,
1923
			   u8 addr_type, struct sock *skip_sk)
1924 1925 1926 1927 1928 1929 1930
{
	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),
1931
			  skip_sk);
1932 1933
}

1934
static int unpair_device(struct sock *sk, struct hci_dev *hdev, void *data,
1935
			 u16 len)
1936
{
1937 1938
	struct mgmt_cp_unpair_device *cp = data;
	struct mgmt_rp_unpair_device rp;
1939 1940
	struct hci_cp_disconnect dc;
	struct pending_cmd *cmd;
1941 1942 1943
	struct hci_conn *conn;
	int err;

1944
	memset(&rp, 0, sizeof(rp));
1945 1946
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;
1947

1948 1949 1950 1951 1952
	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));

1953 1954 1955 1956 1957
	if (cp->disconnect != 0x00 && cp->disconnect != 0x01)
		return cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
				    MGMT_STATUS_INVALID_PARAMS,
				    &rp, sizeof(rp));

1958 1959
	hci_dev_lock(hdev);

1960
	if (!hdev_is_powered(hdev)) {
1961
		err = cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
1962
				   MGMT_STATUS_NOT_POWERED, &rp, sizeof(rp));
1963 1964 1965
		goto unlock;
	}

1966
	if (cp->addr.type == BDADDR_BREDR)
1967 1968 1969
		err = hci_remove_link_key(hdev, &cp->addr.bdaddr);
	else
		err = hci_remove_ltk(hdev, &cp->addr.bdaddr);
1970

1971
	if (err < 0) {
1972
		err = cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
1973
				   MGMT_STATUS_NOT_PAIRED, &rp, sizeof(rp));
1974 1975 1976
		goto unlock;
	}

1977
	if (cp->disconnect) {
1978
		if (cp->addr.type == BDADDR_BREDR)
1979
			conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK,
1980
						       &cp->addr.bdaddr);
1981 1982
		else
			conn = hci_conn_hash_lookup_ba(hdev, LE_LINK,
1983
						       &cp->addr.bdaddr);
1984 1985 1986
	} else {
		conn = NULL;
	}
1987

1988
	if (!conn) {
1989
		err = cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE, 0,
1990
				   &rp, sizeof(rp));
1991
		device_unpaired(hdev, &cp->addr.bdaddr, cp->addr.type, sk);
1992 1993
		goto unlock;
	}
1994

1995
	cmd = mgmt_pending_add(sk, MGMT_OP_UNPAIR_DEVICE, hdev, cp,
1996
			       sizeof(*cp));
1997 1998 1999
	if (!cmd) {
		err = -ENOMEM;
		goto unlock;
2000 2001
	}

2002
	dc.handle = cpu_to_le16(conn->handle);
2003 2004 2005 2006 2007
	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);

2008
unlock:
2009
	hci_dev_unlock(hdev);
2010 2011 2012
	return err;
}

2013
static int disconnect(struct sock *sk, struct hci_dev *hdev, void *data,
2014
		      u16 len)
2015
{
2016
	struct mgmt_cp_disconnect *cp = data;
2017
	struct mgmt_rp_disconnect rp;
2018
	struct hci_cp_disconnect dc;
2019
	struct pending_cmd *cmd;
2020 2021 2022 2023 2024
	struct hci_conn *conn;
	int err;

	BT_DBG("");

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

2029
	if (!bdaddr_type_is_valid(cp->addr.type))
2030 2031 2032
		return cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
				    MGMT_STATUS_INVALID_PARAMS,
				    &rp, sizeof(rp));
2033

2034
	hci_dev_lock(hdev);
2035 2036

	if (!test_bit(HCI_UP, &hdev->flags)) {
2037 2038
		err = cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
				   MGMT_STATUS_NOT_POWERED, &rp, sizeof(rp));
2039 2040 2041
		goto failed;
	}

2042
	if (mgmt_pending_find(MGMT_OP_DISCONNECT, hdev)) {
2043 2044
		err = cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
				   MGMT_STATUS_BUSY, &rp, sizeof(rp));
2045 2046 2047
		goto failed;
	}

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

2054
	if (!conn || conn->state == BT_OPEN || conn->state == BT_CLOSED) {
2055 2056
		err = cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
				   MGMT_STATUS_NOT_CONNECTED, &rp, sizeof(rp));
2057 2058 2059
		goto failed;
	}

2060
	cmd = mgmt_pending_add(sk, MGMT_OP_DISCONNECT, hdev, data, len);
2061 2062
	if (!cmd) {
		err = -ENOMEM;
2063
		goto failed;
2064
	}
2065

2066
	dc.handle = cpu_to_le16(conn->handle);
2067
	dc.reason = HCI_ERROR_REMOTE_USER_TERM;
2068 2069 2070

	err = hci_send_cmd(hdev, HCI_OP_DISCONNECT, sizeof(dc), &dc);
	if (err < 0)
2071
		mgmt_pending_remove(cmd);
2072 2073

failed:
2074
	hci_dev_unlock(hdev);
2075 2076 2077
	return err;
}

2078
static u8 link_to_bdaddr(u8 link_type, u8 addr_type)
2079 2080 2081
{
	switch (link_type) {
	case LE_LINK:
2082 2083
		switch (addr_type) {
		case ADDR_LE_DEV_PUBLIC:
2084
			return BDADDR_LE_PUBLIC;
2085

2086
		default:
2087
			/* Fallback to LE Random address type */
2088
			return BDADDR_LE_RANDOM;
2089
		}
2090

2091
	default:
2092
		/* Fallback to BR/EDR type */
2093
		return BDADDR_BREDR;
2094 2095 2096
	}
}

2097 2098
static int get_connections(struct sock *sk, struct hci_dev *hdev, void *data,
			   u16 data_len)
2099 2100
{
	struct mgmt_rp_get_connections *rp;
2101
	struct hci_conn *c;
2102
	size_t rp_len;
2103 2104
	int err;
	u16 i;
2105 2106 2107

	BT_DBG("");

2108
	hci_dev_lock(hdev);
2109

2110
	if (!hdev_is_powered(hdev)) {
2111
		err = cmd_status(sk, hdev->id, MGMT_OP_GET_CONNECTIONS,
2112
				 MGMT_STATUS_NOT_POWERED);
2113 2114 2115
		goto unlock;
	}

2116
	i = 0;
2117 2118
	list_for_each_entry(c, &hdev->conn_hash.list, list) {
		if (test_bit(HCI_CONN_MGMT_CONNECTED, &c->flags))
2119
			i++;
2120 2121
	}

2122
	rp_len = sizeof(*rp) + (i * sizeof(struct mgmt_addr_info));
2123
	rp = kmalloc(rp_len, GFP_KERNEL);
2124
	if (!rp) {
2125 2126 2127 2128 2129
		err = -ENOMEM;
		goto unlock;
	}

	i = 0;
2130
	list_for_each_entry(c, &hdev->conn_hash.list, list) {
2131 2132
		if (!test_bit(HCI_CONN_MGMT_CONNECTED, &c->flags))
			continue;
2133
		bacpy(&rp->addr[i].bdaddr, &c->dst);
2134
		rp->addr[i].type = link_to_bdaddr(c->type, c->dst_type);
2135
		if (c->type == SCO_LINK || c->type == ESCO_LINK)
2136 2137 2138 2139
			continue;
		i++;
	}

2140
	rp->conn_count = cpu_to_le16(i);
2141

2142 2143
	/* Recalculate length in case of filtered SCO connections, etc */
	rp_len = sizeof(*rp) + (i * sizeof(struct mgmt_addr_info));
2144

2145
	err = cmd_complete(sk, hdev->id, MGMT_OP_GET_CONNECTIONS, 0, rp,
2146
			   rp_len);
2147

2148
	kfree(rp);
2149 2150

unlock:
2151
	hci_dev_unlock(hdev);
2152 2153 2154
	return err;
}

2155
static int send_pin_code_neg_reply(struct sock *sk, struct hci_dev *hdev,
2156
				   struct mgmt_cp_pin_code_neg_reply *cp)
2157 2158 2159 2160
{
	struct pending_cmd *cmd;
	int err;

2161
	cmd = mgmt_pending_add(sk, MGMT_OP_PIN_CODE_NEG_REPLY, hdev, cp,
2162
			       sizeof(*cp));
2163 2164 2165
	if (!cmd)
		return -ENOMEM;

2166
	err = hci_send_cmd(hdev, HCI_OP_PIN_CODE_NEG_REPLY,
2167
			   sizeof(cp->addr.bdaddr), &cp->addr.bdaddr);
2168 2169 2170 2171 2172 2173
	if (err < 0)
		mgmt_pending_remove(cmd);

	return err;
}

2174
static int pin_code_reply(struct sock *sk, struct hci_dev *hdev, void *data,
2175
			  u16 len)
2176
{
2177
	struct hci_conn *conn;
2178
	struct mgmt_cp_pin_code_reply *cp = data;
2179
	struct hci_cp_pin_code_reply reply;
2180
	struct pending_cmd *cmd;
2181 2182 2183 2184
	int err;

	BT_DBG("");

2185
	hci_dev_lock(hdev);
2186

2187
	if (!hdev_is_powered(hdev)) {
2188
		err = cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
2189
				 MGMT_STATUS_NOT_POWERED);
2190 2191 2192
		goto failed;
	}

2193
	conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->addr.bdaddr);
2194
	if (!conn) {
2195
		err = cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
2196
				 MGMT_STATUS_NOT_CONNECTED);
2197 2198 2199 2200
		goto failed;
	}

	if (conn->pending_sec_level == BT_SECURITY_HIGH && cp->pin_len != 16) {
2201 2202 2203
		struct mgmt_cp_pin_code_neg_reply ncp;

		memcpy(&ncp.addr, &cp->addr, sizeof(ncp.addr));
2204 2205 2206

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

2207
		err = send_pin_code_neg_reply(sk, hdev, &ncp);
2208
		if (err >= 0)
2209
			err = cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
2210
					 MGMT_STATUS_INVALID_PARAMS);
2211 2212 2213 2214

		goto failed;
	}

2215
	cmd = mgmt_pending_add(sk, MGMT_OP_PIN_CODE_REPLY, hdev, data, len);
2216 2217
	if (!cmd) {
		err = -ENOMEM;
2218
		goto failed;
2219
	}
2220

2221
	bacpy(&reply.bdaddr, &cp->addr.bdaddr);
2222
	reply.pin_len = cp->pin_len;
2223
	memcpy(reply.pin_code, cp->pin_code, sizeof(reply.pin_code));
2224 2225 2226

	err = hci_send_cmd(hdev, HCI_OP_PIN_CODE_REPLY, sizeof(reply), &reply);
	if (err < 0)
2227
		mgmt_pending_remove(cmd);
2228 2229

failed:
2230
	hci_dev_unlock(hdev);
2231 2232 2233
	return err;
}

2234 2235
static int set_io_capability(struct sock *sk, struct hci_dev *hdev, void *data,
			     u16 len)
2236
{
2237
	struct mgmt_cp_set_io_capability *cp = data;
2238 2239 2240

	BT_DBG("");

2241
	hci_dev_lock(hdev);
2242 2243 2244 2245

	hdev->io_capability = cp->io_capability;

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

2248
	hci_dev_unlock(hdev);
2249

2250 2251
	return cmd_complete(sk, hdev->id, MGMT_OP_SET_IO_CAPABILITY, 0, NULL,
			    0);
2252 2253
}

2254
static struct pending_cmd *find_pairing(struct hci_conn *conn)
2255 2256
{
	struct hci_dev *hdev = conn->hdev;
2257
	struct pending_cmd *cmd;
2258

2259
	list_for_each_entry(cmd, &hdev->mgmt_pending, list) {
2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276
		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;

2277
	bacpy(&rp.addr.bdaddr, &conn->dst);
2278
	rp.addr.type = link_to_bdaddr(conn->type, conn->dst_type);
2279

2280
	cmd_complete(cmd->sk, cmd->index, MGMT_OP_PAIR_DEVICE, status,
2281
		     &rp, sizeof(rp));
2282 2283 2284 2285 2286 2287

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

2288
	hci_conn_drop(conn);
2289

2290
	mgmt_pending_remove(cmd);
2291 2292 2293 2294 2295 2296 2297 2298 2299
}

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

	BT_DBG("status %u", status);

	cmd = find_pairing(conn);
2300
	if (!cmd)
2301
		BT_DBG("Unable to find a pending command");
2302
	else
2303
		pairing_complete(cmd, mgmt_status(status));
2304 2305
}

2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321
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));
}

2322
static int pair_device(struct sock *sk, struct hci_dev *hdev, void *data,
2323
		       u16 len)
2324
{
2325
	struct mgmt_cp_pair_device *cp = data;
2326
	struct mgmt_rp_pair_device rp;
2327 2328 2329 2330 2331 2332 2333
	struct pending_cmd *cmd;
	u8 sec_level, auth_type;
	struct hci_conn *conn;
	int err;

	BT_DBG("");

2334 2335 2336 2337
	memset(&rp, 0, sizeof(rp));
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;

2338 2339 2340 2341 2342
	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));

2343
	hci_dev_lock(hdev);
2344

2345
	if (!hdev_is_powered(hdev)) {
2346 2347
		err = cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
				   MGMT_STATUS_NOT_POWERED, &rp, sizeof(rp));
2348 2349 2350
		goto unlock;
	}

2351 2352
	sec_level = BT_SECURITY_MEDIUM;
	if (cp->io_cap == 0x03)
2353
		auth_type = HCI_AT_DEDICATED_BONDING;
2354
	else
2355 2356
		auth_type = HCI_AT_DEDICATED_BONDING_MITM;

2357
	if (cp->addr.type == BDADDR_BREDR)
2358 2359
		conn = hci_connect(hdev, ACL_LINK, &cp->addr.bdaddr,
				   cp->addr.type, sec_level, auth_type);
2360
	else
2361 2362
		conn = hci_connect(hdev, LE_LINK, &cp->addr.bdaddr,
				   cp->addr.type, sec_level, auth_type);
2363

2364
	if (IS_ERR(conn)) {
2365 2366 2367 2368 2369 2370 2371
		int status;

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

2372
		err = cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
2373
				   status, &rp,
2374
				   sizeof(rp));
2375 2376 2377 2378
		goto unlock;
	}

	if (conn->connect_cfm_cb) {
2379
		hci_conn_drop(conn);
2380
		err = cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
2381
				   MGMT_STATUS_BUSY, &rp, sizeof(rp));
2382 2383 2384
		goto unlock;
	}

2385
	cmd = mgmt_pending_add(sk, MGMT_OP_PAIR_DEVICE, hdev, data, len);
2386 2387
	if (!cmd) {
		err = -ENOMEM;
2388
		hci_conn_drop(conn);
2389 2390 2391
		goto unlock;
	}

2392
	/* For LE, just connecting isn't a proof that the pairing finished */
2393
	if (cp->addr.type == BDADDR_BREDR)
2394
		conn->connect_cfm_cb = pairing_complete_cb;
2395 2396
	else
		conn->connect_cfm_cb = le_connect_complete_cb;
2397

2398 2399 2400 2401 2402 2403
	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 &&
2404
	    hci_conn_security(conn, sec_level, auth_type))
2405 2406 2407 2408 2409
		pairing_complete(cmd, 0);

	err = 0;

unlock:
2410
	hci_dev_unlock(hdev);
2411 2412 2413
	return err;
}

2414 2415
static int cancel_pair_device(struct sock *sk, struct hci_dev *hdev, void *data,
			      u16 len)
2416
{
2417
	struct mgmt_addr_info *addr = data;
2418 2419 2420 2421 2422 2423 2424 2425
	struct pending_cmd *cmd;
	struct hci_conn *conn;
	int err;

	BT_DBG("");

	hci_dev_lock(hdev);

2426
	if (!hdev_is_powered(hdev)) {
2427
		err = cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE,
2428
				 MGMT_STATUS_NOT_POWERED);
2429 2430 2431
		goto unlock;
	}

2432 2433
	cmd = mgmt_pending_find(MGMT_OP_PAIR_DEVICE, hdev);
	if (!cmd) {
2434
		err = cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE,
2435
				 MGMT_STATUS_INVALID_PARAMS);
2436 2437 2438 2439 2440 2441
		goto unlock;
	}

	conn = cmd->user_data;

	if (bacmp(&addr->bdaddr, &conn->dst) != 0) {
2442
		err = cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE,
2443
				 MGMT_STATUS_INVALID_PARAMS);
2444 2445 2446 2447 2448
		goto unlock;
	}

	pairing_complete(cmd, MGMT_STATUS_CANCELLED);

2449
	err = cmd_complete(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE, 0,
2450
			   addr, sizeof(*addr));
2451 2452 2453 2454 2455
unlock:
	hci_dev_unlock(hdev);
	return err;
}

2456
static int user_pairing_resp(struct sock *sk, struct hci_dev *hdev,
2457
			     struct mgmt_addr_info *addr, u16 mgmt_op,
2458
			     u16 hci_op, __le32 passkey)
2459 2460
{
	struct pending_cmd *cmd;
2461
	struct hci_conn *conn;
2462 2463
	int err;

2464
	hci_dev_lock(hdev);
2465

2466
	if (!hdev_is_powered(hdev)) {
2467 2468 2469
		err = cmd_complete(sk, hdev->id, mgmt_op,
				   MGMT_STATUS_NOT_POWERED, addr,
				   sizeof(*addr));
2470
		goto done;
2471 2472
	}

2473 2474
	if (addr->type == BDADDR_BREDR)
		conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &addr->bdaddr);
2475
	else
2476
		conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &addr->bdaddr);
2477 2478

	if (!conn) {
2479 2480 2481
		err = cmd_complete(sk, hdev->id, mgmt_op,
				   MGMT_STATUS_NOT_CONNECTED, addr,
				   sizeof(*addr));
2482 2483
		goto done;
	}
2484

2485
	if (addr->type == BDADDR_LE_PUBLIC || addr->type == BDADDR_LE_RANDOM) {
2486
		/* Continue with pairing via SMP */
2487 2488 2489
		err = smp_user_confirm_reply(conn, mgmt_op, passkey);

		if (!err)
2490 2491 2492
			err = cmd_complete(sk, hdev->id, mgmt_op,
					   MGMT_STATUS_SUCCESS, addr,
					   sizeof(*addr));
2493
		else
2494 2495 2496
			err = cmd_complete(sk, hdev->id, mgmt_op,
					   MGMT_STATUS_FAILED, addr,
					   sizeof(*addr));
2497 2498 2499 2500

		goto done;
	}

2501
	cmd = mgmt_pending_add(sk, mgmt_op, hdev, addr, sizeof(*addr));
2502 2503
	if (!cmd) {
		err = -ENOMEM;
2504
		goto done;
2505 2506
	}

2507
	/* Continue with pairing via HCI */
2508 2509 2510
	if (hci_op == HCI_OP_USER_PASSKEY_REPLY) {
		struct hci_cp_user_passkey_reply cp;

2511
		bacpy(&cp.bdaddr, &addr->bdaddr);
2512 2513 2514
		cp.passkey = passkey;
		err = hci_send_cmd(hdev, hci_op, sizeof(cp), &cp);
	} else
2515 2516
		err = hci_send_cmd(hdev, hci_op, sizeof(addr->bdaddr),
				   &addr->bdaddr);
2517

2518 2519
	if (err < 0)
		mgmt_pending_remove(cmd);
2520

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

2526 2527 2528 2529 2530 2531 2532
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("");

2533
	return user_pairing_resp(sk, hdev, &cp->addr,
2534 2535 2536 2537
				MGMT_OP_PIN_CODE_NEG_REPLY,
				HCI_OP_PIN_CODE_NEG_REPLY, 0);
}

2538 2539
static int user_confirm_reply(struct sock *sk, struct hci_dev *hdev, void *data,
			      u16 len)
2540
{
2541
	struct mgmt_cp_user_confirm_reply *cp = data;
2542 2543 2544 2545

	BT_DBG("");

	if (len != sizeof(*cp))
2546
		return cmd_status(sk, hdev->id, MGMT_OP_USER_CONFIRM_REPLY,
2547
				  MGMT_STATUS_INVALID_PARAMS);
2548

2549
	return user_pairing_resp(sk, hdev, &cp->addr,
2550 2551
				 MGMT_OP_USER_CONFIRM_REPLY,
				 HCI_OP_USER_CONFIRM_REPLY, 0);
2552 2553
}

2554
static int user_confirm_neg_reply(struct sock *sk, struct hci_dev *hdev,
2555
				  void *data, u16 len)
2556
{
2557
	struct mgmt_cp_user_confirm_neg_reply *cp = data;
2558 2559 2560

	BT_DBG("");

2561
	return user_pairing_resp(sk, hdev, &cp->addr,
2562 2563
				 MGMT_OP_USER_CONFIRM_NEG_REPLY,
				 HCI_OP_USER_CONFIRM_NEG_REPLY, 0);
2564 2565
}

2566 2567
static int user_passkey_reply(struct sock *sk, struct hci_dev *hdev, void *data,
			      u16 len)
2568
{
2569
	struct mgmt_cp_user_passkey_reply *cp = data;
2570 2571 2572

	BT_DBG("");

2573
	return user_pairing_resp(sk, hdev, &cp->addr,
2574 2575
				 MGMT_OP_USER_PASSKEY_REPLY,
				 HCI_OP_USER_PASSKEY_REPLY, cp->passkey);
2576 2577
}

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

	BT_DBG("");

2585
	return user_pairing_resp(sk, hdev, &cp->addr,
2586 2587
				 MGMT_OP_USER_PASSKEY_NEG_REPLY,
				 HCI_OP_USER_PASSKEY_NEG_REPLY, 0);
2588 2589
}

2590
static void update_name(struct hci_request *req)
2591
{
2592
	struct hci_dev *hdev = req->hdev;
2593 2594
	struct hci_cp_write_local_name cp;

2595
	memcpy(cp.name, hdev->dev_name, sizeof(cp.name));
2596

2597
	hci_req_add(req, HCI_OP_WRITE_LOCAL_NAME, sizeof(cp), &cp);
2598 2599
}

2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627
static void set_name_complete(struct hci_dev *hdev, u8 status)
{
	struct mgmt_cp_set_local_name *cp;
	struct pending_cmd *cmd;

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

	hci_dev_lock(hdev);

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

	cp = cmd->param;

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

	mgmt_pending_remove(cmd);

unlock:
	hci_dev_unlock(hdev);
}

2628
static int set_local_name(struct sock *sk, struct hci_dev *hdev, void *data,
2629
			  u16 len)
2630
{
2631
	struct mgmt_cp_set_local_name *cp = data;
2632
	struct pending_cmd *cmd;
2633
	struct hci_request req;
2634 2635 2636 2637
	int err;

	BT_DBG("");

2638
	hci_dev_lock(hdev);
2639

2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650
	/* If the old values are the same as the new ones just return a
	 * direct command complete event.
	 */
	if (!memcmp(hdev->dev_name, cp->name, sizeof(hdev->dev_name)) &&
	    !memcmp(hdev->short_name, cp->short_name,
		    sizeof(hdev->short_name))) {
		err = cmd_complete(sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, 0,
				   data, len);
		goto failed;
	}

2651
	memcpy(hdev->short_name, cp->short_name, sizeof(hdev->short_name));
2652

2653
	if (!hdev_is_powered(hdev)) {
2654
		memcpy(hdev->dev_name, cp->name, sizeof(hdev->dev_name));
2655 2656

		err = cmd_complete(sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, 0,
2657
				   data, len);
2658 2659 2660 2661
		if (err < 0)
			goto failed;

		err = mgmt_event(MGMT_EV_LOCAL_NAME_CHANGED, hdev, data, len,
2662
				 sk);
2663

2664 2665 2666
		goto failed;
	}

2667
	cmd = mgmt_pending_add(sk, MGMT_OP_SET_LOCAL_NAME, hdev, data, len);
2668 2669 2670 2671 2672
	if (!cmd) {
		err = -ENOMEM;
		goto failed;
	}

2673 2674
	memcpy(hdev->dev_name, cp->name, sizeof(hdev->dev_name));

2675
	hci_req_init(&req, hdev);
2676 2677 2678 2679 2680 2681 2682 2683 2684

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

	if (lmp_le_capable(hdev))
		hci_update_ad(&req);

2685
	err = hci_req_run(&req, set_name_complete);
2686 2687 2688 2689
	if (err < 0)
		mgmt_pending_remove(cmd);

failed:
2690
	hci_dev_unlock(hdev);
2691 2692 2693
	return err;
}

2694
static int read_local_oob_data(struct sock *sk, struct hci_dev *hdev,
2695
			       void *data, u16 data_len)
2696 2697 2698 2699
{
	struct pending_cmd *cmd;
	int err;

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

2702
	hci_dev_lock(hdev);
2703

2704
	if (!hdev_is_powered(hdev)) {
2705
		err = cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
2706
				 MGMT_STATUS_NOT_POWERED);
2707 2708 2709
		goto unlock;
	}

2710
	if (!lmp_ssp_capable(hdev)) {
2711
		err = cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
2712
				 MGMT_STATUS_NOT_SUPPORTED);
2713 2714 2715
		goto unlock;
	}

2716
	if (mgmt_pending_find(MGMT_OP_READ_LOCAL_OOB_DATA, hdev)) {
2717
		err = cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
2718
				 MGMT_STATUS_BUSY);
2719 2720 2721
		goto unlock;
	}

2722
	cmd = mgmt_pending_add(sk, MGMT_OP_READ_LOCAL_OOB_DATA, hdev, NULL, 0);
2723 2724 2725 2726 2727 2728 2729 2730 2731 2732
	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:
2733
	hci_dev_unlock(hdev);
2734 2735 2736
	return err;
}

2737
static int add_remote_oob_data(struct sock *sk, struct hci_dev *hdev,
2738
			       void *data, u16 len)
2739
{
2740
	struct mgmt_cp_add_remote_oob_data *cp = data;
2741
	u8 status;
2742 2743
	int err;

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

2746
	hci_dev_lock(hdev);
2747

2748
	err = hci_add_remote_oob_data(hdev, &cp->addr.bdaddr, cp->hash,
2749
				      cp->randomizer);
2750
	if (err < 0)
2751
		status = MGMT_STATUS_FAILED;
2752
	else
2753
		status = MGMT_STATUS_SUCCESS;
2754

2755
	err = cmd_complete(sk, hdev->id, MGMT_OP_ADD_REMOTE_OOB_DATA, status,
2756
			   &cp->addr, sizeof(cp->addr));
2757

2758
	hci_dev_unlock(hdev);
2759 2760 2761
	return err;
}

2762
static int remove_remote_oob_data(struct sock *sk, struct hci_dev *hdev,
2763
				  void *data, u16 len)
2764
{
2765
	struct mgmt_cp_remove_remote_oob_data *cp = data;
2766
	u8 status;
2767 2768
	int err;

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

2771
	hci_dev_lock(hdev);
2772

2773
	err = hci_remove_remote_oob_data(hdev, &cp->addr.bdaddr);
2774
	if (err < 0)
2775
		status = MGMT_STATUS_INVALID_PARAMS;
2776
	else
2777
		status = MGMT_STATUS_SUCCESS;
2778

2779
	err = cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_REMOTE_OOB_DATA,
2780
			   status, &cp->addr, sizeof(cp->addr));
2781

2782
	hci_dev_unlock(hdev);
2783 2784 2785
	return err;
}

2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806
static int mgmt_start_discovery_failed(struct hci_dev *hdev, u8 status)
{
	struct pending_cmd *cmd;
	u8 type;
	int err;

	hci_discovery_set_state(hdev, DISCOVERY_STOPPED);

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

	type = hdev->discovery.type;

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

	return err;
}

2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824
static void start_discovery_complete(struct hci_dev *hdev, u8 status)
{
	BT_DBG("status %d", status);

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

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

	switch (hdev->discovery.type) {
	case DISCOV_TYPE_LE:
		queue_delayed_work(hdev->workqueue, &hdev->le_scan_disable,
2825
				   DISCOV_LE_TIMEOUT);
2826 2827 2828 2829
		break;

	case DISCOV_TYPE_INTERLEAVED:
		queue_delayed_work(hdev->workqueue, &hdev->le_scan_disable,
2830
				   DISCOV_INTERLEAVED_TIMEOUT);
2831 2832 2833 2834 2835 2836 2837 2838 2839 2840
		break;

	case DISCOV_TYPE_BREDR:
		break;

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

2841
static int start_discovery(struct sock *sk, struct hci_dev *hdev,
2842
			   void *data, u16 len)
2843
{
2844
	struct mgmt_cp_start_discovery *cp = data;
2845
	struct pending_cmd *cmd;
2846 2847 2848 2849 2850 2851
	struct hci_cp_le_set_scan_param param_cp;
	struct hci_cp_le_set_scan_enable enable_cp;
	struct hci_cp_inquiry inq_cp;
	struct hci_request req;
	/* General inquiry access code (GIAC) */
	u8 lap[3] = { 0x33, 0x8b, 0x9e };
2852
	u8 status;
2853 2854
	int err;

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

2857
	hci_dev_lock(hdev);
2858

2859
	if (!hdev_is_powered(hdev)) {
2860
		err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
2861
				 MGMT_STATUS_NOT_POWERED);
2862 2863 2864
		goto failed;
	}

2865 2866 2867 2868 2869 2870
	if (test_bit(HCI_PERIODIC_INQ, &hdev->dev_flags)) {
		err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
				 MGMT_STATUS_BUSY);
		goto failed;
	}

2871
	if (hdev->discovery.state != DISCOVERY_STOPPED) {
2872
		err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
2873
				 MGMT_STATUS_BUSY);
2874 2875 2876
		goto failed;
	}

2877
	cmd = mgmt_pending_add(sk, MGMT_OP_START_DISCOVERY, hdev, NULL, 0);
2878 2879 2880 2881 2882
	if (!cmd) {
		err = -ENOMEM;
		goto failed;
	}

A
Andre Guedes 已提交
2883 2884
	hdev->discovery.type = cp->type;

2885 2886
	hci_req_init(&req, hdev);

A
Andre Guedes 已提交
2887
	switch (hdev->discovery.type) {
2888
	case DISCOV_TYPE_BREDR:
2889 2890
		status = mgmt_bredr_support(hdev);
		if (status) {
2891
			err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
2892
					 status);
2893 2894 2895 2896
			mgmt_pending_remove(cmd);
			goto failed;
		}

2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907
		if (test_bit(HCI_INQUIRY, &hdev->flags)) {
			err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
					 MGMT_STATUS_BUSY);
			mgmt_pending_remove(cmd);
			goto failed;
		}

		hci_inquiry_cache_flush(hdev);

		memset(&inq_cp, 0, sizeof(inq_cp));
		memcpy(&inq_cp.lap, lap, sizeof(inq_cp.lap));
2908
		inq_cp.length = DISCOV_BREDR_INQUIRY_LEN;
2909
		hci_req_add(&req, HCI_OP_INQUIRY, sizeof(inq_cp), &inq_cp);
2910 2911 2912
		break;

	case DISCOV_TYPE_LE:
2913
	case DISCOV_TYPE_INTERLEAVED:
2914 2915
		status = mgmt_le_support(hdev);
		if (status) {
2916
			err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
2917
					 status);
2918 2919 2920 2921
			mgmt_pending_remove(cmd);
			goto failed;
		}

2922
		if (hdev->discovery.type == DISCOV_TYPE_INTERLEAVED &&
2923
		    !test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags)) {
2924 2925 2926 2927 2928 2929
			err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
					 MGMT_STATUS_NOT_SUPPORTED);
			mgmt_pending_remove(cmd);
			goto failed;
		}

2930
		if (test_bit(HCI_ADVERTISING, &hdev->dev_flags)) {
2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945
			err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
					 MGMT_STATUS_REJECTED);
			mgmt_pending_remove(cmd);
			goto failed;
		}

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

		memset(&param_cp, 0, sizeof(param_cp));
		param_cp.type = LE_SCAN_ACTIVE;
2946 2947
		param_cp.interval = cpu_to_le16(DISCOV_LE_SCAN_INT);
		param_cp.window = cpu_to_le16(DISCOV_LE_SCAN_WIN);
2948 2949 2950 2951
		if (bacmp(&hdev->bdaddr, BDADDR_ANY))
			param_cp.own_address_type = ADDR_LE_DEV_PUBLIC;
		else
			param_cp.own_address_type = ADDR_LE_DEV_RANDOM;
2952 2953 2954 2955 2956 2957 2958 2959
		hci_req_add(&req, HCI_OP_LE_SET_SCAN_PARAM, sizeof(param_cp),
			    &param_cp);

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

2962
	default:
2963 2964 2965 2966
		err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
				 MGMT_STATUS_INVALID_PARAMS);
		mgmt_pending_remove(cmd);
		goto failed;
2967
	}
2968

2969
	err = hci_req_run(&req, start_discovery_complete);
2970 2971
	if (err < 0)
		mgmt_pending_remove(cmd);
2972 2973
	else
		hci_discovery_set_state(hdev, DISCOVERY_STARTING);
2974 2975

failed:
2976
	hci_dev_unlock(hdev);
2977 2978 2979
	return err;
}

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

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

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

	return err;
}

2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012
static void stop_discovery_complete(struct hci_dev *hdev, u8 status)
{
	BT_DBG("status %d", status);

	hci_dev_lock(hdev);

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

	hci_discovery_set_state(hdev, DISCOVERY_STOPPED);

unlock:
	hci_dev_unlock(hdev);
}

3013
static int stop_discovery(struct sock *sk, struct hci_dev *hdev, void *data,
3014
			  u16 len)
3015
{
3016
	struct mgmt_cp_stop_discovery *mgmt_cp = data;
3017
	struct pending_cmd *cmd;
3018 3019
	struct hci_cp_remote_name_req_cancel cp;
	struct inquiry_entry *e;
3020 3021
	struct hci_request req;
	struct hci_cp_le_set_scan_enable enable_cp;
3022 3023
	int err;

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

3026
	hci_dev_lock(hdev);
3027

3028
	if (!hci_discovery_active(hdev)) {
3029
		err = cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY,
3030 3031
				   MGMT_STATUS_REJECTED, &mgmt_cp->type,
				   sizeof(mgmt_cp->type));
3032 3033 3034 3035
		goto unlock;
	}

	if (hdev->discovery.type != mgmt_cp->type) {
3036
		err = cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY,
3037 3038
				   MGMT_STATUS_INVALID_PARAMS, &mgmt_cp->type,
				   sizeof(mgmt_cp->type));
3039
		goto unlock;
3040 3041
	}

3042
	cmd = mgmt_pending_add(sk, MGMT_OP_STOP_DISCOVERY, hdev, NULL, 0);
3043 3044
	if (!cmd) {
		err = -ENOMEM;
3045 3046 3047
		goto unlock;
	}

3048 3049
	hci_req_init(&req, hdev);

3050 3051
	switch (hdev->discovery.state) {
	case DISCOVERY_FINDING:
3052 3053 3054 3055 3056 3057 3058 3059 3060 3061
		if (test_bit(HCI_INQUIRY, &hdev->flags)) {
			hci_req_add(&req, HCI_OP_INQUIRY_CANCEL, 0, NULL);
		} else {
			cancel_delayed_work(&hdev->le_scan_disable);

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

3063 3064 3065 3066
		break;

	case DISCOVERY_RESOLVING:
		e = hci_inquiry_cache_lookup_resolve(hdev, BDADDR_ANY,
3067
						     NAME_PENDING);
3068
		if (!e) {
3069
			mgmt_pending_remove(cmd);
3070 3071 3072 3073 3074 3075 3076
			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;
		}
3077

3078
		bacpy(&cp.bdaddr, &e->data.bdaddr);
3079 3080
		hci_req_add(&req, HCI_OP_REMOTE_NAME_REQ_CANCEL, sizeof(cp),
			    &cp);
3081 3082 3083 3084 3085

		break;

	default:
		BT_DBG("unknown discovery state %u", hdev->discovery.state);
3086 3087 3088 3089 3090 3091

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

3094
	err = hci_req_run(&req, stop_discovery_complete);
3095 3096
	if (err < 0)
		mgmt_pending_remove(cmd);
3097 3098
	else
		hci_discovery_set_state(hdev, DISCOVERY_STOPPING);
3099

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

3105
static int confirm_name(struct sock *sk, struct hci_dev *hdev, void *data,
3106
			u16 len)
3107
{
3108
	struct mgmt_cp_confirm_name *cp = data;
3109 3110 3111
	struct inquiry_entry *e;
	int err;

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

	hci_dev_lock(hdev);

3116
	if (!hci_discovery_active(hdev)) {
3117
		err = cmd_status(sk, hdev->id, MGMT_OP_CONFIRM_NAME,
3118
				 MGMT_STATUS_FAILED);
3119 3120 3121
		goto failed;
	}

3122
	e = hci_inquiry_cache_lookup_unknown(hdev, &cp->addr.bdaddr);
3123
	if (!e) {
3124
		err = cmd_status(sk, hdev->id, MGMT_OP_CONFIRM_NAME,
3125
				 MGMT_STATUS_INVALID_PARAMS);
3126 3127 3128 3129 3130 3131 3132 3133
		goto failed;
	}

	if (cp->name_known) {
		e->name_state = NAME_KNOWN;
		list_del(&e->list);
	} else {
		e->name_state = NAME_NEEDED;
3134
		hci_inquiry_cache_update_resolve(hdev, e);
3135 3136
	}

3137 3138
	err = cmd_complete(sk, hdev->id, MGMT_OP_CONFIRM_NAME, 0, &cp->addr,
			   sizeof(cp->addr));
3139 3140 3141 3142 3143 3144

failed:
	hci_dev_unlock(hdev);
	return err;
}

3145
static int block_device(struct sock *sk, struct hci_dev *hdev, void *data,
3146
			u16 len)
3147
{
3148
	struct mgmt_cp_block_device *cp = data;
3149
	u8 status;
3150 3151
	int err;

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

3154
	if (!bdaddr_type_is_valid(cp->addr.type))
3155 3156 3157
		return cmd_complete(sk, hdev->id, MGMT_OP_BLOCK_DEVICE,
				    MGMT_STATUS_INVALID_PARAMS,
				    &cp->addr, sizeof(cp->addr));
3158

3159
	hci_dev_lock(hdev);
3160

3161
	err = hci_blacklist_add(hdev, &cp->addr.bdaddr, cp->addr.type);
3162
	if (err < 0)
3163
		status = MGMT_STATUS_FAILED;
3164
	else
3165
		status = MGMT_STATUS_SUCCESS;
3166

3167
	err = cmd_complete(sk, hdev->id, MGMT_OP_BLOCK_DEVICE, status,
3168
			   &cp->addr, sizeof(cp->addr));
3169

3170
	hci_dev_unlock(hdev);
3171 3172 3173 3174

	return err;
}

3175
static int unblock_device(struct sock *sk, struct hci_dev *hdev, void *data,
3176
			  u16 len)
3177
{
3178
	struct mgmt_cp_unblock_device *cp = data;
3179
	u8 status;
3180 3181
	int err;

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

3184
	if (!bdaddr_type_is_valid(cp->addr.type))
3185 3186 3187
		return cmd_complete(sk, hdev->id, MGMT_OP_UNBLOCK_DEVICE,
				    MGMT_STATUS_INVALID_PARAMS,
				    &cp->addr, sizeof(cp->addr));
3188

3189
	hci_dev_lock(hdev);
3190

3191
	err = hci_blacklist_del(hdev, &cp->addr.bdaddr, cp->addr.type);
3192
	if (err < 0)
3193
		status = MGMT_STATUS_INVALID_PARAMS;
3194
	else
3195
		status = MGMT_STATUS_SUCCESS;
3196

3197
	err = cmd_complete(sk, hdev->id, MGMT_OP_UNBLOCK_DEVICE, status,
3198
			   &cp->addr, sizeof(cp->addr));
3199

3200
	hci_dev_unlock(hdev);
3201 3202 3203 3204

	return err;
}

3205 3206 3207 3208
static int set_device_id(struct sock *sk, struct hci_dev *hdev, void *data,
			 u16 len)
{
	struct mgmt_cp_set_device_id *cp = data;
3209
	struct hci_request req;
3210
	int err;
3211
	__u16 source;
3212 3213 3214

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

3215 3216 3217 3218 3219 3220
	source = __le16_to_cpu(cp->source);

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

3221 3222
	hci_dev_lock(hdev);

3223
	hdev->devid_source = source;
3224 3225 3226 3227 3228 3229
	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);

3230 3231 3232
	hci_req_init(&req, hdev);
	update_eir(&req);
	hci_req_run(&req, NULL);
3233 3234 3235 3236 3237 3238

	hci_dev_unlock(hdev);

	return err;
}

3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259
static void set_advertising_complete(struct hci_dev *hdev, u8 status)
{
	struct cmd_lookup match = { NULL, hdev };

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

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

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

	new_settings(hdev, match.sk);

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

3260 3261
static int set_advertising(struct sock *sk, struct hci_dev *hdev, void *data,
			   u16 len)
3262 3263 3264 3265
{
	struct mgmt_mode *cp = data;
	struct pending_cmd *cmd;
	struct hci_request req;
3266
	u8 val, enabled, status;
3267 3268 3269 3270
	int err;

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

3271 3272
	status = mgmt_le_support(hdev);
	if (status)
3273
		return cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING,
3274
				  status);
3275 3276 3277 3278 3279 3280 3281 3282

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

	hci_dev_lock(hdev);

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

3285 3286 3287 3288 3289 3290
	/* The following conditions are ones which mean that we should
	 * not do any HCI communication but directly send a mgmt
	 * response to user space (after toggling the flag if
	 * necessary).
	 */
	if (!hdev_is_powered(hdev) || val == enabled ||
3291
	    hci_conn_num(hdev, LE_LINK) > 0) {
3292 3293
		bool changed = false;

3294 3295
		if (val != test_bit(HCI_ADVERTISING, &hdev->dev_flags)) {
			change_bit(HCI_ADVERTISING, &hdev->dev_flags);
3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323
			changed = true;
		}

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

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

		goto unlock;
	}

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

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

	hci_req_init(&req, hdev);

3324 3325 3326 3327
	if (val)
		enable_advertising(&req);
	else
		disable_advertising(&req);
3328 3329 3330 3331 3332 3333 3334 3335 3336 3337

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

unlock:
	hci_dev_unlock(hdev);
	return err;
}

3338 3339 3340 3341 3342 3343 3344 3345
static int set_static_address(struct sock *sk, struct hci_dev *hdev,
			      void *data, u16 len)
{
	struct mgmt_cp_set_static_address *cp = data;
	int err;

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

3346
	if (!lmp_le_capable(hdev))
3347
		return cmd_status(sk, hdev->id, MGMT_OP_SET_STATIC_ADDRESS,
3348
				  MGMT_STATUS_NOT_SUPPORTED);
3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377

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

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

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

	hci_dev_lock(hdev);

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

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

	hci_dev_unlock(hdev);

	return err;
}

3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414
static int set_scan_params(struct sock *sk, struct hci_dev *hdev,
			   void *data, u16 len)
{
	struct mgmt_cp_set_scan_params *cp = data;
	__u16 interval, window;
	int err;

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

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

	interval = __le16_to_cpu(cp->interval);

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

	window = __le16_to_cpu(cp->window);

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

	hci_dev_lock(hdev);

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

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

	hci_dev_unlock(hdev);

	return err;
}

3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430
static void fast_connectable_complete(struct hci_dev *hdev, u8 status)
{
	struct pending_cmd *cmd;

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

	hci_dev_lock(hdev);

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

	if (status) {
		cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
			   mgmt_status(status));
	} else {
3431 3432 3433 3434 3435 3436 3437
		struct mgmt_mode *cp = cmd->param;

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

3438 3439 3440 3441 3442 3443 3444 3445 3446 3447
		send_settings_rsp(cmd->sk, MGMT_OP_SET_FAST_CONNECTABLE, hdev);
		new_settings(hdev, cmd->sk);
	}

	mgmt_pending_remove(cmd);

unlock:
	hci_dev_unlock(hdev);
}

3448
static int set_fast_connectable(struct sock *sk, struct hci_dev *hdev,
3449
				void *data, u16 len)
3450
{
3451
	struct mgmt_mode *cp = data;
3452 3453
	struct pending_cmd *cmd;
	struct hci_request req;
3454 3455
	int err;

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

3458 3459
	if (!test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags) ||
	    hdev->hci_ver < BLUETOOTH_VER_1_2)
3460 3461 3462
		return cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
				  MGMT_STATUS_NOT_SUPPORTED);

3463 3464 3465 3466
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
				  MGMT_STATUS_INVALID_PARAMS);

3467
	if (!hdev_is_powered(hdev))
3468
		return cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
3469
				  MGMT_STATUS_NOT_POWERED);
3470 3471

	if (!test_bit(HCI_CONNECTABLE, &hdev->dev_flags))
3472
		return cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
3473
				  MGMT_STATUS_REJECTED);
3474 3475 3476

	hci_dev_lock(hdev);

3477 3478 3479 3480 3481 3482
	if (mgmt_pending_find(MGMT_OP_SET_FAST_CONNECTABLE, hdev)) {
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
				 MGMT_STATUS_BUSY);
		goto unlock;
	}

3483 3484 3485 3486 3487 3488
	if (!!cp->val == test_bit(HCI_FAST_CONNECTABLE, &hdev->dev_flags)) {
		err = send_settings_rsp(sk, MGMT_OP_SET_FAST_CONNECTABLE,
					hdev);
		goto unlock;
	}

3489 3490 3491 3492 3493
	cmd = mgmt_pending_add(sk, MGMT_OP_SET_FAST_CONNECTABLE, hdev,
			       data, len);
	if (!cmd) {
		err = -ENOMEM;
		goto unlock;
3494 3495
	}

3496 3497
	hci_req_init(&req, hdev);

3498
	write_fast_connectable(&req, cp->val);
3499 3500

	err = hci_req_run(&req, fast_connectable_complete);
3501
	if (err < 0) {
3502
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
3503
				 MGMT_STATUS_FAILED);
3504
		mgmt_pending_remove(cmd);
3505 3506
	}

3507
unlock:
3508
	hci_dev_unlock(hdev);
3509

3510 3511 3512
	return err;
}

3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627
static void set_bredr_complete(struct hci_dev *hdev, u8 status)
{
	struct pending_cmd *cmd;

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

	hci_dev_lock(hdev);

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

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

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

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

	mgmt_pending_remove(cmd);

unlock:
	hci_dev_unlock(hdev);
}

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

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

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

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

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

	hci_dev_lock(hdev);

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

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

		change_bit(HCI_BREDR_ENABLED, &hdev->dev_flags);

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

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

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

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

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

	/* We need to flip the bit already here so that hci_update_ad
	 * generates the correct flags.
	 */
	set_bit(HCI_BREDR_ENABLED, &hdev->dev_flags);

	hci_req_init(&req, hdev);
	hci_update_ad(&req);
	err = hci_req_run(&req, set_bredr_complete);
	if (err < 0)
		mgmt_pending_remove(cmd);

unlock:
	hci_dev_unlock(hdev);
	return err;
}

3628 3629
static bool ltk_is_valid(struct mgmt_ltk_info *key)
{
3630 3631
	if (key->authenticated != 0x00 && key->authenticated != 0x01)
		return false;
3632 3633
	if (key->master != 0x00 && key->master != 0x01)
		return false;
3634 3635
	if (!bdaddr_type_is_le(key->addr.type))
		return false;
3636 3637 3638
	return true;
}

3639
static int load_long_term_keys(struct sock *sk, struct hci_dev *hdev,
3640
			       void *cp_data, u16 len)
3641 3642 3643
{
	struct mgmt_cp_load_long_term_keys *cp = cp_data;
	u16 key_count, expected_len;
3644
	int i, err;
3645

3646 3647 3648 3649 3650 3651
	BT_DBG("request for %s", hdev->name);

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

3652
	key_count = __le16_to_cpu(cp->key_count);
3653 3654 3655 3656 3657

	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",
3658
		       len, expected_len);
3659
		return cmd_status(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS,
3660
				  MGMT_STATUS_INVALID_PARAMS);
3661 3662
	}

3663
	BT_DBG("%s key_count %u", hdev->name, key_count);
3664

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

3668
		if (!ltk_is_valid(key))
3669 3670 3671 3672 3673
			return cmd_status(sk, hdev->id,
					  MGMT_OP_LOAD_LONG_TERM_KEYS,
					  MGMT_STATUS_INVALID_PARAMS);
	}

3674 3675 3676 3677 3678 3679 3680 3681 3682 3683 3684 3685 3686
	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;

3687
		hci_add_ltk(hdev, &key->addr.bdaddr,
3688
			    bdaddr_to_le(key->addr.type),
3689 3690
			    type, 0, key->authenticated, key->val,
			    key->enc_size, key->ediv, key->rand);
3691 3692
	}

3693 3694 3695
	err = cmd_complete(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS, 0,
			   NULL, 0);

3696 3697
	hci_dev_unlock(hdev);

3698
	return err;
3699 3700
}

3701
static const struct mgmt_handler {
3702 3703
	int (*func) (struct sock *sk, struct hci_dev *hdev, void *data,
		     u16 data_len);
3704 3705
	bool var_len;
	size_t data_len;
3706 3707
} mgmt_handlers[] = {
	{ NULL }, /* 0x0000 (no command) */
3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746
	{ 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 },
3747
	{ set_device_id,          false, MGMT_SET_DEVICE_ID_SIZE },
3748
	{ set_advertising,        false, MGMT_SETTING_SIZE },
3749
	{ set_bredr,              false, MGMT_SETTING_SIZE },
3750
	{ set_static_address,     false, MGMT_SET_STATIC_ADDRESS_SIZE },
3751
	{ set_scan_params,        false, MGMT_SET_SCAN_PARAMS_SIZE },
3752 3753 3754
};


3755 3756
int mgmt_control(struct sock *sk, struct msghdr *msg, size_t msglen)
{
3757 3758
	void *buf;
	u8 *cp;
3759
	struct mgmt_hdr *hdr;
3760
	u16 opcode, index, len;
3761
	struct hci_dev *hdev = NULL;
3762
	const struct mgmt_handler *handler;
3763 3764 3765 3766 3767 3768 3769
	int err;

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

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

3770
	buf = kmalloc(msglen, GFP_KERNEL);
3771 3772 3773 3774 3775 3776 3777 3778
	if (!buf)
		return -ENOMEM;

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

3779
	hdr = buf;
3780 3781 3782
	opcode = __le16_to_cpu(hdr->opcode);
	index = __le16_to_cpu(hdr->index);
	len = __le16_to_cpu(hdr->len);
3783 3784 3785 3786 3787 3788

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

3789
	if (index != MGMT_INDEX_NONE) {
3790 3791 3792
		hdev = hci_dev_get(index);
		if (!hdev) {
			err = cmd_status(sk, index, opcode,
3793
					 MGMT_STATUS_INVALID_INDEX);
3794 3795
			goto done;
		}
3796

3797 3798
		if (test_bit(HCI_SETUP, &hdev->dev_flags) ||
		    test_bit(HCI_USER_CHANNEL, &hdev->dev_flags)) {
3799 3800 3801 3802
			err = cmd_status(sk, index, opcode,
					 MGMT_STATUS_INVALID_INDEX);
			goto done;
		}
3803 3804
	}

3805
	if (opcode >= ARRAY_SIZE(mgmt_handlers) ||
3806
	    mgmt_handlers[opcode].func == NULL) {
3807
		BT_DBG("Unknown op %u", opcode);
3808
		err = cmd_status(sk, index, opcode,
3809
				 MGMT_STATUS_UNKNOWN_COMMAND);
3810 3811 3812 3813
		goto done;
	}

	if ((hdev && opcode < MGMT_OP_READ_INFO) ||
3814
	    (!hdev && opcode >= MGMT_OP_READ_INFO)) {
3815
		err = cmd_status(sk, index, opcode,
3816
				 MGMT_STATUS_INVALID_INDEX);
3817
		goto done;
3818 3819
	}

3820 3821 3822
	handler = &mgmt_handlers[opcode];

	if ((handler->var_len && len < handler->data_len) ||
3823
	    (!handler->var_len && len != handler->data_len)) {
3824
		err = cmd_status(sk, index, opcode,
3825
				 MGMT_STATUS_INVALID_PARAMS);
3826 3827 3828
		goto done;
	}

3829 3830 3831 3832 3833
	if (hdev)
		mgmt_init_hdev(sk, hdev);

	cp = buf + sizeof(*hdr);

3834
	err = handler->func(sk, hdev, cp, len);
3835 3836 3837
	if (err < 0)
		goto done;

3838 3839 3840
	err = msglen;

done:
3841 3842 3843
	if (hdev)
		hci_dev_put(hdev);

3844 3845 3846
	kfree(buf);
	return err;
}
3847

3848
void mgmt_index_added(struct hci_dev *hdev)
3849
{
3850
	if (hdev->dev_type != HCI_BREDR)
3851
		return;
3852

3853
	mgmt_event(MGMT_EV_INDEX_ADDED, hdev, NULL, 0, NULL);
3854 3855
}

3856
void mgmt_index_removed(struct hci_dev *hdev)
3857
{
3858
	u8 status = MGMT_STATUS_INVALID_INDEX;
3859

3860
	if (hdev->dev_type != HCI_BREDR)
3861
		return;
3862

3863
	mgmt_pending_foreach(0, hdev, cmd_status_rsp, &status);
3864

3865
	mgmt_event(MGMT_EV_INDEX_REMOVED, hdev, NULL, 0, NULL);
3866 3867
}

3868
static void set_bredr_scan(struct hci_request *req)
3869
{
3870
	struct hci_dev *hdev = req->hdev;
3871 3872
	u8 scan = 0;

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

3879 3880 3881 3882 3883
	if (test_bit(HCI_CONNECTABLE, &hdev->dev_flags))
		scan |= SCAN_PAGE;
	if (test_bit(HCI_DISCOVERABLE, &hdev->dev_flags))
		scan |= SCAN_INQUIRY;

3884 3885
	if (scan)
		hci_req_add(req, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);
3886 3887
}

3888 3889 3890 3891 3892 3893 3894 3895 3896 3897 3898 3899 3900 3901 3902 3903 3904 3905
static void powered_complete(struct hci_dev *hdev, u8 status)
{
	struct cmd_lookup match = { NULL, hdev };

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

	hci_dev_lock(hdev);

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

	new_settings(hdev, match.sk);

	hci_dev_unlock(hdev);

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

3906
static int powered_update_hci(struct hci_dev *hdev)
3907
{
3908
	struct hci_request req;
3909
	u8 link_sec;
3910

3911 3912
	hci_req_init(&req, hdev);

3913 3914 3915
	if (test_bit(HCI_SSP_ENABLED, &hdev->dev_flags) &&
	    !lmp_host_ssp_capable(hdev)) {
		u8 ssp = 1;
3916

3917
		hci_req_add(&req, HCI_OP_WRITE_SSP_MODE, 1, &ssp);
3918
	}
3919

3920 3921
	if (test_bit(HCI_LE_ENABLED, &hdev->dev_flags) &&
	    lmp_bredr_capable(hdev)) {
3922
		struct hci_cp_write_le_host_supported cp;
3923

3924 3925
		cp.le = 1;
		cp.simul = lmp_le_br_capable(hdev);
3926

3927 3928 3929 3930 3931
		/* Check first if we already have the right
		 * host state (host features set)
		 */
		if (cp.le != lmp_host_le_capable(hdev) ||
		    cp.simul != lmp_host_le_br_capable(hdev))
3932 3933
			hci_req_add(&req, HCI_OP_WRITE_LE_HOST_SUPPORTED,
				    sizeof(cp), &cp);
3934 3935 3936

		/* In case BR/EDR was toggled during the AUTO_OFF phase */
		hci_update_ad(&req);
3937
	}
3938

3939 3940 3941 3942 3943
	if (lmp_le_capable(hdev)) {
		/* Set random address to static address if configured */
		if (bacmp(&hdev->static_addr, BDADDR_ANY))
			hci_req_add(&req, HCI_OP_LE_SET_RANDOM_ADDR, 6,
				    &hdev->static_addr);
3944

3945 3946
		if (test_bit(HCI_ADVERTISING, &hdev->dev_flags))
			enable_advertising(&req);
3947 3948
	}

3949 3950
	link_sec = test_bit(HCI_LINK_SECURITY, &hdev->dev_flags);
	if (link_sec != test_bit(HCI_AUTH, &hdev->flags))
3951 3952
		hci_req_add(&req, HCI_OP_WRITE_AUTH_ENABLE,
			    sizeof(link_sec), &link_sec);
3953

3954
	if (lmp_bredr_capable(hdev)) {
3955 3956
		if (test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags))
			set_bredr_scan(&req);
3957
		update_class(&req);
3958
		update_name(&req);
3959
		update_eir(&req);
3960
	}
3961

3962
	return hci_req_run(&req, powered_complete);
3963
}
3964

3965 3966 3967
int mgmt_powered(struct hci_dev *hdev, u8 powered)
{
	struct cmd_lookup match = { NULL, hdev };
3968 3969
	u8 status_not_powered = MGMT_STATUS_NOT_POWERED;
	u8 zero_cod[] = { 0, 0, 0 };
3970
	int err;
3971

3972 3973 3974 3975
	if (!test_bit(HCI_MGMT, &hdev->dev_flags))
		return 0;

	if (powered) {
3976 3977
		if (powered_update_hci(hdev) == 0)
			return 0;
3978

3979 3980 3981
		mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, settings_rsp,
				     &match);
		goto new_settings;
3982 3983
	}

3984 3985 3986 3987 3988 3989 3990 3991
	mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, settings_rsp, &match);
	mgmt_pending_foreach(0, hdev, cmd_status_rsp, &status_not_powered);

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

new_settings:
3992
	err = new_settings(hdev, match.sk);
3993 3994 3995 3996

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

3997
	return err;
3998
}
3999

4000
void mgmt_set_powered_failed(struct hci_dev *hdev, int err)
4001 4002 4003 4004 4005 4006
{
	struct pending_cmd *cmd;
	u8 status;

	cmd = mgmt_pending_find(MGMT_OP_SET_POWERED, hdev);
	if (!cmd)
4007
		return;
4008 4009 4010 4011 4012 4013

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

4014
	cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_POWERED, status);
4015 4016 4017 4018

	mgmt_pending_remove(cmd);
}

4019
int mgmt_discoverable(struct hci_dev *hdev, u8 discoverable)
4020
{
4021
	struct cmd_lookup match = { NULL, hdev };
4022 4023
	bool changed = false;
	int err = 0;
4024

4025 4026 4027 4028 4029 4030 4031
	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;
	}
4032

4033
	mgmt_pending_foreach(MGMT_OP_SET_DISCOVERABLE, hdev, settings_rsp,
4034
			     &match);
4035

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

4039 4040 4041
	if (match.sk)
		sock_put(match.sk);

4042
	return err;
4043
}
4044

4045
int mgmt_connectable(struct hci_dev *hdev, u8 connectable)
4046
{
4047
	struct pending_cmd *cmd;
4048 4049
	bool changed = false;
	int err = 0;
4050

4051 4052 4053 4054 4055 4056 4057
	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;
	}
4058

4059
	cmd = mgmt_pending_find(MGMT_OP_SET_CONNECTABLE, hdev);
4060

4061
	if (changed)
4062
		err = new_settings(hdev, cmd ? cmd->sk : NULL);
4063

4064
	return err;
4065
}
4066

4067
int mgmt_write_scan_failed(struct hci_dev *hdev, u8 scan, u8 status)
4068
{
4069 4070
	u8 mgmt_err = mgmt_status(status);

4071
	if (scan & SCAN_PAGE)
4072
		mgmt_pending_foreach(MGMT_OP_SET_CONNECTABLE, hdev,
4073
				     cmd_status_rsp, &mgmt_err);
4074 4075

	if (scan & SCAN_INQUIRY)
4076
		mgmt_pending_foreach(MGMT_OP_SET_DISCOVERABLE, hdev,
4077
				     cmd_status_rsp, &mgmt_err);
4078 4079 4080 4081

	return 0;
}

4082 4083
int mgmt_new_link_key(struct hci_dev *hdev, struct link_key *key,
		      bool persistent)
4084
{
4085
	struct mgmt_ev_new_link_key ev;
4086

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

4089
	ev.store_hint = persistent;
4090
	bacpy(&ev.key.addr.bdaddr, &key->bdaddr);
4091
	ev.key.addr.type = BDADDR_BREDR;
4092
	ev.key.type = key->type;
4093
	memcpy(ev.key.val, key->val, HCI_LINK_KEY_SIZE);
4094
	ev.key.pin_len = key->pin_len;
4095

4096
	return mgmt_event(MGMT_EV_NEW_LINK_KEY, hdev, &ev, sizeof(ev), NULL);
4097
}
4098

4099 4100 4101 4102 4103 4104 4105 4106
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);
4107
	ev.key.addr.type = link_to_bdaddr(LE_LINK, key->bdaddr_type);
4108 4109 4110 4111 4112 4113 4114 4115 4116 4117
	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));

4118 4119
	return mgmt_event(MGMT_EV_NEW_LONG_TERM_KEY, hdev, &ev, sizeof(ev),
			  NULL);
4120 4121
}

4122 4123 4124
void mgmt_device_connected(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
			   u8 addr_type, u32 flags, u8 *name, u8 name_len,
			   u8 *dev_class)
4125
{
4126 4127 4128
	char buf[512];
	struct mgmt_ev_device_connected *ev = (void *) buf;
	u16 eir_len = 0;
4129

4130
	bacpy(&ev->addr.bdaddr, bdaddr);
4131
	ev->addr.type = link_to_bdaddr(link_type, addr_type);
4132

4133
	ev->flags = __cpu_to_le32(flags);
4134

4135 4136
	if (name_len > 0)
		eir_len = eir_append_data(ev->eir, 0, EIR_NAME_COMPLETE,
4137
					  name, name_len);
4138 4139

	if (dev_class && memcmp(dev_class, "\0\0\0", 3) != 0)
4140
		eir_len = eir_append_data(ev->eir, eir_len,
4141
					  EIR_CLASS_OF_DEV, dev_class, 3);
4142

4143
	ev->eir_len = cpu_to_le16(eir_len);
4144

4145 4146
	mgmt_event(MGMT_EV_DEVICE_CONNECTED, hdev, buf,
		    sizeof(*ev) + eir_len, NULL);
4147 4148
}

4149 4150
static void disconnect_rsp(struct pending_cmd *cmd, void *data)
{
4151
	struct mgmt_cp_disconnect *cp = cmd->param;
4152
	struct sock **sk = data;
4153
	struct mgmt_rp_disconnect rp;
4154

4155 4156
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;
4157

4158
	cmd_complete(cmd->sk, cmd->index, MGMT_OP_DISCONNECT, 0, &rp,
4159
		     sizeof(rp));
4160 4161 4162 4163

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

4164
	mgmt_pending_remove(cmd);
4165 4166
}

4167
static void unpair_device_rsp(struct pending_cmd *cmd, void *data)
4168
{
4169
	struct hci_dev *hdev = data;
4170 4171
	struct mgmt_cp_unpair_device *cp = cmd->param;
	struct mgmt_rp_unpair_device rp;
4172 4173

	memset(&rp, 0, sizeof(rp));
4174 4175
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;
4176

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

4179
	cmd_complete(cmd->sk, cmd->index, cmd->opcode, 0, &rp, sizeof(rp));
4180 4181 4182 4183

	mgmt_pending_remove(cmd);
}

4184 4185
void mgmt_device_disconnected(struct hci_dev *hdev, bdaddr_t *bdaddr,
			      u8 link_type, u8 addr_type, u8 reason)
4186
{
4187
	struct mgmt_ev_device_disconnected ev;
4188 4189
	struct sock *sk = NULL;

4190
	mgmt_pending_foreach(MGMT_OP_DISCONNECT, hdev, disconnect_rsp, &sk);
4191

4192 4193 4194
	bacpy(&ev.addr.bdaddr, bdaddr);
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
	ev.reason = reason;
4195

4196
	mgmt_event(MGMT_EV_DEVICE_DISCONNECTED, hdev, &ev, sizeof(ev), sk);
4197 4198

	if (sk)
4199
		sock_put(sk);
4200

4201
	mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE, hdev, unpair_device_rsp,
4202
			     hdev);
4203 4204
}

4205 4206
void mgmt_disconnect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr,
			    u8 link_type, u8 addr_type, u8 status)
4207
{
4208
	struct mgmt_rp_disconnect rp;
4209 4210
	struct pending_cmd *cmd;

4211 4212 4213
	mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE, hdev, unpair_device_rsp,
			     hdev);

4214
	cmd = mgmt_pending_find(MGMT_OP_DISCONNECT, hdev);
4215
	if (!cmd)
4216
		return;
4217

4218
	bacpy(&rp.addr.bdaddr, bdaddr);
4219
	rp.addr.type = link_to_bdaddr(link_type, addr_type);
4220

4221 4222
	cmd_complete(cmd->sk, cmd->index, MGMT_OP_DISCONNECT,
		     mgmt_status(status), &rp, sizeof(rp));
4223

4224
	mgmt_pending_remove(cmd);
4225
}
4226

4227 4228
void mgmt_connect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
			 u8 addr_type, u8 status)
4229 4230 4231
{
	struct mgmt_ev_connect_failed ev;

4232
	bacpy(&ev.addr.bdaddr, bdaddr);
4233
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
4234
	ev.status = mgmt_status(status);
4235

4236
	mgmt_event(MGMT_EV_CONNECT_FAILED, hdev, &ev, sizeof(ev), NULL);
4237
}
4238

4239
int mgmt_pin_code_request(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 secure)
4240 4241 4242
{
	struct mgmt_ev_pin_code_request ev;

4243
	bacpy(&ev.addr.bdaddr, bdaddr);
4244
	ev.addr.type = BDADDR_BREDR;
4245
	ev.secure = secure;
4246

4247
	return mgmt_event(MGMT_EV_PIN_CODE_REQUEST, hdev, &ev, sizeof(ev),
4248
			  NULL);
4249 4250
}

4251
int mgmt_pin_code_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
4252
				 u8 status)
4253 4254
{
	struct pending_cmd *cmd;
4255
	struct mgmt_rp_pin_code_reply rp;
4256 4257
	int err;

4258
	cmd = mgmt_pending_find(MGMT_OP_PIN_CODE_REPLY, hdev);
4259 4260 4261
	if (!cmd)
		return -ENOENT;

4262
	bacpy(&rp.addr.bdaddr, bdaddr);
4263
	rp.addr.type = BDADDR_BREDR;
4264

4265
	err = cmd_complete(cmd->sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
4266
			   mgmt_status(status), &rp, sizeof(rp));
4267

4268
	mgmt_pending_remove(cmd);
4269 4270 4271 4272

	return err;
}

4273
int mgmt_pin_code_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
4274
				     u8 status)
4275 4276
{
	struct pending_cmd *cmd;
4277
	struct mgmt_rp_pin_code_reply rp;
4278 4279
	int err;

4280
	cmd = mgmt_pending_find(MGMT_OP_PIN_CODE_NEG_REPLY, hdev);
4281 4282 4283
	if (!cmd)
		return -ENOENT;

4284
	bacpy(&rp.addr.bdaddr, bdaddr);
4285
	rp.addr.type = BDADDR_BREDR;
4286

4287
	err = cmd_complete(cmd->sk, hdev->id, MGMT_OP_PIN_CODE_NEG_REPLY,
4288
			   mgmt_status(status), &rp, sizeof(rp));
4289

4290
	mgmt_pending_remove(cmd);
4291 4292 4293

	return err;
}
4294

4295
int mgmt_user_confirm_request(struct hci_dev *hdev, bdaddr_t *bdaddr,
4296 4297
			      u8 link_type, u8 addr_type, __le32 value,
			      u8 confirm_hint)
4298 4299 4300
{
	struct mgmt_ev_user_confirm_request ev;

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

4303
	bacpy(&ev.addr.bdaddr, bdaddr);
4304
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
4305
	ev.confirm_hint = confirm_hint;
4306
	ev.value = value;
4307

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

4312
int mgmt_user_passkey_request(struct hci_dev *hdev, bdaddr_t *bdaddr,
4313
			      u8 link_type, u8 addr_type)
4314 4315 4316 4317 4318
{
	struct mgmt_ev_user_passkey_request ev;

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

4319
	bacpy(&ev.addr.bdaddr, bdaddr);
4320
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
4321 4322

	return mgmt_event(MGMT_EV_USER_PASSKEY_REQUEST, hdev, &ev, sizeof(ev),
4323
			  NULL);
4324 4325
}

4326
static int user_pairing_resp_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
4327 4328
				      u8 link_type, u8 addr_type, u8 status,
				      u8 opcode)
4329 4330 4331 4332 4333
{
	struct pending_cmd *cmd;
	struct mgmt_rp_user_confirm_reply rp;
	int err;

4334
	cmd = mgmt_pending_find(opcode, hdev);
4335 4336 4337
	if (!cmd)
		return -ENOENT;

4338
	bacpy(&rp.addr.bdaddr, bdaddr);
4339
	rp.addr.type = link_to_bdaddr(link_type, addr_type);
4340
	err = cmd_complete(cmd->sk, hdev->id, opcode, mgmt_status(status),
4341
			   &rp, sizeof(rp));
4342

4343
	mgmt_pending_remove(cmd);
4344 4345 4346 4347

	return err;
}

4348
int mgmt_user_confirm_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
4349
				     u8 link_type, u8 addr_type, u8 status)
4350
{
4351
	return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
4352
					  status, MGMT_OP_USER_CONFIRM_REPLY);
4353 4354
}

4355
int mgmt_user_confirm_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
4356
					 u8 link_type, u8 addr_type, u8 status)
4357
{
4358
	return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
4359 4360
					  status,
					  MGMT_OP_USER_CONFIRM_NEG_REPLY);
4361
}
4362

4363
int mgmt_user_passkey_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
4364
				     u8 link_type, u8 addr_type, u8 status)
4365
{
4366
	return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
4367
					  status, MGMT_OP_USER_PASSKEY_REPLY);
4368 4369
}

4370
int mgmt_user_passkey_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
4371
					 u8 link_type, u8 addr_type, u8 status)
4372
{
4373
	return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
4374 4375
					  status,
					  MGMT_OP_USER_PASSKEY_NEG_REPLY);
4376 4377
}

4378 4379 4380 4381 4382 4383 4384 4385 4386 4387 4388 4389 4390 4391 4392 4393
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);
}

4394
int mgmt_auth_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
4395
		     u8 addr_type, u8 status)
4396 4397 4398
{
	struct mgmt_ev_auth_failed ev;

4399
	bacpy(&ev.addr.bdaddr, bdaddr);
4400
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
4401
	ev.status = mgmt_status(status);
4402

4403
	return mgmt_event(MGMT_EV_AUTH_FAILED, hdev, &ev, sizeof(ev), NULL);
4404
}
4405

4406 4407 4408
int mgmt_auth_enable_complete(struct hci_dev *hdev, u8 status)
{
	struct cmd_lookup match = { NULL, hdev };
4409 4410
	bool changed = false;
	int err = 0;
4411 4412 4413 4414

	if (status) {
		u8 mgmt_err = mgmt_status(status);
		mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev,
4415
				     cmd_status_rsp, &mgmt_err);
4416 4417 4418
		return 0;
	}

4419 4420 4421 4422 4423 4424 4425 4426
	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;
	}

4427
	mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev, settings_rsp,
4428
			     &match);
4429

4430 4431
	if (changed)
		err = new_settings(hdev, match.sk);
4432 4433 4434 4435 4436 4437 4438

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

	return err;
}

4439
static void clear_eir(struct hci_request *req)
4440
{
4441
	struct hci_dev *hdev = req->hdev;
4442 4443
	struct hci_cp_write_eir cp;

4444
	if (!lmp_ext_inq_capable(hdev))
4445
		return;
4446

4447 4448
	memset(hdev->eir, 0, sizeof(hdev->eir));

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

4451
	hci_req_add(req, HCI_OP_WRITE_EIR, sizeof(cp), &cp);
4452 4453
}

4454
int mgmt_ssp_enable_complete(struct hci_dev *hdev, u8 enable, u8 status)
4455 4456
{
	struct cmd_lookup match = { NULL, hdev };
4457
	struct hci_request req;
4458 4459
	bool changed = false;
	int err = 0;
4460 4461 4462

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

		if (enable && test_and_clear_bit(HCI_SSP_ENABLED,
4465 4466
						 &hdev->dev_flags)) {
			clear_bit(HCI_HS_ENABLED, &hdev->dev_flags);
4467
			err = new_settings(hdev, NULL);
4468
		}
4469

4470 4471
		mgmt_pending_foreach(MGMT_OP_SET_SSP, hdev, cmd_status_rsp,
				     &mgmt_err);
4472 4473 4474 4475 4476

		return err;
	}

	if (enable) {
4477
		changed = !test_and_set_bit(HCI_SSP_ENABLED, &hdev->dev_flags);
4478
	} else {
4479 4480 4481 4482 4483 4484
		changed = test_and_clear_bit(HCI_SSP_ENABLED, &hdev->dev_flags);
		if (!changed)
			changed = test_and_clear_bit(HCI_HS_ENABLED,
						     &hdev->dev_flags);
		else
			clear_bit(HCI_HS_ENABLED, &hdev->dev_flags);
4485 4486 4487 4488
	}

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

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

4492
	if (match.sk)
4493 4494
		sock_put(match.sk);

4495 4496
	hci_req_init(&req, hdev);

4497
	if (test_bit(HCI_SSP_ENABLED, &hdev->dev_flags))
4498
		update_eir(&req);
4499
	else
4500 4501 4502
		clear_eir(&req);

	hci_req_run(&req, NULL);
4503

4504 4505 4506
	return err;
}

4507
static void sk_lookup(struct pending_cmd *cmd, void *data)
4508 4509 4510 4511 4512 4513 4514 4515 4516
{
	struct cmd_lookup *match = data;

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

4517
int mgmt_set_class_of_dev_complete(struct hci_dev *hdev, u8 *dev_class,
4518
				   u8 status)
4519
{
4520 4521
	struct cmd_lookup match = { NULL, hdev, mgmt_status(status) };
	int err = 0;
4522

4523 4524 4525
	mgmt_pending_foreach(MGMT_OP_SET_DEV_CLASS, hdev, sk_lookup, &match);
	mgmt_pending_foreach(MGMT_OP_ADD_UUID, hdev, sk_lookup, &match);
	mgmt_pending_foreach(MGMT_OP_REMOVE_UUID, hdev, sk_lookup, &match);
4526 4527

	if (!status)
4528 4529
		err = mgmt_event(MGMT_EV_CLASS_OF_DEV_CHANGED, hdev, dev_class,
				 3, NULL);
4530 4531 4532

	if (match.sk)
		sock_put(match.sk);
4533 4534 4535 4536

	return err;
}

4537
int mgmt_set_local_name_complete(struct hci_dev *hdev, u8 *name, u8 status)
4538 4539
{
	struct mgmt_cp_set_local_name ev;
4540
	struct pending_cmd *cmd;
4541

4542 4543
	if (status)
		return 0;
4544 4545 4546

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

4549
	cmd = mgmt_pending_find(MGMT_OP_SET_LOCAL_NAME, hdev);
4550 4551
	if (!cmd) {
		memcpy(hdev->dev_name, name, sizeof(hdev->dev_name));
4552

4553 4554 4555 4556 4557
		/* If this is a HCI command related to powering on the
		 * HCI dev don't send any mgmt signals.
		 */
		if (mgmt_pending_find(MGMT_OP_SET_POWERED, hdev))
			return 0;
4558
	}
4559

4560 4561
	return mgmt_event(MGMT_EV_LOCAL_NAME_CHANGED, hdev, &ev, sizeof(ev),
			  cmd ? cmd->sk : NULL);
4562
}
4563

4564
int mgmt_read_local_oob_data_reply_complete(struct hci_dev *hdev, u8 *hash,
4565
					    u8 *randomizer, u8 status)
4566 4567 4568 4569
{
	struct pending_cmd *cmd;
	int err;

4570
	BT_DBG("%s status %u", hdev->name, status);
4571

4572
	cmd = mgmt_pending_find(MGMT_OP_READ_LOCAL_OOB_DATA, hdev);
4573 4574 4575 4576
	if (!cmd)
		return -ENOENT;

	if (status) {
4577 4578
		err = cmd_status(cmd->sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
				 mgmt_status(status));
4579 4580 4581 4582 4583 4584
	} else {
		struct mgmt_rp_read_local_oob_data rp;

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

4585
		err = cmd_complete(cmd->sk, hdev->id,
4586 4587
				   MGMT_OP_READ_LOCAL_OOB_DATA, 0, &rp,
				   sizeof(rp));
4588 4589 4590 4591 4592 4593
	}

	mgmt_pending_remove(cmd);

	return err;
}
4594

4595 4596 4597
void mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
		       u8 addr_type, u8 *dev_class, s8 rssi, u8 cfm_name, u8
		       ssp, u8 *eir, u16 eir_len)
4598
{
4599 4600
	char buf[512];
	struct mgmt_ev_device_found *ev = (void *) buf;
4601
	size_t ev_size;
4602

4603
	if (!hci_discovery_active(hdev))
4604
		return;
4605

4606 4607
	/* Leave 5 bytes for a potential CoD field */
	if (sizeof(*ev) + eir_len + 5 > sizeof(buf))
4608
		return;
4609

4610 4611
	memset(buf, 0, sizeof(buf));

4612
	bacpy(&ev->addr.bdaddr, bdaddr);
4613
	ev->addr.type = link_to_bdaddr(link_type, addr_type);
4614
	ev->rssi = rssi;
4615
	if (cfm_name)
4616
		ev->flags |= __constant_cpu_to_le32(MGMT_DEV_FOUND_CONFIRM_NAME);
4617
	if (!ssp)
4618
		ev->flags |= __constant_cpu_to_le32(MGMT_DEV_FOUND_LEGACY_PAIRING);
4619

4620
	if (eir_len > 0)
4621
		memcpy(ev->eir, eir, eir_len);
4622

4623 4624
	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,
4625
					  dev_class, 3);
4626

4627
	ev->eir_len = cpu_to_le16(eir_len);
4628
	ev_size = sizeof(*ev) + eir_len;
4629

4630
	mgmt_event(MGMT_EV_DEVICE_FOUND, hdev, ev, ev_size, NULL);
4631
}
4632

4633 4634
void mgmt_remote_name(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
		      u8 addr_type, s8 rssi, u8 *name, u8 name_len)
4635
{
4636 4637 4638
	struct mgmt_ev_device_found *ev;
	char buf[sizeof(*ev) + HCI_MAX_NAME_LENGTH + 2];
	u16 eir_len;
4639

4640
	ev = (struct mgmt_ev_device_found *) buf;
4641

4642 4643 4644
	memset(buf, 0, sizeof(buf));

	bacpy(&ev->addr.bdaddr, bdaddr);
4645
	ev->addr.type = link_to_bdaddr(link_type, addr_type);
4646 4647 4648
	ev->rssi = rssi;

	eir_len = eir_append_data(ev->eir, 0, EIR_NAME_COMPLETE, name,
4649
				  name_len);
4650

4651
	ev->eir_len = cpu_to_le16(eir_len);
4652

4653
	mgmt_event(MGMT_EV_DEVICE_FOUND, hdev, ev, sizeof(*ev) + eir_len, NULL);
4654
}
4655

4656
void mgmt_discovering(struct hci_dev *hdev, u8 discovering)
4657
{
4658
	struct mgmt_ev_discovering ev;
4659 4660
	struct pending_cmd *cmd;

4661 4662
	BT_DBG("%s discovering %u", hdev->name, discovering);

4663
	if (discovering)
4664
		cmd = mgmt_pending_find(MGMT_OP_START_DISCOVERY, hdev);
4665
	else
4666
		cmd = mgmt_pending_find(MGMT_OP_STOP_DISCOVERY, hdev);
4667 4668

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

4671 4672
		cmd_complete(cmd->sk, hdev->id, cmd->opcode, 0, &type,
			     sizeof(type));
4673 4674 4675
		mgmt_pending_remove(cmd);
	}

4676 4677 4678 4679
	memset(&ev, 0, sizeof(ev));
	ev.type = hdev->discovery.type;
	ev.discovering = discovering;

4680
	mgmt_event(MGMT_EV_DISCOVERING, hdev, &ev, sizeof(ev), NULL);
4681
}
4682

4683
int mgmt_device_blocked(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type)
4684 4685 4686 4687
{
	struct pending_cmd *cmd;
	struct mgmt_ev_device_blocked ev;

4688
	cmd = mgmt_pending_find(MGMT_OP_BLOCK_DEVICE, hdev);
4689

4690 4691
	bacpy(&ev.addr.bdaddr, bdaddr);
	ev.addr.type = type;
4692

4693
	return mgmt_event(MGMT_EV_DEVICE_BLOCKED, hdev, &ev, sizeof(ev),
4694
			  cmd ? cmd->sk : NULL);
4695 4696
}

4697
int mgmt_device_unblocked(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type)
4698 4699 4700 4701
{
	struct pending_cmd *cmd;
	struct mgmt_ev_device_unblocked ev;

4702
	cmd = mgmt_pending_find(MGMT_OP_UNBLOCK_DEVICE, hdev);
4703

4704 4705
	bacpy(&ev.addr.bdaddr, bdaddr);
	ev.addr.type = type;
4706

4707
	return mgmt_event(MGMT_EV_DEVICE_UNBLOCKED, hdev, &ev, sizeof(ev),
4708
			  cmd ? cmd->sk : NULL);
4709
}
4710 4711 4712 4713 4714 4715 4716 4717

static void adv_enable_complete(struct hci_dev *hdev, u8 status)
{
	BT_DBG("%s status %u", hdev->name, status);

	/* Clear the advertising mgmt setting if we failed to re-enable it */
	if (status) {
		clear_bit(HCI_ADVERTISING, &hdev->dev_flags);
4718
		new_settings(hdev, NULL);
4719 4720 4721 4722 4723 4724 4725
	}
}

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

4726
	if (hci_conn_num(hdev, LE_LINK) > 0)
4727 4728 4729 4730 4731 4732 4733 4734 4735 4736 4737 4738 4739
		return;

	if (!test_bit(HCI_ADVERTISING, &hdev->dev_flags))
		return;

	hci_req_init(&req, hdev);
	enable_advertising(&req);

	/* If this fails we have no option but to let user space know
	 * that we've disabled advertising.
	 */
	if (hci_req_run(&req, adv_enable_complete) < 0) {
		clear_bit(HCI_ADVERTISING, &hdev->dev_flags);
4740
		new_settings(hdev, NULL);
4741 4742
	}
}