From 939904672961fa7e28397e27f942a7d1fff4bbdf Mon Sep 17 00:00:00 2001 From: Jacob Erlbeck Date: Fri, 15 May 2015 15:50:43 +0200 Subject: 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 --- tests/ms/MsTest.cpp | 94 +++++++++++++++++++++++++++++++++++++++++++++++++++ tests/ms/MsTest.err | 17 ++++++++++ tests/ms/MsTest.ok | 2 ++ tests/tbf/TbfTest.cpp | 31 ++++++++++++----- tests/tbf/TbfTest.err | 7 +++- 5 files changed, 141 insertions(+), 10 deletions(-) (limited to 'tests') 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 ********** -- cgit v1.2.3