blob: 704a735553920b9c15f28165da788eacf3742fa2 [file] [log] [blame]
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +01001/*
2 * EdgeTest.cpp
3 *
4 * Copyright (C) 2015 by Sysmocom s.f.m.c. GmbH
5 *
6 * All Rights Reserved
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU Affero General Public License as published by
10 * the Free Software Foundation; either version 3 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU Affero General Public License
19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 *
21 */
22
23#include "gprs_debug.h"
24#include "gprs_coding_scheme.h"
Jacob Erlbeck61679252015-12-11 18:25:21 +010025#include "decoding.h"
Jacob Erlbeckf0e40392016-01-08 10:07:53 +010026#include "encoding.h"
Jacob Erlbeck61679252015-12-11 18:25:21 +010027#include "rlc.h"
Jacob Erlbeck14bb0942016-01-12 11:58:13 +010028#include "llc.h"
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +010029
30extern "C" {
31#include "pcu_vty.h"
32
33#include <osmocom/core/application.h>
34#include <osmocom/core/msgb.h>
35#include <osmocom/core/talloc.h>
36#include <osmocom/core/utils.h>
37#include <osmocom/vty/vty.h>
38}
39
40#include <errno.h>
Jacob Erlbeckf0e40392016-01-08 10:07:53 +010041#include <string.h>
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +010042
43void *tall_pcu_ctx;
44int16_t spoof_mnc = 0, spoof_mcc = 0;
45
46static void check_coding_scheme(GprsCodingScheme& cs, GprsCodingScheme::Mode mode)
47{
48 volatile unsigned expected_size;
49 GprsCodingScheme new_cs;
50
51 OSMO_ASSERT(cs.isValid());
52 OSMO_ASSERT(cs.isCompatible(mode));
53
54 /* Check static getBySizeUL() */
Jacob Erlbeckfc1b3e62016-01-11 09:58:11 +010055 expected_size = cs.usedSizeUL();
56 if (cs.spareBitsUL() > 0 && cs.isGprs())
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +010057 expected_size += 1;
58 OSMO_ASSERT(expected_size == cs.sizeUL());
59 OSMO_ASSERT(cs == GprsCodingScheme::getBySizeUL(expected_size));
60
61 /* Check static sizeUL() */
Jacob Erlbeckfc1b3e62016-01-11 09:58:11 +010062 expected_size = cs.usedSizeDL();
63 if (cs.spareBitsDL() > 0 && cs.isGprs())
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +010064 expected_size += 1;
65 OSMO_ASSERT(expected_size == cs.sizeDL());
66
Jacob Erlbeck392a5452015-12-14 10:38:29 +010067 /* Check data block sizes */
68 OSMO_ASSERT(cs.maxDataBlockBytes() * cs.numDataBlocks() < cs.maxBytesDL());
69 OSMO_ASSERT(cs.maxDataBlockBytes() * cs.numDataBlocks() < cs.maxBytesUL());
70
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +010071 /* Check inc/dec */
72 new_cs = cs;
73 new_cs.inc(mode);
74 OSMO_ASSERT(new_cs.isCompatible(mode));
75 if (new_cs != cs) {
76 new_cs.dec(mode);
77 OSMO_ASSERT(new_cs.isCompatible(mode));
78 OSMO_ASSERT(new_cs == cs);
79 }
80 new_cs.dec(mode);
81 OSMO_ASSERT(new_cs.isCompatible(mode));
82 if (new_cs != cs) {
83 new_cs.inc(mode);
84 OSMO_ASSERT(new_cs.isCompatible(mode));
85 OSMO_ASSERT(new_cs == cs);
86 }
87}
88
89static void test_coding_scheme()
90{
91 unsigned i;
92 unsigned last_size_UL;
93 unsigned last_size_DL;
94 GprsCodingScheme::Scheme gprs_schemes[] = {
95 GprsCodingScheme::CS1,
96 GprsCodingScheme::CS2,
97 GprsCodingScheme::CS3,
98 GprsCodingScheme::CS4
99 };
100 struct {
101 GprsCodingScheme::Scheme s;
102 bool is_gmsk;
103 } egprs_schemes[] = {
104 {GprsCodingScheme::MCS1, true},
105 {GprsCodingScheme::MCS2, true},
106 {GprsCodingScheme::MCS3, true},
107 {GprsCodingScheme::MCS4, true},
108 {GprsCodingScheme::MCS5, false},
109 {GprsCodingScheme::MCS6, false},
110 {GprsCodingScheme::MCS7, false},
111 {GprsCodingScheme::MCS8, false},
112 {GprsCodingScheme::MCS9, false},
113 };
114
115 printf("=== start %s ===\n", __func__);
116
117 GprsCodingScheme cs;
118 OSMO_ASSERT(!cs);
Jacob Erlbeck4c9e5492016-01-04 16:00:05 +0100119 OSMO_ASSERT(GprsCodingScheme::Scheme(cs) == GprsCodingScheme::UNKNOWN);
120 OSMO_ASSERT(cs == GprsCodingScheme(GprsCodingScheme::UNKNOWN));
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +0100121 OSMO_ASSERT(!cs.isCompatible(GprsCodingScheme::GPRS));
122 OSMO_ASSERT(!cs.isCompatible(GprsCodingScheme::EGPRS_GMSK));
123 OSMO_ASSERT(!cs.isCompatible(GprsCodingScheme::EGPRS));
124
125 last_size_UL = 0;
126 last_size_DL = 0;
127
128 for (i = 0; i < ARRAY_SIZE(gprs_schemes); i++) {
129 GprsCodingScheme current_cs(gprs_schemes[i]);
130 OSMO_ASSERT(current_cs.isGprs());
131 OSMO_ASSERT(!current_cs.isEgprs());
132 OSMO_ASSERT(!current_cs.isEgprsGmsk());
Jacob Erlbeck4c9e5492016-01-04 16:00:05 +0100133 OSMO_ASSERT(GprsCodingScheme::Scheme(current_cs) == gprs_schemes[i]);
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +0100134 OSMO_ASSERT(current_cs == GprsCodingScheme(gprs_schemes[i]));
135
136 /* Check strong monotonicity */
137 OSMO_ASSERT(current_cs.maxBytesUL() > last_size_UL);
138 OSMO_ASSERT(current_cs.maxBytesDL() > last_size_DL);
139 last_size_UL = current_cs.maxBytesUL();
140 last_size_DL = current_cs.maxBytesDL();
141
Jacob Erlbeck6c3dc612015-12-14 10:21:26 +0100142 /* Check header types */
143 OSMO_ASSERT(current_cs.headerTypeData() ==
144 GprsCodingScheme::HEADER_GPRS_DATA);
145 OSMO_ASSERT(current_cs.headerTypeControl() ==
146 GprsCodingScheme::HEADER_GPRS_CONTROL);
147
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +0100148 check_coding_scheme(current_cs, GprsCodingScheme::GPRS);
149 }
150 OSMO_ASSERT(i == 4);
151
152 last_size_UL = 0;
153 last_size_DL = 0;
154
155 for (i = 0; i < ARRAY_SIZE(egprs_schemes); i++) {
156 GprsCodingScheme current_cs(egprs_schemes[i].s);
157 OSMO_ASSERT(!current_cs.isGprs());
158 OSMO_ASSERT(current_cs.isEgprs());
159 OSMO_ASSERT(!!current_cs.isEgprsGmsk() == !!egprs_schemes[i].is_gmsk);
Jacob Erlbeck4c9e5492016-01-04 16:00:05 +0100160 OSMO_ASSERT(GprsCodingScheme::Scheme(current_cs) == egprs_schemes[i].s);
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +0100161 OSMO_ASSERT(current_cs == GprsCodingScheme(egprs_schemes[i].s));
162
163 /* Check strong monotonicity */
164 OSMO_ASSERT(current_cs.maxBytesUL() > last_size_UL);
165 OSMO_ASSERT(current_cs.maxBytesDL() > last_size_DL);
166 last_size_UL = current_cs.maxBytesUL();
167 last_size_DL = current_cs.maxBytesDL();
168
169 if (egprs_schemes[i].is_gmsk)
170 check_coding_scheme(current_cs, GprsCodingScheme::EGPRS_GMSK);
171 check_coding_scheme(current_cs, GprsCodingScheme::EGPRS);
172 }
173 OSMO_ASSERT(i == 9);
174
175 printf("=== end %s ===\n", __func__);
176}
177
Jacob Erlbeck38f18692016-02-01 10:08:00 +0100178static void test_rlc_unit_decoder()
Jacob Erlbeck61679252015-12-11 18:25:21 +0100179{
Jacob Erlbeckf2ba4cb2016-01-07 18:59:28 +0100180 struct gprs_rlc_data_block_info rdbi = {0};
Jacob Erlbeck61679252015-12-11 18:25:21 +0100181 GprsCodingScheme cs;
182 uint8_t data[74];
183 Decoding::RlcData chunks[16];
184 volatile int num_chunks = 0;
185 uint32_t tlli, tlli2;
186 unsigned int offs;
187
188
189 printf("=== start %s ===\n", __func__);
190
191 /* TS 44.060, B.1 */
192 cs = GprsCodingScheme::CS4;
193 rdbi.data_len = cs.maxDataBlockBytes();
194 rdbi.e = 0;
195 rdbi.ti = 0;
196 rdbi.cv = 15;
197 tlli = 0;
198 offs = 0;
199 data[offs++] = (11 << 2) | (1 << 1) | (0 << 0);
200 data[offs++] = (26 << 2) | (1 << 1) | (1 << 0);
201 num_chunks = Decoding::rlc_data_from_ul_data(&rdbi, cs, data,
202 chunks, ARRAY_SIZE(chunks), &tlli);
203 OSMO_ASSERT(num_chunks == 3);
204 OSMO_ASSERT(tlli == 0);
205 OSMO_ASSERT(chunks[0].offset == 2);
206 OSMO_ASSERT(chunks[0].length == 11);
207 OSMO_ASSERT(chunks[0].is_complete);
208 OSMO_ASSERT(chunks[1].offset == 13);
209 OSMO_ASSERT(chunks[1].length == 26);
210 OSMO_ASSERT(chunks[1].is_complete);
211 OSMO_ASSERT(chunks[2].offset == 39);
212 OSMO_ASSERT(chunks[2].length == cs.maxDataBlockBytes() - 39);
213 OSMO_ASSERT(!chunks[2].is_complete);
214
215 /* TS 44.060, B.2 */
216 cs = GprsCodingScheme::CS1;
217 rdbi.data_len = cs.maxDataBlockBytes();
218 rdbi.e = 0;
219 rdbi.ti = 0;
220 rdbi.cv = 15;
221 tlli = 0;
222 offs = 0;
223 data[offs++] = (0 << 2) | (0 << 1) | (1 << 0);
224 num_chunks = Decoding::rlc_data_from_ul_data(&rdbi, cs, data,
225 chunks, ARRAY_SIZE(chunks), &tlli);
226 OSMO_ASSERT(num_chunks == 1);
227 OSMO_ASSERT(tlli == 0);
228 OSMO_ASSERT(chunks[0].offset == 1);
229 OSMO_ASSERT(chunks[0].length == 19);
230 OSMO_ASSERT(!chunks[0].is_complete);
231
232 rdbi.e = 0;
233 rdbi.ti = 0;
234 rdbi.cv = 15;
235 tlli = 0;
236 offs = 0;
237 data[offs++] = (1 << 2) | (1 << 1) | (1 << 0);
238 num_chunks = Decoding::rlc_data_from_ul_data(&rdbi, cs, data,
239 chunks, ARRAY_SIZE(chunks), &tlli);
240 OSMO_ASSERT(num_chunks == 2);
241 OSMO_ASSERT(tlli == 0);
242 OSMO_ASSERT(chunks[0].offset == 1);
243 OSMO_ASSERT(chunks[0].length == 1);
244 OSMO_ASSERT(chunks[0].is_complete);
245 OSMO_ASSERT(chunks[1].offset == 2);
246 OSMO_ASSERT(chunks[1].length == 18);
247 OSMO_ASSERT(!chunks[1].is_complete);
248
249 /* TS 44.060, B.3 */
250 cs = GprsCodingScheme::CS1;
251 rdbi.data_len = cs.maxDataBlockBytes();
252 rdbi.e = 0;
253 rdbi.ti = 0;
254 rdbi.cv = 15;
255 tlli = 0;
256 offs = 0;
257 data[offs++] = (7 << 2) | (1 << 1) | (0 << 0);
258 data[offs++] = (11 << 2) | (0 << 1) | (1 << 0);
259 num_chunks = Decoding::rlc_data_from_ul_data(&rdbi, cs, data,
260 chunks, ARRAY_SIZE(chunks), &tlli);
261 OSMO_ASSERT(num_chunks == 2);
262 OSMO_ASSERT(tlli == 0);
263 OSMO_ASSERT(chunks[0].offset == 2);
264 OSMO_ASSERT(chunks[0].length == 7);
265 OSMO_ASSERT(chunks[0].is_complete);
266 OSMO_ASSERT(chunks[1].offset == 9);
267 OSMO_ASSERT(chunks[1].length == 11);
268 OSMO_ASSERT(chunks[1].is_complete);
269
270 /* TS 44.060, B.4 */
271 cs = GprsCodingScheme::CS1;
272 rdbi.data_len = cs.maxDataBlockBytes();
273 rdbi.e = 1;
274 rdbi.ti = 0;
275 rdbi.cv = 15;
276 tlli = 0;
277 offs = 0;
278 num_chunks = Decoding::rlc_data_from_ul_data(&rdbi, cs, data,
279 chunks, ARRAY_SIZE(chunks), &tlli);
280 OSMO_ASSERT(num_chunks == 1);
281 OSMO_ASSERT(tlli == 0);
282 OSMO_ASSERT(chunks[0].offset == 0);
283 OSMO_ASSERT(chunks[0].length == 20);
284 OSMO_ASSERT(!chunks[0].is_complete);
285
286 /* TS 44.060, B.6 */
287 cs = GprsCodingScheme::CS1;
288 rdbi.data_len = cs.maxDataBlockBytes();
289 rdbi.e = 1;
290 rdbi.ti = 0;
291 rdbi.cv = 0;
292 tlli = 0;
293 offs = 0;
294 num_chunks = Decoding::rlc_data_from_ul_data(&rdbi, cs, data,
295 chunks, ARRAY_SIZE(chunks), &tlli);
296 OSMO_ASSERT(num_chunks == 1);
297 OSMO_ASSERT(tlli == 0);
298 OSMO_ASSERT(chunks[0].offset == 0);
299 OSMO_ASSERT(chunks[0].length == 20);
300 OSMO_ASSERT(chunks[0].is_complete);
301
302 /* TS 44.060, B.8.1 */
303 cs = GprsCodingScheme::MCS4;
304 rdbi.data_len = cs.maxDataBlockBytes();
305 rdbi.e = 0;
306 rdbi.ti = 0;
307 rdbi.cv = 15;
308 tlli = 0;
309 offs = 0;
310 data[offs++] = (11 << 1) | (0 << 0);
311 data[offs++] = (26 << 1) | (1 << 0);
312 num_chunks = Decoding::rlc_data_from_ul_data(&rdbi, cs, data,
313 chunks, ARRAY_SIZE(chunks), &tlli);
314 OSMO_ASSERT(num_chunks == 3);
315 OSMO_ASSERT(tlli == 0);
316 OSMO_ASSERT(chunks[0].offset == 2);
317 OSMO_ASSERT(chunks[0].length == 11);
318 OSMO_ASSERT(chunks[0].is_complete);
319 OSMO_ASSERT(chunks[1].offset == 13);
320 OSMO_ASSERT(chunks[1].length == 26);
321 OSMO_ASSERT(chunks[1].is_complete);
322 OSMO_ASSERT(chunks[2].offset == 39);
323 OSMO_ASSERT(chunks[2].length == 5);
324 OSMO_ASSERT(!chunks[2].is_complete);
325
326 /* TS 44.060, B.8.2 */
327
328 /* Note that the spec confuses the byte numbering here, since it
329 * includes the FBI/E header bits into the N2 octet count which
330 * is not consistent with Section 10.3a.1 & 10.3a.2. */
331
332 cs = GprsCodingScheme::MCS2;
333 rdbi.data_len = cs.maxDataBlockBytes();
334 rdbi.e = 0;
335 rdbi.ti = 0;
336 rdbi.cv = 15;
337 tlli = 0;
338 offs = 0;
339 data[offs++] = (15 << 1) | (1 << 0);
340 num_chunks = Decoding::rlc_data_from_ul_data(&rdbi, cs, data,
341 chunks, ARRAY_SIZE(chunks), &tlli);
342 OSMO_ASSERT(num_chunks == 2);
343 OSMO_ASSERT(tlli == 0);
344 OSMO_ASSERT(chunks[0].offset == 1);
345 OSMO_ASSERT(chunks[0].length == 15);
346 OSMO_ASSERT(chunks[0].is_complete);
347 OSMO_ASSERT(chunks[1].offset == 16);
348 OSMO_ASSERT(chunks[1].length == 12);
349 OSMO_ASSERT(!chunks[1].is_complete);
350
351 rdbi.e = 0;
352 rdbi.ti = 0;
353 rdbi.cv = 15;
354 tlli = 0;
355 offs = 0;
356 data[offs++] = ( 0 << 1) | (0 << 0);
357 data[offs++] = ( 7 << 1) | (0 << 0);
358 data[offs++] = (18 << 1) | (1 << 0); /* Differs from spec's N2-11 = 17 */
359 num_chunks = Decoding::rlc_data_from_ul_data(&rdbi, cs, data,
360 chunks, ARRAY_SIZE(chunks), &tlli);
361 OSMO_ASSERT(num_chunks == 3);
362 OSMO_ASSERT(tlli == 0);
363 OSMO_ASSERT(chunks[0].offset == 3);
364 OSMO_ASSERT(chunks[0].length == 0);
365 OSMO_ASSERT(chunks[0].is_complete);
366 OSMO_ASSERT(chunks[1].offset == 3);
367 OSMO_ASSERT(chunks[1].length == 7);
368 OSMO_ASSERT(chunks[1].is_complete);
369 OSMO_ASSERT(chunks[2].offset == 10);
370 OSMO_ASSERT(chunks[2].length == 18);
371 OSMO_ASSERT(chunks[2].is_complete);
372
373 rdbi.e = 0;
374 rdbi.ti = 0;
375 rdbi.cv = 0;
376 tlli = 0;
377 offs = 0;
378 data[offs++] = ( 6 << 1) | (0 << 0);
379 data[offs++] = (12 << 1) | (0 << 0);
380 data[offs++] = (127 << 1) | (1 << 0);
381 num_chunks = Decoding::rlc_data_from_ul_data(&rdbi, cs, data,
382 chunks, ARRAY_SIZE(chunks), &tlli);
383 OSMO_ASSERT(num_chunks == 2);
384 OSMO_ASSERT(tlli == 0);
385 OSMO_ASSERT(chunks[0].offset == 3);
386 OSMO_ASSERT(chunks[0].length == 6);
387 OSMO_ASSERT(chunks[0].is_complete);
388 OSMO_ASSERT(chunks[1].offset == 9);
389 OSMO_ASSERT(chunks[1].length == 12);
390 OSMO_ASSERT(chunks[1].is_complete);
391
392 /* TS 44.060, B.8.3 */
393
394 /* Note that the spec confuses the byte numbering here, too (see above) */
395
396 cs = GprsCodingScheme::MCS2;
397 rdbi.data_len = cs.maxDataBlockBytes();
398 rdbi.e = 1;
399 rdbi.ti = 0;
400 rdbi.cv = 0;
401 tlli = 0;
402 offs = 0;
403 num_chunks = Decoding::rlc_data_from_ul_data(&rdbi, cs, data,
404 chunks, ARRAY_SIZE(chunks), &tlli);
405 OSMO_ASSERT(num_chunks == 1);
406 OSMO_ASSERT(tlli == 0);
407 OSMO_ASSERT(chunks[0].offset == 0);
408 OSMO_ASSERT(chunks[0].length == 28);
409 OSMO_ASSERT(chunks[0].is_complete);
410
411 /* CS-1, TLLI, last block, single chunk until the end of the block */
412 cs = GprsCodingScheme::CS1;
413 rdbi.data_len = cs.maxDataBlockBytes();
414 rdbi.e = 1;
415 rdbi.ti = 1;
416 rdbi.cv = 0;
417 tlli = 0;
418 tlli2 = 0xffeeddcc;
419 offs = 0;
420 data[offs++] = tlli2 >> 24;
421 data[offs++] = tlli2 >> 16;
422 data[offs++] = tlli2 >> 8;
423 data[offs++] = tlli2 >> 0;
424 num_chunks = Decoding::rlc_data_from_ul_data(&rdbi, cs, data,
425 chunks, ARRAY_SIZE(chunks), &tlli);
426 OSMO_ASSERT(num_chunks == 1);
427 OSMO_ASSERT(tlli == tlli2);
428 OSMO_ASSERT(chunks[0].offset == 4);
429 OSMO_ASSERT(chunks[0].length == 16);
430 OSMO_ASSERT(chunks[0].is_complete);
431
432 /* Like TS 44.060, B.2, first RLC block but with TLLI */
433 cs = GprsCodingScheme::CS1;
434 rdbi.data_len = cs.maxDataBlockBytes();
435 rdbi.e = 0;
436 rdbi.ti = 1;
437 rdbi.cv = 15;
438 tlli = 0;
439 tlli2 = 0xffeeddbb;
440 offs = 0;
441 data[offs++] = (0 << 2) | (0 << 1) | (1 << 0);
442 data[offs++] = tlli2 >> 24;
443 data[offs++] = tlli2 >> 16;
444 data[offs++] = tlli2 >> 8;
445 data[offs++] = tlli2 >> 0;
446 num_chunks = Decoding::rlc_data_from_ul_data(&rdbi, cs, data,
447 chunks, ARRAY_SIZE(chunks), &tlli);
448 OSMO_ASSERT(num_chunks == 1);
449 OSMO_ASSERT(tlli == tlli2);
450 OSMO_ASSERT(chunks[0].offset == 5);
451 OSMO_ASSERT(chunks[0].length == 15);
452 OSMO_ASSERT(!chunks[0].is_complete);
453
454 /* Like TS 44.060, B.8.1 but with TLLI */
455 cs = GprsCodingScheme::MCS4;
456 rdbi.data_len = cs.maxDataBlockBytes();
457 rdbi.e = 0;
458 rdbi.ti = 1;
459 rdbi.cv = 15;
460 tlli = 0;
461 tlli2 = 0xffeeddaa;
462 offs = 0;
463 data[offs++] = (11 << 1) | (0 << 0);
464 data[offs++] = (26 << 1) | (1 << 0);
465 /* Little endian */
466 data[offs++] = tlli2 >> 0;
467 data[offs++] = tlli2 >> 8;
468 data[offs++] = tlli2 >> 16;
469 data[offs++] = tlli2 >> 24;
470 num_chunks = Decoding::rlc_data_from_ul_data(&rdbi, cs, data,
471 chunks, ARRAY_SIZE(chunks), &tlli);
472 OSMO_ASSERT(num_chunks == 3);
473 OSMO_ASSERT(tlli == tlli2);
474 OSMO_ASSERT(chunks[0].offset == 6);
475 OSMO_ASSERT(chunks[0].length == 11);
476 OSMO_ASSERT(chunks[0].is_complete);
477 OSMO_ASSERT(chunks[1].offset == 17);
478 OSMO_ASSERT(chunks[1].length == 26);
479 OSMO_ASSERT(chunks[1].is_complete);
480 OSMO_ASSERT(chunks[2].offset == 43);
481 OSMO_ASSERT(chunks[2].length == 1);
482 OSMO_ASSERT(!chunks[2].is_complete);
483
484 printf("=== end %s ===\n", __func__);
485}
486
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100487static void test_rlc_unit_encoder()
488{
489 struct gprs_rlc_data_block_info rdbi = {0};
490 GprsCodingScheme cs;
491 uint8_t data[74];
492 uint8_t llc_data[1500] = {0,};
493 int num_chunks = 0;
494 int write_offset;
495 struct gprs_llc llc;
496 Encoding::AppendResult ar;
497
498 printf("=== start %s ===\n", __func__);
499
500 llc.init();
501
502 /* TS 44.060, B.1 */
503 cs = GprsCodingScheme::CS4;
504 gprs_rlc_data_block_info_init(&rdbi, cs);
505 num_chunks = 0;
506 write_offset = 0;
507 memset(data, 0, sizeof(data));
508
509 llc.reset();
510 llc.put_frame(llc_data, 11);
511
Jacob Erlbeck5058bd62016-01-13 10:51:25 +0100512 ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100513 &llc, &write_offset, &num_chunks, data, false);
514
515 OSMO_ASSERT(ar == Encoding::AR_COMPLETED_SPACE_LEFT);
516 OSMO_ASSERT(rdbi.e == 0);
517 OSMO_ASSERT(write_offset == 1 + 11);
518 OSMO_ASSERT(num_chunks == 1);
519
520 llc.reset();
521 llc.put_frame(llc_data, 26);
522
Jacob Erlbeck5058bd62016-01-13 10:51:25 +0100523 ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100524 &llc, &write_offset, &num_chunks, data, false);
525
526 OSMO_ASSERT(ar == Encoding::AR_COMPLETED_SPACE_LEFT);
527 OSMO_ASSERT(rdbi.e == 0);
528 OSMO_ASSERT(write_offset == 2 + 11 + 26);
529 OSMO_ASSERT(num_chunks == 2);
530
531 llc.reset();
532 llc.put_frame(llc_data, 99);
533
Jacob Erlbeck5058bd62016-01-13 10:51:25 +0100534 ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100535 &llc, &write_offset, &num_chunks, data, false);
536
537 OSMO_ASSERT(ar == Encoding::AR_NEED_MORE_BLOCKS);
538 OSMO_ASSERT(rdbi.e == 0);
539 OSMO_ASSERT(rdbi.cv != 0);
540 OSMO_ASSERT(write_offset == (int)rdbi.data_len);
541 OSMO_ASSERT(num_chunks == 3);
542
543 OSMO_ASSERT(data[0] == ((11 << 2) | (1 << 1) | (0 << 0)));
544 OSMO_ASSERT(data[1] == ((26 << 2) | (1 << 1) | (1 << 0)));
545 OSMO_ASSERT(data[2] == 0);
546
547 /* TS 44.060, B.2 */
548 cs = GprsCodingScheme::CS1;
549
550 /* Block 1 */
551 gprs_rlc_data_block_info_init(&rdbi, cs);
552 num_chunks = 0;
553 write_offset = 0;
554 memset(data, 0, sizeof(data));
555
556 llc.reset();
557 llc.put_frame(llc_data, 20);
558
Jacob Erlbeck5058bd62016-01-13 10:51:25 +0100559 ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100560 &llc, &write_offset, &num_chunks, data, false);
561
562 OSMO_ASSERT(ar == Encoding::AR_NEED_MORE_BLOCKS);
563 OSMO_ASSERT(rdbi.e == 0);
564 OSMO_ASSERT(write_offset == 1 + 19);
565 OSMO_ASSERT(num_chunks == 1);
566
567 OSMO_ASSERT(data[0] == ((0 << 2) | (0 << 1) | (1 << 0)));
568 OSMO_ASSERT(data[1] == 0);
569
570 /* Block 2 */
571 gprs_rlc_data_block_info_init(&rdbi, cs);
572 num_chunks = 0;
573 write_offset = 0;
574 memset(data, 0, sizeof(data));
575
576 OSMO_ASSERT(llc.chunk_size() == 1);
577
Jacob Erlbeck5058bd62016-01-13 10:51:25 +0100578 ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100579 &llc, &write_offset, &num_chunks, data, false);
580
581 OSMO_ASSERT(ar == Encoding::AR_COMPLETED_SPACE_LEFT);
582 OSMO_ASSERT(rdbi.e == 0);
583 OSMO_ASSERT(write_offset == 1 + 1);
584 OSMO_ASSERT(num_chunks == 1);
585
586 llc.reset();
587 llc.put_frame(llc_data, 99);
588
Jacob Erlbeck5058bd62016-01-13 10:51:25 +0100589 ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100590 &llc, &write_offset, &num_chunks, data, false);
591
592 OSMO_ASSERT(ar == Encoding::AR_NEED_MORE_BLOCKS);
593 OSMO_ASSERT(rdbi.e == 0);
594 OSMO_ASSERT(write_offset == 1 + 1 + 18);
595 OSMO_ASSERT(num_chunks == 2);
596
597 OSMO_ASSERT(data[0] == ((1 << 2) | (1 << 1) | (1 << 0)));
598 OSMO_ASSERT(data[1] == 0);
599
600 /* TS 44.060, B.3 */
601 cs = GprsCodingScheme::CS1;
602
603 /* Block 1 */
604 gprs_rlc_data_block_info_init(&rdbi, cs);
605 num_chunks = 0;
606 write_offset = 0;
607 memset(data, 0, sizeof(data));
608
609 llc.reset();
610 llc.put_frame(llc_data, 7);
611
Jacob Erlbeck5058bd62016-01-13 10:51:25 +0100612 ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100613 &llc, &write_offset, &num_chunks, data, false);
614
615 OSMO_ASSERT(ar == Encoding::AR_COMPLETED_SPACE_LEFT);
616 OSMO_ASSERT(rdbi.e == 0);
617 OSMO_ASSERT(write_offset == 1 + 7);
618 OSMO_ASSERT(num_chunks == 1);
619
620 llc.reset();
621 llc.put_frame(llc_data, 11);
622
Jacob Erlbeck5058bd62016-01-13 10:51:25 +0100623 ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100624 &llc, &write_offset, &num_chunks, data, false);
625
626 OSMO_ASSERT(ar == Encoding::AR_COMPLETED_BLOCK_FILLED);
627 OSMO_ASSERT(rdbi.e == 0);
628 OSMO_ASSERT(write_offset == 2 + 7 + 11);
629 OSMO_ASSERT(num_chunks == 2);
630
631 OSMO_ASSERT(data[0] == ((7 << 2) | (1 << 1) | (0 << 0)));
632 OSMO_ASSERT(data[1] == ((11 << 2) | (0 << 1) | (1 << 0)));
633 OSMO_ASSERT(data[2] == 0);
634
635 /* TS 44.060, B.4 */
636 cs = GprsCodingScheme::CS1;
637
638 /* Block 1 */
639 gprs_rlc_data_block_info_init(&rdbi, cs);
640 num_chunks = 0;
641 write_offset = 0;
642 memset(data, 0, sizeof(data));
643
644 llc.reset();
645 llc.put_frame(llc_data, 99);
646
Jacob Erlbeck5058bd62016-01-13 10:51:25 +0100647 ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100648 &llc, &write_offset, &num_chunks, data, false);
649
650 OSMO_ASSERT(ar == Encoding::AR_NEED_MORE_BLOCKS);
651 OSMO_ASSERT(rdbi.e == 1);
652 OSMO_ASSERT(write_offset == 20);
653 OSMO_ASSERT(num_chunks == 1);
654 OSMO_ASSERT(rdbi.cv != 0);
655
656 OSMO_ASSERT(data[0] == 0);
657
658 /* TS 44.060, B.5 */
659 cs = GprsCodingScheme::CS1;
660
661 /* Block 1 */
662 gprs_rlc_data_block_info_init(&rdbi, cs);
663 num_chunks = 0;
664 write_offset = 0;
665 memset(data, 0, sizeof(data));
666
667 llc.reset();
668 llc.put_frame(llc_data, 20);
669
Jacob Erlbeck5058bd62016-01-13 10:51:25 +0100670 ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100671 &llc, &write_offset, &num_chunks, data, true);
672
673 OSMO_ASSERT(ar == Encoding::AR_COMPLETED_BLOCK_FILLED);
674 OSMO_ASSERT(rdbi.e == 1);
675 OSMO_ASSERT(write_offset == 20);
676 OSMO_ASSERT(num_chunks == 1);
677 OSMO_ASSERT(rdbi.cv == 0);
678
679 OSMO_ASSERT(data[0] == 0);
680
681 /* TS 44.060, B.7 */
682 cs = GprsCodingScheme::CS1;
683
684 /* Block 1 */
685 gprs_rlc_data_block_info_init(&rdbi, cs);
686 num_chunks = 0;
687 write_offset = 0;
688 memset(data, 0, sizeof(data));
689
690 llc.reset();
691 llc.put_frame(llc_data, 30);
692
Jacob Erlbeck5058bd62016-01-13 10:51:25 +0100693 ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100694 &llc, &write_offset, &num_chunks, data, false);
695
696 OSMO_ASSERT(ar == Encoding::AR_NEED_MORE_BLOCKS);
697 OSMO_ASSERT(rdbi.e == 1);
698 OSMO_ASSERT(write_offset == 20);
699 OSMO_ASSERT(num_chunks == 1);
700
701 OSMO_ASSERT(data[0] == 0);
702
703 /* Block 2 */
704 gprs_rlc_data_block_info_init(&rdbi, cs);
705 num_chunks = 0;
706 write_offset = 0;
707 memset(data, 0, sizeof(data));
708
709 OSMO_ASSERT(llc.chunk_size() == 10);
710
Jacob Erlbeck5058bd62016-01-13 10:51:25 +0100711 ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100712 &llc, &write_offset, &num_chunks, data, false);
713
714 OSMO_ASSERT(ar == Encoding::AR_COMPLETED_SPACE_LEFT);
715 OSMO_ASSERT(rdbi.e == 0);
716 OSMO_ASSERT(write_offset == 1 + 10);
717 OSMO_ASSERT(num_chunks == 1);
718
719 llc.reset();
720 llc.put_frame(llc_data, 99);
721
Jacob Erlbeck5058bd62016-01-13 10:51:25 +0100722 ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100723 &llc, &write_offset, &num_chunks, data, false);
724
725 OSMO_ASSERT(ar == Encoding::AR_NEED_MORE_BLOCKS);
726 OSMO_ASSERT(rdbi.e == 0);
727 OSMO_ASSERT(write_offset == 1 + 10 + 9);
728 OSMO_ASSERT(num_chunks == 2);
729
730 OSMO_ASSERT(data[0] == ((10 << 2) | (1 << 1) | (1 << 0)));
731 OSMO_ASSERT(data[1] == 0);
732
Jacob Erlbecka88d0652016-01-13 11:28:10 +0100733 /* TS 44.060, B.8.1 */
734 cs = GprsCodingScheme::MCS4;
735
736 /* Block 1 */
737 gprs_rlc_data_block_info_init(&rdbi, cs);
738 num_chunks = 0;
739 write_offset = 0;
740 memset(data, 0, sizeof(data));
741
742 llc.reset();
743 llc.put_frame(llc_data, 11);
744
745 ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
746 &llc, &write_offset, &num_chunks, data, false);
747
748 OSMO_ASSERT(ar == Encoding::AR_COMPLETED_SPACE_LEFT);
749 OSMO_ASSERT(rdbi.e == 0);
750 OSMO_ASSERT(write_offset == 1 + 11);
751 OSMO_ASSERT(num_chunks == 1);
752
753 llc.reset();
754 llc.put_frame(llc_data, 26);
755
756 ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
757 &llc, &write_offset, &num_chunks, data, false);
758
759 OSMO_ASSERT(ar == Encoding::AR_COMPLETED_SPACE_LEFT);
760 OSMO_ASSERT(rdbi.e == 0);
761 OSMO_ASSERT(write_offset == 2 + 11 + 26);
762 OSMO_ASSERT(num_chunks == 2);
763
764 llc.reset();
765 llc.put_frame(llc_data, 99);
766
767 ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
768 &llc, &write_offset, &num_chunks, data, false);
769
770 OSMO_ASSERT(ar == Encoding::AR_NEED_MORE_BLOCKS);
771 OSMO_ASSERT(rdbi.e == 0);
772 OSMO_ASSERT(rdbi.cv != 0);
773 OSMO_ASSERT(write_offset == (int)rdbi.data_len);
774 OSMO_ASSERT(num_chunks == 3);
775
776 OSMO_ASSERT(data[0] == ((11 << 1) | (0 << 0)));
777 OSMO_ASSERT(data[1] == ((26 << 1) | (1 << 0)));
778 OSMO_ASSERT(data[2] == 0);
779
780 /* TS 44.060, B.8.2 */
781
782 /* Note that the spec confuses the byte numbering here, since it
783 * includes the FBI/E header bits into the N2 octet count which
784 * is not consistent with Section 10.3a.1 & 10.3a.2. */
785
786 cs = GprsCodingScheme::MCS2;
787
788 /* Block 1 */
789 gprs_rlc_data_block_info_init(&rdbi, cs);
790 num_chunks = 0;
791 write_offset = 0;
792 memset(data, 0, sizeof(data));
793
794 llc.reset();
795 llc.put_frame(llc_data, 15);
796
797 ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
798 &llc, &write_offset, &num_chunks, data, false);
799
800 OSMO_ASSERT(ar == Encoding::AR_COMPLETED_SPACE_LEFT);
801 OSMO_ASSERT(rdbi.e == 0);
802 OSMO_ASSERT(write_offset == 1 + 15);
803 OSMO_ASSERT(num_chunks == 1);
804
805 llc.reset();
806 llc.put_frame(llc_data, 12);
807
808 ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
809 &llc, &write_offset, &num_chunks, data, false);
810
811 OSMO_ASSERT(ar == Encoding::AR_NEED_MORE_BLOCKS);
812 OSMO_ASSERT(rdbi.e == 0);
813 OSMO_ASSERT(rdbi.cv != 0);
814 OSMO_ASSERT(write_offset == (int)rdbi.data_len);
815 OSMO_ASSERT(num_chunks == 2);
816
817 OSMO_ASSERT(data[0] == ((15 << 1) | (1 << 0)));
818 OSMO_ASSERT(data[1] == 0);
819
820 /* Block 2 */
821 gprs_rlc_data_block_info_init(&rdbi, cs);
822 num_chunks = 0;
823 write_offset = 0;
824 memset(data, 0, sizeof(data));
825
826 OSMO_ASSERT(llc.chunk_size() == 0);
827
828 ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
829 &llc, &write_offset, &num_chunks, data, false);
830
831 OSMO_ASSERT(ar == Encoding::AR_COMPLETED_SPACE_LEFT);
832 OSMO_ASSERT(rdbi.e == 0);
833 OSMO_ASSERT(write_offset == 1 + 0);
834 OSMO_ASSERT(num_chunks == 1);
835
836 llc.reset();
837 llc.put_frame(llc_data, 7);
838
839 ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
840 &llc, &write_offset, &num_chunks, data, false);
841
842 OSMO_ASSERT(ar == Encoding::AR_COMPLETED_SPACE_LEFT);
843 OSMO_ASSERT(rdbi.e == 0);
844 OSMO_ASSERT(rdbi.cv != 0);
845 OSMO_ASSERT(write_offset == 2 + 0 + 7);
846 OSMO_ASSERT(num_chunks == 2);
847
848 llc.reset();
849 llc.put_frame(llc_data, 18);
850
851 ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
852 &llc, &write_offset, &num_chunks, data, false);
853
854 OSMO_ASSERT(ar == Encoding::AR_COMPLETED_BLOCK_FILLED);
855 OSMO_ASSERT(rdbi.e == 0);
856 OSMO_ASSERT(rdbi.cv != 0);
857 OSMO_ASSERT(write_offset == (int)rdbi.data_len);
858 OSMO_ASSERT(num_chunks == 3);
859
860 OSMO_ASSERT(data[0] == ((0 << 1) | (0 << 0)));
861 OSMO_ASSERT(data[1] == ((7 << 1) | (0 << 0)));
862 OSMO_ASSERT(data[2] == ((18 << 1) | (1 << 0)));
863 OSMO_ASSERT(data[3] == 0);
864
865 /* Block 3 */
866 gprs_rlc_data_block_info_init(&rdbi, cs);
867 num_chunks = 0;
868 write_offset = 0;
869 memset(data, 0, sizeof(data));
870
871 llc.reset();
872 llc.put_frame(llc_data, 6);
873
874 ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
875 &llc, &write_offset, &num_chunks, data, false);
876
877 OSMO_ASSERT(ar == Encoding::AR_COMPLETED_SPACE_LEFT);
878 OSMO_ASSERT(rdbi.e == 0);
879 OSMO_ASSERT(write_offset == 1 + 6);
880 OSMO_ASSERT(num_chunks == 1);
881
882 llc.reset();
883 llc.put_frame(llc_data, 12);
884
885 ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
886 &llc, &write_offset, &num_chunks, data, true);
887
888 OSMO_ASSERT(ar == Encoding::AR_COMPLETED_BLOCK_FILLED);
889 OSMO_ASSERT(rdbi.e == 0);
890 OSMO_ASSERT(rdbi.cv == 0);
891 OSMO_ASSERT(write_offset == (int)rdbi.data_len);
892 OSMO_ASSERT(num_chunks == 3);
893
894 OSMO_ASSERT(data[0] == ((6 << 1) | (0 << 0)));
895 OSMO_ASSERT(data[1] == ((12 << 1) | (0 << 0)));
896 OSMO_ASSERT(data[2] == ((127 << 1) | (1 << 0)));
897 OSMO_ASSERT(data[3] == 0);
898
899 /* TS 44.060, B.8.3 */
900
901 /* Note that the spec confuses the byte numbering here, too (see above) */
902
903 cs = GprsCodingScheme::MCS2;
904
905 /* Block 1 */
906 gprs_rlc_data_block_info_init(&rdbi, cs);
907 num_chunks = 0;
908 write_offset = 0;
909 memset(data, 0, sizeof(data));
910
911 llc.reset();
912 llc.put_frame(llc_data, rdbi.data_len);
913
914 ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
915 &llc, &write_offset, &num_chunks, data, true);
916
917 OSMO_ASSERT(ar == Encoding::AR_COMPLETED_BLOCK_FILLED);
918 OSMO_ASSERT(rdbi.e == 1);
919 OSMO_ASSERT(rdbi.cv == 0);
920 OSMO_ASSERT(write_offset == (int)rdbi.data_len);
921 OSMO_ASSERT(num_chunks == 1);
922
923 OSMO_ASSERT(data[0] == 0);
924
925 /* Final block with an LLC of size data_len-1 */
926
927 cs = GprsCodingScheme::MCS2;
928
929 /* Block 1 */
930 gprs_rlc_data_block_info_init(&rdbi, cs);
931 num_chunks = 0;
932 write_offset = 0;
933 memset(data, 0, sizeof(data));
934
935 llc.reset();
936 llc.put_frame(llc_data, rdbi.data_len - 1);
937
938 ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
939 &llc, &write_offset, &num_chunks, data, true);
940
941 OSMO_ASSERT(ar == Encoding::AR_COMPLETED_BLOCK_FILLED);
942 OSMO_ASSERT(rdbi.e == 0);
943 OSMO_ASSERT(rdbi.cv == 0);
944 OSMO_ASSERT(write_offset == (int)rdbi.data_len);
945 OSMO_ASSERT(num_chunks == 1);
946
947 OSMO_ASSERT(data[0] == (((rdbi.data_len-1) << 1) | (1 << 0)));
948 OSMO_ASSERT(data[1] == 0);
949
950 /* Final block with an LLC of size data_len-2 */
951
952 cs = GprsCodingScheme::MCS2;
953
954 /* Block 1 */
955 gprs_rlc_data_block_info_init(&rdbi, cs);
956 num_chunks = 0;
957 write_offset = 0;
958 memset(data, 0, sizeof(data));
959
960 llc.reset();
961 llc.put_frame(llc_data, rdbi.data_len - 2);
962
963 ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
964 &llc, &write_offset, &num_chunks, data, true);
965
966 OSMO_ASSERT(ar == Encoding::AR_COMPLETED_BLOCK_FILLED);
967 OSMO_ASSERT(rdbi.e == 0);
968 OSMO_ASSERT(rdbi.cv == 0);
969 OSMO_ASSERT(write_offset == (int)rdbi.data_len);
970 OSMO_ASSERT(num_chunks == 2);
971
972 OSMO_ASSERT(data[0] == (((rdbi.data_len-2) << 1) | (0 << 0)));
973 OSMO_ASSERT(data[1] == ((127 << 1) | (1 << 0)));
974 OSMO_ASSERT(data[2] == 0);
975
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100976 printf("=== end %s ===\n", __func__);
977}
978
Jacob Erlbeckf0e40392016-01-08 10:07:53 +0100979static void test_rlc_unaligned_copy()
980{
981 uint8_t bits[256];
982 uint8_t saved_block[256];
983 uint8_t test_block[256];
984 uint8_t out_block[256];
985 GprsCodingScheme::Scheme scheme;
986 int pattern;
987 volatile unsigned int block_idx, i;
988
989 for (scheme = GprsCodingScheme::CS1;
990 scheme < GprsCodingScheme::NUM_SCHEMES;
991 scheme = GprsCodingScheme::Scheme(scheme + 1))
992 {
993 GprsCodingScheme cs(scheme);
994
995 for (pattern = 0; pattern <= 0xff; pattern += 0xff) {
996 /* prepare test block */
997 test_block[0] = pattern ^ 0xff;
998 for (i = 1; i + 1 < cs.maxDataBlockBytes(); i++)
999 test_block[i] = i;
1000 test_block[cs.maxDataBlockBytes()-1] = pattern ^ 0xff;
1001
1002 for (block_idx = 0;
1003 block_idx < cs.numDataBlocks();
1004 block_idx++)
1005 {
1006 struct gprs_rlc_data_info rlc;
1007 gprs_rlc_data_info_init_dl(&rlc, cs);
1008
1009 memset(bits, pattern, sizeof(bits));
1010 Decoding::rlc_copy_to_aligned_buffer(
1011 &rlc, block_idx, bits, saved_block);
1012
1013 fprintf(stderr,
1014 "Test data block: %s\n",
1015 osmo_hexdump(test_block, cs.maxDataBlockBytes()));
1016
1017 Encoding::rlc_copy_from_aligned_buffer(
1018 &rlc, block_idx, bits, test_block);
1019
1020 fprintf(stderr,
1021 "Encoded message block, %s, idx %d, "
1022 "pattern %02x: %s\n",
1023 rlc.cs.name(), block_idx, pattern,
1024 osmo_hexdump(bits, cs.sizeDL()));
1025
1026 Decoding::rlc_copy_to_aligned_buffer(
1027 &rlc, block_idx, bits, out_block);
1028
1029 fprintf(stderr,
1030 "Out data block: %s\n",
1031 osmo_hexdump(out_block, cs.maxDataBlockBytes()));
1032 /* restore original bits */
1033 Encoding::rlc_copy_from_aligned_buffer(
1034 &rlc, block_idx, bits, saved_block);
1035
1036 OSMO_ASSERT(memcmp(test_block, out_block,
1037 rlc.cs.maxDataBlockBytes()) == 0);
1038
1039 for (i = 0; i < sizeof(bits); i++)
1040 OSMO_ASSERT(bits[i] == pattern);
1041 }
1042 }
1043 }
1044}
1045
Jacob Erlbeck6e9f9c22016-01-11 11:15:45 +01001046static void test_rlc_info_init()
1047{
1048 struct gprs_rlc_data_info rlc;
1049
1050 printf("=== start %s ===\n", __func__);
1051 gprs_rlc_data_info_init_dl(&rlc, GprsCodingScheme(GprsCodingScheme::CS1));
1052 OSMO_ASSERT(rlc.num_data_blocks == 1);
1053 OSMO_ASSERT(rlc.data_offs_bits[0] == 24);
1054 OSMO_ASSERT(rlc.block_info[0].data_len == 20);
1055
1056 gprs_rlc_data_info_init_dl(&rlc, GprsCodingScheme(GprsCodingScheme::MCS1));
1057 OSMO_ASSERT(rlc.num_data_blocks == 1);
1058 OSMO_ASSERT(rlc.data_offs_bits[0] == 33);
1059 OSMO_ASSERT(rlc.block_info[0].data_len == 22);
1060
1061 printf("=== end %s ===\n", __func__);
1062}
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +01001063
1064static const struct log_info_cat default_categories[] = {
1065 {"DCSN1", "\033[1;31m", "Concrete Syntax Notation One (CSN1)", LOGL_INFO, 0},
1066 {"DL1IF", "\033[1;32m", "GPRS PCU L1 interface (L1IF)", LOGL_DEBUG, 1},
1067 {"DRLCMAC", "\033[0;33m", "GPRS RLC/MAC layer (RLCMAC)", LOGL_DEBUG, 1},
1068 {"DRLCMACDATA", "\033[0;33m", "GPRS RLC/MAC layer Data (RLCMAC)", LOGL_DEBUG, 1},
1069 {"DRLCMACDL", "\033[1;33m", "GPRS RLC/MAC layer Downlink (RLCMAC)", LOGL_DEBUG, 1},
1070 {"DRLCMACUL", "\033[1;36m", "GPRS RLC/MAC layer Uplink (RLCMAC)", LOGL_DEBUG, 1},
1071 {"DRLCMACSCHED", "\033[0;36m", "GPRS RLC/MAC layer Scheduling (RLCMAC)", LOGL_DEBUG, 1},
1072 {"DRLCMACMEAS", "\033[1;31m", "GPRS RLC/MAC layer Measurements (RLCMAC)", LOGL_INFO, 1},
1073 {"DNS","\033[1;34m", "GPRS Network Service Protocol (NS)", LOGL_INFO , 1},
1074 {"DBSSGP","\033[1;34m", "GPRS BSS Gateway Protocol (BSSGP)", LOGL_INFO , 1},
1075 {"DPCU", "\033[1;35m", "GPRS Packet Control Unit (PCU)", LOGL_NOTICE, 1},
1076};
1077
1078static int filter_fn(const struct log_context *ctx,
1079 struct log_target *tar)
1080{
1081 return 1;
1082}
1083
1084const struct log_info debug_log_info = {
1085 filter_fn,
1086 (struct log_info_cat*)default_categories,
1087 ARRAY_SIZE(default_categories),
1088};
1089
1090int main(int argc, char **argv)
1091{
1092 struct vty_app_info pcu_vty_info = {0};
1093
1094 tall_pcu_ctx = talloc_named_const(NULL, 1, "EdgeTest context");
1095 if (!tall_pcu_ctx)
1096 abort();
1097
1098 msgb_set_talloc_ctx(tall_pcu_ctx);
1099 osmo_init_logging(&debug_log_info);
1100 log_set_use_color(osmo_stderr_target, 0);
1101 log_set_print_filename(osmo_stderr_target, 0);
1102
1103 vty_init(&pcu_vty_info);
1104 pcu_vty_init(&debug_log_info);
1105
1106 test_coding_scheme();
Jacob Erlbeck6e9f9c22016-01-11 11:15:45 +01001107 test_rlc_info_init();
Jacob Erlbeck38f18692016-02-01 10:08:00 +01001108 test_rlc_unit_decoder();
Jacob Erlbeckf0e40392016-01-08 10:07:53 +01001109 test_rlc_unaligned_copy();
Jacob Erlbeck14bb0942016-01-12 11:58:13 +01001110 test_rlc_unit_encoder();
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +01001111
1112 if (getenv("TALLOC_REPORT_FULL"))
1113 talloc_report_full(tall_pcu_ctx, stderr);
1114 return EXIT_SUCCESS;
1115}
1116
1117/*
1118 * stubs that should not be reached
1119 */
1120extern "C" {
1121void l1if_pdch_req() { abort(); }
1122void l1if_connect_pdch() { abort(); }
1123void l1if_close_pdch() { abort(); }
1124void l1if_open_pdch() { abort(); }
1125}