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