1 /*
2  * Copyright (c) 2016-2025 Nordic Semiconductor ASA
3  * Copyright (c) 2016 Vinayak Kariappa Chettimada
4  *
5  * SPDX-License-Identifier: Apache-2.0
6  */
7 
8 #if defined(CONFIG_BT_CTLR_HCI_ADV_HANDLE_MAPPING)
9 #define LL_ADV_HANDLE_MAPPING
10 #else /* !CONFIG_BT_CTLR_HCI_ADV_HANDLE_MAPPING */
11 #define LL_ADV_HANDLE_MAPPING static __attribute__((always_inline)) inline
12 #endif /* !CONFIG_BT_CTLR_HCI_ADV_HANDLE_MAPPING */
13 
14 /* Initialization and Reset Interfaces */
15 int ll_init(struct k_sem *sem_rx);
16 int ll_deinit(void);
17 void ll_reset(void);
18 
19 /* Features Interfaces */
20 uint8_t ll_set_host_feature(uint8_t bit_number, uint8_t bit_value);
21 uint64_t ll_feat_get(void);
22 
23 /* Device Address Interfaces */
24 uint8_t ll_addr_set(uint8_t addr_type, uint8_t const *const p_bdaddr);
25 uint8_t *ll_addr_get(uint8_t addr_type);
26 uint8_t *ll_addr_read(uint8_t addr_type, uint8_t *const bdaddr);
27 
28 /* Advertising Handles Interfaces */
29 LL_ADV_HANDLE_MAPPING uint8_t ll_adv_set_by_hci_handle_get(uint8_t hci_handle, uint8_t *handle);
30 LL_ADV_HANDLE_MAPPING uint8_t ll_adv_set_by_hci_handle_get_or_new(uint8_t hci_handle,
31 								  uint8_t *handle);
32 LL_ADV_HANDLE_MAPPING uint8_t ll_adv_set_hci_handle_get(uint8_t handle);
33 LL_ADV_HANDLE_MAPPING uint8_t ll_adv_iso_by_hci_handle_get(uint8_t hci_handle, uint8_t *handle);
34 LL_ADV_HANDLE_MAPPING uint8_t ll_adv_iso_by_hci_handle_new(uint8_t hci_handle, uint8_t *handle);
35 
36 /* Advertising State Interfaces */
37 #if defined(CONFIG_BT_CTLR_ADV_EXT)
38 uint8_t ll_adv_params_set(uint8_t handle, uint16_t evt_prop, uint32_t interval,
39 		       uint8_t adv_type, uint8_t own_addr_type,
40 		       uint8_t direct_addr_type, uint8_t const *const direct_addr,
41 		       uint8_t chan_map, uint8_t filter_policy,
42 		       uint8_t *const tx_pwr, uint8_t phy_p, uint8_t skip,
43 		       uint8_t phy_s, uint8_t sid, uint8_t sreq);
44 uint8_t ll_adv_data_set(uint8_t handle, uint8_t len,
45 			uint8_t const *const p_data);
46 uint8_t ll_adv_scan_rsp_set(uint8_t handle, uint8_t len,
47 			    uint8_t const *const p_data);
48 #else /* !CONFIG_BT_CTLR_ADV_EXT */
49 uint8_t ll_adv_params_set(uint16_t interval, uint8_t adv_type,
50 		       uint8_t own_addr_type, uint8_t direct_addr_type,
51 		       uint8_t const *const direct_addr, uint8_t chan_map,
52 		       uint8_t filter_policy);
53 uint8_t ll_adv_data_set(uint8_t len, uint8_t const *const p_data);
54 uint8_t ll_adv_scan_rsp_set(uint8_t len, uint8_t const *const p_data);
55 #endif /* !CONFIG_BT_CTLR_ADV_EXT */
56 
57 /* Extended Advertising State Interfaces */
58 uint8_t ll_adv_aux_random_addr_set(uint8_t handle, uint8_t const *const addr);
59 uint8_t ll_adv_aux_ad_data_set(uint8_t handle, uint8_t op, uint8_t frag_pref,
60 			       uint8_t len, uint8_t const *const data);
61 uint8_t ll_adv_aux_sr_data_set(uint8_t handle, uint8_t op, uint8_t frag_pref,
62 			       uint8_t len, uint8_t const *const data);
63 uint16_t ll_adv_aux_max_data_length_get(void);
64 uint8_t ll_adv_aux_set_count_get(void);
65 uint8_t ll_adv_aux_set_remove(uint8_t handle);
66 uint8_t ll_adv_aux_set_clear(void);
67 
68 /* Periodic Advertising State Interfaces */
69 uint8_t ll_adv_sync_param_set(uint8_t handle, uint16_t interval,
70 			      uint16_t flags);
71 uint8_t ll_adv_sync_ad_data_set(uint8_t handle, uint8_t op, uint8_t len,
72 				uint8_t const *const data);
73 uint8_t ll_adv_sync_enable(uint8_t handle, uint8_t enable);
74 
75 /* Advertising Enable  and Disable Interfaces */
76 #if defined(CONFIG_BT_CTLR_ADV_EXT) || defined(CONFIG_BT_HCI_MESH_EXT)
77 #if defined(CONFIG_BT_HCI_MESH_EXT)
78 uint8_t ll_adv_enable(uint8_t handle, uint8_t enable,
79 		   uint8_t at_anchor, uint32_t ticks_anchor, uint8_t retry,
80 		   uint8_t scan_window, uint8_t scan_delay);
81 #else /* !CONFIG_BT_HCI_MESH_EXT */
82 uint8_t ll_adv_enable(uint8_t handle, uint8_t enable,
83 		   uint16_t duration, uint8_t max_ext_adv_evts);
84 #endif /* !CONFIG_BT_HCI_MESH_EXT */
85 #else /* !CONFIG_BT_CTLR_ADV_EXT || !CONFIG_BT_HCI_MESH_EXT */
86 uint8_t ll_adv_enable(uint8_t enable);
87 #endif /* !CONFIG_BT_CTLR_ADV_EXT || !CONFIG_BT_HCI_MESH_EXT */
88 
89 uint8_t ll_adv_disable_all(void);
90 
91 /* Broadcast ISO State Interfaces */
92 uint8_t ll_big_create(uint8_t big_handle, uint8_t adv_handle, uint8_t num_bis,
93 		      uint32_t sdu_interval, uint16_t max_sdu,
94 		      uint16_t max_latency, uint8_t rtn, uint8_t phy,
95 		      uint8_t packing, uint8_t framing, uint8_t encryption,
96 		      uint8_t *bcode);
97 uint8_t ll_big_test_create(uint8_t big_handle, uint8_t adv_handle,
98 			   uint8_t num_bis, uint32_t sdu_interval,
99 			   uint16_t iso_interval, uint8_t nse, uint16_t max_sdu,
100 			   uint16_t max_pdu, uint8_t phy, uint8_t packing,
101 			   uint8_t framing, uint8_t bn, uint8_t irc,
102 			   uint8_t pto, uint8_t encryption, uint8_t *bcode);
103 uint8_t ll_big_terminate(uint8_t big_handle, uint8_t reason);
104 
105 /* Scanning State Interfaces */
106 uint8_t ll_scan_params_set(uint8_t type, uint16_t interval, uint16_t window,
107 		uint8_t own_addr_type, uint8_t filter_policy);
108 #if defined(CONFIG_BT_CTLR_ADV_EXT)
109 uint8_t ll_scan_enable(uint8_t enable, uint16_t duration, uint16_t period);
110 #else /* !CONFIG_BT_CTLR_ADV_EXT */
111 uint8_t ll_scan_enable(uint8_t enable);
112 #endif /* !CONFIG_BT_CTLR_ADV_EXT */
113 
114 /* Periodic Advertising Sync State Interfaces */
115 uint8_t ll_sync_create(uint8_t options, uint8_t sid, uint8_t adv_addr_type,
116 		       uint8_t *adv_addr, uint16_t skip,
117 		       uint16_t sync_timeout, uint8_t sync_cte_type);
118 uint8_t ll_sync_create_cancel(void **rx);
119 uint8_t ll_sync_terminate(uint16_t handle);
120 uint8_t ll_sync_recv_enable(uint16_t handle, uint8_t enable);
121 
122 /* Periodic Advertising Sync Transfer Interfaces */
123 uint8_t ll_sync_transfer(uint16_t conn_handle, uint16_t service_data, uint16_t sync_handle);
124 uint8_t ll_adv_sync_set_info_transfer(uint16_t conn_handle, uint16_t service_data,
125 				      uint8_t adv_handle);
126 uint8_t ll_past_param(uint16_t conn_handle, uint8_t mode, uint16_t skip, uint16_t timeout,
127 		      uint8_t cte_type);
128 uint8_t ll_default_past_param(uint8_t mode, uint16_t skip, uint16_t timeout, uint8_t cte_type);
129 
130 /* Broadcast ISO Sync Receiver State Interfaces */
131 uint8_t ll_big_sync_create(uint8_t big_handle, uint16_t sync_handle,
132 			   uint8_t encryption, uint8_t *bcode, uint8_t mse,
133 			   uint16_t sync_timeout, uint8_t num_bis,
134 			   uint8_t *bis);
135 uint8_t ll_big_sync_terminate(uint8_t big_handle, void **rx);
136 
137 /* Connected ISO State Interfaces */
138 uint8_t ll_cig_parameters_open(uint8_t cig_id,
139 			       uint32_t c_interval, uint32_t p_interval,
140 			       uint8_t sca, uint8_t packing, uint8_t framing,
141 			       uint16_t c_latency, uint16_t p_latency,
142 			       uint8_t num_cis);
143 uint8_t ll_cis_parameters_set(uint8_t cis_id,
144 			      uint16_t c_sdu, uint16_t p_sdu,
145 			      uint8_t c_phy, uint8_t p_phy,
146 			      uint8_t c_rtn, uint8_t p_rtn);
147 uint8_t ll_cig_parameters_commit(uint8_t cig_id, uint16_t *handles);
148 uint8_t ll_cig_parameters_test_open(uint8_t cig_id,
149 				    uint32_t c_interval,
150 				    uint32_t p_interval,
151 				    uint8_t c_ft,
152 				    uint8_t p_ft,
153 				    uint16_t iso_interval,
154 				    uint8_t sca,
155 				    uint8_t packing,
156 				    uint8_t framing,
157 				    uint8_t num_cis);
158 uint8_t ll_cis_parameters_test_set(uint8_t cis_id, uint8_t nse,
159 				   uint16_t c_sdu, uint16_t p_sdu,
160 				   uint16_t c_pdu, uint16_t p_pdu,
161 				   uint8_t c_phy, uint8_t p_phy,
162 				   uint8_t c_bn, uint8_t p_bn);
163 uint8_t ll_cig_remove(uint8_t cig_id);
164 uint8_t ll_cis_create_check(uint16_t cis_handle, uint16_t acl_handle);
165 void ll_cis_create(uint16_t cis_handle, uint16_t acl_handle);
166 uint8_t ll_cis_accept(uint16_t handle);
167 uint8_t ll_cis_reject(uint16_t handle, uint8_t reason);
168 uint8_t ll_conn_iso_accept_timeout_get(uint16_t *timeout);
169 uint8_t ll_conn_iso_accept_timeout_set(uint16_t timeout);
170 
171 /* ISO SDU data Interfaces */
172 /* Must be implemented by vendor if vendor-specific data path is supported */
173 uint8_t ll_configure_data_path(uint8_t data_path_dir,
174 			       uint8_t data_path_id,
175 			       uint8_t vs_config_len,
176 			       uint8_t  *vs_config);
177 uint8_t ll_read_iso_tx_sync(uint16_t handle, uint16_t *seq,
178 			    uint32_t *timestamp, uint32_t *offset);
179 uint8_t ll_read_iso_link_quality(uint16_t  handle,
180 				 uint32_t *tx_unacked_packets,
181 				 uint32_t *tx_flushed_packets,
182 				 uint32_t *tx_last_subevent_packets,
183 				 uint32_t *retransmitted_packets,
184 				 uint32_t *crc_error_packets,
185 				 uint32_t *rx_unreceived_packets,
186 				 uint32_t *duplicate_packets);
187 uint8_t ll_setup_iso_path(uint16_t handle, uint8_t path_dir, uint8_t path_id,
188 			  uint8_t coding_format, uint16_t company_id,
189 			  uint16_t vs_codec_id, uint32_t controller_delay,
190 			  uint8_t codec_config_len, uint8_t *codec_config);
191 uint8_t ll_remove_iso_path(uint16_t handle, uint8_t path_dir);
192 uint8_t ll_iso_receive_test(uint16_t handle, uint8_t payload_type);
193 uint8_t ll_iso_transmit_test(uint16_t handle, uint8_t payload_type);
194 uint8_t ll_iso_test_end(uint16_t handle, uint32_t *received_cnt,
195 			uint32_t *missed_cnt, uint32_t *failed_cnt);
196 uint8_t ll_iso_read_test_counters(uint16_t handle, uint32_t *received_cnt,
197 				  uint32_t *missed_cnt,
198 				  uint32_t *failed_cnt);
199 
200 /* Filter Accept List Interfaces */
201 uint8_t ll_fal_size_get(void);
202 uint8_t ll_fal_clear(void);
203 uint8_t ll_fal_add(bt_addr_le_t *addr);
204 uint8_t ll_fal_remove(bt_addr_le_t *addr);
205 
206 /* Privacy Accept List Interfaces */
207 uint8_t ll_pal_size_get(void);
208 uint8_t ll_pal_clear(void);
209 uint8_t ll_pal_add(const bt_addr_le_t *const addr, const uint8_t sid);
210 uint8_t ll_pal_remove(const bt_addr_le_t *const addr, const uint8_t sid);
211 
212 /* Private Resolvable Address Resolution Interfaces */
213 void ll_rl_id_addr_get(uint8_t rl_idx, uint8_t *id_addr_type, uint8_t *id_addr);
214 uint8_t ll_rl_size_get(void);
215 uint8_t ll_rl_clear(void);
216 uint8_t ll_rl_add(bt_addr_le_t *id_addr, const uint8_t pirk[16],
217 		const uint8_t lirk[16]);
218 uint8_t ll_rl_remove(bt_addr_le_t *id_addr);
219 void ll_rl_crpa_set(uint8_t id_addr_type, uint8_t *id_addr, uint8_t rl_idx, uint8_t *crpa);
220 uint8_t ll_rl_crpa_get(bt_addr_le_t *id_addr, bt_addr_t *crpa);
221 uint8_t ll_rl_lrpa_get(bt_addr_le_t *id_addr, bt_addr_t *lrpa);
222 uint8_t ll_rl_enable(uint8_t enable);
223 void  ll_rl_timeout_set(uint16_t timeout);
224 uint8_t ll_priv_mode_set(bt_addr_le_t *id_addr, uint8_t mode);
225 
226 /* Connection State Interfaces */
227 #if defined(CONFIG_BT_CTLR_ADV_EXT)
228 uint8_t ll_create_connection(uint16_t scan_interval, uint16_t scan_window,
229 			  uint8_t filter_policy, uint8_t peer_addr_type,
230 			  uint8_t const *const peer_addr, uint8_t own_addr_type,
231 			  uint16_t interval, uint16_t latency, uint16_t timeout,
232 			  uint8_t phy);
233 uint8_t ll_connect_enable(uint8_t is_coded_included);
234 #else /* !CONFIG_BT_CTLR_ADV_EXT */
235 uint8_t ll_create_connection(uint16_t scan_interval, uint16_t scan_window,
236 			  uint8_t filter_policy, uint8_t peer_addr_type,
237 			  uint8_t const *const peer_addr, uint8_t own_addr_type,
238 			  uint16_t interval, uint16_t latency, uint16_t timeout);
239 #endif /* !CONFIG_BT_CTLR_ADV_EXT */
240 uint8_t ll_connect_disable(void **rx);
241 uint8_t ll_conn_update(uint16_t handle, uint8_t cmd, uint8_t status, uint16_t interval_min,
242 		    uint16_t interval_max, uint16_t latency, uint16_t timeout, uint16_t *offset);
243 uint8_t ll_chm_update(uint8_t const *const chm);
244 uint8_t ll_chm_get(uint16_t handle, uint8_t *const chm);
245 uint8_t ll_enc_req_send(uint16_t handle, uint8_t const *const rand_num, uint8_t const *const ediv,
246 			uint8_t const *const ltk);
247 uint8_t ll_start_enc_req_send(uint16_t handle, uint8_t err_code,
248 			   uint8_t const *const ltk);
249 uint8_t ll_req_peer_sca(uint16_t handle);
250 uint8_t ll_feature_req_send(uint16_t handle);
251 uint8_t ll_version_ind_send(uint16_t handle);
252 uint8_t ll_terminate_ind_send(uint16_t handle, uint8_t reason);
253 uint8_t ll_rssi_get(uint16_t handle, uint8_t *const rssi);
254 uint8_t ll_tx_pwr_lvl_get(uint8_t handle_type,
255 		       uint16_t handle, uint8_t type, int8_t *const tx_pwr_lvl);
256 void ll_tx_pwr_get(int8_t *const min, int8_t *const max);
257 uint8_t ll_tx_pwr_lvl_set(uint8_t handle_type, uint16_t handle,
258 			  int8_t *const tx_pwr_lvl);
259 
260 uint8_t ll_apto_get(uint16_t handle, uint16_t *const apto);
261 uint8_t ll_apto_set(uint16_t handle, uint16_t apto);
262 
263 uint8_t ll_length_req_send(uint16_t handle, uint16_t tx_octets, uint16_t tx_time);
264 void ll_length_default_get(uint16_t *const max_tx_octets,
265 			   uint16_t *const max_tx_time);
266 uint8_t ll_length_default_set(uint16_t max_tx_octets, uint16_t max_tx_time);
267 void ll_length_max_get(uint16_t *const max_tx_octets,
268 		       uint16_t *const max_tx_time,
269 		       uint16_t *const max_rx_octets,
270 		       uint16_t *const max_rx_time);
271 
272 uint8_t ll_phy_get(uint16_t handle, uint8_t *const tx, uint8_t *const rx);
273 uint8_t ll_phy_default_set(uint8_t tx, uint8_t rx);
274 uint8_t ll_phy_req_send(uint16_t handle, uint8_t tx, uint8_t flags, uint8_t rx);
275 
276 uint8_t ll_set_min_used_chans(uint16_t handle, uint8_t const phys,
277 		     uint8_t const min_used_chans);
278 
279 /* Direction Finding Interfaces */
280 /* Sets CTE transmission parameters for periodic advertising */
281 uint8_t ll_df_set_cl_cte_tx_params(uint8_t adv_handle, uint8_t cte_len,
282 				   uint8_t cte_type, uint8_t cte_count,
283 				   uint8_t num_ant_ids, uint8_t *ant_ids);
284 /* Enables or disables CTE TX for periodic advertising */
285 uint8_t ll_df_set_cl_cte_tx_enable(uint8_t adv_handle, uint8_t cte_enable);
286 /* Provides information about antennae switching and sampling settings */
287 uint8_t ll_df_set_conn_cte_tx_params(uint16_t handle, uint8_t cte_types,
288 				     uint8_t switching_patterns_len, const uint8_t *ant_id);
289 /* Enables or disables CTE sampling in direction fingin connected mode. */
290 uint8_t ll_df_set_conn_cte_rx_params(uint16_t handle, uint8_t sampling_enable,
291 				     uint8_t slot_durations, uint8_t switch_pattern_len,
292 				     const uint8_t *ant_ids);
293 /* Enables or disables CTE request control procedure in direction fingin connected mode. */
294 uint8_t ll_df_set_conn_cte_req_enable(uint16_t handle, uint8_t enable,
295 				      uint16_t cte_request_interval, uint8_t requested_cte_length,
296 				      uint8_t requested_cte_type);
297 /* Enables or disables CTE response control procedure in direction fingin connected mode. */
298 uint8_t ll_df_set_conn_cte_rsp_enable(uint16_t handle, uint8_t enable);
299 /* Enables or disables CTE sampling in periodic advertising scan */
300 uint8_t ll_df_set_cl_iq_sampling_enable(uint16_t handle,
301 					uint8_t sampling_enable,
302 					uint8_t slot_durations,
303 					uint8_t max_cte_count,
304 					uint8_t switch_pattern_len,
305 					uint8_t *ant_ids);
306 /* Sets CTE transmission parameters for a connection */
307 void ll_df_read_ant_inf(uint8_t *switch_sample_rates,
308 			uint8_t *num_ant,
309 			uint8_t *max_switch_pattern_len,
310 			uint8_t *max_cte_len);
311 
312 /* Path Loss Monitoring Interfaces */
313 uint8_t ll_conn_set_path_loss_parameters(uint16_t handle,
314 					 uint8_t  high_threshold,
315 					 uint8_t  high_hysteresis,
316 					 uint8_t  low_threshold,
317 					 uint8_t  low_hysteresis,
318 					 uint16_t min_time_spent);
319 uint8_t ll_conn_set_path_loss_reporting(uint16_t handle, uint8_t enable);
320 
321 /* Downstream - ACL Data */
322 void *ll_tx_mem_acquire(void);
323 void ll_tx_mem_release(void *node_tx);
324 int ll_tx_mem_enqueue(uint16_t handle, void *node_tx);
325 
326 /* Upstream - Num. Completes, Events, ACL and ISO Data */
327 uint8_t ll_rx_get(void **node_rx, uint16_t *handle);
328 void ll_rx_dequeue(void);
329 void ll_rx_mem_release(void **node_rx);
330 void ll_iso_rx_mem_release(void **node_rx);
331 
332 /* Downstream - ISO Data */
333 void *ll_iso_tx_mem_acquire(void);
334 void ll_iso_tx_mem_release(void *tx);
335 int ll_iso_tx_mem_enqueue(uint16_t handle, void *tx, void *link);
336 void ll_iso_link_tx_release(void *link);
337 
338 /* External co-operation */
339 void ll_timeslice_ticker_id_get(uint8_t * const instance_index,
340 				uint8_t * const ticker_id);
341 void ll_coex_ticker_id_get(uint8_t * const instance_index,
342 				uint8_t * const ticker_id);
343 void ll_radio_state_abort(void);
344 uint32_t ll_radio_state_is_idle(void);
345 
346 /* Static inline functions */
347 #if !defined(CONFIG_BT_CTLR_HCI_ADV_HANDLE_MAPPING)
ll_adv_set_by_hci_handle_get(uint8_t hci_handle,uint8_t * handle)348 LL_ADV_HANDLE_MAPPING uint8_t ll_adv_set_by_hci_handle_get(uint8_t hci_handle, uint8_t *handle)
349 {
350 	*handle = hci_handle;
351 	return 0U;
352 }
353 
ll_adv_set_by_hci_handle_get_or_new(uint8_t hci_handle,uint8_t * handle)354 LL_ADV_HANDLE_MAPPING uint8_t ll_adv_set_by_hci_handle_get_or_new(uint8_t hci_handle,
355 								  uint8_t *handle)
356 {
357 	*handle = hci_handle;
358 	return 0U;
359 }
360 
ll_adv_set_hci_handle_get(uint8_t handle)361 LL_ADV_HANDLE_MAPPING uint8_t ll_adv_set_hci_handle_get(uint8_t handle)
362 {
363 	return handle;
364 }
365 
ll_adv_iso_by_hci_handle_get(uint8_t hci_handle,uint8_t * handle)366 LL_ADV_HANDLE_MAPPING uint8_t ll_adv_iso_by_hci_handle_get(uint8_t hci_handle, uint8_t *handle)
367 {
368 	*handle = hci_handle;
369 	return 0U;
370 }
371 
ll_adv_iso_by_hci_handle_new(uint8_t hci_handle,uint8_t * handle)372 LL_ADV_HANDLE_MAPPING uint8_t ll_adv_iso_by_hci_handle_new(uint8_t hci_handle, uint8_t *handle)
373 {
374 	*handle = hci_handle;
375 	return 0U;
376 }
377 #endif /* !CONFIG_BT_CTLR_HCI_ADV_HANDLE_MAPPING */
378