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

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

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

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

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

/* Bluetooth HCI Management interface */

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

#include <net/bluetooth/bluetooth.h>
#include <net/bluetooth/hci_core.h>
32
#include <net/bluetooth/hci_sock.h>
33
#include <net/bluetooth/l2cap.h>
34
#include <net/bluetooth/mgmt.h>
35

36
#include "hci_request.h"
37
#include "smp.h"
38
#include "mgmt_util.h"
39

40
#define MGMT_VERSION	1
41
#define MGMT_REVISION	14
42

43 44 45 46 47 48 49
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,
50
	MGMT_OP_SET_BONDABLE,
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
	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,
81
	MGMT_OP_SET_DEVICE_ID,
82
	MGMT_OP_SET_ADVERTISING,
83
	MGMT_OP_SET_BREDR,
84
	MGMT_OP_SET_STATIC_ADDRESS,
85
	MGMT_OP_SET_SCAN_PARAMS,
86
	MGMT_OP_SET_SECURE_CONN,
87
	MGMT_OP_SET_DEBUG_KEYS,
88
	MGMT_OP_SET_PRIVACY,
89
	MGMT_OP_LOAD_IRKS,
90
	MGMT_OP_GET_CONN_INFO,
91
	MGMT_OP_GET_CLOCK_INFO,
92 93
	MGMT_OP_ADD_DEVICE,
	MGMT_OP_REMOVE_DEVICE,
94
	MGMT_OP_LOAD_CONN_PARAM,
95
	MGMT_OP_READ_UNCONF_INDEX_LIST,
96
	MGMT_OP_READ_CONFIG_INFO,
97
	MGMT_OP_SET_EXTERNAL_CONFIG,
98
	MGMT_OP_SET_PUBLIC_ADDRESS,
99
	MGMT_OP_START_SERVICE_DISCOVERY,
100
	MGMT_OP_READ_LOCAL_OOB_EXT_DATA,
101
	MGMT_OP_READ_EXT_INDEX_LIST,
102
	MGMT_OP_READ_ADV_FEATURES,
103
	MGMT_OP_ADD_ADVERTISING,
104
	MGMT_OP_REMOVE_ADVERTISING,
105
	MGMT_OP_GET_ADV_SIZE_INFO,
106
	MGMT_OP_START_LIMITED_DISCOVERY,
107
	MGMT_OP_READ_EXT_INFO,
108
	MGMT_OP_SET_APPEARANCE,
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
};

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,
132
	MGMT_EV_PASSKEY_NOTIFY,
133
	MGMT_EV_NEW_IRK,
134
	MGMT_EV_NEW_CSRK,
135 136
	MGMT_EV_DEVICE_ADDED,
	MGMT_EV_DEVICE_REMOVED,
137
	MGMT_EV_NEW_CONN_PARAM,
138
	MGMT_EV_UNCONF_INDEX_ADDED,
139
	MGMT_EV_UNCONF_INDEX_REMOVED,
140
	MGMT_EV_NEW_CONFIG_OPTIONS,
141 142
	MGMT_EV_EXT_INDEX_ADDED,
	MGMT_EV_EXT_INDEX_REMOVED,
143
	MGMT_EV_LOCAL_OOB_DATA_UPDATED,
144 145
	MGMT_EV_ADVERTISING_ADDED,
	MGMT_EV_ADVERTISING_REMOVED,
146
	MGMT_EV_EXT_INFO_CHANGED,
147 148
};

149 150 151 152 153 154
static const u16 mgmt_untrusted_commands[] = {
	MGMT_OP_READ_INDEX_LIST,
	MGMT_OP_READ_INFO,
	MGMT_OP_READ_UNCONF_INDEX_LIST,
	MGMT_OP_READ_CONFIG_INFO,
	MGMT_OP_READ_EXT_INDEX_LIST,
155
	MGMT_OP_READ_EXT_INFO,
156 157 158 159 160 161 162 163 164 165 166 167 168
};

static const u16 mgmt_untrusted_events[] = {
	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_UNCONF_INDEX_ADDED,
	MGMT_EV_UNCONF_INDEX_REMOVED,
	MGMT_EV_NEW_CONFIG_OPTIONS,
	MGMT_EV_EXT_INDEX_ADDED,
	MGMT_EV_EXT_INDEX_REMOVED,
169
	MGMT_EV_EXT_INFO_CHANGED,
170 171
};

172
#define CACHE_TIMEOUT	msecs_to_jiffies(2 * 1000)
173

174 175 176
#define ZERO_KEY "\x00\x00\x00\x00\x00\x00\x00\x00" \
		 "\x00\x00\x00\x00\x00\x00\x00\x00"

177 178 179 180 181 182 183 184
/* 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 */
185
	MGMT_STATUS_AUTH_FAILED,	/* PIN or Key Missing */
186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249
	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;
}

250 251
static int mgmt_index_event(u16 event, struct hci_dev *hdev, void *data,
			    u16 len, int flag)
252
{
253 254
	return mgmt_send_event(event, hdev, HCI_CHANNEL_CONTROL, data, len,
			       flag, NULL);
255 256
}

257 258 259 260 261 262 263
static int mgmt_limited_event(u16 event, struct hci_dev *hdev, void *data,
			      u16 len, int flag, struct sock *skip_sk)
{
	return mgmt_send_event(event, hdev, HCI_CHANNEL_CONTROL, data, len,
			       flag, skip_sk);
}

264 265 266 267
static int mgmt_event(u16 event, struct hci_dev *hdev, void *data, u16 len,
		      struct sock *skip_sk)
{
	return mgmt_send_event(event, hdev, HCI_CHANNEL_CONTROL, data, len,
268
			       HCI_SOCK_TRUSTED, skip_sk);
269 270
}

271 272 273 274 275 276 277 278
static u8 le_addr_type(u8 mgmt_addr_type)
{
	if (mgmt_addr_type == BDADDR_LE_PUBLIC)
		return ADDR_LE_DEV_PUBLIC;
	else
		return ADDR_LE_DEV_RANDOM;
}

279 280 281 282 283 284 285 286
void mgmt_fill_version_info(void *ver)
{
	struct mgmt_rp_read_version *rp = ver;

	rp->version = MGMT_VERSION;
	rp->revision = cpu_to_le16(MGMT_REVISION);
}

287 288
static int read_version(struct sock *sk, struct hci_dev *hdev, void *data,
			u16 data_len)
289 290 291 292 293
{
	struct mgmt_rp_read_version rp;

	BT_DBG("sock %p", sk);

294
	mgmt_fill_version_info(&rp);
295

296 297
	return mgmt_cmd_complete(sk, MGMT_INDEX_NONE, MGMT_OP_READ_VERSION, 0,
				 &rp, sizeof(rp));
298 299
}

300 301
static int read_commands(struct sock *sk, struct hci_dev *hdev, void *data,
			 u16 data_len)
302 303
{
	struct mgmt_rp_read_commands *rp;
304
	u16 num_commands, num_events;
305 306 307 308 309
	size_t rp_size;
	int i, err;

	BT_DBG("sock %p", sk);

310 311 312 313 314 315 316 317
	if (hci_sock_test_flag(sk, HCI_SOCK_TRUSTED)) {
		num_commands = ARRAY_SIZE(mgmt_commands);
		num_events = ARRAY_SIZE(mgmt_events);
	} else {
		num_commands = ARRAY_SIZE(mgmt_untrusted_commands);
		num_events = ARRAY_SIZE(mgmt_untrusted_events);
	}

318 319 320 321 322 323
	rp_size = sizeof(*rp) + ((num_commands + num_events) * sizeof(u16));

	rp = kmalloc(rp_size, GFP_KERNEL);
	if (!rp)
		return -ENOMEM;

324 325
	rp->num_commands = cpu_to_le16(num_commands);
	rp->num_events = cpu_to_le16(num_events);
326

327 328 329 330 331
	if (hci_sock_test_flag(sk, HCI_SOCK_TRUSTED)) {
		__le16 *opcode = rp->opcodes;

		for (i = 0; i < num_commands; i++, opcode++)
			put_unaligned_le16(mgmt_commands[i], opcode);
332

333 334 335 336 337 338 339 340 341 342 343
		for (i = 0; i < num_events; i++, opcode++)
			put_unaligned_le16(mgmt_events[i], opcode);
	} else {
		__le16 *opcode = rp->opcodes;

		for (i = 0; i < num_commands; i++, opcode++)
			put_unaligned_le16(mgmt_untrusted_commands[i], opcode);

		for (i = 0; i < num_events; i++, opcode++)
			put_unaligned_le16(mgmt_untrusted_events[i], opcode);
	}
344

345 346
	err = mgmt_cmd_complete(sk, MGMT_INDEX_NONE, MGMT_OP_READ_COMMANDS, 0,
				rp, rp_size);
347 348 349 350 351
	kfree(rp);

	return err;
}

352 353
static int read_index_list(struct sock *sk, struct hci_dev *hdev, void *data,
			   u16 data_len)
354 355
{
	struct mgmt_rp_read_index_list *rp;
356
	struct hci_dev *d;
357
	size_t rp_len;
358
	u16 count;
359
	int err;
360 361 362 363 364 365

	BT_DBG("sock %p", sk);

	read_lock(&hci_dev_list_lock);

	count = 0;
366
	list_for_each_entry(d, &hci_dev_list, list) {
367
		if (d->dev_type == HCI_PRIMARY &&
368
		    !hci_dev_test_flag(d, HCI_UNCONFIGURED))
369
			count++;
370 371
	}

372 373 374
	rp_len = sizeof(*rp) + (2 * count);
	rp = kmalloc(rp_len, GFP_ATOMIC);
	if (!rp) {
375
		read_unlock(&hci_dev_list_lock);
376
		return -ENOMEM;
377
	}
378

379
	count = 0;
380
	list_for_each_entry(d, &hci_dev_list, list) {
381 382 383
		if (hci_dev_test_flag(d, HCI_SETUP) ||
		    hci_dev_test_flag(d, HCI_CONFIG) ||
		    hci_dev_test_flag(d, HCI_USER_CHANNEL))
384 385
			continue;

386 387 388 389
		/* Devices marked as raw-only are neither configured
		 * nor unconfigured controllers.
		 */
		if (test_bit(HCI_QUIRK_RAW_DEVICE, &d->quirks))
390 391
			continue;

392
		if (d->dev_type == HCI_PRIMARY &&
393
		    !hci_dev_test_flag(d, HCI_UNCONFIGURED)) {
394 395 396
			rp->index[count++] = cpu_to_le16(d->id);
			BT_DBG("Added hci%u", d->id);
		}
397 398
	}

399 400 401
	rp->num_controllers = cpu_to_le16(count);
	rp_len = sizeof(*rp) + (2 * count);

402 403
	read_unlock(&hci_dev_list_lock);

404 405
	err = mgmt_cmd_complete(sk, MGMT_INDEX_NONE, MGMT_OP_READ_INDEX_LIST,
				0, rp, rp_len);
406

407 408 409
	kfree(rp);

	return err;
410 411
}

412 413 414 415 416 417 418 419 420 421 422 423 424 425 426
static int read_unconf_index_list(struct sock *sk, struct hci_dev *hdev,
				  void *data, u16 data_len)
{
	struct mgmt_rp_read_unconf_index_list *rp;
	struct hci_dev *d;
	size_t rp_len;
	u16 count;
	int err;

	BT_DBG("sock %p", sk);

	read_lock(&hci_dev_list_lock);

	count = 0;
	list_for_each_entry(d, &hci_dev_list, list) {
427
		if (d->dev_type == HCI_PRIMARY &&
428
		    hci_dev_test_flag(d, HCI_UNCONFIGURED))
429 430 431 432 433 434 435 436 437 438 439 440
			count++;
	}

	rp_len = sizeof(*rp) + (2 * count);
	rp = kmalloc(rp_len, GFP_ATOMIC);
	if (!rp) {
		read_unlock(&hci_dev_list_lock);
		return -ENOMEM;
	}

	count = 0;
	list_for_each_entry(d, &hci_dev_list, list) {
441 442 443
		if (hci_dev_test_flag(d, HCI_SETUP) ||
		    hci_dev_test_flag(d, HCI_CONFIG) ||
		    hci_dev_test_flag(d, HCI_USER_CHANNEL))
444 445 446 447 448 449 450 451
			continue;

		/* Devices marked as raw-only are neither configured
		 * nor unconfigured controllers.
		 */
		if (test_bit(HCI_QUIRK_RAW_DEVICE, &d->quirks))
			continue;

452
		if (d->dev_type == HCI_PRIMARY &&
453
		    hci_dev_test_flag(d, HCI_UNCONFIGURED)) {
454 455 456 457 458 459 460 461 462 463
			rp->index[count++] = cpu_to_le16(d->id);
			BT_DBG("Added hci%u", d->id);
		}
	}

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

	read_unlock(&hci_dev_list_lock);

464 465
	err = mgmt_cmd_complete(sk, MGMT_INDEX_NONE,
				MGMT_OP_READ_UNCONF_INDEX_LIST, 0, rp, rp_len);
466 467 468 469 470 471

	kfree(rp);

	return err;
}

472 473 474 475 476 477 478 479 480 481 482 483 484 485
static int read_ext_index_list(struct sock *sk, struct hci_dev *hdev,
			       void *data, u16 data_len)
{
	struct mgmt_rp_read_ext_index_list *rp;
	struct hci_dev *d;
	u16 count;
	int err;

	BT_DBG("sock %p", sk);

	read_lock(&hci_dev_list_lock);

	count = 0;
	list_for_each_entry(d, &hci_dev_list, list) {
486
		if (d->dev_type == HCI_PRIMARY || d->dev_type == HCI_AMP)
487 488 489
			count++;
	}

490
	rp = kmalloc(struct_size(rp, entry, count), GFP_ATOMIC);
491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508
	if (!rp) {
		read_unlock(&hci_dev_list_lock);
		return -ENOMEM;
	}

	count = 0;
	list_for_each_entry(d, &hci_dev_list, list) {
		if (hci_dev_test_flag(d, HCI_SETUP) ||
		    hci_dev_test_flag(d, HCI_CONFIG) ||
		    hci_dev_test_flag(d, HCI_USER_CHANNEL))
			continue;

		/* Devices marked as raw-only are neither configured
		 * nor unconfigured controllers.
		 */
		if (test_bit(HCI_QUIRK_RAW_DEVICE, &d->quirks))
			continue;

509
		if (d->dev_type == HCI_PRIMARY) {
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
			if (hci_dev_test_flag(d, HCI_UNCONFIGURED))
				rp->entry[count].type = 0x01;
			else
				rp->entry[count].type = 0x00;
		} else if (d->dev_type == HCI_AMP) {
			rp->entry[count].type = 0x02;
		} else {
			continue;
		}

		rp->entry[count].bus = d->bus;
		rp->entry[count++].index = cpu_to_le16(d->id);
		BT_DBG("Added hci%u", d->id);
	}

	rp->num_controllers = cpu_to_le16(count);

	read_unlock(&hci_dev_list_lock);

	/* If this command is called at least once, then all the
	 * default index and unconfigured index events are disabled
	 * and from now on only extended index events are used.
	 */
	hci_sock_set_flag(sk, HCI_MGMT_EXT_INDEX_EVENTS);
	hci_sock_clear_flag(sk, HCI_MGMT_INDEX_EVENTS);
	hci_sock_clear_flag(sk, HCI_MGMT_UNCONF_INDEX_EVENTS);

	err = mgmt_cmd_complete(sk, MGMT_INDEX_NONE,
538 539
				MGMT_OP_READ_EXT_INDEX_LIST, 0, rp,
				struct_size(rp, entry, count));
540 541 542 543 544 545

	kfree(rp);

	return err;
}

546 547 548
static bool is_configured(struct hci_dev *hdev)
{
	if (test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks) &&
549
	    !hci_dev_test_flag(hdev, HCI_EXT_CONFIGURED))
550 551 552 553 554 555 556 557 558
		return false;

	if (test_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks) &&
	    !bacmp(&hdev->public_addr, BDADDR_ANY))
		return false;

	return true;
}

559 560 561 562
static __le32 get_missing_options(struct hci_dev *hdev)
{
	u32 options = 0;

563
	if (test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks) &&
564
	    !hci_dev_test_flag(hdev, HCI_EXT_CONFIGURED))
565 566
		options |= MGMT_OPTION_EXTERNAL_CONFIG;

567 568 569 570 571 572 573
	if (test_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks) &&
	    !bacmp(&hdev->public_addr, BDADDR_ANY))
		options |= MGMT_OPTION_PUBLIC_ADDRESS;

	return cpu_to_le32(options);
}

574 575 576 577
static int new_options(struct hci_dev *hdev, struct sock *skip)
{
	__le32 options = get_missing_options(hdev);

578 579
	return mgmt_limited_event(MGMT_EV_NEW_CONFIG_OPTIONS, hdev, &options,
				  sizeof(options), HCI_MGMT_OPTION_EVENTS, skip);
580 581
}

582 583 584 585
static int send_options_rsp(struct sock *sk, u16 opcode, struct hci_dev *hdev)
{
	__le32 options = get_missing_options(hdev);

586 587
	return mgmt_cmd_complete(sk, hdev->id, opcode, 0, &options,
				 sizeof(options));
588 589
}

590 591 592 593
static int read_config_info(struct sock *sk, struct hci_dev *hdev,
			    void *data, u16 data_len)
{
	struct mgmt_rp_read_config_info rp;
594
	u32 options = 0;
595 596 597 598 599 600 601

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

	hci_dev_lock(hdev);

	memset(&rp, 0, sizeof(rp));
	rp.manufacturer = cpu_to_le16(hdev->manufacturer);
602

603 604 605
	if (test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks))
		options |= MGMT_OPTION_EXTERNAL_CONFIG;

606
	if (hdev->set_bdaddr)
607 608 609 610
		options |= MGMT_OPTION_PUBLIC_ADDRESS;

	rp.supported_options = cpu_to_le32(options);
	rp.missing_options = get_missing_options(hdev);
611 612 613

	hci_dev_unlock(hdev);

614 615
	return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_CONFIG_INFO, 0,
				 &rp, sizeof(rp));
616 617
}

618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738
static u32 get_supported_phys(struct hci_dev *hdev)
{
	u32 supported_phys = 0;

	if (lmp_bredr_capable(hdev)) {
		supported_phys |= MGMT_PHY_BR_1M_1SLOT;

		if (hdev->features[0][0] & LMP_3SLOT)
			supported_phys |= MGMT_PHY_BR_1M_3SLOT;

		if (hdev->features[0][0] & LMP_5SLOT)
			supported_phys |= MGMT_PHY_BR_1M_5SLOT;

		if (lmp_edr_2m_capable(hdev)) {
			supported_phys |= MGMT_PHY_EDR_2M_1SLOT;

			if (lmp_edr_3slot_capable(hdev))
				supported_phys |= MGMT_PHY_EDR_2M_3SLOT;

			if (lmp_edr_5slot_capable(hdev))
				supported_phys |= MGMT_PHY_EDR_2M_5SLOT;

			if (lmp_edr_3m_capable(hdev)) {
				supported_phys |= MGMT_PHY_EDR_3M_1SLOT;

				if (lmp_edr_3slot_capable(hdev))
					supported_phys |= MGMT_PHY_EDR_3M_3SLOT;

				if (lmp_edr_5slot_capable(hdev))
					supported_phys |= MGMT_PHY_EDR_3M_5SLOT;
			}
		}
	}

	if (lmp_le_capable(hdev)) {
		supported_phys |= MGMT_PHY_LE_1M_TX;
		supported_phys |= MGMT_PHY_LE_1M_RX;

		if (hdev->le_features[1] & HCI_LE_PHY_2M) {
			supported_phys |= MGMT_PHY_LE_2M_TX;
			supported_phys |= MGMT_PHY_LE_2M_RX;
		}

		if (hdev->le_features[1] & HCI_LE_PHY_CODED) {
			supported_phys |= MGMT_PHY_LE_CODED_TX;
			supported_phys |= MGMT_PHY_LE_CODED_RX;
		}
	}

	return supported_phys;
}

static u32 get_selected_phys(struct hci_dev *hdev)
{
	u32 selected_phys = 0;

	if (lmp_bredr_capable(hdev)) {
		selected_phys |= MGMT_PHY_BR_1M_1SLOT;

		if (hdev->pkt_type & (HCI_DM3 | HCI_DH3))
			selected_phys |= MGMT_PHY_BR_1M_3SLOT;

		if (hdev->pkt_type & (HCI_DM5 | HCI_DH5))
			selected_phys |= MGMT_PHY_BR_1M_5SLOT;

		if (lmp_edr_2m_capable(hdev)) {
			if (!(hdev->pkt_type & HCI_2DH1))
				selected_phys |= MGMT_PHY_EDR_2M_1SLOT;

			if (lmp_edr_3slot_capable(hdev) &&
			    !(hdev->pkt_type & HCI_2DH3))
				selected_phys |= MGMT_PHY_EDR_2M_3SLOT;

			if (lmp_edr_5slot_capable(hdev) &&
			    !(hdev->pkt_type & HCI_2DH5))
				selected_phys |= MGMT_PHY_EDR_2M_5SLOT;

			if (lmp_edr_3m_capable(hdev)) {
				if (!(hdev->pkt_type & HCI_3DH1))
					selected_phys |= MGMT_PHY_EDR_3M_1SLOT;

				if (lmp_edr_3slot_capable(hdev) &&
				    !(hdev->pkt_type & HCI_3DH3))
					selected_phys |= MGMT_PHY_EDR_3M_3SLOT;

				if (lmp_edr_5slot_capable(hdev) &&
				    !(hdev->pkt_type & HCI_3DH5))
					selected_phys |= MGMT_PHY_EDR_3M_5SLOT;
			}
		}
	}

	if (lmp_le_capable(hdev)) {
		if (hdev->le_tx_def_phys & HCI_LE_SET_PHY_1M)
			selected_phys |= MGMT_PHY_LE_1M_TX;

		if (hdev->le_rx_def_phys & HCI_LE_SET_PHY_1M)
			selected_phys |= MGMT_PHY_LE_1M_RX;

		if (hdev->le_tx_def_phys & HCI_LE_SET_PHY_2M)
			selected_phys |= MGMT_PHY_LE_2M_TX;

		if (hdev->le_rx_def_phys & HCI_LE_SET_PHY_2M)
			selected_phys |= MGMT_PHY_LE_2M_RX;

		if (hdev->le_tx_def_phys & HCI_LE_SET_PHY_CODED)
			selected_phys |= MGMT_PHY_LE_CODED_TX;

		if (hdev->le_rx_def_phys & HCI_LE_SET_PHY_CODED)
			selected_phys |= MGMT_PHY_LE_CODED_RX;
	}

	return selected_phys;
}

static u32 get_configurable_phys(struct hci_dev *hdev)
{
	return (get_supported_phys(hdev) & ~MGMT_PHY_BR_1M_1SLOT &
		~MGMT_PHY_LE_1M_TX & ~MGMT_PHY_LE_1M_RX);
}

739 740 741 742 743
static u32 get_supported_settings(struct hci_dev *hdev)
{
	u32 settings = 0;

	settings |= MGMT_SETTING_POWERED;
744
	settings |= MGMT_SETTING_BONDABLE;
745
	settings |= MGMT_SETTING_DEBUG_KEYS;
746 747
	settings |= MGMT_SETTING_CONNECTABLE;
	settings |= MGMT_SETTING_DISCOVERABLE;
748

749
	if (lmp_bredr_capable(hdev)) {
750 751
		if (hdev->hci_ver >= BLUETOOTH_VER_1_2)
			settings |= MGMT_SETTING_FAST_CONNECTABLE;
752 753
		settings |= MGMT_SETTING_BREDR;
		settings |= MGMT_SETTING_LINK_SECURITY;
754 755 756 757 758

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

760
		if (lmp_sc_capable(hdev))
761
			settings |= MGMT_SETTING_SECURE_CONN;
762
	}
763

764
	if (lmp_le_capable(hdev)) {
765
		settings |= MGMT_SETTING_LE;
766
		settings |= MGMT_SETTING_ADVERTISING;
767
		settings |= MGMT_SETTING_SECURE_CONN;
768
		settings |= MGMT_SETTING_PRIVACY;
769
		settings |= MGMT_SETTING_STATIC_ADDRESS;
770
	}
771

772 773
	if (test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks) ||
	    hdev->set_bdaddr)
774 775
		settings |= MGMT_SETTING_CONFIGURATION;

776 777
	settings |= MGMT_SETTING_PHY_CONFIGURATION;

778 779 780 781 782 783 784
	return settings;
}

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

785
	if (hdev_is_powered(hdev))
786 787
		settings |= MGMT_SETTING_POWERED;

788
	if (hci_dev_test_flag(hdev, HCI_CONNECTABLE))
789 790
		settings |= MGMT_SETTING_CONNECTABLE;

791
	if (hci_dev_test_flag(hdev, HCI_FAST_CONNECTABLE))
792 793
		settings |= MGMT_SETTING_FAST_CONNECTABLE;

794
	if (hci_dev_test_flag(hdev, HCI_DISCOVERABLE))
795 796
		settings |= MGMT_SETTING_DISCOVERABLE;

797
	if (hci_dev_test_flag(hdev, HCI_BONDABLE))
798
		settings |= MGMT_SETTING_BONDABLE;
799

800
	if (hci_dev_test_flag(hdev, HCI_BREDR_ENABLED))
801 802
		settings |= MGMT_SETTING_BREDR;

803
	if (hci_dev_test_flag(hdev, HCI_LE_ENABLED))
804 805
		settings |= MGMT_SETTING_LE;

806
	if (hci_dev_test_flag(hdev, HCI_LINK_SECURITY))
807 808
		settings |= MGMT_SETTING_LINK_SECURITY;

809
	if (hci_dev_test_flag(hdev, HCI_SSP_ENABLED))
810 811
		settings |= MGMT_SETTING_SSP;

812
	if (hci_dev_test_flag(hdev, HCI_HS_ENABLED))
813 814
		settings |= MGMT_SETTING_HS;

815
	if (hci_dev_test_flag(hdev, HCI_ADVERTISING))
816 817
		settings |= MGMT_SETTING_ADVERTISING;

818
	if (hci_dev_test_flag(hdev, HCI_SC_ENABLED))
819 820
		settings |= MGMT_SETTING_SECURE_CONN;

821
	if (hci_dev_test_flag(hdev, HCI_KEEP_DEBUG_KEYS))
822 823
		settings |= MGMT_SETTING_DEBUG_KEYS;

824
	if (hci_dev_test_flag(hdev, HCI_PRIVACY))
825 826
		settings |= MGMT_SETTING_PRIVACY;

827 828 829 830 831
	/* The current setting for static address has two purposes. The
	 * first is to indicate if the static address will be used and
	 * the second is to indicate if it is actually set.
	 *
	 * This means if the static address is not configured, this flag
832
	 * will never be set. If the address is configured, then if the
833 834 835 836 837 838
	 * address is actually used decides if the flag is set or not.
	 *
	 * For single mode LE only controllers and dual-mode controllers
	 * with BR/EDR disabled, the existence of the static address will
	 * be evaluated.
	 */
839
	if (hci_dev_test_flag(hdev, HCI_FORCE_STATIC_ADDR) ||
840
	    !hci_dev_test_flag(hdev, HCI_BREDR_ENABLED) ||
841 842 843 844 845
	    !bacmp(&hdev->bdaddr, BDADDR_ANY)) {
		if (bacmp(&hdev->static_addr, BDADDR_ANY))
			settings |= MGMT_SETTING_STATIC_ADDRESS;
	}

846 847 848
	return settings;
}

849 850 851 852 853 854 855 856 857 858 859 860
static struct mgmt_pending_cmd *pending_find(u16 opcode, struct hci_dev *hdev)
{
	return mgmt_pending_find(HCI_CHANNEL_CONTROL, opcode, hdev);
}

static struct mgmt_pending_cmd *pending_find_data(u16 opcode,
						  struct hci_dev *hdev,
						  const void *data)
{
	return mgmt_pending_find_data(HCI_CHANNEL_CONTROL, opcode, hdev, data);
}

861
u8 mgmt_get_adv_discov_flags(struct hci_dev *hdev)
862
{
863
	struct mgmt_pending_cmd *cmd;
864 865 866 867

	/* If there's a pending mgmt command the flags will not yet have
	 * their final values, so check for this first.
	 */
868
	cmd = pending_find(MGMT_OP_SET_DISCOVERABLE, hdev);
869 870 871 872 873 874 875
	if (cmd) {
		struct mgmt_mode *cp = cmd->param;
		if (cp->val == 0x01)
			return LE_AD_GENERAL;
		else if (cp->val == 0x02)
			return LE_AD_LIMITED;
	} else {
876
		if (hci_dev_test_flag(hdev, HCI_LIMITED_DISCOVERABLE))
877
			return LE_AD_LIMITED;
878
		else if (hci_dev_test_flag(hdev, HCI_DISCOVERABLE))
879 880 881 882 883 884
			return LE_AD_GENERAL;
	}

	return 0;
}

885
bool mgmt_get_connectable(struct hci_dev *hdev)
886 887
{
	struct mgmt_pending_cmd *cmd;
888

889 890 891 892 893 894
	/* If there's a pending mgmt command the flag will not yet have
	 * it's final value, so check for this first.
	 */
	cmd = pending_find(MGMT_OP_SET_CONNECTABLE, hdev);
	if (cmd) {
		struct mgmt_mode *cp = cmd->param;
895

896
		return cp->val;
897 898
	}

899 900
	return hci_dev_test_flag(hdev, HCI_CONNECTABLE);
}
901

902 903 904
static void service_cache_off(struct work_struct *work)
{
	struct hci_dev *hdev = container_of(work, struct hci_dev,
905
					    service_cache.work);
906
	struct hci_request req;
907

908
	if (!hci_dev_test_and_clear_flag(hdev, HCI_SERVICE_CACHE))
909 910
		return;

911 912
	hci_req_init(&req, hdev);

913 914
	hci_dev_lock(hdev);

915
	__hci_req_update_eir(&req);
916
	__hci_req_update_class(&req);
917 918

	hci_dev_unlock(hdev);
919 920

	hci_req_run(&req, NULL);
921 922
}

923 924 925 926 927 928 929 930
static void rpa_expired(struct work_struct *work)
{
	struct hci_dev *hdev = container_of(work, struct hci_dev,
					    rpa_expired.work);
	struct hci_request req;

	BT_DBG("");

931
	hci_dev_set_flag(hdev, HCI_RPA_EXPIRED);
932

933
	if (!hci_dev_test_flag(hdev, HCI_ADVERTISING))
934 935 936
		return;

	/* The generation of a new RPA and programming it into the
937 938
	 * controller happens in the hci_req_enable_advertising()
	 * function.
939 940
	 */
	hci_req_init(&req, hdev);
941 942 943 944
	if (ext_adv_capable(hdev))
		__hci_req_start_ext_adv(&req, hdev->cur_adv_instance);
	else
		__hci_req_enable_advertising(&req);
945 946 947
	hci_req_run(&req, NULL);
}

948
static void mgmt_init_hdev(struct sock *sk, struct hci_dev *hdev)
949
{
950
	if (hci_dev_test_and_set_flag(hdev, HCI_MGMT))
951 952
		return;

953
	INIT_DELAYED_WORK(&hdev->service_cache, service_cache_off);
954
	INIT_DELAYED_WORK(&hdev->rpa_expired, rpa_expired);
955

956 957 958 959 960
	/* 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
	 */
961
	hci_dev_clear_flag(hdev, HCI_BONDABLE);
962 963
}

964
static int read_controller_info(struct sock *sk, struct hci_dev *hdev,
965
				void *data, u16 data_len)
966
{
967
	struct mgmt_rp_read_info rp;
968

969
	BT_DBG("sock %p %s", sk, hdev->name);
970

971
	hci_dev_lock(hdev);
972

973 974
	memset(&rp, 0, sizeof(rp));

975
	bacpy(&rp.bdaddr, &hdev->bdaddr);
976

977
	rp.version = hdev->hci_ver;
978
	rp.manufacturer = cpu_to_le16(hdev->manufacturer);
979 980 981

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

983
	memcpy(rp.dev_class, hdev->dev_class, 3);
984

985
	memcpy(rp.name, hdev->dev_name, sizeof(hdev->dev_name));
986
	memcpy(rp.short_name, hdev->short_name, sizeof(hdev->short_name));
987

988
	hci_dev_unlock(hdev);
989

990 991
	return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_INFO, 0, &rp,
				 sizeof(rp));
992 993
}

994 995 996 997 998 999 1000 1001 1002
static u16 append_eir_data_to_buf(struct hci_dev *hdev, u8 *eir)
{
	u16 eir_len = 0;
	size_t name_len;

	if (hci_dev_test_flag(hdev, HCI_BREDR_ENABLED))
		eir_len = eir_append_data(eir, eir_len, EIR_CLASS_OF_DEV,
					  hdev->dev_class, 3);

1003 1004 1005 1006
	if (hci_dev_test_flag(hdev, HCI_LE_ENABLED))
		eir_len = eir_append_le16(eir, eir_len, EIR_APPEARANCE,
					  hdev->appearance);

1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017
	name_len = strlen(hdev->dev_name);
	eir_len = eir_append_data(eir, eir_len, EIR_NAME_COMPLETE,
				  hdev->dev_name, name_len);

	name_len = strlen(hdev->short_name);
	eir_len = eir_append_data(eir, eir_len, EIR_NAME_SHORT,
				  hdev->short_name, name_len);

	return eir_len;
}

1018 1019 1020
static int read_ext_controller_info(struct sock *sk, struct hci_dev *hdev,
				    void *data, u16 data_len)
{
1021 1022
	char buf[512];
	struct mgmt_rp_read_ext_info *rp = (void *)buf;
1023
	u16 eir_len;
1024 1025 1026

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

1027 1028
	memset(&buf, 0, sizeof(buf));

1029 1030
	hci_dev_lock(hdev);

1031 1032 1033 1034 1035 1036 1037 1038
	bacpy(&rp->bdaddr, &hdev->bdaddr);

	rp->version = hdev->hci_ver;
	rp->manufacturer = cpu_to_le16(hdev->manufacturer);

	rp->supported_settings = cpu_to_le32(get_supported_settings(hdev));
	rp->current_settings = cpu_to_le32(get_current_settings(hdev));

1039

1040
	eir_len = append_eir_data_to_buf(hdev, rp->eir);
1041
	rp->eir_len = cpu_to_le16(eir_len);
1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053

	hci_dev_unlock(hdev);

	/* If this command is called at least once, then the events
	 * for class of device and local name changes are disabled
	 * and only the new extended controller information event
	 * is used.
	 */
	hci_sock_set_flag(sk, HCI_MGMT_EXT_INFO_EVENTS);
	hci_sock_clear_flag(sk, HCI_MGMT_DEV_CLASS_EVENTS);
	hci_sock_clear_flag(sk, HCI_MGMT_LOCAL_NAME_EVENTS);

1054 1055
	return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_EXT_INFO, 0, rp,
				 sizeof(*rp) + eir_len);
1056 1057 1058 1059
}

static int ext_info_changed(struct hci_dev *hdev, struct sock *skip)
{
1060 1061 1062 1063 1064
	char buf[512];
	struct mgmt_ev_ext_info_changed *ev = (void *)buf;
	u16 eir_len;

	memset(buf, 0, sizeof(buf));
1065

1066 1067
	eir_len = append_eir_data_to_buf(hdev, ev->eir);
	ev->eir_len = cpu_to_le16(eir_len);
1068

1069 1070 1071
	return mgmt_limited_event(MGMT_EV_EXT_INFO_CHANGED, hdev, ev,
				  sizeof(*ev) + eir_len,
				  HCI_MGMT_EXT_INFO_EVENTS, skip);
1072 1073
}

1074
static int send_settings_rsp(struct sock *sk, u16 opcode, struct hci_dev *hdev)
1075
{
1076
	__le32 settings = cpu_to_le32(get_current_settings(hdev));
1077

1078 1079
	return mgmt_cmd_complete(sk, hdev->id, opcode, 0, &settings,
				 sizeof(settings));
1080 1081
}

1082
static void clean_up_hci_complete(struct hci_dev *hdev, u8 status, u16 opcode)
1083 1084 1085
{
	BT_DBG("%s status 0x%02x", hdev->name, status);

1086 1087
	if (hci_conn_count(hdev) == 0) {
		cancel_delayed_work(&hdev->power_off);
1088
		queue_work(hdev->req_workqueue, &hdev->power_off.work);
1089
	}
1090 1091
}

1092
void mgmt_advertising_added(struct sock *sk, struct hci_dev *hdev, u8 instance)
1093 1094 1095 1096 1097 1098 1099 1100
{
	struct mgmt_ev_advertising_added ev;

	ev.instance = instance;

	mgmt_event(MGMT_EV_ADVERTISING_ADDED, hdev, &ev, sizeof(ev), sk);
}

1101 1102
void mgmt_advertising_removed(struct sock *sk, struct hci_dev *hdev,
			      u8 instance)
1103 1104 1105 1106 1107 1108 1109 1110
{
	struct mgmt_ev_advertising_removed ev;

	ev.instance = instance;

	mgmt_event(MGMT_EV_ADVERTISING_REMOVED, hdev, &ev, sizeof(ev), sk);
}

1111 1112 1113 1114 1115 1116 1117 1118
static void cancel_adv_timeout(struct hci_dev *hdev)
{
	if (hdev->adv_instance_timeout) {
		hdev->adv_instance_timeout = 0;
		cancel_delayed_work(&hdev->adv_instance_expire);
	}
}

1119 1120 1121 1122
static int clean_up_hci_state(struct hci_dev *hdev)
{
	struct hci_request req;
	struct hci_conn *conn;
1123 1124
	bool discov_stopped;
	int err;
1125 1126 1127 1128 1129 1130 1131 1132 1133

	hci_req_init(&req, hdev);

	if (test_bit(HCI_ISCAN, &hdev->flags) ||
	    test_bit(HCI_PSCAN, &hdev->flags)) {
		u8 scan = 0x00;
		hci_req_add(&req, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);
	}

1134
	hci_req_clear_adv_instance(hdev, NULL, NULL, 0x00, false);
1135

1136
	if (hci_dev_test_flag(hdev, HCI_LE_ADV))
1137
		__hci_req_disable_advertising(&req);
1138

1139
	discov_stopped = hci_req_stop_discovery(&req);
1140 1141

	list_for_each_entry(conn, &hdev->conn_hash.list, list) {
1142 1143
		/* 0x15 == Terminated due to Power Off */
		__hci_abort_conn(&req, conn, 0x15);
1144 1145
	}

1146 1147 1148 1149 1150
	err = hci_req_run(&req, clean_up_hci_complete);
	if (!err && discov_stopped)
		hci_discovery_set_state(hdev, DISCOVERY_STOPPING);

	return err;
1151 1152
}

1153
static int set_powered(struct sock *sk, struct hci_dev *hdev, void *data,
1154
		       u16 len)
1155
{
1156
	struct mgmt_mode *cp = data;
1157
	struct mgmt_pending_cmd *cmd;
1158
	int err;
1159

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

1162
	if (cp->val != 0x00 && cp->val != 0x01)
1163 1164
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_POWERED,
				       MGMT_STATUS_INVALID_PARAMS);
1165

1166
	hci_dev_lock(hdev);
1167

1168
	if (pending_find(MGMT_OP_SET_POWERED, hdev)) {
1169 1170
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_POWERED,
				      MGMT_STATUS_BUSY);
1171 1172 1173
		goto failed;
	}

1174
	if (!!cp->val == hdev_is_powered(hdev)) {
1175
		err = send_settings_rsp(sk, MGMT_OP_SET_POWERED, hdev);
1176 1177 1178
		goto failed;
	}

1179
	cmd = mgmt_pending_add(sk, MGMT_OP_SET_POWERED, hdev, data, len);
1180 1181
	if (!cmd) {
		err = -ENOMEM;
1182
		goto failed;
1183
	}
1184

1185
	if (cp->val) {
1186
		queue_work(hdev->req_workqueue, &hdev->power_on);
1187 1188 1189 1190
		err = 0;
	} else {
		/* Disconnect connections, stop scans, etc */
		err = clean_up_hci_state(hdev);
1191 1192 1193
		if (!err)
			queue_delayed_work(hdev->req_workqueue, &hdev->power_off,
					   HCI_POWER_OFF_TIMEOUT);
1194

1195 1196
		/* ENODATA means there were no HCI commands queued */
		if (err == -ENODATA) {
1197
			cancel_delayed_work(&hdev->power_off);
1198 1199 1200 1201
			queue_work(hdev->req_workqueue, &hdev->power_off.work);
			err = 0;
		}
	}
1202 1203

failed:
1204
	hci_dev_unlock(hdev);
1205
	return err;
1206 1207
}

1208 1209
static int new_settings(struct hci_dev *hdev, struct sock *skip)
{
1210
	__le32 ev = cpu_to_le32(get_current_settings(hdev));
1211

1212 1213
	return mgmt_limited_event(MGMT_EV_NEW_SETTINGS, hdev, &ev,
				  sizeof(ev), HCI_MGMT_SETTING_EVENTS, skip);
1214 1215
}

1216 1217 1218 1219 1220
int mgmt_new_settings(struct hci_dev *hdev)
{
	return new_settings(hdev, NULL);
}

1221 1222 1223 1224 1225 1226
struct cmd_lookup {
	struct sock *sk;
	struct hci_dev *hdev;
	u8 mgmt_status;
};

1227
static void settings_rsp(struct mgmt_pending_cmd *cmd, void *data)
1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242
{
	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);
}

1243
static void cmd_status_rsp(struct mgmt_pending_cmd *cmd, void *data)
1244 1245 1246
{
	u8 *status = data;

1247
	mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, *status);
1248 1249 1250
	mgmt_pending_remove(cmd);
}

1251
static void cmd_complete_rsp(struct mgmt_pending_cmd *cmd, void *data)
1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264
{
	if (cmd->cmd_complete) {
		u8 *status = data;

		cmd->cmd_complete(cmd, *status);
		mgmt_pending_remove(cmd);

		return;
	}

	cmd_status_rsp(cmd, data);
}

1265
static int generic_cmd_complete(struct mgmt_pending_cmd *cmd, u8 status)
1266
{
1267 1268
	return mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, status,
				 cmd->param, cmd->param_len);
1269 1270
}

1271
static int addr_cmd_complete(struct mgmt_pending_cmd *cmd, u8 status)
1272
{
1273 1274
	return mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, status,
				 cmd->param, sizeof(struct mgmt_addr_info));
1275 1276
}

1277 1278 1279 1280
static u8 mgmt_bredr_support(struct hci_dev *hdev)
{
	if (!lmp_bredr_capable(hdev))
		return MGMT_STATUS_NOT_SUPPORTED;
1281
	else if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED))
1282 1283 1284 1285 1286 1287 1288 1289 1290
		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;
1291
	else if (!hci_dev_test_flag(hdev, HCI_LE_ENABLED))
1292 1293 1294 1295 1296
		return MGMT_STATUS_REJECTED;
	else
		return MGMT_STATUS_SUCCESS;
}

1297
void mgmt_set_discoverable_complete(struct hci_dev *hdev, u8 status)
1298
{
1299
	struct mgmt_pending_cmd *cmd;
1300 1301 1302 1303 1304

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

	hci_dev_lock(hdev);

1305
	cmd = pending_find(MGMT_OP_SET_DISCOVERABLE, hdev);
1306 1307 1308 1309 1310
	if (!cmd)
		goto unlock;

	if (status) {
		u8 mgmt_err = mgmt_status(status);
1311
		mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, mgmt_err);
1312
		hci_dev_clear_flag(hdev, HCI_LIMITED_DISCOVERABLE);
1313 1314 1315
		goto remove_cmd;
	}

1316 1317 1318 1319
	if (hci_dev_test_flag(hdev, HCI_DISCOVERABLE) &&
	    hdev->discov_timeout > 0) {
		int to = msecs_to_jiffies(hdev->discov_timeout * 1000);
		queue_delayed_work(hdev->req_workqueue, &hdev->discov_off, to);
1320
	}
1321 1322

	send_settings_rsp(cmd->sk, MGMT_OP_SET_DISCOVERABLE, hdev);
1323
	new_settings(hdev, cmd->sk);
1324

1325 1326 1327 1328 1329 1330 1331
remove_cmd:
	mgmt_pending_remove(cmd);

unlock:
	hci_dev_unlock(hdev);
}

1332
static int set_discoverable(struct sock *sk, struct hci_dev *hdev, void *data,
1333
			    u16 len)
1334
{
1335
	struct mgmt_cp_set_discoverable *cp = data;
1336
	struct mgmt_pending_cmd *cmd;
1337
	u16 timeout;
1338 1339
	int err;

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

1342 1343
	if (!hci_dev_test_flag(hdev, HCI_LE_ENABLED) &&
	    !hci_dev_test_flag(hdev, HCI_BREDR_ENABLED))
1344 1345
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
				       MGMT_STATUS_REJECTED);
1346

1347
	if (cp->val != 0x00 && cp->val != 0x01 && cp->val != 0x02)
1348 1349
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
				       MGMT_STATUS_INVALID_PARAMS);
1350

1351
	timeout = __le16_to_cpu(cp->timeout);
1352 1353 1354 1355 1356 1357

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

1361
	hci_dev_lock(hdev);
1362

1363
	if (!hdev_is_powered(hdev) && timeout > 0) {
1364 1365
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
				      MGMT_STATUS_NOT_POWERED);
1366 1367 1368
		goto failed;
	}

1369 1370
	if (pending_find(MGMT_OP_SET_DISCOVERABLE, hdev) ||
	    pending_find(MGMT_OP_SET_CONNECTABLE, hdev)) {
1371 1372
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
				      MGMT_STATUS_BUSY);
1373 1374 1375
		goto failed;
	}

1376
	if (!hci_dev_test_flag(hdev, HCI_CONNECTABLE)) {
1377 1378
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
				      MGMT_STATUS_REJECTED);
1379 1380 1381 1382
		goto failed;
	}

	if (!hdev_is_powered(hdev)) {
1383 1384
		bool changed = false;

1385 1386 1387 1388
		/* Setting limited discoverable when powered off is
		 * not a valid operation since it requires a timeout
		 * and so no need to check HCI_LIMITED_DISCOVERABLE.
		 */
1389
		if (!!cp->val != hci_dev_test_flag(hdev, HCI_DISCOVERABLE)) {
1390
			hci_dev_change_flag(hdev, HCI_DISCOVERABLE);
1391 1392 1393
			changed = true;
		}

1394
		err = send_settings_rsp(sk, MGMT_OP_SET_DISCOVERABLE, hdev);
1395 1396 1397 1398 1399 1400
		if (err < 0)
			goto failed;

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

1401 1402 1403
		goto failed;
	}

1404 1405 1406 1407
	/* If the current mode is the same, then just update the timeout
	 * value with the new value. And if only the timeout gets updated,
	 * then no need for any HCI transactions.
	 */
1408 1409 1410
	if (!!cp->val == hci_dev_test_flag(hdev, HCI_DISCOVERABLE) &&
	    (cp->val == 0x02) == hci_dev_test_flag(hdev,
						   HCI_LIMITED_DISCOVERABLE)) {
1411 1412
		cancel_delayed_work(&hdev->discov_off);
		hdev->discov_timeout = timeout;
1413

1414 1415
		if (cp->val && hdev->discov_timeout > 0) {
			int to = msecs_to_jiffies(hdev->discov_timeout * 1000);
1416 1417
			queue_delayed_work(hdev->req_workqueue,
					   &hdev->discov_off, to);
1418 1419
		}

1420
		err = send_settings_rsp(sk, MGMT_OP_SET_DISCOVERABLE, hdev);
1421 1422 1423
		goto failed;
	}

1424
	cmd = mgmt_pending_add(sk, MGMT_OP_SET_DISCOVERABLE, hdev, data, len);
1425 1426
	if (!cmd) {
		err = -ENOMEM;
1427
		goto failed;
1428
	}
1429

1430 1431 1432 1433 1434 1435 1436
	/* Cancel any potential discoverable timeout that might be
	 * still active and store new timeout value. The arming of
	 * the timeout happens in the complete handler.
	 */
	cancel_delayed_work(&hdev->discov_off);
	hdev->discov_timeout = timeout;

1437 1438 1439 1440 1441
	if (cp->val)
		hci_dev_set_flag(hdev, HCI_DISCOVERABLE);
	else
		hci_dev_clear_flag(hdev, HCI_DISCOVERABLE);

1442 1443
	/* Limited discoverable mode */
	if (cp->val == 0x02)
1444
		hci_dev_set_flag(hdev, HCI_LIMITED_DISCOVERABLE);
1445
	else
1446
		hci_dev_clear_flag(hdev, HCI_LIMITED_DISCOVERABLE);
1447

1448 1449
	queue_work(hdev->req_workqueue, &hdev->discoverable_update);
	err = 0;
1450 1451

failed:
1452
	hci_dev_unlock(hdev);
1453 1454 1455
	return err;
}

1456
void mgmt_set_connectable_complete(struct hci_dev *hdev, u8 status)
1457
{
1458
	struct mgmt_pending_cmd *cmd;
1459 1460 1461 1462 1463

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

	hci_dev_lock(hdev);

1464
	cmd = pending_find(MGMT_OP_SET_CONNECTABLE, hdev);
1465 1466 1467
	if (!cmd)
		goto unlock;

1468 1469
	if (status) {
		u8 mgmt_err = mgmt_status(status);
1470
		mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, mgmt_err);
1471 1472 1473
		goto remove_cmd;
	}

1474
	send_settings_rsp(cmd->sk, MGMT_OP_SET_CONNECTABLE, hdev);
1475
	new_settings(hdev, cmd->sk);
1476

1477
remove_cmd:
1478 1479 1480 1481 1482 1483
	mgmt_pending_remove(cmd);

unlock:
	hci_dev_unlock(hdev);
}

1484 1485 1486 1487 1488 1489
static int set_connectable_update_settings(struct hci_dev *hdev,
					   struct sock *sk, u8 val)
{
	bool changed = false;
	int err;

1490
	if (!!val != hci_dev_test_flag(hdev, HCI_CONNECTABLE))
1491 1492 1493
		changed = true;

	if (val) {
1494
		hci_dev_set_flag(hdev, HCI_CONNECTABLE);
1495
	} else {
1496 1497
		hci_dev_clear_flag(hdev, HCI_CONNECTABLE);
		hci_dev_clear_flag(hdev, HCI_DISCOVERABLE);
1498 1499 1500 1501 1502 1503
	}

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

1504
	if (changed) {
1505
		hci_req_update_scan(hdev);
1506
		hci_update_background_scan(hdev);
1507
		return new_settings(hdev, sk);
1508
	}
1509 1510 1511 1512

	return 0;
}

1513
static int set_connectable(struct sock *sk, struct hci_dev *hdev, void *data,
1514
			   u16 len)
1515
{
1516
	struct mgmt_mode *cp = data;
1517
	struct mgmt_pending_cmd *cmd;
1518 1519
	int err;

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

1522 1523
	if (!hci_dev_test_flag(hdev, HCI_LE_ENABLED) &&
	    !hci_dev_test_flag(hdev, HCI_BREDR_ENABLED))
1524 1525
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE,
				       MGMT_STATUS_REJECTED);
1526

1527
	if (cp->val != 0x00 && cp->val != 0x01)
1528 1529
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE,
				       MGMT_STATUS_INVALID_PARAMS);
1530

1531
	hci_dev_lock(hdev);
1532

1533
	if (!hdev_is_powered(hdev)) {
1534
		err = set_connectable_update_settings(hdev, sk, cp->val);
1535 1536 1537
		goto failed;
	}

1538 1539
	if (pending_find(MGMT_OP_SET_DISCOVERABLE, hdev) ||
	    pending_find(MGMT_OP_SET_CONNECTABLE, hdev)) {
1540 1541
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE,
				      MGMT_STATUS_BUSY);
1542 1543 1544
		goto failed;
	}

1545
	cmd = mgmt_pending_add(sk, MGMT_OP_SET_CONNECTABLE, hdev, data, len);
1546 1547
	if (!cmd) {
		err = -ENOMEM;
1548
		goto failed;
1549
	}
1550

1551 1552 1553 1554 1555
	if (cp->val) {
		hci_dev_set_flag(hdev, HCI_CONNECTABLE);
	} else {
		if (hdev->discov_timeout > 0)
			cancel_delayed_work(&hdev->discov_off);
1556

1557 1558 1559
		hci_dev_clear_flag(hdev, HCI_LIMITED_DISCOVERABLE);
		hci_dev_clear_flag(hdev, HCI_DISCOVERABLE);
		hci_dev_clear_flag(hdev, HCI_CONNECTABLE);
1560
	}
1561

1562 1563
	queue_work(hdev->req_workqueue, &hdev->connectable_update);
	err = 0;
1564 1565

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

1570
static int set_bondable(struct sock *sk, struct hci_dev *hdev, void *data,
1571
			u16 len)
1572
{
1573
	struct mgmt_mode *cp = data;
1574
	bool changed;
1575 1576
	int err;

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

1579
	if (cp->val != 0x00 && cp->val != 0x01)
1580 1581
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BONDABLE,
				       MGMT_STATUS_INVALID_PARAMS);
1582

1583
	hci_dev_lock(hdev);
1584 1585

	if (cp->val)
1586
		changed = !hci_dev_test_and_set_flag(hdev, HCI_BONDABLE);
1587
	else
1588
		changed = hci_dev_test_and_clear_flag(hdev, HCI_BONDABLE);
1589

1590
	err = send_settings_rsp(sk, MGMT_OP_SET_BONDABLE, hdev);
1591
	if (err < 0)
1592
		goto unlock;
1593

1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604
	if (changed) {
		/* In limited privacy mode the change of bondable mode
		 * may affect the local advertising address.
		 */
		if (hdev_is_powered(hdev) &&
		    hci_dev_test_flag(hdev, HCI_ADVERTISING) &&
		    hci_dev_test_flag(hdev, HCI_DISCOVERABLE) &&
		    hci_dev_test_flag(hdev, HCI_LIMITED_PRIVACY))
			queue_work(hdev->req_workqueue,
				   &hdev->discoverable_update);

1605
		err = new_settings(hdev, sk);
1606
	}
1607

1608
unlock:
1609
	hci_dev_unlock(hdev);
1610 1611 1612
	return err;
}

1613 1614
static int set_link_security(struct sock *sk, struct hci_dev *hdev, void *data,
			     u16 len)
1615 1616
{
	struct mgmt_mode *cp = data;
1617
	struct mgmt_pending_cmd *cmd;
1618
	u8 val, status;
1619 1620
	int err;

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

1623 1624
	status = mgmt_bredr_support(hdev);
	if (status)
1625 1626
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY,
				       status);
1627

1628
	if (cp->val != 0x00 && cp->val != 0x01)
1629 1630
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY,
				       MGMT_STATUS_INVALID_PARAMS);
1631

1632 1633
	hci_dev_lock(hdev);

1634
	if (!hdev_is_powered(hdev)) {
1635 1636
		bool changed = false;

1637
		if (!!cp->val != hci_dev_test_flag(hdev, HCI_LINK_SECURITY)) {
1638
			hci_dev_change_flag(hdev, HCI_LINK_SECURITY);
1639 1640 1641 1642 1643 1644 1645 1646 1647 1648
			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);

1649 1650 1651
		goto failed;
	}

1652
	if (pending_find(MGMT_OP_SET_LINK_SECURITY, hdev)) {
1653 1654
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY,
				      MGMT_STATUS_BUSY);
1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681
		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;
}

1682
static int set_ssp(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
1683 1684
{
	struct mgmt_mode *cp = data;
1685
	struct mgmt_pending_cmd *cmd;
1686
	u8 status;
1687 1688
	int err;

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

1691 1692
	status = mgmt_bredr_support(hdev);
	if (status)
1693
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SSP, status);
1694

1695
	if (!lmp_ssp_capable(hdev))
1696 1697
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SSP,
				       MGMT_STATUS_NOT_SUPPORTED);
1698

1699
	if (cp->val != 0x00 && cp->val != 0x01)
1700 1701
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SSP,
				       MGMT_STATUS_INVALID_PARAMS);
1702

1703
	hci_dev_lock(hdev);
1704

1705
	if (!hdev_is_powered(hdev)) {
1706
		bool changed;
1707

1708
		if (cp->val) {
1709 1710
			changed = !hci_dev_test_and_set_flag(hdev,
							     HCI_SSP_ENABLED);
1711
		} else {
1712 1713
			changed = hci_dev_test_and_clear_flag(hdev,
							      HCI_SSP_ENABLED);
1714
			if (!changed)
1715 1716
				changed = hci_dev_test_and_clear_flag(hdev,
								      HCI_HS_ENABLED);
1717
			else
1718
				hci_dev_clear_flag(hdev, HCI_HS_ENABLED);
1719 1720 1721 1722 1723 1724 1725 1726 1727
		}

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

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

1728 1729 1730
		goto failed;
	}

1731
	if (pending_find(MGMT_OP_SET_SSP, hdev)) {
1732 1733
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SSP,
				      MGMT_STATUS_BUSY);
1734 1735 1736
		goto failed;
	}

1737
	if (!!cp->val == hci_dev_test_flag(hdev, HCI_SSP_ENABLED)) {
1738 1739 1740 1741 1742 1743 1744 1745 1746 1747
		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;
	}

1748
	if (!cp->val && hci_dev_test_flag(hdev, HCI_USE_DEBUG_KEYS))
1749 1750 1751
		hci_send_cmd(hdev, HCI_OP_WRITE_SSP_DEBUG_MODE,
			     sizeof(cp->val), &cp->val);

1752
	err = hci_send_cmd(hdev, HCI_OP_WRITE_SSP_MODE, 1, &cp->val);
1753 1754 1755 1756 1757 1758 1759 1760 1761 1762
	if (err < 0) {
		mgmt_pending_remove(cmd);
		goto failed;
	}

failed:
	hci_dev_unlock(hdev);
	return err;
}

1763
static int set_hs(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
1764 1765
{
	struct mgmt_mode *cp = data;
1766
	bool changed;
1767
	u8 status;
1768
	int err;
1769

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

1772 1773
	status = mgmt_bredr_support(hdev);
	if (status)
1774
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS, status);
1775

1776
	if (!lmp_ssp_capable(hdev))
1777 1778
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS,
				       MGMT_STATUS_NOT_SUPPORTED);
1779

1780
	if (!hci_dev_test_flag(hdev, HCI_SSP_ENABLED))
1781 1782
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS,
				       MGMT_STATUS_REJECTED);
1783

1784
	if (cp->val != 0x00 && cp->val != 0x01)
1785 1786
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS,
				       MGMT_STATUS_INVALID_PARAMS);
1787

1788 1789
	hci_dev_lock(hdev);

1790
	if (pending_find(MGMT_OP_SET_SSP, hdev)) {
1791 1792
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS,
				      MGMT_STATUS_BUSY);
1793 1794 1795
		goto unlock;
	}

1796
	if (cp->val) {
1797
		changed = !hci_dev_test_and_set_flag(hdev, HCI_HS_ENABLED);
1798 1799
	} else {
		if (hdev_is_powered(hdev)) {
1800 1801
			err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS,
					      MGMT_STATUS_REJECTED);
1802 1803 1804
			goto unlock;
		}

1805
		changed = hci_dev_test_and_clear_flag(hdev, HCI_HS_ENABLED);
1806
	}
1807 1808 1809 1810 1811 1812 1813

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

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

1815 1816 1817
unlock:
	hci_dev_unlock(hdev);
	return err;
1818 1819
}

1820
static void le_enable_complete(struct hci_dev *hdev, u8 status, u16 opcode)
1821 1822 1823
{
	struct cmd_lookup match = { NULL, hdev };

1824 1825
	hci_dev_lock(hdev);

1826 1827 1828 1829 1830
	if (status) {
		u8 mgmt_err = mgmt_status(status);

		mgmt_pending_foreach(MGMT_OP_SET_LE, hdev, cmd_status_rsp,
				     &mgmt_err);
1831
		goto unlock;
1832 1833 1834 1835 1836 1837 1838 1839
	}

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

	new_settings(hdev, match.sk);

	if (match.sk)
		sock_put(match.sk);
1840 1841 1842 1843 1844 1845

	/* Make sure the controller has a good default for
	 * advertising data. Restrict the update to when LE
	 * has actually been enabled. During power on, the
	 * update in powered_update_hci will take care of it.
	 */
1846
	if (hci_dev_test_flag(hdev, HCI_LE_ENABLED)) {
1847 1848
		struct hci_request req;
		hci_req_init(&req, hdev);
1849 1850 1851 1852 1853 1854 1855 1856 1857 1858
		if (ext_adv_capable(hdev)) {
			int err;

			err = __hci_req_setup_ext_adv_instance(&req, 0x00);
			if (!err)
				__hci_req_update_scan_rsp_data(&req, 0x00);
		} else {
			__hci_req_update_adv_data(&req, 0x00);
			__hci_req_update_scan_rsp_data(&req, 0x00);
		}
1859
		hci_req_run(&req, NULL);
1860
		hci_update_background_scan(hdev);
1861
	}
1862 1863 1864

unlock:
	hci_dev_unlock(hdev);
1865 1866
}

1867
static int set_le(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
1868 1869 1870
{
	struct mgmt_mode *cp = data;
	struct hci_cp_write_le_host_supported hci_cp;
1871
	struct mgmt_pending_cmd *cmd;
1872
	struct hci_request req;
1873
	int err;
1874
	u8 val, enabled;
1875

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

1878
	if (!lmp_le_capable(hdev))
1879 1880
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
				       MGMT_STATUS_NOT_SUPPORTED);
1881

1882
	if (cp->val != 0x00 && cp->val != 0x01)
1883 1884
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
				       MGMT_STATUS_INVALID_PARAMS);
1885

1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898
	/* Bluetooth single mode LE only controllers or dual-mode
	 * controllers configured as LE only devices, do not allow
	 * switching LE off. These have either LE enabled explicitly
	 * or BR/EDR has been previously switched off.
	 *
	 * When trying to enable an already enabled LE, then gracefully
	 * send a positive response. Trying to disable it however will
	 * result into rejection.
	 */
	if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) {
		if (cp->val == 0x01)
			return send_settings_rsp(sk, MGMT_OP_SET_LE, hdev);

1899 1900
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
				       MGMT_STATUS_REJECTED);
1901
	}
1902

1903
	hci_dev_lock(hdev);
1904 1905

	val = !!cp->val;
1906
	enabled = lmp_host_le_capable(hdev);
1907

1908
	if (!val)
1909
		hci_req_clear_adv_instance(hdev, NULL, NULL, 0x00, true);
1910

1911
	if (!hdev_is_powered(hdev) || val == enabled) {
1912 1913
		bool changed = false;

1914
		if (val != hci_dev_test_flag(hdev, HCI_LE_ENABLED)) {
1915
			hci_dev_change_flag(hdev, HCI_LE_ENABLED);
1916 1917 1918
			changed = true;
		}

1919
		if (!val && hci_dev_test_flag(hdev, HCI_ADVERTISING)) {
1920
			hci_dev_clear_flag(hdev, HCI_ADVERTISING);
1921 1922 1923
			changed = true;
		}

1924 1925
		err = send_settings_rsp(sk, MGMT_OP_SET_LE, hdev);
		if (err < 0)
1926
			goto unlock;
1927 1928 1929 1930

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

1931
		goto unlock;
1932 1933
	}

1934 1935
	if (pending_find(MGMT_OP_SET_LE, hdev) ||
	    pending_find(MGMT_OP_SET_ADVERTISING, hdev)) {
1936 1937
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
				      MGMT_STATUS_BUSY);
1938
		goto unlock;
1939 1940 1941 1942 1943
	}

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

1947 1948
	hci_req_init(&req, hdev);

1949 1950 1951 1952
	memset(&hci_cp, 0, sizeof(hci_cp));

	if (val) {
		hci_cp.le = val;
1953
		hci_cp.simul = 0x00;
1954
	} else {
1955
		if (hci_dev_test_flag(hdev, HCI_LE_ADV))
1956
			__hci_req_disable_advertising(&req);
1957 1958 1959

		if (ext_adv_capable(hdev))
			__hci_req_clear_ext_adv_sets(&req);
1960 1961
	}

1962 1963 1964 1965
	hci_req_add(&req, HCI_OP_WRITE_LE_HOST_SUPPORTED, sizeof(hci_cp),
		    &hci_cp);

	err = hci_req_run(&req, le_enable_complete);
1966
	if (err < 0)
1967 1968
		mgmt_pending_remove(cmd);

1969 1970
unlock:
	hci_dev_unlock(hdev);
1971 1972 1973
	return err;
}

1974 1975 1976 1977 1978 1979 1980 1981
/* 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)
{
1982
	struct mgmt_pending_cmd *cmd;
1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996

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

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

2016 2017
static void mgmt_class_complete(struct hci_dev *hdev, u16 mgmt_op, u8 status)
{
2018
	struct mgmt_pending_cmd *cmd;
2019 2020 2021

	hci_dev_lock(hdev);

2022
	cmd = pending_find(mgmt_op, hdev);
2023 2024 2025
	if (!cmd)
		goto unlock;

2026 2027
	mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode,
			  mgmt_status(status), hdev->dev_class, 3);
2028 2029 2030 2031 2032 2033 2034

	mgmt_pending_remove(cmd);

unlock:
	hci_dev_unlock(hdev);
}

2035
static void add_uuid_complete(struct hci_dev *hdev, u8 status, u16 opcode)
2036 2037 2038 2039 2040 2041
{
	BT_DBG("status 0x%02x", status);

	mgmt_class_complete(hdev, MGMT_OP_ADD_UUID, status);
}

2042
static int add_uuid(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
2043
{
2044
	struct mgmt_cp_add_uuid *cp = data;
2045
	struct mgmt_pending_cmd *cmd;
2046
	struct hci_request req;
2047 2048 2049
	struct bt_uuid *uuid;
	int err;

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

2052
	hci_dev_lock(hdev);
2053

2054
	if (pending_eir_or_class(hdev)) {
2055 2056
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_UUID,
				      MGMT_STATUS_BUSY);
2057 2058 2059
		goto failed;
	}

2060
	uuid = kmalloc(sizeof(*uuid), GFP_KERNEL);
2061 2062 2063 2064 2065 2066
	if (!uuid) {
		err = -ENOMEM;
		goto failed;
	}

	memcpy(uuid->uuid, cp->uuid, 16);
2067
	uuid->svc_hint = cp->svc_hint;
2068
	uuid->size = get_uuid_size(cp->uuid);
2069

2070
	list_add_tail(&uuid->list, &hdev->uuids);
2071

2072
	hci_req_init(&req, hdev);
2073

2074
	__hci_req_update_class(&req);
2075
	__hci_req_update_eir(&req);
2076

2077 2078 2079 2080
	err = hci_req_run(&req, add_uuid_complete);
	if (err < 0) {
		if (err != -ENODATA)
			goto failed;
2081

2082 2083
		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_UUID, 0,
					hdev->dev_class, 3);
2084 2085 2086 2087
		goto failed;
	}

	cmd = mgmt_pending_add(sk, MGMT_OP_ADD_UUID, hdev, data, len);
2088
	if (!cmd) {
2089
		err = -ENOMEM;
2090 2091 2092 2093
		goto failed;
	}

	err = 0;
2094 2095

failed:
2096
	hci_dev_unlock(hdev);
2097 2098 2099
	return err;
}

2100 2101 2102 2103 2104
static bool enable_service_cache(struct hci_dev *hdev)
{
	if (!hdev_is_powered(hdev))
		return false;

2105
	if (!hci_dev_test_and_set_flag(hdev, HCI_SERVICE_CACHE)) {
2106 2107
		queue_delayed_work(hdev->workqueue, &hdev->service_cache,
				   CACHE_TIMEOUT);
2108 2109 2110 2111 2112 2113
		return true;
	}

	return false;
}

2114
static void remove_uuid_complete(struct hci_dev *hdev, u8 status, u16 opcode)
2115 2116 2117 2118 2119 2120
{
	BT_DBG("status 0x%02x", status);

	mgmt_class_complete(hdev, MGMT_OP_REMOVE_UUID, status);
}

2121
static int remove_uuid(struct sock *sk, struct hci_dev *hdev, void *data,
2122
		       u16 len)
2123
{
2124
	struct mgmt_cp_remove_uuid *cp = data;
2125
	struct mgmt_pending_cmd *cmd;
2126
	struct bt_uuid *match, *tmp;
2127
	u8 bt_uuid_any[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
2128
	struct hci_request req;
2129 2130
	int err, found;

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

2133
	hci_dev_lock(hdev);
2134

2135
	if (pending_eir_or_class(hdev)) {
2136 2137
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_REMOVE_UUID,
				      MGMT_STATUS_BUSY);
2138 2139 2140
		goto unlock;
	}

2141
	if (memcmp(cp->uuid, bt_uuid_any, 16) == 0) {
2142
		hci_uuids_clear(hdev);
2143

2144
		if (enable_service_cache(hdev)) {
2145 2146 2147
			err = mgmt_cmd_complete(sk, hdev->id,
						MGMT_OP_REMOVE_UUID,
						0, hdev->dev_class, 3);
2148 2149
			goto unlock;
		}
2150

2151
		goto update_class;
2152 2153 2154 2155
	}

	found = 0;

2156
	list_for_each_entry_safe(match, tmp, &hdev->uuids, list) {
2157 2158 2159 2160
		if (memcmp(match->uuid, cp->uuid, 16) != 0)
			continue;

		list_del(&match->list);
2161
		kfree(match);
2162 2163 2164 2165
		found++;
	}

	if (found == 0) {
2166 2167
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_REMOVE_UUID,
				      MGMT_STATUS_INVALID_PARAMS);
2168 2169 2170
		goto unlock;
	}

2171
update_class:
2172
	hci_req_init(&req, hdev);
2173

2174
	__hci_req_update_class(&req);
2175
	__hci_req_update_eir(&req);
2176

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

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

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

	err = 0;
2194 2195

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

2200
static void set_class_complete(struct hci_dev *hdev, u8 status, u16 opcode)
2201 2202 2203 2204 2205 2206
{
	BT_DBG("status 0x%02x", status);

	mgmt_class_complete(hdev, MGMT_OP_SET_DEV_CLASS, status);
}

2207
static int set_dev_class(struct sock *sk, struct hci_dev *hdev, void *data,
2208
			 u16 len)
2209
{
2210
	struct mgmt_cp_set_dev_class *cp = data;
2211
	struct mgmt_pending_cmd *cmd;
2212
	struct hci_request req;
2213 2214
	int err;

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

2217
	if (!lmp_bredr_capable(hdev))
2218 2219
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS,
				       MGMT_STATUS_NOT_SUPPORTED);
2220

2221
	hci_dev_lock(hdev);
2222

2223
	if (pending_eir_or_class(hdev)) {
2224 2225
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS,
				      MGMT_STATUS_BUSY);
2226 2227
		goto unlock;
	}
2228

2229
	if ((cp->minor & 0x03) != 0 || (cp->major & 0xe0) != 0) {
2230 2231
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS,
				      MGMT_STATUS_INVALID_PARAMS);
2232 2233
		goto unlock;
	}
2234

2235 2236 2237
	hdev->major_class = cp->major;
	hdev->minor_class = cp->minor;

2238
	if (!hdev_is_powered(hdev)) {
2239 2240
		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, 0,
					hdev->dev_class, 3);
2241 2242 2243
		goto unlock;
	}

2244 2245
	hci_req_init(&req, hdev);

2246
	if (hci_dev_test_and_clear_flag(hdev, HCI_SERVICE_CACHE)) {
2247 2248 2249
		hci_dev_unlock(hdev);
		cancel_delayed_work_sync(&hdev->service_cache);
		hci_dev_lock(hdev);
2250
		__hci_req_update_eir(&req);
2251
	}
2252

2253
	__hci_req_update_class(&req);
2254

2255 2256 2257 2258
	err = hci_req_run(&req, set_class_complete);
	if (err < 0) {
		if (err != -ENODATA)
			goto unlock;
2259

2260 2261
		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, 0,
					hdev->dev_class, 3);
2262 2263 2264 2265
		goto unlock;
	}

	cmd = mgmt_pending_add(sk, MGMT_OP_SET_DEV_CLASS, hdev, data, len);
2266
	if (!cmd) {
2267
		err = -ENOMEM;
2268 2269 2270 2271
		goto unlock;
	}

	err = 0;
2272

2273
unlock:
2274
	hci_dev_unlock(hdev);
2275 2276 2277
	return err;
}

2278
static int load_link_keys(struct sock *sk, struct hci_dev *hdev, void *data,
2279
			  u16 len)
2280
{
2281
	struct mgmt_cp_load_link_keys *cp = data;
2282 2283
	const u16 max_key_count = ((U16_MAX - sizeof(*cp)) /
				   sizeof(struct mgmt_link_key_info));
2284
	u16 key_count, expected_len;
2285
	bool changed;
2286
	int i;
2287

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

	if (!lmp_bredr_capable(hdev))
2291 2292
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS,
				       MGMT_STATUS_NOT_SUPPORTED);
2293

2294
	key_count = __le16_to_cpu(cp->key_count);
2295
	if (key_count > max_key_count) {
2296 2297
		bt_dev_err(hdev, "load_link_keys: too big key_count value %u",
			   key_count);
2298 2299
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS,
				       MGMT_STATUS_INVALID_PARAMS);
2300
	}
2301

2302 2303
	expected_len = sizeof(*cp) + key_count *
					sizeof(struct mgmt_link_key_info);
2304
	if (expected_len != len) {
2305 2306
		bt_dev_err(hdev, "load_link_keys: expected %u bytes, got %u bytes",
			   expected_len, len);
2307 2308
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS,
				       MGMT_STATUS_INVALID_PARAMS);
2309 2310
	}

2311
	if (cp->debug_keys != 0x00 && cp->debug_keys != 0x01)
2312 2313
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS,
				       MGMT_STATUS_INVALID_PARAMS);
2314

2315
	BT_DBG("%s debug_keys %u key_count %u", hdev->name, cp->debug_keys,
2316
	       key_count);
2317

2318 2319 2320
	for (i = 0; i < key_count; i++) {
		struct mgmt_link_key_info *key = &cp->keys[i];

2321
		if (key->addr.type != BDADDR_BREDR || key->type > 0x08)
2322 2323 2324
			return mgmt_cmd_status(sk, hdev->id,
					       MGMT_OP_LOAD_LINK_KEYS,
					       MGMT_STATUS_INVALID_PARAMS);
2325 2326
	}

2327
	hci_dev_lock(hdev);
2328 2329 2330 2331

	hci_link_keys_clear(hdev);

	if (cp->debug_keys)
2332
		changed = !hci_dev_test_and_set_flag(hdev, HCI_KEEP_DEBUG_KEYS);
2333
	else
2334 2335
		changed = hci_dev_test_and_clear_flag(hdev,
						      HCI_KEEP_DEBUG_KEYS);
2336 2337 2338

	if (changed)
		new_settings(hdev, NULL);
2339

2340
	for (i = 0; i < key_count; i++) {
2341
		struct mgmt_link_key_info *key = &cp->keys[i];
2342

2343 2344 2345 2346 2347 2348
		/* Always ignore debug keys and require a new pairing if
		 * the user wants to use them.
		 */
		if (key->type == HCI_LK_DEBUG_COMBINATION)
			continue;

2349 2350
		hci_add_link_key(hdev, NULL, &key->addr.bdaddr, key->val,
				 key->type, key->pin_len, NULL);
2351 2352
	}

2353
	mgmt_cmd_complete(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS, 0, NULL, 0);
2354

2355
	hci_dev_unlock(hdev);
2356

2357
	return 0;
2358 2359
}

2360
static int device_unpaired(struct hci_dev *hdev, bdaddr_t *bdaddr,
2361
			   u8 addr_type, struct sock *skip_sk)
2362 2363 2364 2365 2366 2367 2368
{
	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),
2369
			  skip_sk);
2370 2371
}

2372
static int unpair_device(struct sock *sk, struct hci_dev *hdev, void *data,
2373
			 u16 len)
2374
{
2375 2376
	struct mgmt_cp_unpair_device *cp = data;
	struct mgmt_rp_unpair_device rp;
2377
	struct hci_conn_params *params;
2378
	struct mgmt_pending_cmd *cmd;
2379
	struct hci_conn *conn;
2380
	u8 addr_type;
2381 2382
	int err;

2383
	memset(&rp, 0, sizeof(rp));
2384 2385
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;
2386

2387
	if (!bdaddr_type_is_valid(cp->addr.type))
2388 2389 2390
		return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
					 MGMT_STATUS_INVALID_PARAMS,
					 &rp, sizeof(rp));
2391

2392
	if (cp->disconnect != 0x00 && cp->disconnect != 0x01)
2393 2394 2395
		return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
					 MGMT_STATUS_INVALID_PARAMS,
					 &rp, sizeof(rp));
2396

2397 2398
	hci_dev_lock(hdev);

2399
	if (!hdev_is_powered(hdev)) {
2400 2401 2402
		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
					MGMT_STATUS_NOT_POWERED, &rp,
					sizeof(rp));
2403 2404 2405
		goto unlock;
	}

2406
	if (cp->addr.type == BDADDR_BREDR) {
2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419
		/* If disconnection is requested, then look up the
		 * connection. If the remote device is connected, it
		 * will be later used to terminate the link.
		 *
		 * Setting it to NULL explicitly will cause no
		 * termination of the link.
		 */
		if (cp->disconnect)
			conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK,
						       &cp->addr.bdaddr);
		else
			conn = NULL;

2420
		err = hci_remove_link_key(hdev, &cp->addr.bdaddr);
2421 2422 2423 2424 2425 2426
		if (err < 0) {
			err = mgmt_cmd_complete(sk, hdev->id,
						MGMT_OP_UNPAIR_DEVICE,
						MGMT_STATUS_NOT_PAIRED, &rp,
						sizeof(rp));
			goto unlock;
2427 2428
		}

2429
		goto done;
2430
	}
2431

2432 2433 2434
	/* LE address type */
	addr_type = le_addr_type(cp->addr.type);

2435 2436
	/* Abort any ongoing SMP pairing. Removes ltk and irk if they exist. */
	err = smp_cancel_and_remove_pairing(hdev, &cp->addr.bdaddr, addr_type);
2437
	if (err < 0) {
2438 2439 2440
		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
					MGMT_STATUS_NOT_PAIRED, &rp,
					sizeof(rp));
2441 2442 2443
		goto unlock;
	}

2444 2445 2446 2447 2448 2449
	conn = hci_conn_hash_lookup_le(hdev, &cp->addr.bdaddr, addr_type);
	if (!conn) {
		hci_conn_params_del(hdev, &cp->addr.bdaddr, addr_type);
		goto done;
	}

2450

2451 2452 2453 2454 2455
	/* Defer clearing up the connection parameters until closing to
	 * give a chance of keeping them if a repairing happens.
	 */
	set_bit(HCI_CONN_PARAM_REMOVAL_PEND, &conn->flags);

2456 2457 2458 2459 2460 2461 2462 2463 2464
	/* Disable auto-connection parameters if present */
	params = hci_conn_params_lookup(hdev, &cp->addr.bdaddr, addr_type);
	if (params) {
		if (params->explicit_connect)
			params->auto_connect = HCI_AUTO_CONN_EXPLICIT;
		else
			params->auto_connect = HCI_AUTO_CONN_DISABLED;
	}

2465 2466 2467 2468 2469 2470 2471
	/* If disconnection is not requested, then clear the connection
	 * variable so that the link is not terminated.
	 */
	if (!cp->disconnect)
		conn = NULL;

done:
2472 2473 2474
	/* If the connection variable is set, then termination of the
	 * link is requested.
	 */
2475
	if (!conn) {
2476 2477
		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE, 0,
					&rp, sizeof(rp));
2478
		device_unpaired(hdev, &cp->addr.bdaddr, cp->addr.type, sk);
2479 2480
		goto unlock;
	}
2481

2482
	cmd = mgmt_pending_add(sk, MGMT_OP_UNPAIR_DEVICE, hdev, cp,
2483
			       sizeof(*cp));
2484 2485 2486
	if (!cmd) {
		err = -ENOMEM;
		goto unlock;
2487 2488
	}

2489 2490
	cmd->cmd_complete = addr_cmd_complete;

2491
	err = hci_abort_conn(conn, HCI_ERROR_REMOTE_USER_TERM);
2492 2493 2494
	if (err < 0)
		mgmt_pending_remove(cmd);

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

2500
static int disconnect(struct sock *sk, struct hci_dev *hdev, void *data,
2501
		      u16 len)
2502
{
2503
	struct mgmt_cp_disconnect *cp = data;
2504
	struct mgmt_rp_disconnect rp;
2505
	struct mgmt_pending_cmd *cmd;
2506 2507 2508 2509 2510
	struct hci_conn *conn;
	int err;

	BT_DBG("");

2511 2512 2513 2514
	memset(&rp, 0, sizeof(rp));
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;

2515
	if (!bdaddr_type_is_valid(cp->addr.type))
2516 2517 2518
		return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
					 MGMT_STATUS_INVALID_PARAMS,
					 &rp, sizeof(rp));
2519

2520
	hci_dev_lock(hdev);
2521 2522

	if (!test_bit(HCI_UP, &hdev->flags)) {
2523 2524 2525
		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
					MGMT_STATUS_NOT_POWERED, &rp,
					sizeof(rp));
2526 2527 2528
		goto failed;
	}

2529
	if (pending_find(MGMT_OP_DISCONNECT, hdev)) {
2530 2531
		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
					MGMT_STATUS_BUSY, &rp, sizeof(rp));
2532 2533 2534
		goto failed;
	}

2535
	if (cp->addr.type == BDADDR_BREDR)
2536 2537
		conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK,
					       &cp->addr.bdaddr);
2538
	else
2539 2540
		conn = hci_conn_hash_lookup_le(hdev, &cp->addr.bdaddr,
					       le_addr_type(cp->addr.type));
2541

2542
	if (!conn || conn->state == BT_OPEN || conn->state == BT_CLOSED) {
2543 2544 2545
		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
					MGMT_STATUS_NOT_CONNECTED, &rp,
					sizeof(rp));
2546 2547 2548
		goto failed;
	}

2549
	cmd = mgmt_pending_add(sk, MGMT_OP_DISCONNECT, hdev, data, len);
2550 2551
	if (!cmd) {
		err = -ENOMEM;
2552
		goto failed;
2553
	}
2554

2555 2556
	cmd->cmd_complete = generic_cmd_complete;

2557
	err = hci_disconnect(conn, HCI_ERROR_REMOTE_USER_TERM);
2558
	if (err < 0)
2559
		mgmt_pending_remove(cmd);
2560 2561

failed:
2562
	hci_dev_unlock(hdev);
2563 2564 2565
	return err;
}

2566
static u8 link_to_bdaddr(u8 link_type, u8 addr_type)
2567 2568 2569
{
	switch (link_type) {
	case LE_LINK:
2570 2571
		switch (addr_type) {
		case ADDR_LE_DEV_PUBLIC:
2572
			return BDADDR_LE_PUBLIC;
2573

2574
		default:
2575
			/* Fallback to LE Random address type */
2576
			return BDADDR_LE_RANDOM;
2577
		}
2578

2579
	default:
2580
		/* Fallback to BR/EDR type */
2581
		return BDADDR_BREDR;
2582 2583 2584
	}
}

2585 2586
static int get_connections(struct sock *sk, struct hci_dev *hdev, void *data,
			   u16 data_len)
2587 2588
{
	struct mgmt_rp_get_connections *rp;
2589
	struct hci_conn *c;
2590
	size_t rp_len;
2591 2592
	int err;
	u16 i;
2593 2594 2595

	BT_DBG("");

2596
	hci_dev_lock(hdev);
2597

2598
	if (!hdev_is_powered(hdev)) {
2599 2600
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_GET_CONNECTIONS,
				      MGMT_STATUS_NOT_POWERED);
2601 2602 2603
		goto unlock;
	}

2604
	i = 0;
2605 2606
	list_for_each_entry(c, &hdev->conn_hash.list, list) {
		if (test_bit(HCI_CONN_MGMT_CONNECTED, &c->flags))
2607
			i++;
2608 2609
	}

2610
	rp_len = sizeof(*rp) + (i * sizeof(struct mgmt_addr_info));
2611
	rp = kmalloc(rp_len, GFP_KERNEL);
2612
	if (!rp) {
2613 2614 2615 2616 2617
		err = -ENOMEM;
		goto unlock;
	}

	i = 0;
2618
	list_for_each_entry(c, &hdev->conn_hash.list, list) {
2619 2620
		if (!test_bit(HCI_CONN_MGMT_CONNECTED, &c->flags))
			continue;
2621
		bacpy(&rp->addr[i].bdaddr, &c->dst);
2622
		rp->addr[i].type = link_to_bdaddr(c->type, c->dst_type);
2623
		if (c->type == SCO_LINK || c->type == ESCO_LINK)
2624 2625 2626 2627
			continue;
		i++;
	}

2628
	rp->conn_count = cpu_to_le16(i);
2629

2630 2631
	/* Recalculate length in case of filtered SCO connections, etc */
	rp_len = sizeof(*rp) + (i * sizeof(struct mgmt_addr_info));
2632

2633 2634
	err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONNECTIONS, 0, rp,
				rp_len);
2635

2636
	kfree(rp);
2637 2638

unlock:
2639
	hci_dev_unlock(hdev);
2640 2641 2642
	return err;
}

2643
static int send_pin_code_neg_reply(struct sock *sk, struct hci_dev *hdev,
2644
				   struct mgmt_cp_pin_code_neg_reply *cp)
2645
{
2646
	struct mgmt_pending_cmd *cmd;
2647 2648
	int err;

2649
	cmd = mgmt_pending_add(sk, MGMT_OP_PIN_CODE_NEG_REPLY, hdev, cp,
2650
			       sizeof(*cp));
2651 2652 2653
	if (!cmd)
		return -ENOMEM;

2654 2655
	cmd->cmd_complete = addr_cmd_complete;

2656
	err = hci_send_cmd(hdev, HCI_OP_PIN_CODE_NEG_REPLY,
2657
			   sizeof(cp->addr.bdaddr), &cp->addr.bdaddr);
2658 2659 2660 2661 2662 2663
	if (err < 0)
		mgmt_pending_remove(cmd);

	return err;
}

2664
static int pin_code_reply(struct sock *sk, struct hci_dev *hdev, void *data,
2665
			  u16 len)
2666
{
2667
	struct hci_conn *conn;
2668
	struct mgmt_cp_pin_code_reply *cp = data;
2669
	struct hci_cp_pin_code_reply reply;
2670
	struct mgmt_pending_cmd *cmd;
2671 2672 2673 2674
	int err;

	BT_DBG("");

2675
	hci_dev_lock(hdev);
2676

2677
	if (!hdev_is_powered(hdev)) {
2678 2679
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
				      MGMT_STATUS_NOT_POWERED);
2680 2681 2682
		goto failed;
	}

2683
	conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->addr.bdaddr);
2684
	if (!conn) {
2685 2686
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
				      MGMT_STATUS_NOT_CONNECTED);
2687 2688 2689 2690
		goto failed;
	}

	if (conn->pending_sec_level == BT_SECURITY_HIGH && cp->pin_len != 16) {
2691 2692 2693
		struct mgmt_cp_pin_code_neg_reply ncp;

		memcpy(&ncp.addr, &cp->addr, sizeof(ncp.addr));
2694

2695
		bt_dev_err(hdev, "PIN code is not 16 bytes long");
2696

2697
		err = send_pin_code_neg_reply(sk, hdev, &ncp);
2698
		if (err >= 0)
2699 2700
			err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
					      MGMT_STATUS_INVALID_PARAMS);
2701 2702 2703 2704

		goto failed;
	}

2705
	cmd = mgmt_pending_add(sk, MGMT_OP_PIN_CODE_REPLY, hdev, data, len);
2706 2707
	if (!cmd) {
		err = -ENOMEM;
2708
		goto failed;
2709
	}
2710

2711 2712
	cmd->cmd_complete = addr_cmd_complete;

2713
	bacpy(&reply.bdaddr, &cp->addr.bdaddr);
2714
	reply.pin_len = cp->pin_len;
2715
	memcpy(reply.pin_code, cp->pin_code, sizeof(reply.pin_code));
2716 2717 2718

	err = hci_send_cmd(hdev, HCI_OP_PIN_CODE_REPLY, sizeof(reply), &reply);
	if (err < 0)
2719
		mgmt_pending_remove(cmd);
2720 2721

failed:
2722
	hci_dev_unlock(hdev);
2723 2724 2725
	return err;
}

2726 2727
static int set_io_capability(struct sock *sk, struct hci_dev *hdev, void *data,
			     u16 len)
2728
{
2729
	struct mgmt_cp_set_io_capability *cp = data;
2730 2731 2732

	BT_DBG("");

2733
	if (cp->io_capability > SMP_IO_KEYBOARD_DISPLAY)
2734 2735
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_IO_CAPABILITY,
				       MGMT_STATUS_INVALID_PARAMS);
2736

2737
	hci_dev_lock(hdev);
2738 2739 2740 2741

	hdev->io_capability = cp->io_capability;

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

2744
	hci_dev_unlock(hdev);
2745

2746 2747
	return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_IO_CAPABILITY, 0,
				 NULL, 0);
2748 2749
}

2750
static struct mgmt_pending_cmd *find_pairing(struct hci_conn *conn)
2751 2752
{
	struct hci_dev *hdev = conn->hdev;
2753
	struct mgmt_pending_cmd *cmd;
2754

2755
	list_for_each_entry(cmd, &hdev->mgmt_pending, list) {
2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767
		if (cmd->opcode != MGMT_OP_PAIR_DEVICE)
			continue;

		if (cmd->user_data != conn)
			continue;

		return cmd;
	}

	return NULL;
}

2768
static int pairing_complete(struct mgmt_pending_cmd *cmd, u8 status)
2769 2770 2771
{
	struct mgmt_rp_pair_device rp;
	struct hci_conn *conn = cmd->user_data;
2772
	int err;
2773

2774 2775
	bacpy(&rp.addr.bdaddr, &conn->dst);
	rp.addr.type = link_to_bdaddr(conn->type, conn->dst_type);
2776

2777 2778
	err = mgmt_cmd_complete(cmd->sk, cmd->index, MGMT_OP_PAIR_DEVICE,
				status, &rp, sizeof(rp));
2779 2780 2781 2782 2783 2784

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

2785
	hci_conn_drop(conn);
2786 2787 2788 2789 2790

	/* The device is paired so there is no need to remove
	 * its connection parameters anymore.
	 */
	clear_bit(HCI_CONN_PARAM_REMOVAL_PEND, &conn->flags);
2791 2792

	hci_conn_put(conn);
2793 2794

	return err;
2795 2796
}

2797 2798 2799
void mgmt_smp_complete(struct hci_conn *conn, bool complete)
{
	u8 status = complete ? MGMT_STATUS_SUCCESS : MGMT_STATUS_FAILED;
2800
	struct mgmt_pending_cmd *cmd;
2801 2802

	cmd = find_pairing(conn);
2803
	if (cmd) {
2804
		cmd->cmd_complete(cmd, status);
2805 2806
		mgmt_pending_remove(cmd);
	}
2807 2808
}

2809 2810
static void pairing_complete_cb(struct hci_conn *conn, u8 status)
{
2811
	struct mgmt_pending_cmd *cmd;
2812 2813 2814 2815

	BT_DBG("status %u", status);

	cmd = find_pairing(conn);
2816
	if (!cmd) {
2817
		BT_DBG("Unable to find a pending command");
2818 2819 2820 2821 2822
		return;
	}

	cmd->cmd_complete(cmd, mgmt_status(status));
	mgmt_pending_remove(cmd);
2823 2824
}

2825
static void le_pairing_complete_cb(struct hci_conn *conn, u8 status)
2826
{
2827
	struct mgmt_pending_cmd *cmd;
2828 2829 2830 2831 2832 2833 2834

	BT_DBG("status %u", status);

	if (!status)
		return;

	cmd = find_pairing(conn);
2835
	if (!cmd) {
2836
		BT_DBG("Unable to find a pending command");
2837 2838 2839 2840 2841
		return;
	}

	cmd->cmd_complete(cmd, mgmt_status(status));
	mgmt_pending_remove(cmd);
2842 2843
}

2844
static int pair_device(struct sock *sk, struct hci_dev *hdev, void *data,
2845
		       u16 len)
2846
{
2847
	struct mgmt_cp_pair_device *cp = data;
2848
	struct mgmt_rp_pair_device rp;
2849
	struct mgmt_pending_cmd *cmd;
2850 2851 2852 2853 2854 2855
	u8 sec_level, auth_type;
	struct hci_conn *conn;
	int err;

	BT_DBG("");

2856 2857 2858 2859
	memset(&rp, 0, sizeof(rp));
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;

2860
	if (!bdaddr_type_is_valid(cp->addr.type))
2861 2862 2863
		return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
					 MGMT_STATUS_INVALID_PARAMS,
					 &rp, sizeof(rp));
2864

2865
	if (cp->io_cap > SMP_IO_KEYBOARD_DISPLAY)
2866 2867 2868
		return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
					 MGMT_STATUS_INVALID_PARAMS,
					 &rp, sizeof(rp));
2869

2870
	hci_dev_lock(hdev);
2871

2872
	if (!hdev_is_powered(hdev)) {
2873 2874 2875
		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
					MGMT_STATUS_NOT_POWERED, &rp,
					sizeof(rp));
2876 2877 2878
		goto unlock;
	}

2879 2880 2881 2882 2883 2884 2885
	if (hci_bdaddr_is_paired(hdev, &cp->addr.bdaddr, cp->addr.type)) {
		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
					MGMT_STATUS_ALREADY_PAIRED, &rp,
					sizeof(rp));
		goto unlock;
	}

2886
	sec_level = BT_SECURITY_MEDIUM;
2887
	auth_type = HCI_AT_DEDICATED_BONDING;
2888

2889
	if (cp->addr.type == BDADDR_BREDR) {
2890 2891
		conn = hci_connect_acl(hdev, &cp->addr.bdaddr, sec_level,
				       auth_type);
2892
	} else {
2893
		u8 addr_type = le_addr_type(cp->addr.type);
2894
		struct hci_conn_params *p;
2895

2896 2897 2898 2899 2900 2901 2902 2903 2904
		/* When pairing a new device, it is expected to remember
		 * this device for future connections. Adding the connection
		 * parameter information ahead of time allows tracking
		 * of the slave preferred values and will speed up any
		 * further connection establishment.
		 *
		 * If connection parameters already exist, then they
		 * will be kept and this function does nothing.
		 */
2905 2906 2907 2908
		p = hci_conn_params_add(hdev, &cp->addr.bdaddr, addr_type);

		if (p->auto_connect == HCI_AUTO_CONN_EXPLICIT)
			p->auto_connect = HCI_AUTO_CONN_DISABLED;
2909

2910 2911
		conn = hci_connect_le_scan(hdev, &cp->addr.bdaddr,
					   addr_type, sec_level,
2912
					   HCI_LE_CONN_TIMEOUT);
2913
	}
2914

2915
	if (IS_ERR(conn)) {
2916 2917 2918 2919
		int status;

		if (PTR_ERR(conn) == -EBUSY)
			status = MGMT_STATUS_BUSY;
2920 2921 2922 2923
		else if (PTR_ERR(conn) == -EOPNOTSUPP)
			status = MGMT_STATUS_NOT_SUPPORTED;
		else if (PTR_ERR(conn) == -ECONNREFUSED)
			status = MGMT_STATUS_REJECTED;
2924 2925 2926
		else
			status = MGMT_STATUS_CONNECT_FAILED;

2927 2928
		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
					status, &rp, sizeof(rp));
2929 2930 2931 2932
		goto unlock;
	}

	if (conn->connect_cfm_cb) {
2933
		hci_conn_drop(conn);
2934 2935
		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
					MGMT_STATUS_BUSY, &rp, sizeof(rp));
2936 2937 2938
		goto unlock;
	}

2939
	cmd = mgmt_pending_add(sk, MGMT_OP_PAIR_DEVICE, hdev, data, len);
2940 2941
	if (!cmd) {
		err = -ENOMEM;
2942
		hci_conn_drop(conn);
2943 2944 2945
		goto unlock;
	}

2946 2947
	cmd->cmd_complete = pairing_complete;

2948
	/* For LE, just connecting isn't a proof that the pairing finished */
2949
	if (cp->addr.type == BDADDR_BREDR) {
2950
		conn->connect_cfm_cb = pairing_complete_cb;
2951 2952 2953 2954 2955 2956 2957
		conn->security_cfm_cb = pairing_complete_cb;
		conn->disconn_cfm_cb = pairing_complete_cb;
	} else {
		conn->connect_cfm_cb = le_pairing_complete_cb;
		conn->security_cfm_cb = le_pairing_complete_cb;
		conn->disconn_cfm_cb = le_pairing_complete_cb;
	}
2958

2959
	conn->io_capability = cp->io_cap;
2960
	cmd->user_data = hci_conn_get(conn);
2961

2962
	if ((conn->state == BT_CONNECTED || conn->state == BT_CONFIG) &&
2963 2964 2965 2966
	    hci_conn_security(conn, sec_level, auth_type, true)) {
		cmd->cmd_complete(cmd, 0);
		mgmt_pending_remove(cmd);
	}
2967 2968 2969 2970

	err = 0;

unlock:
2971
	hci_dev_unlock(hdev);
2972 2973 2974
	return err;
}

2975 2976
static int cancel_pair_device(struct sock *sk, struct hci_dev *hdev, void *data,
			      u16 len)
2977
{
2978
	struct mgmt_addr_info *addr = data;
2979
	struct mgmt_pending_cmd *cmd;
2980 2981 2982 2983 2984 2985 2986
	struct hci_conn *conn;
	int err;

	BT_DBG("");

	hci_dev_lock(hdev);

2987
	if (!hdev_is_powered(hdev)) {
2988 2989
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE,
				      MGMT_STATUS_NOT_POWERED);
2990 2991 2992
		goto unlock;
	}

2993
	cmd = pending_find(MGMT_OP_PAIR_DEVICE, hdev);
2994
	if (!cmd) {
2995 2996
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE,
				      MGMT_STATUS_INVALID_PARAMS);
2997 2998 2999 3000 3001 3002
		goto unlock;
	}

	conn = cmd->user_data;

	if (bacmp(&addr->bdaddr, &conn->dst) != 0) {
3003 3004
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE,
				      MGMT_STATUS_INVALID_PARAMS);
3005 3006 3007
		goto unlock;
	}

3008 3009
	cmd->cmd_complete(cmd, MGMT_STATUS_CANCELLED);
	mgmt_pending_remove(cmd);
3010

3011 3012
	err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE, 0,
				addr, sizeof(*addr));
3013 3014 3015 3016 3017
unlock:
	hci_dev_unlock(hdev);
	return err;
}

3018
static int user_pairing_resp(struct sock *sk, struct hci_dev *hdev,
3019
			     struct mgmt_addr_info *addr, u16 mgmt_op,
3020
			     u16 hci_op, __le32 passkey)
3021
{
3022
	struct mgmt_pending_cmd *cmd;
3023
	struct hci_conn *conn;
3024 3025
	int err;

3026
	hci_dev_lock(hdev);
3027

3028
	if (!hdev_is_powered(hdev)) {
3029 3030 3031
		err = mgmt_cmd_complete(sk, hdev->id, mgmt_op,
					MGMT_STATUS_NOT_POWERED, addr,
					sizeof(*addr));
3032
		goto done;
3033 3034
	}

3035 3036
	if (addr->type == BDADDR_BREDR)
		conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &addr->bdaddr);
3037
	else
3038 3039
		conn = hci_conn_hash_lookup_le(hdev, &addr->bdaddr,
					       le_addr_type(addr->type));
3040 3041

	if (!conn) {
3042 3043 3044
		err = mgmt_cmd_complete(sk, hdev->id, mgmt_op,
					MGMT_STATUS_NOT_CONNECTED, addr,
					sizeof(*addr));
3045 3046
		goto done;
	}
3047

3048
	if (addr->type == BDADDR_LE_PUBLIC || addr->type == BDADDR_LE_RANDOM) {
3049 3050
		err = smp_user_confirm_reply(conn, mgmt_op, passkey);
		if (!err)
3051 3052 3053
			err = mgmt_cmd_complete(sk, hdev->id, mgmt_op,
						MGMT_STATUS_SUCCESS, addr,
						sizeof(*addr));
3054
		else
3055 3056 3057
			err = mgmt_cmd_complete(sk, hdev->id, mgmt_op,
						MGMT_STATUS_FAILED, addr,
						sizeof(*addr));
3058 3059 3060 3061

		goto done;
	}

3062
	cmd = mgmt_pending_add(sk, mgmt_op, hdev, addr, sizeof(*addr));
3063 3064
	if (!cmd) {
		err = -ENOMEM;
3065
		goto done;
3066 3067
	}

3068 3069
	cmd->cmd_complete = addr_cmd_complete;

3070
	/* Continue with pairing via HCI */
3071 3072 3073
	if (hci_op == HCI_OP_USER_PASSKEY_REPLY) {
		struct hci_cp_user_passkey_reply cp;

3074
		bacpy(&cp.bdaddr, &addr->bdaddr);
3075 3076 3077
		cp.passkey = passkey;
		err = hci_send_cmd(hdev, hci_op, sizeof(cp), &cp);
	} else
3078 3079
		err = hci_send_cmd(hdev, hci_op, sizeof(addr->bdaddr),
				   &addr->bdaddr);
3080

3081 3082
	if (err < 0)
		mgmt_pending_remove(cmd);
3083

3084
done:
3085
	hci_dev_unlock(hdev);
3086 3087 3088
	return err;
}

3089 3090 3091 3092 3093 3094 3095
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("");

3096
	return user_pairing_resp(sk, hdev, &cp->addr,
3097 3098 3099 3100
				MGMT_OP_PIN_CODE_NEG_REPLY,
				HCI_OP_PIN_CODE_NEG_REPLY, 0);
}

3101 3102
static int user_confirm_reply(struct sock *sk, struct hci_dev *hdev, void *data,
			      u16 len)
3103
{
3104
	struct mgmt_cp_user_confirm_reply *cp = data;
3105 3106 3107 3108

	BT_DBG("");

	if (len != sizeof(*cp))
3109 3110
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_USER_CONFIRM_REPLY,
				       MGMT_STATUS_INVALID_PARAMS);
3111

3112
	return user_pairing_resp(sk, hdev, &cp->addr,
3113 3114
				 MGMT_OP_USER_CONFIRM_REPLY,
				 HCI_OP_USER_CONFIRM_REPLY, 0);
3115 3116
}

3117
static int user_confirm_neg_reply(struct sock *sk, struct hci_dev *hdev,
3118
				  void *data, u16 len)
3119
{
3120
	struct mgmt_cp_user_confirm_neg_reply *cp = data;
3121 3122 3123

	BT_DBG("");

3124
	return user_pairing_resp(sk, hdev, &cp->addr,
3125 3126
				 MGMT_OP_USER_CONFIRM_NEG_REPLY,
				 HCI_OP_USER_CONFIRM_NEG_REPLY, 0);
3127 3128
}

3129 3130
static int user_passkey_reply(struct sock *sk, struct hci_dev *hdev, void *data,
			      u16 len)
3131
{
3132
	struct mgmt_cp_user_passkey_reply *cp = data;
3133 3134 3135

	BT_DBG("");

3136
	return user_pairing_resp(sk, hdev, &cp->addr,
3137 3138
				 MGMT_OP_USER_PASSKEY_REPLY,
				 HCI_OP_USER_PASSKEY_REPLY, cp->passkey);
3139 3140
}

3141
static int user_passkey_neg_reply(struct sock *sk, struct hci_dev *hdev,
3142
				  void *data, u16 len)
3143
{
3144
	struct mgmt_cp_user_passkey_neg_reply *cp = data;
3145 3146 3147

	BT_DBG("");

3148
	return user_pairing_resp(sk, hdev, &cp->addr,
3149 3150
				 MGMT_OP_USER_PASSKEY_NEG_REPLY,
				 HCI_OP_USER_PASSKEY_NEG_REPLY, 0);
3151 3152
}

3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181
static void adv_expire(struct hci_dev *hdev, u32 flags)
{
	struct adv_info *adv_instance;
	struct hci_request req;
	int err;

	adv_instance = hci_find_adv_instance(hdev, hdev->cur_adv_instance);
	if (!adv_instance)
		return;

	/* stop if current instance doesn't need to be changed */
	if (!(adv_instance->flags & flags))
		return;

	cancel_adv_timeout(hdev);

	adv_instance = hci_get_next_instance(hdev, adv_instance->instance);
	if (!adv_instance)
		return;

	hci_req_init(&req, hdev);
	err = __hci_req_schedule_adv_instance(&req, adv_instance->instance,
					      true);
	if (err)
		return;

	hci_req_run(&req, NULL);
}

3182
static void set_name_complete(struct hci_dev *hdev, u8 status, u16 opcode)
3183 3184
{
	struct mgmt_cp_set_local_name *cp;
3185
	struct mgmt_pending_cmd *cmd;
3186 3187 3188 3189 3190

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

	hci_dev_lock(hdev);

3191
	cmd = pending_find(MGMT_OP_SET_LOCAL_NAME, hdev);
3192 3193 3194 3195 3196
	if (!cmd)
		goto unlock;

	cp = cmd->param;

3197
	if (status) {
3198 3199
		mgmt_cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_LOCAL_NAME,
			        mgmt_status(status));
3200
	} else {
3201 3202
		mgmt_cmd_complete(cmd->sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, 0,
				  cp, sizeof(*cp));
3203

3204 3205 3206 3207
		if (hci_dev_test_flag(hdev, HCI_LE_ADV))
			adv_expire(hdev, MGMT_ADV_FLAG_LOCAL_NAME);
	}

3208 3209 3210 3211 3212 3213
	mgmt_pending_remove(cmd);

unlock:
	hci_dev_unlock(hdev);
}

3214
static int set_local_name(struct sock *sk, struct hci_dev *hdev, void *data,
3215
			  u16 len)
3216
{
3217
	struct mgmt_cp_set_local_name *cp = data;
3218
	struct mgmt_pending_cmd *cmd;
3219
	struct hci_request req;
3220 3221 3222 3223
	int err;

	BT_DBG("");

3224
	hci_dev_lock(hdev);
3225

3226 3227 3228 3229 3230 3231
	/* 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))) {
3232 3233
		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, 0,
					data, len);
3234 3235 3236
		goto failed;
	}

3237
	memcpy(hdev->short_name, cp->short_name, sizeof(hdev->short_name));
3238

3239
	if (!hdev_is_powered(hdev)) {
3240
		memcpy(hdev->dev_name, cp->name, sizeof(hdev->dev_name));
3241

3242 3243
		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, 0,
					data, len);
3244 3245 3246
		if (err < 0)
			goto failed;

3247 3248
		err = mgmt_limited_event(MGMT_EV_LOCAL_NAME_CHANGED, hdev, data,
					 len, HCI_MGMT_LOCAL_NAME_EVENTS, sk);
3249
		ext_info_changed(hdev, sk);
3250

3251 3252 3253
		goto failed;
	}

3254
	cmd = mgmt_pending_add(sk, MGMT_OP_SET_LOCAL_NAME, hdev, data, len);
3255 3256 3257 3258 3259
	if (!cmd) {
		err = -ENOMEM;
		goto failed;
	}

3260 3261
	memcpy(hdev->dev_name, cp->name, sizeof(hdev->dev_name));

3262
	hci_req_init(&req, hdev);
3263 3264

	if (lmp_bredr_capable(hdev)) {
3265
		__hci_req_update_name(&req);
3266
		__hci_req_update_eir(&req);
3267 3268
	}

3269 3270 3271
	/* The name is stored in the scan response data and so
	 * no need to udpate the advertising data here.
	 */
3272
	if (lmp_le_capable(hdev) && hci_dev_test_flag(hdev, HCI_ADVERTISING))
3273
		__hci_req_update_scan_rsp_data(&req, hdev->cur_adv_instance);
3274

3275
	err = hci_req_run(&req, set_name_complete);
3276 3277 3278 3279
	if (err < 0)
		mgmt_pending_remove(cmd);

failed:
3280
	hci_dev_unlock(hdev);
3281 3282 3283
	return err;
}

3284 3285 3286 3287 3288 3289 3290 3291 3292
static int set_appearance(struct sock *sk, struct hci_dev *hdev, void *data,
			  u16 len)
{
	struct mgmt_cp_set_appearance *cp = data;
	u16 apperance;
	int err;

	BT_DBG("");

3293 3294 3295 3296
	if (!lmp_le_capable(hdev))
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_APPEARANCE,
				       MGMT_STATUS_NOT_SUPPORTED);

3297 3298 3299 3300 3301 3302 3303 3304 3305
	apperance = le16_to_cpu(cp->appearance);

	hci_dev_lock(hdev);

	if (hdev->appearance != apperance) {
		hdev->appearance = apperance;

		if (hci_dev_test_flag(hdev, HCI_LE_ADV))
			adv_expire(hdev, MGMT_ADV_FLAG_APPEARANCE);
3306 3307

		ext_info_changed(hdev, sk);
3308 3309 3310 3311 3312 3313 3314 3315 3316 3317
	}

	err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_APPEARANCE, 0, NULL,
				0);

	hci_dev_unlock(hdev);

	return err;
}

3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338
static int get_phy_configuration(struct sock *sk, struct hci_dev *hdev,
				 void *data, u16 len)
{
	struct mgmt_rp_get_phy_confguration rp;

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

	hci_dev_lock(hdev);

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

	rp.supported_phys = cpu_to_le32(get_supported_phys(hdev));
	rp.selected_phys = cpu_to_le32(get_selected_phys(hdev));
	rp.configurable_phys = cpu_to_le32(get_configurable_phys(hdev));

	hci_dev_unlock(hdev);

	return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_PHY_CONFIGURATION, 0,
				 &rp, sizeof(rp));
}

3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350
int mgmt_phy_configuration_changed(struct hci_dev *hdev, struct sock *skip)
{
	struct mgmt_ev_phy_configuration_changed ev;

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

	ev.selected_phys = cpu_to_le32(get_selected_phys(hdev));

	return mgmt_event(MGMT_EV_PHY_CONFIGURATION_CHANGED, hdev, &ev,
			  sizeof(ev), skip);
}

3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371
static void set_default_phy_complete(struct hci_dev *hdev, u8 status,
				     u16 opcode, struct sk_buff *skb)
{
	struct mgmt_pending_cmd *cmd;

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

	hci_dev_lock(hdev);

	cmd = pending_find(MGMT_OP_SET_PHY_CONFIGURATION, hdev);
	if (!cmd)
		goto unlock;

	if (status) {
		mgmt_cmd_status(cmd->sk, hdev->id,
				MGMT_OP_SET_PHY_CONFIGURATION,
				mgmt_status(status));
	} else {
		mgmt_cmd_complete(cmd->sk, hdev->id,
				  MGMT_OP_SET_PHY_CONFIGURATION, 0,
				  NULL, 0);
3372 3373

		mgmt_phy_configuration_changed(hdev, cmd->sk);
3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390
	}

	mgmt_pending_remove(cmd);

unlock:
	hci_dev_unlock(hdev);
}

static int set_phy_configuration(struct sock *sk, struct hci_dev *hdev,
				 void *data, u16 len)
{
	struct mgmt_cp_set_phy_confguration *cp = data;
	struct hci_cp_le_set_default_phy cp_phy;
	struct mgmt_pending_cmd *cmd;
	struct hci_request req;
	u32 selected_phys, configurable_phys, supported_phys, unconfigure_phys;
	u16 pkt_type = (HCI_DH1 | HCI_DM1);
3391
	bool changed = false;
3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472
	int err;

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

	configurable_phys = get_configurable_phys(hdev);
	supported_phys = get_supported_phys(hdev);
	selected_phys = __le32_to_cpu(cp->selected_phys);

	if (selected_phys & ~supported_phys)
		return mgmt_cmd_status(sk, hdev->id,
				       MGMT_OP_SET_PHY_CONFIGURATION,
				       MGMT_STATUS_INVALID_PARAMS);

	unconfigure_phys = supported_phys & ~configurable_phys;

	if ((selected_phys & unconfigure_phys) != unconfigure_phys)
		return mgmt_cmd_status(sk, hdev->id,
				       MGMT_OP_SET_PHY_CONFIGURATION,
				       MGMT_STATUS_INVALID_PARAMS);

	if (selected_phys == get_selected_phys(hdev))
		return mgmt_cmd_complete(sk, hdev->id,
					 MGMT_OP_SET_PHY_CONFIGURATION,
					 0, NULL, 0);

	hci_dev_lock(hdev);

	if (!hdev_is_powered(hdev)) {
		err = mgmt_cmd_status(sk, hdev->id,
				      MGMT_OP_SET_PHY_CONFIGURATION,
				      MGMT_STATUS_REJECTED);
		goto unlock;
	}

	if (pending_find(MGMT_OP_SET_PHY_CONFIGURATION, hdev)) {
		err = mgmt_cmd_status(sk, hdev->id,
				      MGMT_OP_SET_PHY_CONFIGURATION,
				      MGMT_STATUS_BUSY);
		goto unlock;
	}

	if (selected_phys & MGMT_PHY_BR_1M_3SLOT)
		pkt_type |= (HCI_DH3 | HCI_DM3);
	else
		pkt_type &= ~(HCI_DH3 | HCI_DM3);

	if (selected_phys & MGMT_PHY_BR_1M_5SLOT)
		pkt_type |= (HCI_DH5 | HCI_DM5);
	else
		pkt_type &= ~(HCI_DH5 | HCI_DM5);

	if (selected_phys & MGMT_PHY_EDR_2M_1SLOT)
		pkt_type &= ~HCI_2DH1;
	else
		pkt_type |= HCI_2DH1;

	if (selected_phys & MGMT_PHY_EDR_2M_3SLOT)
		pkt_type &= ~HCI_2DH3;
	else
		pkt_type |= HCI_2DH3;

	if (selected_phys & MGMT_PHY_EDR_2M_5SLOT)
		pkt_type &= ~HCI_2DH5;
	else
		pkt_type |= HCI_2DH5;

	if (selected_phys & MGMT_PHY_EDR_3M_1SLOT)
		pkt_type &= ~HCI_3DH1;
	else
		pkt_type |= HCI_3DH1;

	if (selected_phys & MGMT_PHY_EDR_3M_3SLOT)
		pkt_type &= ~HCI_3DH3;
	else
		pkt_type |= HCI_3DH3;

	if (selected_phys & MGMT_PHY_EDR_3M_5SLOT)
		pkt_type &= ~HCI_3DH5;
	else
		pkt_type |= HCI_3DH5;

3473
	if (pkt_type != hdev->pkt_type) {
3474
		hdev->pkt_type = pkt_type;
3475 3476
		changed = true;
	}
3477 3478 3479

	if ((selected_phys & MGMT_PHY_LE_MASK) ==
	    (get_selected_phys(hdev) & MGMT_PHY_LE_MASK)) {
3480 3481 3482
		if (changed)
			mgmt_phy_configuration_changed(hdev, sk);

3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536
		err = mgmt_cmd_complete(sk, hdev->id,
					MGMT_OP_SET_PHY_CONFIGURATION,
					0, NULL, 0);

		goto unlock;
	}

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

	hci_req_init(&req, hdev);

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

	if (!(selected_phys & MGMT_PHY_LE_TX_MASK))
		cp_phy.all_phys |= 0x01;

	if (!(selected_phys & MGMT_PHY_LE_RX_MASK))
		cp_phy.all_phys |= 0x02;

	if (selected_phys & MGMT_PHY_LE_1M_TX)
		cp_phy.tx_phys |= HCI_LE_SET_PHY_1M;

	if (selected_phys & MGMT_PHY_LE_2M_TX)
		cp_phy.tx_phys |= HCI_LE_SET_PHY_2M;

	if (selected_phys & MGMT_PHY_LE_CODED_TX)
		cp_phy.tx_phys |= HCI_LE_SET_PHY_CODED;

	if (selected_phys & MGMT_PHY_LE_1M_RX)
		cp_phy.rx_phys |= HCI_LE_SET_PHY_1M;

	if (selected_phys & MGMT_PHY_LE_2M_RX)
		cp_phy.rx_phys |= HCI_LE_SET_PHY_2M;

	if (selected_phys & MGMT_PHY_LE_CODED_RX)
		cp_phy.rx_phys |= HCI_LE_SET_PHY_CODED;

	hci_req_add(&req, HCI_OP_LE_SET_DEFAULT_PHY, sizeof(cp_phy), &cp_phy);

	err = hci_req_run_skb(&req, set_default_phy_complete);
	if (err < 0)
		mgmt_pending_remove(cmd);

unlock:
	hci_dev_unlock(hdev);

	return err;
}

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
static void read_local_oob_data_complete(struct hci_dev *hdev, u8 status,
				         u16 opcode, struct sk_buff *skb)
{
	struct mgmt_rp_read_local_oob_data mgmt_rp;
	size_t rp_size = sizeof(mgmt_rp);
	struct mgmt_pending_cmd *cmd;

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

	cmd = pending_find(MGMT_OP_READ_LOCAL_OOB_DATA, hdev);
	if (!cmd)
		return;

	if (status || !skb) {
		mgmt_cmd_status(cmd->sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
				status ? mgmt_status(status) : MGMT_STATUS_FAILED);
		goto remove;
	}

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

	if (opcode == HCI_OP_READ_LOCAL_OOB_DATA) {
		struct hci_rp_read_local_oob_data *rp = (void *) skb->data;

		if (skb->len < sizeof(*rp)) {
			mgmt_cmd_status(cmd->sk, hdev->id,
					MGMT_OP_READ_LOCAL_OOB_DATA,
					MGMT_STATUS_FAILED);
			goto remove;
		}

		memcpy(mgmt_rp.hash192, rp->hash, sizeof(rp->hash));
		memcpy(mgmt_rp.rand192, rp->rand, sizeof(rp->rand));

		rp_size -= sizeof(mgmt_rp.hash256) + sizeof(mgmt_rp.rand256);
	} else {
		struct hci_rp_read_local_oob_ext_data *rp = (void *) skb->data;

		if (skb->len < sizeof(*rp)) {
			mgmt_cmd_status(cmd->sk, hdev->id,
					MGMT_OP_READ_LOCAL_OOB_DATA,
					MGMT_STATUS_FAILED);
			goto remove;
		}

		memcpy(mgmt_rp.hash192, rp->hash192, sizeof(rp->hash192));
		memcpy(mgmt_rp.rand192, rp->rand192, sizeof(rp->rand192));

		memcpy(mgmt_rp.hash256, rp->hash256, sizeof(rp->hash256));
		memcpy(mgmt_rp.rand256, rp->rand256, sizeof(rp->rand256));
	}

	mgmt_cmd_complete(cmd->sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
			  MGMT_STATUS_SUCCESS, &mgmt_rp, rp_size);

remove:
	mgmt_pending_remove(cmd);
}

3596
static int read_local_oob_data(struct sock *sk, struct hci_dev *hdev,
3597
			       void *data, u16 data_len)
3598
{
3599
	struct mgmt_pending_cmd *cmd;
3600
	struct hci_request req;
3601 3602
	int err;

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

3605
	hci_dev_lock(hdev);
3606

3607
	if (!hdev_is_powered(hdev)) {
3608 3609
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
				      MGMT_STATUS_NOT_POWERED);
3610 3611 3612
		goto unlock;
	}

3613
	if (!lmp_ssp_capable(hdev)) {
3614 3615
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
				      MGMT_STATUS_NOT_SUPPORTED);
3616 3617 3618
		goto unlock;
	}

3619
	if (pending_find(MGMT_OP_READ_LOCAL_OOB_DATA, hdev)) {
3620 3621
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
				      MGMT_STATUS_BUSY);
3622 3623 3624
		goto unlock;
	}

3625
	cmd = mgmt_pending_add(sk, MGMT_OP_READ_LOCAL_OOB_DATA, hdev, NULL, 0);
3626 3627 3628 3629 3630
	if (!cmd) {
		err = -ENOMEM;
		goto unlock;
	}

3631 3632
	hci_req_init(&req, hdev);

3633
	if (bredr_sc_enabled(hdev))
3634
		hci_req_add(&req, HCI_OP_READ_LOCAL_OOB_EXT_DATA, 0, NULL);
3635
	else
3636
		hci_req_add(&req, HCI_OP_READ_LOCAL_OOB_DATA, 0, NULL);
3637

3638
	err = hci_req_run_skb(&req, read_local_oob_data_complete);
3639 3640 3641 3642
	if (err < 0)
		mgmt_pending_remove(cmd);

unlock:
3643
	hci_dev_unlock(hdev);
3644 3645 3646
	return err;
}

3647
static int add_remote_oob_data(struct sock *sk, struct hci_dev *hdev,
3648
			       void *data, u16 len)
3649
{
3650
	struct mgmt_addr_info *addr = data;
3651 3652
	int err;

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

3655
	if (!bdaddr_type_is_valid(addr->type))
3656 3657 3658 3659
		return mgmt_cmd_complete(sk, hdev->id,
					 MGMT_OP_ADD_REMOTE_OOB_DATA,
					 MGMT_STATUS_INVALID_PARAMS,
					 addr, sizeof(*addr));
3660

3661
	hci_dev_lock(hdev);
3662

3663 3664 3665
	if (len == MGMT_ADD_REMOTE_OOB_DATA_SIZE) {
		struct mgmt_cp_add_remote_oob_data *cp = data;
		u8 status;
3666

3667
		if (cp->addr.type != BDADDR_BREDR) {
3668 3669 3670 3671
			err = mgmt_cmd_complete(sk, hdev->id,
						MGMT_OP_ADD_REMOTE_OOB_DATA,
						MGMT_STATUS_INVALID_PARAMS,
						&cp->addr, sizeof(cp->addr));
3672 3673 3674
			goto unlock;
		}

3675
		err = hci_add_remote_oob_data(hdev, &cp->addr.bdaddr,
3676 3677
					      cp->addr.type, cp->hash,
					      cp->rand, NULL, NULL);
3678 3679 3680 3681 3682
		if (err < 0)
			status = MGMT_STATUS_FAILED;
		else
			status = MGMT_STATUS_SUCCESS;

3683 3684 3685
		err = mgmt_cmd_complete(sk, hdev->id,
					MGMT_OP_ADD_REMOTE_OOB_DATA, status,
					&cp->addr, sizeof(cp->addr));
3686 3687
	} else if (len == MGMT_ADD_REMOTE_OOB_EXT_DATA_SIZE) {
		struct mgmt_cp_add_remote_oob_ext_data *cp = data;
3688
		u8 *rand192, *hash192, *rand256, *hash256;
3689 3690
		u8 status;

3691
		if (bdaddr_type_is_le(cp->addr.type)) {
3692 3693 3694 3695 3696
			/* Enforce zero-valued 192-bit parameters as
			 * long as legacy SMP OOB isn't implemented.
			 */
			if (memcmp(cp->rand192, ZERO_KEY, 16) ||
			    memcmp(cp->hash192, ZERO_KEY, 16)) {
3697 3698 3699 3700
				err = mgmt_cmd_complete(sk, hdev->id,
							MGMT_OP_ADD_REMOTE_OOB_DATA,
							MGMT_STATUS_INVALID_PARAMS,
							addr, sizeof(*addr));
3701 3702 3703
				goto unlock;
			}

3704 3705 3706
			rand192 = NULL;
			hash192 = NULL;
		} else {
3707 3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 3728 3729
			/* In case one of the P-192 values is set to zero,
			 * then just disable OOB data for P-192.
			 */
			if (!memcmp(cp->rand192, ZERO_KEY, 16) ||
			    !memcmp(cp->hash192, ZERO_KEY, 16)) {
				rand192 = NULL;
				hash192 = NULL;
			} else {
				rand192 = cp->rand192;
				hash192 = cp->hash192;
			}
		}

		/* In case one of the P-256 values is set to zero, then just
		 * disable OOB data for P-256.
		 */
		if (!memcmp(cp->rand256, ZERO_KEY, 16) ||
		    !memcmp(cp->hash256, ZERO_KEY, 16)) {
			rand256 = NULL;
			hash256 = NULL;
		} else {
			rand256 = cp->rand256;
			hash256 = cp->hash256;
3730 3731
		}

3732
		err = hci_add_remote_oob_data(hdev, &cp->addr.bdaddr,
3733
					      cp->addr.type, hash192, rand192,
3734
					      hash256, rand256);
3735 3736 3737 3738 3739
		if (err < 0)
			status = MGMT_STATUS_FAILED;
		else
			status = MGMT_STATUS_SUCCESS;

3740 3741 3742
		err = mgmt_cmd_complete(sk, hdev->id,
					MGMT_OP_ADD_REMOTE_OOB_DATA,
					status, &cp->addr, sizeof(cp->addr));
3743
	} else {
3744 3745
		bt_dev_err(hdev, "add_remote_oob_data: invalid len of %u bytes",
			   len);
3746 3747
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_REMOTE_OOB_DATA,
				      MGMT_STATUS_INVALID_PARAMS);
3748
	}
3749

3750
unlock:
3751
	hci_dev_unlock(hdev);
3752 3753 3754
	return err;
}

3755
static int remove_remote_oob_data(struct sock *sk, struct hci_dev *hdev,
3756
				  void *data, u16 len)
3757
{
3758
	struct mgmt_cp_remove_remote_oob_data *cp = data;
3759
	u8 status;
3760 3761
	int err;

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

3764
	if (cp->addr.type != BDADDR_BREDR)
3765 3766 3767 3768
		return mgmt_cmd_complete(sk, hdev->id,
					 MGMT_OP_REMOVE_REMOTE_OOB_DATA,
					 MGMT_STATUS_INVALID_PARAMS,
					 &cp->addr, sizeof(cp->addr));
3769

3770
	hci_dev_lock(hdev);
3771

3772 3773 3774 3775 3776 3777
	if (!bacmp(&cp->addr.bdaddr, BDADDR_ANY)) {
		hci_remote_oob_data_clear(hdev);
		status = MGMT_STATUS_SUCCESS;
		goto done;
	}

3778
	err = hci_remove_remote_oob_data(hdev, &cp->addr.bdaddr, cp->addr.type);
3779
	if (err < 0)
3780
		status = MGMT_STATUS_INVALID_PARAMS;
3781
	else
3782
		status = MGMT_STATUS_SUCCESS;
3783

3784
done:
3785 3786
	err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_REMOTE_OOB_DATA,
				status, &cp->addr, sizeof(cp->addr));
3787

3788
	hci_dev_unlock(hdev);
3789 3790 3791
	return err;
}

3792
void mgmt_start_discovery_complete(struct hci_dev *hdev, u8 status)
3793
{
3794
	struct mgmt_pending_cmd *cmd;
3795

3796 3797
	BT_DBG("status %d", status);

3798
	hci_dev_lock(hdev);
3799

3800
	cmd = pending_find(MGMT_OP_START_DISCOVERY, hdev);
3801
	if (!cmd)
3802
		cmd = pending_find(MGMT_OP_START_SERVICE_DISCOVERY, hdev);
3803

3804 3805 3806
	if (!cmd)
		cmd = pending_find(MGMT_OP_START_LIMITED_DISCOVERY, hdev);

3807
	if (cmd) {
3808
		cmd->cmd_complete(cmd, mgmt_status(status));
3809 3810
		mgmt_pending_remove(cmd);
	}
3811

3812
	hci_dev_unlock(hdev);
3813 3814
}

3815 3816 3817 3818 3819 3820 3821 3822 3823 3824 3825 3826 3827 3828 3829 3830 3831 3832 3833 3834 3835 3836 3837 3838 3839 3840 3841
static bool discovery_type_is_valid(struct hci_dev *hdev, uint8_t type,
				    uint8_t *mgmt_status)
{
	switch (type) {
	case DISCOV_TYPE_LE:
		*mgmt_status = mgmt_le_support(hdev);
		if (*mgmt_status)
			return false;
		break;
	case DISCOV_TYPE_INTERLEAVED:
		*mgmt_status = mgmt_le_support(hdev);
		if (*mgmt_status)
			return false;
		/* Intentional fall-through */
	case DISCOV_TYPE_BREDR:
		*mgmt_status = mgmt_bredr_support(hdev);
		if (*mgmt_status)
			return false;
		break;
	default:
		*mgmt_status = MGMT_STATUS_INVALID_PARAMS;
		return false;
	}

	return true;
}

3842 3843
static int start_discovery_internal(struct sock *sk, struct hci_dev *hdev,
				    u16 op, void *data, u16 len)
3844
{
3845
	struct mgmt_cp_start_discovery *cp = data;
3846
	struct mgmt_pending_cmd *cmd;
3847
	u8 status;
3848 3849
	int err;

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

3852
	hci_dev_lock(hdev);
3853

3854
	if (!hdev_is_powered(hdev)) {
3855
		err = mgmt_cmd_complete(sk, hdev->id, op,
3856 3857
					MGMT_STATUS_NOT_POWERED,
					&cp->type, sizeof(cp->type));
3858 3859 3860
		goto failed;
	}

3861
	if (hdev->discovery.state != DISCOVERY_STOPPED ||
3862
	    hci_dev_test_flag(hdev, HCI_PERIODIC_INQ)) {
3863 3864
		err = mgmt_cmd_complete(sk, hdev->id, op, MGMT_STATUS_BUSY,
					&cp->type, sizeof(cp->type));
3865 3866 3867
		goto failed;
	}

3868
	if (!discovery_type_is_valid(hdev, cp->type, &status)) {
3869 3870
		err = mgmt_cmd_complete(sk, hdev->id, op, status,
					&cp->type, sizeof(cp->type));
3871 3872 3873
		goto failed;
	}

3874 3875 3876 3877 3878
	/* Clear the discovery filter first to free any previously
	 * allocated memory for the UUID list.
	 */
	hci_discovery_filter_clear(hdev);

A
Andre Guedes 已提交
3879
	hdev->discovery.type = cp->type;
3880
	hdev->discovery.report_invalid_rssi = false;
3881 3882 3883 3884
	if (op == MGMT_OP_START_LIMITED_DISCOVERY)
		hdev->discovery.limited = true;
	else
		hdev->discovery.limited = false;
A
Andre Guedes 已提交
3885

3886
	cmd = mgmt_pending_add(sk, op, hdev, data, len);
3887 3888
	if (!cmd) {
		err = -ENOMEM;
3889
		goto failed;
3890
	}
3891

3892
	cmd->cmd_complete = generic_cmd_complete;
3893

3894
	hci_discovery_set_state(hdev, DISCOVERY_STARTING);
3895 3896
	queue_work(hdev->req_workqueue, &hdev->discov_update);
	err = 0;
3897

3898
failed:
3899
	hci_dev_unlock(hdev);
3900 3901
	return err;
}
3902

3903 3904 3905 3906 3907 3908 3909 3910 3911 3912 3913 3914 3915 3916 3917
static int start_discovery(struct sock *sk, struct hci_dev *hdev,
			   void *data, u16 len)
{
	return start_discovery_internal(sk, hdev, MGMT_OP_START_DISCOVERY,
					data, len);
}

static int start_limited_discovery(struct sock *sk, struct hci_dev *hdev,
				   void *data, u16 len)
{
	return start_discovery_internal(sk, hdev,
					MGMT_OP_START_LIMITED_DISCOVERY,
					data, len);
}

3918 3919
static int service_discovery_cmd_complete(struct mgmt_pending_cmd *cmd,
					  u8 status)
3920
{
3921 3922
	return mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, status,
				 cmd->param, 1);
3923
}
3924

3925 3926 3927 3928
static int start_service_discovery(struct sock *sk, struct hci_dev *hdev,
				   void *data, u16 len)
{
	struct mgmt_cp_start_service_discovery *cp = data;
3929
	struct mgmt_pending_cmd *cmd;
3930 3931 3932 3933
	const u16 max_uuid_count = ((U16_MAX - sizeof(*cp)) / 16);
	u16 uuid_count, expected_len;
	u8 status;
	int err;
3934

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

3937
	hci_dev_lock(hdev);
3938

3939
	if (!hdev_is_powered(hdev)) {
3940 3941 3942 3943
		err = mgmt_cmd_complete(sk, hdev->id,
					MGMT_OP_START_SERVICE_DISCOVERY,
					MGMT_STATUS_NOT_POWERED,
					&cp->type, sizeof(cp->type));
3944 3945
		goto failed;
	}
3946

3947
	if (hdev->discovery.state != DISCOVERY_STOPPED ||
3948
	    hci_dev_test_flag(hdev, HCI_PERIODIC_INQ)) {
3949 3950 3951 3952
		err = mgmt_cmd_complete(sk, hdev->id,
					MGMT_OP_START_SERVICE_DISCOVERY,
					MGMT_STATUS_BUSY, &cp->type,
					sizeof(cp->type));
3953 3954
		goto failed;
	}
3955

3956 3957
	uuid_count = __le16_to_cpu(cp->uuid_count);
	if (uuid_count > max_uuid_count) {
3958 3959
		bt_dev_err(hdev, "service_discovery: too big uuid_count value %u",
			   uuid_count);
3960 3961 3962 3963
		err = mgmt_cmd_complete(sk, hdev->id,
					MGMT_OP_START_SERVICE_DISCOVERY,
					MGMT_STATUS_INVALID_PARAMS, &cp->type,
					sizeof(cp->type));
3964 3965 3966 3967 3968
		goto failed;
	}

	expected_len = sizeof(*cp) + uuid_count * 16;
	if (expected_len != len) {
3969 3970
		bt_dev_err(hdev, "service_discovery: expected %u bytes, got %u bytes",
			   expected_len, len);
3971 3972 3973 3974
		err = mgmt_cmd_complete(sk, hdev->id,
					MGMT_OP_START_SERVICE_DISCOVERY,
					MGMT_STATUS_INVALID_PARAMS, &cp->type,
					sizeof(cp->type));
3975 3976 3977
		goto failed;
	}

3978 3979 3980 3981 3982 3983 3984
	if (!discovery_type_is_valid(hdev, cp->type, &status)) {
		err = mgmt_cmd_complete(sk, hdev->id,
					MGMT_OP_START_SERVICE_DISCOVERY,
					status, &cp->type, sizeof(cp->type));
		goto failed;
	}

3985
	cmd = mgmt_pending_add(sk, MGMT_OP_START_SERVICE_DISCOVERY,
3986
			       hdev, data, len);
3987 3988 3989 3990 3991
	if (!cmd) {
		err = -ENOMEM;
		goto failed;
	}

3992 3993
	cmd->cmd_complete = service_discovery_cmd_complete;

3994 3995 3996 3997 3998
	/* Clear the discovery filter first to free any previously
	 * allocated memory for the UUID list.
	 */
	hci_discovery_filter_clear(hdev);

3999
	hdev->discovery.result_filtering = true;
4000 4001 4002 4003 4004 4005 4006 4007
	hdev->discovery.type = cp->type;
	hdev->discovery.rssi = cp->rssi;
	hdev->discovery.uuid_count = uuid_count;

	if (uuid_count > 0) {
		hdev->discovery.uuids = kmemdup(cp->uuids, uuid_count * 16,
						GFP_KERNEL);
		if (!hdev->discovery.uuids) {
4008 4009 4010 4011
			err = mgmt_cmd_complete(sk, hdev->id,
						MGMT_OP_START_SERVICE_DISCOVERY,
						MGMT_STATUS_FAILED,
						&cp->type, sizeof(cp->type));
4012 4013 4014
			mgmt_pending_remove(cmd);
			goto failed;
		}
4015
	}
4016

4017
	hci_discovery_set_state(hdev, DISCOVERY_STARTING);
4018 4019
	queue_work(hdev->req_workqueue, &hdev->discov_update);
	err = 0;
4020 4021

failed:
4022
	hci_dev_unlock(hdev);
4023 4024 4025
	return err;
}

4026
void mgmt_stop_discovery_complete(struct hci_dev *hdev, u8 status)
4027
{
4028
	struct mgmt_pending_cmd *cmd;
4029

4030 4031 4032 4033
	BT_DBG("status %d", status);

	hci_dev_lock(hdev);

4034
	cmd = pending_find(MGMT_OP_STOP_DISCOVERY, hdev);
4035
	if (cmd) {
4036
		cmd->cmd_complete(cmd, mgmt_status(status));
4037
		mgmt_pending_remove(cmd);
4038 4039 4040 4041 4042
	}

	hci_dev_unlock(hdev);
}

4043
static int stop_discovery(struct sock *sk, struct hci_dev *hdev, void *data,
4044
			  u16 len)
4045
{
4046
	struct mgmt_cp_stop_discovery *mgmt_cp = data;
4047
	struct mgmt_pending_cmd *cmd;
4048 4049
	int err;

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

4052
	hci_dev_lock(hdev);
4053

4054
	if (!hci_discovery_active(hdev)) {
4055 4056 4057
		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY,
					MGMT_STATUS_REJECTED, &mgmt_cp->type,
					sizeof(mgmt_cp->type));
4058 4059 4060 4061
		goto unlock;
	}

	if (hdev->discovery.type != mgmt_cp->type) {
4062 4063 4064
		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY,
					MGMT_STATUS_INVALID_PARAMS,
					&mgmt_cp->type, sizeof(mgmt_cp->type));
4065
		goto unlock;
4066 4067
	}

4068
	cmd = mgmt_pending_add(sk, MGMT_OP_STOP_DISCOVERY, hdev, data, len);
4069 4070
	if (!cmd) {
		err = -ENOMEM;
4071 4072 4073
		goto unlock;
	}

4074 4075
	cmd->cmd_complete = generic_cmd_complete;

4076 4077 4078
	hci_discovery_set_state(hdev, DISCOVERY_STOPPING);
	queue_work(hdev->req_workqueue, &hdev->discov_update);
	err = 0;
4079

4080
unlock:
4081
	hci_dev_unlock(hdev);
4082 4083 4084
	return err;
}

4085
static int confirm_name(struct sock *sk, struct hci_dev *hdev, void *data,
4086
			u16 len)
4087
{
4088
	struct mgmt_cp_confirm_name *cp = data;
4089 4090 4091
	struct inquiry_entry *e;
	int err;

4092
	BT_DBG("%s", hdev->name);
4093 4094 4095

	hci_dev_lock(hdev);

4096
	if (!hci_discovery_active(hdev)) {
4097 4098 4099
		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_CONFIRM_NAME,
					MGMT_STATUS_FAILED, &cp->addr,
					sizeof(cp->addr));
4100 4101 4102
		goto failed;
	}

4103
	e = hci_inquiry_cache_lookup_unknown(hdev, &cp->addr.bdaddr);
4104
	if (!e) {
4105 4106 4107
		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_CONFIRM_NAME,
					MGMT_STATUS_INVALID_PARAMS, &cp->addr,
					sizeof(cp->addr));
4108 4109 4110 4111 4112 4113 4114 4115
		goto failed;
	}

	if (cp->name_known) {
		e->name_state = NAME_KNOWN;
		list_del(&e->list);
	} else {
		e->name_state = NAME_NEEDED;
4116
		hci_inquiry_cache_update_resolve(hdev, e);
4117 4118
	}

4119 4120
	err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_CONFIRM_NAME, 0,
				&cp->addr, sizeof(cp->addr));
4121 4122 4123 4124 4125 4126

failed:
	hci_dev_unlock(hdev);
	return err;
}

4127
static int block_device(struct sock *sk, struct hci_dev *hdev, void *data,
4128
			u16 len)
4129
{
4130
	struct mgmt_cp_block_device *cp = data;
4131
	u8 status;
4132 4133
	int err;

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

4136
	if (!bdaddr_type_is_valid(cp->addr.type))
4137 4138 4139
		return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_BLOCK_DEVICE,
					 MGMT_STATUS_INVALID_PARAMS,
					 &cp->addr, sizeof(cp->addr));
4140

4141
	hci_dev_lock(hdev);
4142

4143 4144
	err = hci_bdaddr_list_add(&hdev->blacklist, &cp->addr.bdaddr,
				  cp->addr.type);
4145
	if (err < 0) {
4146
		status = MGMT_STATUS_FAILED;
4147 4148 4149 4150 4151 4152
		goto done;
	}

	mgmt_event(MGMT_EV_DEVICE_BLOCKED, hdev, &cp->addr, sizeof(cp->addr),
		   sk);
	status = MGMT_STATUS_SUCCESS;
4153

4154
done:
4155 4156
	err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_BLOCK_DEVICE, status,
				&cp->addr, sizeof(cp->addr));
4157

4158
	hci_dev_unlock(hdev);
4159 4160 4161 4162

	return err;
}

4163
static int unblock_device(struct sock *sk, struct hci_dev *hdev, void *data,
4164
			  u16 len)
4165
{
4166
	struct mgmt_cp_unblock_device *cp = data;
4167
	u8 status;
4168 4169
	int err;

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

4172
	if (!bdaddr_type_is_valid(cp->addr.type))
4173 4174 4175
		return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNBLOCK_DEVICE,
					 MGMT_STATUS_INVALID_PARAMS,
					 &cp->addr, sizeof(cp->addr));
4176

4177
	hci_dev_lock(hdev);
4178

4179 4180
	err = hci_bdaddr_list_del(&hdev->blacklist, &cp->addr.bdaddr,
				  cp->addr.type);
4181
	if (err < 0) {
4182
		status = MGMT_STATUS_INVALID_PARAMS;
4183 4184 4185 4186 4187 4188
		goto done;
	}

	mgmt_event(MGMT_EV_DEVICE_UNBLOCKED, hdev, &cp->addr, sizeof(cp->addr),
		   sk);
	status = MGMT_STATUS_SUCCESS;
4189

4190
done:
4191 4192
	err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNBLOCK_DEVICE, status,
				&cp->addr, sizeof(cp->addr));
4193

4194
	hci_dev_unlock(hdev);
4195 4196 4197 4198

	return err;
}

4199 4200 4201 4202
static int set_device_id(struct sock *sk, struct hci_dev *hdev, void *data,
			 u16 len)
{
	struct mgmt_cp_set_device_id *cp = data;
4203
	struct hci_request req;
4204
	int err;
4205
	__u16 source;
4206 4207 4208

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

4209 4210 4211
	source = __le16_to_cpu(cp->source);

	if (source > 0x0002)
4212 4213
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DEVICE_ID,
				       MGMT_STATUS_INVALID_PARAMS);
4214

4215 4216
	hci_dev_lock(hdev);

4217
	hdev->devid_source = source;
4218 4219 4220 4221
	hdev->devid_vendor = __le16_to_cpu(cp->vendor);
	hdev->devid_product = __le16_to_cpu(cp->product);
	hdev->devid_version = __le16_to_cpu(cp->version);

4222 4223
	err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_DEVICE_ID, 0,
				NULL, 0);
4224

4225
	hci_req_init(&req, hdev);
4226
	__hci_req_update_eir(&req);
4227
	hci_req_run(&req, NULL);
4228 4229 4230 4231 4232 4233

	hci_dev_unlock(hdev);

	return err;
}

4234 4235 4236 4237 4238 4239
static void enable_advertising_instance(struct hci_dev *hdev, u8 status,
					u16 opcode)
{
	BT_DBG("status %d", status);
}

4240 4241
static void set_advertising_complete(struct hci_dev *hdev, u8 status,
				     u16 opcode)
4242 4243
{
	struct cmd_lookup match = { NULL, hdev };
4244
	struct hci_request req;
4245 4246 4247
	u8 instance;
	struct adv_info *adv_instance;
	int err;
4248

4249 4250
	hci_dev_lock(hdev);

4251 4252 4253 4254 4255
	if (status) {
		u8 mgmt_err = mgmt_status(status);

		mgmt_pending_foreach(MGMT_OP_SET_ADVERTISING, hdev,
				     cmd_status_rsp, &mgmt_err);
4256
		goto unlock;
4257 4258
	}

4259
	if (hci_dev_test_flag(hdev, HCI_LE_ADV))
4260
		hci_dev_set_flag(hdev, HCI_ADVERTISING);
4261
	else
4262
		hci_dev_clear_flag(hdev, HCI_ADVERTISING);
4263

4264 4265 4266 4267 4268 4269 4270
	mgmt_pending_foreach(MGMT_OP_SET_ADVERTISING, hdev, settings_rsp,
			     &match);

	new_settings(hdev, match.sk);

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

4272
	/* If "Set Advertising" was just disabled and instance advertising was
4273
	 * set up earlier, then re-enable multi-instance advertising.
4274 4275
	 */
	if (hci_dev_test_flag(hdev, HCI_ADVERTISING) ||
4276
	    list_empty(&hdev->adv_instances))
4277 4278
		goto unlock;

4279 4280 4281 4282 4283 4284 4285 4286 4287 4288
	instance = hdev->cur_adv_instance;
	if (!instance) {
		adv_instance = list_first_entry_or_null(&hdev->adv_instances,
							struct adv_info, list);
		if (!adv_instance)
			goto unlock;

		instance = adv_instance->instance;
	}

4289 4290
	hci_req_init(&req, hdev);

4291
	err = __hci_req_schedule_adv_instance(&req, instance, true);
4292 4293 4294

	if (!err)
		err = hci_req_run(&req, enable_advertising_instance);
4295

4296
	if (err)
4297
		bt_dev_err(hdev, "failed to re-configure advertising");
4298

4299 4300
unlock:
	hci_dev_unlock(hdev);
4301 4302
}

4303 4304
static int set_advertising(struct sock *sk, struct hci_dev *hdev, void *data,
			   u16 len)
4305 4306
{
	struct mgmt_mode *cp = data;
4307
	struct mgmt_pending_cmd *cmd;
4308
	struct hci_request req;
4309
	u8 val, status;
4310 4311 4312 4313
	int err;

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

4314 4315
	status = mgmt_le_support(hdev);
	if (status)
4316 4317
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING,
				       status);
4318

4319
	if (cp->val != 0x00 && cp->val != 0x01 && cp->val != 0x02)
4320 4321
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING,
				       MGMT_STATUS_INVALID_PARAMS);
4322 4323 4324 4325 4326

	hci_dev_lock(hdev);

	val = !!cp->val;

4327 4328 4329 4330 4331
	/* 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).
	 */
4332
	if (!hdev_is_powered(hdev) ||
4333 4334
	    (val == hci_dev_test_flag(hdev, HCI_ADVERTISING) &&
	     (cp->val == 0x02) == hci_dev_test_flag(hdev, HCI_ADVERTISING_CONNECTABLE)) ||
4335
	    hci_conn_num(hdev, LE_LINK) > 0 ||
4336
	    (hci_dev_test_flag(hdev, HCI_LE_SCAN) &&
4337
	     hdev->le_scan_type == LE_SCAN_ACTIVE)) {
4338
		bool changed;
4339

4340
		if (cp->val) {
4341
			hdev->cur_adv_instance = 0x00;
4342
			changed = !hci_dev_test_and_set_flag(hdev, HCI_ADVERTISING);
4343
			if (cp->val == 0x02)
4344
				hci_dev_set_flag(hdev, HCI_ADVERTISING_CONNECTABLE);
4345
			else
4346
				hci_dev_clear_flag(hdev, HCI_ADVERTISING_CONNECTABLE);
4347
		} else {
4348
			changed = hci_dev_test_and_clear_flag(hdev, HCI_ADVERTISING);
4349
			hci_dev_clear_flag(hdev, HCI_ADVERTISING_CONNECTABLE);
4350 4351 4352 4353 4354 4355 4356 4357 4358 4359 4360 4361
		}

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

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

		goto unlock;
	}

4362 4363
	if (pending_find(MGMT_OP_SET_ADVERTISING, hdev) ||
	    pending_find(MGMT_OP_SET_LE, hdev)) {
4364 4365
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING,
				      MGMT_STATUS_BUSY);
4366 4367 4368 4369 4370 4371 4372 4373 4374 4375 4376
		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);

4377
	if (cp->val == 0x02)
4378
		hci_dev_set_flag(hdev, HCI_ADVERTISING_CONNECTABLE);
4379
	else
4380
		hci_dev_clear_flag(hdev, HCI_ADVERTISING_CONNECTABLE);
4381

4382 4383
	cancel_adv_timeout(hdev);

4384
	if (val) {
4385 4386 4387 4388
		/* Switch to instance "0" for the Set Advertising setting.
		 * We cannot use update_[adv|scan_rsp]_data() here as the
		 * HCI_ADVERTISING flag is not yet set.
		 */
4389
		hdev->cur_adv_instance = 0x00;
4390 4391 4392 4393 4394 4395 4396 4397

		if (ext_adv_capable(hdev)) {
			__hci_req_start_ext_adv(&req, 0x00);
		} else {
			__hci_req_update_adv_data(&req, 0x00);
			__hci_req_update_scan_rsp_data(&req, 0x00);
			__hci_req_enable_advertising(&req);
		}
4398
	} else {
4399
		__hci_req_disable_advertising(&req);
4400
	}
4401 4402 4403 4404 4405 4406 4407 4408 4409 4410

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

unlock:
	hci_dev_unlock(hdev);
	return err;
}

4411 4412 4413 4414 4415 4416 4417 4418
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);

4419
	if (!lmp_le_capable(hdev))
4420 4421
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_STATIC_ADDRESS,
				       MGMT_STATUS_NOT_SUPPORTED);
4422 4423

	if (hdev_is_powered(hdev))
4424 4425
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_STATIC_ADDRESS,
				       MGMT_STATUS_REJECTED);
4426 4427 4428

	if (bacmp(&cp->bdaddr, BDADDR_ANY)) {
		if (!bacmp(&cp->bdaddr, BDADDR_NONE))
4429 4430 4431
			return mgmt_cmd_status(sk, hdev->id,
					       MGMT_OP_SET_STATIC_ADDRESS,
					       MGMT_STATUS_INVALID_PARAMS);
4432 4433 4434

		/* Two most significant bits shall be set */
		if ((cp->bdaddr.b[5] & 0xc0) != 0xc0)
4435 4436 4437
			return mgmt_cmd_status(sk, hdev->id,
					       MGMT_OP_SET_STATIC_ADDRESS,
					       MGMT_STATUS_INVALID_PARAMS);
4438 4439 4440 4441 4442 4443
	}

	hci_dev_lock(hdev);

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

4444 4445 4446 4447 4448
	err = send_settings_rsp(sk, MGMT_OP_SET_STATIC_ADDRESS, hdev);
	if (err < 0)
		goto unlock;

	err = new_settings(hdev, sk);
4449

4450
unlock:
4451 4452 4453 4454
	hci_dev_unlock(hdev);
	return err;
}

4455 4456 4457 4458 4459 4460 4461 4462 4463 4464
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))
4465 4466
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS,
				       MGMT_STATUS_NOT_SUPPORTED);
4467 4468 4469 4470

	interval = __le16_to_cpu(cp->interval);

	if (interval < 0x0004 || interval > 0x4000)
4471 4472
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS,
				       MGMT_STATUS_INVALID_PARAMS);
4473 4474 4475 4476

	window = __le16_to_cpu(cp->window);

	if (window < 0x0004 || window > 0x4000)
4477 4478
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS,
				       MGMT_STATUS_INVALID_PARAMS);
4479

4480
	if (window > interval)
4481 4482
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS,
				       MGMT_STATUS_INVALID_PARAMS);
4483

4484 4485 4486 4487 4488
	hci_dev_lock(hdev);

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

4489 4490
	err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS, 0,
				NULL, 0);
4491

4492 4493 4494
	/* If background scan is running, restart it so new parameters are
	 * loaded.
	 */
4495
	if (hci_dev_test_flag(hdev, HCI_LE_SCAN) &&
4496 4497 4498 4499 4500 4501 4502 4503 4504 4505 4506
	    hdev->discovery.state == DISCOVERY_STOPPED) {
		struct hci_request req;

		hci_req_init(&req, hdev);

		hci_req_add_le_scan_disable(&req);
		hci_req_add_le_passive_scan(&req);

		hci_req_run(&req, NULL);
	}

4507 4508 4509 4510 4511
	hci_dev_unlock(hdev);

	return err;
}

4512 4513
static void fast_connectable_complete(struct hci_dev *hdev, u8 status,
				      u16 opcode)
4514
{
4515
	struct mgmt_pending_cmd *cmd;
4516 4517 4518 4519 4520

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

	hci_dev_lock(hdev);

4521
	cmd = pending_find(MGMT_OP_SET_FAST_CONNECTABLE, hdev);
4522 4523 4524 4525
	if (!cmd)
		goto unlock;

	if (status) {
4526 4527
		mgmt_cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
			        mgmt_status(status));
4528
	} else {
4529 4530 4531
		struct mgmt_mode *cp = cmd->param;

		if (cp->val)
4532
			hci_dev_set_flag(hdev, HCI_FAST_CONNECTABLE);
4533
		else
4534
			hci_dev_clear_flag(hdev, HCI_FAST_CONNECTABLE);
4535

4536 4537 4538 4539 4540 4541 4542 4543 4544 4545
		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);
}

4546
static int set_fast_connectable(struct sock *sk, struct hci_dev *hdev,
4547
				void *data, u16 len)
4548
{
4549
	struct mgmt_mode *cp = data;
4550
	struct mgmt_pending_cmd *cmd;
4551
	struct hci_request req;
4552 4553
	int err;

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

4556
	if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED) ||
4557
	    hdev->hci_ver < BLUETOOTH_VER_1_2)
4558 4559
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
				       MGMT_STATUS_NOT_SUPPORTED);
4560

4561
	if (cp->val != 0x00 && cp->val != 0x01)
4562 4563
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
				       MGMT_STATUS_INVALID_PARAMS);
4564

4565 4566
	hci_dev_lock(hdev);

4567
	if (pending_find(MGMT_OP_SET_FAST_CONNECTABLE, hdev)) {
4568 4569
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
				      MGMT_STATUS_BUSY);
4570 4571 4572
		goto unlock;
	}

4573
	if (!!cp->val == hci_dev_test_flag(hdev, HCI_FAST_CONNECTABLE)) {
4574 4575 4576 4577 4578
		err = send_settings_rsp(sk, MGMT_OP_SET_FAST_CONNECTABLE,
					hdev);
		goto unlock;
	}

4579
	if (!hdev_is_powered(hdev)) {
4580
		hci_dev_change_flag(hdev, HCI_FAST_CONNECTABLE);
4581 4582 4583 4584 4585 4586
		err = send_settings_rsp(sk, MGMT_OP_SET_FAST_CONNECTABLE,
					hdev);
		new_settings(hdev, sk);
		goto unlock;
	}

4587 4588 4589 4590 4591
	cmd = mgmt_pending_add(sk, MGMT_OP_SET_FAST_CONNECTABLE, hdev,
			       data, len);
	if (!cmd) {
		err = -ENOMEM;
		goto unlock;
4592 4593
	}

4594 4595
	hci_req_init(&req, hdev);

4596
	__hci_req_write_fast_connectable(&req, cp->val);
4597 4598

	err = hci_req_run(&req, fast_connectable_complete);
4599
	if (err < 0) {
4600 4601
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
				      MGMT_STATUS_FAILED);
4602
		mgmt_pending_remove(cmd);
4603 4604
	}

4605
unlock:
4606
	hci_dev_unlock(hdev);
4607

4608 4609 4610
	return err;
}

4611
static void set_bredr_complete(struct hci_dev *hdev, u8 status, u16 opcode)
4612
{
4613
	struct mgmt_pending_cmd *cmd;
4614 4615 4616 4617 4618

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

	hci_dev_lock(hdev);

4619
	cmd = pending_find(MGMT_OP_SET_BREDR, hdev);
4620 4621 4622 4623 4624 4625 4626 4627 4628
	if (!cmd)
		goto unlock;

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

		/* We need to restore the flag if related HCI commands
		 * failed.
		 */
4629
		hci_dev_clear_flag(hdev, HCI_BREDR_ENABLED);
4630

4631
		mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, mgmt_err);
4632 4633 4634 4635 4636 4637 4638 4639 4640 4641 4642 4643 4644 4645
	} 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;
4646
	struct mgmt_pending_cmd *cmd;
4647 4648 4649 4650 4651 4652
	struct hci_request req;
	int err;

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

	if (!lmp_bredr_capable(hdev) || !lmp_le_capable(hdev))
4653 4654
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR,
				       MGMT_STATUS_NOT_SUPPORTED);
4655

4656
	if (!hci_dev_test_flag(hdev, HCI_LE_ENABLED))
4657 4658
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR,
				       MGMT_STATUS_REJECTED);
4659 4660

	if (cp->val != 0x00 && cp->val != 0x01)
4661 4662
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR,
				       MGMT_STATUS_INVALID_PARAMS);
4663 4664 4665

	hci_dev_lock(hdev);

4666
	if (cp->val == hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) {
4667 4668 4669 4670 4671 4672
		err = send_settings_rsp(sk, MGMT_OP_SET_BREDR, hdev);
		goto unlock;
	}

	if (!hdev_is_powered(hdev)) {
		if (!cp->val) {
4673 4674 4675 4676 4677
			hci_dev_clear_flag(hdev, HCI_DISCOVERABLE);
			hci_dev_clear_flag(hdev, HCI_SSP_ENABLED);
			hci_dev_clear_flag(hdev, HCI_LINK_SECURITY);
			hci_dev_clear_flag(hdev, HCI_FAST_CONNECTABLE);
			hci_dev_clear_flag(hdev, HCI_HS_ENABLED);
4678 4679
		}

4680
		hci_dev_change_flag(hdev, HCI_BREDR_ENABLED);
4681 4682 4683 4684 4685 4686 4687 4688 4689 4690 4691

		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) {
4692 4693
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR,
				      MGMT_STATUS_REJECTED);
4694
		goto unlock;
4695 4696 4697 4698 4699 4700 4701 4702
	} else {
		/* When configuring a dual-mode controller to operate
		 * with LE only and using a static address, then switching
		 * BR/EDR back on is not allowed.
		 *
		 * Dual-mode controllers shall operate with the public
		 * address as its identity address for BR/EDR and LE. So
		 * reject the attempt to create an invalid configuration.
4703 4704 4705 4706 4707 4708
		 *
		 * The same restrictions applies when secure connections
		 * has been enabled. For BR/EDR this is a controller feature
		 * while for LE it is a host stack feature. This means that
		 * switching BR/EDR back on when secure connections has been
		 * enabled is not a supported transaction.
4709
		 */
4710
		if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED) &&
4711
		    (bacmp(&hdev->static_addr, BDADDR_ANY) ||
4712
		     hci_dev_test_flag(hdev, HCI_SC_ENABLED))) {
4713 4714
			err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR,
					      MGMT_STATUS_REJECTED);
4715 4716
			goto unlock;
		}
4717 4718
	}

4719
	if (pending_find(MGMT_OP_SET_BREDR, hdev)) {
4720 4721
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR,
				      MGMT_STATUS_BUSY);
4722 4723 4724 4725 4726 4727 4728 4729 4730
		goto unlock;
	}

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

4731 4732
	/* We need to flip the bit already here so that
	 * hci_req_update_adv_data generates the correct flags.
4733
	 */
4734
	hci_dev_set_flag(hdev, HCI_BREDR_ENABLED);
4735 4736

	hci_req_init(&req, hdev);
4737

4738
	__hci_req_write_fast_connectable(&req, false);
4739
	__hci_req_update_scan(&req);
4740

4741 4742 4743
	/* Since only the advertising data flags will change, there
	 * is no need to update the scan response data.
	 */
4744
	__hci_req_update_adv_data(&req, hdev->cur_adv_instance);
4745

4746 4747 4748 4749 4750 4751 4752 4753 4754
	err = hci_req_run(&req, set_bredr_complete);
	if (err < 0)
		mgmt_pending_remove(cmd);

unlock:
	hci_dev_unlock(hdev);
	return err;
}

4755 4756
static void sc_enable_complete(struct hci_dev *hdev, u8 status, u16 opcode)
{
4757
	struct mgmt_pending_cmd *cmd;
4758 4759 4760 4761 4762 4763
	struct mgmt_mode *cp;

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

	hci_dev_lock(hdev);

4764
	cmd = pending_find(MGMT_OP_SET_SECURE_CONN, hdev);
4765 4766 4767 4768
	if (!cmd)
		goto unlock;

	if (status) {
4769 4770
		mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode,
			        mgmt_status(status));
4771 4772 4773 4774 4775 4776 4777
		goto remove;
	}

	cp = cmd->param;

	switch (cp->val) {
	case 0x00:
4778 4779
		hci_dev_clear_flag(hdev, HCI_SC_ENABLED);
		hci_dev_clear_flag(hdev, HCI_SC_ONLY);
4780 4781
		break;
	case 0x01:
4782
		hci_dev_set_flag(hdev, HCI_SC_ENABLED);
4783
		hci_dev_clear_flag(hdev, HCI_SC_ONLY);
4784 4785
		break;
	case 0x02:
4786 4787
		hci_dev_set_flag(hdev, HCI_SC_ENABLED);
		hci_dev_set_flag(hdev, HCI_SC_ONLY);
4788 4789 4790 4791 4792 4793 4794 4795 4796 4797 4798 4799
		break;
	}

	send_settings_rsp(cmd->sk, MGMT_OP_SET_SECURE_CONN, hdev);
	new_settings(hdev, cmd->sk);

remove:
	mgmt_pending_remove(cmd);
unlock:
	hci_dev_unlock(hdev);
}

4800 4801 4802 4803
static int set_secure_conn(struct sock *sk, struct hci_dev *hdev,
			   void *data, u16 len)
{
	struct mgmt_mode *cp = data;
4804
	struct mgmt_pending_cmd *cmd;
4805
	struct hci_request req;
4806
	u8 val;
4807 4808 4809 4810
	int err;

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

4811
	if (!lmp_sc_capable(hdev) &&
4812
	    !hci_dev_test_flag(hdev, HCI_LE_ENABLED))
4813 4814
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SECURE_CONN,
				       MGMT_STATUS_NOT_SUPPORTED);
4815

4816
	if (hci_dev_test_flag(hdev, HCI_BREDR_ENABLED) &&
4817
	    lmp_sc_capable(hdev) &&
4818
	    !hci_dev_test_flag(hdev, HCI_SSP_ENABLED))
4819 4820
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SECURE_CONN,
				       MGMT_STATUS_REJECTED);
4821

4822
	if (cp->val != 0x00 && cp->val != 0x01 && cp->val != 0x02)
4823
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SECURE_CONN,
4824 4825 4826 4827
				  MGMT_STATUS_INVALID_PARAMS);

	hci_dev_lock(hdev);

4828
	if (!hdev_is_powered(hdev) || !lmp_sc_capable(hdev) ||
4829
	    !hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) {
4830 4831
		bool changed;

4832
		if (cp->val) {
4833 4834
			changed = !hci_dev_test_and_set_flag(hdev,
							     HCI_SC_ENABLED);
4835
			if (cp->val == 0x02)
4836
				hci_dev_set_flag(hdev, HCI_SC_ONLY);
4837
			else
4838
				hci_dev_clear_flag(hdev, HCI_SC_ONLY);
4839
		} else {
4840 4841
			changed = hci_dev_test_and_clear_flag(hdev,
							      HCI_SC_ENABLED);
4842
			hci_dev_clear_flag(hdev, HCI_SC_ONLY);
4843
		}
4844 4845 4846 4847 4848 4849 4850 4851 4852 4853 4854

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

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

		goto failed;
	}

4855
	if (pending_find(MGMT_OP_SET_SECURE_CONN, hdev)) {
4856 4857
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SECURE_CONN,
				      MGMT_STATUS_BUSY);
4858 4859 4860
		goto failed;
	}

4861 4862
	val = !!cp->val;

4863 4864
	if (val == hci_dev_test_flag(hdev, HCI_SC_ENABLED) &&
	    (cp->val == 0x02) == hci_dev_test_flag(hdev, HCI_SC_ONLY)) {
4865 4866 4867 4868 4869 4870 4871 4872 4873 4874
		err = send_settings_rsp(sk, MGMT_OP_SET_SECURE_CONN, hdev);
		goto failed;
	}

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

4875 4876 4877
	hci_req_init(&req, hdev);
	hci_req_add(&req, HCI_OP_WRITE_SC_SUPPORT, 1, &val);
	err = hci_req_run(&req, sc_enable_complete);
4878 4879 4880 4881 4882 4883 4884 4885 4886 4887
	if (err < 0) {
		mgmt_pending_remove(cmd);
		goto failed;
	}

failed:
	hci_dev_unlock(hdev);
	return err;
}

4888 4889 4890 4891
static int set_debug_keys(struct sock *sk, struct hci_dev *hdev,
			  void *data, u16 len)
{
	struct mgmt_mode *cp = data;
4892
	bool changed, use_changed;
4893 4894 4895 4896
	int err;

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

4897
	if (cp->val != 0x00 && cp->val != 0x01 && cp->val != 0x02)
4898 4899
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DEBUG_KEYS,
				       MGMT_STATUS_INVALID_PARAMS);
4900 4901 4902 4903

	hci_dev_lock(hdev);

	if (cp->val)
4904
		changed = !hci_dev_test_and_set_flag(hdev, HCI_KEEP_DEBUG_KEYS);
4905
	else
4906 4907
		changed = hci_dev_test_and_clear_flag(hdev,
						      HCI_KEEP_DEBUG_KEYS);
4908

4909
	if (cp->val == 0x02)
4910 4911
		use_changed = !hci_dev_test_and_set_flag(hdev,
							 HCI_USE_DEBUG_KEYS);
4912
	else
4913 4914
		use_changed = hci_dev_test_and_clear_flag(hdev,
							  HCI_USE_DEBUG_KEYS);
4915 4916

	if (hdev_is_powered(hdev) && use_changed &&
4917
	    hci_dev_test_flag(hdev, HCI_SSP_ENABLED)) {
4918 4919 4920 4921 4922
		u8 mode = (cp->val == 0x02) ? 0x01 : 0x00;
		hci_send_cmd(hdev, HCI_OP_WRITE_SSP_DEBUG_MODE,
			     sizeof(mode), &mode);
	}

4923 4924 4925 4926 4927 4928 4929 4930 4931 4932 4933 4934
	err = send_settings_rsp(sk, MGMT_OP_SET_DEBUG_KEYS, hdev);
	if (err < 0)
		goto unlock;

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

unlock:
	hci_dev_unlock(hdev);
	return err;
}

4935 4936 4937 4938 4939 4940 4941 4942 4943 4944
static int set_privacy(struct sock *sk, struct hci_dev *hdev, void *cp_data,
		       u16 len)
{
	struct mgmt_cp_set_privacy *cp = cp_data;
	bool changed;
	int err;

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

	if (!lmp_le_capable(hdev))
4945 4946
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PRIVACY,
				       MGMT_STATUS_NOT_SUPPORTED);
4947

4948
	if (cp->privacy != 0x00 && cp->privacy != 0x01 && cp->privacy != 0x02)
4949 4950
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PRIVACY,
				       MGMT_STATUS_INVALID_PARAMS);
4951 4952

	if (hdev_is_powered(hdev))
4953 4954
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PRIVACY,
				       MGMT_STATUS_REJECTED);
4955 4956 4957

	hci_dev_lock(hdev);

4958 4959 4960
	/* If user space supports this command it is also expected to
	 * handle IRKs. Therefore, set the HCI_RPA_RESOLVING flag.
	 */
4961
	hci_dev_set_flag(hdev, HCI_RPA_RESOLVING);
4962

4963
	if (cp->privacy) {
4964
		changed = !hci_dev_test_and_set_flag(hdev, HCI_PRIVACY);
4965
		memcpy(hdev->irk, cp->irk, sizeof(hdev->irk));
4966
		hci_dev_set_flag(hdev, HCI_RPA_EXPIRED);
4967
		hci_adv_instances_set_rpa_expired(hdev, true);
4968 4969 4970 4971
		if (cp->privacy == 0x02)
			hci_dev_set_flag(hdev, HCI_LIMITED_PRIVACY);
		else
			hci_dev_clear_flag(hdev, HCI_LIMITED_PRIVACY);
4972
	} else {
4973
		changed = hci_dev_test_and_clear_flag(hdev, HCI_PRIVACY);
4974
		memset(hdev->irk, 0, sizeof(hdev->irk));
4975
		hci_dev_clear_flag(hdev, HCI_RPA_EXPIRED);
4976
		hci_adv_instances_set_rpa_expired(hdev, false);
4977
		hci_dev_clear_flag(hdev, HCI_LIMITED_PRIVACY);
4978 4979 4980 4981 4982 4983 4984 4985 4986 4987 4988 4989 4990 4991
	}

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

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

unlock:
	hci_dev_unlock(hdev);
	return err;
}

4992 4993 4994 4995 4996 4997 4998 4999 5000 5001 5002 5003 5004 5005 5006 5007 5008 5009 5010 5011
static bool irk_is_valid(struct mgmt_irk_info *irk)
{
	switch (irk->addr.type) {
	case BDADDR_LE_PUBLIC:
		return true;

	case BDADDR_LE_RANDOM:
		/* Two most significant bits shall be set */
		if ((irk->addr.bdaddr.b[5] & 0xc0) != 0xc0)
			return false;
		return true;
	}

	return false;
}

static int load_irks(struct sock *sk, struct hci_dev *hdev, void *cp_data,
		     u16 len)
{
	struct mgmt_cp_load_irks *cp = cp_data;
5012 5013
	const u16 max_irk_count = ((U16_MAX - sizeof(*cp)) /
				   sizeof(struct mgmt_irk_info));
5014 5015 5016 5017 5018 5019
	u16 irk_count, expected_len;
	int i, err;

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

	if (!lmp_le_capable(hdev))
5020 5021
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_IRKS,
				       MGMT_STATUS_NOT_SUPPORTED);
5022 5023

	irk_count = __le16_to_cpu(cp->irk_count);
5024
	if (irk_count > max_irk_count) {
5025 5026
		bt_dev_err(hdev, "load_irks: too big irk_count value %u",
			   irk_count);
5027 5028
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_IRKS,
				       MGMT_STATUS_INVALID_PARAMS);
5029
	}
5030 5031 5032

	expected_len = sizeof(*cp) + irk_count * sizeof(struct mgmt_irk_info);
	if (expected_len != len) {
5033 5034
		bt_dev_err(hdev, "load_irks: expected %u bytes, got %u bytes",
			   expected_len, len);
5035 5036
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_IRKS,
				       MGMT_STATUS_INVALID_PARAMS);
5037 5038 5039 5040 5041 5042 5043 5044
	}

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

	for (i = 0; i < irk_count; i++) {
		struct mgmt_irk_info *key = &cp->irks[i];

		if (!irk_is_valid(key))
5045 5046 5047
			return mgmt_cmd_status(sk, hdev->id,
					       MGMT_OP_LOAD_IRKS,
					       MGMT_STATUS_INVALID_PARAMS);
5048 5049 5050 5051 5052 5053 5054 5055 5056
	}

	hci_dev_lock(hdev);

	hci_smp_irks_clear(hdev);

	for (i = 0; i < irk_count; i++) {
		struct mgmt_irk_info *irk = &cp->irks[i];

5057 5058
		hci_add_irk(hdev, &irk->addr.bdaddr,
			    le_addr_type(irk->addr.type), irk->val,
5059 5060 5061
			    BDADDR_ANY);
	}

5062
	hci_dev_set_flag(hdev, HCI_RPA_RESOLVING);
5063

5064
	err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_LOAD_IRKS, 0, NULL, 0);
5065 5066 5067 5068 5069 5070

	hci_dev_unlock(hdev);

	return err;
}

5071 5072 5073 5074
static bool ltk_is_valid(struct mgmt_ltk_info *key)
{
	if (key->master != 0x00 && key->master != 0x01)
		return false;
5075 5076 5077 5078 5079 5080 5081 5082 5083 5084 5085 5086 5087

	switch (key->addr.type) {
	case BDADDR_LE_PUBLIC:
		return true;

	case BDADDR_LE_RANDOM:
		/* Two most significant bits shall be set */
		if ((key->addr.bdaddr.b[5] & 0xc0) != 0xc0)
			return false;
		return true;
	}

	return false;
5088 5089
}

5090
static int load_long_term_keys(struct sock *sk, struct hci_dev *hdev,
5091
			       void *cp_data, u16 len)
5092 5093
{
	struct mgmt_cp_load_long_term_keys *cp = cp_data;
5094 5095
	const u16 max_key_count = ((U16_MAX - sizeof(*cp)) /
				   sizeof(struct mgmt_ltk_info));
5096
	u16 key_count, expected_len;
5097
	int i, err;
5098

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

	if (!lmp_le_capable(hdev))
5102 5103
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS,
				       MGMT_STATUS_NOT_SUPPORTED);
5104

5105
	key_count = __le16_to_cpu(cp->key_count);
5106
	if (key_count > max_key_count) {
5107 5108
		bt_dev_err(hdev, "load_ltks: too big key_count value %u",
			   key_count);
5109 5110
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS,
				       MGMT_STATUS_INVALID_PARAMS);
5111
	}
5112 5113 5114 5115

	expected_len = sizeof(*cp) + key_count *
					sizeof(struct mgmt_ltk_info);
	if (expected_len != len) {
5116 5117
		bt_dev_err(hdev, "load_keys: expected %u bytes, got %u bytes",
			   expected_len, len);
5118 5119
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS,
				       MGMT_STATUS_INVALID_PARAMS);
5120 5121
	}

5122
	BT_DBG("%s key_count %u", hdev->name, key_count);
5123

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

5127
		if (!ltk_is_valid(key))
5128 5129 5130
			return mgmt_cmd_status(sk, hdev->id,
					       MGMT_OP_LOAD_LONG_TERM_KEYS,
					       MGMT_STATUS_INVALID_PARAMS);
5131 5132
	}

5133 5134 5135 5136 5137 5138
	hci_dev_lock(hdev);

	hci_smp_ltks_clear(hdev);

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

5141 5142
		switch (key->type) {
		case MGMT_LTK_UNAUTHENTICATED:
5143
			authenticated = 0x00;
5144
			type = key->master ? SMP_LTK : SMP_LTK_SLAVE;
5145 5146
			break;
		case MGMT_LTK_AUTHENTICATED:
5147
			authenticated = 0x01;
5148 5149 5150 5151 5152
			type = key->master ? SMP_LTK : SMP_LTK_SLAVE;
			break;
		case MGMT_LTK_P256_UNAUTH:
			authenticated = 0x00;
			type = SMP_LTK_P256;
5153
			break;
5154 5155 5156
		case MGMT_LTK_P256_AUTH:
			authenticated = 0x01;
			type = SMP_LTK_P256;
5157
			break;
5158 5159 5160
		case MGMT_LTK_P256_DEBUG:
			authenticated = 0x00;
			type = SMP_LTK_P256_DEBUG;
5161
			/* fall through */
5162 5163 5164
		default:
			continue;
		}
5165

5166 5167 5168
		hci_add_ltk(hdev, &key->addr.bdaddr,
			    le_addr_type(key->addr.type), type, authenticated,
			    key->val, key->enc_size, key->ediv, key->rand);
5169 5170
	}

5171
	err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS, 0,
5172 5173
			   NULL, 0);

5174 5175
	hci_dev_unlock(hdev);

5176
	return err;
5177 5178
}

5179
static int conn_info_cmd_complete(struct mgmt_pending_cmd *cmd, u8 status)
5180 5181
{
	struct hci_conn *conn = cmd->user_data;
5182
	struct mgmt_rp_get_conn_info rp;
5183
	int err;
5184

5185
	memcpy(&rp.addr, cmd->param, sizeof(rp.addr));
5186

5187
	if (status == MGMT_STATUS_SUCCESS) {
5188
		rp.rssi = conn->rssi;
5189 5190 5191 5192 5193 5194
		rp.tx_power = conn->tx_power;
		rp.max_tx_power = conn->max_tx_power;
	} else {
		rp.rssi = HCI_RSSI_INVALID;
		rp.tx_power = HCI_TX_POWER_INVALID;
		rp.max_tx_power = HCI_TX_POWER_INVALID;
5195 5196
	}

5197 5198
	err = mgmt_cmd_complete(cmd->sk, cmd->index, MGMT_OP_GET_CONN_INFO,
				status, &rp, sizeof(rp));
5199 5200

	hci_conn_drop(conn);
5201
	hci_conn_put(conn);
5202 5203

	return err;
5204 5205
}

5206 5207
static void conn_info_refresh_complete(struct hci_dev *hdev, u8 hci_status,
				       u16 opcode)
5208 5209
{
	struct hci_cp_read_rssi *cp;
5210
	struct mgmt_pending_cmd *cmd;
5211 5212
	struct hci_conn *conn;
	u16 handle;
5213
	u8 status;
5214

5215
	BT_DBG("status 0x%02x", hci_status);
5216 5217 5218 5219 5220 5221 5222 5223 5224 5225 5226 5227 5228 5229 5230

	hci_dev_lock(hdev);

	/* Commands sent in request are either Read RSSI or Read Transmit Power
	 * Level so we check which one was last sent to retrieve connection
	 * handle.  Both commands have handle as first parameter so it's safe to
	 * cast data on the same command struct.
	 *
	 * First command sent is always Read RSSI and we fail only if it fails.
	 * In other case we simply override error to indicate success as we
	 * already remembered if TX power value is actually valid.
	 */
	cp = hci_sent_cmd_data(hdev, HCI_OP_READ_RSSI);
	if (!cp) {
		cp = hci_sent_cmd_data(hdev, HCI_OP_READ_TX_POWER);
5231 5232 5233
		status = MGMT_STATUS_SUCCESS;
	} else {
		status = mgmt_status(hci_status);
5234 5235 5236
	}

	if (!cp) {
5237
		bt_dev_err(hdev, "invalid sent_cmd in conn_info response");
5238 5239 5240 5241 5242 5243
		goto unlock;
	}

	handle = __le16_to_cpu(cp->handle);
	conn = hci_conn_hash_lookup_handle(hdev, handle);
	if (!conn) {
5244 5245
		bt_dev_err(hdev, "unknown handle (%d) in conn_info response",
			   handle);
5246 5247 5248
		goto unlock;
	}

5249
	cmd = pending_find_data(MGMT_OP_GET_CONN_INFO, hdev, conn);
5250 5251
	if (!cmd)
		goto unlock;
5252

5253 5254
	cmd->cmd_complete(cmd, status);
	mgmt_pending_remove(cmd);
5255 5256 5257 5258 5259 5260 5261 5262 5263 5264 5265 5266 5267 5268 5269 5270 5271 5272 5273 5274 5275

unlock:
	hci_dev_unlock(hdev);
}

static int get_conn_info(struct sock *sk, struct hci_dev *hdev, void *data,
			 u16 len)
{
	struct mgmt_cp_get_conn_info *cp = data;
	struct mgmt_rp_get_conn_info rp;
	struct hci_conn *conn;
	unsigned long conn_info_age;
	int err = 0;

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

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

	if (!bdaddr_type_is_valid(cp->addr.type))
5276 5277 5278
		return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONN_INFO,
					 MGMT_STATUS_INVALID_PARAMS,
					 &rp, sizeof(rp));
5279 5280 5281 5282

	hci_dev_lock(hdev);

	if (!hdev_is_powered(hdev)) {
5283 5284 5285
		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONN_INFO,
					MGMT_STATUS_NOT_POWERED, &rp,
					sizeof(rp));
5286 5287 5288 5289 5290 5291 5292 5293 5294 5295
		goto unlock;
	}

	if (cp->addr.type == BDADDR_BREDR)
		conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK,
					       &cp->addr.bdaddr);
	else
		conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &cp->addr.bdaddr);

	if (!conn || conn->state != BT_CONNECTED) {
5296 5297 5298
		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONN_INFO,
					MGMT_STATUS_NOT_CONNECTED, &rp,
					sizeof(rp));
5299 5300 5301
		goto unlock;
	}

5302
	if (pending_find_data(MGMT_OP_GET_CONN_INFO, hdev, conn)) {
5303 5304
		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONN_INFO,
					MGMT_STATUS_BUSY, &rp, sizeof(rp));
5305 5306 5307
		goto unlock;
	}

5308 5309 5310 5311 5312 5313 5314 5315 5316 5317
	/* To avoid client trying to guess when to poll again for information we
	 * calculate conn info age as random value between min/max set in hdev.
	 */
	conn_info_age = hdev->conn_info_min_age +
			prandom_u32_max(hdev->conn_info_max_age -
					hdev->conn_info_min_age);

	/* Query controller to refresh cached values if they are too old or were
	 * never read.
	 */
5318 5319
	if (time_after(jiffies, conn->conn_info_timestamp +
		       msecs_to_jiffies(conn_info_age)) ||
5320 5321 5322 5323
	    !conn->conn_info_timestamp) {
		struct hci_request req;
		struct hci_cp_read_tx_power req_txp_cp;
		struct hci_cp_read_rssi req_rssi_cp;
5324
		struct mgmt_pending_cmd *cmd;
5325 5326 5327 5328 5329 5330

		hci_req_init(&req, hdev);
		req_rssi_cp.handle = cpu_to_le16(conn->handle);
		hci_req_add(&req, HCI_OP_READ_RSSI, sizeof(req_rssi_cp),
			    &req_rssi_cp);

5331 5332 5333 5334 5335 5336 5337 5338 5339 5340
		/* For LE links TX power does not change thus we don't need to
		 * query for it once value is known.
		 */
		if (!bdaddr_type_is_le(cp->addr.type) ||
		    conn->tx_power == HCI_TX_POWER_INVALID) {
			req_txp_cp.handle = cpu_to_le16(conn->handle);
			req_txp_cp.type = 0x00;
			hci_req_add(&req, HCI_OP_READ_TX_POWER,
				    sizeof(req_txp_cp), &req_txp_cp);
		}
5341

5342 5343 5344 5345 5346 5347 5348 5349
		/* Max TX power needs to be read only once per connection */
		if (conn->max_tx_power == HCI_TX_POWER_INVALID) {
			req_txp_cp.handle = cpu_to_le16(conn->handle);
			req_txp_cp.type = 0x01;
			hci_req_add(&req, HCI_OP_READ_TX_POWER,
				    sizeof(req_txp_cp), &req_txp_cp);
		}

5350 5351 5352 5353 5354 5355 5356 5357 5358 5359 5360 5361
		err = hci_req_run(&req, conn_info_refresh_complete);
		if (err < 0)
			goto unlock;

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

		hci_conn_hold(conn);
5362
		cmd->user_data = hci_conn_get(conn);
5363
		cmd->cmd_complete = conn_info_cmd_complete;
5364 5365 5366 5367 5368 5369

		conn->conn_info_timestamp = jiffies;
	} else {
		/* Cache is valid, just reply with values cached in hci_conn */
		rp.rssi = conn->rssi;
		rp.tx_power = conn->tx_power;
5370
		rp.max_tx_power = conn->max_tx_power;
5371

5372 5373
		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONN_INFO,
					MGMT_STATUS_SUCCESS, &rp, sizeof(rp));
5374 5375 5376 5377 5378 5379 5380
	}

unlock:
	hci_dev_unlock(hdev);
	return err;
}

5381
static int clock_info_cmd_complete(struct mgmt_pending_cmd *cmd, u8 status)
5382
{
5383
	struct hci_conn *conn = cmd->user_data;
5384
	struct mgmt_rp_get_clock_info rp;
5385
	struct hci_dev *hdev;
5386
	int err;
5387 5388

	memset(&rp, 0, sizeof(rp));
5389
	memcpy(&rp.addr, cmd->param, sizeof(rp.addr));
5390 5391 5392 5393 5394 5395 5396 5397 5398 5399 5400 5401 5402 5403 5404 5405

	if (status)
		goto complete;

	hdev = hci_dev_get(cmd->index);
	if (hdev) {
		rp.local_clock = cpu_to_le32(hdev->clock);
		hci_dev_put(hdev);
	}

	if (conn) {
		rp.piconet_clock = cpu_to_le32(conn->clock);
		rp.accuracy = cpu_to_le16(conn->clock_accuracy);
	}

complete:
5406 5407
	err = mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, status, &rp,
				sizeof(rp));
5408 5409 5410 5411 5412

	if (conn) {
		hci_conn_drop(conn);
		hci_conn_put(conn);
	}
5413 5414

	return err;
5415 5416
}

5417
static void get_clock_info_complete(struct hci_dev *hdev, u8 status, u16 opcode)
5418
{
5419
	struct hci_cp_read_clock *hci_cp;
5420
	struct mgmt_pending_cmd *cmd;
5421 5422 5423 5424 5425 5426 5427 5428 5429 5430 5431 5432 5433 5434 5435 5436 5437
	struct hci_conn *conn;

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

	hci_dev_lock(hdev);

	hci_cp = hci_sent_cmd_data(hdev, HCI_OP_READ_CLOCK);
	if (!hci_cp)
		goto unlock;

	if (hci_cp->which) {
		u16 handle = __le16_to_cpu(hci_cp->handle);
		conn = hci_conn_hash_lookup_handle(hdev, handle);
	} else {
		conn = NULL;
	}

5438
	cmd = pending_find_data(MGMT_OP_GET_CLOCK_INFO, hdev, conn);
5439 5440 5441
	if (!cmd)
		goto unlock;

5442
	cmd->cmd_complete(cmd, mgmt_status(status));
5443 5444 5445 5446 5447 5448 5449 5450 5451 5452 5453 5454
	mgmt_pending_remove(cmd);

unlock:
	hci_dev_unlock(hdev);
}

static int get_clock_info(struct sock *sk, struct hci_dev *hdev, void *data,
			 u16 len)
{
	struct mgmt_cp_get_clock_info *cp = data;
	struct mgmt_rp_get_clock_info rp;
	struct hci_cp_read_clock hci_cp;
5455
	struct mgmt_pending_cmd *cmd;
5456 5457 5458 5459 5460 5461 5462 5463 5464 5465 5466
	struct hci_request req;
	struct hci_conn *conn;
	int err;

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

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

	if (cp->addr.type != BDADDR_BREDR)
5467 5468 5469
		return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CLOCK_INFO,
					 MGMT_STATUS_INVALID_PARAMS,
					 &rp, sizeof(rp));
5470 5471 5472 5473

	hci_dev_lock(hdev);

	if (!hdev_is_powered(hdev)) {
5474 5475 5476
		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CLOCK_INFO,
					MGMT_STATUS_NOT_POWERED, &rp,
					sizeof(rp));
5477 5478 5479 5480 5481 5482 5483
		goto unlock;
	}

	if (bacmp(&cp->addr.bdaddr, BDADDR_ANY)) {
		conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK,
					       &cp->addr.bdaddr);
		if (!conn || conn->state != BT_CONNECTED) {
5484 5485 5486 5487
			err = mgmt_cmd_complete(sk, hdev->id,
						MGMT_OP_GET_CLOCK_INFO,
						MGMT_STATUS_NOT_CONNECTED,
						&rp, sizeof(rp));
5488 5489 5490 5491 5492 5493 5494 5495 5496 5497 5498 5499
			goto unlock;
		}
	} else {
		conn = NULL;
	}

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

5500 5501
	cmd->cmd_complete = clock_info_cmd_complete;

5502 5503 5504 5505 5506 5507 5508
	hci_req_init(&req, hdev);

	memset(&hci_cp, 0, sizeof(hci_cp));
	hci_req_add(&req, HCI_OP_READ_CLOCK, sizeof(hci_cp), &hci_cp);

	if (conn) {
		hci_conn_hold(conn);
5509
		cmd->user_data = hci_conn_get(conn);
5510 5511 5512 5513 5514 5515 5516 5517 5518 5519 5520 5521 5522 5523 5524

		hci_cp.handle = cpu_to_le16(conn->handle);
		hci_cp.which = 0x01; /* Piconet clock */
		hci_req_add(&req, HCI_OP_READ_CLOCK, sizeof(hci_cp), &hci_cp);
	}

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

unlock:
	hci_dev_unlock(hdev);
	return err;
}

5525 5526 5527 5528 5529 5530 5531 5532 5533 5534 5535 5536 5537 5538 5539 5540 5541 5542
static bool is_connected(struct hci_dev *hdev, bdaddr_t *addr, u8 type)
{
	struct hci_conn *conn;

	conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, addr);
	if (!conn)
		return false;

	if (conn->dst_type != type)
		return false;

	if (conn->state != BT_CONNECTED)
		return false;

	return true;
}

/* This function requires the caller holds hdev->lock */
5543
static int hci_conn_params_set(struct hci_dev *hdev, bdaddr_t *addr,
5544 5545 5546 5547 5548 5549 5550 5551 5552 5553 5554 5555 5556 5557 5558 5559
			       u8 addr_type, u8 auto_connect)
{
	struct hci_conn_params *params;

	params = hci_conn_params_add(hdev, addr, addr_type);
	if (!params)
		return -EIO;

	if (params->auto_connect == auto_connect)
		return 0;

	list_del_init(&params->action);

	switch (auto_connect) {
	case HCI_AUTO_CONN_DISABLED:
	case HCI_AUTO_CONN_LINK_LOSS:
5560 5561 5562 5563 5564
		/* If auto connect is being disabled when we're trying to
		 * connect to device, keep connecting.
		 */
		if (params->explicit_connect)
			list_add(&params->action, &hdev->pend_le_conns);
5565 5566
		break;
	case HCI_AUTO_CONN_REPORT:
5567 5568 5569 5570
		if (params->explicit_connect)
			list_add(&params->action, &hdev->pend_le_conns);
		else
			list_add(&params->action, &hdev->pend_le_reports);
5571 5572 5573
		break;
	case HCI_AUTO_CONN_DIRECT:
	case HCI_AUTO_CONN_ALWAYS:
5574
		if (!is_connected(hdev, addr, addr_type))
5575 5576 5577 5578 5579 5580 5581 5582 5583 5584 5585 5586
			list_add(&params->action, &hdev->pend_le_conns);
		break;
	}

	params->auto_connect = auto_connect;

	BT_DBG("addr %pMR (type %u) auto_connect %u", addr, addr_type,
	       auto_connect);

	return 0;
}

5587 5588 5589 5590 5591 5592 5593 5594 5595 5596 5597 5598
static void device_added(struct sock *sk, struct hci_dev *hdev,
			 bdaddr_t *bdaddr, u8 type, u8 action)
{
	struct mgmt_ev_device_added ev;

	bacpy(&ev.addr.bdaddr, bdaddr);
	ev.addr.type = type;
	ev.action = action;

	mgmt_event(MGMT_EV_DEVICE_ADDED, hdev, &ev, sizeof(ev), sk);
}

5599 5600 5601 5602 5603 5604 5605 5606 5607
static int add_device(struct sock *sk, struct hci_dev *hdev,
		      void *data, u16 len)
{
	struct mgmt_cp_add_device *cp = data;
	u8 auto_conn, addr_type;
	int err;

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

5608
	if (!bdaddr_type_is_valid(cp->addr.type) ||
5609
	    !bacmp(&cp->addr.bdaddr, BDADDR_ANY))
5610 5611 5612
		return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_DEVICE,
					 MGMT_STATUS_INVALID_PARAMS,
					 &cp->addr, sizeof(cp->addr));
5613

5614
	if (cp->action != 0x00 && cp->action != 0x01 && cp->action != 0x02)
5615 5616 5617
		return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_DEVICE,
					 MGMT_STATUS_INVALID_PARAMS,
					 &cp->addr, sizeof(cp->addr));
5618 5619 5620

	hci_dev_lock(hdev);

5621
	if (cp->addr.type == BDADDR_BREDR) {
5622
		/* Only incoming connections action is supported for now */
5623
		if (cp->action != 0x01) {
5624 5625 5626 5627
			err = mgmt_cmd_complete(sk, hdev->id,
						MGMT_OP_ADD_DEVICE,
						MGMT_STATUS_INVALID_PARAMS,
						&cp->addr, sizeof(cp->addr));
5628 5629 5630 5631 5632 5633 5634
			goto unlock;
		}

		err = hci_bdaddr_list_add(&hdev->whitelist, &cp->addr.bdaddr,
					  cp->addr.type);
		if (err)
			goto unlock;
5635

5636
		hci_req_update_scan(hdev);
5637

5638 5639 5640
		goto added;
	}

5641
	addr_type = le_addr_type(cp->addr.type);
5642

5643
	if (cp->action == 0x02)
5644
		auto_conn = HCI_AUTO_CONN_ALWAYS;
5645 5646
	else if (cp->action == 0x01)
		auto_conn = HCI_AUTO_CONN_DIRECT;
5647
	else
5648
		auto_conn = HCI_AUTO_CONN_REPORT;
5649

5650 5651 5652 5653 5654 5655
	/* Kernel internally uses conn_params with resolvable private
	 * address, but Add Device allows only identity addresses.
	 * Make sure it is enforced before calling
	 * hci_conn_params_lookup.
	 */
	if (!hci_is_identity_address(&cp->addr.bdaddr, addr_type)) {
5656 5657 5658
		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_DEVICE,
					MGMT_STATUS_INVALID_PARAMS,
					&cp->addr, sizeof(cp->addr));
5659 5660 5661
		goto unlock;
	}

5662 5663 5664
	/* If the connection parameters don't exist for this device,
	 * they will be created and configured with defaults.
	 */
5665
	if (hci_conn_params_set(hdev, &cp->addr.bdaddr, addr_type,
5666
				auto_conn) < 0) {
5667 5668 5669
		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_DEVICE,
					MGMT_STATUS_FAILED, &cp->addr,
					sizeof(cp->addr));
5670 5671 5672
		goto unlock;
	}

5673 5674
	hci_update_background_scan(hdev);

5675
added:
5676 5677
	device_added(sk, hdev, &cp->addr.bdaddr, cp->addr.type, cp->action);

5678 5679 5680
	err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_DEVICE,
				MGMT_STATUS_SUCCESS, &cp->addr,
				sizeof(cp->addr));
5681 5682 5683 5684 5685 5686

unlock:
	hci_dev_unlock(hdev);
	return err;
}

5687 5688 5689 5690 5691 5692 5693 5694 5695 5696 5697
static void device_removed(struct sock *sk, struct hci_dev *hdev,
			   bdaddr_t *bdaddr, u8 type)
{
	struct mgmt_ev_device_removed ev;

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

	mgmt_event(MGMT_EV_DEVICE_REMOVED, hdev, &ev, sizeof(ev), sk);
}

5698 5699 5700 5701 5702 5703 5704 5705 5706 5707 5708
static int remove_device(struct sock *sk, struct hci_dev *hdev,
			 void *data, u16 len)
{
	struct mgmt_cp_remove_device *cp = data;
	int err;

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

	hci_dev_lock(hdev);

	if (bacmp(&cp->addr.bdaddr, BDADDR_ANY)) {
5709
		struct hci_conn_params *params;
5710 5711
		u8 addr_type;

5712
		if (!bdaddr_type_is_valid(cp->addr.type)) {
5713 5714 5715 5716
			err = mgmt_cmd_complete(sk, hdev->id,
						MGMT_OP_REMOVE_DEVICE,
						MGMT_STATUS_INVALID_PARAMS,
						&cp->addr, sizeof(cp->addr));
5717 5718 5719
			goto unlock;
		}

5720 5721 5722 5723 5724
		if (cp->addr.type == BDADDR_BREDR) {
			err = hci_bdaddr_list_del(&hdev->whitelist,
						  &cp->addr.bdaddr,
						  cp->addr.type);
			if (err) {
5725 5726 5727 5728 5729
				err = mgmt_cmd_complete(sk, hdev->id,
							MGMT_OP_REMOVE_DEVICE,
							MGMT_STATUS_INVALID_PARAMS,
							&cp->addr,
							sizeof(cp->addr));
5730 5731 5732
				goto unlock;
			}

5733
			hci_req_update_scan(hdev);
5734

5735 5736 5737 5738 5739
			device_removed(sk, hdev, &cp->addr.bdaddr,
				       cp->addr.type);
			goto complete;
		}

5740
		addr_type = le_addr_type(cp->addr.type);
5741

5742 5743 5744 5745 5746 5747
		/* Kernel internally uses conn_params with resolvable private
		 * address, but Remove Device allows only identity addresses.
		 * Make sure it is enforced before calling
		 * hci_conn_params_lookup.
		 */
		if (!hci_is_identity_address(&cp->addr.bdaddr, addr_type)) {
5748 5749 5750 5751
			err = mgmt_cmd_complete(sk, hdev->id,
						MGMT_OP_REMOVE_DEVICE,
						MGMT_STATUS_INVALID_PARAMS,
						&cp->addr, sizeof(cp->addr));
5752 5753 5754
			goto unlock;
		}

5755 5756 5757
		params = hci_conn_params_lookup(hdev, &cp->addr.bdaddr,
						addr_type);
		if (!params) {
5758 5759 5760 5761
			err = mgmt_cmd_complete(sk, hdev->id,
						MGMT_OP_REMOVE_DEVICE,
						MGMT_STATUS_INVALID_PARAMS,
						&cp->addr, sizeof(cp->addr));
5762 5763 5764
			goto unlock;
		}

5765 5766
		if (params->auto_connect == HCI_AUTO_CONN_DISABLED ||
		    params->auto_connect == HCI_AUTO_CONN_EXPLICIT) {
5767 5768 5769 5770
			err = mgmt_cmd_complete(sk, hdev->id,
						MGMT_OP_REMOVE_DEVICE,
						MGMT_STATUS_INVALID_PARAMS,
						&cp->addr, sizeof(cp->addr));
5771 5772 5773
			goto unlock;
		}

5774
		list_del(&params->action);
5775 5776
		list_del(&params->list);
		kfree(params);
5777
		hci_update_background_scan(hdev);
5778 5779

		device_removed(sk, hdev, &cp->addr.bdaddr, cp->addr.type);
5780
	} else {
5781
		struct hci_conn_params *p, *tmp;
5782
		struct bdaddr_list *b, *btmp;
5783

5784
		if (cp->addr.type) {
5785 5786 5787 5788
			err = mgmt_cmd_complete(sk, hdev->id,
						MGMT_OP_REMOVE_DEVICE,
						MGMT_STATUS_INVALID_PARAMS,
						&cp->addr, sizeof(cp->addr));
5789 5790 5791
			goto unlock;
		}

5792 5793 5794 5795 5796 5797
		list_for_each_entry_safe(b, btmp, &hdev->whitelist, list) {
			device_removed(sk, hdev, &b->bdaddr, b->bdaddr_type);
			list_del(&b->list);
			kfree(b);
		}

5798
		hci_req_update_scan(hdev);
5799

5800 5801 5802 5803
		list_for_each_entry_safe(p, tmp, &hdev->le_conn_params, list) {
			if (p->auto_connect == HCI_AUTO_CONN_DISABLED)
				continue;
			device_removed(sk, hdev, &p->addr, p->addr_type);
5804 5805 5806 5807
			if (p->explicit_connect) {
				p->auto_connect = HCI_AUTO_CONN_EXPLICIT;
				continue;
			}
5808 5809 5810 5811 5812 5813 5814
			list_del(&p->action);
			list_del(&p->list);
			kfree(p);
		}

		BT_DBG("All LE connection parameters were removed");

5815
		hci_update_background_scan(hdev);
5816 5817
	}

5818
complete:
5819 5820 5821
	err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_DEVICE,
				MGMT_STATUS_SUCCESS, &cp->addr,
				sizeof(cp->addr));
5822 5823 5824 5825 5826
unlock:
	hci_dev_unlock(hdev);
	return err;
}

5827 5828 5829 5830
static int load_conn_param(struct sock *sk, struct hci_dev *hdev, void *data,
			   u16 len)
{
	struct mgmt_cp_load_conn_param *cp = data;
5831 5832
	const u16 max_param_count = ((U16_MAX - sizeof(*cp)) /
				     sizeof(struct mgmt_conn_param));
5833 5834 5835 5836
	u16 param_count, expected_len;
	int i;

	if (!lmp_le_capable(hdev))
5837 5838
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_CONN_PARAM,
				       MGMT_STATUS_NOT_SUPPORTED);
5839 5840

	param_count = __le16_to_cpu(cp->param_count);
5841
	if (param_count > max_param_count) {
5842 5843
		bt_dev_err(hdev, "load_conn_param: too big param_count value %u",
			   param_count);
5844 5845
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_CONN_PARAM,
				       MGMT_STATUS_INVALID_PARAMS);
5846
	}
5847 5848 5849 5850

	expected_len = sizeof(*cp) + param_count *
					sizeof(struct mgmt_conn_param);
	if (expected_len != len) {
5851 5852
		bt_dev_err(hdev, "load_conn_param: expected %u bytes, got %u bytes",
			   expected_len, len);
5853 5854
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_CONN_PARAM,
				       MGMT_STATUS_INVALID_PARAMS);
5855 5856 5857 5858 5859 5860 5861 5862 5863 5864 5865 5866 5867 5868 5869 5870 5871 5872 5873 5874 5875 5876
	}

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

	hci_dev_lock(hdev);

	hci_conn_params_clear_disabled(hdev);

	for (i = 0; i < param_count; i++) {
		struct mgmt_conn_param *param = &cp->params[i];
		struct hci_conn_params *hci_param;
		u16 min, max, latency, timeout;
		u8 addr_type;

		BT_DBG("Adding %pMR (type %u)", &param->addr.bdaddr,
		       param->addr.type);

		if (param->addr.type == BDADDR_LE_PUBLIC) {
			addr_type = ADDR_LE_DEV_PUBLIC;
		} else if (param->addr.type == BDADDR_LE_RANDOM) {
			addr_type = ADDR_LE_DEV_RANDOM;
		} else {
5877
			bt_dev_err(hdev, "ignoring invalid connection parameters");
5878 5879 5880 5881 5882 5883 5884 5885 5886 5887 5888 5889
			continue;
		}

		min = le16_to_cpu(param->min_interval);
		max = le16_to_cpu(param->max_interval);
		latency = le16_to_cpu(param->latency);
		timeout = le16_to_cpu(param->timeout);

		BT_DBG("min 0x%04x max 0x%04x latency 0x%04x timeout 0x%04x",
		       min, max, latency, timeout);

		if (hci_check_conn_params(min, max, latency, timeout) < 0) {
5890
			bt_dev_err(hdev, "ignoring invalid connection parameters");
5891 5892 5893 5894 5895 5896
			continue;
		}

		hci_param = hci_conn_params_add(hdev, &param->addr.bdaddr,
						addr_type);
		if (!hci_param) {
5897
			bt_dev_err(hdev, "failed to add connection parameters");
5898 5899 5900 5901 5902 5903 5904 5905 5906 5907 5908
			continue;
		}

		hci_param->conn_min_interval = min;
		hci_param->conn_max_interval = max;
		hci_param->conn_latency = latency;
		hci_param->supervision_timeout = timeout;
	}

	hci_dev_unlock(hdev);

5909 5910
	return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_LOAD_CONN_PARAM, 0,
				 NULL, 0);
5911 5912
}

5913 5914 5915 5916 5917 5918 5919 5920 5921 5922
static int set_external_config(struct sock *sk, struct hci_dev *hdev,
			       void *data, u16 len)
{
	struct mgmt_cp_set_external_config *cp = data;
	bool changed;
	int err;

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

	if (hdev_is_powered(hdev))
5923 5924
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_EXTERNAL_CONFIG,
				       MGMT_STATUS_REJECTED);
5925 5926

	if (cp->config != 0x00 && cp->config != 0x01)
5927 5928
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_EXTERNAL_CONFIG,
				         MGMT_STATUS_INVALID_PARAMS);
5929 5930

	if (!test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks))
5931 5932
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_EXTERNAL_CONFIG,
				       MGMT_STATUS_NOT_SUPPORTED);
5933 5934 5935 5936

	hci_dev_lock(hdev);

	if (cp->config)
5937
		changed = !hci_dev_test_and_set_flag(hdev, HCI_EXT_CONFIGURED);
5938
	else
5939
		changed = hci_dev_test_and_clear_flag(hdev, HCI_EXT_CONFIGURED);
5940 5941 5942 5943 5944 5945 5946 5947

	err = send_options_rsp(sk, MGMT_OP_SET_EXTERNAL_CONFIG, hdev);
	if (err < 0)
		goto unlock;

	if (!changed)
		goto unlock;

5948 5949
	err = new_options(hdev, sk);

5950
	if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED) == is_configured(hdev)) {
5951
		mgmt_index_removed(hdev);
5952

5953
		if (hci_dev_test_and_change_flag(hdev, HCI_UNCONFIGURED)) {
5954 5955
			hci_dev_set_flag(hdev, HCI_CONFIG);
			hci_dev_set_flag(hdev, HCI_AUTO_OFF);
5956 5957 5958

			queue_work(hdev->req_workqueue, &hdev->power_on);
		} else {
5959
			set_bit(HCI_RAW, &hdev->flags);
5960 5961
			mgmt_index_added(hdev);
		}
5962 5963 5964 5965 5966 5967 5968
	}

unlock:
	hci_dev_unlock(hdev);
	return err;
}

5969 5970 5971 5972 5973 5974 5975 5976 5977 5978
static int set_public_address(struct sock *sk, struct hci_dev *hdev,
			      void *data, u16 len)
{
	struct mgmt_cp_set_public_address *cp = data;
	bool changed;
	int err;

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

	if (hdev_is_powered(hdev))
5979 5980
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PUBLIC_ADDRESS,
				       MGMT_STATUS_REJECTED);
5981 5982

	if (!bacmp(&cp->bdaddr, BDADDR_ANY))
5983 5984
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PUBLIC_ADDRESS,
				       MGMT_STATUS_INVALID_PARAMS);
5985 5986

	if (!hdev->set_bdaddr)
5987 5988
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PUBLIC_ADDRESS,
				       MGMT_STATUS_NOT_SUPPORTED);
5989 5990 5991 5992 5993 5994 5995 5996 5997 5998 5999 6000 6001

	hci_dev_lock(hdev);

	changed = !!bacmp(&hdev->public_addr, &cp->bdaddr);
	bacpy(&hdev->public_addr, &cp->bdaddr);

	err = send_options_rsp(sk, MGMT_OP_SET_PUBLIC_ADDRESS, hdev);
	if (err < 0)
		goto unlock;

	if (!changed)
		goto unlock;

6002
	if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED))
6003 6004 6005 6006 6007
		err = new_options(hdev, sk);

	if (is_configured(hdev)) {
		mgmt_index_removed(hdev);

6008
		hci_dev_clear_flag(hdev, HCI_UNCONFIGURED);
6009

6010 6011
		hci_dev_set_flag(hdev, HCI_CONFIG);
		hci_dev_set_flag(hdev, HCI_AUTO_OFF);
6012 6013 6014 6015 6016 6017 6018 6019 6020

		queue_work(hdev->req_workqueue, &hdev->power_on);
	}

unlock:
	hci_dev_unlock(hdev);
	return err;
}

6021 6022 6023 6024 6025 6026 6027 6028 6029 6030 6031 6032 6033 6034 6035 6036 6037 6038 6039 6040 6041 6042 6043 6044 6045 6046 6047 6048 6049 6050 6051 6052 6053 6054 6055 6056 6057 6058 6059 6060 6061 6062 6063 6064 6065 6066 6067 6068 6069 6070 6071 6072 6073 6074 6075 6076 6077 6078 6079 6080 6081 6082 6083 6084 6085 6086 6087 6088 6089 6090 6091 6092 6093 6094 6095 6096 6097 6098 6099 6100 6101 6102 6103 6104 6105 6106 6107 6108 6109 6110 6111 6112 6113 6114 6115 6116 6117 6118 6119 6120 6121 6122 6123 6124 6125 6126 6127 6128 6129 6130 6131 6132 6133 6134 6135 6136 6137 6138 6139 6140 6141 6142 6143 6144 6145 6146 6147 6148 6149 6150 6151 6152 6153 6154 6155 6156 6157 6158 6159
static void read_local_oob_ext_data_complete(struct hci_dev *hdev, u8 status,
					     u16 opcode, struct sk_buff *skb)
{
	const struct mgmt_cp_read_local_oob_ext_data *mgmt_cp;
	struct mgmt_rp_read_local_oob_ext_data *mgmt_rp;
	u8 *h192, *r192, *h256, *r256;
	struct mgmt_pending_cmd *cmd;
	u16 eir_len;
	int err;

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

	cmd = pending_find(MGMT_OP_READ_LOCAL_OOB_EXT_DATA, hdev);
	if (!cmd)
		return;

	mgmt_cp = cmd->param;

	if (status) {
		status = mgmt_status(status);
		eir_len = 0;

		h192 = NULL;
		r192 = NULL;
		h256 = NULL;
		r256 = NULL;
	} else if (opcode == HCI_OP_READ_LOCAL_OOB_DATA) {
		struct hci_rp_read_local_oob_data *rp;

		if (skb->len != sizeof(*rp)) {
			status = MGMT_STATUS_FAILED;
			eir_len = 0;
		} else {
			status = MGMT_STATUS_SUCCESS;
			rp = (void *)skb->data;

			eir_len = 5 + 18 + 18;
			h192 = rp->hash;
			r192 = rp->rand;
			h256 = NULL;
			r256 = NULL;
		}
	} else {
		struct hci_rp_read_local_oob_ext_data *rp;

		if (skb->len != sizeof(*rp)) {
			status = MGMT_STATUS_FAILED;
			eir_len = 0;
		} else {
			status = MGMT_STATUS_SUCCESS;
			rp = (void *)skb->data;

			if (hci_dev_test_flag(hdev, HCI_SC_ONLY)) {
				eir_len = 5 + 18 + 18;
				h192 = NULL;
				r192 = NULL;
			} else {
				eir_len = 5 + 18 + 18 + 18 + 18;
				h192 = rp->hash192;
				r192 = rp->rand192;
			}

			h256 = rp->hash256;
			r256 = rp->rand256;
		}
	}

	mgmt_rp = kmalloc(sizeof(*mgmt_rp) + eir_len, GFP_KERNEL);
	if (!mgmt_rp)
		goto done;

	if (status)
		goto send_rsp;

	eir_len = eir_append_data(mgmt_rp->eir, 0, EIR_CLASS_OF_DEV,
				  hdev->dev_class, 3);

	if (h192 && r192) {
		eir_len = eir_append_data(mgmt_rp->eir, eir_len,
					  EIR_SSP_HASH_C192, h192, 16);
		eir_len = eir_append_data(mgmt_rp->eir, eir_len,
					  EIR_SSP_RAND_R192, r192, 16);
	}

	if (h256 && r256) {
		eir_len = eir_append_data(mgmt_rp->eir, eir_len,
					  EIR_SSP_HASH_C256, h256, 16);
		eir_len = eir_append_data(mgmt_rp->eir, eir_len,
					  EIR_SSP_RAND_R256, r256, 16);
	}

send_rsp:
	mgmt_rp->type = mgmt_cp->type;
	mgmt_rp->eir_len = cpu_to_le16(eir_len);

	err = mgmt_cmd_complete(cmd->sk, hdev->id,
				MGMT_OP_READ_LOCAL_OOB_EXT_DATA, status,
				mgmt_rp, sizeof(*mgmt_rp) + eir_len);
	if (err < 0 || status)
		goto done;

	hci_sock_set_flag(cmd->sk, HCI_MGMT_OOB_DATA_EVENTS);

	err = mgmt_limited_event(MGMT_EV_LOCAL_OOB_DATA_UPDATED, hdev,
				 mgmt_rp, sizeof(*mgmt_rp) + eir_len,
				 HCI_MGMT_OOB_DATA_EVENTS, cmd->sk);
done:
	kfree(mgmt_rp);
	mgmt_pending_remove(cmd);
}

static int read_local_ssp_oob_req(struct hci_dev *hdev, struct sock *sk,
				  struct mgmt_cp_read_local_oob_ext_data *cp)
{
	struct mgmt_pending_cmd *cmd;
	struct hci_request req;
	int err;

	cmd = mgmt_pending_add(sk, MGMT_OP_READ_LOCAL_OOB_EXT_DATA, hdev,
			       cp, sizeof(*cp));
	if (!cmd)
		return -ENOMEM;

	hci_req_init(&req, hdev);

	if (bredr_sc_enabled(hdev))
		hci_req_add(&req, HCI_OP_READ_LOCAL_OOB_EXT_DATA, 0, NULL);
	else
		hci_req_add(&req, HCI_OP_READ_LOCAL_OOB_DATA, 0, NULL);

	err = hci_req_run_skb(&req, read_local_oob_ext_data_complete);
	if (err < 0) {
		mgmt_pending_remove(cmd);
		return err;
	}

	return 0;
}

6160 6161 6162 6163 6164 6165 6166
static int read_local_oob_ext_data(struct sock *sk, struct hci_dev *hdev,
				   void *data, u16 data_len)
{
	struct mgmt_cp_read_local_oob_ext_data *cp = data;
	struct mgmt_rp_read_local_oob_ext_data *rp;
	size_t rp_len;
	u16 eir_len;
6167
	u8 status, flags, role, addr[7], hash[16], rand[16];
6168 6169 6170 6171
	int err;

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

6172 6173 6174 6175 6176 6177 6178 6179 6180 6181 6182 6183 6184 6185 6186 6187 6188 6189 6190 6191 6192 6193 6194 6195
	if (hdev_is_powered(hdev)) {
		switch (cp->type) {
		case BIT(BDADDR_BREDR):
			status = mgmt_bredr_support(hdev);
			if (status)
				eir_len = 0;
			else
				eir_len = 5;
			break;
		case (BIT(BDADDR_LE_PUBLIC) | BIT(BDADDR_LE_RANDOM)):
			status = mgmt_le_support(hdev);
			if (status)
				eir_len = 0;
			else
				eir_len = 9 + 3 + 18 + 18 + 3;
			break;
		default:
			status = MGMT_STATUS_INVALID_PARAMS;
			eir_len = 0;
			break;
		}
	} else {
		status = MGMT_STATUS_NOT_POWERED;
		eir_len = 0;
6196 6197 6198 6199
	}

	rp_len = sizeof(*rp) + eir_len;
	rp = kmalloc(rp_len, GFP_ATOMIC);
6200
	if (!rp)
6201
		return -ENOMEM;
6202

6203 6204 6205
	if (status)
		goto complete;

6206
	hci_dev_lock(hdev);
6207 6208 6209 6210

	eir_len = 0;
	switch (cp->type) {
	case BIT(BDADDR_BREDR):
6211 6212 6213 6214 6215 6216 6217 6218 6219 6220 6221 6222 6223
		if (hci_dev_test_flag(hdev, HCI_SSP_ENABLED)) {
			err = read_local_ssp_oob_req(hdev, sk, cp);
			hci_dev_unlock(hdev);
			if (!err)
				goto done;

			status = MGMT_STATUS_FAILED;
			goto complete;
		} else {
			eir_len = eir_append_data(rp->eir, eir_len,
						  EIR_CLASS_OF_DEV,
						  hdev->dev_class, 3);
		}
6224 6225
		break;
	case (BIT(BDADDR_LE_PUBLIC) | BIT(BDADDR_LE_RANDOM)):
6226 6227
		if (hci_dev_test_flag(hdev, HCI_SC_ENABLED) &&
		    smp_generate_oob(hdev, hash, rand) < 0) {
6228
			hci_dev_unlock(hdev);
6229 6230
			status = MGMT_STATUS_FAILED;
			goto complete;
6231 6232
		}

6233 6234 6235 6236 6237 6238 6239 6240 6241 6242
		/* This should return the active RPA, but since the RPA
		 * is only programmed on demand, it is really hard to fill
		 * this in at the moment. For now disallow retrieving
		 * local out-of-band data when privacy is in use.
		 *
		 * Returning the identity address will not help here since
		 * pairing happens before the identity resolving key is
		 * known and thus the connection establishment happens
		 * based on the RPA and not the identity address.
		 */
6243
		if (hci_dev_test_flag(hdev, HCI_PRIVACY)) {
6244 6245 6246 6247 6248 6249 6250 6251 6252
			hci_dev_unlock(hdev);
			status = MGMT_STATUS_REJECTED;
			goto complete;
		}

		if (hci_dev_test_flag(hdev, HCI_FORCE_STATIC_ADDR) ||
		   !bacmp(&hdev->bdaddr, BDADDR_ANY) ||
		   (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED) &&
		    bacmp(&hdev->static_addr, BDADDR_ANY))) {
6253 6254 6255 6256 6257 6258 6259 6260 6261 6262 6263 6264 6265 6266 6267 6268 6269 6270
			memcpy(addr, &hdev->static_addr, 6);
			addr[6] = 0x01;
		} else {
			memcpy(addr, &hdev->bdaddr, 6);
			addr[6] = 0x00;
		}

		eir_len = eir_append_data(rp->eir, eir_len, EIR_LE_BDADDR,
					  addr, sizeof(addr));

		if (hci_dev_test_flag(hdev, HCI_ADVERTISING))
			role = 0x02;
		else
			role = 0x01;

		eir_len = eir_append_data(rp->eir, eir_len, EIR_LE_ROLE,
					  &role, sizeof(role));

6271 6272 6273 6274
		if (hci_dev_test_flag(hdev, HCI_SC_ENABLED)) {
			eir_len = eir_append_data(rp->eir, eir_len,
						  EIR_LE_SC_CONFIRM,
						  hash, sizeof(hash));
6275

6276 6277 6278 6279
			eir_len = eir_append_data(rp->eir, eir_len,
						  EIR_LE_SC_RANDOM,
						  rand, sizeof(rand));
		}
6280

6281
		flags = mgmt_get_adv_discov_flags(hdev);
6282 6283 6284 6285 6286 6287 6288 6289 6290 6291 6292

		if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED))
			flags |= LE_AD_NO_BREDR;

		eir_len = eir_append_data(rp->eir, eir_len, EIR_FLAGS,
					  &flags, sizeof(flags));
		break;
	}

	hci_dev_unlock(hdev);

6293 6294
	hci_sock_set_flag(sk, HCI_MGMT_OOB_DATA_EVENTS);

6295 6296 6297
	status = MGMT_STATUS_SUCCESS;

complete:
6298 6299 6300
	rp->type = cp->type;
	rp->eir_len = cpu_to_le16(eir_len);

6301
	err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_EXT_DATA,
6302 6303
				status, rp, sizeof(*rp) + eir_len);
	if (err < 0 || status)
6304 6305 6306 6307 6308
		goto done;

	err = mgmt_limited_event(MGMT_EV_LOCAL_OOB_DATA_UPDATED, hdev,
				 rp, sizeof(*rp) + eir_len,
				 HCI_MGMT_OOB_DATA_EVENTS, sk);
6309

6310
done:
6311 6312 6313 6314 6315
	kfree(rp);

	return err;
}

6316 6317 6318 6319 6320 6321 6322 6323
static u32 get_supported_adv_flags(struct hci_dev *hdev)
{
	u32 flags = 0;

	flags |= MGMT_ADV_FLAG_CONNECTABLE;
	flags |= MGMT_ADV_FLAG_DISCOV;
	flags |= MGMT_ADV_FLAG_LIMITED_DISCOV;
	flags |= MGMT_ADV_FLAG_MANAGED_FLAGS;
6324
	flags |= MGMT_ADV_FLAG_APPEARANCE;
6325
	flags |= MGMT_ADV_FLAG_LOCAL_NAME;
6326

6327 6328 6329 6330 6331
	/* In extended adv TX_POWER returned from Set Adv Param
	 * will be always valid.
	 */
	if ((hdev->adv_tx_power != HCI_TX_POWER_INVALID) ||
	    ext_adv_capable(hdev))
6332 6333
		flags |= MGMT_ADV_FLAG_TX_POWER;

6334 6335 6336 6337 6338 6339 6340 6341 6342 6343
	if (ext_adv_capable(hdev)) {
		flags |= MGMT_ADV_FLAG_SEC_1M;

		if (hdev->le_features[1] & HCI_LE_PHY_2M)
			flags |= MGMT_ADV_FLAG_SEC_2M;

		if (hdev->le_features[1] & HCI_LE_PHY_CODED)
			flags |= MGMT_ADV_FLAG_SEC_CODED;
	}

6344 6345 6346
	return flags;
}

6347 6348 6349 6350 6351
static int read_adv_features(struct sock *sk, struct hci_dev *hdev,
			     void *data, u16 data_len)
{
	struct mgmt_rp_read_adv_features *rp;
	size_t rp_len;
6352
	int err;
6353
	struct adv_info *adv_instance;
6354
	u32 supported_flags;
6355
	u8 *instance;
6356 6357 6358

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

6359 6360 6361 6362
	if (!lmp_le_capable(hdev))
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_READ_ADV_FEATURES,
				       MGMT_STATUS_REJECTED);

6363 6364
	hci_dev_lock(hdev);

6365
	rp_len = sizeof(*rp) + hdev->adv_instance_cnt;
6366 6367 6368 6369 6370 6371
	rp = kmalloc(rp_len, GFP_ATOMIC);
	if (!rp) {
		hci_dev_unlock(hdev);
		return -ENOMEM;
	}

6372 6373 6374
	supported_flags = get_supported_adv_flags(hdev);

	rp->supported_flags = cpu_to_le32(supported_flags);
6375 6376
	rp->max_adv_data_len = HCI_MAX_AD_LENGTH;
	rp->max_scan_rsp_len = HCI_MAX_AD_LENGTH;
6377
	rp->max_instances = HCI_MAX_ADV_INSTANCES;
6378
	rp->num_instances = hdev->adv_instance_cnt;
6379

6380 6381 6382 6383
	instance = rp->instance;
	list_for_each_entry(adv_instance, &hdev->adv_instances, list) {
		*instance = adv_instance->instance;
		instance++;
6384
	}
6385 6386 6387 6388 6389 6390 6391 6392 6393 6394 6395

	hci_dev_unlock(hdev);

	err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_ADV_FEATURES,
				MGMT_STATUS_SUCCESS, rp, rp_len);

	kfree(rp);

	return err;
}

6396 6397 6398 6399 6400 6401 6402 6403 6404
static u8 calculate_name_len(struct hci_dev *hdev)
{
	u8 buf[HCI_MAX_SHORT_NAME_LENGTH + 3];

	return append_local_name(hdev, buf, 0);
}

static u8 tlv_data_max_len(struct hci_dev *hdev, u32 adv_flags,
			   bool is_adv_data)
6405
{
6406
	u8 max_len = HCI_MAX_AD_LENGTH;
6407

6408 6409 6410
	if (is_adv_data) {
		if (adv_flags & (MGMT_ADV_FLAG_DISCOV |
				 MGMT_ADV_FLAG_LIMITED_DISCOV |
6411
				 MGMT_ADV_FLAG_MANAGED_FLAGS))
6412
			max_len -= 3;
6413

6414
		if (adv_flags & MGMT_ADV_FLAG_TX_POWER)
6415
			max_len -= 3;
6416 6417
	} else {
		if (adv_flags & MGMT_ADV_FLAG_LOCAL_NAME)
6418
			max_len -= calculate_name_len(hdev);
6419

6420
		if (adv_flags & (MGMT_ADV_FLAG_APPEARANCE))
6421
			max_len -= 4;
6422 6423
	}

6424 6425 6426 6427 6428 6429 6430 6431 6432 6433 6434 6435 6436 6437 6438 6439 6440 6441 6442 6443 6444 6445 6446 6447 6448
	return max_len;
}

static bool flags_managed(u32 adv_flags)
{
	return adv_flags & (MGMT_ADV_FLAG_DISCOV |
			    MGMT_ADV_FLAG_LIMITED_DISCOV |
			    MGMT_ADV_FLAG_MANAGED_FLAGS);
}

static bool tx_power_managed(u32 adv_flags)
{
	return adv_flags & MGMT_ADV_FLAG_TX_POWER;
}

static bool name_managed(u32 adv_flags)
{
	return adv_flags & MGMT_ADV_FLAG_LOCAL_NAME;
}

static bool appearance_managed(u32 adv_flags)
{
	return adv_flags & MGMT_ADV_FLAG_APPEARANCE;
}

6449 6450
static bool tlv_data_is_valid(struct hci_dev *hdev, u32 adv_flags, u8 *data,
			      u8 len, bool is_adv_data)
6451 6452 6453 6454
{
	int i, cur_len;
	u8 max_len;

6455
	max_len = tlv_data_max_len(hdev, adv_flags, is_adv_data);
6456

6457
	if (len > max_len)
6458 6459
		return false;

6460 6461 6462
	/* Make sure that the data is correctly formatted. */
	for (i = 0, cur_len = 0; i < len; i += (cur_len + 1)) {
		cur_len = data[i];
6463

6464 6465
		if (data[i + 1] == EIR_FLAGS &&
		    (!is_adv_data || flags_managed(adv_flags)))
6466 6467 6468 6469 6470 6471 6472 6473 6474
			return false;

		if (data[i + 1] == EIR_TX_POWER && tx_power_managed(adv_flags))
			return false;

		if (data[i + 1] == EIR_NAME_COMPLETE && name_managed(adv_flags))
			return false;

		if (data[i + 1] == EIR_NAME_SHORT && name_managed(adv_flags))
6475 6476
			return false;

6477 6478
		if (data[i + 1] == EIR_APPEARANCE &&
		    appearance_managed(adv_flags))
6479 6480
			return false;

6481 6482 6483
		/* If the current field length would exceed the total data
		 * length, then it's invalid.
		 */
6484
		if (i + cur_len >= len)
6485 6486 6487 6488 6489 6490 6491 6492 6493 6494
			return false;
	}

	return true;
}

static void add_advertising_complete(struct hci_dev *hdev, u8 status,
				     u16 opcode)
{
	struct mgmt_pending_cmd *cmd;
6495
	struct mgmt_cp_add_advertising *cp;
6496
	struct mgmt_rp_add_advertising rp;
6497 6498
	struct adv_info *adv_instance, *n;
	u8 instance;
6499 6500 6501 6502 6503 6504 6505

	BT_DBG("status %d", status);

	hci_dev_lock(hdev);

	cmd = pending_find(MGMT_OP_ADD_ADVERTISING, hdev);

6506 6507 6508 6509 6510 6511 6512 6513 6514 6515 6516 6517 6518 6519 6520
	list_for_each_entry_safe(adv_instance, n, &hdev->adv_instances, list) {
		if (!adv_instance->pending)
			continue;

		if (!status) {
			adv_instance->pending = false;
			continue;
		}

		instance = adv_instance->instance;

		if (hdev->cur_adv_instance == instance)
			cancel_adv_timeout(hdev);

		hci_remove_adv_instance(hdev, instance);
6521
		mgmt_advertising_removed(cmd ? cmd->sk : NULL, hdev, instance);
6522 6523 6524 6525 6526
	}

	if (!cmd)
		goto unlock;

6527 6528
	cp = cmd->param;
	rp.instance = cp->instance;
6529 6530 6531 6532 6533 6534 6535 6536 6537 6538 6539 6540 6541 6542 6543 6544 6545 6546 6547 6548

	if (status)
		mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode,
				mgmt_status(status));
	else
		mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode,
				  mgmt_status(status), &rp, sizeof(rp));

	mgmt_pending_remove(cmd);

unlock:
	hci_dev_unlock(hdev);
}

static int add_advertising(struct sock *sk, struct hci_dev *hdev,
			   void *data, u16 data_len)
{
	struct mgmt_cp_add_advertising *cp = data;
	struct mgmt_rp_add_advertising rp;
	u32 flags;
6549
	u32 supported_flags, phy_flags;
6550
	u8 status;
6551 6552 6553 6554
	u16 timeout, duration;
	unsigned int prev_instance_cnt = hdev->adv_instance_cnt;
	u8 schedule_instance = 0;
	struct adv_info *next_instance;
6555 6556 6557 6558 6559 6560 6561 6562 6563 6564 6565
	int err;
	struct mgmt_pending_cmd *cmd;
	struct hci_request req;

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

	status = mgmt_le_support(hdev);
	if (status)
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING,
				       status);

6566
	if (cp->instance < 1 || cp->instance > HCI_MAX_ADV_INSTANCES)
6567 6568 6569 6570
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING,
				       MGMT_STATUS_INVALID_PARAMS);

	if (data_len != sizeof(*cp) + cp->adv_data_len + cp->scan_rsp_len)
6571 6572 6573
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING,
				       MGMT_STATUS_INVALID_PARAMS);

6574
	flags = __le32_to_cpu(cp->flags);
6575
	timeout = __le16_to_cpu(cp->timeout);
6576
	duration = __le16_to_cpu(cp->duration);
6577

6578
	/* The current implementation only supports a subset of the specified
6579
	 * flags. Also need to check mutual exclusiveness of sec flags.
6580 6581
	 */
	supported_flags = get_supported_adv_flags(hdev);
6582 6583 6584
	phy_flags = flags & MGMT_ADV_FLAG_SEC_MASK;
	if (flags & ~supported_flags ||
	    ((phy_flags && (phy_flags ^ (phy_flags & -phy_flags)))))
6585 6586 6587 6588 6589
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING,
				       MGMT_STATUS_INVALID_PARAMS);

	hci_dev_lock(hdev);

6590 6591 6592 6593 6594 6595
	if (timeout && !hdev_is_powered(hdev)) {
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING,
				      MGMT_STATUS_REJECTED);
		goto unlock;
	}

6596
	if (pending_find(MGMT_OP_ADD_ADVERTISING, hdev) ||
6597
	    pending_find(MGMT_OP_REMOVE_ADVERTISING, hdev) ||
6598 6599 6600 6601 6602 6603
	    pending_find(MGMT_OP_SET_LE, hdev)) {
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING,
				      MGMT_STATUS_BUSY);
		goto unlock;
	}

6604 6605
	if (!tlv_data_is_valid(hdev, flags, cp->data, cp->adv_data_len, true) ||
	    !tlv_data_is_valid(hdev, flags, cp->data + cp->adv_data_len,
6606
			       cp->scan_rsp_len, false)) {
6607 6608 6609 6610 6611
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING,
				      MGMT_STATUS_INVALID_PARAMS);
		goto unlock;
	}

6612 6613 6614 6615 6616 6617 6618 6619 6620 6621
	err = hci_add_adv_instance(hdev, cp->instance, flags,
				   cp->adv_data_len, cp->data,
				   cp->scan_rsp_len,
				   cp->data + cp->adv_data_len,
				   timeout, duration);
	if (err < 0) {
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING,
				      MGMT_STATUS_FAILED);
		goto unlock;
	}
6622

6623 6624 6625 6626
	/* Only trigger an advertising added event if a new instance was
	 * actually added.
	 */
	if (hdev->adv_instance_cnt > prev_instance_cnt)
6627
		mgmt_advertising_added(sk, hdev, cp->instance);
6628

6629 6630 6631 6632 6633 6634 6635
	if (hdev->cur_adv_instance == cp->instance) {
		/* If the currently advertised instance is being changed then
		 * cancel the current advertising and schedule the next
		 * instance. If there is only one instance then the overridden
		 * advertising data will be visible right away.
		 */
		cancel_adv_timeout(hdev);
6636

6637 6638 6639 6640 6641 6642 6643 6644 6645
		next_instance = hci_get_next_instance(hdev, cp->instance);
		if (next_instance)
			schedule_instance = next_instance->instance;
	} else if (!hdev->adv_instance_timeout) {
		/* Immediately advertise the new instance if no other
		 * instance is currently being advertised.
		 */
		schedule_instance = cp->instance;
	}
6646

6647 6648 6649
	/* If the HCI_ADVERTISING flag is set or the device isn't powered or
	 * there is no instance to be advertised then we have no HCI
	 * communication to make. Simply return.
6650 6651
	 */
	if (!hdev_is_powered(hdev) ||
6652 6653 6654
	    hci_dev_test_flag(hdev, HCI_ADVERTISING) ||
	    !schedule_instance) {
		rp.instance = cp->instance;
6655 6656 6657 6658 6659 6660 6661 6662 6663 6664 6665 6666 6667 6668 6669 6670 6671
		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_ADVERTISING,
					MGMT_STATUS_SUCCESS, &rp, sizeof(rp));
		goto unlock;
	}

	/* We're good to go, update advertising data, parameters, and start
	 * advertising.
	 */
	cmd = mgmt_pending_add(sk, MGMT_OP_ADD_ADVERTISING, hdev, data,
			       data_len);
	if (!cmd) {
		err = -ENOMEM;
		goto unlock;
	}

	hci_req_init(&req, hdev);

6672
	err = __hci_req_schedule_adv_instance(&req, schedule_instance, true);
6673 6674 6675

	if (!err)
		err = hci_req_run(&req, add_advertising_complete);
6676 6677 6678 6679 6680 6681 6682 6683 6684 6685

	if (err < 0)
		mgmt_pending_remove(cmd);

unlock:
	hci_dev_unlock(hdev);

	return err;
}

6686 6687 6688 6689
static void remove_advertising_complete(struct hci_dev *hdev, u8 status,
					u16 opcode)
{
	struct mgmt_pending_cmd *cmd;
6690
	struct mgmt_cp_remove_advertising *cp;
6691 6692 6693 6694 6695 6696 6697 6698 6699 6700 6701 6702 6703 6704
	struct mgmt_rp_remove_advertising rp;

	BT_DBG("status %d", status);

	hci_dev_lock(hdev);

	/* A failure status here only means that we failed to disable
	 * advertising. Otherwise, the advertising instance has been removed,
	 * so report success.
	 */
	cmd = pending_find(MGMT_OP_REMOVE_ADVERTISING, hdev);
	if (!cmd)
		goto unlock;

6705 6706
	cp = cmd->param;
	rp.instance = cp->instance;
6707 6708 6709 6710 6711 6712 6713 6714 6715 6716 6717 6718 6719 6720 6721 6722

	mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, MGMT_STATUS_SUCCESS,
			  &rp, sizeof(rp));
	mgmt_pending_remove(cmd);

unlock:
	hci_dev_unlock(hdev);
}

static int remove_advertising(struct sock *sk, struct hci_dev *hdev,
			      void *data, u16 data_len)
{
	struct mgmt_cp_remove_advertising *cp = data;
	struct mgmt_rp_remove_advertising rp;
	struct mgmt_pending_cmd *cmd;
	struct hci_request req;
6723
	int err;
6724 6725 6726 6727 6728

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

	hci_dev_lock(hdev);

6729
	if (cp->instance && !hci_find_adv_instance(hdev, cp->instance)) {
6730 6731 6732 6733 6734 6735
		err = mgmt_cmd_status(sk, hdev->id,
				      MGMT_OP_REMOVE_ADVERTISING,
				      MGMT_STATUS_INVALID_PARAMS);
		goto unlock;
	}

6736 6737 6738 6739 6740 6741 6742 6743
	if (pending_find(MGMT_OP_ADD_ADVERTISING, hdev) ||
	    pending_find(MGMT_OP_REMOVE_ADVERTISING, hdev) ||
	    pending_find(MGMT_OP_SET_LE, hdev)) {
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_REMOVE_ADVERTISING,
				      MGMT_STATUS_BUSY);
		goto unlock;
	}

6744
	if (list_empty(&hdev->adv_instances)) {
6745 6746 6747 6748 6749
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_REMOVE_ADVERTISING,
				      MGMT_STATUS_INVALID_PARAMS);
		goto unlock;
	}

6750
	hci_req_init(&req, hdev);
6751

6752
	hci_req_clear_adv_instance(hdev, sk, &req, cp->instance, true);
6753

6754
	if (list_empty(&hdev->adv_instances))
6755
		__hci_req_disable_advertising(&req);
6756

6757 6758 6759
	/* If no HCI commands have been collected so far or the HCI_ADVERTISING
	 * flag is set or the device isn't powered then we have no HCI
	 * communication to make. Simply return.
6760
	 */
6761 6762
	if (skb_queue_empty(&req.cmd_q) ||
	    !hdev_is_powered(hdev) ||
6763
	    hci_dev_test_flag(hdev, HCI_ADVERTISING)) {
6764
		hci_req_purge(&req);
6765
		rp.instance = cp->instance;
6766 6767 6768 6769 6770 6771 6772 6773 6774 6775 6776 6777 6778 6779 6780 6781 6782 6783 6784 6785 6786 6787 6788
		err = mgmt_cmd_complete(sk, hdev->id,
					MGMT_OP_REMOVE_ADVERTISING,
					MGMT_STATUS_SUCCESS, &rp, sizeof(rp));
		goto unlock;
	}

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

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

unlock:
	hci_dev_unlock(hdev);

	return err;
}

6789 6790 6791 6792 6793 6794 6795 6796 6797 6798 6799 6800 6801 6802 6803 6804 6805 6806 6807 6808 6809 6810 6811 6812 6813 6814 6815 6816 6817 6818
static int get_adv_size_info(struct sock *sk, struct hci_dev *hdev,
			     void *data, u16 data_len)
{
	struct mgmt_cp_get_adv_size_info *cp = data;
	struct mgmt_rp_get_adv_size_info rp;
	u32 flags, supported_flags;
	int err;

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

	if (!lmp_le_capable(hdev))
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_GET_ADV_SIZE_INFO,
				       MGMT_STATUS_REJECTED);

	if (cp->instance < 1 || cp->instance > HCI_MAX_ADV_INSTANCES)
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_GET_ADV_SIZE_INFO,
				       MGMT_STATUS_INVALID_PARAMS);

	flags = __le32_to_cpu(cp->flags);

	/* The current implementation only supports a subset of the specified
	 * flags.
	 */
	supported_flags = get_supported_adv_flags(hdev);
	if (flags & ~supported_flags)
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_GET_ADV_SIZE_INFO,
				       MGMT_STATUS_INVALID_PARAMS);

	rp.instance = cp->instance;
	rp.flags = cp->flags;
6819 6820
	rp.max_adv_data_len = tlv_data_max_len(hdev, flags, true);
	rp.max_scan_rsp_len = tlv_data_max_len(hdev, flags, false);
6821 6822 6823 6824 6825 6826 6827

	err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_ADV_SIZE_INFO,
				MGMT_STATUS_SUCCESS, &rp, sizeof(rp));

	return err;
}

6828
static const struct hci_mgmt_handler mgmt_handlers[] = {
6829
	{ NULL }, /* 0x0000 (no command) */
6830
	{ read_version,            MGMT_READ_VERSION_SIZE,
6831 6832
						HCI_MGMT_NO_HDEV |
						HCI_MGMT_UNTRUSTED },
6833
	{ read_commands,           MGMT_READ_COMMANDS_SIZE,
6834 6835
						HCI_MGMT_NO_HDEV |
						HCI_MGMT_UNTRUSTED },
6836
	{ read_index_list,         MGMT_READ_INDEX_LIST_SIZE,
6837 6838 6839 6840
						HCI_MGMT_NO_HDEV |
						HCI_MGMT_UNTRUSTED },
	{ read_controller_info,    MGMT_READ_INFO_SIZE,
						HCI_MGMT_UNTRUSTED },
6841 6842 6843 6844 6845 6846 6847 6848 6849 6850 6851 6852 6853
	{ set_powered,             MGMT_SETTING_SIZE },
	{ set_discoverable,        MGMT_SET_DISCOVERABLE_SIZE },
	{ set_connectable,         MGMT_SETTING_SIZE },
	{ set_fast_connectable,    MGMT_SETTING_SIZE },
	{ set_bondable,            MGMT_SETTING_SIZE },
	{ set_link_security,       MGMT_SETTING_SIZE },
	{ set_ssp,                 MGMT_SETTING_SIZE },
	{ set_hs,                  MGMT_SETTING_SIZE },
	{ set_le,                  MGMT_SETTING_SIZE },
	{ set_dev_class,           MGMT_SET_DEV_CLASS_SIZE },
	{ set_local_name,          MGMT_SET_LOCAL_NAME_SIZE },
	{ add_uuid,                MGMT_ADD_UUID_SIZE },
	{ remove_uuid,             MGMT_REMOVE_UUID_SIZE },
6854 6855 6856 6857
	{ load_link_keys,          MGMT_LOAD_LINK_KEYS_SIZE,
						HCI_MGMT_VAR_LEN },
	{ load_long_term_keys,     MGMT_LOAD_LONG_TERM_KEYS_SIZE,
						HCI_MGMT_VAR_LEN },
6858 6859 6860 6861 6862 6863 6864 6865 6866 6867 6868 6869
	{ disconnect,              MGMT_DISCONNECT_SIZE },
	{ get_connections,         MGMT_GET_CONNECTIONS_SIZE },
	{ pin_code_reply,          MGMT_PIN_CODE_REPLY_SIZE },
	{ pin_code_neg_reply,      MGMT_PIN_CODE_NEG_REPLY_SIZE },
	{ set_io_capability,       MGMT_SET_IO_CAPABILITY_SIZE },
	{ pair_device,             MGMT_PAIR_DEVICE_SIZE },
	{ cancel_pair_device,      MGMT_CANCEL_PAIR_DEVICE_SIZE },
	{ unpair_device,           MGMT_UNPAIR_DEVICE_SIZE },
	{ user_confirm_reply,      MGMT_USER_CONFIRM_REPLY_SIZE },
	{ user_confirm_neg_reply,  MGMT_USER_CONFIRM_NEG_REPLY_SIZE },
	{ user_passkey_reply,      MGMT_USER_PASSKEY_REPLY_SIZE },
	{ user_passkey_neg_reply,  MGMT_USER_PASSKEY_NEG_REPLY_SIZE },
6870 6871 6872
	{ read_local_oob_data,     MGMT_READ_LOCAL_OOB_DATA_SIZE },
	{ add_remote_oob_data,     MGMT_ADD_REMOTE_OOB_DATA_SIZE,
						HCI_MGMT_VAR_LEN },
6873 6874 6875 6876 6877 6878 6879 6880 6881 6882 6883 6884 6885 6886
	{ remove_remote_oob_data,  MGMT_REMOVE_REMOTE_OOB_DATA_SIZE },
	{ start_discovery,         MGMT_START_DISCOVERY_SIZE },
	{ stop_discovery,          MGMT_STOP_DISCOVERY_SIZE },
	{ confirm_name,            MGMT_CONFIRM_NAME_SIZE },
	{ block_device,            MGMT_BLOCK_DEVICE_SIZE },
	{ unblock_device,          MGMT_UNBLOCK_DEVICE_SIZE },
	{ set_device_id,           MGMT_SET_DEVICE_ID_SIZE },
	{ set_advertising,         MGMT_SETTING_SIZE },
	{ set_bredr,               MGMT_SETTING_SIZE },
	{ set_static_address,      MGMT_SET_STATIC_ADDRESS_SIZE },
	{ set_scan_params,         MGMT_SET_SCAN_PARAMS_SIZE },
	{ set_secure_conn,         MGMT_SETTING_SIZE },
	{ set_debug_keys,          MGMT_SETTING_SIZE },
	{ set_privacy,             MGMT_SET_PRIVACY_SIZE },
6887 6888
	{ load_irks,               MGMT_LOAD_IRKS_SIZE,
						HCI_MGMT_VAR_LEN },
6889 6890 6891 6892
	{ get_conn_info,           MGMT_GET_CONN_INFO_SIZE },
	{ get_clock_info,          MGMT_GET_CLOCK_INFO_SIZE },
	{ add_device,              MGMT_ADD_DEVICE_SIZE },
	{ remove_device,           MGMT_REMOVE_DEVICE_SIZE },
6893 6894 6895
	{ load_conn_param,         MGMT_LOAD_CONN_PARAM_SIZE,
						HCI_MGMT_VAR_LEN },
	{ read_unconf_index_list,  MGMT_READ_UNCONF_INDEX_LIST_SIZE,
6896 6897
						HCI_MGMT_NO_HDEV |
						HCI_MGMT_UNTRUSTED },
6898
	{ read_config_info,        MGMT_READ_CONFIG_INFO_SIZE,
6899 6900
						HCI_MGMT_UNCONFIGURED |
						HCI_MGMT_UNTRUSTED },
6901 6902 6903 6904 6905 6906
	{ set_external_config,     MGMT_SET_EXTERNAL_CONFIG_SIZE,
						HCI_MGMT_UNCONFIGURED },
	{ set_public_address,      MGMT_SET_PUBLIC_ADDRESS_SIZE,
						HCI_MGMT_UNCONFIGURED },
	{ start_service_discovery, MGMT_START_SERVICE_DISCOVERY_SIZE,
						HCI_MGMT_VAR_LEN },
6907
	{ read_local_oob_ext_data, MGMT_READ_LOCAL_OOB_EXT_DATA_SIZE },
6908
	{ read_ext_index_list,     MGMT_READ_EXT_INDEX_LIST_SIZE,
6909 6910
						HCI_MGMT_NO_HDEV |
						HCI_MGMT_UNTRUSTED },
6911
	{ read_adv_features,       MGMT_READ_ADV_FEATURES_SIZE },
6912 6913
	{ add_advertising,	   MGMT_ADD_ADVERTISING_SIZE,
						HCI_MGMT_VAR_LEN },
6914
	{ remove_advertising,	   MGMT_REMOVE_ADVERTISING_SIZE },
6915
	{ get_adv_size_info,       MGMT_GET_ADV_SIZE_INFO_SIZE },
6916
	{ start_limited_discovery, MGMT_START_DISCOVERY_SIZE },
6917 6918
	{ read_ext_controller_info,MGMT_READ_EXT_INFO_SIZE,
						HCI_MGMT_UNTRUSTED },
6919
	{ set_appearance,	   MGMT_SET_APPEARANCE_SIZE },
6920
	{ get_phy_configuration,   MGMT_GET_PHY_CONFIGURATION_SIZE },
6921
	{ set_phy_configuration,   MGMT_SET_PHY_CONFIGURATION_SIZE },
6922 6923
};

6924
void mgmt_index_added(struct hci_dev *hdev)
6925
{
6926
	struct mgmt_ev_ext_index ev;
6927

6928 6929 6930
	if (test_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks))
		return;

6931
	switch (hdev->dev_type) {
6932
	case HCI_PRIMARY:
6933 6934 6935
		if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED)) {
			mgmt_index_event(MGMT_EV_UNCONF_INDEX_ADDED, hdev,
					 NULL, 0, HCI_MGMT_UNCONF_INDEX_EVENTS);
6936
			ev.type = 0x01;
6937 6938 6939
		} else {
			mgmt_index_event(MGMT_EV_INDEX_ADDED, hdev, NULL, 0,
					 HCI_MGMT_INDEX_EVENTS);
6940
			ev.type = 0x00;
6941 6942
		}
		break;
6943 6944 6945 6946 6947
	case HCI_AMP:
		ev.type = 0x02;
		break;
	default:
		return;
6948
	}
6949 6950 6951 6952 6953

	ev.bus = hdev->bus;

	mgmt_index_event(MGMT_EV_EXT_INDEX_ADDED, hdev, &ev, sizeof(ev),
			 HCI_MGMT_EXT_INDEX_EVENTS);
6954 6955
}

6956
void mgmt_index_removed(struct hci_dev *hdev)
6957
{
6958
	struct mgmt_ev_ext_index ev;
6959
	u8 status = MGMT_STATUS_INVALID_INDEX;
6960

6961 6962 6963
	if (test_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks))
		return;

6964
	switch (hdev->dev_type) {
6965
	case HCI_PRIMARY:
6966
		mgmt_pending_foreach(0, hdev, cmd_complete_rsp, &status);
6967

6968 6969 6970
		if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED)) {
			mgmt_index_event(MGMT_EV_UNCONF_INDEX_REMOVED, hdev,
					 NULL, 0, HCI_MGMT_UNCONF_INDEX_EVENTS);
6971
			ev.type = 0x01;
6972 6973 6974
		} else {
			mgmt_index_event(MGMT_EV_INDEX_REMOVED, hdev, NULL, 0,
					 HCI_MGMT_INDEX_EVENTS);
6975
			ev.type = 0x00;
6976 6977
		}
		break;
6978 6979 6980 6981 6982
	case HCI_AMP:
		ev.type = 0x02;
		break;
	default:
		return;
6983
	}
6984 6985 6986 6987 6988

	ev.bus = hdev->bus;

	mgmt_index_event(MGMT_EV_EXT_INDEX_REMOVED, hdev, &ev, sizeof(ev),
			 HCI_MGMT_EXT_INDEX_EVENTS);
6989 6990
}

6991
/* This function requires the caller holds hdev->lock */
6992
static void restart_le_actions(struct hci_dev *hdev)
6993 6994 6995 6996
{
	struct hci_conn_params *p;

	list_for_each_entry(p, &hdev->le_conn_params, list) {
6997 6998 6999 7000 7001 7002
		/* Needed for AUTO_OFF case where might not "really"
		 * have been powered off.
		 */
		list_del_init(&p->action);

		switch (p->auto_connect) {
7003
		case HCI_AUTO_CONN_DIRECT:
7004 7005 7006 7007 7008 7009 7010 7011
		case HCI_AUTO_CONN_ALWAYS:
			list_add(&p->action, &hdev->pend_le_conns);
			break;
		case HCI_AUTO_CONN_REPORT:
			list_add(&p->action, &hdev->pend_le_reports);
			break;
		default:
			break;
7012
		}
7013 7014 7015
	}
}

7016
void mgmt_power_on(struct hci_dev *hdev, int err)
7017 7018 7019
{
	struct cmd_lookup match = { NULL, hdev };

7020
	BT_DBG("err %d", err);
7021

7022 7023 7024
	hci_dev_lock(hdev);

	if (!err) {
7025 7026
		restart_le_actions(hdev);
		hci_update_background_scan(hdev);
7027 7028
	}

7029 7030 7031 7032 7033 7034 7035
	mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, settings_rsp, &match);

	new_settings(hdev, match.sk);

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

7036
	hci_dev_unlock(hdev);
7037
}
7038

7039
void __mgmt_power_off(struct hci_dev *hdev)
7040 7041
{
	struct cmd_lookup match = { NULL, hdev };
7042
	u8 status, zero_cod[] = { 0, 0, 0 };
7043

7044
	mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, settings_rsp, &match);
7045 7046 7047 7048 7049 7050 7051 7052

	/* If the power off is because of hdev unregistration let
	 * use the appropriate INVALID_INDEX status. Otherwise use
	 * NOT_POWERED. We cover both scenarios here since later in
	 * mgmt_index_removed() any hci_conn callbacks will have already
	 * been triggered, potentially causing misleading DISCONNECTED
	 * status responses.
	 */
7053
	if (hci_dev_test_flag(hdev, HCI_UNREGISTER))
7054 7055 7056 7057 7058
		status = MGMT_STATUS_INVALID_INDEX;
	else
		status = MGMT_STATUS_NOT_POWERED;

	mgmt_pending_foreach(0, hdev, cmd_complete_rsp, &status);
7059

7060
	if (memcmp(hdev->dev_class, zero_cod, sizeof(zero_cod)) != 0) {
7061 7062 7063
		mgmt_limited_event(MGMT_EV_CLASS_OF_DEV_CHANGED, hdev,
				   zero_cod, sizeof(zero_cod),
				   HCI_MGMT_DEV_CLASS_EVENTS, NULL);
7064 7065
		ext_info_changed(hdev, NULL);
	}
7066

7067
	new_settings(hdev, match.sk);
7068 7069 7070

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

7073
void mgmt_set_powered_failed(struct hci_dev *hdev, int err)
7074
{
7075
	struct mgmt_pending_cmd *cmd;
7076 7077
	u8 status;

7078
	cmd = pending_find(MGMT_OP_SET_POWERED, hdev);
7079
	if (!cmd)
7080
		return;
7081 7082 7083 7084 7085 7086

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

7087
	mgmt_cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_POWERED, status);
7088 7089 7090 7091

	mgmt_pending_remove(cmd);
}

7092 7093
void mgmt_new_link_key(struct hci_dev *hdev, struct link_key *key,
		       bool persistent)
7094
{
7095
	struct mgmt_ev_new_link_key ev;
7096

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

7099
	ev.store_hint = persistent;
7100
	bacpy(&ev.key.addr.bdaddr, &key->bdaddr);
7101
	ev.key.addr.type = BDADDR_BREDR;
7102
	ev.key.type = key->type;
7103
	memcpy(ev.key.val, key->val, HCI_LINK_KEY_SIZE);
7104
	ev.key.pin_len = key->pin_len;
7105

7106
	mgmt_event(MGMT_EV_NEW_LINK_KEY, hdev, &ev, sizeof(ev), NULL);
7107
}
7108

7109 7110
static u8 mgmt_ltk_type(struct smp_ltk *ltk)
{
7111 7112 7113 7114 7115 7116 7117 7118 7119 7120 7121 7122 7123
	switch (ltk->type) {
	case SMP_LTK:
	case SMP_LTK_SLAVE:
		if (ltk->authenticated)
			return MGMT_LTK_AUTHENTICATED;
		return MGMT_LTK_UNAUTHENTICATED;
	case SMP_LTK_P256:
		if (ltk->authenticated)
			return MGMT_LTK_P256_AUTH;
		return MGMT_LTK_P256_UNAUTH;
	case SMP_LTK_P256_DEBUG:
		return MGMT_LTK_P256_DEBUG;
	}
7124 7125 7126 7127

	return MGMT_LTK_UNAUTHENTICATED;
}

7128
void mgmt_new_ltk(struct hci_dev *hdev, struct smp_ltk *key, bool persistent)
7129 7130 7131 7132 7133
{
	struct mgmt_ev_new_long_term_key ev;

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

7134
	/* Devices using resolvable or non-resolvable random addresses
F
Florian Grandel 已提交
7135
	 * without providing an identity resolving key don't require
7136 7137 7138 7139 7140 7141 7142 7143 7144
	 * to store long term keys. Their addresses will change the
	 * next time around.
	 *
	 * Only when a remote device provides an identity address
	 * make sure the long term key is stored. If the remote
	 * identity is known, the long term keys are internally
	 * mapped to the identity address. So allow static random
	 * and public addresses here.
	 */
7145 7146 7147 7148
	if (key->bdaddr_type == ADDR_LE_DEV_RANDOM &&
	    (key->bdaddr.b[5] & 0xc0) != 0xc0)
		ev.store_hint = 0x00;
	else
7149
		ev.store_hint = persistent;
7150

7151
	bacpy(&ev.key.addr.bdaddr, &key->bdaddr);
7152
	ev.key.addr.type = link_to_bdaddr(LE_LINK, key->bdaddr_type);
7153
	ev.key.type = mgmt_ltk_type(key);
7154 7155
	ev.key.enc_size = key->enc_size;
	ev.key.ediv = key->ediv;
7156
	ev.key.rand = key->rand;
7157

7158
	if (key->type == SMP_LTK)
7159 7160
		ev.key.master = 1;

7161 7162 7163
	/* Make sure we copy only the significant bytes based on the
	 * encryption key size, and set the rest of the value to zeroes.
	 */
7164
	memcpy(ev.key.val, key->val, key->enc_size);
7165 7166
	memset(ev.key.val + key->enc_size, 0,
	       sizeof(ev.key.val) - key->enc_size);
7167

7168
	mgmt_event(MGMT_EV_NEW_LONG_TERM_KEY, hdev, &ev, sizeof(ev), NULL);
7169 7170
}

7171
void mgmt_new_irk(struct hci_dev *hdev, struct smp_irk *irk, bool persistent)
7172 7173 7174 7175 7176
{
	struct mgmt_ev_new_irk ev;

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

7177
	ev.store_hint = persistent;
7178

7179 7180 7181 7182 7183 7184 7185 7186
	bacpy(&ev.rpa, &irk->rpa);
	bacpy(&ev.irk.addr.bdaddr, &irk->bdaddr);
	ev.irk.addr.type = link_to_bdaddr(LE_LINK, irk->addr_type);
	memcpy(ev.irk.val, irk->val, sizeof(irk->val));

	mgmt_event(MGMT_EV_NEW_IRK, hdev, &ev, sizeof(ev), NULL);
}

7187 7188
void mgmt_new_csrk(struct hci_dev *hdev, struct smp_csrk *csrk,
		   bool persistent)
7189 7190 7191 7192 7193 7194
{
	struct mgmt_ev_new_csrk ev;

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

	/* Devices using resolvable or non-resolvable random addresses
F
Florian Grandel 已提交
7195
	 * without providing an identity resolving key don't require
7196 7197 7198 7199 7200 7201 7202 7203 7204 7205 7206
	 * to store signature resolving keys. Their addresses will change
	 * the next time around.
	 *
	 * Only when a remote device provides an identity address
	 * make sure the signature resolving key is stored. So allow
	 * static random and public addresses here.
	 */
	if (csrk->bdaddr_type == ADDR_LE_DEV_RANDOM &&
	    (csrk->bdaddr.b[5] & 0xc0) != 0xc0)
		ev.store_hint = 0x00;
	else
7207
		ev.store_hint = persistent;
7208 7209 7210

	bacpy(&ev.key.addr.bdaddr, &csrk->bdaddr);
	ev.key.addr.type = link_to_bdaddr(LE_LINK, csrk->bdaddr_type);
7211
	ev.key.type = csrk->type;
7212 7213 7214 7215 7216
	memcpy(ev.key.val, csrk->val, sizeof(csrk->val));

	mgmt_event(MGMT_EV_NEW_CSRK, hdev, &ev, sizeof(ev), NULL);
}

7217
void mgmt_new_conn_param(struct hci_dev *hdev, bdaddr_t *bdaddr,
7218 7219
			 u8 bdaddr_type, u8 store_hint, u16 min_interval,
			 u16 max_interval, u16 latency, u16 timeout)
7220 7221 7222
{
	struct mgmt_ev_new_conn_param ev;

7223 7224 7225
	if (!hci_is_identity_address(bdaddr, bdaddr_type))
		return;

7226 7227 7228
	memset(&ev, 0, sizeof(ev));
	bacpy(&ev.addr.bdaddr, bdaddr);
	ev.addr.type = link_to_bdaddr(LE_LINK, bdaddr_type);
7229
	ev.store_hint = store_hint;
7230 7231 7232 7233 7234 7235 7236 7237
	ev.min_interval = cpu_to_le16(min_interval);
	ev.max_interval = cpu_to_le16(max_interval);
	ev.latency = cpu_to_le16(latency);
	ev.timeout = cpu_to_le16(timeout);

	mgmt_event(MGMT_EV_NEW_CONN_PARAM, hdev, &ev, sizeof(ev), NULL);
}

7238 7239
void mgmt_device_connected(struct hci_dev *hdev, struct hci_conn *conn,
			   u32 flags, u8 *name, u8 name_len)
7240
{
7241 7242 7243
	char buf[512];
	struct mgmt_ev_device_connected *ev = (void *) buf;
	u16 eir_len = 0;
7244

7245 7246
	bacpy(&ev->addr.bdaddr, &conn->dst);
	ev->addr.type = link_to_bdaddr(conn->type, conn->dst_type);
7247

7248
	ev->flags = __cpu_to_le32(flags);
7249

7250 7251 7252 7253 7254 7255 7256 7257 7258 7259 7260 7261
	/* We must ensure that the EIR Data fields are ordered and
	 * unique. Keep it simple for now and avoid the problem by not
	 * adding any BR/EDR data to the LE adv.
	 */
	if (conn->le_adv_data_len > 0) {
		memcpy(&ev->eir[eir_len],
		       conn->le_adv_data, conn->le_adv_data_len);
		eir_len = conn->le_adv_data_len;
	} else {
		if (name_len > 0)
			eir_len = eir_append_data(ev->eir, 0, EIR_NAME_COMPLETE,
						  name, name_len);
7262

7263
		if (memcmp(conn->dev_class, "\0\0\0", 3) != 0)
7264 7265 7266 7267
			eir_len = eir_append_data(ev->eir, eir_len,
						  EIR_CLASS_OF_DEV,
						  conn->dev_class, 3);
	}
7268

7269
	ev->eir_len = cpu_to_le16(eir_len);
7270

7271 7272
	mgmt_event(MGMT_EV_DEVICE_CONNECTED, hdev, buf,
		    sizeof(*ev) + eir_len, NULL);
7273 7274
}

7275
static void disconnect_rsp(struct mgmt_pending_cmd *cmd, void *data)
7276 7277 7278
{
	struct sock **sk = data;

7279
	cmd->cmd_complete(cmd, 0);
7280 7281 7282 7283

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

7284
	mgmt_pending_remove(cmd);
7285 7286
}

7287
static void unpair_device_rsp(struct mgmt_pending_cmd *cmd, void *data)
7288
{
7289
	struct hci_dev *hdev = data;
7290
	struct mgmt_cp_unpair_device *cp = cmd->param;
7291

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

7294
	cmd->cmd_complete(cmd, 0);
7295 7296 7297
	mgmt_pending_remove(cmd);
}

7298 7299
bool mgmt_powering_down(struct hci_dev *hdev)
{
7300
	struct mgmt_pending_cmd *cmd;
7301 7302
	struct mgmt_mode *cp;

7303
	cmd = pending_find(MGMT_OP_SET_POWERED, hdev);
7304 7305 7306 7307 7308 7309 7310 7311 7312 7313
	if (!cmd)
		return false;

	cp = cmd->param;
	if (!cp->val)
		return true;

	return false;
}

7314
void mgmt_device_disconnected(struct hci_dev *hdev, bdaddr_t *bdaddr,
7315 7316
			      u8 link_type, u8 addr_type, u8 reason,
			      bool mgmt_connected)
7317
{
7318
	struct mgmt_ev_device_disconnected ev;
7319 7320
	struct sock *sk = NULL;

7321 7322 7323 7324 7325 7326
	/* The connection is still in hci_conn_hash so test for 1
	 * instead of 0 to know if this is the last one.
	 */
	if (mgmt_powering_down(hdev) && hci_conn_count(hdev) == 1) {
		cancel_delayed_work(&hdev->power_off);
		queue_work(hdev->req_workqueue, &hdev->power_off.work);
7327 7328
	}

7329 7330 7331
	if (!mgmt_connected)
		return;

7332 7333 7334
	if (link_type != ACL_LINK && link_type != LE_LINK)
		return;

7335
	mgmt_pending_foreach(MGMT_OP_DISCONNECT, hdev, disconnect_rsp, &sk);
7336

7337 7338 7339
	bacpy(&ev.addr.bdaddr, bdaddr);
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
	ev.reason = reason;
7340

7341
	mgmt_event(MGMT_EV_DEVICE_DISCONNECTED, hdev, &ev, sizeof(ev), sk);
7342 7343

	if (sk)
7344
		sock_put(sk);
7345

7346
	mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE, hdev, unpair_device_rsp,
7347
			     hdev);
7348 7349
}

7350 7351
void mgmt_disconnect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr,
			    u8 link_type, u8 addr_type, u8 status)
7352
{
7353 7354
	u8 bdaddr_type = link_to_bdaddr(link_type, addr_type);
	struct mgmt_cp_disconnect *cp;
7355
	struct mgmt_pending_cmd *cmd;
7356

7357 7358 7359
	mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE, hdev, unpair_device_rsp,
			     hdev);

7360
	cmd = pending_find(MGMT_OP_DISCONNECT, hdev);
7361
	if (!cmd)
7362
		return;
7363

7364 7365 7366 7367 7368 7369 7370 7371
	cp = cmd->param;

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

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

7372
	cmd->cmd_complete(cmd, mgmt_status(status));
7373
	mgmt_pending_remove(cmd);
7374
}
7375

7376 7377
void mgmt_connect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
			 u8 addr_type, u8 status)
7378 7379
{
	struct mgmt_ev_connect_failed ev;
7380

7381 7382 7383 7384 7385 7386
	/* The connection is still in hci_conn_hash so test for 1
	 * instead of 0 to know if this is the last one.
	 */
	if (mgmt_powering_down(hdev) && hci_conn_count(hdev) == 1) {
		cancel_delayed_work(&hdev->power_off);
		queue_work(hdev->req_workqueue, &hdev->power_off.work);
7387
	}
7388

7389
	bacpy(&ev.addr.bdaddr, bdaddr);
7390
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
7391
	ev.status = mgmt_status(status);
7392

7393
	mgmt_event(MGMT_EV_CONNECT_FAILED, hdev, &ev, sizeof(ev), NULL);
7394
}
7395

7396
void mgmt_pin_code_request(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 secure)
7397 7398 7399
{
	struct mgmt_ev_pin_code_request ev;

7400
	bacpy(&ev.addr.bdaddr, bdaddr);
7401
	ev.addr.type = BDADDR_BREDR;
7402
	ev.secure = secure;
7403

7404
	mgmt_event(MGMT_EV_PIN_CODE_REQUEST, hdev, &ev, sizeof(ev), NULL);
7405 7406
}

7407 7408
void mgmt_pin_code_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
				  u8 status)
7409
{
7410
	struct mgmt_pending_cmd *cmd;
7411

7412
	cmd = pending_find(MGMT_OP_PIN_CODE_REPLY, hdev);
7413
	if (!cmd)
7414
		return;
7415

7416
	cmd->cmd_complete(cmd, mgmt_status(status));
7417
	mgmt_pending_remove(cmd);
7418 7419
}

7420 7421
void mgmt_pin_code_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
				      u8 status)
7422
{
7423
	struct mgmt_pending_cmd *cmd;
7424

7425
	cmd = pending_find(MGMT_OP_PIN_CODE_NEG_REPLY, hdev);
7426
	if (!cmd)
7427
		return;
7428

7429
	cmd->cmd_complete(cmd, mgmt_status(status));
7430
	mgmt_pending_remove(cmd);
7431
}
7432

7433
int mgmt_user_confirm_request(struct hci_dev *hdev, bdaddr_t *bdaddr,
7434
			      u8 link_type, u8 addr_type, u32 value,
7435
			      u8 confirm_hint)
7436 7437 7438
{
	struct mgmt_ev_user_confirm_request ev;

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

7441
	bacpy(&ev.addr.bdaddr, bdaddr);
7442
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
7443
	ev.confirm_hint = confirm_hint;
7444
	ev.value = cpu_to_le32(value);
7445

7446
	return mgmt_event(MGMT_EV_USER_CONFIRM_REQUEST, hdev, &ev, sizeof(ev),
7447
			  NULL);
7448 7449
}

7450
int mgmt_user_passkey_request(struct hci_dev *hdev, bdaddr_t *bdaddr,
7451
			      u8 link_type, u8 addr_type)
7452 7453 7454 7455 7456
{
	struct mgmt_ev_user_passkey_request ev;

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

7457
	bacpy(&ev.addr.bdaddr, bdaddr);
7458
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
7459 7460

	return mgmt_event(MGMT_EV_USER_PASSKEY_REQUEST, hdev, &ev, sizeof(ev),
7461
			  NULL);
7462 7463
}

7464
static int user_pairing_resp_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
7465 7466
				      u8 link_type, u8 addr_type, u8 status,
				      u8 opcode)
7467
{
7468
	struct mgmt_pending_cmd *cmd;
7469

7470
	cmd = pending_find(opcode, hdev);
7471 7472 7473
	if (!cmd)
		return -ENOENT;

7474
	cmd->cmd_complete(cmd, mgmt_status(status));
7475
	mgmt_pending_remove(cmd);
7476

7477
	return 0;
7478 7479
}

7480
int mgmt_user_confirm_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
7481
				     u8 link_type, u8 addr_type, u8 status)
7482
{
7483
	return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
7484
					  status, MGMT_OP_USER_CONFIRM_REPLY);
7485 7486
}

7487
int mgmt_user_confirm_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
7488
					 u8 link_type, u8 addr_type, u8 status)
7489
{
7490
	return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
7491 7492
					  status,
					  MGMT_OP_USER_CONFIRM_NEG_REPLY);
7493
}
7494

7495
int mgmt_user_passkey_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
7496
				     u8 link_type, u8 addr_type, u8 status)
7497
{
7498
	return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
7499
					  status, MGMT_OP_USER_PASSKEY_REPLY);
7500 7501
}

7502
int mgmt_user_passkey_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
7503
					 u8 link_type, u8 addr_type, u8 status)
7504
{
7505
	return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
7506 7507
					  status,
					  MGMT_OP_USER_PASSKEY_NEG_REPLY);
7508 7509
}

7510 7511 7512 7513 7514 7515 7516 7517 7518 7519 7520 7521 7522 7523 7524 7525
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);
}

7526
void mgmt_auth_failed(struct hci_conn *conn, u8 hci_status)
7527 7528
{
	struct mgmt_ev_auth_failed ev;
7529
	struct mgmt_pending_cmd *cmd;
7530
	u8 status = mgmt_status(hci_status);
7531

7532 7533 7534
	bacpy(&ev.addr.bdaddr, &conn->dst);
	ev.addr.type = link_to_bdaddr(conn->type, conn->dst_type);
	ev.status = status;
7535

7536 7537 7538 7539 7540
	cmd = find_pairing(conn);

	mgmt_event(MGMT_EV_AUTH_FAILED, conn->hdev, &ev, sizeof(ev),
		    cmd ? cmd->sk : NULL);

7541 7542 7543 7544
	if (cmd) {
		cmd->cmd_complete(cmd, status);
		mgmt_pending_remove(cmd);
	}
7545
}
7546

7547
void mgmt_auth_enable_complete(struct hci_dev *hdev, u8 status)
7548 7549
{
	struct cmd_lookup match = { NULL, hdev };
7550
	bool changed;
7551 7552 7553 7554

	if (status) {
		u8 mgmt_err = mgmt_status(status);
		mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev,
7555
				     cmd_status_rsp, &mgmt_err);
7556
		return;
7557 7558
	}

7559
	if (test_bit(HCI_AUTH, &hdev->flags))
7560
		changed = !hci_dev_test_and_set_flag(hdev, HCI_LINK_SECURITY);
7561
	else
7562
		changed = hci_dev_test_and_clear_flag(hdev, HCI_LINK_SECURITY);
7563

7564
	mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev, settings_rsp,
7565
			     &match);
7566

7567
	if (changed)
7568
		new_settings(hdev, match.sk);
7569 7570 7571 7572 7573

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

7574
static void clear_eir(struct hci_request *req)
7575
{
7576
	struct hci_dev *hdev = req->hdev;
7577 7578
	struct hci_cp_write_eir cp;

7579
	if (!lmp_ext_inq_capable(hdev))
7580
		return;
7581

7582 7583
	memset(hdev->eir, 0, sizeof(hdev->eir));

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

7586
	hci_req_add(req, HCI_OP_WRITE_EIR, sizeof(cp), &cp);
7587 7588
}

7589
void mgmt_ssp_enable_complete(struct hci_dev *hdev, u8 enable, u8 status)
7590 7591
{
	struct cmd_lookup match = { NULL, hdev };
7592
	struct hci_request req;
7593
	bool changed = false;
7594 7595 7596

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

7598 7599
		if (enable && hci_dev_test_and_clear_flag(hdev,
							  HCI_SSP_ENABLED)) {
7600
			hci_dev_clear_flag(hdev, HCI_HS_ENABLED);
7601
			new_settings(hdev, NULL);
7602
		}
7603

7604 7605
		mgmt_pending_foreach(MGMT_OP_SET_SSP, hdev, cmd_status_rsp,
				     &mgmt_err);
7606
		return;
7607 7608 7609
	}

	if (enable) {
7610
		changed = !hci_dev_test_and_set_flag(hdev, HCI_SSP_ENABLED);
7611
	} else {
7612
		changed = hci_dev_test_and_clear_flag(hdev, HCI_SSP_ENABLED);
7613
		if (!changed)
7614 7615
			changed = hci_dev_test_and_clear_flag(hdev,
							      HCI_HS_ENABLED);
7616
		else
7617
			hci_dev_clear_flag(hdev, HCI_HS_ENABLED);
7618 7619 7620 7621
	}

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

7622
	if (changed)
7623
		new_settings(hdev, match.sk);
7624

7625
	if (match.sk)
7626 7627
		sock_put(match.sk);

7628 7629
	hci_req_init(&req, hdev);

7630 7631
	if (hci_dev_test_flag(hdev, HCI_SSP_ENABLED)) {
		if (hci_dev_test_flag(hdev, HCI_USE_DEBUG_KEYS))
7632 7633
			hci_req_add(&req, HCI_OP_WRITE_SSP_DEBUG_MODE,
				    sizeof(enable), &enable);
7634
		__hci_req_update_eir(&req);
7635
	} else {
7636
		clear_eir(&req);
7637
	}
7638 7639

	hci_req_run(&req, NULL);
7640 7641
}

7642
static void sk_lookup(struct mgmt_pending_cmd *cmd, void *data)
7643 7644 7645 7646 7647 7648 7649 7650 7651
{
	struct cmd_lookup *match = data;

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

7652 7653
void mgmt_set_class_of_dev_complete(struct hci_dev *hdev, u8 *dev_class,
				    u8 status)
7654
{
7655
	struct cmd_lookup match = { NULL, hdev, mgmt_status(status) };
7656

7657 7658 7659
	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);
7660

7661
	if (!status) {
7662 7663
		mgmt_limited_event(MGMT_EV_CLASS_OF_DEV_CHANGED, hdev, dev_class,
				   3, HCI_MGMT_DEV_CLASS_EVENTS, NULL);
7664 7665
		ext_info_changed(hdev, NULL);
	}
7666 7667 7668

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

7671
void mgmt_set_local_name_complete(struct hci_dev *hdev, u8 *name, u8 status)
7672 7673
{
	struct mgmt_cp_set_local_name ev;
7674
	struct mgmt_pending_cmd *cmd;
7675

7676
	if (status)
7677
		return;
7678 7679 7680

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

7683
	cmd = pending_find(MGMT_OP_SET_LOCAL_NAME, hdev);
7684 7685
	if (!cmd) {
		memcpy(hdev->dev_name, name, sizeof(hdev->dev_name));
7686

7687 7688 7689
		/* If this is a HCI command related to powering on the
		 * HCI dev don't send any mgmt signals.
		 */
7690
		if (pending_find(MGMT_OP_SET_POWERED, hdev))
7691
			return;
7692
	}
7693

7694 7695
	mgmt_limited_event(MGMT_EV_LOCAL_NAME_CHANGED, hdev, &ev, sizeof(ev),
			   HCI_MGMT_LOCAL_NAME_EVENTS, cmd ? cmd->sk : NULL);
7696
	ext_info_changed(hdev, cmd ? cmd->sk : NULL);
7697
}
7698

7699 7700 7701 7702 7703 7704 7705 7706 7707 7708 7709 7710
static inline bool has_uuid(u8 *uuid, u16 uuid_count, u8 (*uuids)[16])
{
	int i;

	for (i = 0; i < uuid_count; i++) {
		if (!memcmp(uuid, uuids[i], 16))
			return true;
	}

	return false;
}

7711 7712
static bool eir_has_uuids(u8 *eir, u16 eir_len, u16 uuid_count, u8 (*uuids)[16])
{
7713 7714 7715 7716 7717 7718 7719 7720 7721 7722 7723 7724 7725 7726 7727 7728 7729
	u16 parsed = 0;

	while (parsed < eir_len) {
		u8 field_len = eir[0];
		u8 uuid[16];
		int i;

		if (field_len == 0)
			break;

		if (eir_len - parsed < field_len + 1)
			break;

		switch (eir[1]) {
		case EIR_UUID16_ALL:
		case EIR_UUID16_SOME:
			for (i = 0; i + 3 <= field_len; i += 2) {
7730
				memcpy(uuid, bluetooth_base_uuid, 16);
7731 7732 7733 7734 7735 7736 7737 7738 7739
				uuid[13] = eir[i + 3];
				uuid[12] = eir[i + 2];
				if (has_uuid(uuid, uuid_count, uuids))
					return true;
			}
			break;
		case EIR_UUID32_ALL:
		case EIR_UUID32_SOME:
			for (i = 0; i + 5 <= field_len; i += 4) {
7740
				memcpy(uuid, bluetooth_base_uuid, 16);
7741 7742 7743 7744 7745 7746 7747 7748 7749 7750 7751 7752 7753 7754 7755 7756 7757 7758 7759 7760 7761 7762
				uuid[15] = eir[i + 5];
				uuid[14] = eir[i + 4];
				uuid[13] = eir[i + 3];
				uuid[12] = eir[i + 2];
				if (has_uuid(uuid, uuid_count, uuids))
					return true;
			}
			break;
		case EIR_UUID128_ALL:
		case EIR_UUID128_SOME:
			for (i = 0; i + 17 <= field_len; i += 16) {
				memcpy(uuid, eir + i + 2, 16);
				if (has_uuid(uuid, uuid_count, uuids))
					return true;
			}
			break;
		}

		parsed += field_len + 1;
		eir += field_len + 1;
	}

7763 7764 7765
	return false;
}

7766 7767 7768
static void restart_le_scan(struct hci_dev *hdev)
{
	/* If controller is not scanning we are done. */
7769
	if (!hci_dev_test_flag(hdev, HCI_LE_SCAN))
7770 7771 7772 7773 7774 7775 7776
		return;

	if (time_after(jiffies + DISCOV_LE_RESTART_DELAY,
		       hdev->discovery.scan_start +
		       hdev->discovery.scan_duration))
		return;

7777
	queue_delayed_work(hdev->req_workqueue, &hdev->le_scan_restart,
7778 7779 7780
			   DISCOV_LE_RESTART_DELAY);
}

7781 7782
static bool is_filter_match(struct hci_dev *hdev, s8 rssi, u8 *eir,
			    u16 eir_len, u8 *scan_rsp, u8 scan_rsp_len)
7783
{
7784 7785 7786 7787 7788
	/* If a RSSI threshold has been specified, and
	 * HCI_QUIRK_STRICT_DUPLICATE_FILTER is not set, then all results with
	 * a RSSI smaller than the RSSI threshold will be dropped. If the quirk
	 * is set, let it through for further processing, as we might need to
	 * restart the scan.
7789 7790 7791
	 *
	 * For BR/EDR devices (pre 1.2) providing no RSSI during inquiry,
	 * the results are also dropped.
7792 7793
	 */
	if (hdev->discovery.rssi != HCI_RSSI_INVALID &&
7794 7795 7796
	    (rssi == HCI_RSSI_INVALID ||
	    (rssi < hdev->discovery.rssi &&
	     !test_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks))))
7797
		return  false;
7798

7799 7800 7801
	if (hdev->discovery.uuid_count != 0) {
		/* If a list of UUIDs is provided in filter, results with no
		 * matching UUID should be dropped.
7802
		 */
7803 7804 7805 7806 7807 7808
		if (!eir_has_uuids(eir, eir_len, hdev->discovery.uuid_count,
				   hdev->discovery.uuids) &&
		    !eir_has_uuids(scan_rsp, scan_rsp_len,
				   hdev->discovery.uuid_count,
				   hdev->discovery.uuids))
			return false;
7809
	}
7810

7811 7812
	/* If duplicate filtering does not report RSSI changes, then restart
	 * scanning to ensure updated result with updated RSSI values.
7813
	 */
7814 7815 7816 7817 7818 7819 7820 7821
	if (test_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks)) {
		restart_le_scan(hdev);

		/* Validate RSSI value against the RSSI threshold once more. */
		if (hdev->discovery.rssi != HCI_RSSI_INVALID &&
		    rssi < hdev->discovery.rssi)
			return false;
	}
7822 7823 7824 7825 7826 7827 7828 7829 7830 7831 7832 7833 7834 7835 7836 7837 7838 7839 7840 7841 7842 7843 7844

	return true;
}

void mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
		       u8 addr_type, u8 *dev_class, s8 rssi, u32 flags,
		       u8 *eir, u16 eir_len, u8 *scan_rsp, u8 scan_rsp_len)
{
	char buf[512];
	struct mgmt_ev_device_found *ev = (void *)buf;
	size_t ev_size;

	/* Don't send events for a non-kernel initiated discovery. With
	 * LE one exception is if we have pend_le_reports > 0 in which
	 * case we're doing passive scanning and want these events.
	 */
	if (!hci_discovery_active(hdev)) {
		if (link_type == ACL_LINK)
			return;
		if (link_type == LE_LINK && list_empty(&hdev->pend_le_reports))
			return;
	}

7845
	if (hdev->discovery.result_filtering) {
7846 7847 7848 7849 7850 7851
		/* We are using service discovery */
		if (!is_filter_match(hdev, rssi, eir, eir_len, scan_rsp,
				     scan_rsp_len))
			return;
	}

7852 7853 7854 7855 7856 7857 7858 7859 7860 7861 7862 7863
	if (hdev->discovery.limited) {
		/* Check for limited discoverable bit */
		if (dev_class) {
			if (!(dev_class[1] & 0x20))
				return;
		} else {
			u8 *flags = eir_get_data(eir, eir_len, EIR_FLAGS, NULL);
			if (!flags || !(flags[0] & LE_AD_LIMITED))
				return;
		}
	}

7864 7865 7866 7867
	/* Make sure that the buffer is big enough. The 5 extra bytes
	 * are for the potential CoD field.
	 */
	if (sizeof(*ev) + eir_len + scan_rsp_len + 5 > sizeof(buf))
7868 7869
		return;

7870 7871 7872 7873 7874 7875 7876 7877 7878 7879 7880 7881 7882 7883 7884 7885 7886 7887 7888 7889 7890 7891 7892
	memset(buf, 0, sizeof(buf));

	/* In case of device discovery with BR/EDR devices (pre 1.2), the
	 * RSSI value was reported as 0 when not available. This behavior
	 * is kept when using device discovery. This is required for full
	 * backwards compatibility with the API.
	 *
	 * However when using service discovery, the value 127 will be
	 * returned when the RSSI is not available.
	 */
	if (rssi == HCI_RSSI_INVALID && !hdev->discovery.report_invalid_rssi &&
	    link_type == ACL_LINK)
		rssi = 0;

	bacpy(&ev->addr.bdaddr, bdaddr);
	ev->addr.type = link_to_bdaddr(link_type, addr_type);
	ev->rssi = rssi;
	ev->flags = cpu_to_le32(flags);

	if (eir_len > 0)
		/* Copy EIR or advertising data into event */
		memcpy(ev->eir, eir, eir_len);

7893 7894
	if (dev_class && !eir_get_data(ev->eir, eir_len, EIR_CLASS_OF_DEV,
				       NULL))
7895 7896 7897 7898 7899 7900 7901
		eir_len = eir_append_data(ev->eir, eir_len, EIR_CLASS_OF_DEV,
					  dev_class, 3);

	if (scan_rsp_len > 0)
		/* Append scan response data to event */
		memcpy(ev->eir + eir_len, scan_rsp, scan_rsp_len);

7902 7903
	ev->eir_len = cpu_to_le16(eir_len + scan_rsp_len);
	ev_size = sizeof(*ev) + eir_len + scan_rsp_len;
7904

7905
	mgmt_event(MGMT_EV_DEVICE_FOUND, hdev, ev, ev_size, NULL);
7906
}
7907

7908 7909
void mgmt_remote_name(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
		      u8 addr_type, s8 rssi, u8 *name, u8 name_len)
7910
{
7911 7912 7913
	struct mgmt_ev_device_found *ev;
	char buf[sizeof(*ev) + HCI_MAX_NAME_LENGTH + 2];
	u16 eir_len;
7914

7915
	ev = (struct mgmt_ev_device_found *) buf;
7916

7917 7918 7919
	memset(buf, 0, sizeof(buf));

	bacpy(&ev->addr.bdaddr, bdaddr);
7920
	ev->addr.type = link_to_bdaddr(link_type, addr_type);
7921 7922 7923
	ev->rssi = rssi;

	eir_len = eir_append_data(ev->eir, 0, EIR_NAME_COMPLETE, name,
7924
				  name_len);
7925

7926
	ev->eir_len = cpu_to_le16(eir_len);
7927

7928
	mgmt_event(MGMT_EV_DEVICE_FOUND, hdev, ev, sizeof(*ev) + eir_len, NULL);
7929
}
7930

7931
void mgmt_discovering(struct hci_dev *hdev, u8 discovering)
7932
{
7933
	struct mgmt_ev_discovering ev;
7934

7935 7936
	BT_DBG("%s discovering %u", hdev->name, discovering);

7937 7938 7939 7940
	memset(&ev, 0, sizeof(ev));
	ev.type = hdev->discovery.type;
	ev.discovering = discovering;

7941
	mgmt_event(MGMT_EV_DISCOVERING, hdev, &ev, sizeof(ev), NULL);
7942
}
7943

7944 7945 7946 7947
static struct hci_mgmt_chan chan = {
	.channel	= HCI_CHANNEL_CONTROL,
	.handler_count	= ARRAY_SIZE(mgmt_handlers),
	.handlers	= mgmt_handlers,
7948
	.hdev_init	= mgmt_init_hdev,
7949 7950 7951 7952 7953 7954 7955 7956 7957 7958 7959
};

int mgmt_init(void)
{
	return hci_mgmt_chan_register(&chan);
}

void mgmt_exit(void)
{
	hci_mgmt_chan_unregister(&chan);
}