1 /*
2  * Copyright (c) 2018-2019 Nordic Semiconductor ASA
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #if defined(CONFIG_BT_CTLR_FAL_SIZE) && defined(CONFIG_BT_CTLR_RL_SIZE)
8 #define LLL_FILTER_SIZE MAX(CONFIG_BT_CTLR_FAL_SIZE, CONFIG_BT_CTLR_RL_SIZE)
9 #elif defined(CONFIG_BT_CTLR_FAL_SIZE)
10 #define LLL_FILTER_SIZE CONFIG_BT_CTLR_FAL_SIZE
11 #elif defined(CONFIG_BT_CTLR_RL_SIZE)
12 #define LLL_FILTER_SIZE CONFIG_BT_CTLR_RL_SIZE
13 #else
14 #define LLL_FILTER_SIZE 8
15 #endif /* CONFIG_BT_CTLR_FAL_SIZE && CONFIG_BT_CTLR_RL_SIZE */
16 
17 #define IRK_SIZE               16
18 #define FILTER_IDX_NONE        0xFF
19 #define LLL_FILTER_BITMASK_ALL (BIT_MASK(LLL_FILTER_SIZE))
20 
21 #define LLL_FILTER_SIZE_MAX_BITMASK8	(1 * CHAR_BIT)
22 #define LLL_FILTER_SIZE_MAX_BITMASK16	(2 * CHAR_BIT)
23 
24 struct lll_filter {
25 #if (LLL_FILTER_SIZE <= LLL_FILTER_SIZE_MAX_BITMASK8)
26 	uint8_t  enable_bitmask;
27 	uint8_t  addr_type_bitmask;
28 #elif (LLL_FILTER_SIZE <= LLL_FILTER_SIZE_MAX_BITMASK16)
29 	uint16_t enable_bitmask;
30 	uint16_t addr_type_bitmask;
31 #else
32 #error LLL_FILTER_SIZE must be <= LLL_FILTER_SIZE_MAX_BITMASK16
33 #endif
34 	uint8_t  bdaddr[LLL_FILTER_SIZE][BDADDR_SIZE];
35 };
36 
37 /* Filter Accept List peer list */
38 struct lll_fal {
39 	uint8_t   taken:1;
40 	uint8_t   id_addr_type:1;
41 	uint8_t   rl_idx;
42 	bt_addr_t id_addr;
43 };
44 
45 /* Periodic Advertising List */
46 struct lll_pal {
47 	bt_addr_t id_addr;
48 	uint8_t   taken:1;
49 	uint8_t   id_addr_type:1;
50 	uint8_t   sid;
51 
52 #if defined(CONFIG_BT_CTLR_PRIVACY)
53 	uint8_t   rl_idx;
54 #endif /* CONFIG_BT_CTLR_PRIVACY */
55 };
56 
57 /* Resolve list */
58 struct lll_resolve_list {
59 	uint8_t   taken:1;
60 	uint8_t   rpas_ready:1;
61 	uint8_t   pirk:1;
62 	uint8_t   lirk:1;
63 	uint8_t   dev:1;
64 	uint8_t   fal:1;
65 
66 	uint8_t   id_addr_type:1;
67 	bt_addr_t id_addr;
68 
69 	uint8_t   local_irk[IRK_SIZE];
70 	uint8_t   pirk_idx;
71 	bt_addr_t curr_rpa;
72 	bt_addr_t peer_rpa;
73 	bt_addr_t *local_rpa;
74 #if defined(CONFIG_BT_CTLR_SW_DEFERRED_PRIVACY)
75 	bt_addr_t target_rpa;
76 #endif
77 
78 #if defined(CONFIG_BT_CTLR_SYNC_PERIODIC_ADV_LIST)
79 	uint16_t   pal:9; /* 0 - not present, 1 to 256 - lll_pal entry index */
80 #endif /* CONFIG_BT_CTLR_SYNC_PERIODIC_ADV_LIST */
81 };
82 
83 #if defined(CONFIG_BT_CTLR_SW_DEFERRED_PRIVACY)
84 /* Cache of known unknown peer RPAs */
85 struct lll_prpa_cache {
86 	uint8_t   taken:1;
87 	bt_addr_t rpa;
88 };
89 
90 /* Cache of known unknown target RPAs */
91 struct lll_trpa_cache {
92 	uint8_t   rl_idx;
93 	bt_addr_t rpa;
94 };
95 #endif
96 
97 extern uint8_t ull_filter_lll_fal_match(struct lll_filter const *const filter,
98 					uint8_t addr_type,
99 					uint8_t const *const addr,
100 					uint8_t *devmatch_id);
101 extern bool ull_filter_lll_lrpa_used(uint8_t rl_idx);
102 extern bt_addr_t *ull_filter_lll_lrpa_get(uint8_t rl_idx);
103 extern bt_addr_t *ull_filter_lll_id_addr_get(uint8_t rl_idx, uint8_t *id_addr_type);
104 extern uint8_t *ull_filter_lll_irks_get(uint8_t *count);
105 extern uint8_t ull_filter_lll_rl_idx(bool fal, uint8_t devmatch_id);
106 extern uint8_t ull_filter_lll_rl_irk_idx(uint8_t irkmatch_id);
107 extern bool ull_filter_lll_irk_in_fal(uint8_t rl_idx);
108 extern struct lll_filter *ull_filter_lll_get(bool fal);
109 extern struct lll_fal *ull_filter_lll_fal_get(void);
110 extern struct lll_resolve_list *ull_filter_lll_resolve_list_get(void);
111 extern bool ull_filter_lll_rl_idx_allowed(uint8_t irkmatch_ok, uint8_t rl_idx);
112 extern bool ull_filter_lll_rl_addr_allowed(uint8_t id_addr_type,
113 					   const uint8_t *id_addr,
114 					   uint8_t *const rl_idx);
115 extern bool ull_filter_lll_rl_addr_resolve(uint8_t id_addr_type,
116 					   const uint8_t *id_addr,
117 					   uint8_t rl_idx);
118 extern bool ull_filter_lll_rl_enabled(void);
119 #if defined(CONFIG_BT_CTLR_SW_DEFERRED_PRIVACY)
120 extern const struct lll_prpa_cache *ull_filter_lll_prpa_cache_get(void);
121 extern const struct lll_trpa_cache *ull_filter_lll_trpa_cache_get(void);
122 typedef void (*resolve_callback_t)(void *param);
123 extern uint8_t ull_filter_deferred_resolve(bt_addr_t *rpa,
124 					resolve_callback_t cb);
125 extern uint8_t ull_filter_deferred_targeta_resolve(bt_addr_t *rpa,
126 						uint8_t rl_idx,
127 						resolve_callback_t cb);
128 #endif
129