update it

This commit is contained in:
Sukchan Lee 2017-07-28 14:06:40 +09:00
parent 63cfc93819
commit 0315c6d109
5 changed files with 102 additions and 98 deletions

View File

@ -21,97 +21,6 @@
#include "emm_handler.h"
mme_ue_t *emm_find_ue_by_message(enb_ue_t *enb_ue, nas_message_t *message)
{
mme_ue_t *mme_ue = NULL;
d_assert(enb_ue, return NULL, "Null param");
switch(message->emm.h.message_type)
{
case NAS_ATTACH_REQUEST:
{
nas_attach_request_t *attach_request =
&message->emm.attach_request;
nas_eps_mobile_identity_t *eps_mobile_identity =
&attach_request->eps_mobile_identity;
switch(eps_mobile_identity->imsi.type)
{
case NAS_EPS_MOBILE_IDENTITY_IMSI:
{
c_int8_t imsi_bcd[MAX_IMSI_BCD_LEN+1];
nas_imsi_to_bcd(
&eps_mobile_identity->imsi, eps_mobile_identity->length,
imsi_bcd);
d_trace(3,"Search mme_ue by UE_IMSI[%s]\n", imsi_bcd);
mme_ue = mme_ue_find_by_imsi_bcd(imsi_bcd);
break;
}
case NAS_EPS_MOBILE_IDENTITY_GUTI:
{
nas_eps_mobile_identity_guti_t *nas_guti = NULL;
nas_guti = &eps_mobile_identity->guti;
guti_t guti;
guti.plmn_id = nas_guti->plmn_id;
guti.mme_gid = nas_guti->mme_gid;
guti.mme_code = nas_guti->mme_code;
guti.m_tmsi = nas_guti->m_tmsi;
d_trace(3,"Search mme_ue by GUTI[G:%d,C:%d,M_TMSI:0x%x]\n",
guti.mme_gid,
guti.mme_code,
guti.m_tmsi);
mme_ue = mme_ue_find_by_guti(&guti);
if (!mme_ue)
{
d_warn("Cannot find mme_ue by "
"GUTI[G:%d,C:%d,M_TMSI:0x%x]\n",
guti.mme_gid,
guti.mme_code,
guti.m_tmsi);
}
else
{
mme_associate_ue_context(mme_ue, enb_ue);
}
break;
}
default:
{
printf("Uknown message imsi type =%d\n",
eps_mobile_identity->imsi.type);
break;
}
}
break;
}
case NAS_DETACH_REQUEST:
{
/* TODO */
break;
}
case NAS_TRACKING_AREA_UPDATE_REQUEST:
{
/* TODO */
break;
}
default:
{
break;
}
}
return mme_ue;
}
static status_t emm_send_to_enb(enb_ue_t *enb_ue, pkbuf_t *pkbuf)
{
mme_enb_t *enb = NULL;
@ -259,6 +168,8 @@ void emm_handle_attach_request(
guti.mme_code = nas_guti->mme_code;
guti.m_tmsi = nas_guti->m_tmsi;
mme_associate_ue_context(mme_ue, enb_ue);
d_info("[NAS] Attach request : GUTI[G:%d,C:%d,M_TMSI:0x%x]-"
"IMSI:[%s] --> EMM",
guti.mme_gid,

View File

@ -32,9 +32,6 @@ CORE_DECLARE(void) emm_handle_delete_session_response(mme_bearer_t *bearer);
CORE_DECLARE(void) emm_handle_service_request(
mme_ue_t *mme_ue, nas_service_request_t *service_request);
CORE_DECLARE(mme_ue_t*) emm_find_ue_by_message(
enb_ue_t *enb_ue, nas_message_t *message);
#ifdef __cplusplus
}
#endif /* __cplusplus */

View File

@ -8,6 +8,7 @@
#include "s1ap_message.h"
#include "context.h"
#include "nas_conv.h"
#include "mme_context.h"
#include "mme_event.h"
@ -1065,6 +1066,103 @@ mme_ue_t *mme_ue_this(hash_index_t *hi)
return hash_this_val(hi);
}
mme_ue_t* mme_ue_find_by_message(nas_message_t *message)
{
mme_ue_t *mme_ue = NULL;
switch(message->emm.h.message_type)
{
case NAS_ATTACH_REQUEST:
{
nas_attach_request_t *attach_request =
&message->emm.attach_request;
nas_eps_mobile_identity_t *eps_mobile_identity =
&attach_request->eps_mobile_identity;
switch(eps_mobile_identity->imsi.type)
{
case NAS_EPS_MOBILE_IDENTITY_IMSI:
{
c_int8_t imsi_bcd[MAX_IMSI_BCD_LEN+1];
nas_imsi_to_bcd(
&eps_mobile_identity->imsi, eps_mobile_identity->length,
imsi_bcd);
mme_ue = mme_ue_find_by_imsi_bcd(imsi_bcd);
if (mme_ue)
{
d_trace(3,"known UE by IMSI[%s]\n", imsi_bcd);
}
else
{
d_trace(3,"Unknown UE by IMSI[%s]\n", imsi_bcd);
}
break;
}
case NAS_EPS_MOBILE_IDENTITY_GUTI:
{
nas_eps_mobile_identity_guti_t *nas_guti = NULL;
nas_guti = &eps_mobile_identity->guti;
guti_t guti;
guti.plmn_id = nas_guti->plmn_id;
guti.mme_gid = nas_guti->mme_gid;
guti.mme_code = nas_guti->mme_code;
guti.m_tmsi = nas_guti->m_tmsi;
d_trace(3,"Search mme_ue by GUTI[G:%d,C:%d,M_TMSI:0x%x]\n",
guti.mme_gid,
guti.mme_code,
guti.m_tmsi);
mme_ue = mme_ue_find_by_guti(&guti);
if (mme_ue)
{
d_warn("Known UE by GUTI[G:%d,C:%d,M_TMSI:0x%x]",
guti.mme_gid,
guti.mme_code,
guti.m_tmsi);
}
else
{
d_warn("Unknown UE by GUTI[G:%d,C:%d,M_TMSI:0x%x]",
guti.mme_gid,
guti.mme_code,
guti.m_tmsi);
}
break;
}
default:
{
d_error("Uknown message imsi type =%d\n",
eps_mobile_identity->imsi.type);
break;
}
}
break;
}
case NAS_DETACH_REQUEST:
{
/* TODO */
break;
}
case NAS_TRACKING_AREA_UPDATE_REQUEST:
{
/* TODO */
break;
}
default:
{
break;
}
}
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)
{

View File

@ -289,6 +289,7 @@ CORE_DECLARE(mme_ue_t*) mme_ue_find_by_imsi(c_uint8_t *imsi, int imsi_len);
CORE_DECLARE(mme_ue_t*) mme_ue_find_by_imsi_bcd(c_int8_t *imsi_bcd);
CORE_DECLARE(mme_ue_t*) mme_ue_find_by_guti(guti_t *guti);
CORE_DECLARE(mme_ue_t*) mme_ue_find_by_message(nas_message_t *message);
CORE_DECLARE(status_t) mme_ue_set_imsi(
mme_ue_t *mme_ue, c_int8_t *imsi_bcd);
CORE_DECLARE(status_t) mme_associate_ue_context(

View File

@ -171,10 +171,7 @@ void mme_state_operational(fsm_t *s, event_t *e)
mme_ue = enb_ue->mme_ue;
if (!mme_ue)
{
/* Find MME UE by NAS message or create if needed */
mme_ue = emm_find_ue_by_message(enb_ue, &message);
/* If not found , create one */
mme_ue = mme_ue_find_by_message(&message);
if (!mme_ue)
{
mme_ue = mme_ue_add(enb_ue);