From b94173ab41985d3c0c4c125aefa65c385a5fa0f5 Mon Sep 17 00:00:00 2001 From: Sukchan Lee Date: Sun, 21 Jan 2024 11:55:46 +0900 Subject: [PATCH] [AMF/MME] Fixed M-TMSI pool release (#2307) M-TMSI pool release was incorrectly modified and has now been corrected. --- lib/core/ogs-pool.h | 6 ++++++ src/amf/context.c | 7 ++++++- src/mme/mme-context.c | 7 ++++++- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/lib/core/ogs-pool.h b/lib/core/ogs-pool.h index b6398192a..eb435cffc 100644 --- a/lib/core/ogs-pool.h +++ b/lib/core/ogs-pool.h @@ -157,6 +157,12 @@ typedef uint32_t ogs_pool_id_t; (pool)->array[j] = temp; \ } \ } while (0) +#define ogs_pool_assert_if_has_duplicate(pool) do { \ + int i, j; \ + for (i = 0; i < (pool)->size; i++) \ + for (j = i+1; j < (pool)->size; j++) \ + ogs_assert(((pool)->array[i]) != ((pool)->array[j])); \ +} while (0) #ifdef __cplusplus } diff --git a/src/amf/context.c b/src/amf/context.c index 0b736c027..6b8244bf8 100644 --- a/src/amf/context.c +++ b/src/amf/context.c @@ -62,8 +62,12 @@ void amf_context_init(void) ogs_pool_init(&amf_ue_pool, ogs_global_conf()->max.ue); ogs_pool_init(&ran_ue_pool, ogs_global_conf()->max.ue); ogs_pool_init(&amf_sess_pool, ogs_app()->pool.sess); + /* Increase size of TMSI pool (#1827) */ ogs_pool_init(&m_tmsi_pool, ogs_global_conf()->max.ue*2); ogs_pool_random_id_generate(&m_tmsi_pool); +#if 0 /* For debugging : Verify whether there are duplicates of M_TMSI. */ + ogs_pool_assert_if_has_duplicate(&m_tmsi_pool); +#endif ogs_list_init(&self.gnb_list); ogs_list_init(&self.amf_ue_list); @@ -2487,7 +2491,8 @@ int amf_m_tmsi_free(amf_m_tmsi_t *m_tmsi) ogs_assert(m_tmsi); /* Restore M-TMSI by Issue #2307 */ - *m_tmsi &= 0x003fffff; + *m_tmsi &= 0x3fffffff; + *m_tmsi = ((*m_tmsi & 0xffff) | ((*m_tmsi & 0x3f000000) >> 8)); ogs_pool_free(&m_tmsi_pool, m_tmsi); return OGS_OK; diff --git a/src/mme/mme-context.c b/src/mme/mme-context.c index 9be948d7f..57ecc854f 100644 --- a/src/mme/mme-context.c +++ b/src/mme/mme-context.c @@ -118,8 +118,12 @@ void mme_context_init(void) ogs_pool_init(&sgw_ue_pool, ogs_global_conf()->max.ue); ogs_pool_init(&mme_sess_pool, ogs_app()->pool.sess); ogs_pool_init(&mme_bearer_pool, ogs_app()->pool.bearer); + /* Increase size of TMSI pool (#1827) */ ogs_pool_init(&m_tmsi_pool, ogs_global_conf()->max.ue*2); ogs_pool_random_id_generate(&m_tmsi_pool); +#if 0 /* For debugging : Verify whether there are duplicates of M_TMSI. */ + ogs_pool_assert_if_has_duplicate(&m_tmsi_pool); +#endif self.enb_addr_hash = ogs_hash_make(); ogs_assert(self.enb_addr_hash); @@ -4652,7 +4656,8 @@ int mme_m_tmsi_free(mme_m_tmsi_t *m_tmsi) ogs_assert(m_tmsi); /* Restore M-TMSI by Issue #2307 */ - *m_tmsi &= 0x003fffff; + *m_tmsi &= 0x3fffffff; + *m_tmsi = ((*m_tmsi & 0xffff) | ((*m_tmsi & 0x3f000000) >> 8)); ogs_pool_free(&m_tmsi_pool, m_tmsi); return OGS_OK;