1 /*
2 * Copyright (c) 2020 Demant
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7 #include <string.h>
8 #include <zephyr/types.h>
9 #include <zephyr/ztest.h>
10
11 #include <stdio.h>
12 #include <stdlib.h>
13
14 #include "util/util.h"
15 #include "util/memq.h"
16 #include "util/dbuf.h"
17
18 #include "pdu_df.h"
19 #include "lll/pdu_vendor.h"
20 #include "hal/ccm.h"
21
22 #include "pdu.h"
23 #include "lll.h"
24 #include "lll/lll_df_types.h"
25 #include "lll_conn.h"
26
27 #include "ull_tx_queue.h"
28
29 #define SIZE 10U
30
ZTEST(tx_q,test_init)31 ZTEST(tx_q, test_init)
32 {
33 struct ull_tx_q tx_q;
34 struct node_tx *node;
35
36 ull_tx_q_init(&tx_q);
37 zassert_equal(0U, tx_q.pause_data, "pause_data must be zero on init");
38
39 /* Tx Queue shall be empty */
40 node = ull_tx_q_dequeue(&tx_q);
41 zassert_equal_ptr(node, NULL, "");
42 }
43
44 /*
45 * (1) Enqueue ctrl nodes.
46 * Dequeue and verify order of the ctrl nodes from (1).
47 * Verify Tx Queue is empty.
48 */
ZTEST(tx_q,test_ctrl)49 ZTEST(tx_q, test_ctrl)
50 {
51 struct ull_tx_q tx_q;
52 struct node_tx *node;
53 struct node_tx ctrl_nodes1[SIZE] = { 0 };
54
55 ull_tx_q_init(&tx_q);
56
57 /* Enqueue ctrl nodes */
58 for (int i = 0U; i < SIZE; i++) {
59 ull_tx_q_enqueue_ctrl(&tx_q, &ctrl_nodes1[i]);
60 }
61
62 /* Dequeue ctrl nodes */
63 for (int i = 0U; i < SIZE; i++) {
64 node = ull_tx_q_dequeue(&tx_q);
65 zassert_equal_ptr(node, &ctrl_nodes1[i], NULL);
66 }
67
68 /* Tx Queue shall be empty */
69 node = ull_tx_q_dequeue(&tx_q);
70 zassert_equal_ptr(node, NULL, "");
71 }
72
73 /*
74 * (1) Enqueue data nodes.
75 * Dequeue and verify order of the data nodes from (1).
76 * Verify Tx Queue is empty.
77 */
ZTEST(tx_q,test_data)78 ZTEST(tx_q, test_data)
79 {
80 struct ull_tx_q tx_q;
81 struct node_tx *node;
82 struct node_tx nodes[SIZE] = { 0 };
83
84 ull_tx_q_init(&tx_q);
85
86 /* Enqueue data nodes */
87 for (int i = 0U; i < SIZE; i++) {
88 ull_tx_q_enqueue_data(&tx_q, &nodes[i]);
89 }
90
91 /* Dequeue data nodes */
92 for (int i = 0U; i < SIZE; i++) {
93 node = ull_tx_q_dequeue(&tx_q);
94 zassert_equal_ptr(node, &nodes[i], NULL);
95 }
96
97 /* Tx Queue shall be empty */
98 node = ull_tx_q_dequeue(&tx_q);
99 zassert_equal_ptr(node, NULL, "");
100 }
101
102 /*
103 * (1) Enqueue ctrl and data nodes interleaved.
104 * Dequeue and verify order of the data and ctrl nodes from (1).
105 * Verify Tx Queue is empty.
106 */
ZTEST(tx_q,test_ctrl_and_data_1)107 ZTEST(tx_q, test_ctrl_and_data_1)
108 {
109 struct ull_tx_q tx_q;
110 struct node_tx *node;
111 struct node_tx ctrl_nodes1[SIZE] = { 0 };
112 struct node_tx data_nodes1[SIZE] = { 0 };
113
114 ull_tx_q_init(&tx_q);
115
116 /* Enqueue ctrl and data nodes */
117 for (int i = 0U; i < SIZE; i++) {
118 ull_tx_q_enqueue_ctrl(&tx_q, &ctrl_nodes1[i]);
119 ull_tx_q_enqueue_data(&tx_q, &data_nodes1[i]);
120 }
121
122 /* Dequeue ctrl and data nodes */
123 for (int i = 0U; i < SIZE; i++) {
124 node = ull_tx_q_dequeue(&tx_q);
125 zassert_equal_ptr(node, &ctrl_nodes1[i], NULL);
126
127 node = ull_tx_q_dequeue(&tx_q);
128 zassert_equal_ptr(node, &data_nodes1[i], NULL);
129 }
130
131 /* Tx Queue shall be empty */
132 node = ull_tx_q_dequeue(&tx_q);
133 zassert_equal_ptr(node, NULL, "");
134 }
135
136 /*
137 * (1) Enqueue ctrl and data nodes interleaved.
138 * Pause Tx Queue.
139 * (2) Enqueue data nodes.
140 * Dequeue and verify order of the data and ctrl nodes from (1).
141 * Verify Tx Queue is empty.
142 */
ZTEST(tx_q,test_ctrl_and_data_2)143 ZTEST(tx_q, test_ctrl_and_data_2)
144 {
145 struct ull_tx_q tx_q;
146 struct node_tx *node;
147 struct node_tx ctrl_nodes1[SIZE] = { 0 };
148 struct node_tx data_nodes1[SIZE] = { 0 };
149 struct node_tx data_nodes2[SIZE] = { 0 };
150
151 ull_tx_q_init(&tx_q);
152
153 /* Enqueue ctrl and data nodes */
154 for (int i = 0U; i < SIZE; i++) {
155 ull_tx_q_enqueue_ctrl(&tx_q, &ctrl_nodes1[i]);
156 ull_tx_q_enqueue_data(&tx_q, &data_nodes1[i]);
157 }
158
159 /* Pause Tx Queue */
160 ull_tx_q_pause_data(&tx_q);
161
162 /* Enqueue data nodes */
163 for (int i = 0U; i < SIZE; i++) {
164 ull_tx_q_enqueue_data(&tx_q, &data_nodes2[i]);
165 }
166
167 /* Dequeue ctrl and data nodes */
168 for (int i = 0U; i < SIZE; i++) {
169 node = ull_tx_q_dequeue(&tx_q);
170 zassert_equal_ptr(node, &ctrl_nodes1[i], NULL);
171
172 node = ull_tx_q_dequeue(&tx_q);
173 zassert_equal_ptr(node, &data_nodes1[i], NULL);
174 }
175
176 /* Tx Queue shall be empty */
177 node = ull_tx_q_dequeue(&tx_q);
178 zassert_equal_ptr(node, NULL, "");
179 }
180
181 /*
182 * (1) Enqueue ctrl and data nodes interleaved.
183 * Pause Tx Queue.
184 * (2) Enqueue ctrl and data nodes interleaved.
185 * Dequeue and verify order of ctrl and data nodes from (1).
186 * Dequeue and verify order of ctrl nodes from (2).
187 * Verify Tx Queue is empty.
188 */
ZTEST(tx_q,test_ctrl_and_data_3)189 ZTEST(tx_q, test_ctrl_and_data_3)
190 {
191 struct ull_tx_q tx_q;
192 struct node_tx *node;
193 struct node_tx ctrl_nodes1[SIZE] = { 0 };
194 struct node_tx ctrl_nodes2[SIZE] = { 0 };
195 struct node_tx data_nodes1[SIZE] = { 0 };
196 struct node_tx data_nodes2[SIZE] = { 0 };
197
198 ull_tx_q_init(&tx_q);
199
200 /* Enqueue ctrl and data nodes */
201 for (int i = 0U; i < SIZE; i++) {
202 ull_tx_q_enqueue_ctrl(&tx_q, &ctrl_nodes1[i]);
203 ull_tx_q_enqueue_data(&tx_q, &data_nodes1[i]);
204 }
205
206 /* Pause Tx Queue */
207 ull_tx_q_pause_data(&tx_q);
208
209 /* Enqueue ctrl and data nodes */
210 for (int i = 0U; i < SIZE; i++) {
211 ull_tx_q_enqueue_ctrl(&tx_q, &ctrl_nodes2[i]);
212 ull_tx_q_enqueue_data(&tx_q, &data_nodes2[i]);
213 }
214
215 /* Dequeue ctrl and data nodes */
216 for (int i = 0U; i < SIZE; i++) {
217 node = ull_tx_q_dequeue(&tx_q);
218 zassert_equal_ptr(node, &ctrl_nodes1[i], NULL);
219
220 node = ull_tx_q_dequeue(&tx_q);
221 zassert_equal_ptr(node, &data_nodes1[i], NULL);
222 }
223
224 /* Dequeue ctrl nodes */
225 for (int i = 0U; i < SIZE; i++) {
226 node = ull_tx_q_dequeue(&tx_q);
227 zassert_equal_ptr(node, &ctrl_nodes2[i], NULL);
228 }
229
230 /* Tx Queue shall be empty */
231 node = ull_tx_q_dequeue(&tx_q);
232 zassert_equal_ptr(node, NULL, "");
233 }
234
235 /*
236 * (1) Enqueue ctrl and data nodes interleaved.
237 * Pause Tx Queue.
238 * (2) Enqueue ctrl and data nodes interleaved.
239 * Resume Tx Queue.
240 * Dequeue and verify order of ctrl and data nodes from (1).
241 * Dequeue and verify order of ctrl nodes from (2).
242 * Dequeue and verify order of data nodes from (2).
243 * Verify Tx Queue is empty.
244 */
ZTEST(tx_q,test_ctrl_and_data_4)245 ZTEST(tx_q, test_ctrl_and_data_4)
246 {
247 struct ull_tx_q tx_q;
248 struct node_tx *node;
249 struct node_tx ctrl_nodes1[SIZE] = { 0 };
250 struct node_tx ctrl_nodes2[SIZE] = { 0 };
251 struct node_tx data_nodes1[SIZE] = { 0 };
252 struct node_tx data_nodes2[SIZE] = { 0 };
253
254 ull_tx_q_init(&tx_q);
255
256 /* Enqueue ctrl and data nodes */
257 for (int i = 0U; i < SIZE; i++) {
258 ull_tx_q_enqueue_ctrl(&tx_q, &ctrl_nodes1[i]);
259 ull_tx_q_enqueue_data(&tx_q, &data_nodes1[i]);
260 }
261
262 /* Pause Tx Queue */
263 ull_tx_q_pause_data(&tx_q);
264
265 /* Enqueue ctrl and data nodes */
266 for (int i = 0U; i < SIZE; i++) {
267 ull_tx_q_enqueue_ctrl(&tx_q, &ctrl_nodes2[i]);
268 ull_tx_q_enqueue_data(&tx_q, &data_nodes2[i]);
269 }
270
271 /* Resume Tx Queue */
272 ull_tx_q_resume_data(&tx_q);
273
274 /* Dequeue ctrl and data nodes */
275 for (int i = 0U; i < SIZE; i++) {
276 node = ull_tx_q_dequeue(&tx_q);
277 zassert_equal_ptr(node, &ctrl_nodes1[i], NULL);
278
279 node = ull_tx_q_dequeue(&tx_q);
280 zassert_equal_ptr(node, &data_nodes1[i], NULL);
281 }
282
283 /* Dequeue ctrl nodes */
284 for (int i = 0U; i < SIZE; i++) {
285 node = ull_tx_q_dequeue(&tx_q);
286 zassert_equal_ptr(node, &ctrl_nodes2[i], NULL);
287 }
288
289 /* Dequeue data nodes */
290 for (int i = 0U; i < SIZE; i++) {
291 node = ull_tx_q_dequeue(&tx_q);
292 zassert_equal_ptr(node, &data_nodes2[i], NULL);
293 }
294
295 /* Tx Queue shall be empty */
296 node = ull_tx_q_dequeue(&tx_q);
297 zassert_equal_ptr(node, NULL, "");
298 }
299
300 /*
301 * (1) Enqueue ctrl and data nodes interleaved.
302 * Pause Tx Queue.
303 * (2) Enqueue ctrl and data nodes interleaved.
304 * Resume Tx Queue.
305 * (3) Enqueue ctrl and data nodes interleaved.
306 * Dequeue and verify order of ctrl and data nodes from (1).
307 * Dequeue and verify order of ctrl nodes from (2).
308 * Dequeue and verify order of data nodes from (2).
309 * Dequeue and verify order of ctrl and data nodes from (3).
310 * Verify Tx Queue is empty.
311 */
ZTEST(tx_q,test_ctrl_and_data_5)312 ZTEST(tx_q, test_ctrl_and_data_5)
313 {
314 struct ull_tx_q tx_q;
315 struct node_tx *node;
316 struct node_tx ctrl_nodes1[SIZE] = { 0 };
317 struct node_tx ctrl_nodes2[SIZE] = { 0 };
318 struct node_tx ctrl_nodes3[SIZE] = { 0 };
319 struct node_tx data_nodes1[SIZE] = { 0 };
320 struct node_tx data_nodes2[SIZE] = { 0 };
321 struct node_tx data_nodes3[SIZE] = { 0 };
322
323 ull_tx_q_init(&tx_q);
324
325 /* Enqueue ctrl and data nodes */
326 for (int i = 0U; i < SIZE; i++) {
327 ull_tx_q_enqueue_ctrl(&tx_q, &ctrl_nodes1[i]);
328 ull_tx_q_enqueue_data(&tx_q, &data_nodes1[i]);
329 }
330
331 /* Pause Tx Queue */
332 ull_tx_q_pause_data(&tx_q);
333
334 /* Enqueue ctrl and data nodes */
335 for (int i = 0U; i < SIZE; i++) {
336 ull_tx_q_enqueue_ctrl(&tx_q, &ctrl_nodes2[i]);
337 ull_tx_q_enqueue_data(&tx_q, &data_nodes2[i]);
338 }
339
340 /* Resume Tx Queue */
341 ull_tx_q_resume_data(&tx_q);
342
343 /* Enqueue ctrl and data nodes */
344 for (int i = 0U; i < SIZE; i++) {
345 ull_tx_q_enqueue_ctrl(&tx_q, &ctrl_nodes3[i]);
346 ull_tx_q_enqueue_data(&tx_q, &data_nodes3[i]);
347 }
348
349 /* Dequeue ctrl and data nodes */
350 for (int i = 0U; i < SIZE; i++) {
351 node = ull_tx_q_dequeue(&tx_q);
352 zassert_equal_ptr(node, &ctrl_nodes1[i], NULL);
353
354 node = ull_tx_q_dequeue(&tx_q);
355 zassert_equal_ptr(node, &data_nodes1[i], NULL);
356 }
357
358 /* Dequeue ctrl nodes */
359 for (int i = 0U; i < SIZE; i++) {
360 node = ull_tx_q_dequeue(&tx_q);
361
362 zassert_equal_ptr(node, &ctrl_nodes2[i], NULL);
363 }
364
365 /* Dequeue data nodes */
366 for (int i = 0U; i < SIZE; i++) {
367 node = ull_tx_q_dequeue(&tx_q);
368
369 zassert_equal_ptr(node, &data_nodes2[i], NULL);
370 }
371
372 /* Dequeue ctrl and data nodes */
373 for (int i = 0U; i < SIZE; i++) {
374 node = ull_tx_q_dequeue(&tx_q);
375 zassert_equal_ptr(node, &ctrl_nodes3[i], NULL);
376
377 node = ull_tx_q_dequeue(&tx_q);
378 zassert_equal_ptr(node, &data_nodes3[i], NULL);
379 }
380
381 /* Tx Queue shall be empty */
382 node = ull_tx_q_dequeue(&tx_q);
383 zassert_equal_ptr(node, NULL, "");
384 }
385
386 /*
387 * (1) Enqueue data nodes.
388 * Pause Tx Queue TWICE.
389 * (2) Enqueue data nodes.
390 * Dequeue and verify order of data nodes from (1).
391 * Verify Tx Queue is empty.
392 * Resume Tx Queue.
393 * Verify Tx Queue is empty.
394 * Resume Tx Queue.
395 * Dequeue and verify order of data nodes from (2).
396 */
ZTEST(tx_q,test_multiple_pause_resume)397 ZTEST(tx_q, test_multiple_pause_resume)
398 {
399 struct ull_tx_q tx_q;
400 struct node_tx *node;
401 struct node_tx data_nodes1[SIZE] = { 0 };
402 struct node_tx data_nodes2[SIZE] = { 0 };
403
404 ull_tx_q_init(&tx_q);
405
406 /* Enqueue data 1 nodes */
407 for (int i = 0U; i < SIZE; i++) {
408 ull_tx_q_enqueue_data(&tx_q, &data_nodes1[i]);
409 }
410
411 /* Pause Tx Queue Twice */
412 ull_tx_q_pause_data(&tx_q);
413 ull_tx_q_pause_data(&tx_q);
414
415 /* Enqueue data 2 nodes */
416 for (int i = 0U; i < SIZE; i++) {
417 ull_tx_q_enqueue_data(&tx_q, &data_nodes2[i]);
418 }
419
420 /* Dequeue data 1 nodes */
421 for (int i = 0U; i < SIZE; i++) {
422 node = ull_tx_q_dequeue(&tx_q);
423 zassert_equal_ptr(node, &data_nodes1[i], NULL);
424 }
425
426 /* Tx Queue shall be empty */
427 node = ull_tx_q_dequeue(&tx_q);
428 zassert_equal_ptr(node, NULL, "");
429
430 /* Resume Tx Queue */
431 ull_tx_q_resume_data(&tx_q);
432
433 /* Tx Queue shall be empty */
434 node = ull_tx_q_dequeue(&tx_q);
435 zassert_equal_ptr(node, NULL, "");
436
437 /* Resume Tx Queue */
438 ull_tx_q_resume_data(&tx_q);
439
440 /* Dequeue data 2 nodes */
441 for (int i = 0U; i < SIZE; i++) {
442 node = ull_tx_q_dequeue(&tx_q);
443 zassert_equal_ptr(node, &data_nodes2[i], NULL);
444 }
445
446 /* Tx Queue shall be empty */
447 node = ull_tx_q_dequeue(&tx_q);
448 zassert_equal_ptr(node, NULL, "");
449 }
450
451 ZTEST_SUITE(tx_q, NULL, NULL, NULL, NULL, NULL);
452