Change buffering instead of deleting [#592]

This commit is contained in:
Sukchan Lee 2020-10-08 22:54:13 -04:00
parent cabef6afa9
commit 8d55964bcc
11 changed files with 53 additions and 144 deletions

View File

@ -631,12 +631,13 @@ ogs_pfcp_far_t *ogs_pfcp_handle_update_far(ogs_pfcp_sess_t *sess,
if (message->apply_action.presence)
far->apply_action = message->apply_action.u8;
if (message->update_forwarding_parameters.destination_interface.presence) {
far->dst_if = message->update_forwarding_parameters.
destination_interface.u8;
}
if (message->update_forwarding_parameters.presence) {
if (message->update_forwarding_parameters.
destination_interface.presence) {
far->dst_if = message->update_forwarding_parameters.
destination_interface.u8;
}
if (message->update_forwarding_parameters.
outer_header_creation.presence) {
ogs_pfcp_tlv_outer_header_creation_t *outer_header_creation =

View File

@ -1308,9 +1308,9 @@ amf_ue_t *amf_ue_find_by_message(ogs_nas_5gs_message_t *message)
amf_ue = amf_ue_find_by_suci(suci);
if (amf_ue) {
ogs_trace("[%s] known UE by SUCI", suci);
ogs_info("[%s] known UE by SUCI", suci);
} else {
ogs_trace("[%s] Unknown UE by SUCI", suci);
ogs_info("[%s] Unknown UE by SUCI", suci);
}
ogs_free(suci);
break;
@ -1329,7 +1329,8 @@ amf_ue_t *amf_ue_find_by_message(ogs_nas_5gs_message_t *message)
amf_ue = amf_ue_find_by_guti(&nas_guti);
if (amf_ue) {
ogs_debug("Known UE by 5G-S_TMSI[AMF_ID:0x%x,M_TMSI:0x%x]",
ogs_info("[%s] Known UE by 5G-S_TMSI[AMF_ID:0x%x,M_TMSI:0x%x]",
amf_ue->suci ? amf_ue->suci : "Unknown",
ogs_amf_id_hexdump(&nas_guti.amf_id), nas_guti.m_tmsi);
} else {
ogs_warn("Unknown UE by 5G-S_TMSI[AMF_ID:0x%x,M_TMSI:0x%x]",
@ -1341,40 +1342,6 @@ amf_ue_t *amf_ue_find_by_message(ogs_nas_5gs_message_t *message)
}
break;
#if 0
case OGS_NAS_5GS_TRACKING_AREA_UPDATE_REQUEST:
tau_request = &message->gmm.tracking_area_update_request;
eps_mobile_identity = &tau_request->old_guti;
switch(eps_mobile_identity->imsi.type) {
case OGS_NAS_5GS_MOBILE_IDENTITY_GUTI:
eps_mobile_identity_guti = &eps_mobile_identity->guti;
ogs_nas_guti.nas_plmn_id = eps_mobile_identity_guti->nas_plmn_id;
ogs_nas_guti.amf_gid = eps_mobile_identity_guti->amf_gid;
ogs_nas_guti.amf_code = eps_mobile_identity_guti->amf_code;
ogs_nas_guti.m_tmsi = eps_mobile_identity_guti->m_tmsi;
amf_ue = amf_ue_find_by_guti(&ogs_nas_guti);
if (amf_ue) {
ogs_trace("Known UE by GUTI[G:%d,C:%d,M_TMSI:0x%x]",
ogs_nas_guti.amf_gid,
ogs_nas_guti.amf_code,
ogs_nas_guti.m_tmsi);
} else {
ogs_warn("Unknown UE by GUTI[G:%d,C:%d,M_TMSI:0x%x]",
ogs_nas_guti.amf_gid,
ogs_nas_guti.amf_code,
ogs_nas_guti.m_tmsi);
}
break;
default:
ogs_error("Unknown IMSI type [%d]", eps_mobile_identity->imsi.type);
break;
}
break;
#endif
default:
break;
}
@ -1400,12 +1367,11 @@ void amf_ue_set_suci(amf_ue_t *amf_ue,
/* Check if OLD amf_ue_t is different with NEW amf_ue_t */
if (ogs_pool_index(&amf_ue_pool, amf_ue) !=
ogs_pool_index(&amf_ue_pool, old_amf_ue)) {
ogs_warn("[%s] OLD UE Context Release", suci);
if (CM_CONNECTED(old_amf_ue)) {
/* Implcit NG release */
ogs_debug("[%s] Implicit NG release", suci);
ogs_debug("[%s] RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]",
/* Implcit NG release */
ogs_warn("[%s] Implicit NG release", suci);
ogs_warn("[%s] RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]",
old_amf_ue->suci, old_amf_ue->ran_ue->ran_ue_ngap_id,
(long long)old_amf_ue->ran_ue->amf_ue_ngap_id);
ran_ue_remove(old_amf_ue->ran_ue);

View File

@ -907,8 +907,13 @@ void ngap_handle_initial_context_setup_failure(
if (amf_ue) {
old_xact_count = amf_sess_xact_count(amf_ue);
#if 0 /* change buffering instead of deletion */
amf_sbi_send_release_all_sessions(amf_ue,
AMF_RELEASE_SM_CONTEXT_NG_CONTEXT_REMOVE);
#else
amf_sbi_send_deactivate_all_sessions(
amf_ue, Cause->present, (int)Cause->choice.radioNetwork);
#endif
new_xact_count = amf_sess_xact_count(amf_ue);
}
@ -1161,8 +1166,11 @@ void ngap_handle_ue_context_release_action(ran_ue_t *ran_ue)
amf_ue = ran_ue->amf_ue;
ogs_debug(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]",
ogs_info("UE Context Release [Action:%d]", ran_ue->ue_ctx_rel_action);
ogs_info(" RAN_UE_NGAP_ID[%d] AMF_UE_NGAP_ID[%lld]",
ran_ue->ran_ue_ngap_id, (long long)ran_ue->amf_ue_ngap_id);
if (amf_ue)
ogs_info(" SUCI[%s]", amf_ue->suci ? amf_ue->suci : "Unknown");
switch (ran_ue->ue_ctx_rel_action) {
case NGAP_UE_CTX_REL_NG_CONTEXT_REMOVE:

View File

@ -464,11 +464,6 @@ int emm_handle_tau_request(mme_ue_t *mme_ue,
CLEAR_MME_UE_ALL_TIMERS(mme_ue);
CLEAR_SERVICE_INDICATOR(mme_ue);
if (BEARER_CONTEXT_IS_ACTIVE(mme_ue))
ogs_debug(" Bearer-Active");
else
ogs_debug(" Bearer-Inactive");
if (mme_ue->nas_eps.update.active_flag)
ogs_debug(" Active flag");
else

View File

@ -2407,9 +2407,9 @@ mme_ue_t *mme_ue_find_by_message(ogs_nas_eps_message_t *message)
mme_ue = mme_ue_find_by_imsi_bcd(imsi_bcd);
if (mme_ue) {
ogs_trace("known UE by IMSI[%s]", imsi_bcd);
ogs_info("[%s] known UE by IMSI", imsi_bcd);
} else {
ogs_trace("Unknown UE by IMSI[%s]", imsi_bcd);
ogs_info("[%s] Unknown UE by IMSI", imsi_bcd);
}
break;
case OGS_NAS_EPS_MOBILE_IDENTITY_GUTI:
@ -2422,7 +2422,8 @@ mme_ue_t *mme_ue_find_by_message(ogs_nas_eps_message_t *message)
mme_ue = mme_ue_find_by_guti(&ogs_nas_guti);
if (mme_ue) {
ogs_trace("Known UE by GUTI[G:%d,C:%d,M_TMSI:0x%x]",
ogs_info("[%s] Known UE by GUTI[G:%d,C:%d,M_TMSI:0x%x]",
mme_ue->imsi_bcd,
ogs_nas_guti.mme_gid,
ogs_nas_guti.mme_code,
ogs_nas_guti.m_tmsi);
@ -2456,7 +2457,8 @@ mme_ue_t *mme_ue_find_by_message(ogs_nas_eps_message_t *message)
mme_ue = mme_ue_find_by_guti(&ogs_nas_guti);
if (mme_ue) {
ogs_trace("Known UE by GUTI[G:%d,C:%d,M_TMSI:0x%x]",
ogs_info("[%s] Known UE by GUTI[G:%d,C:%d,M_TMSI:0x%x]",
mme_ue->imsi_bcd,
ogs_nas_guti.mme_gid,
ogs_nas_guti.mme_code,
ogs_nas_guti.m_tmsi);
@ -2490,12 +2492,13 @@ mme_ue_t *mme_ue_find_by_message(ogs_nas_eps_message_t *message)
mme_ue = mme_ue_find_by_guti(&ogs_nas_guti);
if (mme_ue) {
ogs_trace("Known UE by GUTI[G:%d,C:%d,M_TMSI:0x%x]",
ogs_info("[%s] Known UE by GUTI[G:%d,C:%d,M_TMSI:0x%x]",
mme_ue->imsi_bcd,
ogs_nas_guti.mme_gid,
ogs_nas_guti.mme_code,
ogs_nas_guti.m_tmsi);
} else {
ogs_warn("Unknown UE by GUTI[G:%d,C:%d,M_TMSI:0x%x]",
ogs_info("Unknown UE by GUTI[G:%d,C:%d,M_TMSI:0x%x]",
ogs_nas_guti.mme_gid,
ogs_nas_guti.mme_code,
ogs_nas_guti.m_tmsi);
@ -2527,9 +2530,16 @@ int mme_ue_set_imsi(mme_ue_t *mme_ue, char *imsi_bcd)
/* Check if OLD mme_ue_t is different with NEW mme_ue_t */
if (ogs_pool_index(&mme_ue_pool, mme_ue) !=
ogs_pool_index(&mme_ue_pool, old_mme_ue)) {
ogs_warn("OLD UE Context Release [IMSI:%s]", mme_ue->imsi_bcd);
if (old_mme_ue->enb_ue)
enb_ue_deassociate(old_mme_ue->enb_ue);
ogs_warn("[%s] OLD UE Context Release", mme_ue->imsi_bcd);
if (ECM_CONNECTED(old_mme_ue)) {
/* Implcit S1 release */
ogs_warn("[%s] Implicit S1 release", mme_ue->imsi_bcd);
ogs_warn("[%s] ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]",
old_mme_ue->imsi_bcd,
old_mme_ue->enb_ue->enb_ue_s1ap_id,
old_mme_ue->enb_ue->mme_ue_s1ap_id);
enb_ue_remove(old_mme_ue->enb_ue);
}
mme_ue_remove(old_mme_ue);
}
}
@ -3066,27 +3076,6 @@ mme_bearer_t *mme_bearer_next(mme_bearer_t *bearer)
return ogs_list_next(bearer);
}
int mme_bearer_is_inactive(mme_ue_t *mme_ue)
{
mme_sess_t *sess = NULL;
ogs_assert(mme_ue);
sess = mme_sess_first(mme_ue);
while (sess) {
mme_bearer_t *bearer = mme_bearer_first(sess);
while (bearer) {
if (MME_HAVE_ENB_S1U_PATH(bearer)) {
return 0;
}
bearer = mme_bearer_next(bearer);
}
sess = mme_sess_next(sess);
}
return 1;
}
int mme_bearer_set_inactive(mme_ue_t *mme_ue)
{
mme_sess_t *sess = NULL;

View File

@ -554,9 +554,7 @@ typedef struct mme_sess_s {
ogs_tlv_octet_t pgw_pco;
} mme_sess_t;
#define BEARER_CONTEXT_IS_ACTIVE(__mME) \
(mme_bearer_is_inactive(__mME) == 0)
#define CLEAR_BEARER_CONTEXT(__mME) \
#define CLEAR_BEARER_CONTEXT(__mME) \
mme_bearer_set_inactive(__mME)
#define MME_HAVE_ENB_S1U_PATH(__bEARER) \

View File

@ -51,7 +51,6 @@ void mme_send_delete_session_or_mme_ue_context_release(mme_ue_t *mme_ue)
}
}
#if 1
void mme_send_release_access_bearer_or_ue_context_release(enb_ue_t *enb_ue)
{
mme_ue_t *mme_ue = NULL;
@ -68,41 +67,3 @@ void mme_send_release_access_bearer_or_ue_context_release(enb_ue_t *enb_ue)
S1AP_UE_CTX_REL_S1_CONTEXT_REMOVE, 0);
}
}
#else
void mme_send_delete_session_or_enb_ue_context_release(enb_ue_t *enb_ue)
{
mme_ue_t *mme_ue = NULL;
ogs_assert(enb_ue);
mme_ue = enb_ue->mme_ue;
if (mme_ue && SESSION_CONTEXT_IS_AVAILABLE(mme_ue)) {
mme_gtp_send_delete_all_sessions(mme_ue);
} else {
s1ap_send_ue_context_release_command(enb_ue,
S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release,
S1AP_UE_CTX_REL_S1_CONTEXT_REMOVE, 0);
}
}
void mme_send_release_access_bearer_or_ue_context_release(enb_ue_t *enb_ue)
{
mme_ue_t *mme_ue = NULL;
ogs_assert(enb_ue);
mme_ue = enb_ue->mme_ue;
if (mme_ue) {
if (BEARER_CONTEXT_IS_ACTIVE(mme_ue)) {
ogs_debug("[%s] EMM-Registered", mme_ue->imsi_bcd);
mme_gtp_send_release_access_bearers_request(mme_ue);
} else {
ogs_warn("[%s] No EMM-Registered", mme_ue->imsi_bcd);
mme_send_delete_session_or_mme_ue_context_release(mme_ue);
}
} else {
ogs_debug("No UE Context");
s1ap_send_ue_context_release_command(enb_ue,
S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release,
S1AP_UE_CTX_REL_S1_CONTEXT_REMOVE, 0);
}
}
#endif

View File

@ -283,8 +283,7 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e)
case MME_TIMER_S1_HOLDING:
ogs_warn("Implicit S1 release");
ogs_warn(" ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]",
enb_ue->enb_ue_s1ap_id,
enb_ue->mme_ue_s1ap_id);
enb_ue->enb_ue_s1ap_id, enb_ue->mme_ue_s1ap_id);
s1ap_handle_ue_context_release_action(enb_ue);
break;
default:

View File

@ -684,7 +684,7 @@ void s1ap_handle_initial_context_setup_failure(
* may in principle be adopted. The eNB should ensure
* that no hanging resources remain at the eNB.
*/
#if 1
#if 0
if (mme_ue && SESSION_CONTEXT_IS_AVAILABLE(mme_ue)) {
mme_gtp_send_delete_all_sessions(mme_ue);
} else {
@ -1125,8 +1125,11 @@ void s1ap_handle_ue_context_release_action(enb_ue_t *enb_ue)
mme_ue = enb_ue->mme_ue;
ogs_debug(" ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]",
ogs_info("UE Context Release [Action:%d]", enb_ue->ue_ctx_rel_action);
ogs_info(" ENB_UE_S1AP_ID[%d] MME_UE_S1AP_ID[%d]",
enb_ue->enb_ue_s1ap_id, enb_ue->mme_ue_s1ap_id);
if (mme_ue)
ogs_info(" IMSI[%s]", mme_ue->imsi_bcd);
switch (enb_ue->ue_ctx_rel_action) {
case S1AP_UE_CTX_REL_S1_CONTEXT_REMOVE:
@ -2053,7 +2056,7 @@ void s1ap_handle_s1_reset(
Reset = &initiatingMessage->value.choice.Reset;
ogs_assert(Reset);
ogs_debug("[MME] Reset");
ogs_warn("[MME] Reset");
for (i = 0; i < Reset->protocolIEs.list.count; i++) {
ie = Reset->protocolIEs.list.array[i];
@ -2092,12 +2095,12 @@ void s1ap_handle_s1_reset(
ogs_assert(ResetType);
switch (ResetType->present) {
case S1AP_ResetType_PR_s1_Interface:
ogs_debug(" S1AP_ResetType_PR_s1_Interface");
ogs_warn(" S1AP_ResetType_PR_s1_Interface");
enb_ue_remove_in_enb(enb);
break;
case S1AP_ResetType_PR_partOfS1_Interface:
ogs_debug(" S1AP_ResetType_PR_partOfS1_Interface");
ogs_warn(" S1AP_ResetType_PR_partOfS1_Interface");
partOfS1_Interface = ResetType->choice.partOfS1_Interface;
ogs_assert(partOfS1_Interface);
@ -2114,7 +2117,7 @@ void s1ap_handle_s1_reset(
item = &ie2->value.choice.UE_associatedLogicalS1_ConnectionItem;
ogs_assert(item);
ogs_debug(" MME_UE_S1AP_ID[%d] ENB_UE_S1AP_ID[%d]",
ogs_warn(" MME_UE_S1AP_ID[%d] ENB_UE_S1AP_ID[%d]",
item->mME_UE_S1AP_ID ? (int)*item->mME_UE_S1AP_ID : -1,
item->eNB_UE_S1AP_ID ? (int)*item->eNB_UE_S1AP_ID : -1);

View File

@ -19,8 +19,6 @@
#include "gtp-path.h"
static ogs_pkbuf_pool_t *packet_pool = NULL;
static void _gtpv2_c_recv_cb(short when, ogs_socket_t fd, void *data)
{
sgwc_event_t *e = NULL;
@ -107,13 +105,6 @@ int sgwc_gtp_open(void)
ogs_socknode_t *node = NULL;
ogs_sock_t *sock = NULL;
ogs_pkbuf_config_t config;
memset(&config, 0, sizeof config);
config.cluster_8192_pool = ogs_app()->pool.packet;
packet_pool = ogs_pkbuf_pool_create(&config);
ogs_list_for_each(&sgwc_self()->gtpc_list, node) {
sock = ogs_gtp_server(node);
ogs_assert(sock);
@ -146,8 +137,6 @@ void sgwc_gtp_close(void)
{
ogs_socknode_remove_all(&sgwc_self()->gtpc_list);
ogs_socknode_remove_all(&sgwc_self()->gtpc_list6);
ogs_pkbuf_pool_destroy(packet_pool);
}
void sgwc_gtp_send_downlink_data_notification(

View File

@ -1002,7 +1002,7 @@ static void test3_func(abts_case *tc, void *data)
/* Send Service Request */
emmbuf = testemm_build_service_request(test_ue);
ABTS_PTR_NOTNULL(tc, emmbuf);
#if 0
#if 1
/*
* In s1ap_handle_initial_context_setup_failure(),
* Use mme_send_release_access_bearer_or_ue_context_release(enb_ue);