[AMF] Disallow handling service requests unless UE is already registered

This commit is contained in:
Bostjan Meglic 2023-03-03 08:44:27 +00:00 committed by Sukchan Lee
parent 4d44b1843e
commit 10168f1f19
2 changed files with 48 additions and 9 deletions

View File

@ -33,6 +33,15 @@
#undef OGS_LOG_DOMAIN
#define OGS_LOG_DOMAIN __gmm_log_domain
typedef enum {
GMM_COMMON_STATE_DEREGISTERED,
GMM_COMMON_STATE_REGISTERED,
} gmm_common_state_e;
static void common_register_state(ogs_fsm_t *s, amf_event_t *e,
gmm_common_state_e state);
void gmm_state_initial(ogs_fsm_t *s, amf_event_t *e)
{
ogs_assert(s);
@ -49,8 +58,6 @@ void gmm_state_final(ogs_fsm_t *s, amf_event_t *e)
amf_sm_debug(e);
}
static void common_register_state(ogs_fsm_t *s, amf_event_t *e);
void gmm_state_de_registered(ogs_fsm_t *s, amf_event_t *e)
{
amf_ue_t *amf_ue = NULL;
@ -118,7 +125,7 @@ void gmm_state_de_registered(ogs_fsm_t *s, amf_event_t *e)
break;
case AMF_EVENT_5GMM_MESSAGE:
common_register_state(s, e);
common_register_state(s, e, GMM_COMMON_STATE_DEREGISTERED);
break;
case AMF_EVENT_5GMM_TIMER:
@ -469,7 +476,7 @@ void gmm_state_registered(ogs_fsm_t *s, amf_event_t *e)
break;
case AMF_EVENT_5GMM_MESSAGE:
common_register_state(s, e);
common_register_state(s, e, GMM_COMMON_STATE_REGISTERED);
break;
case AMF_EVENT_5GMM_TIMER:
@ -938,7 +945,8 @@ void gmm_state_registered(ogs_fsm_t *s, amf_event_t *e)
}
}
static void common_register_state(ogs_fsm_t *s, amf_event_t *e)
static void common_register_state(ogs_fsm_t *s, amf_event_t *e,
gmm_common_state_e state)
{
int r, rv, xact_count = 0;
ogs_nas_5gmm_cause_t gmm_cause;
@ -1064,6 +1072,17 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e)
case OGS_NAS_5GS_SERVICE_REQUEST:
ogs_info("Service request");
if (state != GMM_COMMON_STATE_REGISTERED) {
ogs_info("[%s] Handling service request failed [Not registered]",
amf_ue->suci);
r = nas_5gs_send_service_reject(amf_ue,
OGS_5GMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
ogs_expect(r == OGS_OK);
ogs_expect(r != OGS_ERROR);
OGS_FSM_TRAN(s, gmm_state_exception);
break;
}
gmm_cause = gmm_handle_service_request(
amf_ue, h, e->ngap.code, &nas_message->gmm.service_request);
if (gmm_cause != OGS_5GMM_CAUSE_REQUEST_ACCEPTED) {

View File

@ -36,6 +36,15 @@
#undef OGS_LOG_DOMAIN
#define OGS_LOG_DOMAIN __emm_log_domain
typedef enum {
EMM_COMMON_STATE_DEREGISTERED,
EMM_COMMON_STATE_REGISTERED,
} emm_common_state_e;
static void common_register_state(ogs_fsm_t *s, mme_event_t *e,
emm_common_state_e state);
void emm_state_initial(ogs_fsm_t *s, mme_event_t *e)
{
ogs_assert(s);
@ -52,7 +61,6 @@ void emm_state_final(ogs_fsm_t *s, mme_event_t *e)
mme_sm_debug(e);
}
static void common_register_state(ogs_fsm_t *s, mme_event_t *e);
void emm_state_de_registered(ogs_fsm_t *s, mme_event_t *e)
{
@ -75,7 +83,7 @@ void emm_state_de_registered(ogs_fsm_t *s, mme_event_t *e)
break;
case MME_EVENT_EMM_MESSAGE:
common_register_state(s, e);
common_register_state(s, e, EMM_COMMON_STATE_DEREGISTERED);
break;
case MME_EVENT_EMM_TIMER:
@ -124,7 +132,7 @@ void emm_state_registered(ogs_fsm_t *s, mme_event_t *e)
break;
case MME_EVENT_EMM_MESSAGE:
common_register_state(s, e);
common_register_state(s, e, EMM_COMMON_STATE_REGISTERED);
break;
case MME_EVENT_EMM_TIMER:
@ -222,7 +230,8 @@ void emm_state_registered(ogs_fsm_t *s, mme_event_t *e)
}
}
static void common_register_state(ogs_fsm_t *s, mme_event_t *e)
static void common_register_state(ogs_fsm_t *s, mme_event_t *e,
emm_common_state_e state)
{
int r, rv, xact_count = 0;
@ -561,6 +570,17 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e)
case OGS_NAS_EPS_EXTENDED_SERVICE_REQUEST:
ogs_info("[%s] Extended service request", mme_ue->imsi_bcd);
if (state != EMM_COMMON_STATE_REGISTERED) {
ogs_info("Service request : Not registered[%s]",
MME_UE_HAVE_IMSI(mme_ue) ? mme_ue->imsi_bcd : "Unknown IMSI");
r = nas_eps_send_service_reject(mme_ue,
OGS_NAS_EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
OGS_FSM_TRAN(s, &emm_state_exception);
}
rv = emm_handle_extended_service_request(
mme_ue, &message->emm.extended_service_request);
if (rv != OGS_OK) {