blob: 5a25d76fb8e879d3029c8d7ad968021d61be40f4 [file] [log] [blame]
Jacob Erlbecke04e0b02015-05-06 18:30:48 +02001/*
2 * MsTest.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 "tbf.h"
24#include "gprs_debug.h"
25#include "gprs_ms.h"
Jacob Erlbeck53670862015-05-12 17:54:33 +020026#include "gprs_ms_storage.h"
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +020027#include "bts.h"
Jacob Erlbecke04e0b02015-05-06 18:30:48 +020028
29extern "C" {
30#include "pcu_vty.h"
31
32#include <osmocom/core/application.h>
33#include <osmocom/core/msgb.h>
34#include <osmocom/core/talloc.h>
35#include <osmocom/core/utils.h>
36#include <osmocom/vty/vty.h>
37}
38
39#include <errno.h>
Jacob Erlbeckd9e10242015-05-28 15:43:53 +020040#include <unistd.h>
Jacob Erlbecke04e0b02015-05-06 18:30:48 +020041
42void *tall_pcu_ctx;
43int16_t spoof_mnc = 0, spoof_mcc = 0;
44
45static void test_ms_state()
46{
47 uint32_t tlli = 0xffeeddbb;
48 gprs_rlcmac_dl_tbf *dl_tbf;
49 gprs_rlcmac_ul_tbf *ul_tbf;
50 GprsMs *ms;
51
52 printf("=== start %s ===\n", __func__);
53
Jacob Erlbeck17214bb2015-06-02 14:06:12 +020054 ms = new GprsMs(NULL, tlli);
Jacob Erlbecke04e0b02015-05-06 18:30:48 +020055 OSMO_ASSERT(ms->is_idle());
56
57 dl_tbf = talloc_zero(tall_pcu_ctx, struct gprs_rlcmac_dl_tbf);
58 dl_tbf->direction = GPRS_RLCMAC_DL_TBF;
59 ul_tbf = talloc_zero(tall_pcu_ctx, struct gprs_rlcmac_ul_tbf);
60 ul_tbf->direction = GPRS_RLCMAC_UL_TBF;
61
62 ms->attach_tbf(ul_tbf);
63 OSMO_ASSERT(!ms->is_idle());
64 OSMO_ASSERT(ms->ul_tbf() == ul_tbf);
65 OSMO_ASSERT(ms->dl_tbf() == NULL);
66
67 ms->attach_tbf(dl_tbf);
68 OSMO_ASSERT(!ms->is_idle());
69 OSMO_ASSERT(ms->ul_tbf() == ul_tbf);
70 OSMO_ASSERT(ms->dl_tbf() == dl_tbf);
71
Jacob Erlbeckac89a552015-06-29 14:18:46 +020072 OSMO_ASSERT(ms->tbf(GPRS_RLCMAC_UL_TBF) == ul_tbf);
73 OSMO_ASSERT(ms->tbf(GPRS_RLCMAC_DL_TBF) == dl_tbf);
74
Jacob Erlbecke04e0b02015-05-06 18:30:48 +020075 ms->detach_tbf(ul_tbf);
76 OSMO_ASSERT(!ms->is_idle());
77 OSMO_ASSERT(ms->ul_tbf() == NULL);
78 OSMO_ASSERT(ms->dl_tbf() == dl_tbf);
79
80 ms->detach_tbf(dl_tbf);
81 /* The ms object is freed now */
82 ms = NULL;
83
84 talloc_free(dl_tbf);
85 talloc_free(ul_tbf);
86
87 printf("=== end %s ===\n", __func__);
88}
89
90static void test_ms_callback()
91{
92 uint32_t tlli = 0xffeeddbb;
93 gprs_rlcmac_dl_tbf *dl_tbf;
94 gprs_rlcmac_ul_tbf *ul_tbf;
95 GprsMs *ms;
96 static enum {UNKNOWN, IS_IDLE, IS_ACTIVE} last_cb = UNKNOWN;
97
98 struct MyCallback: public GprsMs::Callback {
99 virtual void ms_idle(class GprsMs *ms) {
100 OSMO_ASSERT(ms->is_idle());
101 printf(" ms_idle() was called\n");
102 last_cb = IS_IDLE;
103 }
104 virtual void ms_active(class GprsMs *ms) {
105 OSMO_ASSERT(!ms->is_idle());
106 printf(" ms_active() was called\n");
107 last_cb = IS_ACTIVE;
108 }
109 } cb;
110
111 printf("=== start %s ===\n", __func__);
112
Jacob Erlbeck17214bb2015-06-02 14:06:12 +0200113 ms = new GprsMs(NULL, tlli);
Jacob Erlbecke04e0b02015-05-06 18:30:48 +0200114 ms->set_callback(&cb);
115
116 OSMO_ASSERT(ms->is_idle());
117
118 dl_tbf = talloc_zero(tall_pcu_ctx, struct gprs_rlcmac_dl_tbf);
119 dl_tbf->direction = GPRS_RLCMAC_DL_TBF;
120 ul_tbf = talloc_zero(tall_pcu_ctx, struct gprs_rlcmac_ul_tbf);
121 ul_tbf->direction = GPRS_RLCMAC_UL_TBF;
122
123 OSMO_ASSERT(last_cb == UNKNOWN);
124
125 ms->attach_tbf(ul_tbf);
126 OSMO_ASSERT(!ms->is_idle());
127 OSMO_ASSERT(ms->ul_tbf() == ul_tbf);
128 OSMO_ASSERT(ms->dl_tbf() == NULL);
129 OSMO_ASSERT(last_cb == IS_ACTIVE);
130
131 last_cb = UNKNOWN;
132
133 ms->attach_tbf(dl_tbf);
134 OSMO_ASSERT(!ms->is_idle());
135 OSMO_ASSERT(ms->ul_tbf() == ul_tbf);
136 OSMO_ASSERT(ms->dl_tbf() == dl_tbf);
137 OSMO_ASSERT(last_cb == UNKNOWN);
138
139 ms->detach_tbf(ul_tbf);
140 OSMO_ASSERT(!ms->is_idle());
141 OSMO_ASSERT(ms->ul_tbf() == NULL);
142 OSMO_ASSERT(ms->dl_tbf() == dl_tbf);
143 OSMO_ASSERT(last_cb == UNKNOWN);
144
145 ms->detach_tbf(dl_tbf);
146 OSMO_ASSERT(ms->is_idle());
147 OSMO_ASSERT(ms->ul_tbf() == NULL);
148 OSMO_ASSERT(ms->dl_tbf() == NULL);
149 OSMO_ASSERT(last_cb == IS_IDLE);
150
151 last_cb = UNKNOWN;
152 delete ms;
153
154 talloc_free(dl_tbf);
155 talloc_free(ul_tbf);
156
157 printf("=== end %s ===\n", __func__);
158}
159
160static void test_ms_replace_tbf()
161{
162 uint32_t tlli = 0xffeeddbb;
163 gprs_rlcmac_dl_tbf *dl_tbf[2];
164 gprs_rlcmac_ul_tbf *ul_tbf;
165 GprsMs *ms;
166 static bool was_idle;
167
168 struct MyCallback: public GprsMs::Callback {
169 virtual void ms_idle(class GprsMs *ms) {
170 OSMO_ASSERT(ms->is_idle());
171 printf(" ms_idle() was called\n");
172 was_idle = true;
173 }
174 virtual void ms_active(class GprsMs *ms) {
175 OSMO_ASSERT(!ms->is_idle());
176 printf(" ms_active() was called\n");
177 }
178 } cb;
179
180 printf("=== start %s ===\n", __func__);
181
Jacob Erlbeck17214bb2015-06-02 14:06:12 +0200182 ms = new GprsMs(NULL, tlli);
Jacob Erlbecke04e0b02015-05-06 18:30:48 +0200183 ms->set_callback(&cb);
184
185 OSMO_ASSERT(ms->is_idle());
186 was_idle = false;
187
188 dl_tbf[0] = talloc_zero(tall_pcu_ctx, struct gprs_rlcmac_dl_tbf);
189 dl_tbf[0]->direction = GPRS_RLCMAC_DL_TBF;
190 dl_tbf[1] = talloc_zero(tall_pcu_ctx, struct gprs_rlcmac_dl_tbf);
191 dl_tbf[1]->direction = GPRS_RLCMAC_DL_TBF;
192 ul_tbf = talloc_zero(tall_pcu_ctx, struct gprs_rlcmac_ul_tbf);
193 ul_tbf->direction = GPRS_RLCMAC_UL_TBF;
194
195 ms->attach_tbf(dl_tbf[0]);
196 OSMO_ASSERT(!ms->is_idle());
197 OSMO_ASSERT(ms->ul_tbf() == NULL);
198 OSMO_ASSERT(ms->dl_tbf() == dl_tbf[0]);
199 OSMO_ASSERT(!was_idle);
200
201 ms->attach_tbf(dl_tbf[1]);
202 OSMO_ASSERT(!ms->is_idle());
203 OSMO_ASSERT(ms->ul_tbf() == NULL);
204 OSMO_ASSERT(ms->dl_tbf() == dl_tbf[1]);
205 OSMO_ASSERT(!was_idle);
206
207 ms->attach_tbf(ul_tbf);
208 OSMO_ASSERT(!ms->is_idle());
209 OSMO_ASSERT(ms->ul_tbf() == ul_tbf);
210 OSMO_ASSERT(ms->dl_tbf() == dl_tbf[1]);
211 OSMO_ASSERT(!was_idle);
212
213 ms->detach_tbf(ul_tbf);
214 OSMO_ASSERT(!ms->is_idle());
215 OSMO_ASSERT(ms->ul_tbf() == NULL);
216 OSMO_ASSERT(ms->dl_tbf() == dl_tbf[1]);
217 OSMO_ASSERT(!was_idle);
218
219 ms->detach_tbf(dl_tbf[0]);
220 OSMO_ASSERT(!ms->is_idle());
221 OSMO_ASSERT(ms->ul_tbf() == NULL);
222 OSMO_ASSERT(ms->dl_tbf() == dl_tbf[1]);
223 OSMO_ASSERT(!was_idle);
224
225 ms->detach_tbf(dl_tbf[1]);
226 OSMO_ASSERT(ms->is_idle());
227 OSMO_ASSERT(ms->ul_tbf() == NULL);
228 OSMO_ASSERT(ms->dl_tbf() == NULL);
229 OSMO_ASSERT(was_idle);
230
231 delete ms;
232
233 talloc_free(dl_tbf[0]);
234 talloc_free(dl_tbf[1]);
235 talloc_free(ul_tbf);
236
237 printf("=== end %s ===\n", __func__);
238}
239
Jacob Erlbeck93990462015-05-15 15:50:43 +0200240static void test_ms_change_tlli()
241{
242 uint32_t start_tlli = 0xaa000000;
243 uint32_t new_ms_tlli = 0xff001111;
244 uint32_t other_sgsn_tlli = 0xff00eeee;
245 GprsMs *ms;
246
247 printf("=== start %s ===\n", __func__);
248
Jacob Erlbeck17214bb2015-06-02 14:06:12 +0200249 ms = new GprsMs(NULL, start_tlli);
Jacob Erlbeck93990462015-05-15 15:50:43 +0200250
251 OSMO_ASSERT(ms->is_idle());
252
253 /* MS announces TLLI, SGSN uses it immediately */
254 ms->set_tlli(new_ms_tlli);
255 OSMO_ASSERT(ms->tlli() == new_ms_tlli);
256 OSMO_ASSERT(ms->check_tlli(new_ms_tlli));
257 OSMO_ASSERT(ms->check_tlli(start_tlli));
258
259 ms->confirm_tlli(new_ms_tlli);
260 OSMO_ASSERT(ms->tlli() == new_ms_tlli);
261 OSMO_ASSERT(ms->check_tlli(new_ms_tlli));
262 OSMO_ASSERT(!ms->check_tlli(start_tlli));
263
264 /* MS announces TLLI, SGSN uses it later */
265 ms->set_tlli(start_tlli);
266 ms->confirm_tlli(start_tlli);
267
268 ms->set_tlli(new_ms_tlli);
269 OSMO_ASSERT(ms->tlli() == new_ms_tlli);
270 OSMO_ASSERT(ms->check_tlli(new_ms_tlli));
271 OSMO_ASSERT(ms->check_tlli(start_tlli));
272
273 ms->confirm_tlli(start_tlli);
274 OSMO_ASSERT(ms->tlli() == new_ms_tlli);
275 OSMO_ASSERT(ms->check_tlli(new_ms_tlli));
276 OSMO_ASSERT(ms->check_tlli(start_tlli));
277
278 ms->set_tlli(new_ms_tlli);
279 OSMO_ASSERT(ms->tlli() == new_ms_tlli);
280 OSMO_ASSERT(ms->check_tlli(new_ms_tlli));
281 OSMO_ASSERT(ms->check_tlli(start_tlli));
282
283 ms->confirm_tlli(new_ms_tlli);
284 OSMO_ASSERT(ms->tlli() == new_ms_tlli);
285 OSMO_ASSERT(ms->check_tlli(new_ms_tlli));
286 OSMO_ASSERT(!ms->check_tlli(start_tlli));
287
288 /* MS announces TLLI, SGSN uses it later after another new TLLI */
289 ms->set_tlli(start_tlli);
290 ms->confirm_tlli(start_tlli);
291
292 ms->set_tlli(new_ms_tlli);
293 OSMO_ASSERT(ms->tlli() == new_ms_tlli);
294 OSMO_ASSERT(ms->check_tlli(new_ms_tlli));
295 OSMO_ASSERT(ms->check_tlli(start_tlli));
296
297 ms->confirm_tlli(other_sgsn_tlli);
298 OSMO_ASSERT(ms->tlli() == new_ms_tlli);
299 OSMO_ASSERT(ms->check_tlli(new_ms_tlli));
300 OSMO_ASSERT(ms->check_tlli(other_sgsn_tlli));
301
302 ms->set_tlli(new_ms_tlli);
303 OSMO_ASSERT(ms->tlli() == new_ms_tlli);
304 OSMO_ASSERT(ms->check_tlli(new_ms_tlli));
305 OSMO_ASSERT(ms->check_tlli(other_sgsn_tlli));
306
307 ms->confirm_tlli(new_ms_tlli);
308 OSMO_ASSERT(ms->tlli() == new_ms_tlli);
309 OSMO_ASSERT(ms->check_tlli(new_ms_tlli));
310 OSMO_ASSERT(!ms->check_tlli(start_tlli));
311 OSMO_ASSERT(!ms->check_tlli(other_sgsn_tlli));
312
313 /* SGSN uses the new TLLI before it is announced by the MS (shouldn't
314 * happen in normal use) */
315 ms->set_tlli(start_tlli);
316 ms->confirm_tlli(start_tlli);
317
318 ms->confirm_tlli(new_ms_tlli);
319 OSMO_ASSERT(ms->tlli() == start_tlli);
320 OSMO_ASSERT(ms->check_tlli(new_ms_tlli));
321 OSMO_ASSERT(ms->check_tlli(start_tlli));
322
323 ms->set_tlli(new_ms_tlli);
324 OSMO_ASSERT(ms->tlli() == new_ms_tlli);
325 OSMO_ASSERT(ms->check_tlli(new_ms_tlli));
326 OSMO_ASSERT(!ms->check_tlli(start_tlli));
327
328 delete ms;
329
330 printf("=== end %s ===\n", __func__);
331}
332
Jacob Erlbeck53670862015-05-12 17:54:33 +0200333static void test_ms_storage()
334{
335 uint32_t tlli = 0xffeeddbb;
Jacob Erlbeck7b9f8252015-05-21 11:07:53 +0200336 const char *imsi1 = "001001987654321";
337 const char *imsi2 = "001001987654322";
338
Jacob Erlbeck53670862015-05-12 17:54:33 +0200339 gprs_rlcmac_ul_tbf *ul_tbf;
Jacob Erlbeck0e50ce62015-05-21 16:58:22 +0200340 GprsMs *ms, *ms_tmp;
Jacob Erlbeck17214bb2015-06-02 14:06:12 +0200341 GprsMsStorage store(NULL);
Jacob Erlbeck53670862015-05-12 17:54:33 +0200342
343 printf("=== start %s ===\n", __func__);
344
345 ul_tbf = talloc_zero(tall_pcu_ctx, struct gprs_rlcmac_ul_tbf);
346 ul_tbf->direction = GPRS_RLCMAC_UL_TBF;
347
348 ms = store.get_ms(tlli + 0);
349 OSMO_ASSERT(ms == NULL);
350
Jacob Erlbeck0e50ce62015-05-21 16:58:22 +0200351 ms = store.create_ms(tlli + 0, GPRS_RLCMAC_UL_TBF);
Jacob Erlbeck53670862015-05-12 17:54:33 +0200352 OSMO_ASSERT(ms != NULL);
353 OSMO_ASSERT(ms->tlli() == tlli + 0);
Jacob Erlbeck7b9f8252015-05-21 11:07:53 +0200354 ms->set_imsi(imsi1);
355 OSMO_ASSERT(strcmp(ms->imsi(), imsi1) == 0);
Jacob Erlbeck53670862015-05-12 17:54:33 +0200356
Jacob Erlbeck0e50ce62015-05-21 16:58:22 +0200357 ms_tmp = store.get_ms(tlli + 0);
358 OSMO_ASSERT(ms == ms_tmp);
359 OSMO_ASSERT(ms->tlli() == tlli + 0);
360
Jacob Erlbeck7b9f8252015-05-21 11:07:53 +0200361 ms_tmp = store.get_ms(0, 0, imsi1);
362 OSMO_ASSERT(ms == ms_tmp);
363 OSMO_ASSERT(strcmp(ms->imsi(), imsi1) == 0);
364 ms_tmp = store.get_ms(0, 0, imsi2);
365 OSMO_ASSERT(ms_tmp == NULL);
366
Jacob Erlbeck0e50ce62015-05-21 16:58:22 +0200367 ms = store.create_ms(tlli + 1, GPRS_RLCMAC_UL_TBF);
368 OSMO_ASSERT(ms != NULL);
Jacob Erlbeck53670862015-05-12 17:54:33 +0200369 OSMO_ASSERT(ms->tlli() == tlli + 1);
Jacob Erlbeck7b9f8252015-05-21 11:07:53 +0200370 ms->set_imsi(imsi2);
371 OSMO_ASSERT(strcmp(ms->imsi(), imsi2) == 0);
Jacob Erlbeck53670862015-05-12 17:54:33 +0200372
Jacob Erlbeck0e50ce62015-05-21 16:58:22 +0200373 ms_tmp = store.get_ms(tlli + 1);
374 OSMO_ASSERT(ms == ms_tmp);
Jacob Erlbeck53670862015-05-12 17:54:33 +0200375 OSMO_ASSERT(ms->tlli() == tlli + 1);
376
Jacob Erlbeck7b9f8252015-05-21 11:07:53 +0200377 ms_tmp = store.get_ms(0, 0, imsi1);
378 OSMO_ASSERT(ms_tmp != NULL);
379 OSMO_ASSERT(ms_tmp != ms);
380 ms_tmp = store.get_ms(0, 0, imsi2);
381 OSMO_ASSERT(ms == ms_tmp);
382 OSMO_ASSERT(strcmp(ms->imsi(), imsi2) == 0);
383
Jacob Erlbeck53670862015-05-12 17:54:33 +0200384 /* delete ms */
385 ms = store.get_ms(tlli + 0);
386 OSMO_ASSERT(ms != NULL);
387 ms->attach_tbf(ul_tbf);
388 ms->detach_tbf(ul_tbf);
389 ms = store.get_ms(tlli + 0);
390 OSMO_ASSERT(ms == NULL);
391 ms = store.get_ms(tlli + 1);
392 OSMO_ASSERT(ms != NULL);
393
394 /* delete ms */
395 ms = store.get_ms(tlli + 1);
396 OSMO_ASSERT(ms != NULL);
397 ms->attach_tbf(ul_tbf);
398 ms->detach_tbf(ul_tbf);
399 ms = store.get_ms(tlli + 1);
400 OSMO_ASSERT(ms == NULL);
401
402 talloc_free(ul_tbf);
403
404 printf("=== end %s ===\n", __func__);
405}
406
Jacob Erlbeckd9e10242015-05-28 15:43:53 +0200407static void test_ms_timeout()
408{
409 uint32_t tlli = 0xffeeddbb;
410 gprs_rlcmac_dl_tbf *dl_tbf;
411 gprs_rlcmac_ul_tbf *ul_tbf;
412 GprsMs *ms;
413 static enum {UNKNOWN, IS_IDLE, IS_ACTIVE} last_cb = UNKNOWN;
414
415 struct MyCallback: public GprsMs::Callback {
416 virtual void ms_idle(class GprsMs *ms) {
417 OSMO_ASSERT(ms->is_idle());
418 printf(" ms_idle() was called\n");
419 last_cb = IS_IDLE;
420 }
421 virtual void ms_active(class GprsMs *ms) {
422 OSMO_ASSERT(!ms->is_idle());
423 printf(" ms_active() was called\n");
424 last_cb = IS_ACTIVE;
425 }
426 } cb;
427
428 printf("=== start %s ===\n", __func__);
429
Jacob Erlbeck17214bb2015-06-02 14:06:12 +0200430 ms = new GprsMs(NULL, tlli);
Jacob Erlbeckd9e10242015-05-28 15:43:53 +0200431 ms->set_callback(&cb);
432 ms->set_timeout(1);
433
434 OSMO_ASSERT(ms->is_idle());
435
436 dl_tbf = talloc_zero(tall_pcu_ctx, struct gprs_rlcmac_dl_tbf);
437 dl_tbf->direction = GPRS_RLCMAC_DL_TBF;
438 ul_tbf = talloc_zero(tall_pcu_ctx, struct gprs_rlcmac_ul_tbf);
439 ul_tbf->direction = GPRS_RLCMAC_UL_TBF;
440
441 OSMO_ASSERT(last_cb == UNKNOWN);
442
443 ms->attach_tbf(ul_tbf);
444 OSMO_ASSERT(!ms->is_idle());
445 OSMO_ASSERT(last_cb == IS_ACTIVE);
446
447 last_cb = UNKNOWN;
448
449 ms->attach_tbf(dl_tbf);
450 OSMO_ASSERT(!ms->is_idle());
451 OSMO_ASSERT(last_cb == UNKNOWN);
452
453 ms->detach_tbf(ul_tbf);
454 OSMO_ASSERT(!ms->is_idle());
455 OSMO_ASSERT(last_cb == UNKNOWN);
456
457 ms->detach_tbf(dl_tbf);
458 OSMO_ASSERT(!ms->is_idle());
459 OSMO_ASSERT(last_cb == UNKNOWN);
460
461 usleep(1100000);
462 osmo_timers_update();
463
464 OSMO_ASSERT(ms->is_idle());
465 OSMO_ASSERT(last_cb == IS_IDLE);
466
467 last_cb = UNKNOWN;
468 delete ms;
469 talloc_free(dl_tbf);
470 talloc_free(ul_tbf);
471
472 printf("=== end %s ===\n", __func__);
473}
474
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200475static void test_ms_cs_selection()
476{
477 BTS the_bts;
478 gprs_rlcmac_bts *bts = the_bts.bts_data();
479 uint32_t tlli = 0xffeeddbb;
480
481 gprs_rlcmac_dl_tbf *dl_tbf;
482 GprsMs *ms;
483
484 printf("=== start %s ===\n", __func__);
485
486 bts->initial_cs_dl = 4;
487 bts->initial_cs_ul = 1;
488 bts->cs_downgrade_threshold = 0;
489
490 ms = new GprsMs(&the_bts, tlli);
491
492 OSMO_ASSERT(ms->is_idle());
493
494 dl_tbf = talloc_zero(tall_pcu_ctx, struct gprs_rlcmac_dl_tbf);
495 dl_tbf->direction = GPRS_RLCMAC_DL_TBF;
496
497 dl_tbf->set_ms(ms);
498 OSMO_ASSERT(!ms->is_idle());
499
500 OSMO_ASSERT(ms->current_cs_dl() == 4);
501
502 bts->cs_downgrade_threshold = 200;
503
504 OSMO_ASSERT(ms->current_cs_dl() == 3);
505
506 talloc_free(dl_tbf);
507
508 printf("=== end %s ===\n", __func__);
509}
510
Jacob Erlbecke04e0b02015-05-06 18:30:48 +0200511static const struct log_info_cat default_categories[] = {
512 {"DPCU", "", "GPRS Packet Control Unit (PCU)", LOGL_INFO, 1},
513};
514
515static int filter_fn(const struct log_context *ctx,
516 struct log_target *tar)
517{
518 return 1;
519}
520
521const struct log_info debug_log_info = {
522 filter_fn,
523 (struct log_info_cat*)default_categories,
524 ARRAY_SIZE(default_categories),
525};
526
527int main(int argc, char **argv)
528{
529 struct vty_app_info pcu_vty_info = {0};
530
531 tall_pcu_ctx = talloc_named_const(NULL, 1, "MsTest context");
532 if (!tall_pcu_ctx)
533 abort();
534
535 msgb_set_talloc_ctx(tall_pcu_ctx);
536 osmo_init_logging(&debug_log_info);
537 log_set_use_color(osmo_stderr_target, 0);
538 log_set_print_filename(osmo_stderr_target, 0);
539 log_set_log_level(osmo_stderr_target, LOGL_INFO);
540
541 vty_init(&pcu_vty_info);
542 pcu_vty_init(&debug_log_info);
543
544 test_ms_state();
545 test_ms_callback();
546 test_ms_replace_tbf();
Jacob Erlbeck93990462015-05-15 15:50:43 +0200547 test_ms_change_tlli();
Jacob Erlbeck53670862015-05-12 17:54:33 +0200548 test_ms_storage();
Jacob Erlbeckd9e10242015-05-28 15:43:53 +0200549 test_ms_timeout();
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200550 test_ms_cs_selection();
Jacob Erlbecke04e0b02015-05-06 18:30:48 +0200551
552 if (getenv("TALLOC_REPORT_FULL"))
553 talloc_report_full(tall_pcu_ctx, stderr);
554
555 return EXIT_SUCCESS;
556}
557
558extern "C" {
559void l1if_pdch_req() { abort(); }
560void l1if_connect_pdch() { abort(); }
561void l1if_close_pdch() { abort(); }
562void l1if_open_pdch() { abort(); }
563}