diff options
author | Jacob Erlbeck <jerlbeck@sysmocom.de> | 2015-05-15 15:50:43 +0200 |
---|---|---|
committer | Jacob Erlbeck <jerlbeck@sysmocom.de> | 2015-05-21 17:10:42 +0200 |
commit | 939904672961fa7e28397e27f942a7d1fff4bbdf (patch) | |
tree | f17d491b73f8c54982da96a2431b45e8d98f6000 /tests/ms | |
parent | e43460b50fc152026ab96b5095b94fbac6939ab2 (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/ms')
-rw-r--r-- | tests/ms/MsTest.cpp | 94 | ||||
-rw-r--r-- | tests/ms/MsTest.err | 17 | ||||
-rw-r--r-- | tests/ms/MsTest.ok | 2 |
3 files changed, 113 insertions, 0 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 === |