aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorJacob Erlbeck <jerlbeck@sysmocom.de>2015-05-15 15:50:43 +0200
committerJacob Erlbeck <jerlbeck@sysmocom.de>2015-05-21 17:10:42 +0200
commit939904672961fa7e28397e27f942a7d1fff4bbdf (patch)
treef17d491b73f8c54982da96a2431b45e8d98f6000 /tests
parente43460b50fc152026ab96b5095b94fbac6939ab2 (diff)
ms: Support new and old TLLIs
According to the specification (GSM 04.08/24.008, 4.7.1.5) after a new P-TMSI has been assigned, the old P-TMSI must be kept basically until it has been used by both sides. Since the TLLI will be derived from the P-TMSI, the old TLLI must also be kept until the new TLLI has been used by both MS and SGSN. This commit modifies the TLLI handling of GprsMs accordingly. set_tlli() is only used with TLLIs derived from MS messages, confirm_tlli() is used with TLLIs derived from messages received from the SGSN. tlli() returns the value set by the MS. check_tlli() matches each of the TLLI used by either MS or SGSN as well as the old TLLI until it has been confirmed. Sponsored-by: On-Waves ehf
Diffstat (limited to 'tests')
-rw-r--r--tests/ms/MsTest.cpp94
-rw-r--r--tests/ms/MsTest.err17
-rw-r--r--tests/ms/MsTest.ok2
-rw-r--r--tests/tbf/TbfTest.cpp31
-rw-r--r--tests/tbf/TbfTest.err7
5 files changed, 141 insertions, 10 deletions
diff --git a/tests/ms/MsTest.cpp b/tests/ms/MsTest.cpp
index 0895e4db..01f26423 100644
--- a/tests/ms/MsTest.cpp
+++ b/tests/ms/MsTest.cpp
@@ -232,6 +232,99 @@ static void test_ms_replace_tbf()
printf("=== end %s ===\n", __func__);
}
+static void test_ms_change_tlli()
+{
+ uint32_t start_tlli = 0xaa000000;
+ uint32_t new_ms_tlli = 0xff001111;
+ uint32_t other_sgsn_tlli = 0xff00eeee;
+ GprsMs *ms;
+
+ printf("=== start %s ===\n", __func__);
+
+ ms = new GprsMs(start_tlli);
+
+ OSMO_ASSERT(ms->is_idle());
+
+ /* 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->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 announces TLLI, SGSN uses it later */
+ 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(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->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(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 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));
+
+ /* 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->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->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));
+
+ delete ms;
+
+ printf("=== end %s ===\n", __func__);
+}
+
static void test_ms_storage()
{
uint32_t tlli = 0xffeeddbb;
@@ -320,6 +413,7 @@ int main(int argc, char **argv)
test_ms_state();
test_ms_callback();
test_ms_replace_tbf();
+ test_ms_change_tlli();
test_ms_storage();
if (getenv("TALLOC_REPORT_FULL"))
diff --git a/tests/ms/MsTest.err b/tests/ms/MsTest.err
index 091e0c85..bec98b98 100644
--- a/tests/ms/MsTest.err
+++ b/tests/ms/MsTest.err
@@ -18,6 +18,23 @@ Attaching TBF to MS object, TLLI = 0xffeeddbb, TBF = TBF(TFI=0 TLLI=0x00000000 D
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 = 0xaa000000
+Modifying MS object, UL TLLI: 0xaa000000 -> 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
+Modifying MS object, UL TLLI: 0xaa000000 -> 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
+Modifying MS object, UL TLLI: 0xaa000000 -> 0xff001111, not yet confirmed
+The MS object cannot fully confirm an unexpected TLLI: 0xff00eeee, partly confirmed
+Modifying MS object, TLLI: 0xff001111 confirmed
+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 = 0xffeeddbb
Creating MS object, TLLI = 0xffeeddbc
Attaching TBF to MS object, TLLI = 0xffeeddbb, TBF = TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL)
diff --git a/tests/ms/MsTest.ok b/tests/ms/MsTest.ok
index 219eec1a..004b36d4 100644
--- a/tests/ms/MsTest.ok
+++ b/tests/ms/MsTest.ok
@@ -8,5 +8,7 @@
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 ===
diff --git a/tests/tbf/TbfTest.cpp b/tests/tbf/TbfTest.cpp
index d5bcb674..2ec715bc 100644
--- a/tests/tbf/TbfTest.cpp
+++ b/tests/tbf/TbfTest.cpp
@@ -51,6 +51,8 @@ static void check_tbf(gprs_rlcmac_tbf *tbf)
static void test_tbf_tlli_update()
{
BTS the_bts;
+ GprsMs *ms, *ms_new;
+
the_bts.bts_data()->alloc_algorithm = alloc_algorithm_a;
the_bts.bts_data()->trx[0].pdch[2].enable();
the_bts.bts_data()->trx[0].pdch[3].enable();
@@ -63,6 +65,7 @@ static void test_tbf_tlli_update()
0, 0, 0);
dl_tbf->update_tlli(0x2342);
dl_tbf->tlli_mark_valid();
+ dl_tbf->update_ms(0x2342);
dl_tbf->ta = 4;
the_bts.timing_advance()->remember(0x2342, dl_tbf->ta);
@@ -71,23 +74,33 @@ static void test_tbf_tlli_update()
0, 0, 0);
ul_tbf->update_tlli(0x2342);
ul_tbf->tlli_mark_valid();
-
- OSMO_ASSERT(the_bts.dl_tbf_by_tlli(0x2342) == dl_tbf);
- OSMO_ASSERT(the_bts.ul_tbf_by_tlli(0x2342) == ul_tbf);
+ ms = the_bts.ms_by_tlli(0x2342);
+ OSMO_ASSERT(ms != NULL);
+ OSMO_ASSERT(ms->dl_tbf() == dl_tbf);
+ OSMO_ASSERT(ms->ul_tbf() == ul_tbf);
/*
* Now check.. that DL changes and that the timing advance
* has changed.
*/
dl_tbf->update_tlli(0x4232);
- OSMO_ASSERT(!the_bts.dl_tbf_by_tlli(0x2342));
- OSMO_ASSERT(!the_bts.ul_tbf_by_tlli(0x2342));
+ ms->confirm_tlli(0x4232);
+
+ /* It is still there, since the new TLLI has not been used for UL yet */
+ ms_new = the_bts.ms_by_tlli(0x2342);
+ OSMO_ASSERT(ms == ms_new);
+
+ ms_new = the_bts.ms_by_tlli(0x4232);
+ OSMO_ASSERT(ms == ms_new);
+ OSMO_ASSERT(ms->dl_tbf() == dl_tbf);
+ OSMO_ASSERT(ms->ul_tbf() == ul_tbf);
-
- OSMO_ASSERT(the_bts.dl_tbf_by_tlli(0x4232) == dl_tbf);
- OSMO_ASSERT(the_bts.ul_tbf_by_tlli(0x4232) == ul_tbf);
+ /* Now use the new TLLI for UL */
+ ms->set_tlli(0x4232);
+ ms_new = the_bts.ms_by_tlli(0x2342);
+ OSMO_ASSERT(ms_new == NULL);
OSMO_ASSERT(the_bts.timing_advance()->recall(0x4232) == 4);
}
@@ -318,7 +331,7 @@ static void test_tbf_exhaustion()
snprintf(imsi, sizeof(imsi)-1, "001001%9d", i);
- rc = gprs_rlcmac_dl_tbf::handle(bts, tlli, imsi, ms_class,
+ rc = gprs_rlcmac_dl_tbf::handle(bts, tlli, 0, imsi, ms_class,
delay_csec, buf, sizeof(buf));
if (rc < 0)
diff --git a/tests/tbf/TbfTest.err b/tests/tbf/TbfTest.err
index 3a58351e..32f9efc4 100644
--- a/tests/tbf/TbfTest.err
+++ b/tests/tbf/TbfTest.err
@@ -6,6 +6,8 @@ Slot Allocation (Algorithm A) for class 0
- Assign downlink TS=2
- Setting Control TS 2
TBF(TFI=0 TLLI=0x00000000 DIR=DL STATE=NULL) changing tlli from TLLI=0x00000000 TLLI=0x00002342 ul_changed=0
+Creating MS object, TLLI = 0x00002342
+Attaching TBF to MS object, TLLI = 0x00002342, TBF = TBF(TFI=0 TLLI=0x00002342 DIR=DL STATE=NULL)
********** TBF starts here **********
Allocating UL TBF: TFI=0 TRX=0 MS_CLASS=0
Slot Allocation (Algorithm A) for class 0
@@ -13,8 +15,11 @@ Slot Allocation (Algorithm A) for class 0
- Skipping TS 1, because not enabled
- Assign uplink TS=2 USF=0
- Setting Control TS 2
+Attaching TBF to MS object, TLLI = 0x00002342, TBF = TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL)
TBF(TFI=0 TLLI=0x00000000 DIR=UL STATE=NULL) changing tlli from TLLI=0x00000000 TLLI=0x00002342 ul_changed=0
-TBF(TFI=0 TLLI=0x00002342 DIR=DL STATE=NULL) changing tlli from TLLI=0x00002342 TLLI=0x00004232 ul_changed=1
+TBF(TFI=0 TLLI=0x00002342 DIR=DL STATE=NULL) changing tlli from TLLI=0x00002342 TLLI=0x00004232 ul_changed=0
+The MS object cannot fully confirm an unexpected TLLI: 0x00004232, partly confirmed
+Modifying MS object, TLLI: 0x00002342 -> 0x00004232, already confirmed partly
Searching for first unallocated TFI: TRX=0 first TS=4
Found TFI=0.
********** TBF starts here **********