2018-01-09 15:17:15 +01:00
|
|
|
/*
|
|
|
|
* Copyright (c) 2016-2018 Nordic Semiconductor ASA
|
|
|
|
* Copyright (c) 2016 Vinayak Kariappa Chettimada
|
|
|
|
*
|
|
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
|
|
*/
|
|
|
|
#include <stddef.h>
|
|
|
|
#include <string.h>
|
|
|
|
|
2022-05-06 11:12:04 +02:00
|
|
|
#include <zephyr/zephyr.h>
|
2020-08-19 10:09:58 +05:30
|
|
|
#include <soc.h>
|
2022-05-06 11:12:04 +02:00
|
|
|
#include <zephyr/bluetooth/hci.h>
|
|
|
|
#include <zephyr/bluetooth/controller.h>
|
2018-01-28 05:38:10 +01:00
|
|
|
|
|
|
|
#include "util/util.h"
|
2018-12-17 10:46:13 +01:00
|
|
|
#include "util/memq.h"
|
2021-02-24 16:43:58 +01:00
|
|
|
#include "util/mem.h"
|
2018-12-17 10:46:13 +01:00
|
|
|
|
|
|
|
#include "pdu.h"
|
2018-01-09 15:17:15 +01:00
|
|
|
|
2021-02-24 16:42:02 +05:30
|
|
|
#include "lll.h"
|
|
|
|
#include "lll/lll_adv_types.h"
|
2020-03-13 16:24:01 +05:30
|
|
|
#include "lll_adv.h"
|
2021-02-24 16:42:02 +05:30
|
|
|
#include "lll/lll_adv_pdu.h"
|
2018-12-18 05:48:20 +01:00
|
|
|
#include "lll_scan.h"
|
2020-03-13 16:24:01 +05:30
|
|
|
|
|
|
|
#include "ull_adv_types.h"
|
2018-12-18 05:48:20 +01:00
|
|
|
#include "ull_scan_types.h"
|
|
|
|
#include "ull_adv_internal.h"
|
|
|
|
#include "ull_scan_internal.h"
|
2018-01-09 15:17:15 +01:00
|
|
|
|
2021-02-24 16:42:02 +05:30
|
|
|
#include "ll.h"
|
|
|
|
|
2020-05-27 11:26:57 -05:00
|
|
|
static uint8_t pub_addr[BDADDR_SIZE];
|
|
|
|
static uint8_t rnd_addr[BDADDR_SIZE];
|
2018-01-09 15:17:15 +01:00
|
|
|
|
2020-06-30 15:16:36 +02:00
|
|
|
uint8_t ll_addr_set(uint8_t addr_type, uint8_t const *const bdaddr)
|
2018-01-09 15:17:15 +01:00
|
|
|
{
|
2020-04-14 17:29:01 +05:30
|
|
|
if (IS_ENABLED(CONFIG_BT_BROADCASTER)) {
|
|
|
|
#if defined(CONFIG_BT_CTLR_ADV_EXT)
|
2020-06-30 14:43:02 +02:00
|
|
|
if (ull_adv_is_enabled(0) && !ll_adv_cmds_is_ext()) {
|
2020-04-14 17:29:01 +05:30
|
|
|
#else /* !CONFIG_BT_CTLR_ADV_EXT */
|
2020-06-30 14:43:02 +02:00
|
|
|
if (ull_adv_is_enabled(0)) {
|
2020-04-14 17:29:01 +05:30
|
|
|
#endif /* !CONFIG_BT_CTLR_ADV_EXT */
|
|
|
|
return BT_HCI_ERR_CMD_DISALLOWED;
|
|
|
|
}
|
2018-12-17 10:46:13 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
if (IS_ENABLED(CONFIG_BT_OBSERVER) &&
|
2018-12-18 05:48:20 +01:00
|
|
|
(ull_scan_is_enabled(0) & (BIT(1) | BIT(2)))) {
|
2018-01-28 05:38:10 +01:00
|
|
|
return BT_HCI_ERR_CMD_DISALLOWED;
|
|
|
|
}
|
|
|
|
|
2018-01-09 15:17:15 +01:00
|
|
|
if (addr_type) {
|
|
|
|
memcpy(rnd_addr, bdaddr, BDADDR_SIZE);
|
|
|
|
} else {
|
|
|
|
memcpy(pub_addr, bdaddr, BDADDR_SIZE);
|
|
|
|
}
|
2018-01-28 05:38:10 +01:00
|
|
|
|
|
|
|
return 0;
|
2018-01-09 15:17:15 +01:00
|
|
|
}
|
2018-09-20 20:13:23 +02:00
|
|
|
|
2021-09-28 06:09:13 +05:30
|
|
|
uint8_t *ll_addr_get(uint8_t addr_type)
|
|
|
|
{
|
|
|
|
if (addr_type > BT_ADDR_LE_RANDOM) {
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (addr_type) {
|
|
|
|
return rnd_addr;
|
|
|
|
}
|
|
|
|
|
|
|
|
return pub_addr;
|
|
|
|
}
|
|
|
|
|
|
|
|
uint8_t *ll_addr_read(uint8_t addr_type, uint8_t *const bdaddr)
|
|
|
|
{
|
|
|
|
uint8_t *addr;
|
|
|
|
|
|
|
|
addr = ll_addr_get(addr_type);
|
|
|
|
if (addr) {
|
|
|
|
memcpy(bdaddr, addr, BDADDR_SIZE);
|
|
|
|
}
|
|
|
|
|
|
|
|
return addr;
|
|
|
|
}
|
|
|
|
|
2020-05-27 11:26:57 -05:00
|
|
|
void bt_ctlr_set_public_addr(const uint8_t *addr)
|
2018-09-20 20:13:23 +02:00
|
|
|
{
|
2021-11-15 09:41:12 +01:00
|
|
|
(void)memcpy(pub_addr, addr, sizeof(pub_addr));
|
2018-09-20 20:13:23 +02:00
|
|
|
}
|