mgmt.c 211.3 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	10
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 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
};

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,
128
	MGMT_EV_PASSKEY_NOTIFY,
129
	MGMT_EV_NEW_IRK,
130
	MGMT_EV_NEW_CSRK,
131 132
	MGMT_EV_DEVICE_ADDED,
	MGMT_EV_DEVICE_REMOVED,
133
	MGMT_EV_NEW_CONN_PARAM,
134
	MGMT_EV_UNCONF_INDEX_ADDED,
135
	MGMT_EV_UNCONF_INDEX_REMOVED,
136
	MGMT_EV_NEW_CONFIG_OPTIONS,
137 138
	MGMT_EV_EXT_INDEX_ADDED,
	MGMT_EV_EXT_INDEX_REMOVED,
139
	MGMT_EV_LOCAL_OOB_DATA_UPDATED,
140 141
	MGMT_EV_ADVERTISING_ADDED,
	MGMT_EV_ADVERTISING_REMOVED,
142 143
};

144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
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,
};

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

165
#define CACHE_TIMEOUT	msecs_to_jiffies(2 * 1000)
166

167 168 169
#define ZERO_KEY "\x00\x00\x00\x00\x00\x00\x00\x00" \
		 "\x00\x00\x00\x00\x00\x00\x00\x00"

170 171 172 173 174 175 176 177
/* 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 */
178
	MGMT_STATUS_AUTH_FAILED,	/* PIN or Key Missing */
179 180 181 182 183 184 185 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
	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;
}

243 244
static int mgmt_index_event(u16 event, struct hci_dev *hdev, void *data,
			    u16 len, int flag)
245
{
246 247
	return mgmt_send_event(event, hdev, HCI_CHANNEL_CONTROL, data, len,
			       flag, NULL);
248 249
}

250 251 252 253 254 255 256
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);
}

257 258 259 260 261 262 263
static int mgmt_generic_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,
			       HCI_MGMT_GENERIC_EVENTS, 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
static int read_version(struct sock *sk, struct hci_dev *hdev, void *data,
			u16 data_len)
273 274 275 276 277 278
{
	struct mgmt_rp_read_version rp;

	BT_DBG("sock %p", sk);

	rp.version = MGMT_VERSION;
279
	rp.revision = cpu_to_le16(MGMT_REVISION);
280

281 282
	return mgmt_cmd_complete(sk, MGMT_INDEX_NONE, MGMT_OP_READ_VERSION, 0,
				 &rp, sizeof(rp));
283 284
}

285 286
static int read_commands(struct sock *sk, struct hci_dev *hdev, void *data,
			 u16 data_len)
287 288
{
	struct mgmt_rp_read_commands *rp;
289
	u16 num_commands, num_events;
290 291 292 293 294
	size_t rp_size;
	int i, err;

	BT_DBG("sock %p", sk);

295 296 297 298 299 300 301 302
	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);
	}

303 304 305 306 307 308
	rp_size = sizeof(*rp) + ((num_commands + num_events) * sizeof(u16));

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

309 310
	rp->num_commands = cpu_to_le16(num_commands);
	rp->num_events = cpu_to_le16(num_events);
311

312 313 314 315 316
	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);
317

318 319 320 321 322 323 324 325 326 327 328
		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);
	}
329

330 331
	err = mgmt_cmd_complete(sk, MGMT_INDEX_NONE, MGMT_OP_READ_COMMANDS, 0,
				rp, rp_size);
332 333 334 335 336
	kfree(rp);

	return err;
}

337 338
static int read_index_list(struct sock *sk, struct hci_dev *hdev, void *data,
			   u16 data_len)
339 340
{
	struct mgmt_rp_read_index_list *rp;
341
	struct hci_dev *d;
342
	size_t rp_len;
343
	u16 count;
344
	int err;
345 346 347 348 349 350

	BT_DBG("sock %p", sk);

	read_lock(&hci_dev_list_lock);

	count = 0;
351
	list_for_each_entry(d, &hci_dev_list, list) {
352
		if (d->dev_type == HCI_BREDR &&
353
		    !hci_dev_test_flag(d, HCI_UNCONFIGURED))
354
			count++;
355 356
	}

357 358 359
	rp_len = sizeof(*rp) + (2 * count);
	rp = kmalloc(rp_len, GFP_ATOMIC);
	if (!rp) {
360
		read_unlock(&hci_dev_list_lock);
361
		return -ENOMEM;
362
	}
363

364
	count = 0;
365
	list_for_each_entry(d, &hci_dev_list, list) {
366 367 368
		if (hci_dev_test_flag(d, HCI_SETUP) ||
		    hci_dev_test_flag(d, HCI_CONFIG) ||
		    hci_dev_test_flag(d, HCI_USER_CHANNEL))
369 370
			continue;

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

377
		if (d->dev_type == HCI_BREDR &&
378
		    !hci_dev_test_flag(d, HCI_UNCONFIGURED)) {
379 380 381
			rp->index[count++] = cpu_to_le16(d->id);
			BT_DBG("Added hci%u", d->id);
		}
382 383
	}

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

387 388
	read_unlock(&hci_dev_list_lock);

389 390
	err = mgmt_cmd_complete(sk, MGMT_INDEX_NONE, MGMT_OP_READ_INDEX_LIST,
				0, rp, rp_len);
391

392 393 394
	kfree(rp);

	return err;
395 396
}

397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412
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) {
		if (d->dev_type == HCI_BREDR &&
413
		    hci_dev_test_flag(d, HCI_UNCONFIGURED))
414 415 416 417 418 419 420 421 422 423 424 425
			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) {
426 427 428
		if (hci_dev_test_flag(d, HCI_SETUP) ||
		    hci_dev_test_flag(d, HCI_CONFIG) ||
		    hci_dev_test_flag(d, HCI_USER_CHANNEL))
429 430 431 432 433 434 435 436 437
			continue;

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

		if (d->dev_type == HCI_BREDR &&
438
		    hci_dev_test_flag(d, HCI_UNCONFIGURED)) {
439 440 441 442 443 444 445 446 447 448
			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);

449 450
	err = mgmt_cmd_complete(sk, MGMT_INDEX_NONE,
				MGMT_OP_READ_UNCONF_INDEX_LIST, 0, rp, rp_len);
451 452 453 454 455 456

	kfree(rp);

	return err;
}

457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532
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;
	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) {
		if (d->dev_type == HCI_BREDR || d->dev_type == HCI_AMP)
			count++;
	}

	rp_len = sizeof(*rp) + (sizeof(rp->entry[0]) * 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) {
		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;

		if (d->dev_type == HCI_BREDR) {
			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);
	rp_len = sizeof(*rp) + (sizeof(rp->entry[0]) * 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,
				MGMT_OP_READ_EXT_INDEX_LIST, 0, rp, rp_len);

	kfree(rp);

	return err;
}

533 534 535
static bool is_configured(struct hci_dev *hdev)
{
	if (test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks) &&
536
	    !hci_dev_test_flag(hdev, HCI_EXT_CONFIGURED))
537 538 539 540 541 542 543 544 545
		return false;

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

	return true;
}

546 547 548 549
static __le32 get_missing_options(struct hci_dev *hdev)
{
	u32 options = 0;

550
	if (test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks) &&
551
	    !hci_dev_test_flag(hdev, HCI_EXT_CONFIGURED))
552 553
		options |= MGMT_OPTION_EXTERNAL_CONFIG;

554 555 556 557 558 559 560
	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);
}

561 562 563 564
static int new_options(struct hci_dev *hdev, struct sock *skip)
{
	__le32 options = get_missing_options(hdev);

565 566
	return mgmt_generic_event(MGMT_EV_NEW_CONFIG_OPTIONS, hdev, &options,
				  sizeof(options), skip);
567 568
}

569 570 571 572
static int send_options_rsp(struct sock *sk, u16 opcode, struct hci_dev *hdev)
{
	__le32 options = get_missing_options(hdev);

573 574
	return mgmt_cmd_complete(sk, hdev->id, opcode, 0, &options,
				 sizeof(options));
575 576
}

577 578 579 580
static int read_config_info(struct sock *sk, struct hci_dev *hdev,
			    void *data, u16 data_len)
{
	struct mgmt_rp_read_config_info rp;
581
	u32 options = 0;
582 583 584 585 586 587 588

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

	hci_dev_lock(hdev);

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

590 591 592
	if (test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks))
		options |= MGMT_OPTION_EXTERNAL_CONFIG;

593
	if (hdev->set_bdaddr)
594 595 596 597
		options |= MGMT_OPTION_PUBLIC_ADDRESS;

	rp.supported_options = cpu_to_le32(options);
	rp.missing_options = get_missing_options(hdev);
598 599 600

	hci_dev_unlock(hdev);

601 602
	return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_CONFIG_INFO, 0,
				 &rp, sizeof(rp));
603 604
}

605 606 607 608 609
static u32 get_supported_settings(struct hci_dev *hdev)
{
	u32 settings = 0;

	settings |= MGMT_SETTING_POWERED;
610
	settings |= MGMT_SETTING_BONDABLE;
611
	settings |= MGMT_SETTING_DEBUG_KEYS;
612 613
	settings |= MGMT_SETTING_CONNECTABLE;
	settings |= MGMT_SETTING_DISCOVERABLE;
614

615
	if (lmp_bredr_capable(hdev)) {
616 617
		if (hdev->hci_ver >= BLUETOOTH_VER_1_2)
			settings |= MGMT_SETTING_FAST_CONNECTABLE;
618 619
		settings |= MGMT_SETTING_BREDR;
		settings |= MGMT_SETTING_LINK_SECURITY;
620 621 622 623 624

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

626
		if (lmp_sc_capable(hdev))
627
			settings |= MGMT_SETTING_SECURE_CONN;
628
	}
629

630
	if (lmp_le_capable(hdev)) {
631
		settings |= MGMT_SETTING_LE;
632
		settings |= MGMT_SETTING_ADVERTISING;
633
		settings |= MGMT_SETTING_SECURE_CONN;
634
		settings |= MGMT_SETTING_PRIVACY;
635
		settings |= MGMT_SETTING_STATIC_ADDRESS;
636
	}
637

638 639
	if (test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks) ||
	    hdev->set_bdaddr)
640 641
		settings |= MGMT_SETTING_CONFIGURATION;

642 643 644 645 646 647 648
	return settings;
}

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

649
	if (hdev_is_powered(hdev))
650 651
		settings |= MGMT_SETTING_POWERED;

652
	if (hci_dev_test_flag(hdev, HCI_CONNECTABLE))
653 654
		settings |= MGMT_SETTING_CONNECTABLE;

655
	if (hci_dev_test_flag(hdev, HCI_FAST_CONNECTABLE))
656 657
		settings |= MGMT_SETTING_FAST_CONNECTABLE;

658
	if (hci_dev_test_flag(hdev, HCI_DISCOVERABLE))
659 660
		settings |= MGMT_SETTING_DISCOVERABLE;

661
	if (hci_dev_test_flag(hdev, HCI_BONDABLE))
662
		settings |= MGMT_SETTING_BONDABLE;
663

664
	if (hci_dev_test_flag(hdev, HCI_BREDR_ENABLED))
665 666
		settings |= MGMT_SETTING_BREDR;

667
	if (hci_dev_test_flag(hdev, HCI_LE_ENABLED))
668 669
		settings |= MGMT_SETTING_LE;

670
	if (hci_dev_test_flag(hdev, HCI_LINK_SECURITY))
671 672
		settings |= MGMT_SETTING_LINK_SECURITY;

673
	if (hci_dev_test_flag(hdev, HCI_SSP_ENABLED))
674 675
		settings |= MGMT_SETTING_SSP;

676
	if (hci_dev_test_flag(hdev, HCI_HS_ENABLED))
677 678
		settings |= MGMT_SETTING_HS;

679
	if (hci_dev_test_flag(hdev, HCI_ADVERTISING))
680 681
		settings |= MGMT_SETTING_ADVERTISING;

682
	if (hci_dev_test_flag(hdev, HCI_SC_ENABLED))
683 684
		settings |= MGMT_SETTING_SECURE_CONN;

685
	if (hci_dev_test_flag(hdev, HCI_KEEP_DEBUG_KEYS))
686 687
		settings |= MGMT_SETTING_DEBUG_KEYS;

688
	if (hci_dev_test_flag(hdev, HCI_PRIVACY))
689 690
		settings |= MGMT_SETTING_PRIVACY;

691 692 693 694 695
	/* 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
696
	 * will never be set. If the address is configured, then if the
697 698 699 700 701 702
	 * 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.
	 */
703
	if (hci_dev_test_flag(hdev, HCI_FORCE_STATIC_ADDR) ||
704
	    !hci_dev_test_flag(hdev, HCI_BREDR_ENABLED) ||
705 706 707 708 709
	    !bacmp(&hdev->bdaddr, BDADDR_ANY)) {
		if (bacmp(&hdev->static_addr, BDADDR_ANY))
			settings |= MGMT_SETTING_STATIC_ADDRESS;
	}

710 711 712
	return settings;
}

713 714
#define PNP_INFO_SVCLASS_ID		0x1200

715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756
static u8 *create_uuid16_list(struct hci_dev *hdev, u8 *data, ptrdiff_t len)
{
	u8 *ptr = data, *uuids_start = NULL;
	struct bt_uuid *uuid;

	if (len < 4)
		return ptr;

	list_for_each_entry(uuid, &hdev->uuids, list) {
		u16 uuid16;

		if (uuid->size != 16)
			continue;

		uuid16 = get_unaligned_le16(&uuid->uuid[12]);
		if (uuid16 < 0x1100)
			continue;

		if (uuid16 == PNP_INFO_SVCLASS_ID)
			continue;

		if (!uuids_start) {
			uuids_start = ptr;
			uuids_start[0] = 1;
			uuids_start[1] = EIR_UUID16_ALL;
			ptr += 2;
		}

		/* Stop if not enough space to put next UUID */
		if ((ptr - data) + sizeof(u16) > len) {
			uuids_start[1] = EIR_UUID16_SOME;
			break;
		}

		*ptr++ = (uuid16 & 0x00ff);
		*ptr++ = (uuid16 & 0xff00) >> 8;
		uuids_start[0] += sizeof(uuid16);
	}

	return ptr;
}

757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789
static u8 *create_uuid32_list(struct hci_dev *hdev, u8 *data, ptrdiff_t len)
{
	u8 *ptr = data, *uuids_start = NULL;
	struct bt_uuid *uuid;

	if (len < 6)
		return ptr;

	list_for_each_entry(uuid, &hdev->uuids, list) {
		if (uuid->size != 32)
			continue;

		if (!uuids_start) {
			uuids_start = ptr;
			uuids_start[0] = 1;
			uuids_start[1] = EIR_UUID32_ALL;
			ptr += 2;
		}

		/* Stop if not enough space to put next UUID */
		if ((ptr - data) + sizeof(u32) > len) {
			uuids_start[1] = EIR_UUID32_SOME;
			break;
		}

		memcpy(ptr, &uuid->uuid[12], sizeof(u32));
		ptr += sizeof(u32);
		uuids_start[0] += sizeof(u32);
	}

	return ptr;
}

790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822
static u8 *create_uuid128_list(struct hci_dev *hdev, u8 *data, ptrdiff_t len)
{
	u8 *ptr = data, *uuids_start = NULL;
	struct bt_uuid *uuid;

	if (len < 18)
		return ptr;

	list_for_each_entry(uuid, &hdev->uuids, list) {
		if (uuid->size != 128)
			continue;

		if (!uuids_start) {
			uuids_start = ptr;
			uuids_start[0] = 1;
			uuids_start[1] = EIR_UUID128_ALL;
			ptr += 2;
		}

		/* Stop if not enough space to put next UUID */
		if ((ptr - data) + 16 > len) {
			uuids_start[1] = EIR_UUID128_SOME;
			break;
		}

		memcpy(ptr, uuid->uuid, 16);
		ptr += 16;
		uuids_start[0] += 16;
	}

	return ptr;
}

823 824 825 826 827 828 829 830 831 832 833 834
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);
}

835 836 837 838 839 840 841 842 843
static u8 get_current_adv_instance(struct hci_dev *hdev)
{
	/* The "Set Advertising" setting supersedes the "Add Advertising"
	 * setting. Here we set the advertising data based on which
	 * setting was set. When neither apply, default to the global settings,
	 * represented by instance "0".
	 */
	if (hci_dev_test_flag(hdev, HCI_ADVERTISING_INSTANCE) &&
	    !hci_dev_test_flag(hdev, HCI_ADVERTISING))
844
		return hdev->cur_adv_instance;
845 846 847 848

	return 0x00;
}

849
static u8 create_default_scan_rsp_data(struct hci_dev *hdev, u8 *ptr)
850
{
851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872
	u8 ad_len = 0;
	size_t name_len;

	name_len = strlen(hdev->dev_name);
	if (name_len > 0) {
		size_t max_len = HCI_MAX_AD_LENGTH - ad_len - 2;

		if (name_len > max_len) {
			name_len = max_len;
			ptr[1] = EIR_NAME_SHORT;
		} else
			ptr[1] = EIR_NAME_COMPLETE;

		ptr[0] = name_len + 1;

		memcpy(ptr + 2, hdev->dev_name, name_len);

		ad_len += (name_len + 2);
		ptr += (name_len + 2);
	}

	return ad_len;
873 874
}

875 876
static u8 create_instance_scan_rsp_data(struct hci_dev *hdev, u8 instance,
					u8 *ptr)
877
{
878 879 880 881 882 883
	struct adv_info *adv_instance;

	adv_instance = hci_find_adv_instance(hdev, instance);
	if (!adv_instance)
		return 0;

884 885 886
	/* TODO: Set the appropriate entries based on advertising instance flags
	 * here once flags other than 0 are supported.
	 */
887 888
	memcpy(ptr, adv_instance->scan_rsp_data,
	       adv_instance->scan_rsp_len);
889

890
	return adv_instance->scan_rsp_len;
891 892
}

893
static void update_inst_scan_rsp_data(struct hci_request *req, u8 instance)
894 895 896 897 898
{
	struct hci_dev *hdev = req->hdev;
	struct hci_cp_le_set_scan_rsp_data cp;
	u8 len;

899
	if (!hci_dev_test_flag(hdev, HCI_LE_ENABLED))
900 901 902 903
		return;

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

904
	if (instance)
905
		len = create_instance_scan_rsp_data(hdev, instance, cp.data);
906 907
	else
		len = create_default_scan_rsp_data(hdev, cp.data);
908

909
	if (hdev->scan_rsp_data_len == len &&
910
	    !memcmp(cp.data, hdev->scan_rsp_data, len))
911 912
		return;

913 914
	memcpy(hdev->scan_rsp_data, cp.data, sizeof(cp.data));
	hdev->scan_rsp_data_len = len;
915 916 917 918 919 920

	cp.length = len;

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

921 922
static void update_scan_rsp_data(struct hci_request *req)
{
923
	update_inst_scan_rsp_data(req, get_current_adv_instance(req->hdev));
924 925
}

926 927
static u8 get_adv_discov_flags(struct hci_dev *hdev)
{
928
	struct mgmt_pending_cmd *cmd;
929 930 931 932

	/* If there's a pending mgmt command the flags will not yet have
	 * their final values, so check for this first.
	 */
933
	cmd = pending_find(MGMT_OP_SET_DISCOVERABLE, hdev);
934 935 936 937 938 939 940
	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 {
941
		if (hci_dev_test_flag(hdev, HCI_LIMITED_DISCOVERABLE))
942
			return LE_AD_LIMITED;
943
		else if (hci_dev_test_flag(hdev, HCI_DISCOVERABLE))
944 945 946 947 948 949
			return LE_AD_GENERAL;
	}

	return 0;
}

950 951 952
static bool get_connectable(struct hci_dev *hdev)
{
	struct mgmt_pending_cmd *cmd;
953

954 955 956 957 958 959
	/* 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;
960

961
		return cp->val;
962 963
	}

964 965
	return hci_dev_test_flag(hdev, HCI_CONNECTABLE);
}
966

967 968 969
static u32 get_adv_instance_flags(struct hci_dev *hdev, u8 instance)
{
	u32 flags;
970
	struct adv_info *adv_instance;
971

972 973 974 975 976
	if (instance == 0x00) {
		/* Instance 0 always manages the "Tx Power" and "Flags"
		 * fields
		 */
		flags = MGMT_ADV_FLAG_TX_POWER | MGMT_ADV_FLAG_MANAGED_FLAGS;
977

978 979 980 981 982
		/* For instance 0, the HCI_ADVERTISING_CONNECTABLE setting
		 * corresponds to the "connectable" instance flag.
		 */
		if (hci_dev_test_flag(hdev, HCI_ADVERTISING_CONNECTABLE))
			flags |= MGMT_ADV_FLAG_CONNECTABLE;
983

984
		return flags;
985
	}
986

987
	adv_instance = hci_find_adv_instance(hdev, instance);
988

989 990 991
	/* Return 0 when we got an invalid instance identifier. */
	if (!adv_instance)
		return 0;
992

993
	return adv_instance->flags;
994 995
}

996
static u8 get_cur_adv_instance_scan_rsp_len(struct hci_dev *hdev)
997
{
998 999 1000 1001 1002 1003 1004 1005 1006
	u8 instance = get_current_adv_instance(hdev);
	struct adv_info *adv_instance;

	/* Ignore instance 0 */
	if (instance == 0x00)
		return 0;

	adv_instance = hci_find_adv_instance(hdev, instance);
	if (!adv_instance)
1007 1008 1009 1010 1011
		return 0;

	/* TODO: Take into account the "appearance" and "local-name" flags here.
	 * These are currently being ignored as they are not supported.
	 */
1012
	return adv_instance->scan_rsp_len;
1013 1014
}

1015
static u8 create_instance_adv_data(struct hci_dev *hdev, u8 instance, u8 *ptr)
1016
{
1017
	struct adv_info *adv_instance = NULL;
1018
	u8 ad_len = 0, flags = 0;
1019 1020 1021 1022 1023 1024 1025 1026 1027 1028
	u32 instance_flags;

	/* Return 0 when the current instance identifier is invalid. */
	if (instance) {
		adv_instance = hci_find_adv_instance(hdev, instance);
		if (!adv_instance)
			return 0;
	}

	instance_flags = get_adv_instance_flags(hdev, instance);
1029

1030 1031 1032
	/* The Add Advertising command allows userspace to set both the general
	 * and limited discoverable flags.
	 */
1033
	if (instance_flags & MGMT_ADV_FLAG_DISCOV)
1034 1035
		flags |= LE_AD_GENERAL;

1036
	if (instance_flags & MGMT_ADV_FLAG_LIMITED_DISCOV)
1037 1038
		flags |= LE_AD_LIMITED;

1039
	if (flags || (instance_flags & MGMT_ADV_FLAG_MANAGED_FLAGS)) {
1040 1041 1042 1043 1044 1045
		/* If a discovery flag wasn't provided, simply use the global
		 * settings.
		 */
		if (!flags)
			flags |= get_adv_discov_flags(hdev);

1046 1047 1048
		if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED))
			flags |= LE_AD_NO_BREDR;

1049 1050 1051 1052 1053 1054 1055
		/* If flags would still be empty, then there is no need to
		 * include the "Flags" AD field".
		 */
		if (flags) {
			ptr[0] = 0x02;
			ptr[1] = EIR_FLAGS;
			ptr[2] = flags;
1056

1057 1058 1059
			ad_len += 3;
			ptr += 3;
		}
1060 1061
	}

1062 1063 1064 1065 1066
	if (adv_instance) {
		memcpy(ptr, adv_instance->adv_data,
		       adv_instance->adv_data_len);
		ad_len += adv_instance->adv_data_len;
		ptr += adv_instance->adv_data_len;
1067 1068
	}

1069
	/* Provide Tx Power only if we can provide a valid value for it */
1070
	if (hdev->adv_tx_power != HCI_TX_POWER_INVALID &&
1071
	    (instance_flags & MGMT_ADV_FLAG_TX_POWER)) {
1072 1073 1074 1075 1076 1077 1078 1079
		ptr[0] = 0x02;
		ptr[1] = EIR_TX_POWER;
		ptr[2] = (u8)hdev->adv_tx_power;

		ad_len += 3;
		ptr += 3;
	}

1080
	return ad_len;
1081 1082
}

1083
static void update_inst_adv_data(struct hci_request *req, u8 instance)
1084 1085 1086 1087 1088
{
	struct hci_dev *hdev = req->hdev;
	struct hci_cp_le_set_adv_data cp;
	u8 len;

1089
	if (!hci_dev_test_flag(hdev, HCI_LE_ENABLED))
1090 1091 1092 1093
		return;

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

1094
	len = create_instance_adv_data(hdev, instance, cp.data);
1095

1096
	/* There's nothing to do if the data hasn't changed */
1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108
	if (hdev->adv_data_len == len &&
	    memcmp(cp.data, hdev->adv_data, len) == 0)
		return;

	memcpy(hdev->adv_data, cp.data, sizeof(cp.data));
	hdev->adv_data_len = len;

	cp.length = len;

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

1109 1110
static void update_adv_data(struct hci_request *req)
{
1111
	update_inst_adv_data(req, get_current_adv_instance(req->hdev));
1112 1113
}

1114 1115 1116 1117 1118 1119 1120 1121 1122 1123
int mgmt_update_adv_data(struct hci_dev *hdev)
{
	struct hci_request req;

	hci_req_init(&req, hdev);
	update_adv_data(&req);

	return hci_req_run(&req, NULL);
}

1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146
static void create_eir(struct hci_dev *hdev, u8 *data)
{
	u8 *ptr = data;
	size_t name_len;

	name_len = strlen(hdev->dev_name);

	if (name_len > 0) {
		/* EIR Data type */
		if (name_len > 48) {
			name_len = 48;
			ptr[1] = EIR_NAME_SHORT;
		} else
			ptr[1] = EIR_NAME_COMPLETE;

		/* EIR Data length */
		ptr[0] = name_len + 1;

		memcpy(ptr + 2, hdev->dev_name, name_len);

		ptr += (name_len + 2);
	}

1147
	if (hdev->inq_tx_power != HCI_TX_POWER_INVALID) {
1148 1149 1150 1151 1152 1153 1154
		ptr[0] = 2;
		ptr[1] = EIR_TX_POWER;
		ptr[2] = (u8) hdev->inq_tx_power;

		ptr += 3;
	}

1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166
	if (hdev->devid_source > 0) {
		ptr[0] = 9;
		ptr[1] = EIR_DEVICE_ID;

		put_unaligned_le16(hdev->devid_source, ptr + 2);
		put_unaligned_le16(hdev->devid_vendor, ptr + 4);
		put_unaligned_le16(hdev->devid_product, ptr + 6);
		put_unaligned_le16(hdev->devid_version, ptr + 8);

		ptr += 10;
	}

1167
	ptr = create_uuid16_list(hdev, ptr, HCI_MAX_EIR_LENGTH - (ptr - data));
1168
	ptr = create_uuid32_list(hdev, ptr, HCI_MAX_EIR_LENGTH - (ptr - data));
1169
	ptr = create_uuid128_list(hdev, ptr, HCI_MAX_EIR_LENGTH - (ptr - data));
1170 1171
}

1172
static void update_eir(struct hci_request *req)
1173
{
1174
	struct hci_dev *hdev = req->hdev;
1175 1176
	struct hci_cp_write_eir cp;

1177
	if (!hdev_is_powered(hdev))
1178
		return;
1179

1180
	if (!lmp_ext_inq_capable(hdev))
1181
		return;
1182

1183
	if (!hci_dev_test_flag(hdev, HCI_SSP_ENABLED))
1184
		return;
1185

1186
	if (hci_dev_test_flag(hdev, HCI_SERVICE_CACHE))
1187
		return;
1188 1189 1190 1191 1192 1193

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

	create_eir(hdev, cp.data);

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

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

1198
	hci_req_add(req, HCI_OP_WRITE_EIR, sizeof(cp), &cp);
1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211
}

static u8 get_service_classes(struct hci_dev *hdev)
{
	struct bt_uuid *uuid;
	u8 val = 0;

	list_for_each_entry(uuid, &hdev->uuids, list)
		val |= uuid->svc_hint;

	return val;
}

1212
static void update_class(struct hci_request *req)
1213
{
1214
	struct hci_dev *hdev = req->hdev;
1215 1216 1217 1218
	u8 cod[3];

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

1219
	if (!hdev_is_powered(hdev))
1220
		return;
1221

1222
	if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED))
1223 1224
		return;

1225
	if (hci_dev_test_flag(hdev, HCI_SERVICE_CACHE))
1226
		return;
1227 1228 1229 1230 1231

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

1232
	if (hci_dev_test_flag(hdev, HCI_LIMITED_DISCOVERABLE))
1233 1234
		cod[1] |= 0x20;

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

1238
	hci_req_add(req, HCI_OP_WRITE_CLASS_OF_DEV, sizeof(cod), cod);
1239 1240
}

1241 1242 1243 1244 1245 1246 1247
static void disable_advertising(struct hci_request *req)
{
	u8 enable = 0x00;

	hci_req_add(req, HCI_OP_LE_SET_ADV_ENABLE, sizeof(enable), &enable);
}

1248 1249 1250 1251
static void enable_advertising(struct hci_request *req)
{
	struct hci_dev *hdev = req->hdev;
	struct hci_cp_le_set_adv_param cp;
1252
	u8 own_addr_type, enable = 0x01;
1253
	bool connectable;
1254 1255
	u8 instance;
	u32 flags;
1256

1257 1258 1259
	if (hci_conn_num(hdev, LE_LINK) > 0)
		return;

1260
	if (hci_dev_test_flag(hdev, HCI_LE_ADV))
1261 1262
		disable_advertising(req);

1263
	/* Clear the HCI_LE_ADV bit temporarily so that the
1264 1265 1266 1267
	 * hci_update_random_address knows that it's safe to go ahead
	 * and write a new random address. The flag will be set back on
	 * as soon as the SET_ADV_ENABLE HCI command completes.
	 */
1268
	hci_dev_clear_flag(hdev, HCI_LE_ADV);
1269

1270 1271
	instance = get_current_adv_instance(hdev);
	flags = get_adv_instance_flags(hdev, instance);
1272 1273 1274 1275 1276 1277

	/* If the "connectable" instance flag was not set, then choose between
	 * ADV_IND and ADV_NONCONN_IND based on the global connectable setting.
	 */
	connectable = (flags & MGMT_ADV_FLAG_CONNECTABLE) ||
		      get_connectable(hdev);
1278

1279 1280 1281 1282 1283
	/* Set require_privacy to true only when non-connectable
	 * advertising is used. In that case it is fine to use a
	 * non-resolvable private address.
	 */
	if (hci_update_random_address(req, !connectable, &own_addr_type) < 0)
1284 1285
		return;

1286
	memset(&cp, 0, sizeof(cp));
1287 1288
	cp.min_interval = cpu_to_le16(hdev->le_adv_min_interval);
	cp.max_interval = cpu_to_le16(hdev->le_adv_max_interval);
1289 1290 1291

	if (connectable)
		cp.type = LE_ADV_IND;
1292
	else if (get_cur_adv_instance_scan_rsp_len(hdev))
1293 1294 1295 1296
		cp.type = LE_ADV_SCAN_IND;
	else
		cp.type = LE_ADV_NONCONN_IND;

1297
	cp.own_address_type = own_addr_type;
1298 1299 1300 1301 1302 1303 1304
	cp.channel_map = hdev->le_adv_channel_map;

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

	hci_req_add(req, HCI_OP_LE_SET_ADV_ENABLE, sizeof(enable), &enable);
}

1305 1306 1307
static void service_cache_off(struct work_struct *work)
{
	struct hci_dev *hdev = container_of(work, struct hci_dev,
1308
					    service_cache.work);
1309
	struct hci_request req;
1310

1311
	if (!hci_dev_test_and_clear_flag(hdev, HCI_SERVICE_CACHE))
1312 1313
		return;

1314 1315
	hci_req_init(&req, hdev);

1316 1317
	hci_dev_lock(hdev);

1318 1319
	update_eir(&req);
	update_class(&req);
1320 1321

	hci_dev_unlock(hdev);
1322 1323

	hci_req_run(&req, NULL);
1324 1325
}

1326 1327 1328 1329 1330 1331 1332 1333
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("");

1334
	hci_dev_set_flag(hdev, HCI_RPA_EXPIRED);
1335

1336
	if (!hci_dev_test_flag(hdev, HCI_ADVERTISING))
1337 1338 1339 1340 1341 1342 1343 1344 1345 1346
		return;

	/* The generation of a new RPA and programming it into the
	 * controller happens in the enable_advertising() function.
	 */
	hci_req_init(&req, hdev);
	enable_advertising(&req);
	hci_req_run(&req, NULL);
}

1347
static void mgmt_init_hdev(struct sock *sk, struct hci_dev *hdev)
1348
{
1349
	if (hci_dev_test_and_set_flag(hdev, HCI_MGMT))
1350 1351
		return;

1352
	INIT_DELAYED_WORK(&hdev->service_cache, service_cache_off);
1353
	INIT_DELAYED_WORK(&hdev->rpa_expired, rpa_expired);
1354

1355 1356 1357 1358 1359
	/* 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
	 */
1360
	hci_dev_clear_flag(hdev, HCI_BONDABLE);
1361 1362
}

1363
static int read_controller_info(struct sock *sk, struct hci_dev *hdev,
1364
				void *data, u16 data_len)
1365
{
1366
	struct mgmt_rp_read_info rp;
1367

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

1370
	hci_dev_lock(hdev);
1371

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

1374
	bacpy(&rp.bdaddr, &hdev->bdaddr);
1375

1376
	rp.version = hdev->hci_ver;
1377
	rp.manufacturer = cpu_to_le16(hdev->manufacturer);
1378 1379 1380

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

1382
	memcpy(rp.dev_class, hdev->dev_class, 3);
1383

1384
	memcpy(rp.name, hdev->dev_name, sizeof(hdev->dev_name));
1385
	memcpy(rp.short_name, hdev->short_name, sizeof(hdev->short_name));
1386

1387
	hci_dev_unlock(hdev);
1388

1389 1390
	return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_INFO, 0, &rp,
				 sizeof(rp));
1391 1392
}

1393
static int send_settings_rsp(struct sock *sk, u16 opcode, struct hci_dev *hdev)
1394
{
1395
	__le32 settings = cpu_to_le32(get_current_settings(hdev));
1396

1397 1398
	return mgmt_cmd_complete(sk, hdev->id, opcode, 0, &settings,
				 sizeof(settings));
1399 1400
}

1401
static void clean_up_hci_complete(struct hci_dev *hdev, u8 status, u16 opcode)
1402 1403 1404
{
	BT_DBG("%s status 0x%02x", hdev->name, status);

1405 1406
	if (hci_conn_count(hdev) == 0) {
		cancel_delayed_work(&hdev->power_off);
1407
		queue_work(hdev->req_workqueue, &hdev->power_off.work);
1408
	}
1409 1410
}

1411
static bool hci_stop_discovery(struct hci_request *req)
1412 1413 1414 1415 1416 1417 1418
{
	struct hci_dev *hdev = req->hdev;
	struct hci_cp_remote_name_req_cancel cp;
	struct inquiry_entry *e;

	switch (hdev->discovery.state) {
	case DISCOVERY_FINDING:
1419
		if (test_bit(HCI_INQUIRY, &hdev->flags))
1420
			hci_req_add(req, HCI_OP_INQUIRY_CANCEL, 0, NULL);
1421 1422

		if (hci_dev_test_flag(hdev, HCI_LE_SCAN)) {
1423 1424 1425 1426
			cancel_delayed_work(&hdev->le_scan_disable);
			hci_req_add_le_scan_disable(req);
		}

1427
		return true;
1428 1429 1430 1431 1432

	case DISCOVERY_RESOLVING:
		e = hci_inquiry_cache_lookup_resolve(hdev, BDADDR_ANY,
						     NAME_PENDING);
		if (!e)
1433
			break;
1434 1435 1436 1437 1438

		bacpy(&cp.bdaddr, &e->data.bdaddr);
		hci_req_add(req, HCI_OP_REMOTE_NAME_REQ_CANCEL, sizeof(cp),
			    &cp);

1439
		return true;
1440 1441 1442

	default:
		/* Passive scanning */
1443
		if (hci_dev_test_flag(hdev, HCI_LE_SCAN)) {
1444
			hci_req_add_le_scan_disable(req);
1445 1446 1447
			return true;
		}

1448 1449
		break;
	}
1450 1451

	return false;
1452 1453
}

1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473
static void advertising_added(struct sock *sk, struct hci_dev *hdev,
			      u8 instance)
{
	struct mgmt_ev_advertising_added ev;

	ev.instance = instance;

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

static void advertising_removed(struct sock *sk, struct hci_dev *hdev,
				u8 instance)
{
	struct mgmt_ev_advertising_removed ev;

	ev.instance = instance;

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

1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540
static int schedule_adv_instance(struct hci_request *req, u8 instance,
				 bool force) {
	struct hci_dev *hdev = req->hdev;
	struct adv_info *adv_instance = NULL;
	u16 timeout;

	if (hci_dev_test_flag(hdev, HCI_ADVERTISING) ||
	    !hci_dev_test_flag(hdev, HCI_ADVERTISING_INSTANCE))
		return -EPERM;

	if (hdev->adv_instance_timeout)
		return -EBUSY;

	adv_instance = hci_find_adv_instance(hdev, instance);
	if (!adv_instance)
		return -ENOENT;

	/* A zero timeout means unlimited advertising. As long as there is
	 * only one instance, duration should be ignored. We still set a timeout
	 * in case further instances are being added later on.
	 *
	 * If the remaining lifetime of the instance is more than the duration
	 * then the timeout corresponds to the duration, otherwise it will be
	 * reduced to the remaining instance lifetime.
	 */
	if (adv_instance->timeout == 0 ||
	    adv_instance->duration <= adv_instance->remaining_time)
		timeout = adv_instance->duration;
	else
		timeout = adv_instance->remaining_time;

	/* The remaining time is being reduced unless the instance is being
	 * advertised without time limit.
	 */
	if (adv_instance->timeout)
		adv_instance->remaining_time =
				adv_instance->remaining_time - timeout;

	hdev->adv_instance_timeout = timeout;
	queue_delayed_work(hdev->workqueue,
			   &hdev->adv_instance_expire,
			   msecs_to_jiffies(timeout * 1000));

	/* If we're just re-scheduling the same instance again then do not
	 * execute any HCI commands. This happens when a single instance is
	 * being advertised.
	 */
	if (!force && hdev->cur_adv_instance == instance &&
	    hci_dev_test_flag(hdev, HCI_LE_ADV))
		return 0;

	hdev->cur_adv_instance = instance;
	update_adv_data(req);
	update_scan_rsp_data(req);
	enable_advertising(req);

	return 0;
}

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

1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553
/* For a single instance:
 * - force == true: The instance will be removed even when its remaining
 *   lifetime is not zero.
 * - force == false: the instance will be deactivated but kept stored unless
 *   the remaining lifetime is zero.
 *
 * For instance == 0x00:
 * - force == true: All instances will be removed regardless of their timeout
 *   setting.
 * - force == false: Only instances that have a timeout will be removed.
 */
static void clear_adv_instance(struct hci_dev *hdev, struct hci_request *req,
			       u8 instance, bool force)
1554
{
1555 1556 1557
	struct adv_info *adv_instance, *n, *next_instance = NULL;
	int err;
	u8 rem_inst;
1558

1559 1560 1561
	/* Cancel any timeout concerning the removed instance(s). */
	if (!instance || hdev->cur_adv_instance == instance)
		cancel_adv_timeout(hdev);
1562

1563 1564 1565 1566 1567 1568
	/* Get the next instance to advertise BEFORE we remove
	 * the current one. This can be the same instance again
	 * if there is only one instance.
	 */
	if (instance && hdev->cur_adv_instance == instance)
		next_instance = hci_get_next_instance(hdev, instance);
1569

1570 1571 1572 1573 1574
	if (instance == 0x00) {
		list_for_each_entry_safe(adv_instance, n, &hdev->adv_instances,
					 list) {
			if (!(force || adv_instance->timeout))
				continue;
1575

1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603
			rem_inst = adv_instance->instance;
			err = hci_remove_adv_instance(hdev, rem_inst);
			if (!err)
				advertising_removed(NULL, hdev, rem_inst);
		}
		hdev->cur_adv_instance = 0x00;
	} else {
		adv_instance = hci_find_adv_instance(hdev, instance);

		if (force || (adv_instance && adv_instance->timeout &&
			      !adv_instance->remaining_time)) {
			/* Don't advertise a removed instance. */
			if (next_instance &&
			    next_instance->instance == instance)
				next_instance = NULL;

			err = hci_remove_adv_instance(hdev, instance);
			if (!err)
				advertising_removed(NULL, hdev, instance);
		}
	}

	if (list_empty(&hdev->adv_instances)) {
		hdev->cur_adv_instance = 0x00;
		hci_dev_clear_flag(hdev, HCI_ADVERTISING_INSTANCE);
	}

	if (!req || !hdev_is_powered(hdev) ||
1604 1605 1606
	    hci_dev_test_flag(hdev, HCI_ADVERTISING))
		return;

1607 1608
	if (next_instance)
		schedule_adv_instance(req, next_instance->instance, false);
1609 1610
}

1611 1612 1613 1614
static int clean_up_hci_state(struct hci_dev *hdev)
{
	struct hci_request req;
	struct hci_conn *conn;
1615 1616
	bool discov_stopped;
	int err;
1617 1618 1619 1620 1621 1622 1623 1624 1625

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

1626
	clear_adv_instance(hdev, NULL, 0x00, false);
1627

1628
	if (hci_dev_test_flag(hdev, HCI_LE_ADV))
1629 1630
		disable_advertising(&req);

1631
	discov_stopped = hci_stop_discovery(&req);
1632 1633 1634

	list_for_each_entry(conn, &hdev->conn_hash.list, list) {
		struct hci_cp_disconnect dc;
1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662
		struct hci_cp_reject_conn_req rej;

		switch (conn->state) {
		case BT_CONNECTED:
		case BT_CONFIG:
			dc.handle = cpu_to_le16(conn->handle);
			dc.reason = 0x15; /* Terminated due to Power Off */
			hci_req_add(&req, HCI_OP_DISCONNECT, sizeof(dc), &dc);
			break;
		case BT_CONNECT:
			if (conn->type == LE_LINK)
				hci_req_add(&req, HCI_OP_LE_CREATE_CONN_CANCEL,
					    0, NULL);
			else if (conn->type == ACL_LINK)
				hci_req_add(&req, HCI_OP_CREATE_CONN_CANCEL,
					    6, &conn->dst);
			break;
		case BT_CONNECT2:
			bacpy(&rej.bdaddr, &conn->dst);
			rej.reason = 0x15; /* Terminated due to Power Off */
			if (conn->type == ACL_LINK)
				hci_req_add(&req, HCI_OP_REJECT_CONN_REQ,
					    sizeof(rej), &rej);
			else if (conn->type == SCO_LINK)
				hci_req_add(&req, HCI_OP_REJECT_SYNC_CONN_REQ,
					    sizeof(rej), &rej);
			break;
		}
1663 1664
	}

1665 1666 1667 1668 1669
	err = hci_req_run(&req, clean_up_hci_complete);
	if (!err && discov_stopped)
		hci_discovery_set_state(hdev, DISCOVERY_STOPPING);

	return err;
1670 1671
}

1672
static int set_powered(struct sock *sk, struct hci_dev *hdev, void *data,
1673
		       u16 len)
1674
{
1675
	struct mgmt_mode *cp = data;
1676
	struct mgmt_pending_cmd *cmd;
1677
	int err;
1678

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

1681
	if (cp->val != 0x00 && cp->val != 0x01)
1682 1683
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_POWERED,
				       MGMT_STATUS_INVALID_PARAMS);
1684

1685
	hci_dev_lock(hdev);
1686

1687
	if (pending_find(MGMT_OP_SET_POWERED, hdev)) {
1688 1689
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_POWERED,
				      MGMT_STATUS_BUSY);
1690 1691 1692
		goto failed;
	}

1693
	if (hci_dev_test_and_clear_flag(hdev, HCI_AUTO_OFF)) {
1694 1695 1696
		cancel_delayed_work(&hdev->power_off);

		if (cp->val) {
1697 1698 1699
			mgmt_pending_add(sk, MGMT_OP_SET_POWERED, hdev,
					 data, len);
			err = mgmt_powered(hdev, 1);
1700 1701 1702 1703
			goto failed;
		}
	}

1704
	if (!!cp->val == hdev_is_powered(hdev)) {
1705
		err = send_settings_rsp(sk, MGMT_OP_SET_POWERED, hdev);
1706 1707 1708
		goto failed;
	}

1709
	cmd = mgmt_pending_add(sk, MGMT_OP_SET_POWERED, hdev, data, len);
1710 1711
	if (!cmd) {
		err = -ENOMEM;
1712
		goto failed;
1713
	}
1714

1715
	if (cp->val) {
1716
		queue_work(hdev->req_workqueue, &hdev->power_on);
1717 1718 1719 1720
		err = 0;
	} else {
		/* Disconnect connections, stop scans, etc */
		err = clean_up_hci_state(hdev);
1721 1722 1723
		if (!err)
			queue_delayed_work(hdev->req_workqueue, &hdev->power_off,
					   HCI_POWER_OFF_TIMEOUT);
1724

1725 1726
		/* ENODATA means there were no HCI commands queued */
		if (err == -ENODATA) {
1727
			cancel_delayed_work(&hdev->power_off);
1728 1729 1730 1731
			queue_work(hdev->req_workqueue, &hdev->power_off.work);
			err = 0;
		}
	}
1732 1733

failed:
1734
	hci_dev_unlock(hdev);
1735
	return err;
1736 1737
}

1738 1739
static int new_settings(struct hci_dev *hdev, struct sock *skip)
{
1740
	__le32 ev = cpu_to_le32(get_current_settings(hdev));
1741

1742 1743
	return mgmt_generic_event(MGMT_EV_NEW_SETTINGS, hdev, &ev,
				  sizeof(ev), skip);
1744 1745
}

1746 1747 1748 1749 1750
int mgmt_new_settings(struct hci_dev *hdev)
{
	return new_settings(hdev, NULL);
}

1751 1752 1753 1754 1755 1756
struct cmd_lookup {
	struct sock *sk;
	struct hci_dev *hdev;
	u8 mgmt_status;
};

1757
static void settings_rsp(struct mgmt_pending_cmd *cmd, void *data)
1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772
{
	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);
}

1773
static void cmd_status_rsp(struct mgmt_pending_cmd *cmd, void *data)
1774 1775 1776
{
	u8 *status = data;

1777
	mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, *status);
1778 1779 1780
	mgmt_pending_remove(cmd);
}

1781
static void cmd_complete_rsp(struct mgmt_pending_cmd *cmd, void *data)
1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794
{
	if (cmd->cmd_complete) {
		u8 *status = data;

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

		return;
	}

	cmd_status_rsp(cmd, data);
}

1795
static int generic_cmd_complete(struct mgmt_pending_cmd *cmd, u8 status)
1796
{
1797 1798
	return mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, status,
				 cmd->param, cmd->param_len);
1799 1800
}

1801
static int addr_cmd_complete(struct mgmt_pending_cmd *cmd, u8 status)
1802
{
1803 1804
	return mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, status,
				 cmd->param, sizeof(struct mgmt_addr_info));
1805 1806
}

1807 1808 1809 1810
static u8 mgmt_bredr_support(struct hci_dev *hdev)
{
	if (!lmp_bredr_capable(hdev))
		return MGMT_STATUS_NOT_SUPPORTED;
1811
	else if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED))
1812 1813 1814 1815 1816 1817 1818 1819 1820
		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;
1821
	else if (!hci_dev_test_flag(hdev, HCI_LE_ENABLED))
1822 1823 1824 1825 1826
		return MGMT_STATUS_REJECTED;
	else
		return MGMT_STATUS_SUCCESS;
}

1827 1828
static void set_discoverable_complete(struct hci_dev *hdev, u8 status,
				      u16 opcode)
1829
{
1830
	struct mgmt_pending_cmd *cmd;
1831
	struct mgmt_mode *cp;
1832
	struct hci_request req;
1833 1834 1835 1836 1837 1838
	bool changed;

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

	hci_dev_lock(hdev);

1839
	cmd = pending_find(MGMT_OP_SET_DISCOVERABLE, hdev);
1840 1841 1842 1843 1844
	if (!cmd)
		goto unlock;

	if (status) {
		u8 mgmt_err = mgmt_status(status);
1845
		mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, mgmt_err);
1846
		hci_dev_clear_flag(hdev, HCI_LIMITED_DISCOVERABLE);
1847 1848 1849 1850
		goto remove_cmd;
	}

	cp = cmd->param;
1851
	if (cp->val) {
1852
		changed = !hci_dev_test_and_set_flag(hdev, HCI_DISCOVERABLE);
1853 1854 1855 1856 1857 1858 1859

		if (hdev->discov_timeout > 0) {
			int to = msecs_to_jiffies(hdev->discov_timeout * 1000);
			queue_delayed_work(hdev->workqueue, &hdev->discov_off,
					   to);
		}
	} else {
1860
		changed = hci_dev_test_and_clear_flag(hdev, HCI_DISCOVERABLE);
1861
	}
1862 1863 1864 1865 1866 1867

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

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

1868 1869
	/* When the discoverable mode gets changed, make sure
	 * that class of device has the limited discoverable
1870 1871
	 * bit correctly set. Also update page scan based on whitelist
	 * entries.
1872 1873
	 */
	hci_req_init(&req, hdev);
1874
	__hci_update_page_scan(&req);
1875 1876 1877
	update_class(&req);
	hci_req_run(&req, NULL);

1878 1879 1880 1881 1882 1883 1884
remove_cmd:
	mgmt_pending_remove(cmd);

unlock:
	hci_dev_unlock(hdev);
}

1885
static int set_discoverable(struct sock *sk, struct hci_dev *hdev, void *data,
1886
			    u16 len)
1887
{
1888
	struct mgmt_cp_set_discoverable *cp = data;
1889
	struct mgmt_pending_cmd *cmd;
1890
	struct hci_request req;
1891
	u16 timeout;
1892
	u8 scan;
1893 1894
	int err;

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

1897 1898
	if (!hci_dev_test_flag(hdev, HCI_LE_ENABLED) &&
	    !hci_dev_test_flag(hdev, HCI_BREDR_ENABLED))
1899 1900
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
				       MGMT_STATUS_REJECTED);
1901

1902
	if (cp->val != 0x00 && cp->val != 0x01 && cp->val != 0x02)
1903 1904
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
				       MGMT_STATUS_INVALID_PARAMS);
1905

1906
	timeout = __le16_to_cpu(cp->timeout);
1907 1908 1909 1910 1911 1912

	/* 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))
1913 1914
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
				       MGMT_STATUS_INVALID_PARAMS);
1915

1916
	hci_dev_lock(hdev);
1917

1918
	if (!hdev_is_powered(hdev) && timeout > 0) {
1919 1920
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
				      MGMT_STATUS_NOT_POWERED);
1921 1922 1923
		goto failed;
	}

1924 1925
	if (pending_find(MGMT_OP_SET_DISCOVERABLE, hdev) ||
	    pending_find(MGMT_OP_SET_CONNECTABLE, hdev)) {
1926 1927
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
				      MGMT_STATUS_BUSY);
1928 1929 1930
		goto failed;
	}

1931
	if (!hci_dev_test_flag(hdev, HCI_CONNECTABLE)) {
1932 1933
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
				      MGMT_STATUS_REJECTED);
1934 1935 1936 1937
		goto failed;
	}

	if (!hdev_is_powered(hdev)) {
1938 1939
		bool changed = false;

1940 1941 1942 1943
		/* 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.
		 */
1944
		if (!!cp->val != hci_dev_test_flag(hdev, HCI_DISCOVERABLE)) {
1945
			hci_dev_change_flag(hdev, HCI_DISCOVERABLE);
1946 1947 1948
			changed = true;
		}

1949
		err = send_settings_rsp(sk, MGMT_OP_SET_DISCOVERABLE, hdev);
1950 1951 1952 1953 1954 1955
		if (err < 0)
			goto failed;

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

1956 1957 1958
		goto failed;
	}

1959 1960 1961 1962
	/* 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.
	 */
1963 1964 1965
	if (!!cp->val == hci_dev_test_flag(hdev, HCI_DISCOVERABLE) &&
	    (cp->val == 0x02) == hci_dev_test_flag(hdev,
						   HCI_LIMITED_DISCOVERABLE)) {
1966 1967
		cancel_delayed_work(&hdev->discov_off);
		hdev->discov_timeout = timeout;
1968

1969 1970
		if (cp->val && hdev->discov_timeout > 0) {
			int to = msecs_to_jiffies(hdev->discov_timeout * 1000);
1971
			queue_delayed_work(hdev->workqueue, &hdev->discov_off,
1972
					   to);
1973 1974
		}

1975
		err = send_settings_rsp(sk, MGMT_OP_SET_DISCOVERABLE, hdev);
1976 1977 1978
		goto failed;
	}

1979
	cmd = mgmt_pending_add(sk, MGMT_OP_SET_DISCOVERABLE, hdev, data, len);
1980 1981
	if (!cmd) {
		err = -ENOMEM;
1982
		goto failed;
1983
	}
1984

1985 1986 1987 1988 1989 1990 1991
	/* 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;

1992 1993
	/* Limited discoverable mode */
	if (cp->val == 0x02)
1994
		hci_dev_set_flag(hdev, HCI_LIMITED_DISCOVERABLE);
1995
	else
1996
		hci_dev_clear_flag(hdev, HCI_LIMITED_DISCOVERABLE);
1997

1998 1999
	hci_req_init(&req, hdev);

2000 2001 2002
	/* The procedure for LE-only controllers is much simpler - just
	 * update the advertising data.
	 */
2003
	if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED))
2004 2005
		goto update_ad;

2006 2007
	scan = SCAN_PAGE;

2008 2009 2010 2011 2012
	if (cp->val) {
		struct hci_cp_write_current_iac_lap hci_cp;

		if (cp->val == 0x02) {
			/* Limited discoverable mode */
2013
			hci_cp.num_iac = min_t(u8, hdev->num_iac, 2);
2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030
			hci_cp.iac_lap[0] = 0x00;	/* LIAC */
			hci_cp.iac_lap[1] = 0x8b;
			hci_cp.iac_lap[2] = 0x9e;
			hci_cp.iac_lap[3] = 0x33;	/* GIAC */
			hci_cp.iac_lap[4] = 0x8b;
			hci_cp.iac_lap[5] = 0x9e;
		} else {
			/* General discoverable mode */
			hci_cp.num_iac = 1;
			hci_cp.iac_lap[0] = 0x33;	/* GIAC */
			hci_cp.iac_lap[1] = 0x8b;
			hci_cp.iac_lap[2] = 0x9e;
		}

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

2031
		scan |= SCAN_INQUIRY;
2032
	} else {
2033
		hci_dev_clear_flag(hdev, HCI_LIMITED_DISCOVERABLE);
2034
	}
2035

2036
	hci_req_add(&req, HCI_OP_WRITE_SCAN_ENABLE, sizeof(scan), &scan);
2037

2038 2039 2040
update_ad:
	update_adv_data(&req);

2041
	err = hci_req_run(&req, set_discoverable_complete);
2042
	if (err < 0)
2043
		mgmt_pending_remove(cmd);
2044 2045

failed:
2046
	hci_dev_unlock(hdev);
2047 2048 2049
	return err;
}

2050 2051
static void write_fast_connectable(struct hci_request *req, bool enable)
{
2052
	struct hci_dev *hdev = req->hdev;
2053 2054 2055
	struct hci_cp_write_page_scan_activity acp;
	u8 type;

2056
	if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED))
2057 2058
		return;

2059 2060 2061
	if (hdev->hci_ver < BLUETOOTH_VER_1_2)
		return;

2062 2063 2064 2065
	if (enable) {
		type = PAGE_SCAN_TYPE_INTERLACED;

		/* 160 msec page scan interval */
2066
		acp.interval = cpu_to_le16(0x0100);
2067 2068 2069 2070
	} else {
		type = PAGE_SCAN_TYPE_STANDARD;	/* default */

		/* default 1.28 sec page scan */
2071
		acp.interval = cpu_to_le16(0x0800);
2072 2073
	}

2074
	acp.window = cpu_to_le16(0x0012);
2075

2076 2077 2078 2079 2080 2081 2082
	if (__cpu_to_le16(hdev->page_scan_interval) != acp.interval ||
	    __cpu_to_le16(hdev->page_scan_window) != acp.window)
		hci_req_add(req, HCI_OP_WRITE_PAGE_SCAN_ACTIVITY,
			    sizeof(acp), &acp);

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

2085 2086
static void set_connectable_complete(struct hci_dev *hdev, u8 status,
				     u16 opcode)
2087
{
2088
	struct mgmt_pending_cmd *cmd;
2089
	struct mgmt_mode *cp;
2090
	bool conn_changed, discov_changed;
2091 2092 2093 2094 2095

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

	hci_dev_lock(hdev);

2096
	cmd = pending_find(MGMT_OP_SET_CONNECTABLE, hdev);
2097 2098 2099
	if (!cmd)
		goto unlock;

2100 2101
	if (status) {
		u8 mgmt_err = mgmt_status(status);
2102
		mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, mgmt_err);
2103 2104 2105
		goto remove_cmd;
	}

2106
	cp = cmd->param;
2107
	if (cp->val) {
2108 2109
		conn_changed = !hci_dev_test_and_set_flag(hdev,
							  HCI_CONNECTABLE);
2110 2111
		discov_changed = false;
	} else {
2112 2113 2114 2115
		conn_changed = hci_dev_test_and_clear_flag(hdev,
							   HCI_CONNECTABLE);
		discov_changed = hci_dev_test_and_clear_flag(hdev,
							     HCI_DISCOVERABLE);
2116
	}
2117

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

2120
	if (conn_changed || discov_changed) {
2121
		new_settings(hdev, cmd->sk);
2122
		hci_update_page_scan(hdev);
2123 2124
		if (discov_changed)
			mgmt_update_adv_data(hdev);
2125 2126
		hci_update_background_scan(hdev);
	}
2127

2128
remove_cmd:
2129 2130 2131 2132 2133 2134
	mgmt_pending_remove(cmd);

unlock:
	hci_dev_unlock(hdev);
}

2135 2136 2137 2138 2139 2140
static int set_connectable_update_settings(struct hci_dev *hdev,
					   struct sock *sk, u8 val)
{
	bool changed = false;
	int err;

2141
	if (!!val != hci_dev_test_flag(hdev, HCI_CONNECTABLE))
2142 2143 2144
		changed = true;

	if (val) {
2145
		hci_dev_set_flag(hdev, HCI_CONNECTABLE);
2146
	} else {
2147 2148
		hci_dev_clear_flag(hdev, HCI_CONNECTABLE);
		hci_dev_clear_flag(hdev, HCI_DISCOVERABLE);
2149 2150 2151 2152 2153 2154
	}

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

2155
	if (changed) {
2156
		hci_update_page_scan(hdev);
2157
		hci_update_background_scan(hdev);
2158
		return new_settings(hdev, sk);
2159
	}
2160 2161 2162 2163

	return 0;
}

2164
static int set_connectable(struct sock *sk, struct hci_dev *hdev, void *data,
2165
			   u16 len)
2166
{
2167
	struct mgmt_mode *cp = data;
2168
	struct mgmt_pending_cmd *cmd;
2169
	struct hci_request req;
2170
	u8 scan;
2171 2172
	int err;

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

2175 2176
	if (!hci_dev_test_flag(hdev, HCI_LE_ENABLED) &&
	    !hci_dev_test_flag(hdev, HCI_BREDR_ENABLED))
2177 2178
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE,
				       MGMT_STATUS_REJECTED);
2179

2180
	if (cp->val != 0x00 && cp->val != 0x01)
2181 2182
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE,
				       MGMT_STATUS_INVALID_PARAMS);
2183

2184
	hci_dev_lock(hdev);
2185

2186
	if (!hdev_is_powered(hdev)) {
2187
		err = set_connectable_update_settings(hdev, sk, cp->val);
2188 2189 2190
		goto failed;
	}

2191 2192
	if (pending_find(MGMT_OP_SET_DISCOVERABLE, hdev) ||
	    pending_find(MGMT_OP_SET_CONNECTABLE, hdev)) {
2193 2194
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE,
				      MGMT_STATUS_BUSY);
2195 2196 2197
		goto failed;
	}

2198
	cmd = mgmt_pending_add(sk, MGMT_OP_SET_CONNECTABLE, hdev, data, len);
2199 2200
	if (!cmd) {
		err = -ENOMEM;
2201
		goto failed;
2202
	}
2203

2204
	hci_req_init(&req, hdev);
2205

2206 2207 2208 2209
	/* If BR/EDR is not enabled and we disable advertising as a
	 * by-product of disabling connectable, we need to update the
	 * advertising flags.
	 */
2210
	if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) {
2211
		if (!cp->val) {
2212 2213
			hci_dev_clear_flag(hdev, HCI_LIMITED_DISCOVERABLE);
			hci_dev_clear_flag(hdev, HCI_DISCOVERABLE);
2214 2215 2216
		}
		update_adv_data(&req);
	} else if (cp->val != test_bit(HCI_PSCAN, &hdev->flags)) {
2217 2218 2219
		if (cp->val) {
			scan = SCAN_PAGE;
		} else {
2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231
			/* If we don't have any whitelist entries just
			 * disable all scanning. If there are entries
			 * and we had both page and inquiry scanning
			 * enabled then fall back to only page scanning.
			 * Otherwise no changes are needed.
			 */
			if (list_empty(&hdev->whitelist))
				scan = SCAN_DISABLED;
			else if (test_bit(HCI_ISCAN, &hdev->flags))
				scan = SCAN_PAGE;
			else
				goto no_scan_update;
2232 2233

			if (test_bit(HCI_ISCAN, &hdev->flags) &&
2234
			    hdev->discov_timeout > 0)
2235 2236
				cancel_delayed_work(&hdev->discov_off);
		}
2237

2238 2239
		hci_req_add(&req, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);
	}
2240

2241
no_scan_update:
2242
	/* Update the advertising parameters if necessary */
2243 2244
	if (hci_dev_test_flag(hdev, HCI_ADVERTISING) ||
	    hci_dev_test_flag(hdev, HCI_ADVERTISING_INSTANCE))
2245 2246
		enable_advertising(&req);

2247
	err = hci_req_run(&req, set_connectable_complete);
2248
	if (err < 0) {
2249
		mgmt_pending_remove(cmd);
2250
		if (err == -ENODATA)
2251 2252
			err = set_connectable_update_settings(hdev, sk,
							      cp->val);
2253 2254
		goto failed;
	}
2255 2256

failed:
2257
	hci_dev_unlock(hdev);
2258 2259 2260
	return err;
}

2261
static int set_bondable(struct sock *sk, struct hci_dev *hdev, void *data,
2262
			u16 len)
2263
{
2264
	struct mgmt_mode *cp = data;
2265
	bool changed;
2266 2267
	int err;

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

2270
	if (cp->val != 0x00 && cp->val != 0x01)
2271 2272
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BONDABLE,
				       MGMT_STATUS_INVALID_PARAMS);
2273

2274
	hci_dev_lock(hdev);
2275 2276

	if (cp->val)
2277
		changed = !hci_dev_test_and_set_flag(hdev, HCI_BONDABLE);
2278
	else
2279
		changed = hci_dev_test_and_clear_flag(hdev, HCI_BONDABLE);
2280

2281
	err = send_settings_rsp(sk, MGMT_OP_SET_BONDABLE, hdev);
2282
	if (err < 0)
2283
		goto unlock;
2284

2285 2286
	if (changed)
		err = new_settings(hdev, sk);
2287

2288
unlock:
2289
	hci_dev_unlock(hdev);
2290 2291 2292
	return err;
}

2293 2294
static int set_link_security(struct sock *sk, struct hci_dev *hdev, void *data,
			     u16 len)
2295 2296
{
	struct mgmt_mode *cp = data;
2297
	struct mgmt_pending_cmd *cmd;
2298
	u8 val, status;
2299 2300
	int err;

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

2303 2304
	status = mgmt_bredr_support(hdev);
	if (status)
2305 2306
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY,
				       status);
2307

2308
	if (cp->val != 0x00 && cp->val != 0x01)
2309 2310
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY,
				       MGMT_STATUS_INVALID_PARAMS);
2311

2312 2313
	hci_dev_lock(hdev);

2314
	if (!hdev_is_powered(hdev)) {
2315 2316
		bool changed = false;

2317
		if (!!cp->val != hci_dev_test_flag(hdev, HCI_LINK_SECURITY)) {
2318
			hci_dev_change_flag(hdev, HCI_LINK_SECURITY);
2319 2320 2321 2322 2323 2324 2325 2326 2327 2328
			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);

2329 2330 2331
		goto failed;
	}

2332
	if (pending_find(MGMT_OP_SET_LINK_SECURITY, hdev)) {
2333 2334
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY,
				      MGMT_STATUS_BUSY);
2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361
		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;
}

2362
static int set_ssp(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
2363 2364
{
	struct mgmt_mode *cp = data;
2365
	struct mgmt_pending_cmd *cmd;
2366
	u8 status;
2367 2368
	int err;

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

2371 2372
	status = mgmt_bredr_support(hdev);
	if (status)
2373
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SSP, status);
2374

2375
	if (!lmp_ssp_capable(hdev))
2376 2377
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SSP,
				       MGMT_STATUS_NOT_SUPPORTED);
2378

2379
	if (cp->val != 0x00 && cp->val != 0x01)
2380 2381
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SSP,
				       MGMT_STATUS_INVALID_PARAMS);
2382

2383
	hci_dev_lock(hdev);
2384

2385
	if (!hdev_is_powered(hdev)) {
2386
		bool changed;
2387

2388
		if (cp->val) {
2389 2390
			changed = !hci_dev_test_and_set_flag(hdev,
							     HCI_SSP_ENABLED);
2391
		} else {
2392 2393
			changed = hci_dev_test_and_clear_flag(hdev,
							      HCI_SSP_ENABLED);
2394
			if (!changed)
2395 2396
				changed = hci_dev_test_and_clear_flag(hdev,
								      HCI_HS_ENABLED);
2397
			else
2398
				hci_dev_clear_flag(hdev, HCI_HS_ENABLED);
2399 2400 2401 2402 2403 2404 2405 2406 2407
		}

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

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

2408 2409 2410
		goto failed;
	}

2411
	if (pending_find(MGMT_OP_SET_SSP, hdev)) {
2412 2413
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SSP,
				      MGMT_STATUS_BUSY);
2414 2415 2416
		goto failed;
	}

2417
	if (!!cp->val == hci_dev_test_flag(hdev, HCI_SSP_ENABLED)) {
2418 2419 2420 2421 2422 2423 2424 2425 2426 2427
		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;
	}

2428
	if (!cp->val && hci_dev_test_flag(hdev, HCI_USE_DEBUG_KEYS))
2429 2430 2431
		hci_send_cmd(hdev, HCI_OP_WRITE_SSP_DEBUG_MODE,
			     sizeof(cp->val), &cp->val);

2432
	err = hci_send_cmd(hdev, HCI_OP_WRITE_SSP_MODE, 1, &cp->val);
2433 2434 2435 2436 2437 2438 2439 2440 2441 2442
	if (err < 0) {
		mgmt_pending_remove(cmd);
		goto failed;
	}

failed:
	hci_dev_unlock(hdev);
	return err;
}

2443
static int set_hs(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
2444 2445
{
	struct mgmt_mode *cp = data;
2446
	bool changed;
2447
	u8 status;
2448
	int err;
2449

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

2452 2453
	status = mgmt_bredr_support(hdev);
	if (status)
2454
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS, status);
2455

2456
	if (!lmp_ssp_capable(hdev))
2457 2458
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS,
				       MGMT_STATUS_NOT_SUPPORTED);
2459

2460
	if (!hci_dev_test_flag(hdev, HCI_SSP_ENABLED))
2461 2462
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS,
				       MGMT_STATUS_REJECTED);
2463

2464
	if (cp->val != 0x00 && cp->val != 0x01)
2465 2466
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS,
				       MGMT_STATUS_INVALID_PARAMS);
2467

2468 2469
	hci_dev_lock(hdev);

2470
	if (pending_find(MGMT_OP_SET_SSP, hdev)) {
2471 2472
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS,
				      MGMT_STATUS_BUSY);
2473 2474 2475
		goto unlock;
	}

2476
	if (cp->val) {
2477
		changed = !hci_dev_test_and_set_flag(hdev, HCI_HS_ENABLED);
2478 2479
	} else {
		if (hdev_is_powered(hdev)) {
2480 2481
			err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS,
					      MGMT_STATUS_REJECTED);
2482 2483 2484
			goto unlock;
		}

2485
		changed = hci_dev_test_and_clear_flag(hdev, HCI_HS_ENABLED);
2486
	}
2487 2488 2489 2490 2491 2492 2493

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

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

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

2500
static void le_enable_complete(struct hci_dev *hdev, u8 status, u16 opcode)
2501 2502 2503
{
	struct cmd_lookup match = { NULL, hdev };

2504 2505
	hci_dev_lock(hdev);

2506 2507 2508 2509 2510
	if (status) {
		u8 mgmt_err = mgmt_status(status);

		mgmt_pending_foreach(MGMT_OP_SET_LE, hdev, cmd_status_rsp,
				     &mgmt_err);
2511
		goto unlock;
2512 2513 2514 2515 2516 2517 2518 2519
	}

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

	new_settings(hdev, match.sk);

	if (match.sk)
		sock_put(match.sk);
2520 2521 2522 2523 2524 2525

	/* 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.
	 */
2526
	if (hci_dev_test_flag(hdev, HCI_LE_ENABLED)) {
2527 2528 2529
		struct hci_request req;

		hci_req_init(&req, hdev);
2530
		update_adv_data(&req);
2531
		update_scan_rsp_data(&req);
2532
		__hci_update_background_scan(&req);
2533 2534
		hci_req_run(&req, NULL);
	}
2535 2536 2537

unlock:
	hci_dev_unlock(hdev);
2538 2539
}

2540
static int set_le(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
2541 2542 2543
{
	struct mgmt_mode *cp = data;
	struct hci_cp_write_le_host_supported hci_cp;
2544
	struct mgmt_pending_cmd *cmd;
2545
	struct hci_request req;
2546
	int err;
2547
	u8 val, enabled;
2548

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

2551
	if (!lmp_le_capable(hdev))
2552 2553
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
				       MGMT_STATUS_NOT_SUPPORTED);
2554

2555
	if (cp->val != 0x00 && cp->val != 0x01)
2556 2557
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
				       MGMT_STATUS_INVALID_PARAMS);
2558

2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571
	/* 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);

2572 2573
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
				       MGMT_STATUS_REJECTED);
2574
	}
2575

2576
	hci_dev_lock(hdev);
2577 2578

	val = !!cp->val;
2579
	enabled = lmp_host_le_capable(hdev);
2580

2581 2582 2583
	if (!val)
		clear_adv_instance(hdev, NULL, 0x00, true);

2584
	if (!hdev_is_powered(hdev) || val == enabled) {
2585 2586
		bool changed = false;

2587
		if (val != hci_dev_test_flag(hdev, HCI_LE_ENABLED)) {
2588
			hci_dev_change_flag(hdev, HCI_LE_ENABLED);
2589 2590 2591
			changed = true;
		}

2592
		if (!val && hci_dev_test_flag(hdev, HCI_ADVERTISING)) {
2593
			hci_dev_clear_flag(hdev, HCI_ADVERTISING);
2594 2595 2596
			changed = true;
		}

2597 2598
		err = send_settings_rsp(sk, MGMT_OP_SET_LE, hdev);
		if (err < 0)
2599
			goto unlock;
2600 2601 2602 2603

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

2604
		goto unlock;
2605 2606
	}

2607 2608
	if (pending_find(MGMT_OP_SET_LE, hdev) ||
	    pending_find(MGMT_OP_SET_ADVERTISING, hdev)) {
2609 2610
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
				      MGMT_STATUS_BUSY);
2611
		goto unlock;
2612 2613 2614 2615 2616
	}

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

2620 2621
	hci_req_init(&req, hdev);

2622 2623 2624 2625
	memset(&hci_cp, 0, sizeof(hci_cp));

	if (val) {
		hci_cp.le = val;
2626
		hci_cp.simul = 0x00;
2627
	} else {
2628
		if (hci_dev_test_flag(hdev, HCI_LE_ADV))
2629
			disable_advertising(&req);
2630 2631
	}

2632 2633 2634 2635
	hci_req_add(&req, HCI_OP_WRITE_LE_HOST_SUPPORTED, sizeof(hci_cp),
		    &hci_cp);

	err = hci_req_run(&req, le_enable_complete);
2636
	if (err < 0)
2637 2638
		mgmt_pending_remove(cmd);

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

2644 2645 2646 2647 2648 2649 2650 2651
/* 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)
{
2652
	struct mgmt_pending_cmd *cmd;
2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666

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

2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685
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;
}

2686 2687
static void mgmt_class_complete(struct hci_dev *hdev, u16 mgmt_op, u8 status)
{
2688
	struct mgmt_pending_cmd *cmd;
2689 2690 2691

	hci_dev_lock(hdev);

2692
	cmd = pending_find(mgmt_op, hdev);
2693 2694 2695
	if (!cmd)
		goto unlock;

2696 2697
	mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode,
			  mgmt_status(status), hdev->dev_class, 3);
2698 2699 2700 2701 2702 2703 2704

	mgmt_pending_remove(cmd);

unlock:
	hci_dev_unlock(hdev);
}

2705
static void add_uuid_complete(struct hci_dev *hdev, u8 status, u16 opcode)
2706 2707 2708 2709 2710 2711
{
	BT_DBG("status 0x%02x", status);

	mgmt_class_complete(hdev, MGMT_OP_ADD_UUID, status);
}

2712
static int add_uuid(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
2713
{
2714
	struct mgmt_cp_add_uuid *cp = data;
2715
	struct mgmt_pending_cmd *cmd;
2716
	struct hci_request req;
2717 2718 2719
	struct bt_uuid *uuid;
	int err;

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

2722
	hci_dev_lock(hdev);
2723

2724
	if (pending_eir_or_class(hdev)) {
2725 2726
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_UUID,
				      MGMT_STATUS_BUSY);
2727 2728 2729
		goto failed;
	}

2730
	uuid = kmalloc(sizeof(*uuid), GFP_KERNEL);
2731 2732 2733 2734 2735 2736
	if (!uuid) {
		err = -ENOMEM;
		goto failed;
	}

	memcpy(uuid->uuid, cp->uuid, 16);
2737
	uuid->svc_hint = cp->svc_hint;
2738
	uuid->size = get_uuid_size(cp->uuid);
2739

2740
	list_add_tail(&uuid->list, &hdev->uuids);
2741

2742
	hci_req_init(&req, hdev);
2743

2744 2745 2746
	update_class(&req);
	update_eir(&req);

2747 2748 2749 2750
	err = hci_req_run(&req, add_uuid_complete);
	if (err < 0) {
		if (err != -ENODATA)
			goto failed;
2751

2752 2753
		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_UUID, 0,
					hdev->dev_class, 3);
2754 2755 2756 2757
		goto failed;
	}

	cmd = mgmt_pending_add(sk, MGMT_OP_ADD_UUID, hdev, data, len);
2758
	if (!cmd) {
2759
		err = -ENOMEM;
2760 2761 2762 2763
		goto failed;
	}

	err = 0;
2764 2765

failed:
2766
	hci_dev_unlock(hdev);
2767 2768 2769
	return err;
}

2770 2771 2772 2773 2774
static bool enable_service_cache(struct hci_dev *hdev)
{
	if (!hdev_is_powered(hdev))
		return false;

2775
	if (!hci_dev_test_and_set_flag(hdev, HCI_SERVICE_CACHE)) {
2776 2777
		queue_delayed_work(hdev->workqueue, &hdev->service_cache,
				   CACHE_TIMEOUT);
2778 2779 2780 2781 2782 2783
		return true;
	}

	return false;
}

2784
static void remove_uuid_complete(struct hci_dev *hdev, u8 status, u16 opcode)
2785 2786 2787 2788 2789 2790
{
	BT_DBG("status 0x%02x", status);

	mgmt_class_complete(hdev, MGMT_OP_REMOVE_UUID, status);
}

2791
static int remove_uuid(struct sock *sk, struct hci_dev *hdev, void *data,
2792
		       u16 len)
2793
{
2794
	struct mgmt_cp_remove_uuid *cp = data;
2795
	struct mgmt_pending_cmd *cmd;
2796
	struct bt_uuid *match, *tmp;
2797
	u8 bt_uuid_any[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
2798
	struct hci_request req;
2799 2800
	int err, found;

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

2803
	hci_dev_lock(hdev);
2804

2805
	if (pending_eir_or_class(hdev)) {
2806 2807
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_REMOVE_UUID,
				      MGMT_STATUS_BUSY);
2808 2809 2810
		goto unlock;
	}

2811
	if (memcmp(cp->uuid, bt_uuid_any, 16) == 0) {
2812
		hci_uuids_clear(hdev);
2813

2814
		if (enable_service_cache(hdev)) {
2815 2816 2817
			err = mgmt_cmd_complete(sk, hdev->id,
						MGMT_OP_REMOVE_UUID,
						0, hdev->dev_class, 3);
2818 2819
			goto unlock;
		}
2820

2821
		goto update_class;
2822 2823 2824 2825
	}

	found = 0;

2826
	list_for_each_entry_safe(match, tmp, &hdev->uuids, list) {
2827 2828 2829 2830
		if (memcmp(match->uuid, cp->uuid, 16) != 0)
			continue;

		list_del(&match->list);
2831
		kfree(match);
2832 2833 2834 2835
		found++;
	}

	if (found == 0) {
2836 2837
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_REMOVE_UUID,
				      MGMT_STATUS_INVALID_PARAMS);
2838 2839 2840
		goto unlock;
	}

2841
update_class:
2842
	hci_req_init(&req, hdev);
2843

2844 2845 2846
	update_class(&req);
	update_eir(&req);

2847 2848 2849 2850
	err = hci_req_run(&req, remove_uuid_complete);
	if (err < 0) {
		if (err != -ENODATA)
			goto unlock;
2851

2852 2853
		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_UUID, 0,
					hdev->dev_class, 3);
2854 2855 2856 2857
		goto unlock;
	}

	cmd = mgmt_pending_add(sk, MGMT_OP_REMOVE_UUID, hdev, data, len);
2858
	if (!cmd) {
2859
		err = -ENOMEM;
2860 2861 2862 2863
		goto unlock;
	}

	err = 0;
2864 2865

unlock:
2866
	hci_dev_unlock(hdev);
2867 2868 2869
	return err;
}

2870
static void set_class_complete(struct hci_dev *hdev, u8 status, u16 opcode)
2871 2872 2873 2874 2875 2876
{
	BT_DBG("status 0x%02x", status);

	mgmt_class_complete(hdev, MGMT_OP_SET_DEV_CLASS, status);
}

2877
static int set_dev_class(struct sock *sk, struct hci_dev *hdev, void *data,
2878
			 u16 len)
2879
{
2880
	struct mgmt_cp_set_dev_class *cp = data;
2881
	struct mgmt_pending_cmd *cmd;
2882
	struct hci_request req;
2883 2884
	int err;

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

2887
	if (!lmp_bredr_capable(hdev))
2888 2889
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS,
				       MGMT_STATUS_NOT_SUPPORTED);
2890

2891
	hci_dev_lock(hdev);
2892

2893
	if (pending_eir_or_class(hdev)) {
2894 2895
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS,
				      MGMT_STATUS_BUSY);
2896 2897
		goto unlock;
	}
2898

2899
	if ((cp->minor & 0x03) != 0 || (cp->major & 0xe0) != 0) {
2900 2901
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS,
				      MGMT_STATUS_INVALID_PARAMS);
2902 2903
		goto unlock;
	}
2904

2905 2906 2907
	hdev->major_class = cp->major;
	hdev->minor_class = cp->minor;

2908
	if (!hdev_is_powered(hdev)) {
2909 2910
		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, 0,
					hdev->dev_class, 3);
2911 2912 2913
		goto unlock;
	}

2914 2915
	hci_req_init(&req, hdev);

2916
	if (hci_dev_test_and_clear_flag(hdev, HCI_SERVICE_CACHE)) {
2917 2918 2919
		hci_dev_unlock(hdev);
		cancel_delayed_work_sync(&hdev->service_cache);
		hci_dev_lock(hdev);
2920
		update_eir(&req);
2921
	}
2922

2923 2924
	update_class(&req);

2925 2926 2927 2928
	err = hci_req_run(&req, set_class_complete);
	if (err < 0) {
		if (err != -ENODATA)
			goto unlock;
2929

2930 2931
		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, 0,
					hdev->dev_class, 3);
2932 2933 2934 2935
		goto unlock;
	}

	cmd = mgmt_pending_add(sk, MGMT_OP_SET_DEV_CLASS, hdev, data, len);
2936
	if (!cmd) {
2937
		err = -ENOMEM;
2938 2939 2940 2941
		goto unlock;
	}

	err = 0;
2942

2943
unlock:
2944
	hci_dev_unlock(hdev);
2945 2946 2947
	return err;
}

2948
static int load_link_keys(struct sock *sk, struct hci_dev *hdev, void *data,
2949
			  u16 len)
2950
{
2951
	struct mgmt_cp_load_link_keys *cp = data;
2952 2953
	const u16 max_key_count = ((U16_MAX - sizeof(*cp)) /
				   sizeof(struct mgmt_link_key_info));
2954
	u16 key_count, expected_len;
2955
	bool changed;
2956
	int i;
2957

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

	if (!lmp_bredr_capable(hdev))
2961 2962
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS,
				       MGMT_STATUS_NOT_SUPPORTED);
2963

2964
	key_count = __le16_to_cpu(cp->key_count);
2965 2966 2967
	if (key_count > max_key_count) {
		BT_ERR("load_link_keys: too big key_count value %u",
		       key_count);
2968 2969
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS,
				       MGMT_STATUS_INVALID_PARAMS);
2970
	}
2971

2972 2973
	expected_len = sizeof(*cp) + key_count *
					sizeof(struct mgmt_link_key_info);
2974
	if (expected_len != len) {
2975
		BT_ERR("load_link_keys: expected %u bytes, got %u bytes",
2976
		       expected_len, len);
2977 2978
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS,
				       MGMT_STATUS_INVALID_PARAMS);
2979 2980
	}

2981
	if (cp->debug_keys != 0x00 && cp->debug_keys != 0x01)
2982 2983
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS,
				       MGMT_STATUS_INVALID_PARAMS);
2984

2985
	BT_DBG("%s debug_keys %u key_count %u", hdev->name, cp->debug_keys,
2986
	       key_count);
2987

2988 2989 2990
	for (i = 0; i < key_count; i++) {
		struct mgmt_link_key_info *key = &cp->keys[i];

2991
		if (key->addr.type != BDADDR_BREDR || key->type > 0x08)
2992 2993 2994
			return mgmt_cmd_status(sk, hdev->id,
					       MGMT_OP_LOAD_LINK_KEYS,
					       MGMT_STATUS_INVALID_PARAMS);
2995 2996
	}

2997
	hci_dev_lock(hdev);
2998 2999 3000 3001

	hci_link_keys_clear(hdev);

	if (cp->debug_keys)
3002
		changed = !hci_dev_test_and_set_flag(hdev, HCI_KEEP_DEBUG_KEYS);
3003
	else
3004 3005
		changed = hci_dev_test_and_clear_flag(hdev,
						      HCI_KEEP_DEBUG_KEYS);
3006 3007 3008

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

3010
	for (i = 0; i < key_count; i++) {
3011
		struct mgmt_link_key_info *key = &cp->keys[i];
3012

3013 3014 3015 3016 3017 3018
		/* Always ignore debug keys and require a new pairing if
		 * the user wants to use them.
		 */
		if (key->type == HCI_LK_DEBUG_COMBINATION)
			continue;

3019 3020
		hci_add_link_key(hdev, NULL, &key->addr.bdaddr, key->val,
				 key->type, key->pin_len, NULL);
3021 3022
	}

3023
	mgmt_cmd_complete(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS, 0, NULL, 0);
3024

3025
	hci_dev_unlock(hdev);
3026

3027
	return 0;
3028 3029
}

3030
static int device_unpaired(struct hci_dev *hdev, bdaddr_t *bdaddr,
3031
			   u8 addr_type, struct sock *skip_sk)
3032 3033 3034 3035 3036 3037 3038
{
	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),
3039
			  skip_sk);
3040 3041
}

3042
static int unpair_device(struct sock *sk, struct hci_dev *hdev, void *data,
3043
			 u16 len)
3044
{
3045 3046
	struct mgmt_cp_unpair_device *cp = data;
	struct mgmt_rp_unpair_device rp;
3047
	struct hci_cp_disconnect dc;
3048
	struct mgmt_pending_cmd *cmd;
3049 3050 3051
	struct hci_conn *conn;
	int err;

3052
	memset(&rp, 0, sizeof(rp));
3053 3054
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;
3055

3056
	if (!bdaddr_type_is_valid(cp->addr.type))
3057 3058 3059
		return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
					 MGMT_STATUS_INVALID_PARAMS,
					 &rp, sizeof(rp));
3060

3061
	if (cp->disconnect != 0x00 && cp->disconnect != 0x01)
3062 3063 3064
		return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
					 MGMT_STATUS_INVALID_PARAMS,
					 &rp, sizeof(rp));
3065

3066 3067
	hci_dev_lock(hdev);

3068
	if (!hdev_is_powered(hdev)) {
3069 3070 3071
		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
					MGMT_STATUS_NOT_POWERED, &rp,
					sizeof(rp));
3072 3073 3074
		goto unlock;
	}

3075
	if (cp->addr.type == BDADDR_BREDR) {
3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088
		/* 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;

3089
		err = hci_remove_link_key(hdev, &cp->addr.bdaddr);
3090 3091 3092
	} else {
		u8 addr_type;

3093 3094 3095 3096 3097
		if (cp->addr.type == BDADDR_LE_PUBLIC)
			addr_type = ADDR_LE_DEV_PUBLIC;
		else
			addr_type = ADDR_LE_DEV_RANDOM;

3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112
		conn = hci_conn_hash_lookup_ba(hdev, LE_LINK,
					       &cp->addr.bdaddr);
		if (conn) {
			/* 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);

			/* If disconnection is not requested, then
			 * clear the connection variable so that the
			 * link is not terminated.
			 */
			if (!cp->disconnect)
				conn = NULL;
3113 3114
		} else {
			hci_conn_params_del(hdev, &cp->addr.bdaddr, addr_type);
3115 3116
		}

3117 3118
		hci_remove_irk(hdev, &cp->addr.bdaddr, addr_type);

3119 3120
		err = hci_remove_ltk(hdev, &cp->addr.bdaddr, addr_type);
	}
3121

3122
	if (err < 0) {
3123 3124 3125
		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
					MGMT_STATUS_NOT_PAIRED, &rp,
					sizeof(rp));
3126 3127 3128
		goto unlock;
	}

3129 3130 3131
	/* If the connection variable is set, then termination of the
	 * link is requested.
	 */
3132
	if (!conn) {
3133 3134
		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE, 0,
					&rp, sizeof(rp));
3135
		device_unpaired(hdev, &cp->addr.bdaddr, cp->addr.type, sk);
3136 3137
		goto unlock;
	}
3138

3139
	cmd = mgmt_pending_add(sk, MGMT_OP_UNPAIR_DEVICE, hdev, cp,
3140
			       sizeof(*cp));
3141 3142 3143
	if (!cmd) {
		err = -ENOMEM;
		goto unlock;
3144 3145
	}

3146 3147
	cmd->cmd_complete = addr_cmd_complete;

3148
	dc.handle = cpu_to_le16(conn->handle);
3149 3150 3151 3152 3153
	dc.reason = 0x13; /* Remote User Terminated Connection */
	err = hci_send_cmd(hdev, HCI_OP_DISCONNECT, sizeof(dc), &dc);
	if (err < 0)
		mgmt_pending_remove(cmd);

3154
unlock:
3155
	hci_dev_unlock(hdev);
3156 3157 3158
	return err;
}

3159
static int disconnect(struct sock *sk, struct hci_dev *hdev, void *data,
3160
		      u16 len)
3161
{
3162
	struct mgmt_cp_disconnect *cp = data;
3163
	struct mgmt_rp_disconnect rp;
3164
	struct mgmt_pending_cmd *cmd;
3165 3166 3167 3168 3169
	struct hci_conn *conn;
	int err;

	BT_DBG("");

3170 3171 3172 3173
	memset(&rp, 0, sizeof(rp));
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;

3174
	if (!bdaddr_type_is_valid(cp->addr.type))
3175 3176 3177
		return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
					 MGMT_STATUS_INVALID_PARAMS,
					 &rp, sizeof(rp));
3178

3179
	hci_dev_lock(hdev);
3180 3181

	if (!test_bit(HCI_UP, &hdev->flags)) {
3182 3183 3184
		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
					MGMT_STATUS_NOT_POWERED, &rp,
					sizeof(rp));
3185 3186 3187
		goto failed;
	}

3188
	if (pending_find(MGMT_OP_DISCONNECT, hdev)) {
3189 3190
		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
					MGMT_STATUS_BUSY, &rp, sizeof(rp));
3191 3192 3193
		goto failed;
	}

3194
	if (cp->addr.type == BDADDR_BREDR)
3195 3196
		conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK,
					       &cp->addr.bdaddr);
3197 3198
	else
		conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &cp->addr.bdaddr);
3199

3200
	if (!conn || conn->state == BT_OPEN || conn->state == BT_CLOSED) {
3201 3202 3203
		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
					MGMT_STATUS_NOT_CONNECTED, &rp,
					sizeof(rp));
3204 3205 3206
		goto failed;
	}

3207
	cmd = mgmt_pending_add(sk, MGMT_OP_DISCONNECT, hdev, data, len);
3208 3209
	if (!cmd) {
		err = -ENOMEM;
3210
		goto failed;
3211
	}
3212

3213 3214
	cmd->cmd_complete = generic_cmd_complete;

3215
	err = hci_disconnect(conn, HCI_ERROR_REMOTE_USER_TERM);
3216
	if (err < 0)
3217
		mgmt_pending_remove(cmd);
3218 3219

failed:
3220
	hci_dev_unlock(hdev);
3221 3222 3223
	return err;
}

3224
static u8 link_to_bdaddr(u8 link_type, u8 addr_type)
3225 3226 3227
{
	switch (link_type) {
	case LE_LINK:
3228 3229
		switch (addr_type) {
		case ADDR_LE_DEV_PUBLIC:
3230
			return BDADDR_LE_PUBLIC;
3231

3232
		default:
3233
			/* Fallback to LE Random address type */
3234
			return BDADDR_LE_RANDOM;
3235
		}
3236

3237
	default:
3238
		/* Fallback to BR/EDR type */
3239
		return BDADDR_BREDR;
3240 3241 3242
	}
}

3243 3244
static int get_connections(struct sock *sk, struct hci_dev *hdev, void *data,
			   u16 data_len)
3245 3246
{
	struct mgmt_rp_get_connections *rp;
3247
	struct hci_conn *c;
3248
	size_t rp_len;
3249 3250
	int err;
	u16 i;
3251 3252 3253

	BT_DBG("");

3254
	hci_dev_lock(hdev);
3255

3256
	if (!hdev_is_powered(hdev)) {
3257 3258
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_GET_CONNECTIONS,
				      MGMT_STATUS_NOT_POWERED);
3259 3260 3261
		goto unlock;
	}

3262
	i = 0;
3263 3264
	list_for_each_entry(c, &hdev->conn_hash.list, list) {
		if (test_bit(HCI_CONN_MGMT_CONNECTED, &c->flags))
3265
			i++;
3266 3267
	}

3268
	rp_len = sizeof(*rp) + (i * sizeof(struct mgmt_addr_info));
3269
	rp = kmalloc(rp_len, GFP_KERNEL);
3270
	if (!rp) {
3271 3272 3273 3274 3275
		err = -ENOMEM;
		goto unlock;
	}

	i = 0;
3276
	list_for_each_entry(c, &hdev->conn_hash.list, list) {
3277 3278
		if (!test_bit(HCI_CONN_MGMT_CONNECTED, &c->flags))
			continue;
3279
		bacpy(&rp->addr[i].bdaddr, &c->dst);
3280
		rp->addr[i].type = link_to_bdaddr(c->type, c->dst_type);
3281
		if (c->type == SCO_LINK || c->type == ESCO_LINK)
3282 3283 3284 3285
			continue;
		i++;
	}

3286
	rp->conn_count = cpu_to_le16(i);
3287

3288 3289
	/* Recalculate length in case of filtered SCO connections, etc */
	rp_len = sizeof(*rp) + (i * sizeof(struct mgmt_addr_info));
3290

3291 3292
	err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONNECTIONS, 0, rp,
				rp_len);
3293

3294
	kfree(rp);
3295 3296

unlock:
3297
	hci_dev_unlock(hdev);
3298 3299 3300
	return err;
}

3301
static int send_pin_code_neg_reply(struct sock *sk, struct hci_dev *hdev,
3302
				   struct mgmt_cp_pin_code_neg_reply *cp)
3303
{
3304
	struct mgmt_pending_cmd *cmd;
3305 3306
	int err;

3307
	cmd = mgmt_pending_add(sk, MGMT_OP_PIN_CODE_NEG_REPLY, hdev, cp,
3308
			       sizeof(*cp));
3309 3310 3311
	if (!cmd)
		return -ENOMEM;

3312
	err = hci_send_cmd(hdev, HCI_OP_PIN_CODE_NEG_REPLY,
3313
			   sizeof(cp->addr.bdaddr), &cp->addr.bdaddr);
3314 3315 3316 3317 3318 3319
	if (err < 0)
		mgmt_pending_remove(cmd);

	return err;
}

3320
static int pin_code_reply(struct sock *sk, struct hci_dev *hdev, void *data,
3321
			  u16 len)
3322
{
3323
	struct hci_conn *conn;
3324
	struct mgmt_cp_pin_code_reply *cp = data;
3325
	struct hci_cp_pin_code_reply reply;
3326
	struct mgmt_pending_cmd *cmd;
3327 3328 3329 3330
	int err;

	BT_DBG("");

3331
	hci_dev_lock(hdev);
3332

3333
	if (!hdev_is_powered(hdev)) {
3334 3335
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
				      MGMT_STATUS_NOT_POWERED);
3336 3337 3338
		goto failed;
	}

3339
	conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->addr.bdaddr);
3340
	if (!conn) {
3341 3342
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
				      MGMT_STATUS_NOT_CONNECTED);
3343 3344 3345 3346
		goto failed;
	}

	if (conn->pending_sec_level == BT_SECURITY_HIGH && cp->pin_len != 16) {
3347 3348 3349
		struct mgmt_cp_pin_code_neg_reply ncp;

		memcpy(&ncp.addr, &cp->addr, sizeof(ncp.addr));
3350 3351 3352

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

3353
		err = send_pin_code_neg_reply(sk, hdev, &ncp);
3354
		if (err >= 0)
3355 3356
			err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
					      MGMT_STATUS_INVALID_PARAMS);
3357 3358 3359 3360

		goto failed;
	}

3361
	cmd = mgmt_pending_add(sk, MGMT_OP_PIN_CODE_REPLY, hdev, data, len);
3362 3363
	if (!cmd) {
		err = -ENOMEM;
3364
		goto failed;
3365
	}
3366

3367 3368
	cmd->cmd_complete = addr_cmd_complete;

3369
	bacpy(&reply.bdaddr, &cp->addr.bdaddr);
3370
	reply.pin_len = cp->pin_len;
3371
	memcpy(reply.pin_code, cp->pin_code, sizeof(reply.pin_code));
3372 3373 3374

	err = hci_send_cmd(hdev, HCI_OP_PIN_CODE_REPLY, sizeof(reply), &reply);
	if (err < 0)
3375
		mgmt_pending_remove(cmd);
3376 3377

failed:
3378
	hci_dev_unlock(hdev);
3379 3380 3381
	return err;
}

3382 3383
static int set_io_capability(struct sock *sk, struct hci_dev *hdev, void *data,
			     u16 len)
3384
{
3385
	struct mgmt_cp_set_io_capability *cp = data;
3386 3387 3388

	BT_DBG("");

3389
	if (cp->io_capability > SMP_IO_KEYBOARD_DISPLAY)
3390 3391
		return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_IO_CAPABILITY,
					 MGMT_STATUS_INVALID_PARAMS, NULL, 0);
3392

3393
	hci_dev_lock(hdev);
3394 3395 3396 3397

	hdev->io_capability = cp->io_capability;

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

3400
	hci_dev_unlock(hdev);
3401

3402 3403
	return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_IO_CAPABILITY, 0,
				 NULL, 0);
3404 3405
}

3406
static struct mgmt_pending_cmd *find_pairing(struct hci_conn *conn)
3407 3408
{
	struct hci_dev *hdev = conn->hdev;
3409
	struct mgmt_pending_cmd *cmd;
3410

3411
	list_for_each_entry(cmd, &hdev->mgmt_pending, list) {
3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423
		if (cmd->opcode != MGMT_OP_PAIR_DEVICE)
			continue;

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

		return cmd;
	}

	return NULL;
}

3424
static int pairing_complete(struct mgmt_pending_cmd *cmd, u8 status)
3425 3426 3427
{
	struct mgmt_rp_pair_device rp;
	struct hci_conn *conn = cmd->user_data;
3428
	int err;
3429

3430 3431
	bacpy(&rp.addr.bdaddr, &conn->dst);
	rp.addr.type = link_to_bdaddr(conn->type, conn->dst_type);
3432

3433 3434
	err = mgmt_cmd_complete(cmd->sk, cmd->index, MGMT_OP_PAIR_DEVICE,
				status, &rp, sizeof(rp));
3435 3436 3437 3438 3439 3440

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

3441
	hci_conn_drop(conn);
3442 3443 3444 3445 3446

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

	hci_conn_put(conn);
3449 3450

	return err;
3451 3452
}

3453 3454 3455
void mgmt_smp_complete(struct hci_conn *conn, bool complete)
{
	u8 status = complete ? MGMT_STATUS_SUCCESS : MGMT_STATUS_FAILED;
3456
	struct mgmt_pending_cmd *cmd;
3457 3458

	cmd = find_pairing(conn);
3459
	if (cmd) {
3460
		cmd->cmd_complete(cmd, status);
3461 3462
		mgmt_pending_remove(cmd);
	}
3463 3464
}

3465 3466
static void pairing_complete_cb(struct hci_conn *conn, u8 status)
{
3467
	struct mgmt_pending_cmd *cmd;
3468 3469 3470 3471

	BT_DBG("status %u", status);

	cmd = find_pairing(conn);
3472
	if (!cmd) {
3473
		BT_DBG("Unable to find a pending command");
3474 3475 3476 3477 3478
		return;
	}

	cmd->cmd_complete(cmd, mgmt_status(status));
	mgmt_pending_remove(cmd);
3479 3480
}

3481
static void le_pairing_complete_cb(struct hci_conn *conn, u8 status)
3482
{
3483
	struct mgmt_pending_cmd *cmd;
3484 3485 3486 3487 3488 3489 3490

	BT_DBG("status %u", status);

	if (!status)
		return;

	cmd = find_pairing(conn);
3491
	if (!cmd) {
3492
		BT_DBG("Unable to find a pending command");
3493 3494 3495 3496 3497
		return;
	}

	cmd->cmd_complete(cmd, mgmt_status(status));
	mgmt_pending_remove(cmd);
3498 3499
}

3500
static int pair_device(struct sock *sk, struct hci_dev *hdev, void *data,
3501
		       u16 len)
3502
{
3503
	struct mgmt_cp_pair_device *cp = data;
3504
	struct mgmt_rp_pair_device rp;
3505
	struct mgmt_pending_cmd *cmd;
3506 3507 3508 3509 3510 3511
	u8 sec_level, auth_type;
	struct hci_conn *conn;
	int err;

	BT_DBG("");

3512 3513 3514 3515
	memset(&rp, 0, sizeof(rp));
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;

3516
	if (!bdaddr_type_is_valid(cp->addr.type))
3517 3518 3519
		return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
					 MGMT_STATUS_INVALID_PARAMS,
					 &rp, sizeof(rp));
3520

3521
	if (cp->io_cap > SMP_IO_KEYBOARD_DISPLAY)
3522 3523 3524
		return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
					 MGMT_STATUS_INVALID_PARAMS,
					 &rp, sizeof(rp));
3525

3526
	hci_dev_lock(hdev);
3527

3528
	if (!hdev_is_powered(hdev)) {
3529 3530 3531
		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
					MGMT_STATUS_NOT_POWERED, &rp,
					sizeof(rp));
3532 3533 3534
		goto unlock;
	}

3535 3536 3537 3538 3539 3540 3541
	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;
	}

3542
	sec_level = BT_SECURITY_MEDIUM;
3543
	auth_type = HCI_AT_DEDICATED_BONDING;
3544

3545
	if (cp->addr.type == BDADDR_BREDR) {
3546 3547
		conn = hci_connect_acl(hdev, &cp->addr.bdaddr, sec_level,
				       auth_type);
3548 3549
	} else {
		u8 addr_type;
3550
		struct hci_conn_params *p;
3551 3552 3553 3554 3555 3556 3557 3558

		/* Convert from L2CAP channel address type to HCI address type
		 */
		if (cp->addr.type == BDADDR_LE_PUBLIC)
			addr_type = ADDR_LE_DEV_PUBLIC;
		else
			addr_type = ADDR_LE_DEV_RANDOM;

3559 3560 3561 3562 3563 3564 3565 3566 3567
		/* 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.
		 */
3568 3569 3570 3571
		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;
3572

3573 3574 3575 3576
		conn = hci_connect_le_scan(hdev, &cp->addr.bdaddr,
					   addr_type, sec_level,
					   HCI_LE_CONN_TIMEOUT,
					   HCI_ROLE_MASTER);
3577
	}
3578

3579
	if (IS_ERR(conn)) {
3580 3581 3582 3583
		int status;

		if (PTR_ERR(conn) == -EBUSY)
			status = MGMT_STATUS_BUSY;
3584 3585 3586 3587
		else if (PTR_ERR(conn) == -EOPNOTSUPP)
			status = MGMT_STATUS_NOT_SUPPORTED;
		else if (PTR_ERR(conn) == -ECONNREFUSED)
			status = MGMT_STATUS_REJECTED;
3588 3589 3590
		else
			status = MGMT_STATUS_CONNECT_FAILED;

3591 3592
		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
					status, &rp, sizeof(rp));
3593 3594 3595 3596
		goto unlock;
	}

	if (conn->connect_cfm_cb) {
3597
		hci_conn_drop(conn);
3598 3599
		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
					MGMT_STATUS_BUSY, &rp, sizeof(rp));
3600 3601 3602
		goto unlock;
	}

3603
	cmd = mgmt_pending_add(sk, MGMT_OP_PAIR_DEVICE, hdev, data, len);
3604 3605
	if (!cmd) {
		err = -ENOMEM;
3606
		hci_conn_drop(conn);
3607 3608 3609
		goto unlock;
	}

3610 3611
	cmd->cmd_complete = pairing_complete;

3612
	/* For LE, just connecting isn't a proof that the pairing finished */
3613
	if (cp->addr.type == BDADDR_BREDR) {
3614
		conn->connect_cfm_cb = pairing_complete_cb;
3615 3616 3617 3618 3619 3620 3621
		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;
	}
3622

3623
	conn->io_capability = cp->io_cap;
3624
	cmd->user_data = hci_conn_get(conn);
3625

3626
	if ((conn->state == BT_CONNECTED || conn->state == BT_CONFIG) &&
3627 3628 3629 3630
	    hci_conn_security(conn, sec_level, auth_type, true)) {
		cmd->cmd_complete(cmd, 0);
		mgmt_pending_remove(cmd);
	}
3631 3632 3633 3634

	err = 0;

unlock:
3635
	hci_dev_unlock(hdev);
3636 3637 3638
	return err;
}

3639 3640
static int cancel_pair_device(struct sock *sk, struct hci_dev *hdev, void *data,
			      u16 len)
3641
{
3642
	struct mgmt_addr_info *addr = data;
3643
	struct mgmt_pending_cmd *cmd;
3644 3645 3646 3647 3648 3649 3650
	struct hci_conn *conn;
	int err;

	BT_DBG("");

	hci_dev_lock(hdev);

3651
	if (!hdev_is_powered(hdev)) {
3652 3653
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE,
				      MGMT_STATUS_NOT_POWERED);
3654 3655 3656
		goto unlock;
	}

3657
	cmd = pending_find(MGMT_OP_PAIR_DEVICE, hdev);
3658
	if (!cmd) {
3659 3660
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE,
				      MGMT_STATUS_INVALID_PARAMS);
3661 3662 3663 3664 3665 3666
		goto unlock;
	}

	conn = cmd->user_data;

	if (bacmp(&addr->bdaddr, &conn->dst) != 0) {
3667 3668
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE,
				      MGMT_STATUS_INVALID_PARAMS);
3669 3670 3671
		goto unlock;
	}

3672 3673
	cmd->cmd_complete(cmd, MGMT_STATUS_CANCELLED);
	mgmt_pending_remove(cmd);
3674

3675 3676
	err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE, 0,
				addr, sizeof(*addr));
3677 3678 3679 3680 3681
unlock:
	hci_dev_unlock(hdev);
	return err;
}

3682
static int user_pairing_resp(struct sock *sk, struct hci_dev *hdev,
3683
			     struct mgmt_addr_info *addr, u16 mgmt_op,
3684
			     u16 hci_op, __le32 passkey)
3685
{
3686
	struct mgmt_pending_cmd *cmd;
3687
	struct hci_conn *conn;
3688 3689
	int err;

3690
	hci_dev_lock(hdev);
3691

3692
	if (!hdev_is_powered(hdev)) {
3693 3694 3695
		err = mgmt_cmd_complete(sk, hdev->id, mgmt_op,
					MGMT_STATUS_NOT_POWERED, addr,
					sizeof(*addr));
3696
		goto done;
3697 3698
	}

3699 3700
	if (addr->type == BDADDR_BREDR)
		conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &addr->bdaddr);
3701
	else
3702
		conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &addr->bdaddr);
3703 3704

	if (!conn) {
3705 3706 3707
		err = mgmt_cmd_complete(sk, hdev->id, mgmt_op,
					MGMT_STATUS_NOT_CONNECTED, addr,
					sizeof(*addr));
3708 3709
		goto done;
	}
3710

3711
	if (addr->type == BDADDR_LE_PUBLIC || addr->type == BDADDR_LE_RANDOM) {
3712 3713
		err = smp_user_confirm_reply(conn, mgmt_op, passkey);
		if (!err)
3714 3715 3716
			err = mgmt_cmd_complete(sk, hdev->id, mgmt_op,
						MGMT_STATUS_SUCCESS, addr,
						sizeof(*addr));
3717
		else
3718 3719 3720
			err = mgmt_cmd_complete(sk, hdev->id, mgmt_op,
						MGMT_STATUS_FAILED, addr,
						sizeof(*addr));
3721 3722 3723 3724

		goto done;
	}

3725
	cmd = mgmt_pending_add(sk, mgmt_op, hdev, addr, sizeof(*addr));
3726 3727
	if (!cmd) {
		err = -ENOMEM;
3728
		goto done;
3729 3730
	}

3731 3732
	cmd->cmd_complete = addr_cmd_complete;

3733
	/* Continue with pairing via HCI */
3734 3735 3736
	if (hci_op == HCI_OP_USER_PASSKEY_REPLY) {
		struct hci_cp_user_passkey_reply cp;

3737
		bacpy(&cp.bdaddr, &addr->bdaddr);
3738 3739 3740
		cp.passkey = passkey;
		err = hci_send_cmd(hdev, hci_op, sizeof(cp), &cp);
	} else
3741 3742
		err = hci_send_cmd(hdev, hci_op, sizeof(addr->bdaddr),
				   &addr->bdaddr);
3743

3744 3745
	if (err < 0)
		mgmt_pending_remove(cmd);
3746

3747
done:
3748
	hci_dev_unlock(hdev);
3749 3750 3751
	return err;
}

3752 3753 3754 3755 3756 3757 3758
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("");

3759
	return user_pairing_resp(sk, hdev, &cp->addr,
3760 3761 3762 3763
				MGMT_OP_PIN_CODE_NEG_REPLY,
				HCI_OP_PIN_CODE_NEG_REPLY, 0);
}

3764 3765
static int user_confirm_reply(struct sock *sk, struct hci_dev *hdev, void *data,
			      u16 len)
3766
{
3767
	struct mgmt_cp_user_confirm_reply *cp = data;
3768 3769 3770 3771

	BT_DBG("");

	if (len != sizeof(*cp))
3772 3773
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_USER_CONFIRM_REPLY,
				       MGMT_STATUS_INVALID_PARAMS);
3774

3775
	return user_pairing_resp(sk, hdev, &cp->addr,
3776 3777
				 MGMT_OP_USER_CONFIRM_REPLY,
				 HCI_OP_USER_CONFIRM_REPLY, 0);
3778 3779
}

3780
static int user_confirm_neg_reply(struct sock *sk, struct hci_dev *hdev,
3781
				  void *data, u16 len)
3782
{
3783
	struct mgmt_cp_user_confirm_neg_reply *cp = data;
3784 3785 3786

	BT_DBG("");

3787
	return user_pairing_resp(sk, hdev, &cp->addr,
3788 3789
				 MGMT_OP_USER_CONFIRM_NEG_REPLY,
				 HCI_OP_USER_CONFIRM_NEG_REPLY, 0);
3790 3791
}

3792 3793
static int user_passkey_reply(struct sock *sk, struct hci_dev *hdev, void *data,
			      u16 len)
3794
{
3795
	struct mgmt_cp_user_passkey_reply *cp = data;
3796 3797 3798

	BT_DBG("");

3799
	return user_pairing_resp(sk, hdev, &cp->addr,
3800 3801
				 MGMT_OP_USER_PASSKEY_REPLY,
				 HCI_OP_USER_PASSKEY_REPLY, cp->passkey);
3802 3803
}

3804
static int user_passkey_neg_reply(struct sock *sk, struct hci_dev *hdev,
3805
				  void *data, u16 len)
3806
{
3807
	struct mgmt_cp_user_passkey_neg_reply *cp = data;
3808 3809 3810

	BT_DBG("");

3811
	return user_pairing_resp(sk, hdev, &cp->addr,
3812 3813
				 MGMT_OP_USER_PASSKEY_NEG_REPLY,
				 HCI_OP_USER_PASSKEY_NEG_REPLY, 0);
3814 3815
}

3816
static void update_name(struct hci_request *req)
3817
{
3818
	struct hci_dev *hdev = req->hdev;
3819 3820
	struct hci_cp_write_local_name cp;

3821
	memcpy(cp.name, hdev->dev_name, sizeof(cp.name));
3822

3823
	hci_req_add(req, HCI_OP_WRITE_LOCAL_NAME, sizeof(cp), &cp);
3824 3825
}

3826
static void set_name_complete(struct hci_dev *hdev, u8 status, u16 opcode)
3827 3828
{
	struct mgmt_cp_set_local_name *cp;
3829
	struct mgmt_pending_cmd *cmd;
3830 3831 3832 3833 3834

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

	hci_dev_lock(hdev);

3835
	cmd = pending_find(MGMT_OP_SET_LOCAL_NAME, hdev);
3836 3837 3838 3839 3840 3841
	if (!cmd)
		goto unlock;

	cp = cmd->param;

	if (status)
3842 3843
		mgmt_cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_LOCAL_NAME,
			        mgmt_status(status));
3844
	else
3845 3846
		mgmt_cmd_complete(cmd->sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, 0,
				  cp, sizeof(*cp));
3847 3848 3849 3850 3851 3852 3853

	mgmt_pending_remove(cmd);

unlock:
	hci_dev_unlock(hdev);
}

3854
static int set_local_name(struct sock *sk, struct hci_dev *hdev, void *data,
3855
			  u16 len)
3856
{
3857
	struct mgmt_cp_set_local_name *cp = data;
3858
	struct mgmt_pending_cmd *cmd;
3859
	struct hci_request req;
3860 3861 3862 3863
	int err;

	BT_DBG("");

3864
	hci_dev_lock(hdev);
3865

3866 3867 3868 3869 3870 3871
	/* 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))) {
3872 3873
		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, 0,
					data, len);
3874 3875 3876
		goto failed;
	}

3877
	memcpy(hdev->short_name, cp->short_name, sizeof(hdev->short_name));
3878

3879
	if (!hdev_is_powered(hdev)) {
3880
		memcpy(hdev->dev_name, cp->name, sizeof(hdev->dev_name));
3881

3882 3883
		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, 0,
					data, len);
3884 3885 3886
		if (err < 0)
			goto failed;

3887 3888
		err = mgmt_generic_event(MGMT_EV_LOCAL_NAME_CHANGED, hdev,
					 data, len, sk);
3889

3890 3891 3892
		goto failed;
	}

3893
	cmd = mgmt_pending_add(sk, MGMT_OP_SET_LOCAL_NAME, hdev, data, len);
3894 3895 3896 3897 3898
	if (!cmd) {
		err = -ENOMEM;
		goto failed;
	}

3899 3900
	memcpy(hdev->dev_name, cp->name, sizeof(hdev->dev_name));

3901
	hci_req_init(&req, hdev);
3902 3903 3904 3905 3906 3907

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

3908 3909 3910
	/* The name is stored in the scan response data and so
	 * no need to udpate the advertising data here.
	 */
3911
	if (lmp_le_capable(hdev))
3912
		update_scan_rsp_data(&req);
3913

3914
	err = hci_req_run(&req, set_name_complete);
3915 3916 3917 3918
	if (err < 0)
		mgmt_pending_remove(cmd);

failed:
3919
	hci_dev_unlock(hdev);
3920 3921 3922
	return err;
}

3923 3924 3925 3926 3927 3928 3929 3930 3931 3932 3933 3934 3935 3936 3937 3938 3939 3940 3941 3942 3943 3944 3945 3946 3947 3948 3949 3950 3951 3952 3953 3954 3955 3956 3957 3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977 3978 3979 3980 3981
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);
}

3982
static int read_local_oob_data(struct sock *sk, struct hci_dev *hdev,
3983
			       void *data, u16 data_len)
3984
{
3985
	struct mgmt_pending_cmd *cmd;
3986
	struct hci_request req;
3987 3988
	int err;

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

3991
	hci_dev_lock(hdev);
3992

3993
	if (!hdev_is_powered(hdev)) {
3994 3995
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
				      MGMT_STATUS_NOT_POWERED);
3996 3997 3998
		goto unlock;
	}

3999
	if (!lmp_ssp_capable(hdev)) {
4000 4001
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
				      MGMT_STATUS_NOT_SUPPORTED);
4002 4003 4004
		goto unlock;
	}

4005
	if (pending_find(MGMT_OP_READ_LOCAL_OOB_DATA, hdev)) {
4006 4007
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
				      MGMT_STATUS_BUSY);
4008 4009 4010
		goto unlock;
	}

4011
	cmd = mgmt_pending_add(sk, MGMT_OP_READ_LOCAL_OOB_DATA, hdev, NULL, 0);
4012 4013 4014 4015 4016
	if (!cmd) {
		err = -ENOMEM;
		goto unlock;
	}

4017 4018
	hci_req_init(&req, hdev);

4019
	if (bredr_sc_enabled(hdev))
4020
		hci_req_add(&req, HCI_OP_READ_LOCAL_OOB_EXT_DATA, 0, NULL);
4021
	else
4022
		hci_req_add(&req, HCI_OP_READ_LOCAL_OOB_DATA, 0, NULL);
4023

4024
	err = hci_req_run_skb(&req, read_local_oob_data_complete);
4025 4026 4027 4028
	if (err < 0)
		mgmt_pending_remove(cmd);

unlock:
4029
	hci_dev_unlock(hdev);
4030 4031 4032
	return err;
}

4033
static int add_remote_oob_data(struct sock *sk, struct hci_dev *hdev,
4034
			       void *data, u16 len)
4035
{
4036
	struct mgmt_addr_info *addr = data;
4037 4038
	int err;

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

4041
	if (!bdaddr_type_is_valid(addr->type))
4042 4043 4044 4045
		return mgmt_cmd_complete(sk, hdev->id,
					 MGMT_OP_ADD_REMOTE_OOB_DATA,
					 MGMT_STATUS_INVALID_PARAMS,
					 addr, sizeof(*addr));
4046

4047
	hci_dev_lock(hdev);
4048

4049 4050 4051
	if (len == MGMT_ADD_REMOTE_OOB_DATA_SIZE) {
		struct mgmt_cp_add_remote_oob_data *cp = data;
		u8 status;
4052

4053
		if (cp->addr.type != BDADDR_BREDR) {
4054 4055 4056 4057
			err = mgmt_cmd_complete(sk, hdev->id,
						MGMT_OP_ADD_REMOTE_OOB_DATA,
						MGMT_STATUS_INVALID_PARAMS,
						&cp->addr, sizeof(cp->addr));
4058 4059 4060
			goto unlock;
		}

4061
		err = hci_add_remote_oob_data(hdev, &cp->addr.bdaddr,
4062 4063
					      cp->addr.type, cp->hash,
					      cp->rand, NULL, NULL);
4064 4065 4066 4067 4068
		if (err < 0)
			status = MGMT_STATUS_FAILED;
		else
			status = MGMT_STATUS_SUCCESS;

4069 4070 4071
		err = mgmt_cmd_complete(sk, hdev->id,
					MGMT_OP_ADD_REMOTE_OOB_DATA, status,
					&cp->addr, sizeof(cp->addr));
4072 4073
	} else if (len == MGMT_ADD_REMOTE_OOB_EXT_DATA_SIZE) {
		struct mgmt_cp_add_remote_oob_ext_data *cp = data;
4074
		u8 *rand192, *hash192, *rand256, *hash256;
4075 4076
		u8 status;

4077
		if (bdaddr_type_is_le(cp->addr.type)) {
4078 4079 4080 4081 4082
			/* 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)) {
4083 4084 4085 4086
				err = mgmt_cmd_complete(sk, hdev->id,
							MGMT_OP_ADD_REMOTE_OOB_DATA,
							MGMT_STATUS_INVALID_PARAMS,
							addr, sizeof(*addr));
4087 4088 4089
				goto unlock;
			}

4090 4091 4092
			rand192 = NULL;
			hash192 = NULL;
		} else {
4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 4103 4104 4105 4106 4107 4108 4109 4110 4111 4112 4113 4114 4115
			/* 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;
4116 4117
		}

4118
		err = hci_add_remote_oob_data(hdev, &cp->addr.bdaddr,
4119
					      cp->addr.type, hash192, rand192,
4120
					      hash256, rand256);
4121 4122 4123 4124 4125
		if (err < 0)
			status = MGMT_STATUS_FAILED;
		else
			status = MGMT_STATUS_SUCCESS;

4126 4127 4128
		err = mgmt_cmd_complete(sk, hdev->id,
					MGMT_OP_ADD_REMOTE_OOB_DATA,
					status, &cp->addr, sizeof(cp->addr));
4129 4130
	} else {
		BT_ERR("add_remote_oob_data: invalid length of %u bytes", len);
4131 4132
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_REMOTE_OOB_DATA,
				      MGMT_STATUS_INVALID_PARAMS);
4133
	}
4134

4135
unlock:
4136
	hci_dev_unlock(hdev);
4137 4138 4139
	return err;
}

4140
static int remove_remote_oob_data(struct sock *sk, struct hci_dev *hdev,
4141
				  void *data, u16 len)
4142
{
4143
	struct mgmt_cp_remove_remote_oob_data *cp = data;
4144
	u8 status;
4145 4146
	int err;

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

4149
	if (cp->addr.type != BDADDR_BREDR)
4150 4151 4152 4153
		return mgmt_cmd_complete(sk, hdev->id,
					 MGMT_OP_REMOVE_REMOTE_OOB_DATA,
					 MGMT_STATUS_INVALID_PARAMS,
					 &cp->addr, sizeof(cp->addr));
4154

4155
	hci_dev_lock(hdev);
4156

4157 4158 4159 4160 4161 4162
	if (!bacmp(&cp->addr.bdaddr, BDADDR_ANY)) {
		hci_remote_oob_data_clear(hdev);
		status = MGMT_STATUS_SUCCESS;
		goto done;
	}

4163
	err = hci_remove_remote_oob_data(hdev, &cp->addr.bdaddr, cp->addr.type);
4164
	if (err < 0)
4165
		status = MGMT_STATUS_INVALID_PARAMS;
4166
	else
4167
		status = MGMT_STATUS_SUCCESS;
4168

4169
done:
4170 4171
	err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_REMOTE_OOB_DATA,
				status, &cp->addr, sizeof(cp->addr));
4172

4173
	hci_dev_unlock(hdev);
4174 4175 4176
	return err;
}

4177
static bool trigger_bredr_inquiry(struct hci_request *req, u8 *status)
4178
{
4179
	struct hci_dev *hdev = req->hdev;
4180
	struct hci_cp_inquiry cp;
4181 4182
	/* General inquiry access code (GIAC) */
	u8 lap[3] = { 0x33, 0x8b, 0x9e };
4183 4184 4185 4186 4187 4188 4189 4190 4191 4192 4193 4194 4195 4196 4197 4198 4199 4200 4201 4202 4203 4204 4205 4206 4207 4208

	*status = mgmt_bredr_support(hdev);
	if (*status)
		return false;

	if (hci_dev_test_flag(hdev, HCI_INQUIRY)) {
		*status = MGMT_STATUS_BUSY;
		return false;
	}

	hci_inquiry_cache_flush(hdev);

	memset(&cp, 0, sizeof(cp));
	memcpy(&cp.lap, lap, sizeof(cp.lap));
	cp.length = DISCOV_BREDR_INQUIRY_LEN;

	hci_req_add(req, HCI_OP_INQUIRY, sizeof(cp), &cp);

	return true;
}

static bool trigger_le_scan(struct hci_request *req, u16 interval, u8 *status)
{
	struct hci_dev *hdev = req->hdev;
	struct hci_cp_le_set_scan_param param_cp;
	struct hci_cp_le_set_scan_enable enable_cp;
4209
	u8 own_addr_type;
4210 4211
	int err;

4212 4213 4214
	*status = mgmt_le_support(hdev);
	if (*status)
		return false;
4215

4216 4217 4218 4219
	if (hci_dev_test_flag(hdev, HCI_LE_ADV)) {
		/* Don't let discovery abort an outgoing connection attempt
		 * that's using directed advertising.
		 */
4220
		if (hci_lookup_le_connect(hdev)) {
4221
			*status = MGMT_STATUS_REJECTED;
4222 4223
			return false;
		}
4224

4225
		cancel_adv_timeout(hdev);
4226 4227
		disable_advertising(req);
	}
4228

4229 4230 4231 4232 4233 4234
	/* If controller is scanning, it means the background scanning is
	 * running. Thus, we should temporarily stop it in order to set the
	 * discovery scanning parameters.
	 */
	if (hci_dev_test_flag(hdev, HCI_LE_SCAN))
		hci_req_add_le_scan_disable(req);
4235

4236 4237 4238 4239 4240 4241 4242 4243 4244
	/* All active scans will be done with either a resolvable private
	 * address (when privacy feature has been enabled) or non-resolvable
	 * private address.
	 */
	err = hci_update_random_address(req, true, &own_addr_type);
	if (err < 0) {
		*status = MGMT_STATUS_FAILED;
		return false;
	}
4245

4246 4247 4248 4249 4250
	memset(&param_cp, 0, sizeof(param_cp));
	param_cp.type = LE_SCAN_ACTIVE;
	param_cp.interval = cpu_to_le16(interval);
	param_cp.window = cpu_to_le16(DISCOV_LE_SCAN_WIN);
	param_cp.own_address_type = own_addr_type;
4251

4252 4253
	hci_req_add(req, HCI_OP_LE_SET_SCAN_PARAM, sizeof(param_cp),
		    &param_cp);
4254

4255 4256 4257
	memset(&enable_cp, 0, sizeof(enable_cp));
	enable_cp.enable = LE_SCAN_ENABLE;
	enable_cp.filter_dup = LE_SCAN_FILTER_DUP_ENABLE;
4258

4259 4260 4261 4262 4263
	hci_req_add(req, HCI_OP_LE_SET_SCAN_ENABLE, sizeof(enable_cp),
		    &enable_cp);

	return true;
}
4264

4265 4266 4267
static bool trigger_discovery(struct hci_request *req, u8 *status)
{
	struct hci_dev *hdev = req->hdev;
4268

4269 4270 4271 4272 4273 4274 4275
	switch (hdev->discovery.type) {
	case DISCOV_TYPE_BREDR:
		if (!trigger_bredr_inquiry(req, status))
			return false;
		break;

	case DISCOV_TYPE_INTERLEAVED:
4276 4277 4278 4279 4280 4281 4282 4283 4284 4285 4286 4287 4288 4289 4290 4291
		if (test_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY,
			     &hdev->quirks)) {
			/* During simultaneous discovery, we double LE scan
			 * interval. We must leave some time for the controller
			 * to do BR/EDR inquiry.
			 */
			if (!trigger_le_scan(req, DISCOV_LE_SCAN_INT * 2,
					     status))
				return false;

			if (!trigger_bredr_inquiry(req, status))
				return false;

			return true;
		}

4292 4293
		if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) {
			*status = MGMT_STATUS_NOT_SUPPORTED;
4294 4295
			return false;
		}
4296
		/* fall through */
4297

4298 4299 4300
	case DISCOV_TYPE_LE:
		if (!trigger_le_scan(req, DISCOV_LE_SCAN_INT, status))
			return false;
4301 4302 4303 4304 4305 4306 4307 4308
		break;

	default:
		*status = MGMT_STATUS_INVALID_PARAMS;
		return false;
	}

	return true;
4309 4310
}

4311 4312
static void start_discovery_complete(struct hci_dev *hdev, u8 status,
				     u16 opcode)
4313
{
4314
	struct mgmt_pending_cmd *cmd;
4315
	unsigned long timeout;
4316

4317 4318
	BT_DBG("status %d", status);

4319
	hci_dev_lock(hdev);
4320

4321
	cmd = pending_find(MGMT_OP_START_DISCOVERY, hdev);
4322
	if (!cmd)
4323
		cmd = pending_find(MGMT_OP_START_SERVICE_DISCOVERY, hdev);
4324

4325
	if (cmd) {
4326
		cmd->cmd_complete(cmd, mgmt_status(status));
4327 4328
		mgmt_pending_remove(cmd);
	}
4329 4330

	if (status) {
4331 4332
		hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
		goto unlock;
4333 4334 4335 4336
	}

	hci_discovery_set_state(hdev, DISCOVERY_FINDING);

4337 4338 4339
	/* If the scan involves LE scan, pick proper timeout to schedule
	 * hdev->le_scan_disable that will stop it.
	 */
4340 4341
	switch (hdev->discovery.type) {
	case DISCOV_TYPE_LE:
4342
		timeout = msecs_to_jiffies(DISCOV_LE_TIMEOUT);
4343 4344
		break;
	case DISCOV_TYPE_INTERLEAVED:
4345 4346 4347 4348 4349 4350 4351 4352 4353 4354 4355 4356
		 /* When running simultaneous discovery, the LE scanning time
		 * should occupy the whole discovery time sine BR/EDR inquiry
		 * and LE scanning are scheduled by the controller.
		 *
		 * For interleaving discovery in comparison, BR/EDR inquiry
		 * and LE scanning are done sequentially with separate
		 * timeouts.
		 */
		if (test_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks))
			timeout = msecs_to_jiffies(DISCOV_LE_TIMEOUT);
		else
			timeout = msecs_to_jiffies(hdev->discov_interleaved_timeout);
4357 4358
		break;
	case DISCOV_TYPE_BREDR:
4359
		timeout = 0;
4360 4361 4362
		break;
	default:
		BT_ERR("Invalid discovery type %d", hdev->discovery.type);
4363 4364
		timeout = 0;
		break;
4365
	}
4366

4367 4368 4369 4370 4371 4372 4373 4374
	if (timeout) {
		/* When service discovery is used and the controller has
		 * a strict duplicate filter, it is important to remember
		 * the start and duration of the scan. This is required
		 * for restarting scanning during the discovery phase.
		 */
		if (test_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER,
			     &hdev->quirks) &&
4375
		    hdev->discovery.result_filtering) {
4376 4377 4378 4379
			hdev->discovery.scan_start = jiffies;
			hdev->discovery.scan_duration = timeout;
		}

4380 4381
		queue_delayed_work(hdev->workqueue,
				   &hdev->le_scan_disable, timeout);
4382
	}
4383

4384 4385
unlock:
	hci_dev_unlock(hdev);
4386 4387
}

4388
static int start_discovery(struct sock *sk, struct hci_dev *hdev,
4389
			   void *data, u16 len)
4390
{
4391
	struct mgmt_cp_start_discovery *cp = data;
4392
	struct mgmt_pending_cmd *cmd;
4393
	struct hci_request req;
4394
	u8 status;
4395 4396
	int err;

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

4399
	hci_dev_lock(hdev);
4400

4401
	if (!hdev_is_powered(hdev)) {
4402 4403 4404
		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_START_DISCOVERY,
					MGMT_STATUS_NOT_POWERED,
					&cp->type, sizeof(cp->type));
4405 4406 4407
		goto failed;
	}

4408
	if (hdev->discovery.state != DISCOVERY_STOPPED ||
4409
	    hci_dev_test_flag(hdev, HCI_PERIODIC_INQ)) {
4410 4411 4412
		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_START_DISCOVERY,
					MGMT_STATUS_BUSY, &cp->type,
					sizeof(cp->type));
4413 4414 4415
		goto failed;
	}

4416
	cmd = mgmt_pending_add(sk, MGMT_OP_START_DISCOVERY, hdev, data, len);
4417 4418 4419 4420 4421
	if (!cmd) {
		err = -ENOMEM;
		goto failed;
	}

4422 4423
	cmd->cmd_complete = generic_cmd_complete;

4424 4425 4426 4427 4428
	/* Clear the discovery filter first to free any previously
	 * allocated memory for the UUID list.
	 */
	hci_discovery_filter_clear(hdev);

A
Andre Guedes 已提交
4429
	hdev->discovery.type = cp->type;
4430
	hdev->discovery.report_invalid_rssi = false;
A
Andre Guedes 已提交
4431

4432 4433
	hci_req_init(&req, hdev);

4434
	if (!trigger_discovery(&req, &status)) {
4435 4436
		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_START_DISCOVERY,
					status, &cp->type, sizeof(cp->type));
4437 4438
		mgmt_pending_remove(cmd);
		goto failed;
4439
	}
4440

4441
	err = hci_req_run(&req, start_discovery_complete);
4442
	if (err < 0) {
4443
		mgmt_pending_remove(cmd);
4444 4445
		goto failed;
	}
4446

4447
	hci_discovery_set_state(hdev, DISCOVERY_STARTING);
4448

4449
failed:
4450
	hci_dev_unlock(hdev);
4451 4452
	return err;
}
4453

4454 4455
static int service_discovery_cmd_complete(struct mgmt_pending_cmd *cmd,
					  u8 status)
4456
{
4457 4458
	return mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, status,
				 cmd->param, 1);
4459
}
4460

4461 4462 4463 4464
static int start_service_discovery(struct sock *sk, struct hci_dev *hdev,
				   void *data, u16 len)
{
	struct mgmt_cp_start_service_discovery *cp = data;
4465
	struct mgmt_pending_cmd *cmd;
4466 4467 4468 4469 4470
	struct hci_request req;
	const u16 max_uuid_count = ((U16_MAX - sizeof(*cp)) / 16);
	u16 uuid_count, expected_len;
	u8 status;
	int err;
4471

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

4474
	hci_dev_lock(hdev);
4475

4476
	if (!hdev_is_powered(hdev)) {
4477 4478 4479 4480
		err = mgmt_cmd_complete(sk, hdev->id,
					MGMT_OP_START_SERVICE_DISCOVERY,
					MGMT_STATUS_NOT_POWERED,
					&cp->type, sizeof(cp->type));
4481 4482
		goto failed;
	}
4483

4484
	if (hdev->discovery.state != DISCOVERY_STOPPED ||
4485
	    hci_dev_test_flag(hdev, HCI_PERIODIC_INQ)) {
4486 4487 4488 4489
		err = mgmt_cmd_complete(sk, hdev->id,
					MGMT_OP_START_SERVICE_DISCOVERY,
					MGMT_STATUS_BUSY, &cp->type,
					sizeof(cp->type));
4490 4491
		goto failed;
	}
4492

4493 4494 4495 4496
	uuid_count = __le16_to_cpu(cp->uuid_count);
	if (uuid_count > max_uuid_count) {
		BT_ERR("service_discovery: too big uuid_count value %u",
		       uuid_count);
4497 4498 4499 4500
		err = mgmt_cmd_complete(sk, hdev->id,
					MGMT_OP_START_SERVICE_DISCOVERY,
					MGMT_STATUS_INVALID_PARAMS, &cp->type,
					sizeof(cp->type));
4501 4502 4503 4504 4505 4506 4507
		goto failed;
	}

	expected_len = sizeof(*cp) + uuid_count * 16;
	if (expected_len != len) {
		BT_ERR("service_discovery: expected %u bytes, got %u bytes",
		       expected_len, len);
4508 4509 4510 4511
		err = mgmt_cmd_complete(sk, hdev->id,
					MGMT_OP_START_SERVICE_DISCOVERY,
					MGMT_STATUS_INVALID_PARAMS, &cp->type,
					sizeof(cp->type));
4512 4513 4514 4515
		goto failed;
	}

	cmd = mgmt_pending_add(sk, MGMT_OP_START_SERVICE_DISCOVERY,
4516
			       hdev, data, len);
4517 4518 4519 4520 4521
	if (!cmd) {
		err = -ENOMEM;
		goto failed;
	}

4522 4523
	cmd->cmd_complete = service_discovery_cmd_complete;

4524 4525 4526 4527 4528
	/* Clear the discovery filter first to free any previously
	 * allocated memory for the UUID list.
	 */
	hci_discovery_filter_clear(hdev);

4529
	hdev->discovery.result_filtering = true;
4530 4531 4532 4533 4534 4535 4536 4537
	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) {
4538 4539 4540 4541
			err = mgmt_cmd_complete(sk, hdev->id,
						MGMT_OP_START_SERVICE_DISCOVERY,
						MGMT_STATUS_FAILED,
						&cp->type, sizeof(cp->type));
4542 4543 4544
			mgmt_pending_remove(cmd);
			goto failed;
		}
4545
	}
4546

4547
	hci_req_init(&req, hdev);
4548

4549
	if (!trigger_discovery(&req, &status)) {
4550 4551 4552
		err = mgmt_cmd_complete(sk, hdev->id,
					MGMT_OP_START_SERVICE_DISCOVERY,
					status, &cp->type, sizeof(cp->type));
4553 4554
		mgmt_pending_remove(cmd);
		goto failed;
4555
	}
4556

4557
	err = hci_req_run(&req, start_discovery_complete);
4558
	if (err < 0) {
4559
		mgmt_pending_remove(cmd);
4560 4561 4562 4563
		goto failed;
	}

	hci_discovery_set_state(hdev, DISCOVERY_STARTING);
4564 4565

failed:
4566
	hci_dev_unlock(hdev);
4567 4568 4569
	return err;
}

4570
static void stop_discovery_complete(struct hci_dev *hdev, u8 status, u16 opcode)
4571
{
4572
	struct mgmt_pending_cmd *cmd;
4573

4574 4575 4576 4577
	BT_DBG("status %d", status);

	hci_dev_lock(hdev);

4578
	cmd = pending_find(MGMT_OP_STOP_DISCOVERY, hdev);
4579
	if (cmd) {
4580
		cmd->cmd_complete(cmd, mgmt_status(status));
4581
		mgmt_pending_remove(cmd);
4582 4583
	}

4584 4585
	if (!status)
		hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
4586 4587 4588 4589

	hci_dev_unlock(hdev);
}

4590
static int stop_discovery(struct sock *sk, struct hci_dev *hdev, void *data,
4591
			  u16 len)
4592
{
4593
	struct mgmt_cp_stop_discovery *mgmt_cp = data;
4594
	struct mgmt_pending_cmd *cmd;
4595
	struct hci_request req;
4596 4597
	int err;

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

4600
	hci_dev_lock(hdev);
4601

4602
	if (!hci_discovery_active(hdev)) {
4603 4604 4605
		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY,
					MGMT_STATUS_REJECTED, &mgmt_cp->type,
					sizeof(mgmt_cp->type));
4606 4607 4608 4609
		goto unlock;
	}

	if (hdev->discovery.type != mgmt_cp->type) {
4610 4611 4612
		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY,
					MGMT_STATUS_INVALID_PARAMS,
					&mgmt_cp->type, sizeof(mgmt_cp->type));
4613
		goto unlock;
4614 4615
	}

4616
	cmd = mgmt_pending_add(sk, MGMT_OP_STOP_DISCOVERY, hdev, data, len);
4617 4618
	if (!cmd) {
		err = -ENOMEM;
4619 4620 4621
		goto unlock;
	}

4622 4623
	cmd->cmd_complete = generic_cmd_complete;

4624 4625
	hci_req_init(&req, hdev);

4626
	hci_stop_discovery(&req);
4627

4628 4629 4630
	err = hci_req_run(&req, stop_discovery_complete);
	if (!err) {
		hci_discovery_set_state(hdev, DISCOVERY_STOPPING);
4631
		goto unlock;
4632 4633
	}

4634 4635 4636 4637
	mgmt_pending_remove(cmd);

	/* If no HCI commands were sent we're done */
	if (err == -ENODATA) {
4638 4639
		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY, 0,
					&mgmt_cp->type, sizeof(mgmt_cp->type));
4640 4641
		hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
	}
4642

4643
unlock:
4644
	hci_dev_unlock(hdev);
4645 4646 4647
	return err;
}

4648
static int confirm_name(struct sock *sk, struct hci_dev *hdev, void *data,
4649
			u16 len)
4650
{
4651
	struct mgmt_cp_confirm_name *cp = data;
4652 4653 4654
	struct inquiry_entry *e;
	int err;

4655
	BT_DBG("%s", hdev->name);
4656 4657 4658

	hci_dev_lock(hdev);

4659
	if (!hci_discovery_active(hdev)) {
4660 4661 4662
		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_CONFIRM_NAME,
					MGMT_STATUS_FAILED, &cp->addr,
					sizeof(cp->addr));
4663 4664 4665
		goto failed;
	}

4666
	e = hci_inquiry_cache_lookup_unknown(hdev, &cp->addr.bdaddr);
4667
	if (!e) {
4668 4669 4670
		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_CONFIRM_NAME,
					MGMT_STATUS_INVALID_PARAMS, &cp->addr,
					sizeof(cp->addr));
4671 4672 4673 4674 4675 4676 4677 4678
		goto failed;
	}

	if (cp->name_known) {
		e->name_state = NAME_KNOWN;
		list_del(&e->list);
	} else {
		e->name_state = NAME_NEEDED;
4679
		hci_inquiry_cache_update_resolve(hdev, e);
4680 4681
	}

4682 4683
	err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_CONFIRM_NAME, 0,
				&cp->addr, sizeof(cp->addr));
4684 4685 4686 4687 4688 4689

failed:
	hci_dev_unlock(hdev);
	return err;
}

4690
static int block_device(struct sock *sk, struct hci_dev *hdev, void *data,
4691
			u16 len)
4692
{
4693
	struct mgmt_cp_block_device *cp = data;
4694
	u8 status;
4695 4696
	int err;

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

4699
	if (!bdaddr_type_is_valid(cp->addr.type))
4700 4701 4702
		return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_BLOCK_DEVICE,
					 MGMT_STATUS_INVALID_PARAMS,
					 &cp->addr, sizeof(cp->addr));
4703

4704
	hci_dev_lock(hdev);
4705

4706 4707
	err = hci_bdaddr_list_add(&hdev->blacklist, &cp->addr.bdaddr,
				  cp->addr.type);
4708
	if (err < 0) {
4709
		status = MGMT_STATUS_FAILED;
4710 4711 4712 4713 4714 4715
		goto done;
	}

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

4717
done:
4718 4719
	err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_BLOCK_DEVICE, status,
				&cp->addr, sizeof(cp->addr));
4720

4721
	hci_dev_unlock(hdev);
4722 4723 4724 4725

	return err;
}

4726
static int unblock_device(struct sock *sk, struct hci_dev *hdev, void *data,
4727
			  u16 len)
4728
{
4729
	struct mgmt_cp_unblock_device *cp = data;
4730
	u8 status;
4731 4732
	int err;

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

4735
	if (!bdaddr_type_is_valid(cp->addr.type))
4736 4737 4738
		return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNBLOCK_DEVICE,
					 MGMT_STATUS_INVALID_PARAMS,
					 &cp->addr, sizeof(cp->addr));
4739

4740
	hci_dev_lock(hdev);
4741

4742 4743
	err = hci_bdaddr_list_del(&hdev->blacklist, &cp->addr.bdaddr,
				  cp->addr.type);
4744
	if (err < 0) {
4745
		status = MGMT_STATUS_INVALID_PARAMS;
4746 4747 4748 4749 4750 4751
		goto done;
	}

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

4753
done:
4754 4755
	err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNBLOCK_DEVICE, status,
				&cp->addr, sizeof(cp->addr));
4756

4757
	hci_dev_unlock(hdev);
4758 4759 4760 4761

	return err;
}

4762 4763 4764 4765
static int set_device_id(struct sock *sk, struct hci_dev *hdev, void *data,
			 u16 len)
{
	struct mgmt_cp_set_device_id *cp = data;
4766
	struct hci_request req;
4767
	int err;
4768
	__u16 source;
4769 4770 4771

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

4772 4773 4774
	source = __le16_to_cpu(cp->source);

	if (source > 0x0002)
4775 4776
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DEVICE_ID,
				       MGMT_STATUS_INVALID_PARAMS);
4777

4778 4779
	hci_dev_lock(hdev);

4780
	hdev->devid_source = source;
4781 4782 4783 4784
	hdev->devid_vendor = __le16_to_cpu(cp->vendor);
	hdev->devid_product = __le16_to_cpu(cp->product);
	hdev->devid_version = __le16_to_cpu(cp->version);

4785 4786
	err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_DEVICE_ID, 0,
				NULL, 0);
4787

4788 4789 4790
	hci_req_init(&req, hdev);
	update_eir(&req);
	hci_req_run(&req, NULL);
4791 4792 4793 4794 4795 4796

	hci_dev_unlock(hdev);

	return err;
}

4797 4798 4799 4800 4801 4802
static void enable_advertising_instance(struct hci_dev *hdev, u8 status,
					u16 opcode)
{
	BT_DBG("status %d", status);
}

4803 4804
static void set_advertising_complete(struct hci_dev *hdev, u8 status,
				     u16 opcode)
4805 4806
{
	struct cmd_lookup match = { NULL, hdev };
4807
	struct hci_request req;
4808 4809 4810
	u8 instance;
	struct adv_info *adv_instance;
	int err;
4811

4812 4813
	hci_dev_lock(hdev);

4814 4815 4816 4817 4818
	if (status) {
		u8 mgmt_err = mgmt_status(status);

		mgmt_pending_foreach(MGMT_OP_SET_ADVERTISING, hdev,
				     cmd_status_rsp, &mgmt_err);
4819
		goto unlock;
4820 4821
	}

4822
	if (hci_dev_test_flag(hdev, HCI_LE_ADV))
4823
		hci_dev_set_flag(hdev, HCI_ADVERTISING);
4824
	else
4825
		hci_dev_clear_flag(hdev, HCI_ADVERTISING);
4826

4827 4828 4829 4830 4831 4832 4833
	mgmt_pending_foreach(MGMT_OP_SET_ADVERTISING, hdev, settings_rsp,
			     &match);

	new_settings(hdev, match.sk);

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

4835
	/* If "Set Advertising" was just disabled and instance advertising was
4836
	 * set up earlier, then re-enable multi-instance advertising.
4837 4838
	 */
	if (hci_dev_test_flag(hdev, HCI_ADVERTISING) ||
4839 4840
	    !hci_dev_test_flag(hdev, HCI_ADVERTISING_INSTANCE) ||
	    list_empty(&hdev->adv_instances))
4841 4842
		goto unlock;

4843 4844 4845 4846 4847 4848 4849 4850 4851 4852
	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;
	}

4853 4854
	hci_req_init(&req, hdev);

4855 4856 4857 4858
	err = schedule_adv_instance(&req, instance, true);

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

4860
	if (err)
4861 4862
		BT_ERR("Failed to re-configure advertising");

4863 4864
unlock:
	hci_dev_unlock(hdev);
4865 4866
}

4867 4868
static int set_advertising(struct sock *sk, struct hci_dev *hdev, void *data,
			   u16 len)
4869 4870
{
	struct mgmt_mode *cp = data;
4871
	struct mgmt_pending_cmd *cmd;
4872
	struct hci_request req;
4873
	u8 val, status;
4874 4875 4876 4877
	int err;

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

4878 4879
	status = mgmt_le_support(hdev);
	if (status)
4880 4881
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING,
				       status);
4882

4883
	if (cp->val != 0x00 && cp->val != 0x01 && cp->val != 0x02)
4884 4885
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING,
				       MGMT_STATUS_INVALID_PARAMS);
4886 4887 4888 4889 4890

	hci_dev_lock(hdev);

	val = !!cp->val;

4891 4892 4893 4894 4895
	/* 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).
	 */
4896
	if (!hdev_is_powered(hdev) ||
4897 4898
	    (val == hci_dev_test_flag(hdev, HCI_ADVERTISING) &&
	     (cp->val == 0x02) == hci_dev_test_flag(hdev, HCI_ADVERTISING_CONNECTABLE)) ||
4899
	    hci_conn_num(hdev, LE_LINK) > 0 ||
4900
	    (hci_dev_test_flag(hdev, HCI_LE_SCAN) &&
4901
	     hdev->le_scan_type == LE_SCAN_ACTIVE)) {
4902
		bool changed;
4903

4904
		if (cp->val) {
4905
			changed = !hci_dev_test_and_set_flag(hdev, HCI_ADVERTISING);
4906
			if (cp->val == 0x02)
4907
				hci_dev_set_flag(hdev, HCI_ADVERTISING_CONNECTABLE);
4908
			else
4909
				hci_dev_clear_flag(hdev, HCI_ADVERTISING_CONNECTABLE);
4910
		} else {
4911
			changed = hci_dev_test_and_clear_flag(hdev, HCI_ADVERTISING);
4912
			hci_dev_clear_flag(hdev, HCI_ADVERTISING_CONNECTABLE);
4913 4914 4915 4916 4917 4918 4919 4920 4921 4922 4923 4924
		}

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

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

		goto unlock;
	}

4925 4926
	if (pending_find(MGMT_OP_SET_ADVERTISING, hdev) ||
	    pending_find(MGMT_OP_SET_LE, hdev)) {
4927 4928
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING,
				      MGMT_STATUS_BUSY);
4929 4930 4931 4932 4933 4934 4935 4936 4937 4938 4939
		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);

4940
	if (cp->val == 0x02)
4941
		hci_dev_set_flag(hdev, HCI_ADVERTISING_CONNECTABLE);
4942
	else
4943
		hci_dev_clear_flag(hdev, HCI_ADVERTISING_CONNECTABLE);
4944

4945 4946
	cancel_adv_timeout(hdev);

4947
	if (val) {
4948 4949 4950 4951
		/* 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.
		 */
4952 4953
		update_inst_adv_data(&req, 0x00);
		update_inst_scan_rsp_data(&req, 0x00);
4954
		enable_advertising(&req);
4955
	} else {
4956
		disable_advertising(&req);
4957
	}
4958 4959 4960 4961 4962 4963 4964 4965 4966 4967

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

unlock:
	hci_dev_unlock(hdev);
	return err;
}

4968 4969 4970 4971 4972 4973 4974 4975
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);

4976
	if (!lmp_le_capable(hdev))
4977 4978
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_STATIC_ADDRESS,
				       MGMT_STATUS_NOT_SUPPORTED);
4979 4980

	if (hdev_is_powered(hdev))
4981 4982
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_STATIC_ADDRESS,
				       MGMT_STATUS_REJECTED);
4983 4984 4985

	if (bacmp(&cp->bdaddr, BDADDR_ANY)) {
		if (!bacmp(&cp->bdaddr, BDADDR_NONE))
4986 4987 4988
			return mgmt_cmd_status(sk, hdev->id,
					       MGMT_OP_SET_STATIC_ADDRESS,
					       MGMT_STATUS_INVALID_PARAMS);
4989 4990 4991

		/* Two most significant bits shall be set */
		if ((cp->bdaddr.b[5] & 0xc0) != 0xc0)
4992 4993 4994
			return mgmt_cmd_status(sk, hdev->id,
					       MGMT_OP_SET_STATIC_ADDRESS,
					       MGMT_STATUS_INVALID_PARAMS);
4995 4996 4997 4998 4999 5000
	}

	hci_dev_lock(hdev);

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

5001 5002 5003 5004 5005
	err = send_settings_rsp(sk, MGMT_OP_SET_STATIC_ADDRESS, hdev);
	if (err < 0)
		goto unlock;

	err = new_settings(hdev, sk);
5006

5007
unlock:
5008 5009 5010 5011
	hci_dev_unlock(hdev);
	return err;
}

5012 5013 5014 5015 5016 5017 5018 5019 5020 5021
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))
5022 5023
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS,
				       MGMT_STATUS_NOT_SUPPORTED);
5024 5025 5026 5027

	interval = __le16_to_cpu(cp->interval);

	if (interval < 0x0004 || interval > 0x4000)
5028 5029
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS,
				       MGMT_STATUS_INVALID_PARAMS);
5030 5031 5032 5033

	window = __le16_to_cpu(cp->window);

	if (window < 0x0004 || window > 0x4000)
5034 5035
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS,
				       MGMT_STATUS_INVALID_PARAMS);
5036

5037
	if (window > interval)
5038 5039
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS,
				       MGMT_STATUS_INVALID_PARAMS);
5040

5041 5042 5043 5044 5045
	hci_dev_lock(hdev);

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

5046 5047
	err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS, 0,
				NULL, 0);
5048

5049 5050 5051
	/* If background scan is running, restart it so new parameters are
	 * loaded.
	 */
5052
	if (hci_dev_test_flag(hdev, HCI_LE_SCAN) &&
5053 5054 5055 5056 5057 5058 5059 5060 5061 5062 5063
	    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);
	}

5064 5065 5066 5067 5068
	hci_dev_unlock(hdev);

	return err;
}

5069 5070
static void fast_connectable_complete(struct hci_dev *hdev, u8 status,
				      u16 opcode)
5071
{
5072
	struct mgmt_pending_cmd *cmd;
5073 5074 5075 5076 5077

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

	hci_dev_lock(hdev);

5078
	cmd = pending_find(MGMT_OP_SET_FAST_CONNECTABLE, hdev);
5079 5080 5081 5082
	if (!cmd)
		goto unlock;

	if (status) {
5083 5084
		mgmt_cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
			        mgmt_status(status));
5085
	} else {
5086 5087 5088
		struct mgmt_mode *cp = cmd->param;

		if (cp->val)
5089
			hci_dev_set_flag(hdev, HCI_FAST_CONNECTABLE);
5090
		else
5091
			hci_dev_clear_flag(hdev, HCI_FAST_CONNECTABLE);
5092

5093 5094 5095 5096 5097 5098 5099 5100 5101 5102
		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);
}

5103
static int set_fast_connectable(struct sock *sk, struct hci_dev *hdev,
5104
				void *data, u16 len)
5105
{
5106
	struct mgmt_mode *cp = data;
5107
	struct mgmt_pending_cmd *cmd;
5108
	struct hci_request req;
5109 5110
	int err;

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

5113
	if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED) ||
5114
	    hdev->hci_ver < BLUETOOTH_VER_1_2)
5115 5116
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
				       MGMT_STATUS_NOT_SUPPORTED);
5117

5118
	if (cp->val != 0x00 && cp->val != 0x01)
5119 5120
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
				       MGMT_STATUS_INVALID_PARAMS);
5121

5122 5123
	hci_dev_lock(hdev);

5124
	if (pending_find(MGMT_OP_SET_FAST_CONNECTABLE, hdev)) {
5125 5126
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
				      MGMT_STATUS_BUSY);
5127 5128 5129
		goto unlock;
	}

5130
	if (!!cp->val == hci_dev_test_flag(hdev, HCI_FAST_CONNECTABLE)) {
5131 5132 5133 5134 5135
		err = send_settings_rsp(sk, MGMT_OP_SET_FAST_CONNECTABLE,
					hdev);
		goto unlock;
	}

5136
	if (!hdev_is_powered(hdev)) {
5137
		hci_dev_change_flag(hdev, HCI_FAST_CONNECTABLE);
5138 5139 5140 5141 5142 5143
		err = send_settings_rsp(sk, MGMT_OP_SET_FAST_CONNECTABLE,
					hdev);
		new_settings(hdev, sk);
		goto unlock;
	}

5144 5145 5146 5147 5148
	cmd = mgmt_pending_add(sk, MGMT_OP_SET_FAST_CONNECTABLE, hdev,
			       data, len);
	if (!cmd) {
		err = -ENOMEM;
		goto unlock;
5149 5150
	}

5151 5152
	hci_req_init(&req, hdev);

5153
	write_fast_connectable(&req, cp->val);
5154 5155

	err = hci_req_run(&req, fast_connectable_complete);
5156
	if (err < 0) {
5157 5158
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
				      MGMT_STATUS_FAILED);
5159
		mgmt_pending_remove(cmd);
5160 5161
	}

5162
unlock:
5163
	hci_dev_unlock(hdev);
5164

5165 5166 5167
	return err;
}

5168
static void set_bredr_complete(struct hci_dev *hdev, u8 status, u16 opcode)
5169
{
5170
	struct mgmt_pending_cmd *cmd;
5171 5172 5173 5174 5175

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

	hci_dev_lock(hdev);

5176
	cmd = pending_find(MGMT_OP_SET_BREDR, hdev);
5177 5178 5179 5180 5181 5182 5183 5184 5185
	if (!cmd)
		goto unlock;

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

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

5188
		mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, mgmt_err);
5189 5190 5191 5192 5193 5194 5195 5196 5197 5198 5199 5200 5201 5202
	} 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;
5203
	struct mgmt_pending_cmd *cmd;
5204 5205 5206 5207 5208 5209
	struct hci_request req;
	int err;

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

	if (!lmp_bredr_capable(hdev) || !lmp_le_capable(hdev))
5210 5211
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR,
				       MGMT_STATUS_NOT_SUPPORTED);
5212

5213
	if (!hci_dev_test_flag(hdev, HCI_LE_ENABLED))
5214 5215
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR,
				       MGMT_STATUS_REJECTED);
5216 5217

	if (cp->val != 0x00 && cp->val != 0x01)
5218 5219
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR,
				       MGMT_STATUS_INVALID_PARAMS);
5220 5221 5222

	hci_dev_lock(hdev);

5223
	if (cp->val == hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) {
5224 5225 5226 5227 5228 5229
		err = send_settings_rsp(sk, MGMT_OP_SET_BREDR, hdev);
		goto unlock;
	}

	if (!hdev_is_powered(hdev)) {
		if (!cp->val) {
5230 5231 5232 5233 5234
			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);
5235 5236
		}

5237
		hci_dev_change_flag(hdev, HCI_BREDR_ENABLED);
5238 5239 5240 5241 5242 5243 5244 5245 5246 5247 5248

		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) {
5249 5250
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR,
				      MGMT_STATUS_REJECTED);
5251
		goto unlock;
5252 5253 5254 5255 5256 5257 5258 5259
	} 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.
5260 5261 5262 5263 5264 5265
		 *
		 * 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.
5266
		 */
5267
		if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED) &&
5268
		    (bacmp(&hdev->static_addr, BDADDR_ANY) ||
5269
		     hci_dev_test_flag(hdev, HCI_SC_ENABLED))) {
5270 5271
			err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR,
					      MGMT_STATUS_REJECTED);
5272 5273
			goto unlock;
		}
5274 5275
	}

5276
	if (pending_find(MGMT_OP_SET_BREDR, hdev)) {
5277 5278
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR,
				      MGMT_STATUS_BUSY);
5279 5280 5281 5282 5283 5284 5285 5286 5287
		goto unlock;
	}

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

5288
	/* We need to flip the bit already here so that update_adv_data
5289 5290
	 * generates the correct flags.
	 */
5291
	hci_dev_set_flag(hdev, HCI_BREDR_ENABLED);
5292 5293

	hci_req_init(&req, hdev);
5294

5295
	write_fast_connectable(&req, false);
5296
	__hci_update_page_scan(&req);
5297

5298 5299 5300
	/* Since only the advertising data flags will change, there
	 * is no need to update the scan response data.
	 */
5301
	update_adv_data(&req);
5302

5303 5304 5305 5306 5307 5308 5309 5310 5311
	err = hci_req_run(&req, set_bredr_complete);
	if (err < 0)
		mgmt_pending_remove(cmd);

unlock:
	hci_dev_unlock(hdev);
	return err;
}

5312 5313
static void sc_enable_complete(struct hci_dev *hdev, u8 status, u16 opcode)
{
5314
	struct mgmt_pending_cmd *cmd;
5315 5316 5317 5318 5319 5320
	struct mgmt_mode *cp;

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

	hci_dev_lock(hdev);

5321
	cmd = pending_find(MGMT_OP_SET_SECURE_CONN, hdev);
5322 5323 5324 5325
	if (!cmd)
		goto unlock;

	if (status) {
5326 5327
		mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode,
			        mgmt_status(status));
5328 5329 5330 5331 5332 5333 5334
		goto remove;
	}

	cp = cmd->param;

	switch (cp->val) {
	case 0x00:
5335 5336
		hci_dev_clear_flag(hdev, HCI_SC_ENABLED);
		hci_dev_clear_flag(hdev, HCI_SC_ONLY);
5337 5338
		break;
	case 0x01:
5339
		hci_dev_set_flag(hdev, HCI_SC_ENABLED);
5340
		hci_dev_clear_flag(hdev, HCI_SC_ONLY);
5341 5342
		break;
	case 0x02:
5343 5344
		hci_dev_set_flag(hdev, HCI_SC_ENABLED);
		hci_dev_set_flag(hdev, HCI_SC_ONLY);
5345 5346 5347 5348 5349 5350 5351 5352 5353 5354 5355 5356
		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);
}

5357 5358 5359 5360
static int set_secure_conn(struct sock *sk, struct hci_dev *hdev,
			   void *data, u16 len)
{
	struct mgmt_mode *cp = data;
5361
	struct mgmt_pending_cmd *cmd;
5362
	struct hci_request req;
5363
	u8 val;
5364 5365 5366 5367
	int err;

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

5368
	if (!lmp_sc_capable(hdev) &&
5369
	    !hci_dev_test_flag(hdev, HCI_LE_ENABLED))
5370 5371
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SECURE_CONN,
				       MGMT_STATUS_NOT_SUPPORTED);
5372

5373
	if (hci_dev_test_flag(hdev, HCI_BREDR_ENABLED) &&
5374
	    lmp_sc_capable(hdev) &&
5375
	    !hci_dev_test_flag(hdev, HCI_SSP_ENABLED))
5376 5377
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SECURE_CONN,
				       MGMT_STATUS_REJECTED);
5378

5379
	if (cp->val != 0x00 && cp->val != 0x01 && cp->val != 0x02)
5380
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SECURE_CONN,
5381 5382 5383 5384
				  MGMT_STATUS_INVALID_PARAMS);

	hci_dev_lock(hdev);

5385
	if (!hdev_is_powered(hdev) || !lmp_sc_capable(hdev) ||
5386
	    !hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) {
5387 5388
		bool changed;

5389
		if (cp->val) {
5390 5391
			changed = !hci_dev_test_and_set_flag(hdev,
							     HCI_SC_ENABLED);
5392
			if (cp->val == 0x02)
5393
				hci_dev_set_flag(hdev, HCI_SC_ONLY);
5394
			else
5395
				hci_dev_clear_flag(hdev, HCI_SC_ONLY);
5396
		} else {
5397 5398
			changed = hci_dev_test_and_clear_flag(hdev,
							      HCI_SC_ENABLED);
5399
			hci_dev_clear_flag(hdev, HCI_SC_ONLY);
5400
		}
5401 5402 5403 5404 5405 5406 5407 5408 5409 5410 5411

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

5412
	if (pending_find(MGMT_OP_SET_SECURE_CONN, hdev)) {
5413 5414
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SECURE_CONN,
				      MGMT_STATUS_BUSY);
5415 5416 5417
		goto failed;
	}

5418 5419
	val = !!cp->val;

5420 5421
	if (val == hci_dev_test_flag(hdev, HCI_SC_ENABLED) &&
	    (cp->val == 0x02) == hci_dev_test_flag(hdev, HCI_SC_ONLY)) {
5422 5423 5424 5425 5426 5427 5428 5429 5430 5431
		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;
	}

5432 5433 5434
	hci_req_init(&req, hdev);
	hci_req_add(&req, HCI_OP_WRITE_SC_SUPPORT, 1, &val);
	err = hci_req_run(&req, sc_enable_complete);
5435 5436 5437 5438 5439 5440 5441 5442 5443 5444
	if (err < 0) {
		mgmt_pending_remove(cmd);
		goto failed;
	}

failed:
	hci_dev_unlock(hdev);
	return err;
}

5445 5446 5447 5448
static int set_debug_keys(struct sock *sk, struct hci_dev *hdev,
			  void *data, u16 len)
{
	struct mgmt_mode *cp = data;
5449
	bool changed, use_changed;
5450 5451 5452 5453
	int err;

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

5454
	if (cp->val != 0x00 && cp->val != 0x01 && cp->val != 0x02)
5455 5456
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DEBUG_KEYS,
				       MGMT_STATUS_INVALID_PARAMS);
5457 5458 5459 5460

	hci_dev_lock(hdev);

	if (cp->val)
5461
		changed = !hci_dev_test_and_set_flag(hdev, HCI_KEEP_DEBUG_KEYS);
5462
	else
5463 5464
		changed = hci_dev_test_and_clear_flag(hdev,
						      HCI_KEEP_DEBUG_KEYS);
5465

5466
	if (cp->val == 0x02)
5467 5468
		use_changed = !hci_dev_test_and_set_flag(hdev,
							 HCI_USE_DEBUG_KEYS);
5469
	else
5470 5471
		use_changed = hci_dev_test_and_clear_flag(hdev,
							  HCI_USE_DEBUG_KEYS);
5472 5473

	if (hdev_is_powered(hdev) && use_changed &&
5474
	    hci_dev_test_flag(hdev, HCI_SSP_ENABLED)) {
5475 5476 5477 5478 5479
		u8 mode = (cp->val == 0x02) ? 0x01 : 0x00;
		hci_send_cmd(hdev, HCI_OP_WRITE_SSP_DEBUG_MODE,
			     sizeof(mode), &mode);
	}

5480 5481 5482 5483 5484 5485 5486 5487 5488 5489 5490 5491
	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;
}

5492 5493 5494 5495 5496 5497 5498 5499 5500 5501
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))
5502 5503
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PRIVACY,
				       MGMT_STATUS_NOT_SUPPORTED);
5504 5505

	if (cp->privacy != 0x00 && cp->privacy != 0x01)
5506 5507
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PRIVACY,
				       MGMT_STATUS_INVALID_PARAMS);
5508 5509

	if (hdev_is_powered(hdev))
5510 5511
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PRIVACY,
				       MGMT_STATUS_REJECTED);
5512 5513 5514

	hci_dev_lock(hdev);

5515 5516 5517
	/* If user space supports this command it is also expected to
	 * handle IRKs. Therefore, set the HCI_RPA_RESOLVING flag.
	 */
5518
	hci_dev_set_flag(hdev, HCI_RPA_RESOLVING);
5519

5520
	if (cp->privacy) {
5521
		changed = !hci_dev_test_and_set_flag(hdev, HCI_PRIVACY);
5522
		memcpy(hdev->irk, cp->irk, sizeof(hdev->irk));
5523
		hci_dev_set_flag(hdev, HCI_RPA_EXPIRED);
5524
	} else {
5525
		changed = hci_dev_test_and_clear_flag(hdev, HCI_PRIVACY);
5526
		memset(hdev->irk, 0, sizeof(hdev->irk));
5527
		hci_dev_clear_flag(hdev, HCI_RPA_EXPIRED);
5528 5529 5530 5531 5532 5533 5534 5535 5536 5537 5538 5539 5540 5541
	}

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

5542 5543 5544 5545 5546 5547 5548 5549 5550 5551 5552 5553 5554 5555 5556 5557 5558 5559 5560 5561
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;
5562 5563
	const u16 max_irk_count = ((U16_MAX - sizeof(*cp)) /
				   sizeof(struct mgmt_irk_info));
5564 5565 5566 5567 5568 5569
	u16 irk_count, expected_len;
	int i, err;

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

	if (!lmp_le_capable(hdev))
5570 5571
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_IRKS,
				       MGMT_STATUS_NOT_SUPPORTED);
5572 5573

	irk_count = __le16_to_cpu(cp->irk_count);
5574 5575
	if (irk_count > max_irk_count) {
		BT_ERR("load_irks: too big irk_count value %u", irk_count);
5576 5577
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_IRKS,
				       MGMT_STATUS_INVALID_PARAMS);
5578
	}
5579 5580 5581 5582

	expected_len = sizeof(*cp) + irk_count * sizeof(struct mgmt_irk_info);
	if (expected_len != len) {
		BT_ERR("load_irks: expected %u bytes, got %u bytes",
5583
		       expected_len, len);
5584 5585
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_IRKS,
				       MGMT_STATUS_INVALID_PARAMS);
5586 5587 5588 5589 5590 5591 5592 5593
	}

	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))
5594 5595 5596
			return mgmt_cmd_status(sk, hdev->id,
					       MGMT_OP_LOAD_IRKS,
					       MGMT_STATUS_INVALID_PARAMS);
5597 5598 5599 5600 5601 5602 5603 5604 5605 5606 5607 5608 5609 5610 5611 5612 5613 5614 5615
	}

	hci_dev_lock(hdev);

	hci_smp_irks_clear(hdev);

	for (i = 0; i < irk_count; i++) {
		struct mgmt_irk_info *irk = &cp->irks[i];
		u8 addr_type;

		if (irk->addr.type == BDADDR_LE_PUBLIC)
			addr_type = ADDR_LE_DEV_PUBLIC;
		else
			addr_type = ADDR_LE_DEV_RANDOM;

		hci_add_irk(hdev, &irk->addr.bdaddr, addr_type, irk->val,
			    BDADDR_ANY);
	}

5616
	hci_dev_set_flag(hdev, HCI_RPA_RESOLVING);
5617

5618
	err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_LOAD_IRKS, 0, NULL, 0);
5619 5620 5621 5622 5623 5624

	hci_dev_unlock(hdev);

	return err;
}

5625 5626 5627 5628
static bool ltk_is_valid(struct mgmt_ltk_info *key)
{
	if (key->master != 0x00 && key->master != 0x01)
		return false;
5629 5630 5631 5632 5633 5634 5635 5636 5637 5638 5639 5640 5641

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

5644
static int load_long_term_keys(struct sock *sk, struct hci_dev *hdev,
5645
			       void *cp_data, u16 len)
5646 5647
{
	struct mgmt_cp_load_long_term_keys *cp = cp_data;
5648 5649
	const u16 max_key_count = ((U16_MAX - sizeof(*cp)) /
				   sizeof(struct mgmt_ltk_info));
5650
	u16 key_count, expected_len;
5651
	int i, err;
5652

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

	if (!lmp_le_capable(hdev))
5656 5657
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS,
				       MGMT_STATUS_NOT_SUPPORTED);
5658

5659
	key_count = __le16_to_cpu(cp->key_count);
5660 5661
	if (key_count > max_key_count) {
		BT_ERR("load_ltks: too big key_count value %u", key_count);
5662 5663
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS,
				       MGMT_STATUS_INVALID_PARAMS);
5664
	}
5665 5666 5667 5668 5669

	expected_len = sizeof(*cp) + key_count *
					sizeof(struct mgmt_ltk_info);
	if (expected_len != len) {
		BT_ERR("load_keys: expected %u bytes, got %u bytes",
5670
		       expected_len, len);
5671 5672
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS,
				       MGMT_STATUS_INVALID_PARAMS);
5673 5674
	}

5675
	BT_DBG("%s key_count %u", hdev->name, key_count);
5676

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

5680
		if (!ltk_is_valid(key))
5681 5682 5683
			return mgmt_cmd_status(sk, hdev->id,
					       MGMT_OP_LOAD_LONG_TERM_KEYS,
					       MGMT_STATUS_INVALID_PARAMS);
5684 5685
	}

5686 5687 5688 5689 5690 5691
	hci_dev_lock(hdev);

	hci_smp_ltks_clear(hdev);

	for (i = 0; i < key_count; i++) {
		struct mgmt_ltk_info *key = &cp->keys[i];
5692
		u8 type, addr_type, authenticated;
5693 5694 5695 5696 5697

		if (key->addr.type == BDADDR_LE_PUBLIC)
			addr_type = ADDR_LE_DEV_PUBLIC;
		else
			addr_type = ADDR_LE_DEV_RANDOM;
5698

5699 5700
		switch (key->type) {
		case MGMT_LTK_UNAUTHENTICATED:
5701
			authenticated = 0x00;
5702
			type = key->master ? SMP_LTK : SMP_LTK_SLAVE;
5703 5704
			break;
		case MGMT_LTK_AUTHENTICATED:
5705
			authenticated = 0x01;
5706 5707 5708 5709 5710
			type = key->master ? SMP_LTK : SMP_LTK_SLAVE;
			break;
		case MGMT_LTK_P256_UNAUTH:
			authenticated = 0x00;
			type = SMP_LTK_P256;
5711
			break;
5712 5713 5714
		case MGMT_LTK_P256_AUTH:
			authenticated = 0x01;
			type = SMP_LTK_P256;
5715
			break;
5716 5717 5718
		case MGMT_LTK_P256_DEBUG:
			authenticated = 0x00;
			type = SMP_LTK_P256_DEBUG;
5719 5720 5721
		default:
			continue;
		}
5722

5723
		hci_add_ltk(hdev, &key->addr.bdaddr, addr_type, type,
5724
			    authenticated, key->val, key->enc_size, key->ediv,
5725
			    key->rand);
5726 5727
	}

5728
	err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS, 0,
5729 5730
			   NULL, 0);

5731 5732
	hci_dev_unlock(hdev);

5733
	return err;
5734 5735
}

5736
static int conn_info_cmd_complete(struct mgmt_pending_cmd *cmd, u8 status)
5737 5738
{
	struct hci_conn *conn = cmd->user_data;
5739
	struct mgmt_rp_get_conn_info rp;
5740
	int err;
5741

5742
	memcpy(&rp.addr, cmd->param, sizeof(rp.addr));
5743

5744
	if (status == MGMT_STATUS_SUCCESS) {
5745
		rp.rssi = conn->rssi;
5746 5747 5748 5749 5750 5751
		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;
5752 5753
	}

5754 5755
	err = mgmt_cmd_complete(cmd->sk, cmd->index, MGMT_OP_GET_CONN_INFO,
				status, &rp, sizeof(rp));
5756 5757

	hci_conn_drop(conn);
5758
	hci_conn_put(conn);
5759 5760

	return err;
5761 5762
}

5763 5764
static void conn_info_refresh_complete(struct hci_dev *hdev, u8 hci_status,
				       u16 opcode)
5765 5766
{
	struct hci_cp_read_rssi *cp;
5767
	struct mgmt_pending_cmd *cmd;
5768 5769
	struct hci_conn *conn;
	u16 handle;
5770
	u8 status;
5771

5772
	BT_DBG("status 0x%02x", hci_status);
5773 5774 5775 5776 5777 5778 5779 5780 5781 5782 5783 5784 5785 5786 5787

	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);
5788 5789 5790
		status = MGMT_STATUS_SUCCESS;
	} else {
		status = mgmt_status(hci_status);
5791 5792 5793
	}

	if (!cp) {
5794
		BT_ERR("invalid sent_cmd in conn_info response");
5795 5796 5797 5798 5799 5800
		goto unlock;
	}

	handle = __le16_to_cpu(cp->handle);
	conn = hci_conn_hash_lookup_handle(hdev, handle);
	if (!conn) {
5801
		BT_ERR("unknown handle (%d) in conn_info response", handle);
5802 5803 5804
		goto unlock;
	}

5805
	cmd = pending_find_data(MGMT_OP_GET_CONN_INFO, hdev, conn);
5806 5807
	if (!cmd)
		goto unlock;
5808

5809 5810
	cmd->cmd_complete(cmd, status);
	mgmt_pending_remove(cmd);
5811 5812 5813 5814 5815 5816 5817 5818 5819 5820 5821 5822 5823 5824 5825 5826 5827 5828 5829 5830 5831

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))
5832 5833 5834
		return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONN_INFO,
					 MGMT_STATUS_INVALID_PARAMS,
					 &rp, sizeof(rp));
5835 5836 5837 5838

	hci_dev_lock(hdev);

	if (!hdev_is_powered(hdev)) {
5839 5840 5841
		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONN_INFO,
					MGMT_STATUS_NOT_POWERED, &rp,
					sizeof(rp));
5842 5843 5844 5845 5846 5847 5848 5849 5850 5851
		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) {
5852 5853 5854
		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONN_INFO,
					MGMT_STATUS_NOT_CONNECTED, &rp,
					sizeof(rp));
5855 5856 5857
		goto unlock;
	}

5858
	if (pending_find_data(MGMT_OP_GET_CONN_INFO, hdev, conn)) {
5859 5860
		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONN_INFO,
					MGMT_STATUS_BUSY, &rp, sizeof(rp));
5861 5862 5863
		goto unlock;
	}

5864 5865 5866 5867 5868 5869 5870 5871 5872 5873
	/* 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.
	 */
5874 5875
	if (time_after(jiffies, conn->conn_info_timestamp +
		       msecs_to_jiffies(conn_info_age)) ||
5876 5877 5878 5879
	    !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;
5880
		struct mgmt_pending_cmd *cmd;
5881 5882 5883 5884 5885 5886

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

5887 5888 5889 5890 5891 5892 5893 5894 5895 5896
		/* 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);
		}
5897

5898 5899 5900 5901 5902 5903 5904 5905
		/* 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);
		}

5906 5907 5908 5909 5910 5911 5912 5913 5914 5915 5916 5917
		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);
5918
		cmd->user_data = hci_conn_get(conn);
5919
		cmd->cmd_complete = conn_info_cmd_complete;
5920 5921 5922 5923 5924 5925

		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;
5926
		rp.max_tx_power = conn->max_tx_power;
5927

5928 5929
		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONN_INFO,
					MGMT_STATUS_SUCCESS, &rp, sizeof(rp));
5930 5931 5932 5933 5934 5935 5936
	}

unlock:
	hci_dev_unlock(hdev);
	return err;
}

5937
static int clock_info_cmd_complete(struct mgmt_pending_cmd *cmd, u8 status)
5938
{
5939
	struct hci_conn *conn = cmd->user_data;
5940
	struct mgmt_rp_get_clock_info rp;
5941
	struct hci_dev *hdev;
5942
	int err;
5943 5944 5945 5946 5947 5948 5949 5950 5951 5952 5953 5954 5955 5956 5957 5958 5959 5960 5961

	memset(&rp, 0, sizeof(rp));
	memcpy(&rp.addr, &cmd->param, sizeof(rp.addr));

	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:
5962 5963
	err = mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, status, &rp,
				sizeof(rp));
5964 5965 5966 5967 5968

	if (conn) {
		hci_conn_drop(conn);
		hci_conn_put(conn);
	}
5969 5970

	return err;
5971 5972
}

5973
static void get_clock_info_complete(struct hci_dev *hdev, u8 status, u16 opcode)
5974
{
5975
	struct hci_cp_read_clock *hci_cp;
5976
	struct mgmt_pending_cmd *cmd;
5977 5978 5979 5980 5981 5982 5983 5984 5985 5986 5987 5988 5989 5990 5991 5992 5993
	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;
	}

5994
	cmd = pending_find_data(MGMT_OP_GET_CLOCK_INFO, hdev, conn);
5995 5996 5997
	if (!cmd)
		goto unlock;

5998
	cmd->cmd_complete(cmd, mgmt_status(status));
5999 6000 6001 6002 6003 6004 6005 6006 6007 6008 6009 6010
	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;
6011
	struct mgmt_pending_cmd *cmd;
6012 6013 6014 6015 6016 6017 6018 6019 6020 6021 6022
	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)
6023 6024 6025
		return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CLOCK_INFO,
					 MGMT_STATUS_INVALID_PARAMS,
					 &rp, sizeof(rp));
6026 6027 6028 6029

	hci_dev_lock(hdev);

	if (!hdev_is_powered(hdev)) {
6030 6031 6032
		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CLOCK_INFO,
					MGMT_STATUS_NOT_POWERED, &rp,
					sizeof(rp));
6033 6034 6035 6036 6037 6038 6039
		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) {
6040 6041 6042 6043
			err = mgmt_cmd_complete(sk, hdev->id,
						MGMT_OP_GET_CLOCK_INFO,
						MGMT_STATUS_NOT_CONNECTED,
						&rp, sizeof(rp));
6044 6045 6046 6047 6048 6049 6050 6051 6052 6053 6054 6055
			goto unlock;
		}
	} else {
		conn = NULL;
	}

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

6056 6057
	cmd->cmd_complete = clock_info_cmd_complete;

6058 6059 6060 6061 6062 6063 6064
	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);
6065
		cmd->user_data = hci_conn_get(conn);
6066 6067 6068 6069 6070 6071 6072 6073 6074 6075 6076 6077 6078 6079 6080

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

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
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 */
static int hci_conn_params_set(struct hci_request *req, bdaddr_t *addr,
			       u8 addr_type, u8 auto_connect)
{
	struct hci_dev *hdev = req->hdev;
	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:
6117 6118 6119 6120 6121 6122
		/* 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);

6123 6124 6125
		__hci_update_background_scan(req);
		break;
	case HCI_AUTO_CONN_REPORT:
6126 6127 6128 6129
		if (params->explicit_connect)
			list_add(&params->action, &hdev->pend_le_conns);
		else
			list_add(&params->action, &hdev->pend_le_reports);
6130 6131 6132 6133 6134 6135
		__hci_update_background_scan(req);
		break;
	case HCI_AUTO_CONN_DIRECT:
	case HCI_AUTO_CONN_ALWAYS:
		if (!is_connected(hdev, addr, addr_type)) {
			list_add(&params->action, &hdev->pend_le_conns);
6136 6137 6138 6139 6140
			/* If we are in scan phase of connecting, we were
			 * already added to pend_le_conns and scanning.
			 */
			if (params->auto_connect != HCI_AUTO_CONN_EXPLICIT)
				__hci_update_background_scan(req);
6141 6142 6143 6144 6145 6146 6147 6148 6149 6150 6151 6152
		}
		break;
	}

	params->auto_connect = auto_connect;

	BT_DBG("addr %pMR (type %u) auto_connect %u", addr, addr_type,
	       auto_connect);

	return 0;
}

6153 6154 6155 6156 6157 6158 6159 6160 6161 6162 6163 6164
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);
}

6165
static void add_device_complete(struct hci_dev *hdev, u8 status, u16 opcode)
6166
{
6167
	struct mgmt_pending_cmd *cmd;
6168 6169 6170 6171 6172

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

	hci_dev_lock(hdev);

6173
	cmd = pending_find(MGMT_OP_ADD_DEVICE, hdev);
6174 6175 6176 6177 6178 6179 6180 6181 6182 6183
	if (!cmd)
		goto unlock;

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

unlock:
	hci_dev_unlock(hdev);
}

6184 6185 6186 6187
static int add_device(struct sock *sk, struct hci_dev *hdev,
		      void *data, u16 len)
{
	struct mgmt_cp_add_device *cp = data;
6188
	struct mgmt_pending_cmd *cmd;
6189
	struct hci_request req;
6190 6191 6192 6193 6194
	u8 auto_conn, addr_type;
	int err;

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

6195
	if (!bdaddr_type_is_valid(cp->addr.type) ||
6196
	    !bacmp(&cp->addr.bdaddr, BDADDR_ANY))
6197 6198 6199
		return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_DEVICE,
					 MGMT_STATUS_INVALID_PARAMS,
					 &cp->addr, sizeof(cp->addr));
6200

6201
	if (cp->action != 0x00 && cp->action != 0x01 && cp->action != 0x02)
6202 6203 6204
		return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_DEVICE,
					 MGMT_STATUS_INVALID_PARAMS,
					 &cp->addr, sizeof(cp->addr));
6205

6206 6207
	hci_req_init(&req, hdev);

6208 6209
	hci_dev_lock(hdev);

6210 6211 6212 6213 6214 6215 6216 6217
	cmd = mgmt_pending_add(sk, MGMT_OP_ADD_DEVICE, hdev, data, len);
	if (!cmd) {
		err = -ENOMEM;
		goto unlock;
	}

	cmd->cmd_complete = addr_cmd_complete;

6218
	if (cp->addr.type == BDADDR_BREDR) {
6219
		/* Only incoming connections action is supported for now */
6220
		if (cp->action != 0x01) {
6221 6222
			err = cmd->cmd_complete(cmd,
						MGMT_STATUS_INVALID_PARAMS);
6223
			mgmt_pending_remove(cmd);
6224 6225 6226 6227 6228 6229 6230
			goto unlock;
		}

		err = hci_bdaddr_list_add(&hdev->whitelist, &cp->addr.bdaddr,
					  cp->addr.type);
		if (err)
			goto unlock;
6231

6232
		__hci_update_page_scan(&req);
6233

6234 6235 6236
		goto added;
	}

6237 6238 6239 6240 6241
	if (cp->addr.type == BDADDR_LE_PUBLIC)
		addr_type = ADDR_LE_DEV_PUBLIC;
	else
		addr_type = ADDR_LE_DEV_RANDOM;

6242
	if (cp->action == 0x02)
6243
		auto_conn = HCI_AUTO_CONN_ALWAYS;
6244 6245
	else if (cp->action == 0x01)
		auto_conn = HCI_AUTO_CONN_DIRECT;
6246
	else
6247
		auto_conn = HCI_AUTO_CONN_REPORT;
6248

6249 6250 6251 6252 6253 6254 6255 6256 6257 6258 6259
	/* 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)) {
		err = cmd->cmd_complete(cmd, MGMT_STATUS_INVALID_PARAMS);
		mgmt_pending_remove(cmd);
		goto unlock;
	}

6260 6261 6262
	/* If the connection parameters don't exist for this device,
	 * they will be created and configured with defaults.
	 */
6263
	if (hci_conn_params_set(&req, &cp->addr.bdaddr, addr_type,
6264
				auto_conn) < 0) {
6265
		err = cmd->cmd_complete(cmd, MGMT_STATUS_FAILED);
6266
		mgmt_pending_remove(cmd);
6267 6268 6269
		goto unlock;
	}

6270
added:
6271 6272
	device_added(sk, hdev, &cp->addr.bdaddr, cp->addr.type, cp->action);

6273 6274 6275 6276 6277
	err = hci_req_run(&req, add_device_complete);
	if (err < 0) {
		/* ENODATA means no HCI commands were needed (e.g. if
		 * the adapter is powered off).
		 */
6278 6279
		if (err == -ENODATA)
			err = cmd->cmd_complete(cmd, MGMT_STATUS_SUCCESS);
6280 6281
		mgmt_pending_remove(cmd);
	}
6282 6283 6284 6285 6286 6287

unlock:
	hci_dev_unlock(hdev);
	return err;
}

6288 6289 6290 6291 6292 6293 6294 6295 6296 6297 6298
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);
}

6299
static void remove_device_complete(struct hci_dev *hdev, u8 status, u16 opcode)
6300
{
6301
	struct mgmt_pending_cmd *cmd;
6302 6303 6304 6305 6306

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

	hci_dev_lock(hdev);

6307
	cmd = pending_find(MGMT_OP_REMOVE_DEVICE, hdev);
6308 6309 6310 6311 6312 6313 6314 6315 6316 6317
	if (!cmd)
		goto unlock;

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

unlock:
	hci_dev_unlock(hdev);
}

6318 6319 6320 6321
static int remove_device(struct sock *sk, struct hci_dev *hdev,
			 void *data, u16 len)
{
	struct mgmt_cp_remove_device *cp = data;
6322
	struct mgmt_pending_cmd *cmd;
6323
	struct hci_request req;
6324 6325 6326 6327
	int err;

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

6328 6329
	hci_req_init(&req, hdev);

6330 6331
	hci_dev_lock(hdev);

6332 6333 6334 6335 6336 6337 6338 6339
	cmd = mgmt_pending_add(sk, MGMT_OP_REMOVE_DEVICE, hdev, data, len);
	if (!cmd) {
		err = -ENOMEM;
		goto unlock;
	}

	cmd->cmd_complete = addr_cmd_complete;

6340
	if (bacmp(&cp->addr.bdaddr, BDADDR_ANY)) {
6341
		struct hci_conn_params *params;
6342 6343
		u8 addr_type;

6344
		if (!bdaddr_type_is_valid(cp->addr.type)) {
6345 6346
			err = cmd->cmd_complete(cmd,
						MGMT_STATUS_INVALID_PARAMS);
6347
			mgmt_pending_remove(cmd);
6348 6349 6350
			goto unlock;
		}

6351 6352 6353 6354 6355
		if (cp->addr.type == BDADDR_BREDR) {
			err = hci_bdaddr_list_del(&hdev->whitelist,
						  &cp->addr.bdaddr,
						  cp->addr.type);
			if (err) {
6356 6357
				err = cmd->cmd_complete(cmd,
							MGMT_STATUS_INVALID_PARAMS);
6358
				mgmt_pending_remove(cmd);
6359 6360 6361
				goto unlock;
			}

6362
			__hci_update_page_scan(&req);
6363

6364 6365 6366 6367 6368
			device_removed(sk, hdev, &cp->addr.bdaddr,
				       cp->addr.type);
			goto complete;
		}

6369 6370 6371 6372 6373
		if (cp->addr.type == BDADDR_LE_PUBLIC)
			addr_type = ADDR_LE_DEV_PUBLIC;
		else
			addr_type = ADDR_LE_DEV_RANDOM;

6374 6375 6376 6377 6378 6379 6380 6381 6382 6383 6384 6385
		/* 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)) {
			err = cmd->cmd_complete(cmd,
						MGMT_STATUS_INVALID_PARAMS);
			mgmt_pending_remove(cmd);
			goto unlock;
		}

6386 6387 6388
		params = hci_conn_params_lookup(hdev, &cp->addr.bdaddr,
						addr_type);
		if (!params) {
6389 6390
			err = cmd->cmd_complete(cmd,
						MGMT_STATUS_INVALID_PARAMS);
6391
			mgmt_pending_remove(cmd);
6392 6393 6394
			goto unlock;
		}

6395 6396
		if (params->auto_connect == HCI_AUTO_CONN_DISABLED ||
		    params->auto_connect == HCI_AUTO_CONN_EXPLICIT) {
6397 6398
			err = cmd->cmd_complete(cmd,
						MGMT_STATUS_INVALID_PARAMS);
6399
			mgmt_pending_remove(cmd);
6400 6401 6402
			goto unlock;
		}

6403
		list_del(&params->action);
6404 6405
		list_del(&params->list);
		kfree(params);
6406
		__hci_update_background_scan(&req);
6407 6408

		device_removed(sk, hdev, &cp->addr.bdaddr, cp->addr.type);
6409
	} else {
6410
		struct hci_conn_params *p, *tmp;
6411
		struct bdaddr_list *b, *btmp;
6412

6413
		if (cp->addr.type) {
6414 6415
			err = cmd->cmd_complete(cmd,
						MGMT_STATUS_INVALID_PARAMS);
6416
			mgmt_pending_remove(cmd);
6417 6418 6419
			goto unlock;
		}

6420 6421 6422 6423 6424 6425
		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);
		}

6426
		__hci_update_page_scan(&req);
6427

6428 6429 6430 6431
		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);
6432 6433 6434 6435
			if (p->explicit_connect) {
				p->auto_connect = HCI_AUTO_CONN_EXPLICIT;
				continue;
			}
6436 6437 6438 6439 6440 6441 6442
			list_del(&p->action);
			list_del(&p->list);
			kfree(p);
		}

		BT_DBG("All LE connection parameters were removed");

6443
		__hci_update_background_scan(&req);
6444 6445
	}

6446
complete:
6447 6448 6449 6450 6451
	err = hci_req_run(&req, remove_device_complete);
	if (err < 0) {
		/* ENODATA means no HCI commands were needed (e.g. if
		 * the adapter is powered off).
		 */
6452 6453
		if (err == -ENODATA)
			err = cmd->cmd_complete(cmd, MGMT_STATUS_SUCCESS);
6454 6455
		mgmt_pending_remove(cmd);
	}
6456 6457 6458 6459 6460 6461

unlock:
	hci_dev_unlock(hdev);
	return err;
}

6462 6463 6464 6465
static int load_conn_param(struct sock *sk, struct hci_dev *hdev, void *data,
			   u16 len)
{
	struct mgmt_cp_load_conn_param *cp = data;
6466 6467
	const u16 max_param_count = ((U16_MAX - sizeof(*cp)) /
				     sizeof(struct mgmt_conn_param));
6468 6469 6470 6471
	u16 param_count, expected_len;
	int i;

	if (!lmp_le_capable(hdev))
6472 6473
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_CONN_PARAM,
				       MGMT_STATUS_NOT_SUPPORTED);
6474 6475

	param_count = __le16_to_cpu(cp->param_count);
6476 6477 6478
	if (param_count > max_param_count) {
		BT_ERR("load_conn_param: too big param_count value %u",
		       param_count);
6479 6480
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_CONN_PARAM,
				       MGMT_STATUS_INVALID_PARAMS);
6481
	}
6482 6483 6484 6485 6486 6487

	expected_len = sizeof(*cp) + param_count *
					sizeof(struct mgmt_conn_param);
	if (expected_len != len) {
		BT_ERR("load_conn_param: expected %u bytes, got %u bytes",
		       expected_len, len);
6488 6489
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_CONN_PARAM,
				       MGMT_STATUS_INVALID_PARAMS);
6490 6491 6492 6493 6494 6495 6496 6497 6498 6499 6500 6501 6502 6503 6504 6505 6506 6507 6508 6509 6510 6511 6512 6513 6514 6515 6516 6517 6518 6519 6520 6521 6522 6523 6524 6525 6526 6527 6528 6529 6530 6531 6532 6533 6534 6535 6536 6537 6538 6539 6540 6541 6542 6543
	}

	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 {
			BT_ERR("Ignoring invalid connection parameters");
			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) {
			BT_ERR("Ignoring invalid connection parameters");
			continue;
		}

		hci_param = hci_conn_params_add(hdev, &param->addr.bdaddr,
						addr_type);
		if (!hci_param) {
			BT_ERR("Failed to add connection parameters");
			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);

6544 6545
	return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_LOAD_CONN_PARAM, 0,
				 NULL, 0);
6546 6547
}

6548 6549 6550 6551 6552 6553 6554 6555 6556 6557
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))
6558 6559
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_EXTERNAL_CONFIG,
				       MGMT_STATUS_REJECTED);
6560 6561

	if (cp->config != 0x00 && cp->config != 0x01)
6562 6563
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_EXTERNAL_CONFIG,
				         MGMT_STATUS_INVALID_PARAMS);
6564 6565

	if (!test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks))
6566 6567
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_EXTERNAL_CONFIG,
				       MGMT_STATUS_NOT_SUPPORTED);
6568 6569 6570 6571

	hci_dev_lock(hdev);

	if (cp->config)
6572
		changed = !hci_dev_test_and_set_flag(hdev, HCI_EXT_CONFIGURED);
6573
	else
6574
		changed = hci_dev_test_and_clear_flag(hdev, HCI_EXT_CONFIGURED);
6575 6576 6577 6578 6579 6580 6581 6582

	err = send_options_rsp(sk, MGMT_OP_SET_EXTERNAL_CONFIG, hdev);
	if (err < 0)
		goto unlock;

	if (!changed)
		goto unlock;

6583 6584
	err = new_options(hdev, sk);

6585
	if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED) == is_configured(hdev)) {
6586
		mgmt_index_removed(hdev);
6587

6588
		if (hci_dev_test_and_change_flag(hdev, HCI_UNCONFIGURED)) {
6589 6590
			hci_dev_set_flag(hdev, HCI_CONFIG);
			hci_dev_set_flag(hdev, HCI_AUTO_OFF);
6591 6592 6593

			queue_work(hdev->req_workqueue, &hdev->power_on);
		} else {
6594
			set_bit(HCI_RAW, &hdev->flags);
6595 6596
			mgmt_index_added(hdev);
		}
6597 6598 6599 6600 6601 6602 6603
	}

unlock:
	hci_dev_unlock(hdev);
	return err;
}

6604 6605 6606 6607 6608 6609 6610 6611 6612 6613
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))
6614 6615
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PUBLIC_ADDRESS,
				       MGMT_STATUS_REJECTED);
6616 6617

	if (!bacmp(&cp->bdaddr, BDADDR_ANY))
6618 6619
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PUBLIC_ADDRESS,
				       MGMT_STATUS_INVALID_PARAMS);
6620 6621

	if (!hdev->set_bdaddr)
6622 6623
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PUBLIC_ADDRESS,
				       MGMT_STATUS_NOT_SUPPORTED);
6624 6625 6626 6627 6628 6629 6630 6631 6632 6633 6634 6635 6636

	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;

6637
	if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED))
6638 6639 6640 6641 6642
		err = new_options(hdev, sk);

	if (is_configured(hdev)) {
		mgmt_index_removed(hdev);

6643
		hci_dev_clear_flag(hdev, HCI_UNCONFIGURED);
6644

6645 6646
		hci_dev_set_flag(hdev, HCI_CONFIG);
		hci_dev_set_flag(hdev, HCI_AUTO_OFF);
6647 6648 6649 6650 6651 6652 6653 6654 6655

		queue_work(hdev->req_workqueue, &hdev->power_on);
	}

unlock:
	hci_dev_unlock(hdev);
	return err;
}

6656 6657 6658 6659 6660 6661 6662 6663 6664 6665 6666
static inline u16 eir_append_data(u8 *eir, u16 eir_len, u8 type, u8 *data,
				  u8 data_len)
{
	eir[eir_len++] = sizeof(type) + data_len;
	eir[eir_len++] = type;
	memcpy(&eir[eir_len], data, data_len);
	eir_len += data_len;

	return eir_len;
}

6667 6668 6669 6670 6671 6672 6673 6674 6675 6676 6677 6678 6679 6680 6681 6682 6683 6684 6685 6686 6687 6688 6689 6690 6691 6692 6693 6694 6695 6696 6697 6698 6699 6700 6701 6702 6703 6704 6705 6706 6707 6708 6709 6710 6711 6712 6713 6714 6715 6716 6717 6718 6719 6720 6721 6722 6723 6724 6725 6726 6727 6728 6729 6730 6731 6732 6733 6734 6735 6736 6737 6738 6739 6740 6741 6742 6743 6744 6745 6746 6747 6748 6749 6750 6751 6752 6753 6754 6755 6756 6757 6758 6759 6760 6761 6762 6763 6764 6765 6766 6767 6768 6769 6770 6771 6772 6773 6774 6775 6776 6777 6778 6779 6780 6781 6782 6783 6784 6785 6786 6787 6788 6789 6790 6791 6792 6793 6794 6795 6796 6797 6798 6799 6800 6801 6802 6803 6804 6805
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;
}

6806 6807 6808 6809 6810 6811 6812
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;
6813
	u8 status, flags, role, addr[7], hash[16], rand[16];
6814 6815 6816 6817
	int err;

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

6818 6819 6820 6821 6822 6823 6824 6825 6826 6827 6828 6829 6830 6831 6832 6833 6834 6835 6836 6837 6838 6839 6840 6841
	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;
6842 6843 6844 6845
	}

	rp_len = sizeof(*rp) + eir_len;
	rp = kmalloc(rp_len, GFP_ATOMIC);
6846
	if (!rp)
6847
		return -ENOMEM;
6848

6849 6850 6851
	if (status)
		goto complete;

6852
	hci_dev_lock(hdev);
6853 6854 6855 6856

	eir_len = 0;
	switch (cp->type) {
	case BIT(BDADDR_BREDR):
6857 6858 6859 6860 6861 6862 6863 6864 6865 6866 6867 6868 6869
		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);
		}
6870 6871
		break;
	case (BIT(BDADDR_LE_PUBLIC) | BIT(BDADDR_LE_RANDOM)):
6872 6873
		if (hci_dev_test_flag(hdev, HCI_SC_ENABLED) &&
		    smp_generate_oob(hdev, hash, rand) < 0) {
6874
			hci_dev_unlock(hdev);
6875 6876
			status = MGMT_STATUS_FAILED;
			goto complete;
6877 6878
		}

6879 6880 6881 6882 6883 6884 6885 6886 6887 6888
		/* 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.
		 */
6889
		if (hci_dev_test_flag(hdev, HCI_PRIVACY)) {
6890 6891 6892 6893 6894 6895 6896 6897 6898
			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))) {
6899 6900 6901 6902 6903 6904 6905 6906 6907 6908 6909 6910 6911 6912 6913 6914 6915 6916
			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));

6917 6918 6919 6920
		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));
6921

6922 6923 6924 6925
			eir_len = eir_append_data(rp->eir, eir_len,
						  EIR_LE_SC_RANDOM,
						  rand, sizeof(rand));
		}
6926

6927 6928 6929 6930 6931 6932 6933 6934 6935 6936 6937 6938
		flags = get_adv_discov_flags(hdev);

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

6939 6940
	hci_sock_set_flag(sk, HCI_MGMT_OOB_DATA_EVENTS);

6941 6942 6943
	status = MGMT_STATUS_SUCCESS;

complete:
6944 6945 6946
	rp->type = cp->type;
	rp->eir_len = cpu_to_le16(eir_len);

6947
	err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_EXT_DATA,
6948 6949
				status, rp, sizeof(*rp) + eir_len);
	if (err < 0 || status)
6950 6951 6952 6953 6954
		goto done;

	err = mgmt_limited_event(MGMT_EV_LOCAL_OOB_DATA_UPDATED, hdev,
				 rp, sizeof(*rp) + eir_len,
				 HCI_MGMT_OOB_DATA_EVENTS, sk);
6955

6956
done:
6957 6958 6959 6960 6961
	kfree(rp);

	return err;
}

6962 6963 6964 6965 6966 6967 6968 6969 6970 6971 6972 6973 6974 6975 6976
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;

	if (hdev->adv_tx_power != HCI_TX_POWER_INVALID)
		flags |= MGMT_ADV_FLAG_TX_POWER;

	return flags;
}

6977 6978 6979 6980 6981
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;
6982
	int err, i;
6983
	bool instance;
6984
	struct adv_info *adv_instance;
6985
	u32 supported_flags;
6986 6987 6988

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

6989 6990 6991 6992
	if (!lmp_le_capable(hdev))
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_READ_ADV_FEATURES,
				       MGMT_STATUS_REJECTED);

6993 6994 6995
	hci_dev_lock(hdev);

	rp_len = sizeof(*rp);
6996 6997 6998

	instance = hci_dev_test_flag(hdev, HCI_ADVERTISING_INSTANCE);
	if (instance)
6999
		rp_len += hdev->adv_instance_cnt;
7000

7001 7002 7003 7004 7005 7006
	rp = kmalloc(rp_len, GFP_ATOMIC);
	if (!rp) {
		hci_dev_unlock(hdev);
		return -ENOMEM;
	}

7007 7008 7009
	supported_flags = get_supported_adv_flags(hdev);

	rp->supported_flags = cpu_to_le32(supported_flags);
7010 7011
	rp->max_adv_data_len = HCI_MAX_AD_LENGTH;
	rp->max_scan_rsp_len = HCI_MAX_AD_LENGTH;
7012
	rp->max_instances = HCI_MAX_ADV_INSTANCES;
7013 7014

	if (instance) {
7015 7016 7017 7018 7019 7020 7021 7022 7023
		i = 0;
		list_for_each_entry(adv_instance, &hdev->adv_instances, list) {
			if (i >= hdev->adv_instance_cnt)
				break;

			rp->instance[i] = adv_instance->instance;
			i++;
		}
		rp->num_instances = hdev->adv_instance_cnt;
7024 7025 7026
	} else {
		rp->num_instances = 0;
	}
7027 7028 7029 7030 7031 7032 7033 7034 7035 7036 7037

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

7038
static bool tlv_data_is_valid(struct hci_dev *hdev, u32 adv_flags, u8 *data,
7039
			      u8 len, bool is_adv_data)
7040
{
7041
	u8 max_len = HCI_MAX_AD_LENGTH;
7042
	int i, cur_len;
7043
	bool flags_managed = false;
7044
	bool tx_power_managed = false;
7045 7046
	u32 flags_params = MGMT_ADV_FLAG_DISCOV | MGMT_ADV_FLAG_LIMITED_DISCOV |
			   MGMT_ADV_FLAG_MANAGED_FLAGS;
7047

7048
	if (is_adv_data && (adv_flags & flags_params)) {
7049 7050 7051
		flags_managed = true;
		max_len -= 3;
	}
7052

7053 7054 7055 7056 7057
	if (is_adv_data && (adv_flags & MGMT_ADV_FLAG_TX_POWER)) {
		tx_power_managed = true;
		max_len -= 3;
	}

7058
	if (len > max_len)
7059 7060
		return false;

7061 7062 7063
	/* Make sure that the data is correctly formatted. */
	for (i = 0, cur_len = 0; i < len; i += (cur_len + 1)) {
		cur_len = data[i];
7064

7065 7066 7067
		if (flags_managed && data[i + 1] == EIR_FLAGS)
			return false;

7068 7069 7070
		if (tx_power_managed && data[i + 1] == EIR_TX_POWER)
			return false;

7071 7072 7073
		/* If the current field length would exceed the total data
		 * length, then it's invalid.
		 */
7074
		if (i + cur_len >= len)
7075 7076 7077 7078 7079 7080 7081 7082 7083 7084
			return false;
	}

	return true;
}

static void add_advertising_complete(struct hci_dev *hdev, u8 status,
				     u16 opcode)
{
	struct mgmt_pending_cmd *cmd;
7085
	struct mgmt_cp_add_advertising *cp;
7086
	struct mgmt_rp_add_advertising rp;
7087 7088
	struct adv_info *adv_instance, *n;
	u8 instance;
7089 7090 7091 7092 7093 7094 7095

	BT_DBG("status %d", status);

	hci_dev_lock(hdev);

	cmd = pending_find(MGMT_OP_ADD_ADVERTISING, hdev);

7096
	if (status)
7097
		hci_dev_clear_flag(hdev, HCI_ADVERTISING_INSTANCE);
7098 7099 7100 7101 7102 7103 7104 7105 7106 7107 7108 7109 7110 7111 7112 7113 7114

	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);
		advertising_removed(cmd ? cmd->sk : NULL, hdev, instance);
7115 7116 7117 7118 7119
	}

	if (!cmd)
		goto unlock;

7120 7121
	cp = cmd->param;
	rp.instance = cp->instance;
7122 7123 7124 7125 7126 7127 7128 7129 7130 7131 7132 7133 7134 7135

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

7136
void mgmt_adv_timeout_expired(struct hci_dev *hdev)
7137
{
7138 7139 7140
	u8 instance;
	struct hci_request req;

7141
	hdev->adv_instance_timeout = 0;
7142

7143 7144 7145 7146
	instance = get_current_adv_instance(hdev);
	if (instance == 0x00)
		return;

7147
	hci_dev_lock(hdev);
7148 7149 7150 7151 7152 7153 7154 7155 7156 7157
	hci_req_init(&req, hdev);

	clear_adv_instance(hdev, &req, instance, false);

	if (list_empty(&hdev->adv_instances))
		disable_advertising(&req);

	if (!skb_queue_empty(&req.cmd_q))
		hci_req_run(&req, NULL);

7158 7159 7160
	hci_dev_unlock(hdev);
}

7161 7162 7163 7164 7165 7166
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;
7167
	u32 supported_flags;
7168
	u8 status;
7169 7170 7171 7172
	u16 timeout, duration;
	unsigned int prev_instance_cnt = hdev->adv_instance_cnt;
	u8 schedule_instance = 0;
	struct adv_info *next_instance;
7173 7174 7175 7176 7177 7178 7179 7180 7181 7182 7183 7184
	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);

	flags = __le32_to_cpu(cp->flags);
7185
	timeout = __le16_to_cpu(cp->timeout);
7186
	duration = __le16_to_cpu(cp->duration);
7187

7188 7189
	/* The current implementation only supports a subset of the specified
	 * flags.
7190 7191
	 */
	supported_flags = get_supported_adv_flags(hdev);
7192
	if (flags & ~supported_flags)
7193 7194 7195 7196 7197
		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING,
				       MGMT_STATUS_INVALID_PARAMS);

	hci_dev_lock(hdev);

7198 7199 7200 7201 7202 7203
	if (timeout && !hdev_is_powered(hdev)) {
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING,
				      MGMT_STATUS_REJECTED);
		goto unlock;
	}

7204
	if (pending_find(MGMT_OP_ADD_ADVERTISING, hdev) ||
7205
	    pending_find(MGMT_OP_REMOVE_ADVERTISING, hdev) ||
7206 7207 7208 7209 7210 7211
	    pending_find(MGMT_OP_SET_LE, hdev)) {
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING,
				      MGMT_STATUS_BUSY);
		goto unlock;
	}

7212
	if (!tlv_data_is_valid(hdev, flags, cp->data, cp->adv_data_len, true) ||
7213
	    !tlv_data_is_valid(hdev, flags, cp->data + cp->adv_data_len,
7214
			       cp->scan_rsp_len, false)) {
7215 7216 7217 7218 7219
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING,
				      MGMT_STATUS_INVALID_PARAMS);
		goto unlock;
	}

7220 7221 7222 7223 7224 7225 7226 7227 7228 7229
	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;
	}
7230

7231 7232 7233 7234 7235
	/* Only trigger an advertising added event if a new instance was
	 * actually added.
	 */
	if (hdev->adv_instance_cnt > prev_instance_cnt)
		advertising_added(sk, hdev, cp->instance);
7236

7237
	hci_dev_set_flag(hdev, HCI_ADVERTISING_INSTANCE);
7238

7239 7240 7241 7242 7243 7244 7245
	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);
7246

7247 7248 7249 7250 7251 7252 7253 7254 7255
		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;
	}
7256

7257 7258 7259
	/* 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.
7260 7261
	 */
	if (!hdev_is_powered(hdev) ||
7262 7263 7264
	    hci_dev_test_flag(hdev, HCI_ADVERTISING) ||
	    !schedule_instance) {
		rp.instance = cp->instance;
7265 7266 7267 7268 7269 7270 7271 7272 7273 7274 7275 7276 7277 7278 7279 7280 7281
		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);

7282 7283 7284 7285
	err = schedule_adv_instance(&req, schedule_instance, true);

	if (!err)
		err = hci_req_run(&req, add_advertising_complete);
7286 7287 7288 7289 7290 7291 7292 7293 7294 7295

	if (err < 0)
		mgmt_pending_remove(cmd);

unlock:
	hci_dev_unlock(hdev);

	return err;
}

7296 7297 7298 7299
static void remove_advertising_complete(struct hci_dev *hdev, u8 status,
					u16 opcode)
{
	struct mgmt_pending_cmd *cmd;
7300
	struct mgmt_cp_remove_advertising *cp;
7301 7302 7303 7304 7305 7306 7307 7308 7309 7310 7311 7312 7313 7314
	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;

7315 7316
	cp = cmd->param;
	rp.instance = cp->instance;
7317 7318 7319 7320 7321 7322 7323 7324 7325 7326 7327 7328 7329 7330 7331 7332

	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;
7333
	int err;
7334 7335 7336 7337 7338

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

	hci_dev_lock(hdev);

7339
	if (cp->instance && !hci_find_adv_instance(hdev, cp->instance)) {
7340 7341 7342 7343 7344 7345
		err = mgmt_cmd_status(sk, hdev->id,
				      MGMT_OP_REMOVE_ADVERTISING,
				      MGMT_STATUS_INVALID_PARAMS);
		goto unlock;
	}

7346 7347 7348 7349 7350 7351 7352 7353 7354 7355 7356 7357 7358 7359
	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;
	}

	if (!hci_dev_test_flag(hdev, HCI_ADVERTISING_INSTANCE)) {
		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_REMOVE_ADVERTISING,
				      MGMT_STATUS_INVALID_PARAMS);
		goto unlock;
	}

7360
	hci_req_init(&req, hdev);
7361

7362
	clear_adv_instance(hdev, &req, cp->instance, true);
7363

7364 7365
	if (list_empty(&hdev->adv_instances))
		disable_advertising(&req);
7366

7367 7368 7369
	/* 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.
7370
	 */
7371 7372
	if (skb_queue_empty(&req.cmd_q) ||
	    !hdev_is_powered(hdev) ||
7373
	    hci_dev_test_flag(hdev, HCI_ADVERTISING)) {
7374
		rp.instance = cp->instance;
7375 7376 7377 7378 7379 7380 7381 7382 7383 7384 7385 7386 7387 7388 7389 7390 7391 7392 7393 7394 7395 7396 7397
		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;
}

7398
static const struct hci_mgmt_handler mgmt_handlers[] = {
7399
	{ NULL }, /* 0x0000 (no command) */
7400
	{ read_version,            MGMT_READ_VERSION_SIZE,
7401 7402
						HCI_MGMT_NO_HDEV |
						HCI_MGMT_UNTRUSTED },
7403
	{ read_commands,           MGMT_READ_COMMANDS_SIZE,
7404 7405
						HCI_MGMT_NO_HDEV |
						HCI_MGMT_UNTRUSTED },
7406
	{ read_index_list,         MGMT_READ_INDEX_LIST_SIZE,
7407 7408 7409 7410
						HCI_MGMT_NO_HDEV |
						HCI_MGMT_UNTRUSTED },
	{ read_controller_info,    MGMT_READ_INFO_SIZE,
						HCI_MGMT_UNTRUSTED },
7411 7412 7413 7414 7415 7416 7417 7418 7419 7420 7421 7422 7423
	{ 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 },
7424 7425 7426 7427
	{ 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 },
7428 7429 7430 7431 7432 7433 7434 7435 7436 7437 7438 7439
	{ 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 },
7440 7441 7442
	{ read_local_oob_data,     MGMT_READ_LOCAL_OOB_DATA_SIZE },
	{ add_remote_oob_data,     MGMT_ADD_REMOTE_OOB_DATA_SIZE,
						HCI_MGMT_VAR_LEN },
7443 7444 7445 7446 7447 7448 7449 7450 7451 7452 7453 7454 7455 7456
	{ 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 },
7457 7458
	{ load_irks,               MGMT_LOAD_IRKS_SIZE,
						HCI_MGMT_VAR_LEN },
7459 7460 7461 7462
	{ 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 },
7463 7464 7465
	{ load_conn_param,         MGMT_LOAD_CONN_PARAM_SIZE,
						HCI_MGMT_VAR_LEN },
	{ read_unconf_index_list,  MGMT_READ_UNCONF_INDEX_LIST_SIZE,
7466 7467
						HCI_MGMT_NO_HDEV |
						HCI_MGMT_UNTRUSTED },
7468
	{ read_config_info,        MGMT_READ_CONFIG_INFO_SIZE,
7469 7470
						HCI_MGMT_UNCONFIGURED |
						HCI_MGMT_UNTRUSTED },
7471 7472 7473 7474 7475 7476
	{ 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 },
7477
	{ read_local_oob_ext_data, MGMT_READ_LOCAL_OOB_EXT_DATA_SIZE },
7478
	{ read_ext_index_list,     MGMT_READ_EXT_INDEX_LIST_SIZE,
7479 7480
						HCI_MGMT_NO_HDEV |
						HCI_MGMT_UNTRUSTED },
7481
	{ read_adv_features,       MGMT_READ_ADV_FEATURES_SIZE },
7482 7483
	{ add_advertising,	   MGMT_ADD_ADVERTISING_SIZE,
						HCI_MGMT_VAR_LEN },
7484
	{ remove_advertising,	   MGMT_REMOVE_ADVERTISING_SIZE },
7485 7486
};

7487
void mgmt_index_added(struct hci_dev *hdev)
7488
{
7489
	struct mgmt_ev_ext_index ev;
7490

7491 7492 7493
	if (test_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks))
		return;

7494 7495 7496 7497 7498
	switch (hdev->dev_type) {
	case HCI_BREDR:
		if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED)) {
			mgmt_index_event(MGMT_EV_UNCONF_INDEX_ADDED, hdev,
					 NULL, 0, HCI_MGMT_UNCONF_INDEX_EVENTS);
7499
			ev.type = 0x01;
7500 7501 7502
		} else {
			mgmt_index_event(MGMT_EV_INDEX_ADDED, hdev, NULL, 0,
					 HCI_MGMT_INDEX_EVENTS);
7503
			ev.type = 0x00;
7504 7505
		}
		break;
7506 7507 7508 7509 7510
	case HCI_AMP:
		ev.type = 0x02;
		break;
	default:
		return;
7511
	}
7512 7513 7514 7515 7516

	ev.bus = hdev->bus;

	mgmt_index_event(MGMT_EV_EXT_INDEX_ADDED, hdev, &ev, sizeof(ev),
			 HCI_MGMT_EXT_INDEX_EVENTS);
7517 7518
}

7519
void mgmt_index_removed(struct hci_dev *hdev)
7520
{
7521
	struct mgmt_ev_ext_index ev;
7522
	u8 status = MGMT_STATUS_INVALID_INDEX;
7523

7524 7525 7526
	if (test_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks))
		return;

7527 7528 7529
	switch (hdev->dev_type) {
	case HCI_BREDR:
		mgmt_pending_foreach(0, hdev, cmd_complete_rsp, &status);
7530

7531 7532 7533
		if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED)) {
			mgmt_index_event(MGMT_EV_UNCONF_INDEX_REMOVED, hdev,
					 NULL, 0, HCI_MGMT_UNCONF_INDEX_EVENTS);
7534
			ev.type = 0x01;
7535 7536 7537
		} else {
			mgmt_index_event(MGMT_EV_INDEX_REMOVED, hdev, NULL, 0,
					 HCI_MGMT_INDEX_EVENTS);
7538
			ev.type = 0x00;
7539 7540
		}
		break;
7541 7542 7543 7544 7545
	case HCI_AMP:
		ev.type = 0x02;
		break;
	default:
		return;
7546
	}
7547 7548 7549 7550 7551

	ev.bus = hdev->bus;

	mgmt_index_event(MGMT_EV_EXT_INDEX_REMOVED, hdev, &ev, sizeof(ev),
			 HCI_MGMT_EXT_INDEX_EVENTS);
7552 7553
}

7554
/* This function requires the caller holds hdev->lock */
7555
static void restart_le_actions(struct hci_request *req)
7556
{
7557
	struct hci_dev *hdev = req->hdev;
7558 7559 7560
	struct hci_conn_params *p;

	list_for_each_entry(p, &hdev->le_conn_params, list) {
7561 7562 7563 7564 7565 7566
		/* Needed for AUTO_OFF case where might not "really"
		 * have been powered off.
		 */
		list_del_init(&p->action);

		switch (p->auto_connect) {
7567
		case HCI_AUTO_CONN_DIRECT:
7568 7569 7570 7571 7572 7573 7574 7575
		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;
7576
		}
7577
	}
7578

7579
	__hci_update_background_scan(req);
7580 7581
}

7582
static void powered_complete(struct hci_dev *hdev, u8 status, u16 opcode)
7583 7584 7585 7586 7587
{
	struct cmd_lookup match = { NULL, hdev };

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

7588 7589 7590 7591 7592 7593 7594 7595 7596
	if (!status) {
		/* Register the available SMP channels (BR/EDR and LE) only
		 * when successfully powering on the controller. This late
		 * registration is required so that LE SMP can clearly
		 * decide if the public address or static address is used.
		 */
		smp_register(hdev);
	}

7597 7598 7599 7600 7601 7602 7603 7604 7605 7606 7607 7608
	hci_dev_lock(hdev);

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

	new_settings(hdev, match.sk);

	hci_dev_unlock(hdev);

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

7609
static int powered_update_hci(struct hci_dev *hdev)
7610
{
7611
	struct hci_request req;
7612
	struct adv_info *adv_instance;
7613
	u8 link_sec;
7614

7615 7616
	hci_req_init(&req, hdev);

7617
	if (hci_dev_test_flag(hdev, HCI_SSP_ENABLED) &&
7618
	    !lmp_host_ssp_capable(hdev)) {
7619
		u8 mode = 0x01;
7620

7621 7622 7623 7624
		hci_req_add(&req, HCI_OP_WRITE_SSP_MODE, sizeof(mode), &mode);

		if (bredr_sc_enabled(hdev) && !lmp_host_sc_capable(hdev)) {
			u8 support = 0x01;
7625

7626 7627 7628
			hci_req_add(&req, HCI_OP_WRITE_SC_SUPPORT,
				    sizeof(support), &support);
		}
7629 7630
	}

7631
	if (hci_dev_test_flag(hdev, HCI_LE_ENABLED) &&
7632
	    lmp_bredr_capable(hdev)) {
7633
		struct hci_cp_write_le_host_supported cp;
7634

7635 7636
		cp.le = 0x01;
		cp.simul = 0x00;
7637

7638 7639 7640 7641 7642
		/* Check first if we already have the right
		 * host state (host features set)
		 */
		if (cp.le != lmp_host_le_capable(hdev) ||
		    cp.simul != lmp_host_le_br_capable(hdev))
7643 7644
			hci_req_add(&req, HCI_OP_WRITE_LE_HOST_SUPPORTED,
				    sizeof(cp), &cp);
7645
	}
7646

7647
	if (lmp_le_capable(hdev)) {
7648 7649 7650 7651
		/* Make sure the controller has a good default for
		 * advertising data. This also applies to the case
		 * where BR/EDR was toggled during the AUTO_OFF phase.
		 */
7652 7653 7654
		if (hci_dev_test_flag(hdev, HCI_LE_ENABLED) &&
		    (hci_dev_test_flag(hdev, HCI_ADVERTISING) ||
		     !hci_dev_test_flag(hdev, HCI_ADVERTISING_INSTANCE))) {
7655
			update_adv_data(&req);
7656 7657
			update_scan_rsp_data(&req);
		}
7658

7659 7660 7661 7662 7663 7664 7665 7666 7667
		if (hci_dev_test_flag(hdev, HCI_ADVERTISING_INSTANCE) &&
		    hdev->cur_adv_instance == 0x00 &&
		    !list_empty(&hdev->adv_instances)) {
			adv_instance = list_first_entry(&hdev->adv_instances,
							struct adv_info, list);
			hdev->cur_adv_instance = adv_instance->instance;
		}

		if (hci_dev_test_flag(hdev, HCI_ADVERTISING))
7668
			enable_advertising(&req);
7669 7670 7671 7672
		else if (hci_dev_test_flag(hdev, HCI_ADVERTISING_INSTANCE) &&
			 hdev->cur_adv_instance)
			schedule_adv_instance(&req, hdev->cur_adv_instance,
					      true);
7673 7674

		restart_le_actions(&req);
7675 7676
	}

7677
	link_sec = hci_dev_test_flag(hdev, HCI_LINK_SECURITY);
7678
	if (link_sec != test_bit(HCI_AUTH, &hdev->flags))
7679 7680
		hci_req_add(&req, HCI_OP_WRITE_AUTH_ENABLE,
			    sizeof(link_sec), &link_sec);
7681

7682
	if (lmp_bredr_capable(hdev)) {
7683
		if (hci_dev_test_flag(hdev, HCI_FAST_CONNECTABLE))
7684 7685 7686
			write_fast_connectable(&req, true);
		else
			write_fast_connectable(&req, false);
7687
		__hci_update_page_scan(&req);
7688
		update_class(&req);
7689
		update_name(&req);
7690
		update_eir(&req);
7691
	}
7692

7693
	return hci_req_run(&req, powered_complete);
7694
}
7695

7696 7697 7698
int mgmt_powered(struct hci_dev *hdev, u8 powered)
{
	struct cmd_lookup match = { NULL, hdev };
7699
	u8 status, zero_cod[] = { 0, 0, 0 };
7700
	int err;
7701

7702
	if (!hci_dev_test_flag(hdev, HCI_MGMT))
7703 7704 7705
		return 0;

	if (powered) {
7706 7707
		if (powered_update_hci(hdev) == 0)
			return 0;
7708

7709 7710 7711
		mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, settings_rsp,
				     &match);
		goto new_settings;
7712 7713
	}

7714
	mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, settings_rsp, &match);
7715 7716 7717 7718 7719 7720 7721 7722

	/* 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.
	 */
7723
	if (hci_dev_test_flag(hdev, HCI_UNREGISTER))
7724 7725 7726 7727 7728
		status = MGMT_STATUS_INVALID_INDEX;
	else
		status = MGMT_STATUS_NOT_POWERED;

	mgmt_pending_foreach(0, hdev, cmd_complete_rsp, &status);
7729 7730

	if (memcmp(hdev->dev_class, zero_cod, sizeof(zero_cod)) != 0)
7731 7732
		mgmt_generic_event(MGMT_EV_CLASS_OF_DEV_CHANGED, hdev,
				   zero_cod, sizeof(zero_cod), NULL);
7733 7734

new_settings:
7735
	err = new_settings(hdev, match.sk);
7736 7737 7738 7739

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

7740
	return err;
7741
}
7742

7743
void mgmt_set_powered_failed(struct hci_dev *hdev, int err)
7744
{
7745
	struct mgmt_pending_cmd *cmd;
7746 7747
	u8 status;

7748
	cmd = pending_find(MGMT_OP_SET_POWERED, hdev);
7749
	if (!cmd)
7750
		return;
7751 7752 7753 7754 7755 7756

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

7757
	mgmt_cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_POWERED, status);
7758 7759 7760 7761

	mgmt_pending_remove(cmd);
}

7762 7763 7764 7765 7766 7767 7768 7769 7770 7771 7772
void mgmt_discoverable_timeout(struct hci_dev *hdev)
{
	struct hci_request req;

	hci_dev_lock(hdev);

	/* When discoverable timeout triggers, then just make sure
	 * the limited discoverable flag is cleared. Even in the case
	 * of a timeout triggered from general discoverable, it is
	 * safe to unconditionally clear the flag.
	 */
7773 7774
	hci_dev_clear_flag(hdev, HCI_LIMITED_DISCOVERABLE);
	hci_dev_clear_flag(hdev, HCI_DISCOVERABLE);
7775 7776

	hci_req_init(&req, hdev);
7777
	if (hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) {
7778 7779 7780 7781
		u8 scan = SCAN_PAGE;
		hci_req_add(&req, HCI_OP_WRITE_SCAN_ENABLE,
			    sizeof(scan), &scan);
	}
7782
	update_class(&req);
7783 7784 7785 7786 7787 7788 7789

	/* Advertising instances don't use the global discoverable setting, so
	 * only update AD if advertising was enabled using Set Advertising.
	 */
	if (hci_dev_test_flag(hdev, HCI_ADVERTISING))
		update_adv_data(&req);

7790 7791 7792 7793
	hci_req_run(&req, NULL);

	hdev->discov_timeout = 0;

7794 7795
	new_settings(hdev, NULL);

7796 7797 7798
	hci_dev_unlock(hdev);
}

7799 7800
void mgmt_new_link_key(struct hci_dev *hdev, struct link_key *key,
		       bool persistent)
7801
{
7802
	struct mgmt_ev_new_link_key ev;
7803

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

7806
	ev.store_hint = persistent;
7807
	bacpy(&ev.key.addr.bdaddr, &key->bdaddr);
7808
	ev.key.addr.type = BDADDR_BREDR;
7809
	ev.key.type = key->type;
7810
	memcpy(ev.key.val, key->val, HCI_LINK_KEY_SIZE);
7811
	ev.key.pin_len = key->pin_len;
7812

7813
	mgmt_event(MGMT_EV_NEW_LINK_KEY, hdev, &ev, sizeof(ev), NULL);
7814
}
7815

7816 7817
static u8 mgmt_ltk_type(struct smp_ltk *ltk)
{
7818 7819 7820 7821 7822 7823 7824 7825 7826 7827 7828 7829 7830
	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;
	}
7831 7832 7833 7834

	return MGMT_LTK_UNAUTHENTICATED;
}

7835
void mgmt_new_ltk(struct hci_dev *hdev, struct smp_ltk *key, bool persistent)
7836 7837 7838 7839 7840
{
	struct mgmt_ev_new_long_term_key ev;

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

7841
	/* Devices using resolvable or non-resolvable random addresses
F
Florian Grandel 已提交
7842
	 * without providing an identity resolving key don't require
7843 7844 7845 7846 7847 7848 7849 7850 7851
	 * 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.
	 */
7852 7853 7854 7855
	if (key->bdaddr_type == ADDR_LE_DEV_RANDOM &&
	    (key->bdaddr.b[5] & 0xc0) != 0xc0)
		ev.store_hint = 0x00;
	else
7856
		ev.store_hint = persistent;
7857

7858
	bacpy(&ev.key.addr.bdaddr, &key->bdaddr);
7859
	ev.key.addr.type = link_to_bdaddr(LE_LINK, key->bdaddr_type);
7860
	ev.key.type = mgmt_ltk_type(key);
7861 7862
	ev.key.enc_size = key->enc_size;
	ev.key.ediv = key->ediv;
7863
	ev.key.rand = key->rand;
7864

7865
	if (key->type == SMP_LTK)
7866 7867
		ev.key.master = 1;

7868 7869 7870
	/* Make sure we copy only the significant bytes based on the
	 * encryption key size, and set the rest of the value to zeroes.
	 */
7871
	memcpy(ev.key.val, key->val, key->enc_size);
7872 7873
	memset(ev.key.val + key->enc_size, 0,
	       sizeof(ev.key.val) - key->enc_size);
7874

7875
	mgmt_event(MGMT_EV_NEW_LONG_TERM_KEY, hdev, &ev, sizeof(ev), NULL);
7876 7877
}

7878
void mgmt_new_irk(struct hci_dev *hdev, struct smp_irk *irk, bool persistent)
7879 7880 7881 7882 7883
{
	struct mgmt_ev_new_irk ev;

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

7884
	ev.store_hint = persistent;
7885

7886 7887 7888 7889 7890 7891 7892 7893
	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);
}

7894 7895
void mgmt_new_csrk(struct hci_dev *hdev, struct smp_csrk *csrk,
		   bool persistent)
7896 7897 7898 7899 7900 7901
{
	struct mgmt_ev_new_csrk ev;

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

	/* Devices using resolvable or non-resolvable random addresses
F
Florian Grandel 已提交
7902
	 * without providing an identity resolving key don't require
7903 7904 7905 7906 7907 7908 7909 7910 7911 7912 7913
	 * 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
7914
		ev.store_hint = persistent;
7915 7916 7917

	bacpy(&ev.key.addr.bdaddr, &csrk->bdaddr);
	ev.key.addr.type = link_to_bdaddr(LE_LINK, csrk->bdaddr_type);
7918
	ev.key.type = csrk->type;
7919 7920 7921 7922 7923
	memcpy(ev.key.val, csrk->val, sizeof(csrk->val));

	mgmt_event(MGMT_EV_NEW_CSRK, hdev, &ev, sizeof(ev), NULL);
}

7924
void mgmt_new_conn_param(struct hci_dev *hdev, bdaddr_t *bdaddr,
7925 7926
			 u8 bdaddr_type, u8 store_hint, u16 min_interval,
			 u16 max_interval, u16 latency, u16 timeout)
7927 7928 7929
{
	struct mgmt_ev_new_conn_param ev;

7930 7931 7932
	if (!hci_is_identity_address(bdaddr, bdaddr_type))
		return;

7933 7934 7935
	memset(&ev, 0, sizeof(ev));
	bacpy(&ev.addr.bdaddr, bdaddr);
	ev.addr.type = link_to_bdaddr(LE_LINK, bdaddr_type);
7936
	ev.store_hint = store_hint;
7937 7938 7939 7940 7941 7942 7943 7944
	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);
}

7945 7946
void mgmt_device_connected(struct hci_dev *hdev, struct hci_conn *conn,
			   u32 flags, u8 *name, u8 name_len)
7947
{
7948 7949 7950
	char buf[512];
	struct mgmt_ev_device_connected *ev = (void *) buf;
	u16 eir_len = 0;
7951

7952 7953
	bacpy(&ev->addr.bdaddr, &conn->dst);
	ev->addr.type = link_to_bdaddr(conn->type, conn->dst_type);
7954

7955
	ev->flags = __cpu_to_le32(flags);
7956

7957 7958 7959 7960 7961 7962 7963 7964 7965 7966 7967 7968
	/* 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);
7969

7970
		if (memcmp(conn->dev_class, "\0\0\0", 3) != 0)
7971 7972 7973 7974
			eir_len = eir_append_data(ev->eir, eir_len,
						  EIR_CLASS_OF_DEV,
						  conn->dev_class, 3);
	}
7975

7976
	ev->eir_len = cpu_to_le16(eir_len);
7977

7978 7979
	mgmt_event(MGMT_EV_DEVICE_CONNECTED, hdev, buf,
		    sizeof(*ev) + eir_len, NULL);
7980 7981
}

7982
static void disconnect_rsp(struct mgmt_pending_cmd *cmd, void *data)
7983 7984 7985
{
	struct sock **sk = data;

7986
	cmd->cmd_complete(cmd, 0);
7987 7988 7989 7990

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

7991
	mgmt_pending_remove(cmd);
7992 7993
}

7994
static void unpair_device_rsp(struct mgmt_pending_cmd *cmd, void *data)
7995
{
7996
	struct hci_dev *hdev = data;
7997
	struct mgmt_cp_unpair_device *cp = cmd->param;
7998

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

8001
	cmd->cmd_complete(cmd, 0);
8002 8003 8004
	mgmt_pending_remove(cmd);
}

8005 8006
bool mgmt_powering_down(struct hci_dev *hdev)
{
8007
	struct mgmt_pending_cmd *cmd;
8008 8009
	struct mgmt_mode *cp;

8010
	cmd = pending_find(MGMT_OP_SET_POWERED, hdev);
8011 8012 8013 8014 8015 8016 8017 8018 8019 8020
	if (!cmd)
		return false;

	cp = cmd->param;
	if (!cp->val)
		return true;

	return false;
}

8021
void mgmt_device_disconnected(struct hci_dev *hdev, bdaddr_t *bdaddr,
8022 8023
			      u8 link_type, u8 addr_type, u8 reason,
			      bool mgmt_connected)
8024
{
8025
	struct mgmt_ev_device_disconnected ev;
8026 8027
	struct sock *sk = NULL;

8028 8029 8030 8031 8032 8033
	/* 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);
8034 8035
	}

8036 8037 8038
	if (!mgmt_connected)
		return;

8039 8040 8041
	if (link_type != ACL_LINK && link_type != LE_LINK)
		return;

8042
	mgmt_pending_foreach(MGMT_OP_DISCONNECT, hdev, disconnect_rsp, &sk);
8043

8044 8045 8046
	bacpy(&ev.addr.bdaddr, bdaddr);
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
	ev.reason = reason;
8047

8048
	mgmt_event(MGMT_EV_DEVICE_DISCONNECTED, hdev, &ev, sizeof(ev), sk);
8049 8050

	if (sk)
8051
		sock_put(sk);
8052

8053
	mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE, hdev, unpair_device_rsp,
8054
			     hdev);
8055 8056
}

8057 8058
void mgmt_disconnect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr,
			    u8 link_type, u8 addr_type, u8 status)
8059
{
8060 8061
	u8 bdaddr_type = link_to_bdaddr(link_type, addr_type);
	struct mgmt_cp_disconnect *cp;
8062
	struct mgmt_pending_cmd *cmd;
8063

8064 8065 8066
	mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE, hdev, unpair_device_rsp,
			     hdev);

8067
	cmd = pending_find(MGMT_OP_DISCONNECT, hdev);
8068
	if (!cmd)
8069
		return;
8070

8071 8072 8073 8074 8075 8076 8077 8078
	cp = cmd->param;

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

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

8079
	cmd->cmd_complete(cmd, mgmt_status(status));
8080
	mgmt_pending_remove(cmd);
8081
}
8082

8083 8084
void mgmt_connect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
			 u8 addr_type, u8 status)
8085 8086
{
	struct mgmt_ev_connect_failed ev;
8087

8088 8089 8090 8091 8092 8093
	/* 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);
8094
	}
8095

8096
	bacpy(&ev.addr.bdaddr, bdaddr);
8097
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
8098
	ev.status = mgmt_status(status);
8099

8100
	mgmt_event(MGMT_EV_CONNECT_FAILED, hdev, &ev, sizeof(ev), NULL);
8101
}
8102

8103
void mgmt_pin_code_request(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 secure)
8104 8105 8106
{
	struct mgmt_ev_pin_code_request ev;

8107
	bacpy(&ev.addr.bdaddr, bdaddr);
8108
	ev.addr.type = BDADDR_BREDR;
8109
	ev.secure = secure;
8110

8111
	mgmt_event(MGMT_EV_PIN_CODE_REQUEST, hdev, &ev, sizeof(ev), NULL);
8112 8113
}

8114 8115
void mgmt_pin_code_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
				  u8 status)
8116
{
8117
	struct mgmt_pending_cmd *cmd;
8118

8119
	cmd = pending_find(MGMT_OP_PIN_CODE_REPLY, hdev);
8120
	if (!cmd)
8121
		return;
8122

8123
	cmd->cmd_complete(cmd, mgmt_status(status));
8124
	mgmt_pending_remove(cmd);
8125 8126
}

8127 8128
void mgmt_pin_code_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
				      u8 status)
8129
{
8130
	struct mgmt_pending_cmd *cmd;
8131

8132
	cmd = pending_find(MGMT_OP_PIN_CODE_NEG_REPLY, hdev);
8133
	if (!cmd)
8134
		return;
8135

8136
	cmd->cmd_complete(cmd, mgmt_status(status));
8137
	mgmt_pending_remove(cmd);
8138
}
8139

8140
int mgmt_user_confirm_request(struct hci_dev *hdev, bdaddr_t *bdaddr,
8141
			      u8 link_type, u8 addr_type, u32 value,
8142
			      u8 confirm_hint)
8143 8144 8145
{
	struct mgmt_ev_user_confirm_request ev;

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

8148
	bacpy(&ev.addr.bdaddr, bdaddr);
8149
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
8150
	ev.confirm_hint = confirm_hint;
8151
	ev.value = cpu_to_le32(value);
8152

8153
	return mgmt_event(MGMT_EV_USER_CONFIRM_REQUEST, hdev, &ev, sizeof(ev),
8154
			  NULL);
8155 8156
}

8157
int mgmt_user_passkey_request(struct hci_dev *hdev, bdaddr_t *bdaddr,
8158
			      u8 link_type, u8 addr_type)
8159 8160 8161 8162 8163
{
	struct mgmt_ev_user_passkey_request ev;

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

8164
	bacpy(&ev.addr.bdaddr, bdaddr);
8165
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
8166 8167

	return mgmt_event(MGMT_EV_USER_PASSKEY_REQUEST, hdev, &ev, sizeof(ev),
8168
			  NULL);
8169 8170
}

8171
static int user_pairing_resp_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
8172 8173
				      u8 link_type, u8 addr_type, u8 status,
				      u8 opcode)
8174
{
8175
	struct mgmt_pending_cmd *cmd;
8176

8177
	cmd = pending_find(opcode, hdev);
8178 8179 8180
	if (!cmd)
		return -ENOENT;

8181
	cmd->cmd_complete(cmd, mgmt_status(status));
8182
	mgmt_pending_remove(cmd);
8183

8184
	return 0;
8185 8186
}

8187
int mgmt_user_confirm_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
8188
				     u8 link_type, u8 addr_type, u8 status)
8189
{
8190
	return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
8191
					  status, MGMT_OP_USER_CONFIRM_REPLY);
8192 8193
}

8194
int mgmt_user_confirm_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
8195
					 u8 link_type, u8 addr_type, u8 status)
8196
{
8197
	return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
8198 8199
					  status,
					  MGMT_OP_USER_CONFIRM_NEG_REPLY);
8200
}
8201

8202
int mgmt_user_passkey_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
8203
				     u8 link_type, u8 addr_type, u8 status)
8204
{
8205
	return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
8206
					  status, MGMT_OP_USER_PASSKEY_REPLY);
8207 8208
}

8209
int mgmt_user_passkey_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
8210
					 u8 link_type, u8 addr_type, u8 status)
8211
{
8212
	return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
8213 8214
					  status,
					  MGMT_OP_USER_PASSKEY_NEG_REPLY);
8215 8216
}

8217 8218 8219 8220 8221 8222 8223 8224 8225 8226 8227 8228 8229 8230 8231 8232
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);
}

8233
void mgmt_auth_failed(struct hci_conn *conn, u8 hci_status)
8234 8235
{
	struct mgmt_ev_auth_failed ev;
8236
	struct mgmt_pending_cmd *cmd;
8237
	u8 status = mgmt_status(hci_status);
8238

8239 8240 8241
	bacpy(&ev.addr.bdaddr, &conn->dst);
	ev.addr.type = link_to_bdaddr(conn->type, conn->dst_type);
	ev.status = status;
8242

8243 8244 8245 8246 8247
	cmd = find_pairing(conn);

	mgmt_event(MGMT_EV_AUTH_FAILED, conn->hdev, &ev, sizeof(ev),
		    cmd ? cmd->sk : NULL);

8248 8249 8250 8251
	if (cmd) {
		cmd->cmd_complete(cmd, status);
		mgmt_pending_remove(cmd);
	}
8252
}
8253

8254
void mgmt_auth_enable_complete(struct hci_dev *hdev, u8 status)
8255 8256
{
	struct cmd_lookup match = { NULL, hdev };
8257
	bool changed;
8258 8259 8260 8261

	if (status) {
		u8 mgmt_err = mgmt_status(status);
		mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev,
8262
				     cmd_status_rsp, &mgmt_err);
8263
		return;
8264 8265
	}

8266
	if (test_bit(HCI_AUTH, &hdev->flags))
8267
		changed = !hci_dev_test_and_set_flag(hdev, HCI_LINK_SECURITY);
8268
	else
8269
		changed = hci_dev_test_and_clear_flag(hdev, HCI_LINK_SECURITY);
8270

8271
	mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev, settings_rsp,
8272
			     &match);
8273

8274
	if (changed)
8275
		new_settings(hdev, match.sk);
8276 8277 8278 8279 8280

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

8281
static void clear_eir(struct hci_request *req)
8282
{
8283
	struct hci_dev *hdev = req->hdev;
8284 8285
	struct hci_cp_write_eir cp;

8286
	if (!lmp_ext_inq_capable(hdev))
8287
		return;
8288

8289 8290
	memset(hdev->eir, 0, sizeof(hdev->eir));

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

8293
	hci_req_add(req, HCI_OP_WRITE_EIR, sizeof(cp), &cp);
8294 8295
}

8296
void mgmt_ssp_enable_complete(struct hci_dev *hdev, u8 enable, u8 status)
8297 8298
{
	struct cmd_lookup match = { NULL, hdev };
8299
	struct hci_request req;
8300
	bool changed = false;
8301 8302 8303

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

8305 8306
		if (enable && hci_dev_test_and_clear_flag(hdev,
							  HCI_SSP_ENABLED)) {
8307
			hci_dev_clear_flag(hdev, HCI_HS_ENABLED);
8308
			new_settings(hdev, NULL);
8309
		}
8310

8311 8312
		mgmt_pending_foreach(MGMT_OP_SET_SSP, hdev, cmd_status_rsp,
				     &mgmt_err);
8313
		return;
8314 8315 8316
	}

	if (enable) {
8317
		changed = !hci_dev_test_and_set_flag(hdev, HCI_SSP_ENABLED);
8318
	} else {
8319
		changed = hci_dev_test_and_clear_flag(hdev, HCI_SSP_ENABLED);
8320
		if (!changed)
8321 8322
			changed = hci_dev_test_and_clear_flag(hdev,
							      HCI_HS_ENABLED);
8323
		else
8324
			hci_dev_clear_flag(hdev, HCI_HS_ENABLED);
8325 8326 8327 8328
	}

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

8329
	if (changed)
8330
		new_settings(hdev, match.sk);
8331

8332
	if (match.sk)
8333 8334
		sock_put(match.sk);

8335 8336
	hci_req_init(&req, hdev);

8337 8338
	if (hci_dev_test_flag(hdev, HCI_SSP_ENABLED)) {
		if (hci_dev_test_flag(hdev, HCI_USE_DEBUG_KEYS))
8339 8340
			hci_req_add(&req, HCI_OP_WRITE_SSP_DEBUG_MODE,
				    sizeof(enable), &enable);
8341
		update_eir(&req);
8342
	} else {
8343
		clear_eir(&req);
8344
	}
8345 8346

	hci_req_run(&req, NULL);
8347 8348
}

8349
static void sk_lookup(struct mgmt_pending_cmd *cmd, void *data)
8350 8351 8352 8353 8354 8355 8356 8357 8358
{
	struct cmd_lookup *match = data;

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

8359 8360
void mgmt_set_class_of_dev_complete(struct hci_dev *hdev, u8 *dev_class,
				    u8 status)
8361
{
8362
	struct cmd_lookup match = { NULL, hdev, mgmt_status(status) };
8363

8364 8365 8366
	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);
8367 8368

	if (!status)
8369 8370
		mgmt_generic_event(MGMT_EV_CLASS_OF_DEV_CHANGED, hdev,
				   dev_class, 3, NULL);
8371 8372 8373

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

8376
void mgmt_set_local_name_complete(struct hci_dev *hdev, u8 *name, u8 status)
8377 8378
{
	struct mgmt_cp_set_local_name ev;
8379
	struct mgmt_pending_cmd *cmd;
8380

8381
	if (status)
8382
		return;
8383 8384 8385

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

8388
	cmd = pending_find(MGMT_OP_SET_LOCAL_NAME, hdev);
8389 8390
	if (!cmd) {
		memcpy(hdev->dev_name, name, sizeof(hdev->dev_name));
8391

8392 8393 8394
		/* If this is a HCI command related to powering on the
		 * HCI dev don't send any mgmt signals.
		 */
8395
		if (pending_find(MGMT_OP_SET_POWERED, hdev))
8396
			return;
8397
	}
8398

8399 8400
	mgmt_generic_event(MGMT_EV_LOCAL_NAME_CHANGED, hdev, &ev, sizeof(ev),
			   cmd ? cmd->sk : NULL);
8401
}
8402

8403 8404 8405 8406 8407 8408 8409 8410 8411 8412 8413 8414
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;
}

8415 8416
static bool eir_has_uuids(u8 *eir, u16 eir_len, u16 uuid_count, u8 (*uuids)[16])
{
8417 8418 8419 8420 8421 8422 8423 8424 8425 8426 8427 8428 8429 8430 8431 8432 8433
	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) {
8434
				memcpy(uuid, bluetooth_base_uuid, 16);
8435 8436 8437 8438 8439 8440 8441 8442 8443
				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) {
8444
				memcpy(uuid, bluetooth_base_uuid, 16);
8445 8446 8447 8448 8449 8450 8451 8452 8453 8454 8455 8456 8457 8458 8459 8460 8461 8462 8463 8464 8465 8466
				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;
	}

8467 8468 8469
	return false;
}

8470 8471 8472
static void restart_le_scan(struct hci_dev *hdev)
{
	/* If controller is not scanning we are done. */
8473
	if (!hci_dev_test_flag(hdev, HCI_LE_SCAN))
8474 8475 8476 8477 8478 8479 8480 8481 8482 8483 8484
		return;

	if (time_after(jiffies + DISCOV_LE_RESTART_DELAY,
		       hdev->discovery.scan_start +
		       hdev->discovery.scan_duration))
		return;

	queue_delayed_work(hdev->workqueue, &hdev->le_scan_restart,
			   DISCOV_LE_RESTART_DELAY);
}

8485 8486
static bool is_filter_match(struct hci_dev *hdev, s8 rssi, u8 *eir,
			    u16 eir_len, u8 *scan_rsp, u8 scan_rsp_len)
8487
{
8488 8489 8490 8491 8492
	/* 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.
8493 8494 8495
	 *
	 * For BR/EDR devices (pre 1.2) providing no RSSI during inquiry,
	 * the results are also dropped.
8496 8497
	 */
	if (hdev->discovery.rssi != HCI_RSSI_INVALID &&
8498 8499 8500
	    (rssi == HCI_RSSI_INVALID ||
	    (rssi < hdev->discovery.rssi &&
	     !test_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks))))
8501
		return  false;
8502

8503 8504 8505
	if (hdev->discovery.uuid_count != 0) {
		/* If a list of UUIDs is provided in filter, results with no
		 * matching UUID should be dropped.
8506
		 */
8507 8508 8509 8510 8511 8512
		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;
8513
	}
8514

8515 8516
	/* If duplicate filtering does not report RSSI changes, then restart
	 * scanning to ensure updated result with updated RSSI values.
8517
	 */
8518 8519 8520 8521 8522 8523 8524 8525
	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;
	}
8526 8527 8528 8529 8530 8531 8532 8533 8534 8535 8536 8537 8538 8539 8540 8541 8542 8543 8544 8545 8546 8547 8548

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

8549
	if (hdev->discovery.result_filtering) {
8550 8551 8552 8553 8554 8555 8556 8557 8558 8559
		/* We are using service discovery */
		if (!is_filter_match(hdev, rssi, eir, eir_len, scan_rsp,
				     scan_rsp_len))
			return;
	}

	/* 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))
8560 8561
		return;

8562 8563 8564 8565 8566 8567 8568 8569 8570 8571 8572 8573 8574 8575 8576 8577 8578 8579 8580 8581 8582 8583 8584 8585 8586 8587 8588 8589 8590 8591 8592
	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);

	if (dev_class && !eir_has_data_type(ev->eir, eir_len, EIR_CLASS_OF_DEV))
		eir_len = eir_append_data(ev->eir, eir_len, EIR_CLASS_OF_DEV,
					  dev_class, 3);

	if (scan_rsp_len > 0)
		/* Append scan response data to event */
		memcpy(ev->eir + eir_len, scan_rsp, scan_rsp_len);

8593 8594
	ev->eir_len = cpu_to_le16(eir_len + scan_rsp_len);
	ev_size = sizeof(*ev) + eir_len + scan_rsp_len;
8595

8596
	mgmt_event(MGMT_EV_DEVICE_FOUND, hdev, ev, ev_size, NULL);
8597
}
8598

8599 8600
void mgmt_remote_name(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
		      u8 addr_type, s8 rssi, u8 *name, u8 name_len)
8601
{
8602 8603 8604
	struct mgmt_ev_device_found *ev;
	char buf[sizeof(*ev) + HCI_MAX_NAME_LENGTH + 2];
	u16 eir_len;
8605

8606
	ev = (struct mgmt_ev_device_found *) buf;
8607

8608 8609 8610
	memset(buf, 0, sizeof(buf));

	bacpy(&ev->addr.bdaddr, bdaddr);
8611
	ev->addr.type = link_to_bdaddr(link_type, addr_type);
8612 8613 8614
	ev->rssi = rssi;

	eir_len = eir_append_data(ev->eir, 0, EIR_NAME_COMPLETE, name,
8615
				  name_len);
8616

8617
	ev->eir_len = cpu_to_le16(eir_len);
8618

8619
	mgmt_event(MGMT_EV_DEVICE_FOUND, hdev, ev, sizeof(*ev) + eir_len, NULL);
8620
}
8621

8622
void mgmt_discovering(struct hci_dev *hdev, u8 discovering)
8623
{
8624
	struct mgmt_ev_discovering ev;
8625

8626 8627
	BT_DBG("%s discovering %u", hdev->name, discovering);

8628 8629 8630 8631
	memset(&ev, 0, sizeof(ev));
	ev.type = hdev->discovery.type;
	ev.discovering = discovering;

8632
	mgmt_event(MGMT_EV_DISCOVERING, hdev, &ev, sizeof(ev), NULL);
8633
}
8634

8635
static void adv_enable_complete(struct hci_dev *hdev, u8 status, u16 opcode)
8636 8637 8638 8639 8640 8641 8642
{
	BT_DBG("%s status %u", hdev->name, status);
}

void mgmt_reenable_advertising(struct hci_dev *hdev)
{
	struct hci_request req;
8643
	u8 instance;
8644

8645 8646
	if (!hci_dev_test_flag(hdev, HCI_ADVERTISING) &&
	    !hci_dev_test_flag(hdev, HCI_ADVERTISING_INSTANCE))
8647 8648
		return;

8649 8650
	instance = get_current_adv_instance(hdev);

8651
	hci_req_init(&req, hdev);
8652 8653 8654 8655 8656 8657 8658 8659 8660

	if (instance) {
		schedule_adv_instance(&req, instance, true);
	} else {
		update_adv_data(&req);
		update_scan_rsp_data(&req);
		enable_advertising(&req);
	}

8661
	hci_req_run(&req, adv_enable_complete);
8662
}
8663 8664 8665 8666 8667

static struct hci_mgmt_chan chan = {
	.channel	= HCI_CHANNEL_CONTROL,
	.handler_count	= ARRAY_SIZE(mgmt_handlers),
	.handlers	= mgmt_handlers,
8668
	.hdev_init	= mgmt_init_hdev,
8669 8670 8671 8672 8673 8674 8675 8676 8677 8678 8679
};

int mgmt_init(void)
{
	return hci_mgmt_chan_register(&chan);
}

void mgmt_exit(void)
{
	hci_mgmt_chan_unregister(&chan);
}