blob: dd318c03a308f66e58d3ca0d7f94e739d51030be [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"
Jacob Erlbeck61679252015-12-11 18:25:21 +010024#include "decoding.h"
Jacob Erlbeckf0e40392016-01-08 10:07:53 +010025#include "encoding.h"
Jacob Erlbeck61679252015-12-11 18:25:21 +010026#include "rlc.h"
Jacob Erlbeck14bb0942016-01-12 11:58:13 +010027#include "llc.h"
Aravind Sirsikar189742b2016-06-14 19:01:14 +053028#include "bts.h"
Max1187a772018-01-26 13:31:42 +010029#include <gprs_rlcmac.h>
30
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +010031extern "C" {
32#include "pcu_vty.h"
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +020033#include "coding_scheme.h"
Pau Espin Pedrolff7c5812022-12-14 18:49:06 +010034#include "alloc_algo.h"
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +010035
36#include <osmocom/core/application.h>
37#include <osmocom/core/msgb.h>
38#include <osmocom/core/talloc.h>
39#include <osmocom/core/utils.h>
40#include <osmocom/vty/vty.h>
Tom Tsoudf698092016-07-11 17:05:19 -070041#include <osmocom/gprs/protocol/gsm_04_60.h>
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +010042}
43
44#include <errno.h>
Jacob Erlbeckf0e40392016-01-08 10:07:53 +010045#include <string.h>
Neels Hofmeyrd34646a2017-02-08 17:07:40 +010046#include <limits.h>
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +010047
48void *tall_pcu_ctx;
49int16_t spoof_mnc = 0, spoof_mcc = 0;
Neels Hofmeyrbdc55fa2018-02-21 00:39:07 +010050bool spoof_mnc_3_digits = false;
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +010051
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +020052static void check_coding_scheme(enum CodingScheme& cs, enum mcs_kind mode)
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +010053{
54 volatile unsigned expected_size;
Jacob Erlbeck2305afd2016-02-03 15:25:04 +010055 bool need_padding;
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +020056 enum CodingScheme new_cs;
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +010057
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +020058 OSMO_ASSERT(mcs_is_valid(cs));
59 OSMO_ASSERT(mcs_is_compat_kind(cs, mode));
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +010060
61 /* Check static getBySizeUL() */
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +020062 expected_size = mcs_used_size_ul(cs);
63 if (mcs_spare_bits_ul(cs) > 0 && mcs_is_gprs(cs))
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +010064 expected_size += 1;
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +020065 OSMO_ASSERT(expected_size == mcs_size_ul(cs));
66 OSMO_ASSERT(cs == mcs_get_by_size_ul(expected_size));
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +010067
68 /* Check static sizeUL() */
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +020069 expected_size = mcs_used_size_dl(cs);
70 if (mcs_spare_bits_dl(cs) > 0 && mcs_is_gprs(cs))
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +010071 expected_size += 1;
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +020072 OSMO_ASSERT(expected_size == mcs_size_dl(cs));
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +010073
Jacob Erlbeck392a5452015-12-14 10:38:29 +010074 /* Check data block sizes */
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +020075 OSMO_ASSERT(mcs_max_data_block_bytes(cs) * num_data_blocks(mcs_header_type(cs)) < mcs_max_bytes_dl(cs));
76 OSMO_ASSERT(mcs_max_data_block_bytes(cs) * num_data_blocks(mcs_header_type(cs)) < mcs_max_bytes_ul(cs));
Jacob Erlbeck392a5452015-12-14 10:38:29 +010077
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +010078 /* Check inc/dec */
79 new_cs = cs;
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +020080 mcs_inc_kind(&new_cs, mode);
81 OSMO_ASSERT(mcs_is_compat_kind(new_cs, mode));
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +010082 if (new_cs != cs) {
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +020083 mcs_dec_kind(&new_cs, mode);
84 OSMO_ASSERT(mcs_is_compat_kind(new_cs, mode));
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +010085 OSMO_ASSERT(new_cs == cs);
86 }
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +020087 mcs_dec_kind(&new_cs, mode);
88 OSMO_ASSERT(mcs_is_compat_kind(new_cs, mode));
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +010089 if (new_cs != cs) {
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +020090 mcs_inc_kind(&new_cs, mode);
91 OSMO_ASSERT(mcs_is_compat_kind(new_cs, mode));
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +010092 OSMO_ASSERT(new_cs == cs);
93 }
Jacob Erlbeck2305afd2016-02-03 15:25:04 +010094
95 new_cs = cs;
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +020096 mcs_dec_to_single_block(&new_cs, &need_padding);
97 OSMO_ASSERT(mcs_is_family_compat(new_cs, cs));
98 OSMO_ASSERT(mcs_is_family_compat(cs, new_cs));
99 OSMO_ASSERT(mcs_is_compat(cs, new_cs));
Jacob Erlbeck2305afd2016-02-03 15:25:04 +0100100 if (need_padding) {
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +0200101 OSMO_ASSERT(mcs_max_data_block_bytes(new_cs) ==
102 mcs_opt_padding_bits(new_cs)/8 + mcs_max_data_block_bytes(cs));
Jacob Erlbeck2305afd2016-02-03 15:25:04 +0100103 } else {
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +0200104 OSMO_ASSERT(mcs_max_data_block_bytes(new_cs) == mcs_max_data_block_bytes(cs));
Jacob Erlbeck2305afd2016-02-03 15:25:04 +0100105 }
106
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +0100107}
108
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +0200109static bool check_strong_monotonicity(const enum CodingScheme cs, uint8_t last_UL, uint8_t last_DL)
Max360e0212019-02-26 17:20:41 +0100110{
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +0200111 if (mcs_max_bytes_ul(cs) <= last_UL)
Max360e0212019-02-26 17:20:41 +0100112 return false;
113
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +0200114 if (mcs_max_bytes_dl(cs) <= last_DL)
Max360e0212019-02-26 17:20:41 +0100115 return false;
116
117 return true;
118}
119
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +0100120static void test_coding_scheme()
121{
122 unsigned i;
Max360e0212019-02-26 17:20:41 +0100123 uint8_t last_size_UL;
124 uint8_t last_size_DL;
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +0200125 enum CodingScheme gprs_schemes[] = {
Maxbea2edb2019-03-06 17:04:59 +0100126 CS1,
127 CS2,
128 CS3,
129 CS4
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +0100130 };
131 struct {
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +0200132 enum CodingScheme s;
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +0100133 bool is_gmsk;
134 } egprs_schemes[] = {
Maxbea2edb2019-03-06 17:04:59 +0100135 { MCS1, true},
136 { MCS2, true},
137 { MCS3, true},
138 { MCS4, true},
139 { MCS5, false},
140 { MCS6, false},
141 { MCS7, false},
142 { MCS8, false},
143 { MCS9, false},
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +0100144 };
145
146 printf("=== start %s ===\n", __func__);
147
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +0200148 enum CodingScheme cs = UNKNOWN;
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +0100149 OSMO_ASSERT(!cs);
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +0200150 OSMO_ASSERT(!mcs_is_compat_kind(cs, GPRS));
151 OSMO_ASSERT(!mcs_is_compat_kind(cs, EGPRS_GMSK));
152 OSMO_ASSERT(!mcs_is_compat_kind(cs, EGPRS));
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +0100153
154 last_size_UL = 0;
155 last_size_DL = 0;
156
157 for (i = 0; i < ARRAY_SIZE(gprs_schemes); i++) {
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +0200158 enum CodingScheme current_cs = gprs_schemes[i];
Max8a8e0fb2019-03-25 16:32:50 +0100159 OSMO_ASSERT(mcs_is_gprs(current_cs));
160 OSMO_ASSERT(!mcs_is_edge(current_cs));
161 OSMO_ASSERT(!mcs_is_edge_gmsk(current_cs));
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +0200162 OSMO_ASSERT(current_cs == gprs_schemes[i]);
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +0100163
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +0200164 OSMO_ASSERT(check_strong_monotonicity(current_cs, last_size_UL, last_size_DL));
165 last_size_UL = mcs_max_bytes_ul(current_cs);
166 last_size_DL = mcs_max_bytes_dl(current_cs);
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +0100167
Jacob Erlbeck6c3dc612015-12-14 10:21:26 +0100168 /* Check header types */
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +0200169 OSMO_ASSERT(mcs_header_type(current_cs) == HEADER_GPRS_DATA);
Jacob Erlbeck6c3dc612015-12-14 10:21:26 +0100170
Maxa4de02d2019-03-13 16:35:09 +0100171 check_coding_scheme(current_cs, GPRS);
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +0100172 }
173 OSMO_ASSERT(i == 4);
174
175 last_size_UL = 0;
176 last_size_DL = 0;
177
178 for (i = 0; i < ARRAY_SIZE(egprs_schemes); i++) {
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +0200179 enum CodingScheme current_cs = egprs_schemes[i].s;
Max8a8e0fb2019-03-25 16:32:50 +0100180 OSMO_ASSERT(!mcs_is_gprs(current_cs));
181 OSMO_ASSERT(mcs_is_edge(current_cs));
182 OSMO_ASSERT(mcs_is_edge_gmsk(current_cs) == !!egprs_schemes[i].is_gmsk);
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +0200183 OSMO_ASSERT(current_cs == egprs_schemes[i].s);
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +0100184
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +0200185 OSMO_ASSERT(check_strong_monotonicity(current_cs, last_size_UL, last_size_DL));
186 last_size_UL = mcs_max_bytes_ul(current_cs);
187 last_size_DL = mcs_max_bytes_dl(current_cs);
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +0100188
189 if (egprs_schemes[i].is_gmsk)
Maxa4de02d2019-03-13 16:35:09 +0100190 check_coding_scheme(current_cs, EGPRS_GMSK);
191 check_coding_scheme(current_cs, EGPRS);
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +0100192 }
193 OSMO_ASSERT(i == 9);
194
195 printf("=== end %s ===\n", __func__);
196}
197
Jacob Erlbeck38f18692016-02-01 10:08:00 +0100198static void test_rlc_unit_decoder()
Jacob Erlbeck61679252015-12-11 18:25:21 +0100199{
Jacob Erlbeckf2ba4cb2016-01-07 18:59:28 +0100200 struct gprs_rlc_data_block_info rdbi = {0};
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +0200201 enum CodingScheme cs;
Jacob Erlbeck61679252015-12-11 18:25:21 +0100202 uint8_t data[74];
203 Decoding::RlcData chunks[16];
204 volatile int num_chunks = 0;
205 uint32_t tlli, tlli2;
206 unsigned int offs;
207
208
209 printf("=== start %s ===\n", __func__);
210
211 /* TS 44.060, B.1 */
Maxbea2edb2019-03-06 17:04:59 +0100212 cs = CS4;
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +0200213 rdbi.data_len = mcs_max_data_block_bytes(cs);
Jacob Erlbeck61679252015-12-11 18:25:21 +0100214 rdbi.e = 0;
215 rdbi.ti = 0;
216 rdbi.cv = 15;
217 tlli = 0;
218 offs = 0;
219 data[offs++] = (11 << 2) | (1 << 1) | (0 << 0);
220 data[offs++] = (26 << 2) | (1 << 1) | (1 << 0);
221 num_chunks = Decoding::rlc_data_from_ul_data(&rdbi, cs, data,
222 chunks, ARRAY_SIZE(chunks), &tlli);
223 OSMO_ASSERT(num_chunks == 3);
224 OSMO_ASSERT(tlli == 0);
225 OSMO_ASSERT(chunks[0].offset == 2);
226 OSMO_ASSERT(chunks[0].length == 11);
227 OSMO_ASSERT(chunks[0].is_complete);
228 OSMO_ASSERT(chunks[1].offset == 13);
229 OSMO_ASSERT(chunks[1].length == 26);
230 OSMO_ASSERT(chunks[1].is_complete);
231 OSMO_ASSERT(chunks[2].offset == 39);
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +0200232 OSMO_ASSERT(chunks[2].length == mcs_max_data_block_bytes(cs) - 39);
Jacob Erlbeck61679252015-12-11 18:25:21 +0100233 OSMO_ASSERT(!chunks[2].is_complete);
234
235 /* TS 44.060, B.2 */
Maxbea2edb2019-03-06 17:04:59 +0100236 cs = CS1;
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +0200237 rdbi.data_len = mcs_max_data_block_bytes(cs);
Jacob Erlbeck61679252015-12-11 18:25:21 +0100238 rdbi.e = 0;
239 rdbi.ti = 0;
240 rdbi.cv = 15;
241 tlli = 0;
242 offs = 0;
243 data[offs++] = (0 << 2) | (0 << 1) | (1 << 0);
244 num_chunks = Decoding::rlc_data_from_ul_data(&rdbi, cs, data,
245 chunks, ARRAY_SIZE(chunks), &tlli);
246 OSMO_ASSERT(num_chunks == 1);
247 OSMO_ASSERT(tlli == 0);
248 OSMO_ASSERT(chunks[0].offset == 1);
249 OSMO_ASSERT(chunks[0].length == 19);
250 OSMO_ASSERT(!chunks[0].is_complete);
251
252 rdbi.e = 0;
253 rdbi.ti = 0;
254 rdbi.cv = 15;
255 tlli = 0;
256 offs = 0;
257 data[offs++] = (1 << 2) | (1 << 1) | (1 << 0);
258 num_chunks = Decoding::rlc_data_from_ul_data(&rdbi, cs, data,
259 chunks, ARRAY_SIZE(chunks), &tlli);
260 OSMO_ASSERT(num_chunks == 2);
261 OSMO_ASSERT(tlli == 0);
262 OSMO_ASSERT(chunks[0].offset == 1);
263 OSMO_ASSERT(chunks[0].length == 1);
264 OSMO_ASSERT(chunks[0].is_complete);
265 OSMO_ASSERT(chunks[1].offset == 2);
266 OSMO_ASSERT(chunks[1].length == 18);
267 OSMO_ASSERT(!chunks[1].is_complete);
268
269 /* TS 44.060, B.3 */
Maxbea2edb2019-03-06 17:04:59 +0100270 cs = CS1;
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +0200271 rdbi.data_len = mcs_max_data_block_bytes(cs);
Jacob Erlbeck61679252015-12-11 18:25:21 +0100272 rdbi.e = 0;
273 rdbi.ti = 0;
274 rdbi.cv = 15;
275 tlli = 0;
276 offs = 0;
277 data[offs++] = (7 << 2) | (1 << 1) | (0 << 0);
278 data[offs++] = (11 << 2) | (0 << 1) | (1 << 0);
279 num_chunks = Decoding::rlc_data_from_ul_data(&rdbi, cs, data,
280 chunks, ARRAY_SIZE(chunks), &tlli);
281 OSMO_ASSERT(num_chunks == 2);
282 OSMO_ASSERT(tlli == 0);
283 OSMO_ASSERT(chunks[0].offset == 2);
284 OSMO_ASSERT(chunks[0].length == 7);
285 OSMO_ASSERT(chunks[0].is_complete);
286 OSMO_ASSERT(chunks[1].offset == 9);
287 OSMO_ASSERT(chunks[1].length == 11);
288 OSMO_ASSERT(chunks[1].is_complete);
289
290 /* TS 44.060, B.4 */
Maxbea2edb2019-03-06 17:04:59 +0100291 cs = CS1;
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +0200292 rdbi.data_len = mcs_max_data_block_bytes(cs);
Jacob Erlbeck61679252015-12-11 18:25:21 +0100293 rdbi.e = 1;
294 rdbi.ti = 0;
295 rdbi.cv = 15;
296 tlli = 0;
297 offs = 0;
298 num_chunks = Decoding::rlc_data_from_ul_data(&rdbi, cs, data,
299 chunks, ARRAY_SIZE(chunks), &tlli);
300 OSMO_ASSERT(num_chunks == 1);
301 OSMO_ASSERT(tlli == 0);
302 OSMO_ASSERT(chunks[0].offset == 0);
303 OSMO_ASSERT(chunks[0].length == 20);
304 OSMO_ASSERT(!chunks[0].is_complete);
305
306 /* TS 44.060, B.6 */
Maxbea2edb2019-03-06 17:04:59 +0100307 cs = CS1;
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +0200308 rdbi.data_len = mcs_max_data_block_bytes(cs);
Jacob Erlbeck61679252015-12-11 18:25:21 +0100309 rdbi.e = 1;
310 rdbi.ti = 0;
311 rdbi.cv = 0;
312 tlli = 0;
313 offs = 0;
314 num_chunks = Decoding::rlc_data_from_ul_data(&rdbi, cs, data,
315 chunks, ARRAY_SIZE(chunks), &tlli);
316 OSMO_ASSERT(num_chunks == 1);
317 OSMO_ASSERT(tlli == 0);
318 OSMO_ASSERT(chunks[0].offset == 0);
319 OSMO_ASSERT(chunks[0].length == 20);
320 OSMO_ASSERT(chunks[0].is_complete);
321
322 /* TS 44.060, B.8.1 */
Maxbea2edb2019-03-06 17:04:59 +0100323 cs = MCS4;
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +0200324 rdbi.data_len = mcs_max_data_block_bytes(cs);
Jacob Erlbeck61679252015-12-11 18:25:21 +0100325 rdbi.e = 0;
326 rdbi.ti = 0;
327 rdbi.cv = 15;
328 tlli = 0;
329 offs = 0;
330 data[offs++] = (11 << 1) | (0 << 0);
331 data[offs++] = (26 << 1) | (1 << 0);
332 num_chunks = Decoding::rlc_data_from_ul_data(&rdbi, cs, data,
333 chunks, ARRAY_SIZE(chunks), &tlli);
334 OSMO_ASSERT(num_chunks == 3);
335 OSMO_ASSERT(tlli == 0);
336 OSMO_ASSERT(chunks[0].offset == 2);
337 OSMO_ASSERT(chunks[0].length == 11);
338 OSMO_ASSERT(chunks[0].is_complete);
339 OSMO_ASSERT(chunks[1].offset == 13);
340 OSMO_ASSERT(chunks[1].length == 26);
341 OSMO_ASSERT(chunks[1].is_complete);
342 OSMO_ASSERT(chunks[2].offset == 39);
343 OSMO_ASSERT(chunks[2].length == 5);
344 OSMO_ASSERT(!chunks[2].is_complete);
345
346 /* TS 44.060, B.8.2 */
347
348 /* Note that the spec confuses the byte numbering here, since it
349 * includes the FBI/E header bits into the N2 octet count which
350 * is not consistent with Section 10.3a.1 & 10.3a.2. */
351
Maxbea2edb2019-03-06 17:04:59 +0100352 cs = MCS2;
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +0200353 rdbi.data_len = mcs_max_data_block_bytes(cs);
Jacob Erlbeck61679252015-12-11 18:25:21 +0100354 rdbi.e = 0;
355 rdbi.ti = 0;
356 rdbi.cv = 15;
357 tlli = 0;
358 offs = 0;
359 data[offs++] = (15 << 1) | (1 << 0);
360 num_chunks = Decoding::rlc_data_from_ul_data(&rdbi, cs, data,
361 chunks, ARRAY_SIZE(chunks), &tlli);
362 OSMO_ASSERT(num_chunks == 2);
363 OSMO_ASSERT(tlli == 0);
364 OSMO_ASSERT(chunks[0].offset == 1);
365 OSMO_ASSERT(chunks[0].length == 15);
366 OSMO_ASSERT(chunks[0].is_complete);
367 OSMO_ASSERT(chunks[1].offset == 16);
368 OSMO_ASSERT(chunks[1].length == 12);
369 OSMO_ASSERT(!chunks[1].is_complete);
370
371 rdbi.e = 0;
372 rdbi.ti = 0;
373 rdbi.cv = 15;
374 tlli = 0;
375 offs = 0;
376 data[offs++] = ( 0 << 1) | (0 << 0);
377 data[offs++] = ( 7 << 1) | (0 << 0);
378 data[offs++] = (18 << 1) | (1 << 0); /* Differs from spec's N2-11 = 17 */
379 num_chunks = Decoding::rlc_data_from_ul_data(&rdbi, cs, data,
380 chunks, ARRAY_SIZE(chunks), &tlli);
381 OSMO_ASSERT(num_chunks == 3);
382 OSMO_ASSERT(tlli == 0);
383 OSMO_ASSERT(chunks[0].offset == 3);
384 OSMO_ASSERT(chunks[0].length == 0);
385 OSMO_ASSERT(chunks[0].is_complete);
386 OSMO_ASSERT(chunks[1].offset == 3);
387 OSMO_ASSERT(chunks[1].length == 7);
388 OSMO_ASSERT(chunks[1].is_complete);
389 OSMO_ASSERT(chunks[2].offset == 10);
390 OSMO_ASSERT(chunks[2].length == 18);
391 OSMO_ASSERT(chunks[2].is_complete);
392
393 rdbi.e = 0;
394 rdbi.ti = 0;
395 rdbi.cv = 0;
396 tlli = 0;
397 offs = 0;
398 data[offs++] = ( 6 << 1) | (0 << 0);
399 data[offs++] = (12 << 1) | (0 << 0);
400 data[offs++] = (127 << 1) | (1 << 0);
401 num_chunks = Decoding::rlc_data_from_ul_data(&rdbi, cs, data,
402 chunks, ARRAY_SIZE(chunks), &tlli);
403 OSMO_ASSERT(num_chunks == 2);
404 OSMO_ASSERT(tlli == 0);
405 OSMO_ASSERT(chunks[0].offset == 3);
406 OSMO_ASSERT(chunks[0].length == 6);
407 OSMO_ASSERT(chunks[0].is_complete);
408 OSMO_ASSERT(chunks[1].offset == 9);
409 OSMO_ASSERT(chunks[1].length == 12);
410 OSMO_ASSERT(chunks[1].is_complete);
411
412 /* TS 44.060, B.8.3 */
413
414 /* Note that the spec confuses the byte numbering here, too (see above) */
415
Maxbea2edb2019-03-06 17:04:59 +0100416 cs = MCS2;
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +0200417 rdbi.data_len = mcs_max_data_block_bytes(cs);
Jacob Erlbeck61679252015-12-11 18:25:21 +0100418 rdbi.e = 1;
419 rdbi.ti = 0;
420 rdbi.cv = 0;
421 tlli = 0;
422 offs = 0;
423 num_chunks = Decoding::rlc_data_from_ul_data(&rdbi, cs, data,
424 chunks, ARRAY_SIZE(chunks), &tlli);
425 OSMO_ASSERT(num_chunks == 1);
426 OSMO_ASSERT(tlli == 0);
427 OSMO_ASSERT(chunks[0].offset == 0);
428 OSMO_ASSERT(chunks[0].length == 28);
429 OSMO_ASSERT(chunks[0].is_complete);
430
431 /* CS-1, TLLI, last block, single chunk until the end of the block */
Maxbea2edb2019-03-06 17:04:59 +0100432 cs = CS1;
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +0200433 rdbi.data_len = mcs_max_data_block_bytes(cs);
Jacob Erlbeck61679252015-12-11 18:25:21 +0100434 rdbi.e = 1;
435 rdbi.ti = 1;
436 rdbi.cv = 0;
437 tlli = 0;
438 tlli2 = 0xffeeddcc;
439 offs = 0;
440 data[offs++] = tlli2 >> 24;
441 data[offs++] = tlli2 >> 16;
442 data[offs++] = tlli2 >> 8;
443 data[offs++] = tlli2 >> 0;
444 num_chunks = Decoding::rlc_data_from_ul_data(&rdbi, cs, data,
445 chunks, ARRAY_SIZE(chunks), &tlli);
446 OSMO_ASSERT(num_chunks == 1);
447 OSMO_ASSERT(tlli == tlli2);
448 OSMO_ASSERT(chunks[0].offset == 4);
449 OSMO_ASSERT(chunks[0].length == 16);
450 OSMO_ASSERT(chunks[0].is_complete);
451
452 /* Like TS 44.060, B.2, first RLC block but with TLLI */
Maxbea2edb2019-03-06 17:04:59 +0100453 cs = CS1;
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +0200454 rdbi.data_len = mcs_max_data_block_bytes(cs);
Jacob Erlbeck61679252015-12-11 18:25:21 +0100455 rdbi.e = 0;
456 rdbi.ti = 1;
457 rdbi.cv = 15;
458 tlli = 0;
459 tlli2 = 0xffeeddbb;
460 offs = 0;
461 data[offs++] = (0 << 2) | (0 << 1) | (1 << 0);
462 data[offs++] = tlli2 >> 24;
463 data[offs++] = tlli2 >> 16;
464 data[offs++] = tlli2 >> 8;
465 data[offs++] = tlli2 >> 0;
466 num_chunks = Decoding::rlc_data_from_ul_data(&rdbi, cs, data,
467 chunks, ARRAY_SIZE(chunks), &tlli);
468 OSMO_ASSERT(num_chunks == 1);
469 OSMO_ASSERT(tlli == tlli2);
470 OSMO_ASSERT(chunks[0].offset == 5);
471 OSMO_ASSERT(chunks[0].length == 15);
472 OSMO_ASSERT(!chunks[0].is_complete);
473
474 /* Like TS 44.060, B.8.1 but with TLLI */
Maxbea2edb2019-03-06 17:04:59 +0100475 cs = MCS4;
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +0200476 rdbi.data_len = mcs_max_data_block_bytes(cs);
Jacob Erlbeck61679252015-12-11 18:25:21 +0100477 rdbi.e = 0;
478 rdbi.ti = 1;
479 rdbi.cv = 15;
480 tlli = 0;
481 tlli2 = 0xffeeddaa;
482 offs = 0;
483 data[offs++] = (11 << 1) | (0 << 0);
484 data[offs++] = (26 << 1) | (1 << 0);
485 /* Little endian */
486 data[offs++] = tlli2 >> 0;
487 data[offs++] = tlli2 >> 8;
488 data[offs++] = tlli2 >> 16;
489 data[offs++] = tlli2 >> 24;
490 num_chunks = Decoding::rlc_data_from_ul_data(&rdbi, cs, data,
491 chunks, ARRAY_SIZE(chunks), &tlli);
492 OSMO_ASSERT(num_chunks == 3);
493 OSMO_ASSERT(tlli == tlli2);
494 OSMO_ASSERT(chunks[0].offset == 6);
495 OSMO_ASSERT(chunks[0].length == 11);
496 OSMO_ASSERT(chunks[0].is_complete);
497 OSMO_ASSERT(chunks[1].offset == 17);
498 OSMO_ASSERT(chunks[1].length == 26);
499 OSMO_ASSERT(chunks[1].is_complete);
500 OSMO_ASSERT(chunks[2].offset == 43);
501 OSMO_ASSERT(chunks[2].length == 1);
502 OSMO_ASSERT(!chunks[2].is_complete);
503
Aravind Sirsikar3463bd42016-09-15 17:19:54 +0530504 rdbi.e = 0;
505 rdbi.ti = 0;
506 rdbi.cv = 1;
507 tlli = 0;
508 offs = 0;
509 data[offs++] = 1;
510 num_chunks = Decoding::rlc_data_from_ul_data(&rdbi, cs, data,
511 chunks, ARRAY_SIZE(chunks), &tlli);
512
Aravind Sirsikar22a90192016-09-15 17:24:49 +0530513 OSMO_ASSERT(num_chunks == 2);
Aravind Sirsikar3463bd42016-09-15 17:19:54 +0530514 OSMO_ASSERT(chunks[0].offset == 1);
Aravind Sirsikar22a90192016-09-15 17:24:49 +0530515 OSMO_ASSERT(chunks[0].length == 0);
516 OSMO_ASSERT(chunks[0].is_complete);
517
518 OSMO_ASSERT(chunks[1].offset == 1);
519 OSMO_ASSERT(chunks[1].length == 43);
520 OSMO_ASSERT(!chunks[1].is_complete);
Aravind Sirsikar3463bd42016-09-15 17:19:54 +0530521
Jacob Erlbeck61679252015-12-11 18:25:21 +0100522 printf("=== end %s ===\n", __func__);
523}
524
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100525static void test_rlc_unit_encoder()
526{
527 struct gprs_rlc_data_block_info rdbi = {0};
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +0200528 enum CodingScheme cs;
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100529 uint8_t data[74];
530 uint8_t llc_data[1500] = {0,};
531 int num_chunks = 0;
532 int write_offset;
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200533 int count_payload;
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100534 struct gprs_llc llc;
535 Encoding::AppendResult ar;
536
537 printf("=== start %s ===\n", __func__);
538
Pau Espin Pedrol4f8384b2022-03-31 19:36:12 +0200539 llc_init(&llc);
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100540
541 /* TS 44.060, B.1 */
Maxbea2edb2019-03-06 17:04:59 +0100542 cs = CS4;
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530543 gprs_rlc_data_block_info_init(&rdbi, cs, false, 0);
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100544 num_chunks = 0;
545 write_offset = 0;
546 memset(data, 0, sizeof(data));
547
Pau Espin Pedrol4f8384b2022-03-31 19:36:12 +0200548 llc_reset(&llc);
549 llc_put_frame(&llc, llc_data, 11);
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200550 count_payload = -1;
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100551
Jacob Erlbeck5058bd62016-01-13 10:51:25 +0100552 ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200553 &llc, &write_offset, &num_chunks, data, false, &count_payload);
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100554
555 OSMO_ASSERT(ar == Encoding::AR_COMPLETED_SPACE_LEFT);
556 OSMO_ASSERT(rdbi.e == 0);
557 OSMO_ASSERT(write_offset == 1 + 11);
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200558 OSMO_ASSERT(count_payload == 11);
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100559 OSMO_ASSERT(num_chunks == 1);
560
Pau Espin Pedrol4f8384b2022-03-31 19:36:12 +0200561 llc_reset(&llc);
562 llc_put_frame(&llc, llc_data, 26);
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200563 count_payload = -1;
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100564
Jacob Erlbeck5058bd62016-01-13 10:51:25 +0100565 ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200566 &llc, &write_offset, &num_chunks, data, false, &count_payload);
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100567
568 OSMO_ASSERT(ar == Encoding::AR_COMPLETED_SPACE_LEFT);
569 OSMO_ASSERT(rdbi.e == 0);
570 OSMO_ASSERT(write_offset == 2 + 11 + 26);
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200571 OSMO_ASSERT(count_payload == 26);
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100572 OSMO_ASSERT(num_chunks == 2);
573
Pau Espin Pedrol4f8384b2022-03-31 19:36:12 +0200574 llc_reset(&llc);
575 llc_put_frame(&llc, llc_data, 99);
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200576 count_payload = -1;
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100577
Jacob Erlbeck5058bd62016-01-13 10:51:25 +0100578 ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200579 &llc, &write_offset, &num_chunks, data, false, &count_payload);
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100580
581 OSMO_ASSERT(ar == Encoding::AR_NEED_MORE_BLOCKS);
582 OSMO_ASSERT(rdbi.e == 0);
583 OSMO_ASSERT(rdbi.cv != 0);
584 OSMO_ASSERT(write_offset == (int)rdbi.data_len);
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200585 OSMO_ASSERT(count_payload == 11);
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100586 OSMO_ASSERT(num_chunks == 3);
587
588 OSMO_ASSERT(data[0] == ((11 << 2) | (1 << 1) | (0 << 0)));
589 OSMO_ASSERT(data[1] == ((26 << 2) | (1 << 1) | (1 << 0)));
590 OSMO_ASSERT(data[2] == 0);
591
592 /* TS 44.060, B.2 */
Maxbea2edb2019-03-06 17:04:59 +0100593 cs = CS1;
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100594
595 /* Block 1 */
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530596 gprs_rlc_data_block_info_init(&rdbi, cs, false, 0);
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100597 num_chunks = 0;
598 write_offset = 0;
599 memset(data, 0, sizeof(data));
600
Pau Espin Pedrol4f8384b2022-03-31 19:36:12 +0200601 llc_reset(&llc);
602 llc_put_frame(&llc, llc_data, 20);
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200603 count_payload = -1;
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100604
Jacob Erlbeck5058bd62016-01-13 10:51:25 +0100605 ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200606 &llc, &write_offset, &num_chunks, data, false, &count_payload);
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100607
608 OSMO_ASSERT(ar == Encoding::AR_NEED_MORE_BLOCKS);
609 OSMO_ASSERT(rdbi.e == 0);
610 OSMO_ASSERT(write_offset == 1 + 19);
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200611 OSMO_ASSERT(count_payload == 19);
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100612 OSMO_ASSERT(num_chunks == 1);
613
614 OSMO_ASSERT(data[0] == ((0 << 2) | (0 << 1) | (1 << 0)));
615 OSMO_ASSERT(data[1] == 0);
616
617 /* Block 2 */
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530618 gprs_rlc_data_block_info_init(&rdbi, cs, false, 0);
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100619 num_chunks = 0;
620 write_offset = 0;
621 memset(data, 0, sizeof(data));
622
Pau Espin Pedrolda971ee2020-12-16 15:59:45 +0100623 OSMO_ASSERT(llc_chunk_size(&llc) == 1);
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100624
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200625 count_payload = -1;
626
Jacob Erlbeck5058bd62016-01-13 10:51:25 +0100627 ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200628 &llc, &write_offset, &num_chunks, data, false, &count_payload);
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100629
630 OSMO_ASSERT(ar == Encoding::AR_COMPLETED_SPACE_LEFT);
631 OSMO_ASSERT(rdbi.e == 0);
632 OSMO_ASSERT(write_offset == 1 + 1);
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200633 OSMO_ASSERT(count_payload == 1);
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100634 OSMO_ASSERT(num_chunks == 1);
635
Pau Espin Pedrol4f8384b2022-03-31 19:36:12 +0200636 llc_reset(&llc);
637 llc_put_frame(&llc, llc_data, 99);
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200638 count_payload = -1;
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100639
Jacob Erlbeck5058bd62016-01-13 10:51:25 +0100640 ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200641 &llc, &write_offset, &num_chunks, data, false, &count_payload);
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100642
643 OSMO_ASSERT(ar == Encoding::AR_NEED_MORE_BLOCKS);
644 OSMO_ASSERT(rdbi.e == 0);
645 OSMO_ASSERT(write_offset == 1 + 1 + 18);
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200646 OSMO_ASSERT(count_payload == 18);
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100647 OSMO_ASSERT(num_chunks == 2);
648
649 OSMO_ASSERT(data[0] == ((1 << 2) | (1 << 1) | (1 << 0)));
650 OSMO_ASSERT(data[1] == 0);
651
652 /* TS 44.060, B.3 */
Maxbea2edb2019-03-06 17:04:59 +0100653 cs = CS1;
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100654
655 /* Block 1 */
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530656 gprs_rlc_data_block_info_init(&rdbi, cs, false, 0);
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100657 num_chunks = 0;
658 write_offset = 0;
659 memset(data, 0, sizeof(data));
660
Pau Espin Pedrol4f8384b2022-03-31 19:36:12 +0200661 llc_reset(&llc);
662 llc_put_frame(&llc, llc_data, 7);
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200663 count_payload = -1;
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100664
Jacob Erlbeck5058bd62016-01-13 10:51:25 +0100665 ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200666 &llc, &write_offset, &num_chunks, data, false, &count_payload);
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100667
668 OSMO_ASSERT(ar == Encoding::AR_COMPLETED_SPACE_LEFT);
669 OSMO_ASSERT(rdbi.e == 0);
670 OSMO_ASSERT(write_offset == 1 + 7);
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200671 OSMO_ASSERT(count_payload == 7);
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100672 OSMO_ASSERT(num_chunks == 1);
673
Pau Espin Pedrol4f8384b2022-03-31 19:36:12 +0200674 llc_reset(&llc);
675 llc_put_frame(&llc, llc_data, 11);
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200676 count_payload = -1;
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100677
Jacob Erlbeck5058bd62016-01-13 10:51:25 +0100678 ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200679 &llc, &write_offset, &num_chunks, data, false, &count_payload);
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100680
681 OSMO_ASSERT(ar == Encoding::AR_COMPLETED_BLOCK_FILLED);
682 OSMO_ASSERT(rdbi.e == 0);
683 OSMO_ASSERT(write_offset == 2 + 7 + 11);
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200684 OSMO_ASSERT(count_payload == 11);
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100685 OSMO_ASSERT(num_chunks == 2);
686
687 OSMO_ASSERT(data[0] == ((7 << 2) | (1 << 1) | (0 << 0)));
688 OSMO_ASSERT(data[1] == ((11 << 2) | (0 << 1) | (1 << 0)));
689 OSMO_ASSERT(data[2] == 0);
690
691 /* TS 44.060, B.4 */
Maxbea2edb2019-03-06 17:04:59 +0100692 cs = CS1;
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100693
694 /* Block 1 */
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530695 gprs_rlc_data_block_info_init(&rdbi, cs, false, 0);
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100696 num_chunks = 0;
697 write_offset = 0;
698 memset(data, 0, sizeof(data));
699
Pau Espin Pedrol4f8384b2022-03-31 19:36:12 +0200700 llc_reset(&llc);
701 llc_put_frame(&llc, llc_data, 99);
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200702 count_payload = -1;
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100703
Jacob Erlbeck5058bd62016-01-13 10:51:25 +0100704 ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200705 &llc, &write_offset, &num_chunks, data, false, &count_payload);
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100706
707 OSMO_ASSERT(ar == Encoding::AR_NEED_MORE_BLOCKS);
708 OSMO_ASSERT(rdbi.e == 1);
709 OSMO_ASSERT(write_offset == 20);
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200710 OSMO_ASSERT(count_payload == 20);
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100711 OSMO_ASSERT(num_chunks == 1);
712 OSMO_ASSERT(rdbi.cv != 0);
713
714 OSMO_ASSERT(data[0] == 0);
715
716 /* TS 44.060, B.5 */
Maxbea2edb2019-03-06 17:04:59 +0100717 cs = CS1;
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100718
719 /* Block 1 */
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530720 gprs_rlc_data_block_info_init(&rdbi, cs, false, 0);
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100721 num_chunks = 0;
722 write_offset = 0;
723 memset(data, 0, sizeof(data));
724
Pau Espin Pedrol4f8384b2022-03-31 19:36:12 +0200725 llc_reset(&llc);
726 llc_put_frame(&llc, llc_data, 20);
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200727 count_payload = -1;
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100728
Jacob Erlbeck5058bd62016-01-13 10:51:25 +0100729 ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200730 &llc, &write_offset, &num_chunks, data, true, &count_payload);
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100731
732 OSMO_ASSERT(ar == Encoding::AR_COMPLETED_BLOCK_FILLED);
733 OSMO_ASSERT(rdbi.e == 1);
734 OSMO_ASSERT(write_offset == 20);
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200735 OSMO_ASSERT(count_payload == 20);
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100736 OSMO_ASSERT(num_chunks == 1);
737 OSMO_ASSERT(rdbi.cv == 0);
738
739 OSMO_ASSERT(data[0] == 0);
740
741 /* TS 44.060, B.7 */
Maxbea2edb2019-03-06 17:04:59 +0100742 cs = CS1;
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100743
744 /* Block 1 */
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530745 gprs_rlc_data_block_info_init(&rdbi, cs, false, 0);
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100746 num_chunks = 0;
747 write_offset = 0;
748 memset(data, 0, sizeof(data));
749
Pau Espin Pedrol4f8384b2022-03-31 19:36:12 +0200750 llc_reset(&llc);
751 llc_put_frame(&llc, llc_data, 30);
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200752 count_payload = -1;
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100753
Jacob Erlbeck5058bd62016-01-13 10:51:25 +0100754 ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200755 &llc, &write_offset, &num_chunks, data, false, &count_payload);
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100756
757 OSMO_ASSERT(ar == Encoding::AR_NEED_MORE_BLOCKS);
758 OSMO_ASSERT(rdbi.e == 1);
759 OSMO_ASSERT(write_offset == 20);
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200760 OSMO_ASSERT(count_payload == 20);
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100761 OSMO_ASSERT(num_chunks == 1);
762
763 OSMO_ASSERT(data[0] == 0);
764
765 /* Block 2 */
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530766 gprs_rlc_data_block_info_init(&rdbi, cs, false, 0);
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100767 num_chunks = 0;
768 write_offset = 0;
769 memset(data, 0, sizeof(data));
770
Pau Espin Pedrolda971ee2020-12-16 15:59:45 +0100771 OSMO_ASSERT(llc_chunk_size(&llc) == 10);
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200772 count_payload = -1;
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100773
Jacob Erlbeck5058bd62016-01-13 10:51:25 +0100774 ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200775 &llc, &write_offset, &num_chunks, data, false, &count_payload);
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100776
777 OSMO_ASSERT(ar == Encoding::AR_COMPLETED_SPACE_LEFT);
778 OSMO_ASSERT(rdbi.e == 0);
779 OSMO_ASSERT(write_offset == 1 + 10);
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200780 OSMO_ASSERT(count_payload == 10);
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100781 OSMO_ASSERT(num_chunks == 1);
782
Pau Espin Pedrol4f8384b2022-03-31 19:36:12 +0200783 llc_reset(&llc);
784 llc_put_frame(&llc, llc_data, 99);
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200785 count_payload = -1;
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100786
Jacob Erlbeck5058bd62016-01-13 10:51:25 +0100787 ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200788 &llc, &write_offset, &num_chunks, data, false, &count_payload);
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100789
790 OSMO_ASSERT(ar == Encoding::AR_NEED_MORE_BLOCKS);
791 OSMO_ASSERT(rdbi.e == 0);
792 OSMO_ASSERT(write_offset == 1 + 10 + 9);
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200793 OSMO_ASSERT(count_payload == 9);
Jacob Erlbeck14bb0942016-01-12 11:58:13 +0100794 OSMO_ASSERT(num_chunks == 2);
795
796 OSMO_ASSERT(data[0] == ((10 << 2) | (1 << 1) | (1 << 0)));
797 OSMO_ASSERT(data[1] == 0);
798
Jacob Erlbecka88d0652016-01-13 11:28:10 +0100799 /* TS 44.060, B.8.1 */
Maxbea2edb2019-03-06 17:04:59 +0100800 cs = MCS4;
Jacob Erlbecka88d0652016-01-13 11:28:10 +0100801
802 /* Block 1 */
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530803 gprs_rlc_data_block_info_init(&rdbi, cs, false, 0);
Jacob Erlbecka88d0652016-01-13 11:28:10 +0100804 num_chunks = 0;
805 write_offset = 0;
806 memset(data, 0, sizeof(data));
807
Pau Espin Pedrol4f8384b2022-03-31 19:36:12 +0200808 llc_reset(&llc);
809 llc_put_frame(&llc, llc_data, 11);
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200810 count_payload = -1;
Jacob Erlbecka88d0652016-01-13 11:28:10 +0100811
812 ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200813 &llc, &write_offset, &num_chunks, data, false, &count_payload);
Jacob Erlbecka88d0652016-01-13 11:28:10 +0100814
815 OSMO_ASSERT(ar == Encoding::AR_COMPLETED_SPACE_LEFT);
816 OSMO_ASSERT(rdbi.e == 0);
817 OSMO_ASSERT(write_offset == 1 + 11);
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200818 OSMO_ASSERT(count_payload == 11);
Jacob Erlbecka88d0652016-01-13 11:28:10 +0100819 OSMO_ASSERT(num_chunks == 1);
820
Pau Espin Pedrol4f8384b2022-03-31 19:36:12 +0200821 llc_reset(&llc);
822 llc_put_frame(&llc, llc_data, 26);
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200823 count_payload = -1;
Jacob Erlbecka88d0652016-01-13 11:28:10 +0100824
825 ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200826 &llc, &write_offset, &num_chunks, data, false, &count_payload);
Jacob Erlbecka88d0652016-01-13 11:28:10 +0100827
828 OSMO_ASSERT(ar == Encoding::AR_COMPLETED_SPACE_LEFT);
829 OSMO_ASSERT(rdbi.e == 0);
830 OSMO_ASSERT(write_offset == 2 + 11 + 26);
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200831 OSMO_ASSERT(count_payload == 26);
Jacob Erlbecka88d0652016-01-13 11:28:10 +0100832 OSMO_ASSERT(num_chunks == 2);
833
Pau Espin Pedrol4f8384b2022-03-31 19:36:12 +0200834 llc_reset(&llc);
835 llc_put_frame(&llc, llc_data, 99);
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200836 count_payload = -1;
Jacob Erlbecka88d0652016-01-13 11:28:10 +0100837
838 ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200839 &llc, &write_offset, &num_chunks, data, false, &count_payload);
Jacob Erlbecka88d0652016-01-13 11:28:10 +0100840
841 OSMO_ASSERT(ar == Encoding::AR_NEED_MORE_BLOCKS);
842 OSMO_ASSERT(rdbi.e == 0);
843 OSMO_ASSERT(rdbi.cv != 0);
844 OSMO_ASSERT(write_offset == (int)rdbi.data_len);
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200845 OSMO_ASSERT(count_payload == 5);
Jacob Erlbecka88d0652016-01-13 11:28:10 +0100846 OSMO_ASSERT(num_chunks == 3);
847
848 OSMO_ASSERT(data[0] == ((11 << 1) | (0 << 0)));
849 OSMO_ASSERT(data[1] == ((26 << 1) | (1 << 0)));
850 OSMO_ASSERT(data[2] == 0);
851
852 /* TS 44.060, B.8.2 */
853
854 /* Note that the spec confuses the byte numbering here, since it
855 * includes the FBI/E header bits into the N2 octet count which
856 * is not consistent with Section 10.3a.1 & 10.3a.2. */
857
Maxbea2edb2019-03-06 17:04:59 +0100858 cs = MCS2;
Jacob Erlbecka88d0652016-01-13 11:28:10 +0100859
860 /* Block 1 */
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530861 gprs_rlc_data_block_info_init(&rdbi, cs, false, 0);
Jacob Erlbecka88d0652016-01-13 11:28:10 +0100862 num_chunks = 0;
863 write_offset = 0;
864 memset(data, 0, sizeof(data));
865
Pau Espin Pedrol4f8384b2022-03-31 19:36:12 +0200866 llc_reset(&llc);
867 llc_put_frame(&llc, llc_data, 15);
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200868 count_payload = -1;
Jacob Erlbecka88d0652016-01-13 11:28:10 +0100869
870 ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200871 &llc, &write_offset, &num_chunks, data, false, &count_payload);
Jacob Erlbecka88d0652016-01-13 11:28:10 +0100872
873 OSMO_ASSERT(ar == Encoding::AR_COMPLETED_SPACE_LEFT);
874 OSMO_ASSERT(rdbi.e == 0);
875 OSMO_ASSERT(write_offset == 1 + 15);
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200876 OSMO_ASSERT(count_payload == 15);
Jacob Erlbecka88d0652016-01-13 11:28:10 +0100877 OSMO_ASSERT(num_chunks == 1);
878
Pau Espin Pedrol4f8384b2022-03-31 19:36:12 +0200879 llc_reset(&llc);
880 llc_put_frame(&llc, llc_data, 12);
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200881 count_payload = -1;
Jacob Erlbecka88d0652016-01-13 11:28:10 +0100882
883 ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200884 &llc, &write_offset, &num_chunks, data, false, &count_payload);
Jacob Erlbecka88d0652016-01-13 11:28:10 +0100885
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200886 /* no LI here, becaues there are exact 12 bytes left. Put LI into next frame */
Jacob Erlbecka88d0652016-01-13 11:28:10 +0100887 OSMO_ASSERT(ar == Encoding::AR_NEED_MORE_BLOCKS);
888 OSMO_ASSERT(rdbi.e == 0);
889 OSMO_ASSERT(rdbi.cv != 0);
890 OSMO_ASSERT(write_offset == (int)rdbi.data_len);
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200891 OSMO_ASSERT(count_payload == 12);
Jacob Erlbecka88d0652016-01-13 11:28:10 +0100892 OSMO_ASSERT(num_chunks == 2);
893
894 OSMO_ASSERT(data[0] == ((15 << 1) | (1 << 0)));
895 OSMO_ASSERT(data[1] == 0);
896
897 /* Block 2 */
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530898 gprs_rlc_data_block_info_init(&rdbi, cs, false, 0);
Jacob Erlbecka88d0652016-01-13 11:28:10 +0100899 num_chunks = 0;
900 write_offset = 0;
901 memset(data, 0, sizeof(data));
902
Pau Espin Pedrolda971ee2020-12-16 15:59:45 +0100903 OSMO_ASSERT(llc_chunk_size(&llc) == 0);
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200904 count_payload = -1;
Jacob Erlbecka88d0652016-01-13 11:28:10 +0100905
906 ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200907 &llc, &write_offset, &num_chunks, data, false, &count_payload);
Jacob Erlbecka88d0652016-01-13 11:28:10 +0100908
909 OSMO_ASSERT(ar == Encoding::AR_COMPLETED_SPACE_LEFT);
910 OSMO_ASSERT(rdbi.e == 0);
911 OSMO_ASSERT(write_offset == 1 + 0);
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200912 OSMO_ASSERT(count_payload == 0);
Jacob Erlbecka88d0652016-01-13 11:28:10 +0100913 OSMO_ASSERT(num_chunks == 1);
914
Pau Espin Pedrol4f8384b2022-03-31 19:36:12 +0200915 llc_reset(&llc);
916 llc_put_frame(&llc, llc_data, 7);
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200917 count_payload = -1;
Jacob Erlbecka88d0652016-01-13 11:28:10 +0100918
919 ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200920 &llc, &write_offset, &num_chunks, data, false, &count_payload);
Jacob Erlbecka88d0652016-01-13 11:28:10 +0100921
922 OSMO_ASSERT(ar == Encoding::AR_COMPLETED_SPACE_LEFT);
923 OSMO_ASSERT(rdbi.e == 0);
924 OSMO_ASSERT(rdbi.cv != 0);
925 OSMO_ASSERT(write_offset == 2 + 0 + 7);
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200926 OSMO_ASSERT(count_payload == 7);
Jacob Erlbecka88d0652016-01-13 11:28:10 +0100927 OSMO_ASSERT(num_chunks == 2);
928
Pau Espin Pedrol4f8384b2022-03-31 19:36:12 +0200929 llc_reset(&llc);
930 llc_put_frame(&llc, llc_data, 18);
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200931 count_payload = -1;
Jacob Erlbecka88d0652016-01-13 11:28:10 +0100932
933 ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200934 &llc, &write_offset, &num_chunks, data, false, &count_payload);
Jacob Erlbecka88d0652016-01-13 11:28:10 +0100935
936 OSMO_ASSERT(ar == Encoding::AR_COMPLETED_BLOCK_FILLED);
937 OSMO_ASSERT(rdbi.e == 0);
938 OSMO_ASSERT(rdbi.cv != 0);
939 OSMO_ASSERT(write_offset == (int)rdbi.data_len);
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200940 OSMO_ASSERT(count_payload == 18);
Jacob Erlbecka88d0652016-01-13 11:28:10 +0100941 OSMO_ASSERT(num_chunks == 3);
942
943 OSMO_ASSERT(data[0] == ((0 << 1) | (0 << 0)));
944 OSMO_ASSERT(data[1] == ((7 << 1) | (0 << 0)));
945 OSMO_ASSERT(data[2] == ((18 << 1) | (1 << 0)));
946 OSMO_ASSERT(data[3] == 0);
947
948 /* Block 3 */
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530949 gprs_rlc_data_block_info_init(&rdbi, cs, false, 0);
Jacob Erlbecka88d0652016-01-13 11:28:10 +0100950 num_chunks = 0;
951 write_offset = 0;
952 memset(data, 0, sizeof(data));
953
Pau Espin Pedrol4f8384b2022-03-31 19:36:12 +0200954 llc_reset(&llc);
955 llc_put_frame(&llc, llc_data, 6);
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200956 count_payload = -1;
Jacob Erlbecka88d0652016-01-13 11:28:10 +0100957
958 ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200959 &llc, &write_offset, &num_chunks, data, false, &count_payload);
Jacob Erlbecka88d0652016-01-13 11:28:10 +0100960
961 OSMO_ASSERT(ar == Encoding::AR_COMPLETED_SPACE_LEFT);
962 OSMO_ASSERT(rdbi.e == 0);
963 OSMO_ASSERT(write_offset == 1 + 6);
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200964 OSMO_ASSERT(count_payload == 6);
Jacob Erlbecka88d0652016-01-13 11:28:10 +0100965 OSMO_ASSERT(num_chunks == 1);
966
Pau Espin Pedrol4f8384b2022-03-31 19:36:12 +0200967 llc_reset(&llc);
968 llc_put_frame(&llc, llc_data, 12);
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200969 count_payload = -1;
Jacob Erlbecka88d0652016-01-13 11:28:10 +0100970
971 ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200972 &llc, &write_offset, &num_chunks, data, true, &count_payload);
Jacob Erlbecka88d0652016-01-13 11:28:10 +0100973
974 OSMO_ASSERT(ar == Encoding::AR_COMPLETED_BLOCK_FILLED);
975 OSMO_ASSERT(rdbi.e == 0);
976 OSMO_ASSERT(rdbi.cv == 0);
977 OSMO_ASSERT(write_offset == (int)rdbi.data_len);
Alexander Couzens6f0dc962016-05-30 19:30:21 +0200978 OSMO_ASSERT(count_payload == 12);
Jacob Erlbecka88d0652016-01-13 11:28:10 +0100979 OSMO_ASSERT(num_chunks == 3);
980
981 OSMO_ASSERT(data[0] == ((6 << 1) | (0 << 0)));
982 OSMO_ASSERT(data[1] == ((12 << 1) | (0 << 0)));
983 OSMO_ASSERT(data[2] == ((127 << 1) | (1 << 0)));
984 OSMO_ASSERT(data[3] == 0);
985
986 /* TS 44.060, B.8.3 */
987
988 /* Note that the spec confuses the byte numbering here, too (see above) */
989
Maxbea2edb2019-03-06 17:04:59 +0100990 cs = MCS2;
Jacob Erlbecka88d0652016-01-13 11:28:10 +0100991
992 /* Block 1 */
Aravind Sirsikar50b09702016-08-22 17:21:10 +0530993 gprs_rlc_data_block_info_init(&rdbi, cs, false, 0);
Jacob Erlbecka88d0652016-01-13 11:28:10 +0100994 num_chunks = 0;
995 write_offset = 0;
996 memset(data, 0, sizeof(data));
997
Pau Espin Pedrol4f8384b2022-03-31 19:36:12 +0200998 llc_reset(&llc);
999 llc_put_frame(&llc, llc_data, rdbi.data_len);
Alexander Couzens6f0dc962016-05-30 19:30:21 +02001000 count_payload = -1;
Jacob Erlbecka88d0652016-01-13 11:28:10 +01001001
1002 ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
Alexander Couzens6f0dc962016-05-30 19:30:21 +02001003 &llc, &write_offset, &num_chunks, data, true, &count_payload);
Jacob Erlbecka88d0652016-01-13 11:28:10 +01001004
1005 OSMO_ASSERT(ar == Encoding::AR_COMPLETED_BLOCK_FILLED);
1006 OSMO_ASSERT(rdbi.e == 1);
1007 OSMO_ASSERT(rdbi.cv == 0);
1008 OSMO_ASSERT(write_offset == (int)rdbi.data_len);
Neels Hofmeyrd34646a2017-02-08 17:07:40 +01001009 OSMO_ASSERT(rdbi.data_len <= INT_MAX && count_payload == (int)rdbi.data_len);
Jacob Erlbecka88d0652016-01-13 11:28:10 +01001010 OSMO_ASSERT(num_chunks == 1);
1011
1012 OSMO_ASSERT(data[0] == 0);
1013
1014 /* Final block with an LLC of size data_len-1 */
1015
Maxbea2edb2019-03-06 17:04:59 +01001016 cs = MCS2;
Jacob Erlbecka88d0652016-01-13 11:28:10 +01001017
1018 /* Block 1 */
Aravind Sirsikar50b09702016-08-22 17:21:10 +05301019 gprs_rlc_data_block_info_init(&rdbi, cs, false, 0);
Jacob Erlbecka88d0652016-01-13 11:28:10 +01001020 num_chunks = 0;
1021 write_offset = 0;
1022 memset(data, 0, sizeof(data));
1023
Pau Espin Pedrol4f8384b2022-03-31 19:36:12 +02001024 llc_reset(&llc);
1025 llc_put_frame(&llc, llc_data, rdbi.data_len - 1);
Alexander Couzens6f0dc962016-05-30 19:30:21 +02001026 count_payload = -1;
Jacob Erlbecka88d0652016-01-13 11:28:10 +01001027
1028 ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
Alexander Couzens6f0dc962016-05-30 19:30:21 +02001029 &llc, &write_offset, &num_chunks, data, true, &count_payload);
Jacob Erlbecka88d0652016-01-13 11:28:10 +01001030
1031 OSMO_ASSERT(ar == Encoding::AR_COMPLETED_BLOCK_FILLED);
1032 OSMO_ASSERT(rdbi.e == 0);
1033 OSMO_ASSERT(rdbi.cv == 0);
1034 OSMO_ASSERT(write_offset == (int)rdbi.data_len);
Neels Hofmeyrd34646a2017-02-08 17:07:40 +01001035 OSMO_ASSERT((rdbi.data_len - 1) <= INT_MAX
1036 && count_payload == (int)(rdbi.data_len - 1));
Jacob Erlbecka88d0652016-01-13 11:28:10 +01001037 OSMO_ASSERT(num_chunks == 1);
1038
1039 OSMO_ASSERT(data[0] == (((rdbi.data_len-1) << 1) | (1 << 0)));
1040 OSMO_ASSERT(data[1] == 0);
1041
1042 /* Final block with an LLC of size data_len-2 */
1043
Maxbea2edb2019-03-06 17:04:59 +01001044 cs = MCS2;
Jacob Erlbecka88d0652016-01-13 11:28:10 +01001045
1046 /* Block 1 */
Aravind Sirsikar50b09702016-08-22 17:21:10 +05301047 gprs_rlc_data_block_info_init(&rdbi, cs, false, 0);
Jacob Erlbecka88d0652016-01-13 11:28:10 +01001048 num_chunks = 0;
1049 write_offset = 0;
1050 memset(data, 0, sizeof(data));
1051
Pau Espin Pedrol4f8384b2022-03-31 19:36:12 +02001052 llc_reset(&llc);
1053 llc_put_frame(&llc, llc_data, rdbi.data_len - 2);
Alexander Couzens6f0dc962016-05-30 19:30:21 +02001054 count_payload = -1;
Jacob Erlbecka88d0652016-01-13 11:28:10 +01001055
1056 ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
Alexander Couzens6f0dc962016-05-30 19:30:21 +02001057 &llc, &write_offset, &num_chunks, data, true, &count_payload);
Jacob Erlbecka88d0652016-01-13 11:28:10 +01001058
1059 OSMO_ASSERT(ar == Encoding::AR_COMPLETED_BLOCK_FILLED);
1060 OSMO_ASSERT(rdbi.e == 0);
1061 OSMO_ASSERT(rdbi.cv == 0);
1062 OSMO_ASSERT(write_offset == (int)rdbi.data_len);
Neels Hofmeyrd34646a2017-02-08 17:07:40 +01001063 OSMO_ASSERT((rdbi.data_len - 2) <= INT_MAX
1064 && count_payload == (int)(rdbi.data_len - 2));
Jacob Erlbecka88d0652016-01-13 11:28:10 +01001065 OSMO_ASSERT(num_chunks == 2);
1066
1067 OSMO_ASSERT(data[0] == (((rdbi.data_len-2) << 1) | (0 << 0)));
1068 OSMO_ASSERT(data[1] == ((127 << 1) | (1 << 0)));
1069 OSMO_ASSERT(data[2] == 0);
1070
Jacob Erlbeck14bb0942016-01-12 11:58:13 +01001071 printf("=== end %s ===\n", __func__);
1072}
1073
Jacob Erlbeckf0e40392016-01-08 10:07:53 +01001074static void test_rlc_unaligned_copy()
1075{
1076 uint8_t bits[256];
1077 uint8_t saved_block[256];
1078 uint8_t test_block[256];
1079 uint8_t out_block[256];
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +02001080 enum CodingScheme cs;
Jacob Erlbeckf0e40392016-01-08 10:07:53 +01001081 int pattern;
1082 volatile unsigned int block_idx, i;
1083
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +02001084 for (cs = CS1; cs < NUM_SCHEMES; cs = static_cast<enum CodingScheme>(cs + 1))
Jacob Erlbeckf0e40392016-01-08 10:07:53 +01001085 {
Jacob Erlbeckf0e40392016-01-08 10:07:53 +01001086 for (pattern = 0; pattern <= 0xff; pattern += 0xff) {
1087 /* prepare test block */
1088 test_block[0] = pattern ^ 0xff;
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +02001089 for (i = 1; i + 1 < mcs_max_data_block_bytes(cs); i++)
Jacob Erlbeckf0e40392016-01-08 10:07:53 +01001090 test_block[i] = i;
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +02001091 test_block[mcs_max_data_block_bytes(cs)-1] = pattern ^ 0xff;
Jacob Erlbeckf0e40392016-01-08 10:07:53 +01001092
1093 for (block_idx = 0;
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +02001094 block_idx < num_data_blocks(mcs_header_type(cs));
Jacob Erlbeckf0e40392016-01-08 10:07:53 +01001095 block_idx++)
1096 {
1097 struct gprs_rlc_data_info rlc;
Aravind Sirsikar50b09702016-08-22 17:21:10 +05301098 gprs_rlc_data_info_init_dl(&rlc, cs, false, 0);
Jacob Erlbeckf0e40392016-01-08 10:07:53 +01001099
1100 memset(bits, pattern, sizeof(bits));
1101 Decoding::rlc_copy_to_aligned_buffer(
1102 &rlc, block_idx, bits, saved_block);
1103
1104 fprintf(stderr,
1105 "Test data block: %s\n",
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +02001106 osmo_hexdump(test_block, mcs_max_data_block_bytes(cs)));
Jacob Erlbeckf0e40392016-01-08 10:07:53 +01001107
1108 Encoding::rlc_copy_from_aligned_buffer(
1109 &rlc, block_idx, bits, test_block);
1110
1111 fprintf(stderr,
1112 "Encoded message block, %s, idx %d, "
1113 "pattern %02x: %s\n",
Max136ebcc2019-03-05 14:59:03 +01001114 mcs_name(rlc.cs), block_idx, pattern,
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +02001115 osmo_hexdump(bits, mcs_size_dl(cs)));
Jacob Erlbeckf0e40392016-01-08 10:07:53 +01001116
1117 Decoding::rlc_copy_to_aligned_buffer(
1118 &rlc, block_idx, bits, out_block);
1119
1120 fprintf(stderr,
1121 "Out data block: %s\n",
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +02001122 osmo_hexdump(out_block, mcs_max_data_block_bytes(cs)));
Jacob Erlbeckf0e40392016-01-08 10:07:53 +01001123 /* restore original bits */
1124 Encoding::rlc_copy_from_aligned_buffer(
1125 &rlc, block_idx, bits, saved_block);
1126
1127 OSMO_ASSERT(memcmp(test_block, out_block,
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +02001128 mcs_max_data_block_bytes(rlc.cs)) == 0);
Jacob Erlbeckf0e40392016-01-08 10:07:53 +01001129
1130 for (i = 0; i < sizeof(bits); i++)
1131 OSMO_ASSERT(bits[i] == pattern);
1132 }
1133 }
1134 }
1135}
1136
Jacob Erlbeck6e9f9c22016-01-11 11:15:45 +01001137static void test_rlc_info_init()
1138{
1139 struct gprs_rlc_data_info rlc;
1140
1141 printf("=== start %s ===\n", __func__);
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +02001142 gprs_rlc_data_info_init_dl(&rlc, CS1, false, 0);
Jacob Erlbeck6e9f9c22016-01-11 11:15:45 +01001143 OSMO_ASSERT(rlc.num_data_blocks == 1);
1144 OSMO_ASSERT(rlc.data_offs_bits[0] == 24);
1145 OSMO_ASSERT(rlc.block_info[0].data_len == 20);
1146
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +02001147 gprs_rlc_data_info_init_dl(&rlc, MCS1, false, 0);
Jacob Erlbeck6e9f9c22016-01-11 11:15:45 +01001148 OSMO_ASSERT(rlc.num_data_blocks == 1);
1149 OSMO_ASSERT(rlc.data_offs_bits[0] == 33);
1150 OSMO_ASSERT(rlc.block_info[0].data_len == 22);
1151
1152 printf("=== end %s ===\n", __func__);
1153}
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +01001154
Pau Espin Pedrol2182e622021-01-14 16:48:38 +01001155static void setup_bts(struct gprs_rlcmac_bts *bts, uint8_t ts_no, uint8_t cs = 1)
Aravind Sirsikar189742b2016-06-14 19:01:14 +05301156{
Aravind Sirsikar189742b2016-06-14 19:01:14 +05301157 gprs_rlcmac_trx *trx;
1158
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +01001159 the_pcu->alloc_algorithm = alloc_algorithm_a;
Aravind Sirsikar189742b2016-06-14 19:01:14 +05301160 bts->initial_cs_dl = cs;
1161 bts->initial_cs_ul = cs;
1162 trx = &bts->trx[0];
1163 trx->pdch[ts_no].enable();
1164}
Pau Espin Pedrol2182e622021-01-14 16:48:38 +01001165static void uplink_header_type_2_parsing_test(struct gprs_rlcmac_bts *bts,
Aravind Sirsikar189742b2016-06-14 19:01:14 +05301166 uint8_t ts_no, uint32_t tlli, uint32_t *fn, uint16_t qta,
1167 uint8_t ms_class)
1168{
Aravind Sirsikar189742b2016-06-14 19:01:14 +05301169 int tfi = 0;
Aravind Sirsikar189742b2016-06-14 19:01:14 +05301170 uint8_t data[79] = {0};
1171 struct gprs_rlc_ul_header_egprs_2 *egprs2 = NULL;
1172
1173 egprs2 = (struct gprs_rlc_ul_header_egprs_2 *) data;
Aravind Sirsikar189742b2016-06-14 19:01:14 +05301174
1175 tfi = 1;
1176
1177 struct gprs_rlc_data_info rlc;
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +02001178 enum CodingScheme cs;
Aravind Sirsikar189742b2016-06-14 19:01:14 +05301179 int rc, offs;
1180
1181 /*without padding*/
Maxbea2edb2019-03-06 17:04:59 +01001182 cs = MCS5;
Aravind Sirsikar189742b2016-06-14 19:01:14 +05301183 egprs2 = (struct gprs_rlc_ul_header_egprs_2 *) data;
1184 egprs2->r = 1;
1185 egprs2->si = 1;
1186 egprs2->cv = 7;
Tom Tsoudf698092016-07-11 17:05:19 -07001187 egprs2->tfi_hi = tfi & 0x03;
1188 egprs2->tfi_lo = (tfi & 0x1c) >> 2;
1189 egprs2->bsn1_hi = 0;
1190 egprs2->bsn1_lo = 0;
1191 egprs2->cps_hi = 3;
1192 egprs2->cps_lo = 0;
Aravind Sirsikar189742b2016-06-14 19:01:14 +05301193 egprs2->rsb = 0;
1194 egprs2->pi = 0;
1195 data[4] = 0x20; /* Setting E field */
1196 rc = Decoding::rlc_parse_ul_data_header(&rlc, data, cs);
Neels Hofmeyrde9da392017-02-08 17:34:56 +01001197 OSMO_ASSERT(rc == 487);
Aravind Sirsikar189742b2016-06-14 19:01:14 +05301198 offs = rlc.data_offs_bits[0] / 8;
1199 OSMO_ASSERT(offs == 4);
1200 OSMO_ASSERT(rlc.tfi == 1);
1201 OSMO_ASSERT(rlc.num_data_blocks == 1);
1202 OSMO_ASSERT(rlc.block_info[0].e == 1);
1203 OSMO_ASSERT(rlc.block_info[0].ti == 0);
1204 OSMO_ASSERT(rlc.block_info[0].bsn == 0);
1205
1206 /* with padding case */
Maxbea2edb2019-03-06 17:04:59 +01001207 cs = MCS6;
Aravind Sirsikar189742b2016-06-14 19:01:14 +05301208 egprs2 = (struct gprs_rlc_ul_header_egprs_2 *) data;
1209 egprs2->r = 1;
1210 egprs2->si = 1;
1211 egprs2->cv = 7;
Tom Tsoudf698092016-07-11 17:05:19 -07001212 egprs2->tfi_hi = tfi & 0x03;
1213 egprs2->tfi_lo = (tfi & 0x1c) >> 2;
1214 egprs2->bsn1_hi = 0;
1215 egprs2->bsn1_lo = 0;
1216 egprs2->cps_hi = 3;
1217 egprs2->cps_lo = 0;
Aravind Sirsikar189742b2016-06-14 19:01:14 +05301218 egprs2->rsb = 0;
1219 egprs2->pi = 0;
1220 data[10] = 0x20; /* Setting E field */
1221 rc = Decoding::rlc_parse_ul_data_header(&rlc, data, cs);
Neels Hofmeyrde9da392017-02-08 17:34:56 +01001222 OSMO_ASSERT(rc == 679);
Aravind Sirsikar189742b2016-06-14 19:01:14 +05301223 offs = rlc.data_offs_bits[0] / 8;
1224 OSMO_ASSERT(offs == 10);
1225 OSMO_ASSERT(rlc.num_data_blocks == 1);
1226 OSMO_ASSERT(rlc.tfi == 1);
1227 OSMO_ASSERT(rlc.block_info[0].e == 1);
1228 OSMO_ASSERT(rlc.block_info[0].ti == 0);
1229 OSMO_ASSERT(rlc.block_info[0].bsn == 0);
1230
1231 egprs2->r = 1;
1232 egprs2->si = 1;
1233 egprs2->cv = 7;
Tom Tsoudf698092016-07-11 17:05:19 -07001234 egprs2->tfi_hi = tfi & 0x03;
1235 egprs2->tfi_lo = (tfi & 0x1c) >> 2;
1236 egprs2->bsn1_hi = 1;
1237 egprs2->bsn1_lo = 0;
1238 egprs2->cps_hi = 2;
1239 egprs2->cps_lo = 0;
Aravind Sirsikar189742b2016-06-14 19:01:14 +05301240 egprs2->rsb = 0;
1241 egprs2->pi = 0;
1242 data[10] = 0x20; /* Setting E field */
1243 rc = Decoding::rlc_parse_ul_data_header(&rlc, data, cs);
Neels Hofmeyrde9da392017-02-08 17:34:56 +01001244 OSMO_ASSERT(rc == 679);
Aravind Sirsikar189742b2016-06-14 19:01:14 +05301245 offs = rlc.data_offs_bits[0] / 8;
1246 OSMO_ASSERT(offs == 10);
1247 OSMO_ASSERT(rlc.tfi == 1);
1248 OSMO_ASSERT(rlc.num_data_blocks == 1);
1249 OSMO_ASSERT(rlc.block_info[0].e == 1);
1250 OSMO_ASSERT(rlc.block_info[0].ti == 0);
1251 OSMO_ASSERT(rlc.block_info[0].bsn == 1);
1252}
1253
1254static void uplink_header_type2_test(void)
1255{
Pau Espin Pedrold1049dc2021-01-18 17:14:14 +01001256 struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);
Aravind Sirsikar189742b2016-06-14 19:01:14 +05301257 int ts_no = 7;
1258 uint32_t fn = 2654218;
1259 uint16_t qta = 31;
1260 uint32_t tlli = 0xf1223344;
Aravind Sirsikar189742b2016-06-14 19:01:14 +05301261 uint8_t ms_class = 1;
Aravind Sirsikar189742b2016-06-14 19:01:14 +05301262
1263 printf("=== start %s ===\n", __func__);
Pau Espin Pedrol2182e622021-01-14 16:48:38 +01001264 setup_bts(bts, ts_no, 10);
Aravind Sirsikar189742b2016-06-14 19:01:14 +05301265
Pau Espin Pedrol2182e622021-01-14 16:48:38 +01001266 uplink_header_type_2_parsing_test(bts, ts_no,
Aravind Sirsikar189742b2016-06-14 19:01:14 +05301267 tlli, &fn, qta, ms_class);
1268 printf("=== end %s ===\n", __func__);
Pau Espin Pedrol2182e622021-01-14 16:48:38 +01001269 talloc_free(bts);
Aravind Sirsikar189742b2016-06-14 19:01:14 +05301270}
1271
Pau Espin Pedrol2182e622021-01-14 16:48:38 +01001272static void uplink_header_type_1_parsing_test(struct gprs_rlcmac_bts *bts,
Aravind Sirsikar2c9f9802016-06-14 19:01:56 +05301273 uint8_t ts_no, uint32_t tlli, uint32_t *fn, uint16_t qta,
1274 uint8_t ms_class)
1275{
Aravind Sirsikar2c9f9802016-06-14 19:01:56 +05301276 int tfi = 0;
Aravind Sirsikar2c9f9802016-06-14 19:01:56 +05301277 uint8_t data[155] = {0};
1278 struct gprs_rlc_ul_header_egprs_1 *egprs1 = NULL;
1279 struct gprs_rlc_data_info rlc;
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +02001280 enum CodingScheme cs;
Neels Hofmeyrd34646a2017-02-08 17:07:40 +01001281 int rc;
Aravind Sirsikar2c9f9802016-06-14 19:01:56 +05301282
1283 egprs1 = (struct gprs_rlc_ul_header_egprs_1 *) data;
Aravind Sirsikar2c9f9802016-06-14 19:01:56 +05301284
1285 tfi = 1;
1286
1287 /* MCS 7 */
Maxbea2edb2019-03-06 17:04:59 +01001288 cs = MCS7;
Aravind Sirsikar2c9f9802016-06-14 19:01:56 +05301289 egprs1 = (struct gprs_rlc_ul_header_egprs_1 *) data;
1290 egprs1->si = 1;
1291 egprs1->r = 1;
1292 egprs1->cv = 7;
Tom Tsoudf698092016-07-11 17:05:19 -07001293 egprs1->tfi_hi = tfi & 0x03;
1294 egprs1->tfi_lo = (tfi & 0x1c) >> 2;
1295 egprs1->bsn1_hi = 0;
1296 egprs1->bsn1_lo = 0;
1297 egprs1->bsn2_hi = 1;
1298 egprs1->bsn2_lo = 0;
Aravind Sirsikar2c9f9802016-06-14 19:01:56 +05301299 egprs1->cps = 15;
1300 egprs1->rsb = 0;
1301 egprs1->pi = 0;
1302 data[5] = 0xc0;
1303 data[5 + 57] = 1;
1304 rc = Decoding::rlc_parse_ul_data_header(&rlc, data, cs);
Neels Hofmeyrde9da392017-02-08 17:34:56 +01001305 OSMO_ASSERT(rc == 946);
Aravind Sirsikar2c9f9802016-06-14 19:01:56 +05301306 OSMO_ASSERT(rlc.num_data_blocks == 2);
1307 OSMO_ASSERT(rlc.block_info[0].e == 1);
1308 OSMO_ASSERT(rlc.block_info[0].ti == 1);
1309 OSMO_ASSERT(rlc.block_info[1].e == 1);
1310 OSMO_ASSERT(rlc.block_info[1].ti == 0);
1311 OSMO_ASSERT(rlc.block_info[0].bsn == 0);
1312 OSMO_ASSERT(rlc.block_info[1].bsn == 1);
1313 OSMO_ASSERT(rlc.tfi == 1);
1314
1315 /* MCS 8 */
Maxbea2edb2019-03-06 17:04:59 +01001316 cs = MCS8;
Aravind Sirsikar2c9f9802016-06-14 19:01:56 +05301317 egprs1 = (struct gprs_rlc_ul_header_egprs_1 *) data;
1318 egprs1->si = 1;
1319 egprs1->r = 1;
1320 egprs1->cv = 7;
Tom Tsoudf698092016-07-11 17:05:19 -07001321 egprs1->tfi_hi = tfi & 0x03;
1322 egprs1->tfi_lo = (tfi & 0x1c) >> 2;
1323 egprs1->bsn1_hi = 0;
1324 egprs1->bsn1_lo = 0;
1325 egprs1->bsn2_hi = 1;
1326 egprs1->bsn2_lo = 0;
Aravind Sirsikar2c9f9802016-06-14 19:01:56 +05301327 egprs1->cps = 15;
1328 egprs1->rsb = 0;
1329 egprs1->pi = 0;
1330 data[5] = 0xc0;
1331 data[5 + 69] = 1;
1332 rc = Decoding::rlc_parse_ul_data_header(&rlc, data, cs);
Neels Hofmeyrde9da392017-02-08 17:34:56 +01001333 OSMO_ASSERT(rc == 1138);
Aravind Sirsikar2c9f9802016-06-14 19:01:56 +05301334 OSMO_ASSERT(rlc.num_data_blocks == 2);
1335 OSMO_ASSERT(rlc.block_info[0].e == 1);
1336 OSMO_ASSERT(rlc.block_info[0].ti == 1);
1337 OSMO_ASSERT(rlc.block_info[1].e == 1);
1338 OSMO_ASSERT(rlc.block_info[1].ti == 0);
1339 OSMO_ASSERT(rlc.block_info[0].bsn == 0);
1340 OSMO_ASSERT(rlc.block_info[1].bsn == 1);
1341 OSMO_ASSERT(rlc.tfi == 1);
1342
1343 /* MCS 9 */
Maxbea2edb2019-03-06 17:04:59 +01001344 cs = MCS9;
Aravind Sirsikar2c9f9802016-06-14 19:01:56 +05301345 egprs1 = (struct gprs_rlc_ul_header_egprs_1 *) data;
1346 egprs1->si = 1;
1347 egprs1->r = 1;
1348 egprs1->cv = 7;
Tom Tsoudf698092016-07-11 17:05:19 -07001349 egprs1->tfi_hi = tfi & 0x03;
1350 egprs1->tfi_lo = (tfi & 0x1c) >> 2;
1351 egprs1->bsn1_hi = 0;
1352 egprs1->bsn1_lo = 0;
1353 egprs1->bsn2_hi = 1;
1354 egprs1->bsn2_lo = 0;
Aravind Sirsikar2c9f9802016-06-14 19:01:56 +05301355 egprs1->cps = 15;
1356 egprs1->rsb = 0;
1357 egprs1->pi = 0;
1358 data[5] = 0xc0;
1359 data[5 + 75] = 1;
1360 rc = Decoding::rlc_parse_ul_data_header(&rlc, data, cs);
Neels Hofmeyrde9da392017-02-08 17:34:56 +01001361 OSMO_ASSERT(rc == 1234);
Aravind Sirsikar2c9f9802016-06-14 19:01:56 +05301362 OSMO_ASSERT(rlc.num_data_blocks == 2);
1363 OSMO_ASSERT(rlc.block_info[0].e == 1);
1364 OSMO_ASSERT(rlc.block_info[0].ti == 1);
1365 OSMO_ASSERT(rlc.block_info[1].e == 1);
1366 OSMO_ASSERT(rlc.block_info[1].ti == 0);
1367 OSMO_ASSERT(rlc.block_info[0].bsn == 0);
1368 OSMO_ASSERT(rlc.block_info[1].bsn == 1);
1369 OSMO_ASSERT(rlc.tfi == 1);
1370}
1371
1372void uplink_header_type1_test(void)
1373{
Pau Espin Pedrold1049dc2021-01-18 17:14:14 +01001374 struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);
Aravind Sirsikar2c9f9802016-06-14 19:01:56 +05301375 int ts_no = 7;
1376 uint32_t fn = 2654218;
1377 uint16_t qta = 31;
1378 uint32_t tlli = 0xf1223344;
Aravind Sirsikar2c9f9802016-06-14 19:01:56 +05301379 uint8_t ms_class = 1;
Aravind Sirsikar2c9f9802016-06-14 19:01:56 +05301380
1381 printf("=== start %s ===\n", __func__);
Pau Espin Pedrol2182e622021-01-14 16:48:38 +01001382 setup_bts(bts, ts_no, 12);
1383 uplink_header_type_1_parsing_test(bts, ts_no, tlli, &fn,
Aravind Sirsikar2c9f9802016-06-14 19:01:56 +05301384 qta, ms_class);
1385 printf("=== end %s ===\n", __func__);
1386}
1387
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +01001388int main(int argc, char **argv)
1389{
1390 struct vty_app_info pcu_vty_info = {0};
1391
1392 tall_pcu_ctx = talloc_named_const(NULL, 1, "EdgeTest context");
1393 if (!tall_pcu_ctx)
1394 abort();
1395
Neels Hofmeyr78ce5912017-02-08 17:07:31 +01001396 msgb_talloc_ctx_init(tall_pcu_ctx, 0);
Neels Hofmeyr42f2d612018-04-01 16:54:40 +02001397 osmo_init_logging2(tall_pcu_ctx, &gprs_log_info);
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +01001398 log_set_use_color(osmo_stderr_target, 0);
Pau Espin Pedrol00f52cc2021-02-19 14:01:52 +01001399 log_set_print_filename2(osmo_stderr_target, LOG_FILENAME_NONE);
Pau Espin Pedrolb18d2a52021-02-19 14:00:48 +01001400 log_set_print_category(osmo_stderr_target, 0);
1401 log_set_print_category_hex(osmo_stderr_target, 0);
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +01001402
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +01001403 the_pcu = gprs_pcu_alloc(tall_pcu_ctx);
1404
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +01001405 vty_init(&pcu_vty_info);
Pau Espin Pedrolcd2ac562019-08-05 14:30:44 +02001406 pcu_vty_init();
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +01001407
1408 test_coding_scheme();
Jacob Erlbeck6e9f9c22016-01-11 11:15:45 +01001409 test_rlc_info_init();
Jacob Erlbeck38f18692016-02-01 10:08:00 +01001410 test_rlc_unit_decoder();
Jacob Erlbeckf0e40392016-01-08 10:07:53 +01001411 test_rlc_unaligned_copy();
Jacob Erlbeck14bb0942016-01-12 11:58:13 +01001412 test_rlc_unit_encoder();
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +01001413
Aravind Sirsikar189742b2016-06-14 19:01:14 +05301414 uplink_header_type2_test();
Aravind Sirsikar2c9f9802016-06-14 19:01:56 +05301415 uplink_header_type1_test();
1416
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +01001417 if (getenv("TALLOC_REPORT_FULL"))
1418 talloc_report_full(tall_pcu_ctx, stderr);
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +01001419
1420 talloc_free(the_pcu);
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +01001421 return EXIT_SUCCESS;
1422}
1423
1424/*
1425 * stubs that should not be reached
1426 */
1427extern "C" {
1428void l1if_pdch_req() { abort(); }
1429void l1if_connect_pdch() { abort(); }
1430void l1if_close_pdch() { abort(); }
1431void l1if_open_pdch() { abort(); }
1432}