/*
 * Copyright (c) 2018-2019 Nordic Semiconductor ASA
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#if defined(CONFIG_BT_CTLR_FAL_SIZE) && defined(CONFIG_BT_CTLR_RL_SIZE)
#define LLL_FILTER_SIZE MAX(CONFIG_BT_CTLR_FAL_SIZE, CONFIG_BT_CTLR_RL_SIZE)
#elif defined(CONFIG_BT_CTLR_FAL_SIZE)
#define LLL_FILTER_SIZE CONFIG_BT_CTLR_FAL_SIZE
#elif defined(CONFIG_BT_CTLR_RL_SIZE)
#define LLL_FILTER_SIZE CONFIG_BT_CTLR_RL_SIZE
#else
#define LLL_FILTER_SIZE 8
#endif /* CONFIG_BT_CTLR_FAL_SIZE && CONFIG_BT_CTLR_RL_SIZE */

#define IRK_SIZE               16
#define FILTER_IDX_NONE        0xFF
#define LLL_FILTER_BITMASK_ALL (BIT_MASK(LLL_FILTER_SIZE))

#define LLL_FILTER_SIZE_MAX_BITMASK8	(1 * CHAR_BIT)
#define LLL_FILTER_SIZE_MAX_BITMASK16	(2 * CHAR_BIT)

struct lll_filter {
#if (LLL_FILTER_SIZE <= LLL_FILTER_SIZE_MAX_BITMASK8)
	uint8_t  enable_bitmask;
	uint8_t  addr_type_bitmask;
#elif (LLL_FILTER_SIZE <= LLL_FILTER_SIZE_MAX_BITMASK16)
	uint16_t enable_bitmask;
	uint16_t addr_type_bitmask;
#else
#error LLL_FILTER_SIZE must be <= LLL_FILTER_SIZE_MAX_BITMASK16
#endif
	uint8_t  bdaddr[LLL_FILTER_SIZE][BDADDR_SIZE];
};

/* Filter Accept List peer list */
struct lll_fal {
	uint8_t   taken:1;
	uint8_t   id_addr_type:1;
	uint8_t   rl_idx;
	bt_addr_t id_addr;
};

/* Periodic Advertising List */
struct lll_pal {
	bt_addr_t id_addr;
	uint8_t   taken:1;
	uint8_t   id_addr_type:1;
	uint8_t   sid;

#if defined(CONFIG_BT_CTLR_PRIVACY)
	uint8_t   rl_idx;
#endif /* CONFIG_BT_CTLR_PRIVACY */
};

/* Resolve list */
struct lll_resolve_list {
	uint8_t   taken:1;
	uint8_t   rpas_ready:1;
	uint8_t   pirk:1;
	uint8_t   lirk:1;
	uint8_t   dev:1;
	uint8_t   fal:1;

	uint8_t   id_addr_type:1;
	bt_addr_t id_addr;

	uint8_t   local_irk[IRK_SIZE];
	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

#if defined(CONFIG_BT_CTLR_SYNC_PERIODIC_ADV_LIST)
	uint16_t   pal:9; /* 0 - not present, 1 to 256 - lll_pal entry index */
#endif /* CONFIG_BT_CTLR_SYNC_PERIODIC_ADV_LIST */
};

#if defined(CONFIG_BT_CTLR_SW_DEFERRED_PRIVACY)
/* Cache of known unknown peer RPAs */
struct lll_prpa_cache {
	uint8_t   taken:1;
	bt_addr_t rpa;
};

/* Cache of known unknown target RPAs */
struct lll_trpa_cache {
	uint8_t   rl_idx;
	bt_addr_t rpa;
};
#endif

extern uint8_t ull_filter_lll_fal_match(struct lll_filter const *const filter,
					uint8_t addr_type,
					uint8_t const *const addr,
					uint8_t *devmatch_id);
extern 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 fal, uint8_t devmatch_id);
extern uint8_t ull_filter_lll_rl_irk_idx(uint8_t irkmatch_id);
extern bool ull_filter_lll_irk_in_fal(uint8_t rl_idx);
extern struct lll_filter *ull_filter_lll_get(bool fal);
extern struct lll_fal *ull_filter_lll_fal_get(void);
extern struct lll_resolve_list *ull_filter_lll_resolve_list_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,
					   const uint8_t *id_addr,
					   uint8_t *const rl_idx);
extern bool ull_filter_lll_rl_addr_resolve(uint8_t id_addr_type,
					   const uint8_t *id_addr,
					   uint8_t rl_idx);
extern bool ull_filter_lll_rl_enabled(void);
#if defined(CONFIG_BT_CTLR_SW_DEFERRED_PRIVACY)
extern const struct lll_prpa_cache *ull_filter_lll_prpa_cache_get(void);
extern const struct lll_trpa_cache *ull_filter_lll_trpa_cache_get(void);
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
