aboutsummaryrefslogtreecommitdiffstats
path: root/tests/ms/MsTest.cpp
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/ms/MsTest.cpp
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/ms/MsTest.cpp')
-rw-r--r--tests/ms/MsTest.cpp94
1 files changed, 94 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"))