[MME] Deliver ENB-UE over GTP XACT (#3388)

When a GTP transaction occurs, the ENB-UE associated with the MME-UE may change.
To address this, we have changed the structure to include the ENB-UE
in the GTP transaction, similar to AMF.

When a UEContextReleaseRequest and a Service Request occur simultaneously,
the ENB-UE in the Release Access Bearer Request/Response GTP transaction is
designed to persist even if the ENB-UE Context changes.
This commit is contained in:
Sukchan Lee
2024-08-15 23:00:13 +09:00
parent a7d594c2b7
commit 11e51846d7
17 changed files with 316 additions and 174 deletions

View File

@@ -119,6 +119,8 @@ typedef struct ogs_gtp_xact_s {
ogs_pool_id_t assoc_xact_id; /**< Associated GTP transaction ID */
void *pfcp_xact; /**< Associated PFCP transaction */
ogs_pool_id_t enb_ue_id;
#define OGS_GTP_MODIFY_TFT_UPDATE ((uint64_t)1<<0)
#define OGS_GTP_MODIFY_QOS_UPDATE ((uint64_t)1<<1)
uint64_t update_flags;

View File

@@ -34,7 +34,7 @@
static uint8_t emm_cause_from_access_control(mme_ue_t *mme_ue);
int emm_handle_attach_request(mme_ue_t *mme_ue,
int emm_handle_attach_request(enb_ue_t *enb_ue, mme_ue_t *mme_ue,
ogs_nas_eps_attach_request_t *attach_request, ogs_pkbuf_t *pkbuf)
{
int r;
@@ -44,7 +44,6 @@ int emm_handle_attach_request(mme_ue_t *mme_ue,
ogs_nas_eps_mobile_identity_guti_t *eps_mobile_identity_guti = NULL;
ogs_nas_eps_guti_t nas_guti;
enb_ue_t *enb_ue = NULL;
ogs_nas_eps_attach_type_t *eps_attach_type =
&attach_request->eps_attach_type;
ogs_nas_eps_mobile_identity_t *eps_mobile_identity =
@@ -55,8 +54,6 @@ int emm_handle_attach_request(mme_ue_t *mme_ue,
char imsi_bcd[OGS_MAX_IMSI_BCD_LEN+1];
ogs_assert(mme_ue);
enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id);
ogs_assert(enb_ue);
ogs_assert(esm_message_container);
@@ -251,7 +248,8 @@ int emm_handle_attach_request(mme_ue_t *mme_ue,
}
int emm_handle_attach_complete(
mme_ue_t *mme_ue, ogs_nas_eps_attach_complete_t *attach_complete)
enb_ue_t *enb_ue, mme_ue_t *mme_ue,
ogs_nas_eps_attach_complete_t *attach_complete)
{
int r, rv;
ogs_pkbuf_t *emmbuf = NULL;
@@ -269,6 +267,7 @@ int emm_handle_attach_complete(
struct tm gmt, local;
ogs_assert(mme_ue);
ogs_assert(enb_ue);
ogs_info(" IMSI[%s]", mme_ue->imsi_bcd);
@@ -356,8 +355,7 @@ int emm_handle_attach_complete(
return OGS_ERROR;
}
r = nas_eps_send_to_downlink_nas_transport(
enb_ue_find_by_id(mme_ue->enb_ue_id), emmbuf);
r = nas_eps_send_to_downlink_nas_transport(enb_ue, emmbuf);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
@@ -368,17 +366,16 @@ int emm_handle_attach_complete(
}
int emm_handle_identity_response(
mme_ue_t *mme_ue, ogs_nas_eps_identity_response_t *identity_response)
enb_ue_t *enb_ue, mme_ue_t *mme_ue,
ogs_nas_eps_identity_response_t *identity_response)
{
int r;
uint8_t emm_cause;
ogs_nas_mobile_identity_t *mobile_identity = NULL;
enb_ue_t *enb_ue = NULL;
ogs_assert(identity_response);
ogs_assert(mme_ue);
enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id);
ogs_assert(enb_ue);
mobile_identity = &identity_response->mobile_identity;
@@ -433,12 +430,14 @@ int emm_handle_identity_response(
}
int emm_handle_detach_request(
mme_ue_t *mme_ue, ogs_nas_eps_detach_request_from_ue_t *detach_request)
enb_ue_t *enb_ue, mme_ue_t *mme_ue,
ogs_nas_eps_detach_request_from_ue_t *detach_request)
{
ogs_nas_detach_type_t *detach_type = NULL;
ogs_assert(detach_request);
ogs_assert(mme_ue);
ogs_assert(enb_ue);
detach_type = &detach_request->detach_type;
@@ -507,12 +506,14 @@ int emm_handle_detach_request(
}
int emm_handle_service_request(
mme_ue_t *mme_ue, ogs_nas_eps_service_request_t *service_request)
enb_ue_t *enb_ue, mme_ue_t *mme_ue,
ogs_nas_eps_service_request_t *service_request)
{
ogs_nas_ksi_and_sequence_number_t *ksi_and_sequence_number =
&service_request->ksi_and_sequence_number;
ogs_assert(mme_ue);
ogs_assert(enb_ue);
/* Set EPS Service */
mme_ue->nas_eps.type = MME_EPS_TYPE_SERVICE_REQUEST;
@@ -578,8 +579,10 @@ bool emm_tau_request_ue_comes_from_gb_or_iu(const ogs_nas_eps_tracking_area_upda
}
}
int emm_handle_tau_request(mme_ue_t *mme_ue,
ogs_nas_eps_tracking_area_update_request_t *tau_request, ogs_pkbuf_t *pkbuf)
int emm_handle_tau_request(
enb_ue_t *enb_ue, mme_ue_t *mme_ue,
ogs_nas_eps_tracking_area_update_request_t *tau_request,
ogs_pkbuf_t *pkbuf)
{
int r;
int served_tai_index = 0;
@@ -591,10 +594,8 @@ int emm_handle_tau_request(mme_ue_t *mme_ue,
&tau_request->eps_update_type;
ogs_nas_eps_mobile_identity_t *eps_mobile_identity =
&tau_request->old_guti;
enb_ue_t *enb_ue = NULL;
ogs_assert(mme_ue);
enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id);
ogs_assert(enb_ue);
ogs_assert(pkbuf);
@@ -735,7 +736,8 @@ int emm_handle_tau_request(mme_ue_t *mme_ue,
return OGS_OK;
}
int emm_handle_extended_service_request(mme_ue_t *mme_ue,
int emm_handle_extended_service_request(
enb_ue_t *enb_ue, mme_ue_t *mme_ue,
ogs_nas_eps_extended_service_request_t *extended_service_request)
{
int r;
@@ -746,10 +748,8 @@ int emm_handle_extended_service_request(mme_ue_t *mme_ue,
ogs_nas_mobile_identity_t *mobile_identity =
&extended_service_request->m_tmsi;
ogs_nas_mobile_identity_tmsi_t *mobile_identity_tmsi = NULL;
enb_ue_t *enb_ue = NULL;
ogs_assert(mme_ue);
enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id);
ogs_assert(enb_ue);
/* Set Service Type */
@@ -816,12 +816,14 @@ int emm_handle_extended_service_request(mme_ue_t *mme_ue,
return OGS_OK;
}
int emm_handle_security_mode_complete(mme_ue_t *mme_ue,
int emm_handle_security_mode_complete(
enb_ue_t *enb_ue, mme_ue_t *mme_ue,
ogs_nas_eps_security_mode_complete_t *security_mode_complete)
{
ogs_nas_mobile_identity_t *imeisv = &security_mode_complete->imeisv;
ogs_assert(mme_ue);
ogs_assert(enb_ue);
if (security_mode_complete->presencemask &
OGS_NAS_EPS_SECURITY_MODE_COMMAND_IMEISV_REQUEST_PRESENT) {

View File

@@ -26,28 +26,36 @@
extern "C" {
#endif
int emm_handle_attach_request(mme_ue_t *mme_ue,
int emm_handle_attach_request(
enb_ue_t *enb_ue, mme_ue_t *mme_ue,
ogs_nas_eps_attach_request_t *attach_request, ogs_pkbuf_t *pkbuf);
int emm_handle_attach_complete(
mme_ue_t *mme_ue, ogs_nas_eps_attach_complete_t *attach_complete);
enb_ue_t *enb_ue, mme_ue_t *mme_ue,
ogs_nas_eps_attach_complete_t *attach_complete);
int emm_handle_identity_response(
mme_ue_t *mme_ue, ogs_nas_eps_identity_response_t *identity_response);
enb_ue_t *enb_ue, mme_ue_t *mme_ue,
ogs_nas_eps_identity_response_t *identity_response);
int emm_handle_detach_request(
mme_ue_t *mme_ue, ogs_nas_eps_detach_request_from_ue_t *detach_request);
enb_ue_t *enb_ue, mme_ue_t *mme_ue,
ogs_nas_eps_detach_request_from_ue_t *detach_request);
int emm_handle_service_request(
mme_ue_t *mme_ue, ogs_nas_eps_service_request_t *service_request);
enb_ue_t *enb_ue, mme_ue_t *mme_ue,
ogs_nas_eps_service_request_t *service_request);
int emm_handle_tau_request(mme_ue_t *mme_ue,
int emm_handle_tau_request(
enb_ue_t *enb_ue, mme_ue_t *mme_ue,
ogs_nas_eps_tracking_area_update_request_t *tau_request,
ogs_pkbuf_t *pkbuf);
int emm_handle_extended_service_request(mme_ue_t *mme_ue,
int emm_handle_extended_service_request(
enb_ue_t *enb_ue, mme_ue_t *mme_ue,
ogs_nas_eps_extended_service_request_t *extended_service_request);
int emm_handle_security_mode_complete(mme_ue_t *mme_ue,
int emm_handle_security_mode_complete(
enb_ue_t *enb_ue, mme_ue_t *mme_ue,
ogs_nas_eps_security_mode_complete_t *security_mode_complete);
bool emm_tau_request_ue_comes_from_gb_or_iu(

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com>
* Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com>
*
* This file is part of Open5GS.
*
@@ -263,7 +263,11 @@ void emm_state_registered(ogs_fsm_t *s, mme_event_t *e)
if (MME_P_TMSI_IS_AVAILABLE(mme_ue)) {
ogs_assert(OGS_OK == sgsap_send_detach_indication(mme_ue));
} else {
mme_send_delete_session_or_detach(mme_ue);
enb_ue_t *enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id);
if (enb_ue)
mme_send_delete_session_or_detach(enb_ue, mme_ue);
else
ogs_error("ENB-S1 Context has already been removed");
}
OGS_FSM_TRAN(s, &emm_state_de_registered);
@@ -328,7 +332,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e,
}
rv = emm_handle_service_request(
mme_ue, &message->emm.service_request);
enb_ue, mme_ue, &message->emm.service_request);
if (rv != OGS_OK) {
ogs_error("emm_handle_service_request() failed");
OGS_FSM_TRAN(s, emm_state_exception);
@@ -404,7 +408,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e,
ogs_info("Identity response");
CLEAR_MME_UE_TIMER(mme_ue->t3470);
rv = emm_handle_identity_response(mme_ue,
rv = emm_handle_identity_response(enb_ue, mme_ue,
&message->emm.identity_response);
if (rv != OGS_OK) {
ogs_error("emm_handle_identity_response() failed");
@@ -418,7 +422,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e,
break;
}
mme_gtp_send_delete_all_sessions(mme_ue,
mme_gtp_send_delete_all_sessions(enb_ue, mme_ue,
OGS_GTP_DELETE_SEND_AUTHENTICATION_REQUEST);
if (!MME_SESSION_RELEASE_PENDING(mme_ue) &&
@@ -433,7 +437,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e,
case OGS_NAS_EPS_ATTACH_REQUEST:
ogs_info("[%s] Attach request", mme_ue->imsi_bcd);
rv = emm_handle_attach_request(
mme_ue, &message->emm.attach_request, e->pkbuf);
enb_ue, mme_ue, &message->emm.attach_request, e->pkbuf);
if (rv != OGS_OK) {
ogs_error("emm_handle_attach_request() failed");
OGS_FSM_TRAN(s, emm_state_exception);
@@ -456,7 +460,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e,
*/
CLEAR_S1_CONTEXT(mme_ue);
mme_gtp_send_delete_all_sessions(mme_ue,
mme_gtp_send_delete_all_sessions(enb_ue, mme_ue,
OGS_GTP_DELETE_HANDLE_PDN_CONNECTIVITY_REQUEST);
if (!MME_SESSION_RELEASE_PENDING(mme_ue) &&
@@ -479,7 +483,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e,
OGS_FSM_TRAN(s, &emm_state_initial_context_setup);
} else {
mme_gtp_send_delete_all_sessions(mme_ue,
mme_gtp_send_delete_all_sessions(enb_ue, mme_ue,
OGS_GTP_DELETE_SEND_AUTHENTICATION_REQUEST);
if (!MME_SESSION_RELEASE_PENDING(mme_ue) &&
@@ -495,7 +499,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e,
case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST:
ogs_info("[%s] Tracking area update request", mme_ue->imsi_bcd);
rv = emm_handle_tau_request(mme_ue,
rv = emm_handle_tau_request(enb_ue, mme_ue,
&message->emm.tracking_area_update_request, e->pkbuf);
if (rv != OGS_OK) {
ogs_error("emm_handle_tau_request() failed");
@@ -693,7 +697,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e,
ogs_info("[%s] Extended service request", mme_ue->imsi_bcd);
rv = emm_handle_extended_service_request(
mme_ue, &message->emm.extended_service_request);
enb_ue, mme_ue, &message->emm.extended_service_request);
if (rv != OGS_OK) {
ogs_error("emm_handle_extended_service_request() failed");
OGS_FSM_TRAN(s, emm_state_exception);
@@ -838,7 +842,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e,
case OGS_NAS_EPS_DETACH_REQUEST:
ogs_info("[%s] Detach request", mme_ue->imsi_bcd);
rv = emm_handle_detach_request(
mme_ue, &message->emm.detach_request_from_ue);
enb_ue, mme_ue, &message->emm.detach_request_from_ue);
if (rv != OGS_OK) {
ogs_error("emm_handle_detach_request() failed");
OGS_FSM_TRAN(s, emm_state_exception);
@@ -873,7 +877,7 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e,
if (MME_P_TMSI_IS_AVAILABLE(mme_ue)) {
ogs_assert(OGS_OK == sgsap_send_detach_indication(mme_ue));
} else {
mme_send_delete_session_or_detach(mme_ue);
mme_send_delete_session_or_detach(enb_ue, mme_ue);
}
OGS_FSM_TRAN(s, &emm_state_de_registered);
@@ -1049,7 +1053,7 @@ void emm_state_authentication(ogs_fsm_t *s, mme_event_t *e)
case OGS_NAS_EPS_ATTACH_REQUEST:
ogs_warn("[%s] Attach request", mme_ue->imsi_bcd);
rv = emm_handle_attach_request(
mme_ue, &message->emm.attach_request, e->pkbuf);
enb_ue, mme_ue, &message->emm.attach_request, e->pkbuf);
if (rv != OGS_OK) {
ogs_error("emm_handle_attach_request() failed");
OGS_FSM_TRAN(s, emm_state_exception);
@@ -1066,7 +1070,7 @@ void emm_state_authentication(ogs_fsm_t *s, mme_event_t *e)
case OGS_NAS_EPS_DETACH_REQUEST:
ogs_warn("[%s] Detach request", mme_ue->imsi_bcd);
rv = emm_handle_detach_request(
mme_ue, &message->emm.detach_request_from_ue);
enb_ue, mme_ue, &message->emm.detach_request_from_ue);
if (rv != OGS_OK) {
ogs_error("emm_handle_detach_request() failed");
OGS_FSM_TRAN(s, emm_state_exception);
@@ -1101,7 +1105,7 @@ void emm_state_authentication(ogs_fsm_t *s, mme_event_t *e)
if (MME_P_TMSI_IS_AVAILABLE(mme_ue)) {
ogs_assert(OGS_OK == sgsap_send_detach_indication(mme_ue));
} else {
mme_send_delete_session_or_detach(mme_ue);
mme_send_delete_session_or_detach(enb_ue, mme_ue);
}
OGS_FSM_TRAN(s, &emm_state_de_registered);
@@ -1227,7 +1231,7 @@ void emm_state_security_mode(ogs_fsm_t *s, mme_event_t *e)
CLEAR_S1_CONTEXT(mme_ue);
emm_handle_security_mode_complete(
mme_ue, &message->emm.security_mode_complete);
enb_ue, mme_ue, &message->emm.security_mode_complete);
ogs_kdf_kenb(mme_ue->kasme, mme_ue->ul_count.i32,
mme_ue->kenb);
@@ -1257,7 +1261,7 @@ void emm_state_security_mode(ogs_fsm_t *s, mme_event_t *e)
case OGS_NAS_EPS_ATTACH_REQUEST:
ogs_warn("[%s] Attach request", mme_ue->imsi_bcd);
rv = emm_handle_attach_request(
mme_ue, &message->emm.attach_request, e->pkbuf);
enb_ue, mme_ue, &message->emm.attach_request, e->pkbuf);
if (rv != OGS_OK) {
ogs_error("emm_handle_attach_request() failed");
OGS_FSM_TRAN(s, emm_state_exception);
@@ -1282,7 +1286,7 @@ void emm_state_security_mode(ogs_fsm_t *s, mme_event_t *e)
case OGS_NAS_EPS_DETACH_REQUEST:
ogs_warn("[%s] Detach request", mme_ue->imsi_bcd);
rv = emm_handle_detach_request(
mme_ue, &message->emm.detach_request_from_ue);
enb_ue, mme_ue, &message->emm.detach_request_from_ue);
if (rv != OGS_OK) {
ogs_error("emm_handle_detach_request() failed");
OGS_FSM_TRAN(s, emm_state_exception);
@@ -1317,7 +1321,7 @@ void emm_state_security_mode(ogs_fsm_t *s, mme_event_t *e)
if (MME_P_TMSI_IS_AVAILABLE(mme_ue)) {
ogs_assert(OGS_OK == sgsap_send_detach_indication(mme_ue));
} else {
mme_send_delete_session_or_detach(mme_ue);
mme_send_delete_session_or_detach(enb_ue, mme_ue);
}
OGS_FSM_TRAN(s, &emm_state_de_registered);
@@ -1443,7 +1447,7 @@ void emm_state_initial_context_setup(ogs_fsm_t *s, mme_event_t *e)
CLEAR_MME_UE_TIMER(mme_ue->t3450);
rv = emm_handle_attach_complete(
mme_ue, &message->emm.attach_complete);
enb_ue, mme_ue, &message->emm.attach_complete);
if (rv != OGS_OK) {
ogs_error("emm_handle_attach_complete() failed "
"in emm_state_initial_context_setup");
@@ -1511,14 +1515,14 @@ void emm_state_initial_context_setup(ogs_fsm_t *s, mme_event_t *e)
case OGS_NAS_EPS_ATTACH_REQUEST:
ogs_warn("[%s] Attach request", mme_ue->imsi_bcd);
rv = emm_handle_attach_request(
mme_ue, &message->emm.attach_request, e->pkbuf);
enb_ue, mme_ue, &message->emm.attach_request, e->pkbuf);
if (rv != OGS_OK) {
ogs_error("emm_handle_attach_request() failed");
OGS_FSM_TRAN(s, emm_state_exception);
break;
}
mme_gtp_send_delete_all_sessions(mme_ue,
mme_gtp_send_delete_all_sessions(enb_ue, mme_ue,
OGS_GTP_DELETE_SEND_AUTHENTICATION_REQUEST);
if (!MME_SESSION_RELEASE_PENDING(mme_ue) &&
@@ -1537,7 +1541,7 @@ void emm_state_initial_context_setup(ogs_fsm_t *s, mme_event_t *e)
case OGS_NAS_EPS_DETACH_REQUEST:
ogs_warn("[%s] Detach request", mme_ue->imsi_bcd);
rv = emm_handle_detach_request(
mme_ue, &message->emm.detach_request_from_ue);
enb_ue, mme_ue, &message->emm.detach_request_from_ue);
if (rv != OGS_OK) {
ogs_error("emm_handle_detach_request() failed");
OGS_FSM_TRAN(s, emm_state_exception);
@@ -1572,7 +1576,7 @@ void emm_state_initial_context_setup(ogs_fsm_t *s, mme_event_t *e)
if (MME_P_TMSI_IS_AVAILABLE(mme_ue)) {
ogs_assert(OGS_OK == sgsap_send_detach_indication(mme_ue));
} else {
mme_send_delete_session_or_detach(mme_ue);
mme_send_delete_session_or_detach(enb_ue, mme_ue);
}
OGS_FSM_TRAN(s, &emm_state_de_registered);
@@ -1671,7 +1675,7 @@ void emm_state_exception(ogs_fsm_t *s, mme_event_t *e)
case OGS_NAS_EPS_ATTACH_REQUEST:
ogs_warn("[%s] Attach request", mme_ue->imsi_bcd);
rv = emm_handle_attach_request(
mme_ue, &message->emm.attach_request, e->pkbuf);
enb_ue, mme_ue, &message->emm.attach_request, e->pkbuf);
if (rv != OGS_OK) {
ogs_error("emm_handle_attach_request() failed");
OGS_FSM_TRAN(s, emm_state_exception);
@@ -1696,7 +1700,7 @@ void emm_state_exception(ogs_fsm_t *s, mme_event_t *e)
*/
CLEAR_S1_CONTEXT(mme_ue);
mme_gtp_send_delete_all_sessions(mme_ue,
mme_gtp_send_delete_all_sessions(enb_ue, mme_ue,
OGS_GTP_DELETE_HANDLE_PDN_CONNECTIVITY_REQUEST);
if (!MME_SESSION_RELEASE_PENDING(mme_ue) &&
@@ -1719,7 +1723,7 @@ void emm_state_exception(ogs_fsm_t *s, mme_event_t *e)
OGS_FSM_TRAN(s, &emm_state_initial_context_setup);
} else {
mme_gtp_send_delete_all_sessions(mme_ue,
mme_gtp_send_delete_all_sessions(enb_ue, mme_ue,
OGS_GTP_DELETE_SEND_AUTHENTICATION_REQUEST);
if (!MME_SESSION_RELEASE_PENDING(mme_ue) &&

View File

@@ -28,8 +28,10 @@
#undef OGS_LOG_DOMAIN
#define OGS_LOG_DOMAIN __esm_log_domain
int esm_handle_pdn_connectivity_request(mme_bearer_t *bearer,
ogs_nas_eps_pdn_connectivity_request_t *req, int create_action)
int esm_handle_pdn_connectivity_request(
enb_ue_t *enb_ue, mme_bearer_t *bearer,
ogs_nas_eps_pdn_connectivity_request_t *req,
int create_action)
{
int r;
mme_ue_t *mme_ue = NULL;
@@ -41,6 +43,7 @@ int esm_handle_pdn_connectivity_request(mme_bearer_t *bearer,
ogs_assert(sess);
mme_ue = mme_ue_find_by_id(sess->mme_ue_id);
ogs_assert(mme_ue);
ogs_assert(enb_ue);
ogs_assert(req);
@@ -159,7 +162,7 @@ int esm_handle_pdn_connectivity_request(mme_bearer_t *bearer,
}
ogs_assert(OGS_OK ==
mme_gtp_send_create_session_request(sess, create_action));
mme_gtp_send_create_session_request(enb_ue, sess, create_action));
} else {
ogs_error("No APN");
r = nas_eps_send_pdn_connectivity_reject(
@@ -172,7 +175,8 @@ int esm_handle_pdn_connectivity_request(mme_bearer_t *bearer,
return OGS_OK;
}
int esm_handle_information_response(mme_sess_t *sess,
int esm_handle_information_response(
enb_ue_t *enb_ue, mme_sess_t *sess,
ogs_nas_eps_esm_information_response_t *rsp)
{
int r;
@@ -181,6 +185,7 @@ int esm_handle_information_response(mme_sess_t *sess,
ogs_assert(sess);
mme_ue = mme_ue_find_by_id(sess->mme_ue_id);
ogs_assert(mme_ue);
ogs_assert(enb_ue);
ogs_assert(rsp);
@@ -249,7 +254,7 @@ int esm_handle_information_response(mme_sess_t *sess,
} else {
ogs_assert(OGS_OK ==
mme_gtp_send_create_session_request(
sess, OGS_GTP_CREATE_IN_ATTACH_REQUEST));
enb_ue, sess, OGS_GTP_CREATE_IN_ATTACH_REQUEST));
}
} else {
if (rsp->access_point_name.length)
@@ -269,7 +274,7 @@ int esm_handle_information_response(mme_sess_t *sess,
}
int esm_handle_bearer_resource_allocation_request(
mme_bearer_t *bearer, ogs_nas_eps_message_t *message)
enb_ue_t *enb_ue, mme_bearer_t *bearer, ogs_nas_eps_message_t *message)
{
int r;
mme_ue_t *mme_ue = NULL;
@@ -280,6 +285,7 @@ int esm_handle_bearer_resource_allocation_request(
ogs_assert(sess);
mme_ue = mme_ue_find_by_id(sess->mme_ue_id);
ogs_assert(mme_ue);
ogs_assert(enb_ue);
r = nas_eps_send_bearer_resource_allocation_reject(
mme_ue, sess->pti, OGS_NAS_ESM_CAUSE_NETWORK_FAILURE);
@@ -290,13 +296,14 @@ int esm_handle_bearer_resource_allocation_request(
}
int esm_handle_bearer_resource_modification_request(
mme_bearer_t *bearer, ogs_nas_eps_message_t *message)
enb_ue_t *enb_ue, mme_bearer_t *bearer, ogs_nas_eps_message_t *message)
{
mme_ue_t *mme_ue = NULL;
ogs_assert(bearer);
mme_ue = mme_ue_find_by_id(bearer->mme_ue_id);
ogs_assert(mme_ue);
ogs_assert(enb_ue);
ogs_assert(OGS_OK ==
mme_gtp_send_bearer_resource_command(bearer, message));

View File

@@ -26,15 +26,17 @@
extern "C" {
#endif
int esm_handle_pdn_connectivity_request(mme_bearer_t *bearer,
int esm_handle_pdn_connectivity_request(
enb_ue_t *enb_ue, mme_bearer_t *bearer,
ogs_nas_eps_pdn_connectivity_request_t *req,
int create_action);
int esm_handle_information_response(mme_sess_t *sess,
int esm_handle_information_response(
enb_ue_t *enb_ue, mme_sess_t *sess,
ogs_nas_eps_esm_information_response_t *rsp);
int esm_handle_bearer_resource_allocation_request(
mme_bearer_t *bearer, ogs_nas_eps_message_t *message);
enb_ue_t *enb_ue, mme_bearer_t *bearer, ogs_nas_eps_message_t *message);
int esm_handle_bearer_resource_modification_request(
mme_bearer_t *bearer, ogs_nas_eps_message_t *message);
enb_ue_t *enb_ue, mme_bearer_t *bearer, ogs_nas_eps_message_t *message);
#ifdef __cplusplus
}

View File

@@ -70,8 +70,8 @@ void esm_state_inactive(ogs_fsm_t *s, mme_event_t *e)
{
int r, rv;
mme_ue_t *mme_ue = NULL;
sgw_ue_t *sgw_ue = NULL;
enb_ue_t *enb_ue = NULL;
sgw_ue_t *sgw_ue = NULL;
mme_sess_t *sess = NULL;
mme_bearer_t *bearer = NULL;
ogs_nas_eps_message_t *message = NULL;
@@ -102,13 +102,16 @@ void esm_state_inactive(ogs_fsm_t *s, mme_event_t *e)
message = e->nas_message;
ogs_assert(message);
enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id);
ogs_assert(enb_ue);
switch (message->esm.h.message_type) {
case OGS_NAS_EPS_PDN_CONNECTIVITY_REQUEST:
ogs_debug("PDN Connectivity request");
ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]",
mme_ue->imsi_bcd, sess->pti, bearer->ebi);
rv = esm_handle_pdn_connectivity_request(
bearer, &message->esm.pdn_connectivity_request,
enb_ue, bearer, &message->esm.pdn_connectivity_request,
e->create_action);
if (rv != OGS_OK) {
OGS_FSM_TRAN(s, esm_state_exception);
@@ -124,7 +127,7 @@ void esm_state_inactive(ogs_fsm_t *s, mme_event_t *e)
ogs_assert(sgw_ue);
ogs_assert(OGS_OK ==
mme_gtp_send_delete_session_request(sgw_ue, sess,
mme_gtp_send_delete_session_request(enb_ue, sgw_ue, sess,
OGS_GTP_DELETE_SEND_DEACTIVATE_BEARER_CONTEXT_REQUEST));
} else {
r = nas_eps_send_deactivate_bearer_context_request(bearer);
@@ -186,7 +189,7 @@ void esm_state_inactive(ogs_fsm_t *s, mme_event_t *e)
}
rv = esm_handle_information_response(
sess, &message->esm.esm_information_response);
enb_ue, sess, &message->esm.esm_information_response);
if (rv != OGS_OK) {
OGS_FSM_TRAN(s, esm_state_exception);
break;
@@ -203,7 +206,7 @@ void esm_state_inactive(ogs_fsm_t *s, mme_event_t *e)
ogs_list_add(&mme_ue->bearer_to_modify_list,
&bearer->to_modify_node);
ogs_assert(OGS_OK ==
mme_gtp_send_modify_bearer_request(mme_ue, 0, 0));
mme_gtp_send_modify_bearer_request(enb_ue, mme_ue, 0, 0));
}
nas_eps_send_activate_all_dedicated_bearers(bearer);
@@ -278,6 +281,7 @@ void esm_state_active(ogs_fsm_t *s, mme_event_t *e)
{
int r, rv;
mme_ue_t *mme_ue = NULL;
enb_ue_t *enb_ue = NULL;
sgw_ue_t *sgw_ue = NULL;
mme_sess_t *sess = NULL;
mme_bearer_t *bearer = NULL;
@@ -304,13 +308,16 @@ void esm_state_active(ogs_fsm_t *s, mme_event_t *e)
message = e->nas_message;
ogs_assert(message);
enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id);
ogs_assert(enb_ue);
switch (message->esm.h.message_type) {
case OGS_NAS_EPS_PDN_CONNECTIVITY_REQUEST:
ogs_debug("PDN Connectivity request");
ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]",
mme_ue->imsi_bcd, sess->pti, bearer->ebi);
rv = esm_handle_pdn_connectivity_request(
bearer, &message->esm.pdn_connectivity_request,
enb_ue, bearer, &message->esm.pdn_connectivity_request,
e->create_action);
if (rv != OGS_OK) {
OGS_FSM_TRAN(s, esm_state_exception);
@@ -328,7 +335,7 @@ void esm_state_active(ogs_fsm_t *s, mme_event_t *e)
ogs_assert(sgw_ue);
ogs_assert(OGS_OK ==
mme_gtp_send_delete_session_request(sgw_ue, sess,
mme_gtp_send_delete_session_request(enb_ue, sgw_ue, sess,
OGS_GTP_DELETE_SEND_DEACTIVATE_BEARER_CONTEXT_REQUEST));
} else {
r = nas_eps_send_deactivate_bearer_context_request(bearer);
@@ -364,13 +371,15 @@ void esm_state_active(ogs_fsm_t *s, mme_event_t *e)
ogs_debug("Bearer resource allocation request");
ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]",
mme_ue->imsi_bcd, sess->pti, bearer->ebi);
esm_handle_bearer_resource_allocation_request(bearer, message);
esm_handle_bearer_resource_allocation_request(
enb_ue, bearer, message);
break;
case OGS_NAS_EPS_BEARER_RESOURCE_MODIFICATION_REQUEST:
ogs_debug("Bearer resource modification request");
ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]",
mme_ue->imsi_bcd, sess->pti, bearer->ebi);
esm_handle_bearer_resource_modification_request(bearer, message);
esm_handle_bearer_resource_modification_request(
enb_ue, bearer, message);
break;
default:
ogs_error("Unknown message(type:%d)",
@@ -388,6 +397,7 @@ void esm_state_pdn_will_disconnect(ogs_fsm_t *s, mme_event_t *e)
{
int rv;
mme_ue_t *mme_ue = NULL;
enb_ue_t *enb_ue = NULL;
mme_sess_t *sess = NULL;
mme_bearer_t *bearer = NULL;
ogs_nas_eps_message_t *message = NULL;
@@ -413,6 +423,9 @@ void esm_state_pdn_will_disconnect(ogs_fsm_t *s, mme_event_t *e)
message = e->nas_message;
ogs_assert(message);
enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id);
ogs_assert(enb_ue);
switch (message->esm.h.message_type) {
case OGS_NAS_EPS_DEACTIVATE_EPS_BEARER_CONTEXT_ACCEPT:
ogs_debug("[D] Deactivate EPS bearer "
@@ -426,7 +439,7 @@ void esm_state_pdn_will_disconnect(ogs_fsm_t *s, mme_event_t *e)
ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]",
mme_ue->imsi_bcd, sess->pti, bearer->ebi);
rv = esm_handle_pdn_connectivity_request(
bearer, &message->esm.pdn_connectivity_request,
enb_ue, bearer, &message->esm.pdn_connectivity_request,
e->create_action);
if (rv != OGS_OK) {
OGS_FSM_TRAN(s, esm_state_exception);

View File

@@ -424,7 +424,8 @@ int mme_gn_handle_sgsn_context_response(
rv = mme_gtp1_send_sgsn_context_ack(mme_ue, OGS_GTP1_CAUSE_REQUEST_ACCEPTED, xact);
mme_gtp_send_create_session_request(sess, OGS_GTP_CREATE_IN_TRACKING_AREA_UPDATE);
mme_gtp_send_create_session_request(
enb_ue, sess, OGS_GTP_CREATE_IN_TRACKING_AREA_UPDATE);
return ret_cause;

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com>
* Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com>
*
* This file is part of Open5GS.
*
@@ -163,6 +163,7 @@ static void timeout(ogs_gtp_xact_t *xact, void *data)
}
ogs_assert(mme_ue);
enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id);
switch (type) {
case OGS_GTP2_DELETE_SESSION_REQUEST_TYPE:
@@ -177,7 +178,6 @@ static void timeout(ogs_gtp_xact_t *xact, void *data)
*/
CLEAR_SESSION_CONTEXT(mme_ue);
enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id);
if (enb_ue) {
r = s1ap_send_ue_context_release_command(enb_ue,
S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release,
@@ -192,7 +192,10 @@ static void timeout(ogs_gtp_xact_t *xact, void *data)
/* Nothing to do */
break;
default:
mme_send_delete_session_or_mme_ue_context_release(mme_ue);
if (enb_ue)
mme_send_delete_session_or_mme_ue_context_release(enb_ue, mme_ue);
else
ogs_error("No S1 Context");
break;
}
@@ -258,7 +261,8 @@ void mme_gtp_close(void)
ogs_socknode_remove_all(&ogs_gtp_self()->gtpc_list6);
}
int mme_gtp_send_create_session_request(mme_sess_t *sess, int create_action)
int mme_gtp_send_create_session_request(
enb_ue_t *enb_ue, mme_sess_t *sess, int create_action)
{
int rv;
ogs_gtp2_header_t h;
@@ -267,6 +271,7 @@ int mme_gtp_send_create_session_request(mme_sess_t *sess, int create_action)
mme_ue_t *mme_ue = NULL;
sgw_ue_t *sgw_ue = NULL;
ogs_assert(enb_ue);
mme_ue = mme_ue_find_by_id(sess->mme_ue_id);
ogs_assert(mme_ue);
sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id);
@@ -296,6 +301,7 @@ int mme_gtp_send_create_session_request(mme_sess_t *sess, int create_action)
}
xact->create_action = create_action;
xact->local_teid = mme_ue->gn.mme_gn_teid;
xact->enb_ue_id = enb_ue->id;
rv = ogs_gtp_xact_commit(xact);
ogs_expect(rv == OGS_OK);
@@ -304,7 +310,8 @@ int mme_gtp_send_create_session_request(mme_sess_t *sess, int create_action)
}
int mme_gtp_send_modify_bearer_request(
mme_ue_t *mme_ue, int uli_presence, int modify_action)
enb_ue_t *enb_ue, mme_ue_t *mme_ue,
int uli_presence, int modify_action)
{
int rv;
@@ -314,6 +321,7 @@ int mme_gtp_send_modify_bearer_request(
ogs_gtp2_header_t h;
ogs_pkbuf_t *pkbuf = NULL;
ogs_assert(enb_ue);
ogs_assert(mme_ue);
sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id);
ogs_assert(sgw_ue);
@@ -337,6 +345,7 @@ int mme_gtp_send_modify_bearer_request(
}
xact->modify_action = modify_action;
xact->local_teid = mme_ue->gn.mme_gn_teid;
xact->enb_ue_id = enb_ue->id;
rv = ogs_gtp_xact_commit(xact);
ogs_expect(rv == OGS_OK);
@@ -345,7 +354,7 @@ int mme_gtp_send_modify_bearer_request(
}
int mme_gtp_send_delete_session_request(
sgw_ue_t *sgw_ue, mme_sess_t *sess, int action)
enb_ue_t *enb_ue, sgw_ue_t *sgw_ue, mme_sess_t *sess, int action)
{
int rv;
ogs_pkbuf_t *s11buf = NULL;
@@ -353,6 +362,7 @@ int mme_gtp_send_delete_session_request(
ogs_gtp_xact_t *xact = NULL;
mme_ue_t *mme_ue = NULL;
ogs_assert(enb_ue);
ogs_assert(action);
ogs_assert(sess);
mme_ue = mme_ue_find_by_id(sess->mme_ue_id);
@@ -378,6 +388,7 @@ int mme_gtp_send_delete_session_request(
}
xact->delete_action = action;
xact->local_teid = mme_ue->gn.mme_gn_teid;
xact->enb_ue_id = enb_ue->id;
ogs_debug("delete_session_request - xact:%p, sess:%p", xact, sess);
rv = ogs_gtp_xact_commit(xact);
@@ -386,11 +397,13 @@ int mme_gtp_send_delete_session_request(
return rv;
}
void mme_gtp_send_delete_all_sessions(mme_ue_t *mme_ue, int action)
void mme_gtp_send_delete_all_sessions(
enb_ue_t *enb_ue, mme_ue_t *mme_ue, int action)
{
mme_sess_t *sess = NULL, *next_sess = NULL;
sgw_ue_t *sgw_ue = NULL;
ogs_assert(enb_ue);
ogs_assert(mme_ue);
sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id);
ogs_assert(sgw_ue);
@@ -398,7 +411,7 @@ void mme_gtp_send_delete_all_sessions(mme_ue_t *mme_ue, int action)
ogs_list_for_each_safe(&mme_ue->sess_list, next_sess, sess) {
if (MME_HAVE_SGW_S1U_PATH(sess)) {
mme_gtp_send_delete_session_request(sgw_ue, sess, action);
mme_gtp_send_delete_session_request(enb_ue, sgw_ue, sess, action);
} else {
MME_SESS_CLEAR(sess);
}
@@ -573,7 +586,8 @@ int mme_gtp_send_delete_bearer_response(
return rv;
}
int mme_gtp_send_release_access_bearers_request(mme_ue_t *mme_ue, int action)
int mme_gtp_send_release_access_bearers_request(
enb_ue_t *enb_ue, mme_ue_t *mme_ue, int action)
{
int rv;
ogs_gtp2_header_t h;
@@ -581,6 +595,7 @@ int mme_gtp_send_release_access_bearers_request(mme_ue_t *mme_ue, int action)
ogs_gtp_xact_t *xact = NULL;
sgw_ue_t *sgw_ue = NULL;
ogs_assert(enb_ue);
ogs_assert(action);
ogs_assert(mme_ue);
sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id);
@@ -605,6 +620,7 @@ int mme_gtp_send_release_access_bearers_request(mme_ue_t *mme_ue, int action)
}
xact->release_action = action;
xact->local_teid = mme_ue->gn.mme_gn_teid;
xact->enb_ue_id = enb_ue->id;
rv = ogs_gtp_xact_commit(xact);
ogs_expect(rv == OGS_OK);
@@ -645,7 +661,8 @@ void mme_gtp_send_release_all_ue_in_enb(mme_enb_t *enb, int action)
}
ogs_assert(OGS_OK ==
mme_gtp_send_release_access_bearers_request(mme_ue, action));
mme_gtp_send_release_access_bearers_request(
enb_ue, mme_ue, action));
} else {
ogs_warn("mme_gtp_send_release_all_ue_in_enb()");
ogs_warn(" ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d] Action[%d]",
@@ -711,7 +728,7 @@ int mme_gtp_send_downlink_data_notification_ack(
}
int mme_gtp_send_create_indirect_data_forwarding_tunnel_request(
mme_ue_t *mme_ue)
enb_ue_t *enb_ue, mme_ue_t *mme_ue)
{
int rv;
ogs_gtp2_header_t h;
@@ -719,6 +736,7 @@ int mme_gtp_send_create_indirect_data_forwarding_tunnel_request(
ogs_gtp_xact_t *xact = NULL;
sgw_ue_t *sgw_ue = NULL;
ogs_assert(enb_ue);
ogs_assert(mme_ue);
sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id);
ogs_assert(sgw_ue);
@@ -743,6 +761,7 @@ int mme_gtp_send_create_indirect_data_forwarding_tunnel_request(
return OGS_ERROR;
}
xact->local_teid = mme_ue->gn.mme_gn_teid;
xact->enb_ue_id = enb_ue->id;
rv = ogs_gtp_xact_commit(xact);
ogs_expect(rv == OGS_OK);
@@ -751,7 +770,7 @@ int mme_gtp_send_create_indirect_data_forwarding_tunnel_request(
}
int mme_gtp_send_delete_indirect_data_forwarding_tunnel_request(
mme_ue_t *mme_ue, int action)
enb_ue_t *enb_ue, mme_ue_t *mme_ue, int action)
{
int rv;
ogs_gtp2_header_t h;
@@ -759,6 +778,7 @@ int mme_gtp_send_delete_indirect_data_forwarding_tunnel_request(
ogs_gtp_xact_t *xact = NULL;
sgw_ue_t *sgw_ue = NULL;
ogs_assert(enb_ue);
ogs_assert(action);
ogs_assert(mme_ue);
sgw_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id);
@@ -784,6 +804,7 @@ int mme_gtp_send_delete_indirect_data_forwarding_tunnel_request(
}
xact->delete_indirect_action = action;
xact->local_teid = mme_ue->gn.mme_gn_teid;
xact->enb_ue_id = enb_ue->id;
rv = ogs_gtp_xact_commit(xact);
ogs_expect(rv == OGS_OK);

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com>
* Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com>
*
* This file is part of Open5GS.
*
@@ -29,28 +29,32 @@ extern "C" {
int mme_gtp_open(void);
void mme_gtp_close(void);
int mme_gtp_send_create_session_request(mme_sess_t *sess, int create_action);
int mme_gtp_send_create_session_request(
enb_ue_t *enb_ue, mme_sess_t *sess, int create_action);
int mme_gtp_send_modify_bearer_request(
mme_ue_t *mme_ue, int uli_presence, int modify_action);
enb_ue_t *enb_ue, mme_ue_t *mme_ue,
int uli_presence, int modify_action);
int mme_gtp_send_delete_session_request(
sgw_ue_t *sgw_ue, mme_sess_t *sess, int action);
void mme_gtp_send_delete_all_sessions(mme_ue_t *mme_ue, int action);
enb_ue_t *enb_ue, sgw_ue_t *sgw_ue, mme_sess_t *sess, int action);
void mme_gtp_send_delete_all_sessions(
enb_ue_t *enb_ue, mme_ue_t *mme_ue, int action);
int mme_gtp_send_create_bearer_response(
mme_bearer_t *bearer, uint8_t cause_value);
int mme_gtp_send_update_bearer_response(
mme_bearer_t *bearer, uint8_t cause_value);
int mme_gtp_send_delete_bearer_response(
mme_bearer_t *bearer, uint8_t cause_value);
int mme_gtp_send_release_access_bearers_request(mme_ue_t *mme_ue, int action);
int mme_gtp_send_release_access_bearers_request(
enb_ue_t *enb_ue, mme_ue_t *mme_ue, int action);
void mme_gtp_send_release_all_ue_in_enb(mme_enb_t *enb, int action);
int mme_gtp_send_downlink_data_notification_ack(
mme_bearer_t *bearer, uint8_t cause_value);
int mme_gtp_send_create_indirect_data_forwarding_tunnel_request(
mme_ue_t *mme_ue);
enb_ue_t *enb_ue, mme_ue_t *mme_ue);
int mme_gtp_send_delete_indirect_data_forwarding_tunnel_request(
mme_ue_t *mme_ue, int action);
enb_ue_t *enb_ue, mme_ue_t *mme_ue, int action);
int mme_gtp_send_bearer_resource_command(
mme_bearer_t *bearer, ogs_nas_eps_message_t *nas_message);

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com>
* Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com>
*
* This file is part of Open5GS.
*
@@ -25,10 +25,11 @@
#include "mme-fd-path.h"
#include "mme-sm.h"
void mme_send_delete_session_or_detach(mme_ue_t *mme_ue)
void mme_send_delete_session_or_detach(enb_ue_t *enb_ue, mme_ue_t *mme_ue)
{
int r, xact_count;
ogs_assert(mme_ue);
ogs_assert(enb_ue);
xact_count = mme_ue_xact_count(mme_ue, OGS_GTP_LOCAL_ORIGINATOR);
@@ -36,7 +37,7 @@ void mme_send_delete_session_or_detach(mme_ue_t *mme_ue)
case MME_DETACH_TYPE_REQUEST_FROM_UE:
ogs_debug("Detach Request from UE");
mme_gtp_send_delete_all_sessions(
mme_ue, OGS_GTP_DELETE_SEND_DETACH_ACCEPT);
enb_ue, mme_ue, OGS_GTP_DELETE_SEND_DETACH_ACCEPT);
if (!MME_SESSION_RELEASE_PENDING(mme_ue) &&
mme_ue_xact_count(mme_ue, OGS_GTP_LOCAL_ORIGINATOR) ==
@@ -61,7 +62,8 @@ void mme_send_delete_session_or_detach(mme_ue_t *mme_ue)
*/
case MME_DETACH_TYPE_HSS_EXPLICIT:
ogs_debug("Explicit HSS Detach");
mme_gtp_send_delete_all_sessions(mme_ue, OGS_GTP_DELETE_NO_ACTION);
mme_gtp_send_delete_all_sessions(
enb_ue, mme_ue, OGS_GTP_DELETE_NO_ACTION);
break;
/* MME Implicit Detach, ie: Lost Communication
@@ -70,7 +72,7 @@ void mme_send_delete_session_or_detach(mme_ue_t *mme_ue)
*/
case MME_DETACH_TYPE_MME_IMPLICIT:
ogs_warn("[%s] Implicit MME Detach", mme_ue->imsi_bcd);
mme_gtp_send_delete_all_sessions(mme_ue,
mme_gtp_send_delete_all_sessions(enb_ue, mme_ue,
OGS_GTP_DELETE_SEND_RELEASE_WITH_UE_CONTEXT_REMOVE);
if (!MME_SESSION_RELEASE_PENDING(mme_ue) &&
@@ -106,7 +108,7 @@ void mme_send_delete_session_or_detach(mme_ue_t *mme_ue)
*/
case MME_DETACH_TYPE_HSS_IMPLICIT:
ogs_debug("Implicit HSS Detach");
mme_gtp_send_delete_all_sessions(mme_ue,
mme_gtp_send_delete_all_sessions(enb_ue, mme_ue,
OGS_GTP_DELETE_SEND_RELEASE_WITH_UE_CONTEXT_REMOVE);
break;
@@ -116,21 +118,22 @@ void mme_send_delete_session_or_detach(mme_ue_t *mme_ue)
}
}
void mme_send_delete_session_or_mme_ue_context_release(mme_ue_t *mme_ue)
void mme_send_delete_session_or_mme_ue_context_release(
enb_ue_t *enb_ue, mme_ue_t *mme_ue)
{
int r, xact_count = 0;
ogs_assert(mme_ue);
ogs_assert(enb_ue);
xact_count = mme_ue_xact_count(mme_ue, OGS_GTP_LOCAL_ORIGINATOR);
mme_gtp_send_delete_all_sessions(mme_ue,
mme_gtp_send_delete_all_sessions(enb_ue, mme_ue,
OGS_GTP_DELETE_SEND_RELEASE_WITH_UE_CONTEXT_REMOVE);
if (!MME_SESSION_RELEASE_PENDING(mme_ue) &&
mme_ue_xact_count(mme_ue, OGS_GTP_LOCAL_ORIGINATOR) ==
xact_count) {
enb_ue_t *enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id);
if (enb_ue) {
r = s1ap_send_ue_context_release_command(enb_ue,
S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release,
@@ -154,7 +157,8 @@ void mme_send_release_access_bearer_or_ue_context_release(enb_ue_t *enb_ue)
ogs_debug("[%s] Release access bearer request", mme_ue->imsi_bcd);
ogs_assert(OGS_OK ==
mme_gtp_send_release_access_bearers_request(
mme_ue, OGS_GTP_RELEASE_SEND_UE_CONTEXT_RELEASE_COMMAND));
enb_ue, mme_ue,
OGS_GTP_RELEASE_SEND_UE_CONTEXT_RELEASE_COMMAND));
} else {
ogs_debug("No UE Context");
r = s1ap_send_ue_context_release_command(enb_ue,
@@ -300,7 +304,11 @@ void mme_send_after_paging(mme_ue_t *mme_ue, bool failed)
if (MME_P_TMSI_IS_AVAILABLE(mme_ue)) {
ogs_assert(OGS_OK == sgsap_send_detach_indication(mme_ue));
} else {
mme_send_delete_session_or_detach(mme_ue);
enb_ue_t *enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id);
if (enb_ue)
mme_send_delete_session_or_detach(enb_ue, mme_ue);
else
ogs_error("ENB-S1 Context has already been removed");
}
}
break;

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com>
* Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com>
*
* This file is part of Open5GS.
*
@@ -26,8 +26,9 @@
extern "C" {
#endif
void mme_send_delete_session_or_detach(mme_ue_t *mme_ue);
void mme_send_delete_session_or_mme_ue_context_release(mme_ue_t *mme_ue);
void mme_send_delete_session_or_detach(enb_ue_t *enb_ue, mme_ue_t *mme_ue);
void mme_send_delete_session_or_mme_ue_context_release(
enb_ue_t *enb_ue, mme_ue_t *mme_ue);
void mme_send_release_access_bearer_or_ue_context_release(enb_ue_t *enb_ue);
void mme_send_after_paging(mme_ue_t *mme_ue, bool failed);

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com>
* Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com>
*
* This file is part of Open5GS.
*
@@ -209,6 +209,7 @@ void mme_s11_handle_create_session_response(
sess = mme_sess_find_by_id(OGS_POINTER_TO_UINT(xact->data));
if (sess)
mme_ue = mme_ue_find_by_id(sess->mme_ue_id);
enb_ue = enb_ue_find_by_id(xact->enb_ue_id);
rv = ogs_gtp_xact_commit(xact);
if (rv != OGS_OK) {
@@ -221,13 +222,17 @@ void mme_s11_handle_create_session_response(
return;
}
if (!enb_ue) {
ogs_error("ENB-S1 Context has already been removed");
return;
}
if (!mme_ue) {
ogs_error("MME-UE Context has already been removed");
return;
}
source_ue = sgw_ue_find_by_id(mme_ue->sgw_ue_id);
ogs_assert(source_ue);
enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id);
if (create_action == OGS_GTP_CREATE_IN_PATH_SWITCH_REQUEST) {
target_ue = sgw_ue_find_by_id(source_ue->target_ue_id);
@@ -267,7 +272,7 @@ void mme_s11_handle_create_session_response(
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
mme_send_delete_session_or_mme_ue_context_release(mme_ue);
mme_send_delete_session_or_mme_ue_context_release(enb_ue, mme_ue);
return;
}
@@ -325,7 +330,7 @@ void mme_s11_handle_create_session_response(
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
mme_send_delete_session_or_mme_ue_context_release(mme_ue);
mme_send_delete_session_or_mme_ue_context_release(enb_ue, mme_ue);
return;
}
@@ -357,7 +362,7 @@ void mme_s11_handle_create_session_response(
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
mme_send_delete_session_or_mme_ue_context_release(mme_ue);
mme_send_delete_session_or_mme_ue_context_release(enb_ue, mme_ue);
return;
}
}
@@ -377,7 +382,7 @@ void mme_s11_handle_create_session_response(
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
}
mme_send_delete_session_or_mme_ue_context_release(mme_ue);
mme_send_delete_session_or_mme_ue_context_release(enb_ue, mme_ue);
return;
}
@@ -416,7 +421,7 @@ void mme_s11_handle_create_session_response(
bearer = mme_bearer_find_by_ue_ebi(mme_ue,
rsp->bearer_contexts_created[i].eps_bearer_id.u8);
if (!bearer) {
mme_send_delete_session_or_mme_ue_context_release(mme_ue);
mme_send_delete_session_or_mme_ue_context_release(enb_ue, mme_ue);
return;
}
@@ -572,6 +577,7 @@ void mme_s11_handle_modify_bearer_response(
int modify_action = 0;
mme_ue_t *mme_ue = NULL;
enb_ue_t *enb_ue = NULL;
sgw_ue_t *sgw_ue = NULL;
ogs_assert(rsp);
@@ -585,6 +591,7 @@ void mme_s11_handle_modify_bearer_response(
modify_action = xact->modify_action;
mme_ue = mme_ue_find_by_id(OGS_POINTER_TO_UINT(xact->data));
enb_ue = enb_ue_find_by_id(xact->enb_ue_id);
rv = ogs_gtp_xact_commit(xact);
if (rv != OGS_OK) {
@@ -620,7 +627,10 @@ void mme_s11_handle_modify_bearer_response(
}
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
mme_send_delete_session_or_mme_ue_context_release(mme_ue);
if (enb_ue)
mme_send_delete_session_or_mme_ue_context_release(enb_ue, mme_ue);
else
ogs_error("ENB-S1 Context has already been removed");
return;
}
@@ -635,7 +645,10 @@ void mme_s11_handle_modify_bearer_response(
}
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
mme_send_delete_session_or_mme_ue_context_release(mme_ue);
if (enb_ue)
mme_send_delete_session_or_mme_ue_context_release(enb_ue, mme_ue);
else
ogs_error("ENB-S1 Context has already been removed");
return;
}
@@ -646,7 +659,10 @@ void mme_s11_handle_modify_bearer_response(
if (session_cause != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
ogs_error("[%s] GTP Cause [VALUE:%d]", mme_ue->imsi_bcd, session_cause);
mme_send_delete_session_or_mme_ue_context_release(mme_ue);
if (enb_ue)
mme_send_delete_session_or_mme_ue_context_release(enb_ue, mme_ue);
else
ogs_error("ENB-S1 Context has already been removed");
return;
}
@@ -700,6 +716,7 @@ void mme_s11_handle_delete_session_response(
sess = mme_sess_find_by_id(OGS_POINTER_TO_UINT(xact->data));
if (sess)
mme_ue = mme_ue_find_by_id(sess->mme_ue_id);
enb_ue = enb_ue_find_by_id(xact->enb_ue_id);
rv = ogs_gtp_xact_commit(xact);
if (rv != OGS_OK) {
@@ -712,6 +729,11 @@ void mme_s11_handle_delete_session_response(
return;
}
if (!enb_ue) {
ogs_error("ENB-S1 Context has already been removed");
return;
}
if (!mme_ue) {
ogs_error("MME-UE Context has already been removed");
return;
@@ -769,8 +791,6 @@ void mme_s11_handle_delete_session_response(
ogs_assert(target_ue);
ogs_assert(source_ue);
enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id);
ogs_debug(" MME_S11_TEID[%d] SGW_S11_TEID[%d]",
mme_ue->mme_s11_teid, source_ue->sgw_s11_teid);
@@ -1394,6 +1414,7 @@ void mme_s11_handle_release_access_bearers_response(
ogs_assert(action);
mme_ue = mme_ue_find_by_id(OGS_POINTER_TO_UINT(xact->data));
enb_ue = enb_ue_find_by_id(xact->enb_ue_id);
rv = ogs_gtp_xact_commit(xact);
if (rv != OGS_OK) {
@@ -1443,7 +1464,6 @@ void mme_s11_handle_release_access_bearers_response(
}
if (action == OGS_GTP_RELEASE_SEND_UE_CONTEXT_RELEASE_COMMAND) {
enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id);
if (enb_ue) {
r = s1ap_send_ue_context_release_command(enb_ue,
enb_ue->relcause.group, enb_ue->relcause.cause,
@@ -1471,8 +1491,6 @@ void mme_s11_handle_release_access_bearers_response(
* for new UE-associated logical S1-connections over the S1 interface,
* the MME shall respond with the RESET ACKNOWLEDGE message.
*/
enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id);
enb_ue_unlink(mme_ue);
if (enb_ue) {
@@ -1494,8 +1512,6 @@ void mme_s11_handle_release_access_bearers_response(
} else if (action == OGS_GTP_RELEASE_S1_CONTEXT_REMOVE_BY_RESET_PARTIAL) {
enb_ue_t *iter = NULL;
enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id);
enb_ue_unlink(mme_ue);
if (enb_ue) {
@@ -1691,6 +1707,7 @@ void mme_s11_handle_create_indirect_data_forwarding_tunnel_response(
sgw_ue_t *sgw_ue = NULL;
mme_bearer_t *bearer = NULL;
mme_ue_t *mme_ue = NULL;
enb_ue_t *enb_ue = NULL;
enb_ue_t *source_ue = NULL;
ogs_gtp2_f_teid_t *teid = NULL;
@@ -1704,6 +1721,7 @@ void mme_s11_handle_create_indirect_data_forwarding_tunnel_response(
********************/
ogs_assert(xact);
mme_ue = mme_ue_find_by_id(OGS_POINTER_TO_UINT(xact->data));
enb_ue = enb_ue_find_by_id(xact->enb_ue_id);
rv = ogs_gtp_xact_commit(xact);
if (rv != OGS_OK) {
@@ -1739,7 +1757,10 @@ void mme_s11_handle_create_indirect_data_forwarding_tunnel_response(
}
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
mme_send_delete_session_or_mme_ue_context_release(mme_ue);
if (enb_ue)
mme_send_delete_session_or_mme_ue_context_release(enb_ue, mme_ue);
else
ogs_error("ENB-S1 Context has already been removed");
return;
}
@@ -1754,7 +1775,10 @@ void mme_s11_handle_create_indirect_data_forwarding_tunnel_response(
}
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
mme_send_delete_session_or_mme_ue_context_release(mme_ue);
if (enb_ue)
mme_send_delete_session_or_mme_ue_context_release(enb_ue, mme_ue);
else
ogs_error("ENB-S1 Context has already been removed");
return;
}
@@ -1765,7 +1789,10 @@ void mme_s11_handle_create_indirect_data_forwarding_tunnel_response(
if (session_cause != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
ogs_error("[%s] GTP Cause [VALUE:%d]", mme_ue->imsi_bcd, session_cause);
mme_send_delete_session_or_mme_ue_context_release(mme_ue);
if (enb_ue)
mme_send_delete_session_or_mme_ue_context_release(enb_ue, mme_ue);
else
ogs_error("ENB-S1 Context has already been removed");
return;
}
@@ -1826,6 +1853,7 @@ void mme_s11_handle_delete_indirect_data_forwarding_tunnel_response(
uint8_t session_cause = OGS_GTP2_CAUSE_UNDEFINED_VALUE;
int action = 0;
mme_ue_t *mme_ue = NULL;
enb_ue_t *enb_ue = NULL;
sgw_ue_t *sgw_ue = NULL;
ogs_assert(rsp);
@@ -1839,6 +1867,7 @@ void mme_s11_handle_delete_indirect_data_forwarding_tunnel_response(
action = xact->delete_indirect_action;
ogs_assert(action);
mme_ue = mme_ue_find_by_id(OGS_POINTER_TO_UINT(xact->data));
enb_ue = enb_ue_find_by_id(xact->enb_ue_id);
rv = ogs_gtp_xact_commit(xact);
if (rv != OGS_OK) {
@@ -1874,7 +1903,10 @@ void mme_s11_handle_delete_indirect_data_forwarding_tunnel_response(
}
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
mme_send_delete_session_or_mme_ue_context_release(mme_ue);
if (enb_ue)
mme_send_delete_session_or_mme_ue_context_release(enb_ue, mme_ue);
else
ogs_error("ENB-S1 Context has already been removed");
return;
}
@@ -1889,7 +1921,10 @@ void mme_s11_handle_delete_indirect_data_forwarding_tunnel_response(
}
if (cause_value != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
mme_send_delete_session_or_mme_ue_context_release(mme_ue);
if (enb_ue)
mme_send_delete_session_or_mme_ue_context_release(enb_ue, mme_ue);
else
ogs_error("ENB-S1 Context has already been removed");
return;
}
@@ -1900,7 +1935,10 @@ void mme_s11_handle_delete_indirect_data_forwarding_tunnel_response(
if (session_cause != OGS_GTP2_CAUSE_REQUEST_ACCEPTED) {
ogs_error("GTP Cause [VALUE:%d]", session_cause);
mme_send_delete_session_or_mme_ue_context_release(mme_ue);
if (enb_ue)
mme_send_delete_session_or_mme_ue_context_release(enb_ue, mme_ue);
else
ogs_error("ENB-S1 Context has already been removed");
return;
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com>
* Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com>
*
* This file is part of Open5GS.
*
@@ -283,7 +283,11 @@ void mme_s6a_handle_clr(mme_ue_t *mme_ue, ogs_diam_s6a_message_t *s6a_message)
if (MME_P_TMSI_IS_AVAILABLE(mme_ue)) {
ogs_assert(OGS_OK == sgsap_send_detach_indication(mme_ue));
} else {
mme_send_delete_session_or_detach(mme_ue);
enb_ue_t *enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id);
if (enb_ue)
mme_send_delete_session_or_detach(enb_ue, mme_ue);
else
ogs_error("ENB-S1 Context has already been removed");
}
}
break;
@@ -308,7 +312,11 @@ void mme_s6a_handle_clr(mme_ue_t *mme_ue, ogs_diam_s6a_message_t *s6a_message)
if (MME_P_TMSI_IS_AVAILABLE(mme_ue)) {
ogs_assert(OGS_OK == sgsap_send_detach_indication(mme_ue));
} else {
mme_send_delete_session_or_detach(mme_ue);
enb_ue_t *enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id);
if (enb_ue)
mme_send_delete_session_or_detach(enb_ue, mme_ue);
else
ogs_error("ENB-S1 Context has already been removed");
}
break;
default:

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com>
* Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com>
*
* This file is part of Open5GS.
*
@@ -347,7 +347,7 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e)
ogs_fsm_dispatch(&mme_ue->sm, e);
if (OGS_FSM_CHECK(&mme_ue->sm, emm_state_exception)) {
mme_send_delete_session_or_mme_ue_context_release(mme_ue);
mme_send_delete_session_or_mme_ue_context_release(enb_ue, mme_ue);
}
ogs_pkbuf_free(pkbuf);
@@ -802,10 +802,15 @@ cleanup:
GTP_COUNTER_INCREMENT(
mme_ue, GTP_COUNTER_DELETE_SESSION_BY_PATH_SWITCH);
enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id);
if (enb_ue) {
ogs_assert(OGS_OK ==
mme_gtp_send_delete_session_request(
sgw_ue, sess,
enb_ue, sgw_ue, sess,
OGS_GTP_DELETE_IN_PATH_SWITCH_REQUEST));
} else
ogs_error("ENB-S1 Context has already been removed");
}
break;
@@ -895,10 +900,15 @@ cleanup:
ogs_list_for_each(&mme_ue->sess_list, sess) {
GTP_COUNTER_INCREMENT(
mme_ue, GTP_COUNTER_DELETE_SESSION_BY_PATH_SWITCH);
enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id);
if (enb_ue) {
ogs_assert(OGS_OK ==
mme_gtp_send_delete_session_request(
sgw_ue, sess,
enb_ue, sgw_ue, sess,
OGS_GTP_DELETE_IN_PATH_SWITCH_REQUEST));
} else
ogs_error("ENB-S1 Context has already been removed");
}
break;

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com>
* Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com>
*
* This file is part of Open5GS.
*
@@ -1073,7 +1073,8 @@ void s1ap_handle_initial_context_setup_response(
if (ogs_list_count(&mme_ue->bearer_to_modify_list)) {
ogs_assert(OGS_OK ==
mme_gtp_send_modify_bearer_request(mme_ue, uli_presence, 0));
mme_gtp_send_modify_bearer_request(
enb_ue, mme_ue, uli_presence, 0));
}
}
@@ -1596,7 +1597,8 @@ void s1ap_handle_e_rab_setup_response(
ogs_list_add(&mme_ue->bearer_to_modify_list,
&bearer->to_modify_node);
ogs_assert(OGS_OK ==
mme_gtp_send_modify_bearer_request(mme_ue, 0, 0));
mme_gtp_send_modify_bearer_request(
enb_ue, mme_ue, 0, 0));
} else {
ogs_assert(OGS_OK ==
mme_gtp_send_create_bearer_response(
@@ -1978,7 +1980,7 @@ void s1ap_handle_ue_context_release_action(enb_ue_t *enb_ue)
if (mme_ue_have_indirect_tunnel(mme_ue) == true) {
ogs_assert(OGS_OK ==
mme_gtp_send_delete_indirect_data_forwarding_tunnel_request(
mme_ue, OGS_GTP_DELETE_INDIRECT_HANDOVER_COMPLETE));
enb_ue, mme_ue, OGS_GTP_DELETE_INDIRECT_HANDOVER_COMPLETE));
} else {
ogs_warn("Check your eNodeB");
ogs_warn(" No INDIRECT TUNNEL");
@@ -1999,7 +2001,7 @@ void s1ap_handle_ue_context_release_action(enb_ue_t *enb_ue)
if (mme_ue_have_indirect_tunnel(mme_ue) == true) {
ogs_assert(OGS_OK ==
mme_gtp_send_delete_indirect_data_forwarding_tunnel_request(
mme_ue, OGS_GTP_DELETE_INDIRECT_HANDOVER_CANCEL));
enb_ue, mme_ue, OGS_GTP_DELETE_INDIRECT_HANDOVER_CANCEL));
} else {
ogs_warn("Check your eNodeB");
ogs_warn(" No INDIRECT TUNNEL");
@@ -2225,7 +2227,7 @@ void s1ap_handle_e_rab_modification_indication(
if (ogs_list_count(&mme_ue->bearer_to_modify_list)) {
ogs_assert(OGS_OK == mme_gtp_send_modify_bearer_request(
mme_ue, 0, OGS_GTP_MODIFY_IN_E_RAB_MODIFICATION));
enb_ue, mme_ue, 0, OGS_GTP_MODIFY_IN_E_RAB_MODIFICATION));
}
}
@@ -2661,7 +2663,7 @@ void s1ap_handle_path_switch_request(
if (relocation == SGW_WITHOUT_RELOCATION) {
if (ogs_list_count(&mme_ue->bearer_to_modify_list)) {
ogs_assert(OGS_OK == mme_gtp_send_modify_bearer_request(
mme_ue, 1, OGS_GTP_MODIFY_IN_PATH_SWITCH_REQUEST));
enb_ue, mme_ue, 1, OGS_GTP_MODIFY_IN_PATH_SWITCH_REQUEST));
}
} else if (relocation == SGW_WITH_RELOCATION) {
mme_sess_t *sess = NULL;
@@ -2672,7 +2674,7 @@ void s1ap_handle_path_switch_request(
ogs_assert(OGS_OK ==
mme_gtp_send_create_session_request(
sess, OGS_GTP_CREATE_IN_PATH_SWITCH_REQUEST));
enb_ue, sess, OGS_GTP_CREATE_IN_PATH_SWITCH_REQUEST));
}
} else if (relocation == SGW_HAS_ALREADY_BEEN_RELOCATED) {
ogs_error("SGW has already been relocated");
@@ -3232,8 +3234,8 @@ void s1ap_handle_handover_request_ack(
if (mme_ue_have_indirect_tunnel(mme_ue) == true) {
ogs_assert(OGS_OK ==
mme_gtp_send_create_indirect_data_forwarding_tunnel_request(mme_ue)\
);
mme_gtp_send_create_indirect_data_forwarding_tunnel_request(
source_ue, mme_ue));
} else {
r = s1ap_send_handover_command(source_ue);
ogs_expect(r == OGS_OK);
@@ -3789,7 +3791,8 @@ void s1ap_handle_handover_notification(
}
if (ogs_list_count(&mme_ue->bearer_to_modify_list)) {
ogs_assert(OGS_OK == mme_gtp_send_modify_bearer_request(mme_ue, 1, 0));
ogs_assert(OGS_OK == mme_gtp_send_modify_bearer_request(
target_ue, mme_ue, 1, 0));
}
}
@@ -3945,7 +3948,7 @@ void s1ap_handle_s1_reset(
mme_ue = mme_ue_find_by_id(enb_ue->mme_ue_id);
if (mme_ue) {
ogs_assert(OGS_OK ==
mme_gtp_send_release_access_bearers_request(mme_ue,
mme_gtp_send_release_access_bearers_request(enb_ue, mme_ue,
OGS_GTP_RELEASE_S1_CONTEXT_REMOVE_BY_RESET_PARTIAL));
} else {
enb_ue_remove(enb_ue);

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com>
* Copyright (C) 2019-2024 by Sukchan Lee <acetcom@gmail.com>
*
* This file is part of Open5GS.
*
@@ -33,6 +33,7 @@ void sgsap_handle_location_update_accept(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf)
int r;
ogs_tlv_t *root = NULL, *iter = NULL;
mme_ue_t *mme_ue = NULL;
enb_ue_t *enb_ue = NULL;
char imsi_bcd[OGS_MAX_IMSI_BCD_LEN+1];
@@ -124,13 +125,17 @@ void sgsap_handle_location_update_accept(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf)
return;
error:
enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id);
if (enb_ue) {
r = nas_eps_send_attach_reject(
enb_ue_find_by_id(mme_ue->enb_ue_id), mme_ue,
OGS_NAS_EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED,
OGS_NAS_ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
mme_send_delete_session_or_mme_ue_context_release(mme_ue);
mme_send_delete_session_or_mme_ue_context_release(enb_ue, mme_ue);
} else
ogs_error("ENB-S1 Context has already been removed");
}
void sgsap_handle_location_update_reject(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf)
@@ -226,6 +231,7 @@ void sgsap_handle_detach_ack(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf)
{
ogs_tlv_t *root = NULL, *iter = NULL;
mme_ue_t *mme_ue = NULL;
enb_ue_t *enb_ue = NULL;
char imsi_bcd[OGS_MAX_IMSI_BCD_LEN+1];
@@ -295,7 +301,11 @@ void sgsap_handle_detach_ack(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf)
ogs_debug(" IMSI[%s]", mme_ue->imsi_bcd);
mme_send_delete_session_or_detach(mme_ue);
enb_ue = enb_ue_find_by_id(mme_ue->enb_ue_id);
if (enb_ue)
mme_send_delete_session_or_detach(enb_ue, mme_ue);
else
ogs_error("ENB-S1 Context has already been removed");
}
void sgsap_handle_paging_request(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf)