blob: 1c726c2c294aa974e024449c56ab1ad8dc759ac5 [file] [log] [blame]
/*
* Copyright (c) 2018-2019 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: Apache-2.0
*/
#if defined(CONFIG_BT_CTLR_WL_SIZE)
#define WL_SIZE CONFIG_BT_CTLR_WL_SIZE
#else
#define WL_SIZE 8
#endif /* CONFIG_BT_CTLR_WL_SIZE */
#define FILTER_IDX_NONE 0xFF
#define LLL_FILTER_BITMASK_ALL (BIT(WL_SIZE) - 1)
struct lll_filter {
#if (WL_SIZE <= 8)
uint8_t enable_bitmask;
uint8_t addr_type_bitmask;
#elif (WL_SIZE <= 16)
uint16_t enable_bitmask;
uint16_t addr_type_bitmask;
#else
#error WL_SIZE must be <= 16
#endif
uint8_t bdaddr[WL_SIZE][BDADDR_SIZE];
};
/* Whitelist peer list */
struct lll_whitelist {
uint8_t taken:1;
uint8_t id_addr_type:1;
uint8_t rl_idx;
bt_addr_t id_addr;
};
struct lll_resolvelist {
uint8_t taken:1;
uint8_t rpas_ready:1;
uint8_t pirk:1;
uint8_t lirk:1;
uint8_t dev:1;
uint8_t wl:1;
uint8_t id_addr_type:1;
bt_addr_t id_addr;
uint8_t local_irk[16];
uint8_t pirk_idx;
bt_addr_t curr_rpa;
bt_addr_t peer_rpa;
bt_addr_t *local_rpa;
#if defined(CONFIG_BT_CTLR_SW_DEFERRED_PRIVACY)
bt_addr_t target_rpa;
#endif
};
bool ull_filter_lll_lrpa_used(uint8_t rl_idx);
extern bt_addr_t *ull_filter_lll_lrpa_get(uint8_t rl_idx);
extern uint8_t *ull_filter_lll_irks_get(uint8_t *count);
extern uint8_t ull_filter_lll_rl_idx(bool whitelist, uint8_t devmatch_id);
extern uint8_t ull_filter_lll_rl_irk_idx(uint8_t irkmatch_id);
extern bool ull_filter_lll_irk_whitelisted(uint8_t rl_idx);
extern struct lll_filter *ull_filter_lll_get(bool whitelist);
extern struct lll_whitelist *ull_filter_lll_whitelist_get(void);
extern struct lll_resolvelist *ull_filter_lll_resolvelist_get(void);
extern bool ull_filter_lll_rl_idx_allowed(uint8_t irkmatch_ok, uint8_t rl_idx);
extern bool ull_filter_lll_rl_addr_allowed(uint8_t id_addr_type, uint8_t *id_addr,
uint8_t *rl_idx);
extern bool ull_filter_lll_rl_addr_resolve(uint8_t id_addr_type, uint8_t *id_addr,
uint8_t rl_idx);
extern bool ull_filter_lll_rl_enabled(void);
#if defined(CONFIG_BT_CTLR_SW_DEFERRED_PRIVACY)
typedef void (*resolve_callback_t)(void *param);
extern uint8_t ull_filter_deferred_resolve(bt_addr_t *rpa,
resolve_callback_t cb);
extern uint8_t ull_filter_deferred_targeta_resolve(bt_addr_t *rpa,
uint8_t rl_idx,
resolve_callback_t cb);
#endif