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/kernel.h>
28 #include <linux/uaccess.h>
29 #include <linux/module.h>
30 #include <asm/unaligned.h>
31 
32 #include <net/bluetooth/bluetooth.h>
33 #include <net/bluetooth/hci_core.h>
34 #include <net/bluetooth/mgmt.h>
35 #include <net/bluetooth/smp.h>
36 
37 bool enable_hs;
38 bool enable_le;
39 
40 #define MGMT_VERSION	1
41 #define MGMT_REVISION	0
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_PAIRABLE,
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 };
82 
83 static const u16 mgmt_events[] = {
84 	MGMT_EV_CONTROLLER_ERROR,
85 	MGMT_EV_INDEX_ADDED,
86 	MGMT_EV_INDEX_REMOVED,
87 	MGMT_EV_NEW_SETTINGS,
88 	MGMT_EV_CLASS_OF_DEV_CHANGED,
89 	MGMT_EV_LOCAL_NAME_CHANGED,
90 	MGMT_EV_NEW_LINK_KEY,
91 	MGMT_EV_NEW_LONG_TERM_KEY,
92 	MGMT_EV_DEVICE_CONNECTED,
93 	MGMT_EV_DEVICE_DISCONNECTED,
94 	MGMT_EV_CONNECT_FAILED,
95 	MGMT_EV_PIN_CODE_REQUEST,
96 	MGMT_EV_USER_CONFIRM_REQUEST,
97 	MGMT_EV_USER_PASSKEY_REQUEST,
98 	MGMT_EV_AUTH_FAILED,
99 	MGMT_EV_DEVICE_FOUND,
100 	MGMT_EV_DISCOVERING,
101 	MGMT_EV_DEVICE_BLOCKED,
102 	MGMT_EV_DEVICE_UNBLOCKED,
103 	MGMT_EV_DEVICE_UNPAIRED,
104 };
105 
106 /*
107  * These LE scan and inquiry parameters were chosen according to LE General
108  * Discovery Procedure specification.
109  */
110 #define LE_SCAN_TYPE			0x01
111 #define LE_SCAN_WIN			0x12
112 #define LE_SCAN_INT			0x12
113 #define LE_SCAN_TIMEOUT_LE_ONLY		10240	/* TGAP(gen_disc_scan_min) */
114 #define LE_SCAN_TIMEOUT_BREDR_LE	5120	/* TGAP(100)/2 */
115 
116 #define INQUIRY_LEN_BREDR		0x08	/* TGAP(100) */
117 #define INQUIRY_LEN_BREDR_LE		0x04	/* TGAP(100)/2 */
118 
119 #define CACHE_TIMEOUT	msecs_to_jiffies(2 * 1000)
120 
121 #define hdev_is_powered(hdev) (test_bit(HCI_UP, &hdev->flags) && \
122 				!test_bit(HCI_AUTO_OFF, &hdev->dev_flags))
123 
124 struct pending_cmd {
125 	struct list_head list;
126 	u16 opcode;
127 	int index;
128 	void *param;
129 	struct sock *sk;
130 	void *user_data;
131 };
132 
133 /* HCI to MGMT error code conversion table */
134 static u8 mgmt_status_table[] = {
135 	MGMT_STATUS_SUCCESS,
136 	MGMT_STATUS_UNKNOWN_COMMAND,	/* Unknown Command */
137 	MGMT_STATUS_NOT_CONNECTED,	/* No Connection */
138 	MGMT_STATUS_FAILED,		/* Hardware Failure */
139 	MGMT_STATUS_CONNECT_FAILED,	/* Page Timeout */
140 	MGMT_STATUS_AUTH_FAILED,	/* Authentication Failed */
141 	MGMT_STATUS_NOT_PAIRED,		/* PIN or Key Missing */
142 	MGMT_STATUS_NO_RESOURCES,	/* Memory Full */
143 	MGMT_STATUS_TIMEOUT,		/* Connection Timeout */
144 	MGMT_STATUS_NO_RESOURCES,	/* Max Number of Connections */
145 	MGMT_STATUS_NO_RESOURCES,	/* Max Number of SCO Connections */
146 	MGMT_STATUS_ALREADY_CONNECTED,	/* ACL Connection Exists */
147 	MGMT_STATUS_BUSY,		/* Command Disallowed */
148 	MGMT_STATUS_NO_RESOURCES,	/* Rejected Limited Resources */
149 	MGMT_STATUS_REJECTED,		/* Rejected Security */
150 	MGMT_STATUS_REJECTED,		/* Rejected Personal */
151 	MGMT_STATUS_TIMEOUT,		/* Host Timeout */
152 	MGMT_STATUS_NOT_SUPPORTED,	/* Unsupported Feature */
153 	MGMT_STATUS_INVALID_PARAMS,	/* Invalid Parameters */
154 	MGMT_STATUS_DISCONNECTED,	/* OE User Ended Connection */
155 	MGMT_STATUS_NO_RESOURCES,	/* OE Low Resources */
156 	MGMT_STATUS_DISCONNECTED,	/* OE Power Off */
157 	MGMT_STATUS_DISCONNECTED,	/* Connection Terminated */
158 	MGMT_STATUS_BUSY,		/* Repeated Attempts */
159 	MGMT_STATUS_REJECTED,		/* Pairing Not Allowed */
160 	MGMT_STATUS_FAILED,		/* Unknown LMP PDU */
161 	MGMT_STATUS_NOT_SUPPORTED,	/* Unsupported Remote Feature */
162 	MGMT_STATUS_REJECTED,		/* SCO Offset Rejected */
163 	MGMT_STATUS_REJECTED,		/* SCO Interval Rejected */
164 	MGMT_STATUS_REJECTED,		/* Air Mode Rejected */
165 	MGMT_STATUS_INVALID_PARAMS,	/* Invalid LMP Parameters */
166 	MGMT_STATUS_FAILED,		/* Unspecified Error */
167 	MGMT_STATUS_NOT_SUPPORTED,	/* Unsupported LMP Parameter Value */
168 	MGMT_STATUS_FAILED,		/* Role Change Not Allowed */
169 	MGMT_STATUS_TIMEOUT,		/* LMP Response Timeout */
170 	MGMT_STATUS_FAILED,		/* LMP Error Transaction Collision */
171 	MGMT_STATUS_FAILED,		/* LMP PDU Not Allowed */
172 	MGMT_STATUS_REJECTED,		/* Encryption Mode Not Accepted */
173 	MGMT_STATUS_FAILED,		/* Unit Link Key Used */
174 	MGMT_STATUS_NOT_SUPPORTED,	/* QoS Not Supported */
175 	MGMT_STATUS_TIMEOUT,		/* Instant Passed */
176 	MGMT_STATUS_NOT_SUPPORTED,	/* Pairing Not Supported */
177 	MGMT_STATUS_FAILED,		/* Transaction Collision */
178 	MGMT_STATUS_INVALID_PARAMS,	/* Unacceptable Parameter */
179 	MGMT_STATUS_REJECTED,		/* QoS Rejected */
180 	MGMT_STATUS_NOT_SUPPORTED,	/* Classification Not Supported */
181 	MGMT_STATUS_REJECTED,		/* Insufficient Security */
182 	MGMT_STATUS_INVALID_PARAMS,	/* Parameter Out Of Range */
183 	MGMT_STATUS_BUSY,		/* Role Switch Pending */
184 	MGMT_STATUS_FAILED,		/* Slot Violation */
185 	MGMT_STATUS_FAILED,		/* Role Switch Failed */
186 	MGMT_STATUS_INVALID_PARAMS,	/* EIR Too Large */
187 	MGMT_STATUS_NOT_SUPPORTED,	/* Simple Pairing Not Supported */
188 	MGMT_STATUS_BUSY,		/* Host Busy Pairing */
189 	MGMT_STATUS_REJECTED,		/* Rejected, No Suitable Channel */
190 	MGMT_STATUS_BUSY,		/* Controller Busy */
191 	MGMT_STATUS_INVALID_PARAMS,	/* Unsuitable Connection Interval */
192 	MGMT_STATUS_TIMEOUT,		/* Directed Advertising Timeout */
193 	MGMT_STATUS_AUTH_FAILED,	/* Terminated Due to MIC Failure */
194 	MGMT_STATUS_CONNECT_FAILED,	/* Connection Establishment Failed */
195 	MGMT_STATUS_CONNECT_FAILED,	/* MAC Connection Failed */
196 };
197 
mgmt_status(u8 hci_status)198 static u8 mgmt_status(u8 hci_status)
199 {
200 	if (hci_status < ARRAY_SIZE(mgmt_status_table))
201 		return mgmt_status_table[hci_status];
202 
203 	return MGMT_STATUS_FAILED;
204 }
205 
cmd_status(struct sock * sk,u16 index,u16 cmd,u8 status)206 static int cmd_status(struct sock *sk, u16 index, u16 cmd, u8 status)
207 {
208 	struct sk_buff *skb;
209 	struct mgmt_hdr *hdr;
210 	struct mgmt_ev_cmd_status *ev;
211 	int err;
212 
213 	BT_DBG("sock %p, index %u, cmd %u, status %u", sk, index, cmd, status);
214 
215 	skb = alloc_skb(sizeof(*hdr) + sizeof(*ev), GFP_ATOMIC);
216 	if (!skb)
217 		return -ENOMEM;
218 
219 	hdr = (void *) skb_put(skb, sizeof(*hdr));
220 
221 	hdr->opcode = cpu_to_le16(MGMT_EV_CMD_STATUS);
222 	hdr->index = cpu_to_le16(index);
223 	hdr->len = cpu_to_le16(sizeof(*ev));
224 
225 	ev = (void *) skb_put(skb, sizeof(*ev));
226 	ev->status = status;
227 	put_unaligned_le16(cmd, &ev->opcode);
228 
229 	err = sock_queue_rcv_skb(sk, skb);
230 	if (err < 0)
231 		kfree_skb(skb);
232 
233 	return err;
234 }
235 
cmd_complete(struct sock * sk,u16 index,u16 cmd,u8 status,void * rp,size_t rp_len)236 static int cmd_complete(struct sock *sk, u16 index, u16 cmd, u8 status,
237 			void *rp, size_t rp_len)
238 {
239 	struct sk_buff *skb;
240 	struct mgmt_hdr *hdr;
241 	struct mgmt_ev_cmd_complete *ev;
242 	int err;
243 
244 	BT_DBG("sock %p", sk);
245 
246 	skb = alloc_skb(sizeof(*hdr) + sizeof(*ev) + rp_len, GFP_ATOMIC);
247 	if (!skb)
248 		return -ENOMEM;
249 
250 	hdr = (void *) skb_put(skb, sizeof(*hdr));
251 
252 	hdr->opcode = cpu_to_le16(MGMT_EV_CMD_COMPLETE);
253 	hdr->index = cpu_to_le16(index);
254 	hdr->len = cpu_to_le16(sizeof(*ev) + rp_len);
255 
256 	ev = (void *) skb_put(skb, sizeof(*ev) + rp_len);
257 	put_unaligned_le16(cmd, &ev->opcode);
258 	ev->status = status;
259 
260 	if (rp)
261 		memcpy(ev->data, rp, rp_len);
262 
263 	err = sock_queue_rcv_skb(sk, skb);
264 	if (err < 0)
265 		kfree_skb(skb);
266 
267 	return err;
268 }
269 
read_version(struct sock * sk,struct hci_dev * hdev,void * data,u16 data_len)270 static int read_version(struct sock *sk, struct hci_dev *hdev, void *data,
271 			u16 data_len)
272 {
273 	struct mgmt_rp_read_version rp;
274 
275 	BT_DBG("sock %p", sk);
276 
277 	rp.version = MGMT_VERSION;
278 	put_unaligned_le16(MGMT_REVISION, &rp.revision);
279 
280 	return cmd_complete(sk, MGMT_INDEX_NONE, MGMT_OP_READ_VERSION, 0, &rp,
281 			    sizeof(rp));
282 }
283 
read_commands(struct sock * sk,struct hci_dev * hdev,void * data,u16 data_len)284 static int read_commands(struct sock *sk, struct hci_dev *hdev, void *data,
285 			 u16 data_len)
286 {
287 	struct mgmt_rp_read_commands *rp;
288 	u16 num_commands = ARRAY_SIZE(mgmt_commands);
289 	u16 num_events = ARRAY_SIZE(mgmt_events);
290 	u16 *opcode;
291 	size_t rp_size;
292 	int i, err;
293 
294 	BT_DBG("sock %p", sk);
295 
296 	rp_size = sizeof(*rp) + ((num_commands + num_events) * sizeof(u16));
297 
298 	rp = kmalloc(rp_size, GFP_KERNEL);
299 	if (!rp)
300 		return -ENOMEM;
301 
302 	put_unaligned_le16(num_commands, &rp->num_commands);
303 	put_unaligned_le16(num_events, &rp->num_events);
304 
305 	for (i = 0, opcode = rp->opcodes; i < num_commands; i++, opcode++)
306 		put_unaligned_le16(mgmt_commands[i], opcode);
307 
308 	for (i = 0; i < num_events; i++, opcode++)
309 		put_unaligned_le16(mgmt_events[i], opcode);
310 
311 	err = cmd_complete(sk, MGMT_INDEX_NONE, MGMT_OP_READ_COMMANDS, 0, rp,
312 			   rp_size);
313 	kfree(rp);
314 
315 	return err;
316 }
317 
read_index_list(struct sock * sk,struct hci_dev * hdev,void * data,u16 data_len)318 static int read_index_list(struct sock *sk, struct hci_dev *hdev, void *data,
319 			   u16 data_len)
320 {
321 	struct mgmt_rp_read_index_list *rp;
322 	struct list_head *p;
323 	struct hci_dev *d;
324 	size_t rp_len;
325 	u16 count;
326 	int i, err;
327 
328 	BT_DBG("sock %p", sk);
329 
330 	read_lock(&hci_dev_list_lock);
331 
332 	count = 0;
333 	list_for_each(p, &hci_dev_list) {
334 		count++;
335 	}
336 
337 	rp_len = sizeof(*rp) + (2 * count);
338 	rp = kmalloc(rp_len, GFP_ATOMIC);
339 	if (!rp) {
340 		read_unlock(&hci_dev_list_lock);
341 		return -ENOMEM;
342 	}
343 
344 	put_unaligned_le16(count, &rp->num_controllers);
345 
346 	i = 0;
347 	list_for_each_entry(d, &hci_dev_list, list) {
348 		if (test_bit(HCI_SETUP, &d->dev_flags))
349 			continue;
350 
351 		put_unaligned_le16(d->id, &rp->index[i++]);
352 		BT_DBG("Added hci%u", d->id);
353 	}
354 
355 	read_unlock(&hci_dev_list_lock);
356 
357 	err = cmd_complete(sk, MGMT_INDEX_NONE, MGMT_OP_READ_INDEX_LIST, 0, rp,
358 			   rp_len);
359 
360 	kfree(rp);
361 
362 	return err;
363 }
364 
get_supported_settings(struct hci_dev * hdev)365 static u32 get_supported_settings(struct hci_dev *hdev)
366 {
367 	u32 settings = 0;
368 
369 	settings |= MGMT_SETTING_POWERED;
370 	settings |= MGMT_SETTING_CONNECTABLE;
371 	settings |= MGMT_SETTING_FAST_CONNECTABLE;
372 	settings |= MGMT_SETTING_DISCOVERABLE;
373 	settings |= MGMT_SETTING_PAIRABLE;
374 
375 	if (hdev->features[6] & LMP_SIMPLE_PAIR)
376 		settings |= MGMT_SETTING_SSP;
377 
378 	if (!(hdev->features[4] & LMP_NO_BREDR)) {
379 		settings |= MGMT_SETTING_BREDR;
380 		settings |= MGMT_SETTING_LINK_SECURITY;
381 	}
382 
383 	if (enable_hs)
384 		settings |= MGMT_SETTING_HS;
385 
386 	if (enable_le) {
387 		if (hdev->features[4] & LMP_LE)
388 			settings |= MGMT_SETTING_LE;
389 	}
390 
391 	return settings;
392 }
393 
get_current_settings(struct hci_dev * hdev)394 static u32 get_current_settings(struct hci_dev *hdev)
395 {
396 	u32 settings = 0;
397 
398 	if (hdev_is_powered(hdev))
399 		settings |= MGMT_SETTING_POWERED;
400 
401 	if (test_bit(HCI_CONNECTABLE, &hdev->dev_flags))
402 		settings |= MGMT_SETTING_CONNECTABLE;
403 
404 	if (test_bit(HCI_DISCOVERABLE, &hdev->dev_flags))
405 		settings |= MGMT_SETTING_DISCOVERABLE;
406 
407 	if (test_bit(HCI_PAIRABLE, &hdev->dev_flags))
408 		settings |= MGMT_SETTING_PAIRABLE;
409 
410 	if (!(hdev->features[4] & LMP_NO_BREDR))
411 		settings |= MGMT_SETTING_BREDR;
412 
413 	if (test_bit(HCI_LE_ENABLED, &hdev->dev_flags))
414 		settings |= MGMT_SETTING_LE;
415 
416 	if (test_bit(HCI_LINK_SECURITY, &hdev->dev_flags))
417 		settings |= MGMT_SETTING_LINK_SECURITY;
418 
419 	if (test_bit(HCI_SSP_ENABLED, &hdev->dev_flags))
420 		settings |= MGMT_SETTING_SSP;
421 
422 	if (test_bit(HCI_HS_ENABLED, &hdev->dev_flags))
423 		settings |= MGMT_SETTING_HS;
424 
425 	return settings;
426 }
427 
428 #define PNP_INFO_SVCLASS_ID		0x1200
429 
430 static u8 bluetooth_base_uuid[] = {
431 			0xFB, 0x34, 0x9B, 0x5F, 0x80, 0x00, 0x00, 0x80,
432 			0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
433 };
434 
get_uuid16(u8 * uuid128)435 static u16 get_uuid16(u8 *uuid128)
436 {
437 	u32 val;
438 	int i;
439 
440 	for (i = 0; i < 12; i++) {
441 		if (bluetooth_base_uuid[i] != uuid128[i])
442 			return 0;
443 	}
444 
445 	memcpy(&val, &uuid128[12], 4);
446 
447 	val = le32_to_cpu(val);
448 	if (val > 0xffff)
449 		return 0;
450 
451 	return (u16) val;
452 }
453 
create_eir(struct hci_dev * hdev,u8 * data)454 static void create_eir(struct hci_dev *hdev, u8 *data)
455 {
456 	u8 *ptr = data;
457 	u16 eir_len = 0;
458 	u16 uuid16_list[HCI_MAX_EIR_LENGTH / sizeof(u16)];
459 	int i, truncated = 0;
460 	struct bt_uuid *uuid;
461 	size_t name_len;
462 
463 	name_len = strlen(hdev->dev_name);
464 
465 	if (name_len > 0) {
466 		/* EIR Data type */
467 		if (name_len > 48) {
468 			name_len = 48;
469 			ptr[1] = EIR_NAME_SHORT;
470 		} else
471 			ptr[1] = EIR_NAME_COMPLETE;
472 
473 		/* EIR Data length */
474 		ptr[0] = name_len + 1;
475 
476 		memcpy(ptr + 2, hdev->dev_name, name_len);
477 
478 		eir_len += (name_len + 2);
479 		ptr += (name_len + 2);
480 	}
481 
482 	memset(uuid16_list, 0, sizeof(uuid16_list));
483 
484 	/* Group all UUID16 types */
485 	list_for_each_entry(uuid, &hdev->uuids, list) {
486 		u16 uuid16;
487 
488 		uuid16 = get_uuid16(uuid->uuid);
489 		if (uuid16 == 0)
490 			return;
491 
492 		if (uuid16 < 0x1100)
493 			continue;
494 
495 		if (uuid16 == PNP_INFO_SVCLASS_ID)
496 			continue;
497 
498 		/* Stop if not enough space to put next UUID */
499 		if (eir_len + 2 + sizeof(u16) > HCI_MAX_EIR_LENGTH) {
500 			truncated = 1;
501 			break;
502 		}
503 
504 		/* Check for duplicates */
505 		for (i = 0; uuid16_list[i] != 0; i++)
506 			if (uuid16_list[i] == uuid16)
507 				break;
508 
509 		if (uuid16_list[i] == 0) {
510 			uuid16_list[i] = uuid16;
511 			eir_len += sizeof(u16);
512 		}
513 	}
514 
515 	if (uuid16_list[0] != 0) {
516 		u8 *length = ptr;
517 
518 		/* EIR Data type */
519 		ptr[1] = truncated ? EIR_UUID16_SOME : EIR_UUID16_ALL;
520 
521 		ptr += 2;
522 		eir_len += 2;
523 
524 		for (i = 0; uuid16_list[i] != 0; i++) {
525 			*ptr++ = (uuid16_list[i] & 0x00ff);
526 			*ptr++ = (uuid16_list[i] & 0xff00) >> 8;
527 		}
528 
529 		/* EIR Data length */
530 		*length = (i * sizeof(u16)) + 1;
531 	}
532 }
533 
update_eir(struct hci_dev * hdev)534 static int update_eir(struct hci_dev *hdev)
535 {
536 	struct hci_cp_write_eir cp;
537 
538 	if (!hdev_is_powered(hdev))
539 		return 0;
540 
541 	if (!(hdev->features[6] & LMP_EXT_INQ))
542 		return 0;
543 
544 	if (!test_bit(HCI_SSP_ENABLED, &hdev->dev_flags))
545 		return 0;
546 
547 	if (test_bit(HCI_SERVICE_CACHE, &hdev->dev_flags))
548 		return 0;
549 
550 	memset(&cp, 0, sizeof(cp));
551 
552 	create_eir(hdev, cp.data);
553 
554 	if (memcmp(cp.data, hdev->eir, sizeof(cp.data)) == 0)
555 		return 0;
556 
557 	memcpy(hdev->eir, cp.data, sizeof(cp.data));
558 
559 	return hci_send_cmd(hdev, HCI_OP_WRITE_EIR, sizeof(cp), &cp);
560 }
561 
get_service_classes(struct hci_dev * hdev)562 static u8 get_service_classes(struct hci_dev *hdev)
563 {
564 	struct bt_uuid *uuid;
565 	u8 val = 0;
566 
567 	list_for_each_entry(uuid, &hdev->uuids, list)
568 		val |= uuid->svc_hint;
569 
570 	return val;
571 }
572 
update_class(struct hci_dev * hdev)573 static int update_class(struct hci_dev *hdev)
574 {
575 	u8 cod[3];
576 	int err;
577 
578 	BT_DBG("%s", hdev->name);
579 
580 	if (!hdev_is_powered(hdev))
581 		return 0;
582 
583 	if (test_bit(HCI_SERVICE_CACHE, &hdev->dev_flags))
584 		return 0;
585 
586 	cod[0] = hdev->minor_class;
587 	cod[1] = hdev->major_class;
588 	cod[2] = get_service_classes(hdev);
589 
590 	if (memcmp(cod, hdev->dev_class, 3) == 0)
591 		return 0;
592 
593 	err = hci_send_cmd(hdev, HCI_OP_WRITE_CLASS_OF_DEV, sizeof(cod), cod);
594 	if (err == 0)
595 		set_bit(HCI_PENDING_CLASS, &hdev->dev_flags);
596 
597 	return err;
598 }
599 
service_cache_off(struct work_struct * work)600 static void service_cache_off(struct work_struct *work)
601 {
602 	struct hci_dev *hdev = container_of(work, struct hci_dev,
603 					    service_cache.work);
604 
605 	if (!test_and_clear_bit(HCI_SERVICE_CACHE, &hdev->dev_flags))
606 		return;
607 
608 	hci_dev_lock(hdev);
609 
610 	update_eir(hdev);
611 	update_class(hdev);
612 
613 	hci_dev_unlock(hdev);
614 }
615 
mgmt_init_hdev(struct sock * sk,struct hci_dev * hdev)616 static void mgmt_init_hdev(struct sock *sk, struct hci_dev *hdev)
617 {
618 	if (test_and_set_bit(HCI_MGMT, &hdev->dev_flags))
619 		return;
620 
621 	INIT_DELAYED_WORK(&hdev->service_cache, service_cache_off);
622 
623 	/* Non-mgmt controlled devices get this bit set
624 	 * implicitly so that pairing works for them, however
625 	 * for mgmt we require user-space to explicitly enable
626 	 * it
627 	 */
628 	clear_bit(HCI_PAIRABLE, &hdev->dev_flags);
629 }
630 
read_controller_info(struct sock * sk,struct hci_dev * hdev,void * data,u16 data_len)631 static int read_controller_info(struct sock *sk, struct hci_dev *hdev,
632 				void *data, u16 data_len)
633 {
634 	struct mgmt_rp_read_info rp;
635 
636 	BT_DBG("sock %p %s", sk, hdev->name);
637 
638 	hci_dev_lock(hdev);
639 
640 	memset(&rp, 0, sizeof(rp));
641 
642 	bacpy(&rp.bdaddr, &hdev->bdaddr);
643 
644 	rp.version = hdev->hci_ver;
645 
646 	put_unaligned_le16(hdev->manufacturer, &rp.manufacturer);
647 
648 	rp.supported_settings = cpu_to_le32(get_supported_settings(hdev));
649 	rp.current_settings = cpu_to_le32(get_current_settings(hdev));
650 
651 	memcpy(rp.dev_class, hdev->dev_class, 3);
652 
653 	memcpy(rp.name, hdev->dev_name, sizeof(hdev->dev_name));
654 	memcpy(rp.short_name, hdev->short_name, sizeof(hdev->short_name));
655 
656 	hci_dev_unlock(hdev);
657 
658 	return cmd_complete(sk, hdev->id, MGMT_OP_READ_INFO, 0, &rp,
659 			    sizeof(rp));
660 }
661 
mgmt_pending_free(struct pending_cmd * cmd)662 static void mgmt_pending_free(struct pending_cmd *cmd)
663 {
664 	sock_put(cmd->sk);
665 	kfree(cmd->param);
666 	kfree(cmd);
667 }
668 
mgmt_pending_add(struct sock * sk,u16 opcode,struct hci_dev * hdev,void * data,u16 len)669 static struct pending_cmd *mgmt_pending_add(struct sock *sk, u16 opcode,
670 					    struct hci_dev *hdev, void *data,
671 					    u16 len)
672 {
673 	struct pending_cmd *cmd;
674 
675 	cmd = kmalloc(sizeof(*cmd), GFP_ATOMIC);
676 	if (!cmd)
677 		return NULL;
678 
679 	cmd->opcode = opcode;
680 	cmd->index = hdev->id;
681 
682 	cmd->param = kmalloc(len, GFP_ATOMIC);
683 	if (!cmd->param) {
684 		kfree(cmd);
685 		return NULL;
686 	}
687 
688 	if (data)
689 		memcpy(cmd->param, data, len);
690 
691 	cmd->sk = sk;
692 	sock_hold(sk);
693 
694 	list_add(&cmd->list, &hdev->mgmt_pending);
695 
696 	return cmd;
697 }
698 
mgmt_pending_foreach(u16 opcode,struct hci_dev * hdev,void (* cb)(struct pending_cmd * cmd,void * data),void * data)699 static void mgmt_pending_foreach(u16 opcode, struct hci_dev *hdev,
700 				 void (*cb)(struct pending_cmd *cmd, void *data),
701 				 void *data)
702 {
703 	struct list_head *p, *n;
704 
705 	list_for_each_safe(p, n, &hdev->mgmt_pending) {
706 		struct pending_cmd *cmd;
707 
708 		cmd = list_entry(p, struct pending_cmd, list);
709 
710 		if (opcode > 0 && cmd->opcode != opcode)
711 			continue;
712 
713 		cb(cmd, data);
714 	}
715 }
716 
mgmt_pending_find(u16 opcode,struct hci_dev * hdev)717 static struct pending_cmd *mgmt_pending_find(u16 opcode, struct hci_dev *hdev)
718 {
719 	struct pending_cmd *cmd;
720 
721 	list_for_each_entry(cmd, &hdev->mgmt_pending, list) {
722 		if (cmd->opcode == opcode)
723 			return cmd;
724 	}
725 
726 	return NULL;
727 }
728 
mgmt_pending_remove(struct pending_cmd * cmd)729 static void mgmt_pending_remove(struct pending_cmd *cmd)
730 {
731 	list_del(&cmd->list);
732 	mgmt_pending_free(cmd);
733 }
734 
send_settings_rsp(struct sock * sk,u16 opcode,struct hci_dev * hdev)735 static int send_settings_rsp(struct sock *sk, u16 opcode, struct hci_dev *hdev)
736 {
737 	__le32 settings = cpu_to_le32(get_current_settings(hdev));
738 
739 	return cmd_complete(sk, hdev->id, opcode, 0, &settings,
740 			    sizeof(settings));
741 }
742 
set_powered(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)743 static int set_powered(struct sock *sk, struct hci_dev *hdev, void *data,
744 		       u16 len)
745 {
746 	struct mgmt_mode *cp = data;
747 	struct pending_cmd *cmd;
748 	int err;
749 
750 	BT_DBG("request for %s", hdev->name);
751 
752 	hci_dev_lock(hdev);
753 
754 	if (test_and_clear_bit(HCI_AUTO_OFF, &hdev->dev_flags)) {
755 		cancel_delayed_work(&hdev->power_off);
756 
757 		if (cp->val) {
758 			err = send_settings_rsp(sk, MGMT_OP_SET_POWERED, hdev);
759 			mgmt_powered(hdev, 1);
760 			goto failed;
761 		}
762 	}
763 
764 	if (!!cp->val == hdev_is_powered(hdev)) {
765 		err = send_settings_rsp(sk, MGMT_OP_SET_POWERED, hdev);
766 		goto failed;
767 	}
768 
769 	if (mgmt_pending_find(MGMT_OP_SET_POWERED, hdev)) {
770 		err = cmd_status(sk, hdev->id, MGMT_OP_SET_POWERED,
771 				 MGMT_STATUS_BUSY);
772 		goto failed;
773 	}
774 
775 	cmd = mgmt_pending_add(sk, MGMT_OP_SET_POWERED, hdev, data, len);
776 	if (!cmd) {
777 		err = -ENOMEM;
778 		goto failed;
779 	}
780 
781 	if (cp->val)
782 		schedule_work(&hdev->power_on);
783 	else
784 		schedule_work(&hdev->power_off.work);
785 
786 	err = 0;
787 
788 failed:
789 	hci_dev_unlock(hdev);
790 	return err;
791 }
792 
mgmt_event(u16 event,struct hci_dev * hdev,void * data,u16 data_len,struct sock * skip_sk)793 static int mgmt_event(u16 event, struct hci_dev *hdev, void *data, u16 data_len,
794 		      struct sock *skip_sk)
795 {
796 	struct sk_buff *skb;
797 	struct mgmt_hdr *hdr;
798 
799 	skb = alloc_skb(sizeof(*hdr) + data_len, GFP_ATOMIC);
800 	if (!skb)
801 		return -ENOMEM;
802 
803 	hdr = (void *) skb_put(skb, sizeof(*hdr));
804 	hdr->opcode = cpu_to_le16(event);
805 	if (hdev)
806 		hdr->index = cpu_to_le16(hdev->id);
807 	else
808 		hdr->index = cpu_to_le16(MGMT_INDEX_NONE);
809 	hdr->len = cpu_to_le16(data_len);
810 
811 	if (data)
812 		memcpy(skb_put(skb, data_len), data, data_len);
813 
814 	/* Time stamp */
815 	__net_timestamp(skb);
816 
817 	hci_send_to_control(skb, skip_sk);
818 	kfree_skb(skb);
819 
820 	return 0;
821 }
822 
new_settings(struct hci_dev * hdev,struct sock * skip)823 static int new_settings(struct hci_dev *hdev, struct sock *skip)
824 {
825 	__le32 ev;
826 
827 	ev = cpu_to_le32(get_current_settings(hdev));
828 
829 	return mgmt_event(MGMT_EV_NEW_SETTINGS, hdev, &ev, sizeof(ev), skip);
830 }
831 
set_discoverable(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)832 static int set_discoverable(struct sock *sk, struct hci_dev *hdev, void *data,
833 			    u16 len)
834 {
835 	struct mgmt_cp_set_discoverable *cp = data;
836 	struct pending_cmd *cmd;
837 	u16 timeout;
838 	u8 scan;
839 	int err;
840 
841 	BT_DBG("request for %s", hdev->name);
842 
843 	timeout = get_unaligned_le16(&cp->timeout);
844 	if (!cp->val && timeout > 0)
845 		return cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
846 				  MGMT_STATUS_INVALID_PARAMS);
847 
848 	hci_dev_lock(hdev);
849 
850 	if (!hdev_is_powered(hdev) && timeout > 0) {
851 		err = cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
852 				 MGMT_STATUS_NOT_POWERED);
853 		goto failed;
854 	}
855 
856 	if (mgmt_pending_find(MGMT_OP_SET_DISCOVERABLE, hdev) ||
857 			mgmt_pending_find(MGMT_OP_SET_CONNECTABLE, hdev)) {
858 		err = cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
859 				 MGMT_STATUS_BUSY);
860 		goto failed;
861 	}
862 
863 	if (!test_bit(HCI_CONNECTABLE, &hdev->dev_flags)) {
864 		err = cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
865 				 MGMT_STATUS_REJECTED);
866 		goto failed;
867 	}
868 
869 	if (!hdev_is_powered(hdev)) {
870 		bool changed = false;
871 
872 		if (!!cp->val != test_bit(HCI_DISCOVERABLE, &hdev->dev_flags)) {
873 			change_bit(HCI_DISCOVERABLE, &hdev->dev_flags);
874 			changed = true;
875 		}
876 
877 		err = send_settings_rsp(sk, MGMT_OP_SET_DISCOVERABLE, hdev);
878 		if (err < 0)
879 			goto failed;
880 
881 		if (changed)
882 			err = new_settings(hdev, sk);
883 
884 		goto failed;
885 	}
886 
887 	if (!!cp->val == test_bit(HCI_DISCOVERABLE, &hdev->dev_flags)) {
888 		if (hdev->discov_timeout > 0) {
889 			cancel_delayed_work(&hdev->discov_off);
890 			hdev->discov_timeout = 0;
891 		}
892 
893 		if (cp->val && timeout > 0) {
894 			hdev->discov_timeout = timeout;
895 			queue_delayed_work(hdev->workqueue, &hdev->discov_off,
896 				msecs_to_jiffies(hdev->discov_timeout * 1000));
897 		}
898 
899 		err = send_settings_rsp(sk, MGMT_OP_SET_DISCOVERABLE, hdev);
900 		goto failed;
901 	}
902 
903 	cmd = mgmt_pending_add(sk, MGMT_OP_SET_DISCOVERABLE, hdev, data, len);
904 	if (!cmd) {
905 		err = -ENOMEM;
906 		goto failed;
907 	}
908 
909 	scan = SCAN_PAGE;
910 
911 	if (cp->val)
912 		scan |= SCAN_INQUIRY;
913 	else
914 		cancel_delayed_work(&hdev->discov_off);
915 
916 	err = hci_send_cmd(hdev, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);
917 	if (err < 0)
918 		mgmt_pending_remove(cmd);
919 
920 	if (cp->val)
921 		hdev->discov_timeout = timeout;
922 
923 failed:
924 	hci_dev_unlock(hdev);
925 	return err;
926 }
927 
set_connectable(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)928 static int set_connectable(struct sock *sk, struct hci_dev *hdev, void *data,
929 			   u16 len)
930 {
931 	struct mgmt_mode *cp = data;
932 	struct pending_cmd *cmd;
933 	u8 scan;
934 	int err;
935 
936 	BT_DBG("request for %s", hdev->name);
937 
938 	hci_dev_lock(hdev);
939 
940 	if (!hdev_is_powered(hdev)) {
941 		bool changed = false;
942 
943 		if (!!cp->val != test_bit(HCI_CONNECTABLE, &hdev->dev_flags))
944 			changed = true;
945 
946 		if (cp->val) {
947 			set_bit(HCI_CONNECTABLE, &hdev->dev_flags);
948 		} else {
949 			clear_bit(HCI_CONNECTABLE, &hdev->dev_flags);
950 			clear_bit(HCI_DISCOVERABLE, &hdev->dev_flags);
951 		}
952 
953 		err = send_settings_rsp(sk, MGMT_OP_SET_CONNECTABLE, hdev);
954 		if (err < 0)
955 			goto failed;
956 
957 		if (changed)
958 			err = new_settings(hdev, sk);
959 
960 		goto failed;
961 	}
962 
963 	if (mgmt_pending_find(MGMT_OP_SET_DISCOVERABLE, hdev) ||
964 			mgmt_pending_find(MGMT_OP_SET_CONNECTABLE, hdev)) {
965 		err = cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE,
966 				 MGMT_STATUS_BUSY);
967 		goto failed;
968 	}
969 
970 	if (!!cp->val == test_bit(HCI_PSCAN, &hdev->flags)) {
971 		err = send_settings_rsp(sk, MGMT_OP_SET_CONNECTABLE, hdev);
972 		goto failed;
973 	}
974 
975 	cmd = mgmt_pending_add(sk, MGMT_OP_SET_CONNECTABLE, hdev, data, len);
976 	if (!cmd) {
977 		err = -ENOMEM;
978 		goto failed;
979 	}
980 
981 	if (cp->val) {
982 		scan = SCAN_PAGE;
983 	} else {
984 		scan = 0;
985 
986 		if (test_bit(HCI_ISCAN, &hdev->flags) &&
987 						hdev->discov_timeout > 0)
988 			cancel_delayed_work(&hdev->discov_off);
989 	}
990 
991 	err = hci_send_cmd(hdev, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);
992 	if (err < 0)
993 		mgmt_pending_remove(cmd);
994 
995 failed:
996 	hci_dev_unlock(hdev);
997 	return err;
998 }
999 
set_pairable(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)1000 static int set_pairable(struct sock *sk, struct hci_dev *hdev, void *data,
1001 			u16 len)
1002 {
1003 	struct mgmt_mode *cp = data;
1004 	int err;
1005 
1006 	BT_DBG("request for %s", hdev->name);
1007 
1008 	hci_dev_lock(hdev);
1009 
1010 	if (cp->val)
1011 		set_bit(HCI_PAIRABLE, &hdev->dev_flags);
1012 	else
1013 		clear_bit(HCI_PAIRABLE, &hdev->dev_flags);
1014 
1015 	err = send_settings_rsp(sk, MGMT_OP_SET_PAIRABLE, hdev);
1016 	if (err < 0)
1017 		goto failed;
1018 
1019 	err = new_settings(hdev, sk);
1020 
1021 failed:
1022 	hci_dev_unlock(hdev);
1023 	return err;
1024 }
1025 
set_link_security(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)1026 static int set_link_security(struct sock *sk, struct hci_dev *hdev, void *data,
1027 			     u16 len)
1028 {
1029 	struct mgmt_mode *cp = data;
1030 	struct pending_cmd *cmd;
1031 	u8 val;
1032 	int err;
1033 
1034 	BT_DBG("request for %s", hdev->name);
1035 
1036 	hci_dev_lock(hdev);
1037 
1038 	if (!hdev_is_powered(hdev)) {
1039 		bool changed = false;
1040 
1041 		if (!!cp->val != test_bit(HCI_LINK_SECURITY,
1042 							&hdev->dev_flags)) {
1043 			change_bit(HCI_LINK_SECURITY, &hdev->dev_flags);
1044 			changed = true;
1045 		}
1046 
1047 		err = send_settings_rsp(sk, MGMT_OP_SET_LINK_SECURITY, hdev);
1048 		if (err < 0)
1049 			goto failed;
1050 
1051 		if (changed)
1052 			err = new_settings(hdev, sk);
1053 
1054 		goto failed;
1055 	}
1056 
1057 	if (mgmt_pending_find(MGMT_OP_SET_LINK_SECURITY, hdev)) {
1058 		err = cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY,
1059 				 MGMT_STATUS_BUSY);
1060 		goto failed;
1061 	}
1062 
1063 	val = !!cp->val;
1064 
1065 	if (test_bit(HCI_AUTH, &hdev->flags) == val) {
1066 		err = send_settings_rsp(sk, MGMT_OP_SET_LINK_SECURITY, hdev);
1067 		goto failed;
1068 	}
1069 
1070 	cmd = mgmt_pending_add(sk, MGMT_OP_SET_LINK_SECURITY, hdev, data, len);
1071 	if (!cmd) {
1072 		err = -ENOMEM;
1073 		goto failed;
1074 	}
1075 
1076 	err = hci_send_cmd(hdev, HCI_OP_WRITE_AUTH_ENABLE, sizeof(val), &val);
1077 	if (err < 0) {
1078 		mgmt_pending_remove(cmd);
1079 		goto failed;
1080 	}
1081 
1082 failed:
1083 	hci_dev_unlock(hdev);
1084 	return err;
1085 }
1086 
set_ssp(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)1087 static int set_ssp(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
1088 {
1089 	struct mgmt_mode *cp = data;
1090 	struct pending_cmd *cmd;
1091 	u8 val;
1092 	int err;
1093 
1094 	BT_DBG("request for %s", hdev->name);
1095 
1096 	hci_dev_lock(hdev);
1097 
1098 	if (!(hdev->features[6] & LMP_SIMPLE_PAIR)) {
1099 		err = cmd_status(sk, hdev->id, MGMT_OP_SET_SSP,
1100 				 MGMT_STATUS_NOT_SUPPORTED);
1101 		goto failed;
1102 	}
1103 
1104 	val = !!cp->val;
1105 
1106 	if (!hdev_is_powered(hdev)) {
1107 		bool changed = false;
1108 
1109 		if (val != test_bit(HCI_SSP_ENABLED, &hdev->dev_flags)) {
1110 			change_bit(HCI_SSP_ENABLED, &hdev->dev_flags);
1111 			changed = true;
1112 		}
1113 
1114 		err = send_settings_rsp(sk, MGMT_OP_SET_SSP, hdev);
1115 		if (err < 0)
1116 			goto failed;
1117 
1118 		if (changed)
1119 			err = new_settings(hdev, sk);
1120 
1121 		goto failed;
1122 	}
1123 
1124 	if (mgmt_pending_find(MGMT_OP_SET_SSP, hdev)) {
1125 	     err = cmd_status(sk, hdev->id, MGMT_OP_SET_SSP,
1126 			      MGMT_STATUS_BUSY);
1127 		goto failed;
1128 	}
1129 
1130 	if (test_bit(HCI_SSP_ENABLED, &hdev->dev_flags) == val) {
1131 		err = send_settings_rsp(sk, MGMT_OP_SET_SSP, hdev);
1132 		goto failed;
1133 	}
1134 
1135 	cmd = mgmt_pending_add(sk, MGMT_OP_SET_SSP, hdev, data, len);
1136 	if (!cmd) {
1137 		err = -ENOMEM;
1138 		goto failed;
1139 	}
1140 
1141 	err = hci_send_cmd(hdev, HCI_OP_WRITE_SSP_MODE, sizeof(val), &val);
1142 	if (err < 0) {
1143 		mgmt_pending_remove(cmd);
1144 		goto failed;
1145 	}
1146 
1147 failed:
1148 	hci_dev_unlock(hdev);
1149 	return err;
1150 }
1151 
set_hs(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)1152 static int set_hs(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
1153 {
1154 	struct mgmt_mode *cp = data;
1155 
1156 	BT_DBG("request for %s", hdev->name);
1157 
1158 	if (!enable_hs)
1159 		return cmd_status(sk, hdev->id, MGMT_OP_SET_HS,
1160 				  MGMT_STATUS_NOT_SUPPORTED);
1161 
1162 	if (cp->val)
1163 		set_bit(HCI_HS_ENABLED, &hdev->dev_flags);
1164 	else
1165 		clear_bit(HCI_HS_ENABLED, &hdev->dev_flags);
1166 
1167 	return send_settings_rsp(sk, MGMT_OP_SET_HS, hdev);
1168 }
1169 
set_le(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)1170 static int set_le(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
1171 {
1172 	struct mgmt_mode *cp = data;
1173 	struct hci_cp_write_le_host_supported hci_cp;
1174 	struct pending_cmd *cmd;
1175 	int err;
1176 	u8 val, enabled;
1177 
1178 	BT_DBG("request for %s", hdev->name);
1179 
1180 	hci_dev_lock(hdev);
1181 
1182 	if (!enable_le || !(hdev->features[4] & LMP_LE)) {
1183 		err = cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
1184 				 MGMT_STATUS_NOT_SUPPORTED);
1185 		goto unlock;
1186 	}
1187 
1188 	val = !!cp->val;
1189 	enabled = !!(hdev->host_features[0] & LMP_HOST_LE);
1190 
1191 	if (!hdev_is_powered(hdev) || val == enabled) {
1192 		bool changed = false;
1193 
1194 		if (val != test_bit(HCI_LE_ENABLED, &hdev->dev_flags)) {
1195 			change_bit(HCI_LE_ENABLED, &hdev->dev_flags);
1196 			changed = true;
1197 		}
1198 
1199 		err = send_settings_rsp(sk, MGMT_OP_SET_LE, hdev);
1200 		if (err < 0)
1201 			goto unlock;
1202 
1203 		if (changed)
1204 			err = new_settings(hdev, sk);
1205 
1206 		goto unlock;
1207 	}
1208 
1209 	if (mgmt_pending_find(MGMT_OP_SET_LE, hdev)) {
1210 		err = cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
1211 				 MGMT_STATUS_BUSY);
1212 		goto unlock;
1213 	}
1214 
1215 	cmd = mgmt_pending_add(sk, MGMT_OP_SET_LE, hdev, data, len);
1216 	if (!cmd) {
1217 		err = -ENOMEM;
1218 		goto unlock;
1219 	}
1220 
1221 	memset(&hci_cp, 0, sizeof(hci_cp));
1222 
1223 	if (val) {
1224 		hci_cp.le = val;
1225 		hci_cp.simul = !!(hdev->features[6] & LMP_SIMUL_LE_BR);
1226 	}
1227 
1228 	err = hci_send_cmd(hdev, HCI_OP_WRITE_LE_HOST_SUPPORTED, sizeof(hci_cp),
1229 			   &hci_cp);
1230 	if (err < 0) {
1231 		mgmt_pending_remove(cmd);
1232 		goto unlock;
1233 	}
1234 
1235 unlock:
1236 	hci_dev_unlock(hdev);
1237 	return err;
1238 }
1239 
add_uuid(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)1240 static int add_uuid(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
1241 {
1242 	struct mgmt_cp_add_uuid *cp = data;
1243 	struct pending_cmd *cmd;
1244 	struct bt_uuid *uuid;
1245 	int err;
1246 
1247 	BT_DBG("request for %s", hdev->name);
1248 
1249 	hci_dev_lock(hdev);
1250 
1251 	if (test_bit(HCI_PENDING_CLASS, &hdev->dev_flags)) {
1252 		err = cmd_status(sk, hdev->id, MGMT_OP_ADD_UUID,
1253 				 MGMT_STATUS_BUSY);
1254 		goto failed;
1255 	}
1256 
1257 	uuid = kmalloc(sizeof(*uuid), GFP_ATOMIC);
1258 	if (!uuid) {
1259 		err = -ENOMEM;
1260 		goto failed;
1261 	}
1262 
1263 	memcpy(uuid->uuid, cp->uuid, 16);
1264 	uuid->svc_hint = cp->svc_hint;
1265 
1266 	list_add(&uuid->list, &hdev->uuids);
1267 
1268 	err = update_class(hdev);
1269 	if (err < 0)
1270 		goto failed;
1271 
1272 	err = update_eir(hdev);
1273 	if (err < 0)
1274 		goto failed;
1275 
1276 	if (!test_bit(HCI_PENDING_CLASS, &hdev->dev_flags)) {
1277 		err = cmd_complete(sk, hdev->id, MGMT_OP_ADD_UUID, 0,
1278 				   hdev->dev_class, 3);
1279 		goto failed;
1280 	}
1281 
1282 	cmd = mgmt_pending_add(sk, MGMT_OP_ADD_UUID, hdev, data, len);
1283 	if (!cmd) {
1284 		err = -ENOMEM;
1285 		goto failed;
1286 	}
1287 
1288 failed:
1289 	hci_dev_unlock(hdev);
1290 	return err;
1291 }
1292 
enable_service_cache(struct hci_dev * hdev)1293 static bool enable_service_cache(struct hci_dev *hdev)
1294 {
1295 	if (!hdev_is_powered(hdev))
1296 		return false;
1297 
1298 	if (!test_and_set_bit(HCI_SERVICE_CACHE, &hdev->dev_flags)) {
1299 		schedule_delayed_work(&hdev->service_cache, CACHE_TIMEOUT);
1300 		return true;
1301 	}
1302 
1303 	return false;
1304 }
1305 
remove_uuid(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)1306 static int remove_uuid(struct sock *sk, struct hci_dev *hdev, void *data,
1307 								u16 len)
1308 {
1309 	struct mgmt_cp_remove_uuid *cp = data;
1310 	struct pending_cmd *cmd;
1311 	struct list_head *p, *n;
1312 	u8 bt_uuid_any[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
1313 	int err, found;
1314 
1315 	BT_DBG("request for %s", hdev->name);
1316 
1317 	hci_dev_lock(hdev);
1318 
1319 	if (test_bit(HCI_PENDING_CLASS, &hdev->dev_flags)) {
1320 		err = cmd_status(sk, hdev->id, MGMT_OP_REMOVE_UUID,
1321 				 MGMT_STATUS_BUSY);
1322 		goto unlock;
1323 	}
1324 
1325 	if (memcmp(cp->uuid, bt_uuid_any, 16) == 0) {
1326 		err = hci_uuids_clear(hdev);
1327 
1328 		if (enable_service_cache(hdev)) {
1329 			err = cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_UUID,
1330 					   0, hdev->dev_class, 3);
1331 			goto unlock;
1332 		}
1333 
1334 		goto update_class;
1335 	}
1336 
1337 	found = 0;
1338 
1339 	list_for_each_safe(p, n, &hdev->uuids) {
1340 		struct bt_uuid *match = list_entry(p, struct bt_uuid, list);
1341 
1342 		if (memcmp(match->uuid, cp->uuid, 16) != 0)
1343 			continue;
1344 
1345 		list_del(&match->list);
1346 		found++;
1347 	}
1348 
1349 	if (found == 0) {
1350 		err = cmd_status(sk, hdev->id, MGMT_OP_REMOVE_UUID,
1351 				 MGMT_STATUS_INVALID_PARAMS);
1352 		goto unlock;
1353 	}
1354 
1355 update_class:
1356 	err = update_class(hdev);
1357 	if (err < 0)
1358 		goto unlock;
1359 
1360 	err = update_eir(hdev);
1361 	if (err < 0)
1362 		goto unlock;
1363 
1364 	if (!test_bit(HCI_PENDING_CLASS, &hdev->dev_flags)) {
1365 		err = cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_UUID, 0,
1366 				   hdev->dev_class, 3);
1367 		goto unlock;
1368 	}
1369 
1370 	cmd = mgmt_pending_add(sk, MGMT_OP_REMOVE_UUID, hdev, data, len);
1371 	if (!cmd) {
1372 		err = -ENOMEM;
1373 		goto unlock;
1374 	}
1375 
1376 unlock:
1377 	hci_dev_unlock(hdev);
1378 	return err;
1379 }
1380 
set_dev_class(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)1381 static int set_dev_class(struct sock *sk, struct hci_dev *hdev, void *data,
1382 			 u16 len)
1383 {
1384 	struct mgmt_cp_set_dev_class *cp = data;
1385 	struct pending_cmd *cmd;
1386 	int err;
1387 
1388 	BT_DBG("request for %s", hdev->name);
1389 
1390 	hci_dev_lock(hdev);
1391 
1392 	if (test_bit(HCI_PENDING_CLASS, &hdev->dev_flags)) {
1393 		err = cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS,
1394 				 MGMT_STATUS_BUSY);
1395 		goto unlock;
1396 	}
1397 
1398 	hdev->major_class = cp->major;
1399 	hdev->minor_class = cp->minor;
1400 
1401 	if (!hdev_is_powered(hdev)) {
1402 		err = cmd_complete(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, 0,
1403 				   hdev->dev_class, 3);
1404 		goto unlock;
1405 	}
1406 
1407 	if (test_and_clear_bit(HCI_SERVICE_CACHE, &hdev->dev_flags)) {
1408 		hci_dev_unlock(hdev);
1409 		cancel_delayed_work_sync(&hdev->service_cache);
1410 		hci_dev_lock(hdev);
1411 		update_eir(hdev);
1412 	}
1413 
1414 	err = update_class(hdev);
1415 	if (err < 0)
1416 		goto unlock;
1417 
1418 	if (!test_bit(HCI_PENDING_CLASS, &hdev->dev_flags)) {
1419 		err = cmd_complete(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, 0,
1420 				   hdev->dev_class, 3);
1421 		goto unlock;
1422 	}
1423 
1424 	cmd = mgmt_pending_add(sk, MGMT_OP_SET_DEV_CLASS, hdev, data, len);
1425 	if (!cmd) {
1426 		err = -ENOMEM;
1427 		goto unlock;
1428 	}
1429 
1430 unlock:
1431 	hci_dev_unlock(hdev);
1432 	return err;
1433 }
1434 
load_link_keys(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)1435 static int load_link_keys(struct sock *sk, struct hci_dev *hdev, void *data,
1436 								u16 len)
1437 {
1438 	struct mgmt_cp_load_link_keys *cp = data;
1439 	u16 key_count, expected_len;
1440 	int i;
1441 
1442 	key_count = get_unaligned_le16(&cp->key_count);
1443 
1444 	expected_len = sizeof(*cp) + key_count *
1445 					sizeof(struct mgmt_link_key_info);
1446 	if (expected_len != len) {
1447 		BT_ERR("load_link_keys: expected %u bytes, got %u bytes",
1448 							len, expected_len);
1449 		return cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS,
1450 				  MGMT_STATUS_INVALID_PARAMS);
1451 	}
1452 
1453 	BT_DBG("%s debug_keys %u key_count %u", hdev->name, cp->debug_keys,
1454 								key_count);
1455 
1456 	hci_dev_lock(hdev);
1457 
1458 	hci_link_keys_clear(hdev);
1459 
1460 	set_bit(HCI_LINK_KEYS, &hdev->dev_flags);
1461 
1462 	if (cp->debug_keys)
1463 		set_bit(HCI_DEBUG_KEYS, &hdev->dev_flags);
1464 	else
1465 		clear_bit(HCI_DEBUG_KEYS, &hdev->dev_flags);
1466 
1467 	for (i = 0; i < key_count; i++) {
1468 		struct mgmt_link_key_info *key = &cp->keys[i];
1469 
1470 		hci_add_link_key(hdev, NULL, 0, &key->addr.bdaddr, key->val,
1471 				 key->type, key->pin_len);
1472 	}
1473 
1474 	cmd_complete(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS, 0, NULL, 0);
1475 
1476 	hci_dev_unlock(hdev);
1477 
1478 	return 0;
1479 }
1480 
device_unpaired(struct hci_dev * hdev,bdaddr_t * bdaddr,u8 addr_type,struct sock * skip_sk)1481 static int device_unpaired(struct hci_dev *hdev, bdaddr_t *bdaddr,
1482 			   u8 addr_type, struct sock *skip_sk)
1483 {
1484 	struct mgmt_ev_device_unpaired ev;
1485 
1486 	bacpy(&ev.addr.bdaddr, bdaddr);
1487 	ev.addr.type = addr_type;
1488 
1489 	return mgmt_event(MGMT_EV_DEVICE_UNPAIRED, hdev, &ev, sizeof(ev),
1490 			  skip_sk);
1491 }
1492 
unpair_device(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)1493 static int unpair_device(struct sock *sk, struct hci_dev *hdev, void *data,
1494 			 u16 len)
1495 {
1496 	struct mgmt_cp_unpair_device *cp = data;
1497 	struct mgmt_rp_unpair_device rp;
1498 	struct hci_cp_disconnect dc;
1499 	struct pending_cmd *cmd;
1500 	struct hci_conn *conn;
1501 	int err;
1502 
1503 	hci_dev_lock(hdev);
1504 
1505 	memset(&rp, 0, sizeof(rp));
1506 	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
1507 	rp.addr.type = cp->addr.type;
1508 
1509 	if (!hdev_is_powered(hdev)) {
1510 		err = cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
1511 				   MGMT_STATUS_NOT_POWERED, &rp, sizeof(rp));
1512 		goto unlock;
1513 	}
1514 
1515 	if (cp->addr.type == MGMT_ADDR_BREDR)
1516 		err = hci_remove_link_key(hdev, &cp->addr.bdaddr);
1517 	else
1518 		err = hci_remove_ltk(hdev, &cp->addr.bdaddr);
1519 
1520 	if (err < 0) {
1521 		err = cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
1522 				   MGMT_STATUS_NOT_PAIRED, &rp, sizeof(rp));
1523 		goto unlock;
1524 	}
1525 
1526 	if (cp->disconnect) {
1527 		if (cp->addr.type == MGMT_ADDR_BREDR)
1528 			conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK,
1529 							&cp->addr.bdaddr);
1530 		else
1531 			conn = hci_conn_hash_lookup_ba(hdev, LE_LINK,
1532 							&cp->addr.bdaddr);
1533 	} else {
1534 		conn = NULL;
1535 	}
1536 
1537 	if (!conn) {
1538 		err = cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE, 0,
1539 				   &rp, sizeof(rp));
1540 		device_unpaired(hdev, &cp->addr.bdaddr, cp->addr.type, sk);
1541 		goto unlock;
1542 	}
1543 
1544 	cmd = mgmt_pending_add(sk, MGMT_OP_UNPAIR_DEVICE, hdev, cp,
1545 			       sizeof(*cp));
1546 	if (!cmd) {
1547 		err = -ENOMEM;
1548 		goto unlock;
1549 	}
1550 
1551 	put_unaligned_le16(conn->handle, &dc.handle);
1552 	dc.reason = 0x13; /* Remote User Terminated Connection */
1553 	err = hci_send_cmd(hdev, HCI_OP_DISCONNECT, sizeof(dc), &dc);
1554 	if (err < 0)
1555 		mgmt_pending_remove(cmd);
1556 
1557 unlock:
1558 	hci_dev_unlock(hdev);
1559 	return err;
1560 }
1561 
disconnect(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)1562 static int disconnect(struct sock *sk, struct hci_dev *hdev, void *data,
1563 		      u16 len)
1564 {
1565 	struct mgmt_cp_disconnect *cp = data;
1566 	struct hci_cp_disconnect dc;
1567 	struct pending_cmd *cmd;
1568 	struct hci_conn *conn;
1569 	int err;
1570 
1571 	BT_DBG("");
1572 
1573 	hci_dev_lock(hdev);
1574 
1575 	if (!test_bit(HCI_UP, &hdev->flags)) {
1576 		err = cmd_status(sk, hdev->id, MGMT_OP_DISCONNECT,
1577 				 MGMT_STATUS_NOT_POWERED);
1578 		goto failed;
1579 	}
1580 
1581 	if (mgmt_pending_find(MGMT_OP_DISCONNECT, hdev)) {
1582 		err = cmd_status(sk, hdev->id, MGMT_OP_DISCONNECT,
1583 				 MGMT_STATUS_BUSY);
1584 		goto failed;
1585 	}
1586 
1587 	if (cp->addr.type == MGMT_ADDR_BREDR)
1588 		conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->addr.bdaddr);
1589 	else
1590 		conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &cp->addr.bdaddr);
1591 
1592 	if (!conn) {
1593 		err = cmd_status(sk, hdev->id, MGMT_OP_DISCONNECT,
1594 				 MGMT_STATUS_NOT_CONNECTED);
1595 		goto failed;
1596 	}
1597 
1598 	cmd = mgmt_pending_add(sk, MGMT_OP_DISCONNECT, hdev, data, len);
1599 	if (!cmd) {
1600 		err = -ENOMEM;
1601 		goto failed;
1602 	}
1603 
1604 	put_unaligned_le16(conn->handle, &dc.handle);
1605 	dc.reason = 0x13; /* Remote User Terminated Connection */
1606 
1607 	err = hci_send_cmd(hdev, HCI_OP_DISCONNECT, sizeof(dc), &dc);
1608 	if (err < 0)
1609 		mgmt_pending_remove(cmd);
1610 
1611 failed:
1612 	hci_dev_unlock(hdev);
1613 	return err;
1614 }
1615 
link_to_mgmt(u8 link_type,u8 addr_type)1616 static u8 link_to_mgmt(u8 link_type, u8 addr_type)
1617 {
1618 	switch (link_type) {
1619 	case LE_LINK:
1620 		switch (addr_type) {
1621 		case ADDR_LE_DEV_PUBLIC:
1622 			return MGMT_ADDR_LE_PUBLIC;
1623 		case ADDR_LE_DEV_RANDOM:
1624 			return MGMT_ADDR_LE_RANDOM;
1625 		default:
1626 			return MGMT_ADDR_INVALID;
1627 		}
1628 	case ACL_LINK:
1629 		return MGMT_ADDR_BREDR;
1630 	default:
1631 		return MGMT_ADDR_INVALID;
1632 	}
1633 }
1634 
get_connections(struct sock * sk,struct hci_dev * hdev,void * data,u16 data_len)1635 static int get_connections(struct sock *sk, struct hci_dev *hdev, void *data,
1636 			   u16 data_len)
1637 {
1638 	struct mgmt_rp_get_connections *rp;
1639 	struct hci_conn *c;
1640 	size_t rp_len;
1641 	int err;
1642 	u16 i;
1643 
1644 	BT_DBG("");
1645 
1646 	hci_dev_lock(hdev);
1647 
1648 	if (!hdev_is_powered(hdev)) {
1649 		err = cmd_status(sk, hdev->id, MGMT_OP_GET_CONNECTIONS,
1650 				 MGMT_STATUS_NOT_POWERED);
1651 		goto unlock;
1652 	}
1653 
1654 	i = 0;
1655 	list_for_each_entry(c, &hdev->conn_hash.list, list) {
1656 		if (test_bit(HCI_CONN_MGMT_CONNECTED, &c->flags))
1657 			i++;
1658 	}
1659 
1660 	rp_len = sizeof(*rp) + (i * sizeof(struct mgmt_addr_info));
1661 	rp = kmalloc(rp_len, GFP_ATOMIC);
1662 	if (!rp) {
1663 		err = -ENOMEM;
1664 		goto unlock;
1665 	}
1666 
1667 	i = 0;
1668 	list_for_each_entry(c, &hdev->conn_hash.list, list) {
1669 		if (!test_bit(HCI_CONN_MGMT_CONNECTED, &c->flags))
1670 			continue;
1671 		bacpy(&rp->addr[i].bdaddr, &c->dst);
1672 		rp->addr[i].type = link_to_mgmt(c->type, c->dst_type);
1673 		if (rp->addr[i].type == MGMT_ADDR_INVALID)
1674 			continue;
1675 		i++;
1676 	}
1677 
1678 	put_unaligned_le16(i, &rp->conn_count);
1679 
1680 	/* Recalculate length in case of filtered SCO connections, etc */
1681 	rp_len = sizeof(*rp) + (i * sizeof(struct mgmt_addr_info));
1682 
1683 	err = cmd_complete(sk, hdev->id, MGMT_OP_GET_CONNECTIONS, 0, rp,
1684 			   rp_len);
1685 
1686 	kfree(rp);
1687 
1688 unlock:
1689 	hci_dev_unlock(hdev);
1690 	return err;
1691 }
1692 
send_pin_code_neg_reply(struct sock * sk,struct hci_dev * hdev,struct mgmt_cp_pin_code_neg_reply * cp)1693 static int send_pin_code_neg_reply(struct sock *sk, struct hci_dev *hdev,
1694 				   struct mgmt_cp_pin_code_neg_reply *cp)
1695 {
1696 	struct pending_cmd *cmd;
1697 	int err;
1698 
1699 	cmd = mgmt_pending_add(sk, MGMT_OP_PIN_CODE_NEG_REPLY, hdev, cp,
1700 			       sizeof(*cp));
1701 	if (!cmd)
1702 		return -ENOMEM;
1703 
1704 	err = hci_send_cmd(hdev, HCI_OP_PIN_CODE_NEG_REPLY,
1705 			   sizeof(cp->addr.bdaddr), &cp->addr.bdaddr);
1706 	if (err < 0)
1707 		mgmt_pending_remove(cmd);
1708 
1709 	return err;
1710 }
1711 
pin_code_reply(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)1712 static int pin_code_reply(struct sock *sk, struct hci_dev *hdev, void *data,
1713 			  u16 len)
1714 {
1715 	struct hci_conn *conn;
1716 	struct mgmt_cp_pin_code_reply *cp = data;
1717 	struct hci_cp_pin_code_reply reply;
1718 	struct pending_cmd *cmd;
1719 	int err;
1720 
1721 	BT_DBG("");
1722 
1723 	hci_dev_lock(hdev);
1724 
1725 	if (!hdev_is_powered(hdev)) {
1726 		err = cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
1727 				 MGMT_STATUS_NOT_POWERED);
1728 		goto failed;
1729 	}
1730 
1731 	conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->addr.bdaddr);
1732 	if (!conn) {
1733 		err = cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
1734 				 MGMT_STATUS_NOT_CONNECTED);
1735 		goto failed;
1736 	}
1737 
1738 	if (conn->pending_sec_level == BT_SECURITY_HIGH && cp->pin_len != 16) {
1739 		struct mgmt_cp_pin_code_neg_reply ncp;
1740 
1741 		memcpy(&ncp.addr, &cp->addr, sizeof(ncp.addr));
1742 
1743 		BT_ERR("PIN code is not 16 bytes long");
1744 
1745 		err = send_pin_code_neg_reply(sk, hdev, &ncp);
1746 		if (err >= 0)
1747 			err = cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
1748 					 MGMT_STATUS_INVALID_PARAMS);
1749 
1750 		goto failed;
1751 	}
1752 
1753 	cmd = mgmt_pending_add(sk, MGMT_OP_PIN_CODE_REPLY, hdev, data, len);
1754 	if (!cmd) {
1755 		err = -ENOMEM;
1756 		goto failed;
1757 	}
1758 
1759 	bacpy(&reply.bdaddr, &cp->addr.bdaddr);
1760 	reply.pin_len = cp->pin_len;
1761 	memcpy(reply.pin_code, cp->pin_code, sizeof(reply.pin_code));
1762 
1763 	err = hci_send_cmd(hdev, HCI_OP_PIN_CODE_REPLY, sizeof(reply), &reply);
1764 	if (err < 0)
1765 		mgmt_pending_remove(cmd);
1766 
1767 failed:
1768 	hci_dev_unlock(hdev);
1769 	return err;
1770 }
1771 
pin_code_neg_reply(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)1772 static int pin_code_neg_reply(struct sock *sk, struct hci_dev *hdev,
1773 			      void *data, u16 len)
1774 {
1775 	struct mgmt_cp_pin_code_neg_reply *cp = data;
1776 	int err;
1777 
1778 	BT_DBG("");
1779 
1780 	hci_dev_lock(hdev);
1781 
1782 	if (!hdev_is_powered(hdev)) {
1783 		err = cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_NEG_REPLY,
1784 				 MGMT_STATUS_NOT_POWERED);
1785 		goto failed;
1786 	}
1787 
1788 	err = send_pin_code_neg_reply(sk, hdev, cp);
1789 
1790 failed:
1791 	hci_dev_unlock(hdev);
1792 	return err;
1793 }
1794 
set_io_capability(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)1795 static int set_io_capability(struct sock *sk, struct hci_dev *hdev, void *data,
1796 			     u16 len)
1797 {
1798 	struct mgmt_cp_set_io_capability *cp = data;
1799 
1800 	BT_DBG("");
1801 
1802 	hci_dev_lock(hdev);
1803 
1804 	hdev->io_capability = cp->io_capability;
1805 
1806 	BT_DBG("%s IO capability set to 0x%02x", hdev->name,
1807 							hdev->io_capability);
1808 
1809 	hci_dev_unlock(hdev);
1810 
1811 	return cmd_complete(sk, hdev->id, MGMT_OP_SET_IO_CAPABILITY, 0, NULL,
1812 			    0);
1813 }
1814 
find_pairing(struct hci_conn * conn)1815 static inline struct pending_cmd *find_pairing(struct hci_conn *conn)
1816 {
1817 	struct hci_dev *hdev = conn->hdev;
1818 	struct pending_cmd *cmd;
1819 
1820 	list_for_each_entry(cmd, &hdev->mgmt_pending, list) {
1821 		if (cmd->opcode != MGMT_OP_PAIR_DEVICE)
1822 			continue;
1823 
1824 		if (cmd->user_data != conn)
1825 			continue;
1826 
1827 		return cmd;
1828 	}
1829 
1830 	return NULL;
1831 }
1832 
pairing_complete(struct pending_cmd * cmd,u8 status)1833 static void pairing_complete(struct pending_cmd *cmd, u8 status)
1834 {
1835 	struct mgmt_rp_pair_device rp;
1836 	struct hci_conn *conn = cmd->user_data;
1837 
1838 	bacpy(&rp.addr.bdaddr, &conn->dst);
1839 	rp.addr.type = link_to_mgmt(conn->type, conn->dst_type);
1840 
1841 	cmd_complete(cmd->sk, cmd->index, MGMT_OP_PAIR_DEVICE, status,
1842 		     &rp, sizeof(rp));
1843 
1844 	/* So we don't get further callbacks for this connection */
1845 	conn->connect_cfm_cb = NULL;
1846 	conn->security_cfm_cb = NULL;
1847 	conn->disconn_cfm_cb = NULL;
1848 
1849 	hci_conn_put(conn);
1850 
1851 	mgmt_pending_remove(cmd);
1852 }
1853 
pairing_complete_cb(struct hci_conn * conn,u8 status)1854 static void pairing_complete_cb(struct hci_conn *conn, u8 status)
1855 {
1856 	struct pending_cmd *cmd;
1857 
1858 	BT_DBG("status %u", status);
1859 
1860 	cmd = find_pairing(conn);
1861 	if (!cmd)
1862 		BT_DBG("Unable to find a pending command");
1863 	else
1864 		pairing_complete(cmd, mgmt_status(status));
1865 }
1866 
pair_device(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)1867 static int pair_device(struct sock *sk, struct hci_dev *hdev, void *data,
1868 		       u16 len)
1869 {
1870 	struct mgmt_cp_pair_device *cp = data;
1871 	struct mgmt_rp_pair_device rp;
1872 	struct pending_cmd *cmd;
1873 	u8 sec_level, auth_type;
1874 	struct hci_conn *conn;
1875 	int err;
1876 
1877 	BT_DBG("");
1878 
1879 	hci_dev_lock(hdev);
1880 
1881 	if (!hdev_is_powered(hdev)) {
1882 		err = cmd_status(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
1883 				 MGMT_STATUS_NOT_POWERED);
1884 		goto unlock;
1885 	}
1886 
1887 	sec_level = BT_SECURITY_MEDIUM;
1888 	if (cp->io_cap == 0x03)
1889 		auth_type = HCI_AT_DEDICATED_BONDING;
1890 	else
1891 		auth_type = HCI_AT_DEDICATED_BONDING_MITM;
1892 
1893 	if (cp->addr.type == MGMT_ADDR_BREDR)
1894 		conn = hci_connect(hdev, ACL_LINK, &cp->addr.bdaddr, sec_level,
1895 				   auth_type);
1896 	else
1897 		conn = hci_connect(hdev, LE_LINK, &cp->addr.bdaddr, sec_level,
1898 				   auth_type);
1899 
1900 	memset(&rp, 0, sizeof(rp));
1901 	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
1902 	rp.addr.type = cp->addr.type;
1903 
1904 	if (IS_ERR(conn)) {
1905 		err = cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
1906 				   MGMT_STATUS_CONNECT_FAILED, &rp,
1907 				   sizeof(rp));
1908 		goto unlock;
1909 	}
1910 
1911 	if (conn->connect_cfm_cb) {
1912 		hci_conn_put(conn);
1913 		err = cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
1914 				   MGMT_STATUS_BUSY, &rp, sizeof(rp));
1915 		goto unlock;
1916 	}
1917 
1918 	cmd = mgmt_pending_add(sk, MGMT_OP_PAIR_DEVICE, hdev, data, len);
1919 	if (!cmd) {
1920 		err = -ENOMEM;
1921 		hci_conn_put(conn);
1922 		goto unlock;
1923 	}
1924 
1925 	/* For LE, just connecting isn't a proof that the pairing finished */
1926 	if (cp->addr.type == MGMT_ADDR_BREDR)
1927 		conn->connect_cfm_cb = pairing_complete_cb;
1928 
1929 	conn->security_cfm_cb = pairing_complete_cb;
1930 	conn->disconn_cfm_cb = pairing_complete_cb;
1931 	conn->io_capability = cp->io_cap;
1932 	cmd->user_data = conn;
1933 
1934 	if (conn->state == BT_CONNECTED &&
1935 				hci_conn_security(conn, sec_level, auth_type))
1936 		pairing_complete(cmd, 0);
1937 
1938 	err = 0;
1939 
1940 unlock:
1941 	hci_dev_unlock(hdev);
1942 	return err;
1943 }
1944 
cancel_pair_device(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)1945 static int cancel_pair_device(struct sock *sk, struct hci_dev *hdev, void *data,
1946 			      u16 len)
1947 {
1948 	struct mgmt_addr_info *addr = data;
1949 	struct pending_cmd *cmd;
1950 	struct hci_conn *conn;
1951 	int err;
1952 
1953 	BT_DBG("");
1954 
1955 	hci_dev_lock(hdev);
1956 
1957 	if (!hdev_is_powered(hdev)) {
1958 		err = cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE,
1959 				 MGMT_STATUS_NOT_POWERED);
1960 		goto unlock;
1961 	}
1962 
1963 	cmd = mgmt_pending_find(MGMT_OP_PAIR_DEVICE, hdev);
1964 	if (!cmd) {
1965 		err = cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE,
1966 				 MGMT_STATUS_INVALID_PARAMS);
1967 		goto unlock;
1968 	}
1969 
1970 	conn = cmd->user_data;
1971 
1972 	if (bacmp(&addr->bdaddr, &conn->dst) != 0) {
1973 		err = cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE,
1974 				 MGMT_STATUS_INVALID_PARAMS);
1975 		goto unlock;
1976 	}
1977 
1978 	pairing_complete(cmd, MGMT_STATUS_CANCELLED);
1979 
1980 	err = cmd_complete(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE, 0,
1981 			   addr, sizeof(*addr));
1982 unlock:
1983 	hci_dev_unlock(hdev);
1984 	return err;
1985 }
1986 
user_pairing_resp(struct sock * sk,struct hci_dev * hdev,bdaddr_t * bdaddr,u8 type,u16 mgmt_op,u16 hci_op,__le32 passkey)1987 static int user_pairing_resp(struct sock *sk, struct hci_dev *hdev,
1988 			     bdaddr_t *bdaddr, u8 type, u16 mgmt_op,
1989 			     u16 hci_op, __le32 passkey)
1990 {
1991 	struct pending_cmd *cmd;
1992 	struct hci_conn *conn;
1993 	int err;
1994 
1995 	hci_dev_lock(hdev);
1996 
1997 	if (!hdev_is_powered(hdev)) {
1998 		err = cmd_status(sk, hdev->id, mgmt_op,
1999 				 MGMT_STATUS_NOT_POWERED);
2000 		goto done;
2001 	}
2002 
2003 	if (type == MGMT_ADDR_BREDR)
2004 		conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, bdaddr);
2005 	else
2006 		conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, bdaddr);
2007 
2008 	if (!conn) {
2009 		err = cmd_status(sk, hdev->id, mgmt_op,
2010 				 MGMT_STATUS_NOT_CONNECTED);
2011 		goto done;
2012 	}
2013 
2014 	if (type == MGMT_ADDR_LE_PUBLIC || type == MGMT_ADDR_LE_RANDOM) {
2015 		/* Continue with pairing via SMP */
2016 		err = smp_user_confirm_reply(conn, mgmt_op, passkey);
2017 
2018 		if (!err)
2019 			err = cmd_status(sk, hdev->id, mgmt_op,
2020 					 MGMT_STATUS_SUCCESS);
2021 		else
2022 			err = cmd_status(sk, hdev->id, mgmt_op,
2023 					 MGMT_STATUS_FAILED);
2024 
2025 		goto done;
2026 	}
2027 
2028 	cmd = mgmt_pending_add(sk, mgmt_op, hdev, bdaddr, sizeof(*bdaddr));
2029 	if (!cmd) {
2030 		err = -ENOMEM;
2031 		goto done;
2032 	}
2033 
2034 	/* Continue with pairing via HCI */
2035 	if (hci_op == HCI_OP_USER_PASSKEY_REPLY) {
2036 		struct hci_cp_user_passkey_reply cp;
2037 
2038 		bacpy(&cp.bdaddr, bdaddr);
2039 		cp.passkey = passkey;
2040 		err = hci_send_cmd(hdev, hci_op, sizeof(cp), &cp);
2041 	} else
2042 		err = hci_send_cmd(hdev, hci_op, sizeof(*bdaddr), bdaddr);
2043 
2044 	if (err < 0)
2045 		mgmt_pending_remove(cmd);
2046 
2047 done:
2048 	hci_dev_unlock(hdev);
2049 	return err;
2050 }
2051 
user_confirm_reply(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)2052 static int user_confirm_reply(struct sock *sk, struct hci_dev *hdev, void *data,
2053 			      u16 len)
2054 {
2055 	struct mgmt_cp_user_confirm_reply *cp = data;
2056 
2057 	BT_DBG("");
2058 
2059 	if (len != sizeof(*cp))
2060 		return cmd_status(sk, hdev->id, MGMT_OP_USER_CONFIRM_REPLY,
2061 				  MGMT_STATUS_INVALID_PARAMS);
2062 
2063 	return user_pairing_resp(sk, hdev, &cp->addr.bdaddr, cp->addr.type,
2064 				 MGMT_OP_USER_CONFIRM_REPLY,
2065 				 HCI_OP_USER_CONFIRM_REPLY, 0);
2066 }
2067 
user_confirm_neg_reply(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)2068 static int user_confirm_neg_reply(struct sock *sk, struct hci_dev *hdev,
2069 				  void *data, u16 len)
2070 {
2071 	struct mgmt_cp_user_confirm_neg_reply *cp = data;
2072 
2073 	BT_DBG("");
2074 
2075 	return user_pairing_resp(sk, hdev, &cp->addr.bdaddr, cp->addr.type,
2076 				 MGMT_OP_USER_CONFIRM_NEG_REPLY,
2077 				 HCI_OP_USER_CONFIRM_NEG_REPLY, 0);
2078 }
2079 
user_passkey_reply(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)2080 static int user_passkey_reply(struct sock *sk, struct hci_dev *hdev, void *data,
2081 			      u16 len)
2082 {
2083 	struct mgmt_cp_user_passkey_reply *cp = data;
2084 
2085 	BT_DBG("");
2086 
2087 	return user_pairing_resp(sk, hdev, &cp->addr.bdaddr, cp->addr.type,
2088 				 MGMT_OP_USER_PASSKEY_REPLY,
2089 				 HCI_OP_USER_PASSKEY_REPLY, cp->passkey);
2090 }
2091 
user_passkey_neg_reply(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)2092 static int user_passkey_neg_reply(struct sock *sk, struct hci_dev *hdev,
2093 				  void *data, u16 len)
2094 {
2095 	struct mgmt_cp_user_passkey_neg_reply *cp = data;
2096 
2097 	BT_DBG("");
2098 
2099 	return user_pairing_resp(sk, hdev, &cp->addr.bdaddr, cp->addr.type,
2100 				 MGMT_OP_USER_PASSKEY_NEG_REPLY,
2101 				 HCI_OP_USER_PASSKEY_NEG_REPLY, 0);
2102 }
2103 
update_name(struct hci_dev * hdev,const char * name)2104 static int update_name(struct hci_dev *hdev, const char *name)
2105 {
2106 	struct hci_cp_write_local_name cp;
2107 
2108 	memcpy(cp.name, name, sizeof(cp.name));
2109 
2110 	return hci_send_cmd(hdev, HCI_OP_WRITE_LOCAL_NAME, sizeof(cp), &cp);
2111 }
2112 
set_local_name(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)2113 static int set_local_name(struct sock *sk, struct hci_dev *hdev, void *data,
2114 			  u16 len)
2115 {
2116 	struct mgmt_cp_set_local_name *cp = data;
2117 	struct pending_cmd *cmd;
2118 	int err;
2119 
2120 	BT_DBG("");
2121 
2122 	hci_dev_lock(hdev);
2123 
2124 	memcpy(hdev->short_name, cp->short_name, sizeof(hdev->short_name));
2125 
2126 	if (!hdev_is_powered(hdev)) {
2127 		memcpy(hdev->dev_name, cp->name, sizeof(hdev->dev_name));
2128 
2129 		err = cmd_complete(sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, 0,
2130 				   data, len);
2131 		if (err < 0)
2132 			goto failed;
2133 
2134 		err = mgmt_event(MGMT_EV_LOCAL_NAME_CHANGED, hdev, data, len,
2135 				 sk);
2136 
2137 		goto failed;
2138 	}
2139 
2140 	cmd = mgmt_pending_add(sk, MGMT_OP_SET_LOCAL_NAME, hdev, data, len);
2141 	if (!cmd) {
2142 		err = -ENOMEM;
2143 		goto failed;
2144 	}
2145 
2146 	err = update_name(hdev, cp->name);
2147 	if (err < 0)
2148 		mgmt_pending_remove(cmd);
2149 
2150 failed:
2151 	hci_dev_unlock(hdev);
2152 	return err;
2153 }
2154 
read_local_oob_data(struct sock * sk,struct hci_dev * hdev,void * data,u16 data_len)2155 static int read_local_oob_data(struct sock *sk, struct hci_dev *hdev,
2156 			       void *data, u16 data_len)
2157 {
2158 	struct pending_cmd *cmd;
2159 	int err;
2160 
2161 	BT_DBG("%s", hdev->name);
2162 
2163 	hci_dev_lock(hdev);
2164 
2165 	if (!hdev_is_powered(hdev)) {
2166 		err = cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
2167 				 MGMT_STATUS_NOT_POWERED);
2168 		goto unlock;
2169 	}
2170 
2171 	if (!(hdev->features[6] & LMP_SIMPLE_PAIR)) {
2172 		err = cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
2173 				 MGMT_STATUS_NOT_SUPPORTED);
2174 		goto unlock;
2175 	}
2176 
2177 	if (mgmt_pending_find(MGMT_OP_READ_LOCAL_OOB_DATA, hdev)) {
2178 		err = cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
2179 				 MGMT_STATUS_BUSY);
2180 		goto unlock;
2181 	}
2182 
2183 	cmd = mgmt_pending_add(sk, MGMT_OP_READ_LOCAL_OOB_DATA, hdev, NULL, 0);
2184 	if (!cmd) {
2185 		err = -ENOMEM;
2186 		goto unlock;
2187 	}
2188 
2189 	err = hci_send_cmd(hdev, HCI_OP_READ_LOCAL_OOB_DATA, 0, NULL);
2190 	if (err < 0)
2191 		mgmt_pending_remove(cmd);
2192 
2193 unlock:
2194 	hci_dev_unlock(hdev);
2195 	return err;
2196 }
2197 
add_remote_oob_data(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)2198 static int add_remote_oob_data(struct sock *sk, struct hci_dev *hdev,
2199 			       void *data, u16 len)
2200 {
2201 	struct mgmt_cp_add_remote_oob_data *cp = data;
2202 	u8 status;
2203 	int err;
2204 
2205 	BT_DBG("%s ", hdev->name);
2206 
2207 	hci_dev_lock(hdev);
2208 
2209 	if (!hdev_is_powered(hdev)) {
2210 		err = cmd_complete(sk, hdev->id, MGMT_OP_ADD_REMOTE_OOB_DATA,
2211 				   MGMT_STATUS_NOT_POWERED, &cp->addr,
2212 				   sizeof(cp->addr));
2213 		goto unlock;
2214 	}
2215 
2216 	err = hci_add_remote_oob_data(hdev, &cp->addr.bdaddr, cp->hash,
2217 				      cp->randomizer);
2218 	if (err < 0)
2219 		status = MGMT_STATUS_FAILED;
2220 	else
2221 		status = 0;
2222 
2223 	err = cmd_complete(sk, hdev->id, MGMT_OP_ADD_REMOTE_OOB_DATA, status,
2224 			   &cp->addr, sizeof(cp->addr));
2225 
2226 unlock:
2227 	hci_dev_unlock(hdev);
2228 	return err;
2229 }
2230 
remove_remote_oob_data(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)2231 static int remove_remote_oob_data(struct sock *sk, struct hci_dev *hdev,
2232 						void *data, u16 len)
2233 {
2234 	struct mgmt_cp_remove_remote_oob_data *cp = data;
2235 	u8 status;
2236 	int err;
2237 
2238 	BT_DBG("%s", hdev->name);
2239 
2240 	hci_dev_lock(hdev);
2241 
2242 	if (!hdev_is_powered(hdev)) {
2243 		err = cmd_complete(sk, hdev->id,
2244 				   MGMT_OP_REMOVE_REMOTE_OOB_DATA,
2245 				   MGMT_STATUS_NOT_POWERED, &cp->addr,
2246 				   sizeof(cp->addr));
2247 		goto unlock;
2248 	}
2249 
2250 	err = hci_remove_remote_oob_data(hdev, &cp->addr.bdaddr);
2251 	if (err < 0)
2252 		status = MGMT_STATUS_INVALID_PARAMS;
2253 	else
2254 		status = 0;
2255 
2256 	err = cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_REMOTE_OOB_DATA,
2257 			   status, &cp->addr, sizeof(cp->addr));
2258 
2259 unlock:
2260 	hci_dev_unlock(hdev);
2261 	return err;
2262 }
2263 
mgmt_interleaved_discovery(struct hci_dev * hdev)2264 int mgmt_interleaved_discovery(struct hci_dev *hdev)
2265 {
2266 	int err;
2267 
2268 	BT_DBG("%s", hdev->name);
2269 
2270 	hci_dev_lock(hdev);
2271 
2272 	err = hci_do_inquiry(hdev, INQUIRY_LEN_BREDR_LE);
2273 	if (err < 0)
2274 		hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
2275 
2276 	hci_dev_unlock(hdev);
2277 
2278 	return err;
2279 }
2280 
start_discovery(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)2281 static int start_discovery(struct sock *sk, struct hci_dev *hdev,
2282 			   void *data, u16 len)
2283 {
2284 	struct mgmt_cp_start_discovery *cp = data;
2285 	struct pending_cmd *cmd;
2286 	int err;
2287 
2288 	BT_DBG("%s", hdev->name);
2289 
2290 	hci_dev_lock(hdev);
2291 
2292 	if (!hdev_is_powered(hdev)) {
2293 		err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
2294 				 MGMT_STATUS_NOT_POWERED);
2295 		goto failed;
2296 	}
2297 
2298 	if (hdev->discovery.state != DISCOVERY_STOPPED) {
2299 		err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
2300 				 MGMT_STATUS_BUSY);
2301 		goto failed;
2302 	}
2303 
2304 	cmd = mgmt_pending_add(sk, MGMT_OP_START_DISCOVERY, hdev, NULL, 0);
2305 	if (!cmd) {
2306 		err = -ENOMEM;
2307 		goto failed;
2308 	}
2309 
2310 	hdev->discovery.type = cp->type;
2311 
2312 	switch (hdev->discovery.type) {
2313 	case DISCOV_TYPE_BREDR:
2314 		if (lmp_bredr_capable(hdev))
2315 			err = hci_do_inquiry(hdev, INQUIRY_LEN_BREDR);
2316 		else
2317 			err = -ENOTSUPP;
2318 		break;
2319 
2320 	case DISCOV_TYPE_LE:
2321 		if (lmp_host_le_capable(hdev))
2322 			err = hci_le_scan(hdev, LE_SCAN_TYPE, LE_SCAN_INT,
2323 					  LE_SCAN_WIN, LE_SCAN_TIMEOUT_LE_ONLY);
2324 		else
2325 			err = -ENOTSUPP;
2326 		break;
2327 
2328 	case DISCOV_TYPE_INTERLEAVED:
2329 		if (lmp_host_le_capable(hdev) && lmp_bredr_capable(hdev))
2330 			err = hci_le_scan(hdev, LE_SCAN_TYPE, LE_SCAN_INT,
2331 					  LE_SCAN_WIN,
2332 					  LE_SCAN_TIMEOUT_BREDR_LE);
2333 		else
2334 			err = -ENOTSUPP;
2335 		break;
2336 
2337 	default:
2338 		err = -EINVAL;
2339 	}
2340 
2341 	if (err < 0)
2342 		mgmt_pending_remove(cmd);
2343 	else
2344 		hci_discovery_set_state(hdev, DISCOVERY_STARTING);
2345 
2346 failed:
2347 	hci_dev_unlock(hdev);
2348 	return err;
2349 }
2350 
stop_discovery(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)2351 static int stop_discovery(struct sock *sk, struct hci_dev *hdev, void *data,
2352 			  u16 len)
2353 {
2354 	struct mgmt_cp_stop_discovery *mgmt_cp = data;
2355 	struct pending_cmd *cmd;
2356 	struct hci_cp_remote_name_req_cancel cp;
2357 	struct inquiry_entry *e;
2358 	int err;
2359 
2360 	BT_DBG("%s", hdev->name);
2361 
2362 	hci_dev_lock(hdev);
2363 
2364 	if (!hci_discovery_active(hdev)) {
2365 		err = cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY,
2366 				   MGMT_STATUS_REJECTED, &mgmt_cp->type,
2367 				   sizeof(mgmt_cp->type));
2368 		goto unlock;
2369 	}
2370 
2371 	if (hdev->discovery.type != mgmt_cp->type) {
2372 		err = cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY,
2373 				   MGMT_STATUS_INVALID_PARAMS, &mgmt_cp->type,
2374 				   sizeof(mgmt_cp->type));
2375 		goto unlock;
2376 	}
2377 
2378 	cmd = mgmt_pending_add(sk, MGMT_OP_STOP_DISCOVERY, hdev, NULL, 0);
2379 	if (!cmd) {
2380 		err = -ENOMEM;
2381 		goto unlock;
2382 	}
2383 
2384 	if (hdev->discovery.state == DISCOVERY_FINDING) {
2385 		err = hci_cancel_inquiry(hdev);
2386 		if (err < 0)
2387 			mgmt_pending_remove(cmd);
2388 		else
2389 			hci_discovery_set_state(hdev, DISCOVERY_STOPPING);
2390 		goto unlock;
2391 	}
2392 
2393 	e = hci_inquiry_cache_lookup_resolve(hdev, BDADDR_ANY, NAME_PENDING);
2394 	if (!e) {
2395 		mgmt_pending_remove(cmd);
2396 		err = cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY, 0,
2397 				   &mgmt_cp->type, sizeof(mgmt_cp->type));
2398 		hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
2399 		goto unlock;
2400 	}
2401 
2402 	bacpy(&cp.bdaddr, &e->data.bdaddr);
2403 	err = hci_send_cmd(hdev, HCI_OP_REMOTE_NAME_REQ_CANCEL, sizeof(cp),
2404 			   &cp);
2405 	if (err < 0)
2406 		mgmt_pending_remove(cmd);
2407 	else
2408 		hci_discovery_set_state(hdev, DISCOVERY_STOPPING);
2409 
2410 unlock:
2411 	hci_dev_unlock(hdev);
2412 	return err;
2413 }
2414 
confirm_name(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)2415 static int confirm_name(struct sock *sk, struct hci_dev *hdev, void *data,
2416 			u16 len)
2417 {
2418 	struct mgmt_cp_confirm_name *cp = data;
2419 	struct inquiry_entry *e;
2420 	int err;
2421 
2422 	BT_DBG("%s", hdev->name);
2423 
2424 	hci_dev_lock(hdev);
2425 
2426 	if (!hci_discovery_active(hdev)) {
2427 		err = cmd_status(sk, hdev->id, MGMT_OP_CONFIRM_NAME,
2428 				 MGMT_STATUS_FAILED);
2429 		goto failed;
2430 	}
2431 
2432 	e = hci_inquiry_cache_lookup_unknown(hdev, &cp->addr.bdaddr);
2433 	if (!e) {
2434 		err = cmd_status(sk, hdev->id, MGMT_OP_CONFIRM_NAME,
2435 				 MGMT_STATUS_INVALID_PARAMS);
2436 		goto failed;
2437 	}
2438 
2439 	if (cp->name_known) {
2440 		e->name_state = NAME_KNOWN;
2441 		list_del(&e->list);
2442 	} else {
2443 		e->name_state = NAME_NEEDED;
2444 		hci_inquiry_cache_update_resolve(hdev, e);
2445 	}
2446 
2447 	err = 0;
2448 
2449 failed:
2450 	hci_dev_unlock(hdev);
2451 	return err;
2452 }
2453 
block_device(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)2454 static int block_device(struct sock *sk, struct hci_dev *hdev, void *data,
2455 			u16 len)
2456 {
2457 	struct mgmt_cp_block_device *cp = data;
2458 	u8 status;
2459 	int err;
2460 
2461 	BT_DBG("%s", hdev->name);
2462 
2463 	hci_dev_lock(hdev);
2464 
2465 	err = hci_blacklist_add(hdev, &cp->addr.bdaddr, cp->addr.type);
2466 	if (err < 0)
2467 		status = MGMT_STATUS_FAILED;
2468 	else
2469 		status = 0;
2470 
2471 	err = cmd_complete(sk, hdev->id, MGMT_OP_BLOCK_DEVICE, status,
2472 			   &cp->addr, sizeof(cp->addr));
2473 
2474 	hci_dev_unlock(hdev);
2475 
2476 	return err;
2477 }
2478 
unblock_device(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)2479 static int unblock_device(struct sock *sk, struct hci_dev *hdev, void *data,
2480 			  u16 len)
2481 {
2482 	struct mgmt_cp_unblock_device *cp = data;
2483 	u8 status;
2484 	int err;
2485 
2486 	BT_DBG("%s", hdev->name);
2487 
2488 	hci_dev_lock(hdev);
2489 
2490 	err = hci_blacklist_del(hdev, &cp->addr.bdaddr, cp->addr.type);
2491 	if (err < 0)
2492 		status = MGMT_STATUS_INVALID_PARAMS;
2493 	else
2494 		status = 0;
2495 
2496 	err = cmd_complete(sk, hdev->id, MGMT_OP_UNBLOCK_DEVICE, status,
2497 			   &cp->addr, sizeof(cp->addr));
2498 
2499 	hci_dev_unlock(hdev);
2500 
2501 	return err;
2502 }
2503 
set_fast_connectable(struct sock * sk,struct hci_dev * hdev,void * data,u16 len)2504 static int set_fast_connectable(struct sock *sk, struct hci_dev *hdev,
2505 				void *data, u16 len)
2506 {
2507 	struct mgmt_mode *cp = data;
2508 	struct hci_cp_write_page_scan_activity acp;
2509 	u8 type;
2510 	int err;
2511 
2512 	BT_DBG("%s", hdev->name);
2513 
2514 	if (!hdev_is_powered(hdev))
2515 		return cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
2516 				  MGMT_STATUS_NOT_POWERED);
2517 
2518 	if (!test_bit(HCI_CONNECTABLE, &hdev->dev_flags))
2519 		return cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
2520 				  MGMT_STATUS_REJECTED);
2521 
2522 	hci_dev_lock(hdev);
2523 
2524 	if (cp->val) {
2525 		type = PAGE_SCAN_TYPE_INTERLACED;
2526 
2527 		/* 22.5 msec page scan interval */
2528 		acp.interval = __constant_cpu_to_le16(0x0024);
2529 	} else {
2530 		type = PAGE_SCAN_TYPE_STANDARD;	/* default */
2531 
2532 		/* default 1.28 sec page scan */
2533 		acp.interval = __constant_cpu_to_le16(0x0800);
2534 	}
2535 
2536 	/* default 11.25 msec page scan window */
2537 	acp.window = __constant_cpu_to_le16(0x0012);
2538 
2539 	err = hci_send_cmd(hdev, HCI_OP_WRITE_PAGE_SCAN_ACTIVITY, sizeof(acp),
2540 			   &acp);
2541 	if (err < 0) {
2542 		err = cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
2543 				 MGMT_STATUS_FAILED);
2544 		goto done;
2545 	}
2546 
2547 	err = hci_send_cmd(hdev, HCI_OP_WRITE_PAGE_SCAN_TYPE, 1, &type);
2548 	if (err < 0) {
2549 		err = cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
2550 				 MGMT_STATUS_FAILED);
2551 		goto done;
2552 	}
2553 
2554 	err = cmd_complete(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE, 0,
2555 			   NULL, 0);
2556 done:
2557 	hci_dev_unlock(hdev);
2558 	return err;
2559 }
2560 
load_long_term_keys(struct sock * sk,struct hci_dev * hdev,void * cp_data,u16 len)2561 static int load_long_term_keys(struct sock *sk, struct hci_dev *hdev,
2562 			       void *cp_data, u16 len)
2563 {
2564 	struct mgmt_cp_load_long_term_keys *cp = cp_data;
2565 	u16 key_count, expected_len;
2566 	int i;
2567 
2568 	key_count = get_unaligned_le16(&cp->key_count);
2569 
2570 	expected_len = sizeof(*cp) + key_count *
2571 					sizeof(struct mgmt_ltk_info);
2572 	if (expected_len != len) {
2573 		BT_ERR("load_keys: expected %u bytes, got %u bytes",
2574 							len, expected_len);
2575 		return cmd_status(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS,
2576 				  EINVAL);
2577 	}
2578 
2579 	BT_DBG("%s key_count %u", hdev->name, key_count);
2580 
2581 	hci_dev_lock(hdev);
2582 
2583 	hci_smp_ltks_clear(hdev);
2584 
2585 	for (i = 0; i < key_count; i++) {
2586 		struct mgmt_ltk_info *key = &cp->keys[i];
2587 		u8 type;
2588 
2589 		if (key->master)
2590 			type = HCI_SMP_LTK;
2591 		else
2592 			type = HCI_SMP_LTK_SLAVE;
2593 
2594 		hci_add_ltk(hdev, &key->addr.bdaddr, key->addr.type,
2595 			    type, 0, key->authenticated, key->val,
2596 			    key->enc_size, key->ediv, key->rand);
2597 	}
2598 
2599 	hci_dev_unlock(hdev);
2600 
2601 	return 0;
2602 }
2603 
2604 struct mgmt_handler {
2605 	int (*func) (struct sock *sk, struct hci_dev *hdev, void *data,
2606 		     u16 data_len);
2607 	bool var_len;
2608 	size_t data_len;
2609 } mgmt_handlers[] = {
2610 	{ NULL }, /* 0x0000 (no command) */
2611 	{ read_version,           false, MGMT_READ_VERSION_SIZE },
2612 	{ read_commands,          false, MGMT_READ_COMMANDS_SIZE },
2613 	{ read_index_list,        false, MGMT_READ_INDEX_LIST_SIZE },
2614 	{ read_controller_info,   false, MGMT_READ_INFO_SIZE },
2615 	{ set_powered,            false, MGMT_SETTING_SIZE },
2616 	{ set_discoverable,       false, MGMT_SET_DISCOVERABLE_SIZE },
2617 	{ set_connectable,        false, MGMT_SETTING_SIZE },
2618 	{ set_fast_connectable,   false, MGMT_SETTING_SIZE },
2619 	{ set_pairable,           false, MGMT_SETTING_SIZE },
2620 	{ set_link_security,      false, MGMT_SETTING_SIZE },
2621 	{ set_ssp,                false, MGMT_SETTING_SIZE },
2622 	{ set_hs,                 false, MGMT_SETTING_SIZE },
2623 	{ set_le,                 false, MGMT_SETTING_SIZE },
2624 	{ set_dev_class,          false, MGMT_SET_DEV_CLASS_SIZE },
2625 	{ set_local_name,         false, MGMT_SET_LOCAL_NAME_SIZE },
2626 	{ add_uuid,               false, MGMT_ADD_UUID_SIZE },
2627 	{ remove_uuid,            false, MGMT_REMOVE_UUID_SIZE },
2628 	{ load_link_keys,         true,  MGMT_LOAD_LINK_KEYS_SIZE },
2629 	{ load_long_term_keys,    true,  MGMT_LOAD_LONG_TERM_KEYS_SIZE },
2630 	{ disconnect,             false, MGMT_DISCONNECT_SIZE },
2631 	{ get_connections,        false, MGMT_GET_CONNECTIONS_SIZE },
2632 	{ pin_code_reply,         false, MGMT_PIN_CODE_REPLY_SIZE },
2633 	{ pin_code_neg_reply,     false, MGMT_PIN_CODE_NEG_REPLY_SIZE },
2634 	{ set_io_capability,      false, MGMT_SET_IO_CAPABILITY_SIZE },
2635 	{ pair_device,            false, MGMT_PAIR_DEVICE_SIZE },
2636 	{ cancel_pair_device,     false, MGMT_CANCEL_PAIR_DEVICE_SIZE },
2637 	{ unpair_device,          false, MGMT_UNPAIR_DEVICE_SIZE },
2638 	{ user_confirm_reply,     false, MGMT_USER_CONFIRM_REPLY_SIZE },
2639 	{ user_confirm_neg_reply, false, MGMT_USER_CONFIRM_NEG_REPLY_SIZE },
2640 	{ user_passkey_reply,     false, MGMT_USER_PASSKEY_REPLY_SIZE },
2641 	{ user_passkey_neg_reply, false, MGMT_USER_PASSKEY_NEG_REPLY_SIZE },
2642 	{ read_local_oob_data,    false, MGMT_READ_LOCAL_OOB_DATA_SIZE },
2643 	{ add_remote_oob_data,    false, MGMT_ADD_REMOTE_OOB_DATA_SIZE },
2644 	{ remove_remote_oob_data, false, MGMT_REMOVE_REMOTE_OOB_DATA_SIZE },
2645 	{ start_discovery,        false, MGMT_START_DISCOVERY_SIZE },
2646 	{ stop_discovery,         false, MGMT_STOP_DISCOVERY_SIZE },
2647 	{ confirm_name,           false, MGMT_CONFIRM_NAME_SIZE },
2648 	{ block_device,           false, MGMT_BLOCK_DEVICE_SIZE },
2649 	{ unblock_device,         false, MGMT_UNBLOCK_DEVICE_SIZE },
2650 };
2651 
2652 
mgmt_control(struct sock * sk,struct msghdr * msg,size_t msglen)2653 int mgmt_control(struct sock *sk, struct msghdr *msg, size_t msglen)
2654 {
2655 	void *buf;
2656 	u8 *cp;
2657 	struct mgmt_hdr *hdr;
2658 	u16 opcode, index, len;
2659 	struct hci_dev *hdev = NULL;
2660 	struct mgmt_handler *handler;
2661 	int err;
2662 
2663 	BT_DBG("got %zu bytes", msglen);
2664 
2665 	if (msglen < sizeof(*hdr))
2666 		return -EINVAL;
2667 
2668 	buf = kmalloc(msglen, GFP_KERNEL);
2669 	if (!buf)
2670 		return -ENOMEM;
2671 
2672 	if (memcpy_fromiovec(buf, msg->msg_iov, msglen)) {
2673 		err = -EFAULT;
2674 		goto done;
2675 	}
2676 
2677 	hdr = buf;
2678 	opcode = get_unaligned_le16(&hdr->opcode);
2679 	index = get_unaligned_le16(&hdr->index);
2680 	len = get_unaligned_le16(&hdr->len);
2681 
2682 	if (len != msglen - sizeof(*hdr)) {
2683 		err = -EINVAL;
2684 		goto done;
2685 	}
2686 
2687 	if (index != MGMT_INDEX_NONE) {
2688 		hdev = hci_dev_get(index);
2689 		if (!hdev) {
2690 			err = cmd_status(sk, index, opcode,
2691 					 MGMT_STATUS_INVALID_INDEX);
2692 			goto done;
2693 		}
2694 	}
2695 
2696 	if (opcode >= ARRAY_SIZE(mgmt_handlers) ||
2697 					mgmt_handlers[opcode].func == NULL) {
2698 		BT_DBG("Unknown op %u", opcode);
2699 		err = cmd_status(sk, index, opcode,
2700 				 MGMT_STATUS_UNKNOWN_COMMAND);
2701 		goto done;
2702 	}
2703 
2704 	if ((hdev && opcode < MGMT_OP_READ_INFO) ||
2705 			(!hdev && opcode >= MGMT_OP_READ_INFO)) {
2706 		err = cmd_status(sk, index, opcode,
2707 				 MGMT_STATUS_INVALID_INDEX);
2708 		goto done;
2709 	}
2710 
2711 	handler = &mgmt_handlers[opcode];
2712 
2713 	if ((handler->var_len && len < handler->data_len) ||
2714 			(!handler->var_len && len != handler->data_len)) {
2715 		err = cmd_status(sk, index, opcode,
2716 				 MGMT_STATUS_INVALID_PARAMS);
2717 		goto done;
2718 	}
2719 
2720 	if (hdev)
2721 		mgmt_init_hdev(sk, hdev);
2722 
2723 	cp = buf + sizeof(*hdr);
2724 
2725 	err = handler->func(sk, hdev, cp, len);
2726 	if (err < 0)
2727 		goto done;
2728 
2729 	err = msglen;
2730 
2731 done:
2732 	if (hdev)
2733 		hci_dev_put(hdev);
2734 
2735 	kfree(buf);
2736 	return err;
2737 }
2738 
cmd_status_rsp(struct pending_cmd * cmd,void * data)2739 static void cmd_status_rsp(struct pending_cmd *cmd, void *data)
2740 {
2741 	u8 *status = data;
2742 
2743 	cmd_status(cmd->sk, cmd->index, cmd->opcode, *status);
2744 	mgmt_pending_remove(cmd);
2745 }
2746 
mgmt_index_added(struct hci_dev * hdev)2747 int mgmt_index_added(struct hci_dev *hdev)
2748 {
2749 	return mgmt_event(MGMT_EV_INDEX_ADDED, hdev, NULL, 0, NULL);
2750 }
2751 
mgmt_index_removed(struct hci_dev * hdev)2752 int mgmt_index_removed(struct hci_dev *hdev)
2753 {
2754 	u8 status = MGMT_STATUS_INVALID_INDEX;
2755 
2756 	mgmt_pending_foreach(0, hdev, cmd_status_rsp, &status);
2757 
2758 	return mgmt_event(MGMT_EV_INDEX_REMOVED, hdev, NULL, 0, NULL);
2759 }
2760 
2761 struct cmd_lookup {
2762 	struct sock *sk;
2763 	struct hci_dev *hdev;
2764 	u8 mgmt_status;
2765 };
2766 
settings_rsp(struct pending_cmd * cmd,void * data)2767 static void settings_rsp(struct pending_cmd *cmd, void *data)
2768 {
2769 	struct cmd_lookup *match = data;
2770 
2771 	send_settings_rsp(cmd->sk, cmd->opcode, match->hdev);
2772 
2773 	list_del(&cmd->list);
2774 
2775 	if (match->sk == NULL) {
2776 		match->sk = cmd->sk;
2777 		sock_hold(match->sk);
2778 	}
2779 
2780 	mgmt_pending_free(cmd);
2781 }
2782 
mgmt_powered(struct hci_dev * hdev,u8 powered)2783 int mgmt_powered(struct hci_dev *hdev, u8 powered)
2784 {
2785 	struct cmd_lookup match = { NULL, hdev };
2786 	int err;
2787 
2788 	if (!test_bit(HCI_MGMT, &hdev->dev_flags))
2789 		return 0;
2790 
2791 	mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, settings_rsp, &match);
2792 
2793 	if (powered) {
2794 		u8 scan = 0;
2795 
2796 		if (test_bit(HCI_CONNECTABLE, &hdev->dev_flags))
2797 			scan |= SCAN_PAGE;
2798 		if (test_bit(HCI_DISCOVERABLE, &hdev->dev_flags))
2799 			scan |= SCAN_INQUIRY;
2800 
2801 		if (scan)
2802 			hci_send_cmd(hdev, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);
2803 
2804 		if (test_bit(HCI_SSP_ENABLED, &hdev->dev_flags)) {
2805 			u8 ssp = 1;
2806 
2807 			hci_send_cmd(hdev, HCI_OP_WRITE_SSP_MODE, 1, &ssp);
2808 		}
2809 
2810 		if (test_bit(HCI_LE_ENABLED, &hdev->dev_flags)) {
2811 			struct hci_cp_write_le_host_supported cp;
2812 
2813 			cp.le = 1;
2814 			cp.simul = !!(hdev->features[6] & LMP_SIMUL_LE_BR);
2815 
2816 			hci_send_cmd(hdev, HCI_OP_WRITE_LE_HOST_SUPPORTED,
2817 				     sizeof(cp), &cp);
2818 		}
2819 
2820 		update_class(hdev);
2821 		update_name(hdev, hdev->dev_name);
2822 		update_eir(hdev);
2823 	} else {
2824 		u8 status = MGMT_STATUS_NOT_POWERED;
2825 		mgmt_pending_foreach(0, hdev, cmd_status_rsp, &status);
2826 	}
2827 
2828 	err = new_settings(hdev, match.sk);
2829 
2830 	if (match.sk)
2831 		sock_put(match.sk);
2832 
2833 	return err;
2834 }
2835 
mgmt_set_powered_failed(struct hci_dev * hdev,int err)2836 int mgmt_set_powered_failed(struct hci_dev *hdev, int err)
2837 {
2838 	struct pending_cmd *cmd;
2839 	u8 status;
2840 
2841 	cmd = mgmt_pending_find(MGMT_OP_SET_POWERED, hdev);
2842 	if (!cmd)
2843 		return -ENOENT;
2844 
2845 	if (err == -ERFKILL)
2846 		status = MGMT_STATUS_RFKILLED;
2847 	else
2848 		status = MGMT_STATUS_FAILED;
2849 
2850 	err = cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_POWERED, status);
2851 
2852 	mgmt_pending_remove(cmd);
2853 
2854 	return err;
2855 }
2856 
mgmt_discoverable(struct hci_dev * hdev,u8 discoverable)2857 int mgmt_discoverable(struct hci_dev *hdev, u8 discoverable)
2858 {
2859 	struct cmd_lookup match = { NULL, hdev };
2860 	bool changed = false;
2861 	int err = 0;
2862 
2863 	if (discoverable) {
2864 		if (!test_and_set_bit(HCI_DISCOVERABLE, &hdev->dev_flags))
2865 			changed = true;
2866 	} else {
2867 		if (test_and_clear_bit(HCI_DISCOVERABLE, &hdev->dev_flags))
2868 			changed = true;
2869 	}
2870 
2871 	mgmt_pending_foreach(MGMT_OP_SET_DISCOVERABLE, hdev, settings_rsp,
2872 			     &match);
2873 
2874 	if (changed)
2875 		err = new_settings(hdev, match.sk);
2876 
2877 	if (match.sk)
2878 		sock_put(match.sk);
2879 
2880 	return err;
2881 }
2882 
mgmt_connectable(struct hci_dev * hdev,u8 connectable)2883 int mgmt_connectable(struct hci_dev *hdev, u8 connectable)
2884 {
2885 	struct cmd_lookup match = { NULL, hdev };
2886 	bool changed = false;
2887 	int err = 0;
2888 
2889 	if (connectable) {
2890 		if (!test_and_set_bit(HCI_CONNECTABLE, &hdev->dev_flags))
2891 			changed = true;
2892 	} else {
2893 		if (test_and_clear_bit(HCI_CONNECTABLE, &hdev->dev_flags))
2894 			changed = true;
2895 	}
2896 
2897 	mgmt_pending_foreach(MGMT_OP_SET_CONNECTABLE, hdev, settings_rsp,
2898 			     &match);
2899 
2900 	if (changed)
2901 		err = new_settings(hdev, match.sk);
2902 
2903 	if (match.sk)
2904 		sock_put(match.sk);
2905 
2906 	return err;
2907 }
2908 
mgmt_write_scan_failed(struct hci_dev * hdev,u8 scan,u8 status)2909 int mgmt_write_scan_failed(struct hci_dev *hdev, u8 scan, u8 status)
2910 {
2911 	u8 mgmt_err = mgmt_status(status);
2912 
2913 	if (scan & SCAN_PAGE)
2914 		mgmt_pending_foreach(MGMT_OP_SET_CONNECTABLE, hdev,
2915 				     cmd_status_rsp, &mgmt_err);
2916 
2917 	if (scan & SCAN_INQUIRY)
2918 		mgmt_pending_foreach(MGMT_OP_SET_DISCOVERABLE, hdev,
2919 				     cmd_status_rsp, &mgmt_err);
2920 
2921 	return 0;
2922 }
2923 
mgmt_new_link_key(struct hci_dev * hdev,struct link_key * key,bool persistent)2924 int mgmt_new_link_key(struct hci_dev *hdev, struct link_key *key, bool persistent)
2925 {
2926 	struct mgmt_ev_new_link_key ev;
2927 
2928 	memset(&ev, 0, sizeof(ev));
2929 
2930 	ev.store_hint = persistent;
2931 	bacpy(&ev.key.addr.bdaddr, &key->bdaddr);
2932 	ev.key.addr.type = MGMT_ADDR_BREDR;
2933 	ev.key.type = key->type;
2934 	memcpy(ev.key.val, key->val, 16);
2935 	ev.key.pin_len = key->pin_len;
2936 
2937 	return mgmt_event(MGMT_EV_NEW_LINK_KEY, hdev, &ev, sizeof(ev), NULL);
2938 }
2939 
mgmt_new_ltk(struct hci_dev * hdev,struct smp_ltk * key,u8 persistent)2940 int mgmt_new_ltk(struct hci_dev *hdev, struct smp_ltk *key, u8 persistent)
2941 {
2942 	struct mgmt_ev_new_long_term_key ev;
2943 
2944 	memset(&ev, 0, sizeof(ev));
2945 
2946 	ev.store_hint = persistent;
2947 	bacpy(&ev.key.addr.bdaddr, &key->bdaddr);
2948 	ev.key.addr.type = key->bdaddr_type;
2949 	ev.key.authenticated = key->authenticated;
2950 	ev.key.enc_size = key->enc_size;
2951 	ev.key.ediv = key->ediv;
2952 
2953 	if (key->type == HCI_SMP_LTK)
2954 		ev.key.master = 1;
2955 
2956 	memcpy(ev.key.rand, key->rand, sizeof(key->rand));
2957 	memcpy(ev.key.val, key->val, sizeof(key->val));
2958 
2959 	return mgmt_event(MGMT_EV_NEW_LONG_TERM_KEY, hdev, &ev, sizeof(ev),
2960 			  NULL);
2961 }
2962 
mgmt_device_connected(struct hci_dev * hdev,bdaddr_t * bdaddr,u8 link_type,u8 addr_type,u32 flags,u8 * name,u8 name_len,u8 * dev_class)2963 int mgmt_device_connected(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
2964 			  u8 addr_type, u32 flags, u8 *name, u8 name_len,
2965 			  u8 *dev_class)
2966 {
2967 	char buf[512];
2968 	struct mgmt_ev_device_connected *ev = (void *) buf;
2969 	u16 eir_len = 0;
2970 
2971 	bacpy(&ev->addr.bdaddr, bdaddr);
2972 	ev->addr.type = link_to_mgmt(link_type, addr_type);
2973 
2974 	ev->flags = __cpu_to_le32(flags);
2975 
2976 	if (name_len > 0)
2977 		eir_len = eir_append_data(ev->eir, 0, EIR_NAME_COMPLETE,
2978 					  name, name_len);
2979 
2980 	if (dev_class && memcmp(dev_class, "\0\0\0", 3) != 0)
2981 		eir_len = eir_append_data(ev->eir, eir_len,
2982 					  EIR_CLASS_OF_DEV, dev_class, 3);
2983 
2984 	put_unaligned_le16(eir_len, &ev->eir_len);
2985 
2986 	return mgmt_event(MGMT_EV_DEVICE_CONNECTED, hdev, buf,
2987 			  sizeof(*ev) + eir_len, NULL);
2988 }
2989 
disconnect_rsp(struct pending_cmd * cmd,void * data)2990 static void disconnect_rsp(struct pending_cmd *cmd, void *data)
2991 {
2992 	struct mgmt_cp_disconnect *cp = cmd->param;
2993 	struct sock **sk = data;
2994 	struct mgmt_rp_disconnect rp;
2995 
2996 	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
2997 	rp.addr.type = cp->addr.type;
2998 
2999 	cmd_complete(cmd->sk, cmd->index, MGMT_OP_DISCONNECT, 0, &rp,
3000 		     sizeof(rp));
3001 
3002 	*sk = cmd->sk;
3003 	sock_hold(*sk);
3004 
3005 	mgmt_pending_remove(cmd);
3006 }
3007 
unpair_device_rsp(struct pending_cmd * cmd,void * data)3008 static void unpair_device_rsp(struct pending_cmd *cmd, void *data)
3009 {
3010 	struct hci_dev *hdev = data;
3011 	struct mgmt_cp_unpair_device *cp = cmd->param;
3012 	struct mgmt_rp_unpair_device rp;
3013 
3014 	memset(&rp, 0, sizeof(rp));
3015 	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
3016 	rp.addr.type = cp->addr.type;
3017 
3018 	device_unpaired(hdev, &cp->addr.bdaddr, cp->addr.type, cmd->sk);
3019 
3020 	cmd_complete(cmd->sk, cmd->index, cmd->opcode, 0, &rp, sizeof(rp));
3021 
3022 	mgmt_pending_remove(cmd);
3023 }
3024 
mgmt_device_disconnected(struct hci_dev * hdev,bdaddr_t * bdaddr,u8 link_type,u8 addr_type)3025 int mgmt_device_disconnected(struct hci_dev *hdev, bdaddr_t *bdaddr,
3026 			     u8 link_type, u8 addr_type)
3027 {
3028 	struct mgmt_addr_info ev;
3029 	struct sock *sk = NULL;
3030 	int err;
3031 
3032 	mgmt_pending_foreach(MGMT_OP_DISCONNECT, hdev, disconnect_rsp, &sk);
3033 
3034 	bacpy(&ev.bdaddr, bdaddr);
3035 	ev.type = link_to_mgmt(link_type, addr_type);
3036 
3037 	err = mgmt_event(MGMT_EV_DEVICE_DISCONNECTED, hdev, &ev, sizeof(ev),
3038 			 sk);
3039 
3040 	if (sk)
3041 	  sock_put(sk);
3042 
3043 	mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE, hdev, unpair_device_rsp,
3044 			     hdev);
3045 
3046 	return err;
3047 }
3048 
mgmt_disconnect_failed(struct hci_dev * hdev,bdaddr_t * bdaddr,u8 link_type,u8 addr_type,u8 status)3049 int mgmt_disconnect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr,
3050 			   u8 link_type, u8 addr_type, u8 status)
3051 {
3052 	struct mgmt_rp_disconnect rp;
3053 	struct pending_cmd *cmd;
3054 	int err;
3055 
3056 	cmd = mgmt_pending_find(MGMT_OP_DISCONNECT, hdev);
3057 	if (!cmd)
3058 		return -ENOENT;
3059 
3060 	bacpy(&rp.addr.bdaddr, bdaddr);
3061 	rp.addr.type = link_to_mgmt(link_type, addr_type);
3062 
3063 	err = cmd_complete(cmd->sk, cmd->index, MGMT_OP_DISCONNECT,
3064 			   mgmt_status(status), &rp, sizeof(rp));
3065 
3066 	mgmt_pending_remove(cmd);
3067 
3068 	mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE, hdev, unpair_device_rsp,
3069 									hdev);
3070 	return err;
3071 }
3072 
mgmt_connect_failed(struct hci_dev * hdev,bdaddr_t * bdaddr,u8 link_type,u8 addr_type,u8 status)3073 int mgmt_connect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
3074 			u8 addr_type, u8 status)
3075 {
3076 	struct mgmt_ev_connect_failed ev;
3077 
3078 	bacpy(&ev.addr.bdaddr, bdaddr);
3079 	ev.addr.type = link_to_mgmt(link_type, addr_type);
3080 	ev.status = mgmt_status(status);
3081 
3082 	return mgmt_event(MGMT_EV_CONNECT_FAILED, hdev, &ev, sizeof(ev), NULL);
3083 }
3084 
mgmt_pin_code_request(struct hci_dev * hdev,bdaddr_t * bdaddr,u8 secure)3085 int mgmt_pin_code_request(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 secure)
3086 {
3087 	struct mgmt_ev_pin_code_request ev;
3088 
3089 	bacpy(&ev.addr.bdaddr, bdaddr);
3090 	ev.addr.type = MGMT_ADDR_BREDR;
3091 	ev.secure = secure;
3092 
3093 	return mgmt_event(MGMT_EV_PIN_CODE_REQUEST, hdev, &ev, sizeof(ev),
3094 			  NULL);
3095 }
3096 
mgmt_pin_code_reply_complete(struct hci_dev * hdev,bdaddr_t * bdaddr,u8 status)3097 int mgmt_pin_code_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
3098 				 u8 status)
3099 {
3100 	struct pending_cmd *cmd;
3101 	struct mgmt_rp_pin_code_reply rp;
3102 	int err;
3103 
3104 	cmd = mgmt_pending_find(MGMT_OP_PIN_CODE_REPLY, hdev);
3105 	if (!cmd)
3106 		return -ENOENT;
3107 
3108 	bacpy(&rp.addr.bdaddr, bdaddr);
3109 	rp.addr.type = MGMT_ADDR_BREDR;
3110 
3111 	err = cmd_complete(cmd->sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
3112 			   mgmt_status(status), &rp, sizeof(rp));
3113 
3114 	mgmt_pending_remove(cmd);
3115 
3116 	return err;
3117 }
3118 
mgmt_pin_code_neg_reply_complete(struct hci_dev * hdev,bdaddr_t * bdaddr,u8 status)3119 int mgmt_pin_code_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
3120 				     u8 status)
3121 {
3122 	struct pending_cmd *cmd;
3123 	struct mgmt_rp_pin_code_reply rp;
3124 	int err;
3125 
3126 	cmd = mgmt_pending_find(MGMT_OP_PIN_CODE_NEG_REPLY, hdev);
3127 	if (!cmd)
3128 		return -ENOENT;
3129 
3130 	bacpy(&rp.addr.bdaddr, bdaddr);
3131 	rp.addr.type = MGMT_ADDR_BREDR;
3132 
3133 	err = cmd_complete(cmd->sk, hdev->id, MGMT_OP_PIN_CODE_NEG_REPLY,
3134 			   mgmt_status(status), &rp, sizeof(rp));
3135 
3136 	mgmt_pending_remove(cmd);
3137 
3138 	return err;
3139 }
3140 
mgmt_user_confirm_request(struct hci_dev * hdev,bdaddr_t * bdaddr,u8 link_type,u8 addr_type,__le32 value,u8 confirm_hint)3141 int mgmt_user_confirm_request(struct hci_dev *hdev, bdaddr_t *bdaddr,
3142 			      u8 link_type, u8 addr_type, __le32 value,
3143 			      u8 confirm_hint)
3144 {
3145 	struct mgmt_ev_user_confirm_request ev;
3146 
3147 	BT_DBG("%s", hdev->name);
3148 
3149 	bacpy(&ev.addr.bdaddr, bdaddr);
3150 	ev.addr.type = link_to_mgmt(link_type, addr_type);
3151 	ev.confirm_hint = confirm_hint;
3152 	put_unaligned_le32(value, &ev.value);
3153 
3154 	return mgmt_event(MGMT_EV_USER_CONFIRM_REQUEST, hdev, &ev, sizeof(ev),
3155 			  NULL);
3156 }
3157 
mgmt_user_passkey_request(struct hci_dev * hdev,bdaddr_t * bdaddr,u8 link_type,u8 addr_type)3158 int mgmt_user_passkey_request(struct hci_dev *hdev, bdaddr_t *bdaddr,
3159 						u8 link_type, u8 addr_type)
3160 {
3161 	struct mgmt_ev_user_passkey_request ev;
3162 
3163 	BT_DBG("%s", hdev->name);
3164 
3165 	bacpy(&ev.addr.bdaddr, bdaddr);
3166 	ev.addr.type = link_to_mgmt(link_type, addr_type);
3167 
3168 	return mgmt_event(MGMT_EV_USER_PASSKEY_REQUEST, hdev, &ev, sizeof(ev),
3169 			  NULL);
3170 }
3171 
user_pairing_resp_complete(struct hci_dev * hdev,bdaddr_t * bdaddr,u8 link_type,u8 addr_type,u8 status,u8 opcode)3172 static int user_pairing_resp_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
3173 					u8 link_type, u8 addr_type, u8 status,
3174 					u8 opcode)
3175 {
3176 	struct pending_cmd *cmd;
3177 	struct mgmt_rp_user_confirm_reply rp;
3178 	int err;
3179 
3180 	cmd = mgmt_pending_find(opcode, hdev);
3181 	if (!cmd)
3182 		return -ENOENT;
3183 
3184 	bacpy(&rp.addr.bdaddr, bdaddr);
3185 	rp.addr.type = link_to_mgmt(link_type, addr_type);
3186 	err = cmd_complete(cmd->sk, hdev->id, opcode, mgmt_status(status),
3187 			   &rp, sizeof(rp));
3188 
3189 	mgmt_pending_remove(cmd);
3190 
3191 	return err;
3192 }
3193 
mgmt_user_confirm_reply_complete(struct hci_dev * hdev,bdaddr_t * bdaddr,u8 link_type,u8 addr_type,u8 status)3194 int mgmt_user_confirm_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
3195 				     u8 link_type, u8 addr_type, u8 status)
3196 {
3197 	return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
3198 					  status, MGMT_OP_USER_CONFIRM_REPLY);
3199 }
3200 
mgmt_user_confirm_neg_reply_complete(struct hci_dev * hdev,bdaddr_t * bdaddr,u8 link_type,u8 addr_type,u8 status)3201 int mgmt_user_confirm_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
3202 					 u8 link_type, u8 addr_type, u8 status)
3203 {
3204 	return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
3205 					  status, MGMT_OP_USER_CONFIRM_NEG_REPLY);
3206 }
3207 
mgmt_user_passkey_reply_complete(struct hci_dev * hdev,bdaddr_t * bdaddr,u8 link_type,u8 addr_type,u8 status)3208 int mgmt_user_passkey_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
3209 				     u8 link_type, u8 addr_type, u8 status)
3210 {
3211 	return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
3212 					  status, MGMT_OP_USER_PASSKEY_REPLY);
3213 }
3214 
mgmt_user_passkey_neg_reply_complete(struct hci_dev * hdev,bdaddr_t * bdaddr,u8 link_type,u8 addr_type,u8 status)3215 int mgmt_user_passkey_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
3216 					 u8 link_type, u8 addr_type, u8 status)
3217 {
3218 	return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
3219 					  status, MGMT_OP_USER_PASSKEY_NEG_REPLY);
3220 }
3221 
mgmt_auth_failed(struct hci_dev * hdev,bdaddr_t * bdaddr,u8 link_type,u8 addr_type,u8 status)3222 int mgmt_auth_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
3223 		     u8 addr_type, u8 status)
3224 {
3225 	struct mgmt_ev_auth_failed ev;
3226 
3227 	bacpy(&ev.addr.bdaddr, bdaddr);
3228 	ev.addr.type = link_to_mgmt(link_type, addr_type);
3229 	ev.status = mgmt_status(status);
3230 
3231 	return mgmt_event(MGMT_EV_AUTH_FAILED, hdev, &ev, sizeof(ev), NULL);
3232 }
3233 
mgmt_auth_enable_complete(struct hci_dev * hdev,u8 status)3234 int mgmt_auth_enable_complete(struct hci_dev *hdev, u8 status)
3235 {
3236 	struct cmd_lookup match = { NULL, hdev };
3237 	bool changed = false;
3238 	int err = 0;
3239 
3240 	if (status) {
3241 		u8 mgmt_err = mgmt_status(status);
3242 		mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev,
3243 				     cmd_status_rsp, &mgmt_err);
3244 		return 0;
3245 	}
3246 
3247 	if (test_bit(HCI_AUTH, &hdev->flags)) {
3248 		if (!test_and_set_bit(HCI_LINK_SECURITY, &hdev->dev_flags))
3249 			changed = true;
3250 	} else {
3251 		if (test_and_clear_bit(HCI_LINK_SECURITY, &hdev->dev_flags))
3252 			changed = true;
3253 	}
3254 
3255 	mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev, settings_rsp,
3256 			     &match);
3257 
3258 	if (changed)
3259 		err = new_settings(hdev, match.sk);
3260 
3261 	if (match.sk)
3262 		sock_put(match.sk);
3263 
3264 	return err;
3265 }
3266 
clear_eir(struct hci_dev * hdev)3267 static int clear_eir(struct hci_dev *hdev)
3268 {
3269 	struct hci_cp_write_eir cp;
3270 
3271 	if (!(hdev->features[6] & LMP_EXT_INQ))
3272 		return 0;
3273 
3274 	memset(hdev->eir, 0, sizeof(hdev->eir));
3275 
3276 	memset(&cp, 0, sizeof(cp));
3277 
3278 	return hci_send_cmd(hdev, HCI_OP_WRITE_EIR, sizeof(cp), &cp);
3279 }
3280 
mgmt_ssp_enable_complete(struct hci_dev * hdev,u8 enable,u8 status)3281 int mgmt_ssp_enable_complete(struct hci_dev *hdev, u8 enable, u8 status)
3282 {
3283 	struct cmd_lookup match = { NULL, hdev };
3284 	bool changed = false;
3285 	int err = 0;
3286 
3287 	if (status) {
3288 		u8 mgmt_err = mgmt_status(status);
3289 
3290 		if (enable && test_and_clear_bit(HCI_SSP_ENABLED,
3291 						 &hdev->dev_flags))
3292 			err = new_settings(hdev, NULL);
3293 
3294 		mgmt_pending_foreach(MGMT_OP_SET_SSP, hdev, cmd_status_rsp,
3295 				     &mgmt_err);
3296 
3297 		return err;
3298 	}
3299 
3300 	if (enable) {
3301 		if (!test_and_set_bit(HCI_SSP_ENABLED, &hdev->dev_flags))
3302 			changed = true;
3303 	} else {
3304 		if (test_and_clear_bit(HCI_SSP_ENABLED, &hdev->dev_flags))
3305 			changed = true;
3306 	}
3307 
3308 	mgmt_pending_foreach(MGMT_OP_SET_SSP, hdev, settings_rsp, &match);
3309 
3310 	if (changed)
3311 		err = new_settings(hdev, match.sk);
3312 
3313 	if (match.sk)
3314 		sock_put(match.sk);
3315 
3316 	if (test_bit(HCI_SSP_ENABLED, &hdev->dev_flags))
3317 		update_eir(hdev);
3318 	else
3319 		clear_eir(hdev);
3320 
3321 	return err;
3322 }
3323 
class_rsp(struct pending_cmd * cmd,void * data)3324 static void class_rsp(struct pending_cmd *cmd, void *data)
3325 {
3326 	struct cmd_lookup *match = data;
3327 
3328 	cmd_complete(cmd->sk, cmd->index, cmd->opcode, match->mgmt_status,
3329 		     match->hdev->dev_class, 3);
3330 
3331 	list_del(&cmd->list);
3332 
3333 	if (match->sk == NULL) {
3334 		match->sk = cmd->sk;
3335 		sock_hold(match->sk);
3336 	}
3337 
3338 	mgmt_pending_free(cmd);
3339 }
3340 
mgmt_set_class_of_dev_complete(struct hci_dev * hdev,u8 * dev_class,u8 status)3341 int mgmt_set_class_of_dev_complete(struct hci_dev *hdev, u8 *dev_class,
3342 				   u8 status)
3343 {
3344 	struct cmd_lookup match = { NULL, hdev, mgmt_status(status) };
3345 	int err = 0;
3346 
3347 	clear_bit(HCI_PENDING_CLASS, &hdev->dev_flags);
3348 
3349 	mgmt_pending_foreach(MGMT_OP_SET_DEV_CLASS, hdev, class_rsp, &match);
3350 	mgmt_pending_foreach(MGMT_OP_ADD_UUID, hdev, class_rsp, &match);
3351 	mgmt_pending_foreach(MGMT_OP_REMOVE_UUID, hdev, class_rsp, &match);
3352 
3353 	if (!status)
3354 		err = mgmt_event(MGMT_EV_CLASS_OF_DEV_CHANGED, hdev, dev_class,
3355 				 3, NULL);
3356 
3357 	if (match.sk)
3358 		sock_put(match.sk);
3359 
3360 	return err;
3361 }
3362 
mgmt_set_local_name_complete(struct hci_dev * hdev,u8 * name,u8 status)3363 int mgmt_set_local_name_complete(struct hci_dev *hdev, u8 *name, u8 status)
3364 {
3365 	struct pending_cmd *cmd;
3366 	struct mgmt_cp_set_local_name ev;
3367 	bool changed = false;
3368 	int err = 0;
3369 
3370 	if (memcmp(name, hdev->dev_name, sizeof(hdev->dev_name)) != 0) {
3371 		memcpy(hdev->dev_name, name, sizeof(hdev->dev_name));
3372 		changed = true;
3373 	}
3374 
3375 	memset(&ev, 0, sizeof(ev));
3376 	memcpy(ev.name, name, HCI_MAX_NAME_LENGTH);
3377 	memcpy(ev.short_name, hdev->short_name, HCI_MAX_SHORT_NAME_LENGTH);
3378 
3379 	cmd = mgmt_pending_find(MGMT_OP_SET_LOCAL_NAME, hdev);
3380 	if (!cmd)
3381 		goto send_event;
3382 
3383 	/* Always assume that either the short or the complete name has
3384 	 * changed if there was a pending mgmt command */
3385 	changed = true;
3386 
3387 	if (status) {
3388 		err = cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_LOCAL_NAME,
3389 				 mgmt_status(status));
3390 		goto failed;
3391 	}
3392 
3393 	err = cmd_complete(cmd->sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, 0, &ev,
3394 			   sizeof(ev));
3395 	if (err < 0)
3396 		goto failed;
3397 
3398 send_event:
3399 	if (changed)
3400 		err = mgmt_event(MGMT_EV_LOCAL_NAME_CHANGED, hdev, &ev,
3401 				 sizeof(ev), cmd ? cmd->sk : NULL);
3402 
3403 	update_eir(hdev);
3404 
3405 failed:
3406 	if (cmd)
3407 		mgmt_pending_remove(cmd);
3408 	return err;
3409 }
3410 
mgmt_read_local_oob_data_reply_complete(struct hci_dev * hdev,u8 * hash,u8 * randomizer,u8 status)3411 int mgmt_read_local_oob_data_reply_complete(struct hci_dev *hdev, u8 *hash,
3412 					    u8 *randomizer, u8 status)
3413 {
3414 	struct pending_cmd *cmd;
3415 	int err;
3416 
3417 	BT_DBG("%s status %u", hdev->name, status);
3418 
3419 	cmd = mgmt_pending_find(MGMT_OP_READ_LOCAL_OOB_DATA, hdev);
3420 	if (!cmd)
3421 		return -ENOENT;
3422 
3423 	if (status) {
3424 		err = cmd_status(cmd->sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
3425 				 mgmt_status(status));
3426 	} else {
3427 		struct mgmt_rp_read_local_oob_data rp;
3428 
3429 		memcpy(rp.hash, hash, sizeof(rp.hash));
3430 		memcpy(rp.randomizer, randomizer, sizeof(rp.randomizer));
3431 
3432 		err = cmd_complete(cmd->sk, hdev->id,
3433 				   MGMT_OP_READ_LOCAL_OOB_DATA, 0, &rp,
3434 				   sizeof(rp));
3435 	}
3436 
3437 	mgmt_pending_remove(cmd);
3438 
3439 	return err;
3440 }
3441 
mgmt_le_enable_complete(struct hci_dev * hdev,u8 enable,u8 status)3442 int mgmt_le_enable_complete(struct hci_dev *hdev, u8 enable, u8 status)
3443 {
3444 	struct cmd_lookup match = { NULL, hdev };
3445 	bool changed = false;
3446 	int err = 0;
3447 
3448 	if (status) {
3449 		u8 mgmt_err = mgmt_status(status);
3450 
3451 		if (enable && test_and_clear_bit(HCI_LE_ENABLED,
3452 						 &hdev->dev_flags))
3453 		  err = new_settings(hdev, NULL);
3454 
3455 		mgmt_pending_foreach(MGMT_OP_SET_LE, hdev,
3456 				     cmd_status_rsp, &mgmt_err);
3457 
3458 		return err;
3459 	}
3460 
3461 	if (enable) {
3462 		if (!test_and_set_bit(HCI_LE_ENABLED, &hdev->dev_flags))
3463 			changed = true;
3464 	} else {
3465 		if (test_and_clear_bit(HCI_LE_ENABLED, &hdev->dev_flags))
3466 			changed = true;
3467 	}
3468 
3469 	mgmt_pending_foreach(MGMT_OP_SET_LE, hdev, settings_rsp, &match);
3470 
3471 	if (changed)
3472 		err = new_settings(hdev, match.sk);
3473 
3474 	if (match.sk)
3475 		sock_put(match.sk);
3476 
3477 	return err;
3478 }
3479 
mgmt_device_found(struct hci_dev * hdev,bdaddr_t * bdaddr,u8 link_type,u8 addr_type,u8 * dev_class,s8 rssi,u8 cfm_name,u8 ssp,u8 * eir,u16 eir_len)3480 int mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
3481 		      u8 addr_type, u8 *dev_class, s8 rssi, u8 cfm_name, u8
3482 		      ssp, u8 *eir, u16 eir_len)
3483 {
3484 	char buf[512];
3485 	struct mgmt_ev_device_found *ev = (void *) buf;
3486 	size_t ev_size;
3487 
3488 	/* Leave 5 bytes for a potential CoD field */
3489 	if (sizeof(*ev) + eir_len + 5 > sizeof(buf))
3490 		return -EINVAL;
3491 
3492 	memset(buf, 0, sizeof(buf));
3493 
3494 	bacpy(&ev->addr.bdaddr, bdaddr);
3495 	ev->addr.type = link_to_mgmt(link_type, addr_type);
3496 	ev->rssi = rssi;
3497 	if (cfm_name)
3498 		ev->flags[0] |= MGMT_DEV_FOUND_CONFIRM_NAME;
3499 	if (!ssp)
3500 		ev->flags[0] |= MGMT_DEV_FOUND_LEGACY_PAIRING;
3501 
3502 	if (eir_len > 0)
3503 		memcpy(ev->eir, eir, eir_len);
3504 
3505 	if (dev_class && !eir_has_data_type(ev->eir, eir_len, EIR_CLASS_OF_DEV))
3506 		eir_len = eir_append_data(ev->eir, eir_len, EIR_CLASS_OF_DEV,
3507 					  dev_class, 3);
3508 
3509 	put_unaligned_le16(eir_len, &ev->eir_len);
3510 
3511 	ev_size = sizeof(*ev) + eir_len;
3512 
3513 	return mgmt_event(MGMT_EV_DEVICE_FOUND, hdev, ev, ev_size, NULL);
3514 }
3515 
mgmt_remote_name(struct hci_dev * hdev,bdaddr_t * bdaddr,u8 link_type,u8 addr_type,s8 rssi,u8 * name,u8 name_len)3516 int mgmt_remote_name(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
3517 		     u8 addr_type, s8 rssi, u8 *name, u8 name_len)
3518 {
3519 	struct mgmt_ev_device_found *ev;
3520 	char buf[sizeof(*ev) + HCI_MAX_NAME_LENGTH + 2];
3521 	u16 eir_len;
3522 
3523 	ev = (struct mgmt_ev_device_found *) buf;
3524 
3525 	memset(buf, 0, sizeof(buf));
3526 
3527 	bacpy(&ev->addr.bdaddr, bdaddr);
3528 	ev->addr.type = link_to_mgmt(link_type, addr_type);
3529 	ev->rssi = rssi;
3530 
3531 	eir_len = eir_append_data(ev->eir, 0, EIR_NAME_COMPLETE, name,
3532 				  name_len);
3533 
3534 	put_unaligned_le16(eir_len, &ev->eir_len);
3535 
3536 	return mgmt_event(MGMT_EV_DEVICE_FOUND, hdev, ev,
3537 			  sizeof(*ev) + eir_len, NULL);
3538 }
3539 
mgmt_start_discovery_failed(struct hci_dev * hdev,u8 status)3540 int mgmt_start_discovery_failed(struct hci_dev *hdev, u8 status)
3541 {
3542 	struct pending_cmd *cmd;
3543 	u8 type;
3544 	int err;
3545 
3546 	hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
3547 
3548 	cmd = mgmt_pending_find(MGMT_OP_START_DISCOVERY, hdev);
3549 	if (!cmd)
3550 		return -ENOENT;
3551 
3552 	type = hdev->discovery.type;
3553 
3554 	err = cmd_complete(cmd->sk, hdev->id, cmd->opcode, mgmt_status(status),
3555 			   &type, sizeof(type));
3556 	mgmt_pending_remove(cmd);
3557 
3558 	return err;
3559 }
3560 
mgmt_stop_discovery_failed(struct hci_dev * hdev,u8 status)3561 int mgmt_stop_discovery_failed(struct hci_dev *hdev, u8 status)
3562 {
3563 	struct pending_cmd *cmd;
3564 	int err;
3565 
3566 	cmd = mgmt_pending_find(MGMT_OP_STOP_DISCOVERY, hdev);
3567 	if (!cmd)
3568 		return -ENOENT;
3569 
3570 	err = cmd_complete(cmd->sk, hdev->id, cmd->opcode, mgmt_status(status),
3571 			   &hdev->discovery.type, sizeof(hdev->discovery.type));
3572 	mgmt_pending_remove(cmd);
3573 
3574 	return err;
3575 }
3576 
mgmt_discovering(struct hci_dev * hdev,u8 discovering)3577 int mgmt_discovering(struct hci_dev *hdev, u8 discovering)
3578 {
3579 	struct mgmt_ev_discovering ev;
3580 	struct pending_cmd *cmd;
3581 
3582 	BT_DBG("%s discovering %u", hdev->name, discovering);
3583 
3584 	if (discovering)
3585 		cmd = mgmt_pending_find(MGMT_OP_START_DISCOVERY, hdev);
3586 	else
3587 		cmd = mgmt_pending_find(MGMT_OP_STOP_DISCOVERY, hdev);
3588 
3589 	if (cmd != NULL) {
3590 		u8 type = hdev->discovery.type;
3591 
3592 		cmd_complete(cmd->sk, hdev->id, cmd->opcode, 0, &type,
3593 			     sizeof(type));
3594 		mgmt_pending_remove(cmd);
3595 	}
3596 
3597 	memset(&ev, 0, sizeof(ev));
3598 	ev.type = hdev->discovery.type;
3599 	ev.discovering = discovering;
3600 
3601 	return mgmt_event(MGMT_EV_DISCOVERING, hdev, &ev, sizeof(ev), NULL);
3602 }
3603 
mgmt_device_blocked(struct hci_dev * hdev,bdaddr_t * bdaddr,u8 type)3604 int mgmt_device_blocked(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type)
3605 {
3606 	struct pending_cmd *cmd;
3607 	struct mgmt_ev_device_blocked ev;
3608 
3609 	cmd = mgmt_pending_find(MGMT_OP_BLOCK_DEVICE, hdev);
3610 
3611 	bacpy(&ev.addr.bdaddr, bdaddr);
3612 	ev.addr.type = type;
3613 
3614 	return mgmt_event(MGMT_EV_DEVICE_BLOCKED, hdev, &ev, sizeof(ev),
3615 			  cmd ? cmd->sk : NULL);
3616 }
3617 
mgmt_device_unblocked(struct hci_dev * hdev,bdaddr_t * bdaddr,u8 type)3618 int mgmt_device_unblocked(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type)
3619 {
3620 	struct pending_cmd *cmd;
3621 	struct mgmt_ev_device_unblocked ev;
3622 
3623 	cmd = mgmt_pending_find(MGMT_OP_UNBLOCK_DEVICE, hdev);
3624 
3625 	bacpy(&ev.addr.bdaddr, bdaddr);
3626 	ev.addr.type = type;
3627 
3628 	return mgmt_event(MGMT_EV_DEVICE_UNBLOCKED, hdev, &ev, sizeof(ev),
3629 			  cmd ? cmd->sk : NULL);
3630 }
3631 
3632 module_param(enable_hs, bool, 0644);
3633 MODULE_PARM_DESC(enable_hs, "Enable High Speed support");
3634 
3635 module_param(enable_le, bool, 0644);
3636 MODULE_PARM_DESC(enable_le, "Enable Low Energy support");
3637