blob: 0930354de2663f2d3489d383e804adc1befcd167 [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);
Jacob Erlbeckb6b3c7e2015-08-28 12:07:14 +020058 new (dl_tbf) gprs_rlcmac_dl_tbf(NULL);
Jacob Erlbecke04e0b02015-05-06 18:30:48 +020059 ul_tbf = talloc_zero(tall_pcu_ctx, struct gprs_rlcmac_ul_tbf);
Jacob Erlbeckb6b3c7e2015-08-28 12:07:14 +020060 new (ul_tbf) gprs_rlcmac_ul_tbf(NULL);
Jacob Erlbecke04e0b02015-05-06 18:30:48 +020061
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);
Jacob Erlbeckb6b3c7e2015-08-28 12:07:14 +0200119 new (dl_tbf) gprs_rlcmac_dl_tbf(NULL);
Jacob Erlbecke04e0b02015-05-06 18:30:48 +0200120 ul_tbf = talloc_zero(tall_pcu_ctx, struct gprs_rlcmac_ul_tbf);
Jacob Erlbeckb6b3c7e2015-08-28 12:07:14 +0200121 new (ul_tbf) gprs_rlcmac_ul_tbf(NULL);
Jacob Erlbecke04e0b02015-05-06 18:30:48 +0200122
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);
Jacob Erlbeckb6b3c7e2015-08-28 12:07:14 +0200189 new (dl_tbf[0]) gprs_rlcmac_dl_tbf(NULL);
Jacob Erlbecke04e0b02015-05-06 18:30:48 +0200190 dl_tbf[1] = talloc_zero(tall_pcu_ctx, struct gprs_rlcmac_dl_tbf);
Jacob Erlbeckb6b3c7e2015-08-28 12:07:14 +0200191 new (dl_tbf[1]) gprs_rlcmac_dl_tbf(NULL);
Jacob Erlbecke04e0b02015-05-06 18:30:48 +0200192 ul_tbf = talloc_zero(tall_pcu_ctx, struct gprs_rlcmac_ul_tbf);
Jacob Erlbeckb6b3c7e2015-08-28 12:07:14 +0200193 new (ul_tbf) gprs_rlcmac_ul_tbf(NULL);
Jacob Erlbecke04e0b02015-05-06 18:30:48 +0200194
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]);
Jacob Erlbeck6835cea2015-08-21 15:24:02 +0200199 OSMO_ASSERT(llist_empty(&ms->old_tbfs()));
Jacob Erlbecke04e0b02015-05-06 18:30:48 +0200200 OSMO_ASSERT(!was_idle);
201
202 ms->attach_tbf(dl_tbf[1]);
203 OSMO_ASSERT(!ms->is_idle());
204 OSMO_ASSERT(ms->ul_tbf() == NULL);
205 OSMO_ASSERT(ms->dl_tbf() == dl_tbf[1]);
Jacob Erlbeck6835cea2015-08-21 15:24:02 +0200206 OSMO_ASSERT(!llist_empty(&ms->old_tbfs()));
Jacob Erlbecke04e0b02015-05-06 18:30:48 +0200207 OSMO_ASSERT(!was_idle);
208
209 ms->attach_tbf(ul_tbf);
210 OSMO_ASSERT(!ms->is_idle());
211 OSMO_ASSERT(ms->ul_tbf() == ul_tbf);
212 OSMO_ASSERT(ms->dl_tbf() == dl_tbf[1]);
Jacob Erlbeck6835cea2015-08-21 15:24:02 +0200213 OSMO_ASSERT(!llist_empty(&ms->old_tbfs()));
Jacob Erlbecke04e0b02015-05-06 18:30:48 +0200214 OSMO_ASSERT(!was_idle);
215
216 ms->detach_tbf(ul_tbf);
217 OSMO_ASSERT(!ms->is_idle());
218 OSMO_ASSERT(ms->ul_tbf() == NULL);
219 OSMO_ASSERT(ms->dl_tbf() == dl_tbf[1]);
Jacob Erlbeck6835cea2015-08-21 15:24:02 +0200220 OSMO_ASSERT(!llist_empty(&ms->old_tbfs()));
Jacob Erlbecke04e0b02015-05-06 18:30:48 +0200221 OSMO_ASSERT(!was_idle);
222
223 ms->detach_tbf(dl_tbf[0]);
224 OSMO_ASSERT(!ms->is_idle());
225 OSMO_ASSERT(ms->ul_tbf() == NULL);
226 OSMO_ASSERT(ms->dl_tbf() == dl_tbf[1]);
Jacob Erlbeck6835cea2015-08-21 15:24:02 +0200227 OSMO_ASSERT(llist_empty(&ms->old_tbfs()));
Jacob Erlbecke04e0b02015-05-06 18:30:48 +0200228 OSMO_ASSERT(!was_idle);
229
230 ms->detach_tbf(dl_tbf[1]);
231 OSMO_ASSERT(ms->is_idle());
232 OSMO_ASSERT(ms->ul_tbf() == NULL);
233 OSMO_ASSERT(ms->dl_tbf() == NULL);
Jacob Erlbeck6835cea2015-08-21 15:24:02 +0200234 OSMO_ASSERT(llist_empty(&ms->old_tbfs()));
Jacob Erlbecke04e0b02015-05-06 18:30:48 +0200235 OSMO_ASSERT(was_idle);
236
237 delete ms;
238
239 talloc_free(dl_tbf[0]);
240 talloc_free(dl_tbf[1]);
241 talloc_free(ul_tbf);
242
243 printf("=== end %s ===\n", __func__);
244}
245
Jacob Erlbeck93990462015-05-15 15:50:43 +0200246static void test_ms_change_tlli()
247{
248 uint32_t start_tlli = 0xaa000000;
249 uint32_t new_ms_tlli = 0xff001111;
250 uint32_t other_sgsn_tlli = 0xff00eeee;
251 GprsMs *ms;
252
253 printf("=== start %s ===\n", __func__);
254
Jacob Erlbeck17214bb2015-06-02 14:06:12 +0200255 ms = new GprsMs(NULL, start_tlli);
Jacob Erlbeck93990462015-05-15 15:50:43 +0200256
257 OSMO_ASSERT(ms->is_idle());
258
259 /* MS announces TLLI, SGSN uses it immediately */
260 ms->set_tlli(new_ms_tlli);
261 OSMO_ASSERT(ms->tlli() == new_ms_tlli);
262 OSMO_ASSERT(ms->check_tlli(new_ms_tlli));
263 OSMO_ASSERT(ms->check_tlli(start_tlli));
264
265 ms->confirm_tlli(new_ms_tlli);
266 OSMO_ASSERT(ms->tlli() == new_ms_tlli);
267 OSMO_ASSERT(ms->check_tlli(new_ms_tlli));
268 OSMO_ASSERT(!ms->check_tlli(start_tlli));
269
270 /* MS announces TLLI, SGSN uses it later */
271 ms->set_tlli(start_tlli);
272 ms->confirm_tlli(start_tlli);
273
274 ms->set_tlli(new_ms_tlli);
275 OSMO_ASSERT(ms->tlli() == new_ms_tlli);
276 OSMO_ASSERT(ms->check_tlli(new_ms_tlli));
277 OSMO_ASSERT(ms->check_tlli(start_tlli));
278
279 ms->confirm_tlli(start_tlli);
280 OSMO_ASSERT(ms->tlli() == new_ms_tlli);
281 OSMO_ASSERT(ms->check_tlli(new_ms_tlli));
282 OSMO_ASSERT(ms->check_tlli(start_tlli));
283
284 ms->set_tlli(new_ms_tlli);
285 OSMO_ASSERT(ms->tlli() == new_ms_tlli);
286 OSMO_ASSERT(ms->check_tlli(new_ms_tlli));
287 OSMO_ASSERT(ms->check_tlli(start_tlli));
288
289 ms->confirm_tlli(new_ms_tlli);
290 OSMO_ASSERT(ms->tlli() == new_ms_tlli);
291 OSMO_ASSERT(ms->check_tlli(new_ms_tlli));
292 OSMO_ASSERT(!ms->check_tlli(start_tlli));
293
294 /* MS announces TLLI, SGSN uses it later after another new TLLI */
295 ms->set_tlli(start_tlli);
296 ms->confirm_tlli(start_tlli);
297
298 ms->set_tlli(new_ms_tlli);
299 OSMO_ASSERT(ms->tlli() == new_ms_tlli);
300 OSMO_ASSERT(ms->check_tlli(new_ms_tlli));
301 OSMO_ASSERT(ms->check_tlli(start_tlli));
302
303 ms->confirm_tlli(other_sgsn_tlli);
304 OSMO_ASSERT(ms->tlli() == new_ms_tlli);
305 OSMO_ASSERT(ms->check_tlli(new_ms_tlli));
306 OSMO_ASSERT(ms->check_tlli(other_sgsn_tlli));
307
308 ms->set_tlli(new_ms_tlli);
309 OSMO_ASSERT(ms->tlli() == new_ms_tlli);
310 OSMO_ASSERT(ms->check_tlli(new_ms_tlli));
311 OSMO_ASSERT(ms->check_tlli(other_sgsn_tlli));
312
313 ms->confirm_tlli(new_ms_tlli);
314 OSMO_ASSERT(ms->tlli() == new_ms_tlli);
315 OSMO_ASSERT(ms->check_tlli(new_ms_tlli));
316 OSMO_ASSERT(!ms->check_tlli(start_tlli));
317 OSMO_ASSERT(!ms->check_tlli(other_sgsn_tlli));
318
319 /* SGSN uses the new TLLI before it is announced by the MS (shouldn't
320 * happen in normal use) */
321 ms->set_tlli(start_tlli);
322 ms->confirm_tlli(start_tlli);
323
324 ms->confirm_tlli(new_ms_tlli);
325 OSMO_ASSERT(ms->tlli() == start_tlli);
326 OSMO_ASSERT(ms->check_tlli(new_ms_tlli));
327 OSMO_ASSERT(ms->check_tlli(start_tlli));
328
329 ms->set_tlli(new_ms_tlli);
330 OSMO_ASSERT(ms->tlli() == new_ms_tlli);
331 OSMO_ASSERT(ms->check_tlli(new_ms_tlli));
332 OSMO_ASSERT(!ms->check_tlli(start_tlli));
333
334 delete ms;
335
336 printf("=== end %s ===\n", __func__);
337}
338
Jacob Erlbeck53670862015-05-12 17:54:33 +0200339static void test_ms_storage()
340{
341 uint32_t tlli = 0xffeeddbb;
Jacob Erlbeck7b9f8252015-05-21 11:07:53 +0200342 const char *imsi1 = "001001987654321";
343 const char *imsi2 = "001001987654322";
344
Jacob Erlbeck53670862015-05-12 17:54:33 +0200345 gprs_rlcmac_ul_tbf *ul_tbf;
Jacob Erlbeck0e50ce62015-05-21 16:58:22 +0200346 GprsMs *ms, *ms_tmp;
Jacob Erlbeck17214bb2015-06-02 14:06:12 +0200347 GprsMsStorage store(NULL);
Jacob Erlbeck53670862015-05-12 17:54:33 +0200348
349 printf("=== start %s ===\n", __func__);
350
351 ul_tbf = talloc_zero(tall_pcu_ctx, struct gprs_rlcmac_ul_tbf);
Jacob Erlbeckb6b3c7e2015-08-28 12:07:14 +0200352 new (ul_tbf) gprs_rlcmac_ul_tbf(NULL);
Jacob Erlbeck53670862015-05-12 17:54:33 +0200353
354 ms = store.get_ms(tlli + 0);
355 OSMO_ASSERT(ms == NULL);
356
Jacob Erlbeck0e50ce62015-05-21 16:58:22 +0200357 ms = store.create_ms(tlli + 0, GPRS_RLCMAC_UL_TBF);
Jacob Erlbeck53670862015-05-12 17:54:33 +0200358 OSMO_ASSERT(ms != NULL);
359 OSMO_ASSERT(ms->tlli() == tlli + 0);
Jacob Erlbeck7b9f8252015-05-21 11:07:53 +0200360 ms->set_imsi(imsi1);
361 OSMO_ASSERT(strcmp(ms->imsi(), imsi1) == 0);
Jacob Erlbeck53670862015-05-12 17:54:33 +0200362
Jacob Erlbeck0e50ce62015-05-21 16:58:22 +0200363 ms_tmp = store.get_ms(tlli + 0);
364 OSMO_ASSERT(ms == ms_tmp);
365 OSMO_ASSERT(ms->tlli() == tlli + 0);
366
Jacob Erlbeck7b9f8252015-05-21 11:07:53 +0200367 ms_tmp = store.get_ms(0, 0, imsi1);
368 OSMO_ASSERT(ms == ms_tmp);
369 OSMO_ASSERT(strcmp(ms->imsi(), imsi1) == 0);
370 ms_tmp = store.get_ms(0, 0, imsi2);
371 OSMO_ASSERT(ms_tmp == NULL);
372
Jacob Erlbeck0e50ce62015-05-21 16:58:22 +0200373 ms = store.create_ms(tlli + 1, GPRS_RLCMAC_UL_TBF);
374 OSMO_ASSERT(ms != NULL);
Jacob Erlbeck53670862015-05-12 17:54:33 +0200375 OSMO_ASSERT(ms->tlli() == tlli + 1);
Jacob Erlbeck7b9f8252015-05-21 11:07:53 +0200376 ms->set_imsi(imsi2);
377 OSMO_ASSERT(strcmp(ms->imsi(), imsi2) == 0);
Jacob Erlbeck53670862015-05-12 17:54:33 +0200378
Jacob Erlbeck0e50ce62015-05-21 16:58:22 +0200379 ms_tmp = store.get_ms(tlli + 1);
380 OSMO_ASSERT(ms == ms_tmp);
Jacob Erlbeck53670862015-05-12 17:54:33 +0200381 OSMO_ASSERT(ms->tlli() == tlli + 1);
382
Jacob Erlbeck7b9f8252015-05-21 11:07:53 +0200383 ms_tmp = store.get_ms(0, 0, imsi1);
384 OSMO_ASSERT(ms_tmp != NULL);
385 OSMO_ASSERT(ms_tmp != ms);
386 ms_tmp = store.get_ms(0, 0, imsi2);
387 OSMO_ASSERT(ms == ms_tmp);
388 OSMO_ASSERT(strcmp(ms->imsi(), imsi2) == 0);
389
Jacob Erlbeck53670862015-05-12 17:54:33 +0200390 /* delete ms */
391 ms = store.get_ms(tlli + 0);
392 OSMO_ASSERT(ms != NULL);
393 ms->attach_tbf(ul_tbf);
394 ms->detach_tbf(ul_tbf);
395 ms = store.get_ms(tlli + 0);
396 OSMO_ASSERT(ms == NULL);
397 ms = store.get_ms(tlli + 1);
398 OSMO_ASSERT(ms != NULL);
399
400 /* delete ms */
401 ms = store.get_ms(tlli + 1);
402 OSMO_ASSERT(ms != NULL);
403 ms->attach_tbf(ul_tbf);
404 ms->detach_tbf(ul_tbf);
405 ms = store.get_ms(tlli + 1);
406 OSMO_ASSERT(ms == NULL);
407
408 talloc_free(ul_tbf);
409
410 printf("=== end %s ===\n", __func__);
411}
412
Jacob Erlbeckd9e10242015-05-28 15:43:53 +0200413static void test_ms_timeout()
414{
415 uint32_t tlli = 0xffeeddbb;
416 gprs_rlcmac_dl_tbf *dl_tbf;
417 gprs_rlcmac_ul_tbf *ul_tbf;
418 GprsMs *ms;
419 static enum {UNKNOWN, IS_IDLE, IS_ACTIVE} last_cb = UNKNOWN;
420
421 struct MyCallback: public GprsMs::Callback {
422 virtual void ms_idle(class GprsMs *ms) {
423 OSMO_ASSERT(ms->is_idle());
424 printf(" ms_idle() was called\n");
425 last_cb = IS_IDLE;
426 }
427 virtual void ms_active(class GprsMs *ms) {
428 OSMO_ASSERT(!ms->is_idle());
429 printf(" ms_active() was called\n");
430 last_cb = IS_ACTIVE;
431 }
432 } cb;
433
434 printf("=== start %s ===\n", __func__);
435
Jacob Erlbeck17214bb2015-06-02 14:06:12 +0200436 ms = new GprsMs(NULL, tlli);
Jacob Erlbeckd9e10242015-05-28 15:43:53 +0200437 ms->set_callback(&cb);
438 ms->set_timeout(1);
439
440 OSMO_ASSERT(ms->is_idle());
441
442 dl_tbf = talloc_zero(tall_pcu_ctx, struct gprs_rlcmac_dl_tbf);
Jacob Erlbeckb6b3c7e2015-08-28 12:07:14 +0200443 new (dl_tbf) gprs_rlcmac_dl_tbf(NULL);
Jacob Erlbeckd9e10242015-05-28 15:43:53 +0200444 ul_tbf = talloc_zero(tall_pcu_ctx, struct gprs_rlcmac_ul_tbf);
Jacob Erlbeckb6b3c7e2015-08-28 12:07:14 +0200445 new (ul_tbf) gprs_rlcmac_ul_tbf(NULL);
Jacob Erlbeckd9e10242015-05-28 15:43:53 +0200446
447 OSMO_ASSERT(last_cb == UNKNOWN);
448
449 ms->attach_tbf(ul_tbf);
450 OSMO_ASSERT(!ms->is_idle());
451 OSMO_ASSERT(last_cb == IS_ACTIVE);
452
453 last_cb = UNKNOWN;
454
455 ms->attach_tbf(dl_tbf);
456 OSMO_ASSERT(!ms->is_idle());
457 OSMO_ASSERT(last_cb == UNKNOWN);
458
459 ms->detach_tbf(ul_tbf);
460 OSMO_ASSERT(!ms->is_idle());
461 OSMO_ASSERT(last_cb == UNKNOWN);
462
463 ms->detach_tbf(dl_tbf);
464 OSMO_ASSERT(!ms->is_idle());
465 OSMO_ASSERT(last_cb == UNKNOWN);
466
467 usleep(1100000);
468 osmo_timers_update();
469
470 OSMO_ASSERT(ms->is_idle());
471 OSMO_ASSERT(last_cb == IS_IDLE);
472
473 last_cb = UNKNOWN;
474 delete ms;
475 talloc_free(dl_tbf);
476 talloc_free(ul_tbf);
477
478 printf("=== end %s ===\n", __func__);
479}
480
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200481static void test_ms_cs_selection()
482{
483 BTS the_bts;
484 gprs_rlcmac_bts *bts = the_bts.bts_data();
485 uint32_t tlli = 0xffeeddbb;
486
487 gprs_rlcmac_dl_tbf *dl_tbf;
488 GprsMs *ms;
489
490 printf("=== start %s ===\n", __func__);
491
492 bts->initial_cs_dl = 4;
493 bts->initial_cs_ul = 1;
494 bts->cs_downgrade_threshold = 0;
495
496 ms = new GprsMs(&the_bts, tlli);
497
498 OSMO_ASSERT(ms->is_idle());
499
500 dl_tbf = talloc_zero(tall_pcu_ctx, struct gprs_rlcmac_dl_tbf);
Jacob Erlbeckb6b3c7e2015-08-28 12:07:14 +0200501 new (dl_tbf) gprs_rlcmac_dl_tbf(NULL);
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200502
503 dl_tbf->set_ms(ms);
504 OSMO_ASSERT(!ms->is_idle());
505
Jacob Erlbeckcb728902016-01-05 15:33:03 +0100506 OSMO_ASSERT(ms->current_cs_dl().to_num() == 4);
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200507
508 bts->cs_downgrade_threshold = 200;
509
Jacob Erlbeckcb728902016-01-05 15:33:03 +0100510 OSMO_ASSERT(ms->current_cs_dl().to_num() == 3);
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200511
512 talloc_free(dl_tbf);
513
514 printf("=== end %s ===\n", __func__);
515}
516
Jacob Erlbecke04e0b02015-05-06 18:30:48 +0200517static const struct log_info_cat default_categories[] = {
518 {"DPCU", "", "GPRS Packet Control Unit (PCU)", LOGL_INFO, 1},
519};
520
521static int filter_fn(const struct log_context *ctx,
522 struct log_target *tar)
523{
524 return 1;
525}
526
527const struct log_info debug_log_info = {
528 filter_fn,
529 (struct log_info_cat*)default_categories,
530 ARRAY_SIZE(default_categories),
531};
532
533int main(int argc, char **argv)
534{
535 struct vty_app_info pcu_vty_info = {0};
536
537 tall_pcu_ctx = talloc_named_const(NULL, 1, "MsTest context");
538 if (!tall_pcu_ctx)
539 abort();
540
541 msgb_set_talloc_ctx(tall_pcu_ctx);
542 osmo_init_logging(&debug_log_info);
543 log_set_use_color(osmo_stderr_target, 0);
544 log_set_print_filename(osmo_stderr_target, 0);
545 log_set_log_level(osmo_stderr_target, LOGL_INFO);
546
547 vty_init(&pcu_vty_info);
548 pcu_vty_init(&debug_log_info);
549
550 test_ms_state();
551 test_ms_callback();
552 test_ms_replace_tbf();
Jacob Erlbeck93990462015-05-15 15:50:43 +0200553 test_ms_change_tlli();
Jacob Erlbeck53670862015-05-12 17:54:33 +0200554 test_ms_storage();
Jacob Erlbeckd9e10242015-05-28 15:43:53 +0200555 test_ms_timeout();
Jacob Erlbeck70b96aa2015-06-12 10:52:34 +0200556 test_ms_cs_selection();
Jacob Erlbecke04e0b02015-05-06 18:30:48 +0200557
558 if (getenv("TALLOC_REPORT_FULL"))
559 talloc_report_full(tall_pcu_ctx, stderr);
560
561 return EXIT_SUCCESS;
562}
563
564extern "C" {
565void l1if_pdch_req() { abort(); }
566void l1if_connect_pdch() { abort(); }
567void l1if_close_pdch() { abort(); }
568void l1if_open_pdch() { abort(); }
569}