forked from acouzens/open5gs
[AMF] Disallow handling service requests unless UE is already registered
This commit is contained in:
parent
4d44b1843e
commit
10168f1f19
|
@ -33,6 +33,15 @@
|
||||||
#undef OGS_LOG_DOMAIN
|
#undef OGS_LOG_DOMAIN
|
||||||
#define OGS_LOG_DOMAIN __gmm_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)
|
void gmm_state_initial(ogs_fsm_t *s, amf_event_t *e)
|
||||||
{
|
{
|
||||||
ogs_assert(s);
|
ogs_assert(s);
|
||||||
|
@ -49,8 +58,6 @@ void gmm_state_final(ogs_fsm_t *s, amf_event_t *e)
|
||||||
amf_sm_debug(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)
|
void gmm_state_de_registered(ogs_fsm_t *s, amf_event_t *e)
|
||||||
{
|
{
|
||||||
amf_ue_t *amf_ue = NULL;
|
amf_ue_t *amf_ue = NULL;
|
||||||
|
@ -118,7 +125,7 @@ void gmm_state_de_registered(ogs_fsm_t *s, amf_event_t *e)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case AMF_EVENT_5GMM_MESSAGE:
|
case AMF_EVENT_5GMM_MESSAGE:
|
||||||
common_register_state(s, e);
|
common_register_state(s, e, GMM_COMMON_STATE_DEREGISTERED);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case AMF_EVENT_5GMM_TIMER:
|
case AMF_EVENT_5GMM_TIMER:
|
||||||
|
@ -469,7 +476,7 @@ void gmm_state_registered(ogs_fsm_t *s, amf_event_t *e)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case AMF_EVENT_5GMM_MESSAGE:
|
case AMF_EVENT_5GMM_MESSAGE:
|
||||||
common_register_state(s, e);
|
common_register_state(s, e, GMM_COMMON_STATE_REGISTERED);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case AMF_EVENT_5GMM_TIMER:
|
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;
|
int r, rv, xact_count = 0;
|
||||||
ogs_nas_5gmm_cause_t gmm_cause;
|
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:
|
case OGS_NAS_5GS_SERVICE_REQUEST:
|
||||||
ogs_info("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(
|
gmm_cause = gmm_handle_service_request(
|
||||||
amf_ue, h, e->ngap.code, &nas_message->gmm.service_request);
|
amf_ue, h, e->ngap.code, &nas_message->gmm.service_request);
|
||||||
if (gmm_cause != OGS_5GMM_CAUSE_REQUEST_ACCEPTED) {
|
if (gmm_cause != OGS_5GMM_CAUSE_REQUEST_ACCEPTED) {
|
||||||
|
|
|
@ -36,6 +36,15 @@
|
||||||
#undef OGS_LOG_DOMAIN
|
#undef OGS_LOG_DOMAIN
|
||||||
#define OGS_LOG_DOMAIN __emm_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)
|
void emm_state_initial(ogs_fsm_t *s, mme_event_t *e)
|
||||||
{
|
{
|
||||||
ogs_assert(s);
|
ogs_assert(s);
|
||||||
|
@ -52,7 +61,6 @@ void emm_state_final(ogs_fsm_t *s, mme_event_t *e)
|
||||||
mme_sm_debug(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)
|
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;
|
break;
|
||||||
|
|
||||||
case MME_EVENT_EMM_MESSAGE:
|
case MME_EVENT_EMM_MESSAGE:
|
||||||
common_register_state(s, e);
|
common_register_state(s, e, EMM_COMMON_STATE_DEREGISTERED);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MME_EVENT_EMM_TIMER:
|
case MME_EVENT_EMM_TIMER:
|
||||||
|
@ -124,7 +132,7 @@ void emm_state_registered(ogs_fsm_t *s, mme_event_t *e)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MME_EVENT_EMM_MESSAGE:
|
case MME_EVENT_EMM_MESSAGE:
|
||||||
common_register_state(s, e);
|
common_register_state(s, e, EMM_COMMON_STATE_REGISTERED);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MME_EVENT_EMM_TIMER:
|
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;
|
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:
|
case OGS_NAS_EPS_EXTENDED_SERVICE_REQUEST:
|
||||||
ogs_info("[%s] Extended service request", mme_ue->imsi_bcd);
|
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(
|
rv = emm_handle_extended_service_request(
|
||||||
mme_ue, &message->emm.extended_service_request);
|
mme_ue, &message->emm.extended_service_request);
|
||||||
if (rv != OGS_OK) {
|
if (rv != OGS_OK) {
|
||||||
|
|
Loading…
Reference in New Issue