blob: dffd009d3d29e5ab4d136ad7984b38a747c41ffd [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"
26#include "rlc.h"
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +010027
28extern "C" {
29#include "pcu_vty.h"
30
31#include <osmocom/core/application.h>
32#include <osmocom/core/msgb.h>
33#include <osmocom/core/talloc.h>
34#include <osmocom/core/utils.h>
35#include <osmocom/vty/vty.h>
36}
37
38#include <errno.h>
39
40void *tall_pcu_ctx;
41int16_t spoof_mnc = 0, spoof_mcc = 0;
42
43static void check_coding_scheme(GprsCodingScheme& cs, GprsCodingScheme::Mode mode)
44{
45 volatile unsigned expected_size;
46 GprsCodingScheme new_cs;
47
48 OSMO_ASSERT(cs.isValid());
49 OSMO_ASSERT(cs.isCompatible(mode));
50
51 /* Check static getBySizeUL() */
52 expected_size = cs.maxBytesUL();
53 if (cs.spareBitsUL() > 0)
54 expected_size += 1;
55 OSMO_ASSERT(expected_size == cs.sizeUL());
56 OSMO_ASSERT(cs == GprsCodingScheme::getBySizeUL(expected_size));
57
58 /* Check static sizeUL() */
59 expected_size = cs.maxBytesDL();
60 if (cs.spareBitsDL() > 0)
61 expected_size += 1;
62 OSMO_ASSERT(expected_size == cs.sizeDL());
63
Jacob Erlbeck392a5452015-12-14 10:38:29 +010064 /* Check data block sizes */
65 OSMO_ASSERT(cs.maxDataBlockBytes() * cs.numDataBlocks() < cs.maxBytesDL());
66 OSMO_ASSERT(cs.maxDataBlockBytes() * cs.numDataBlocks() < cs.maxBytesUL());
67
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +010068 /* Check inc/dec */
69 new_cs = cs;
70 new_cs.inc(mode);
71 OSMO_ASSERT(new_cs.isCompatible(mode));
72 if (new_cs != cs) {
73 new_cs.dec(mode);
74 OSMO_ASSERT(new_cs.isCompatible(mode));
75 OSMO_ASSERT(new_cs == cs);
76 }
77 new_cs.dec(mode);
78 OSMO_ASSERT(new_cs.isCompatible(mode));
79 if (new_cs != cs) {
80 new_cs.inc(mode);
81 OSMO_ASSERT(new_cs.isCompatible(mode));
82 OSMO_ASSERT(new_cs == cs);
83 }
84}
85
86static void test_coding_scheme()
87{
88 unsigned i;
89 unsigned last_size_UL;
90 unsigned last_size_DL;
91 GprsCodingScheme::Scheme gprs_schemes[] = {
92 GprsCodingScheme::CS1,
93 GprsCodingScheme::CS2,
94 GprsCodingScheme::CS3,
95 GprsCodingScheme::CS4
96 };
97 struct {
98 GprsCodingScheme::Scheme s;
99 bool is_gmsk;
100 } egprs_schemes[] = {
101 {GprsCodingScheme::MCS1, true},
102 {GprsCodingScheme::MCS2, true},
103 {GprsCodingScheme::MCS3, true},
104 {GprsCodingScheme::MCS4, true},
105 {GprsCodingScheme::MCS5, false},
106 {GprsCodingScheme::MCS6, false},
107 {GprsCodingScheme::MCS7, false},
108 {GprsCodingScheme::MCS8, false},
109 {GprsCodingScheme::MCS9, false},
110 };
111
112 printf("=== start %s ===\n", __func__);
113
114 GprsCodingScheme cs;
115 OSMO_ASSERT(!cs);
Jacob Erlbeck4c9e5492016-01-04 16:00:05 +0100116 OSMO_ASSERT(GprsCodingScheme::Scheme(cs) == GprsCodingScheme::UNKNOWN);
117 OSMO_ASSERT(cs == GprsCodingScheme(GprsCodingScheme::UNKNOWN));
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +0100118 OSMO_ASSERT(!cs.isCompatible(GprsCodingScheme::GPRS));
119 OSMO_ASSERT(!cs.isCompatible(GprsCodingScheme::EGPRS_GMSK));
120 OSMO_ASSERT(!cs.isCompatible(GprsCodingScheme::EGPRS));
121
122 last_size_UL = 0;
123 last_size_DL = 0;
124
125 for (i = 0; i < ARRAY_SIZE(gprs_schemes); i++) {
126 GprsCodingScheme current_cs(gprs_schemes[i]);
127 OSMO_ASSERT(current_cs.isGprs());
128 OSMO_ASSERT(!current_cs.isEgprs());
129 OSMO_ASSERT(!current_cs.isEgprsGmsk());
Jacob Erlbeck4c9e5492016-01-04 16:00:05 +0100130 OSMO_ASSERT(GprsCodingScheme::Scheme(current_cs) == gprs_schemes[i]);
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +0100131 OSMO_ASSERT(current_cs == GprsCodingScheme(gprs_schemes[i]));
132
133 /* Check strong monotonicity */
134 OSMO_ASSERT(current_cs.maxBytesUL() > last_size_UL);
135 OSMO_ASSERT(current_cs.maxBytesDL() > last_size_DL);
136 last_size_UL = current_cs.maxBytesUL();
137 last_size_DL = current_cs.maxBytesDL();
138
Jacob Erlbeck6c3dc612015-12-14 10:21:26 +0100139 /* Check header types */
140 OSMO_ASSERT(current_cs.headerTypeData() ==
141 GprsCodingScheme::HEADER_GPRS_DATA);
142 OSMO_ASSERT(current_cs.headerTypeControl() ==
143 GprsCodingScheme::HEADER_GPRS_CONTROL);
144
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +0100145 check_coding_scheme(current_cs, GprsCodingScheme::GPRS);
146 }
147 OSMO_ASSERT(i == 4);
148
149 last_size_UL = 0;
150 last_size_DL = 0;
151
152 for (i = 0; i < ARRAY_SIZE(egprs_schemes); i++) {
153 GprsCodingScheme current_cs(egprs_schemes[i].s);
154 OSMO_ASSERT(!current_cs.isGprs());
155 OSMO_ASSERT(current_cs.isEgprs());
156 OSMO_ASSERT(!!current_cs.isEgprsGmsk() == !!egprs_schemes[i].is_gmsk);
Jacob Erlbeck4c9e5492016-01-04 16:00:05 +0100157 OSMO_ASSERT(GprsCodingScheme::Scheme(current_cs) == egprs_schemes[i].s);
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +0100158 OSMO_ASSERT(current_cs == GprsCodingScheme(egprs_schemes[i].s));
159
160 /* Check strong monotonicity */
161 OSMO_ASSERT(current_cs.maxBytesUL() > last_size_UL);
162 OSMO_ASSERT(current_cs.maxBytesDL() > last_size_DL);
163 last_size_UL = current_cs.maxBytesUL();
164 last_size_DL = current_cs.maxBytesDL();
165
166 if (egprs_schemes[i].is_gmsk)
167 check_coding_scheme(current_cs, GprsCodingScheme::EGPRS_GMSK);
168 check_coding_scheme(current_cs, GprsCodingScheme::EGPRS);
169 }
170 OSMO_ASSERT(i == 9);
171
172 printf("=== end %s ===\n", __func__);
173}
174
Jacob Erlbeck38f18692016-02-01 10:08:00 +0100175static void test_rlc_unit_decoder()
Jacob Erlbeck61679252015-12-11 18:25:21 +0100176{
Jacob Erlbeckf2ba4cb2016-01-07 18:59:28 +0100177 struct gprs_rlc_data_block_info rdbi = {0};
Jacob Erlbeck61679252015-12-11 18:25:21 +0100178 GprsCodingScheme cs;
179 uint8_t data[74];
180 Decoding::RlcData chunks[16];
181 volatile int num_chunks = 0;
182 uint32_t tlli, tlli2;
183 unsigned int offs;
184
185
186 printf("=== start %s ===\n", __func__);
187
188 /* TS 44.060, B.1 */
189 cs = GprsCodingScheme::CS4;
190 rdbi.data_len = cs.maxDataBlockBytes();
191 rdbi.e = 0;
192 rdbi.ti = 0;
193 rdbi.cv = 15;
194 tlli = 0;
195 offs = 0;
196 data[offs++] = (11 << 2) | (1 << 1) | (0 << 0);
197 data[offs++] = (26 << 2) | (1 << 1) | (1 << 0);
198 num_chunks = Decoding::rlc_data_from_ul_data(&rdbi, cs, data,
199 chunks, ARRAY_SIZE(chunks), &tlli);
200 OSMO_ASSERT(num_chunks == 3);
201 OSMO_ASSERT(tlli == 0);
202 OSMO_ASSERT(chunks[0].offset == 2);
203 OSMO_ASSERT(chunks[0].length == 11);
204 OSMO_ASSERT(chunks[0].is_complete);
205 OSMO_ASSERT(chunks[1].offset == 13);
206 OSMO_ASSERT(chunks[1].length == 26);
207 OSMO_ASSERT(chunks[1].is_complete);
208 OSMO_ASSERT(chunks[2].offset == 39);
209 OSMO_ASSERT(chunks[2].length == cs.maxDataBlockBytes() - 39);
210 OSMO_ASSERT(!chunks[2].is_complete);
211
212 /* TS 44.060, B.2 */
213 cs = GprsCodingScheme::CS1;
214 rdbi.data_len = cs.maxDataBlockBytes();
215 rdbi.e = 0;
216 rdbi.ti = 0;
217 rdbi.cv = 15;
218 tlli = 0;
219 offs = 0;
220 data[offs++] = (0 << 2) | (0 << 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 == 1);
224 OSMO_ASSERT(tlli == 0);
225 OSMO_ASSERT(chunks[0].offset == 1);
226 OSMO_ASSERT(chunks[0].length == 19);
227 OSMO_ASSERT(!chunks[0].is_complete);
228
229 rdbi.e = 0;
230 rdbi.ti = 0;
231 rdbi.cv = 15;
232 tlli = 0;
233 offs = 0;
234 data[offs++] = (1 << 2) | (1 << 1) | (1 << 0);
235 num_chunks = Decoding::rlc_data_from_ul_data(&rdbi, cs, data,
236 chunks, ARRAY_SIZE(chunks), &tlli);
237 OSMO_ASSERT(num_chunks == 2);
238 OSMO_ASSERT(tlli == 0);
239 OSMO_ASSERT(chunks[0].offset == 1);
240 OSMO_ASSERT(chunks[0].length == 1);
241 OSMO_ASSERT(chunks[0].is_complete);
242 OSMO_ASSERT(chunks[1].offset == 2);
243 OSMO_ASSERT(chunks[1].length == 18);
244 OSMO_ASSERT(!chunks[1].is_complete);
245
246 /* TS 44.060, B.3 */
247 cs = GprsCodingScheme::CS1;
248 rdbi.data_len = cs.maxDataBlockBytes();
249 rdbi.e = 0;
250 rdbi.ti = 0;
251 rdbi.cv = 15;
252 tlli = 0;
253 offs = 0;
254 data[offs++] = (7 << 2) | (1 << 1) | (0 << 0);
255 data[offs++] = (11 << 2) | (0 << 1) | (1 << 0);
256 num_chunks = Decoding::rlc_data_from_ul_data(&rdbi, cs, data,
257 chunks, ARRAY_SIZE(chunks), &tlli);
258 OSMO_ASSERT(num_chunks == 2);
259 OSMO_ASSERT(tlli == 0);
260 OSMO_ASSERT(chunks[0].offset == 2);
261 OSMO_ASSERT(chunks[0].length == 7);
262 OSMO_ASSERT(chunks[0].is_complete);
263 OSMO_ASSERT(chunks[1].offset == 9);
264 OSMO_ASSERT(chunks[1].length == 11);
265 OSMO_ASSERT(chunks[1].is_complete);
266
267 /* TS 44.060, B.4 */
268 cs = GprsCodingScheme::CS1;
269 rdbi.data_len = cs.maxDataBlockBytes();
270 rdbi.e = 1;
271 rdbi.ti = 0;
272 rdbi.cv = 15;
273 tlli = 0;
274 offs = 0;
275 num_chunks = Decoding::rlc_data_from_ul_data(&rdbi, cs, data,
276 chunks, ARRAY_SIZE(chunks), &tlli);
277 OSMO_ASSERT(num_chunks == 1);
278 OSMO_ASSERT(tlli == 0);
279 OSMO_ASSERT(chunks[0].offset == 0);
280 OSMO_ASSERT(chunks[0].length == 20);
281 OSMO_ASSERT(!chunks[0].is_complete);
282
283 /* TS 44.060, B.6 */
284 cs = GprsCodingScheme::CS1;
285 rdbi.data_len = cs.maxDataBlockBytes();
286 rdbi.e = 1;
287 rdbi.ti = 0;
288 rdbi.cv = 0;
289 tlli = 0;
290 offs = 0;
291 num_chunks = Decoding::rlc_data_from_ul_data(&rdbi, cs, data,
292 chunks, ARRAY_SIZE(chunks), &tlli);
293 OSMO_ASSERT(num_chunks == 1);
294 OSMO_ASSERT(tlli == 0);
295 OSMO_ASSERT(chunks[0].offset == 0);
296 OSMO_ASSERT(chunks[0].length == 20);
297 OSMO_ASSERT(chunks[0].is_complete);
298
299 /* TS 44.060, B.8.1 */
300 cs = GprsCodingScheme::MCS4;
301 rdbi.data_len = cs.maxDataBlockBytes();
302 rdbi.e = 0;
303 rdbi.ti = 0;
304 rdbi.cv = 15;
305 tlli = 0;
306 offs = 0;
307 data[offs++] = (11 << 1) | (0 << 0);
308 data[offs++] = (26 << 1) | (1 << 0);
309 num_chunks = Decoding::rlc_data_from_ul_data(&rdbi, cs, data,
310 chunks, ARRAY_SIZE(chunks), &tlli);
311 OSMO_ASSERT(num_chunks == 3);
312 OSMO_ASSERT(tlli == 0);
313 OSMO_ASSERT(chunks[0].offset == 2);
314 OSMO_ASSERT(chunks[0].length == 11);
315 OSMO_ASSERT(chunks[0].is_complete);
316 OSMO_ASSERT(chunks[1].offset == 13);
317 OSMO_ASSERT(chunks[1].length == 26);
318 OSMO_ASSERT(chunks[1].is_complete);
319 OSMO_ASSERT(chunks[2].offset == 39);
320 OSMO_ASSERT(chunks[2].length == 5);
321 OSMO_ASSERT(!chunks[2].is_complete);
322
323 /* TS 44.060, B.8.2 */
324
325 /* Note that the spec confuses the byte numbering here, since it
326 * includes the FBI/E header bits into the N2 octet count which
327 * is not consistent with Section 10.3a.1 & 10.3a.2. */
328
329 cs = GprsCodingScheme::MCS2;
330 rdbi.data_len = cs.maxDataBlockBytes();
331 rdbi.e = 0;
332 rdbi.ti = 0;
333 rdbi.cv = 15;
334 tlli = 0;
335 offs = 0;
336 data[offs++] = (15 << 1) | (1 << 0);
337 num_chunks = Decoding::rlc_data_from_ul_data(&rdbi, cs, data,
338 chunks, ARRAY_SIZE(chunks), &tlli);
339 OSMO_ASSERT(num_chunks == 2);
340 OSMO_ASSERT(tlli == 0);
341 OSMO_ASSERT(chunks[0].offset == 1);
342 OSMO_ASSERT(chunks[0].length == 15);
343 OSMO_ASSERT(chunks[0].is_complete);
344 OSMO_ASSERT(chunks[1].offset == 16);
345 OSMO_ASSERT(chunks[1].length == 12);
346 OSMO_ASSERT(!chunks[1].is_complete);
347
348 rdbi.e = 0;
349 rdbi.ti = 0;
350 rdbi.cv = 15;
351 tlli = 0;
352 offs = 0;
353 data[offs++] = ( 0 << 1) | (0 << 0);
354 data[offs++] = ( 7 << 1) | (0 << 0);
355 data[offs++] = (18 << 1) | (1 << 0); /* Differs from spec's N2-11 = 17 */
356 num_chunks = Decoding::rlc_data_from_ul_data(&rdbi, cs, data,
357 chunks, ARRAY_SIZE(chunks), &tlli);
358 OSMO_ASSERT(num_chunks == 3);
359 OSMO_ASSERT(tlli == 0);
360 OSMO_ASSERT(chunks[0].offset == 3);
361 OSMO_ASSERT(chunks[0].length == 0);
362 OSMO_ASSERT(chunks[0].is_complete);
363 OSMO_ASSERT(chunks[1].offset == 3);
364 OSMO_ASSERT(chunks[1].length == 7);
365 OSMO_ASSERT(chunks[1].is_complete);
366 OSMO_ASSERT(chunks[2].offset == 10);
367 OSMO_ASSERT(chunks[2].length == 18);
368 OSMO_ASSERT(chunks[2].is_complete);
369
370 rdbi.e = 0;
371 rdbi.ti = 0;
372 rdbi.cv = 0;
373 tlli = 0;
374 offs = 0;
375 data[offs++] = ( 6 << 1) | (0 << 0);
376 data[offs++] = (12 << 1) | (0 << 0);
377 data[offs++] = (127 << 1) | (1 << 0);
378 num_chunks = Decoding::rlc_data_from_ul_data(&rdbi, cs, data,
379 chunks, ARRAY_SIZE(chunks), &tlli);
380 OSMO_ASSERT(num_chunks == 2);
381 OSMO_ASSERT(tlli == 0);
382 OSMO_ASSERT(chunks[0].offset == 3);
383 OSMO_ASSERT(chunks[0].length == 6);
384 OSMO_ASSERT(chunks[0].is_complete);
385 OSMO_ASSERT(chunks[1].offset == 9);
386 OSMO_ASSERT(chunks[1].length == 12);
387 OSMO_ASSERT(chunks[1].is_complete);
388
389 /* TS 44.060, B.8.3 */
390
391 /* Note that the spec confuses the byte numbering here, too (see above) */
392
393 cs = GprsCodingScheme::MCS2;
394 rdbi.data_len = cs.maxDataBlockBytes();
395 rdbi.e = 1;
396 rdbi.ti = 0;
397 rdbi.cv = 0;
398 tlli = 0;
399 offs = 0;
400 num_chunks = Decoding::rlc_data_from_ul_data(&rdbi, cs, data,
401 chunks, ARRAY_SIZE(chunks), &tlli);
402 OSMO_ASSERT(num_chunks == 1);
403 OSMO_ASSERT(tlli == 0);
404 OSMO_ASSERT(chunks[0].offset == 0);
405 OSMO_ASSERT(chunks[0].length == 28);
406 OSMO_ASSERT(chunks[0].is_complete);
407
408 /* CS-1, TLLI, last block, single chunk until the end of the block */
409 cs = GprsCodingScheme::CS1;
410 rdbi.data_len = cs.maxDataBlockBytes();
411 rdbi.e = 1;
412 rdbi.ti = 1;
413 rdbi.cv = 0;
414 tlli = 0;
415 tlli2 = 0xffeeddcc;
416 offs = 0;
417 data[offs++] = tlli2 >> 24;
418 data[offs++] = tlli2 >> 16;
419 data[offs++] = tlli2 >> 8;
420 data[offs++] = tlli2 >> 0;
421 num_chunks = Decoding::rlc_data_from_ul_data(&rdbi, cs, data,
422 chunks, ARRAY_SIZE(chunks), &tlli);
423 OSMO_ASSERT(num_chunks == 1);
424 OSMO_ASSERT(tlli == tlli2);
425 OSMO_ASSERT(chunks[0].offset == 4);
426 OSMO_ASSERT(chunks[0].length == 16);
427 OSMO_ASSERT(chunks[0].is_complete);
428
429 /* Like TS 44.060, B.2, first RLC block but with TLLI */
430 cs = GprsCodingScheme::CS1;
431 rdbi.data_len = cs.maxDataBlockBytes();
432 rdbi.e = 0;
433 rdbi.ti = 1;
434 rdbi.cv = 15;
435 tlli = 0;
436 tlli2 = 0xffeeddbb;
437 offs = 0;
438 data[offs++] = (0 << 2) | (0 << 1) | (1 << 0);
439 data[offs++] = tlli2 >> 24;
440 data[offs++] = tlli2 >> 16;
441 data[offs++] = tlli2 >> 8;
442 data[offs++] = tlli2 >> 0;
443 num_chunks = Decoding::rlc_data_from_ul_data(&rdbi, cs, data,
444 chunks, ARRAY_SIZE(chunks), &tlli);
445 OSMO_ASSERT(num_chunks == 1);
446 OSMO_ASSERT(tlli == tlli2);
447 OSMO_ASSERT(chunks[0].offset == 5);
448 OSMO_ASSERT(chunks[0].length == 15);
449 OSMO_ASSERT(!chunks[0].is_complete);
450
451 /* Like TS 44.060, B.8.1 but with TLLI */
452 cs = GprsCodingScheme::MCS4;
453 rdbi.data_len = cs.maxDataBlockBytes();
454 rdbi.e = 0;
455 rdbi.ti = 1;
456 rdbi.cv = 15;
457 tlli = 0;
458 tlli2 = 0xffeeddaa;
459 offs = 0;
460 data[offs++] = (11 << 1) | (0 << 0);
461 data[offs++] = (26 << 1) | (1 << 0);
462 /* Little endian */
463 data[offs++] = tlli2 >> 0;
464 data[offs++] = tlli2 >> 8;
465 data[offs++] = tlli2 >> 16;
466 data[offs++] = tlli2 >> 24;
467 num_chunks = Decoding::rlc_data_from_ul_data(&rdbi, cs, data,
468 chunks, ARRAY_SIZE(chunks), &tlli);
469 OSMO_ASSERT(num_chunks == 3);
470 OSMO_ASSERT(tlli == tlli2);
471 OSMO_ASSERT(chunks[0].offset == 6);
472 OSMO_ASSERT(chunks[0].length == 11);
473 OSMO_ASSERT(chunks[0].is_complete);
474 OSMO_ASSERT(chunks[1].offset == 17);
475 OSMO_ASSERT(chunks[1].length == 26);
476 OSMO_ASSERT(chunks[1].is_complete);
477 OSMO_ASSERT(chunks[2].offset == 43);
478 OSMO_ASSERT(chunks[2].length == 1);
479 OSMO_ASSERT(!chunks[2].is_complete);
480
481 printf("=== end %s ===\n", __func__);
482}
483
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +0100484
485static const struct log_info_cat default_categories[] = {
486 {"DCSN1", "\033[1;31m", "Concrete Syntax Notation One (CSN1)", LOGL_INFO, 0},
487 {"DL1IF", "\033[1;32m", "GPRS PCU L1 interface (L1IF)", LOGL_DEBUG, 1},
488 {"DRLCMAC", "\033[0;33m", "GPRS RLC/MAC layer (RLCMAC)", LOGL_DEBUG, 1},
489 {"DRLCMACDATA", "\033[0;33m", "GPRS RLC/MAC layer Data (RLCMAC)", LOGL_DEBUG, 1},
490 {"DRLCMACDL", "\033[1;33m", "GPRS RLC/MAC layer Downlink (RLCMAC)", LOGL_DEBUG, 1},
491 {"DRLCMACUL", "\033[1;36m", "GPRS RLC/MAC layer Uplink (RLCMAC)", LOGL_DEBUG, 1},
492 {"DRLCMACSCHED", "\033[0;36m", "GPRS RLC/MAC layer Scheduling (RLCMAC)", LOGL_DEBUG, 1},
493 {"DRLCMACMEAS", "\033[1;31m", "GPRS RLC/MAC layer Measurements (RLCMAC)", LOGL_INFO, 1},
494 {"DNS","\033[1;34m", "GPRS Network Service Protocol (NS)", LOGL_INFO , 1},
495 {"DBSSGP","\033[1;34m", "GPRS BSS Gateway Protocol (BSSGP)", LOGL_INFO , 1},
496 {"DPCU", "\033[1;35m", "GPRS Packet Control Unit (PCU)", LOGL_NOTICE, 1},
497};
498
499static int filter_fn(const struct log_context *ctx,
500 struct log_target *tar)
501{
502 return 1;
503}
504
505const struct log_info debug_log_info = {
506 filter_fn,
507 (struct log_info_cat*)default_categories,
508 ARRAY_SIZE(default_categories),
509};
510
511int main(int argc, char **argv)
512{
513 struct vty_app_info pcu_vty_info = {0};
514
515 tall_pcu_ctx = talloc_named_const(NULL, 1, "EdgeTest context");
516 if (!tall_pcu_ctx)
517 abort();
518
519 msgb_set_talloc_ctx(tall_pcu_ctx);
520 osmo_init_logging(&debug_log_info);
521 log_set_use_color(osmo_stderr_target, 0);
522 log_set_print_filename(osmo_stderr_target, 0);
523
524 vty_init(&pcu_vty_info);
525 pcu_vty_init(&debug_log_info);
526
527 test_coding_scheme();
Jacob Erlbeck38f18692016-02-01 10:08:00 +0100528 test_rlc_unit_decoder();
Jacob Erlbeckd0222cf2015-12-07 12:23:35 +0100529
530 if (getenv("TALLOC_REPORT_FULL"))
531 talloc_report_full(tall_pcu_ctx, stderr);
532 return EXIT_SUCCESS;
533}
534
535/*
536 * stubs that should not be reached
537 */
538extern "C" {
539void l1if_pdch_req() { abort(); }
540void l1if_connect_pdch() { abort(); }
541void l1if_close_pdch() { abort(); }
542void l1if_open_pdch() { abort(); }
543}