1 /*
2  * Copyright (c) 2021 Nordic Semiconductor ASA
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #include <zephyr/kernel.h>
8 #include <stddef.h>
9 #include <zephyr/ztest.h>
10 
11 #include <zephyr/bluetooth/bluetooth.h>
12 #include <zephyr/bluetooth/hci.h>
13 #include <zephyr/sys/byteorder.h>
14 #include <host/hci_core.h>
15 
16 #include <bt_common.h>
17 #include "common.h"
18 
19 struct ut_bt_df_scan_cte_rx_params {
20 	uint8_t slot_durations;
21 	uint8_t cte_count;
22 	uint8_t num_ant_ids;
23 	uint8_t *ant_ids;
24 };
25 
26 static uint8_t g_ant_ids[] = { 0x1, 0x2, 0x3, 0x4, 0x5 };
27 
28 static struct ut_bt_df_scan_cte_rx_params g_params = {
29 	.slot_durations = BT_HCI_LE_ANTENNA_SWITCHING_SLOT_1US,
30 	.cte_count = BT_HCI_LE_SAMPLE_CTE_ALL,
31 	.num_ant_ids = ARRAY_SIZE(g_ant_ids),
32 	.ant_ids = &g_ant_ids[0]
33 };
34 
35 /* Macros delivering common values for unit tests */
36 #define SYNC_HANDLE_INVALID (CONFIG_BT_PER_ADV_SYNC_MAX + 1)
37 #define ANTENNA_SWITCHING_SLOT_INVALID                                         \
38 	(BT_HCI_LE_ANTENNA_SWITCHING_SLOT_2US + 1)
39 #define CTE_COUNT_INVALID (BT_HCI_LE_SAMPLE_CTE_COUNT_MAX + 1)
40 #define SWITCH_PATTERN_LEN_INVALID                                             \
41 	(CONFIG_BT_CTLR_DF_MAX_ANT_SW_PATTERN_LEN + 1)
42 /* @brief Function sends HCI_LE_Set_Connectionless_CTE_Sampling_Enable
43  *        to controller.
44  *
45  * @param sync_handle                 Handle of sync set.
46  * @param sync_flags                  Flags related with sync set.
47  * @param params                      CTE Sampling parameters.
48  * @param enable                      Enable or disable CTE RX
49  *
50  * @return Zero if success, non-zero value in case of failure.
51  */
send_set_scan_cte_rx_enable(uint16_t sync_handle,struct ut_bt_df_scan_cte_rx_params * params,bool enable)52 int send_set_scan_cte_rx_enable(uint16_t sync_handle,
53 				struct ut_bt_df_scan_cte_rx_params *params,
54 				bool enable)
55 {
56 	struct bt_hci_cp_le_set_cl_cte_sampling_enable *cp;
57 	struct net_buf *buf;
58 
59 	buf = bt_hci_cmd_create(BT_HCI_OP_LE_SET_CL_CTE_SAMPLING_ENABLE,
60 				sizeof(*cp) + params->num_ant_ids);
61 	if (!buf) {
62 		return -ENOBUFS;
63 	}
64 
65 	cp = net_buf_add(buf, sizeof(*cp));
66 	(void)memset(cp, 0, sizeof(*cp));
67 	cp->sync_handle = sys_cpu_to_le16(sync_handle);
68 	cp->sampling_enable = enable ? 1 : 0;
69 
70 	cp->slot_durations = params->slot_durations;
71 	cp->max_sampled_cte = params->cte_count;
72 	if (params->num_ant_ids) {
73 		if (params->ant_ids) {
74 			uint8_t *dest_ant_ids =
75 				net_buf_add(buf, params->num_ant_ids);
76 
77 			memcpy(dest_ant_ids, params->ant_ids,
78 			       params->num_ant_ids);
79 		}
80 		cp->switch_pattern_len = params->num_ant_ids;
81 
82 	} else {
83 		cp->switch_pattern_len = 0;
84 	}
85 
86 	return bt_hci_cmd_send_sync(BT_HCI_OP_LE_SET_CL_CTE_SAMPLING_ENABLE,
87 				    buf, NULL);
88 }
89 
ZTEST(test_hci_set_scan_cte_rx_enable,test_set_scan_cte_rx_enable_invalid_scan_set_handle)90 ZTEST(test_hci_set_scan_cte_rx_enable, test_set_scan_cte_rx_enable_invalid_scan_set_handle)
91 {
92 	int err;
93 
94 	err = send_set_scan_cte_rx_enable(SYNC_HANDLE_INVALID, &g_params, true);
95 	zassert_equal(err, -EIO,
96 		      "Unexpected error value for enable IQ sampling with wrong sync handle");
97 }
98 
ZTEST(test_hci_set_scan_cte_rx_enable,test_set_scan_cte_rx_enable_invalid_antenna_slots_value)99 ZTEST(test_hci_set_scan_cte_rx_enable, test_set_scan_cte_rx_enable_invalid_antenna_slots_value)
100 {
101 	int err;
102 
103 	uint8_t slot_durations_prev = g_params.slot_durations;
104 
105 	g_params.slot_durations = ANTENNA_SWITCHING_SLOT_INVALID;
106 
107 	err = send_set_scan_cte_rx_enable(g_per_sync->handle, &g_params, true);
108 	zassert_equal(err, -EIO,
109 		      "Unexpected error value for enable IQ sampling with wrong antenna switching"
110 		      " slots value");
111 
112 	g_params.slot_durations = slot_durations_prev;
113 }
114 
ZTEST(test_hci_set_scan_cte_rx_enable,test_set_scan_cte_rx_enable_invalid_antenna_pattern_num)115 ZTEST(test_hci_set_scan_cte_rx_enable, test_set_scan_cte_rx_enable_invalid_antenna_pattern_num)
116 {
117 	int err;
118 
119 	uint8_t num_ant_ids_prev = g_params.num_ant_ids;
120 	uint8_t *ant_ids_prev = g_params.ant_ids;
121 
122 	uint8_t ant_ids[SWITCH_PATTERN_LEN_INVALID] = { 0 };
123 
124 	g_params.num_ant_ids = SWITCH_PATTERN_LEN_INVALID;
125 	g_params.ant_ids = &ant_ids[0];
126 	err = send_set_scan_cte_rx_enable(g_per_sync->handle, &g_params, true);
127 	zassert_equal(err, -EIO,
128 		      "Unexpected error value for enable IQ sampling with wrong number"
129 		      " of antenna ids.");
130 
131 	g_params.num_ant_ids = num_ant_ids_prev;
132 	g_params.ant_ids = ant_ids_prev;
133 }
134 
ZTEST(test_hci_set_scan_cte_rx_enable,test_set_scan_cte_rx_enable_invalid_cte_count_value)135 ZTEST(test_hci_set_scan_cte_rx_enable, test_set_scan_cte_rx_enable_invalid_cte_count_value)
136 {
137 	int err;
138 
139 	uint8_t cte_count_prev = g_params.cte_count;
140 
141 	g_params.cte_count = CTE_COUNT_INVALID;
142 
143 	err = send_set_scan_cte_rx_enable(g_per_sync->handle, &g_params, true);
144 	zassert_equal(err, -EIO,
145 		      "Unexpected error value for enable IQ sampling with wrong number of CTEs"
146 		      " to sample.");
147 
148 	g_params.cte_count = cte_count_prev;
149 }
150 
ZTEST(test_hci_set_scan_cte_rx_enable,test_set_scan_cte_rx_enable_with_slot_duration_2us)151 ZTEST(test_hci_set_scan_cte_rx_enable, test_set_scan_cte_rx_enable_with_slot_duration_2us)
152 {
153 	int err;
154 
155 	uint8_t slot_durations_prev = g_params.slot_durations;
156 
157 	g_params.slot_durations = BT_HCI_LE_ANTENNA_SWITCHING_SLOT_2US;
158 
159 	err = send_set_scan_cte_rx_enable(g_per_sync->handle, &g_params, true);
160 	zassert_equal(err, 0, "Unexpected error value for enable IQ sampling");
161 
162 	g_params.slot_durations = slot_durations_prev;
163 }
164 
ZTEST(test_hci_set_scan_cte_rx_enable,test_set_scan_cte_rx_enable_with_slot_duration_1us)165 ZTEST(test_hci_set_scan_cte_rx_enable, test_set_scan_cte_rx_enable_with_slot_duration_1us)
166 {
167 	int err;
168 
169 	uint8_t slot_durations_prev = g_params.slot_durations;
170 
171 	g_params.slot_durations = BT_HCI_LE_ANTENNA_SWITCHING_SLOT_1US;
172 
173 	err = send_set_scan_cte_rx_enable(g_per_sync->handle, &g_params, true);
174 	zassert_equal(err, 0,
175 		      "Unexpected error value for enable IQ sampling with 1us slot durations");
176 
177 	g_params.slot_durations = slot_durations_prev;
178 }
179 
ZTEST(test_hci_set_scan_cte_rx_enable,test_set_scan_cte_rx_enable_with_sample_cte_count_min)180 ZTEST(test_hci_set_scan_cte_rx_enable, test_set_scan_cte_rx_enable_with_sample_cte_count_min)
181 {
182 	int err;
183 
184 	uint8_t cte_count_prev = g_params.cte_count;
185 
186 	g_params.cte_count = BT_HCI_LE_SAMPLE_CTE_COUNT_MIN;
187 
188 	err = send_set_scan_cte_rx_enable(g_per_sync->handle, &g_params, true);
189 	zassert_equal(err, 0,
190 		      "Unexpected error value for enable IQ sampling with CTEs count set"
191 		      " to min value.");
192 
193 	g_params.cte_count = cte_count_prev;
194 }
195 
ZTEST(test_hci_set_scan_cte_rx_enable,test_set_scan_cte_rx_enable_with_sample_cte_count_max)196 ZTEST(test_hci_set_scan_cte_rx_enable, test_set_scan_cte_rx_enable_with_sample_cte_count_max)
197 {
198 	int err;
199 
200 	uint8_t cte_count_prev = g_params.cte_count;
201 
202 	g_params.cte_count = BT_HCI_LE_SAMPLE_CTE_COUNT_MAX;
203 
204 	err = send_set_scan_cte_rx_enable(g_per_sync->handle, &g_params, true);
205 	zassert_equal(err, 0,
206 		      "Unexpected error value for enable IQ sampling with CTEs count set"
207 		      " to max value.");
208 
209 	g_params.cte_count = cte_count_prev;
210 }
211 
ZTEST(test_hci_set_scan_cte_rx_enable,test_set_scan_cte_rx_enable_with_antenna_switch_patterns_min)212 ZTEST(test_hci_set_scan_cte_rx_enable, test_set_scan_cte_rx_enable_with_antenna_switch_patterns_min)
213 {
214 	int err;
215 
216 	uint8_t num_ant_ids_prev = g_params.num_ant_ids;
217 	uint8_t *ant_ids_prev = g_params.ant_ids;
218 	uint8_t ant_ids[BT_HCI_LE_MAX_SWITCH_PATTERN_LEN_MIN] = { 0 };
219 
220 	g_params.num_ant_ids = BT_HCI_LE_MAX_SWITCH_PATTERN_LEN_MIN;
221 	g_params.ant_ids = &ant_ids[0];
222 	err = send_set_scan_cte_rx_enable(g_per_sync->handle, &g_params, true);
223 	zassert_equal(err, 0,
224 		      "Unexpected error value for enable IQ sampling with min number of"
225 		      " antenna ids.");
226 
227 	g_params.num_ant_ids = num_ant_ids_prev;
228 	g_params.ant_ids = ant_ids_prev;
229 }
230 
ZTEST(test_hci_set_scan_cte_rx_enable,test_set_scan_cte_rx_enable_with_antenna_switch_patterns_max)231 ZTEST(test_hci_set_scan_cte_rx_enable, test_set_scan_cte_rx_enable_with_antenna_switch_patterns_max)
232 {
233 	int err;
234 
235 	uint8_t num_ant_ids_prev = g_params.num_ant_ids;
236 	uint8_t *ant_ids_prev = g_params.ant_ids;
237 	uint8_t ant_ids[CONFIG_BT_CTLR_DF_MAX_ANT_SW_PATTERN_LEN] = { 0 };
238 
239 	g_params.num_ant_ids = CONFIG_BT_CTLR_DF_MAX_ANT_SW_PATTERN_LEN;
240 	g_params.ant_ids = &ant_ids[0];
241 	err = send_set_scan_cte_rx_enable(g_per_sync->handle, &g_params, true);
242 	zassert_equal(err, 0,
243 		      "Unexpected error value for enable IQ sampling with max number of antenna"
244 		      " ids.");
245 
246 	g_params.num_ant_ids = num_ant_ids_prev;
247 	g_params.ant_ids = ant_ids_prev;
248 }
249 
ZTEST(test_hci_set_scan_cte_rx_disable,test_set_scan_cte_rx_disable_with_correct_sampling_parameters)250 ZTEST(test_hci_set_scan_cte_rx_disable,
251 	test_set_scan_cte_rx_disable_with_correct_sampling_parameters)
252 {
253 	int err;
254 
255 	err = send_set_scan_cte_rx_enable(g_per_sync->handle, &g_params, false);
256 	zassert_equal(err, 0, "Unexpected error value for disable IQ sampling.");
257 }
258 
ZTEST(test_hci_set_scan_cte_rx_disable,test_set_scan_cte_rx_disable_with_invalid_sampling_parameters)259 ZTEST(test_hci_set_scan_cte_rx_disable,
260 	test_set_scan_cte_rx_disable_with_invalid_sampling_parameters)
261 {
262 	int err;
263 
264 	static struct ut_bt_df_scan_cte_rx_params params_invalid = {
265 		.slot_durations = ANTENNA_SWITCHING_SLOT_INVALID,
266 		.cte_count = CTE_COUNT_INVALID,
267 		.num_ant_ids = 0,
268 		.ant_ids = NULL
269 	};
270 
271 	err = send_set_scan_cte_rx_enable(g_per_sync->handle, ¶ms_invalid,
272 					  false);
273 	zassert_equal(err, 0, "Unexpected error value for disable IQ sampling.");
274 }
275 
ZTEST(test_hci_set_scan_cte_rx_disable,test_set_scan_cte_rx_disable_when_disabled)276 ZTEST(test_hci_set_scan_cte_rx_disable, test_set_scan_cte_rx_disable_when_disabled)
277 {
278 	int err;
279 
280 	err = send_set_scan_cte_rx_enable(g_per_sync->handle, &g_params, false);
281 	zassert_equal(err, 0,
282 		      "Unexpected error value for disable IQ sampling when it is disabled.");
283 }
284 
set_scan_cte_rx_enable_teardown(void * data)285 void set_scan_cte_rx_enable_teardown(void *data)
286 {
287 	int err;
288 
289 	err = send_set_scan_cte_rx_enable(g_per_sync->handle, &g_params, false);
290 	zassert_equal(err, 0, "Unexpected error value for disable IQ sampling.");
291 }
292 
set_scan_cte_rx_disable_setup(void * data)293 void set_scan_cte_rx_disable_setup(void *data)
294 {
295 	int err;
296 
297 	err = send_set_scan_cte_rx_enable(g_per_sync->handle, &g_params, true);
298 	zassert_equal(err, 0, "Unexpected error value for enable IQ sampling.");
299 }
300 
common_per_sync_setup(void)301 static void *common_per_sync_setup(void)
302 {
303 	ut_bt_setup();
304 
305 	common_create_per_sync_set();
306 
307 	return NULL;
308 }
309 
310 ZTEST_SUITE(test_hci_set_scan_cte_rx_enable, NULL, common_per_sync_setup, NULL,
311 	    set_scan_cte_rx_enable_teardown, ut_bt_teardown);
312 ZTEST_SUITE(test_hci_set_scan_cte_rx_disable, NULL, common_per_sync_setup,
313 	    set_scan_cte_rx_disable_setup, NULL, ut_bt_teardown);
314