aboutsummaryrefslogtreecommitdiffstats
path: root/tests/ms
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ms')
-rw-r--r--tests/ms/MsTest.cpp615
-rw-r--r--tests/ms/MsTest.err112
-rw-r--r--tests/ms/MsTest.ok25
3 files changed, 352 insertions, 400 deletions
diff --git a/tests/ms/MsTest.cpp b/tests/ms/MsTest.cpp
index c74b3a65..5bfbc28f 100644
--- a/tests/ms/MsTest.cpp
+++ b/tests/ms/MsTest.cpp
@@ -21,9 +21,9 @@
*/
#include "tbf.h"
+#include "tbf_ul.h"
#include "gprs_debug.h"
#include "gprs_ms.h"
-#include "gprs_ms_storage.h"
#include "bts.h"
extern "C" {
@@ -39,122 +39,87 @@ extern "C" {
#include <errno.h>
#include <unistd.h>
+#include <new>
+
void *tall_pcu_ctx;
int16_t spoof_mnc = 0, spoof_mcc = 0;
bool spoof_mnc_3_digits = false;
-static void test_ms_state()
+static int ul_tbf_dtor(struct gprs_rlcmac_ul_tbf *tbf)
{
- uint32_t tlli = 0xffeeddbb;
- gprs_rlcmac_dl_tbf *dl_tbf;
- gprs_rlcmac_ul_tbf *ul_tbf;
- GprsMs *ms;
-
- printf("=== start %s ===\n", __func__);
+ tbf->~gprs_rlcmac_ul_tbf();
+ return 0;
+}
- ms = new GprsMs(NULL, tlli);
- OSMO_ASSERT(ms->is_idle());
+static int dl_tbf_dtor(struct gprs_rlcmac_dl_tbf *tbf)
+{
+ tbf->~gprs_rlcmac_dl_tbf();
+ return 0;
+}
- dl_tbf = talloc_zero(tall_pcu_ctx, struct gprs_rlcmac_dl_tbf);
- new (dl_tbf) gprs_rlcmac_dl_tbf(NULL);
+static gprs_rlcmac_ul_tbf *alloc_ul_tbf(struct gprs_rlcmac_bts *bts, GprsMs *ms)
+{
+ gprs_rlcmac_ul_tbf *ul_tbf;
ul_tbf = talloc_zero(tall_pcu_ctx, struct gprs_rlcmac_ul_tbf);
- new (ul_tbf) gprs_rlcmac_ul_tbf(NULL);
-
- ms->attach_tbf(ul_tbf);
- OSMO_ASSERT(!ms->is_idle());
- OSMO_ASSERT(ms->ul_tbf() == ul_tbf);
- OSMO_ASSERT(ms->dl_tbf() == NULL);
-
- ms->attach_tbf(dl_tbf);
- OSMO_ASSERT(!ms->is_idle());
- OSMO_ASSERT(ms->ul_tbf() == ul_tbf);
- OSMO_ASSERT(ms->dl_tbf() == dl_tbf);
-
- OSMO_ASSERT(ms->tbf(GPRS_RLCMAC_UL_TBF) == ul_tbf);
- OSMO_ASSERT(ms->tbf(GPRS_RLCMAC_DL_TBF) == dl_tbf);
-
- ms->detach_tbf(ul_tbf);
- OSMO_ASSERT(!ms->is_idle());
- OSMO_ASSERT(ms->ul_tbf() == NULL);
- OSMO_ASSERT(ms->dl_tbf() == dl_tbf);
-
- ms->detach_tbf(dl_tbf);
- /* The ms object is freed now */
- ms = NULL;
-
- talloc_free(dl_tbf);
- talloc_free(ul_tbf);
+ talloc_set_destructor(ul_tbf, ul_tbf_dtor);
+ new (ul_tbf) gprs_rlcmac_ul_tbf(bts, ms);
+ return ul_tbf;
+}
- printf("=== end %s ===\n", __func__);
+static gprs_rlcmac_dl_tbf *alloc_dl_tbf(struct gprs_rlcmac_bts *bts, GprsMs *ms)
+{
+ gprs_rlcmac_dl_tbf *dl_tbf;
+ dl_tbf = talloc_zero(tall_pcu_ctx, struct gprs_rlcmac_dl_tbf);
+ talloc_set_destructor(dl_tbf, dl_tbf_dtor);
+ new (dl_tbf) gprs_rlcmac_dl_tbf(bts, ms);
+ return dl_tbf;
}
-static void test_ms_callback()
+static void test_ms_state()
{
uint32_t tlli = 0xffeeddbb;
gprs_rlcmac_dl_tbf *dl_tbf;
gprs_rlcmac_ul_tbf *ul_tbf;
+ struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);
GprsMs *ms;
- static enum {UNKNOWN, IS_IDLE, IS_ACTIVE} last_cb = UNKNOWN;
-
- struct MyCallback: public GprsMs::Callback {
- virtual void ms_idle(class GprsMs *ms) {
- OSMO_ASSERT(ms->is_idle());
- printf(" ms_idle() was called\n");
- last_cb = IS_IDLE;
- }
- virtual void ms_active(class GprsMs *ms) {
- OSMO_ASSERT(!ms->is_idle());
- printf(" ms_active() was called\n");
- last_cb = IS_ACTIVE;
- }
- } cb;
printf("=== start %s ===\n", __func__);
- ms = new GprsMs(NULL, tlli);
- ms->set_callback(&cb);
+ ms = ms_alloc(bts, __func__);
+ ms_set_tlli(ms, tlli);
+ OSMO_ASSERT(ms_is_idle(ms));
- OSMO_ASSERT(ms->is_idle());
+ dl_tbf = alloc_dl_tbf(bts, ms);
+ ul_tbf = alloc_ul_tbf(bts, ms);
- dl_tbf = talloc_zero(tall_pcu_ctx, struct gprs_rlcmac_dl_tbf);
- new (dl_tbf) gprs_rlcmac_dl_tbf(NULL);
- ul_tbf = talloc_zero(tall_pcu_ctx, struct gprs_rlcmac_ul_tbf);
- new (ul_tbf) gprs_rlcmac_ul_tbf(NULL);
-
- OSMO_ASSERT(last_cb == UNKNOWN);
-
- ms->attach_tbf(ul_tbf);
- OSMO_ASSERT(!ms->is_idle());
- OSMO_ASSERT(ms->ul_tbf() == ul_tbf);
- OSMO_ASSERT(ms->dl_tbf() == NULL);
- OSMO_ASSERT(last_cb == IS_ACTIVE);
+ ms_attach_tbf(ms, ul_tbf);
+ OSMO_ASSERT(!ms_is_idle(ms));
+ OSMO_ASSERT(ms_ul_tbf(ms) == ul_tbf);
+ OSMO_ASSERT(ms_dl_tbf(ms) == NULL);
- last_cb = UNKNOWN;
+ ms_attach_tbf(ms, dl_tbf);
+ OSMO_ASSERT(!ms_is_idle(ms));
+ OSMO_ASSERT(ms_ul_tbf(ms) == ul_tbf);
+ OSMO_ASSERT(ms_dl_tbf(ms) == dl_tbf);
- ms->attach_tbf(dl_tbf);
- OSMO_ASSERT(!ms->is_idle());
- OSMO_ASSERT(ms->ul_tbf() == ul_tbf);
- OSMO_ASSERT(ms->dl_tbf() == dl_tbf);
- OSMO_ASSERT(last_cb == UNKNOWN);
+ OSMO_ASSERT(ms_tbf(ms, GPRS_RLCMAC_UL_TBF) == ul_tbf);
+ OSMO_ASSERT(ms_tbf(ms, GPRS_RLCMAC_DL_TBF) == dl_tbf);
- ms->detach_tbf(ul_tbf);
- OSMO_ASSERT(!ms->is_idle());
- OSMO_ASSERT(ms->ul_tbf() == NULL);
- OSMO_ASSERT(ms->dl_tbf() == dl_tbf);
- OSMO_ASSERT(last_cb == UNKNOWN);
+ /* The MS is kept alive references by the TBFs: */
+ ms_unref(ms, __func__);
- ms->detach_tbf(dl_tbf);
- OSMO_ASSERT(ms->is_idle());
- OSMO_ASSERT(ms->ul_tbf() == NULL);
- OSMO_ASSERT(ms->dl_tbf() == NULL);
- OSMO_ASSERT(last_cb == IS_IDLE);
+ ms_detach_tbf(ms, ul_tbf);
+ OSMO_ASSERT(!ms_is_idle(ms));
+ OSMO_ASSERT(ms_ul_tbf(ms) == NULL);
+ OSMO_ASSERT(ms_dl_tbf(ms) == dl_tbf);
- last_cb = UNKNOWN;
- delete ms;
+ ms_detach_tbf(ms, dl_tbf);
+ /* The ms object is freed now */
+ ms = NULL;
talloc_free(dl_tbf);
talloc_free(ul_tbf);
-
+ talloc_free(bts);
printf("=== end %s ===\n", __func__);
}
@@ -163,84 +128,60 @@ static void test_ms_replace_tbf()
uint32_t tlli = 0xffeeddbb;
gprs_rlcmac_dl_tbf *dl_tbf[2];
gprs_rlcmac_ul_tbf *ul_tbf;
+ struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);
GprsMs *ms;
- static bool was_idle;
-
- struct MyCallback: public GprsMs::Callback {
- virtual void ms_idle(class GprsMs *ms) {
- OSMO_ASSERT(ms->is_idle());
- printf(" ms_idle() was called\n");
- was_idle = true;
- }
- virtual void ms_active(class GprsMs *ms) {
- OSMO_ASSERT(!ms->is_idle());
- printf(" ms_active() was called\n");
- }
- } cb;
printf("=== start %s ===\n", __func__);
- ms = new GprsMs(NULL, tlli);
- ms->set_callback(&cb);
+ ms = ms_alloc(bts, __func__);
+ ms_confirm_tlli(ms, tlli);
- OSMO_ASSERT(ms->is_idle());
- was_idle = false;
+ OSMO_ASSERT(ms_is_idle(ms));
- dl_tbf[0] = talloc_zero(tall_pcu_ctx, struct gprs_rlcmac_dl_tbf);
- new (dl_tbf[0]) gprs_rlcmac_dl_tbf(NULL);
- dl_tbf[1] = talloc_zero(tall_pcu_ctx, struct gprs_rlcmac_dl_tbf);
- new (dl_tbf[1]) gprs_rlcmac_dl_tbf(NULL);
- ul_tbf = talloc_zero(tall_pcu_ctx, struct gprs_rlcmac_ul_tbf);
- new (ul_tbf) gprs_rlcmac_ul_tbf(NULL);
-
- ms->attach_tbf(dl_tbf[0]);
- OSMO_ASSERT(!ms->is_idle());
- OSMO_ASSERT(ms->ul_tbf() == NULL);
- OSMO_ASSERT(ms->dl_tbf() == dl_tbf[0]);
- OSMO_ASSERT(llist_empty(&ms->old_tbfs()));
- OSMO_ASSERT(!was_idle);
-
- ms->attach_tbf(dl_tbf[1]);
- OSMO_ASSERT(!ms->is_idle());
- OSMO_ASSERT(ms->ul_tbf() == NULL);
- OSMO_ASSERT(ms->dl_tbf() == dl_tbf[1]);
- OSMO_ASSERT(!llist_empty(&ms->old_tbfs()));
- OSMO_ASSERT(!was_idle);
-
- ms->attach_tbf(ul_tbf);
- OSMO_ASSERT(!ms->is_idle());
- OSMO_ASSERT(ms->ul_tbf() == ul_tbf);
- OSMO_ASSERT(ms->dl_tbf() == dl_tbf[1]);
- OSMO_ASSERT(!llist_empty(&ms->old_tbfs()));
- OSMO_ASSERT(!was_idle);
-
- ms->detach_tbf(ul_tbf);
- OSMO_ASSERT(!ms->is_idle());
- OSMO_ASSERT(ms->ul_tbf() == NULL);
- OSMO_ASSERT(ms->dl_tbf() == dl_tbf[1]);
- OSMO_ASSERT(!llist_empty(&ms->old_tbfs()));
- OSMO_ASSERT(!was_idle);
-
- ms->detach_tbf(dl_tbf[0]);
- OSMO_ASSERT(!ms->is_idle());
- OSMO_ASSERT(ms->ul_tbf() == NULL);
- OSMO_ASSERT(ms->dl_tbf() == dl_tbf[1]);
- OSMO_ASSERT(llist_empty(&ms->old_tbfs()));
- OSMO_ASSERT(!was_idle);
-
- ms->detach_tbf(dl_tbf[1]);
- OSMO_ASSERT(ms->is_idle());
- OSMO_ASSERT(ms->ul_tbf() == NULL);
- OSMO_ASSERT(ms->dl_tbf() == NULL);
- OSMO_ASSERT(llist_empty(&ms->old_tbfs()));
- OSMO_ASSERT(was_idle);
-
- delete ms;
+ dl_tbf[0] = alloc_dl_tbf(bts, ms);
+ dl_tbf[1] = alloc_dl_tbf(bts, ms);
+ ul_tbf = alloc_ul_tbf(bts, ms);
+
+ ms_attach_tbf(ms, dl_tbf[0]);
+ OSMO_ASSERT(!ms_is_idle(ms));
+ OSMO_ASSERT(ms_ul_tbf(ms) == NULL);
+ OSMO_ASSERT(ms_dl_tbf(ms) == dl_tbf[0]);
+ OSMO_ASSERT(llist_empty(&ms->old_tbfs));
+
+ ms_attach_tbf(ms, dl_tbf[1]);
+ OSMO_ASSERT(!ms_is_idle(ms));
+ OSMO_ASSERT(ms_ul_tbf(ms) == NULL);
+ OSMO_ASSERT(ms_dl_tbf(ms) == dl_tbf[1]);
+ OSMO_ASSERT(!llist_empty(&ms->old_tbfs));
+
+ ms_attach_tbf(ms, ul_tbf);
+ OSMO_ASSERT(!ms_is_idle(ms));
+ OSMO_ASSERT(ms_ul_tbf(ms) == ul_tbf);
+ OSMO_ASSERT(ms_dl_tbf(ms) == dl_tbf[1]);
+ OSMO_ASSERT(!llist_empty(&ms->old_tbfs));
+
+ ms_unref(ms, __func__);
+
+ ms_detach_tbf(ms, ul_tbf);
+ OSMO_ASSERT(!ms_is_idle(ms));
+ OSMO_ASSERT(ms_ul_tbf(ms) == NULL);
+ OSMO_ASSERT(ms_dl_tbf(ms) == dl_tbf[1]);
+ OSMO_ASSERT(!llist_empty(&ms->old_tbfs));
+
+ ms_detach_tbf(ms, dl_tbf[0]);
+ OSMO_ASSERT(!ms_is_idle(ms));
+ OSMO_ASSERT(ms_ul_tbf(ms) == NULL);
+ OSMO_ASSERT(ms_dl_tbf(ms) == dl_tbf[1]);
+ OSMO_ASSERT(llist_empty(&ms->old_tbfs));
+
+ ms_detach_tbf(ms, dl_tbf[1]);
+ /* MS is gone now: */
+ OSMO_ASSERT(bts_get_ms_by_tlli(bts, tlli, GSM_RESERVED_TMSI) == NULL);
talloc_free(dl_tbf[0]);
talloc_free(dl_tbf[1]);
talloc_free(ul_tbf);
-
+ talloc_free(bts);
printf("=== end %s ===\n", __func__);
}
@@ -249,106 +190,107 @@ static void test_ms_change_tlli()
uint32_t start_tlli = 0xaa000000;
uint32_t new_ms_tlli = 0xff001111;
uint32_t other_sgsn_tlli = 0xff00eeee;
+ struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);
GprsMs *ms;
printf("=== start %s ===\n", __func__);
- ms = new GprsMs(NULL, start_tlli);
+ ms = ms_alloc(bts, __func__);
- OSMO_ASSERT(ms->is_idle());
+ OSMO_ASSERT(ms_is_idle(ms));
/* MS announces TLLI, SGSN uses it immediately */
- ms->set_tlli(new_ms_tlli);
- OSMO_ASSERT(ms->tlli() == new_ms_tlli);
- OSMO_ASSERT(ms->check_tlli(new_ms_tlli));
- OSMO_ASSERT(ms->check_tlli(start_tlli));
+ ms_set_tlli(ms, new_ms_tlli);
+ OSMO_ASSERT(ms_tlli(ms) == new_ms_tlli);
+ OSMO_ASSERT(ms_check_tlli(ms, new_ms_tlli));
- ms->confirm_tlli(new_ms_tlli);
- OSMO_ASSERT(ms->tlli() == new_ms_tlli);
- OSMO_ASSERT(ms->check_tlli(new_ms_tlli));
- OSMO_ASSERT(!ms->check_tlli(start_tlli));
+ ms_confirm_tlli(ms, new_ms_tlli);
+ OSMO_ASSERT(ms_tlli(ms) == new_ms_tlli);
+ OSMO_ASSERT(ms_check_tlli(ms, new_ms_tlli));
/* MS announces TLLI, SGSN uses it later */
- ms->set_tlli(start_tlli);
- ms->confirm_tlli(start_tlli);
+ ms_set_tlli(ms, start_tlli);
+ ms_confirm_tlli(ms, start_tlli);
- ms->set_tlli(new_ms_tlli);
- OSMO_ASSERT(ms->tlli() == new_ms_tlli);
- OSMO_ASSERT(ms->check_tlli(new_ms_tlli));
- OSMO_ASSERT(ms->check_tlli(start_tlli));
+ ms_set_tlli(ms, new_ms_tlli);
+ OSMO_ASSERT(ms_tlli(ms) == new_ms_tlli);
+ OSMO_ASSERT(ms_check_tlli(ms, new_ms_tlli));
+ OSMO_ASSERT(ms_check_tlli(ms, start_tlli));
- ms->confirm_tlli(start_tlli);
- OSMO_ASSERT(ms->tlli() == new_ms_tlli);
- OSMO_ASSERT(ms->check_tlli(new_ms_tlli));
- OSMO_ASSERT(ms->check_tlli(start_tlli));
+ ms_confirm_tlli(ms, start_tlli);
+ OSMO_ASSERT(ms_tlli(ms) == new_ms_tlli);
+ OSMO_ASSERT(ms_check_tlli(ms, new_ms_tlli));
+ OSMO_ASSERT(ms_check_tlli(ms, start_tlli));
- ms->set_tlli(new_ms_tlli);
- OSMO_ASSERT(ms->tlli() == new_ms_tlli);
- OSMO_ASSERT(ms->check_tlli(new_ms_tlli));
- OSMO_ASSERT(ms->check_tlli(start_tlli));
+ ms_set_tlli(ms, new_ms_tlli);
+ OSMO_ASSERT(ms_tlli(ms) == new_ms_tlli);
+ OSMO_ASSERT(ms_check_tlli(ms, new_ms_tlli));
+ OSMO_ASSERT(ms_check_tlli(ms, start_tlli));
- ms->confirm_tlli(new_ms_tlli);
- OSMO_ASSERT(ms->tlli() == new_ms_tlli);
- OSMO_ASSERT(ms->check_tlli(new_ms_tlli));
- OSMO_ASSERT(!ms->check_tlli(start_tlli));
+ ms_confirm_tlli(ms, new_ms_tlli);
+ OSMO_ASSERT(ms_tlli(ms) == new_ms_tlli);
+ OSMO_ASSERT(ms_check_tlli(ms, new_ms_tlli));
+ OSMO_ASSERT(!ms_check_tlli(ms, start_tlli));
/* MS announces TLLI, SGSN uses it later after another new TLLI */
- ms->set_tlli(start_tlli);
- ms->confirm_tlli(start_tlli);
-
- ms->set_tlli(new_ms_tlli);
- OSMO_ASSERT(ms->tlli() == new_ms_tlli);
- OSMO_ASSERT(ms->check_tlli(new_ms_tlli));
- OSMO_ASSERT(ms->check_tlli(start_tlli));
-
- ms->confirm_tlli(other_sgsn_tlli);
- OSMO_ASSERT(ms->tlli() == new_ms_tlli);
- OSMO_ASSERT(ms->check_tlli(new_ms_tlli));
- OSMO_ASSERT(ms->check_tlli(other_sgsn_tlli));
-
- ms->set_tlli(new_ms_tlli);
- OSMO_ASSERT(ms->tlli() == new_ms_tlli);
- OSMO_ASSERT(ms->check_tlli(new_ms_tlli));
- OSMO_ASSERT(ms->check_tlli(other_sgsn_tlli));
-
- ms->confirm_tlli(new_ms_tlli);
- OSMO_ASSERT(ms->tlli() == new_ms_tlli);
- OSMO_ASSERT(ms->check_tlli(new_ms_tlli));
- OSMO_ASSERT(!ms->check_tlli(start_tlli));
- OSMO_ASSERT(!ms->check_tlli(other_sgsn_tlli));
+ ms_set_tlli(ms, start_tlli);
+ ms_confirm_tlli(ms, start_tlli);
+
+ ms_set_tlli(ms, new_ms_tlli);
+ OSMO_ASSERT(ms_tlli(ms) == new_ms_tlli);
+ OSMO_ASSERT(ms_check_tlli(ms, new_ms_tlli));
+ OSMO_ASSERT(ms_check_tlli(ms, start_tlli));
+
+ ms_confirm_tlli(ms, other_sgsn_tlli);
+ OSMO_ASSERT(ms_tlli(ms) == new_ms_tlli);
+ OSMO_ASSERT(ms_check_tlli(ms, new_ms_tlli));
+ OSMO_ASSERT(ms_check_tlli(ms, other_sgsn_tlli));
+
+ ms_set_tlli(ms, new_ms_tlli);
+ OSMO_ASSERT(ms_tlli(ms) == new_ms_tlli);
+ OSMO_ASSERT(ms_check_tlli(ms, new_ms_tlli));
+ OSMO_ASSERT(ms_check_tlli(ms, other_sgsn_tlli));
+
+ ms_confirm_tlli(ms, new_ms_tlli);
+ OSMO_ASSERT(ms_tlli(ms) == new_ms_tlli);
+ OSMO_ASSERT(ms_check_tlli(ms, new_ms_tlli));
+ OSMO_ASSERT(!ms_check_tlli(ms, start_tlli));
+ OSMO_ASSERT(!ms_check_tlli(ms, other_sgsn_tlli));
/* SGSN uses the new TLLI before it is announced by the MS (shouldn't
* happen in normal use) */
- ms->set_tlli(start_tlli);
- ms->confirm_tlli(start_tlli);
+ ms_set_tlli(ms, start_tlli);
+ ms_confirm_tlli(ms, start_tlli);
- ms->confirm_tlli(new_ms_tlli);
- OSMO_ASSERT(ms->tlli() == start_tlli);
- OSMO_ASSERT(ms->check_tlli(new_ms_tlli));
- OSMO_ASSERT(ms->check_tlli(start_tlli));
+ ms_confirm_tlli(ms, new_ms_tlli);
+ OSMO_ASSERT(ms_tlli(ms) == start_tlli);
+ OSMO_ASSERT(ms_check_tlli(ms, new_ms_tlli));
+ OSMO_ASSERT(ms_check_tlli(ms, start_tlli));
- ms->set_tlli(new_ms_tlli);
- OSMO_ASSERT(ms->tlli() == new_ms_tlli);
- OSMO_ASSERT(ms->check_tlli(new_ms_tlli));
- OSMO_ASSERT(!ms->check_tlli(start_tlli));
+ ms_set_tlli(ms, new_ms_tlli);
+ OSMO_ASSERT(ms_tlli(ms) == new_ms_tlli);
+ OSMO_ASSERT(ms_check_tlli(ms, new_ms_tlli));
+ OSMO_ASSERT(!ms_check_tlli(ms, start_tlli));
- delete ms;
+ /* This frees the MS: */
+ ms_unref(ms, __func__);
+ talloc_free(bts);
printf("=== end %s ===\n", __func__);
}
-static GprsMs *prepare_ms(GprsMsStorage *st, uint32_t tlli, enum gprs_rlcmac_tbf_direction dir)
+static GprsMs *prepare_ms(struct gprs_rlcmac_bts *bts, uint32_t tlli, enum gprs_rlcmac_tbf_direction dir)
{
- GprsMs *ms = st->get_ms(tlli);
+ GprsMs *ms = bts_get_ms_by_tlli(bts, tlli, GSM_RESERVED_TMSI);
if (ms)
return ms;
- ms = st->create_ms();
+ ms = ms_alloc(bts, NULL);
if (dir == GPRS_RLCMAC_UL_TBF)
- ms->set_tlli(tlli);
+ ms_set_tlli(ms, tlli);
else
- ms->confirm_tlli(tlli);
+ ms_confirm_tlli(ms, tlli);
return ms;
}
@@ -360,70 +302,69 @@ static void test_ms_storage()
const char *imsi2 = "001001987654322";
gprs_rlcmac_ul_tbf *ul_tbf;
+ struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);
GprsMs *ms, *ms_tmp;
- GprsMsStorage store(NULL);
printf("=== start %s ===\n", __func__);
- ul_tbf = talloc_zero(tall_pcu_ctx, struct gprs_rlcmac_ul_tbf);
- new (ul_tbf) gprs_rlcmac_ul_tbf(NULL);
-
- ms = store.get_ms(tlli + 0);
+ ms = bts_get_ms_by_tlli(bts, tlli + 0, GSM_RESERVED_TMSI);
OSMO_ASSERT(ms == NULL);
- ms = prepare_ms(&store, tlli + 0, GPRS_RLCMAC_UL_TBF);
+ ms = prepare_ms(bts, tlli + 0, GPRS_RLCMAC_UL_TBF);
OSMO_ASSERT(ms != NULL);
- OSMO_ASSERT(ms->tlli() == tlli + 0);
- ms->set_imsi(imsi1);
- OSMO_ASSERT(strcmp(ms->imsi(), imsi1) == 0);
+ OSMO_ASSERT(ms_tlli(ms) == tlli + 0);
+ ms_set_imsi(ms, imsi1);
+ OSMO_ASSERT(strcmp(ms_imsi(ms), imsi1) == 0);
- ms_tmp = store.get_ms(tlli + 0);
+ ms_tmp = bts_get_ms_by_tlli(bts, tlli + 0, GSM_RESERVED_TMSI);
OSMO_ASSERT(ms == ms_tmp);
- OSMO_ASSERT(ms->tlli() == tlli + 0);
+ OSMO_ASSERT(ms_tlli(ms) == tlli + 0);
- ms_tmp = store.get_ms(0, 0, imsi1);
+ ms_tmp = bts_get_ms_by_imsi(bts, imsi1);
OSMO_ASSERT(ms == ms_tmp);
- OSMO_ASSERT(strcmp(ms->imsi(), imsi1) == 0);
- ms_tmp = store.get_ms(0, 0, imsi2);
+ OSMO_ASSERT(strcmp(ms_imsi(ms), imsi1) == 0);
+ ms_tmp = bts_get_ms_by_imsi(bts, imsi2);
OSMO_ASSERT(ms_tmp == NULL);
- ms = prepare_ms(&store, tlli + 1, GPRS_RLCMAC_UL_TBF);
+ ms = prepare_ms(bts, tlli + 1, GPRS_RLCMAC_UL_TBF);
OSMO_ASSERT(ms != NULL);
- OSMO_ASSERT(ms->tlli() == tlli + 1);
- ms->set_imsi(imsi2);
- OSMO_ASSERT(strcmp(ms->imsi(), imsi2) == 0);
+ OSMO_ASSERT(ms_tlli(ms) == tlli + 1);
+ ms_set_imsi(ms, imsi2);
+ OSMO_ASSERT(strcmp(ms_imsi(ms), imsi2) == 0);
- ms_tmp = store.get_ms(tlli + 1);
+ ms_tmp = bts_get_ms_by_tlli(bts, tlli + 1, GSM_RESERVED_TMSI);
OSMO_ASSERT(ms == ms_tmp);
- OSMO_ASSERT(ms->tlli() == tlli + 1);
+ OSMO_ASSERT(ms_tlli(ms) == tlli + 1);
- ms_tmp = store.get_ms(0, 0, imsi1);
+ ms_tmp = bts_get_ms_by_imsi(bts, imsi1);
OSMO_ASSERT(ms_tmp != NULL);
OSMO_ASSERT(ms_tmp != ms);
- ms_tmp = store.get_ms(0, 0, imsi2);
+ ms_tmp = bts_get_ms_by_imsi(bts, imsi2);
OSMO_ASSERT(ms == ms_tmp);
- OSMO_ASSERT(strcmp(ms->imsi(), imsi2) == 0);
+ OSMO_ASSERT(strcmp(ms_imsi(ms), imsi2) == 0);
/* delete ms */
- ms = store.get_ms(tlli + 0);
+ ms = bts_get_ms_by_tlli(bts, tlli + 0, GSM_RESERVED_TMSI);
OSMO_ASSERT(ms != NULL);
- ms->attach_tbf(ul_tbf);
- ms->detach_tbf(ul_tbf);
- ms = store.get_ms(tlli + 0);
+ ul_tbf = alloc_ul_tbf(bts, ms);
+ ms_attach_tbf(ms, ul_tbf);
+ tbf_set_ms(ul_tbf, NULL);
+ ms = bts_get_ms_by_tlli(bts, tlli + 0, GSM_RESERVED_TMSI);
OSMO_ASSERT(ms == NULL);
- ms = store.get_ms(tlli + 1);
+ ms = bts_get_ms_by_tlli(bts, tlli + 1, GSM_RESERVED_TMSI);
OSMO_ASSERT(ms != NULL);
/* delete ms */
- ms = store.get_ms(tlli + 1);
+ ms = bts_get_ms_by_tlli(bts, tlli + 1, GSM_RESERVED_TMSI);
OSMO_ASSERT(ms != NULL);
- ms->attach_tbf(ul_tbf);
- ms->detach_tbf(ul_tbf);
- ms = store.get_ms(tlli + 1);
+ tbf_set_ms(ul_tbf, ms);
+ tbf_set_ms(ul_tbf, NULL);
+ ms = bts_get_ms_by_tlli(bts, tlli + 1, GSM_RESERVED_TMSI);
OSMO_ASSERT(ms == NULL);
+ talloc_free(ms);
talloc_free(ul_tbf);
-
+ talloc_free(bts);
printf("=== end %s ===\n", __func__);
}
@@ -432,73 +373,56 @@ static void test_ms_timeout()
uint32_t tlli = 0xffeeddbb;
gprs_rlcmac_dl_tbf *dl_tbf;
gprs_rlcmac_ul_tbf *ul_tbf;
+ struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);
GprsMs *ms;
- static enum {UNKNOWN, IS_IDLE, IS_ACTIVE} last_cb = UNKNOWN;
-
- struct MyCallback: public GprsMs::Callback {
- virtual void ms_idle(class GprsMs *ms) {
- OSMO_ASSERT(ms->is_idle());
- printf(" ms_idle() was called\n");
- last_cb = IS_IDLE;
- }
- virtual void ms_active(class GprsMs *ms) {
- OSMO_ASSERT(!ms->is_idle());
- printf(" ms_active() was called\n");
- last_cb = IS_ACTIVE;
- }
- } cb;
printf("=== start %s ===\n", __func__);
- ms = new GprsMs(NULL, tlli);
- ms->set_callback(&cb);
- ms->set_timeout(1);
+ OSMO_ASSERT(osmo_tdef_set(the_pcu->T_defs, -2030, 1, OSMO_TDEF_S) == 0);
- OSMO_ASSERT(ms->is_idle());
+ ms = ms_alloc(bts, __func__);
+ ms_set_tlli(ms, tlli);
- dl_tbf = talloc_zero(tall_pcu_ctx, struct gprs_rlcmac_dl_tbf);
- new (dl_tbf) gprs_rlcmac_dl_tbf(NULL);
- ul_tbf = talloc_zero(tall_pcu_ctx, struct gprs_rlcmac_ul_tbf);
- new (ul_tbf) gprs_rlcmac_ul_tbf(NULL);
+ OSMO_ASSERT(ms_is_idle(ms));
- OSMO_ASSERT(last_cb == UNKNOWN);
+ dl_tbf = alloc_dl_tbf(bts, ms);
+ ul_tbf = alloc_ul_tbf(bts, ms);
- ms->attach_tbf(ul_tbf);
- OSMO_ASSERT(!ms->is_idle());
- OSMO_ASSERT(last_cb == IS_ACTIVE);
+ ms_attach_tbf(ms, ul_tbf);
+ OSMO_ASSERT(!ms_is_idle(ms));
- last_cb = UNKNOWN;
+ ms_attach_tbf(ms, dl_tbf);
+ OSMO_ASSERT(!ms_is_idle(ms));
- ms->attach_tbf(dl_tbf);
- OSMO_ASSERT(!ms->is_idle());
- OSMO_ASSERT(last_cb == UNKNOWN);
+ /* MS is kept alive by TBFs referencing it: */
+ ms_unref(ms, __func__);
- ms->detach_tbf(ul_tbf);
- OSMO_ASSERT(!ms->is_idle());
- OSMO_ASSERT(last_cb == UNKNOWN);
+ ms_detach_tbf(ms, ul_tbf);
+ OSMO_ASSERT(!ms_is_idle(ms));
- ms->detach_tbf(dl_tbf);
- OSMO_ASSERT(!ms->is_idle());
- OSMO_ASSERT(last_cb == UNKNOWN);
+ ms_detach_tbf(ms, dl_tbf);
+ /* test MS still exists and it's idle: */
+ OSMO_ASSERT(bts_get_ms_by_tlli(bts, tlli, GSM_RESERVED_TMSI) != NULL);
+ OSMO_ASSERT(ms_is_idle(ms));
+ OSMO_ASSERT(osmo_timer_pending(&ms->release_timer));
usleep(1100000);
osmo_timers_update();
- OSMO_ASSERT(ms->is_idle());
- OSMO_ASSERT(last_cb == IS_IDLE);
+ /* MS is gone now: */
+ OSMO_ASSERT(bts_get_ms_by_tlli(bts, tlli, GSM_RESERVED_TMSI) == NULL);
- last_cb = UNKNOWN;
- delete ms;
talloc_free(dl_tbf);
talloc_free(ul_tbf);
-
+ talloc_free(bts);
printf("=== end %s ===\n", __func__);
+ /* Return the timer to the usually expected value 0 for other tests: */
+ OSMO_ASSERT(osmo_tdef_set(the_pcu->T_defs, -2030, 0, OSMO_TDEF_S) == 0);
}
static void test_ms_cs_selection()
{
- BTS the_bts;
- gprs_rlcmac_bts *bts = the_bts.bts_data();
+ struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);
uint32_t tlli = 0xffeeddbb;
gprs_rlcmac_dl_tbf *dl_tbf;
@@ -508,42 +432,45 @@ static void test_ms_cs_selection()
bts->initial_cs_dl = 4;
bts->initial_cs_ul = 1;
- bts->cs_downgrade_threshold = 0;
+ the_pcu->vty.cs_downgrade_threshold = 0;
+ the_pcu->vty.cs_adj_lower_limit = 0;
- ms = new GprsMs(&the_bts, tlli);
+ ms = ms_alloc(bts, __func__);
+ ms_confirm_tlli(ms, tlli);
- OSMO_ASSERT(ms->is_idle());
+ OSMO_ASSERT(ms_is_idle(ms));
- dl_tbf = talloc_zero(tall_pcu_ctx, struct gprs_rlcmac_dl_tbf);
- new (dl_tbf) gprs_rlcmac_dl_tbf(NULL);
+ dl_tbf = alloc_dl_tbf(bts, ms);
+ ms_attach_tbf(ms, dl_tbf);
- dl_tbf->set_ms(ms);
- OSMO_ASSERT(!ms->is_idle());
+ OSMO_ASSERT(!ms_is_idle(ms));
- OSMO_ASSERT(mcs_chan_code(ms->current_cs_dl()) == 3);
+ OSMO_ASSERT(mcs_chan_code(ms_current_cs_dl(ms, ms_mode(ms))) == 3);
- bts->cs_downgrade_threshold = 200;
+ the_pcu->vty.cs_downgrade_threshold = 200;
- OSMO_ASSERT(mcs_chan_code(ms->current_cs_dl()) == 2);
+ OSMO_ASSERT(mcs_chan_code(ms_current_cs_dl(ms, ms_mode(ms))) == 2);
+ ms_detach_tbf(ms, dl_tbf);
talloc_free(dl_tbf);
-
+ ms_unref(ms, __func__);
+ /* MS has been freed here*/
+ talloc_free(bts);
printf("=== end %s ===\n", __func__);
}
static void dump_ms(const GprsMs *ms, const char *pref)
{
printf("%s MS DL %s/%s, UL %s/%s, mode %s, <%s>\n", pref,
- mcs_name(ms->current_cs_dl()), mcs_name(ms->max_cs_dl()),
- mcs_name(ms->current_cs_ul()), mcs_name(ms->max_cs_ul()),
- mode_name(ms->mode()),
- ms->is_idle() ? "IDLE" : "ACTIVE");
+ mcs_name(ms_current_cs_dl(ms, ms_mode(ms))), mcs_name(ms_max_cs_dl(ms)),
+ mcs_name(ms_current_cs_ul(ms)), mcs_name(ms_max_cs_ul(ms)),
+ mode_name(ms_mode(ms)),
+ ms_is_idle(ms) ? "IDLE" : "ACTIVE");
}
static void test_ms_mcs_mode()
{
- BTS the_bts;
- gprs_rlcmac_bts *bts = the_bts.bts_data();
+ struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);
uint32_t tlli = 0xdeadbeef;
gprs_rlcmac_dl_tbf *dl_tbf;
@@ -551,52 +478,54 @@ static void test_ms_mcs_mode()
printf("=== start %s ===\n", __func__);
- ms1 = new GprsMs(&the_bts, tlli);
+ ms1 = ms_alloc(bts, __func__);
+ ms_confirm_tlli(ms1, tlli);
dump_ms(ms1, "1: no BTS defaults ");
bts->initial_cs_dl = 4;
bts->initial_cs_ul = 1;
- bts->cs_downgrade_threshold = 0;
+ the_pcu->vty.cs_downgrade_threshold = 0;
- ms2 = new GprsMs(&the_bts, tlli + 1);
+ ms2 = ms_alloc(bts,__func__);
+ ms_confirm_tlli(ms2, tlli + 1);
dump_ms(ms2, "2: with BTS defaults");
- dl_tbf = talloc_zero(tall_pcu_ctx, struct gprs_rlcmac_dl_tbf);
- new (dl_tbf) gprs_rlcmac_dl_tbf(NULL);
+ dl_tbf = alloc_dl_tbf(bts, ms2);
+ ms_attach_tbf(ms2, dl_tbf);
- dl_tbf->set_ms(ms2);
dump_ms(ms2, "2: after TBF attach ");
- ms1->set_mode(EGPRS);
+ ms_set_mode(ms1, EGPRS);
dump_ms(ms1, "1: after mode set ");
- ms2->set_mode(EGPRS);
+ ms_set_mode(ms2, EGPRS);
dump_ms(ms2, "2: after mode set ");
- ms1->set_current_cs_dl(MCS7);
+ ms_set_current_cs_dl(ms1, MCS7);
dump_ms(ms1, "1: after MCS set ");
- ms2->set_current_cs_dl(MCS8);
+ ms_set_current_cs_dl(ms2, MCS8);
dump_ms(ms2, "2: after MCS set ");
- ms1->set_mode(EGPRS_GMSK);
+ ms_set_mode(ms1, EGPRS_GMSK);
dump_ms(ms1, "1: after mode set ");
- ms2->set_mode(EGPRS_GMSK);
+ ms_set_mode(ms2, EGPRS_GMSK);
dump_ms(ms2, "2: after mode set ");
- // FIXME: following code triggers ASAN failure:
- // ms2->detach_tbf(dl_tbf);
- // dump_ms(ms2, "2: after TBF detach ");
+ ms_detach_tbf(ms2, dl_tbf);
+ dump_ms(ms2, "2: after TBF detach ");
- ms1->set_mode(GPRS);
+ ms_set_mode(ms1, GPRS);
dump_ms(ms1, "1: after mode set ");
- ms2->set_mode(GPRS);
+ ms_set_mode(ms2, GPRS);
dump_ms(ms2, "2: after mode set ");
talloc_free(dl_tbf);
-
+ talloc_free(ms1);
+ talloc_free(ms2);
+ talloc_free(bts);
printf("=== end %s ===\n", __func__);
}
@@ -611,15 +540,20 @@ int main(int argc, char **argv)
msgb_talloc_ctx_init(tall_pcu_ctx, 0);
osmo_init_logging2(tall_pcu_ctx, &gprs_log_info);
log_set_use_color(osmo_stderr_target, 0);
- log_set_print_filename(osmo_stderr_target, 0);
+ log_set_print_filename2(osmo_stderr_target, LOG_FILENAME_NONE);
log_set_log_level(osmo_stderr_target, LOGL_INFO);
- log_parse_category_mask(osmo_stderr_target, "DPCU,3:DRLCMAC,3");
+ log_set_print_category(osmo_stderr_target, 0);
+ log_set_print_category_hex(osmo_stderr_target, 0);
+ log_parse_category_mask(osmo_stderr_target, "DPCU,3:DRLCMAC,3:DMS,3");
+
+ the_pcu = gprs_pcu_alloc(tall_pcu_ctx);
vty_init(&pcu_vty_info);
pcu_vty_init();
+ osmo_tdef_set(the_pcu->T_defs, -2030, 0, OSMO_TDEF_S);
+
test_ms_state();
- test_ms_callback();
test_ms_replace_tbf();
test_ms_change_tlli();
test_ms_storage();
@@ -627,6 +561,8 @@ int main(int argc, char **argv)
test_ms_cs_selection();
test_ms_mcs_mode();
+ talloc_free(the_pcu);
+
if (getenv("TALLOC_REPORT_FULL"))
talloc_report_full(tall_pcu_ctx, stderr);
@@ -636,6 +572,7 @@ int main(int argc, char **argv)
extern "C" {
void l1if_pdch_req() { abort(); }
void l1if_connect_pdch() { abort(); }
-void l1if_close_pdch() { abort(); }
-void l1if_open_pdch() { abort(); }
+void l1if_disconnect_pdch() { abort(); }
+void l1if_close_trx() { abort(); }
+void l1if_open_trx() { abort(); }
}
diff --git a/tests/ms/MsTest.err b/tests/ms/MsTest.err
index 735c4fe4..001898b9 100644
--- a/tests/ms/MsTest.err
+++ b/tests/ms/MsTest.err
@@ -1,25 +1,26 @@
-Creating MS object, TLLI = 0xffeeddbb
-Attaching TBF to MS object, TLLI = 0xffeeddbb, TBF = TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL)
-Attaching TBF to MS object, TLLI = 0xffeeddbb, TBF = TBF(TFI=0 TLLI=0x00000000 DIR=DL STATE=NULL)
-Detaching TBF from MS object, TLLI = 0xffeeddbb, TBF = TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL)
-Detaching TBF from MS object, TLLI = 0xffeeddbb, TBF = TBF(TFI=0 TLLI=0x00000000 DIR=DL STATE=NULL)
-Destroying MS object, TLLI = 0xffeeddbb
-Creating MS object, TLLI = 0xffeeddbb
-Attaching TBF to MS object, TLLI = 0xffeeddbb, TBF = TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL)
-Attaching TBF to MS object, TLLI = 0xffeeddbb, TBF = TBF(TFI=0 TLLI=0x00000000 DIR=DL STATE=NULL)
-Detaching TBF from MS object, TLLI = 0xffeeddbb, TBF = TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL)
-Detaching TBF from MS object, TLLI = 0xffeeddbb, TBF = TBF(TFI=0 TLLI=0x00000000 DIR=DL STATE=NULL)
-Destroying MS object, TLLI = 0xffeeddbb
-Creating MS object, TLLI = 0xffeeddbb
-Attaching TBF to MS object, TLLI = 0xffeeddbb, TBF = TBF(TFI=0 TLLI=0x00000000 DIR=DL STATE=NULL)
-Attaching TBF to MS object, TLLI = 0xffeeddbb, TBF = TBF(TFI=0 TLLI=0x00000000 DIR=DL STATE=NULL)
-Attaching TBF to MS object, TLLI = 0xffeeddbb, TBF = TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL)
-Detaching TBF from MS object, TLLI = 0xffeeddbb, TBF = TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL)
-Detaching TBF from MS object, TLLI = 0xffeeddbb, TBF = TBF(TFI=0 TLLI=0x00000000 DIR=DL STATE=NULL)
-Detaching TBF from MS object, TLLI = 0xffeeddbb, TBF = TBF(TFI=0 TLLI=0x00000000 DIR=DL STATE=NULL)
-Destroying MS object, TLLI = 0xffeeddbb
-Creating MS object, TLLI = 0xaa000000
-Modifying MS object, UL TLLI: 0xaa000000 -> 0xff001111, not yet confirmed
+Creating MS object
+MS(TA-220:MSCLS-0-0): + test_ms_state: now used by 1 (test_ms_state)
+Modifying MS object, UL TLLI: 0xffffffff -> 0xffeeddbb, not yet confirmed
+MS(TLLI-0xffeeddbb:TA-220:MSCLS-0-0) Attaching UL TBF: TBF(UL:G:TLLI-0xffeeddbb){NEW}
+MS(TLLI-0xffeeddbb:TA-220:MSCLS-0-0:UL) Attaching DL TBF: TBF(DL:G:TLLI-0xffeeddbb){NEW}
+MS(TLLI-0xffeeddbb:TA-220:MSCLS-0-0:UL:DL) Detaching TBF: TBF(UL:G:TLLI-0xffeeddbb){NEW}
+MS(TLLI-0xffeeddbb:TA-220:MSCLS-0-0:DL) Detaching TBF: TBF(DL:G:TLLI-0xffeeddbb){NEW}
+MS(TLLI-0xffeeddbb:TA-220:MSCLS-0-0): - tbf: now used by 0 (-)
+MS(TLLI-0xffeeddbb:TA-220:MSCLS-0-0) Destroying MS object
+Creating MS object
+MS(TA-220:MSCLS-0-0): + test_ms_replace_tbf: now used by 1 (test_ms_replace_tbf)
+The MS object cannot fully confirm an unexpected TLLI: 0xffeeddbb, partly confirmed
+MS(TLLI-0xffeeddbb:TA-220:MSCLS-0-0) Attaching DL TBF: TBF(DL:G:TLLI-0xffeeddbb){NEW}
+MS(TLLI-0xffeeddbb:TA-220:MSCLS-0-0:DL) Attaching DL TBF: TBF(DL:G:TLLI-0xffeeddbb){NEW}
+MS(TLLI-0xffeeddbb:TA-220:MSCLS-0-0:DL) Attaching UL TBF: TBF(UL:G:TLLI-0xffeeddbb){NEW}
+MS(TLLI-0xffeeddbb:TA-220:MSCLS-0-0:UL:DL) Detaching TBF: TBF(UL:G:TLLI-0xffeeddbb){NEW}
+MS(TLLI-0xffeeddbb:TA-220:MSCLS-0-0:DL) Detaching TBF: TBF(DL:G:TLLI-0xffeeddbb){NEW}
+MS(TLLI-0xffeeddbb:TA-220:MSCLS-0-0:DL) Detaching TBF: TBF(DL:G:TLLI-0xffeeddbb){NEW}
+MS(TLLI-0xffeeddbb:TA-220:MSCLS-0-0): - tbf: now used by 0 (-)
+MS(TLLI-0xffeeddbb:TA-220:MSCLS-0-0) Destroying MS object
+Creating MS object
+MS(TA-220:MSCLS-0-0): + test_ms_change_tlli: now used by 1 (test_ms_change_tlli)
+Modifying MS object, UL TLLI: 0xffffffff -> 0xff001111, not yet confirmed
Modifying MS object, TLLI: 0xff001111 confirmed
Modifying MS object, UL TLLI: 0xff001111 -> 0xaa000000, not yet confirmed
Modifying MS object, TLLI: 0xaa000000 confirmed
@@ -34,28 +35,49 @@ Modifying MS object, UL TLLI: 0xff001111 -> 0xaa000000, not yet confirmed
Modifying MS object, TLLI: 0xaa000000 confirmed
The MS object cannot fully confirm an unexpected TLLI: 0xff001111, partly confirmed
Modifying MS object, TLLI: 0xaa000000 -> 0xff001111, already confirmed partly
-Destroying MS object, TLLI = 0xff001111
-Creating MS object, TLLI = 0x00000000
-Modifying MS object, UL TLLI: 0x00000000 -> 0xffeeddbb, not yet confirmed
+MS(TLLI-0xff001111:TA-220:MSCLS-0-0): - test_ms_change_tlli: now used by 0 (-)
+MS(TLLI-0xff001111:TA-220:MSCLS-0-0) Destroying MS object
+Creating MS object
+Modifying MS object, UL TLLI: 0xffffffff -> 0xffeeddbb, not yet confirmed
Modifying MS object, TLLI = 0xffeeddbb, IMSI '' -> '001001987654321'
-Creating MS object, TLLI = 0x00000000
-Modifying MS object, UL TLLI: 0x00000000 -> 0xffeeddbc, not yet confirmed
+Creating MS object
+Modifying MS object, UL TLLI: 0xffffffff -> 0xffeeddbc, not yet confirmed
Modifying MS object, TLLI = 0xffeeddbc, IMSI '' -> '001001987654322'
-Attaching TBF to MS object, TLLI = 0xffeeddbb, TBF = TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL)
-Detaching TBF from MS object, TLLI = 0xffeeddbb, TBF = TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL)
-Destroying MS object, TLLI = 0xffeeddbb
-Attaching TBF to MS object, TLLI = 0xffeeddbc, TBF = TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL)
-Detaching TBF from MS object, TLLI = 0xffeeddbc, TBF = TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL)
-Destroying MS object, TLLI = 0xffeeddbc
-Creating MS object, TLLI = 0xffeeddbb
-Attaching TBF to MS object, TLLI = 0xffeeddbb, TBF = TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL)
-Attaching TBF to MS object, TLLI = 0xffeeddbb, TBF = TBF(TFI=0 TLLI=0x00000000 DIR=DL STATE=NULL)
-Detaching TBF from MS object, TLLI = 0xffeeddbb, TBF = TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL)
-Detaching TBF from MS object, TLLI = 0xffeeddbb, TBF = TBF(TFI=0 TLLI=0x00000000 DIR=DL STATE=NULL)
-Timeout for MS object, TLLI = 0xffeeddbb
-Destroying MS object, TLLI = 0xffeeddbb
-Creating MS object, TLLI = 0xffeeddbb
-Attaching TBF to MS object, TLLI = 0xffeeddbb, TBF = TBF(TFI=0 TLLI=0xffeeddbb DIR=DL STATE=NULL)
-Creating MS object, TLLI = 0xdeadbeef
-Creating MS object, TLLI = 0xdeadbef0
-Attaching TBF to MS object, TLLI = 0xdeadbef0, TBF = TBF(TFI=0 TLLI=0xdeadbef0 DIR=DL STATE=NULL)
+MS(IMSI-001001987654321:TLLI-0xffeeddbb:TA-220:MSCLS-0-0) Attaching UL TBF: TBF(UL:G:IMSI-001001987654321:TLLI-0xffeeddbb){NEW}
+MS(IMSI-001001987654321:TLLI-0xffeeddbb:TA-220:MSCLS-0-0:UL): + tbf: now used by 1 (tbf)
+MS(IMSI-001001987654321:TLLI-0xffeeddbb:TA-220:MSCLS-0-0:UL) Detaching TBF: TBF(UL:G:IMSI-001001987654321:TLLI-0xffeeddbb){NEW}
+MS(IMSI-001001987654321:TLLI-0xffeeddbb:TA-220:MSCLS-0-0): - tbf: now used by 0 (-)
+MS(IMSI-001001987654321:TLLI-0xffeeddbb:TA-220:MSCLS-0-0) Destroying MS object
+MS(IMSI-001001987654322:TLLI-0xffeeddbc:TA-220:MSCLS-0-0) Attaching UL TBF: TBF(UL:G:IMSI-001001987654322:TLLI-0xffeeddbc){NEW}
+MS(IMSI-001001987654322:TLLI-0xffeeddbc:TA-220:MSCLS-0-0:UL): + tbf: now used by 1 (tbf)
+MS(IMSI-001001987654322:TLLI-0xffeeddbc:TA-220:MSCLS-0-0:UL) Detaching TBF: TBF(UL:G:IMSI-001001987654322:TLLI-0xffeeddbc){NEW}
+MS(IMSI-001001987654322:TLLI-0xffeeddbc:TA-220:MSCLS-0-0): - tbf: now used by 0 (-)
+MS(IMSI-001001987654322:TLLI-0xffeeddbc:TA-220:MSCLS-0-0) Destroying MS object
+Creating MS object
+MS(TA-220:MSCLS-0-0): + test_ms_timeout: now used by 1 (test_ms_timeout)
+Modifying MS object, UL TLLI: 0xffffffff -> 0xffeeddbb, not yet confirmed
+MS(TLLI-0xffeeddbb:TA-220:MSCLS-0-0) Attaching UL TBF: TBF(UL:G:TLLI-0xffeeddbb){NEW}
+MS(TLLI-0xffeeddbb:TA-220:MSCLS-0-0:UL) Attaching DL TBF: TBF(DL:G:TLLI-0xffeeddbb){NEW}
+MS(TLLI-0xffeeddbb:TA-220:MSCLS-0-0:UL:DL) Detaching TBF: TBF(UL:G:TLLI-0xffeeddbb){NEW}
+MS(TLLI-0xffeeddbb:TA-220:MSCLS-0-0:DL) Detaching TBF: TBF(DL:G:TLLI-0xffeeddbb){NEW}
+MS(TLLI-0xffeeddbb:TA-220:MSCLS-0-0): - tbf: now used by 0 (-)
+MS(TLLI-0xffeeddbb:TA-220:MSCLS-0-0) Schedule MS release in 1 secs
+MS(TLLI-0xffeeddbb:TA-220:MSCLS-0-0) Release timer expired
+MS(TLLI-0xffeeddbb:TA-220:MSCLS-0-0) Destroying MS object
+Creating MS object
+MS(TA-220:MSCLS-0-0): + test_ms_cs_selection: now used by 1 (test_ms_cs_selection)
+The MS object cannot fully confirm an unexpected TLLI: 0xffeeddbb, partly confirmed
+MS(TLLI-0xffeeddbb:TA-220:MSCLS-0-0) Attaching DL TBF: TBF(DL:G:TLLI-0xffeeddbb){NEW}
+MS(TLLI-0xffeeddbb:TA-220:MSCLS-0-0:DL) Detaching TBF: TBF(DL:G:TLLI-0xffeeddbb){NEW}
+MS(TLLI-0xffeeddbb:TA-220:MSCLS-0-0): - test_ms_cs_selection: now used by 0 (-)
+MS(TLLI-0xffeeddbb:TA-220:MSCLS-0-0) Destroying MS object
+Creating MS object
+MS(TA-220:MSCLS-0-0): + test_ms_mcs_mode: now used by 1 (test_ms_mcs_mode)
+The MS object cannot fully confirm an unexpected TLLI: 0xdeadbeef, partly confirmed
+Creating MS object
+MS(TA-220:MSCLS-0-0): + test_ms_mcs_mode: now used by 1 (test_ms_mcs_mode)
+The MS object cannot fully confirm an unexpected TLLI: 0xdeadbef0, partly confirmed
+MS(TLLI-0xdeadbef0:TA-220:MSCLS-0-0) Attaching DL TBF: TBF(DL:G:TLLI-0xdeadbef0){NEW}
+MS(TLLI-0xdeadbef0:TA-220:MSCLS-0-0:DL) Detaching TBF: TBF(DL:G:TLLI-0xdeadbef0){NEW}
+MS(TLLI-0xdeadbeef:TA-220:MSCLS-0-0) Destroying MS object
+MS(TLLI-0xdeadbef0:TA-220:MSCLS-0-0) Destroying MS object
diff --git a/tests/ms/MsTest.ok b/tests/ms/MsTest.ok
index 9952d59e..a79dedb1 100644
--- a/tests/ms/MsTest.ok
+++ b/tests/ms/MsTest.ok
@@ -1,33 +1,26 @@
=== start test_ms_state ===
=== end test_ms_state ===
-=== start test_ms_callback ===
- ms_active() was called
- ms_idle() was called
-=== end test_ms_callback ===
=== start test_ms_replace_tbf ===
- ms_active() was called
- ms_idle() was called
=== end test_ms_replace_tbf ===
=== start test_ms_change_tlli ===
=== end test_ms_change_tlli ===
=== start test_ms_storage ===
=== end test_ms_storage ===
=== start test_ms_timeout ===
- ms_active() was called
- ms_idle() was called
=== end test_ms_timeout ===
=== start test_ms_cs_selection ===
=== end test_ms_cs_selection ===
=== start test_ms_mcs_mode ===
-1: no BTS defaults MS DL UNKNOWN/UNKNOWN, UL UNKNOWN/UNKNOWN, mode GPRS, <IDLE>
+1: no BTS defaults MS DL CS-1/CS-4, UL CS-1/CS-4, mode GPRS, <IDLE>
2: with BTS defaults MS DL CS-4/CS-4, UL CS-1/CS-4, mode GPRS, <IDLE>
2: after TBF attach MS DL CS-4/CS-4, UL CS-1/CS-4, mode GPRS, <ACTIVE>
-1: after mode set MS DL UNKNOWN/UNKNOWN, UL UNKNOWN/UNKNOWN, mode EGPRS, <IDLE>
-2: after mode set MS DL UNKNOWN/UNKNOWN, UL UNKNOWN/UNKNOWN, mode EGPRS, <ACTIVE>
-1: after MCS set MS DL MCS-7/MCS-4, UL UNKNOWN/UNKNOWN, mode EGPRS, <IDLE>
-2: after MCS set MS DL MCS-8/MCS-4, UL UNKNOWN/UNKNOWN, mode EGPRS, <ACTIVE>
-1: after mode set MS DL MCS-7/MCS-4, UL UNKNOWN/UNKNOWN, mode EGPRS_GMSK-only, <IDLE>
-2: after mode set MS DL MCS-8/MCS-4, UL UNKNOWN/UNKNOWN, mode EGPRS_GMSK-only, <ACTIVE>
+1: after mode set MS DL MCS-1/MCS-9, UL MCS-1/MCS-9, mode EGPRS, <IDLE>
+2: after mode set MS DL MCS-1/MCS-9, UL MCS-1/MCS-9, mode EGPRS, <ACTIVE>
+1: after MCS set MS DL MCS-7/MCS-9, UL MCS-1/MCS-9, mode EGPRS, <IDLE>
+2: after MCS set MS DL MCS-8/MCS-9, UL MCS-1/MCS-9, mode EGPRS, <ACTIVE>
+1: after mode set MS DL MCS-1/MCS-4, UL MCS-1/MCS-4, mode EGPRS_GMSK-only, <IDLE>
+2: after mode set MS DL MCS-1/MCS-4, UL MCS-1/MCS-4, mode EGPRS_GMSK-only, <ACTIVE>
+2: after TBF detach MS DL MCS-1/MCS-4, UL MCS-1/MCS-4, mode EGPRS_GMSK-only, <IDLE>
1: after mode set MS DL CS-4/CS-4, UL CS-1/CS-4, mode GPRS, <IDLE>
-2: after mode set MS DL CS-4/CS-4, UL CS-1/CS-4, mode GPRS, <ACTIVE>
+2: after mode set MS DL CS-4/CS-4, UL CS-1/CS-4, mode GPRS, <IDLE>
=== end test_ms_mcs_mode ===