• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2    BlueZ - Bluetooth protocol stack for Linux
3 
4    Copyright (C) 2010  Nokia Corporation
5    Copyright (C) 2011-2012 Intel Corporation
6 
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License version 2 as
9    published by the Free Software Foundation;
10 
11    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
12    OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
13    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
14    IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
15    CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
16    WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17    ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18    OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 
20    ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
21    COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
22    SOFTWARE IS DISCLAIMED.
23 */
24 
25 /* Bluetooth HCI Management interface */
26 
27 #include <linux/module.h>
28 #include <asm/unaligned.h>
29 
30 #include <net/bluetooth/bluetooth.h>
31 #include <net/bluetooth/hci_core.h>
32 #include <net/bluetooth/hci_sock.h>
33 #include <net/bluetooth/l2cap.h>
34 #include <net/bluetooth/mgmt.h>
35 
36 #include "hci_request.h"
37 #include "smp.h"
38 #include "mgmt_util.h"
39 
40 #define MGMT_VERSION	1
41 #define MGMT_REVISION	14
42 
43 static const u16 mgmt_commands[] = {
44 	MGMT_OP_READ_INDEX_LIST,
45 	MGMT_OP_READ_INFO,
46 	MGMT_OP_SET_POWERED,
47 	MGMT_OP_SET_DISCOVERABLE,
48 	MGMT_OP_SET_CONNECTABLE,
49 	MGMT_OP_SET_FAST_CONNECTABLE,
50 	MGMT_OP_SET_BONDABLE,
51 	MGMT_OP_SET_LINK_SECURITY,
52 	MGMT_OP_SET_SSP,
53 	MGMT_OP_SET_HS,
54 	MGMT_OP_SET_LE,
55 	MGMT_OP_SET_DEV_CLASS,
56 	MGMT_OP_SET_LOCAL_NAME,
57 	MGMT_OP_ADD_UUID,
58 	MGMT_OP_REMOVE_UUID,
59 	MGMT_OP_LOAD_LINK_KEYS,
60 	MGMT_OP_LOAD_LONG_TERM_KEYS,
61 	MGMT_OP_DISCONNECT,
62 	MGMT_OP_GET_CONNECTIONS,
63 	MGMT_OP_PIN_CODE_REPLY,
64 	MGMT_OP_PIN_CODE_NEG_REPLY,
65 	MGMT_OP_SET_IO_CAPABILITY,
66 	MGMT_OP_PAIR_DEVICE,
67 	MGMT_OP_CANCEL_PAIR_DEVICE,
68 	MGMT_OP_UNPAIR_DEVICE,
69 	MGMT_OP_USER_CONFIRM_REPLY,
70 	MGMT_OP_USER_CONFIRM_NEG_REPLY,
71 	MGMT_OP_USER_PASSKEY_REPLY,
72 	MGMT_OP_USER_PASSKEY_NEG_REPLY,
73 	MGMT_OP_READ_LOCAL_OOB_DATA,
74 	MGMT_OP_ADD_REMOTE_OOB_DATA,
75 	MGMT_OP_REMOVE_REMOTE_OOB_DATA,
76 	MGMT_OP_START_DISCOVERY,
77 	MGMT_OP_STOP_DISCOVERY,
78 	MGMT_OP_CONFIRM_NAME,
79 	MGMT_OP_BLOCK_DEVICE,
80 	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 	MGMT_OP_ADD_DEVICE,
93 	MGMT_OP_REMOVE_DEVICE,
94 	MGMT_OP_LOAD_CONN_PARAM,
95 	MGMT_OP_READ_UNCONF_INDEX_LIST,
96 	MGMT_OP_READ_CONFIG_INFO,
97 	MGMT_OP_SET_EXTERNAL_CONFIG,
98 	MGMT_OP_SET_PUBLIC_ADDRESS,
99 	MGMT_OP_START_SERVICE_DISCOVERY,
100 	MGMT_OP_READ_LOCAL_OOB_EXT_DATA,
101 	MGMT_OP_READ_EXT_INDEX_LIST,
102 	MGMT_OP_READ_ADV_FEATURES,
103 	MGMT_OP_ADD_ADVERTISING,
104 	MGMT_OP_REMOVE_ADVERTISING,
105 	MGMT_OP_GET_ADV_SIZE_INFO,
106 	MGMT_OP_START_LIMITED_DISCOVERY,
107 	MGMT_OP_READ_EXT_INFO,
108 	MGMT_OP_SET_APPEARANCE,
109 };
110 
111 static const u16 mgmt_events[] = {
112 	MGMT_EV_CONTROLLER_ERROR,
113 	MGMT_EV_INDEX_ADDED,
114 	MGMT_EV_INDEX_REMOVED,
115 	MGMT_EV_NEW_SETTINGS,
116 	MGMT_EV_CLASS_OF_DEV_CHANGED,
117 	MGMT_EV_LOCAL_NAME_CHANGED,
118 	MGMT_EV_NEW_LINK_KEY,
119 	MGMT_EV_NEW_LONG_TERM_KEY,
120 	MGMT_EV_DEVICE_CONNECTED,
121 	MGMT_EV_DEVICE_DISCONNECTED,
122 	MGMT_EV_CONNECT_FAILED,
123 	MGMT_EV_PIN_CODE_REQUEST,
124 	MGMT_EV_USER_CONFIRM_REQUEST,
125 	MGMT_EV_USER_PASSKEY_REQUEST,
126 	MGMT_EV_AUTH_FAILED,
127 	MGMT_EV_DEVICE_FOUND,
128 	MGMT_EV_DISCOVERING,
129 	MGMT_EV_DEVICE_BLOCKED,
130 	MGMT_EV_DEVICE_UNBLOCKED,
131 	MGMT_EV_DEVICE_UNPAIRED,
132 	MGMT_EV_PASSKEY_NOTIFY,
133 	MGMT_EV_NEW_IRK,
134 	MGMT_EV_NEW_CSRK,
135 	MGMT_EV_DEVICE_ADDED,
136 	MGMT_EV_DEVICE_REMOVED,
137 	MGMT_EV_NEW_CONN_PARAM,
138 	MGMT_EV_UNCONF_INDEX_ADDED,
139 	MGMT_EV_UNCONF_INDEX_REMOVED,
140 	MGMT_EV_NEW_CONFIG_OPTIONS,
141 	MGMT_EV_EXT_INDEX_ADDED,
142 	MGMT_EV_EXT_INDEX_REMOVED,
143 	MGMT_EV_LOCAL_OOB_DATA_UPDATED,
144 	MGMT_EV_ADVERTISING_ADDED,
145 	MGMT_EV_ADVERTISING_REMOVED,
146 	MGMT_EV_EXT_INFO_CHANGED,
147 };
148 
149 static const u16 mgmt_untrusted_commands[] = {
150 	MGMT_OP_READ_INDEX_LIST,
151 	MGMT_OP_READ_INFO,
152 	MGMT_OP_READ_UNCONF_INDEX_LIST,
153 	MGMT_OP_READ_CONFIG_INFO,
154 	MGMT_OP_READ_EXT_INDEX_LIST,
155 	MGMT_OP_READ_EXT_INFO,
156 };
157 
158 static const u16 mgmt_untrusted_events[] = {
159 	MGMT_EV_INDEX_ADDED,
160 	MGMT_EV_INDEX_REMOVED,
161 	MGMT_EV_NEW_SETTINGS,
162 	MGMT_EV_CLASS_OF_DEV_CHANGED,
163 	MGMT_EV_LOCAL_NAME_CHANGED,
164 	MGMT_EV_UNCONF_INDEX_ADDED,
165 	MGMT_EV_UNCONF_INDEX_REMOVED,
166 	MGMT_EV_NEW_CONFIG_OPTIONS,
167 	MGMT_EV_EXT_INDEX_ADDED,
168 	MGMT_EV_EXT_INDEX_REMOVED,
169 	MGMT_EV_EXT_INFO_CHANGED,
170 };
171 
172 #define CACHE_TIMEOUT	msecs_to_jiffies(2 * 1000)
173 
174 #define ZERO_KEY "\x00\x00\x00\x00\x00\x00\x00\x00" \
175 		 "\x00\x00\x00\x00\x00\x00\x00\x00"
176 
177 /* HCI to MGMT error code conversion table */
178 static u8 mgmt_status_table[] = {
179 	MGMT_STATUS_SUCCESS,
180 	MGMT_STATUS_UNKNOWN_COMMAND,	/* Unknown Command */
181 	MGMT_STATUS_NOT_CONNECTED,	/* No Connection */
182 	MGMT_STATUS_FAILED,		/* Hardware Failure */
183 	MGMT_STATUS_CONNECT_FAILED,	/* Page Timeout */
184 	MGMT_STATUS_AUTH_FAILED,	/* Authentication Failed */
185 	MGMT_STATUS_AUTH_FAILED,	/* PIN or Key Missing */
186 	MGMT_STATUS_NO_RESOURCES,	/* Memory Full */
187 	MGMT_STATUS_TIMEOUT,		/* Connection Timeout */
188 	MGMT_STATUS_NO_RESOURCES,	/* Max Number of Connections */
189 	MGMT_STATUS_NO_RESOURCES,	/* Max Number of SCO Connections */
190 	MGMT_STATUS_ALREADY_CONNECTED,	/* ACL Connection Exists */
191 	MGMT_STATUS_BUSY,		/* Command Disallowed */
192 	MGMT_STATUS_NO_RESOURCES,	/* Rejected Limited Resources */
193 	MGMT_STATUS_REJECTED,		/* Rejected Security */
194 	MGMT_STATUS_REJECTED,		/* Rejected Personal */
195 	MGMT_STATUS_TIMEOUT,		/* Host Timeout */
196 	MGMT_STATUS_NOT_SUPPORTED,	/* Unsupported Feature */
197 	MGMT_STATUS_INVALID_PARAMS,	/* Invalid Parameters */
198 	MGMT_STATUS_DISCONNECTED,	/* OE User Ended Connection */
199 	MGMT_STATUS_NO_RESOURCES,	/* OE Low Resources */
200 	MGMT_STATUS_DISCONNECTED,	/* OE Power Off */
201 	MGMT_STATUS_DISCONNECTED,	/* Connection Terminated */
202 	MGMT_STATUS_BUSY,		/* Repeated Attempts */
203 	MGMT_STATUS_REJECTED,		/* Pairing Not Allowed */
204 	MGMT_STATUS_FAILED,		/* Unknown LMP PDU */
205 	MGMT_STATUS_NOT_SUPPORTED,	/* Unsupported Remote Feature */
206 	MGMT_STATUS_REJECTED,		/* SCO Offset Rejected */
207 	MGMT_STATUS_REJECTED,		/* SCO Interval Rejected */
208 	MGMT_STATUS_REJECTED,		/* Air Mode Rejected */
209 	MGMT_STATUS_INVALID_PARAMS,	/* Invalid LMP Parameters */
210 	MGMT_STATUS_FAILED,		/* Unspecified Error */
211 	MGMT_STATUS_NOT_SUPPORTED,	/* Unsupported LMP Parameter Value */
212 	MGMT_STATUS_FAILED,		/* Role Change Not Allowed */
213 	MGMT_STATUS_TIMEOUT,		/* LMP Response Timeout */
214 	MGMT_STATUS_FAILED,		/* LMP Error Transaction Collision */
215 	MGMT_STATUS_FAILED,		/* LMP PDU Not Allowed */
216 	MGMT_STATUS_REJECTED,		/* Encryption Mode Not Accepted */
217 	MGMT_STATUS_FAILED,		/* Unit Link Key Used */
218 	MGMT_STATUS_NOT_SUPPORTED,	/* QoS Not Supported */
219 	MGMT_STATUS_TIMEOUT,		/* Instant Passed */
220 	MGMT_STATUS_NOT_SUPPORTED,	/* Pairing Not Supported */
221 	MGMT_STATUS_FAILED,		/* Transaction Collision */
222 	MGMT_STATUS_INVALID_PARAMS,	/* Unacceptable Parameter */
223 	MGMT_STATUS_REJECTED,		/* QoS Rejected */
224 	MGMT_STATUS_NOT_SUPPORTED,	/* Classification Not Supported */
225 	MGMT_STATUS_REJECTED,		/* Insufficient Security */
226 	MGMT_STATUS_INVALID_PARAMS,	/* Parameter Out Of Range */
227 	MGMT_STATUS_BUSY,		/* Role Switch Pending */
228 	MGMT_STATUS_FAILED,		/* Slot Violation */
229 	MGMT_STATUS_FAILED,		/* Role Switch Failed */
230 	MGMT_STATUS_INVALID_PARAMS,	/* EIR Too Large */
231 	MGMT_STATUS_NOT_SUPPORTED,	/* Simple Pairing Not Supported */
232 	MGMT_STATUS_BUSY,		/* Host Busy Pairing */
233 	MGMT_STATUS_REJECTED,		/* Rejected, No Suitable Channel */
234 	MGMT_STATUS_BUSY,		/* Controller Busy */
235 	MGMT_STATUS_INVALID_PARAMS,	/* Unsuitable Connection Interval */
236 	MGMT_STATUS_TIMEOUT,		/* Directed Advertising Timeout */
237 	MGMT_STATUS_AUTH_FAILED,	/* Terminated Due to MIC Failure */
238 	MGMT_STATUS_CONNECT_FAILED,	/* Connection Establishment Failed */
239 	MGMT_STATUS_CONNECT_FAILED,	/* MAC Connection Failed */
240 };
241 
mgmt_status(u8 hci_status)242 static u8 mgmt_status(u8 hci_status)
243 {
244 	if (hci_status < ARRAY_SIZE(mgmt_status_table))
245 		return mgmt_status_table[hci_status];
246 
247 	return MGMT_STATUS_FAILED;
248 }
249 
mgmt_index_event(u16 event,struct hci_dev * hdev,void * data,u16 len,int flag)250 static int mgmt_index_event(u16 event, struct hci_dev *hdev, void *data,
251 			    u16 len, int flag)
252 {
253 	return mgmt_send_event(event, hdev, HCI_CHANNEL_CONTROL, data, len,
254 			       flag, NULL);
255 }
256 
mgmt_limited_event(u16 event,struct hci_dev * hdev,void * data,u16 len,int flag,struct sock * skip_sk)257 static int mgmt_limited_event(u16 event, struct hci_dev *hdev, void *data,
258 			      u16 len, int flag, struct sock *skip_sk)
259 {
260 	return mgmt_send_event(event, hdev, HCI_CHANNEL_CONTROL, data, len,
261 			       flag, skip_sk);
262 }
263 
mgmt_event(u16 event,struct hci_dev * hdev,void * data,u16 len,struct sock * skip_sk)264 static int mgmt_event(u16 event, struct hci_dev *hdev, void *data, u16 len,
265 		      struct sock *skip_sk)
266 {
267 	return mgmt_send_event(event, hdev, HCI_CHANNEL_CONTROL, data, len,
268 			       HCI_SOCK_TRUSTED, skip_sk);
269 }
270 
le_addr_type(u8 mgmt_addr_type)271 static u8 le_addr_type(u8 mgmt_addr_type)
272 {
273 	if (mgmt_addr_type == BDADDR_LE_PUBLIC)
274 		return ADDR_LE_DEV_PUBLIC;
275 	else
276 		return ADDR_LE_DEV_RANDOM;
277 }
278 
mgmt_fill_version_info(void * ver)279 void mgmt_fill_version_info(void *ver)
280 {
281 	struct mgmt_rp_read_version *rp = ver;
282 
283 	rp->version = MGMT_VERSION;
284 	rp->revision = cpu_to_le16(MGMT_REVISION);
285 }
286 
read_version(struct sock * sk,struct hci_dev * hdev,void * data,u16 data_len)287 static int read_version(struct sock *sk, struct hci_dev *hdev, void *data,
288 			u16 data_len)
289 {
290 	struct mgmt_rp_read_version rp;
291 
292 	BT_DBG("sock %p", sk);
293 
294 	mgmt_fill_version_info(&rp);
295 
296 	return mgmt_cmd_complete(sk, MGMT_INDEX_NONE, MGMT_OP_READ_VERSION, 0,
297 				 &rp, sizeof(rp));
298 }
299 
read_commands(struct sock * sk,struct hci_dev * hdev,void * data,u16 data_len)300 static int read_commands(struct sock *sk, struct hci_dev *hdev, void *data,
301 			 u16 data_len)
302 {
303 	struct mgmt_rp_read_commands *rp;
304 	u16 num_commands, num_events;
305 	size_t rp_size;
306 	int i, err;
307 
308 	BT_DBG("sock %p", sk);
309 
310 	if (hci_sock_test_flag(sk, HCI_SOCK_TRUSTED)) {
311 		num_commands = ARRAY_SIZE(mgmt_commands);
312 		num_events = ARRAY_SIZE(mgmt_events);
313 	} else {
314 		num_commands = ARRAY_SIZE(mgmt_untrusted_commands);
315 		num_events = ARRAY_SIZE(mgmt_untrusted_events);
316 	}
317 
318 	rp_size = sizeof(*rp) + ((num_commands + num_events) * sizeof(u16));
319 
320 	rp = kmalloc(rp_size, GFP_KERNEL);
321 	if (!rp)
322 		return -ENOMEM;
323 
324 	rp->num_commands = cpu_to_le16(num_commands);
325 	rp->num_events = cpu_to_le16(num_events);
326 
327 	if (hci_sock_test_flag(sk, HCI_SOCK_TRUSTED)) {
328 		__le16 *opcode = rp->opcodes;
329 
330 		for (i = 0; i < num_commands; i++, opcode++)
331 			put_unaligned_le16(mgmt_commands[i], opcode);
332 
333 		for (i = 0; i < num_events; i++, opcode++)
334 			put_unaligned_le16(mgmt_events[i], opcode);
335 	} else {
336 		__le16 *opcode = rp->opcodes;
337 
338 		for (i = 0; i < num_commands; i++, opcode++)
339 			put_unaligned_le16(mgmt_untrusted_commands[i], opcode);
340 
341 		for (i = 0; i < num_events; i++, opcode++)
342 			put_unaligned_le16(mgmt_untrusted_events[i], opcode);
343 	}
344 
345 	err = mgmt_cmd_complete(sk, MGMT_INDEX_NONE, MGMT_OP_READ_COMMANDS, 0,
346 				rp, rp_size);
347 	kfree(rp);
348 
349 	return err;
350 }
351 
read_index_list(struct sock * sk,struct hci_dev * hdev,void * data,u16 data_len)352 static int read_index_list(struct sock *sk, struct hci_dev *hdev, void *data,
353 			   u16 data_len)
354 {
355 	struct mgmt_rp_read_index_list *rp;
356 	struct hci_dev *d;
357 	size_t rp_len;
358 	u16 count;
359 	int err;
360 
361 	BT_DBG("sock %p", sk);
362 
363 	read_lock(&hci_dev_list_lock);
364 
365 	count = 0;
366 	list_for_each_entry(d, &hci_dev_list, list) {
367 		if (d->dev_type == HCI_PRIMARY &&
368 		    !hci_dev_test_flag(d, HCI_UNCONFIGURED))
369 			count++;
370 	}
371 
372 	rp_len = sizeof(*rp) + (2 * count);
373 	rp = kmalloc(rp_len, GFP_ATOMIC);
374 	if (!rp) {
375 		read_unlock(&hci_dev_list_lock);
376 		return -ENOMEM;
377 	}
378 
379 	count = 0;
380 	list_for_each_entry(d, &hci_dev_list, list) {
381 		if (hci_dev_test_flag(d, HCI_SETUP) ||
382 		    hci_dev_test_flag(d, HCI_CONFIG) ||
383 		    hci_dev_test_flag(d, HCI_USER_CHANNEL))
384 			continue;
385 
386 		/* Devices marked as raw-only are neither configured
387 		 * nor unconfigured controllers.
388 		 */
389 		if (test_bit(HCI_QUIRK_RAW_DEVICE, &d->quirks))
390 			continue;
391 
392 		if (d->dev_type == HCI_PRIMARY &&
393 		    !hci_dev_test_flag(d, HCI_UNCONFIGURED)) {
394 			rp->index[count++] = cpu_to_le16(d->id);
395 			BT_DBG("Added hci%u", d->id);
396 		}
397 	}
398 
399 	rp->num_controllers = cpu_to_le16(count);
400 	rp_len = sizeof(*rp) + (2 * count);
401 
402 	read_unlock(&hci_dev_list_lock);
403 
404 	err = mgmt_cmd_complete(sk, MGMT_INDEX_NONE, MGMT_OP_READ_INDEX_LIST,
405 				0, rp, rp_len);
406 
407 	kfree(rp);
408 
409 	return err;
410 }
411 
read_unconf_index_list(struct sock * sk,struct hci_dev * hdev,void * data,u16 data_len)412 static int read_unconf_index_list(struct sock *sk, struct hci_dev *hdev,
413 				  void *data, u16 data_len)
414 {
415 	struct mgmt_rp_read_unconf_index_list *rp;
416 	struct hci_dev *d;
417 	size_t rp_len;
418 	u16 count;
419 	int err;
420 
421 	BT_DBG("sock %p", sk);
422 
423 	read_lock(&hci_dev_list_lock);
424 
425 	count = 0;
426 	list_for_each_entry(d, &hci_dev_list, list) {
427 		if (d->dev_type == HCI_PRIMARY &&
428 		    hci_dev_test_flag(d, HCI_UNCONFIGURED))
429 			count++;
430 	}
431 
432 	rp_len = sizeof(*rp) + (2 * count);
433 	rp = kmalloc(rp_len, GFP_ATOMIC);
434 	if (!rp) {
435 		read_unlock(&hci_dev_list_lock);
436 		return -ENOMEM;
437 	}
438 
439 	count = 0;
440 	list_for_each_entry(d, &hci_dev_list, list) {
441 		if (hci_dev_test_flag(d, HCI_SETUP) ||
442 		    hci_dev_test_flag(d, HCI_CONFIG) ||
443 		    hci_dev_test_flag(d, HCI_USER_CHANNEL))
444 			continue;
445 
446 		/* Devices marked as raw-only are neither configured
447 		 * nor unconfigured controllers.
448 		 */
449 		if (test_bit(HCI_QUIRK_RAW_DEVICE, &d->quirks))
450 			continue;
451 
452 		if (d->dev_type == HCI_PRIMARY &&
453 		    hci_dev_test_flag(d, HCI_UNCONFIGURED)) {
454 			rp->index[count++] = cpu_to_le16(d->id);
455 			BT_DBG("Added hci%u", d->id);
456 		}
457 	}
458 
459 	rp->num_controllers = cpu_to_le16(count);
460 	rp_len = sizeof(*rp) + (2 * count);
461 
462 	read_unlock(&hci_dev_list_lock);
463 
464 	err = mgmt_cmd_complete(sk, MGMT_INDEX_NONE,
465 				MGMT_OP_READ_UNCONF_INDEX_LIST, 0, rp, rp_len);
466 
467 	kfree(rp);
468 
469 	return err;
470 }
471 
read_ext_index_list(struct sock * sk,struct hci_dev * hdev,void * data,u16 data_len)472 static int read_ext_index_list(struct sock *sk, struct hci_dev *hdev,
473 			       void *data, u16 data_len)
474 {
475 	struct mgmt_rp_read_ext_index_list *rp;
476 	struct hci_dev *d;
477 	u16 count;
478 	int err;
479 
480 	BT_DBG("sock %p", sk);
481 
482 	read_lock(&hci_dev_list_lock);
483 
484 	count = 0;
485 	list_for_each_entry(d, &hci_dev_list, list) {
486 		if (d->dev_type == HCI_PRIMARY || d->dev_type == HCI_AMP)
487 			count++;
488 	}
489 
490 	rp = kmalloc(struct_size(rp, entry, count), GFP_ATOMIC);
491 	if (!rp) {
492 		read_unlock(&hci_dev_list_lock);
493 		return -ENOMEM;
494 	}
495 
496 	count = 0;
497 	list_for_each_entry(d, &hci_dev_list, list) {
498 		if (hci_dev_test_flag(d, HCI_SETUP) ||
499 		    hci_dev_test_flag(d, HCI_CONFIG) ||
500 		    hci_dev_test_flag(d, HCI_USER_CHANNEL))
501 			continue;
502 
503 		/* Devices marked as raw-only are neither configured
504 		 * nor unconfigured controllers.
505 		 */
506 		if (test_bit(HCI_QUIRK_RAW_DEVICE, &d->quirks))
507 			continue;
508 
509 		if (d->dev_type == HCI_PRIMARY) {
510 			if (hci_dev_test_flag(d, HCI_UNCONFIGURED))
511 				rp->entry[count].type = 0x01;
512 			else
513 				rp->entry[count].type = 0x00;
514 		} else if (d->dev_type == HCI_AMP) {
515 			rp->entry[count].type = 0x02;
516 		} else {
517 			continue;
518 		}
519 
520 		rp->entry[count].bus = d->bus;
521 		rp->entry[count++].index = cpu_to_le16(d->id);
522 		BT_DBG("Added hci%u", d->id);
523 	}
524 
525 	rp->num_controllers = cpu_to_le16(count);
526 
527 	read_unlock(&hci_dev_list_lock);
528 
529 	/* If this command is called at least once, then all the
530 	 * default index and unconfigured index events are disabled
531 	 * and from now on only extended index events are used.
532 	 */
533 	hci_sock_set_flag(sk, HCI_MGMT_EXT_INDEX_EVENTS);
534 	hci_sock_clear_flag(sk, HCI_MGMT_INDEX_EVENTS);
535 	hci_sock_clear_flag(sk, HCI_MGMT_UNCONF_INDEX_EVENTS);
536 
537 	err = mgmt_cmd_complete(sk, MGMT_INDEX_NONE,
538 				MGMT_OP_READ_EXT_INDEX_LIST, 0, rp,
539 				struct_size(rp, entry, count));
540 
541 	kfree(rp);
542 
543 	return err;
544 }
545 
is_configured(struct hci_dev * hdev)546 static bool is_configured(struct hci_dev *hdev)
547 {
548 	if (test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks) &&
549 	    !hci_dev_test_flag(hdev, HCI_EXT_CONFIGURED))
550 		return false;
551 
552 	if ((test_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks) ||
553 	     test_bit(HCI_QUIRK_USE_BDADDR_PROPERTY, &hdev->quirks)) &&
554 	    !bacmp(&hdev->public_addr, BDADDR_ANY))
555 		return false;
556 
557 	return true;
558 }
559 
get_missing_options(struct hci_dev * hdev)560 static __le32 get_missing_options(struct hci_dev *hdev)
561 {
562 	u32 options = 0;
563 
564 	if (test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks) &&
565 	    !hci_dev_test_flag(hdev, HCI_EXT_CONFIGURED))
566 		options |= MGMT_OPTION_EXTERNAL_CONFIG;
567 
568 	if ((test_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks) ||
569 	     test_bit(HCI_QUIRK_USE_BDADDR_PROPERTY, &hdev->quirks)) &&
570 	    !bacmp(&hdev->public_addr, BDADDR_ANY))
571 		options |= MGMT_OPTION_PUBLIC_ADDRESS;
572 
573 	return cpu_to_le32(options);
574 }
575 
new_options(struct hci_dev * hdev,struct sock * skip)576 static int new_options(struct hci_dev *hdev, struct sock *skip)
577 {
578 	__le32 options = get_missing_options(hdev);
579 
580 	return mgmt_limited_event(MGMT_EV_NEW_CONFIG_OPTIONS, hdev, &options,
581 				  sizeof(options), HCI_MGMT_OPTION_EVENTS, skip);
582 }
583 
send_options_rsp(struct sock * sk,u16 opcode,struct hci_dev * hdev)584 static int send_options_rsp(struct sock *sk, u16 opcode, struct hci_dev *hdev)
585 {
586 	__le32 options = get_missing_options(hdev);
587 
588 	return mgmt_cmd_complete(sk, hdev->id, opcode, 0, &options,
589 				 sizeof(options));
590 }
591 
read_config_info(struct sock * sk,struct hci_dev * hdev,void * data,u16 data_len)592 static int read_config_info(struct sock *sk, struct hci_dev *hdev,
593 			    void *data, u16 data_len)
594 {
595 	struct mgmt_rp_read_config_info rp;
596 	u32 options = 0;
597 
598 	BT_DBG("sock %p %s", sk, hdev->name);
599 
600 	hci_dev_lock(hdev);
601 
602 	memset(&rp, 0, sizeof(rp));
603 	rp.manufacturer = cpu_to_le16(hdev->manufacturer);
604 
605 	if (test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks))
606 		options |= MGMT_OPTION_EXTERNAL_CONFIG;
607 
608 	if (hdev->set_bdaddr)
609 		options |= MGMT_OPTION_PUBLIC_ADDRESS;
610 
611 	rp.supported_options = cpu_to_le32(options);
612 	rp.missing_options = get_missing_options(hdev);
613 
614 	hci_dev_unlock(hdev);
615 
616 	return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_CONFIG_INFO, 0,
617 				 &rp, sizeof(rp));
618 }
619 
get_supported_phys(struct hci_dev * hdev)620 static u32 get_supported_phys(struct hci_dev *hdev)
621 {
622 	u32 supported_phys = 0;
623 
624 	if (lmp_bredr_capable(hdev)) {
625 		supported_phys |= MGMT_PHY_BR_1M_1SLOT;
626 
627 		if (hdev->features[0][0] & LMP_3SLOT)
628 			supported_phys |= MGMT_PHY_BR_1M_3SLOT;
629 
630 		if (hdev->features[0][0] & LMP_5SLOT)
631 			supported_phys |= MGMT_PHY_BR_1M_5SLOT;
632 
633 		if (lmp_edr_2m_capable(hdev)) {
634 			supported_phys |= MGMT_PHY_EDR_2M_1SLOT;
635 
636 			if (lmp_edr_3slot_capable(hdev))
637 				supported_phys |= MGMT_PHY_EDR_2M_3SLOT;
638 
639 			if (lmp_edr_5slot_capable(hdev))
640 				supported_phys |= MGMT_PHY_EDR_2M_5SLOT;
641 
642 			if (lmp_edr_3m_capable(hdev)) {
643 				supported_phys |= MGMT_PHY_EDR_3M_1SLOT;
644 
645 				if (lmp_edr_3slot_capable(hdev))
646 					supported_phys |= MGMT_PHY_EDR_3M_3SLOT;
647 
648 				if (lmp_edr_5slot_capable(hdev))
649 					supported_phys |= MGMT_PHY_EDR_3M_5SLOT;
650 			}
651 		}
652 	}
653 
654 	if (lmp_le_capable(hdev)) {
655 		supported_phys |= MGMT_PHY_LE_1M_TX;
656 		supported_phys |= MGMT_PHY_LE_1M_RX;
657 
658 		if (hdev->le_features[1] & HCI_LE_PHY_2M) {
659 			supported_phys |= MGMT_PHY_LE_2M_TX;
660 			supported_phys |= MGMT_PHY_LE_2M_RX;
661 		}
662 
663 		if (hdev->le_features[1] & HCI_LE_PHY_CODED) {
664 			supported_phys |= MGMT_PHY_LE_CODED_TX;
665 			supported_phys |= MGMT_PHY_LE_CODED_RX;
666 		}
667 	}
668 
669 	return supported_phys;
670 }
671 
get_selected_phys(struct hci_dev * hdev)672 static u32 get_selected_phys(struct hci_dev *hdev)
673 {
674 	u32 selected_phys = 0;
675 
676 	if (lmp_bredr_capable(hdev)) {
677 		selected_phys |= MGMT_PHY_BR_1M_1SLOT;
678 
679 		if (hdev->pkt_type & (HCI_DM3 | HCI_DH3))
680 			selected_phys |= MGMT_PHY_BR_1M_3SLOT;
681 
682 		if (hdev->pkt_type & (HCI_DM5 | HCI_DH5))
683 			selected_phys |= MGMT_PHY_BR_1M_5SLOT;
684 
685 		if (lmp_edr_2m_capable(hdev)) {
686 			if (!(hdev->pkt_type & HCI_2DH1))
687 				selected_phys |= MGMT_PHY_EDR_2M_1SLOT;
688 
689 			if (lmp_edr_3slot_capable(hdev) &&
690 			    !(hdev->pkt_type & HCI_2DH3))
691 				selected_phys |= MGMT_PHY_EDR_2M_3SLOT;
692 
693 			if (lmp_edr_5slot_capable(hdev) &&
694 			    !(hdev->pkt_type & HCI_2DH5))
695 				selected_phys |= MGMT_PHY_EDR_2M_5SLOT;
696 
697 			if (lmp_edr_3m_capable(hdev)) {
698 				if (!(hdev->pkt_type & HCI_3DH1))
699 					selected_phys |= MGMT_PHY_EDR_3M_1SLOT;
700 
701 				if (lmp_edr_3slot_capable(hdev) &&
702 				    !(hdev->pkt_type & HCI_3DH3))
703 					selected_phys |= MGMT_PHY_EDR_3M_3SLOT;
704 
705 				if (lmp_edr_5slot_capable(hdev) &&
706 				    !(hdev->pkt_type & HCI_3DH5))
707 					selected_phys |= MGMT_PHY_EDR_3M_5SLOT;
708 			}
709 		}
710 	}
711 
712 	if (lmp_le_capable(hdev)) {
713 		if (hdev->le_tx_def_phys & HCI_LE_SET_PHY_1M)
714 			selected_phys |= MGMT_PHY_LE_1M_TX;
715 
716 		if (hdev->le_rx_def_phys & HCI_LE_SET_PHY_1M)
717 			selected_phys |= MGMT_PHY_LE_1M_RX;
718 
719 		if (hdev->le_tx_def_phys & HCI_LE_SET_PHY_2M)
720 			selected_phys |= MGMT_PHY_LE_2M_TX;
721 
722 		if (hdev->le_rx_def_phys & HCI_LE_SET_PHY_2M)
723 			selected_phys |= MGMT_PHY_LE_2M_RX;
724 
725 		if (hdev->le_tx_def_phys & HCI_LE_SET_PHY_CODED)
726 			selected_phys |= MGMT_PHY_LE_CODED_TX;
727 
728 		if (hdev->le_rx_def_phys & HCI_LE_SET_PHY_CODED)
729 			selected_phys |= MGMT_PHY_LE_CODED_RX;
730 	}
731 
732 	return selected_phys;
733 }
734 
get_configurable_phys(struct hci_dev * hdev)735 static u32 get_configurable_phys(struct hci_dev *hdev)
736 {
737 	return (get_supported_phys(hdev) & ~MGMT_PHY_BR_1M_1SLOT &
738 		~MGMT_PHY_LE_1M_TX & ~MGMT_PHY_LE_1M_RX);
739 }
740 
get_supported_settings(struct hci_dev * hdev)741 static u32 get_supported_settings(struct hci_dev *hdev)
742 {
743 	u32 settings = 0;
744 
745 	settings |= MGMT_SETTING_POWERED;
746 	settings |= MGMT_SETTING_BONDABLE;
747 	settings |= MGMT_SETTING_DEBUG_KEYS;
748 	settings |= MGMT_SETTING_CONNECTABLE;
749 	settings |= MGMT_SETTING_DISCOVERABLE;
750 
751 	if (lmp_bredr_capable(hdev)) {
752 		if (hdev->hci_ver >= BLUETOOTH_VER_1_2)
753 			settings |= MGMT_SETTING_FAST_CONNECTABLE;
754 		settings |= MGMT_SETTING_BREDR;
755 		settings |= MGMT_SETTING_LINK_SECURITY;
756 
757 		if (lmp_ssp_capable(hdev)) {
758 			settings |= MGMT_SETTING_SSP;
759 			settings |= MGMT_SETTING_HS;
760 		}
761 
762 		if (lmp_sc_capable(hdev))
763 			settings |= MGMT_SETTING_SECURE_CONN;
764 	}
765 
766 	if (lmp_le_capable(hdev)) {
767 		settings |= MGMT_SETTING_LE;
768 		settings |= MGMT_SETTING_ADVERTISING;
769 		settings |= MGMT_SETTING_SECURE_CONN;
770 		settings |= MGMT_SETTING_PRIVACY;
771 		settings |= MGMT_SETTING_STATIC_ADDRESS;
772 	}
773 
774 	if (test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks) ||
775 	    hdev->set_bdaddr)
776 		settings |= MGMT_SETTING_CONFIGURATION;
777 
778 	settings |= MGMT_SETTING_PHY_CONFIGURATION;
779 
780 	return settings;
781 }
782 
get_current_settings(struct hci_dev * hdev)783 static u32 get_current_settings(struct hci_dev *hdev)
784 {
785 	u32 settings = 0;
786 
787 	if (hdev_is_powered(hdev))
788 		settings |= MGMT_SETTING_POWERED;
789 
790 	if (hci_dev_test_flag(hdev, HCI_CONNECTABLE))
791 		settings |= MGMT_SETTING_CONNECTABLE;
792 
793 	if (hci_dev_test_flag(hdev, HCI_FAST_CONNECTABLE))
794 		settings |= MGMT_SETTING_FAST_CONNECTABLE;
795 
796 	if (hci_dev_test_flag(hdev, HCI_DISCOVERABLE))
797 		settings |= MGMT_SETTING_DISCOVERABLE;
798 
799 	if (hci_dev_test_flag(hdev, HCI_BONDABLE))
800 		settings |= MGMT_SETTING_BONDABLE;
801 
802 	if (hci_dev_test_flag(hdev, HCI_BREDR_ENABLED))
803 		settings |= MGMT_SETTING_BREDR;
804 
805 	if (hci_dev_test_flag(hdev, HCI_LE_ENABLED))
806 		settings |= MGMT_SETTING_LE;
807 
808 	if (hci_dev_test_flag(hdev, HCI_LINK_SECURITY))
809 		settings |= MGMT_SETTING_LINK_SECURITY;
810 
811 	if (hci_dev_test_flag(hdev, HCI_SSP_ENABLED))
812 		settings |= MGMT_SETTING_SSP;
813 
814 	if (hci_dev_test_flag(hdev, HCI_HS_ENABLED))
815 		settings |= MGMT_SETTING_HS;
816 
817 	if (hci_dev_test_flag(hdev, HCI_ADVERTISING))
818 		settings |= MGMT_SETTING_ADVERTISING;
819 
820 	if (hci_dev_test_flag(hdev, HCI_SC_ENABLED))
821 		settings |= MGMT_SETTING_SECURE_CONN;
822 
823 	if (hci_dev_test_flag(hdev, HCI_KEEP_DEBUG_KEYS))
824 		settings |= MGMT_SETTING_DEBUG_KEYS;
825 
826 	if (hci_dev_test_flag(hdev, HCI_PRIVACY))
827 		settings |= MGMT_SETTING_PRIVACY;
828 
829 	/* The current setting for static address has two purposes. The
830 	 * first is to indicate if the static address will be used and
831 	 * the second is to indicate if it is actually set.
832 	 *
833 	 * This means if the static address is not configured, this flag
834 	 * will never be set. If the address is configured, then if the
835 	 * address is actually used decides if the flag is set or not.
836 	 *
837 	 * For single mode LE only controllers and dual-mode controllers
838 	 * with BR/EDR disabled, the existence of the static address will
839 	 * be evaluated.
840 	 */
841 	if (hci_dev_test_flag(hdev, HCI_FORCE_STATIC_ADDR) ||
842 	    !hci_dev_test_flag(hdev, HCI_BREDR_ENABLED) ||
843 	    !bacmp(&hdev->bdaddr, BDADDR_ANY)) {
844 		if (bacmp(&hdev->static_addr, BDADDR_ANY))
845 			settings |= MGMT_SETTING_STATIC_ADDRESS;
846 	}
847 
848 	return settings;
849 }
850 
pending_find(u16 opcode,struct hci_dev * hdev)851 static struct mgmt_pending_cmd *pending_find(u16 opcode, struct hci_dev *hdev)
852 {
853 	return mgmt_pending_find(HCI_CHANNEL_CONTROL, opcode, hdev);
854 }
855 
pending_find_data(u16 opcode,struct hci_dev * hdev,const void * data)856 static struct mgmt_pending_cmd *pending_find_data(u16 opcode,
857 						  struct hci_dev *hdev,
858 						  const void *data)
859 {
860 	return mgmt_pending_find_data(HCI_CHANNEL_CONTROL, opcode, hdev, data);
861 }
862 
mgmt_get_adv_discov_flags(struct hci_dev * hdev)863 u8 mgmt_get_adv_discov_flags(struct hci_dev *hdev)
864 {
865 	struct mgmt_pending_cmd *cmd;
866 
867 	/* If there's a pending mgmt command the flags will not yet have
868 	 * their final values, so check for this first.
869 	 */
870 	cmd = pending_find(MGMT_OP_SET_DISCOVERABLE, hdev);
871 	if (cmd) {
872 		struct mgmt_mode *cp = cmd->param;
873 		if (cp->val == 0x01)
874 			return LE_AD_GENERAL;
875 		else if (cp->val == 0x02)
876 			return LE_AD_LIMITED;
877 	} else {
878 		if (hci_dev_test_flag(hdev, HCI_LIMITED_DISCOVERABLE))
879 			return LE_AD_LIMITED;
880 		else if (hci_dev_test_flag(hdev, HCI_DISCOVERABLE))
881 			return LE_AD_GENERAL;
882 	}
883 
884 	return 0;
885 }
886 
mgmt_get_connectable(struct hci_dev * hdev)887 bool mgmt_get_connectable(struct hci_dev *hdev)
888 {
889 	struct mgmt_pending_cmd *cmd;
890 
891 	/* If there's a pending mgmt command the flag will not yet have
892 	 * it's final value, so check for this first.
893 	 */
894 	cmd = pending_find(MGMT_OP_SET_CONNECTABLE, hdev);
895 	if (cmd) {
896 		struct mgmt_mode *cp = cmd->param;
897 
898 		return cp->val;
899 	}
900 
901 	return hci_dev_test_flag(hdev, HCI_CONNECTABLE);
902 }
903 
service_cache_off(struct work_struct * work)904 static void service_cache_off(struct work_struct *work)
905 {
906 	struct hci_dev *hdev = container_of(work, struct hci_dev,
907 					    service_cache.work);
908 	struct hci_request req;
909 
910 	if (!hci_dev_test_and_clear_flag(hdev, HCI_SERVICE_CACHE))
911 		return;
912 
913 	hci_req_init(&req, hdev);
914 
915 	hci_dev_lock(hdev);
916 
917 	__hci_req_update_eir(&req);
918 	__hci_req_update_class(&req);
919 
920 	hci_dev_unlock(hdev);
921 
922 	hci_req_run(&req, NULL);
923 }
924 
rpa_expired(struct work_struct * work)925 static void rpa_expired(struct work_struct *work)
926 {
927 	struct hci_dev *hdev = container_of(work, struct hci_dev,
928 					    rpa_expired.work);
929 	struct hci_request req;
930 
931 	BT_DBG("");
932 
933 	hci_dev_set_flag(hdev, HCI_RPA_EXPIRED);
934 
935 	if (!hci_dev_test_flag(hdev, HCI_ADVERTISING))
936 		return;
937 
938 	/* The generation of a new RPA and programming it into the
939 	 * controller happens in the hci_req_enable_advertising()
940 	 * function.
941 	 */
942 	hci_req_init(&req, hdev);
943 	if (ext_adv_capable(hdev))
944 		__hci_req_start_ext_adv(&req, hdev->cur_adv_instance);
945 	else
946 		__hci_req_enable_advertising(&req);
947 	hci_req_run(&req, NULL);
948 }
949 
mgmt_init_hdev(struct sock * sk,struct hci_dev * hdev)950 static void mgmt_init_hdev(struct sock *sk, struct hci_dev *hdev)
951 {
952 	if (hci_dev_test_and_set_flag(hdev, HCI_MGMT))
953 		return;
954 
955 	INIT_DELAYED_WORK(&hdev->service_cache, service_cache_off);
956 	INIT_DELAYED_WORK(&hdev->rpa_expired, rpa_expired);
957 
958 	/* Non-mgmt controlled devices get this bit set
959 	 * implicitly so that pairing works for them, however
960 	 * for mgmt we require user-space to explicitly enable
961 	 * it
962 	 */
963 	hci_dev_clear_flag(hdev, HCI_BONDABLE);
964 }
965 
read_controller_info(struct sock * sk,struct hci_dev * hdev,void * data,u16 data_len)966 static int read_controller_info(struct sock *sk, struct hci_dev *hdev,
967 				void *data, u16 data_len)
968 {
969 	struct mgmt_rp_read_info rp;
970 
971 	BT_DBG("sock %p %s", sk, hdev->name);
972 
973 	hci_dev_lock(hdev);
974 
975 	memset(&rp, 0, sizeof(rp));
976 
977 	bacpy(&rp.bdaddr, &hdev->bdaddr);
978 
979 	rp.version = hdev->hci_ver;
980 	rp.manufacturer = cpu_to_le16(hdev->manufacturer);
981 
982 	rp.supported_settings = cpu_to_le32(get_supported_settings(hdev));
983 	rp.current_settings = cpu_to_le32(get_current_settings(hdev));
984 
985 	memcpy(rp.dev_class, hdev->dev_class, 3);
986 
987 	memcpy(rp.name, hdev->dev_name, sizeof(hdev->dev_name));
988 	memcpy(rp.short_name, hdev->short_name, sizeof(hdev->short_name));
989 
990 	hci_dev_unlock(hdev);
991 
992 	return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_INFO, 0, &rp,
993 				 sizeof(rp));
994 }
995 
append_eir_data_to_buf(struct hci_dev * hdev,u8 * eir)996 static u16 append_eir_data_to_buf(struct hci_dev *hdev, u8 *eir)
997 {
998 	u16 eir_len = 0;
999 	size_t name_len;
1000 
1001 	if (hci_dev_test_flag(hdev, HCI_BREDR_ENABLED))
1002 		eir_len = eir_append_data(eir, eir_len, EIR_CLASS_OF_DEV,
1003 					  hdev->dev_class, 3);
1004 
1005 	if (hci_dev_test_flag(hdev, HCI_LE_ENABLED))
1006 		eir_len = eir_append_le16(eir, eir_len, EIR_APPEARANCE,
1007 					  hdev->appearance);
1008 
1009 	name_len = strlen(hdev->dev_name);
1010 	eir_len = eir_append_data(eir, eir_len, EIR_NAME_COMPLETE,
1011 				  hdev->dev_name, name_len);
1012 
1013 	name_len = strlen(hdev->short_name);
1014 	eir_len = eir_append_data(eir, eir_len, EIR_NAME_SHORT,
1015 				  hdev->short_name, name_len);
1016 
1017 	return eir_len;
1018 }
1019 
read_ext_controller_info(struct sock * sk,struct hci_dev * hdev,void * data,u16 data_len)1020 static int read_ext_controller_info(struct sock *sk, struct hci_dev *hdev,
1021 				    void *data, u16 data_len)
1022 {
1023 	char buf[512];
1024 	struct mgmt_rp_read_ext_info *rp = (void *)buf;
1025 	u16 eir_len;
1026 
1027 	BT_DBG("sock %p %s", sk, hdev->name);
1028 
1029 	memset(&buf, 0, sizeof(buf));
1030 
1031 	hci_dev_lock(hdev);
1032 
1033 	bacpy(&rp->bdaddr, &hdev->bdaddr);
1034 
1035 	rp->version = hdev->hci_ver;
1036 	rp->manufacturer = cpu_to_le16(hdev->manufacturer);
1037 
1038 	rp->supported_settings = cpu_to_le32(get_supported_settings(hdev));
1039 	rp->current_settings = cpu_to_le32(get_current_settings(hdev));
1040 
1041 
1042 	eir_len = append_eir_data_to_buf(hdev, rp->eir);
1043 	rp->eir_len = cpu_to_le16(eir_len);
1044 
1045 	hci_dev_unlock(hdev);
1046 
1047 	/* If this command is called at least once, then the events
1048 	 * for class of device and local name changes are disabled
1049 	 * and only the new extended controller information event
1050 	 * is used.
1051 	 */
1052 	hci_sock_set_flag(sk, HCI_MGMT_EXT_INFO_EVENTS);
1053 	hci_sock_clear_flag(sk, HCI_MGMT_DEV_CLASS_EVENTS);
1054 	hci_sock_clear_flag(sk, HCI_MGMT_LOCAL_NAME_EVENTS);
1055 
1056 	return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_EXT_INFO, 0, rp,
1057 				 sizeof(*rp) + eir_len);
1058 }
1059 
ext_info_changed(struct hci_dev * hdev,struct sock * skip)1060 static int ext_info_changed(struct hci_dev *hdev, struct sock *skip)
1061 {
1062 	char buf[512];
1063 	struct mgmt_ev_ext_info_changed *ev = (void *)buf;
1064 	u16 eir_len;
1065 
1066 	memset(buf, 0, sizeof(buf));
1067 
1068 	eir_len = append_eir_data_to_buf(hdev, ev->eir);
1069 	ev->eir_len = cpu_to_le16(eir_len);
1070 
1071 	return mgmt_limited_event(MGMT_EV_EXT_INFO_CHANGED, hdev, ev,
1072 				  sizeof(*ev) + eir_len,
1073 				  HCI_MGMT_EXT_INFO_EVENTS, skip);
1074 }
1075 
send_settings_rsp(struct sock * sk,u16 opcode,struct hci_dev * hdev)1076 static int send_settings_rsp(struct sock *sk, u16 opcode, struct hci_dev *hdev)
1077 {
1078 	__le32 settings = cpu_to_le32(get_current_settings(hdev));
1079 
1080 	return mgmt_cmd_complete(sk, hdev->id, opcode, 0, &settings,
1081 				 sizeof(settings));
1082 }
1083 
clean_up_hci_complete(struct hci_dev * hdev,u8 status,u16 opcode)1084 static void clean_up_hci_complete(struct hci_dev *hdev, u8 status, u16 opcode)
1085 {
1086 	BT_DBG("%s status 0x%02x", hdev->name, status);
1087 
1088 	if (hci_conn_count(hdev) == 0) {
1089 		cancel_delayed_work(&hdev->power_off);
1090 		queue_work(hdev->req_workqueue, &hdev->power_off.work);
1091 	}
1092 }
1093 
mgmt_advertising_added(struct sock * sk,struct hci_dev * hdev,u8 instance)1094 void mgmt_advertising_added(struct sock *sk, struct hci_dev *hdev, u8 instance)
1095 {
1096 	struct mgmt_ev_advertising_added ev;
1097 
1098 	ev.instance = instance;
1099 
1100 	mgmt_event(MGMT_EV_ADVERTISING_ADDED, hdev, &ev, sizeof(ev), sk);
1101 }
1102 
mgmt_advertising_removed(struct sock * sk,struct hci_dev * hdev,u8 instance)1103 void mgmt_advertising_removed(struct sock *sk, struct hci_dev *hdev,
1104 			      u8 instance)
1105 {
1106 	struct mgmt_ev_advertising_removed ev;
1107 
1108 	ev.instance = instance;
1109 
1110 	mgmt_event(MGMT_EV_ADVERTISING_REMOVED, hdev, &ev, sizeof(ev), sk);
1111 }
1112 
cancel_adv_timeout(struct hci_dev * hdev)1113 static void cancel_adv_timeout(struct hci_dev *hdev)
1114 {
1115 	if (hdev->adv_instance_timeout) {
1116 		hdev->adv_instance_timeout = 0;
1117 		cancel_delayed_work(&hdev->adv_instance_expire);
1118 	}
1119 }
1120 
clean_up_hci_state(struct hci_dev * hdev)1121 static int clean_up_hci_state(struct hci_dev *hdev)
1122 {
1123 	struct hci_request req;
1124 	struct hci_conn *conn;
1125 	bool discov_stopped;
1126 	int err;
1127 
1128 	hci_req_init(&req, hdev);
1129 
1130 	if (test_bit(HCI_ISCAN, &hdev->flags) ||
1131 	    test_bit(HCI_PSCAN, &hdev->flags)) {
1132 		u8 scan = 0x00;
1133 		hci_req_add(&req, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);
1134 	}
1135 
1136 	hci_req_clear_adv_instance(hdev, NULL, NULL, 0x00, false);
1137 
1138 	if (hci_dev_test_flag(hdev, HCI_LE_ADV))
1139 		__hci_req_disable_advertising(&req);
1140 
1141 	discov_stopped = hci_req_stop_discovery(&req);
1142 
1143 	list_for_each_entry(conn, &hdev->conn_hash.list, list) {
1144 		/* 0x15 == Terminated due to Power Off */
1145 		__hci_abort_conn(&req, conn, 0x15);
1146 	}
1147 
1148 	err = hci_req_run(&req, clean_up_hci_complete);
1149 	if (!err && discov_stopped)
1150 		hci_discovery_set_state(hdev, DISCOVERY_STOPPING);
1151 
1152 	return err;
1153 }
1154 
set_powered(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)1155 static int set_powered(struct sock *sk, struct hci_dev *hdev, void *data,
1156 		       u16 len)
1157 {
1158 	struct mgmt_mode *cp = data;
1159 	struct mgmt_pending_cmd *cmd;
1160 	int err;
1161 
1162 	BT_DBG("request for %s", hdev->name);
1163 
1164 	if (cp->val != 0x00 && cp->val != 0x01)
1165 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_POWERED,
1166 				       MGMT_STATUS_INVALID_PARAMS);
1167 
1168 	hci_dev_lock(hdev);
1169 
1170 	if (pending_find(MGMT_OP_SET_POWERED, hdev)) {
1171 		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_POWERED,
1172 				      MGMT_STATUS_BUSY);
1173 		goto failed;
1174 	}
1175 
1176 	if (!!cp->val == hdev_is_powered(hdev)) {
1177 		err = send_settings_rsp(sk, MGMT_OP_SET_POWERED, hdev);
1178 		goto failed;
1179 	}
1180 
1181 	cmd = mgmt_pending_add(sk, MGMT_OP_SET_POWERED, hdev, data, len);
1182 	if (!cmd) {
1183 		err = -ENOMEM;
1184 		goto failed;
1185 	}
1186 
1187 	if (cp->val) {
1188 		queue_work(hdev->req_workqueue, &hdev->power_on);
1189 		err = 0;
1190 	} else {
1191 		/* Disconnect connections, stop scans, etc */
1192 		err = clean_up_hci_state(hdev);
1193 		if (!err)
1194 			queue_delayed_work(hdev->req_workqueue, &hdev->power_off,
1195 					   HCI_POWER_OFF_TIMEOUT);
1196 
1197 		/* ENODATA means there were no HCI commands queued */
1198 		if (err == -ENODATA) {
1199 			cancel_delayed_work(&hdev->power_off);
1200 			queue_work(hdev->req_workqueue, &hdev->power_off.work);
1201 			err = 0;
1202 		}
1203 	}
1204 
1205 failed:
1206 	hci_dev_unlock(hdev);
1207 	return err;
1208 }
1209 
new_settings(struct hci_dev * hdev,struct sock * skip)1210 static int new_settings(struct hci_dev *hdev, struct sock *skip)
1211 {
1212 	__le32 ev = cpu_to_le32(get_current_settings(hdev));
1213 
1214 	return mgmt_limited_event(MGMT_EV_NEW_SETTINGS, hdev, &ev,
1215 				  sizeof(ev), HCI_MGMT_SETTING_EVENTS, skip);
1216 }
1217 
mgmt_new_settings(struct hci_dev * hdev)1218 int mgmt_new_settings(struct hci_dev *hdev)
1219 {
1220 	return new_settings(hdev, NULL);
1221 }
1222 
1223 struct cmd_lookup {
1224 	struct sock *sk;
1225 	struct hci_dev *hdev;
1226 	u8 mgmt_status;
1227 };
1228 
settings_rsp(struct mgmt_pending_cmd * cmd,void * data)1229 static void settings_rsp(struct mgmt_pending_cmd *cmd, void *data)
1230 {
1231 	struct cmd_lookup *match = data;
1232 
1233 	send_settings_rsp(cmd->sk, cmd->opcode, match->hdev);
1234 
1235 	list_del(&cmd->list);
1236 
1237 	if (match->sk == NULL) {
1238 		match->sk = cmd->sk;
1239 		sock_hold(match->sk);
1240 	}
1241 
1242 	mgmt_pending_free(cmd);
1243 }
1244 
cmd_status_rsp(struct mgmt_pending_cmd * cmd,void * data)1245 static void cmd_status_rsp(struct mgmt_pending_cmd *cmd, void *data)
1246 {
1247 	u8 *status = data;
1248 
1249 	mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, *status);
1250 	mgmt_pending_remove(cmd);
1251 }
1252 
cmd_complete_rsp(struct mgmt_pending_cmd * cmd,void * data)1253 static void cmd_complete_rsp(struct mgmt_pending_cmd *cmd, void *data)
1254 {
1255 	if (cmd->cmd_complete) {
1256 		u8 *status = data;
1257 
1258 		cmd->cmd_complete(cmd, *status);
1259 		mgmt_pending_remove(cmd);
1260 
1261 		return;
1262 	}
1263 
1264 	cmd_status_rsp(cmd, data);
1265 }
1266 
generic_cmd_complete(struct mgmt_pending_cmd * cmd,u8 status)1267 static int generic_cmd_complete(struct mgmt_pending_cmd *cmd, u8 status)
1268 {
1269 	return mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, status,
1270 				 cmd->param, cmd->param_len);
1271 }
1272 
addr_cmd_complete(struct mgmt_pending_cmd * cmd,u8 status)1273 static int addr_cmd_complete(struct mgmt_pending_cmd *cmd, u8 status)
1274 {
1275 	return mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, status,
1276 				 cmd->param, sizeof(struct mgmt_addr_info));
1277 }
1278 
mgmt_bredr_support(struct hci_dev * hdev)1279 static u8 mgmt_bredr_support(struct hci_dev *hdev)
1280 {
1281 	if (!lmp_bredr_capable(hdev))
1282 		return MGMT_STATUS_NOT_SUPPORTED;
1283 	else if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED))
1284 		return MGMT_STATUS_REJECTED;
1285 	else
1286 		return MGMT_STATUS_SUCCESS;
1287 }
1288 
mgmt_le_support(struct hci_dev * hdev)1289 static u8 mgmt_le_support(struct hci_dev *hdev)
1290 {
1291 	if (!lmp_le_capable(hdev))
1292 		return MGMT_STATUS_NOT_SUPPORTED;
1293 	else if (!hci_dev_test_flag(hdev, HCI_LE_ENABLED))
1294 		return MGMT_STATUS_REJECTED;
1295 	else
1296 		return MGMT_STATUS_SUCCESS;
1297 }
1298 
mgmt_set_discoverable_complete(struct hci_dev * hdev,u8 status)1299 void mgmt_set_discoverable_complete(struct hci_dev *hdev, u8 status)
1300 {
1301 	struct mgmt_pending_cmd *cmd;
1302 
1303 	BT_DBG("status 0x%02x", status);
1304 
1305 	hci_dev_lock(hdev);
1306 
1307 	cmd = pending_find(MGMT_OP_SET_DISCOVERABLE, hdev);
1308 	if (!cmd)
1309 		goto unlock;
1310 
1311 	if (status) {
1312 		u8 mgmt_err = mgmt_status(status);
1313 		mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, mgmt_err);
1314 		hci_dev_clear_flag(hdev, HCI_LIMITED_DISCOVERABLE);
1315 		goto remove_cmd;
1316 	}
1317 
1318 	if (hci_dev_test_flag(hdev, HCI_DISCOVERABLE) &&
1319 	    hdev->discov_timeout > 0) {
1320 		int to = msecs_to_jiffies(hdev->discov_timeout * 1000);
1321 		queue_delayed_work(hdev->req_workqueue, &hdev->discov_off, to);
1322 	}
1323 
1324 	send_settings_rsp(cmd->sk, MGMT_OP_SET_DISCOVERABLE, hdev);
1325 	new_settings(hdev, cmd->sk);
1326 
1327 remove_cmd:
1328 	mgmt_pending_remove(cmd);
1329 
1330 unlock:
1331 	hci_dev_unlock(hdev);
1332 }
1333 
set_discoverable(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)1334 static int set_discoverable(struct sock *sk, struct hci_dev *hdev, void *data,
1335 			    u16 len)
1336 {
1337 	struct mgmt_cp_set_discoverable *cp = data;
1338 	struct mgmt_pending_cmd *cmd;
1339 	u16 timeout;
1340 	int err;
1341 
1342 	BT_DBG("request for %s", hdev->name);
1343 
1344 	if (!hci_dev_test_flag(hdev, HCI_LE_ENABLED) &&
1345 	    !hci_dev_test_flag(hdev, HCI_BREDR_ENABLED))
1346 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
1347 				       MGMT_STATUS_REJECTED);
1348 
1349 	if (cp->val != 0x00 && cp->val != 0x01 && cp->val != 0x02)
1350 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
1351 				       MGMT_STATUS_INVALID_PARAMS);
1352 
1353 	timeout = __le16_to_cpu(cp->timeout);
1354 
1355 	/* Disabling discoverable requires that no timeout is set,
1356 	 * and enabling limited discoverable requires a timeout.
1357 	 */
1358 	if ((cp->val == 0x00 && timeout > 0) ||
1359 	    (cp->val == 0x02 && timeout == 0))
1360 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
1361 				       MGMT_STATUS_INVALID_PARAMS);
1362 
1363 	hci_dev_lock(hdev);
1364 
1365 	if (!hdev_is_powered(hdev) && timeout > 0) {
1366 		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
1367 				      MGMT_STATUS_NOT_POWERED);
1368 		goto failed;
1369 	}
1370 
1371 	if (pending_find(MGMT_OP_SET_DISCOVERABLE, hdev) ||
1372 	    pending_find(MGMT_OP_SET_CONNECTABLE, hdev)) {
1373 		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
1374 				      MGMT_STATUS_BUSY);
1375 		goto failed;
1376 	}
1377 
1378 	if (!hci_dev_test_flag(hdev, HCI_CONNECTABLE)) {
1379 		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
1380 				      MGMT_STATUS_REJECTED);
1381 		goto failed;
1382 	}
1383 
1384 	if (!hdev_is_powered(hdev)) {
1385 		bool changed = false;
1386 
1387 		/* Setting limited discoverable when powered off is
1388 		 * not a valid operation since it requires a timeout
1389 		 * and so no need to check HCI_LIMITED_DISCOVERABLE.
1390 		 */
1391 		if (!!cp->val != hci_dev_test_flag(hdev, HCI_DISCOVERABLE)) {
1392 			hci_dev_change_flag(hdev, HCI_DISCOVERABLE);
1393 			changed = true;
1394 		}
1395 
1396 		err = send_settings_rsp(sk, MGMT_OP_SET_DISCOVERABLE, hdev);
1397 		if (err < 0)
1398 			goto failed;
1399 
1400 		if (changed)
1401 			err = new_settings(hdev, sk);
1402 
1403 		goto failed;
1404 	}
1405 
1406 	/* If the current mode is the same, then just update the timeout
1407 	 * value with the new value. And if only the timeout gets updated,
1408 	 * then no need for any HCI transactions.
1409 	 */
1410 	if (!!cp->val == hci_dev_test_flag(hdev, HCI_DISCOVERABLE) &&
1411 	    (cp->val == 0x02) == hci_dev_test_flag(hdev,
1412 						   HCI_LIMITED_DISCOVERABLE)) {
1413 		cancel_delayed_work(&hdev->discov_off);
1414 		hdev->discov_timeout = timeout;
1415 
1416 		if (cp->val && hdev->discov_timeout > 0) {
1417 			int to = msecs_to_jiffies(hdev->discov_timeout * 1000);
1418 			queue_delayed_work(hdev->req_workqueue,
1419 					   &hdev->discov_off, to);
1420 		}
1421 
1422 		err = send_settings_rsp(sk, MGMT_OP_SET_DISCOVERABLE, hdev);
1423 		goto failed;
1424 	}
1425 
1426 	cmd = mgmt_pending_add(sk, MGMT_OP_SET_DISCOVERABLE, hdev, data, len);
1427 	if (!cmd) {
1428 		err = -ENOMEM;
1429 		goto failed;
1430 	}
1431 
1432 	/* Cancel any potential discoverable timeout that might be
1433 	 * still active and store new timeout value. The arming of
1434 	 * the timeout happens in the complete handler.
1435 	 */
1436 	cancel_delayed_work(&hdev->discov_off);
1437 	hdev->discov_timeout = timeout;
1438 
1439 	if (cp->val)
1440 		hci_dev_set_flag(hdev, HCI_DISCOVERABLE);
1441 	else
1442 		hci_dev_clear_flag(hdev, HCI_DISCOVERABLE);
1443 
1444 	/* Limited discoverable mode */
1445 	if (cp->val == 0x02)
1446 		hci_dev_set_flag(hdev, HCI_LIMITED_DISCOVERABLE);
1447 	else
1448 		hci_dev_clear_flag(hdev, HCI_LIMITED_DISCOVERABLE);
1449 
1450 	queue_work(hdev->req_workqueue, &hdev->discoverable_update);
1451 	err = 0;
1452 
1453 failed:
1454 	hci_dev_unlock(hdev);
1455 	return err;
1456 }
1457 
mgmt_set_connectable_complete(struct hci_dev * hdev,u8 status)1458 void mgmt_set_connectable_complete(struct hci_dev *hdev, u8 status)
1459 {
1460 	struct mgmt_pending_cmd *cmd;
1461 
1462 	BT_DBG("status 0x%02x", status);
1463 
1464 	hci_dev_lock(hdev);
1465 
1466 	cmd = pending_find(MGMT_OP_SET_CONNECTABLE, hdev);
1467 	if (!cmd)
1468 		goto unlock;
1469 
1470 	if (status) {
1471 		u8 mgmt_err = mgmt_status(status);
1472 		mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, mgmt_err);
1473 		goto remove_cmd;
1474 	}
1475 
1476 	send_settings_rsp(cmd->sk, MGMT_OP_SET_CONNECTABLE, hdev);
1477 	new_settings(hdev, cmd->sk);
1478 
1479 remove_cmd:
1480 	mgmt_pending_remove(cmd);
1481 
1482 unlock:
1483 	hci_dev_unlock(hdev);
1484 }
1485 
set_connectable_update_settings(struct hci_dev * hdev,struct sock * sk,u8 val)1486 static int set_connectable_update_settings(struct hci_dev *hdev,
1487 					   struct sock *sk, u8 val)
1488 {
1489 	bool changed = false;
1490 	int err;
1491 
1492 	if (!!val != hci_dev_test_flag(hdev, HCI_CONNECTABLE))
1493 		changed = true;
1494 
1495 	if (val) {
1496 		hci_dev_set_flag(hdev, HCI_CONNECTABLE);
1497 	} else {
1498 		hci_dev_clear_flag(hdev, HCI_CONNECTABLE);
1499 		hci_dev_clear_flag(hdev, HCI_DISCOVERABLE);
1500 	}
1501 
1502 	err = send_settings_rsp(sk, MGMT_OP_SET_CONNECTABLE, hdev);
1503 	if (err < 0)
1504 		return err;
1505 
1506 	if (changed) {
1507 		hci_req_update_scan(hdev);
1508 		hci_update_background_scan(hdev);
1509 		return new_settings(hdev, sk);
1510 	}
1511 
1512 	return 0;
1513 }
1514 
set_connectable(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)1515 static int set_connectable(struct sock *sk, struct hci_dev *hdev, void *data,
1516 			   u16 len)
1517 {
1518 	struct mgmt_mode *cp = data;
1519 	struct mgmt_pending_cmd *cmd;
1520 	int err;
1521 
1522 	BT_DBG("request for %s", hdev->name);
1523 
1524 	if (!hci_dev_test_flag(hdev, HCI_LE_ENABLED) &&
1525 	    !hci_dev_test_flag(hdev, HCI_BREDR_ENABLED))
1526 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE,
1527 				       MGMT_STATUS_REJECTED);
1528 
1529 	if (cp->val != 0x00 && cp->val != 0x01)
1530 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE,
1531 				       MGMT_STATUS_INVALID_PARAMS);
1532 
1533 	hci_dev_lock(hdev);
1534 
1535 	if (!hdev_is_powered(hdev)) {
1536 		err = set_connectable_update_settings(hdev, sk, cp->val);
1537 		goto failed;
1538 	}
1539 
1540 	if (pending_find(MGMT_OP_SET_DISCOVERABLE, hdev) ||
1541 	    pending_find(MGMT_OP_SET_CONNECTABLE, hdev)) {
1542 		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE,
1543 				      MGMT_STATUS_BUSY);
1544 		goto failed;
1545 	}
1546 
1547 	cmd = mgmt_pending_add(sk, MGMT_OP_SET_CONNECTABLE, hdev, data, len);
1548 	if (!cmd) {
1549 		err = -ENOMEM;
1550 		goto failed;
1551 	}
1552 
1553 	if (cp->val) {
1554 		hci_dev_set_flag(hdev, HCI_CONNECTABLE);
1555 	} else {
1556 		if (hdev->discov_timeout > 0)
1557 			cancel_delayed_work(&hdev->discov_off);
1558 
1559 		hci_dev_clear_flag(hdev, HCI_LIMITED_DISCOVERABLE);
1560 		hci_dev_clear_flag(hdev, HCI_DISCOVERABLE);
1561 		hci_dev_clear_flag(hdev, HCI_CONNECTABLE);
1562 	}
1563 
1564 	queue_work(hdev->req_workqueue, &hdev->connectable_update);
1565 	err = 0;
1566 
1567 failed:
1568 	hci_dev_unlock(hdev);
1569 	return err;
1570 }
1571 
set_bondable(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)1572 static int set_bondable(struct sock *sk, struct hci_dev *hdev, void *data,
1573 			u16 len)
1574 {
1575 	struct mgmt_mode *cp = data;
1576 	bool changed;
1577 	int err;
1578 
1579 	BT_DBG("request for %s", hdev->name);
1580 
1581 	if (cp->val != 0x00 && cp->val != 0x01)
1582 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BONDABLE,
1583 				       MGMT_STATUS_INVALID_PARAMS);
1584 
1585 	hci_dev_lock(hdev);
1586 
1587 	if (cp->val)
1588 		changed = !hci_dev_test_and_set_flag(hdev, HCI_BONDABLE);
1589 	else
1590 		changed = hci_dev_test_and_clear_flag(hdev, HCI_BONDABLE);
1591 
1592 	err = send_settings_rsp(sk, MGMT_OP_SET_BONDABLE, hdev);
1593 	if (err < 0)
1594 		goto unlock;
1595 
1596 	if (changed) {
1597 		/* In limited privacy mode the change of bondable mode
1598 		 * may affect the local advertising address.
1599 		 */
1600 		if (hdev_is_powered(hdev) &&
1601 		    hci_dev_test_flag(hdev, HCI_ADVERTISING) &&
1602 		    hci_dev_test_flag(hdev, HCI_DISCOVERABLE) &&
1603 		    hci_dev_test_flag(hdev, HCI_LIMITED_PRIVACY))
1604 			queue_work(hdev->req_workqueue,
1605 				   &hdev->discoverable_update);
1606 
1607 		err = new_settings(hdev, sk);
1608 	}
1609 
1610 unlock:
1611 	hci_dev_unlock(hdev);
1612 	return err;
1613 }
1614 
set_link_security(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)1615 static int set_link_security(struct sock *sk, struct hci_dev *hdev, void *data,
1616 			     u16 len)
1617 {
1618 	struct mgmt_mode *cp = data;
1619 	struct mgmt_pending_cmd *cmd;
1620 	u8 val, status;
1621 	int err;
1622 
1623 	BT_DBG("request for %s", hdev->name);
1624 
1625 	status = mgmt_bredr_support(hdev);
1626 	if (status)
1627 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY,
1628 				       status);
1629 
1630 	if (cp->val != 0x00 && cp->val != 0x01)
1631 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY,
1632 				       MGMT_STATUS_INVALID_PARAMS);
1633 
1634 	hci_dev_lock(hdev);
1635 
1636 	if (!hdev_is_powered(hdev)) {
1637 		bool changed = false;
1638 
1639 		if (!!cp->val != hci_dev_test_flag(hdev, HCI_LINK_SECURITY)) {
1640 			hci_dev_change_flag(hdev, HCI_LINK_SECURITY);
1641 			changed = true;
1642 		}
1643 
1644 		err = send_settings_rsp(sk, MGMT_OP_SET_LINK_SECURITY, hdev);
1645 		if (err < 0)
1646 			goto failed;
1647 
1648 		if (changed)
1649 			err = new_settings(hdev, sk);
1650 
1651 		goto failed;
1652 	}
1653 
1654 	if (pending_find(MGMT_OP_SET_LINK_SECURITY, hdev)) {
1655 		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY,
1656 				      MGMT_STATUS_BUSY);
1657 		goto failed;
1658 	}
1659 
1660 	val = !!cp->val;
1661 
1662 	if (test_bit(HCI_AUTH, &hdev->flags) == val) {
1663 		err = send_settings_rsp(sk, MGMT_OP_SET_LINK_SECURITY, hdev);
1664 		goto failed;
1665 	}
1666 
1667 	cmd = mgmt_pending_add(sk, MGMT_OP_SET_LINK_SECURITY, hdev, data, len);
1668 	if (!cmd) {
1669 		err = -ENOMEM;
1670 		goto failed;
1671 	}
1672 
1673 	err = hci_send_cmd(hdev, HCI_OP_WRITE_AUTH_ENABLE, sizeof(val), &val);
1674 	if (err < 0) {
1675 		mgmt_pending_remove(cmd);
1676 		goto failed;
1677 	}
1678 
1679 failed:
1680 	hci_dev_unlock(hdev);
1681 	return err;
1682 }
1683 
set_ssp(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)1684 static int set_ssp(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
1685 {
1686 	struct mgmt_mode *cp = data;
1687 	struct mgmt_pending_cmd *cmd;
1688 	u8 status;
1689 	int err;
1690 
1691 	BT_DBG("request for %s", hdev->name);
1692 
1693 	status = mgmt_bredr_support(hdev);
1694 	if (status)
1695 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SSP, status);
1696 
1697 	if (!lmp_ssp_capable(hdev))
1698 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SSP,
1699 				       MGMT_STATUS_NOT_SUPPORTED);
1700 
1701 	if (cp->val != 0x00 && cp->val != 0x01)
1702 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SSP,
1703 				       MGMT_STATUS_INVALID_PARAMS);
1704 
1705 	hci_dev_lock(hdev);
1706 
1707 	if (!hdev_is_powered(hdev)) {
1708 		bool changed;
1709 
1710 		if (cp->val) {
1711 			changed = !hci_dev_test_and_set_flag(hdev,
1712 							     HCI_SSP_ENABLED);
1713 		} else {
1714 			changed = hci_dev_test_and_clear_flag(hdev,
1715 							      HCI_SSP_ENABLED);
1716 			if (!changed)
1717 				changed = hci_dev_test_and_clear_flag(hdev,
1718 								      HCI_HS_ENABLED);
1719 			else
1720 				hci_dev_clear_flag(hdev, HCI_HS_ENABLED);
1721 		}
1722 
1723 		err = send_settings_rsp(sk, MGMT_OP_SET_SSP, hdev);
1724 		if (err < 0)
1725 			goto failed;
1726 
1727 		if (changed)
1728 			err = new_settings(hdev, sk);
1729 
1730 		goto failed;
1731 	}
1732 
1733 	if (pending_find(MGMT_OP_SET_SSP, hdev)) {
1734 		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SSP,
1735 				      MGMT_STATUS_BUSY);
1736 		goto failed;
1737 	}
1738 
1739 	if (!!cp->val == hci_dev_test_flag(hdev, HCI_SSP_ENABLED)) {
1740 		err = send_settings_rsp(sk, MGMT_OP_SET_SSP, hdev);
1741 		goto failed;
1742 	}
1743 
1744 	cmd = mgmt_pending_add(sk, MGMT_OP_SET_SSP, hdev, data, len);
1745 	if (!cmd) {
1746 		err = -ENOMEM;
1747 		goto failed;
1748 	}
1749 
1750 	if (!cp->val && hci_dev_test_flag(hdev, HCI_USE_DEBUG_KEYS))
1751 		hci_send_cmd(hdev, HCI_OP_WRITE_SSP_DEBUG_MODE,
1752 			     sizeof(cp->val), &cp->val);
1753 
1754 	err = hci_send_cmd(hdev, HCI_OP_WRITE_SSP_MODE, 1, &cp->val);
1755 	if (err < 0) {
1756 		mgmt_pending_remove(cmd);
1757 		goto failed;
1758 	}
1759 
1760 failed:
1761 	hci_dev_unlock(hdev);
1762 	return err;
1763 }
1764 
set_hs(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)1765 static int set_hs(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
1766 {
1767 	struct mgmt_mode *cp = data;
1768 	bool changed;
1769 	u8 status;
1770 	int err;
1771 
1772 	BT_DBG("request for %s", hdev->name);
1773 
1774 	status = mgmt_bredr_support(hdev);
1775 	if (status)
1776 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS, status);
1777 
1778 	if (!lmp_ssp_capable(hdev))
1779 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS,
1780 				       MGMT_STATUS_NOT_SUPPORTED);
1781 
1782 	if (!hci_dev_test_flag(hdev, HCI_SSP_ENABLED))
1783 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS,
1784 				       MGMT_STATUS_REJECTED);
1785 
1786 	if (cp->val != 0x00 && cp->val != 0x01)
1787 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS,
1788 				       MGMT_STATUS_INVALID_PARAMS);
1789 
1790 	hci_dev_lock(hdev);
1791 
1792 	if (pending_find(MGMT_OP_SET_SSP, hdev)) {
1793 		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS,
1794 				      MGMT_STATUS_BUSY);
1795 		goto unlock;
1796 	}
1797 
1798 	if (cp->val) {
1799 		changed = !hci_dev_test_and_set_flag(hdev, HCI_HS_ENABLED);
1800 	} else {
1801 		if (hdev_is_powered(hdev)) {
1802 			err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_HS,
1803 					      MGMT_STATUS_REJECTED);
1804 			goto unlock;
1805 		}
1806 
1807 		changed = hci_dev_test_and_clear_flag(hdev, HCI_HS_ENABLED);
1808 	}
1809 
1810 	err = send_settings_rsp(sk, MGMT_OP_SET_HS, hdev);
1811 	if (err < 0)
1812 		goto unlock;
1813 
1814 	if (changed)
1815 		err = new_settings(hdev, sk);
1816 
1817 unlock:
1818 	hci_dev_unlock(hdev);
1819 	return err;
1820 }
1821 
le_enable_complete(struct hci_dev * hdev,u8 status,u16 opcode)1822 static void le_enable_complete(struct hci_dev *hdev, u8 status, u16 opcode)
1823 {
1824 	struct cmd_lookup match = { NULL, hdev };
1825 
1826 	hci_dev_lock(hdev);
1827 
1828 	if (status) {
1829 		u8 mgmt_err = mgmt_status(status);
1830 
1831 		mgmt_pending_foreach(MGMT_OP_SET_LE, hdev, cmd_status_rsp,
1832 				     &mgmt_err);
1833 		goto unlock;
1834 	}
1835 
1836 	mgmt_pending_foreach(MGMT_OP_SET_LE, hdev, settings_rsp, &match);
1837 
1838 	new_settings(hdev, match.sk);
1839 
1840 	if (match.sk)
1841 		sock_put(match.sk);
1842 
1843 	/* Make sure the controller has a good default for
1844 	 * advertising data. Restrict the update to when LE
1845 	 * has actually been enabled. During power on, the
1846 	 * update in powered_update_hci will take care of it.
1847 	 */
1848 	if (hci_dev_test_flag(hdev, HCI_LE_ENABLED)) {
1849 		struct hci_request req;
1850 		hci_req_init(&req, hdev);
1851 		if (ext_adv_capable(hdev)) {
1852 			int err;
1853 
1854 			err = __hci_req_setup_ext_adv_instance(&req, 0x00);
1855 			if (!err)
1856 				__hci_req_update_scan_rsp_data(&req, 0x00);
1857 		} else {
1858 			__hci_req_update_adv_data(&req, 0x00);
1859 			__hci_req_update_scan_rsp_data(&req, 0x00);
1860 		}
1861 		hci_req_run(&req, NULL);
1862 		hci_update_background_scan(hdev);
1863 	}
1864 
1865 unlock:
1866 	hci_dev_unlock(hdev);
1867 }
1868 
set_le(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)1869 static int set_le(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
1870 {
1871 	struct mgmt_mode *cp = data;
1872 	struct hci_cp_write_le_host_supported hci_cp;
1873 	struct mgmt_pending_cmd *cmd;
1874 	struct hci_request req;
1875 	int err;
1876 	u8 val, enabled;
1877 
1878 	BT_DBG("request for %s", hdev->name);
1879 
1880 	if (!lmp_le_capable(hdev))
1881 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
1882 				       MGMT_STATUS_NOT_SUPPORTED);
1883 
1884 	if (cp->val != 0x00 && cp->val != 0x01)
1885 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
1886 				       MGMT_STATUS_INVALID_PARAMS);
1887 
1888 	/* Bluetooth single mode LE only controllers or dual-mode
1889 	 * controllers configured as LE only devices, do not allow
1890 	 * switching LE off. These have either LE enabled explicitly
1891 	 * or BR/EDR has been previously switched off.
1892 	 *
1893 	 * When trying to enable an already enabled LE, then gracefully
1894 	 * send a positive response. Trying to disable it however will
1895 	 * result into rejection.
1896 	 */
1897 	if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) {
1898 		if (cp->val == 0x01)
1899 			return send_settings_rsp(sk, MGMT_OP_SET_LE, hdev);
1900 
1901 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
1902 				       MGMT_STATUS_REJECTED);
1903 	}
1904 
1905 	hci_dev_lock(hdev);
1906 
1907 	val = !!cp->val;
1908 	enabled = lmp_host_le_capable(hdev);
1909 
1910 	if (!val)
1911 		hci_req_clear_adv_instance(hdev, NULL, NULL, 0x00, true);
1912 
1913 	if (!hdev_is_powered(hdev) || val == enabled) {
1914 		bool changed = false;
1915 
1916 		if (val != hci_dev_test_flag(hdev, HCI_LE_ENABLED)) {
1917 			hci_dev_change_flag(hdev, HCI_LE_ENABLED);
1918 			changed = true;
1919 		}
1920 
1921 		if (!val && hci_dev_test_flag(hdev, HCI_ADVERTISING)) {
1922 			hci_dev_clear_flag(hdev, HCI_ADVERTISING);
1923 			changed = true;
1924 		}
1925 
1926 		err = send_settings_rsp(sk, MGMT_OP_SET_LE, hdev);
1927 		if (err < 0)
1928 			goto unlock;
1929 
1930 		if (changed)
1931 			err = new_settings(hdev, sk);
1932 
1933 		goto unlock;
1934 	}
1935 
1936 	if (pending_find(MGMT_OP_SET_LE, hdev) ||
1937 	    pending_find(MGMT_OP_SET_ADVERTISING, hdev)) {
1938 		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
1939 				      MGMT_STATUS_BUSY);
1940 		goto unlock;
1941 	}
1942 
1943 	cmd = mgmt_pending_add(sk, MGMT_OP_SET_LE, hdev, data, len);
1944 	if (!cmd) {
1945 		err = -ENOMEM;
1946 		goto unlock;
1947 	}
1948 
1949 	hci_req_init(&req, hdev);
1950 
1951 	memset(&hci_cp, 0, sizeof(hci_cp));
1952 
1953 	if (val) {
1954 		hci_cp.le = val;
1955 		hci_cp.simul = 0x00;
1956 	} else {
1957 		if (hci_dev_test_flag(hdev, HCI_LE_ADV))
1958 			__hci_req_disable_advertising(&req);
1959 
1960 		if (ext_adv_capable(hdev))
1961 			__hci_req_clear_ext_adv_sets(&req);
1962 	}
1963 
1964 	hci_req_add(&req, HCI_OP_WRITE_LE_HOST_SUPPORTED, sizeof(hci_cp),
1965 		    &hci_cp);
1966 
1967 	err = hci_req_run(&req, le_enable_complete);
1968 	if (err < 0)
1969 		mgmt_pending_remove(cmd);
1970 
1971 unlock:
1972 	hci_dev_unlock(hdev);
1973 	return err;
1974 }
1975 
1976 /* This is a helper function to test for pending mgmt commands that can
1977  * cause CoD or EIR HCI commands. We can only allow one such pending
1978  * mgmt command at a time since otherwise we cannot easily track what
1979  * the current values are, will be, and based on that calculate if a new
1980  * HCI command needs to be sent and if yes with what value.
1981  */
pending_eir_or_class(struct hci_dev * hdev)1982 static bool pending_eir_or_class(struct hci_dev *hdev)
1983 {
1984 	struct mgmt_pending_cmd *cmd;
1985 
1986 	list_for_each_entry(cmd, &hdev->mgmt_pending, list) {
1987 		switch (cmd->opcode) {
1988 		case MGMT_OP_ADD_UUID:
1989 		case MGMT_OP_REMOVE_UUID:
1990 		case MGMT_OP_SET_DEV_CLASS:
1991 		case MGMT_OP_SET_POWERED:
1992 			return true;
1993 		}
1994 	}
1995 
1996 	return false;
1997 }
1998 
1999 static const u8 bluetooth_base_uuid[] = {
2000 			0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80,
2001 			0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2002 };
2003 
get_uuid_size(const u8 * uuid)2004 static u8 get_uuid_size(const u8 *uuid)
2005 {
2006 	u32 val;
2007 
2008 	if (memcmp(uuid, bluetooth_base_uuid, 12))
2009 		return 128;
2010 
2011 	val = get_unaligned_le32(&uuid[12]);
2012 	if (val > 0xffff)
2013 		return 32;
2014 
2015 	return 16;
2016 }
2017 
mgmt_class_complete(struct hci_dev * hdev,u16 mgmt_op,u8 status)2018 static void mgmt_class_complete(struct hci_dev *hdev, u16 mgmt_op, u8 status)
2019 {
2020 	struct mgmt_pending_cmd *cmd;
2021 
2022 	hci_dev_lock(hdev);
2023 
2024 	cmd = pending_find(mgmt_op, hdev);
2025 	if (!cmd)
2026 		goto unlock;
2027 
2028 	mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode,
2029 			  mgmt_status(status), hdev->dev_class, 3);
2030 
2031 	mgmt_pending_remove(cmd);
2032 
2033 unlock:
2034 	hci_dev_unlock(hdev);
2035 }
2036 
add_uuid_complete(struct hci_dev * hdev,u8 status,u16 opcode)2037 static void add_uuid_complete(struct hci_dev *hdev, u8 status, u16 opcode)
2038 {
2039 	BT_DBG("status 0x%02x", status);
2040 
2041 	mgmt_class_complete(hdev, MGMT_OP_ADD_UUID, status);
2042 }
2043 
add_uuid(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)2044 static int add_uuid(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
2045 {
2046 	struct mgmt_cp_add_uuid *cp = data;
2047 	struct mgmt_pending_cmd *cmd;
2048 	struct hci_request req;
2049 	struct bt_uuid *uuid;
2050 	int err;
2051 
2052 	BT_DBG("request for %s", hdev->name);
2053 
2054 	hci_dev_lock(hdev);
2055 
2056 	if (pending_eir_or_class(hdev)) {
2057 		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_UUID,
2058 				      MGMT_STATUS_BUSY);
2059 		goto failed;
2060 	}
2061 
2062 	uuid = kmalloc(sizeof(*uuid), GFP_KERNEL);
2063 	if (!uuid) {
2064 		err = -ENOMEM;
2065 		goto failed;
2066 	}
2067 
2068 	memcpy(uuid->uuid, cp->uuid, 16);
2069 	uuid->svc_hint = cp->svc_hint;
2070 	uuid->size = get_uuid_size(cp->uuid);
2071 
2072 	list_add_tail(&uuid->list, &hdev->uuids);
2073 
2074 	hci_req_init(&req, hdev);
2075 
2076 	__hci_req_update_class(&req);
2077 	__hci_req_update_eir(&req);
2078 
2079 	err = hci_req_run(&req, add_uuid_complete);
2080 	if (err < 0) {
2081 		if (err != -ENODATA)
2082 			goto failed;
2083 
2084 		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_UUID, 0,
2085 					hdev->dev_class, 3);
2086 		goto failed;
2087 	}
2088 
2089 	cmd = mgmt_pending_add(sk, MGMT_OP_ADD_UUID, hdev, data, len);
2090 	if (!cmd) {
2091 		err = -ENOMEM;
2092 		goto failed;
2093 	}
2094 
2095 	err = 0;
2096 
2097 failed:
2098 	hci_dev_unlock(hdev);
2099 	return err;
2100 }
2101 
enable_service_cache(struct hci_dev * hdev)2102 static bool enable_service_cache(struct hci_dev *hdev)
2103 {
2104 	if (!hdev_is_powered(hdev))
2105 		return false;
2106 
2107 	if (!hci_dev_test_and_set_flag(hdev, HCI_SERVICE_CACHE)) {
2108 		queue_delayed_work(hdev->workqueue, &hdev->service_cache,
2109 				   CACHE_TIMEOUT);
2110 		return true;
2111 	}
2112 
2113 	return false;
2114 }
2115 
remove_uuid_complete(struct hci_dev * hdev,u8 status,u16 opcode)2116 static void remove_uuid_complete(struct hci_dev *hdev, u8 status, u16 opcode)
2117 {
2118 	BT_DBG("status 0x%02x", status);
2119 
2120 	mgmt_class_complete(hdev, MGMT_OP_REMOVE_UUID, status);
2121 }
2122 
remove_uuid(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)2123 static int remove_uuid(struct sock *sk, struct hci_dev *hdev, void *data,
2124 		       u16 len)
2125 {
2126 	struct mgmt_cp_remove_uuid *cp = data;
2127 	struct mgmt_pending_cmd *cmd;
2128 	struct bt_uuid *match, *tmp;
2129 	u8 bt_uuid_any[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
2130 	struct hci_request req;
2131 	int err, found;
2132 
2133 	BT_DBG("request for %s", hdev->name);
2134 
2135 	hci_dev_lock(hdev);
2136 
2137 	if (pending_eir_or_class(hdev)) {
2138 		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_REMOVE_UUID,
2139 				      MGMT_STATUS_BUSY);
2140 		goto unlock;
2141 	}
2142 
2143 	if (memcmp(cp->uuid, bt_uuid_any, 16) == 0) {
2144 		hci_uuids_clear(hdev);
2145 
2146 		if (enable_service_cache(hdev)) {
2147 			err = mgmt_cmd_complete(sk, hdev->id,
2148 						MGMT_OP_REMOVE_UUID,
2149 						0, hdev->dev_class, 3);
2150 			goto unlock;
2151 		}
2152 
2153 		goto update_class;
2154 	}
2155 
2156 	found = 0;
2157 
2158 	list_for_each_entry_safe(match, tmp, &hdev->uuids, list) {
2159 		if (memcmp(match->uuid, cp->uuid, 16) != 0)
2160 			continue;
2161 
2162 		list_del(&match->list);
2163 		kfree(match);
2164 		found++;
2165 	}
2166 
2167 	if (found == 0) {
2168 		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_REMOVE_UUID,
2169 				      MGMT_STATUS_INVALID_PARAMS);
2170 		goto unlock;
2171 	}
2172 
2173 update_class:
2174 	hci_req_init(&req, hdev);
2175 
2176 	__hci_req_update_class(&req);
2177 	__hci_req_update_eir(&req);
2178 
2179 	err = hci_req_run(&req, remove_uuid_complete);
2180 	if (err < 0) {
2181 		if (err != -ENODATA)
2182 			goto unlock;
2183 
2184 		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_UUID, 0,
2185 					hdev->dev_class, 3);
2186 		goto unlock;
2187 	}
2188 
2189 	cmd = mgmt_pending_add(sk, MGMT_OP_REMOVE_UUID, hdev, data, len);
2190 	if (!cmd) {
2191 		err = -ENOMEM;
2192 		goto unlock;
2193 	}
2194 
2195 	err = 0;
2196 
2197 unlock:
2198 	hci_dev_unlock(hdev);
2199 	return err;
2200 }
2201 
set_class_complete(struct hci_dev * hdev,u8 status,u16 opcode)2202 static void set_class_complete(struct hci_dev *hdev, u8 status, u16 opcode)
2203 {
2204 	BT_DBG("status 0x%02x", status);
2205 
2206 	mgmt_class_complete(hdev, MGMT_OP_SET_DEV_CLASS, status);
2207 }
2208 
set_dev_class(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)2209 static int set_dev_class(struct sock *sk, struct hci_dev *hdev, void *data,
2210 			 u16 len)
2211 {
2212 	struct mgmt_cp_set_dev_class *cp = data;
2213 	struct mgmt_pending_cmd *cmd;
2214 	struct hci_request req;
2215 	int err;
2216 
2217 	BT_DBG("request for %s", hdev->name);
2218 
2219 	if (!lmp_bredr_capable(hdev))
2220 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS,
2221 				       MGMT_STATUS_NOT_SUPPORTED);
2222 
2223 	hci_dev_lock(hdev);
2224 
2225 	if (pending_eir_or_class(hdev)) {
2226 		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS,
2227 				      MGMT_STATUS_BUSY);
2228 		goto unlock;
2229 	}
2230 
2231 	if ((cp->minor & 0x03) != 0 || (cp->major & 0xe0) != 0) {
2232 		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS,
2233 				      MGMT_STATUS_INVALID_PARAMS);
2234 		goto unlock;
2235 	}
2236 
2237 	hdev->major_class = cp->major;
2238 	hdev->minor_class = cp->minor;
2239 
2240 	if (!hdev_is_powered(hdev)) {
2241 		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, 0,
2242 					hdev->dev_class, 3);
2243 		goto unlock;
2244 	}
2245 
2246 	hci_req_init(&req, hdev);
2247 
2248 	if (hci_dev_test_and_clear_flag(hdev, HCI_SERVICE_CACHE)) {
2249 		hci_dev_unlock(hdev);
2250 		cancel_delayed_work_sync(&hdev->service_cache);
2251 		hci_dev_lock(hdev);
2252 		__hci_req_update_eir(&req);
2253 	}
2254 
2255 	__hci_req_update_class(&req);
2256 
2257 	err = hci_req_run(&req, set_class_complete);
2258 	if (err < 0) {
2259 		if (err != -ENODATA)
2260 			goto unlock;
2261 
2262 		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, 0,
2263 					hdev->dev_class, 3);
2264 		goto unlock;
2265 	}
2266 
2267 	cmd = mgmt_pending_add(sk, MGMT_OP_SET_DEV_CLASS, hdev, data, len);
2268 	if (!cmd) {
2269 		err = -ENOMEM;
2270 		goto unlock;
2271 	}
2272 
2273 	err = 0;
2274 
2275 unlock:
2276 	hci_dev_unlock(hdev);
2277 	return err;
2278 }
2279 
load_link_keys(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)2280 static int load_link_keys(struct sock *sk, struct hci_dev *hdev, void *data,
2281 			  u16 len)
2282 {
2283 	struct mgmt_cp_load_link_keys *cp = data;
2284 	const u16 max_key_count = ((U16_MAX - sizeof(*cp)) /
2285 				   sizeof(struct mgmt_link_key_info));
2286 	u16 key_count, expected_len;
2287 	bool changed;
2288 	int i;
2289 
2290 	BT_DBG("request for %s", hdev->name);
2291 
2292 	if (!lmp_bredr_capable(hdev))
2293 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS,
2294 				       MGMT_STATUS_NOT_SUPPORTED);
2295 
2296 	key_count = __le16_to_cpu(cp->key_count);
2297 	if (key_count > max_key_count) {
2298 		bt_dev_err(hdev, "load_link_keys: too big key_count value %u",
2299 			   key_count);
2300 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS,
2301 				       MGMT_STATUS_INVALID_PARAMS);
2302 	}
2303 
2304 	expected_len = struct_size(cp, keys, key_count);
2305 	if (expected_len != len) {
2306 		bt_dev_err(hdev, "load_link_keys: expected %u bytes, got %u bytes",
2307 			   expected_len, len);
2308 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS,
2309 				       MGMT_STATUS_INVALID_PARAMS);
2310 	}
2311 
2312 	if (cp->debug_keys != 0x00 && cp->debug_keys != 0x01)
2313 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS,
2314 				       MGMT_STATUS_INVALID_PARAMS);
2315 
2316 	BT_DBG("%s debug_keys %u key_count %u", hdev->name, cp->debug_keys,
2317 	       key_count);
2318 
2319 	for (i = 0; i < key_count; i++) {
2320 		struct mgmt_link_key_info *key = &cp->keys[i];
2321 
2322 		if (key->addr.type != BDADDR_BREDR || key->type > 0x08)
2323 			return mgmt_cmd_status(sk, hdev->id,
2324 					       MGMT_OP_LOAD_LINK_KEYS,
2325 					       MGMT_STATUS_INVALID_PARAMS);
2326 	}
2327 
2328 	hci_dev_lock(hdev);
2329 
2330 	hci_link_keys_clear(hdev);
2331 
2332 	if (cp->debug_keys)
2333 		changed = !hci_dev_test_and_set_flag(hdev, HCI_KEEP_DEBUG_KEYS);
2334 	else
2335 		changed = hci_dev_test_and_clear_flag(hdev,
2336 						      HCI_KEEP_DEBUG_KEYS);
2337 
2338 	if (changed)
2339 		new_settings(hdev, NULL);
2340 
2341 	for (i = 0; i < key_count; i++) {
2342 		struct mgmt_link_key_info *key = &cp->keys[i];
2343 
2344 		/* Always ignore debug keys and require a new pairing if
2345 		 * the user wants to use them.
2346 		 */
2347 		if (key->type == HCI_LK_DEBUG_COMBINATION)
2348 			continue;
2349 
2350 		hci_add_link_key(hdev, NULL, &key->addr.bdaddr, key->val,
2351 				 key->type, key->pin_len, NULL);
2352 	}
2353 
2354 	mgmt_cmd_complete(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS, 0, NULL, 0);
2355 
2356 	hci_dev_unlock(hdev);
2357 
2358 	return 0;
2359 }
2360 
device_unpaired(struct hci_dev * hdev,bdaddr_t * bdaddr,u8 addr_type,struct sock * skip_sk)2361 static int device_unpaired(struct hci_dev *hdev, bdaddr_t *bdaddr,
2362 			   u8 addr_type, struct sock *skip_sk)
2363 {
2364 	struct mgmt_ev_device_unpaired ev;
2365 
2366 	bacpy(&ev.addr.bdaddr, bdaddr);
2367 	ev.addr.type = addr_type;
2368 
2369 	return mgmt_event(MGMT_EV_DEVICE_UNPAIRED, hdev, &ev, sizeof(ev),
2370 			  skip_sk);
2371 }
2372 
unpair_device(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)2373 static int unpair_device(struct sock *sk, struct hci_dev *hdev, void *data,
2374 			 u16 len)
2375 {
2376 	struct mgmt_cp_unpair_device *cp = data;
2377 	struct mgmt_rp_unpair_device rp;
2378 	struct hci_conn_params *params;
2379 	struct mgmt_pending_cmd *cmd;
2380 	struct hci_conn *conn;
2381 	u8 addr_type;
2382 	int err;
2383 
2384 	memset(&rp, 0, sizeof(rp));
2385 	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
2386 	rp.addr.type = cp->addr.type;
2387 
2388 	if (!bdaddr_type_is_valid(cp->addr.type))
2389 		return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
2390 					 MGMT_STATUS_INVALID_PARAMS,
2391 					 &rp, sizeof(rp));
2392 
2393 	if (cp->disconnect != 0x00 && cp->disconnect != 0x01)
2394 		return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
2395 					 MGMT_STATUS_INVALID_PARAMS,
2396 					 &rp, sizeof(rp));
2397 
2398 	hci_dev_lock(hdev);
2399 
2400 	if (!hdev_is_powered(hdev)) {
2401 		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
2402 					MGMT_STATUS_NOT_POWERED, &rp,
2403 					sizeof(rp));
2404 		goto unlock;
2405 	}
2406 
2407 	if (cp->addr.type == BDADDR_BREDR) {
2408 		/* If disconnection is requested, then look up the
2409 		 * connection. If the remote device is connected, it
2410 		 * will be later used to terminate the link.
2411 		 *
2412 		 * Setting it to NULL explicitly will cause no
2413 		 * termination of the link.
2414 		 */
2415 		if (cp->disconnect)
2416 			conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK,
2417 						       &cp->addr.bdaddr);
2418 		else
2419 			conn = NULL;
2420 
2421 		err = hci_remove_link_key(hdev, &cp->addr.bdaddr);
2422 		if (err < 0) {
2423 			err = mgmt_cmd_complete(sk, hdev->id,
2424 						MGMT_OP_UNPAIR_DEVICE,
2425 						MGMT_STATUS_NOT_PAIRED, &rp,
2426 						sizeof(rp));
2427 			goto unlock;
2428 		}
2429 
2430 		goto done;
2431 	}
2432 
2433 	/* LE address type */
2434 	addr_type = le_addr_type(cp->addr.type);
2435 
2436 	/* Abort any ongoing SMP pairing. Removes ltk and irk if they exist. */
2437 	err = smp_cancel_and_remove_pairing(hdev, &cp->addr.bdaddr, addr_type);
2438 	if (err < 0) {
2439 		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
2440 					MGMT_STATUS_NOT_PAIRED, &rp,
2441 					sizeof(rp));
2442 		goto unlock;
2443 	}
2444 
2445 	conn = hci_conn_hash_lookup_le(hdev, &cp->addr.bdaddr, addr_type);
2446 	if (!conn) {
2447 		hci_conn_params_del(hdev, &cp->addr.bdaddr, addr_type);
2448 		goto done;
2449 	}
2450 
2451 
2452 	/* Defer clearing up the connection parameters until closing to
2453 	 * give a chance of keeping them if a repairing happens.
2454 	 */
2455 	set_bit(HCI_CONN_PARAM_REMOVAL_PEND, &conn->flags);
2456 
2457 	/* Disable auto-connection parameters if present */
2458 	params = hci_conn_params_lookup(hdev, &cp->addr.bdaddr, addr_type);
2459 	if (params) {
2460 		if (params->explicit_connect)
2461 			params->auto_connect = HCI_AUTO_CONN_EXPLICIT;
2462 		else
2463 			params->auto_connect = HCI_AUTO_CONN_DISABLED;
2464 	}
2465 
2466 	/* If disconnection is not requested, then clear the connection
2467 	 * variable so that the link is not terminated.
2468 	 */
2469 	if (!cp->disconnect)
2470 		conn = NULL;
2471 
2472 done:
2473 	/* If the connection variable is set, then termination of the
2474 	 * link is requested.
2475 	 */
2476 	if (!conn) {
2477 		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE, 0,
2478 					&rp, sizeof(rp));
2479 		device_unpaired(hdev, &cp->addr.bdaddr, cp->addr.type, sk);
2480 		goto unlock;
2481 	}
2482 
2483 	cmd = mgmt_pending_add(sk, MGMT_OP_UNPAIR_DEVICE, hdev, cp,
2484 			       sizeof(*cp));
2485 	if (!cmd) {
2486 		err = -ENOMEM;
2487 		goto unlock;
2488 	}
2489 
2490 	cmd->cmd_complete = addr_cmd_complete;
2491 
2492 	err = hci_abort_conn(conn, HCI_ERROR_REMOTE_USER_TERM);
2493 	if (err < 0)
2494 		mgmt_pending_remove(cmd);
2495 
2496 unlock:
2497 	hci_dev_unlock(hdev);
2498 	return err;
2499 }
2500 
disconnect(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)2501 static int disconnect(struct sock *sk, struct hci_dev *hdev, void *data,
2502 		      u16 len)
2503 {
2504 	struct mgmt_cp_disconnect *cp = data;
2505 	struct mgmt_rp_disconnect rp;
2506 	struct mgmt_pending_cmd *cmd;
2507 	struct hci_conn *conn;
2508 	int err;
2509 
2510 	BT_DBG("");
2511 
2512 	memset(&rp, 0, sizeof(rp));
2513 	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
2514 	rp.addr.type = cp->addr.type;
2515 
2516 	if (!bdaddr_type_is_valid(cp->addr.type))
2517 		return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
2518 					 MGMT_STATUS_INVALID_PARAMS,
2519 					 &rp, sizeof(rp));
2520 
2521 	hci_dev_lock(hdev);
2522 
2523 	if (!test_bit(HCI_UP, &hdev->flags)) {
2524 		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
2525 					MGMT_STATUS_NOT_POWERED, &rp,
2526 					sizeof(rp));
2527 		goto failed;
2528 	}
2529 
2530 	if (pending_find(MGMT_OP_DISCONNECT, hdev)) {
2531 		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
2532 					MGMT_STATUS_BUSY, &rp, sizeof(rp));
2533 		goto failed;
2534 	}
2535 
2536 	if (cp->addr.type == BDADDR_BREDR)
2537 		conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK,
2538 					       &cp->addr.bdaddr);
2539 	else
2540 		conn = hci_conn_hash_lookup_le(hdev, &cp->addr.bdaddr,
2541 					       le_addr_type(cp->addr.type));
2542 
2543 	if (!conn || conn->state == BT_OPEN || conn->state == BT_CLOSED) {
2544 		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
2545 					MGMT_STATUS_NOT_CONNECTED, &rp,
2546 					sizeof(rp));
2547 		goto failed;
2548 	}
2549 
2550 	cmd = mgmt_pending_add(sk, MGMT_OP_DISCONNECT, hdev, data, len);
2551 	if (!cmd) {
2552 		err = -ENOMEM;
2553 		goto failed;
2554 	}
2555 
2556 	cmd->cmd_complete = generic_cmd_complete;
2557 
2558 	err = hci_disconnect(conn, HCI_ERROR_REMOTE_USER_TERM);
2559 	if (err < 0)
2560 		mgmt_pending_remove(cmd);
2561 
2562 failed:
2563 	hci_dev_unlock(hdev);
2564 	return err;
2565 }
2566 
link_to_bdaddr(u8 link_type,u8 addr_type)2567 static u8 link_to_bdaddr(u8 link_type, u8 addr_type)
2568 {
2569 	switch (link_type) {
2570 	case LE_LINK:
2571 		switch (addr_type) {
2572 		case ADDR_LE_DEV_PUBLIC:
2573 			return BDADDR_LE_PUBLIC;
2574 
2575 		default:
2576 			/* Fallback to LE Random address type */
2577 			return BDADDR_LE_RANDOM;
2578 		}
2579 
2580 	default:
2581 		/* Fallback to BR/EDR type */
2582 		return BDADDR_BREDR;
2583 	}
2584 }
2585 
get_connections(struct sock * sk,struct hci_dev * hdev,void * data,u16 data_len)2586 static int get_connections(struct sock *sk, struct hci_dev *hdev, void *data,
2587 			   u16 data_len)
2588 {
2589 	struct mgmt_rp_get_connections *rp;
2590 	struct hci_conn *c;
2591 	int err;
2592 	u16 i;
2593 
2594 	BT_DBG("");
2595 
2596 	hci_dev_lock(hdev);
2597 
2598 	if (!hdev_is_powered(hdev)) {
2599 		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_GET_CONNECTIONS,
2600 				      MGMT_STATUS_NOT_POWERED);
2601 		goto unlock;
2602 	}
2603 
2604 	i = 0;
2605 	list_for_each_entry(c, &hdev->conn_hash.list, list) {
2606 		if (test_bit(HCI_CONN_MGMT_CONNECTED, &c->flags))
2607 			i++;
2608 	}
2609 
2610 	rp = kmalloc(struct_size(rp, addr, i), GFP_KERNEL);
2611 	if (!rp) {
2612 		err = -ENOMEM;
2613 		goto unlock;
2614 	}
2615 
2616 	i = 0;
2617 	list_for_each_entry(c, &hdev->conn_hash.list, list) {
2618 		if (!test_bit(HCI_CONN_MGMT_CONNECTED, &c->flags))
2619 			continue;
2620 		bacpy(&rp->addr[i].bdaddr, &c->dst);
2621 		rp->addr[i].type = link_to_bdaddr(c->type, c->dst_type);
2622 		if (c->type == SCO_LINK || c->type == ESCO_LINK)
2623 			continue;
2624 		i++;
2625 	}
2626 
2627 	rp->conn_count = cpu_to_le16(i);
2628 
2629 	/* Recalculate length in case of filtered SCO connections, etc */
2630 	err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONNECTIONS, 0, rp,
2631 				struct_size(rp, addr, i));
2632 
2633 	kfree(rp);
2634 
2635 unlock:
2636 	hci_dev_unlock(hdev);
2637 	return err;
2638 }
2639 
send_pin_code_neg_reply(struct sock * sk,struct hci_dev * hdev,struct mgmt_cp_pin_code_neg_reply * cp)2640 static int send_pin_code_neg_reply(struct sock *sk, struct hci_dev *hdev,
2641 				   struct mgmt_cp_pin_code_neg_reply *cp)
2642 {
2643 	struct mgmt_pending_cmd *cmd;
2644 	int err;
2645 
2646 	cmd = mgmt_pending_add(sk, MGMT_OP_PIN_CODE_NEG_REPLY, hdev, cp,
2647 			       sizeof(*cp));
2648 	if (!cmd)
2649 		return -ENOMEM;
2650 
2651 	cmd->cmd_complete = addr_cmd_complete;
2652 
2653 	err = hci_send_cmd(hdev, HCI_OP_PIN_CODE_NEG_REPLY,
2654 			   sizeof(cp->addr.bdaddr), &cp->addr.bdaddr);
2655 	if (err < 0)
2656 		mgmt_pending_remove(cmd);
2657 
2658 	return err;
2659 }
2660 
pin_code_reply(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)2661 static int pin_code_reply(struct sock *sk, struct hci_dev *hdev, void *data,
2662 			  u16 len)
2663 {
2664 	struct hci_conn *conn;
2665 	struct mgmt_cp_pin_code_reply *cp = data;
2666 	struct hci_cp_pin_code_reply reply;
2667 	struct mgmt_pending_cmd *cmd;
2668 	int err;
2669 
2670 	BT_DBG("");
2671 
2672 	hci_dev_lock(hdev);
2673 
2674 	if (!hdev_is_powered(hdev)) {
2675 		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
2676 				      MGMT_STATUS_NOT_POWERED);
2677 		goto failed;
2678 	}
2679 
2680 	conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->addr.bdaddr);
2681 	if (!conn) {
2682 		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
2683 				      MGMT_STATUS_NOT_CONNECTED);
2684 		goto failed;
2685 	}
2686 
2687 	if (conn->pending_sec_level == BT_SECURITY_HIGH && cp->pin_len != 16) {
2688 		struct mgmt_cp_pin_code_neg_reply ncp;
2689 
2690 		memcpy(&ncp.addr, &cp->addr, sizeof(ncp.addr));
2691 
2692 		bt_dev_err(hdev, "PIN code is not 16 bytes long");
2693 
2694 		err = send_pin_code_neg_reply(sk, hdev, &ncp);
2695 		if (err >= 0)
2696 			err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
2697 					      MGMT_STATUS_INVALID_PARAMS);
2698 
2699 		goto failed;
2700 	}
2701 
2702 	cmd = mgmt_pending_add(sk, MGMT_OP_PIN_CODE_REPLY, hdev, data, len);
2703 	if (!cmd) {
2704 		err = -ENOMEM;
2705 		goto failed;
2706 	}
2707 
2708 	cmd->cmd_complete = addr_cmd_complete;
2709 
2710 	bacpy(&reply.bdaddr, &cp->addr.bdaddr);
2711 	reply.pin_len = cp->pin_len;
2712 	memcpy(reply.pin_code, cp->pin_code, sizeof(reply.pin_code));
2713 
2714 	err = hci_send_cmd(hdev, HCI_OP_PIN_CODE_REPLY, sizeof(reply), &reply);
2715 	if (err < 0)
2716 		mgmt_pending_remove(cmd);
2717 
2718 failed:
2719 	hci_dev_unlock(hdev);
2720 	return err;
2721 }
2722 
set_io_capability(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)2723 static int set_io_capability(struct sock *sk, struct hci_dev *hdev, void *data,
2724 			     u16 len)
2725 {
2726 	struct mgmt_cp_set_io_capability *cp = data;
2727 
2728 	BT_DBG("");
2729 
2730 	if (cp->io_capability > SMP_IO_KEYBOARD_DISPLAY)
2731 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_IO_CAPABILITY,
2732 				       MGMT_STATUS_INVALID_PARAMS);
2733 
2734 	hci_dev_lock(hdev);
2735 
2736 	hdev->io_capability = cp->io_capability;
2737 
2738 	BT_DBG("%s IO capability set to 0x%02x", hdev->name,
2739 	       hdev->io_capability);
2740 
2741 	hci_dev_unlock(hdev);
2742 
2743 	return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_IO_CAPABILITY, 0,
2744 				 NULL, 0);
2745 }
2746 
find_pairing(struct hci_conn * conn)2747 static struct mgmt_pending_cmd *find_pairing(struct hci_conn *conn)
2748 {
2749 	struct hci_dev *hdev = conn->hdev;
2750 	struct mgmt_pending_cmd *cmd;
2751 
2752 	list_for_each_entry(cmd, &hdev->mgmt_pending, list) {
2753 		if (cmd->opcode != MGMT_OP_PAIR_DEVICE)
2754 			continue;
2755 
2756 		if (cmd->user_data != conn)
2757 			continue;
2758 
2759 		return cmd;
2760 	}
2761 
2762 	return NULL;
2763 }
2764 
pairing_complete(struct mgmt_pending_cmd * cmd,u8 status)2765 static int pairing_complete(struct mgmt_pending_cmd *cmd, u8 status)
2766 {
2767 	struct mgmt_rp_pair_device rp;
2768 	struct hci_conn *conn = cmd->user_data;
2769 	int err;
2770 
2771 	bacpy(&rp.addr.bdaddr, &conn->dst);
2772 	rp.addr.type = link_to_bdaddr(conn->type, conn->dst_type);
2773 
2774 	err = mgmt_cmd_complete(cmd->sk, cmd->index, MGMT_OP_PAIR_DEVICE,
2775 				status, &rp, sizeof(rp));
2776 
2777 	/* So we don't get further callbacks for this connection */
2778 	conn->connect_cfm_cb = NULL;
2779 	conn->security_cfm_cb = NULL;
2780 	conn->disconn_cfm_cb = NULL;
2781 
2782 	hci_conn_drop(conn);
2783 
2784 	/* The device is paired so there is no need to remove
2785 	 * its connection parameters anymore.
2786 	 */
2787 	clear_bit(HCI_CONN_PARAM_REMOVAL_PEND, &conn->flags);
2788 
2789 	hci_conn_put(conn);
2790 
2791 	return err;
2792 }
2793 
mgmt_smp_complete(struct hci_conn * conn,bool complete)2794 void mgmt_smp_complete(struct hci_conn *conn, bool complete)
2795 {
2796 	u8 status = complete ? MGMT_STATUS_SUCCESS : MGMT_STATUS_FAILED;
2797 	struct mgmt_pending_cmd *cmd;
2798 
2799 	cmd = find_pairing(conn);
2800 	if (cmd) {
2801 		cmd->cmd_complete(cmd, status);
2802 		mgmt_pending_remove(cmd);
2803 	}
2804 }
2805 
pairing_complete_cb(struct hci_conn * conn,u8 status)2806 static void pairing_complete_cb(struct hci_conn *conn, u8 status)
2807 {
2808 	struct mgmt_pending_cmd *cmd;
2809 
2810 	BT_DBG("status %u", status);
2811 
2812 	cmd = find_pairing(conn);
2813 	if (!cmd) {
2814 		BT_DBG("Unable to find a pending command");
2815 		return;
2816 	}
2817 
2818 	cmd->cmd_complete(cmd, mgmt_status(status));
2819 	mgmt_pending_remove(cmd);
2820 }
2821 
le_pairing_complete_cb(struct hci_conn * conn,u8 status)2822 static void le_pairing_complete_cb(struct hci_conn *conn, u8 status)
2823 {
2824 	struct mgmt_pending_cmd *cmd;
2825 
2826 	BT_DBG("status %u", status);
2827 
2828 	if (!status)
2829 		return;
2830 
2831 	cmd = find_pairing(conn);
2832 	if (!cmd) {
2833 		BT_DBG("Unable to find a pending command");
2834 		return;
2835 	}
2836 
2837 	cmd->cmd_complete(cmd, mgmt_status(status));
2838 	mgmt_pending_remove(cmd);
2839 }
2840 
pair_device(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)2841 static int pair_device(struct sock *sk, struct hci_dev *hdev, void *data,
2842 		       u16 len)
2843 {
2844 	struct mgmt_cp_pair_device *cp = data;
2845 	struct mgmt_rp_pair_device rp;
2846 	struct mgmt_pending_cmd *cmd;
2847 	u8 sec_level, auth_type;
2848 	struct hci_conn *conn;
2849 	int err;
2850 
2851 	BT_DBG("");
2852 
2853 	memset(&rp, 0, sizeof(rp));
2854 	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
2855 	rp.addr.type = cp->addr.type;
2856 
2857 	if (!bdaddr_type_is_valid(cp->addr.type))
2858 		return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
2859 					 MGMT_STATUS_INVALID_PARAMS,
2860 					 &rp, sizeof(rp));
2861 
2862 	if (cp->io_cap > SMP_IO_KEYBOARD_DISPLAY)
2863 		return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
2864 					 MGMT_STATUS_INVALID_PARAMS,
2865 					 &rp, sizeof(rp));
2866 
2867 	hci_dev_lock(hdev);
2868 
2869 	if (!hdev_is_powered(hdev)) {
2870 		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
2871 					MGMT_STATUS_NOT_POWERED, &rp,
2872 					sizeof(rp));
2873 		goto unlock;
2874 	}
2875 
2876 	if (hci_bdaddr_is_paired(hdev, &cp->addr.bdaddr, cp->addr.type)) {
2877 		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
2878 					MGMT_STATUS_ALREADY_PAIRED, &rp,
2879 					sizeof(rp));
2880 		goto unlock;
2881 	}
2882 
2883 	sec_level = BT_SECURITY_MEDIUM;
2884 	auth_type = HCI_AT_DEDICATED_BONDING;
2885 
2886 	if (cp->addr.type == BDADDR_BREDR) {
2887 		conn = hci_connect_acl(hdev, &cp->addr.bdaddr, sec_level,
2888 				       auth_type);
2889 	} else {
2890 		u8 addr_type = le_addr_type(cp->addr.type);
2891 		struct hci_conn_params *p;
2892 
2893 		/* When pairing a new device, it is expected to remember
2894 		 * this device for future connections. Adding the connection
2895 		 * parameter information ahead of time allows tracking
2896 		 * of the slave preferred values and will speed up any
2897 		 * further connection establishment.
2898 		 *
2899 		 * If connection parameters already exist, then they
2900 		 * will be kept and this function does nothing.
2901 		 */
2902 		p = hci_conn_params_add(hdev, &cp->addr.bdaddr, addr_type);
2903 
2904 		if (p->auto_connect == HCI_AUTO_CONN_EXPLICIT)
2905 			p->auto_connect = HCI_AUTO_CONN_DISABLED;
2906 
2907 		conn = hci_connect_le_scan(hdev, &cp->addr.bdaddr,
2908 					   addr_type, sec_level,
2909 					   HCI_LE_CONN_TIMEOUT);
2910 	}
2911 
2912 	if (IS_ERR(conn)) {
2913 		int status;
2914 
2915 		if (PTR_ERR(conn) == -EBUSY)
2916 			status = MGMT_STATUS_BUSY;
2917 		else if (PTR_ERR(conn) == -EOPNOTSUPP)
2918 			status = MGMT_STATUS_NOT_SUPPORTED;
2919 		else if (PTR_ERR(conn) == -ECONNREFUSED)
2920 			status = MGMT_STATUS_REJECTED;
2921 		else
2922 			status = MGMT_STATUS_CONNECT_FAILED;
2923 
2924 		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
2925 					status, &rp, sizeof(rp));
2926 		goto unlock;
2927 	}
2928 
2929 	if (conn->connect_cfm_cb) {
2930 		hci_conn_drop(conn);
2931 		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
2932 					MGMT_STATUS_BUSY, &rp, sizeof(rp));
2933 		goto unlock;
2934 	}
2935 
2936 	cmd = mgmt_pending_add(sk, MGMT_OP_PAIR_DEVICE, hdev, data, len);
2937 	if (!cmd) {
2938 		err = -ENOMEM;
2939 		hci_conn_drop(conn);
2940 		goto unlock;
2941 	}
2942 
2943 	cmd->cmd_complete = pairing_complete;
2944 
2945 	/* For LE, just connecting isn't a proof that the pairing finished */
2946 	if (cp->addr.type == BDADDR_BREDR) {
2947 		conn->connect_cfm_cb = pairing_complete_cb;
2948 		conn->security_cfm_cb = pairing_complete_cb;
2949 		conn->disconn_cfm_cb = pairing_complete_cb;
2950 	} else {
2951 		conn->connect_cfm_cb = le_pairing_complete_cb;
2952 		conn->security_cfm_cb = le_pairing_complete_cb;
2953 		conn->disconn_cfm_cb = le_pairing_complete_cb;
2954 	}
2955 
2956 	conn->io_capability = cp->io_cap;
2957 	cmd->user_data = hci_conn_get(conn);
2958 
2959 	if ((conn->state == BT_CONNECTED || conn->state == BT_CONFIG) &&
2960 	    hci_conn_security(conn, sec_level, auth_type, true)) {
2961 		cmd->cmd_complete(cmd, 0);
2962 		mgmt_pending_remove(cmd);
2963 	}
2964 
2965 	err = 0;
2966 
2967 unlock:
2968 	hci_dev_unlock(hdev);
2969 	return err;
2970 }
2971 
cancel_pair_device(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)2972 static int cancel_pair_device(struct sock *sk, struct hci_dev *hdev, void *data,
2973 			      u16 len)
2974 {
2975 	struct mgmt_addr_info *addr = data;
2976 	struct mgmt_pending_cmd *cmd;
2977 	struct hci_conn *conn;
2978 	int err;
2979 
2980 	BT_DBG("");
2981 
2982 	hci_dev_lock(hdev);
2983 
2984 	if (!hdev_is_powered(hdev)) {
2985 		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE,
2986 				      MGMT_STATUS_NOT_POWERED);
2987 		goto unlock;
2988 	}
2989 
2990 	cmd = pending_find(MGMT_OP_PAIR_DEVICE, hdev);
2991 	if (!cmd) {
2992 		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE,
2993 				      MGMT_STATUS_INVALID_PARAMS);
2994 		goto unlock;
2995 	}
2996 
2997 	conn = cmd->user_data;
2998 
2999 	if (bacmp(&addr->bdaddr, &conn->dst) != 0) {
3000 		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE,
3001 				      MGMT_STATUS_INVALID_PARAMS);
3002 		goto unlock;
3003 	}
3004 
3005 	cmd->cmd_complete(cmd, MGMT_STATUS_CANCELLED);
3006 	mgmt_pending_remove(cmd);
3007 
3008 	err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE, 0,
3009 				addr, sizeof(*addr));
3010 unlock:
3011 	hci_dev_unlock(hdev);
3012 	return err;
3013 }
3014 
user_pairing_resp(struct sock * sk,struct hci_dev * hdev,struct mgmt_addr_info * addr,u16 mgmt_op,u16 hci_op,__le32 passkey)3015 static int user_pairing_resp(struct sock *sk, struct hci_dev *hdev,
3016 			     struct mgmt_addr_info *addr, u16 mgmt_op,
3017 			     u16 hci_op, __le32 passkey)
3018 {
3019 	struct mgmt_pending_cmd *cmd;
3020 	struct hci_conn *conn;
3021 	int err;
3022 
3023 	hci_dev_lock(hdev);
3024 
3025 	if (!hdev_is_powered(hdev)) {
3026 		err = mgmt_cmd_complete(sk, hdev->id, mgmt_op,
3027 					MGMT_STATUS_NOT_POWERED, addr,
3028 					sizeof(*addr));
3029 		goto done;
3030 	}
3031 
3032 	if (addr->type == BDADDR_BREDR)
3033 		conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &addr->bdaddr);
3034 	else
3035 		conn = hci_conn_hash_lookup_le(hdev, &addr->bdaddr,
3036 					       le_addr_type(addr->type));
3037 
3038 	if (!conn) {
3039 		err = mgmt_cmd_complete(sk, hdev->id, mgmt_op,
3040 					MGMT_STATUS_NOT_CONNECTED, addr,
3041 					sizeof(*addr));
3042 		goto done;
3043 	}
3044 
3045 	if (addr->type == BDADDR_LE_PUBLIC || addr->type == BDADDR_LE_RANDOM) {
3046 		err = smp_user_confirm_reply(conn, mgmt_op, passkey);
3047 		if (!err)
3048 			err = mgmt_cmd_complete(sk, hdev->id, mgmt_op,
3049 						MGMT_STATUS_SUCCESS, addr,
3050 						sizeof(*addr));
3051 		else
3052 			err = mgmt_cmd_complete(sk, hdev->id, mgmt_op,
3053 						MGMT_STATUS_FAILED, addr,
3054 						sizeof(*addr));
3055 
3056 		goto done;
3057 	}
3058 
3059 	cmd = mgmt_pending_add(sk, mgmt_op, hdev, addr, sizeof(*addr));
3060 	if (!cmd) {
3061 		err = -ENOMEM;
3062 		goto done;
3063 	}
3064 
3065 	cmd->cmd_complete = addr_cmd_complete;
3066 
3067 	/* Continue with pairing via HCI */
3068 	if (hci_op == HCI_OP_USER_PASSKEY_REPLY) {
3069 		struct hci_cp_user_passkey_reply cp;
3070 
3071 		bacpy(&cp.bdaddr, &addr->bdaddr);
3072 		cp.passkey = passkey;
3073 		err = hci_send_cmd(hdev, hci_op, sizeof(cp), &cp);
3074 	} else
3075 		err = hci_send_cmd(hdev, hci_op, sizeof(addr->bdaddr),
3076 				   &addr->bdaddr);
3077 
3078 	if (err < 0)
3079 		mgmt_pending_remove(cmd);
3080 
3081 done:
3082 	hci_dev_unlock(hdev);
3083 	return err;
3084 }
3085 
pin_code_neg_reply(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)3086 static int pin_code_neg_reply(struct sock *sk, struct hci_dev *hdev,
3087 			      void *data, u16 len)
3088 {
3089 	struct mgmt_cp_pin_code_neg_reply *cp = data;
3090 
3091 	BT_DBG("");
3092 
3093 	return user_pairing_resp(sk, hdev, &cp->addr,
3094 				MGMT_OP_PIN_CODE_NEG_REPLY,
3095 				HCI_OP_PIN_CODE_NEG_REPLY, 0);
3096 }
3097 
user_confirm_reply(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)3098 static int user_confirm_reply(struct sock *sk, struct hci_dev *hdev, void *data,
3099 			      u16 len)
3100 {
3101 	struct mgmt_cp_user_confirm_reply *cp = data;
3102 
3103 	BT_DBG("");
3104 
3105 	if (len != sizeof(*cp))
3106 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_USER_CONFIRM_REPLY,
3107 				       MGMT_STATUS_INVALID_PARAMS);
3108 
3109 	return user_pairing_resp(sk, hdev, &cp->addr,
3110 				 MGMT_OP_USER_CONFIRM_REPLY,
3111 				 HCI_OP_USER_CONFIRM_REPLY, 0);
3112 }
3113 
user_confirm_neg_reply(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)3114 static int user_confirm_neg_reply(struct sock *sk, struct hci_dev *hdev,
3115 				  void *data, u16 len)
3116 {
3117 	struct mgmt_cp_user_confirm_neg_reply *cp = data;
3118 
3119 	BT_DBG("");
3120 
3121 	return user_pairing_resp(sk, hdev, &cp->addr,
3122 				 MGMT_OP_USER_CONFIRM_NEG_REPLY,
3123 				 HCI_OP_USER_CONFIRM_NEG_REPLY, 0);
3124 }
3125 
user_passkey_reply(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)3126 static int user_passkey_reply(struct sock *sk, struct hci_dev *hdev, void *data,
3127 			      u16 len)
3128 {
3129 	struct mgmt_cp_user_passkey_reply *cp = data;
3130 
3131 	BT_DBG("");
3132 
3133 	return user_pairing_resp(sk, hdev, &cp->addr,
3134 				 MGMT_OP_USER_PASSKEY_REPLY,
3135 				 HCI_OP_USER_PASSKEY_REPLY, cp->passkey);
3136 }
3137 
user_passkey_neg_reply(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)3138 static int user_passkey_neg_reply(struct sock *sk, struct hci_dev *hdev,
3139 				  void *data, u16 len)
3140 {
3141 	struct mgmt_cp_user_passkey_neg_reply *cp = data;
3142 
3143 	BT_DBG("");
3144 
3145 	return user_pairing_resp(sk, hdev, &cp->addr,
3146 				 MGMT_OP_USER_PASSKEY_NEG_REPLY,
3147 				 HCI_OP_USER_PASSKEY_NEG_REPLY, 0);
3148 }
3149 
adv_expire(struct hci_dev * hdev,u32 flags)3150 static void adv_expire(struct hci_dev *hdev, u32 flags)
3151 {
3152 	struct adv_info *adv_instance;
3153 	struct hci_request req;
3154 	int err;
3155 
3156 	adv_instance = hci_find_adv_instance(hdev, hdev->cur_adv_instance);
3157 	if (!adv_instance)
3158 		return;
3159 
3160 	/* stop if current instance doesn't need to be changed */
3161 	if (!(adv_instance->flags & flags))
3162 		return;
3163 
3164 	cancel_adv_timeout(hdev);
3165 
3166 	adv_instance = hci_get_next_instance(hdev, adv_instance->instance);
3167 	if (!adv_instance)
3168 		return;
3169 
3170 	hci_req_init(&req, hdev);
3171 	err = __hci_req_schedule_adv_instance(&req, adv_instance->instance,
3172 					      true);
3173 	if (err)
3174 		return;
3175 
3176 	hci_req_run(&req, NULL);
3177 }
3178 
set_name_complete(struct hci_dev * hdev,u8 status,u16 opcode)3179 static void set_name_complete(struct hci_dev *hdev, u8 status, u16 opcode)
3180 {
3181 	struct mgmt_cp_set_local_name *cp;
3182 	struct mgmt_pending_cmd *cmd;
3183 
3184 	BT_DBG("status 0x%02x", status);
3185 
3186 	hci_dev_lock(hdev);
3187 
3188 	cmd = pending_find(MGMT_OP_SET_LOCAL_NAME, hdev);
3189 	if (!cmd)
3190 		goto unlock;
3191 
3192 	cp = cmd->param;
3193 
3194 	if (status) {
3195 		mgmt_cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_LOCAL_NAME,
3196 			        mgmt_status(status));
3197 	} else {
3198 		mgmt_cmd_complete(cmd->sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, 0,
3199 				  cp, sizeof(*cp));
3200 
3201 		if (hci_dev_test_flag(hdev, HCI_LE_ADV))
3202 			adv_expire(hdev, MGMT_ADV_FLAG_LOCAL_NAME);
3203 	}
3204 
3205 	mgmt_pending_remove(cmd);
3206 
3207 unlock:
3208 	hci_dev_unlock(hdev);
3209 }
3210 
set_local_name(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)3211 static int set_local_name(struct sock *sk, struct hci_dev *hdev, void *data,
3212 			  u16 len)
3213 {
3214 	struct mgmt_cp_set_local_name *cp = data;
3215 	struct mgmt_pending_cmd *cmd;
3216 	struct hci_request req;
3217 	int err;
3218 
3219 	BT_DBG("");
3220 
3221 	hci_dev_lock(hdev);
3222 
3223 	/* If the old values are the same as the new ones just return a
3224 	 * direct command complete event.
3225 	 */
3226 	if (!memcmp(hdev->dev_name, cp->name, sizeof(hdev->dev_name)) &&
3227 	    !memcmp(hdev->short_name, cp->short_name,
3228 		    sizeof(hdev->short_name))) {
3229 		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, 0,
3230 					data, len);
3231 		goto failed;
3232 	}
3233 
3234 	memcpy(hdev->short_name, cp->short_name, sizeof(hdev->short_name));
3235 
3236 	if (!hdev_is_powered(hdev)) {
3237 		memcpy(hdev->dev_name, cp->name, sizeof(hdev->dev_name));
3238 
3239 		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, 0,
3240 					data, len);
3241 		if (err < 0)
3242 			goto failed;
3243 
3244 		err = mgmt_limited_event(MGMT_EV_LOCAL_NAME_CHANGED, hdev, data,
3245 					 len, HCI_MGMT_LOCAL_NAME_EVENTS, sk);
3246 		ext_info_changed(hdev, sk);
3247 
3248 		goto failed;
3249 	}
3250 
3251 	cmd = mgmt_pending_add(sk, MGMT_OP_SET_LOCAL_NAME, hdev, data, len);
3252 	if (!cmd) {
3253 		err = -ENOMEM;
3254 		goto failed;
3255 	}
3256 
3257 	memcpy(hdev->dev_name, cp->name, sizeof(hdev->dev_name));
3258 
3259 	hci_req_init(&req, hdev);
3260 
3261 	if (lmp_bredr_capable(hdev)) {
3262 		__hci_req_update_name(&req);
3263 		__hci_req_update_eir(&req);
3264 	}
3265 
3266 	/* The name is stored in the scan response data and so
3267 	 * no need to udpate the advertising data here.
3268 	 */
3269 	if (lmp_le_capable(hdev) && hci_dev_test_flag(hdev, HCI_ADVERTISING))
3270 		__hci_req_update_scan_rsp_data(&req, hdev->cur_adv_instance);
3271 
3272 	err = hci_req_run(&req, set_name_complete);
3273 	if (err < 0)
3274 		mgmt_pending_remove(cmd);
3275 
3276 failed:
3277 	hci_dev_unlock(hdev);
3278 	return err;
3279 }
3280 
set_appearance(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)3281 static int set_appearance(struct sock *sk, struct hci_dev *hdev, void *data,
3282 			  u16 len)
3283 {
3284 	struct mgmt_cp_set_appearance *cp = data;
3285 	u16 apperance;
3286 	int err;
3287 
3288 	BT_DBG("");
3289 
3290 	if (!lmp_le_capable(hdev))
3291 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_APPEARANCE,
3292 				       MGMT_STATUS_NOT_SUPPORTED);
3293 
3294 	apperance = le16_to_cpu(cp->appearance);
3295 
3296 	hci_dev_lock(hdev);
3297 
3298 	if (hdev->appearance != apperance) {
3299 		hdev->appearance = apperance;
3300 
3301 		if (hci_dev_test_flag(hdev, HCI_LE_ADV))
3302 			adv_expire(hdev, MGMT_ADV_FLAG_APPEARANCE);
3303 
3304 		ext_info_changed(hdev, sk);
3305 	}
3306 
3307 	err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_APPEARANCE, 0, NULL,
3308 				0);
3309 
3310 	hci_dev_unlock(hdev);
3311 
3312 	return err;
3313 }
3314 
get_phy_configuration(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)3315 static int get_phy_configuration(struct sock *sk, struct hci_dev *hdev,
3316 				 void *data, u16 len)
3317 {
3318 	struct mgmt_rp_get_phy_confguration rp;
3319 
3320 	BT_DBG("sock %p %s", sk, hdev->name);
3321 
3322 	hci_dev_lock(hdev);
3323 
3324 	memset(&rp, 0, sizeof(rp));
3325 
3326 	rp.supported_phys = cpu_to_le32(get_supported_phys(hdev));
3327 	rp.selected_phys = cpu_to_le32(get_selected_phys(hdev));
3328 	rp.configurable_phys = cpu_to_le32(get_configurable_phys(hdev));
3329 
3330 	hci_dev_unlock(hdev);
3331 
3332 	return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_PHY_CONFIGURATION, 0,
3333 				 &rp, sizeof(rp));
3334 }
3335 
mgmt_phy_configuration_changed(struct hci_dev * hdev,struct sock * skip)3336 int mgmt_phy_configuration_changed(struct hci_dev *hdev, struct sock *skip)
3337 {
3338 	struct mgmt_ev_phy_configuration_changed ev;
3339 
3340 	memset(&ev, 0, sizeof(ev));
3341 
3342 	ev.selected_phys = cpu_to_le32(get_selected_phys(hdev));
3343 
3344 	return mgmt_event(MGMT_EV_PHY_CONFIGURATION_CHANGED, hdev, &ev,
3345 			  sizeof(ev), skip);
3346 }
3347 
set_default_phy_complete(struct hci_dev * hdev,u8 status,u16 opcode,struct sk_buff * skb)3348 static void set_default_phy_complete(struct hci_dev *hdev, u8 status,
3349 				     u16 opcode, struct sk_buff *skb)
3350 {
3351 	struct mgmt_pending_cmd *cmd;
3352 
3353 	BT_DBG("status 0x%02x", status);
3354 
3355 	hci_dev_lock(hdev);
3356 
3357 	cmd = pending_find(MGMT_OP_SET_PHY_CONFIGURATION, hdev);
3358 	if (!cmd)
3359 		goto unlock;
3360 
3361 	if (status) {
3362 		mgmt_cmd_status(cmd->sk, hdev->id,
3363 				MGMT_OP_SET_PHY_CONFIGURATION,
3364 				mgmt_status(status));
3365 	} else {
3366 		mgmt_cmd_complete(cmd->sk, hdev->id,
3367 				  MGMT_OP_SET_PHY_CONFIGURATION, 0,
3368 				  NULL, 0);
3369 
3370 		mgmt_phy_configuration_changed(hdev, cmd->sk);
3371 	}
3372 
3373 	mgmt_pending_remove(cmd);
3374 
3375 unlock:
3376 	hci_dev_unlock(hdev);
3377 }
3378 
set_phy_configuration(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)3379 static int set_phy_configuration(struct sock *sk, struct hci_dev *hdev,
3380 				 void *data, u16 len)
3381 {
3382 	struct mgmt_cp_set_phy_confguration *cp = data;
3383 	struct hci_cp_le_set_default_phy cp_phy;
3384 	struct mgmt_pending_cmd *cmd;
3385 	struct hci_request req;
3386 	u32 selected_phys, configurable_phys, supported_phys, unconfigure_phys;
3387 	u16 pkt_type = (HCI_DH1 | HCI_DM1);
3388 	bool changed = false;
3389 	int err;
3390 
3391 	BT_DBG("sock %p %s", sk, hdev->name);
3392 
3393 	configurable_phys = get_configurable_phys(hdev);
3394 	supported_phys = get_supported_phys(hdev);
3395 	selected_phys = __le32_to_cpu(cp->selected_phys);
3396 
3397 	if (selected_phys & ~supported_phys)
3398 		return mgmt_cmd_status(sk, hdev->id,
3399 				       MGMT_OP_SET_PHY_CONFIGURATION,
3400 				       MGMT_STATUS_INVALID_PARAMS);
3401 
3402 	unconfigure_phys = supported_phys & ~configurable_phys;
3403 
3404 	if ((selected_phys & unconfigure_phys) != unconfigure_phys)
3405 		return mgmt_cmd_status(sk, hdev->id,
3406 				       MGMT_OP_SET_PHY_CONFIGURATION,
3407 				       MGMT_STATUS_INVALID_PARAMS);
3408 
3409 	if (selected_phys == get_selected_phys(hdev))
3410 		return mgmt_cmd_complete(sk, hdev->id,
3411 					 MGMT_OP_SET_PHY_CONFIGURATION,
3412 					 0, NULL, 0);
3413 
3414 	hci_dev_lock(hdev);
3415 
3416 	if (!hdev_is_powered(hdev)) {
3417 		err = mgmt_cmd_status(sk, hdev->id,
3418 				      MGMT_OP_SET_PHY_CONFIGURATION,
3419 				      MGMT_STATUS_REJECTED);
3420 		goto unlock;
3421 	}
3422 
3423 	if (pending_find(MGMT_OP_SET_PHY_CONFIGURATION, hdev)) {
3424 		err = mgmt_cmd_status(sk, hdev->id,
3425 				      MGMT_OP_SET_PHY_CONFIGURATION,
3426 				      MGMT_STATUS_BUSY);
3427 		goto unlock;
3428 	}
3429 
3430 	if (selected_phys & MGMT_PHY_BR_1M_3SLOT)
3431 		pkt_type |= (HCI_DH3 | HCI_DM3);
3432 	else
3433 		pkt_type &= ~(HCI_DH3 | HCI_DM3);
3434 
3435 	if (selected_phys & MGMT_PHY_BR_1M_5SLOT)
3436 		pkt_type |= (HCI_DH5 | HCI_DM5);
3437 	else
3438 		pkt_type &= ~(HCI_DH5 | HCI_DM5);
3439 
3440 	if (selected_phys & MGMT_PHY_EDR_2M_1SLOT)
3441 		pkt_type &= ~HCI_2DH1;
3442 	else
3443 		pkt_type |= HCI_2DH1;
3444 
3445 	if (selected_phys & MGMT_PHY_EDR_2M_3SLOT)
3446 		pkt_type &= ~HCI_2DH3;
3447 	else
3448 		pkt_type |= HCI_2DH3;
3449 
3450 	if (selected_phys & MGMT_PHY_EDR_2M_5SLOT)
3451 		pkt_type &= ~HCI_2DH5;
3452 	else
3453 		pkt_type |= HCI_2DH5;
3454 
3455 	if (selected_phys & MGMT_PHY_EDR_3M_1SLOT)
3456 		pkt_type &= ~HCI_3DH1;
3457 	else
3458 		pkt_type |= HCI_3DH1;
3459 
3460 	if (selected_phys & MGMT_PHY_EDR_3M_3SLOT)
3461 		pkt_type &= ~HCI_3DH3;
3462 	else
3463 		pkt_type |= HCI_3DH3;
3464 
3465 	if (selected_phys & MGMT_PHY_EDR_3M_5SLOT)
3466 		pkt_type &= ~HCI_3DH5;
3467 	else
3468 		pkt_type |= HCI_3DH5;
3469 
3470 	if (pkt_type != hdev->pkt_type) {
3471 		hdev->pkt_type = pkt_type;
3472 		changed = true;
3473 	}
3474 
3475 	if ((selected_phys & MGMT_PHY_LE_MASK) ==
3476 	    (get_selected_phys(hdev) & MGMT_PHY_LE_MASK)) {
3477 		if (changed)
3478 			mgmt_phy_configuration_changed(hdev, sk);
3479 
3480 		err = mgmt_cmd_complete(sk, hdev->id,
3481 					MGMT_OP_SET_PHY_CONFIGURATION,
3482 					0, NULL, 0);
3483 
3484 		goto unlock;
3485 	}
3486 
3487 	cmd = mgmt_pending_add(sk, MGMT_OP_SET_PHY_CONFIGURATION, hdev, data,
3488 			       len);
3489 	if (!cmd) {
3490 		err = -ENOMEM;
3491 		goto unlock;
3492 	}
3493 
3494 	hci_req_init(&req, hdev);
3495 
3496 	memset(&cp_phy, 0, sizeof(cp_phy));
3497 
3498 	if (!(selected_phys & MGMT_PHY_LE_TX_MASK))
3499 		cp_phy.all_phys |= 0x01;
3500 
3501 	if (!(selected_phys & MGMT_PHY_LE_RX_MASK))
3502 		cp_phy.all_phys |= 0x02;
3503 
3504 	if (selected_phys & MGMT_PHY_LE_1M_TX)
3505 		cp_phy.tx_phys |= HCI_LE_SET_PHY_1M;
3506 
3507 	if (selected_phys & MGMT_PHY_LE_2M_TX)
3508 		cp_phy.tx_phys |= HCI_LE_SET_PHY_2M;
3509 
3510 	if (selected_phys & MGMT_PHY_LE_CODED_TX)
3511 		cp_phy.tx_phys |= HCI_LE_SET_PHY_CODED;
3512 
3513 	if (selected_phys & MGMT_PHY_LE_1M_RX)
3514 		cp_phy.rx_phys |= HCI_LE_SET_PHY_1M;
3515 
3516 	if (selected_phys & MGMT_PHY_LE_2M_RX)
3517 		cp_phy.rx_phys |= HCI_LE_SET_PHY_2M;
3518 
3519 	if (selected_phys & MGMT_PHY_LE_CODED_RX)
3520 		cp_phy.rx_phys |= HCI_LE_SET_PHY_CODED;
3521 
3522 	hci_req_add(&req, HCI_OP_LE_SET_DEFAULT_PHY, sizeof(cp_phy), &cp_phy);
3523 
3524 	err = hci_req_run_skb(&req, set_default_phy_complete);
3525 	if (err < 0)
3526 		mgmt_pending_remove(cmd);
3527 
3528 unlock:
3529 	hci_dev_unlock(hdev);
3530 
3531 	return err;
3532 }
3533 
read_local_oob_data_complete(struct hci_dev * hdev,u8 status,u16 opcode,struct sk_buff * skb)3534 static void read_local_oob_data_complete(struct hci_dev *hdev, u8 status,
3535 				         u16 opcode, struct sk_buff *skb)
3536 {
3537 	struct mgmt_rp_read_local_oob_data mgmt_rp;
3538 	size_t rp_size = sizeof(mgmt_rp);
3539 	struct mgmt_pending_cmd *cmd;
3540 
3541 	BT_DBG("%s status %u", hdev->name, status);
3542 
3543 	cmd = pending_find(MGMT_OP_READ_LOCAL_OOB_DATA, hdev);
3544 	if (!cmd)
3545 		return;
3546 
3547 	if (status || !skb) {
3548 		mgmt_cmd_status(cmd->sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
3549 				status ? mgmt_status(status) : MGMT_STATUS_FAILED);
3550 		goto remove;
3551 	}
3552 
3553 	memset(&mgmt_rp, 0, sizeof(mgmt_rp));
3554 
3555 	if (opcode == HCI_OP_READ_LOCAL_OOB_DATA) {
3556 		struct hci_rp_read_local_oob_data *rp = (void *) skb->data;
3557 
3558 		if (skb->len < sizeof(*rp)) {
3559 			mgmt_cmd_status(cmd->sk, hdev->id,
3560 					MGMT_OP_READ_LOCAL_OOB_DATA,
3561 					MGMT_STATUS_FAILED);
3562 			goto remove;
3563 		}
3564 
3565 		memcpy(mgmt_rp.hash192, rp->hash, sizeof(rp->hash));
3566 		memcpy(mgmt_rp.rand192, rp->rand, sizeof(rp->rand));
3567 
3568 		rp_size -= sizeof(mgmt_rp.hash256) + sizeof(mgmt_rp.rand256);
3569 	} else {
3570 		struct hci_rp_read_local_oob_ext_data *rp = (void *) skb->data;
3571 
3572 		if (skb->len < sizeof(*rp)) {
3573 			mgmt_cmd_status(cmd->sk, hdev->id,
3574 					MGMT_OP_READ_LOCAL_OOB_DATA,
3575 					MGMT_STATUS_FAILED);
3576 			goto remove;
3577 		}
3578 
3579 		memcpy(mgmt_rp.hash192, rp->hash192, sizeof(rp->hash192));
3580 		memcpy(mgmt_rp.rand192, rp->rand192, sizeof(rp->rand192));
3581 
3582 		memcpy(mgmt_rp.hash256, rp->hash256, sizeof(rp->hash256));
3583 		memcpy(mgmt_rp.rand256, rp->rand256, sizeof(rp->rand256));
3584 	}
3585 
3586 	mgmt_cmd_complete(cmd->sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
3587 			  MGMT_STATUS_SUCCESS, &mgmt_rp, rp_size);
3588 
3589 remove:
3590 	mgmt_pending_remove(cmd);
3591 }
3592 
read_local_oob_data(struct sock * sk,struct hci_dev * hdev,void * data,u16 data_len)3593 static int read_local_oob_data(struct sock *sk, struct hci_dev *hdev,
3594 			       void *data, u16 data_len)
3595 {
3596 	struct mgmt_pending_cmd *cmd;
3597 	struct hci_request req;
3598 	int err;
3599 
3600 	BT_DBG("%s", hdev->name);
3601 
3602 	hci_dev_lock(hdev);
3603 
3604 	if (!hdev_is_powered(hdev)) {
3605 		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
3606 				      MGMT_STATUS_NOT_POWERED);
3607 		goto unlock;
3608 	}
3609 
3610 	if (!lmp_ssp_capable(hdev)) {
3611 		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
3612 				      MGMT_STATUS_NOT_SUPPORTED);
3613 		goto unlock;
3614 	}
3615 
3616 	if (pending_find(MGMT_OP_READ_LOCAL_OOB_DATA, hdev)) {
3617 		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
3618 				      MGMT_STATUS_BUSY);
3619 		goto unlock;
3620 	}
3621 
3622 	cmd = mgmt_pending_add(sk, MGMT_OP_READ_LOCAL_OOB_DATA, hdev, NULL, 0);
3623 	if (!cmd) {
3624 		err = -ENOMEM;
3625 		goto unlock;
3626 	}
3627 
3628 	hci_req_init(&req, hdev);
3629 
3630 	if (bredr_sc_enabled(hdev))
3631 		hci_req_add(&req, HCI_OP_READ_LOCAL_OOB_EXT_DATA, 0, NULL);
3632 	else
3633 		hci_req_add(&req, HCI_OP_READ_LOCAL_OOB_DATA, 0, NULL);
3634 
3635 	err = hci_req_run_skb(&req, read_local_oob_data_complete);
3636 	if (err < 0)
3637 		mgmt_pending_remove(cmd);
3638 
3639 unlock:
3640 	hci_dev_unlock(hdev);
3641 	return err;
3642 }
3643 
add_remote_oob_data(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)3644 static int add_remote_oob_data(struct sock *sk, struct hci_dev *hdev,
3645 			       void *data, u16 len)
3646 {
3647 	struct mgmt_addr_info *addr = data;
3648 	int err;
3649 
3650 	BT_DBG("%s ", hdev->name);
3651 
3652 	if (!bdaddr_type_is_valid(addr->type))
3653 		return mgmt_cmd_complete(sk, hdev->id,
3654 					 MGMT_OP_ADD_REMOTE_OOB_DATA,
3655 					 MGMT_STATUS_INVALID_PARAMS,
3656 					 addr, sizeof(*addr));
3657 
3658 	hci_dev_lock(hdev);
3659 
3660 	if (len == MGMT_ADD_REMOTE_OOB_DATA_SIZE) {
3661 		struct mgmt_cp_add_remote_oob_data *cp = data;
3662 		u8 status;
3663 
3664 		if (cp->addr.type != BDADDR_BREDR) {
3665 			err = mgmt_cmd_complete(sk, hdev->id,
3666 						MGMT_OP_ADD_REMOTE_OOB_DATA,
3667 						MGMT_STATUS_INVALID_PARAMS,
3668 						&cp->addr, sizeof(cp->addr));
3669 			goto unlock;
3670 		}
3671 
3672 		err = hci_add_remote_oob_data(hdev, &cp->addr.bdaddr,
3673 					      cp->addr.type, cp->hash,
3674 					      cp->rand, NULL, NULL);
3675 		if (err < 0)
3676 			status = MGMT_STATUS_FAILED;
3677 		else
3678 			status = MGMT_STATUS_SUCCESS;
3679 
3680 		err = mgmt_cmd_complete(sk, hdev->id,
3681 					MGMT_OP_ADD_REMOTE_OOB_DATA, status,
3682 					&cp->addr, sizeof(cp->addr));
3683 	} else if (len == MGMT_ADD_REMOTE_OOB_EXT_DATA_SIZE) {
3684 		struct mgmt_cp_add_remote_oob_ext_data *cp = data;
3685 		u8 *rand192, *hash192, *rand256, *hash256;
3686 		u8 status;
3687 
3688 		if (bdaddr_type_is_le(cp->addr.type)) {
3689 			/* Enforce zero-valued 192-bit parameters as
3690 			 * long as legacy SMP OOB isn't implemented.
3691 			 */
3692 			if (memcmp(cp->rand192, ZERO_KEY, 16) ||
3693 			    memcmp(cp->hash192, ZERO_KEY, 16)) {
3694 				err = mgmt_cmd_complete(sk, hdev->id,
3695 							MGMT_OP_ADD_REMOTE_OOB_DATA,
3696 							MGMT_STATUS_INVALID_PARAMS,
3697 							addr, sizeof(*addr));
3698 				goto unlock;
3699 			}
3700 
3701 			rand192 = NULL;
3702 			hash192 = NULL;
3703 		} else {
3704 			/* In case one of the P-192 values is set to zero,
3705 			 * then just disable OOB data for P-192.
3706 			 */
3707 			if (!memcmp(cp->rand192, ZERO_KEY, 16) ||
3708 			    !memcmp(cp->hash192, ZERO_KEY, 16)) {
3709 				rand192 = NULL;
3710 				hash192 = NULL;
3711 			} else {
3712 				rand192 = cp->rand192;
3713 				hash192 = cp->hash192;
3714 			}
3715 		}
3716 
3717 		/* In case one of the P-256 values is set to zero, then just
3718 		 * disable OOB data for P-256.
3719 		 */
3720 		if (!memcmp(cp->rand256, ZERO_KEY, 16) ||
3721 		    !memcmp(cp->hash256, ZERO_KEY, 16)) {
3722 			rand256 = NULL;
3723 			hash256 = NULL;
3724 		} else {
3725 			rand256 = cp->rand256;
3726 			hash256 = cp->hash256;
3727 		}
3728 
3729 		err = hci_add_remote_oob_data(hdev, &cp->addr.bdaddr,
3730 					      cp->addr.type, hash192, rand192,
3731 					      hash256, rand256);
3732 		if (err < 0)
3733 			status = MGMT_STATUS_FAILED;
3734 		else
3735 			status = MGMT_STATUS_SUCCESS;
3736 
3737 		err = mgmt_cmd_complete(sk, hdev->id,
3738 					MGMT_OP_ADD_REMOTE_OOB_DATA,
3739 					status, &cp->addr, sizeof(cp->addr));
3740 	} else {
3741 		bt_dev_err(hdev, "add_remote_oob_data: invalid len of %u bytes",
3742 			   len);
3743 		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_REMOTE_OOB_DATA,
3744 				      MGMT_STATUS_INVALID_PARAMS);
3745 	}
3746 
3747 unlock:
3748 	hci_dev_unlock(hdev);
3749 	return err;
3750 }
3751 
remove_remote_oob_data(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)3752 static int remove_remote_oob_data(struct sock *sk, struct hci_dev *hdev,
3753 				  void *data, u16 len)
3754 {
3755 	struct mgmt_cp_remove_remote_oob_data *cp = data;
3756 	u8 status;
3757 	int err;
3758 
3759 	BT_DBG("%s", hdev->name);
3760 
3761 	if (cp->addr.type != BDADDR_BREDR)
3762 		return mgmt_cmd_complete(sk, hdev->id,
3763 					 MGMT_OP_REMOVE_REMOTE_OOB_DATA,
3764 					 MGMT_STATUS_INVALID_PARAMS,
3765 					 &cp->addr, sizeof(cp->addr));
3766 
3767 	hci_dev_lock(hdev);
3768 
3769 	if (!bacmp(&cp->addr.bdaddr, BDADDR_ANY)) {
3770 		hci_remote_oob_data_clear(hdev);
3771 		status = MGMT_STATUS_SUCCESS;
3772 		goto done;
3773 	}
3774 
3775 	err = hci_remove_remote_oob_data(hdev, &cp->addr.bdaddr, cp->addr.type);
3776 	if (err < 0)
3777 		status = MGMT_STATUS_INVALID_PARAMS;
3778 	else
3779 		status = MGMT_STATUS_SUCCESS;
3780 
3781 done:
3782 	err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_REMOTE_OOB_DATA,
3783 				status, &cp->addr, sizeof(cp->addr));
3784 
3785 	hci_dev_unlock(hdev);
3786 	return err;
3787 }
3788 
mgmt_start_discovery_complete(struct hci_dev * hdev,u8 status)3789 void mgmt_start_discovery_complete(struct hci_dev *hdev, u8 status)
3790 {
3791 	struct mgmt_pending_cmd *cmd;
3792 
3793 	BT_DBG("status %d", status);
3794 
3795 	hci_dev_lock(hdev);
3796 
3797 	cmd = pending_find(MGMT_OP_START_DISCOVERY, hdev);
3798 	if (!cmd)
3799 		cmd = pending_find(MGMT_OP_START_SERVICE_DISCOVERY, hdev);
3800 
3801 	if (!cmd)
3802 		cmd = pending_find(MGMT_OP_START_LIMITED_DISCOVERY, hdev);
3803 
3804 	if (cmd) {
3805 		cmd->cmd_complete(cmd, mgmt_status(status));
3806 		mgmt_pending_remove(cmd);
3807 	}
3808 
3809 	hci_dev_unlock(hdev);
3810 }
3811 
discovery_type_is_valid(struct hci_dev * hdev,uint8_t type,uint8_t * mgmt_status)3812 static bool discovery_type_is_valid(struct hci_dev *hdev, uint8_t type,
3813 				    uint8_t *mgmt_status)
3814 {
3815 	switch (type) {
3816 	case DISCOV_TYPE_LE:
3817 		*mgmt_status = mgmt_le_support(hdev);
3818 		if (*mgmt_status)
3819 			return false;
3820 		break;
3821 	case DISCOV_TYPE_INTERLEAVED:
3822 		*mgmt_status = mgmt_le_support(hdev);
3823 		if (*mgmt_status)
3824 			return false;
3825 		/* Intentional fall-through */
3826 	case DISCOV_TYPE_BREDR:
3827 		*mgmt_status = mgmt_bredr_support(hdev);
3828 		if (*mgmt_status)
3829 			return false;
3830 		break;
3831 	default:
3832 		*mgmt_status = MGMT_STATUS_INVALID_PARAMS;
3833 		return false;
3834 	}
3835 
3836 	return true;
3837 }
3838 
start_discovery_internal(struct sock * sk,struct hci_dev * hdev,u16 op,void * data,u16 len)3839 static int start_discovery_internal(struct sock *sk, struct hci_dev *hdev,
3840 				    u16 op, void *data, u16 len)
3841 {
3842 	struct mgmt_cp_start_discovery *cp = data;
3843 	struct mgmt_pending_cmd *cmd;
3844 	u8 status;
3845 	int err;
3846 
3847 	BT_DBG("%s", hdev->name);
3848 
3849 	hci_dev_lock(hdev);
3850 
3851 	if (!hdev_is_powered(hdev)) {
3852 		err = mgmt_cmd_complete(sk, hdev->id, op,
3853 					MGMT_STATUS_NOT_POWERED,
3854 					&cp->type, sizeof(cp->type));
3855 		goto failed;
3856 	}
3857 
3858 	if (hdev->discovery.state != DISCOVERY_STOPPED ||
3859 	    hci_dev_test_flag(hdev, HCI_PERIODIC_INQ)) {
3860 		err = mgmt_cmd_complete(sk, hdev->id, op, MGMT_STATUS_BUSY,
3861 					&cp->type, sizeof(cp->type));
3862 		goto failed;
3863 	}
3864 
3865 	if (!discovery_type_is_valid(hdev, cp->type, &status)) {
3866 		err = mgmt_cmd_complete(sk, hdev->id, op, status,
3867 					&cp->type, sizeof(cp->type));
3868 		goto failed;
3869 	}
3870 
3871 	/* Clear the discovery filter first to free any previously
3872 	 * allocated memory for the UUID list.
3873 	 */
3874 	hci_discovery_filter_clear(hdev);
3875 
3876 	hdev->discovery.type = cp->type;
3877 	hdev->discovery.report_invalid_rssi = false;
3878 	if (op == MGMT_OP_START_LIMITED_DISCOVERY)
3879 		hdev->discovery.limited = true;
3880 	else
3881 		hdev->discovery.limited = false;
3882 
3883 	cmd = mgmt_pending_add(sk, op, hdev, data, len);
3884 	if (!cmd) {
3885 		err = -ENOMEM;
3886 		goto failed;
3887 	}
3888 
3889 	cmd->cmd_complete = generic_cmd_complete;
3890 
3891 	hci_discovery_set_state(hdev, DISCOVERY_STARTING);
3892 	queue_work(hdev->req_workqueue, &hdev->discov_update);
3893 	err = 0;
3894 
3895 failed:
3896 	hci_dev_unlock(hdev);
3897 	return err;
3898 }
3899 
start_discovery(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)3900 static int start_discovery(struct sock *sk, struct hci_dev *hdev,
3901 			   void *data, u16 len)
3902 {
3903 	return start_discovery_internal(sk, hdev, MGMT_OP_START_DISCOVERY,
3904 					data, len);
3905 }
3906 
start_limited_discovery(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)3907 static int start_limited_discovery(struct sock *sk, struct hci_dev *hdev,
3908 				   void *data, u16 len)
3909 {
3910 	return start_discovery_internal(sk, hdev,
3911 					MGMT_OP_START_LIMITED_DISCOVERY,
3912 					data, len);
3913 }
3914 
service_discovery_cmd_complete(struct mgmt_pending_cmd * cmd,u8 status)3915 static int service_discovery_cmd_complete(struct mgmt_pending_cmd *cmd,
3916 					  u8 status)
3917 {
3918 	return mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, status,
3919 				 cmd->param, 1);
3920 }
3921 
start_service_discovery(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)3922 static int start_service_discovery(struct sock *sk, struct hci_dev *hdev,
3923 				   void *data, u16 len)
3924 {
3925 	struct mgmt_cp_start_service_discovery *cp = data;
3926 	struct mgmt_pending_cmd *cmd;
3927 	const u16 max_uuid_count = ((U16_MAX - sizeof(*cp)) / 16);
3928 	u16 uuid_count, expected_len;
3929 	u8 status;
3930 	int err;
3931 
3932 	BT_DBG("%s", hdev->name);
3933 
3934 	hci_dev_lock(hdev);
3935 
3936 	if (!hdev_is_powered(hdev)) {
3937 		err = mgmt_cmd_complete(sk, hdev->id,
3938 					MGMT_OP_START_SERVICE_DISCOVERY,
3939 					MGMT_STATUS_NOT_POWERED,
3940 					&cp->type, sizeof(cp->type));
3941 		goto failed;
3942 	}
3943 
3944 	if (hdev->discovery.state != DISCOVERY_STOPPED ||
3945 	    hci_dev_test_flag(hdev, HCI_PERIODIC_INQ)) {
3946 		err = mgmt_cmd_complete(sk, hdev->id,
3947 					MGMT_OP_START_SERVICE_DISCOVERY,
3948 					MGMT_STATUS_BUSY, &cp->type,
3949 					sizeof(cp->type));
3950 		goto failed;
3951 	}
3952 
3953 	uuid_count = __le16_to_cpu(cp->uuid_count);
3954 	if (uuid_count > max_uuid_count) {
3955 		bt_dev_err(hdev, "service_discovery: too big uuid_count value %u",
3956 			   uuid_count);
3957 		err = mgmt_cmd_complete(sk, hdev->id,
3958 					MGMT_OP_START_SERVICE_DISCOVERY,
3959 					MGMT_STATUS_INVALID_PARAMS, &cp->type,
3960 					sizeof(cp->type));
3961 		goto failed;
3962 	}
3963 
3964 	expected_len = sizeof(*cp) + uuid_count * 16;
3965 	if (expected_len != len) {
3966 		bt_dev_err(hdev, "service_discovery: expected %u bytes, got %u bytes",
3967 			   expected_len, len);
3968 		err = mgmt_cmd_complete(sk, hdev->id,
3969 					MGMT_OP_START_SERVICE_DISCOVERY,
3970 					MGMT_STATUS_INVALID_PARAMS, &cp->type,
3971 					sizeof(cp->type));
3972 		goto failed;
3973 	}
3974 
3975 	if (!discovery_type_is_valid(hdev, cp->type, &status)) {
3976 		err = mgmt_cmd_complete(sk, hdev->id,
3977 					MGMT_OP_START_SERVICE_DISCOVERY,
3978 					status, &cp->type, sizeof(cp->type));
3979 		goto failed;
3980 	}
3981 
3982 	cmd = mgmt_pending_add(sk, MGMT_OP_START_SERVICE_DISCOVERY,
3983 			       hdev, data, len);
3984 	if (!cmd) {
3985 		err = -ENOMEM;
3986 		goto failed;
3987 	}
3988 
3989 	cmd->cmd_complete = service_discovery_cmd_complete;
3990 
3991 	/* Clear the discovery filter first to free any previously
3992 	 * allocated memory for the UUID list.
3993 	 */
3994 	hci_discovery_filter_clear(hdev);
3995 
3996 	hdev->discovery.result_filtering = true;
3997 	hdev->discovery.type = cp->type;
3998 	hdev->discovery.rssi = cp->rssi;
3999 	hdev->discovery.uuid_count = uuid_count;
4000 
4001 	if (uuid_count > 0) {
4002 		hdev->discovery.uuids = kmemdup(cp->uuids, uuid_count * 16,
4003 						GFP_KERNEL);
4004 		if (!hdev->discovery.uuids) {
4005 			err = mgmt_cmd_complete(sk, hdev->id,
4006 						MGMT_OP_START_SERVICE_DISCOVERY,
4007 						MGMT_STATUS_FAILED,
4008 						&cp->type, sizeof(cp->type));
4009 			mgmt_pending_remove(cmd);
4010 			goto failed;
4011 		}
4012 	}
4013 
4014 	hci_discovery_set_state(hdev, DISCOVERY_STARTING);
4015 	queue_work(hdev->req_workqueue, &hdev->discov_update);
4016 	err = 0;
4017 
4018 failed:
4019 	hci_dev_unlock(hdev);
4020 	return err;
4021 }
4022 
mgmt_stop_discovery_complete(struct hci_dev * hdev,u8 status)4023 void mgmt_stop_discovery_complete(struct hci_dev *hdev, u8 status)
4024 {
4025 	struct mgmt_pending_cmd *cmd;
4026 
4027 	BT_DBG("status %d", status);
4028 
4029 	hci_dev_lock(hdev);
4030 
4031 	cmd = pending_find(MGMT_OP_STOP_DISCOVERY, hdev);
4032 	if (cmd) {
4033 		cmd->cmd_complete(cmd, mgmt_status(status));
4034 		mgmt_pending_remove(cmd);
4035 	}
4036 
4037 	hci_dev_unlock(hdev);
4038 }
4039 
stop_discovery(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)4040 static int stop_discovery(struct sock *sk, struct hci_dev *hdev, void *data,
4041 			  u16 len)
4042 {
4043 	struct mgmt_cp_stop_discovery *mgmt_cp = data;
4044 	struct mgmt_pending_cmd *cmd;
4045 	int err;
4046 
4047 	BT_DBG("%s", hdev->name);
4048 
4049 	hci_dev_lock(hdev);
4050 
4051 	if (!hci_discovery_active(hdev)) {
4052 		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY,
4053 					MGMT_STATUS_REJECTED, &mgmt_cp->type,
4054 					sizeof(mgmt_cp->type));
4055 		goto unlock;
4056 	}
4057 
4058 	if (hdev->discovery.type != mgmt_cp->type) {
4059 		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY,
4060 					MGMT_STATUS_INVALID_PARAMS,
4061 					&mgmt_cp->type, sizeof(mgmt_cp->type));
4062 		goto unlock;
4063 	}
4064 
4065 	cmd = mgmt_pending_add(sk, MGMT_OP_STOP_DISCOVERY, hdev, data, len);
4066 	if (!cmd) {
4067 		err = -ENOMEM;
4068 		goto unlock;
4069 	}
4070 
4071 	cmd->cmd_complete = generic_cmd_complete;
4072 
4073 	hci_discovery_set_state(hdev, DISCOVERY_STOPPING);
4074 	queue_work(hdev->req_workqueue, &hdev->discov_update);
4075 	err = 0;
4076 
4077 unlock:
4078 	hci_dev_unlock(hdev);
4079 	return err;
4080 }
4081 
confirm_name(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)4082 static int confirm_name(struct sock *sk, struct hci_dev *hdev, void *data,
4083 			u16 len)
4084 {
4085 	struct mgmt_cp_confirm_name *cp = data;
4086 	struct inquiry_entry *e;
4087 	int err;
4088 
4089 	BT_DBG("%s", hdev->name);
4090 
4091 	hci_dev_lock(hdev);
4092 
4093 	if (!hci_discovery_active(hdev)) {
4094 		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_CONFIRM_NAME,
4095 					MGMT_STATUS_FAILED, &cp->addr,
4096 					sizeof(cp->addr));
4097 		goto failed;
4098 	}
4099 
4100 	e = hci_inquiry_cache_lookup_unknown(hdev, &cp->addr.bdaddr);
4101 	if (!e) {
4102 		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_CONFIRM_NAME,
4103 					MGMT_STATUS_INVALID_PARAMS, &cp->addr,
4104 					sizeof(cp->addr));
4105 		goto failed;
4106 	}
4107 
4108 	if (cp->name_known) {
4109 		e->name_state = NAME_KNOWN;
4110 		list_del(&e->list);
4111 	} else {
4112 		e->name_state = NAME_NEEDED;
4113 		hci_inquiry_cache_update_resolve(hdev, e);
4114 	}
4115 
4116 	err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_CONFIRM_NAME, 0,
4117 				&cp->addr, sizeof(cp->addr));
4118 
4119 failed:
4120 	hci_dev_unlock(hdev);
4121 	return err;
4122 }
4123 
block_device(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)4124 static int block_device(struct sock *sk, struct hci_dev *hdev, void *data,
4125 			u16 len)
4126 {
4127 	struct mgmt_cp_block_device *cp = data;
4128 	u8 status;
4129 	int err;
4130 
4131 	BT_DBG("%s", hdev->name);
4132 
4133 	if (!bdaddr_type_is_valid(cp->addr.type))
4134 		return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_BLOCK_DEVICE,
4135 					 MGMT_STATUS_INVALID_PARAMS,
4136 					 &cp->addr, sizeof(cp->addr));
4137 
4138 	hci_dev_lock(hdev);
4139 
4140 	err = hci_bdaddr_list_add(&hdev->blacklist, &cp->addr.bdaddr,
4141 				  cp->addr.type);
4142 	if (err < 0) {
4143 		status = MGMT_STATUS_FAILED;
4144 		goto done;
4145 	}
4146 
4147 	mgmt_event(MGMT_EV_DEVICE_BLOCKED, hdev, &cp->addr, sizeof(cp->addr),
4148 		   sk);
4149 	status = MGMT_STATUS_SUCCESS;
4150 
4151 done:
4152 	err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_BLOCK_DEVICE, status,
4153 				&cp->addr, sizeof(cp->addr));
4154 
4155 	hci_dev_unlock(hdev);
4156 
4157 	return err;
4158 }
4159 
unblock_device(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)4160 static int unblock_device(struct sock *sk, struct hci_dev *hdev, void *data,
4161 			  u16 len)
4162 {
4163 	struct mgmt_cp_unblock_device *cp = data;
4164 	u8 status;
4165 	int err;
4166 
4167 	BT_DBG("%s", hdev->name);
4168 
4169 	if (!bdaddr_type_is_valid(cp->addr.type))
4170 		return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNBLOCK_DEVICE,
4171 					 MGMT_STATUS_INVALID_PARAMS,
4172 					 &cp->addr, sizeof(cp->addr));
4173 
4174 	hci_dev_lock(hdev);
4175 
4176 	err = hci_bdaddr_list_del(&hdev->blacklist, &cp->addr.bdaddr,
4177 				  cp->addr.type);
4178 	if (err < 0) {
4179 		status = MGMT_STATUS_INVALID_PARAMS;
4180 		goto done;
4181 	}
4182 
4183 	mgmt_event(MGMT_EV_DEVICE_UNBLOCKED, hdev, &cp->addr, sizeof(cp->addr),
4184 		   sk);
4185 	status = MGMT_STATUS_SUCCESS;
4186 
4187 done:
4188 	err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_UNBLOCK_DEVICE, status,
4189 				&cp->addr, sizeof(cp->addr));
4190 
4191 	hci_dev_unlock(hdev);
4192 
4193 	return err;
4194 }
4195 
set_device_id(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)4196 static int set_device_id(struct sock *sk, struct hci_dev *hdev, void *data,
4197 			 u16 len)
4198 {
4199 	struct mgmt_cp_set_device_id *cp = data;
4200 	struct hci_request req;
4201 	int err;
4202 	__u16 source;
4203 
4204 	BT_DBG("%s", hdev->name);
4205 
4206 	source = __le16_to_cpu(cp->source);
4207 
4208 	if (source > 0x0002)
4209 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DEVICE_ID,
4210 				       MGMT_STATUS_INVALID_PARAMS);
4211 
4212 	hci_dev_lock(hdev);
4213 
4214 	hdev->devid_source = source;
4215 	hdev->devid_vendor = __le16_to_cpu(cp->vendor);
4216 	hdev->devid_product = __le16_to_cpu(cp->product);
4217 	hdev->devid_version = __le16_to_cpu(cp->version);
4218 
4219 	err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_DEVICE_ID, 0,
4220 				NULL, 0);
4221 
4222 	hci_req_init(&req, hdev);
4223 	__hci_req_update_eir(&req);
4224 	hci_req_run(&req, NULL);
4225 
4226 	hci_dev_unlock(hdev);
4227 
4228 	return err;
4229 }
4230 
enable_advertising_instance(struct hci_dev * hdev,u8 status,u16 opcode)4231 static void enable_advertising_instance(struct hci_dev *hdev, u8 status,
4232 					u16 opcode)
4233 {
4234 	BT_DBG("status %d", status);
4235 }
4236 
set_advertising_complete(struct hci_dev * hdev,u8 status,u16 opcode)4237 static void set_advertising_complete(struct hci_dev *hdev, u8 status,
4238 				     u16 opcode)
4239 {
4240 	struct cmd_lookup match = { NULL, hdev };
4241 	struct hci_request req;
4242 	u8 instance;
4243 	struct adv_info *adv_instance;
4244 	int err;
4245 
4246 	hci_dev_lock(hdev);
4247 
4248 	if (status) {
4249 		u8 mgmt_err = mgmt_status(status);
4250 
4251 		mgmt_pending_foreach(MGMT_OP_SET_ADVERTISING, hdev,
4252 				     cmd_status_rsp, &mgmt_err);
4253 		goto unlock;
4254 	}
4255 
4256 	if (hci_dev_test_flag(hdev, HCI_LE_ADV))
4257 		hci_dev_set_flag(hdev, HCI_ADVERTISING);
4258 	else
4259 		hci_dev_clear_flag(hdev, HCI_ADVERTISING);
4260 
4261 	mgmt_pending_foreach(MGMT_OP_SET_ADVERTISING, hdev, settings_rsp,
4262 			     &match);
4263 
4264 	new_settings(hdev, match.sk);
4265 
4266 	if (match.sk)
4267 		sock_put(match.sk);
4268 
4269 	/* If "Set Advertising" was just disabled and instance advertising was
4270 	 * set up earlier, then re-enable multi-instance advertising.
4271 	 */
4272 	if (hci_dev_test_flag(hdev, HCI_ADVERTISING) ||
4273 	    list_empty(&hdev->adv_instances))
4274 		goto unlock;
4275 
4276 	instance = hdev->cur_adv_instance;
4277 	if (!instance) {
4278 		adv_instance = list_first_entry_or_null(&hdev->adv_instances,
4279 							struct adv_info, list);
4280 		if (!adv_instance)
4281 			goto unlock;
4282 
4283 		instance = adv_instance->instance;
4284 	}
4285 
4286 	hci_req_init(&req, hdev);
4287 
4288 	err = __hci_req_schedule_adv_instance(&req, instance, true);
4289 
4290 	if (!err)
4291 		err = hci_req_run(&req, enable_advertising_instance);
4292 
4293 	if (err)
4294 		bt_dev_err(hdev, "failed to re-configure advertising");
4295 
4296 unlock:
4297 	hci_dev_unlock(hdev);
4298 }
4299 
set_advertising(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)4300 static int set_advertising(struct sock *sk, struct hci_dev *hdev, void *data,
4301 			   u16 len)
4302 {
4303 	struct mgmt_mode *cp = data;
4304 	struct mgmt_pending_cmd *cmd;
4305 	struct hci_request req;
4306 	u8 val, status;
4307 	int err;
4308 
4309 	BT_DBG("request for %s", hdev->name);
4310 
4311 	status = mgmt_le_support(hdev);
4312 	if (status)
4313 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING,
4314 				       status);
4315 
4316 	if (cp->val != 0x00 && cp->val != 0x01 && cp->val != 0x02)
4317 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING,
4318 				       MGMT_STATUS_INVALID_PARAMS);
4319 
4320 	hci_dev_lock(hdev);
4321 
4322 	val = !!cp->val;
4323 
4324 	/* The following conditions are ones which mean that we should
4325 	 * not do any HCI communication but directly send a mgmt
4326 	 * response to user space (after toggling the flag if
4327 	 * necessary).
4328 	 */
4329 	if (!hdev_is_powered(hdev) ||
4330 	    (val == hci_dev_test_flag(hdev, HCI_ADVERTISING) &&
4331 	     (cp->val == 0x02) == hci_dev_test_flag(hdev, HCI_ADVERTISING_CONNECTABLE)) ||
4332 	    hci_conn_num(hdev, LE_LINK) > 0 ||
4333 	    (hci_dev_test_flag(hdev, HCI_LE_SCAN) &&
4334 	     hdev->le_scan_type == LE_SCAN_ACTIVE)) {
4335 		bool changed;
4336 
4337 		if (cp->val) {
4338 			hdev->cur_adv_instance = 0x00;
4339 			changed = !hci_dev_test_and_set_flag(hdev, HCI_ADVERTISING);
4340 			if (cp->val == 0x02)
4341 				hci_dev_set_flag(hdev, HCI_ADVERTISING_CONNECTABLE);
4342 			else
4343 				hci_dev_clear_flag(hdev, HCI_ADVERTISING_CONNECTABLE);
4344 		} else {
4345 			changed = hci_dev_test_and_clear_flag(hdev, HCI_ADVERTISING);
4346 			hci_dev_clear_flag(hdev, HCI_ADVERTISING_CONNECTABLE);
4347 		}
4348 
4349 		err = send_settings_rsp(sk, MGMT_OP_SET_ADVERTISING, hdev);
4350 		if (err < 0)
4351 			goto unlock;
4352 
4353 		if (changed)
4354 			err = new_settings(hdev, sk);
4355 
4356 		goto unlock;
4357 	}
4358 
4359 	if (pending_find(MGMT_OP_SET_ADVERTISING, hdev) ||
4360 	    pending_find(MGMT_OP_SET_LE, hdev)) {
4361 		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING,
4362 				      MGMT_STATUS_BUSY);
4363 		goto unlock;
4364 	}
4365 
4366 	cmd = mgmt_pending_add(sk, MGMT_OP_SET_ADVERTISING, hdev, data, len);
4367 	if (!cmd) {
4368 		err = -ENOMEM;
4369 		goto unlock;
4370 	}
4371 
4372 	hci_req_init(&req, hdev);
4373 
4374 	if (cp->val == 0x02)
4375 		hci_dev_set_flag(hdev, HCI_ADVERTISING_CONNECTABLE);
4376 	else
4377 		hci_dev_clear_flag(hdev, HCI_ADVERTISING_CONNECTABLE);
4378 
4379 	cancel_adv_timeout(hdev);
4380 
4381 	if (val) {
4382 		/* Switch to instance "0" for the Set Advertising setting.
4383 		 * We cannot use update_[adv|scan_rsp]_data() here as the
4384 		 * HCI_ADVERTISING flag is not yet set.
4385 		 */
4386 		hdev->cur_adv_instance = 0x00;
4387 
4388 		if (ext_adv_capable(hdev)) {
4389 			__hci_req_start_ext_adv(&req, 0x00);
4390 		} else {
4391 			__hci_req_update_adv_data(&req, 0x00);
4392 			__hci_req_update_scan_rsp_data(&req, 0x00);
4393 			__hci_req_enable_advertising(&req);
4394 		}
4395 	} else {
4396 		__hci_req_disable_advertising(&req);
4397 	}
4398 
4399 	err = hci_req_run(&req, set_advertising_complete);
4400 	if (err < 0)
4401 		mgmt_pending_remove(cmd);
4402 
4403 unlock:
4404 	hci_dev_unlock(hdev);
4405 	return err;
4406 }
4407 
set_static_address(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)4408 static int set_static_address(struct sock *sk, struct hci_dev *hdev,
4409 			      void *data, u16 len)
4410 {
4411 	struct mgmt_cp_set_static_address *cp = data;
4412 	int err;
4413 
4414 	BT_DBG("%s", hdev->name);
4415 
4416 	if (!lmp_le_capable(hdev))
4417 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_STATIC_ADDRESS,
4418 				       MGMT_STATUS_NOT_SUPPORTED);
4419 
4420 	if (hdev_is_powered(hdev))
4421 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_STATIC_ADDRESS,
4422 				       MGMT_STATUS_REJECTED);
4423 
4424 	if (bacmp(&cp->bdaddr, BDADDR_ANY)) {
4425 		if (!bacmp(&cp->bdaddr, BDADDR_NONE))
4426 			return mgmt_cmd_status(sk, hdev->id,
4427 					       MGMT_OP_SET_STATIC_ADDRESS,
4428 					       MGMT_STATUS_INVALID_PARAMS);
4429 
4430 		/* Two most significant bits shall be set */
4431 		if ((cp->bdaddr.b[5] & 0xc0) != 0xc0)
4432 			return mgmt_cmd_status(sk, hdev->id,
4433 					       MGMT_OP_SET_STATIC_ADDRESS,
4434 					       MGMT_STATUS_INVALID_PARAMS);
4435 	}
4436 
4437 	hci_dev_lock(hdev);
4438 
4439 	bacpy(&hdev->static_addr, &cp->bdaddr);
4440 
4441 	err = send_settings_rsp(sk, MGMT_OP_SET_STATIC_ADDRESS, hdev);
4442 	if (err < 0)
4443 		goto unlock;
4444 
4445 	err = new_settings(hdev, sk);
4446 
4447 unlock:
4448 	hci_dev_unlock(hdev);
4449 	return err;
4450 }
4451 
set_scan_params(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)4452 static int set_scan_params(struct sock *sk, struct hci_dev *hdev,
4453 			   void *data, u16 len)
4454 {
4455 	struct mgmt_cp_set_scan_params *cp = data;
4456 	__u16 interval, window;
4457 	int err;
4458 
4459 	BT_DBG("%s", hdev->name);
4460 
4461 	if (!lmp_le_capable(hdev))
4462 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS,
4463 				       MGMT_STATUS_NOT_SUPPORTED);
4464 
4465 	interval = __le16_to_cpu(cp->interval);
4466 
4467 	if (interval < 0x0004 || interval > 0x4000)
4468 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS,
4469 				       MGMT_STATUS_INVALID_PARAMS);
4470 
4471 	window = __le16_to_cpu(cp->window);
4472 
4473 	if (window < 0x0004 || window > 0x4000)
4474 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS,
4475 				       MGMT_STATUS_INVALID_PARAMS);
4476 
4477 	if (window > interval)
4478 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS,
4479 				       MGMT_STATUS_INVALID_PARAMS);
4480 
4481 	hci_dev_lock(hdev);
4482 
4483 	hdev->le_scan_interval = interval;
4484 	hdev->le_scan_window = window;
4485 
4486 	err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_SCAN_PARAMS, 0,
4487 				NULL, 0);
4488 
4489 	/* If background scan is running, restart it so new parameters are
4490 	 * loaded.
4491 	 */
4492 	if (hci_dev_test_flag(hdev, HCI_LE_SCAN) &&
4493 	    hdev->discovery.state == DISCOVERY_STOPPED) {
4494 		struct hci_request req;
4495 
4496 		hci_req_init(&req, hdev);
4497 
4498 		hci_req_add_le_scan_disable(&req);
4499 		hci_req_add_le_passive_scan(&req);
4500 
4501 		hci_req_run(&req, NULL);
4502 	}
4503 
4504 	hci_dev_unlock(hdev);
4505 
4506 	return err;
4507 }
4508 
fast_connectable_complete(struct hci_dev * hdev,u8 status,u16 opcode)4509 static void fast_connectable_complete(struct hci_dev *hdev, u8 status,
4510 				      u16 opcode)
4511 {
4512 	struct mgmt_pending_cmd *cmd;
4513 
4514 	BT_DBG("status 0x%02x", status);
4515 
4516 	hci_dev_lock(hdev);
4517 
4518 	cmd = pending_find(MGMT_OP_SET_FAST_CONNECTABLE, hdev);
4519 	if (!cmd)
4520 		goto unlock;
4521 
4522 	if (status) {
4523 		mgmt_cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
4524 			        mgmt_status(status));
4525 	} else {
4526 		struct mgmt_mode *cp = cmd->param;
4527 
4528 		if (cp->val)
4529 			hci_dev_set_flag(hdev, HCI_FAST_CONNECTABLE);
4530 		else
4531 			hci_dev_clear_flag(hdev, HCI_FAST_CONNECTABLE);
4532 
4533 		send_settings_rsp(cmd->sk, MGMT_OP_SET_FAST_CONNECTABLE, hdev);
4534 		new_settings(hdev, cmd->sk);
4535 	}
4536 
4537 	mgmt_pending_remove(cmd);
4538 
4539 unlock:
4540 	hci_dev_unlock(hdev);
4541 }
4542 
set_fast_connectable(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)4543 static int set_fast_connectable(struct sock *sk, struct hci_dev *hdev,
4544 				void *data, u16 len)
4545 {
4546 	struct mgmt_mode *cp = data;
4547 	struct mgmt_pending_cmd *cmd;
4548 	struct hci_request req;
4549 	int err;
4550 
4551 	BT_DBG("%s", hdev->name);
4552 
4553 	if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED) ||
4554 	    hdev->hci_ver < BLUETOOTH_VER_1_2)
4555 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
4556 				       MGMT_STATUS_NOT_SUPPORTED);
4557 
4558 	if (cp->val != 0x00 && cp->val != 0x01)
4559 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
4560 				       MGMT_STATUS_INVALID_PARAMS);
4561 
4562 	hci_dev_lock(hdev);
4563 
4564 	if (pending_find(MGMT_OP_SET_FAST_CONNECTABLE, hdev)) {
4565 		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
4566 				      MGMT_STATUS_BUSY);
4567 		goto unlock;
4568 	}
4569 
4570 	if (!!cp->val == hci_dev_test_flag(hdev, HCI_FAST_CONNECTABLE)) {
4571 		err = send_settings_rsp(sk, MGMT_OP_SET_FAST_CONNECTABLE,
4572 					hdev);
4573 		goto unlock;
4574 	}
4575 
4576 	if (!hdev_is_powered(hdev)) {
4577 		hci_dev_change_flag(hdev, HCI_FAST_CONNECTABLE);
4578 		err = send_settings_rsp(sk, MGMT_OP_SET_FAST_CONNECTABLE,
4579 					hdev);
4580 		new_settings(hdev, sk);
4581 		goto unlock;
4582 	}
4583 
4584 	cmd = mgmt_pending_add(sk, MGMT_OP_SET_FAST_CONNECTABLE, hdev,
4585 			       data, len);
4586 	if (!cmd) {
4587 		err = -ENOMEM;
4588 		goto unlock;
4589 	}
4590 
4591 	hci_req_init(&req, hdev);
4592 
4593 	__hci_req_write_fast_connectable(&req, cp->val);
4594 
4595 	err = hci_req_run(&req, fast_connectable_complete);
4596 	if (err < 0) {
4597 		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
4598 				      MGMT_STATUS_FAILED);
4599 		mgmt_pending_remove(cmd);
4600 	}
4601 
4602 unlock:
4603 	hci_dev_unlock(hdev);
4604 
4605 	return err;
4606 }
4607 
set_bredr_complete(struct hci_dev * hdev,u8 status,u16 opcode)4608 static void set_bredr_complete(struct hci_dev *hdev, u8 status, u16 opcode)
4609 {
4610 	struct mgmt_pending_cmd *cmd;
4611 
4612 	BT_DBG("status 0x%02x", status);
4613 
4614 	hci_dev_lock(hdev);
4615 
4616 	cmd = pending_find(MGMT_OP_SET_BREDR, hdev);
4617 	if (!cmd)
4618 		goto unlock;
4619 
4620 	if (status) {
4621 		u8 mgmt_err = mgmt_status(status);
4622 
4623 		/* We need to restore the flag if related HCI commands
4624 		 * failed.
4625 		 */
4626 		hci_dev_clear_flag(hdev, HCI_BREDR_ENABLED);
4627 
4628 		mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, mgmt_err);
4629 	} else {
4630 		send_settings_rsp(cmd->sk, MGMT_OP_SET_BREDR, hdev);
4631 		new_settings(hdev, cmd->sk);
4632 	}
4633 
4634 	mgmt_pending_remove(cmd);
4635 
4636 unlock:
4637 	hci_dev_unlock(hdev);
4638 }
4639 
set_bredr(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)4640 static int set_bredr(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
4641 {
4642 	struct mgmt_mode *cp = data;
4643 	struct mgmt_pending_cmd *cmd;
4644 	struct hci_request req;
4645 	int err;
4646 
4647 	BT_DBG("request for %s", hdev->name);
4648 
4649 	if (!lmp_bredr_capable(hdev) || !lmp_le_capable(hdev))
4650 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR,
4651 				       MGMT_STATUS_NOT_SUPPORTED);
4652 
4653 	if (!hci_dev_test_flag(hdev, HCI_LE_ENABLED))
4654 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR,
4655 				       MGMT_STATUS_REJECTED);
4656 
4657 	if (cp->val != 0x00 && cp->val != 0x01)
4658 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR,
4659 				       MGMT_STATUS_INVALID_PARAMS);
4660 
4661 	hci_dev_lock(hdev);
4662 
4663 	if (cp->val == hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) {
4664 		err = send_settings_rsp(sk, MGMT_OP_SET_BREDR, hdev);
4665 		goto unlock;
4666 	}
4667 
4668 	if (!hdev_is_powered(hdev)) {
4669 		if (!cp->val) {
4670 			hci_dev_clear_flag(hdev, HCI_DISCOVERABLE);
4671 			hci_dev_clear_flag(hdev, HCI_SSP_ENABLED);
4672 			hci_dev_clear_flag(hdev, HCI_LINK_SECURITY);
4673 			hci_dev_clear_flag(hdev, HCI_FAST_CONNECTABLE);
4674 			hci_dev_clear_flag(hdev, HCI_HS_ENABLED);
4675 		}
4676 
4677 		hci_dev_change_flag(hdev, HCI_BREDR_ENABLED);
4678 
4679 		err = send_settings_rsp(sk, MGMT_OP_SET_BREDR, hdev);
4680 		if (err < 0)
4681 			goto unlock;
4682 
4683 		err = new_settings(hdev, sk);
4684 		goto unlock;
4685 	}
4686 
4687 	/* Reject disabling when powered on */
4688 	if (!cp->val) {
4689 		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR,
4690 				      MGMT_STATUS_REJECTED);
4691 		goto unlock;
4692 	} else {
4693 		/* When configuring a dual-mode controller to operate
4694 		 * with LE only and using a static address, then switching
4695 		 * BR/EDR back on is not allowed.
4696 		 *
4697 		 * Dual-mode controllers shall operate with the public
4698 		 * address as its identity address for BR/EDR and LE. So
4699 		 * reject the attempt to create an invalid configuration.
4700 		 *
4701 		 * The same restrictions applies when secure connections
4702 		 * has been enabled. For BR/EDR this is a controller feature
4703 		 * while for LE it is a host stack feature. This means that
4704 		 * switching BR/EDR back on when secure connections has been
4705 		 * enabled is not a supported transaction.
4706 		 */
4707 		if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED) &&
4708 		    (bacmp(&hdev->static_addr, BDADDR_ANY) ||
4709 		     hci_dev_test_flag(hdev, HCI_SC_ENABLED))) {
4710 			err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR,
4711 					      MGMT_STATUS_REJECTED);
4712 			goto unlock;
4713 		}
4714 	}
4715 
4716 	if (pending_find(MGMT_OP_SET_BREDR, hdev)) {
4717 		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR,
4718 				      MGMT_STATUS_BUSY);
4719 		goto unlock;
4720 	}
4721 
4722 	cmd = mgmt_pending_add(sk, MGMT_OP_SET_BREDR, hdev, data, len);
4723 	if (!cmd) {
4724 		err = -ENOMEM;
4725 		goto unlock;
4726 	}
4727 
4728 	/* We need to flip the bit already here so that
4729 	 * hci_req_update_adv_data generates the correct flags.
4730 	 */
4731 	hci_dev_set_flag(hdev, HCI_BREDR_ENABLED);
4732 
4733 	hci_req_init(&req, hdev);
4734 
4735 	__hci_req_write_fast_connectable(&req, false);
4736 	__hci_req_update_scan(&req);
4737 
4738 	/* Since only the advertising data flags will change, there
4739 	 * is no need to update the scan response data.
4740 	 */
4741 	__hci_req_update_adv_data(&req, hdev->cur_adv_instance);
4742 
4743 	err = hci_req_run(&req, set_bredr_complete);
4744 	if (err < 0)
4745 		mgmt_pending_remove(cmd);
4746 
4747 unlock:
4748 	hci_dev_unlock(hdev);
4749 	return err;
4750 }
4751 
sc_enable_complete(struct hci_dev * hdev,u8 status,u16 opcode)4752 static void sc_enable_complete(struct hci_dev *hdev, u8 status, u16 opcode)
4753 {
4754 	struct mgmt_pending_cmd *cmd;
4755 	struct mgmt_mode *cp;
4756 
4757 	BT_DBG("%s status %u", hdev->name, status);
4758 
4759 	hci_dev_lock(hdev);
4760 
4761 	cmd = pending_find(MGMT_OP_SET_SECURE_CONN, hdev);
4762 	if (!cmd)
4763 		goto unlock;
4764 
4765 	if (status) {
4766 		mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode,
4767 			        mgmt_status(status));
4768 		goto remove;
4769 	}
4770 
4771 	cp = cmd->param;
4772 
4773 	switch (cp->val) {
4774 	case 0x00:
4775 		hci_dev_clear_flag(hdev, HCI_SC_ENABLED);
4776 		hci_dev_clear_flag(hdev, HCI_SC_ONLY);
4777 		break;
4778 	case 0x01:
4779 		hci_dev_set_flag(hdev, HCI_SC_ENABLED);
4780 		hci_dev_clear_flag(hdev, HCI_SC_ONLY);
4781 		break;
4782 	case 0x02:
4783 		hci_dev_set_flag(hdev, HCI_SC_ENABLED);
4784 		hci_dev_set_flag(hdev, HCI_SC_ONLY);
4785 		break;
4786 	}
4787 
4788 	send_settings_rsp(cmd->sk, MGMT_OP_SET_SECURE_CONN, hdev);
4789 	new_settings(hdev, cmd->sk);
4790 
4791 remove:
4792 	mgmt_pending_remove(cmd);
4793 unlock:
4794 	hci_dev_unlock(hdev);
4795 }
4796 
set_secure_conn(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)4797 static int set_secure_conn(struct sock *sk, struct hci_dev *hdev,
4798 			   void *data, u16 len)
4799 {
4800 	struct mgmt_mode *cp = data;
4801 	struct mgmt_pending_cmd *cmd;
4802 	struct hci_request req;
4803 	u8 val;
4804 	int err;
4805 
4806 	BT_DBG("request for %s", hdev->name);
4807 
4808 	if (!lmp_sc_capable(hdev) &&
4809 	    !hci_dev_test_flag(hdev, HCI_LE_ENABLED))
4810 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SECURE_CONN,
4811 				       MGMT_STATUS_NOT_SUPPORTED);
4812 
4813 	if (hci_dev_test_flag(hdev, HCI_BREDR_ENABLED) &&
4814 	    lmp_sc_capable(hdev) &&
4815 	    !hci_dev_test_flag(hdev, HCI_SSP_ENABLED))
4816 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SECURE_CONN,
4817 				       MGMT_STATUS_REJECTED);
4818 
4819 	if (cp->val != 0x00 && cp->val != 0x01 && cp->val != 0x02)
4820 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SECURE_CONN,
4821 				  MGMT_STATUS_INVALID_PARAMS);
4822 
4823 	hci_dev_lock(hdev);
4824 
4825 	if (!hdev_is_powered(hdev) || !lmp_sc_capable(hdev) ||
4826 	    !hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) {
4827 		bool changed;
4828 
4829 		if (cp->val) {
4830 			changed = !hci_dev_test_and_set_flag(hdev,
4831 							     HCI_SC_ENABLED);
4832 			if (cp->val == 0x02)
4833 				hci_dev_set_flag(hdev, HCI_SC_ONLY);
4834 			else
4835 				hci_dev_clear_flag(hdev, HCI_SC_ONLY);
4836 		} else {
4837 			changed = hci_dev_test_and_clear_flag(hdev,
4838 							      HCI_SC_ENABLED);
4839 			hci_dev_clear_flag(hdev, HCI_SC_ONLY);
4840 		}
4841 
4842 		err = send_settings_rsp(sk, MGMT_OP_SET_SECURE_CONN, hdev);
4843 		if (err < 0)
4844 			goto failed;
4845 
4846 		if (changed)
4847 			err = new_settings(hdev, sk);
4848 
4849 		goto failed;
4850 	}
4851 
4852 	if (pending_find(MGMT_OP_SET_SECURE_CONN, hdev)) {
4853 		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_SECURE_CONN,
4854 				      MGMT_STATUS_BUSY);
4855 		goto failed;
4856 	}
4857 
4858 	val = !!cp->val;
4859 
4860 	if (val == hci_dev_test_flag(hdev, HCI_SC_ENABLED) &&
4861 	    (cp->val == 0x02) == hci_dev_test_flag(hdev, HCI_SC_ONLY)) {
4862 		err = send_settings_rsp(sk, MGMT_OP_SET_SECURE_CONN, hdev);
4863 		goto failed;
4864 	}
4865 
4866 	cmd = mgmt_pending_add(sk, MGMT_OP_SET_SECURE_CONN, hdev, data, len);
4867 	if (!cmd) {
4868 		err = -ENOMEM;
4869 		goto failed;
4870 	}
4871 
4872 	hci_req_init(&req, hdev);
4873 	hci_req_add(&req, HCI_OP_WRITE_SC_SUPPORT, 1, &val);
4874 	err = hci_req_run(&req, sc_enable_complete);
4875 	if (err < 0) {
4876 		mgmt_pending_remove(cmd);
4877 		goto failed;
4878 	}
4879 
4880 failed:
4881 	hci_dev_unlock(hdev);
4882 	return err;
4883 }
4884 
set_debug_keys(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)4885 static int set_debug_keys(struct sock *sk, struct hci_dev *hdev,
4886 			  void *data, u16 len)
4887 {
4888 	struct mgmt_mode *cp = data;
4889 	bool changed, use_changed;
4890 	int err;
4891 
4892 	BT_DBG("request for %s", hdev->name);
4893 
4894 	if (cp->val != 0x00 && cp->val != 0x01 && cp->val != 0x02)
4895 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_DEBUG_KEYS,
4896 				       MGMT_STATUS_INVALID_PARAMS);
4897 
4898 	hci_dev_lock(hdev);
4899 
4900 	if (cp->val)
4901 		changed = !hci_dev_test_and_set_flag(hdev, HCI_KEEP_DEBUG_KEYS);
4902 	else
4903 		changed = hci_dev_test_and_clear_flag(hdev,
4904 						      HCI_KEEP_DEBUG_KEYS);
4905 
4906 	if (cp->val == 0x02)
4907 		use_changed = !hci_dev_test_and_set_flag(hdev,
4908 							 HCI_USE_DEBUG_KEYS);
4909 	else
4910 		use_changed = hci_dev_test_and_clear_flag(hdev,
4911 							  HCI_USE_DEBUG_KEYS);
4912 
4913 	if (hdev_is_powered(hdev) && use_changed &&
4914 	    hci_dev_test_flag(hdev, HCI_SSP_ENABLED)) {
4915 		u8 mode = (cp->val == 0x02) ? 0x01 : 0x00;
4916 		hci_send_cmd(hdev, HCI_OP_WRITE_SSP_DEBUG_MODE,
4917 			     sizeof(mode), &mode);
4918 	}
4919 
4920 	err = send_settings_rsp(sk, MGMT_OP_SET_DEBUG_KEYS, hdev);
4921 	if (err < 0)
4922 		goto unlock;
4923 
4924 	if (changed)
4925 		err = new_settings(hdev, sk);
4926 
4927 unlock:
4928 	hci_dev_unlock(hdev);
4929 	return err;
4930 }
4931 
set_privacy(struct sock * sk,struct hci_dev * hdev,void * cp_data,u16 len)4932 static int set_privacy(struct sock *sk, struct hci_dev *hdev, void *cp_data,
4933 		       u16 len)
4934 {
4935 	struct mgmt_cp_set_privacy *cp = cp_data;
4936 	bool changed;
4937 	int err;
4938 
4939 	BT_DBG("request for %s", hdev->name);
4940 
4941 	if (!lmp_le_capable(hdev))
4942 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PRIVACY,
4943 				       MGMT_STATUS_NOT_SUPPORTED);
4944 
4945 	if (cp->privacy != 0x00 && cp->privacy != 0x01 && cp->privacy != 0x02)
4946 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PRIVACY,
4947 				       MGMT_STATUS_INVALID_PARAMS);
4948 
4949 	if (hdev_is_powered(hdev))
4950 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PRIVACY,
4951 				       MGMT_STATUS_REJECTED);
4952 
4953 	hci_dev_lock(hdev);
4954 
4955 	/* If user space supports this command it is also expected to
4956 	 * handle IRKs. Therefore, set the HCI_RPA_RESOLVING flag.
4957 	 */
4958 	hci_dev_set_flag(hdev, HCI_RPA_RESOLVING);
4959 
4960 	if (cp->privacy) {
4961 		changed = !hci_dev_test_and_set_flag(hdev, HCI_PRIVACY);
4962 		memcpy(hdev->irk, cp->irk, sizeof(hdev->irk));
4963 		hci_dev_set_flag(hdev, HCI_RPA_EXPIRED);
4964 		hci_adv_instances_set_rpa_expired(hdev, true);
4965 		if (cp->privacy == 0x02)
4966 			hci_dev_set_flag(hdev, HCI_LIMITED_PRIVACY);
4967 		else
4968 			hci_dev_clear_flag(hdev, HCI_LIMITED_PRIVACY);
4969 	} else {
4970 		changed = hci_dev_test_and_clear_flag(hdev, HCI_PRIVACY);
4971 		memset(hdev->irk, 0, sizeof(hdev->irk));
4972 		hci_dev_clear_flag(hdev, HCI_RPA_EXPIRED);
4973 		hci_adv_instances_set_rpa_expired(hdev, false);
4974 		hci_dev_clear_flag(hdev, HCI_LIMITED_PRIVACY);
4975 	}
4976 
4977 	err = send_settings_rsp(sk, MGMT_OP_SET_PRIVACY, hdev);
4978 	if (err < 0)
4979 		goto unlock;
4980 
4981 	if (changed)
4982 		err = new_settings(hdev, sk);
4983 
4984 unlock:
4985 	hci_dev_unlock(hdev);
4986 	return err;
4987 }
4988 
irk_is_valid(struct mgmt_irk_info * irk)4989 static bool irk_is_valid(struct mgmt_irk_info *irk)
4990 {
4991 	switch (irk->addr.type) {
4992 	case BDADDR_LE_PUBLIC:
4993 		return true;
4994 
4995 	case BDADDR_LE_RANDOM:
4996 		/* Two most significant bits shall be set */
4997 		if ((irk->addr.bdaddr.b[5] & 0xc0) != 0xc0)
4998 			return false;
4999 		return true;
5000 	}
5001 
5002 	return false;
5003 }
5004 
load_irks(struct sock * sk,struct hci_dev * hdev,void * cp_data,u16 len)5005 static int load_irks(struct sock *sk, struct hci_dev *hdev, void *cp_data,
5006 		     u16 len)
5007 {
5008 	struct mgmt_cp_load_irks *cp = cp_data;
5009 	const u16 max_irk_count = ((U16_MAX - sizeof(*cp)) /
5010 				   sizeof(struct mgmt_irk_info));
5011 	u16 irk_count, expected_len;
5012 	int i, err;
5013 
5014 	BT_DBG("request for %s", hdev->name);
5015 
5016 	if (!lmp_le_capable(hdev))
5017 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_IRKS,
5018 				       MGMT_STATUS_NOT_SUPPORTED);
5019 
5020 	irk_count = __le16_to_cpu(cp->irk_count);
5021 	if (irk_count > max_irk_count) {
5022 		bt_dev_err(hdev, "load_irks: too big irk_count value %u",
5023 			   irk_count);
5024 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_IRKS,
5025 				       MGMT_STATUS_INVALID_PARAMS);
5026 	}
5027 
5028 	expected_len = struct_size(cp, irks, irk_count);
5029 	if (expected_len != len) {
5030 		bt_dev_err(hdev, "load_irks: expected %u bytes, got %u bytes",
5031 			   expected_len, len);
5032 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_IRKS,
5033 				       MGMT_STATUS_INVALID_PARAMS);
5034 	}
5035 
5036 	BT_DBG("%s irk_count %u", hdev->name, irk_count);
5037 
5038 	for (i = 0; i < irk_count; i++) {
5039 		struct mgmt_irk_info *key = &cp->irks[i];
5040 
5041 		if (!irk_is_valid(key))
5042 			return mgmt_cmd_status(sk, hdev->id,
5043 					       MGMT_OP_LOAD_IRKS,
5044 					       MGMT_STATUS_INVALID_PARAMS);
5045 	}
5046 
5047 	hci_dev_lock(hdev);
5048 
5049 	hci_smp_irks_clear(hdev);
5050 
5051 	for (i = 0; i < irk_count; i++) {
5052 		struct mgmt_irk_info *irk = &cp->irks[i];
5053 
5054 		hci_add_irk(hdev, &irk->addr.bdaddr,
5055 			    le_addr_type(irk->addr.type), irk->val,
5056 			    BDADDR_ANY);
5057 	}
5058 
5059 	hci_dev_set_flag(hdev, HCI_RPA_RESOLVING);
5060 
5061 	err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_LOAD_IRKS, 0, NULL, 0);
5062 
5063 	hci_dev_unlock(hdev);
5064 
5065 	return err;
5066 }
5067 
ltk_is_valid(struct mgmt_ltk_info * key)5068 static bool ltk_is_valid(struct mgmt_ltk_info *key)
5069 {
5070 	if (key->master != 0x00 && key->master != 0x01)
5071 		return false;
5072 
5073 	switch (key->addr.type) {
5074 	case BDADDR_LE_PUBLIC:
5075 		return true;
5076 
5077 	case BDADDR_LE_RANDOM:
5078 		/* Two most significant bits shall be set */
5079 		if ((key->addr.bdaddr.b[5] & 0xc0) != 0xc0)
5080 			return false;
5081 		return true;
5082 	}
5083 
5084 	return false;
5085 }
5086 
load_long_term_keys(struct sock * sk,struct hci_dev * hdev,void * cp_data,u16 len)5087 static int load_long_term_keys(struct sock *sk, struct hci_dev *hdev,
5088 			       void *cp_data, u16 len)
5089 {
5090 	struct mgmt_cp_load_long_term_keys *cp = cp_data;
5091 	const u16 max_key_count = ((U16_MAX - sizeof(*cp)) /
5092 				   sizeof(struct mgmt_ltk_info));
5093 	u16 key_count, expected_len;
5094 	int i, err;
5095 
5096 	BT_DBG("request for %s", hdev->name);
5097 
5098 	if (!lmp_le_capable(hdev))
5099 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS,
5100 				       MGMT_STATUS_NOT_SUPPORTED);
5101 
5102 	key_count = __le16_to_cpu(cp->key_count);
5103 	if (key_count > max_key_count) {
5104 		bt_dev_err(hdev, "load_ltks: too big key_count value %u",
5105 			   key_count);
5106 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS,
5107 				       MGMT_STATUS_INVALID_PARAMS);
5108 	}
5109 
5110 	expected_len = struct_size(cp, keys, key_count);
5111 	if (expected_len != len) {
5112 		bt_dev_err(hdev, "load_keys: expected %u bytes, got %u bytes",
5113 			   expected_len, len);
5114 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS,
5115 				       MGMT_STATUS_INVALID_PARAMS);
5116 	}
5117 
5118 	BT_DBG("%s key_count %u", hdev->name, key_count);
5119 
5120 	for (i = 0; i < key_count; i++) {
5121 		struct mgmt_ltk_info *key = &cp->keys[i];
5122 
5123 		if (!ltk_is_valid(key))
5124 			return mgmt_cmd_status(sk, hdev->id,
5125 					       MGMT_OP_LOAD_LONG_TERM_KEYS,
5126 					       MGMT_STATUS_INVALID_PARAMS);
5127 	}
5128 
5129 	hci_dev_lock(hdev);
5130 
5131 	hci_smp_ltks_clear(hdev);
5132 
5133 	for (i = 0; i < key_count; i++) {
5134 		struct mgmt_ltk_info *key = &cp->keys[i];
5135 		u8 type, authenticated;
5136 
5137 		switch (key->type) {
5138 		case MGMT_LTK_UNAUTHENTICATED:
5139 			authenticated = 0x00;
5140 			type = key->master ? SMP_LTK : SMP_LTK_SLAVE;
5141 			break;
5142 		case MGMT_LTK_AUTHENTICATED:
5143 			authenticated = 0x01;
5144 			type = key->master ? SMP_LTK : SMP_LTK_SLAVE;
5145 			break;
5146 		case MGMT_LTK_P256_UNAUTH:
5147 			authenticated = 0x00;
5148 			type = SMP_LTK_P256;
5149 			break;
5150 		case MGMT_LTK_P256_AUTH:
5151 			authenticated = 0x01;
5152 			type = SMP_LTK_P256;
5153 			break;
5154 		case MGMT_LTK_P256_DEBUG:
5155 			authenticated = 0x00;
5156 			type = SMP_LTK_P256_DEBUG;
5157 			/* fall through */
5158 		default:
5159 			continue;
5160 		}
5161 
5162 		hci_add_ltk(hdev, &key->addr.bdaddr,
5163 			    le_addr_type(key->addr.type), type, authenticated,
5164 			    key->val, key->enc_size, key->ediv, key->rand);
5165 	}
5166 
5167 	err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS, 0,
5168 			   NULL, 0);
5169 
5170 	hci_dev_unlock(hdev);
5171 
5172 	return err;
5173 }
5174 
conn_info_cmd_complete(struct mgmt_pending_cmd * cmd,u8 status)5175 static int conn_info_cmd_complete(struct mgmt_pending_cmd *cmd, u8 status)
5176 {
5177 	struct hci_conn *conn = cmd->user_data;
5178 	struct mgmt_rp_get_conn_info rp;
5179 	int err;
5180 
5181 	memcpy(&rp.addr, cmd->param, sizeof(rp.addr));
5182 
5183 	if (status == MGMT_STATUS_SUCCESS) {
5184 		rp.rssi = conn->rssi;
5185 		rp.tx_power = conn->tx_power;
5186 		rp.max_tx_power = conn->max_tx_power;
5187 	} else {
5188 		rp.rssi = HCI_RSSI_INVALID;
5189 		rp.tx_power = HCI_TX_POWER_INVALID;
5190 		rp.max_tx_power = HCI_TX_POWER_INVALID;
5191 	}
5192 
5193 	err = mgmt_cmd_complete(cmd->sk, cmd->index, MGMT_OP_GET_CONN_INFO,
5194 				status, &rp, sizeof(rp));
5195 
5196 	hci_conn_drop(conn);
5197 	hci_conn_put(conn);
5198 
5199 	return err;
5200 }
5201 
conn_info_refresh_complete(struct hci_dev * hdev,u8 hci_status,u16 opcode)5202 static void conn_info_refresh_complete(struct hci_dev *hdev, u8 hci_status,
5203 				       u16 opcode)
5204 {
5205 	struct hci_cp_read_rssi *cp;
5206 	struct mgmt_pending_cmd *cmd;
5207 	struct hci_conn *conn;
5208 	u16 handle;
5209 	u8 status;
5210 
5211 	BT_DBG("status 0x%02x", hci_status);
5212 
5213 	hci_dev_lock(hdev);
5214 
5215 	/* Commands sent in request are either Read RSSI or Read Transmit Power
5216 	 * Level so we check which one was last sent to retrieve connection
5217 	 * handle.  Both commands have handle as first parameter so it's safe to
5218 	 * cast data on the same command struct.
5219 	 *
5220 	 * First command sent is always Read RSSI and we fail only if it fails.
5221 	 * In other case we simply override error to indicate success as we
5222 	 * already remembered if TX power value is actually valid.
5223 	 */
5224 	cp = hci_sent_cmd_data(hdev, HCI_OP_READ_RSSI);
5225 	if (!cp) {
5226 		cp = hci_sent_cmd_data(hdev, HCI_OP_READ_TX_POWER);
5227 		status = MGMT_STATUS_SUCCESS;
5228 	} else {
5229 		status = mgmt_status(hci_status);
5230 	}
5231 
5232 	if (!cp) {
5233 		bt_dev_err(hdev, "invalid sent_cmd in conn_info response");
5234 		goto unlock;
5235 	}
5236 
5237 	handle = __le16_to_cpu(cp->handle);
5238 	conn = hci_conn_hash_lookup_handle(hdev, handle);
5239 	if (!conn) {
5240 		bt_dev_err(hdev, "unknown handle (%d) in conn_info response",
5241 			   handle);
5242 		goto unlock;
5243 	}
5244 
5245 	cmd = pending_find_data(MGMT_OP_GET_CONN_INFO, hdev, conn);
5246 	if (!cmd)
5247 		goto unlock;
5248 
5249 	cmd->cmd_complete(cmd, status);
5250 	mgmt_pending_remove(cmd);
5251 
5252 unlock:
5253 	hci_dev_unlock(hdev);
5254 }
5255 
get_conn_info(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)5256 static int get_conn_info(struct sock *sk, struct hci_dev *hdev, void *data,
5257 			 u16 len)
5258 {
5259 	struct mgmt_cp_get_conn_info *cp = data;
5260 	struct mgmt_rp_get_conn_info rp;
5261 	struct hci_conn *conn;
5262 	unsigned long conn_info_age;
5263 	int err = 0;
5264 
5265 	BT_DBG("%s", hdev->name);
5266 
5267 	memset(&rp, 0, sizeof(rp));
5268 	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
5269 	rp.addr.type = cp->addr.type;
5270 
5271 	if (!bdaddr_type_is_valid(cp->addr.type))
5272 		return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONN_INFO,
5273 					 MGMT_STATUS_INVALID_PARAMS,
5274 					 &rp, sizeof(rp));
5275 
5276 	hci_dev_lock(hdev);
5277 
5278 	if (!hdev_is_powered(hdev)) {
5279 		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONN_INFO,
5280 					MGMT_STATUS_NOT_POWERED, &rp,
5281 					sizeof(rp));
5282 		goto unlock;
5283 	}
5284 
5285 	if (cp->addr.type == BDADDR_BREDR)
5286 		conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK,
5287 					       &cp->addr.bdaddr);
5288 	else
5289 		conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &cp->addr.bdaddr);
5290 
5291 	if (!conn || conn->state != BT_CONNECTED) {
5292 		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONN_INFO,
5293 					MGMT_STATUS_NOT_CONNECTED, &rp,
5294 					sizeof(rp));
5295 		goto unlock;
5296 	}
5297 
5298 	if (pending_find_data(MGMT_OP_GET_CONN_INFO, hdev, conn)) {
5299 		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONN_INFO,
5300 					MGMT_STATUS_BUSY, &rp, sizeof(rp));
5301 		goto unlock;
5302 	}
5303 
5304 	/* To avoid client trying to guess when to poll again for information we
5305 	 * calculate conn info age as random value between min/max set in hdev.
5306 	 */
5307 	conn_info_age = hdev->conn_info_min_age +
5308 			prandom_u32_max(hdev->conn_info_max_age -
5309 					hdev->conn_info_min_age);
5310 
5311 	/* Query controller to refresh cached values if they are too old or were
5312 	 * never read.
5313 	 */
5314 	if (time_after(jiffies, conn->conn_info_timestamp +
5315 		       msecs_to_jiffies(conn_info_age)) ||
5316 	    !conn->conn_info_timestamp) {
5317 		struct hci_request req;
5318 		struct hci_cp_read_tx_power req_txp_cp;
5319 		struct hci_cp_read_rssi req_rssi_cp;
5320 		struct mgmt_pending_cmd *cmd;
5321 
5322 		hci_req_init(&req, hdev);
5323 		req_rssi_cp.handle = cpu_to_le16(conn->handle);
5324 		hci_req_add(&req, HCI_OP_READ_RSSI, sizeof(req_rssi_cp),
5325 			    &req_rssi_cp);
5326 
5327 		/* For LE links TX power does not change thus we don't need to
5328 		 * query for it once value is known.
5329 		 */
5330 		if (!bdaddr_type_is_le(cp->addr.type) ||
5331 		    conn->tx_power == HCI_TX_POWER_INVALID) {
5332 			req_txp_cp.handle = cpu_to_le16(conn->handle);
5333 			req_txp_cp.type = 0x00;
5334 			hci_req_add(&req, HCI_OP_READ_TX_POWER,
5335 				    sizeof(req_txp_cp), &req_txp_cp);
5336 		}
5337 
5338 		/* Max TX power needs to be read only once per connection */
5339 		if (conn->max_tx_power == HCI_TX_POWER_INVALID) {
5340 			req_txp_cp.handle = cpu_to_le16(conn->handle);
5341 			req_txp_cp.type = 0x01;
5342 			hci_req_add(&req, HCI_OP_READ_TX_POWER,
5343 				    sizeof(req_txp_cp), &req_txp_cp);
5344 		}
5345 
5346 		err = hci_req_run(&req, conn_info_refresh_complete);
5347 		if (err < 0)
5348 			goto unlock;
5349 
5350 		cmd = mgmt_pending_add(sk, MGMT_OP_GET_CONN_INFO, hdev,
5351 				       data, len);
5352 		if (!cmd) {
5353 			err = -ENOMEM;
5354 			goto unlock;
5355 		}
5356 
5357 		hci_conn_hold(conn);
5358 		cmd->user_data = hci_conn_get(conn);
5359 		cmd->cmd_complete = conn_info_cmd_complete;
5360 
5361 		conn->conn_info_timestamp = jiffies;
5362 	} else {
5363 		/* Cache is valid, just reply with values cached in hci_conn */
5364 		rp.rssi = conn->rssi;
5365 		rp.tx_power = conn->tx_power;
5366 		rp.max_tx_power = conn->max_tx_power;
5367 
5368 		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CONN_INFO,
5369 					MGMT_STATUS_SUCCESS, &rp, sizeof(rp));
5370 	}
5371 
5372 unlock:
5373 	hci_dev_unlock(hdev);
5374 	return err;
5375 }
5376 
clock_info_cmd_complete(struct mgmt_pending_cmd * cmd,u8 status)5377 static int clock_info_cmd_complete(struct mgmt_pending_cmd *cmd, u8 status)
5378 {
5379 	struct hci_conn *conn = cmd->user_data;
5380 	struct mgmt_rp_get_clock_info rp;
5381 	struct hci_dev *hdev;
5382 	int err;
5383 
5384 	memset(&rp, 0, sizeof(rp));
5385 	memcpy(&rp.addr, cmd->param, sizeof(rp.addr));
5386 
5387 	if (status)
5388 		goto complete;
5389 
5390 	hdev = hci_dev_get(cmd->index);
5391 	if (hdev) {
5392 		rp.local_clock = cpu_to_le32(hdev->clock);
5393 		hci_dev_put(hdev);
5394 	}
5395 
5396 	if (conn) {
5397 		rp.piconet_clock = cpu_to_le32(conn->clock);
5398 		rp.accuracy = cpu_to_le16(conn->clock_accuracy);
5399 	}
5400 
5401 complete:
5402 	err = mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, status, &rp,
5403 				sizeof(rp));
5404 
5405 	if (conn) {
5406 		hci_conn_drop(conn);
5407 		hci_conn_put(conn);
5408 	}
5409 
5410 	return err;
5411 }
5412 
get_clock_info_complete(struct hci_dev * hdev,u8 status,u16 opcode)5413 static void get_clock_info_complete(struct hci_dev *hdev, u8 status, u16 opcode)
5414 {
5415 	struct hci_cp_read_clock *hci_cp;
5416 	struct mgmt_pending_cmd *cmd;
5417 	struct hci_conn *conn;
5418 
5419 	BT_DBG("%s status %u", hdev->name, status);
5420 
5421 	hci_dev_lock(hdev);
5422 
5423 	hci_cp = hci_sent_cmd_data(hdev, HCI_OP_READ_CLOCK);
5424 	if (!hci_cp)
5425 		goto unlock;
5426 
5427 	if (hci_cp->which) {
5428 		u16 handle = __le16_to_cpu(hci_cp->handle);
5429 		conn = hci_conn_hash_lookup_handle(hdev, handle);
5430 	} else {
5431 		conn = NULL;
5432 	}
5433 
5434 	cmd = pending_find_data(MGMT_OP_GET_CLOCK_INFO, hdev, conn);
5435 	if (!cmd)
5436 		goto unlock;
5437 
5438 	cmd->cmd_complete(cmd, mgmt_status(status));
5439 	mgmt_pending_remove(cmd);
5440 
5441 unlock:
5442 	hci_dev_unlock(hdev);
5443 }
5444 
get_clock_info(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)5445 static int get_clock_info(struct sock *sk, struct hci_dev *hdev, void *data,
5446 			 u16 len)
5447 {
5448 	struct mgmt_cp_get_clock_info *cp = data;
5449 	struct mgmt_rp_get_clock_info rp;
5450 	struct hci_cp_read_clock hci_cp;
5451 	struct mgmt_pending_cmd *cmd;
5452 	struct hci_request req;
5453 	struct hci_conn *conn;
5454 	int err;
5455 
5456 	BT_DBG("%s", hdev->name);
5457 
5458 	memset(&rp, 0, sizeof(rp));
5459 	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
5460 	rp.addr.type = cp->addr.type;
5461 
5462 	if (cp->addr.type != BDADDR_BREDR)
5463 		return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CLOCK_INFO,
5464 					 MGMT_STATUS_INVALID_PARAMS,
5465 					 &rp, sizeof(rp));
5466 
5467 	hci_dev_lock(hdev);
5468 
5469 	if (!hdev_is_powered(hdev)) {
5470 		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_CLOCK_INFO,
5471 					MGMT_STATUS_NOT_POWERED, &rp,
5472 					sizeof(rp));
5473 		goto unlock;
5474 	}
5475 
5476 	if (bacmp(&cp->addr.bdaddr, BDADDR_ANY)) {
5477 		conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK,
5478 					       &cp->addr.bdaddr);
5479 		if (!conn || conn->state != BT_CONNECTED) {
5480 			err = mgmt_cmd_complete(sk, hdev->id,
5481 						MGMT_OP_GET_CLOCK_INFO,
5482 						MGMT_STATUS_NOT_CONNECTED,
5483 						&rp, sizeof(rp));
5484 			goto unlock;
5485 		}
5486 	} else {
5487 		conn = NULL;
5488 	}
5489 
5490 	cmd = mgmt_pending_add(sk, MGMT_OP_GET_CLOCK_INFO, hdev, data, len);
5491 	if (!cmd) {
5492 		err = -ENOMEM;
5493 		goto unlock;
5494 	}
5495 
5496 	cmd->cmd_complete = clock_info_cmd_complete;
5497 
5498 	hci_req_init(&req, hdev);
5499 
5500 	memset(&hci_cp, 0, sizeof(hci_cp));
5501 	hci_req_add(&req, HCI_OP_READ_CLOCK, sizeof(hci_cp), &hci_cp);
5502 
5503 	if (conn) {
5504 		hci_conn_hold(conn);
5505 		cmd->user_data = hci_conn_get(conn);
5506 
5507 		hci_cp.handle = cpu_to_le16(conn->handle);
5508 		hci_cp.which = 0x01; /* Piconet clock */
5509 		hci_req_add(&req, HCI_OP_READ_CLOCK, sizeof(hci_cp), &hci_cp);
5510 	}
5511 
5512 	err = hci_req_run(&req, get_clock_info_complete);
5513 	if (err < 0)
5514 		mgmt_pending_remove(cmd);
5515 
5516 unlock:
5517 	hci_dev_unlock(hdev);
5518 	return err;
5519 }
5520 
is_connected(struct hci_dev * hdev,bdaddr_t * addr,u8 type)5521 static bool is_connected(struct hci_dev *hdev, bdaddr_t *addr, u8 type)
5522 {
5523 	struct hci_conn *conn;
5524 
5525 	conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, addr);
5526 	if (!conn)
5527 		return false;
5528 
5529 	if (conn->dst_type != type)
5530 		return false;
5531 
5532 	if (conn->state != BT_CONNECTED)
5533 		return false;
5534 
5535 	return true;
5536 }
5537 
5538 /* This function requires the caller holds hdev->lock */
hci_conn_params_set(struct hci_dev * hdev,bdaddr_t * addr,u8 addr_type,u8 auto_connect)5539 static int hci_conn_params_set(struct hci_dev *hdev, bdaddr_t *addr,
5540 			       u8 addr_type, u8 auto_connect)
5541 {
5542 	struct hci_conn_params *params;
5543 
5544 	params = hci_conn_params_add(hdev, addr, addr_type);
5545 	if (!params)
5546 		return -EIO;
5547 
5548 	if (params->auto_connect == auto_connect)
5549 		return 0;
5550 
5551 	list_del_init(&params->action);
5552 
5553 	switch (auto_connect) {
5554 	case HCI_AUTO_CONN_DISABLED:
5555 	case HCI_AUTO_CONN_LINK_LOSS:
5556 		/* If auto connect is being disabled when we're trying to
5557 		 * connect to device, keep connecting.
5558 		 */
5559 		if (params->explicit_connect)
5560 			list_add(&params->action, &hdev->pend_le_conns);
5561 		break;
5562 	case HCI_AUTO_CONN_REPORT:
5563 		if (params->explicit_connect)
5564 			list_add(&params->action, &hdev->pend_le_conns);
5565 		else
5566 			list_add(&params->action, &hdev->pend_le_reports);
5567 		break;
5568 	case HCI_AUTO_CONN_DIRECT:
5569 	case HCI_AUTO_CONN_ALWAYS:
5570 		if (!is_connected(hdev, addr, addr_type))
5571 			list_add(&params->action, &hdev->pend_le_conns);
5572 		break;
5573 	}
5574 
5575 	params->auto_connect = auto_connect;
5576 
5577 	BT_DBG("addr %pMR (type %u) auto_connect %u", addr, addr_type,
5578 	       auto_connect);
5579 
5580 	return 0;
5581 }
5582 
device_added(struct sock * sk,struct hci_dev * hdev,bdaddr_t * bdaddr,u8 type,u8 action)5583 static void device_added(struct sock *sk, struct hci_dev *hdev,
5584 			 bdaddr_t *bdaddr, u8 type, u8 action)
5585 {
5586 	struct mgmt_ev_device_added ev;
5587 
5588 	bacpy(&ev.addr.bdaddr, bdaddr);
5589 	ev.addr.type = type;
5590 	ev.action = action;
5591 
5592 	mgmt_event(MGMT_EV_DEVICE_ADDED, hdev, &ev, sizeof(ev), sk);
5593 }
5594 
add_device(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)5595 static int add_device(struct sock *sk, struct hci_dev *hdev,
5596 		      void *data, u16 len)
5597 {
5598 	struct mgmt_cp_add_device *cp = data;
5599 	u8 auto_conn, addr_type;
5600 	int err;
5601 
5602 	BT_DBG("%s", hdev->name);
5603 
5604 	if (!bdaddr_type_is_valid(cp->addr.type) ||
5605 	    !bacmp(&cp->addr.bdaddr, BDADDR_ANY))
5606 		return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_DEVICE,
5607 					 MGMT_STATUS_INVALID_PARAMS,
5608 					 &cp->addr, sizeof(cp->addr));
5609 
5610 	if (cp->action != 0x00 && cp->action != 0x01 && cp->action != 0x02)
5611 		return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_DEVICE,
5612 					 MGMT_STATUS_INVALID_PARAMS,
5613 					 &cp->addr, sizeof(cp->addr));
5614 
5615 	hci_dev_lock(hdev);
5616 
5617 	if (cp->addr.type == BDADDR_BREDR) {
5618 		/* Only incoming connections action is supported for now */
5619 		if (cp->action != 0x01) {
5620 			err = mgmt_cmd_complete(sk, hdev->id,
5621 						MGMT_OP_ADD_DEVICE,
5622 						MGMT_STATUS_INVALID_PARAMS,
5623 						&cp->addr, sizeof(cp->addr));
5624 			goto unlock;
5625 		}
5626 
5627 		err = hci_bdaddr_list_add(&hdev->whitelist, &cp->addr.bdaddr,
5628 					  cp->addr.type);
5629 		if (err)
5630 			goto unlock;
5631 
5632 		hci_req_update_scan(hdev);
5633 
5634 		goto added;
5635 	}
5636 
5637 	addr_type = le_addr_type(cp->addr.type);
5638 
5639 	if (cp->action == 0x02)
5640 		auto_conn = HCI_AUTO_CONN_ALWAYS;
5641 	else if (cp->action == 0x01)
5642 		auto_conn = HCI_AUTO_CONN_DIRECT;
5643 	else
5644 		auto_conn = HCI_AUTO_CONN_REPORT;
5645 
5646 	/* Kernel internally uses conn_params with resolvable private
5647 	 * address, but Add Device allows only identity addresses.
5648 	 * Make sure it is enforced before calling
5649 	 * hci_conn_params_lookup.
5650 	 */
5651 	if (!hci_is_identity_address(&cp->addr.bdaddr, addr_type)) {
5652 		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_DEVICE,
5653 					MGMT_STATUS_INVALID_PARAMS,
5654 					&cp->addr, sizeof(cp->addr));
5655 		goto unlock;
5656 	}
5657 
5658 	/* If the connection parameters don't exist for this device,
5659 	 * they will be created and configured with defaults.
5660 	 */
5661 	if (hci_conn_params_set(hdev, &cp->addr.bdaddr, addr_type,
5662 				auto_conn) < 0) {
5663 		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_DEVICE,
5664 					MGMT_STATUS_FAILED, &cp->addr,
5665 					sizeof(cp->addr));
5666 		goto unlock;
5667 	}
5668 
5669 	hci_update_background_scan(hdev);
5670 
5671 added:
5672 	device_added(sk, hdev, &cp->addr.bdaddr, cp->addr.type, cp->action);
5673 
5674 	err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_DEVICE,
5675 				MGMT_STATUS_SUCCESS, &cp->addr,
5676 				sizeof(cp->addr));
5677 
5678 unlock:
5679 	hci_dev_unlock(hdev);
5680 	return err;
5681 }
5682 
device_removed(struct sock * sk,struct hci_dev * hdev,bdaddr_t * bdaddr,u8 type)5683 static void device_removed(struct sock *sk, struct hci_dev *hdev,
5684 			   bdaddr_t *bdaddr, u8 type)
5685 {
5686 	struct mgmt_ev_device_removed ev;
5687 
5688 	bacpy(&ev.addr.bdaddr, bdaddr);
5689 	ev.addr.type = type;
5690 
5691 	mgmt_event(MGMT_EV_DEVICE_REMOVED, hdev, &ev, sizeof(ev), sk);
5692 }
5693 
remove_device(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)5694 static int remove_device(struct sock *sk, struct hci_dev *hdev,
5695 			 void *data, u16 len)
5696 {
5697 	struct mgmt_cp_remove_device *cp = data;
5698 	int err;
5699 
5700 	BT_DBG("%s", hdev->name);
5701 
5702 	hci_dev_lock(hdev);
5703 
5704 	if (bacmp(&cp->addr.bdaddr, BDADDR_ANY)) {
5705 		struct hci_conn_params *params;
5706 		u8 addr_type;
5707 
5708 		if (!bdaddr_type_is_valid(cp->addr.type)) {
5709 			err = mgmt_cmd_complete(sk, hdev->id,
5710 						MGMT_OP_REMOVE_DEVICE,
5711 						MGMT_STATUS_INVALID_PARAMS,
5712 						&cp->addr, sizeof(cp->addr));
5713 			goto unlock;
5714 		}
5715 
5716 		if (cp->addr.type == BDADDR_BREDR) {
5717 			err = hci_bdaddr_list_del(&hdev->whitelist,
5718 						  &cp->addr.bdaddr,
5719 						  cp->addr.type);
5720 			if (err) {
5721 				err = mgmt_cmd_complete(sk, hdev->id,
5722 							MGMT_OP_REMOVE_DEVICE,
5723 							MGMT_STATUS_INVALID_PARAMS,
5724 							&cp->addr,
5725 							sizeof(cp->addr));
5726 				goto unlock;
5727 			}
5728 
5729 			hci_req_update_scan(hdev);
5730 
5731 			device_removed(sk, hdev, &cp->addr.bdaddr,
5732 				       cp->addr.type);
5733 			goto complete;
5734 		}
5735 
5736 		addr_type = le_addr_type(cp->addr.type);
5737 
5738 		/* Kernel internally uses conn_params with resolvable private
5739 		 * address, but Remove Device allows only identity addresses.
5740 		 * Make sure it is enforced before calling
5741 		 * hci_conn_params_lookup.
5742 		 */
5743 		if (!hci_is_identity_address(&cp->addr.bdaddr, addr_type)) {
5744 			err = mgmt_cmd_complete(sk, hdev->id,
5745 						MGMT_OP_REMOVE_DEVICE,
5746 						MGMT_STATUS_INVALID_PARAMS,
5747 						&cp->addr, sizeof(cp->addr));
5748 			goto unlock;
5749 		}
5750 
5751 		params = hci_conn_params_lookup(hdev, &cp->addr.bdaddr,
5752 						addr_type);
5753 		if (!params) {
5754 			err = mgmt_cmd_complete(sk, hdev->id,
5755 						MGMT_OP_REMOVE_DEVICE,
5756 						MGMT_STATUS_INVALID_PARAMS,
5757 						&cp->addr, sizeof(cp->addr));
5758 			goto unlock;
5759 		}
5760 
5761 		if (params->auto_connect == HCI_AUTO_CONN_DISABLED ||
5762 		    params->auto_connect == HCI_AUTO_CONN_EXPLICIT) {
5763 			err = mgmt_cmd_complete(sk, hdev->id,
5764 						MGMT_OP_REMOVE_DEVICE,
5765 						MGMT_STATUS_INVALID_PARAMS,
5766 						&cp->addr, sizeof(cp->addr));
5767 			goto unlock;
5768 		}
5769 
5770 		list_del(&params->action);
5771 		list_del(&params->list);
5772 		kfree(params);
5773 		hci_update_background_scan(hdev);
5774 
5775 		device_removed(sk, hdev, &cp->addr.bdaddr, cp->addr.type);
5776 	} else {
5777 		struct hci_conn_params *p, *tmp;
5778 		struct bdaddr_list *b, *btmp;
5779 
5780 		if (cp->addr.type) {
5781 			err = mgmt_cmd_complete(sk, hdev->id,
5782 						MGMT_OP_REMOVE_DEVICE,
5783 						MGMT_STATUS_INVALID_PARAMS,
5784 						&cp->addr, sizeof(cp->addr));
5785 			goto unlock;
5786 		}
5787 
5788 		list_for_each_entry_safe(b, btmp, &hdev->whitelist, list) {
5789 			device_removed(sk, hdev, &b->bdaddr, b->bdaddr_type);
5790 			list_del(&b->list);
5791 			kfree(b);
5792 		}
5793 
5794 		hci_req_update_scan(hdev);
5795 
5796 		list_for_each_entry_safe(p, tmp, &hdev->le_conn_params, list) {
5797 			if (p->auto_connect == HCI_AUTO_CONN_DISABLED)
5798 				continue;
5799 			device_removed(sk, hdev, &p->addr, p->addr_type);
5800 			if (p->explicit_connect) {
5801 				p->auto_connect = HCI_AUTO_CONN_EXPLICIT;
5802 				continue;
5803 			}
5804 			list_del(&p->action);
5805 			list_del(&p->list);
5806 			kfree(p);
5807 		}
5808 
5809 		BT_DBG("All LE connection parameters were removed");
5810 
5811 		hci_update_background_scan(hdev);
5812 	}
5813 
5814 complete:
5815 	err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_DEVICE,
5816 				MGMT_STATUS_SUCCESS, &cp->addr,
5817 				sizeof(cp->addr));
5818 unlock:
5819 	hci_dev_unlock(hdev);
5820 	return err;
5821 }
5822 
load_conn_param(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)5823 static int load_conn_param(struct sock *sk, struct hci_dev *hdev, void *data,
5824 			   u16 len)
5825 {
5826 	struct mgmt_cp_load_conn_param *cp = data;
5827 	const u16 max_param_count = ((U16_MAX - sizeof(*cp)) /
5828 				     sizeof(struct mgmt_conn_param));
5829 	u16 param_count, expected_len;
5830 	int i;
5831 
5832 	if (!lmp_le_capable(hdev))
5833 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_CONN_PARAM,
5834 				       MGMT_STATUS_NOT_SUPPORTED);
5835 
5836 	param_count = __le16_to_cpu(cp->param_count);
5837 	if (param_count > max_param_count) {
5838 		bt_dev_err(hdev, "load_conn_param: too big param_count value %u",
5839 			   param_count);
5840 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_CONN_PARAM,
5841 				       MGMT_STATUS_INVALID_PARAMS);
5842 	}
5843 
5844 	expected_len = struct_size(cp, params, param_count);
5845 	if (expected_len != len) {
5846 		bt_dev_err(hdev, "load_conn_param: expected %u bytes, got %u bytes",
5847 			   expected_len, len);
5848 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_LOAD_CONN_PARAM,
5849 				       MGMT_STATUS_INVALID_PARAMS);
5850 	}
5851 
5852 	BT_DBG("%s param_count %u", hdev->name, param_count);
5853 
5854 	hci_dev_lock(hdev);
5855 
5856 	hci_conn_params_clear_disabled(hdev);
5857 
5858 	for (i = 0; i < param_count; i++) {
5859 		struct mgmt_conn_param *param = &cp->params[i];
5860 		struct hci_conn_params *hci_param;
5861 		u16 min, max, latency, timeout;
5862 		u8 addr_type;
5863 
5864 		BT_DBG("Adding %pMR (type %u)", &param->addr.bdaddr,
5865 		       param->addr.type);
5866 
5867 		if (param->addr.type == BDADDR_LE_PUBLIC) {
5868 			addr_type = ADDR_LE_DEV_PUBLIC;
5869 		} else if (param->addr.type == BDADDR_LE_RANDOM) {
5870 			addr_type = ADDR_LE_DEV_RANDOM;
5871 		} else {
5872 			bt_dev_err(hdev, "ignoring invalid connection parameters");
5873 			continue;
5874 		}
5875 
5876 		min = le16_to_cpu(param->min_interval);
5877 		max = le16_to_cpu(param->max_interval);
5878 		latency = le16_to_cpu(param->latency);
5879 		timeout = le16_to_cpu(param->timeout);
5880 
5881 		BT_DBG("min 0x%04x max 0x%04x latency 0x%04x timeout 0x%04x",
5882 		       min, max, latency, timeout);
5883 
5884 		if (hci_check_conn_params(min, max, latency, timeout) < 0) {
5885 			bt_dev_err(hdev, "ignoring invalid connection parameters");
5886 			continue;
5887 		}
5888 
5889 		hci_param = hci_conn_params_add(hdev, &param->addr.bdaddr,
5890 						addr_type);
5891 		if (!hci_param) {
5892 			bt_dev_err(hdev, "failed to add connection parameters");
5893 			continue;
5894 		}
5895 
5896 		hci_param->conn_min_interval = min;
5897 		hci_param->conn_max_interval = max;
5898 		hci_param->conn_latency = latency;
5899 		hci_param->supervision_timeout = timeout;
5900 	}
5901 
5902 	hci_dev_unlock(hdev);
5903 
5904 	return mgmt_cmd_complete(sk, hdev->id, MGMT_OP_LOAD_CONN_PARAM, 0,
5905 				 NULL, 0);
5906 }
5907 
set_external_config(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)5908 static int set_external_config(struct sock *sk, struct hci_dev *hdev,
5909 			       void *data, u16 len)
5910 {
5911 	struct mgmt_cp_set_external_config *cp = data;
5912 	bool changed;
5913 	int err;
5914 
5915 	BT_DBG("%s", hdev->name);
5916 
5917 	if (hdev_is_powered(hdev))
5918 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_EXTERNAL_CONFIG,
5919 				       MGMT_STATUS_REJECTED);
5920 
5921 	if (cp->config != 0x00 && cp->config != 0x01)
5922 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_EXTERNAL_CONFIG,
5923 				         MGMT_STATUS_INVALID_PARAMS);
5924 
5925 	if (!test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks))
5926 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_EXTERNAL_CONFIG,
5927 				       MGMT_STATUS_NOT_SUPPORTED);
5928 
5929 	hci_dev_lock(hdev);
5930 
5931 	if (cp->config)
5932 		changed = !hci_dev_test_and_set_flag(hdev, HCI_EXT_CONFIGURED);
5933 	else
5934 		changed = hci_dev_test_and_clear_flag(hdev, HCI_EXT_CONFIGURED);
5935 
5936 	err = send_options_rsp(sk, MGMT_OP_SET_EXTERNAL_CONFIG, hdev);
5937 	if (err < 0)
5938 		goto unlock;
5939 
5940 	if (!changed)
5941 		goto unlock;
5942 
5943 	err = new_options(hdev, sk);
5944 
5945 	if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED) == is_configured(hdev)) {
5946 		mgmt_index_removed(hdev);
5947 
5948 		if (hci_dev_test_and_change_flag(hdev, HCI_UNCONFIGURED)) {
5949 			hci_dev_set_flag(hdev, HCI_CONFIG);
5950 			hci_dev_set_flag(hdev, HCI_AUTO_OFF);
5951 
5952 			queue_work(hdev->req_workqueue, &hdev->power_on);
5953 		} else {
5954 			set_bit(HCI_RAW, &hdev->flags);
5955 			mgmt_index_added(hdev);
5956 		}
5957 	}
5958 
5959 unlock:
5960 	hci_dev_unlock(hdev);
5961 	return err;
5962 }
5963 
set_public_address(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)5964 static int set_public_address(struct sock *sk, struct hci_dev *hdev,
5965 			      void *data, u16 len)
5966 {
5967 	struct mgmt_cp_set_public_address *cp = data;
5968 	bool changed;
5969 	int err;
5970 
5971 	BT_DBG("%s", hdev->name);
5972 
5973 	if (hdev_is_powered(hdev))
5974 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PUBLIC_ADDRESS,
5975 				       MGMT_STATUS_REJECTED);
5976 
5977 	if (!bacmp(&cp->bdaddr, BDADDR_ANY))
5978 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PUBLIC_ADDRESS,
5979 				       MGMT_STATUS_INVALID_PARAMS);
5980 
5981 	if (!hdev->set_bdaddr)
5982 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_PUBLIC_ADDRESS,
5983 				       MGMT_STATUS_NOT_SUPPORTED);
5984 
5985 	hci_dev_lock(hdev);
5986 
5987 	changed = !!bacmp(&hdev->public_addr, &cp->bdaddr);
5988 	bacpy(&hdev->public_addr, &cp->bdaddr);
5989 
5990 	err = send_options_rsp(sk, MGMT_OP_SET_PUBLIC_ADDRESS, hdev);
5991 	if (err < 0)
5992 		goto unlock;
5993 
5994 	if (!changed)
5995 		goto unlock;
5996 
5997 	if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED))
5998 		err = new_options(hdev, sk);
5999 
6000 	if (is_configured(hdev)) {
6001 		mgmt_index_removed(hdev);
6002 
6003 		hci_dev_clear_flag(hdev, HCI_UNCONFIGURED);
6004 
6005 		hci_dev_set_flag(hdev, HCI_CONFIG);
6006 		hci_dev_set_flag(hdev, HCI_AUTO_OFF);
6007 
6008 		queue_work(hdev->req_workqueue, &hdev->power_on);
6009 	}
6010 
6011 unlock:
6012 	hci_dev_unlock(hdev);
6013 	return err;
6014 }
6015 
read_local_oob_ext_data_complete(struct hci_dev * hdev,u8 status,u16 opcode,struct sk_buff * skb)6016 static void read_local_oob_ext_data_complete(struct hci_dev *hdev, u8 status,
6017 					     u16 opcode, struct sk_buff *skb)
6018 {
6019 	const struct mgmt_cp_read_local_oob_ext_data *mgmt_cp;
6020 	struct mgmt_rp_read_local_oob_ext_data *mgmt_rp;
6021 	u8 *h192, *r192, *h256, *r256;
6022 	struct mgmt_pending_cmd *cmd;
6023 	u16 eir_len;
6024 	int err;
6025 
6026 	BT_DBG("%s status %u", hdev->name, status);
6027 
6028 	cmd = pending_find(MGMT_OP_READ_LOCAL_OOB_EXT_DATA, hdev);
6029 	if (!cmd)
6030 		return;
6031 
6032 	mgmt_cp = cmd->param;
6033 
6034 	if (status) {
6035 		status = mgmt_status(status);
6036 		eir_len = 0;
6037 
6038 		h192 = NULL;
6039 		r192 = NULL;
6040 		h256 = NULL;
6041 		r256 = NULL;
6042 	} else if (opcode == HCI_OP_READ_LOCAL_OOB_DATA) {
6043 		struct hci_rp_read_local_oob_data *rp;
6044 
6045 		if (skb->len != sizeof(*rp)) {
6046 			status = MGMT_STATUS_FAILED;
6047 			eir_len = 0;
6048 		} else {
6049 			status = MGMT_STATUS_SUCCESS;
6050 			rp = (void *)skb->data;
6051 
6052 			eir_len = 5 + 18 + 18;
6053 			h192 = rp->hash;
6054 			r192 = rp->rand;
6055 			h256 = NULL;
6056 			r256 = NULL;
6057 		}
6058 	} else {
6059 		struct hci_rp_read_local_oob_ext_data *rp;
6060 
6061 		if (skb->len != sizeof(*rp)) {
6062 			status = MGMT_STATUS_FAILED;
6063 			eir_len = 0;
6064 		} else {
6065 			status = MGMT_STATUS_SUCCESS;
6066 			rp = (void *)skb->data;
6067 
6068 			if (hci_dev_test_flag(hdev, HCI_SC_ONLY)) {
6069 				eir_len = 5 + 18 + 18;
6070 				h192 = NULL;
6071 				r192 = NULL;
6072 			} else {
6073 				eir_len = 5 + 18 + 18 + 18 + 18;
6074 				h192 = rp->hash192;
6075 				r192 = rp->rand192;
6076 			}
6077 
6078 			h256 = rp->hash256;
6079 			r256 = rp->rand256;
6080 		}
6081 	}
6082 
6083 	mgmt_rp = kmalloc(sizeof(*mgmt_rp) + eir_len, GFP_KERNEL);
6084 	if (!mgmt_rp)
6085 		goto done;
6086 
6087 	if (status)
6088 		goto send_rsp;
6089 
6090 	eir_len = eir_append_data(mgmt_rp->eir, 0, EIR_CLASS_OF_DEV,
6091 				  hdev->dev_class, 3);
6092 
6093 	if (h192 && r192) {
6094 		eir_len = eir_append_data(mgmt_rp->eir, eir_len,
6095 					  EIR_SSP_HASH_C192, h192, 16);
6096 		eir_len = eir_append_data(mgmt_rp->eir, eir_len,
6097 					  EIR_SSP_RAND_R192, r192, 16);
6098 	}
6099 
6100 	if (h256 && r256) {
6101 		eir_len = eir_append_data(mgmt_rp->eir, eir_len,
6102 					  EIR_SSP_HASH_C256, h256, 16);
6103 		eir_len = eir_append_data(mgmt_rp->eir, eir_len,
6104 					  EIR_SSP_RAND_R256, r256, 16);
6105 	}
6106 
6107 send_rsp:
6108 	mgmt_rp->type = mgmt_cp->type;
6109 	mgmt_rp->eir_len = cpu_to_le16(eir_len);
6110 
6111 	err = mgmt_cmd_complete(cmd->sk, hdev->id,
6112 				MGMT_OP_READ_LOCAL_OOB_EXT_DATA, status,
6113 				mgmt_rp, sizeof(*mgmt_rp) + eir_len);
6114 	if (err < 0 || status)
6115 		goto done;
6116 
6117 	hci_sock_set_flag(cmd->sk, HCI_MGMT_OOB_DATA_EVENTS);
6118 
6119 	err = mgmt_limited_event(MGMT_EV_LOCAL_OOB_DATA_UPDATED, hdev,
6120 				 mgmt_rp, sizeof(*mgmt_rp) + eir_len,
6121 				 HCI_MGMT_OOB_DATA_EVENTS, cmd->sk);
6122 done:
6123 	kfree(mgmt_rp);
6124 	mgmt_pending_remove(cmd);
6125 }
6126 
read_local_ssp_oob_req(struct hci_dev * hdev,struct sock * sk,struct mgmt_cp_read_local_oob_ext_data * cp)6127 static int read_local_ssp_oob_req(struct hci_dev *hdev, struct sock *sk,
6128 				  struct mgmt_cp_read_local_oob_ext_data *cp)
6129 {
6130 	struct mgmt_pending_cmd *cmd;
6131 	struct hci_request req;
6132 	int err;
6133 
6134 	cmd = mgmt_pending_add(sk, MGMT_OP_READ_LOCAL_OOB_EXT_DATA, hdev,
6135 			       cp, sizeof(*cp));
6136 	if (!cmd)
6137 		return -ENOMEM;
6138 
6139 	hci_req_init(&req, hdev);
6140 
6141 	if (bredr_sc_enabled(hdev))
6142 		hci_req_add(&req, HCI_OP_READ_LOCAL_OOB_EXT_DATA, 0, NULL);
6143 	else
6144 		hci_req_add(&req, HCI_OP_READ_LOCAL_OOB_DATA, 0, NULL);
6145 
6146 	err = hci_req_run_skb(&req, read_local_oob_ext_data_complete);
6147 	if (err < 0) {
6148 		mgmt_pending_remove(cmd);
6149 		return err;
6150 	}
6151 
6152 	return 0;
6153 }
6154 
read_local_oob_ext_data(struct sock * sk,struct hci_dev * hdev,void * data,u16 data_len)6155 static int read_local_oob_ext_data(struct sock *sk, struct hci_dev *hdev,
6156 				   void *data, u16 data_len)
6157 {
6158 	struct mgmt_cp_read_local_oob_ext_data *cp = data;
6159 	struct mgmt_rp_read_local_oob_ext_data *rp;
6160 	size_t rp_len;
6161 	u16 eir_len;
6162 	u8 status, flags, role, addr[7], hash[16], rand[16];
6163 	int err;
6164 
6165 	BT_DBG("%s", hdev->name);
6166 
6167 	if (hdev_is_powered(hdev)) {
6168 		switch (cp->type) {
6169 		case BIT(BDADDR_BREDR):
6170 			status = mgmt_bredr_support(hdev);
6171 			if (status)
6172 				eir_len = 0;
6173 			else
6174 				eir_len = 5;
6175 			break;
6176 		case (BIT(BDADDR_LE_PUBLIC) | BIT(BDADDR_LE_RANDOM)):
6177 			status = mgmt_le_support(hdev);
6178 			if (status)
6179 				eir_len = 0;
6180 			else
6181 				eir_len = 9 + 3 + 18 + 18 + 3;
6182 			break;
6183 		default:
6184 			status = MGMT_STATUS_INVALID_PARAMS;
6185 			eir_len = 0;
6186 			break;
6187 		}
6188 	} else {
6189 		status = MGMT_STATUS_NOT_POWERED;
6190 		eir_len = 0;
6191 	}
6192 
6193 	rp_len = sizeof(*rp) + eir_len;
6194 	rp = kmalloc(rp_len, GFP_ATOMIC);
6195 	if (!rp)
6196 		return -ENOMEM;
6197 
6198 	if (status)
6199 		goto complete;
6200 
6201 	hci_dev_lock(hdev);
6202 
6203 	eir_len = 0;
6204 	switch (cp->type) {
6205 	case BIT(BDADDR_BREDR):
6206 		if (hci_dev_test_flag(hdev, HCI_SSP_ENABLED)) {
6207 			err = read_local_ssp_oob_req(hdev, sk, cp);
6208 			hci_dev_unlock(hdev);
6209 			if (!err)
6210 				goto done;
6211 
6212 			status = MGMT_STATUS_FAILED;
6213 			goto complete;
6214 		} else {
6215 			eir_len = eir_append_data(rp->eir, eir_len,
6216 						  EIR_CLASS_OF_DEV,
6217 						  hdev->dev_class, 3);
6218 		}
6219 		break;
6220 	case (BIT(BDADDR_LE_PUBLIC) | BIT(BDADDR_LE_RANDOM)):
6221 		if (hci_dev_test_flag(hdev, HCI_SC_ENABLED) &&
6222 		    smp_generate_oob(hdev, hash, rand) < 0) {
6223 			hci_dev_unlock(hdev);
6224 			status = MGMT_STATUS_FAILED;
6225 			goto complete;
6226 		}
6227 
6228 		/* This should return the active RPA, but since the RPA
6229 		 * is only programmed on demand, it is really hard to fill
6230 		 * this in at the moment. For now disallow retrieving
6231 		 * local out-of-band data when privacy is in use.
6232 		 *
6233 		 * Returning the identity address will not help here since
6234 		 * pairing happens before the identity resolving key is
6235 		 * known and thus the connection establishment happens
6236 		 * based on the RPA and not the identity address.
6237 		 */
6238 		if (hci_dev_test_flag(hdev, HCI_PRIVACY)) {
6239 			hci_dev_unlock(hdev);
6240 			status = MGMT_STATUS_REJECTED;
6241 			goto complete;
6242 		}
6243 
6244 		if (hci_dev_test_flag(hdev, HCI_FORCE_STATIC_ADDR) ||
6245 		   !bacmp(&hdev->bdaddr, BDADDR_ANY) ||
6246 		   (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED) &&
6247 		    bacmp(&hdev->static_addr, BDADDR_ANY))) {
6248 			memcpy(addr, &hdev->static_addr, 6);
6249 			addr[6] = 0x01;
6250 		} else {
6251 			memcpy(addr, &hdev->bdaddr, 6);
6252 			addr[6] = 0x00;
6253 		}
6254 
6255 		eir_len = eir_append_data(rp->eir, eir_len, EIR_LE_BDADDR,
6256 					  addr, sizeof(addr));
6257 
6258 		if (hci_dev_test_flag(hdev, HCI_ADVERTISING))
6259 			role = 0x02;
6260 		else
6261 			role = 0x01;
6262 
6263 		eir_len = eir_append_data(rp->eir, eir_len, EIR_LE_ROLE,
6264 					  &role, sizeof(role));
6265 
6266 		if (hci_dev_test_flag(hdev, HCI_SC_ENABLED)) {
6267 			eir_len = eir_append_data(rp->eir, eir_len,
6268 						  EIR_LE_SC_CONFIRM,
6269 						  hash, sizeof(hash));
6270 
6271 			eir_len = eir_append_data(rp->eir, eir_len,
6272 						  EIR_LE_SC_RANDOM,
6273 						  rand, sizeof(rand));
6274 		}
6275 
6276 		flags = mgmt_get_adv_discov_flags(hdev);
6277 
6278 		if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED))
6279 			flags |= LE_AD_NO_BREDR;
6280 
6281 		eir_len = eir_append_data(rp->eir, eir_len, EIR_FLAGS,
6282 					  &flags, sizeof(flags));
6283 		break;
6284 	}
6285 
6286 	hci_dev_unlock(hdev);
6287 
6288 	hci_sock_set_flag(sk, HCI_MGMT_OOB_DATA_EVENTS);
6289 
6290 	status = MGMT_STATUS_SUCCESS;
6291 
6292 complete:
6293 	rp->type = cp->type;
6294 	rp->eir_len = cpu_to_le16(eir_len);
6295 
6296 	err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_EXT_DATA,
6297 				status, rp, sizeof(*rp) + eir_len);
6298 	if (err < 0 || status)
6299 		goto done;
6300 
6301 	err = mgmt_limited_event(MGMT_EV_LOCAL_OOB_DATA_UPDATED, hdev,
6302 				 rp, sizeof(*rp) + eir_len,
6303 				 HCI_MGMT_OOB_DATA_EVENTS, sk);
6304 
6305 done:
6306 	kfree(rp);
6307 
6308 	return err;
6309 }
6310 
get_supported_adv_flags(struct hci_dev * hdev)6311 static u32 get_supported_adv_flags(struct hci_dev *hdev)
6312 {
6313 	u32 flags = 0;
6314 
6315 	flags |= MGMT_ADV_FLAG_CONNECTABLE;
6316 	flags |= MGMT_ADV_FLAG_DISCOV;
6317 	flags |= MGMT_ADV_FLAG_LIMITED_DISCOV;
6318 	flags |= MGMT_ADV_FLAG_MANAGED_FLAGS;
6319 	flags |= MGMT_ADV_FLAG_APPEARANCE;
6320 	flags |= MGMT_ADV_FLAG_LOCAL_NAME;
6321 
6322 	/* In extended adv TX_POWER returned from Set Adv Param
6323 	 * will be always valid.
6324 	 */
6325 	if ((hdev->adv_tx_power != HCI_TX_POWER_INVALID) ||
6326 	    ext_adv_capable(hdev))
6327 		flags |= MGMT_ADV_FLAG_TX_POWER;
6328 
6329 	if (ext_adv_capable(hdev)) {
6330 		flags |= MGMT_ADV_FLAG_SEC_1M;
6331 
6332 		if (hdev->le_features[1] & HCI_LE_PHY_2M)
6333 			flags |= MGMT_ADV_FLAG_SEC_2M;
6334 
6335 		if (hdev->le_features[1] & HCI_LE_PHY_CODED)
6336 			flags |= MGMT_ADV_FLAG_SEC_CODED;
6337 	}
6338 
6339 	return flags;
6340 }
6341 
read_adv_features(struct sock * sk,struct hci_dev * hdev,void * data,u16 data_len)6342 static int read_adv_features(struct sock *sk, struct hci_dev *hdev,
6343 			     void *data, u16 data_len)
6344 {
6345 	struct mgmt_rp_read_adv_features *rp;
6346 	size_t rp_len;
6347 	int err;
6348 	struct adv_info *adv_instance;
6349 	u32 supported_flags;
6350 	u8 *instance;
6351 
6352 	BT_DBG("%s", hdev->name);
6353 
6354 	if (!lmp_le_capable(hdev))
6355 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_READ_ADV_FEATURES,
6356 				       MGMT_STATUS_REJECTED);
6357 
6358 	hci_dev_lock(hdev);
6359 
6360 	rp_len = sizeof(*rp) + hdev->adv_instance_cnt;
6361 	rp = kmalloc(rp_len, GFP_ATOMIC);
6362 	if (!rp) {
6363 		hci_dev_unlock(hdev);
6364 		return -ENOMEM;
6365 	}
6366 
6367 	supported_flags = get_supported_adv_flags(hdev);
6368 
6369 	rp->supported_flags = cpu_to_le32(supported_flags);
6370 	rp->max_adv_data_len = HCI_MAX_AD_LENGTH;
6371 	rp->max_scan_rsp_len = HCI_MAX_AD_LENGTH;
6372 	rp->max_instances = HCI_MAX_ADV_INSTANCES;
6373 	rp->num_instances = hdev->adv_instance_cnt;
6374 
6375 	instance = rp->instance;
6376 	list_for_each_entry(adv_instance, &hdev->adv_instances, list) {
6377 		*instance = adv_instance->instance;
6378 		instance++;
6379 	}
6380 
6381 	hci_dev_unlock(hdev);
6382 
6383 	err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_ADV_FEATURES,
6384 				MGMT_STATUS_SUCCESS, rp, rp_len);
6385 
6386 	kfree(rp);
6387 
6388 	return err;
6389 }
6390 
calculate_name_len(struct hci_dev * hdev)6391 static u8 calculate_name_len(struct hci_dev *hdev)
6392 {
6393 	u8 buf[HCI_MAX_SHORT_NAME_LENGTH + 3];
6394 
6395 	return append_local_name(hdev, buf, 0);
6396 }
6397 
tlv_data_max_len(struct hci_dev * hdev,u32 adv_flags,bool is_adv_data)6398 static u8 tlv_data_max_len(struct hci_dev *hdev, u32 adv_flags,
6399 			   bool is_adv_data)
6400 {
6401 	u8 max_len = HCI_MAX_AD_LENGTH;
6402 
6403 	if (is_adv_data) {
6404 		if (adv_flags & (MGMT_ADV_FLAG_DISCOV |
6405 				 MGMT_ADV_FLAG_LIMITED_DISCOV |
6406 				 MGMT_ADV_FLAG_MANAGED_FLAGS))
6407 			max_len -= 3;
6408 
6409 		if (adv_flags & MGMT_ADV_FLAG_TX_POWER)
6410 			max_len -= 3;
6411 	} else {
6412 		if (adv_flags & MGMT_ADV_FLAG_LOCAL_NAME)
6413 			max_len -= calculate_name_len(hdev);
6414 
6415 		if (adv_flags & (MGMT_ADV_FLAG_APPEARANCE))
6416 			max_len -= 4;
6417 	}
6418 
6419 	return max_len;
6420 }
6421 
flags_managed(u32 adv_flags)6422 static bool flags_managed(u32 adv_flags)
6423 {
6424 	return adv_flags & (MGMT_ADV_FLAG_DISCOV |
6425 			    MGMT_ADV_FLAG_LIMITED_DISCOV |
6426 			    MGMT_ADV_FLAG_MANAGED_FLAGS);
6427 }
6428 
tx_power_managed(u32 adv_flags)6429 static bool tx_power_managed(u32 adv_flags)
6430 {
6431 	return adv_flags & MGMT_ADV_FLAG_TX_POWER;
6432 }
6433 
name_managed(u32 adv_flags)6434 static bool name_managed(u32 adv_flags)
6435 {
6436 	return adv_flags & MGMT_ADV_FLAG_LOCAL_NAME;
6437 }
6438 
appearance_managed(u32 adv_flags)6439 static bool appearance_managed(u32 adv_flags)
6440 {
6441 	return adv_flags & MGMT_ADV_FLAG_APPEARANCE;
6442 }
6443 
tlv_data_is_valid(struct hci_dev * hdev,u32 adv_flags,u8 * data,u8 len,bool is_adv_data)6444 static bool tlv_data_is_valid(struct hci_dev *hdev, u32 adv_flags, u8 *data,
6445 			      u8 len, bool is_adv_data)
6446 {
6447 	int i, cur_len;
6448 	u8 max_len;
6449 
6450 	max_len = tlv_data_max_len(hdev, adv_flags, is_adv_data);
6451 
6452 	if (len > max_len)
6453 		return false;
6454 
6455 	/* Make sure that the data is correctly formatted. */
6456 	for (i = 0, cur_len = 0; i < len; i += (cur_len + 1)) {
6457 		cur_len = data[i];
6458 
6459 		if (data[i + 1] == EIR_FLAGS &&
6460 		    (!is_adv_data || flags_managed(adv_flags)))
6461 			return false;
6462 
6463 		if (data[i + 1] == EIR_TX_POWER && tx_power_managed(adv_flags))
6464 			return false;
6465 
6466 		if (data[i + 1] == EIR_NAME_COMPLETE && name_managed(adv_flags))
6467 			return false;
6468 
6469 		if (data[i + 1] == EIR_NAME_SHORT && name_managed(adv_flags))
6470 			return false;
6471 
6472 		if (data[i + 1] == EIR_APPEARANCE &&
6473 		    appearance_managed(adv_flags))
6474 			return false;
6475 
6476 		/* If the current field length would exceed the total data
6477 		 * length, then it's invalid.
6478 		 */
6479 		if (i + cur_len >= len)
6480 			return false;
6481 	}
6482 
6483 	return true;
6484 }
6485 
add_advertising_complete(struct hci_dev * hdev,u8 status,u16 opcode)6486 static void add_advertising_complete(struct hci_dev *hdev, u8 status,
6487 				     u16 opcode)
6488 {
6489 	struct mgmt_pending_cmd *cmd;
6490 	struct mgmt_cp_add_advertising *cp;
6491 	struct mgmt_rp_add_advertising rp;
6492 	struct adv_info *adv_instance, *n;
6493 	u8 instance;
6494 
6495 	BT_DBG("status %d", status);
6496 
6497 	hci_dev_lock(hdev);
6498 
6499 	cmd = pending_find(MGMT_OP_ADD_ADVERTISING, hdev);
6500 
6501 	list_for_each_entry_safe(adv_instance, n, &hdev->adv_instances, list) {
6502 		if (!adv_instance->pending)
6503 			continue;
6504 
6505 		if (!status) {
6506 			adv_instance->pending = false;
6507 			continue;
6508 		}
6509 
6510 		instance = adv_instance->instance;
6511 
6512 		if (hdev->cur_adv_instance == instance)
6513 			cancel_adv_timeout(hdev);
6514 
6515 		hci_remove_adv_instance(hdev, instance);
6516 		mgmt_advertising_removed(cmd ? cmd->sk : NULL, hdev, instance);
6517 	}
6518 
6519 	if (!cmd)
6520 		goto unlock;
6521 
6522 	cp = cmd->param;
6523 	rp.instance = cp->instance;
6524 
6525 	if (status)
6526 		mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode,
6527 				mgmt_status(status));
6528 	else
6529 		mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode,
6530 				  mgmt_status(status), &rp, sizeof(rp));
6531 
6532 	mgmt_pending_remove(cmd);
6533 
6534 unlock:
6535 	hci_dev_unlock(hdev);
6536 }
6537 
add_advertising(struct sock * sk,struct hci_dev * hdev,void * data,u16 data_len)6538 static int add_advertising(struct sock *sk, struct hci_dev *hdev,
6539 			   void *data, u16 data_len)
6540 {
6541 	struct mgmt_cp_add_advertising *cp = data;
6542 	struct mgmt_rp_add_advertising rp;
6543 	u32 flags;
6544 	u32 supported_flags, phy_flags;
6545 	u8 status;
6546 	u16 timeout, duration;
6547 	unsigned int prev_instance_cnt = hdev->adv_instance_cnt;
6548 	u8 schedule_instance = 0;
6549 	struct adv_info *next_instance;
6550 	int err;
6551 	struct mgmt_pending_cmd *cmd;
6552 	struct hci_request req;
6553 
6554 	BT_DBG("%s", hdev->name);
6555 
6556 	status = mgmt_le_support(hdev);
6557 	if (status)
6558 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING,
6559 				       status);
6560 
6561 	if (cp->instance < 1 || cp->instance > HCI_MAX_ADV_INSTANCES)
6562 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING,
6563 				       MGMT_STATUS_INVALID_PARAMS);
6564 
6565 	if (data_len != sizeof(*cp) + cp->adv_data_len + cp->scan_rsp_len)
6566 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING,
6567 				       MGMT_STATUS_INVALID_PARAMS);
6568 
6569 	flags = __le32_to_cpu(cp->flags);
6570 	timeout = __le16_to_cpu(cp->timeout);
6571 	duration = __le16_to_cpu(cp->duration);
6572 
6573 	/* The current implementation only supports a subset of the specified
6574 	 * flags. Also need to check mutual exclusiveness of sec flags.
6575 	 */
6576 	supported_flags = get_supported_adv_flags(hdev);
6577 	phy_flags = flags & MGMT_ADV_FLAG_SEC_MASK;
6578 	if (flags & ~supported_flags ||
6579 	    ((phy_flags && (phy_flags ^ (phy_flags & -phy_flags)))))
6580 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING,
6581 				       MGMT_STATUS_INVALID_PARAMS);
6582 
6583 	hci_dev_lock(hdev);
6584 
6585 	if (timeout && !hdev_is_powered(hdev)) {
6586 		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING,
6587 				      MGMT_STATUS_REJECTED);
6588 		goto unlock;
6589 	}
6590 
6591 	if (pending_find(MGMT_OP_ADD_ADVERTISING, hdev) ||
6592 	    pending_find(MGMT_OP_REMOVE_ADVERTISING, hdev) ||
6593 	    pending_find(MGMT_OP_SET_LE, hdev)) {
6594 		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING,
6595 				      MGMT_STATUS_BUSY);
6596 		goto unlock;
6597 	}
6598 
6599 	if (!tlv_data_is_valid(hdev, flags, cp->data, cp->adv_data_len, true) ||
6600 	    !tlv_data_is_valid(hdev, flags, cp->data + cp->adv_data_len,
6601 			       cp->scan_rsp_len, false)) {
6602 		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING,
6603 				      MGMT_STATUS_INVALID_PARAMS);
6604 		goto unlock;
6605 	}
6606 
6607 	err = hci_add_adv_instance(hdev, cp->instance, flags,
6608 				   cp->adv_data_len, cp->data,
6609 				   cp->scan_rsp_len,
6610 				   cp->data + cp->adv_data_len,
6611 				   timeout, duration);
6612 	if (err < 0) {
6613 		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_ADD_ADVERTISING,
6614 				      MGMT_STATUS_FAILED);
6615 		goto unlock;
6616 	}
6617 
6618 	/* Only trigger an advertising added event if a new instance was
6619 	 * actually added.
6620 	 */
6621 	if (hdev->adv_instance_cnt > prev_instance_cnt)
6622 		mgmt_advertising_added(sk, hdev, cp->instance);
6623 
6624 	if (hdev->cur_adv_instance == cp->instance) {
6625 		/* If the currently advertised instance is being changed then
6626 		 * cancel the current advertising and schedule the next
6627 		 * instance. If there is only one instance then the overridden
6628 		 * advertising data will be visible right away.
6629 		 */
6630 		cancel_adv_timeout(hdev);
6631 
6632 		next_instance = hci_get_next_instance(hdev, cp->instance);
6633 		if (next_instance)
6634 			schedule_instance = next_instance->instance;
6635 	} else if (!hdev->adv_instance_timeout) {
6636 		/* Immediately advertise the new instance if no other
6637 		 * instance is currently being advertised.
6638 		 */
6639 		schedule_instance = cp->instance;
6640 	}
6641 
6642 	/* If the HCI_ADVERTISING flag is set or the device isn't powered or
6643 	 * there is no instance to be advertised then we have no HCI
6644 	 * communication to make. Simply return.
6645 	 */
6646 	if (!hdev_is_powered(hdev) ||
6647 	    hci_dev_test_flag(hdev, HCI_ADVERTISING) ||
6648 	    !schedule_instance) {
6649 		rp.instance = cp->instance;
6650 		err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_ADD_ADVERTISING,
6651 					MGMT_STATUS_SUCCESS, &rp, sizeof(rp));
6652 		goto unlock;
6653 	}
6654 
6655 	/* We're good to go, update advertising data, parameters, and start
6656 	 * advertising.
6657 	 */
6658 	cmd = mgmt_pending_add(sk, MGMT_OP_ADD_ADVERTISING, hdev, data,
6659 			       data_len);
6660 	if (!cmd) {
6661 		err = -ENOMEM;
6662 		goto unlock;
6663 	}
6664 
6665 	hci_req_init(&req, hdev);
6666 
6667 	err = __hci_req_schedule_adv_instance(&req, schedule_instance, true);
6668 
6669 	if (!err)
6670 		err = hci_req_run(&req, add_advertising_complete);
6671 
6672 	if (err < 0)
6673 		mgmt_pending_remove(cmd);
6674 
6675 unlock:
6676 	hci_dev_unlock(hdev);
6677 
6678 	return err;
6679 }
6680 
remove_advertising_complete(struct hci_dev * hdev,u8 status,u16 opcode)6681 static void remove_advertising_complete(struct hci_dev *hdev, u8 status,
6682 					u16 opcode)
6683 {
6684 	struct mgmt_pending_cmd *cmd;
6685 	struct mgmt_cp_remove_advertising *cp;
6686 	struct mgmt_rp_remove_advertising rp;
6687 
6688 	BT_DBG("status %d", status);
6689 
6690 	hci_dev_lock(hdev);
6691 
6692 	/* A failure status here only means that we failed to disable
6693 	 * advertising. Otherwise, the advertising instance has been removed,
6694 	 * so report success.
6695 	 */
6696 	cmd = pending_find(MGMT_OP_REMOVE_ADVERTISING, hdev);
6697 	if (!cmd)
6698 		goto unlock;
6699 
6700 	cp = cmd->param;
6701 	rp.instance = cp->instance;
6702 
6703 	mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, MGMT_STATUS_SUCCESS,
6704 			  &rp, sizeof(rp));
6705 	mgmt_pending_remove(cmd);
6706 
6707 unlock:
6708 	hci_dev_unlock(hdev);
6709 }
6710 
remove_advertising(struct sock * sk,struct hci_dev * hdev,void * data,u16 data_len)6711 static int remove_advertising(struct sock *sk, struct hci_dev *hdev,
6712 			      void *data, u16 data_len)
6713 {
6714 	struct mgmt_cp_remove_advertising *cp = data;
6715 	struct mgmt_rp_remove_advertising rp;
6716 	struct mgmt_pending_cmd *cmd;
6717 	struct hci_request req;
6718 	int err;
6719 
6720 	BT_DBG("%s", hdev->name);
6721 
6722 	hci_dev_lock(hdev);
6723 
6724 	if (cp->instance && !hci_find_adv_instance(hdev, cp->instance)) {
6725 		err = mgmt_cmd_status(sk, hdev->id,
6726 				      MGMT_OP_REMOVE_ADVERTISING,
6727 				      MGMT_STATUS_INVALID_PARAMS);
6728 		goto unlock;
6729 	}
6730 
6731 	if (pending_find(MGMT_OP_ADD_ADVERTISING, hdev) ||
6732 	    pending_find(MGMT_OP_REMOVE_ADVERTISING, hdev) ||
6733 	    pending_find(MGMT_OP_SET_LE, hdev)) {
6734 		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_REMOVE_ADVERTISING,
6735 				      MGMT_STATUS_BUSY);
6736 		goto unlock;
6737 	}
6738 
6739 	if (list_empty(&hdev->adv_instances)) {
6740 		err = mgmt_cmd_status(sk, hdev->id, MGMT_OP_REMOVE_ADVERTISING,
6741 				      MGMT_STATUS_INVALID_PARAMS);
6742 		goto unlock;
6743 	}
6744 
6745 	hci_req_init(&req, hdev);
6746 
6747 	hci_req_clear_adv_instance(hdev, sk, &req, cp->instance, true);
6748 
6749 	if (list_empty(&hdev->adv_instances))
6750 		__hci_req_disable_advertising(&req);
6751 
6752 	/* If no HCI commands have been collected so far or the HCI_ADVERTISING
6753 	 * flag is set or the device isn't powered then we have no HCI
6754 	 * communication to make. Simply return.
6755 	 */
6756 	if (skb_queue_empty(&req.cmd_q) ||
6757 	    !hdev_is_powered(hdev) ||
6758 	    hci_dev_test_flag(hdev, HCI_ADVERTISING)) {
6759 		hci_req_purge(&req);
6760 		rp.instance = cp->instance;
6761 		err = mgmt_cmd_complete(sk, hdev->id,
6762 					MGMT_OP_REMOVE_ADVERTISING,
6763 					MGMT_STATUS_SUCCESS, &rp, sizeof(rp));
6764 		goto unlock;
6765 	}
6766 
6767 	cmd = mgmt_pending_add(sk, MGMT_OP_REMOVE_ADVERTISING, hdev, data,
6768 			       data_len);
6769 	if (!cmd) {
6770 		err = -ENOMEM;
6771 		goto unlock;
6772 	}
6773 
6774 	err = hci_req_run(&req, remove_advertising_complete);
6775 	if (err < 0)
6776 		mgmt_pending_remove(cmd);
6777 
6778 unlock:
6779 	hci_dev_unlock(hdev);
6780 
6781 	return err;
6782 }
6783 
get_adv_size_info(struct sock * sk,struct hci_dev * hdev,void * data,u16 data_len)6784 static int get_adv_size_info(struct sock *sk, struct hci_dev *hdev,
6785 			     void *data, u16 data_len)
6786 {
6787 	struct mgmt_cp_get_adv_size_info *cp = data;
6788 	struct mgmt_rp_get_adv_size_info rp;
6789 	u32 flags, supported_flags;
6790 	int err;
6791 
6792 	BT_DBG("%s", hdev->name);
6793 
6794 	if (!lmp_le_capable(hdev))
6795 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_GET_ADV_SIZE_INFO,
6796 				       MGMT_STATUS_REJECTED);
6797 
6798 	if (cp->instance < 1 || cp->instance > HCI_MAX_ADV_INSTANCES)
6799 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_GET_ADV_SIZE_INFO,
6800 				       MGMT_STATUS_INVALID_PARAMS);
6801 
6802 	flags = __le32_to_cpu(cp->flags);
6803 
6804 	/* The current implementation only supports a subset of the specified
6805 	 * flags.
6806 	 */
6807 	supported_flags = get_supported_adv_flags(hdev);
6808 	if (flags & ~supported_flags)
6809 		return mgmt_cmd_status(sk, hdev->id, MGMT_OP_GET_ADV_SIZE_INFO,
6810 				       MGMT_STATUS_INVALID_PARAMS);
6811 
6812 	rp.instance = cp->instance;
6813 	rp.flags = cp->flags;
6814 	rp.max_adv_data_len = tlv_data_max_len(hdev, flags, true);
6815 	rp.max_scan_rsp_len = tlv_data_max_len(hdev, flags, false);
6816 
6817 	err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_GET_ADV_SIZE_INFO,
6818 				MGMT_STATUS_SUCCESS, &rp, sizeof(rp));
6819 
6820 	return err;
6821 }
6822 
6823 static const struct hci_mgmt_handler mgmt_handlers[] = {
6824 	{ NULL }, /* 0x0000 (no command) */
6825 	{ read_version,            MGMT_READ_VERSION_SIZE,
6826 						HCI_MGMT_NO_HDEV |
6827 						HCI_MGMT_UNTRUSTED },
6828 	{ read_commands,           MGMT_READ_COMMANDS_SIZE,
6829 						HCI_MGMT_NO_HDEV |
6830 						HCI_MGMT_UNTRUSTED },
6831 	{ read_index_list,         MGMT_READ_INDEX_LIST_SIZE,
6832 						HCI_MGMT_NO_HDEV |
6833 						HCI_MGMT_UNTRUSTED },
6834 	{ read_controller_info,    MGMT_READ_INFO_SIZE,
6835 						HCI_MGMT_UNTRUSTED },
6836 	{ set_powered,             MGMT_SETTING_SIZE },
6837 	{ set_discoverable,        MGMT_SET_DISCOVERABLE_SIZE },
6838 	{ set_connectable,         MGMT_SETTING_SIZE },
6839 	{ set_fast_connectable,    MGMT_SETTING_SIZE },
6840 	{ set_bondable,            MGMT_SETTING_SIZE },
6841 	{ set_link_security,       MGMT_SETTING_SIZE },
6842 	{ set_ssp,                 MGMT_SETTING_SIZE },
6843 	{ set_hs,                  MGMT_SETTING_SIZE },
6844 	{ set_le,                  MGMT_SETTING_SIZE },
6845 	{ set_dev_class,           MGMT_SET_DEV_CLASS_SIZE },
6846 	{ set_local_name,          MGMT_SET_LOCAL_NAME_SIZE },
6847 	{ add_uuid,                MGMT_ADD_UUID_SIZE },
6848 	{ remove_uuid,             MGMT_REMOVE_UUID_SIZE },
6849 	{ load_link_keys,          MGMT_LOAD_LINK_KEYS_SIZE,
6850 						HCI_MGMT_VAR_LEN },
6851 	{ load_long_term_keys,     MGMT_LOAD_LONG_TERM_KEYS_SIZE,
6852 						HCI_MGMT_VAR_LEN },
6853 	{ disconnect,              MGMT_DISCONNECT_SIZE },
6854 	{ get_connections,         MGMT_GET_CONNECTIONS_SIZE },
6855 	{ pin_code_reply,          MGMT_PIN_CODE_REPLY_SIZE },
6856 	{ pin_code_neg_reply,      MGMT_PIN_CODE_NEG_REPLY_SIZE },
6857 	{ set_io_capability,       MGMT_SET_IO_CAPABILITY_SIZE },
6858 	{ pair_device,             MGMT_PAIR_DEVICE_SIZE },
6859 	{ cancel_pair_device,      MGMT_CANCEL_PAIR_DEVICE_SIZE },
6860 	{ unpair_device,           MGMT_UNPAIR_DEVICE_SIZE },
6861 	{ user_confirm_reply,      MGMT_USER_CONFIRM_REPLY_SIZE },
6862 	{ user_confirm_neg_reply,  MGMT_USER_CONFIRM_NEG_REPLY_SIZE },
6863 	{ user_passkey_reply,      MGMT_USER_PASSKEY_REPLY_SIZE },
6864 	{ user_passkey_neg_reply,  MGMT_USER_PASSKEY_NEG_REPLY_SIZE },
6865 	{ read_local_oob_data,     MGMT_READ_LOCAL_OOB_DATA_SIZE },
6866 	{ add_remote_oob_data,     MGMT_ADD_REMOTE_OOB_DATA_SIZE,
6867 						HCI_MGMT_VAR_LEN },
6868 	{ remove_remote_oob_data,  MGMT_REMOVE_REMOTE_OOB_DATA_SIZE },
6869 	{ start_discovery,         MGMT_START_DISCOVERY_SIZE },
6870 	{ stop_discovery,          MGMT_STOP_DISCOVERY_SIZE },
6871 	{ confirm_name,            MGMT_CONFIRM_NAME_SIZE },
6872 	{ block_device,            MGMT_BLOCK_DEVICE_SIZE },
6873 	{ unblock_device,          MGMT_UNBLOCK_DEVICE_SIZE },
6874 	{ set_device_id,           MGMT_SET_DEVICE_ID_SIZE },
6875 	{ set_advertising,         MGMT_SETTING_SIZE },
6876 	{ set_bredr,               MGMT_SETTING_SIZE },
6877 	{ set_static_address,      MGMT_SET_STATIC_ADDRESS_SIZE },
6878 	{ set_scan_params,         MGMT_SET_SCAN_PARAMS_SIZE },
6879 	{ set_secure_conn,         MGMT_SETTING_SIZE },
6880 	{ set_debug_keys,          MGMT_SETTING_SIZE },
6881 	{ set_privacy,             MGMT_SET_PRIVACY_SIZE },
6882 	{ load_irks,               MGMT_LOAD_IRKS_SIZE,
6883 						HCI_MGMT_VAR_LEN },
6884 	{ get_conn_info,           MGMT_GET_CONN_INFO_SIZE },
6885 	{ get_clock_info,          MGMT_GET_CLOCK_INFO_SIZE },
6886 	{ add_device,              MGMT_ADD_DEVICE_SIZE },
6887 	{ remove_device,           MGMT_REMOVE_DEVICE_SIZE },
6888 	{ load_conn_param,         MGMT_LOAD_CONN_PARAM_SIZE,
6889 						HCI_MGMT_VAR_LEN },
6890 	{ read_unconf_index_list,  MGMT_READ_UNCONF_INDEX_LIST_SIZE,
6891 						HCI_MGMT_NO_HDEV |
6892 						HCI_MGMT_UNTRUSTED },
6893 	{ read_config_info,        MGMT_READ_CONFIG_INFO_SIZE,
6894 						HCI_MGMT_UNCONFIGURED |
6895 						HCI_MGMT_UNTRUSTED },
6896 	{ set_external_config,     MGMT_SET_EXTERNAL_CONFIG_SIZE,
6897 						HCI_MGMT_UNCONFIGURED },
6898 	{ set_public_address,      MGMT_SET_PUBLIC_ADDRESS_SIZE,
6899 						HCI_MGMT_UNCONFIGURED },
6900 	{ start_service_discovery, MGMT_START_SERVICE_DISCOVERY_SIZE,
6901 						HCI_MGMT_VAR_LEN },
6902 	{ read_local_oob_ext_data, MGMT_READ_LOCAL_OOB_EXT_DATA_SIZE },
6903 	{ read_ext_index_list,     MGMT_READ_EXT_INDEX_LIST_SIZE,
6904 						HCI_MGMT_NO_HDEV |
6905 						HCI_MGMT_UNTRUSTED },
6906 	{ read_adv_features,       MGMT_READ_ADV_FEATURES_SIZE },
6907 	{ add_advertising,	   MGMT_ADD_ADVERTISING_SIZE,
6908 						HCI_MGMT_VAR_LEN },
6909 	{ remove_advertising,	   MGMT_REMOVE_ADVERTISING_SIZE },
6910 	{ get_adv_size_info,       MGMT_GET_ADV_SIZE_INFO_SIZE },
6911 	{ start_limited_discovery, MGMT_START_DISCOVERY_SIZE },
6912 	{ read_ext_controller_info,MGMT_READ_EXT_INFO_SIZE,
6913 						HCI_MGMT_UNTRUSTED },
6914 	{ set_appearance,	   MGMT_SET_APPEARANCE_SIZE },
6915 	{ get_phy_configuration,   MGMT_GET_PHY_CONFIGURATION_SIZE },
6916 	{ set_phy_configuration,   MGMT_SET_PHY_CONFIGURATION_SIZE },
6917 };
6918 
mgmt_index_added(struct hci_dev * hdev)6919 void mgmt_index_added(struct hci_dev *hdev)
6920 {
6921 	struct mgmt_ev_ext_index ev;
6922 
6923 	if (test_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks))
6924 		return;
6925 
6926 	switch (hdev->dev_type) {
6927 	case HCI_PRIMARY:
6928 		if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED)) {
6929 			mgmt_index_event(MGMT_EV_UNCONF_INDEX_ADDED, hdev,
6930 					 NULL, 0, HCI_MGMT_UNCONF_INDEX_EVENTS);
6931 			ev.type = 0x01;
6932 		} else {
6933 			mgmt_index_event(MGMT_EV_INDEX_ADDED, hdev, NULL, 0,
6934 					 HCI_MGMT_INDEX_EVENTS);
6935 			ev.type = 0x00;
6936 		}
6937 		break;
6938 	case HCI_AMP:
6939 		ev.type = 0x02;
6940 		break;
6941 	default:
6942 		return;
6943 	}
6944 
6945 	ev.bus = hdev->bus;
6946 
6947 	mgmt_index_event(MGMT_EV_EXT_INDEX_ADDED, hdev, &ev, sizeof(ev),
6948 			 HCI_MGMT_EXT_INDEX_EVENTS);
6949 }
6950 
mgmt_index_removed(struct hci_dev * hdev)6951 void mgmt_index_removed(struct hci_dev *hdev)
6952 {
6953 	struct mgmt_ev_ext_index ev;
6954 	u8 status = MGMT_STATUS_INVALID_INDEX;
6955 
6956 	if (test_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks))
6957 		return;
6958 
6959 	switch (hdev->dev_type) {
6960 	case HCI_PRIMARY:
6961 		mgmt_pending_foreach(0, hdev, cmd_complete_rsp, &status);
6962 
6963 		if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED)) {
6964 			mgmt_index_event(MGMT_EV_UNCONF_INDEX_REMOVED, hdev,
6965 					 NULL, 0, HCI_MGMT_UNCONF_INDEX_EVENTS);
6966 			ev.type = 0x01;
6967 		} else {
6968 			mgmt_index_event(MGMT_EV_INDEX_REMOVED, hdev, NULL, 0,
6969 					 HCI_MGMT_INDEX_EVENTS);
6970 			ev.type = 0x00;
6971 		}
6972 		break;
6973 	case HCI_AMP:
6974 		ev.type = 0x02;
6975 		break;
6976 	default:
6977 		return;
6978 	}
6979 
6980 	ev.bus = hdev->bus;
6981 
6982 	mgmt_index_event(MGMT_EV_EXT_INDEX_REMOVED, hdev, &ev, sizeof(ev),
6983 			 HCI_MGMT_EXT_INDEX_EVENTS);
6984 }
6985 
6986 /* This function requires the caller holds hdev->lock */
restart_le_actions(struct hci_dev * hdev)6987 static void restart_le_actions(struct hci_dev *hdev)
6988 {
6989 	struct hci_conn_params *p;
6990 
6991 	list_for_each_entry(p, &hdev->le_conn_params, list) {
6992 		/* Needed for AUTO_OFF case where might not "really"
6993 		 * have been powered off.
6994 		 */
6995 		list_del_init(&p->action);
6996 
6997 		switch (p->auto_connect) {
6998 		case HCI_AUTO_CONN_DIRECT:
6999 		case HCI_AUTO_CONN_ALWAYS:
7000 			list_add(&p->action, &hdev->pend_le_conns);
7001 			break;
7002 		case HCI_AUTO_CONN_REPORT:
7003 			list_add(&p->action, &hdev->pend_le_reports);
7004 			break;
7005 		default:
7006 			break;
7007 		}
7008 	}
7009 }
7010 
mgmt_power_on(struct hci_dev * hdev,int err)7011 void mgmt_power_on(struct hci_dev *hdev, int err)
7012 {
7013 	struct cmd_lookup match = { NULL, hdev };
7014 
7015 	BT_DBG("err %d", err);
7016 
7017 	hci_dev_lock(hdev);
7018 
7019 	if (!err) {
7020 		restart_le_actions(hdev);
7021 		hci_update_background_scan(hdev);
7022 	}
7023 
7024 	mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, settings_rsp, &match);
7025 
7026 	new_settings(hdev, match.sk);
7027 
7028 	if (match.sk)
7029 		sock_put(match.sk);
7030 
7031 	hci_dev_unlock(hdev);
7032 }
7033 
__mgmt_power_off(struct hci_dev * hdev)7034 void __mgmt_power_off(struct hci_dev *hdev)
7035 {
7036 	struct cmd_lookup match = { NULL, hdev };
7037 	u8 status, zero_cod[] = { 0, 0, 0 };
7038 
7039 	mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, settings_rsp, &match);
7040 
7041 	/* If the power off is because of hdev unregistration let
7042 	 * use the appropriate INVALID_INDEX status. Otherwise use
7043 	 * NOT_POWERED. We cover both scenarios here since later in
7044 	 * mgmt_index_removed() any hci_conn callbacks will have already
7045 	 * been triggered, potentially causing misleading DISCONNECTED
7046 	 * status responses.
7047 	 */
7048 	if (hci_dev_test_flag(hdev, HCI_UNREGISTER))
7049 		status = MGMT_STATUS_INVALID_INDEX;
7050 	else
7051 		status = MGMT_STATUS_NOT_POWERED;
7052 
7053 	mgmt_pending_foreach(0, hdev, cmd_complete_rsp, &status);
7054 
7055 	if (memcmp(hdev->dev_class, zero_cod, sizeof(zero_cod)) != 0) {
7056 		mgmt_limited_event(MGMT_EV_CLASS_OF_DEV_CHANGED, hdev,
7057 				   zero_cod, sizeof(zero_cod),
7058 				   HCI_MGMT_DEV_CLASS_EVENTS, NULL);
7059 		ext_info_changed(hdev, NULL);
7060 	}
7061 
7062 	new_settings(hdev, match.sk);
7063 
7064 	if (match.sk)
7065 		sock_put(match.sk);
7066 }
7067 
mgmt_set_powered_failed(struct hci_dev * hdev,int err)7068 void mgmt_set_powered_failed(struct hci_dev *hdev, int err)
7069 {
7070 	struct mgmt_pending_cmd *cmd;
7071 	u8 status;
7072 
7073 	cmd = pending_find(MGMT_OP_SET_POWERED, hdev);
7074 	if (!cmd)
7075 		return;
7076 
7077 	if (err == -ERFKILL)
7078 		status = MGMT_STATUS_RFKILLED;
7079 	else
7080 		status = MGMT_STATUS_FAILED;
7081 
7082 	mgmt_cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_POWERED, status);
7083 
7084 	mgmt_pending_remove(cmd);
7085 }
7086 
mgmt_new_link_key(struct hci_dev * hdev,struct link_key * key,bool persistent)7087 void mgmt_new_link_key(struct hci_dev *hdev, struct link_key *key,
7088 		       bool persistent)
7089 {
7090 	struct mgmt_ev_new_link_key ev;
7091 
7092 	memset(&ev, 0, sizeof(ev));
7093 
7094 	ev.store_hint = persistent;
7095 	bacpy(&ev.key.addr.bdaddr, &key->bdaddr);
7096 	ev.key.addr.type = BDADDR_BREDR;
7097 	ev.key.type = key->type;
7098 	memcpy(ev.key.val, key->val, HCI_LINK_KEY_SIZE);
7099 	ev.key.pin_len = key->pin_len;
7100 
7101 	mgmt_event(MGMT_EV_NEW_LINK_KEY, hdev, &ev, sizeof(ev), NULL);
7102 }
7103 
mgmt_ltk_type(struct smp_ltk * ltk)7104 static u8 mgmt_ltk_type(struct smp_ltk *ltk)
7105 {
7106 	switch (ltk->type) {
7107 	case SMP_LTK:
7108 	case SMP_LTK_SLAVE:
7109 		if (ltk->authenticated)
7110 			return MGMT_LTK_AUTHENTICATED;
7111 		return MGMT_LTK_UNAUTHENTICATED;
7112 	case SMP_LTK_P256:
7113 		if (ltk->authenticated)
7114 			return MGMT_LTK_P256_AUTH;
7115 		return MGMT_LTK_P256_UNAUTH;
7116 	case SMP_LTK_P256_DEBUG:
7117 		return MGMT_LTK_P256_DEBUG;
7118 	}
7119 
7120 	return MGMT_LTK_UNAUTHENTICATED;
7121 }
7122 
mgmt_new_ltk(struct hci_dev * hdev,struct smp_ltk * key,bool persistent)7123 void mgmt_new_ltk(struct hci_dev *hdev, struct smp_ltk *key, bool persistent)
7124 {
7125 	struct mgmt_ev_new_long_term_key ev;
7126 
7127 	memset(&ev, 0, sizeof(ev));
7128 
7129 	/* Devices using resolvable or non-resolvable random addresses
7130 	 * without providing an identity resolving key don't require
7131 	 * to store long term keys. Their addresses will change the
7132 	 * next time around.
7133 	 *
7134 	 * Only when a remote device provides an identity address
7135 	 * make sure the long term key is stored. If the remote
7136 	 * identity is known, the long term keys are internally
7137 	 * mapped to the identity address. So allow static random
7138 	 * and public addresses here.
7139 	 */
7140 	if (key->bdaddr_type == ADDR_LE_DEV_RANDOM &&
7141 	    (key->bdaddr.b[5] & 0xc0) != 0xc0)
7142 		ev.store_hint = 0x00;
7143 	else
7144 		ev.store_hint = persistent;
7145 
7146 	bacpy(&ev.key.addr.bdaddr, &key->bdaddr);
7147 	ev.key.addr.type = link_to_bdaddr(LE_LINK, key->bdaddr_type);
7148 	ev.key.type = mgmt_ltk_type(key);
7149 	ev.key.enc_size = key->enc_size;
7150 	ev.key.ediv = key->ediv;
7151 	ev.key.rand = key->rand;
7152 
7153 	if (key->type == SMP_LTK)
7154 		ev.key.master = 1;
7155 
7156 	/* Make sure we copy only the significant bytes based on the
7157 	 * encryption key size, and set the rest of the value to zeroes.
7158 	 */
7159 	memcpy(ev.key.val, key->val, key->enc_size);
7160 	memset(ev.key.val + key->enc_size, 0,
7161 	       sizeof(ev.key.val) - key->enc_size);
7162 
7163 	mgmt_event(MGMT_EV_NEW_LONG_TERM_KEY, hdev, &ev, sizeof(ev), NULL);
7164 }
7165 
mgmt_new_irk(struct hci_dev * hdev,struct smp_irk * irk,bool persistent)7166 void mgmt_new_irk(struct hci_dev *hdev, struct smp_irk *irk, bool persistent)
7167 {
7168 	struct mgmt_ev_new_irk ev;
7169 
7170 	memset(&ev, 0, sizeof(ev));
7171 
7172 	ev.store_hint = persistent;
7173 
7174 	bacpy(&ev.rpa, &irk->rpa);
7175 	bacpy(&ev.irk.addr.bdaddr, &irk->bdaddr);
7176 	ev.irk.addr.type = link_to_bdaddr(LE_LINK, irk->addr_type);
7177 	memcpy(ev.irk.val, irk->val, sizeof(irk->val));
7178 
7179 	mgmt_event(MGMT_EV_NEW_IRK, hdev, &ev, sizeof(ev), NULL);
7180 }
7181 
mgmt_new_csrk(struct hci_dev * hdev,struct smp_csrk * csrk,bool persistent)7182 void mgmt_new_csrk(struct hci_dev *hdev, struct smp_csrk *csrk,
7183 		   bool persistent)
7184 {
7185 	struct mgmt_ev_new_csrk ev;
7186 
7187 	memset(&ev, 0, sizeof(ev));
7188 
7189 	/* Devices using resolvable or non-resolvable random addresses
7190 	 * without providing an identity resolving key don't require
7191 	 * to store signature resolving keys. Their addresses will change
7192 	 * the next time around.
7193 	 *
7194 	 * Only when a remote device provides an identity address
7195 	 * make sure the signature resolving key is stored. So allow
7196 	 * static random and public addresses here.
7197 	 */
7198 	if (csrk->bdaddr_type == ADDR_LE_DEV_RANDOM &&
7199 	    (csrk->bdaddr.b[5] & 0xc0) != 0xc0)
7200 		ev.store_hint = 0x00;
7201 	else
7202 		ev.store_hint = persistent;
7203 
7204 	bacpy(&ev.key.addr.bdaddr, &csrk->bdaddr);
7205 	ev.key.addr.type = link_to_bdaddr(LE_LINK, csrk->bdaddr_type);
7206 	ev.key.type = csrk->type;
7207 	memcpy(ev.key.val, csrk->val, sizeof(csrk->val));
7208 
7209 	mgmt_event(MGMT_EV_NEW_CSRK, hdev, &ev, sizeof(ev), NULL);
7210 }
7211 
mgmt_new_conn_param(struct hci_dev * hdev,bdaddr_t * bdaddr,u8 bdaddr_type,u8 store_hint,u16 min_interval,u16 max_interval,u16 latency,u16 timeout)7212 void mgmt_new_conn_param(struct hci_dev *hdev, bdaddr_t *bdaddr,
7213 			 u8 bdaddr_type, u8 store_hint, u16 min_interval,
7214 			 u16 max_interval, u16 latency, u16 timeout)
7215 {
7216 	struct mgmt_ev_new_conn_param ev;
7217 
7218 	if (!hci_is_identity_address(bdaddr, bdaddr_type))
7219 		return;
7220 
7221 	memset(&ev, 0, sizeof(ev));
7222 	bacpy(&ev.addr.bdaddr, bdaddr);
7223 	ev.addr.type = link_to_bdaddr(LE_LINK, bdaddr_type);
7224 	ev.store_hint = store_hint;
7225 	ev.min_interval = cpu_to_le16(min_interval);
7226 	ev.max_interval = cpu_to_le16(max_interval);
7227 	ev.latency = cpu_to_le16(latency);
7228 	ev.timeout = cpu_to_le16(timeout);
7229 
7230 	mgmt_event(MGMT_EV_NEW_CONN_PARAM, hdev, &ev, sizeof(ev), NULL);
7231 }
7232 
mgmt_device_connected(struct hci_dev * hdev,struct hci_conn * conn,u32 flags,u8 * name,u8 name_len)7233 void mgmt_device_connected(struct hci_dev *hdev, struct hci_conn *conn,
7234 			   u32 flags, u8 *name, u8 name_len)
7235 {
7236 	char buf[512];
7237 	struct mgmt_ev_device_connected *ev = (void *) buf;
7238 	u16 eir_len = 0;
7239 
7240 	bacpy(&ev->addr.bdaddr, &conn->dst);
7241 	ev->addr.type = link_to_bdaddr(conn->type, conn->dst_type);
7242 
7243 	ev->flags = __cpu_to_le32(flags);
7244 
7245 	/* We must ensure that the EIR Data fields are ordered and
7246 	 * unique. Keep it simple for now and avoid the problem by not
7247 	 * adding any BR/EDR data to the LE adv.
7248 	 */
7249 	if (conn->le_adv_data_len > 0) {
7250 		memcpy(&ev->eir[eir_len],
7251 		       conn->le_adv_data, conn->le_adv_data_len);
7252 		eir_len = conn->le_adv_data_len;
7253 	} else {
7254 		if (name_len > 0)
7255 			eir_len = eir_append_data(ev->eir, 0, EIR_NAME_COMPLETE,
7256 						  name, name_len);
7257 
7258 		if (memcmp(conn->dev_class, "\0\0\0", 3) != 0)
7259 			eir_len = eir_append_data(ev->eir, eir_len,
7260 						  EIR_CLASS_OF_DEV,
7261 						  conn->dev_class, 3);
7262 	}
7263 
7264 	ev->eir_len = cpu_to_le16(eir_len);
7265 
7266 	mgmt_event(MGMT_EV_DEVICE_CONNECTED, hdev, buf,
7267 		    sizeof(*ev) + eir_len, NULL);
7268 }
7269 
disconnect_rsp(struct mgmt_pending_cmd * cmd,void * data)7270 static void disconnect_rsp(struct mgmt_pending_cmd *cmd, void *data)
7271 {
7272 	struct sock **sk = data;
7273 
7274 	cmd->cmd_complete(cmd, 0);
7275 
7276 	*sk = cmd->sk;
7277 	sock_hold(*sk);
7278 
7279 	mgmt_pending_remove(cmd);
7280 }
7281 
unpair_device_rsp(struct mgmt_pending_cmd * cmd,void * data)7282 static void unpair_device_rsp(struct mgmt_pending_cmd *cmd, void *data)
7283 {
7284 	struct hci_dev *hdev = data;
7285 	struct mgmt_cp_unpair_device *cp = cmd->param;
7286 
7287 	device_unpaired(hdev, &cp->addr.bdaddr, cp->addr.type, cmd->sk);
7288 
7289 	cmd->cmd_complete(cmd, 0);
7290 	mgmt_pending_remove(cmd);
7291 }
7292 
mgmt_powering_down(struct hci_dev * hdev)7293 bool mgmt_powering_down(struct hci_dev *hdev)
7294 {
7295 	struct mgmt_pending_cmd *cmd;
7296 	struct mgmt_mode *cp;
7297 
7298 	cmd = pending_find(MGMT_OP_SET_POWERED, hdev);
7299 	if (!cmd)
7300 		return false;
7301 
7302 	cp = cmd->param;
7303 	if (!cp->val)
7304 		return true;
7305 
7306 	return false;
7307 }
7308 
mgmt_device_disconnected(struct hci_dev * hdev,bdaddr_t * bdaddr,u8 link_type,u8 addr_type,u8 reason,bool mgmt_connected)7309 void mgmt_device_disconnected(struct hci_dev *hdev, bdaddr_t *bdaddr,
7310 			      u8 link_type, u8 addr_type, u8 reason,
7311 			      bool mgmt_connected)
7312 {
7313 	struct mgmt_ev_device_disconnected ev;
7314 	struct sock *sk = NULL;
7315 
7316 	/* The connection is still in hci_conn_hash so test for 1
7317 	 * instead of 0 to know if this is the last one.
7318 	 */
7319 	if (mgmt_powering_down(hdev) && hci_conn_count(hdev) == 1) {
7320 		cancel_delayed_work(&hdev->power_off);
7321 		queue_work(hdev->req_workqueue, &hdev->power_off.work);
7322 	}
7323 
7324 	if (!mgmt_connected)
7325 		return;
7326 
7327 	if (link_type != ACL_LINK && link_type != LE_LINK)
7328 		return;
7329 
7330 	mgmt_pending_foreach(MGMT_OP_DISCONNECT, hdev, disconnect_rsp, &sk);
7331 
7332 	bacpy(&ev.addr.bdaddr, bdaddr);
7333 	ev.addr.type = link_to_bdaddr(link_type, addr_type);
7334 	ev.reason = reason;
7335 
7336 	mgmt_event(MGMT_EV_DEVICE_DISCONNECTED, hdev, &ev, sizeof(ev), sk);
7337 
7338 	if (sk)
7339 		sock_put(sk);
7340 
7341 	mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE, hdev, unpair_device_rsp,
7342 			     hdev);
7343 }
7344 
mgmt_disconnect_failed(struct hci_dev * hdev,bdaddr_t * bdaddr,u8 link_type,u8 addr_type,u8 status)7345 void mgmt_disconnect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr,
7346 			    u8 link_type, u8 addr_type, u8 status)
7347 {
7348 	u8 bdaddr_type = link_to_bdaddr(link_type, addr_type);
7349 	struct mgmt_cp_disconnect *cp;
7350 	struct mgmt_pending_cmd *cmd;
7351 
7352 	mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE, hdev, unpair_device_rsp,
7353 			     hdev);
7354 
7355 	cmd = pending_find(MGMT_OP_DISCONNECT, hdev);
7356 	if (!cmd)
7357 		return;
7358 
7359 	cp = cmd->param;
7360 
7361 	if (bacmp(bdaddr, &cp->addr.bdaddr))
7362 		return;
7363 
7364 	if (cp->addr.type != bdaddr_type)
7365 		return;
7366 
7367 	cmd->cmd_complete(cmd, mgmt_status(status));
7368 	mgmt_pending_remove(cmd);
7369 }
7370 
mgmt_connect_failed(struct hci_dev * hdev,bdaddr_t * bdaddr,u8 link_type,u8 addr_type,u8 status)7371 void mgmt_connect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
7372 			 u8 addr_type, u8 status)
7373 {
7374 	struct mgmt_ev_connect_failed ev;
7375 
7376 	/* The connection is still in hci_conn_hash so test for 1
7377 	 * instead of 0 to know if this is the last one.
7378 	 */
7379 	if (mgmt_powering_down(hdev) && hci_conn_count(hdev) == 1) {
7380 		cancel_delayed_work(&hdev->power_off);
7381 		queue_work(hdev->req_workqueue, &hdev->power_off.work);
7382 	}
7383 
7384 	bacpy(&ev.addr.bdaddr, bdaddr);
7385 	ev.addr.type = link_to_bdaddr(link_type, addr_type);
7386 	ev.status = mgmt_status(status);
7387 
7388 	mgmt_event(MGMT_EV_CONNECT_FAILED, hdev, &ev, sizeof(ev), NULL);
7389 }
7390 
mgmt_pin_code_request(struct hci_dev * hdev,bdaddr_t * bdaddr,u8 secure)7391 void mgmt_pin_code_request(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 secure)
7392 {
7393 	struct mgmt_ev_pin_code_request ev;
7394 
7395 	bacpy(&ev.addr.bdaddr, bdaddr);
7396 	ev.addr.type = BDADDR_BREDR;
7397 	ev.secure = secure;
7398 
7399 	mgmt_event(MGMT_EV_PIN_CODE_REQUEST, hdev, &ev, sizeof(ev), NULL);
7400 }
7401 
mgmt_pin_code_reply_complete(struct hci_dev * hdev,bdaddr_t * bdaddr,u8 status)7402 void mgmt_pin_code_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
7403 				  u8 status)
7404 {
7405 	struct mgmt_pending_cmd *cmd;
7406 
7407 	cmd = pending_find(MGMT_OP_PIN_CODE_REPLY, hdev);
7408 	if (!cmd)
7409 		return;
7410 
7411 	cmd->cmd_complete(cmd, mgmt_status(status));
7412 	mgmt_pending_remove(cmd);
7413 }
7414 
mgmt_pin_code_neg_reply_complete(struct hci_dev * hdev,bdaddr_t * bdaddr,u8 status)7415 void mgmt_pin_code_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
7416 				      u8 status)
7417 {
7418 	struct mgmt_pending_cmd *cmd;
7419 
7420 	cmd = pending_find(MGMT_OP_PIN_CODE_NEG_REPLY, hdev);
7421 	if (!cmd)
7422 		return;
7423 
7424 	cmd->cmd_complete(cmd, mgmt_status(status));
7425 	mgmt_pending_remove(cmd);
7426 }
7427 
mgmt_user_confirm_request(struct hci_dev * hdev,bdaddr_t * bdaddr,u8 link_type,u8 addr_type,u32 value,u8 confirm_hint)7428 int mgmt_user_confirm_request(struct hci_dev *hdev, bdaddr_t *bdaddr,
7429 			      u8 link_type, u8 addr_type, u32 value,
7430 			      u8 confirm_hint)
7431 {
7432 	struct mgmt_ev_user_confirm_request ev;
7433 
7434 	BT_DBG("%s", hdev->name);
7435 
7436 	bacpy(&ev.addr.bdaddr, bdaddr);
7437 	ev.addr.type = link_to_bdaddr(link_type, addr_type);
7438 	ev.confirm_hint = confirm_hint;
7439 	ev.value = cpu_to_le32(value);
7440 
7441 	return mgmt_event(MGMT_EV_USER_CONFIRM_REQUEST, hdev, &ev, sizeof(ev),
7442 			  NULL);
7443 }
7444 
mgmt_user_passkey_request(struct hci_dev * hdev,bdaddr_t * bdaddr,u8 link_type,u8 addr_type)7445 int mgmt_user_passkey_request(struct hci_dev *hdev, bdaddr_t *bdaddr,
7446 			      u8 link_type, u8 addr_type)
7447 {
7448 	struct mgmt_ev_user_passkey_request ev;
7449 
7450 	BT_DBG("%s", hdev->name);
7451 
7452 	bacpy(&ev.addr.bdaddr, bdaddr);
7453 	ev.addr.type = link_to_bdaddr(link_type, addr_type);
7454 
7455 	return mgmt_event(MGMT_EV_USER_PASSKEY_REQUEST, hdev, &ev, sizeof(ev),
7456 			  NULL);
7457 }
7458 
user_pairing_resp_complete(struct hci_dev * hdev,bdaddr_t * bdaddr,u8 link_type,u8 addr_type,u8 status,u8 opcode)7459 static int user_pairing_resp_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
7460 				      u8 link_type, u8 addr_type, u8 status,
7461 				      u8 opcode)
7462 {
7463 	struct mgmt_pending_cmd *cmd;
7464 
7465 	cmd = pending_find(opcode, hdev);
7466 	if (!cmd)
7467 		return -ENOENT;
7468 
7469 	cmd->cmd_complete(cmd, mgmt_status(status));
7470 	mgmt_pending_remove(cmd);
7471 
7472 	return 0;
7473 }
7474 
mgmt_user_confirm_reply_complete(struct hci_dev * hdev,bdaddr_t * bdaddr,u8 link_type,u8 addr_type,u8 status)7475 int mgmt_user_confirm_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
7476 				     u8 link_type, u8 addr_type, u8 status)
7477 {
7478 	return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
7479 					  status, MGMT_OP_USER_CONFIRM_REPLY);
7480 }
7481 
mgmt_user_confirm_neg_reply_complete(struct hci_dev * hdev,bdaddr_t * bdaddr,u8 link_type,u8 addr_type,u8 status)7482 int mgmt_user_confirm_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
7483 					 u8 link_type, u8 addr_type, u8 status)
7484 {
7485 	return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
7486 					  status,
7487 					  MGMT_OP_USER_CONFIRM_NEG_REPLY);
7488 }
7489 
mgmt_user_passkey_reply_complete(struct hci_dev * hdev,bdaddr_t * bdaddr,u8 link_type,u8 addr_type,u8 status)7490 int mgmt_user_passkey_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
7491 				     u8 link_type, u8 addr_type, u8 status)
7492 {
7493 	return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
7494 					  status, MGMT_OP_USER_PASSKEY_REPLY);
7495 }
7496 
mgmt_user_passkey_neg_reply_complete(struct hci_dev * hdev,bdaddr_t * bdaddr,u8 link_type,u8 addr_type,u8 status)7497 int mgmt_user_passkey_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
7498 					 u8 link_type, u8 addr_type, u8 status)
7499 {
7500 	return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
7501 					  status,
7502 					  MGMT_OP_USER_PASSKEY_NEG_REPLY);
7503 }
7504 
mgmt_user_passkey_notify(struct hci_dev * hdev,bdaddr_t * bdaddr,u8 link_type,u8 addr_type,u32 passkey,u8 entered)7505 int mgmt_user_passkey_notify(struct hci_dev *hdev, bdaddr_t *bdaddr,
7506 			     u8 link_type, u8 addr_type, u32 passkey,
7507 			     u8 entered)
7508 {
7509 	struct mgmt_ev_passkey_notify ev;
7510 
7511 	BT_DBG("%s", hdev->name);
7512 
7513 	bacpy(&ev.addr.bdaddr, bdaddr);
7514 	ev.addr.type = link_to_bdaddr(link_type, addr_type);
7515 	ev.passkey = __cpu_to_le32(passkey);
7516 	ev.entered = entered;
7517 
7518 	return mgmt_event(MGMT_EV_PASSKEY_NOTIFY, hdev, &ev, sizeof(ev), NULL);
7519 }
7520 
mgmt_auth_failed(struct hci_conn * conn,u8 hci_status)7521 void mgmt_auth_failed(struct hci_conn *conn, u8 hci_status)
7522 {
7523 	struct mgmt_ev_auth_failed ev;
7524 	struct mgmt_pending_cmd *cmd;
7525 	u8 status = mgmt_status(hci_status);
7526 
7527 	bacpy(&ev.addr.bdaddr, &conn->dst);
7528 	ev.addr.type = link_to_bdaddr(conn->type, conn->dst_type);
7529 	ev.status = status;
7530 
7531 	cmd = find_pairing(conn);
7532 
7533 	mgmt_event(MGMT_EV_AUTH_FAILED, conn->hdev, &ev, sizeof(ev),
7534 		    cmd ? cmd->sk : NULL);
7535 
7536 	if (cmd) {
7537 		cmd->cmd_complete(cmd, status);
7538 		mgmt_pending_remove(cmd);
7539 	}
7540 }
7541 
mgmt_auth_enable_complete(struct hci_dev * hdev,u8 status)7542 void mgmt_auth_enable_complete(struct hci_dev *hdev, u8 status)
7543 {
7544 	struct cmd_lookup match = { NULL, hdev };
7545 	bool changed;
7546 
7547 	if (status) {
7548 		u8 mgmt_err = mgmt_status(status);
7549 		mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev,
7550 				     cmd_status_rsp, &mgmt_err);
7551 		return;
7552 	}
7553 
7554 	if (test_bit(HCI_AUTH, &hdev->flags))
7555 		changed = !hci_dev_test_and_set_flag(hdev, HCI_LINK_SECURITY);
7556 	else
7557 		changed = hci_dev_test_and_clear_flag(hdev, HCI_LINK_SECURITY);
7558 
7559 	mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev, settings_rsp,
7560 			     &match);
7561 
7562 	if (changed)
7563 		new_settings(hdev, match.sk);
7564 
7565 	if (match.sk)
7566 		sock_put(match.sk);
7567 }
7568 
clear_eir(struct hci_request * req)7569 static void clear_eir(struct hci_request *req)
7570 {
7571 	struct hci_dev *hdev = req->hdev;
7572 	struct hci_cp_write_eir cp;
7573 
7574 	if (!lmp_ext_inq_capable(hdev))
7575 		return;
7576 
7577 	memset(hdev->eir, 0, sizeof(hdev->eir));
7578 
7579 	memset(&cp, 0, sizeof(cp));
7580 
7581 	hci_req_add(req, HCI_OP_WRITE_EIR, sizeof(cp), &cp);
7582 }
7583 
mgmt_ssp_enable_complete(struct hci_dev * hdev,u8 enable,u8 status)7584 void mgmt_ssp_enable_complete(struct hci_dev *hdev, u8 enable, u8 status)
7585 {
7586 	struct cmd_lookup match = { NULL, hdev };
7587 	struct hci_request req;
7588 	bool changed = false;
7589 
7590 	if (status) {
7591 		u8 mgmt_err = mgmt_status(status);
7592 
7593 		if (enable && hci_dev_test_and_clear_flag(hdev,
7594 							  HCI_SSP_ENABLED)) {
7595 			hci_dev_clear_flag(hdev, HCI_HS_ENABLED);
7596 			new_settings(hdev, NULL);
7597 		}
7598 
7599 		mgmt_pending_foreach(MGMT_OP_SET_SSP, hdev, cmd_status_rsp,
7600 				     &mgmt_err);
7601 		return;
7602 	}
7603 
7604 	if (enable) {
7605 		changed = !hci_dev_test_and_set_flag(hdev, HCI_SSP_ENABLED);
7606 	} else {
7607 		changed = hci_dev_test_and_clear_flag(hdev, HCI_SSP_ENABLED);
7608 		if (!changed)
7609 			changed = hci_dev_test_and_clear_flag(hdev,
7610 							      HCI_HS_ENABLED);
7611 		else
7612 			hci_dev_clear_flag(hdev, HCI_HS_ENABLED);
7613 	}
7614 
7615 	mgmt_pending_foreach(MGMT_OP_SET_SSP, hdev, settings_rsp, &match);
7616 
7617 	if (changed)
7618 		new_settings(hdev, match.sk);
7619 
7620 	if (match.sk)
7621 		sock_put(match.sk);
7622 
7623 	hci_req_init(&req, hdev);
7624 
7625 	if (hci_dev_test_flag(hdev, HCI_SSP_ENABLED)) {
7626 		if (hci_dev_test_flag(hdev, HCI_USE_DEBUG_KEYS))
7627 			hci_req_add(&req, HCI_OP_WRITE_SSP_DEBUG_MODE,
7628 				    sizeof(enable), &enable);
7629 		__hci_req_update_eir(&req);
7630 	} else {
7631 		clear_eir(&req);
7632 	}
7633 
7634 	hci_req_run(&req, NULL);
7635 }
7636 
sk_lookup(struct mgmt_pending_cmd * cmd,void * data)7637 static void sk_lookup(struct mgmt_pending_cmd *cmd, void *data)
7638 {
7639 	struct cmd_lookup *match = data;
7640 
7641 	if (match->sk == NULL) {
7642 		match->sk = cmd->sk;
7643 		sock_hold(match->sk);
7644 	}
7645 }
7646 
mgmt_set_class_of_dev_complete(struct hci_dev * hdev,u8 * dev_class,u8 status)7647 void mgmt_set_class_of_dev_complete(struct hci_dev *hdev, u8 *dev_class,
7648 				    u8 status)
7649 {
7650 	struct cmd_lookup match = { NULL, hdev, mgmt_status(status) };
7651 
7652 	mgmt_pending_foreach(MGMT_OP_SET_DEV_CLASS, hdev, sk_lookup, &match);
7653 	mgmt_pending_foreach(MGMT_OP_ADD_UUID, hdev, sk_lookup, &match);
7654 	mgmt_pending_foreach(MGMT_OP_REMOVE_UUID, hdev, sk_lookup, &match);
7655 
7656 	if (!status) {
7657 		mgmt_limited_event(MGMT_EV_CLASS_OF_DEV_CHANGED, hdev, dev_class,
7658 				   3, HCI_MGMT_DEV_CLASS_EVENTS, NULL);
7659 		ext_info_changed(hdev, NULL);
7660 	}
7661 
7662 	if (match.sk)
7663 		sock_put(match.sk);
7664 }
7665 
mgmt_set_local_name_complete(struct hci_dev * hdev,u8 * name,u8 status)7666 void mgmt_set_local_name_complete(struct hci_dev *hdev, u8 *name, u8 status)
7667 {
7668 	struct mgmt_cp_set_local_name ev;
7669 	struct mgmt_pending_cmd *cmd;
7670 
7671 	if (status)
7672 		return;
7673 
7674 	memset(&ev, 0, sizeof(ev));
7675 	memcpy(ev.name, name, HCI_MAX_NAME_LENGTH);
7676 	memcpy(ev.short_name, hdev->short_name, HCI_MAX_SHORT_NAME_LENGTH);
7677 
7678 	cmd = pending_find(MGMT_OP_SET_LOCAL_NAME, hdev);
7679 	if (!cmd) {
7680 		memcpy(hdev->dev_name, name, sizeof(hdev->dev_name));
7681 
7682 		/* If this is a HCI command related to powering on the
7683 		 * HCI dev don't send any mgmt signals.
7684 		 */
7685 		if (pending_find(MGMT_OP_SET_POWERED, hdev))
7686 			return;
7687 	}
7688 
7689 	mgmt_limited_event(MGMT_EV_LOCAL_NAME_CHANGED, hdev, &ev, sizeof(ev),
7690 			   HCI_MGMT_LOCAL_NAME_EVENTS, cmd ? cmd->sk : NULL);
7691 	ext_info_changed(hdev, cmd ? cmd->sk : NULL);
7692 }
7693 
has_uuid(u8 * uuid,u16 uuid_count,u8 (* uuids)[16])7694 static inline bool has_uuid(u8 *uuid, u16 uuid_count, u8 (*uuids)[16])
7695 {
7696 	int i;
7697 
7698 	for (i = 0; i < uuid_count; i++) {
7699 		if (!memcmp(uuid, uuids[i], 16))
7700 			return true;
7701 	}
7702 
7703 	return false;
7704 }
7705 
eir_has_uuids(u8 * eir,u16 eir_len,u16 uuid_count,u8 (* uuids)[16])7706 static bool eir_has_uuids(u8 *eir, u16 eir_len, u16 uuid_count, u8 (*uuids)[16])
7707 {
7708 	u16 parsed = 0;
7709 
7710 	while (parsed < eir_len) {
7711 		u8 field_len = eir[0];
7712 		u8 uuid[16];
7713 		int i;
7714 
7715 		if (field_len == 0)
7716 			break;
7717 
7718 		if (eir_len - parsed < field_len + 1)
7719 			break;
7720 
7721 		switch (eir[1]) {
7722 		case EIR_UUID16_ALL:
7723 		case EIR_UUID16_SOME:
7724 			for (i = 0; i + 3 <= field_len; i += 2) {
7725 				memcpy(uuid, bluetooth_base_uuid, 16);
7726 				uuid[13] = eir[i + 3];
7727 				uuid[12] = eir[i + 2];
7728 				if (has_uuid(uuid, uuid_count, uuids))
7729 					return true;
7730 			}
7731 			break;
7732 		case EIR_UUID32_ALL:
7733 		case EIR_UUID32_SOME:
7734 			for (i = 0; i + 5 <= field_len; i += 4) {
7735 				memcpy(uuid, bluetooth_base_uuid, 16);
7736 				uuid[15] = eir[i + 5];
7737 				uuid[14] = eir[i + 4];
7738 				uuid[13] = eir[i + 3];
7739 				uuid[12] = eir[i + 2];
7740 				if (has_uuid(uuid, uuid_count, uuids))
7741 					return true;
7742 			}
7743 			break;
7744 		case EIR_UUID128_ALL:
7745 		case EIR_UUID128_SOME:
7746 			for (i = 0; i + 17 <= field_len; i += 16) {
7747 				memcpy(uuid, eir + i + 2, 16);
7748 				if (has_uuid(uuid, uuid_count, uuids))
7749 					return true;
7750 			}
7751 			break;
7752 		}
7753 
7754 		parsed += field_len + 1;
7755 		eir += field_len + 1;
7756 	}
7757 
7758 	return false;
7759 }
7760 
restart_le_scan(struct hci_dev * hdev)7761 static void restart_le_scan(struct hci_dev *hdev)
7762 {
7763 	/* If controller is not scanning we are done. */
7764 	if (!hci_dev_test_flag(hdev, HCI_LE_SCAN))
7765 		return;
7766 
7767 	if (time_after(jiffies + DISCOV_LE_RESTART_DELAY,
7768 		       hdev->discovery.scan_start +
7769 		       hdev->discovery.scan_duration))
7770 		return;
7771 
7772 	queue_delayed_work(hdev->req_workqueue, &hdev->le_scan_restart,
7773 			   DISCOV_LE_RESTART_DELAY);
7774 }
7775 
is_filter_match(struct hci_dev * hdev,s8 rssi,u8 * eir,u16 eir_len,u8 * scan_rsp,u8 scan_rsp_len)7776 static bool is_filter_match(struct hci_dev *hdev, s8 rssi, u8 *eir,
7777 			    u16 eir_len, u8 *scan_rsp, u8 scan_rsp_len)
7778 {
7779 	/* If a RSSI threshold has been specified, and
7780 	 * HCI_QUIRK_STRICT_DUPLICATE_FILTER is not set, then all results with
7781 	 * a RSSI smaller than the RSSI threshold will be dropped. If the quirk
7782 	 * is set, let it through for further processing, as we might need to
7783 	 * restart the scan.
7784 	 *
7785 	 * For BR/EDR devices (pre 1.2) providing no RSSI during inquiry,
7786 	 * the results are also dropped.
7787 	 */
7788 	if (hdev->discovery.rssi != HCI_RSSI_INVALID &&
7789 	    (rssi == HCI_RSSI_INVALID ||
7790 	    (rssi < hdev->discovery.rssi &&
7791 	     !test_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks))))
7792 		return  false;
7793 
7794 	if (hdev->discovery.uuid_count != 0) {
7795 		/* If a list of UUIDs is provided in filter, results with no
7796 		 * matching UUID should be dropped.
7797 		 */
7798 		if (!eir_has_uuids(eir, eir_len, hdev->discovery.uuid_count,
7799 				   hdev->discovery.uuids) &&
7800 		    !eir_has_uuids(scan_rsp, scan_rsp_len,
7801 				   hdev->discovery.uuid_count,
7802 				   hdev->discovery.uuids))
7803 			return false;
7804 	}
7805 
7806 	/* If duplicate filtering does not report RSSI changes, then restart
7807 	 * scanning to ensure updated result with updated RSSI values.
7808 	 */
7809 	if (test_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks)) {
7810 		restart_le_scan(hdev);
7811 
7812 		/* Validate RSSI value against the RSSI threshold once more. */
7813 		if (hdev->discovery.rssi != HCI_RSSI_INVALID &&
7814 		    rssi < hdev->discovery.rssi)
7815 			return false;
7816 	}
7817 
7818 	return true;
7819 }
7820 
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)7821 void mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
7822 		       u8 addr_type, u8 *dev_class, s8 rssi, u32 flags,
7823 		       u8 *eir, u16 eir_len, u8 *scan_rsp, u8 scan_rsp_len)
7824 {
7825 	char buf[512];
7826 	struct mgmt_ev_device_found *ev = (void *)buf;
7827 	size_t ev_size;
7828 
7829 	/* Don't send events for a non-kernel initiated discovery. With
7830 	 * LE one exception is if we have pend_le_reports > 0 in which
7831 	 * case we're doing passive scanning and want these events.
7832 	 */
7833 	if (!hci_discovery_active(hdev)) {
7834 		if (link_type == ACL_LINK)
7835 			return;
7836 		if (link_type == LE_LINK && list_empty(&hdev->pend_le_reports))
7837 			return;
7838 	}
7839 
7840 	if (hdev->discovery.result_filtering) {
7841 		/* We are using service discovery */
7842 		if (!is_filter_match(hdev, rssi, eir, eir_len, scan_rsp,
7843 				     scan_rsp_len))
7844 			return;
7845 	}
7846 
7847 	if (hdev->discovery.limited) {
7848 		/* Check for limited discoverable bit */
7849 		if (dev_class) {
7850 			if (!(dev_class[1] & 0x20))
7851 				return;
7852 		} else {
7853 			u8 *flags = eir_get_data(eir, eir_len, EIR_FLAGS, NULL);
7854 			if (!flags || !(flags[0] & LE_AD_LIMITED))
7855 				return;
7856 		}
7857 	}
7858 
7859 	/* Make sure that the buffer is big enough. The 5 extra bytes
7860 	 * are for the potential CoD field.
7861 	 */
7862 	if (sizeof(*ev) + eir_len + scan_rsp_len + 5 > sizeof(buf))
7863 		return;
7864 
7865 	memset(buf, 0, sizeof(buf));
7866 
7867 	/* In case of device discovery with BR/EDR devices (pre 1.2), the
7868 	 * RSSI value was reported as 0 when not available. This behavior
7869 	 * is kept when using device discovery. This is required for full
7870 	 * backwards compatibility with the API.
7871 	 *
7872 	 * However when using service discovery, the value 127 will be
7873 	 * returned when the RSSI is not available.
7874 	 */
7875 	if (rssi == HCI_RSSI_INVALID && !hdev->discovery.report_invalid_rssi &&
7876 	    link_type == ACL_LINK)
7877 		rssi = 0;
7878 
7879 	bacpy(&ev->addr.bdaddr, bdaddr);
7880 	ev->addr.type = link_to_bdaddr(link_type, addr_type);
7881 	ev->rssi = rssi;
7882 	ev->flags = cpu_to_le32(flags);
7883 
7884 	if (eir_len > 0)
7885 		/* Copy EIR or advertising data into event */
7886 		memcpy(ev->eir, eir, eir_len);
7887 
7888 	if (dev_class && !eir_get_data(ev->eir, eir_len, EIR_CLASS_OF_DEV,
7889 				       NULL))
7890 		eir_len = eir_append_data(ev->eir, eir_len, EIR_CLASS_OF_DEV,
7891 					  dev_class, 3);
7892 
7893 	if (scan_rsp_len > 0)
7894 		/* Append scan response data to event */
7895 		memcpy(ev->eir + eir_len, scan_rsp, scan_rsp_len);
7896 
7897 	ev->eir_len = cpu_to_le16(eir_len + scan_rsp_len);
7898 	ev_size = sizeof(*ev) + eir_len + scan_rsp_len;
7899 
7900 	mgmt_event(MGMT_EV_DEVICE_FOUND, hdev, ev, ev_size, NULL);
7901 }
7902 
mgmt_remote_name(struct hci_dev * hdev,bdaddr_t * bdaddr,u8 link_type,u8 addr_type,s8 rssi,u8 * name,u8 name_len)7903 void mgmt_remote_name(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
7904 		      u8 addr_type, s8 rssi, u8 *name, u8 name_len)
7905 {
7906 	struct mgmt_ev_device_found *ev;
7907 	char buf[sizeof(*ev) + HCI_MAX_NAME_LENGTH + 2];
7908 	u16 eir_len;
7909 
7910 	ev = (struct mgmt_ev_device_found *) buf;
7911 
7912 	memset(buf, 0, sizeof(buf));
7913 
7914 	bacpy(&ev->addr.bdaddr, bdaddr);
7915 	ev->addr.type = link_to_bdaddr(link_type, addr_type);
7916 	ev->rssi = rssi;
7917 
7918 	eir_len = eir_append_data(ev->eir, 0, EIR_NAME_COMPLETE, name,
7919 				  name_len);
7920 
7921 	ev->eir_len = cpu_to_le16(eir_len);
7922 
7923 	mgmt_event(MGMT_EV_DEVICE_FOUND, hdev, ev, sizeof(*ev) + eir_len, NULL);
7924 }
7925 
mgmt_discovering(struct hci_dev * hdev,u8 discovering)7926 void mgmt_discovering(struct hci_dev *hdev, u8 discovering)
7927 {
7928 	struct mgmt_ev_discovering ev;
7929 
7930 	BT_DBG("%s discovering %u", hdev->name, discovering);
7931 
7932 	memset(&ev, 0, sizeof(ev));
7933 	ev.type = hdev->discovery.type;
7934 	ev.discovering = discovering;
7935 
7936 	mgmt_event(MGMT_EV_DISCOVERING, hdev, &ev, sizeof(ev), NULL);
7937 }
7938 
7939 static struct hci_mgmt_chan chan = {
7940 	.channel	= HCI_CHANNEL_CONTROL,
7941 	.handler_count	= ARRAY_SIZE(mgmt_handlers),
7942 	.handlers	= mgmt_handlers,
7943 	.hdev_init	= mgmt_init_hdev,
7944 };
7945 
mgmt_init(void)7946 int mgmt_init(void)
7947 {
7948 	return hci_mgmt_chan_register(&chan);
7949 }
7950 
mgmt_exit(void)7951 void mgmt_exit(void)
7952 {
7953 	hci_mgmt_chan_unregister(&chan);
7954 }
7955