forked from acouzens/open5gs
Prevent GUTI re-allocation for every attach_request
This commit is contained in:
parent
cf6df20ad7
commit
3f7c3d3041
|
@ -54,10 +54,10 @@ status_t emm_build_attach_accept(
|
|||
attach_accept->esm_message_container.length = esmbuf->len;
|
||||
|
||||
d_trace(5, " %s GUTI[G:%d,C:%d,M_TMSI:0x%x] IMSI:[%s]\n",
|
||||
mme_ue->new_guti ? "# NEW #" : "# Not Changed #",
|
||||
mme_ue->guti_present ? "# Present #" : "# Not Present #",
|
||||
mme_ue->guti.mme_gid, mme_ue->guti.mme_code,
|
||||
mme_ue->guti.m_tmsi, mme_ue->imsi_bcd);
|
||||
if (mme_ue->new_guti)
|
||||
if (mme_ue->guti_present)
|
||||
{
|
||||
attach_accept->presencemask |= NAS_ATTACH_ACCEPT_GUTI_PRESENT;
|
||||
guti->length = sizeof(nas_eps_mobile_identity_guti_t);
|
||||
|
@ -68,7 +68,7 @@ status_t emm_build_attach_accept(
|
|||
guti->guti.mme_code = mme_ue->guti.mme_code;
|
||||
guti->guti.m_tmsi = mme_ue->guti.m_tmsi;
|
||||
}
|
||||
mme_ue->new_guti = 0;
|
||||
mme_ue->guti_present = 0;
|
||||
|
||||
attach_accept->presencemask |= NAS_ATTACH_ACCEPT_T3402_VALUE_PRESENT;
|
||||
t3402_value->unit = NAS_GRPS_TIMER_UNIT_MULTIPLES_OF_1_MM;
|
||||
|
|
|
@ -1834,6 +1834,45 @@ enb_ue_t* enb_ue_next_in_enb(enb_ue_t *enb_ue)
|
|||
return list_next(enb_ue);
|
||||
}
|
||||
|
||||
static status_t mme_ue_new_guti(mme_ue_t *mme_ue)
|
||||
{
|
||||
served_gummei_t *served_gummei = NULL;
|
||||
|
||||
d_assert(mme_ue, return CORE_ERROR, "Invalid param");
|
||||
d_assert(mme_self()->max_num_of_served_gummei > 0,
|
||||
return CORE_ERROR, "Invalid param");
|
||||
|
||||
served_gummei = &mme_self()->served_gummei[0];
|
||||
|
||||
d_assert(served_gummei->num_of_plmn_id > 0,
|
||||
return CORE_ERROR, "Invalid param");
|
||||
d_assert(served_gummei->num_of_mme_gid > 0,
|
||||
return CORE_ERROR, "Invalid param");
|
||||
d_assert(served_gummei->num_of_mme_code > 0,
|
||||
return CORE_ERROR, "Invalid param");
|
||||
|
||||
if (mme_ue->m_tmsi)
|
||||
{
|
||||
/* MME has a VALID GUIT
|
||||
* As such, we need to remove previous GUTI in hash table */
|
||||
hash_set(self.guti_ue_hash, &mme_ue->guti, sizeof(guti_t), NULL);
|
||||
d_assert(mme_m_tmsi_free(mme_ue->m_tmsi) == CORE_OK,,);
|
||||
}
|
||||
|
||||
memset(&mme_ue->guti, 0, sizeof(guti_t));
|
||||
|
||||
memcpy(&mme_ue->guti.plmn_id, &served_gummei->plmn_id[0], PLMN_ID_LEN);
|
||||
mme_ue->guti.mme_gid = served_gummei->mme_gid[0];
|
||||
mme_ue->guti.mme_code = served_gummei->mme_code[0];
|
||||
|
||||
mme_ue->m_tmsi = mme_m_tmsi_alloc();
|
||||
d_assert(mme_ue->m_tmsi, return CORE_ERROR,);
|
||||
mme_ue->guti.m_tmsi = *(mme_ue->m_tmsi);
|
||||
hash_set(self.guti_ue_hash, &mme_ue->guti, sizeof(guti_t), mme_ue);
|
||||
|
||||
return CORE_OK;
|
||||
}
|
||||
|
||||
mme_ue_t* mme_ue_add(enb_ue_t *enb_ue)
|
||||
{
|
||||
mme_ue_t *mme_ue = NULL;
|
||||
|
@ -1848,6 +1887,9 @@ mme_ue_t* mme_ue_add(enb_ue_t *enb_ue)
|
|||
|
||||
mme_ue->mme_s11_teid = mme_ue->index;
|
||||
|
||||
/* Create New GUTI */
|
||||
mme_ue_new_guti(mme_ue);
|
||||
|
||||
/* Setup SGW with round-robin manner */
|
||||
if (mme_self()->sgw == NULL)
|
||||
mme_self()->sgw = list_first(&mme_self()->sgw_list);
|
||||
|
@ -2125,48 +2167,6 @@ mme_ue_t* mme_ue_find_by_message(nas_message_t *message)
|
|||
return mme_ue;
|
||||
}
|
||||
|
||||
/* At this point, I'm not sure whether this function is exported or not */
|
||||
static status_t mme_ue_new_guti(mme_ue_t *mme_ue)
|
||||
{
|
||||
served_gummei_t *served_gummei = NULL;
|
||||
|
||||
d_assert(mme_ue, return CORE_ERROR, "Invalid param");
|
||||
d_assert(mme_self()->max_num_of_served_gummei > 0,
|
||||
return CORE_ERROR, "Invalid param");
|
||||
|
||||
served_gummei = &mme_self()->served_gummei[0];
|
||||
|
||||
d_assert(served_gummei->num_of_plmn_id > 0,
|
||||
return CORE_ERROR, "Invalid param");
|
||||
d_assert(served_gummei->num_of_mme_gid > 0,
|
||||
return CORE_ERROR, "Invalid param");
|
||||
d_assert(served_gummei->num_of_mme_code > 0,
|
||||
return CORE_ERROR, "Invalid param");
|
||||
|
||||
if (mme_ue->m_tmsi)
|
||||
{
|
||||
/* MME has a VALID GUIT
|
||||
* As such, we need to remove previous GUTI in hash table */
|
||||
hash_set(self.guti_ue_hash, &mme_ue->guti, sizeof(guti_t), NULL);
|
||||
d_assert(mme_m_tmsi_free(mme_ue->m_tmsi) == CORE_OK,,);
|
||||
}
|
||||
|
||||
memset(&mme_ue->guti, 0, sizeof(guti_t));
|
||||
|
||||
memcpy(&mme_ue->guti.plmn_id, &served_gummei->plmn_id[0], PLMN_ID_LEN);
|
||||
mme_ue->guti.mme_gid = served_gummei->mme_gid[0];
|
||||
mme_ue->guti.mme_code = served_gummei->mme_code[0];
|
||||
|
||||
mme_ue->m_tmsi = mme_m_tmsi_alloc();
|
||||
d_assert(mme_ue->m_tmsi, return CORE_ERROR,);
|
||||
mme_ue->guti.m_tmsi = *(mme_ue->m_tmsi);
|
||||
hash_set(self.guti_ue_hash, &mme_ue->guti, sizeof(guti_t), mme_ue);
|
||||
|
||||
mme_ue->new_guti = 1;
|
||||
|
||||
return CORE_OK;
|
||||
}
|
||||
|
||||
status_t mme_ue_set_imsi(mme_ue_t *mme_ue, c_int8_t *imsi_bcd)
|
||||
{
|
||||
d_assert(mme_ue && imsi_bcd, return CORE_ERROR, "Invalid param");
|
||||
|
@ -2176,7 +2176,7 @@ status_t mme_ue_set_imsi(mme_ue_t *mme_ue, c_int8_t *imsi_bcd)
|
|||
|
||||
hash_set(self.imsi_ue_hash, mme_ue->imsi, mme_ue->imsi_len, mme_ue);
|
||||
|
||||
mme_ue_new_guti(mme_ue);
|
||||
mme_ue->guti_present = 1;
|
||||
|
||||
return CORE_OK;
|
||||
}
|
||||
|
|
|
@ -225,9 +225,10 @@ struct _mme_ue_t {
|
|||
c_uint8_t imsi[MAX_IMSI_LEN];
|
||||
int imsi_len;
|
||||
c_int8_t imsi_bcd[MAX_IMSI_BCD_LEN+1];
|
||||
|
||||
mme_m_tmsi_t *m_tmsi;
|
||||
guti_t guti;
|
||||
int new_guti;
|
||||
int guti_present;
|
||||
|
||||
c_uint32_t mme_s11_teid; /* MME-S11-TEID is derived from INDEX */
|
||||
c_uint32_t sgw_s11_teid; /* SGW-S11-TEID is received from SGW */
|
||||
|
|
Loading…
Reference in New Issue