/*
 * Copyright (c) 2017-2021 Nordic Semiconductor ASA
 * Copyright (c) 2015-2016 Intel Corporation
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#define RPA_TIMEOUT_MS       (CONFIG_BT_RPA_TIMEOUT * MSEC_PER_SEC)
#define RPA_TIMEOUT          K_MSEC(RPA_TIMEOUT_MS)

static inline bool bt_id_rpa_is_new(void)
{
#if defined(CONFIG_BT_PRIVACY)
	uint32_t remaining_ms = k_ticks_to_ms_floor32(
		k_work_delayable_remaining_get(&bt_dev.rpa_update));
	/* RPA is considered new if there is less than half a second since the
	 * timeout was started.
	 */
	return remaining_ms > (RPA_TIMEOUT_MS - 500);
#else
	return false;
#endif
}

int bt_id_init(void);

uint8_t bt_id_read_public_addr(bt_addr_le_t *addr);

int bt_id_set_create_conn_own_addr(bool use_filter, uint8_t *own_addr_type);

int bt_id_set_scan_own_addr(bool active_scan, uint8_t *own_addr_type);

int bt_id_set_adv_own_addr(struct bt_le_ext_adv *adv, uint32_t options,
			   bool dir_adv, uint8_t *own_addr_type);

bool bt_id_adv_random_addr_check(const struct bt_le_adv_param *param);

bool bt_id_scan_random_addr_check(void);

int bt_id_set_adv_random_addr(struct bt_le_ext_adv *adv,
			      const bt_addr_t *addr);
int bt_id_set_adv_private_addr(struct bt_le_ext_adv *adv);

int bt_id_set_private_addr(uint8_t id);

void bt_id_pending_keys_update(void);
