1 /*
2  * Copyright (c) 2017-2021 Nordic Semiconductor ASA
3  * Copyright (c) 2015-2016 Intel Corporation
4  *
5  * SPDX-License-Identifier: Apache-2.0
6  */
7 
8 #include <zephyr/sys/byteorder.h>
9 
10 #include <zephyr/bluetooth/bluetooth.h>
11 #include <zephyr/bluetooth/hci.h>
12 #include <zephyr/bluetooth/buf.h>
13 
14 #include "common/bt_str.h"
15 
16 #include "host/hci_core.h"
17 #include "host/conn_internal.h"
18 #include "host/keys.h"
19 #include "sco_internal.h"
20 
21 #define LOG_LEVEL CONFIG_BT_HCI_CORE_LOG_LEVEL
22 #include <zephyr/logging/log.h>
23 LOG_MODULE_REGISTER(bt_br);
24 
25 #define RSSI_INVALID 127
26 
27 struct bt_br_discovery_result *discovery_results;
28 static size_t discovery_results_size;
29 static size_t discovery_results_count;
30 static sys_slist_t discovery_cbs = SYS_SLIST_STATIC_INIT(&discovery_cbs);
31 
reject_conn(const bt_addr_t * bdaddr,uint8_t reason)32 static int reject_conn(const bt_addr_t *bdaddr, uint8_t reason)
33 {
34 	struct bt_hci_cp_reject_conn_req *cp;
35 	struct net_buf *buf;
36 	int err;
37 
38 	buf = bt_hci_cmd_create(BT_HCI_OP_REJECT_CONN_REQ, sizeof(*cp));
39 	if (!buf) {
40 		return -ENOBUFS;
41 	}
42 
43 	cp = net_buf_add(buf, sizeof(*cp));
44 	bt_addr_copy(&cp->bdaddr, bdaddr);
45 	cp->reason = reason;
46 
47 	err = bt_hci_cmd_send_sync(BT_HCI_OP_REJECT_CONN_REQ, buf, NULL);
48 	if (err) {
49 		return err;
50 	}
51 
52 	return 0;
53 }
54 
accept_conn(const bt_addr_t * bdaddr)55 static int accept_conn(const bt_addr_t *bdaddr)
56 {
57 	struct bt_hci_cp_accept_conn_req *cp;
58 	struct net_buf *buf;
59 	int err;
60 
61 	buf = bt_hci_cmd_create(BT_HCI_OP_ACCEPT_CONN_REQ, sizeof(*cp));
62 	if (!buf) {
63 		return -ENOBUFS;
64 	}
65 
66 	cp = net_buf_add(buf, sizeof(*cp));
67 	bt_addr_copy(&cp->bdaddr, bdaddr);
68 	cp->role = BT_HCI_ROLE_PERIPHERAL;
69 
70 	err = bt_hci_cmd_send_sync(BT_HCI_OP_ACCEPT_CONN_REQ, buf, NULL);
71 	if (err) {
72 		return err;
73 	}
74 
75 	return 0;
76 }
77 
bt_hci_conn_req(struct net_buf * buf)78 void bt_hci_conn_req(struct net_buf *buf)
79 {
80 	struct bt_hci_evt_conn_request *evt = (void *)buf->data;
81 	struct bt_conn *conn;
82 
83 	LOG_DBG("conn req from %s, type 0x%02x", bt_addr_str(&evt->bdaddr), evt->link_type);
84 
85 	if (evt->link_type != BT_HCI_ACL) {
86 		uint8_t err;
87 
88 		err = bt_esco_conn_req(evt);
89 		if (err != BT_HCI_ERR_SUCCESS) {
90 			reject_conn(&evt->bdaddr, err);
91 		}
92 		return;
93 	}
94 
95 	conn = bt_conn_add_br(&evt->bdaddr);
96 	if (!conn) {
97 		reject_conn(&evt->bdaddr, BT_HCI_ERR_INSUFFICIENT_RESOURCES);
98 		return;
99 	}
100 
101 	accept_conn(&evt->bdaddr);
102 	conn->role = BT_HCI_ROLE_PERIPHERAL;
103 	bt_conn_set_state(conn, BT_CONN_INITIATING);
104 	bt_conn_unref(conn);
105 }
106 
br_sufficient_key_size(struct bt_conn * conn)107 static bool br_sufficient_key_size(struct bt_conn *conn)
108 {
109 	struct bt_hci_cp_read_encryption_key_size *cp;
110 	struct bt_hci_rp_read_encryption_key_size *rp;
111 	struct net_buf *buf, *rsp;
112 	uint8_t key_size;
113 	int err;
114 
115 	buf = bt_hci_cmd_create(BT_HCI_OP_READ_ENCRYPTION_KEY_SIZE, sizeof(*cp));
116 	if (!buf) {
117 		LOG_ERR("Failed to allocate command buffer");
118 		return false;
119 	}
120 
121 	cp = net_buf_add(buf, sizeof(*cp));
122 	cp->handle = sys_cpu_to_le16(conn->handle);
123 
124 	err = bt_hci_cmd_send_sync(BT_HCI_OP_READ_ENCRYPTION_KEY_SIZE, buf, &rsp);
125 	if (err) {
126 		LOG_ERR("Failed to read encryption key size (err %d)", err);
127 		return false;
128 	}
129 
130 	if (rsp->len < sizeof(*rp)) {
131 		LOG_ERR("Too small command complete for encryption key size");
132 		net_buf_unref(rsp);
133 		return false;
134 	}
135 
136 	rp = (void *)rsp->data;
137 	key_size = rp->key_size;
138 	net_buf_unref(rsp);
139 
140 	LOG_DBG("Encryption key size is %u", key_size);
141 
142 	if (conn->sec_level == BT_SECURITY_L4) {
143 		return key_size == BT_HCI_ENCRYPTION_KEY_SIZE_MAX;
144 	}
145 
146 	return key_size >= CONFIG_BT_BR_MIN_ENC_KEY_SIZE;
147 }
148 
bt_br_update_sec_level(struct bt_conn * conn)149 bool bt_br_update_sec_level(struct bt_conn *conn)
150 {
151 	if (!conn->encrypt) {
152 		conn->sec_level = BT_SECURITY_L1;
153 		return true;
154 	}
155 
156 	if (conn->br.link_key) {
157 		if (conn->br.link_key->flags & BT_LINK_KEY_AUTHENTICATED) {
158 			if (conn->encrypt == BT_HCI_ENCRYPTION_ON_BR_AES_CCM) {
159 				conn->sec_level = BT_SECURITY_L4;
160 			} else {
161 				conn->sec_level = BT_SECURITY_L3;
162 			}
163 		} else {
164 			conn->sec_level = BT_SECURITY_L2;
165 		}
166 	} else {
167 		LOG_WRN("No BR/EDR link key found");
168 		conn->sec_level = BT_SECURITY_L2;
169 	}
170 
171 	if (!br_sufficient_key_size(conn)) {
172 		LOG_ERR("Encryption key size is not sufficient");
173 		bt_conn_disconnect(conn, BT_HCI_ERR_AUTH_FAIL);
174 		return false;
175 	}
176 
177 	if (conn->required_sec_level > conn->sec_level) {
178 		LOG_ERR("Failed to set required security level");
179 		bt_conn_disconnect(conn, BT_HCI_ERR_AUTH_FAIL);
180 		return false;
181 	}
182 
183 	return true;
184 }
185 
bt_hci_synchronous_conn_complete(struct net_buf * buf)186 void bt_hci_synchronous_conn_complete(struct net_buf *buf)
187 {
188 	struct bt_hci_evt_sync_conn_complete *evt = (void *)buf->data;
189 	struct bt_conn *sco_conn;
190 	uint16_t handle = sys_le16_to_cpu(evt->handle);
191 
192 	LOG_DBG("status 0x%02x, handle %u, type 0x%02x", evt->status, handle, evt->link_type);
193 
194 	sco_conn = bt_conn_lookup_addr_sco(&evt->bdaddr);
195 	if (!sco_conn) {
196 		LOG_ERR("Unable to find conn for %s", bt_addr_str(&evt->bdaddr));
197 		return;
198 	}
199 
200 	if (evt->status) {
201 		sco_conn->err = evt->status;
202 		bt_conn_set_state(sco_conn, BT_CONN_DISCONNECTED);
203 		bt_conn_unref(sco_conn);
204 		return;
205 	}
206 
207 	sco_conn->handle = handle;
208 	bt_conn_set_state(sco_conn, BT_CONN_CONNECTED);
209 	bt_conn_unref(sco_conn);
210 }
211 
bt_hci_conn_complete(struct net_buf * buf)212 void bt_hci_conn_complete(struct net_buf *buf)
213 {
214 	struct bt_hci_evt_conn_complete *evt = (void *)buf->data;
215 	struct bt_conn *conn;
216 	struct bt_hci_cp_read_remote_features *cp;
217 	uint16_t handle = sys_le16_to_cpu(evt->handle);
218 
219 	LOG_DBG("status 0x%02x, handle %u, type 0x%02x", evt->status, handle, evt->link_type);
220 
221 	conn = bt_conn_lookup_addr_br(&evt->bdaddr);
222 	if (!conn) {
223 		LOG_ERR("Unable to find conn for %s", bt_addr_str(&evt->bdaddr));
224 		return;
225 	}
226 
227 	if (evt->status) {
228 		conn->err = evt->status;
229 		bt_conn_set_state(conn, BT_CONN_DISCONNECTED);
230 		bt_conn_unref(conn);
231 		return;
232 	}
233 
234 	conn->handle = handle;
235 	conn->err = 0U;
236 	conn->encrypt = evt->encr_enabled;
237 
238 	if (!bt_br_update_sec_level(conn)) {
239 		bt_conn_unref(conn);
240 		return;
241 	}
242 
243 	bt_conn_set_state(conn, BT_CONN_CONNECTED);
244 
245 	atomic_set_bit_to(conn->flags, BT_CONN_BR_BONDABLE, bt_get_bondable());
246 
247 	bt_conn_connected(conn);
248 
249 	bt_conn_unref(conn);
250 
251 	buf = bt_hci_cmd_create(BT_HCI_OP_READ_REMOTE_FEATURES, sizeof(*cp));
252 	if (!buf) {
253 		return;
254 	}
255 
256 	cp = net_buf_add(buf, sizeof(*cp));
257 	cp->handle = evt->handle;
258 
259 	bt_hci_cmd_send_sync(BT_HCI_OP_READ_REMOTE_FEATURES, buf, NULL);
260 }
261 
request_name(const bt_addr_t * addr,uint8_t pscan,uint16_t offset)262 static int request_name(const bt_addr_t *addr, uint8_t pscan, uint16_t offset)
263 {
264 	struct bt_hci_cp_remote_name_request *cp;
265 	struct net_buf *buf;
266 
267 	buf = bt_hci_cmd_create(BT_HCI_OP_REMOTE_NAME_REQUEST, sizeof(*cp));
268 	if (!buf) {
269 		return -ENOBUFS;
270 	}
271 
272 	cp = net_buf_add(buf, sizeof(*cp));
273 
274 	bt_addr_copy(&cp->bdaddr, addr);
275 	cp->pscan_rep_mode = pscan;
276 	cp->reserved = 0x00; /* reserved, should be set to 0x00 */
277 	cp->clock_offset = offset;
278 
279 	return bt_hci_cmd_send_sync(BT_HCI_OP_REMOTE_NAME_REQUEST, buf, NULL);
280 }
281 
282 #define EIR_SHORT_NAME    0x08
283 #define EIR_COMPLETE_NAME 0x09
284 
eir_has_name(const uint8_t * eir)285 static bool eir_has_name(const uint8_t *eir)
286 {
287 	int len = 240;
288 
289 	while (len) {
290 		if (len < 2) {
291 			break;
292 		}
293 
294 		/* Look for early termination */
295 		if (!eir[0]) {
296 			break;
297 		}
298 
299 		/* Check if field length is correct */
300 		if (eir[0] > len - 1) {
301 			break;
302 		}
303 
304 		switch (eir[1]) {
305 		case EIR_SHORT_NAME:
306 		case EIR_COMPLETE_NAME:
307 			if (eir[0] > 1) {
308 				return true;
309 			}
310 			break;
311 		default:
312 			break;
313 		}
314 
315 		/* Parse next AD Structure */
316 		len -= eir[0] + 1;
317 		eir += eir[0] + 1;
318 	}
319 
320 	return false;
321 }
322 
bt_br_discovery_reset(void)323 void bt_br_discovery_reset(void)
324 {
325 	discovery_results = NULL;
326 	discovery_results_size = 0;
327 	discovery_results_count = 0;
328 }
329 
report_discovery_results(void)330 static void report_discovery_results(void)
331 {
332 	bool resolving_names = false;
333 	int i;
334 	struct bt_br_discovery_cb *listener, *next;
335 
336 	for (i = 0; i < discovery_results_count; i++) {
337 		struct bt_br_discovery_priv *priv;
338 
339 		priv = &discovery_results[i]._priv;
340 
341 		if (eir_has_name(discovery_results[i].eir)) {
342 			continue;
343 		}
344 
345 		if (request_name(&discovery_results[i].addr, priv->pscan_rep_mode,
346 				 priv->clock_offset)) {
347 			continue;
348 		}
349 
350 		priv->resolving = true;
351 		resolving_names = true;
352 	}
353 
354 	if (resolving_names) {
355 		return;
356 	}
357 
358 	atomic_clear_bit(bt_dev.flags, BT_DEV_INQUIRY);
359 
360 	SYS_SLIST_FOR_EACH_CONTAINER_SAFE(&discovery_cbs, listener, next, node) {
361 		if (listener->timeout) {
362 			listener->timeout(discovery_results, discovery_results_count);
363 		}
364 	}
365 
366 	bt_br_discovery_reset();
367 }
368 
bt_hci_inquiry_complete(struct net_buf * buf)369 void bt_hci_inquiry_complete(struct net_buf *buf)
370 {
371 	struct bt_hci_evt_inquiry_complete *evt = (void *)buf->data;
372 
373 	if (evt->status) {
374 		LOG_ERR("Failed to complete inquiry");
375 	}
376 
377 	report_discovery_results();
378 }
379 
get_result_slot(const bt_addr_t * addr,int8_t rssi)380 static struct bt_br_discovery_result *get_result_slot(const bt_addr_t *addr, int8_t rssi)
381 {
382 	struct bt_br_discovery_result *result = NULL;
383 	size_t i;
384 
385 	/* check if already present in results */
386 	for (i = 0; i < discovery_results_count; i++) {
387 		if (bt_addr_eq(addr, &discovery_results[i].addr)) {
388 			return &discovery_results[i];
389 		}
390 	}
391 
392 	/* Pick a new slot (if available) */
393 	if (discovery_results_count < discovery_results_size) {
394 		bt_addr_copy(&discovery_results[discovery_results_count].addr, addr);
395 		return &discovery_results[discovery_results_count++];
396 	}
397 
398 	/* ignore if invalid RSSI */
399 	if (rssi == RSSI_INVALID) {
400 		return NULL;
401 	}
402 
403 	/*
404 	 * Pick slot with smallest RSSI that is smaller then passed RSSI
405 	 * TODO handle TX if present
406 	 */
407 	for (i = 0; i < discovery_results_size; i++) {
408 		if (discovery_results[i].rssi > rssi) {
409 			continue;
410 		}
411 
412 		if (!result || result->rssi > discovery_results[i].rssi) {
413 			result = &discovery_results[i];
414 		}
415 	}
416 
417 	if (result) {
418 		LOG_DBG("Reusing slot (old %s rssi %d dBm)", bt_addr_str(&result->addr),
419 			result->rssi);
420 
421 		bt_addr_copy(&result->addr, addr);
422 	}
423 
424 	return result;
425 }
426 
bt_hci_inquiry_result_with_rssi(struct net_buf * buf)427 void bt_hci_inquiry_result_with_rssi(struct net_buf *buf)
428 {
429 	uint8_t num_reports = net_buf_pull_u8(buf);
430 
431 	if (!atomic_test_bit(bt_dev.flags, BT_DEV_INQUIRY)) {
432 		return;
433 	}
434 
435 	LOG_DBG("number of results: %u", num_reports);
436 
437 	while (num_reports--) {
438 		struct bt_hci_evt_inquiry_result_with_rssi *evt;
439 		struct bt_br_discovery_result *result;
440 		struct bt_br_discovery_priv *priv;
441 		struct bt_br_discovery_cb *listener, *next;
442 
443 		if (buf->len < sizeof(*evt)) {
444 			LOG_ERR("Unexpected end to buffer");
445 			return;
446 		}
447 
448 		evt = net_buf_pull_mem(buf, sizeof(*evt));
449 		LOG_DBG("%s rssi %d dBm", bt_addr_str(&evt->addr), evt->rssi);
450 
451 		result = get_result_slot(&evt->addr, evt->rssi);
452 		if (!result) {
453 			return;
454 		}
455 
456 		priv = &result->_priv;
457 		priv->pscan_rep_mode = evt->pscan_rep_mode;
458 		priv->clock_offset = evt->clock_offset;
459 
460 		memcpy(result->cod, evt->cod, 3);
461 		result->rssi = evt->rssi;
462 
463 		/* we could reuse slot so make sure EIR is cleared */
464 		(void)memset(result->eir, 0, sizeof(result->eir));
465 
466 		SYS_SLIST_FOR_EACH_CONTAINER_SAFE(&discovery_cbs, listener, next, node) {
467 			if (listener->recv) {
468 				listener->recv(result);
469 			}
470 		}
471 	}
472 }
473 
bt_hci_extended_inquiry_result(struct net_buf * buf)474 void bt_hci_extended_inquiry_result(struct net_buf *buf)
475 {
476 	struct bt_hci_evt_extended_inquiry_result *evt = (void *)buf->data;
477 	struct bt_br_discovery_result *result;
478 	struct bt_br_discovery_priv *priv;
479 	struct bt_br_discovery_cb *listener, *next;
480 
481 	if (!atomic_test_bit(bt_dev.flags, BT_DEV_INQUIRY)) {
482 		return;
483 	}
484 
485 	LOG_DBG("%s rssi %d dBm", bt_addr_str(&evt->addr), evt->rssi);
486 
487 	result = get_result_slot(&evt->addr, evt->rssi);
488 	if (!result) {
489 		return;
490 	}
491 
492 	priv = &result->_priv;
493 	priv->pscan_rep_mode = evt->pscan_rep_mode;
494 	priv->clock_offset = evt->clock_offset;
495 
496 	result->rssi = evt->rssi;
497 	memcpy(result->cod, evt->cod, 3);
498 	memcpy(result->eir, evt->eir, sizeof(result->eir));
499 
500 	SYS_SLIST_FOR_EACH_CONTAINER_SAFE(&discovery_cbs, listener, next, node) {
501 		if (listener->recv) {
502 			listener->recv(result);
503 		}
504 	}
505 }
506 
bt_hci_remote_name_request_complete(struct net_buf * buf)507 void bt_hci_remote_name_request_complete(struct net_buf *buf)
508 {
509 	struct bt_hci_evt_remote_name_req_complete *evt = (void *)buf->data;
510 	struct bt_br_discovery_result *result;
511 	struct bt_br_discovery_priv *priv;
512 	int eir_len = 240;
513 	uint8_t *eir;
514 	int i;
515 	struct bt_br_discovery_cb *listener, *next;
516 
517 	result = get_result_slot(&evt->bdaddr, RSSI_INVALID);
518 	if (!result) {
519 		return;
520 	}
521 
522 	priv = &result->_priv;
523 	priv->resolving = false;
524 
525 	if (evt->status) {
526 		goto check_names;
527 	}
528 
529 	eir = result->eir;
530 
531 	while (eir_len) {
532 		if (eir_len < 2) {
533 			break;
534 		}
535 
536 		/* Look for early termination */
537 		if (!eir[0]) {
538 			size_t name_len;
539 
540 			eir_len -= 2;
541 
542 			/* name is null terminated */
543 			name_len = strlen((const char *)evt->name);
544 
545 			if (name_len > eir_len) {
546 				eir[0] = eir_len + 1;
547 				eir[1] = EIR_SHORT_NAME;
548 			} else {
549 				eir[0] = name_len + 1;
550 				eir[1] = EIR_SHORT_NAME;
551 			}
552 
553 			memcpy(&eir[2], evt->name, eir[0] - 1);
554 
555 			break;
556 		}
557 
558 		/* Check if field length is correct */
559 		if (eir[0] > eir_len - 1) {
560 			break;
561 		}
562 
563 		/* next EIR Structure */
564 		eir_len -= eir[0] + 1;
565 		eir += eir[0] + 1;
566 	}
567 
568 	SYS_SLIST_FOR_EACH_CONTAINER_SAFE(&discovery_cbs, listener, next, node) {
569 		if (listener->recv) {
570 			listener->recv(result);
571 		}
572 	}
573 
574 check_names:
575 	/* if still waiting for names */
576 	for (i = 0; i < discovery_results_count; i++) {
577 		struct bt_br_discovery_priv *dpriv;
578 
579 		dpriv = &discovery_results[i]._priv;
580 
581 		if (dpriv->resolving) {
582 			return;
583 		}
584 	}
585 
586 	/* all names resolved, report discovery results */
587 	atomic_clear_bit(bt_dev.flags, BT_DEV_INQUIRY);
588 
589 	SYS_SLIST_FOR_EACH_CONTAINER_SAFE(&discovery_cbs, listener, next, node) {
590 		if (listener->timeout) {
591 			listener->timeout(discovery_results, discovery_results_count);
592 		}
593 	}
594 }
595 
bt_hci_read_remote_features_complete(struct net_buf * buf)596 void bt_hci_read_remote_features_complete(struct net_buf *buf)
597 {
598 	struct bt_hci_evt_remote_features *evt = (void *)buf->data;
599 	uint16_t handle = sys_le16_to_cpu(evt->handle);
600 	struct bt_hci_cp_read_remote_ext_features *cp;
601 	struct bt_conn *conn;
602 
603 	LOG_DBG("status 0x%02x handle %u", evt->status, handle);
604 
605 	conn = bt_conn_lookup_handle(handle, BT_CONN_TYPE_BR);
606 	if (!conn) {
607 		LOG_ERR("Can't find conn for handle %u", handle);
608 		return;
609 	}
610 
611 	if (evt->status) {
612 		goto done;
613 	}
614 
615 	memcpy(conn->br.features[0], evt->features, sizeof(evt->features));
616 
617 	if (!BT_FEAT_EXT_FEATURES(conn->br.features)) {
618 		goto done;
619 	}
620 
621 	buf = bt_hci_cmd_create(BT_HCI_OP_READ_REMOTE_EXT_FEATURES, sizeof(*cp));
622 	if (!buf) {
623 		goto done;
624 	}
625 
626 	/* Read remote host features (page 1) */
627 	cp = net_buf_add(buf, sizeof(*cp));
628 	cp->handle = evt->handle;
629 	cp->page = 0x01;
630 
631 	bt_hci_cmd_send_sync(BT_HCI_OP_READ_REMOTE_EXT_FEATURES, buf, NULL);
632 
633 done:
634 	bt_conn_unref(conn);
635 }
636 
bt_hci_read_remote_ext_features_complete(struct net_buf * buf)637 void bt_hci_read_remote_ext_features_complete(struct net_buf *buf)
638 {
639 	struct bt_hci_evt_remote_ext_features *evt = (void *)buf->data;
640 	uint16_t handle = sys_le16_to_cpu(evt->handle);
641 	struct bt_conn *conn;
642 
643 	LOG_DBG("status 0x%02x handle %u", evt->status, handle);
644 
645 	conn = bt_conn_lookup_handle(handle, BT_CONN_TYPE_BR);
646 	if (!conn) {
647 		LOG_ERR("Can't find conn for handle %u", handle);
648 		return;
649 	}
650 
651 	if (!evt->status && evt->page == 0x01) {
652 		memcpy(conn->br.features[1], evt->features, sizeof(conn->br.features[1]));
653 	}
654 
655 	bt_conn_unref(conn);
656 }
657 
bt_hci_role_change(struct net_buf * buf)658 void bt_hci_role_change(struct net_buf *buf)
659 {
660 	struct bt_hci_evt_role_change *evt = (void *)buf->data;
661 	struct bt_conn *conn;
662 
663 	LOG_DBG("status 0x%02x role %u addr %s", evt->status, evt->role, bt_addr_str(&evt->bdaddr));
664 
665 	if (evt->status) {
666 		return;
667 	}
668 
669 	conn = bt_conn_lookup_addr_br(&evt->bdaddr);
670 	if (!conn) {
671 		LOG_ERR("Can't find conn for %s", bt_addr_str(&evt->bdaddr));
672 		return;
673 	}
674 
675 	if (evt->role) {
676 		conn->role = BT_CONN_ROLE_PERIPHERAL;
677 	} else {
678 		conn->role = BT_CONN_ROLE_CENTRAL;
679 	}
680 
681 	bt_conn_unref(conn);
682 }
683 
read_ext_features(void)684 static int read_ext_features(void)
685 {
686 	int i;
687 
688 	/* Read Local Supported Extended Features */
689 	for (i = 1; i < LMP_FEAT_PAGES_COUNT; i++) {
690 		struct bt_hci_cp_read_local_ext_features *cp;
691 		struct bt_hci_rp_read_local_ext_features *rp;
692 		struct net_buf *buf, *rsp;
693 		int err;
694 
695 		buf = bt_hci_cmd_create(BT_HCI_OP_READ_LOCAL_EXT_FEATURES, sizeof(*cp));
696 		if (!buf) {
697 			return -ENOBUFS;
698 		}
699 
700 		cp = net_buf_add(buf, sizeof(*cp));
701 		cp->page = i;
702 
703 		err = bt_hci_cmd_send_sync(BT_HCI_OP_READ_LOCAL_EXT_FEATURES, buf, &rsp);
704 		if (err) {
705 			return err;
706 		}
707 
708 		rp = (void *)rsp->data;
709 
710 		memcpy(&bt_dev.features[i], rp->ext_features, sizeof(bt_dev.features[i]));
711 
712 		if (rp->max_page <= i) {
713 			net_buf_unref(rsp);
714 			break;
715 		}
716 
717 		net_buf_unref(rsp);
718 	}
719 
720 	return 0;
721 }
722 
device_supported_pkt_type(void)723 void device_supported_pkt_type(void)
724 {
725 	/* Device supported features and sco packet types */
726 	if (BT_FEAT_LMP_SCO_CAPABLE(bt_dev.features)) {
727 		bt_dev.br.esco_pkt_type |= (HCI_PKT_TYPE_SCO_HV1);
728 	}
729 
730 	if (BT_FEAT_HV2_PKT(bt_dev.features)) {
731 		bt_dev.br.esco_pkt_type |= (HCI_PKT_TYPE_SCO_HV2);
732 	}
733 
734 	if (BT_FEAT_HV3_PKT(bt_dev.features)) {
735 		bt_dev.br.esco_pkt_type |= (HCI_PKT_TYPE_SCO_HV3);
736 	}
737 
738 	if (BT_FEAT_LMP_ESCO_CAPABLE(bt_dev.features)) {
739 		bt_dev.br.esco_pkt_type |= (HCI_PKT_TYPE_ESCO_EV3);
740 	}
741 
742 	if (BT_FEAT_EV4_PKT(bt_dev.features)) {
743 		bt_dev.br.esco_pkt_type |= (HCI_PKT_TYPE_ESCO_EV4);
744 	}
745 
746 	if (BT_FEAT_EV5_PKT(bt_dev.features)) {
747 		bt_dev.br.esco_pkt_type |= (HCI_PKT_TYPE_ESCO_EV5);
748 	}
749 
750 	if (BT_FEAT_2EV3_PKT(bt_dev.features)) {
751 		bt_dev.br.esco_pkt_type |= (HCI_PKT_TYPE_ESCO_2EV3);
752 	}
753 
754 	if (BT_FEAT_3EV3_PKT(bt_dev.features)) {
755 		bt_dev.br.esco_pkt_type |= (HCI_PKT_TYPE_ESCO_3EV3);
756 	}
757 
758 	if (BT_FEAT_3SLOT_PKT(bt_dev.features)) {
759 		bt_dev.br.esco_pkt_type |= (HCI_PKT_TYPE_ESCO_2EV5 | HCI_PKT_TYPE_ESCO_3EV5);
760 	}
761 }
762 
read_buffer_size_complete(struct net_buf * buf)763 static void read_buffer_size_complete(struct net_buf *buf)
764 {
765 	struct bt_hci_rp_read_buffer_size *rp = (void *)buf->data;
766 	uint16_t pkts;
767 
768 	LOG_DBG("status 0x%02x", rp->status);
769 
770 	bt_dev.br.mtu = sys_le16_to_cpu(rp->acl_max_len);
771 	pkts = sys_le16_to_cpu(rp->acl_max_num);
772 
773 	LOG_DBG("ACL BR/EDR buffers: pkts %u mtu %u", pkts, bt_dev.br.mtu);
774 
775 	k_sem_init(&bt_dev.br.pkts, pkts, pkts);
776 }
777 
bt_br_init(void)778 int bt_br_init(void)
779 {
780 	struct net_buf *buf;
781 	struct bt_hci_cp_write_ssp_mode *ssp_cp;
782 	struct bt_hci_cp_write_inquiry_mode *inq_cp;
783 	struct bt_hci_write_local_name *name_cp;
784 	struct bt_hci_cp_write_class_of_device *cod;
785 	int err;
786 
787 	/* Read extended local features */
788 	if (BT_FEAT_EXT_FEATURES(bt_dev.features)) {
789 		err = read_ext_features();
790 		if (err) {
791 			return err;
792 		}
793 	}
794 
795 	/* Add local supported packet types to bt_dev */
796 	device_supported_pkt_type();
797 
798 	/* Get BR/EDR buffer size */
799 	err = bt_hci_cmd_send_sync(BT_HCI_OP_READ_BUFFER_SIZE, NULL, &buf);
800 	if (err) {
801 		return err;
802 	}
803 
804 	read_buffer_size_complete(buf);
805 	net_buf_unref(buf);
806 
807 	/* Set SSP mode */
808 	buf = bt_hci_cmd_create(BT_HCI_OP_WRITE_SSP_MODE, sizeof(*ssp_cp));
809 	if (!buf) {
810 		return -ENOBUFS;
811 	}
812 
813 	ssp_cp = net_buf_add(buf, sizeof(*ssp_cp));
814 	ssp_cp->mode = 0x01;
815 	err = bt_hci_cmd_send_sync(BT_HCI_OP_WRITE_SSP_MODE, buf, NULL);
816 	if (err) {
817 		return err;
818 	}
819 
820 	/* Enable Inquiry results with RSSI or extended Inquiry */
821 	buf = bt_hci_cmd_create(BT_HCI_OP_WRITE_INQUIRY_MODE, sizeof(*inq_cp));
822 	if (!buf) {
823 		return -ENOBUFS;
824 	}
825 
826 	inq_cp = net_buf_add(buf, sizeof(*inq_cp));
827 	inq_cp->mode = 0x02;
828 	err = bt_hci_cmd_send_sync(BT_HCI_OP_WRITE_INQUIRY_MODE, buf, NULL);
829 	if (err) {
830 		return err;
831 	}
832 
833 	/* Set local name */
834 	buf = bt_hci_cmd_create(BT_HCI_OP_WRITE_LOCAL_NAME, sizeof(*name_cp));
835 	if (!buf) {
836 		return -ENOBUFS;
837 	}
838 
839 	name_cp = net_buf_add(buf, sizeof(*name_cp));
840 	strncpy((char *)name_cp->local_name, CONFIG_BT_DEVICE_NAME, sizeof(name_cp->local_name));
841 
842 	err = bt_hci_cmd_send_sync(BT_HCI_OP_WRITE_LOCAL_NAME, buf, NULL);
843 	if (err) {
844 		return err;
845 	}
846 
847 	/* Set Class of device */
848 	buf = bt_hci_cmd_create(BT_HCI_OP_WRITE_CLASS_OF_DEVICE, sizeof(*cod));
849 	if (!buf) {
850 		return -ENOBUFS;
851 	}
852 
853 	net_buf_add_le24(buf, CONFIG_BT_COD);
854 
855 	err = bt_hci_cmd_send_sync(BT_HCI_OP_WRITE_CLASS_OF_DEVICE, buf, NULL);
856 	if (err) {
857 		return err;
858 	}
859 
860 	/* Set page timeout*/
861 	buf = bt_hci_cmd_create(BT_HCI_OP_WRITE_PAGE_TIMEOUT, sizeof(uint16_t));
862 	if (!buf) {
863 		return -ENOBUFS;
864 	}
865 
866 	net_buf_add_le16(buf, CONFIG_BT_PAGE_TIMEOUT);
867 
868 	err = bt_hci_cmd_send_sync(BT_HCI_OP_WRITE_PAGE_TIMEOUT, buf, NULL);
869 	if (err) {
870 		return err;
871 	}
872 
873 	/* Enable BR/EDR SC if supported */
874 	if (BT_FEAT_SC(bt_dev.features)) {
875 		struct bt_hci_cp_write_sc_host_supp *sc_cp;
876 
877 		buf = bt_hci_cmd_create(BT_HCI_OP_WRITE_SC_HOST_SUPP, sizeof(*sc_cp));
878 		if (!buf) {
879 			return -ENOBUFS;
880 		}
881 
882 		sc_cp = net_buf_add(buf, sizeof(*sc_cp));
883 		sc_cp->sc_support = 0x01;
884 
885 		err = bt_hci_cmd_send_sync(BT_HCI_OP_WRITE_SC_HOST_SUPP, buf, NULL);
886 		if (err) {
887 			return err;
888 		}
889 	}
890 
891 	return 0;
892 }
893 
br_start_inquiry(const struct bt_br_discovery_param * param)894 static int br_start_inquiry(const struct bt_br_discovery_param *param)
895 {
896 	const uint8_t iac[3] = {0x33, 0x8b, 0x9e};
897 	struct bt_hci_op_inquiry *cp;
898 	struct net_buf *buf;
899 
900 	buf = bt_hci_cmd_create(BT_HCI_OP_INQUIRY, sizeof(*cp));
901 	if (!buf) {
902 		return -ENOBUFS;
903 	}
904 
905 	cp = net_buf_add(buf, sizeof(*cp));
906 
907 	cp->length = param->length;
908 	cp->num_rsp = 0xff; /* we limit discovery only by time */
909 
910 	memcpy(cp->lap, iac, 3);
911 	if (param->limited) {
912 		cp->lap[0] = 0x00;
913 	}
914 
915 	return bt_hci_cmd_send_sync(BT_HCI_OP_INQUIRY, buf, NULL);
916 }
917 
valid_br_discov_param(const struct bt_br_discovery_param * param,size_t num_results)918 static bool valid_br_discov_param(const struct bt_br_discovery_param *param, size_t num_results)
919 {
920 	if (!num_results || num_results > 255) {
921 		return false;
922 	}
923 
924 	if (!param->length || param->length > 0x30) {
925 		return false;
926 	}
927 
928 	return true;
929 }
930 
bt_br_discovery_start(const struct bt_br_discovery_param * param,struct bt_br_discovery_result * results,size_t cnt)931 int bt_br_discovery_start(const struct bt_br_discovery_param *param,
932 			  struct bt_br_discovery_result *results, size_t cnt)
933 {
934 	int err;
935 
936 	LOG_DBG("");
937 
938 	if (!valid_br_discov_param(param, cnt)) {
939 		return -EINVAL;
940 	}
941 
942 	if (atomic_test_bit(bt_dev.flags, BT_DEV_INQUIRY)) {
943 		return -EALREADY;
944 	}
945 
946 	err = br_start_inquiry(param);
947 	if (err) {
948 		return err;
949 	}
950 
951 	atomic_set_bit(bt_dev.flags, BT_DEV_INQUIRY);
952 
953 	(void)memset(results, 0, sizeof(*results) * cnt);
954 
955 	discovery_results = results;
956 	discovery_results_size = cnt;
957 	discovery_results_count = 0;
958 
959 	return 0;
960 }
961 
bt_br_discovery_stop(void)962 int bt_br_discovery_stop(void)
963 {
964 	int err;
965 	int i;
966 
967 	LOG_DBG("");
968 
969 	if (!atomic_test_bit(bt_dev.flags, BT_DEV_INQUIRY)) {
970 		return -EALREADY;
971 	}
972 
973 	err = bt_hci_cmd_send_sync(BT_HCI_OP_INQUIRY_CANCEL, NULL, NULL);
974 	if (err) {
975 		return err;
976 	}
977 
978 	for (i = 0; i < discovery_results_count; i++) {
979 		struct bt_br_discovery_priv *priv;
980 		struct bt_hci_cp_remote_name_cancel *cp;
981 		struct net_buf *buf;
982 
983 		priv = &discovery_results[i]._priv;
984 
985 		if (!priv->resolving) {
986 			continue;
987 		}
988 
989 		buf = bt_hci_cmd_create(BT_HCI_OP_REMOTE_NAME_CANCEL, sizeof(*cp));
990 		if (!buf) {
991 			continue;
992 		}
993 
994 		cp = net_buf_add(buf, sizeof(*cp));
995 		bt_addr_copy(&cp->bdaddr, &discovery_results[i].addr);
996 
997 		bt_hci_cmd_send_sync(BT_HCI_OP_REMOTE_NAME_CANCEL, buf, NULL);
998 	}
999 
1000 	atomic_clear_bit(bt_dev.flags, BT_DEV_INQUIRY);
1001 
1002 	discovery_results = NULL;
1003 	discovery_results_size = 0;
1004 	discovery_results_count = 0;
1005 
1006 	return 0;
1007 }
1008 
bt_br_discovery_cb_register(struct bt_br_discovery_cb * cb)1009 void bt_br_discovery_cb_register(struct bt_br_discovery_cb *cb)
1010 {
1011 	sys_slist_append(&discovery_cbs, &cb->node);
1012 }
1013 
bt_br_discovery_cb_unregister(struct bt_br_discovery_cb * cb)1014 void bt_br_discovery_cb_unregister(struct bt_br_discovery_cb *cb)
1015 {
1016 	sys_slist_find_and_remove(&discovery_cbs, &cb->node);
1017 }
1018 
write_scan_enable(uint8_t scan)1019 static int write_scan_enable(uint8_t scan)
1020 {
1021 	struct net_buf *buf;
1022 	int err;
1023 
1024 	LOG_DBG("type %u", scan);
1025 
1026 	buf = bt_hci_cmd_create(BT_HCI_OP_WRITE_SCAN_ENABLE, 1);
1027 	if (!buf) {
1028 		return -ENOBUFS;
1029 	}
1030 
1031 	net_buf_add_u8(buf, scan);
1032 	err = bt_hci_cmd_send_sync(BT_HCI_OP_WRITE_SCAN_ENABLE, buf, NULL);
1033 	if (err) {
1034 		return err;
1035 	}
1036 
1037 	atomic_set_bit_to(bt_dev.flags, BT_DEV_ISCAN, (scan & BT_BREDR_SCAN_INQUIRY));
1038 	atomic_set_bit_to(bt_dev.flags, BT_DEV_PSCAN, (scan & BT_BREDR_SCAN_PAGE));
1039 
1040 	return 0;
1041 }
1042 
bt_br_set_connectable(bool enable)1043 int bt_br_set_connectable(bool enable)
1044 {
1045 	if (enable) {
1046 		if (atomic_test_bit(bt_dev.flags, BT_DEV_PSCAN)) {
1047 			return -EALREADY;
1048 		} else {
1049 			return write_scan_enable(BT_BREDR_SCAN_PAGE);
1050 		}
1051 	} else {
1052 		if (!atomic_test_bit(bt_dev.flags, BT_DEV_PSCAN)) {
1053 			return -EALREADY;
1054 		} else {
1055 			return write_scan_enable(BT_BREDR_SCAN_DISABLED);
1056 		}
1057 	}
1058 }
1059 
1060 #define BT_LIAC 0x9e8b00
1061 #define BT_GIAC 0x9e8b33
1062 
bt_br_write_current_iac_lap(bool limited)1063 static int bt_br_write_current_iac_lap(bool limited)
1064 {
1065 	struct bt_hci_cp_write_current_iac_lap *iac_lap;
1066 	struct net_buf *buf;
1067 	uint8_t param_len;
1068 	uint8_t num_current_iac = limited ? 2 : 1;
1069 
1070 	LOG_DBG("limited discoverable mode? %s", limited ? "Yes" : "No");
1071 
1072 	param_len = sizeof(*iac_lap) + (num_current_iac * sizeof(struct bt_hci_iac_lap));
1073 
1074 	buf = bt_hci_cmd_create(BT_HCI_OP_WRITE_CURRENT_IAC_LAP, param_len);
1075 	if (!buf) {
1076 		return -ENOBUFS;
1077 	}
1078 
1079 	iac_lap = net_buf_add(buf, param_len);
1080 	iac_lap->num_current_iac = num_current_iac;
1081 	sys_put_le24(BT_GIAC, iac_lap->lap[0].iac);
1082 	if (num_current_iac > 1) {
1083 		sys_put_le24(BT_LIAC, iac_lap->lap[1].iac);
1084 	}
1085 
1086 	return bt_hci_cmd_send_sync(BT_HCI_OP_WRITE_CURRENT_IAC_LAP, buf, NULL);
1087 }
1088 
1089 #define BT_COD_MAJOR_SVC_CLASS_LIMITED_DISCOVER BIT(13)
1090 
bt_br_read_cod(uint32_t * cod)1091 static int bt_br_read_cod(uint32_t *cod)
1092 {
1093 	struct net_buf *rsp;
1094 	struct bt_hci_rp_read_class_of_device *rp;
1095 	int err;
1096 
1097 	LOG_DBG("Read COD");
1098 
1099 	/* Read Class of device */
1100 	err = bt_hci_cmd_send_sync(BT_HCI_OP_READ_CLASS_OF_DEVICE, NULL, &rsp);
1101 	if (err) {
1102 		LOG_WRN("Fail to read COD");
1103 		return err;
1104 	}
1105 
1106 	if (!rsp || (rsp->len < sizeof(*rp))) {
1107 		LOG_WRN("Invalid response");
1108 		return -EIO;
1109 	}
1110 
1111 	rp = (void *)rsp->data;
1112 	*cod = sys_get_le24(rp->class_of_device);
1113 
1114 	LOG_DBG("Current COD %06x", *cod);
1115 
1116 	net_buf_unref(rsp);
1117 
1118 	return 0;
1119 }
1120 
bt_br_write_cod(uint32_t cod)1121 static int bt_br_write_cod(uint32_t cod)
1122 {
1123 	struct net_buf *buf;
1124 
1125 	/* Set Class of device */
1126 	buf = bt_hci_cmd_create(BT_HCI_OP_WRITE_CLASS_OF_DEVICE,
1127 				sizeof(struct bt_hci_cp_write_class_of_device));
1128 	if (!buf) {
1129 		return -ENOBUFS;
1130 	}
1131 
1132 	net_buf_add_le24(buf, cod);
1133 
1134 	return bt_hci_cmd_send_sync(BT_HCI_OP_WRITE_CLASS_OF_DEVICE, buf, NULL);
1135 }
1136 
bt_br_update_cod(bool limited)1137 static int bt_br_update_cod(bool limited)
1138 {
1139 	int err;
1140 	uint32_t cod;
1141 
1142 	LOG_DBG("Update COD");
1143 
1144 	err = bt_br_read_cod(&cod);
1145 	if (err) {
1146 		return err;
1147 	}
1148 
1149 	if (limited) {
1150 		cod |= BT_COD_MAJOR_SVC_CLASS_LIMITED_DISCOVER;
1151 	} else {
1152 		cod &= ~BT_COD_MAJOR_SVC_CLASS_LIMITED_DISCOVER;
1153 	}
1154 
1155 	err = bt_br_write_cod(cod);
1156 	return err;
1157 }
1158 
bt_br_limited_discoverable_timeout_handler(struct k_work * work)1159 static void bt_br_limited_discoverable_timeout_handler(struct k_work *work)
1160 {
1161 	int err;
1162 
1163 	if (!atomic_test_bit(bt_dev.flags, BT_DEV_LIMITED_DISCOVERABLE_MODE)) {
1164 		LOG_INF("Limited discoverable mode has been disabled");
1165 		return;
1166 	}
1167 
1168 	err = bt_br_set_discoverable(false, false);
1169 	if (err) {
1170 		LOG_WRN("Disable discoverable failure (err %d)", err);
1171 	}
1172 }
1173 
1174 /* Work used for limited discoverable mode time span */
1175 static K_WORK_DELAYABLE_DEFINE(bt_br_limited_discoverable_timeout,
1176 			       bt_br_limited_discoverable_timeout_handler);
1177 
bt_br_set_discoverable(bool enable,bool limited)1178 int bt_br_set_discoverable(bool enable, bool limited)
1179 {
1180 	int err;
1181 
1182 	if (enable) {
1183 		if (atomic_test_bit(bt_dev.flags, BT_DEV_ISCAN)) {
1184 			return -EALREADY;
1185 		}
1186 
1187 		if (!atomic_test_bit(bt_dev.flags, BT_DEV_PSCAN)) {
1188 			return -EPERM;
1189 		}
1190 
1191 		err = bt_br_write_current_iac_lap(limited);
1192 		if (err) {
1193 			return err;
1194 		}
1195 
1196 		err = bt_br_update_cod(limited);
1197 		if (err) {
1198 			return err;
1199 		}
1200 
1201 		err = write_scan_enable(BT_BREDR_SCAN_INQUIRY | BT_BREDR_SCAN_PAGE);
1202 		if (!err && (limited == true)) {
1203 			atomic_set_bit(bt_dev.flags, BT_DEV_LIMITED_DISCOVERABLE_MODE);
1204 			k_work_reschedule(&bt_br_limited_discoverable_timeout,
1205 					  K_SECONDS(CONFIG_BT_LIMITED_DISCOVERABLE_DURATION));
1206 		}
1207 		return err;
1208 	}
1209 
1210 	if (!atomic_test_bit(bt_dev.flags, BT_DEV_ISCAN)) {
1211 		return -EALREADY;
1212 	}
1213 
1214 	err = write_scan_enable(BT_BREDR_SCAN_PAGE);
1215 	if (err) {
1216 		return err;
1217 	}
1218 
1219 	if (atomic_test_bit(bt_dev.flags, BT_DEV_LIMITED_DISCOVERABLE_MODE)) {
1220 		err = bt_br_write_current_iac_lap(false);
1221 		if (err) {
1222 			return err;
1223 		}
1224 
1225 		err = bt_br_update_cod(false);
1226 		if (err) {
1227 			return err;
1228 		}
1229 
1230 		atomic_clear_bit(bt_dev.flags, BT_DEV_LIMITED_DISCOVERABLE_MODE);
1231 		k_work_cancel_delayable(&bt_br_limited_discoverable_timeout);
1232 	}
1233 
1234 	return 0;
1235 }
1236 
bt_br_bond_exists(const bt_addr_t * addr)1237 bool bt_br_bond_exists(const bt_addr_t *addr)
1238 {
1239 	struct bt_keys_link_key *key = bt_keys_find_link_key(addr);
1240 
1241 	/* if there are any keys stored then device is bonded */
1242 	return key != NULL;
1243 }
1244