forked from acouzens/open5gs
[ALL] Add protection of message encoding (#991)
All process will be forcely exited if it failed to encode the S1AP/NGAP/GTP/PFCP message. It is to make sure there was no problem with the encoding of open5gs.
This commit is contained in:
parent
dfaf2f1567
commit
873cf398c7
|
@ -134,6 +134,15 @@ void ogs_log_hexdump_func(ogs_log_level_e level, int domain_id,
|
|||
} \
|
||||
} while (0)
|
||||
|
||||
#define ogs_expect_or_return_val(expr, val) \
|
||||
do { \
|
||||
if (ogs_likely(expr)) ; \
|
||||
else { \
|
||||
ogs_error("%s: Expectation `%s' failed.", OGS_FUNC, #expr); \
|
||||
return (val); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -49,7 +49,7 @@ static ogs_tlv_t *tlv_add_leaf(
|
|||
desc->type, 1, desc->instance, &v->u8);
|
||||
else
|
||||
tlv = ogs_tlv_add(tlv, desc->type, 1, desc->instance, &v->u8);
|
||||
ogs_assert(tlv);
|
||||
ogs_expect_or_return_val(tlv, NULL);
|
||||
break;
|
||||
}
|
||||
case OGS_TLV_UINT16:
|
||||
|
@ -63,7 +63,7 @@ static ogs_tlv_t *tlv_add_leaf(
|
|||
desc->type, 2, desc->instance, &v->u16);
|
||||
else
|
||||
tlv = ogs_tlv_add(tlv, desc->type, 2, desc->instance, &v->u16);
|
||||
ogs_assert(tlv);
|
||||
ogs_expect_or_return_val(tlv, NULL);
|
||||
break;
|
||||
}
|
||||
case OGS_TLV_UINT24:
|
||||
|
@ -79,7 +79,7 @@ static ogs_tlv_t *tlv_add_leaf(
|
|||
desc->type, 3, desc->instance, &v->u24);
|
||||
else
|
||||
tlv = ogs_tlv_add(tlv, desc->type, 3, desc->instance, &v->u24);
|
||||
ogs_assert(tlv);
|
||||
ogs_expect_or_return_val(tlv, NULL);
|
||||
break;
|
||||
}
|
||||
case OGS_TLV_UINT32:
|
||||
|
@ -95,7 +95,7 @@ static ogs_tlv_t *tlv_add_leaf(
|
|||
else
|
||||
tlv = ogs_tlv_add(tlv,
|
||||
desc->type, 4, desc->instance, &v->u32);
|
||||
ogs_assert(tlv);
|
||||
ogs_expect_or_return_val(tlv, NULL);
|
||||
break;
|
||||
}
|
||||
case OGS_TLV_FIXED_STR:
|
||||
|
@ -108,7 +108,7 @@ static ogs_tlv_t *tlv_add_leaf(
|
|||
else
|
||||
tlv = ogs_tlv_add(tlv,
|
||||
desc->type, desc->length, desc->instance, v->data);
|
||||
ogs_assert(tlv);
|
||||
ogs_expect_or_return_val(tlv, NULL);
|
||||
break;
|
||||
}
|
||||
case OGS_TLV_VAR_STR:
|
||||
|
@ -116,9 +116,9 @@ static ogs_tlv_t *tlv_add_leaf(
|
|||
ogs_tlv_octet_t *v = (ogs_tlv_octet_t *)msg;
|
||||
|
||||
if (v->len == 0) {
|
||||
ogs_fatal("No TLV length - [%s] T:%d I:%d (vsz=%d)",
|
||||
ogs_error("No TLV length - [%s] T:%d I:%d (vsz=%d)",
|
||||
desc->name, desc->type, desc->instance, desc->vsize);
|
||||
ogs_assert_if_reached();
|
||||
ogs_expect_or_return_val(0, NULL);
|
||||
}
|
||||
|
||||
if (parent_tlv)
|
||||
|
@ -127,7 +127,7 @@ static ogs_tlv_t *tlv_add_leaf(
|
|||
else
|
||||
tlv = ogs_tlv_add(tlv,
|
||||
desc->type, v->len, desc->instance, v->data);
|
||||
ogs_assert(tlv);
|
||||
ogs_expect_or_return_val(tlv, NULL);
|
||||
break;
|
||||
}
|
||||
case OGS_TLV_NULL:
|
||||
|
@ -138,11 +138,11 @@ static ogs_tlv_t *tlv_add_leaf(
|
|||
else
|
||||
tlv = ogs_tlv_add(tlv,
|
||||
desc->type, 0, desc->instance, NULL);
|
||||
ogs_assert(tlv);
|
||||
ogs_expect_or_return_val(tlv, NULL);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
ogs_assert_if_reached();
|
||||
ogs_expect_or_return_val(0, NULL);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -195,7 +195,7 @@ static uint32_t tlv_add_compound(ogs_tlv_t **root, ogs_tlv_t *parent_tlv,
|
|||
r = tlv_add_compound(&emb_tlv, tlv, desc,
|
||||
p + offset2 + sizeof(ogs_tlv_presence_t),
|
||||
depth + 1);
|
||||
ogs_assert(r > 0 && emb_tlv);
|
||||
ogs_expect_or_return_val(r > 0 && emb_tlv, 0);
|
||||
count += 1 + r;
|
||||
} else {
|
||||
ogs_trace("BUILD %sL#%d [%s] T:%d L:%d I:%d "
|
||||
|
@ -205,7 +205,7 @@ static uint32_t tlv_add_compound(ogs_tlv_t **root, ogs_tlv_t *parent_tlv,
|
|||
p + offset2);
|
||||
|
||||
tlv = tlv_add_leaf(parent_tlv, tlv, desc, p + offset2);
|
||||
ogs_assert(tlv);
|
||||
ogs_expect_or_return_val(tlv, 0);
|
||||
count++;
|
||||
}
|
||||
|
||||
|
@ -235,7 +235,7 @@ static uint32_t tlv_add_compound(ogs_tlv_t **root, ogs_tlv_t *parent_tlv,
|
|||
r = tlv_add_compound(&emb_tlv, tlv, desc,
|
||||
p + offset + sizeof(ogs_tlv_presence_t),
|
||||
depth + 1);
|
||||
ogs_assert(r > 0 && emb_tlv);
|
||||
ogs_expect_or_return_val(r > 0 && emb_tlv, 0);
|
||||
count += 1 + r;
|
||||
} else {
|
||||
ogs_trace("BUILD %sL#%d [%s] T:%d L:%d I:%d "
|
||||
|
@ -245,7 +245,7 @@ static uint32_t tlv_add_compound(ogs_tlv_t **root, ogs_tlv_t *parent_tlv,
|
|||
p + offset);
|
||||
|
||||
tlv = tlv_add_leaf(parent_tlv, tlv, desc, p + offset);
|
||||
ogs_assert(tlv);
|
||||
ogs_expect_or_return_val(tlv, 0);
|
||||
count++;
|
||||
}
|
||||
|
||||
|
@ -272,20 +272,20 @@ ogs_pkbuf_t *ogs_tlv_build_msg(ogs_tlv_desc_t *desc, void *msg, int mode)
|
|||
|
||||
if (desc->child_descs[0]) {
|
||||
r = tlv_add_compound(&root, NULL, desc, msg, 0);
|
||||
ogs_assert(r > 0 && root);
|
||||
ogs_expect_or_return_val(r > 0 && root, NULL);
|
||||
|
||||
length = ogs_tlv_calc_length(root, mode);
|
||||
} else {
|
||||
length = 0;
|
||||
}
|
||||
pkbuf = ogs_pkbuf_alloc(NULL, OGS_TLV_MAX_HEADROOM+length);
|
||||
ogs_assert(pkbuf);
|
||||
ogs_expect_or_return_val(pkbuf, NULL);
|
||||
ogs_pkbuf_reserve(pkbuf, OGS_TLV_MAX_HEADROOM);
|
||||
ogs_pkbuf_put(pkbuf, length);
|
||||
|
||||
if (desc->child_descs[0]) {
|
||||
rendlen = ogs_tlv_render(root, pkbuf->data, length, mode);
|
||||
ogs_assert(rendlen == length);
|
||||
ogs_expect_or_return_val(rendlen == length, NULL);
|
||||
|
||||
ogs_tlv_free_all(root);
|
||||
}
|
||||
|
|
|
@ -546,8 +546,9 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e)
|
|||
amf_ue = (amf_ue_t *)sbi_object;
|
||||
ogs_assert(amf_ue);
|
||||
ogs_error("[%s] Cannot receive SBI message", amf_ue->suci);
|
||||
nas_5gs_send_gmm_reject_from_sbi(amf_ue,
|
||||
OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_gmm_reject_from_sbi(amf_ue,
|
||||
OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT));
|
||||
break;
|
||||
|
||||
case OGS_SBI_OBJ_SESS_TYPE:
|
||||
|
@ -556,12 +557,15 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e)
|
|||
ogs_error("[%d:%d] Cannot receive SBI message",
|
||||
sess->psi, sess->pti);
|
||||
if (sess->payload_container_type) {
|
||||
nas_5gs_send_back_5gsm_message_from_sbi(sess,
|
||||
OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_back_5gsm_message_from_sbi(sess,
|
||||
OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT));
|
||||
} else {
|
||||
ngap_send_error_indication2(amf_ue,
|
||||
ogs_assert(OGS_OK ==
|
||||
ngap_send_error_indication2(amf_ue,
|
||||
NGAP_Cause_PR_transport,
|
||||
NGAP_CauseTransport_transport_resource_unavailable);
|
||||
NGAP_CauseTransport_transport_resource_unavailable)
|
||||
);
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -665,9 +669,10 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e)
|
|||
ogs_fsm_dispatch(&gnb->sm, e);
|
||||
} else {
|
||||
ogs_error("Cannot decode NGAP message");
|
||||
ngap_send_error_indication(
|
||||
ogs_assert(OGS_OK ==
|
||||
ngap_send_error_indication(
|
||||
gnb, NULL, NULL, NGAP_Cause_PR_protocol,
|
||||
NGAP_CauseProtocol_abstract_syntax_error_falsely_constructed_message);
|
||||
NGAP_CauseProtocol_abstract_syntax_error_falsely_constructed_message));
|
||||
}
|
||||
|
||||
ogs_ngap_free(&ngap_message);
|
||||
|
@ -772,9 +777,10 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e)
|
|||
/* De-associate NG with NAS/EMM */
|
||||
ran_ue_deassociate(amf_ue->ran_ue);
|
||||
|
||||
ngap_send_ran_ue_context_release_command(amf_ue->ran_ue,
|
||||
ogs_assert(OGS_OK ==
|
||||
ngap_send_ran_ue_context_release_command(amf_ue->ran_ue,
|
||||
NGAP_Cause_PR_nas, NGAP_CauseNas_normal_release,
|
||||
NGAP_UE_CTX_REL_NG_CONTEXT_REMOVE, 0);
|
||||
NGAP_UE_CTX_REL_NG_CONTEXT_REMOVE, 0));
|
||||
}
|
||||
amf_ue_associate_ran_ue(amf_ue, ran_ue);
|
||||
}
|
||||
|
|
|
@ -110,8 +110,9 @@ int gmm_handle_registration_request(amf_ue_t *amf_ue,
|
|||
~OGS_REGISTRATION_CLEARTEXT_PRESENT) {
|
||||
ogs_error("Non cleartext IEs is included [0x%llx]",
|
||||
(long long)registration_request->presencemask);
|
||||
nas_5gs_send_registration_reject(amf_ue,
|
||||
OGS_5GMM_CAUSE_SEMANTICALLY_INCORRECT_MESSAGE);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_registration_reject(amf_ue,
|
||||
OGS_5GMM_CAUSE_SEMANTICALLY_INCORRECT_MESSAGE));
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
|
@ -119,15 +120,17 @@ int gmm_handle_registration_request(amf_ue_t *amf_ue,
|
|||
(registration_request->presencemask &
|
||||
OGS_NAS_5GS_REGISTRATION_REQUEST_NAS_MESSAGE_CONTAINER_PRESENT)) {
|
||||
ogs_error("NAS container present without Integrity-protected");
|
||||
nas_5gs_send_registration_reject(amf_ue,
|
||||
OGS_5GMM_CAUSE_SEMANTICALLY_INCORRECT_MESSAGE);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_registration_reject(amf_ue,
|
||||
OGS_5GMM_CAUSE_SEMANTICALLY_INCORRECT_MESSAGE));
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
if (!mobile_identity->length || !mobile_identity->buffer) {
|
||||
ogs_error("No Mobile Identity");
|
||||
nas_5gs_send_registration_reject(amf_ue,
|
||||
OGS_5GMM_CAUSE_SEMANTICALLY_INCORRECT_MESSAGE);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_registration_reject(amf_ue,
|
||||
OGS_5GMM_CAUSE_SEMANTICALLY_INCORRECT_MESSAGE));
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
|
@ -142,8 +145,10 @@ int gmm_handle_registration_request(amf_ue_t *amf_ue,
|
|||
OGS_NAS_5GS_NULL_SCHEME) {
|
||||
ogs_error("Not implemented ProtectionSchemeID(%d) in SUCI",
|
||||
mobile_identity_suci->protection_scheme_id);
|
||||
nas_5gs_send_registration_reject(amf_ue,
|
||||
OGS_5GMM_CAUSE_MESSAGE_TYPE_NON_EXISTENT_OR_NOT_IMPLEMENTED);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_registration_reject(amf_ue,
|
||||
OGS_5GMM_CAUSE_MESSAGE_TYPE_NON_EXISTENT_OR_NOT_IMPLEMENTED)
|
||||
);
|
||||
return OGS_ERROR;
|
||||
}
|
||||
amf_ue_set_suci(amf_ue, mobile_identity);
|
||||
|
@ -232,8 +237,9 @@ int gmm_handle_registration_request(amf_ue_t *amf_ue,
|
|||
/* Send Registration Reject */
|
||||
ogs_warn("Cannot find Served TAI[PLMN_ID:%06x,TAC:%d]",
|
||||
ogs_plmn_id_hexdump(&amf_ue->nr_tai.plmn_id), amf_ue->nr_tai.tac.v);
|
||||
nas_5gs_send_registration_reject(amf_ue,
|
||||
OGS_5GMM_CAUSE_TRACKING_AREA_NOT_ALLOWED);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_registration_reject(amf_ue,
|
||||
OGS_5GMM_CAUSE_TRACKING_AREA_NOT_ALLOWED));
|
||||
return OGS_ERROR;
|
||||
}
|
||||
ogs_debug(" SERVED_TAI_INDEX[%d]", served_tai_index);
|
||||
|
@ -253,8 +259,9 @@ int gmm_handle_registration_request(amf_ue_t *amf_ue,
|
|||
ue_security_capability->nr_ea, ue_security_capability->nr_ia,
|
||||
amf_selected_enc_algorithm(amf_ue),
|
||||
amf_selected_int_algorithm(amf_ue));
|
||||
nas_5gs_send_registration_reject(amf_ue,
|
||||
OGS_5GMM_CAUSE_UE_SECURITY_CAPABILITIES_MISMATCH);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_registration_reject(amf_ue,
|
||||
OGS_5GMM_CAUSE_UE_SECURITY_CAPABILITIES_MISMATCH));
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
|
@ -446,8 +453,9 @@ int gmm_handle_service_request(amf_ue_t *amf_ue,
|
|||
if (service_request->presencemask & ~OGS_SERVICE_CLEARTEXT_PRESENT) {
|
||||
ogs_error("Non cleartext IEs is included [0x%llx]",
|
||||
(long long)service_request->presencemask);
|
||||
nas_5gs_send_service_reject(amf_ue,
|
||||
OGS_5GMM_CAUSE_SEMANTICALLY_INCORRECT_MESSAGE);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_service_reject(amf_ue,
|
||||
OGS_5GMM_CAUSE_SEMANTICALLY_INCORRECT_MESSAGE));
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
|
@ -455,8 +463,9 @@ int gmm_handle_service_request(amf_ue_t *amf_ue,
|
|||
(service_request->presencemask &
|
||||
OGS_NAS_5GS_SERVICE_REQUEST_NAS_MESSAGE_CONTAINER_PRESENT)) {
|
||||
ogs_error("NAS container present without Integrity-protected");
|
||||
nas_5gs_send_service_reject(amf_ue,
|
||||
OGS_5GMM_CAUSE_SEMANTICALLY_INCORRECT_MESSAGE);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_service_reject(amf_ue,
|
||||
OGS_5GMM_CAUSE_SEMANTICALLY_INCORRECT_MESSAGE));
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
|
@ -514,8 +523,9 @@ int gmm_handle_service_request(amf_ue_t *amf_ue,
|
|||
/* Send Registration Reject */
|
||||
ogs_warn("Cannot find Served TAI[PLMN_ID:%06x,TAC:%d]",
|
||||
ogs_plmn_id_hexdump(&amf_ue->nr_tai.plmn_id), amf_ue->nr_tai.tac.v);
|
||||
nas_5gs_send_registration_reject(amf_ue,
|
||||
OGS_5GMM_CAUSE_TRACKING_AREA_NOT_ALLOWED);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_registration_reject(amf_ue,
|
||||
OGS_5GMM_CAUSE_TRACKING_AREA_NOT_ALLOWED));
|
||||
return OGS_ERROR;
|
||||
}
|
||||
ogs_debug(" SERVED_TAI_INDEX[%d]", served_tai_index);
|
||||
|
@ -619,7 +629,8 @@ int gmm_handle_service_update(amf_ue_t *amf_ue,
|
|||
}
|
||||
|
||||
if (amf_sess_xact_count(amf_ue) == xact_count)
|
||||
nas_5gs_send_service_accept(amf_ue);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_service_accept(amf_ue));
|
||||
|
||||
return OGS_OK;
|
||||
}
|
||||
|
@ -660,7 +671,8 @@ int gmm_handle_deregistration_request(amf_ue_t *amf_ue,
|
|||
amf_sbi_send_release_all_sessions(amf_ue, AMF_RELEASE_SM_CONTEXT_NO_STATE);
|
||||
|
||||
if (ogs_list_count(&amf_ue->sess_list) == 0)
|
||||
nas_5gs_send_de_registration_accept(amf_ue);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_de_registration_accept(amf_ue));
|
||||
|
||||
return OGS_OK;
|
||||
}
|
||||
|
@ -866,30 +878,34 @@ int gmm_handle_ul_nas_transport(amf_ue_t *amf_ue,
|
|||
|
||||
if (!payload_container_type->value) {
|
||||
ogs_error("[%s] No Payload container type", amf_ue->supi);
|
||||
nas_5gs_send_gmm_status(
|
||||
amf_ue, OGS_5GMM_CAUSE_INVALID_MANDATORY_INFORMATION);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_gmm_status(
|
||||
amf_ue, OGS_5GMM_CAUSE_INVALID_MANDATORY_INFORMATION));
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
if (!payload_container->length) {
|
||||
ogs_error("[%s] No Payload container length", amf_ue->supi);
|
||||
nas_5gs_send_gmm_status(
|
||||
amf_ue, OGS_5GMM_CAUSE_INVALID_MANDATORY_INFORMATION);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_gmm_status(
|
||||
amf_ue, OGS_5GMM_CAUSE_INVALID_MANDATORY_INFORMATION));
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
if (!payload_container->buffer) {
|
||||
ogs_error("[%s] No Payload container buffer", amf_ue->supi);
|
||||
nas_5gs_send_gmm_status(
|
||||
amf_ue, OGS_5GMM_CAUSE_INVALID_MANDATORY_INFORMATION);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_gmm_status(
|
||||
amf_ue, OGS_5GMM_CAUSE_INVALID_MANDATORY_INFORMATION));
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
if ((ul_nas_transport->presencemask &
|
||||
OGS_NAS_5GS_UL_NAS_TRANSPORT_PDU_SESSION_ID_PRESENT) == 0) {
|
||||
ogs_error("[%s] No PDU session ID", amf_ue->supi);
|
||||
nas_5gs_send_gmm_status(
|
||||
amf_ue, OGS_5GMM_CAUSE_INVALID_MANDATORY_INFORMATION);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_gmm_status(
|
||||
amf_ue, OGS_5GMM_CAUSE_INVALID_MANDATORY_INFORMATION));
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
|
@ -897,8 +913,9 @@ int gmm_handle_ul_nas_transport(amf_ue_t *amf_ue,
|
|||
if (*pdu_session_id == OGS_NAS_PDU_SESSION_IDENTITY_UNASSIGNED) {
|
||||
ogs_error("[%s] PDU session identity is unassigned",
|
||||
amf_ue->supi);
|
||||
nas_5gs_send_gmm_status(
|
||||
amf_ue, OGS_5GMM_CAUSE_INVALID_MANDATORY_INFORMATION);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_gmm_status(
|
||||
amf_ue, OGS_5GMM_CAUSE_INVALID_MANDATORY_INFORMATION));
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
|
@ -924,8 +941,9 @@ int gmm_handle_ul_nas_transport(amf_ue_t *amf_ue,
|
|||
if (!sess) {
|
||||
ogs_error("[%s] No Session Context [%d]",
|
||||
amf_ue->supi, gsm_header->message_type);
|
||||
nas_5gs_send_gmm_status(amf_ue,
|
||||
OGS_5GMM_CAUSE_INSUFFICIENT_USER_PLANE_RESOURCES_FOR_THE_PDU_SESSION);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_gmm_status(amf_ue,
|
||||
OGS_5GMM_CAUSE_INSUFFICIENT_USER_PLANE_RESOURCES_FOR_THE_PDU_SESSION));
|
||||
return OGS_ERROR;
|
||||
}
|
||||
}
|
||||
|
@ -964,8 +982,9 @@ int gmm_handle_ul_nas_transport(amf_ue_t *amf_ue,
|
|||
|
||||
if (!selected_slice) {
|
||||
ogs_error("[%s] No S-NSSAI", amf_ue->supi);
|
||||
nas_5gs_send_gmm_status(amf_ue,
|
||||
OGS_5GMM_CAUSE_INSUFFICIENT_RESOURCES_FOR_SPECIFIC_SLICE);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_gmm_status(amf_ue,
|
||||
OGS_5GMM_CAUSE_INSUFFICIENT_RESOURCES_FOR_SPECIFIC_SLICE));
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
|
@ -988,7 +1007,8 @@ int gmm_handle_ul_nas_transport(amf_ue_t *amf_ue,
|
|||
|
||||
if (!sess->dnn) {
|
||||
ogs_error("[%s] No DNN", amf_ue->supi);
|
||||
nas_5gs_send_gmm_status(amf_ue, OGS_5GMM_CAUSE_DNN_NOT_SUPPORTED_OR_NOT_SUBSCRIBED_IN_THE_SLICE);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_gmm_status(amf_ue, OGS_5GMM_CAUSE_DNN_NOT_SUPPORTED_OR_NOT_SUBSCRIBED_IN_THE_SLICE));
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
|
@ -1032,8 +1052,9 @@ int gmm_handle_ul_nas_transport(amf_ue_t *amf_ue,
|
|||
if (!SESSION_CONTEXT_IN_SMF(sess)) {
|
||||
ogs_error("[%s:%d] Session Context is not in SMF [%d]",
|
||||
amf_ue->supi, sess->psi, gsm_header->message_type);
|
||||
nas_5gs_send_back_5gsm_message(sess,
|
||||
OGS_5GSM_CAUSE_PDU_SESSION_DOES_NOT_EXIST);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_back_5gsm_message(sess,
|
||||
OGS_5GSM_CAUSE_PDU_SESSION_DOES_NOT_EXIST));
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
|
@ -1061,8 +1082,9 @@ int gmm_handle_ul_nas_transport(amf_ue_t *amf_ue,
|
|||
default:
|
||||
ogs_error("[%s] Unknown Payload container type [%d]",
|
||||
amf_ue->supi, payload_container_type->value);
|
||||
nas_5gs_send_gmm_status(amf_ue,
|
||||
OGS_5GMM_CAUSE_MESSAGE_TYPE_NON_EXISTENT_OR_NOT_IMPLEMENTED);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_gmm_status(amf_ue,
|
||||
OGS_5GMM_CAUSE_MESSAGE_TYPE_NON_EXISTENT_OR_NOT_IMPLEMENTED));
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
|
|
120
src/amf/gmm-sm.c
120
src/amf/gmm-sm.c
|
@ -139,7 +139,8 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e)
|
|||
|
||||
if (!AMF_UE_HAVE_SUCI(amf_ue)) {
|
||||
CLEAR_AMF_UE_TIMER(amf_ue->t3570);
|
||||
nas_5gs_send_identity_request(amf_ue);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_identity_request(amf_ue));
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -192,7 +193,8 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e)
|
|||
}
|
||||
|
||||
CLEAR_AMF_UE_TIMER(amf_ue->t3550);
|
||||
nas_5gs_send_registration_accept(amf_ue);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_registration_accept(amf_ue));
|
||||
}
|
||||
|
||||
if (amf_ue->next.m_tmsi)
|
||||
|
@ -227,16 +229,20 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e)
|
|||
|
||||
if (!AMF_UE_HAVE_SUCI(amf_ue)) {
|
||||
ogs_info("Service request : Unknown UE");
|
||||
nas_5gs_send_service_reject(amf_ue,
|
||||
OGS_5GMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_service_reject(amf_ue,
|
||||
OGS_5GMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK)
|
||||
);
|
||||
OGS_FSM_TRAN(s, gmm_state_exception);
|
||||
break;
|
||||
}
|
||||
|
||||
if (!h.integrity_protected || !SECURITY_CONTEXT_IS_VALID(amf_ue)) {
|
||||
ogs_error("No Security Context");
|
||||
nas_5gs_send_service_reject(amf_ue,
|
||||
OGS_5GMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_service_reject(amf_ue,
|
||||
OGS_5GMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK)
|
||||
);
|
||||
OGS_FSM_TRAN(s, gmm_state_exception);
|
||||
break;
|
||||
}
|
||||
|
@ -376,7 +382,8 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e)
|
|||
* If t3555 is timeout, the saved pkbuf is used.
|
||||
* In this case, ack should be set to 1 for timer expiration
|
||||
*/
|
||||
nas_5gs_send_configuration_update_command(amf_ue, NULL);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_configuration_update_command(amf_ue, NULL));
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -389,7 +396,8 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e)
|
|||
OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception);
|
||||
} else {
|
||||
amf_ue->t3570.retry_count++;
|
||||
nas_5gs_send_identity_request(amf_ue);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_identity_request(amf_ue));
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -451,7 +459,8 @@ void gmm_state_authentication(ogs_fsm_t *s, amf_event_t *e)
|
|||
amf_ue, &nas_message->gmm.authentication_response);
|
||||
|
||||
if (rv != OGS_OK) {
|
||||
nas_5gs_send_authentication_reject(amf_ue);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_authentication_reject(amf_ue));
|
||||
OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception);
|
||||
}
|
||||
break;
|
||||
|
@ -503,7 +512,8 @@ void gmm_state_authentication(ogs_fsm_t *s, amf_event_t *e)
|
|||
break;
|
||||
}
|
||||
|
||||
nas_5gs_send_authentication_reject(amf_ue);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_authentication_reject(amf_ue));
|
||||
OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception);
|
||||
|
||||
break;
|
||||
|
@ -547,11 +557,13 @@ void gmm_state_authentication(ogs_fsm_t *s, amf_event_t *e)
|
|||
amf_timer_cfg(AMF_TIMER_T3560)->max_count) {
|
||||
ogs_warn("[%s] Retransmission failed. Stop retransmission",
|
||||
amf_ue->suci);
|
||||
nas_5gs_send_authentication_reject(amf_ue);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_authentication_reject(amf_ue));
|
||||
OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception);
|
||||
} else {
|
||||
amf_ue->t3560.retry_count++;
|
||||
nas_5gs_send_authentication_request(amf_ue);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_authentication_request(amf_ue));
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
@ -581,8 +593,9 @@ void gmm_state_authentication(ogs_fsm_t *s, amf_event_t *e)
|
|||
ogs_error("[%s] HTTP response error [%d]",
|
||||
amf_ue->suci, sbi_message->res_status);
|
||||
}
|
||||
nas_5gs_send_gmm_reject_from_sbi(
|
||||
amf_ue, sbi_message->res_status);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_gmm_reject_from_sbi(
|
||||
amf_ue, sbi_message->res_status));
|
||||
OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception);
|
||||
break;
|
||||
}
|
||||
|
@ -594,7 +607,8 @@ void gmm_state_authentication(ogs_fsm_t *s, amf_event_t *e)
|
|||
if (rv != OGS_OK) {
|
||||
ogs_error("[%s] Cannot handle SBI message",
|
||||
amf_ue->suci);
|
||||
nas_5gs_send_authentication_reject(amf_ue);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_authentication_reject(amf_ue));
|
||||
OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception);
|
||||
}
|
||||
break;
|
||||
|
@ -604,7 +618,8 @@ void gmm_state_authentication(ogs_fsm_t *s, amf_event_t *e)
|
|||
if (rv != OGS_OK) {
|
||||
ogs_error("[%s] Cannot handle SBI message",
|
||||
amf_ue->suci);
|
||||
nas_5gs_send_authentication_reject(amf_ue);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_authentication_reject(amf_ue));
|
||||
OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception);
|
||||
} else {
|
||||
OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_security_mode);
|
||||
|
@ -654,7 +669,8 @@ void gmm_state_security_mode(ogs_fsm_t *s, amf_event_t *e)
|
|||
switch (e->id) {
|
||||
case OGS_FSM_ENTRY_SIG:
|
||||
CLEAR_AMF_UE_TIMER(amf_ue->t3560);
|
||||
nas_5gs_send_security_mode_command(amf_ue);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_security_mode_command(amf_ue));
|
||||
break;
|
||||
case OGS_FSM_EXIT_SIG:
|
||||
break;
|
||||
|
@ -676,16 +692,18 @@ void gmm_state_security_mode(ogs_fsm_t *s, amf_event_t *e)
|
|||
ogs_error("[%s] Security-mode : No Integrity Protected",
|
||||
amf_ue->supi);
|
||||
|
||||
nas_5gs_send_gmm_reject(amf_ue,
|
||||
OGS_5GMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_gmm_reject(amf_ue,
|
||||
OGS_5GMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED));
|
||||
OGS_FSM_TRAN(s, &gmm_state_exception);
|
||||
break;
|
||||
}
|
||||
|
||||
if (!SECURITY_CONTEXT_IS_VALID(amf_ue)) {
|
||||
ogs_warn("[%s] No Security Context", amf_ue->supi);
|
||||
nas_5gs_send_gmm_reject(amf_ue,
|
||||
OGS_5GMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_gmm_reject(amf_ue,
|
||||
OGS_5GMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED));
|
||||
OGS_FSM_TRAN(s, &gmm_state_exception);
|
||||
break;
|
||||
}
|
||||
|
@ -694,8 +712,9 @@ void gmm_state_security_mode(ogs_fsm_t *s, amf_event_t *e)
|
|||
amf_ue, &nas_message->gmm.security_mode_complete);
|
||||
if (rv != OGS_OK) {
|
||||
ogs_error("[%s] Cannot handle NAS message", amf_ue->suci);
|
||||
nas_5gs_send_gmm_reject(amf_ue,
|
||||
OGS_5GMM_CAUSE_5GS_SERVICES_NOT_ALLOWED);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_gmm_reject(amf_ue,
|
||||
OGS_5GMM_CAUSE_5GS_SERVICES_NOT_ALLOWED));
|
||||
OGS_FSM_TRAN(s, gmm_state_exception);
|
||||
break;
|
||||
}
|
||||
|
@ -744,8 +763,10 @@ void gmm_state_security_mode(ogs_fsm_t *s, amf_event_t *e)
|
|||
|
||||
case OGS_NAS_5GS_SERVICE_REQUEST:
|
||||
ogs_info("[%s] Service request", amf_ue->supi);
|
||||
nas_5gs_send_service_reject(amf_ue,
|
||||
OGS_5GMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_service_reject(amf_ue,
|
||||
OGS_5GMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK)
|
||||
);
|
||||
OGS_FSM_TRAN(s, &gmm_state_exception);
|
||||
break;
|
||||
|
||||
|
@ -774,12 +795,14 @@ void gmm_state_security_mode(ogs_fsm_t *s, amf_event_t *e)
|
|||
if (amf_ue->t3560.retry_count >=
|
||||
amf_timer_cfg(AMF_TIMER_T3560)->max_count) {
|
||||
ogs_warn("[%s] Retransmission failed. Stop", amf_ue->supi);
|
||||
nas_5gs_send_gmm_reject(amf_ue,
|
||||
OGS_5GMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_gmm_reject(amf_ue,
|
||||
OGS_5GMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED));
|
||||
OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception);
|
||||
} else {
|
||||
amf_ue->t3560.retry_count++;
|
||||
nas_5gs_send_security_mode_command(amf_ue);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_security_mode_command(amf_ue));
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
@ -842,8 +865,9 @@ void gmm_state_initial_context_setup(ogs_fsm_t *s, amf_event_t *e)
|
|||
sbi_message->res_status != OGS_SBI_HTTP_STATUS_OK) {
|
||||
ogs_error("[%s] HTTP response error [%d]",
|
||||
amf_ue->supi, sbi_message->res_status);
|
||||
nas_5gs_send_gmm_reject(
|
||||
amf_ue, OGS_5GMM_CAUSE_5GS_SERVICES_NOT_ALLOWED);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_gmm_reject(
|
||||
amf_ue, OGS_5GMM_CAUSE_5GS_SERVICES_NOT_ALLOWED));
|
||||
OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception);
|
||||
break;
|
||||
}
|
||||
|
@ -878,8 +902,9 @@ void gmm_state_initial_context_setup(ogs_fsm_t *s, amf_event_t *e)
|
|||
if (sbi_message->res_status != OGS_SBI_HTTP_STATUS_OK) {
|
||||
ogs_error("[%s] HTTP response error [%d]",
|
||||
amf_ue->supi, sbi_message->res_status);
|
||||
nas_5gs_send_gmm_reject(
|
||||
amf_ue, OGS_5GMM_CAUSE_5GS_SERVICES_NOT_ALLOWED);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_gmm_reject(
|
||||
amf_ue, OGS_5GMM_CAUSE_5GS_SERVICES_NOT_ALLOWED));
|
||||
OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception);
|
||||
break;
|
||||
}
|
||||
|
@ -888,8 +913,9 @@ void gmm_state_initial_context_setup(ogs_fsm_t *s, amf_event_t *e)
|
|||
if (rv != OGS_OK) {
|
||||
ogs_error("[%s] amf_nudm_sdm_handle_provisioned(%s) failed",
|
||||
amf_ue->supi, sbi_message->h.resource.component[1]);
|
||||
nas_5gs_send_gmm_reject(
|
||||
amf_ue, OGS_5GMM_CAUSE_5GS_SERVICES_NOT_ALLOWED);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_gmm_reject(
|
||||
amf_ue, OGS_5GMM_CAUSE_5GS_SERVICES_NOT_ALLOWED));
|
||||
OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception);
|
||||
break;
|
||||
}
|
||||
|
@ -917,7 +943,8 @@ void gmm_state_initial_context_setup(ogs_fsm_t *s, amf_event_t *e)
|
|||
ogs_assert(amf_ue->nas.message_type ==
|
||||
OGS_NAS_5GS_REGISTRATION_REQUEST);
|
||||
CLEAR_AMF_UE_TIMER(amf_ue->t3550);
|
||||
nas_5gs_send_registration_accept(amf_ue);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_registration_accept(amf_ue));
|
||||
|
||||
if (!amf_ue->next.m_tmsi)
|
||||
OGS_FSM_TRAN(s, &gmm_state_registered);
|
||||
|
@ -982,7 +1009,8 @@ void gmm_state_initial_context_setup(ogs_fsm_t *s, amf_event_t *e)
|
|||
*/
|
||||
memset(¶m, 0, sizeof(param));
|
||||
param.nitz = 1;
|
||||
nas_5gs_send_configuration_update_command(amf_ue, ¶m);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_configuration_update_command(amf_ue, ¶m));
|
||||
|
||||
OGS_FSM_TRAN(s, &gmm_state_registered);
|
||||
break;
|
||||
|
@ -1008,8 +1036,10 @@ void gmm_state_initial_context_setup(ogs_fsm_t *s, amf_event_t *e)
|
|||
|
||||
case OGS_NAS_5GS_SERVICE_REQUEST:
|
||||
ogs_info("[%s] Service request", amf_ue->supi);
|
||||
nas_5gs_send_service_reject(amf_ue,
|
||||
OGS_5GMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_service_reject(amf_ue,
|
||||
OGS_5GMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK)
|
||||
);
|
||||
OGS_FSM_TRAN(s, &gmm_state_exception);
|
||||
break;
|
||||
|
||||
|
@ -1042,7 +1072,8 @@ void gmm_state_initial_context_setup(ogs_fsm_t *s, amf_event_t *e)
|
|||
OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception);
|
||||
} else {
|
||||
amf_ue->t3550.retry_count++;
|
||||
nas_5gs_send_registration_accept(amf_ue);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_registration_accept(amf_ue));
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
@ -1089,9 +1120,10 @@ void gmm_state_exception(ogs_fsm_t *s, amf_event_t *e)
|
|||
amf_ue, AMF_RELEASE_SM_CONTEXT_NO_STATE);
|
||||
|
||||
if (ogs_list_count(&amf_ue->sess_list) == 0)
|
||||
ngap_send_amf_ue_context_release_command(amf_ue,
|
||||
ogs_assert(OGS_OK ==
|
||||
ngap_send_amf_ue_context_release_command(amf_ue,
|
||||
NGAP_Cause_PR_nas, NGAP_CauseNas_normal_release,
|
||||
NGAP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0);
|
||||
NGAP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0));
|
||||
break;
|
||||
case OGS_FSM_EXIT_SIG:
|
||||
break;
|
||||
|
@ -1121,7 +1153,8 @@ void gmm_state_exception(ogs_fsm_t *s, amf_event_t *e)
|
|||
|
||||
if (!AMF_UE_HAVE_SUCI(amf_ue)) {
|
||||
CLEAR_AMF_UE_TIMER(amf_ue->t3570);
|
||||
nas_5gs_send_identity_request(amf_ue);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_identity_request(amf_ue));
|
||||
|
||||
OGS_FSM_TRAN(s, &gmm_state_de_registered);
|
||||
break;
|
||||
|
@ -1176,7 +1209,8 @@ void gmm_state_exception(ogs_fsm_t *s, amf_event_t *e)
|
|||
}
|
||||
|
||||
CLEAR_AMF_UE_TIMER(amf_ue->t3550);
|
||||
nas_5gs_send_registration_accept(amf_ue);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_registration_accept(amf_ue));
|
||||
}
|
||||
|
||||
if (amf_ue->next.m_tmsi)
|
||||
|
|
|
@ -287,7 +287,8 @@ int amf_namf_comm_handle_n1_n2_message_transfer(
|
|||
ngap_send_paging(amf_ue);
|
||||
|
||||
} else if (CM_CONNECTED(amf_ue)) {
|
||||
ngap_send_pdu_resource_setup_request(sess, n2buf);
|
||||
ogs_assert(OGS_OK ==
|
||||
ngap_send_pdu_resource_setup_request(sess, n2buf));
|
||||
|
||||
} else {
|
||||
|
||||
|
|
|
@ -46,24 +46,20 @@ int nas_5gs_send_to_downlink_nas_transport(amf_ue_t *amf_ue, ogs_pkbuf_t *pkbuf)
|
|||
ogs_warn("NG context has already been removed");
|
||||
ogs_pkbuf_free(pkbuf);
|
||||
|
||||
return OGS_ERROR;
|
||||
} else {
|
||||
ngapbuf = ngap_build_downlink_nas_transport(
|
||||
ran_ue, pkbuf, false, false);
|
||||
if (!ngapbuf) {
|
||||
ogs_error("ngap_build_downlink_nas_transport() failed");
|
||||
return OGS_ERROR;
|
||||
}
|
||||
ogs_expect_or_return_val(ngapbuf, OGS_ERROR);
|
||||
|
||||
rv = nas_5gs_send_to_gnb(amf_ue, ngapbuf);
|
||||
if (rv != OGS_OK) {
|
||||
return OGS_ERROR;
|
||||
}
|
||||
}
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return OGS_OK;
|
||||
return rv;
|
||||
}
|
||||
}
|
||||
|
||||
void nas_5gs_send_registration_accept(amf_ue_t *amf_ue)
|
||||
int nas_5gs_send_registration_accept(amf_ue_t *amf_ue)
|
||||
{
|
||||
int rv;
|
||||
bool transfer_needed = false;
|
||||
|
@ -82,10 +78,10 @@ void nas_5gs_send_registration_accept(amf_ue_t *amf_ue)
|
|||
if (amf_ue->next.m_tmsi) {
|
||||
if (amf_ue->t3550.pkbuf) {
|
||||
gmmbuf = amf_ue->t3550.pkbuf;
|
||||
ogs_expect_or_return(gmmbuf);
|
||||
ogs_expect_or_return_val(gmmbuf, OGS_ERROR);
|
||||
} else {
|
||||
gmmbuf = gmm_build_registration_accept(amf_ue);
|
||||
ogs_expect_or_return(gmmbuf);
|
||||
ogs_expect_or_return_val(gmmbuf, OGS_ERROR);
|
||||
}
|
||||
|
||||
amf_ue->t3550.pkbuf = ogs_pkbuf_copy(gmmbuf);
|
||||
|
@ -94,7 +90,7 @@ void nas_5gs_send_registration_accept(amf_ue_t *amf_ue)
|
|||
amf_timer_cfg(AMF_TIMER_T3550)->duration);
|
||||
} else {
|
||||
gmmbuf = gmm_build_registration_accept(amf_ue);
|
||||
ogs_expect_or_return(gmmbuf);
|
||||
ogs_expect_or_return_val(gmmbuf, OGS_ERROR);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -120,32 +116,34 @@ void nas_5gs_send_registration_accept(amf_ue_t *amf_ue)
|
|||
if (ran_ue->initial_context_setup_request_sent == false &&
|
||||
(ran_ue->ue_context_requested == true || transfer_needed == true)) {
|
||||
ngapbuf = ngap_ue_build_initial_context_setup_request(amf_ue, gmmbuf);
|
||||
ogs_expect_or_return(ngapbuf);
|
||||
ogs_expect_or_return_val(ngapbuf, OGS_ERROR);
|
||||
|
||||
rv = nas_5gs_send_to_gnb(amf_ue, ngapbuf);
|
||||
ogs_expect_or_return(rv == OGS_OK);
|
||||
ogs_expect_or_return_val(rv == OGS_OK, OGS_ERROR);
|
||||
|
||||
ran_ue->initial_context_setup_request_sent = true;
|
||||
} else {
|
||||
if (transfer_needed == true) {
|
||||
ngapbuf = ngap_ue_build_pdu_session_resource_setup_request(
|
||||
amf_ue, gmmbuf);
|
||||
ogs_expect_or_return(ngapbuf);
|
||||
ogs_expect_or_return_val(ngapbuf, OGS_ERROR);
|
||||
|
||||
rv = nas_5gs_send_to_gnb(amf_ue, ngapbuf);
|
||||
ogs_expect_or_return(rv == OGS_OK);
|
||||
ogs_expect_or_return_val(rv == OGS_OK, OGS_ERROR);
|
||||
} else {
|
||||
ngapbuf = ngap_build_downlink_nas_transport(
|
||||
ran_ue, gmmbuf, true, true);
|
||||
ogs_expect_or_return(ngapbuf);
|
||||
ogs_expect_or_return_val(ngapbuf, OGS_ERROR);
|
||||
|
||||
rv = nas_5gs_send_to_gnb(amf_ue, ngapbuf);
|
||||
ogs_expect_or_return(rv == OGS_OK);
|
||||
ogs_expect_or_return_val(rv == OGS_OK, OGS_ERROR);
|
||||
}
|
||||
}
|
||||
|
||||
return OGS_OK;
|
||||
}
|
||||
|
||||
void nas_5gs_send_registration_reject(
|
||||
int nas_5gs_send_registration_reject(
|
||||
amf_ue_t *amf_ue, ogs_nas_5gmm_cause_t gmm_cause)
|
||||
{
|
||||
int rv;
|
||||
|
@ -156,13 +154,15 @@ void nas_5gs_send_registration_reject(
|
|||
ogs_warn("[%s] Registration reject [%d]", amf_ue->suci, gmm_cause);
|
||||
|
||||
gmmbuf = gmm_build_registration_reject(gmm_cause);
|
||||
ogs_expect_or_return(gmmbuf);
|
||||
ogs_expect_or_return_val(gmmbuf, OGS_ERROR);
|
||||
|
||||
rv = nas_5gs_send_to_downlink_nas_transport(amf_ue, gmmbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void nas_5gs_send_service_accept(amf_ue_t *amf_ue)
|
||||
int nas_5gs_send_service_accept(amf_ue_t *amf_ue)
|
||||
{
|
||||
int rv;
|
||||
bool transfer_needed = false;
|
||||
|
@ -178,7 +178,7 @@ void nas_5gs_send_service_accept(amf_ue_t *amf_ue)
|
|||
ogs_debug("[%s] Service accept", amf_ue->supi);
|
||||
|
||||
gmmbuf = gmm_build_service_accept(amf_ue);
|
||||
ogs_expect_or_return(gmmbuf);
|
||||
ogs_expect_or_return_val(gmmbuf, OGS_ERROR);
|
||||
|
||||
/*
|
||||
* Previously, AMF would sends PDUSessionResourceSetupRequest
|
||||
|
@ -203,28 +203,30 @@ void nas_5gs_send_service_accept(amf_ue_t *amf_ue)
|
|||
if (ran_ue->initial_context_setup_request_sent == false &&
|
||||
(ran_ue->ue_context_requested == true || transfer_needed == true)) {
|
||||
ngapbuf = ngap_ue_build_initial_context_setup_request(amf_ue, gmmbuf);
|
||||
ogs_expect_or_return(ngapbuf);
|
||||
ogs_expect_or_return_val(ngapbuf, OGS_ERROR);
|
||||
|
||||
rv = nas_5gs_send_to_gnb(amf_ue, ngapbuf);
|
||||
ogs_expect_or_return(rv == OGS_OK);
|
||||
ogs_expect_or_return_val(rv == OGS_OK, OGS_ERROR);
|
||||
|
||||
ran_ue->initial_context_setup_request_sent = true;
|
||||
} else {
|
||||
if (transfer_needed == true) {
|
||||
ngapbuf = ngap_ue_build_pdu_session_resource_setup_request(
|
||||
amf_ue, gmmbuf);
|
||||
ogs_expect_or_return(ngapbuf);
|
||||
ogs_expect_or_return_val(ngapbuf, OGS_ERROR);
|
||||
|
||||
rv = nas_5gs_send_to_gnb(amf_ue, ngapbuf);
|
||||
ogs_expect_or_return(rv == OGS_OK);
|
||||
ogs_expect_or_return_val(rv == OGS_OK, OGS_ERROR);
|
||||
} else {
|
||||
rv = nas_5gs_send_to_downlink_nas_transport(amf_ue, gmmbuf);
|
||||
ogs_expect_or_return(rv == OGS_OK);
|
||||
ogs_expect_or_return_val(rv == OGS_OK, OGS_ERROR);
|
||||
}
|
||||
}
|
||||
|
||||
return OGS_OK;
|
||||
}
|
||||
|
||||
void nas_5gs_send_service_reject(
|
||||
int nas_5gs_send_service_reject(
|
||||
amf_ue_t *amf_ue, ogs_nas_5gmm_cause_t gmm_cause)
|
||||
{
|
||||
int rv;
|
||||
|
@ -235,14 +237,18 @@ void nas_5gs_send_service_reject(
|
|||
ogs_debug("[%s] Service reject", amf_ue->supi);
|
||||
|
||||
gmmbuf = gmm_build_service_reject(amf_ue, gmm_cause);
|
||||
ogs_expect_or_return(gmmbuf);
|
||||
ogs_expect_or_return_val(gmmbuf, OGS_ERROR);
|
||||
|
||||
rv = nas_5gs_send_to_downlink_nas_transport(amf_ue, gmmbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void nas_5gs_send_de_registration_accept(amf_ue_t *amf_ue)
|
||||
int nas_5gs_send_de_registration_accept(amf_ue_t *amf_ue)
|
||||
{
|
||||
int rv;
|
||||
|
||||
ran_ue_t *ran_ue = NULL;
|
||||
ogs_pkbuf_t *gmmbuf = NULL;
|
||||
|
||||
|
@ -256,18 +262,21 @@ void nas_5gs_send_de_registration_accept(amf_ue_t *amf_ue)
|
|||
int rv;
|
||||
|
||||
gmmbuf = gmm_build_de_registration_accept(amf_ue);
|
||||
ogs_expect_or_return(gmmbuf);
|
||||
ogs_expect_or_return_val(gmmbuf, OGS_ERROR);
|
||||
|
||||
rv = nas_5gs_send_to_downlink_nas_transport(amf_ue, gmmbuf);
|
||||
ogs_expect_or_return(rv == OGS_OK);
|
||||
ogs_expect_or_return_val(rv == OGS_OK, OGS_ERROR);
|
||||
}
|
||||
|
||||
ngap_send_ran_ue_context_release_command(ran_ue,
|
||||
rv = ngap_send_ran_ue_context_release_command(ran_ue,
|
||||
NGAP_Cause_PR_nas, NGAP_CauseNas_deregister,
|
||||
NGAP_UE_CTX_REL_NG_REMOVE_AND_UNLINK, 0);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void nas_5gs_send_identity_request(amf_ue_t *amf_ue)
|
||||
int nas_5gs_send_identity_request(amf_ue_t *amf_ue)
|
||||
{
|
||||
int rv;
|
||||
ogs_pkbuf_t *gmmbuf = NULL;
|
||||
|
@ -278,10 +287,10 @@ void nas_5gs_send_identity_request(amf_ue_t *amf_ue)
|
|||
|
||||
if (amf_ue->t3570.pkbuf) {
|
||||
gmmbuf = amf_ue->t3570.pkbuf;
|
||||
ogs_expect_or_return(gmmbuf);
|
||||
ogs_expect_or_return_val(gmmbuf, OGS_ERROR);
|
||||
} else {
|
||||
gmmbuf = gmm_build_identity_request(amf_ue);
|
||||
ogs_expect_or_return(gmmbuf);
|
||||
ogs_expect_or_return_val(gmmbuf, OGS_ERROR);
|
||||
}
|
||||
|
||||
amf_ue->t3570.pkbuf = ogs_pkbuf_copy(gmmbuf);
|
||||
|
@ -291,9 +300,11 @@ void nas_5gs_send_identity_request(amf_ue_t *amf_ue)
|
|||
|
||||
rv = nas_5gs_send_to_downlink_nas_transport(amf_ue, gmmbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void nas_5gs_send_authentication_request(amf_ue_t *amf_ue)
|
||||
int nas_5gs_send_authentication_request(amf_ue_t *amf_ue)
|
||||
{
|
||||
int rv;
|
||||
ogs_pkbuf_t *gmmbuf = NULL;
|
||||
|
@ -304,10 +315,10 @@ void nas_5gs_send_authentication_request(amf_ue_t *amf_ue)
|
|||
|
||||
if (amf_ue->t3560.pkbuf) {
|
||||
gmmbuf = amf_ue->t3560.pkbuf;
|
||||
ogs_expect_or_return(gmmbuf);
|
||||
ogs_expect_or_return_val(gmmbuf, OGS_ERROR);
|
||||
} else {
|
||||
gmmbuf = gmm_build_authentication_request(amf_ue);
|
||||
ogs_expect_or_return(gmmbuf);
|
||||
ogs_expect_or_return_val(gmmbuf, OGS_ERROR);
|
||||
}
|
||||
|
||||
amf_ue->t3560.pkbuf = ogs_pkbuf_copy(gmmbuf);
|
||||
|
@ -317,9 +328,11 @@ void nas_5gs_send_authentication_request(amf_ue_t *amf_ue)
|
|||
|
||||
rv = nas_5gs_send_to_downlink_nas_transport(amf_ue, gmmbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void nas_5gs_send_authentication_reject(amf_ue_t *amf_ue)
|
||||
int nas_5gs_send_authentication_reject(amf_ue_t *amf_ue)
|
||||
{
|
||||
int rv;
|
||||
ogs_pkbuf_t *gmmbuf = NULL;
|
||||
|
@ -329,13 +342,15 @@ void nas_5gs_send_authentication_reject(amf_ue_t *amf_ue)
|
|||
ogs_warn("[%s] Authentication reject", amf_ue->suci);
|
||||
|
||||
gmmbuf = gmm_build_authentication_reject();
|
||||
ogs_expect_or_return(gmmbuf);
|
||||
ogs_expect_or_return_val(gmmbuf, OGS_ERROR);
|
||||
|
||||
rv = nas_5gs_send_to_downlink_nas_transport(amf_ue, gmmbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void nas_5gs_send_security_mode_command(amf_ue_t *amf_ue)
|
||||
int nas_5gs_send_security_mode_command(amf_ue_t *amf_ue)
|
||||
{
|
||||
int rv;
|
||||
ogs_pkbuf_t *gmmbuf = NULL;
|
||||
|
@ -346,10 +361,10 @@ void nas_5gs_send_security_mode_command(amf_ue_t *amf_ue)
|
|||
|
||||
if (amf_ue->t3560.pkbuf) {
|
||||
gmmbuf = amf_ue->t3560.pkbuf;
|
||||
ogs_expect_or_return(gmmbuf);
|
||||
ogs_expect_or_return_val(gmmbuf, OGS_ERROR);
|
||||
} else {
|
||||
gmmbuf = gmm_build_security_mode_command(amf_ue);
|
||||
ogs_expect_or_return(gmmbuf);
|
||||
ogs_expect_or_return_val(gmmbuf, OGS_ERROR);
|
||||
}
|
||||
|
||||
amf_ue->t3560.pkbuf = ogs_pkbuf_copy(gmmbuf);
|
||||
|
@ -359,9 +374,11 @@ void nas_5gs_send_security_mode_command(amf_ue_t *amf_ue)
|
|||
|
||||
rv = nas_5gs_send_to_downlink_nas_transport(amf_ue, gmmbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void nas_5gs_send_configuration_update_command(
|
||||
int nas_5gs_send_configuration_update_command(
|
||||
amf_ue_t *amf_ue, gmm_configuration_update_command_param_t *param)
|
||||
{
|
||||
int rv;
|
||||
|
@ -373,7 +390,7 @@ void nas_5gs_send_configuration_update_command(
|
|||
|
||||
if (amf_ue->t3555.pkbuf) {
|
||||
gmmbuf = amf_ue->t3555.pkbuf;
|
||||
ogs_expect_or_return(gmmbuf);
|
||||
ogs_expect_or_return_val(gmmbuf, OGS_ERROR);
|
||||
|
||||
amf_ue->t3555.pkbuf = ogs_pkbuf_copy(gmmbuf);
|
||||
ogs_assert(amf_ue->t3555.pkbuf);
|
||||
|
@ -381,9 +398,9 @@ void nas_5gs_send_configuration_update_command(
|
|||
amf_timer_cfg(AMF_TIMER_T3555)->duration);
|
||||
|
||||
} else {
|
||||
ogs_expect_or_return(param);
|
||||
ogs_expect_or_return_val(param, OGS_ERROR);
|
||||
gmmbuf = gmm_build_configuration_update_command(amf_ue, param);
|
||||
ogs_expect_or_return(gmmbuf);
|
||||
ogs_expect_or_return_val(gmmbuf, OGS_ERROR);
|
||||
|
||||
if (param->acknowledgement_requested) {
|
||||
amf_ue->t3555.pkbuf = ogs_pkbuf_copy(gmmbuf);
|
||||
|
@ -395,9 +412,11 @@ void nas_5gs_send_configuration_update_command(
|
|||
|
||||
rv = nas_5gs_send_to_downlink_nas_transport(amf_ue, gmmbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void nas_send_pdu_session_release_command(amf_sess_t *sess,
|
||||
int nas_send_pdu_session_release_command(amf_sess_t *sess,
|
||||
ogs_pkbuf_t *n1smbuf, ogs_pkbuf_t *n2smbuf)
|
||||
{
|
||||
int rv;
|
||||
|
@ -415,17 +434,19 @@ void nas_send_pdu_session_release_command(amf_sess_t *sess,
|
|||
|
||||
gmmbuf = gmm_build_dl_nas_transport(sess,
|
||||
OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, n1smbuf, 0, 0);
|
||||
ogs_expect_or_return(gmmbuf);
|
||||
ogs_expect_or_return_val(gmmbuf, OGS_ERROR);
|
||||
|
||||
ngapbuf = ngap_build_pdu_session_resource_release_command(
|
||||
sess, gmmbuf, n2smbuf);
|
||||
ogs_expect_or_return(ngapbuf);
|
||||
ogs_expect_or_return_val(ngapbuf, OGS_ERROR);
|
||||
|
||||
rv = nas_5gs_send_to_gnb(amf_ue, ngapbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void nas_5gs_send_gmm_status(amf_ue_t *amf_ue, ogs_nas_5gmm_cause_t cause)
|
||||
int nas_5gs_send_gmm_status(amf_ue_t *amf_ue, ogs_nas_5gmm_cause_t cause)
|
||||
{
|
||||
int rv;
|
||||
ogs_pkbuf_t *gmmbuf = NULL;
|
||||
|
@ -435,27 +456,35 @@ void nas_5gs_send_gmm_status(amf_ue_t *amf_ue, ogs_nas_5gmm_cause_t cause)
|
|||
ogs_debug("[%s] 5GMM status", amf_ue->supi);
|
||||
|
||||
gmmbuf = gmm_build_status(amf_ue, cause);
|
||||
ogs_expect_or_return(gmmbuf);
|
||||
ogs_expect_or_return_val(gmmbuf, OGS_ERROR);
|
||||
|
||||
rv = nas_5gs_send_to_downlink_nas_transport(amf_ue, gmmbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void nas_5gs_send_gmm_reject(
|
||||
int nas_5gs_send_gmm_reject(
|
||||
amf_ue_t *amf_ue, ogs_nas_5gmm_cause_t gmm_cause)
|
||||
{
|
||||
int rv;
|
||||
ogs_assert(amf_ue);
|
||||
|
||||
switch(amf_ue->nas.message_type) {
|
||||
case OGS_NAS_5GS_REGISTRATION_REQUEST:
|
||||
nas_5gs_send_registration_reject(amf_ue, gmm_cause);
|
||||
rv = nas_5gs_send_registration_reject(amf_ue, gmm_cause);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
break;
|
||||
case OGS_NAS_5GS_SERVICE_REQUEST:
|
||||
nas_5gs_send_service_reject(amf_ue, gmm_cause);
|
||||
rv = nas_5gs_send_service_reject(amf_ue, gmm_cause);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
break;
|
||||
default:
|
||||
ogs_error("Unknown message type [%d]", amf_ue->nas.message_type);
|
||||
rv = OGS_ERROR;
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
static ogs_nas_5gmm_cause_t gmm_cause_from_sbi(int status)
|
||||
|
@ -483,13 +512,18 @@ static ogs_nas_5gmm_cause_t gmm_cause_from_sbi(int status)
|
|||
return gmm_cause;
|
||||
}
|
||||
|
||||
void nas_5gs_send_gmm_reject_from_sbi(amf_ue_t *amf_ue, int status)
|
||||
int nas_5gs_send_gmm_reject_from_sbi(amf_ue_t *amf_ue, int status)
|
||||
{
|
||||
int rv;
|
||||
|
||||
ogs_assert(amf_ue);
|
||||
nas_5gs_send_gmm_reject(amf_ue, gmm_cause_from_sbi(status));
|
||||
rv = nas_5gs_send_gmm_reject(amf_ue, gmm_cause_from_sbi(status));
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void nas_5gs_send_gsm_reject(amf_sess_t *sess,
|
||||
int nas_5gs_send_gsm_reject(amf_sess_t *sess,
|
||||
uint8_t payload_container_type, ogs_pkbuf_t *payload_container,
|
||||
ogs_nas_5gmm_cause_t cause, uint8_t backoff_time)
|
||||
{
|
||||
|
@ -509,26 +543,34 @@ void nas_5gs_send_gsm_reject(amf_sess_t *sess,
|
|||
|
||||
gmmbuf = gmm_build_dl_nas_transport(sess,
|
||||
payload_container_type, payload_container, cause, backoff_time);
|
||||
ogs_expect_or_return(gmmbuf);
|
||||
ogs_expect_or_return_val(gmmbuf, OGS_ERROR);
|
||||
rv = nas_5gs_send_to_downlink_nas_transport(amf_ue, gmmbuf);
|
||||
ogs_expect_or_return(rv == OGS_OK);
|
||||
ogs_expect_or_return_val(rv == OGS_OK, OGS_ERROR);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void nas_5gs_send_gsm_reject_from_sbi(amf_sess_t *sess,
|
||||
int nas_5gs_send_gsm_reject_from_sbi(amf_sess_t *sess,
|
||||
uint8_t payload_container_type, ogs_pkbuf_t *payload_container,
|
||||
int status)
|
||||
{
|
||||
int rv;
|
||||
|
||||
ogs_assert(sess);
|
||||
ogs_assert(payload_container_type);
|
||||
ogs_assert(payload_container);
|
||||
|
||||
nas_5gs_send_gsm_reject(sess, payload_container_type, payload_container,
|
||||
rv = nas_5gs_send_gsm_reject(sess, payload_container_type, payload_container,
|
||||
gmm_cause_from_sbi(status), AMF_NAS_BACKOFF_TIME);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void nas_5gs_send_back_5gsm_message(
|
||||
int nas_5gs_send_back_5gsm_message(
|
||||
amf_sess_t *sess, ogs_nas_5gmm_cause_t cause)
|
||||
{
|
||||
int rv;
|
||||
ogs_pkbuf_t *pbuf = NULL;
|
||||
|
||||
ogs_assert(sess);
|
||||
|
@ -538,12 +580,21 @@ void nas_5gs_send_back_5gsm_message(
|
|||
pbuf = ogs_pkbuf_copy(sess->payload_container);
|
||||
ogs_assert(pbuf);
|
||||
|
||||
nas_5gs_send_gsm_reject(sess, sess->payload_container_type, pbuf,
|
||||
rv = nas_5gs_send_gsm_reject(sess, sess->payload_container_type, pbuf,
|
||||
cause, AMF_NAS_BACKOFF_TIME);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void nas_5gs_send_back_5gsm_message_from_sbi(amf_sess_t *sess, int status)
|
||||
int nas_5gs_send_back_5gsm_message_from_sbi(amf_sess_t *sess, int status)
|
||||
{
|
||||
int rv;
|
||||
|
||||
ogs_assert(sess);
|
||||
nas_5gs_send_back_5gsm_message(sess, gmm_cause_from_sbi(status));
|
||||
}
|
||||
|
||||
rv = nas_5gs_send_back_5gsm_message(sess, gmm_cause_from_sbi(status));
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
|
@ -32,57 +32,47 @@ int nas_5gs_send_to_gnb(amf_ue_t *amf_ue, ogs_pkbuf_t *pkbuf);
|
|||
int nas_5gs_send_to_downlink_nas_transport(
|
||||
amf_ue_t *amf_ue, ogs_pkbuf_t *pkbuf);
|
||||
|
||||
void nas_5gs_send_registration_accept(amf_ue_t *amf_ue);
|
||||
void nas_5gs_send_registration_reject(
|
||||
int nas_5gs_send_registration_accept(amf_ue_t *amf_ue);
|
||||
int nas_5gs_send_registration_reject(
|
||||
amf_ue_t *amf_ue, ogs_nas_5gmm_cause_t gmm_cause);
|
||||
|
||||
void nas_5gs_send_service_accept(amf_ue_t *amf_ue);
|
||||
void nas_5gs_send_service_reject(
|
||||
int nas_5gs_send_service_accept(amf_ue_t *amf_ue);
|
||||
int nas_5gs_send_service_reject(
|
||||
amf_ue_t *amf_ue, ogs_nas_5gmm_cause_t gmm_cause);
|
||||
|
||||
void nas_5gs_send_de_registration_accept(amf_ue_t *amf_ue);
|
||||
int nas_5gs_send_de_registration_accept(amf_ue_t *amf_ue);
|
||||
|
||||
void nas_5gs_send_identity_request(amf_ue_t *amf_ue);
|
||||
int nas_5gs_send_identity_request(amf_ue_t *amf_ue);
|
||||
|
||||
void nas_5gs_send_authentication_request(amf_ue_t *amf_ue);
|
||||
void nas_5gs_send_authentication_reject(amf_ue_t *amf_ue);
|
||||
int nas_5gs_send_authentication_request(amf_ue_t *amf_ue);
|
||||
int nas_5gs_send_authentication_reject(amf_ue_t *amf_ue);
|
||||
|
||||
void nas_5gs_send_security_mode_command(amf_ue_t *amf_ue);
|
||||
int nas_5gs_send_security_mode_command(amf_ue_t *amf_ue);
|
||||
|
||||
void nas_5gs_send_configuration_update_command(
|
||||
int nas_5gs_send_configuration_update_command(
|
||||
amf_ue_t *amf_ue, gmm_configuration_update_command_param_t *param);
|
||||
|
||||
void nas_send_pdu_session_release_command(amf_sess_t *sess,
|
||||
int nas_send_pdu_session_release_command(amf_sess_t *sess,
|
||||
ogs_pkbuf_t *n1smbuf, ogs_pkbuf_t *n2smbuf);
|
||||
|
||||
void nas_5gs_send_gmm_status(amf_ue_t *amf_ue, ogs_nas_5gmm_cause_t cause);
|
||||
int nas_5gs_send_gmm_status(amf_ue_t *amf_ue, ogs_nas_5gmm_cause_t cause);
|
||||
|
||||
void nas_5gs_send_gmm_reject(
|
||||
int nas_5gs_send_gmm_reject(
|
||||
amf_ue_t *amf_ue, ogs_nas_5gmm_cause_t gmm_cause);
|
||||
void nas_5gs_send_gmm_reject_from_sbi(amf_ue_t *amf_ue, int status);
|
||||
int nas_5gs_send_gmm_reject_from_sbi(amf_ue_t *amf_ue, int status);
|
||||
|
||||
void nas_5gs_send_gsm_reject(amf_sess_t *sess,
|
||||
int nas_5gs_send_gsm_reject(amf_sess_t *sess,
|
||||
uint8_t payload_container_type, ogs_pkbuf_t *payload_container,
|
||||
ogs_nas_5gmm_cause_t cause, uint8_t backoff_time);
|
||||
void nas_5gs_send_gsm_reject_from_sbi(amf_sess_t *sess,
|
||||
int nas_5gs_send_gsm_reject_from_sbi(amf_sess_t *sess,
|
||||
uint8_t payload_container_type, ogs_pkbuf_t *payload_container,
|
||||
int status);
|
||||
void nas_5gs_send_back_5gsm_message(
|
||||
int nas_5gs_send_back_5gsm_message(
|
||||
amf_sess_t *sess, ogs_nas_5gmm_cause_t gmm_cause);
|
||||
void nas_5gs_send_back_5gsm_message_from_sbi(amf_sess_t *sess, int status);
|
||||
|
||||
#if 0
|
||||
void nas_5gs_send_tau_accept(
|
||||
amf_ue_t *amf_ue, S1AP_ProcedureCode_t procedureCode);
|
||||
void nas_5gs_send_tau_reject(amf_ue_t *amf_ue, ogs_nas_5gsm_cause_t gmm_cause);
|
||||
|
||||
void nas_5gs_send_cs_service_notification(amf_ue_t *amf_ue);
|
||||
void nas_5gs_send_downlink_nas_transport(
|
||||
amf_ue_t *amf_ue, uint8_t *buffer, uint8_t length);
|
||||
#endif
|
||||
int nas_5gs_send_back_5gsm_message_from_sbi(amf_sess_t *sess, int status);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* AMF_NAS_5GS_PATH_H */
|
||||
#endif /* AMF_NAS_5GS_PATH_H */
|
|
@ -110,7 +110,8 @@ int amf_nausf_auth_handle_authenticate(
|
|||
|
||||
amf_ue->nas.ue.ksi = amf_ue->nas.amf.ksi;
|
||||
|
||||
nas_5gs_send_authentication_request(amf_ue);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_authentication_request(amf_ue));
|
||||
|
||||
return OGS_OK;
|
||||
}
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -236,75 +236,71 @@ int ngap_send_to_nas(ran_ue_t *ran_ue,
|
|||
}
|
||||
}
|
||||
|
||||
void ngap_send_ng_setup_response(amf_gnb_t *gnb)
|
||||
int ngap_send_ng_setup_response(amf_gnb_t *gnb)
|
||||
{
|
||||
int rv;
|
||||
ogs_pkbuf_t *ngap_buffer;
|
||||
|
||||
ogs_debug("NG-Setup response");
|
||||
ngap_buffer = ngap_build_ng_setup_response();
|
||||
ogs_expect_or_return(ngap_buffer);
|
||||
ogs_expect_or_return_val(ngap_buffer, OGS_ERROR);
|
||||
|
||||
ogs_expect(OGS_OK ==
|
||||
ngap_send_to_gnb(gnb, ngap_buffer, NGAP_NON_UE_SIGNALLING));
|
||||
rv = ngap_send_to_gnb(gnb, ngap_buffer, NGAP_NON_UE_SIGNALLING);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void ngap_send_ng_setup_failure(
|
||||
int ngap_send_ng_setup_failure(
|
||||
amf_gnb_t *gnb, NGAP_Cause_PR group, long cause)
|
||||
{
|
||||
int rv;
|
||||
ogs_pkbuf_t *ngap_buffer;
|
||||
|
||||
ogs_debug("NG-Setup failure");
|
||||
ngap_buffer = ngap_build_ng_setup_failure(
|
||||
group, cause, NGAP_TimeToWait_v10s);
|
||||
ogs_expect_or_return(ngap_buffer);
|
||||
ogs_expect_or_return_val(ngap_buffer, OGS_ERROR);
|
||||
|
||||
ogs_expect(OGS_OK ==
|
||||
ngap_send_to_gnb(gnb, ngap_buffer, NGAP_NON_UE_SIGNALLING));
|
||||
rv = ngap_send_to_gnb(gnb, ngap_buffer, NGAP_NON_UE_SIGNALLING);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void ngap_send_ran_configuration_update_ack(amf_gnb_t *gnb)
|
||||
int ngap_send_ran_configuration_update_ack(amf_gnb_t *gnb)
|
||||
{
|
||||
int rv;
|
||||
ogs_pkbuf_t *ngap_buffer;
|
||||
|
||||
ogs_debug("RANConfigurationUpdateAcknowledge");
|
||||
ngap_buffer = ngap_build_ran_configuration_update_ack();
|
||||
ogs_expect_or_return(ngap_buffer);
|
||||
ogs_expect_or_return_val(ngap_buffer, OGS_ERROR);
|
||||
|
||||
ogs_expect(OGS_OK ==
|
||||
ngap_send_to_gnb(gnb, ngap_buffer, NGAP_NON_UE_SIGNALLING));
|
||||
rv = ngap_send_to_gnb(gnb, ngap_buffer, NGAP_NON_UE_SIGNALLING);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void ngap_send_ran_configuration_update_failure(
|
||||
int ngap_send_ran_configuration_update_failure(
|
||||
amf_gnb_t *gnb, NGAP_Cause_PR group, long cause)
|
||||
{
|
||||
int rv;
|
||||
ogs_pkbuf_t *ngap_buffer;
|
||||
|
||||
ogs_debug("RANConfigurationUpdateFailure");
|
||||
ngap_buffer = ngap_build_ran_configuration_update_failure(
|
||||
group, cause, NGAP_TimeToWait_v10s);
|
||||
ogs_expect_or_return(ngap_buffer);
|
||||
ogs_expect_or_return_val(ngap_buffer, OGS_ERROR);
|
||||
|
||||
ogs_expect(OGS_OK ==
|
||||
ngap_send_to_gnb(gnb, ngap_buffer, NGAP_NON_UE_SIGNALLING));
|
||||
}
|
||||
|
||||
#if 0
|
||||
void ngap_send_ue_context_modification_request(amf_ue_t *amf_ue)
|
||||
{
|
||||
int rv;
|
||||
ogs_pkbuf_t *ngapbuf = NULL;
|
||||
|
||||
ogs_assert(amf_ue);
|
||||
|
||||
ngapbuf = ngap_build_ue_context_modification_request(amf_ue);
|
||||
ogs_expect_or_return(ngapbuf);
|
||||
|
||||
rv = nas_5gs_send_to_gnb(amf_ue, ngapbuf);
|
||||
rv = ngap_send_to_gnb(gnb, ngap_buffer, NGAP_NON_UE_SIGNALLING);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
}
|
||||
#endif
|
||||
|
||||
void ngap_send_ran_ue_context_release_command(
|
||||
return rv;
|
||||
}
|
||||
|
||||
int ngap_send_ran_ue_context_release_command(
|
||||
ran_ue_t *ran_ue, NGAP_Cause_PR group, long cause,
|
||||
uint8_t action, ogs_time_t duration)
|
||||
{
|
||||
|
@ -324,16 +320,18 @@ void ngap_send_ran_ue_context_release_command(
|
|||
group, (int)cause, action, (int)duration);
|
||||
|
||||
ngapbuf = ngap_build_ue_context_release_command(ran_ue, group, cause);
|
||||
ogs_expect_or_return(ngapbuf);
|
||||
ogs_expect_or_return_val(ngapbuf, OGS_ERROR);
|
||||
|
||||
rv = ngap_delayed_send_to_ran_ue(ran_ue, ngapbuf, duration);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
ogs_timer_start(ran_ue->t_ng_holding,
|
||||
amf_timer_cfg(AMF_TIMER_NG_HOLDING)->duration);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void ngap_send_amf_ue_context_release_command(
|
||||
int ngap_send_amf_ue_context_release_command(
|
||||
amf_ue_t *amf_ue, NGAP_Cause_PR group, long cause,
|
||||
uint8_t action, ogs_time_t duration)
|
||||
{
|
||||
|
@ -341,14 +339,17 @@ void ngap_send_amf_ue_context_release_command(
|
|||
|
||||
ran_ue_t *ran_ue = ran_ue_cycle(amf_ue->ran_ue);
|
||||
if (ran_ue) {
|
||||
ngap_send_ran_ue_context_release_command(ran_ue,
|
||||
group, cause, action, duration);
|
||||
ogs_assert(OGS_OK ==
|
||||
ngap_send_ran_ue_context_release_command(ran_ue,
|
||||
group, cause, action, duration));
|
||||
ogs_debug(" SUPI[%s]", amf_ue->supi);
|
||||
} else {
|
||||
ogs_error("[%s] No NG Context - "
|
||||
"Group[%d] Cause[%d] Action[%d] Duration[%d]",
|
||||
amf_ue->supi, group, (int)cause, action, (int)duration);
|
||||
}
|
||||
|
||||
return OGS_OK;
|
||||
}
|
||||
|
||||
void ngap_send_paging(amf_ue_t *amf_ue)
|
||||
|
@ -387,7 +388,7 @@ void ngap_send_paging(amf_ue_t *amf_ue)
|
|||
amf_timer_cfg(AMF_TIMER_T3513)->duration);
|
||||
}
|
||||
|
||||
void ngap_send_pdu_resource_setup_request(
|
||||
int ngap_send_pdu_resource_setup_request(
|
||||
amf_sess_t *sess, ogs_pkbuf_t *n2smbuf)
|
||||
{
|
||||
int rv;
|
||||
|
@ -406,23 +407,25 @@ void ngap_send_pdu_resource_setup_request(
|
|||
ran_ue->initial_context_setup_request_sent == false) {
|
||||
ngapbuf = ngap_sess_build_initial_context_setup_request(
|
||||
sess, NULL, n2smbuf);
|
||||
ogs_expect_or_return(ngapbuf);
|
||||
ogs_expect_or_return_val(ngapbuf, OGS_ERROR);
|
||||
|
||||
rv = nas_5gs_send_to_gnb(amf_ue, ngapbuf);
|
||||
ogs_expect_or_return(rv == OGS_OK);
|
||||
ogs_expect_or_return_val(rv == OGS_OK, OGS_ERROR);
|
||||
|
||||
ran_ue->initial_context_setup_request_sent = true;
|
||||
} else {
|
||||
ngapbuf = ngap_sess_build_pdu_session_resource_setup_request(
|
||||
sess, NULL, n2smbuf);
|
||||
ogs_expect_or_return(ngapbuf);
|
||||
ogs_expect_or_return_val(ngapbuf, OGS_ERROR);
|
||||
|
||||
rv = nas_5gs_send_to_gnb(amf_ue, ngapbuf);
|
||||
ogs_expect_or_return(rv == OGS_OK);
|
||||
ogs_expect_or_return_val(rv == OGS_OK, OGS_ERROR);
|
||||
}
|
||||
|
||||
return OGS_OK;
|
||||
}
|
||||
|
||||
void ngap_send_downlink_ran_configuration_transfer(
|
||||
int ngap_send_downlink_ran_configuration_transfer(
|
||||
amf_gnb_t *target_gnb, NGAP_SONConfigurationTransfer_t *transfer)
|
||||
{
|
||||
int rv;
|
||||
|
@ -432,13 +435,15 @@ void ngap_send_downlink_ran_configuration_transfer(
|
|||
ogs_assert(transfer);
|
||||
|
||||
ngapbuf = ngap_build_downlink_ran_configuration_transfer(transfer);
|
||||
ogs_expect_or_return(ngapbuf);
|
||||
ogs_expect_or_return_val(ngapbuf, OGS_ERROR);
|
||||
|
||||
rv = ngap_send_to_gnb(target_gnb, ngapbuf, NGAP_NON_UE_SIGNALLING);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void ngap_send_path_switch_ack(amf_sess_t *sess)
|
||||
int ngap_send_path_switch_ack(amf_sess_t *sess)
|
||||
{
|
||||
int rv;
|
||||
|
||||
|
@ -450,13 +455,15 @@ void ngap_send_path_switch_ack(amf_sess_t *sess)
|
|||
ogs_assert(amf_ue);
|
||||
|
||||
ngapbuf = ngap_build_path_switch_ack(amf_ue);
|
||||
ogs_expect_or_return(ngapbuf);
|
||||
ogs_expect_or_return_val(ngapbuf, OGS_ERROR);
|
||||
|
||||
rv = nas_5gs_send_to_gnb(amf_ue, ngapbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void ngap_send_handover_request(amf_ue_t *amf_ue)
|
||||
int ngap_send_handover_request(amf_ue_t *amf_ue)
|
||||
{
|
||||
int rv;
|
||||
|
||||
|
@ -471,13 +478,15 @@ void ngap_send_handover_request(amf_ue_t *amf_ue)
|
|||
ogs_assert(target_ue);
|
||||
|
||||
ngapbuf = ngap_build_handover_request(target_ue);
|
||||
ogs_expect_or_return(ngapbuf);
|
||||
ogs_expect_or_return_val(ngapbuf, OGS_ERROR);
|
||||
|
||||
rv = ngap_send_to_ran_ue(target_ue, ngapbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void ngap_send_handover_preparation_failure(
|
||||
int ngap_send_handover_preparation_failure(
|
||||
ran_ue_t *source_ue, NGAP_Cause_t *cause)
|
||||
{
|
||||
int rv;
|
||||
|
@ -487,13 +496,15 @@ void ngap_send_handover_preparation_failure(
|
|||
ogs_assert(cause);
|
||||
|
||||
ngapbuf = ngap_build_handover_preparation_failure(source_ue, cause);
|
||||
ogs_expect_or_return(ngapbuf);
|
||||
ogs_expect_or_return_val(ngapbuf, OGS_ERROR);
|
||||
|
||||
rv = ngap_send_to_ran_ue(source_ue, ngapbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void ngap_send_handover_command(amf_ue_t *amf_ue)
|
||||
int ngap_send_handover_command(amf_ue_t *amf_ue)
|
||||
{
|
||||
int rv;
|
||||
|
||||
|
@ -505,13 +516,15 @@ void ngap_send_handover_command(amf_ue_t *amf_ue)
|
|||
ogs_assert(source_ue);
|
||||
|
||||
ngapbuf = ngap_build_handover_command(source_ue);
|
||||
ogs_expect_or_return(ngapbuf);
|
||||
ogs_expect_or_return_val(ngapbuf, OGS_ERROR);
|
||||
|
||||
rv = ngap_send_to_ran_ue(source_ue, ngapbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void ngap_send_handover_cancel_ack(ran_ue_t *source_ue)
|
||||
int ngap_send_handover_cancel_ack(ran_ue_t *source_ue)
|
||||
{
|
||||
int rv;
|
||||
ogs_pkbuf_t *ngapbuf = NULL;
|
||||
|
@ -519,13 +532,15 @@ void ngap_send_handover_cancel_ack(ran_ue_t *source_ue)
|
|||
ogs_assert(source_ue);
|
||||
|
||||
ngapbuf = ngap_build_handover_cancel_ack(source_ue);
|
||||
ogs_expect_or_return(ngapbuf);
|
||||
ogs_expect_or_return_val(ngapbuf, OGS_ERROR);
|
||||
|
||||
rv = ngap_send_to_ran_ue(source_ue, ngapbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void ngap_send_downlink_ran_status_transfer(
|
||||
int ngap_send_downlink_ran_status_transfer(
|
||||
ran_ue_t *target_ue,
|
||||
NGAP_RANStatusTransfer_TransparentContainer_t *transfer)
|
||||
{
|
||||
|
@ -536,13 +551,15 @@ void ngap_send_downlink_ran_status_transfer(
|
|||
ogs_assert(transfer);
|
||||
|
||||
ngapbuf = ngap_build_uplink_ran_status_transfer(target_ue, transfer);
|
||||
ogs_expect_or_return(ngapbuf);
|
||||
ogs_expect_or_return_val(ngapbuf, OGS_ERROR);
|
||||
|
||||
rv = ngap_send_to_ran_ue(target_ue, ngapbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void ngap_send_error_indication(
|
||||
int ngap_send_error_indication(
|
||||
amf_gnb_t *gnb,
|
||||
uint32_t *ran_ue_ngap_id,
|
||||
uint64_t *amf_ue_ngap_id,
|
||||
|
@ -555,29 +572,35 @@ void ngap_send_error_indication(
|
|||
|
||||
ngapbuf = ogs_ngap_build_error_indication(
|
||||
ran_ue_ngap_id, amf_ue_ngap_id, group, cause);
|
||||
ogs_expect_or_return(ngapbuf);
|
||||
ogs_expect_or_return_val(ngapbuf, OGS_ERROR);
|
||||
|
||||
rv = ngap_send_to_gnb(gnb, ngapbuf, NGAP_NON_UE_SIGNALLING);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void ngap_send_error_indication2(
|
||||
int ngap_send_error_indication2(
|
||||
amf_ue_t *amf_ue, NGAP_Cause_PR group, long cause)
|
||||
{
|
||||
int rv;
|
||||
amf_gnb_t *gnb;
|
||||
ran_ue_t *ran_ue;
|
||||
|
||||
ogs_assert(amf_ue);
|
||||
ran_ue = ran_ue_cycle(amf_ue->ran_ue);
|
||||
ogs_expect_or_return(ran_ue);
|
||||
ogs_expect_or_return_val(ran_ue, OGS_ERROR);
|
||||
gnb = ran_ue->gnb;
|
||||
ogs_expect_or_return(gnb);
|
||||
ogs_expect_or_return_val(gnb, OGS_ERROR);
|
||||
|
||||
ngap_send_error_indication(
|
||||
rv = ngap_send_error_indication(
|
||||
gnb, &ran_ue->ran_ue_ngap_id, &ran_ue->amf_ue_ngap_id, group, cause);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void ngap_send_ng_reset_ack(
|
||||
int ngap_send_ng_reset_ack(
|
||||
amf_gnb_t *gnb,
|
||||
NGAP_UE_associatedLogicalNG_connectionList_t *partOfNG_Interface)
|
||||
{
|
||||
|
@ -587,8 +610,10 @@ void ngap_send_ng_reset_ack(
|
|||
ogs_assert(gnb);
|
||||
|
||||
ngapbuf = ogs_ngap_build_ng_reset_ack(partOfNG_Interface);
|
||||
ogs_expect_or_return(ngapbuf);
|
||||
ogs_expect_or_return_val(ngapbuf, OGS_ERROR);
|
||||
|
||||
rv = ngap_send_to_gnb(gnb, ngapbuf, NGAP_NON_UE_SIGNALLING);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
|
|
@ -47,49 +47,47 @@ int ngap_send_to_nas(ran_ue_t *ran_ue,
|
|||
NGAP_ProcedureCode_t procedureCode, NGAP_NAS_PDU_t *nasPdu);
|
||||
int ngap_send_to_5gsm(amf_ue_t *amf_ue, ogs_pkbuf_t *esmbuf);
|
||||
|
||||
void ngap_send_ng_setup_response(amf_gnb_t *gnb);
|
||||
void ngap_send_ng_setup_failure(
|
||||
int ngap_send_ng_setup_response(amf_gnb_t *gnb);
|
||||
int ngap_send_ng_setup_failure(
|
||||
amf_gnb_t *gnb, NGAP_Cause_PR group, long cause);
|
||||
void ngap_send_ran_configuration_update_ack(amf_gnb_t *gnb);
|
||||
void ngap_send_ran_configuration_update_failure(
|
||||
int ngap_send_ran_configuration_update_ack(amf_gnb_t *gnb);
|
||||
int ngap_send_ran_configuration_update_failure(
|
||||
amf_gnb_t *gnb, NGAP_Cause_PR group, long cause);
|
||||
|
||||
void ngap_send_ue_context_modification_request(amf_ue_t *amf_ue);
|
||||
|
||||
void ngap_send_ran_ue_context_release_command(
|
||||
int ngap_send_ran_ue_context_release_command(
|
||||
ran_ue_t *ran_ue, NGAP_Cause_PR group, long cause,
|
||||
uint8_t action, ogs_time_t delay);
|
||||
void ngap_send_amf_ue_context_release_command(
|
||||
int ngap_send_amf_ue_context_release_command(
|
||||
amf_ue_t *amf_ue, NGAP_Cause_PR group, long cause,
|
||||
uint8_t action, ogs_time_t delay);
|
||||
|
||||
void ngap_send_paging(amf_ue_t *amf_ue);
|
||||
void ngap_send_pdu_resource_setup_request(
|
||||
int ngap_send_pdu_resource_setup_request(
|
||||
amf_sess_t *sess, ogs_pkbuf_t *n2smbuf);
|
||||
|
||||
void ngap_send_downlink_ran_configuration_transfer(
|
||||
int ngap_send_downlink_ran_configuration_transfer(
|
||||
amf_gnb_t *target_gnb, NGAP_SONConfigurationTransfer_t *transfer);
|
||||
|
||||
void ngap_send_path_switch_ack(amf_sess_t *sess);
|
||||
int ngap_send_path_switch_ack(amf_sess_t *sess);
|
||||
|
||||
void ngap_send_handover_request(amf_ue_t *amf_ue);
|
||||
void ngap_send_handover_preparation_failure(
|
||||
int ngap_send_handover_request(amf_ue_t *amf_ue);
|
||||
int ngap_send_handover_preparation_failure(
|
||||
ran_ue_t *source_ue, NGAP_Cause_t *cause);
|
||||
void ngap_send_handover_command(amf_ue_t *amf_ue);
|
||||
void ngap_send_handover_cancel_ack(ran_ue_t *source_ue);
|
||||
int ngap_send_handover_command(amf_ue_t *amf_ue);
|
||||
int ngap_send_handover_cancel_ack(ran_ue_t *source_ue);
|
||||
|
||||
void ngap_send_downlink_ran_status_transfer(
|
||||
int ngap_send_downlink_ran_status_transfer(
|
||||
ran_ue_t *target_ue,
|
||||
NGAP_RANStatusTransfer_TransparentContainer_t *transfer);
|
||||
|
||||
void ngap_send_error_indication(
|
||||
int ngap_send_error_indication(
|
||||
amf_gnb_t *gnb,
|
||||
uint32_t *ran_ue_ngap_id,
|
||||
uint64_t *amf_ue_ngap_id,
|
||||
NGAP_Cause_PR group, long cause);
|
||||
void ngap_send_error_indication2(
|
||||
int ngap_send_error_indication2(
|
||||
amf_ue_t *amf_ue, NGAP_Cause_PR group, long cause);
|
||||
void ngap_send_ng_reset_ack(
|
||||
int ngap_send_ng_reset_ack(
|
||||
amf_gnb_t *gnb,
|
||||
NGAP_UE_associatedLogicalNG_connectionList_t *partOfNG_Interface);
|
||||
|
||||
|
@ -97,4 +95,4 @@ void ngap_send_ng_reset_ack(
|
|||
}
|
||||
#endif
|
||||
|
||||
#endif /* NGAP_PATH_H */
|
||||
#endif /* NGAP_PATH_H */
|
|
@ -276,8 +276,9 @@ void amf_nnrf_handle_nf_discover(
|
|||
ogs_assert(amf_ue);
|
||||
ogs_error("[%s] (NF discover) No [%s]", amf_ue->suci,
|
||||
OpenAPI_nf_type_ToString(xact->target_nf_type));
|
||||
nas_5gs_send_gmm_reject_from_sbi(amf_ue,
|
||||
OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_gmm_reject_from_sbi(amf_ue,
|
||||
OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT));
|
||||
break;
|
||||
case OGS_SBI_OBJ_SESS_TYPE:
|
||||
sess = (amf_sess_t *)sbi_object;
|
||||
|
@ -285,12 +286,14 @@ void amf_nnrf_handle_nf_discover(
|
|||
ogs_error("[%d:%d] (NF discover) No [%s]", sess->psi, sess->pti,
|
||||
OpenAPI_nf_type_ToString(xact->target_nf_type));
|
||||
if (sess->payload_container_type) {
|
||||
nas_5gs_send_back_5gsm_message_from_sbi(sess,
|
||||
OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_back_5gsm_message_from_sbi(sess,
|
||||
OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT));
|
||||
} else {
|
||||
ngap_send_error_indication2(amf_ue,
|
||||
ogs_assert(OGS_OK ==
|
||||
ngap_send_error_indication2(amf_ue,
|
||||
NGAP_Cause_PR_transport,
|
||||
NGAP_CauseTransport_transport_resource_unavailable);
|
||||
NGAP_CauseTransport_transport_resource_unavailable));
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
|
|
@ -42,30 +42,34 @@ int amf_nnssf_nsselection_handle_get(
|
|||
if (recvmsg->res_status != OGS_SBI_HTTP_STATUS_OK) {
|
||||
ogs_error("[%s] HTTP response error [%d]",
|
||||
amf_ue->supi, recvmsg->res_status);
|
||||
nas_5gs_send_gmm_status(amf_ue, recvmsg->res_status);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_gmm_status(amf_ue, recvmsg->res_status));
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
AuthorizedNetworkSliceInfo = recvmsg->AuthorizedNetworkSliceInfo;
|
||||
if (!AuthorizedNetworkSliceInfo) {
|
||||
ogs_error("No AuthorizedNetworkSliceInfo");
|
||||
nas_5gs_send_gmm_reject_from_sbi(
|
||||
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_gmm_reject_from_sbi(
|
||||
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR));
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
NsiInformation = AuthorizedNetworkSliceInfo->nsi_information;
|
||||
if (!NsiInformation) {
|
||||
ogs_error("No NsiInformation");
|
||||
nas_5gs_send_gmm_reject_from_sbi(
|
||||
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_gmm_reject_from_sbi(
|
||||
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR));
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
if (!NsiInformation->nrf_id) {
|
||||
ogs_error("No nrfId");
|
||||
nas_5gs_send_gmm_reject_from_sbi(
|
||||
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_gmm_reject_from_sbi(
|
||||
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR));
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
|
@ -77,8 +81,9 @@ int amf_nnssf_nsselection_handle_get(
|
|||
if (!addr) {
|
||||
ogs_error("[%s:%d] Invalid URI [%s]",
|
||||
amf_ue->supi, sess->psi, NsiInformation->nrf_id);
|
||||
nas_5gs_send_gmm_reject_from_sbi(
|
||||
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_gmm_reject_from_sbi(
|
||||
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR));
|
||||
return OGS_ERROR;;
|
||||
}
|
||||
|
||||
|
|
|
@ -38,29 +38,33 @@ int amf_npcf_am_policy_control_handle_create(
|
|||
if (recvmsg->res_status != OGS_SBI_HTTP_STATUS_CREATED) {
|
||||
ogs_error("[%s] HTTP response error [%d]",
|
||||
amf_ue->supi, recvmsg->res_status);
|
||||
nas_5gs_send_gmm_reject_from_sbi(amf_ue, recvmsg->res_status);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_gmm_reject_from_sbi(amf_ue, recvmsg->res_status));
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
if (!recvmsg->http.location) {
|
||||
ogs_error("[%s] No http.location", amf_ue->supi);
|
||||
nas_5gs_send_gmm_reject_from_sbi(
|
||||
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_gmm_reject_from_sbi(
|
||||
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR));
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
PolicyAssociation = recvmsg->PolicyAssociation;
|
||||
if (!PolicyAssociation) {
|
||||
ogs_error("No PolicyAssociation");
|
||||
nas_5gs_send_gmm_reject_from_sbi(
|
||||
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_gmm_reject_from_sbi(
|
||||
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR));
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
if (!PolicyAssociation->supp_feat) {
|
||||
ogs_error("No suppFeat");
|
||||
nas_5gs_send_gmm_reject_from_sbi(
|
||||
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_gmm_reject_from_sbi(
|
||||
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR));
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
|
@ -71,8 +75,9 @@ int amf_npcf_am_policy_control_handle_create(
|
|||
if (rv != OGS_OK) {
|
||||
ogs_error("[%s] Cannot parse http.location [%s]",
|
||||
amf_ue->supi, recvmsg->http.location);
|
||||
nas_5gs_send_gmm_reject_from_sbi(
|
||||
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_gmm_reject_from_sbi(
|
||||
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR));
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
|
@ -81,8 +86,9 @@ int amf_npcf_am_policy_control_handle_create(
|
|||
amf_ue->supi, recvmsg->http.location);
|
||||
|
||||
ogs_sbi_header_free(&header);
|
||||
nas_5gs_send_gmm_reject_from_sbi(
|
||||
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_gmm_reject_from_sbi(
|
||||
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR));
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
|
|
|
@ -38,8 +38,9 @@ int amf_nsmf_pdusession_handle_create_sm_context(
|
|||
|
||||
if (!recvmsg->http.location) {
|
||||
ogs_error("[%d:%d] No http.location", sess->psi, sess->pti);
|
||||
nas_5gs_send_back_5gsm_message_from_sbi(sess,
|
||||
OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_back_5gsm_message_from_sbi(sess,
|
||||
OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR));
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
|
@ -50,8 +51,9 @@ int amf_nsmf_pdusession_handle_create_sm_context(
|
|||
if (rv != OGS_OK) {
|
||||
ogs_error("[%d:%d] Cannot parse http.location [%s]",
|
||||
sess->psi, sess->pti, recvmsg->http.location);
|
||||
nas_5gs_send_back_5gsm_message_from_sbi(sess,
|
||||
OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_back_5gsm_message_from_sbi(sess,
|
||||
OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR));
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
|
@ -60,8 +62,9 @@ int amf_nsmf_pdusession_handle_create_sm_context(
|
|||
sess->psi, sess->pti, recvmsg->http.location);
|
||||
|
||||
ogs_sbi_header_free(&header);
|
||||
nas_5gs_send_back_5gsm_message_from_sbi(sess,
|
||||
OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_back_5gsm_message_from_sbi(sess,
|
||||
OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR));
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
|
@ -87,8 +90,9 @@ int amf_nsmf_pdusession_handle_create_sm_context(
|
|||
sess->psi, sess->pti);
|
||||
|
||||
ogs_sbi_header_free(&header);
|
||||
nas_5gs_send_back_5gsm_message_from_sbi(sess,
|
||||
OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_back_5gsm_message_from_sbi(sess,
|
||||
OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR));
|
||||
return OGS_ERROR;
|
||||
}
|
||||
}
|
||||
|
@ -107,12 +111,16 @@ int amf_nsmf_pdusession_handle_create_sm_context(
|
|||
SmContextCreateError = recvmsg->SmContextCreateError;
|
||||
if (!SmContextCreateError) {
|
||||
ogs_error("[%d:%d] No SmContextCreateError", sess->psi, sess->pti);
|
||||
nas_5gs_send_back_5gsm_message_from_sbi(sess, recvmsg->res_status);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_back_5gsm_message_from_sbi(
|
||||
sess, recvmsg->res_status));
|
||||
return OGS_ERROR;
|
||||
}
|
||||
if (!SmContextCreateError->error) {
|
||||
ogs_error("[%d:%d] No Error", sess->psi, sess->pti);
|
||||
nas_5gs_send_back_5gsm_message_from_sbi(sess, recvmsg->res_status);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_back_5gsm_message_from_sbi(
|
||||
sess, recvmsg->res_status));
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
|
@ -127,14 +135,17 @@ int amf_nsmf_pdusession_handle_create_sm_context(
|
|||
*/
|
||||
n1smbuf = ogs_pkbuf_copy(n1smbuf);
|
||||
ogs_assert(n1smbuf);
|
||||
nas_5gs_send_gsm_reject_from_sbi(sess,
|
||||
OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION,
|
||||
n1smbuf, recvmsg->res_status);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_gsm_reject_from_sbi(sess,
|
||||
OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION,
|
||||
n1smbuf, recvmsg->res_status));
|
||||
return OGS_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
nas_5gs_send_back_5gsm_message_from_sbi(sess, recvmsg->res_status);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_back_5gsm_message_from_sbi(
|
||||
sess, recvmsg->res_status));
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
|
@ -199,7 +210,8 @@ int amf_nsmf_pdusession_handle_update_sm_context(
|
|||
AMF_UPDATE_SM_CONTEXT_REGISTRATION_REQUEST)) {
|
||||
|
||||
CLEAR_AMF_UE_TIMER(amf_ue->t3550);
|
||||
nas_5gs_send_registration_accept(amf_ue);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_registration_accept(amf_ue));
|
||||
|
||||
AMF_UE_CLEAR_N2_TRANSFER(
|
||||
amf_ue, pdu_session_resource_setup_request);
|
||||
|
@ -213,7 +225,8 @@ int amf_nsmf_pdusession_handle_update_sm_context(
|
|||
AMF_RELEASE_SM_CONTEXT_SERVICE_ACCEPT) &&
|
||||
SESSION_SYNC_DONE(amf_ue,
|
||||
AMF_UPDATE_SM_CONTEXT_SERVICE_REQUEST)) {
|
||||
nas_5gs_send_service_accept(amf_ue);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_service_accept(amf_ue));
|
||||
|
||||
AMF_UE_CLEAR_N2_TRANSFER(
|
||||
amf_ue, pdu_session_resource_setup_request);
|
||||
|
@ -224,7 +237,8 @@ int amf_nsmf_pdusession_handle_update_sm_context(
|
|||
|
||||
if (SESSION_SYNC_DONE(amf_ue,
|
||||
AMF_UPDATE_SM_CONTEXT_HANDOVER_REQUIRED)) {
|
||||
ngap_send_handover_request(amf_ue);
|
||||
ogs_assert(OGS_OK ==
|
||||
ngap_send_handover_request(amf_ue));
|
||||
|
||||
AMF_UE_CLEAR_N2_TRANSFER(amf_ue, handover_request);
|
||||
}
|
||||
|
@ -238,16 +252,18 @@ int amf_nsmf_pdusession_handle_update_sm_context(
|
|||
if (!n1smbuf) {
|
||||
ogs_error("[%s:%d] No N1 SM Content [%s]",
|
||||
amf_ue->supi, sess->psi, n1SmMsg->content_id);
|
||||
nas_5gs_send_back_5gsm_message(sess,
|
||||
OGS_5GMM_CAUSE_SEMANTICALLY_INCORRECT_MESSAGE);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_back_5gsm_message(sess,
|
||||
OGS_5GMM_CAUSE_SEMANTICALLY_INCORRECT_MESSAGE));
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
if (!n2smbuf) {
|
||||
ogs_error("[%s:%d] No N2 SM Content",
|
||||
amf_ue->supi, sess->psi);
|
||||
nas_5gs_send_back_5gsm_message(sess,
|
||||
OGS_5GMM_CAUSE_SEMANTICALLY_INCORRECT_MESSAGE);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_back_5gsm_message(sess,
|
||||
OGS_5GMM_CAUSE_SEMANTICALLY_INCORRECT_MESSAGE));
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
|
@ -261,16 +277,19 @@ int amf_nsmf_pdusession_handle_update_sm_context(
|
|||
n2smbuf = ogs_pkbuf_copy(n2smbuf);
|
||||
ogs_assert(n2smbuf);
|
||||
|
||||
nas_send_pdu_session_release_command(sess, n1smbuf, n2smbuf);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_send_pdu_session_release_command(
|
||||
sess, n1smbuf, n2smbuf));
|
||||
break;
|
||||
|
||||
case OpenAPI_n2_sm_info_type_PATH_SWITCH_REQ_ACK:
|
||||
if (!n2smbuf) {
|
||||
ogs_error("[%s:%d] No N2 SM Content",
|
||||
amf_ue->supi, sess->psi);
|
||||
ngap_send_error_indication2(amf_ue,
|
||||
ogs_assert(OGS_OK ==
|
||||
ngap_send_error_indication2(amf_ue,
|
||||
NGAP_Cause_PR_protocol,
|
||||
NGAP_CauseProtocol_semantic_error);
|
||||
NGAP_CauseProtocol_semantic_error));
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
|
@ -279,7 +298,8 @@ int amf_nsmf_pdusession_handle_update_sm_context(
|
|||
ogs_pkbuf_copy(n2smbuf));
|
||||
|
||||
if (SESSION_SYNC_DONE(amf_ue, state)) {
|
||||
ngap_send_path_switch_ack(sess);
|
||||
ogs_assert(OGS_OK ==
|
||||
ngap_send_path_switch_ack(sess));
|
||||
|
||||
AMF_UE_CLEAR_N2_TRANSFER(amf_ue, path_switch_request_ack);
|
||||
}
|
||||
|
@ -289,9 +309,10 @@ int amf_nsmf_pdusession_handle_update_sm_context(
|
|||
if (!n2smbuf) {
|
||||
ogs_error("[%s:%d] No N2 SM Content",
|
||||
amf_ue->supi, sess->psi);
|
||||
ngap_send_error_indication2(amf_ue,
|
||||
ogs_assert(OGS_OK ==
|
||||
ngap_send_error_indication2(amf_ue,
|
||||
NGAP_Cause_PR_protocol,
|
||||
NGAP_CauseProtocol_semantic_error);
|
||||
NGAP_CauseProtocol_semantic_error));
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
|
@ -299,7 +320,8 @@ int amf_nsmf_pdusession_handle_update_sm_context(
|
|||
sess, handover_command, ogs_pkbuf_copy(n2smbuf));
|
||||
|
||||
if (SESSION_SYNC_DONE(amf_ue, state)) {
|
||||
ngap_send_handover_command(amf_ue);
|
||||
ogs_assert(OGS_OK ==
|
||||
ngap_send_handover_command(amf_ue));
|
||||
|
||||
AMF_UE_CLEAR_N2_TRANSFER(amf_ue, handover_command);
|
||||
}
|
||||
|
@ -308,8 +330,10 @@ int amf_nsmf_pdusession_handle_update_sm_context(
|
|||
default:
|
||||
ogs_error("Not implemented [%d]",
|
||||
SmContextUpdatedData->n2_sm_info_type);
|
||||
ngap_send_error_indication2(amf_ue,
|
||||
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error);
|
||||
ogs_assert(OGS_OK ==
|
||||
ngap_send_error_indication2(amf_ue,
|
||||
NGAP_Cause_PR_protocol,
|
||||
NGAP_CauseProtocol_semantic_error));
|
||||
}
|
||||
|
||||
} else {
|
||||
|
@ -350,9 +374,11 @@ int amf_nsmf_pdusession_handle_update_sm_context(
|
|||
if (SESSION_SYNC_DONE(amf_ue, state)) {
|
||||
ogs_assert(amf_ue->deactivation.group);
|
||||
|
||||
ngap_send_amf_ue_context_release_command(amf_ue,
|
||||
amf_ue->deactivation.group, amf_ue->deactivation.cause,
|
||||
NGAP_UE_CTX_REL_NG_REMOVE_AND_UNLINK, 0);
|
||||
ogs_assert(OGS_OK ==
|
||||
ngap_send_amf_ue_context_release_command(amf_ue,
|
||||
amf_ue->deactivation.group,
|
||||
amf_ue->deactivation.cause,
|
||||
NGAP_UE_CTX_REL_NG_REMOVE_AND_UNLINK, 0));
|
||||
}
|
||||
|
||||
} else if (state == AMF_UPDATE_SM_CONTEXT_REGISTRATION_REQUEST) {
|
||||
|
@ -429,10 +455,11 @@ int amf_nsmf_pdusession_handle_update_sm_context(
|
|||
target_ue = source_ue->target_ue;
|
||||
ogs_assert(target_ue);
|
||||
|
||||
ngap_send_ran_ue_context_release_command(target_ue,
|
||||
ogs_assert(OGS_OK ==
|
||||
ngap_send_ran_ue_context_release_command(target_ue,
|
||||
NGAP_Cause_PR_radioNetwork,
|
||||
NGAP_CauseRadioNetwork_handover_cancelled,
|
||||
NGAP_UE_CTX_REL_NG_HANDOVER_CANCEL, 0);
|
||||
NGAP_UE_CTX_REL_NG_HANDOVER_CANCEL, 0));
|
||||
}
|
||||
|
||||
} else if (state == AMF_UPDATE_SM_CONTEXT_HANDOVER_NOTIFY) {
|
||||
|
@ -468,7 +495,8 @@ int amf_nsmf_pdusession_handle_update_sm_context(
|
|||
ran_ue_remove(ran_ue);
|
||||
|
||||
if (ogs_list_count(&gnb->ran_ue_list) == 0)
|
||||
ngap_send_ng_reset_ack(gnb, NULL);
|
||||
ogs_assert(OGS_OK ==
|
||||
ngap_send_ng_reset_ack(gnb, NULL));
|
||||
|
||||
} else {
|
||||
ogs_warn("[%s] RAN-NG Context has already been removed",
|
||||
|
@ -552,15 +580,17 @@ int amf_nsmf_pdusession_handle_update_sm_context(
|
|||
if (!SmContextUpdateError) {
|
||||
ogs_error("[%d:%d] No SmContextUpdateError [%d]",
|
||||
sess->psi, sess->pti, recvmsg->res_status);
|
||||
ngap_send_error_indication2(amf_ue,
|
||||
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error);
|
||||
ogs_assert(OGS_OK ==
|
||||
ngap_send_error_indication2(amf_ue,
|
||||
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error));
|
||||
return OGS_ERROR;
|
||||
}
|
||||
if (!SmContextUpdateError->error) {
|
||||
ogs_error("[%d:%d] No Error [%d]",
|
||||
sess->psi, sess->pti, recvmsg->res_status);
|
||||
ngap_send_error_indication2(amf_ue,
|
||||
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error);
|
||||
ogs_assert(OGS_OK ==
|
||||
ngap_send_error_indication2(amf_ue,
|
||||
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error));
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
|
@ -575,9 +605,10 @@ int amf_nsmf_pdusession_handle_update_sm_context(
|
|||
*/
|
||||
n1smbuf = ogs_pkbuf_copy(n1smbuf);
|
||||
ogs_assert(n1smbuf);
|
||||
nas_5gs_send_gsm_reject_from_sbi(sess,
|
||||
OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION,
|
||||
n1smbuf, recvmsg->res_status);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_gsm_reject_from_sbi(sess,
|
||||
OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION,
|
||||
n1smbuf, recvmsg->res_status));
|
||||
return OGS_ERROR;
|
||||
}
|
||||
}
|
||||
|
@ -586,8 +617,9 @@ int amf_nsmf_pdusession_handle_update_sm_context(
|
|||
n2SmInfo = SmContextUpdateError->n2_sm_info;
|
||||
if (!n2SmInfo || !n2SmInfo->content_id) {
|
||||
ogs_error("[%d:%d] No N2 SM Message", sess->psi, sess->pti);
|
||||
ngap_send_error_indication2(amf_ue,
|
||||
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error);
|
||||
ogs_assert(OGS_OK ==
|
||||
ngap_send_error_indication2(amf_ue,
|
||||
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error));
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
|
@ -596,16 +628,18 @@ int amf_nsmf_pdusession_handle_update_sm_context(
|
|||
if (!n2smbuf) {
|
||||
ogs_error("[%d:%d] No N2 SM Content [%s]",
|
||||
sess->psi, sess->pti, n2SmInfo->content_id);
|
||||
ngap_send_error_indication2(amf_ue,
|
||||
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error);
|
||||
ogs_assert(OGS_OK ==
|
||||
ngap_send_error_indication2(amf_ue,
|
||||
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error));
|
||||
return OGS_ERROR;
|
||||
}
|
||||
#endif
|
||||
|
||||
ogs_error("[%d:%d] HTTP response error [%d]",
|
||||
sess->psi, sess->pti, recvmsg->res_status);
|
||||
ngap_send_error_indication2(amf_ue,
|
||||
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error);
|
||||
ogs_assert(OGS_OK ==
|
||||
ngap_send_error_indication2(amf_ue,
|
||||
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error));
|
||||
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
@ -635,7 +669,8 @@ int amf_nsmf_pdusession_handle_release_sm_context(amf_sess_t *sess, int state)
|
|||
amf_ue, AMF_UPDATE_SM_CONTEXT_REGISTRATION_REQUEST))
|
||||
|
||||
CLEAR_AMF_UE_TIMER(amf_ue->t3550);
|
||||
nas_5gs_send_registration_accept(amf_ue);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_registration_accept(amf_ue));
|
||||
|
||||
} else if (state == AMF_RELEASE_SM_CONTEXT_SERVICE_ACCEPT) {
|
||||
/*
|
||||
|
@ -645,7 +680,8 @@ int amf_nsmf_pdusession_handle_release_sm_context(amf_sess_t *sess, int state)
|
|||
*/
|
||||
if (SESSION_SYNC_DONE(amf_ue, AMF_RELEASE_SM_CONTEXT_SERVICE_ACCEPT) &&
|
||||
SESSION_SYNC_DONE(amf_ue, AMF_UPDATE_SM_CONTEXT_SERVICE_REQUEST))
|
||||
nas_5gs_send_service_accept(amf_ue);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_service_accept(amf_ue));
|
||||
|
||||
} else {
|
||||
|
||||
|
@ -658,9 +694,10 @@ int amf_nsmf_pdusession_handle_release_sm_context(amf_sess_t *sess, int state)
|
|||
* 3. UE Context release command
|
||||
* 4. UE Context release complete
|
||||
*/
|
||||
ngap_send_amf_ue_context_release_command(amf_ue,
|
||||
ogs_assert(OGS_OK ==
|
||||
ngap_send_amf_ue_context_release_command(amf_ue,
|
||||
NGAP_Cause_PR_nas, NGAP_CauseNas_normal_release,
|
||||
NGAP_UE_CTX_REL_NG_CONTEXT_REMOVE, 0);
|
||||
NGAP_UE_CTX_REL_NG_CONTEXT_REMOVE, 0));
|
||||
|
||||
} else if (state == AMF_RELEASE_SM_CONTEXT_REGISTRATION_ACCEPT) {
|
||||
|
||||
|
@ -694,7 +731,8 @@ int amf_nsmf_pdusession_handle_release_sm_context(amf_sess_t *sess, int state)
|
|||
* 7. UEContextReleaseComplete
|
||||
*/
|
||||
|
||||
nas_5gs_send_de_registration_accept(amf_ue);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_de_registration_accept(amf_ue));
|
||||
|
||||
} else if (OGS_FSM_CHECK(&amf_ue->sm, gmm_state_registered)) {
|
||||
/*
|
||||
|
@ -715,9 +753,10 @@ int amf_nsmf_pdusession_handle_release_sm_context(amf_sess_t *sess, int state)
|
|||
* 3. UE Context release command
|
||||
* 4. UE Context release complete
|
||||
*/
|
||||
ngap_send_amf_ue_context_release_command(amf_ue,
|
||||
ogs_assert(OGS_OK ==
|
||||
ngap_send_amf_ue_context_release_command(amf_ue,
|
||||
NGAP_Cause_PR_nas, NGAP_CauseNas_normal_release,
|
||||
NGAP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0);
|
||||
NGAP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0));
|
||||
|
||||
} else if (OGS_FSM_CHECK(&amf_ue->sm,
|
||||
gmm_state_initial_context_setup)) {
|
||||
|
|
|
@ -151,16 +151,18 @@ void amf_ue_sbi_discover_and_send(
|
|||
amf_timer_sbi_client_wait_expire);
|
||||
if (!xact) {
|
||||
ogs_error("amf_ue_sbi_discover_and_send() failed");
|
||||
nas_5gs_send_gmm_reject_from_sbi(
|
||||
amf_ue, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_gmm_reject_from_sbi(
|
||||
amf_ue, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT));
|
||||
return;
|
||||
}
|
||||
|
||||
if (ogs_sbi_discover_and_send(xact,
|
||||
(ogs_fsm_handler_t)amf_nf_state_registered, client_cb) != true) {
|
||||
ogs_error("amf_ue_sbi_discover_and_send() failed");
|
||||
nas_5gs_send_gmm_reject_from_sbi(
|
||||
amf_ue, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_gmm_reject_from_sbi(
|
||||
amf_ue, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -180,8 +182,9 @@ void amf_sess_sbi_discover_and_send(OpenAPI_nf_type_e target_nf_type,
|
|||
amf_timer_sbi_client_wait_expire);
|
||||
if (!xact) {
|
||||
ogs_error("amf_sess_sbi_discover_and_send() failed");
|
||||
nas_5gs_send_back_5gsm_message_from_sbi(
|
||||
sess, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_back_5gsm_message_from_sbi(
|
||||
sess, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT));
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -190,8 +193,9 @@ void amf_sess_sbi_discover_and_send(OpenAPI_nf_type_e target_nf_type,
|
|||
if (ogs_sbi_discover_and_send(xact,
|
||||
(ogs_fsm_handler_t)amf_nf_state_registered, client_cb) != true) {
|
||||
ogs_error("amf_sess_sbi_discover_and_send() failed");
|
||||
nas_5gs_send_back_5gsm_message_from_sbi(
|
||||
sess, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_back_5gsm_message_from_sbi(
|
||||
sess, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -209,24 +213,27 @@ static int client_discover_cb(ogs_sbi_response_t *response, void *data)
|
|||
rv = ogs_sbi_parse_response(&message, response);
|
||||
if (rv != OGS_OK) {
|
||||
ogs_error("cannot parse HTTP response");
|
||||
nas_5gs_send_back_5gsm_message_from_sbi(
|
||||
sess, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_back_5gsm_message_from_sbi(
|
||||
sess, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT));
|
||||
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (message.res_status != OGS_SBI_HTTP_STATUS_OK) {
|
||||
ogs_error("NF-Discover failed [%d]", message.res_status);
|
||||
nas_5gs_send_back_5gsm_message_from_sbi(
|
||||
sess, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_back_5gsm_message_from_sbi(
|
||||
sess, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT));
|
||||
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (!message.SearchResult) {
|
||||
ogs_error("No SearchResult");
|
||||
nas_5gs_send_back_5gsm_message_from_sbi(
|
||||
sess, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_back_5gsm_message_from_sbi(
|
||||
sess, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT));
|
||||
|
||||
goto cleanup;
|
||||
}
|
||||
|
@ -237,8 +244,9 @@ static int client_discover_cb(ogs_sbi_response_t *response, void *data)
|
|||
if (!OGS_SBI_NF_INSTANCE(&sess->sbi, OpenAPI_nf_type_SMF)) {
|
||||
ogs_error("Cannot discover [%s]",
|
||||
OpenAPI_nf_type_ToString(OpenAPI_nf_type_SMF));
|
||||
nas_5gs_send_back_5gsm_message_from_sbi(
|
||||
sess, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_5gs_send_back_5gsm_message_from_sbi(
|
||||
sess, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT));
|
||||
|
||||
goto cleanup;
|
||||
}
|
||||
|
|
|
@ -110,9 +110,10 @@ int emm_handle_attach_request(mme_ue_t *mme_ue,
|
|||
/* Send Attach Reject */
|
||||
ogs_warn("Cannot find Served TAI[PLMN_ID:%06x,TAC:%d]",
|
||||
ogs_plmn_id_hexdump(&mme_ue->tai.plmn_id), mme_ue->tai.tac);
|
||||
nas_eps_send_attach_reject(mme_ue,
|
||||
EMM_CAUSE_TRACKING_AREA_NOT_ALLOWED,
|
||||
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_attach_reject(mme_ue,
|
||||
EMM_CAUSE_TRACKING_AREA_NOT_ALLOWED,
|
||||
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED));
|
||||
return OGS_ERROR;
|
||||
}
|
||||
ogs_debug(" SERVED_TAI_INDEX[%d]", served_tai_index);
|
||||
|
@ -152,9 +153,10 @@ int emm_handle_attach_request(mme_ue_t *mme_ue,
|
|||
"but Integrity[0x%x] cannot be bypassed with EIA0",
|
||||
mme_selected_enc_algorithm(mme_ue),
|
||||
mme_selected_int_algorithm(mme_ue));
|
||||
nas_eps_send_attach_reject(mme_ue,
|
||||
EMM_CAUSE_UE_SECURITY_CAPABILITIES_MISMATCH,
|
||||
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_attach_reject(mme_ue,
|
||||
EMM_CAUSE_UE_SECURITY_CAPABILITIES_MISMATCH,
|
||||
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED));
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
|
@ -501,7 +503,9 @@ int emm_handle_tau_request(mme_ue_t *mme_ue,
|
|||
/* Send TAU reject */
|
||||
ogs_warn("Cannot find Served TAI[PLMN_ID:%06x,TAC:%d]",
|
||||
ogs_plmn_id_hexdump(&mme_ue->tai.plmn_id), mme_ue->tai.tac);
|
||||
nas_eps_send_tau_reject(mme_ue, EMM_CAUSE_TRACKING_AREA_NOT_ALLOWED);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_tau_reject(
|
||||
mme_ue, EMM_CAUSE_TRACKING_AREA_NOT_ALLOWED));
|
||||
return OGS_ERROR;
|
||||
}
|
||||
ogs_debug(" SERVED_TAI_INDEX[%d]", served_tai_index);
|
||||
|
@ -617,7 +621,9 @@ int emm_handle_extended_service_request(mme_ue_t *mme_ue,
|
|||
/* Send TAU reject */
|
||||
ogs_warn("Cannot find Served TAI[PLMN_ID:%06x,TAC:%d]",
|
||||
ogs_plmn_id_hexdump(&mme_ue->tai.plmn_id), mme_ue->tai.tac);
|
||||
nas_eps_send_tau_reject(mme_ue, EMM_CAUSE_TRACKING_AREA_NOT_ALLOWED);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_tau_reject(
|
||||
mme_ue, EMM_CAUSE_TRACKING_AREA_NOT_ALLOWED));
|
||||
return OGS_ERROR;
|
||||
}
|
||||
ogs_debug(" SERVED_TAI_INDEX[%d]", served_tai_index);
|
||||
|
|
239
src/mme/emm-sm.c
239
src/mme/emm-sm.c
|
@ -131,37 +131,42 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e)
|
|||
|
||||
if (!MME_UE_HAVE_IMSI(mme_ue)) {
|
||||
ogs_info("Service request : Unknown UE");
|
||||
nas_eps_send_service_reject(mme_ue,
|
||||
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_service_reject(mme_ue,
|
||||
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK));
|
||||
OGS_FSM_TRAN(s, &emm_state_exception);
|
||||
break;
|
||||
}
|
||||
|
||||
if (!SECURITY_CONTEXT_IS_VALID(mme_ue)) {
|
||||
ogs_warn("No Security Context : IMSI[%s]", mme_ue->imsi_bcd);
|
||||
nas_eps_send_service_reject(mme_ue,
|
||||
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_service_reject(mme_ue,
|
||||
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK));
|
||||
OGS_FSM_TRAN(s, &emm_state_exception);
|
||||
break;
|
||||
}
|
||||
|
||||
if (!SESSION_CONTEXT_IS_AVAILABLE(mme_ue)) {
|
||||
ogs_warn("No Session Context : IMSI[%s]", mme_ue->imsi_bcd);
|
||||
nas_eps_send_service_reject(mme_ue,
|
||||
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_service_reject(mme_ue,
|
||||
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK));
|
||||
OGS_FSM_TRAN(s, &emm_state_exception);
|
||||
break;
|
||||
}
|
||||
|
||||
if (!ACTIVE_EPS_BEARERS_IS_AVAIABLE(mme_ue)) {
|
||||
ogs_warn("No active EPS bearers : IMSI[%s]", mme_ue->imsi_bcd);
|
||||
nas_eps_send_service_reject(mme_ue,
|
||||
EMM_CAUSE_NO_EPS_BEARER_CONTEXT_ACTIVATED);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_service_reject(mme_ue,
|
||||
EMM_CAUSE_NO_EPS_BEARER_CONTEXT_ACTIVATED));
|
||||
OGS_FSM_TRAN(s, &emm_state_exception);
|
||||
break;
|
||||
}
|
||||
|
||||
s1ap_send_initial_context_setup_request(mme_ue);
|
||||
ogs_assert(OGS_OK ==
|
||||
s1ap_send_initial_context_setup_request(mme_ue));
|
||||
OGS_FSM_TRAN(s, &emm_state_registered);
|
||||
break;
|
||||
}
|
||||
|
@ -206,7 +211,8 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e)
|
|||
|
||||
if (!MME_UE_HAVE_IMSI(mme_ue)) {
|
||||
CLEAR_MME_UE_TIMER(mme_ue->t3470);
|
||||
nas_eps_send_identity_request(mme_ue);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_identity_request(mme_ue));
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -219,9 +225,10 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e)
|
|||
&mme_ue->pdn_connectivity_request);
|
||||
if (rv != OGS_OK) {
|
||||
ogs_error("nas_eps_send_emm_to_esm() failed");
|
||||
nas_eps_send_attach_reject(mme_ue,
|
||||
EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED,
|
||||
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_attach_reject(mme_ue,
|
||||
EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED,
|
||||
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED));
|
||||
OGS_FSM_TRAN(s, &emm_state_exception);
|
||||
break;
|
||||
}
|
||||
|
@ -250,24 +257,27 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e)
|
|||
|
||||
if (!MME_UE_HAVE_IMSI(mme_ue)) {
|
||||
ogs_info("TAU request : Unknown UE");
|
||||
nas_eps_send_tau_reject(mme_ue,
|
||||
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_tau_reject(mme_ue,
|
||||
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK));
|
||||
OGS_FSM_TRAN(s, &emm_state_exception);
|
||||
break;
|
||||
}
|
||||
|
||||
if (!SESSION_CONTEXT_IS_AVAILABLE(mme_ue)) {
|
||||
ogs_warn("No PDN Connection : UE[%s]", mme_ue->imsi_bcd);
|
||||
nas_eps_send_tau_reject(mme_ue,
|
||||
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_tau_reject(mme_ue,
|
||||
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK));
|
||||
OGS_FSM_TRAN(s, emm_state_exception);
|
||||
break;
|
||||
}
|
||||
|
||||
if (!ACTIVE_EPS_BEARERS_IS_AVAIABLE(mme_ue)) {
|
||||
ogs_warn("No active EPS bearers : IMSI[%s]", mme_ue->imsi_bcd);
|
||||
nas_eps_send_tau_reject(mme_ue,
|
||||
EMM_CAUSE_NO_EPS_BEARER_CONTEXT_ACTIVATED);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_tau_reject(mme_ue,
|
||||
EMM_CAUSE_NO_EPS_BEARER_CONTEXT_ACTIVATED));
|
||||
OGS_FSM_TRAN(s, &emm_state_exception);
|
||||
break;
|
||||
}
|
||||
|
@ -346,17 +356,20 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e)
|
|||
if (e->s1ap_code == S1AP_ProcedureCode_id_initialUEMessage) {
|
||||
ogs_debug(" Iniital UE Message");
|
||||
if (mme_ue->nas_eps.update.active_flag) {
|
||||
nas_eps_send_tau_accept(mme_ue,
|
||||
S1AP_ProcedureCode_id_InitialContextSetup);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_tau_accept(mme_ue,
|
||||
S1AP_ProcedureCode_id_InitialContextSetup));
|
||||
} else {
|
||||
nas_eps_send_tau_accept(mme_ue,
|
||||
S1AP_ProcedureCode_id_downlinkNASTransport);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_tau_accept(mme_ue,
|
||||
S1AP_ProcedureCode_id_downlinkNASTransport));
|
||||
}
|
||||
} else if (e->s1ap_code ==
|
||||
S1AP_ProcedureCode_id_uplinkNASTransport) {
|
||||
ogs_debug(" Uplink NAS Transport");
|
||||
nas_eps_send_tau_accept(mme_ue,
|
||||
S1AP_ProcedureCode_id_downlinkNASTransport);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_tau_accept(mme_ue,
|
||||
S1AP_ProcedureCode_id_downlinkNASTransport));
|
||||
} else {
|
||||
ogs_fatal("Invalid Procedure Code[%d]", (int)e->s1ap_code);
|
||||
}
|
||||
|
@ -385,24 +398,27 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e)
|
|||
|
||||
if (!MME_UE_HAVE_IMSI(mme_ue)) {
|
||||
ogs_warn("Extended Service request : Unknown UE");
|
||||
nas_eps_send_service_reject(mme_ue,
|
||||
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_service_reject(mme_ue,
|
||||
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK));
|
||||
OGS_FSM_TRAN(s, &emm_state_exception);
|
||||
break;
|
||||
}
|
||||
|
||||
if (!SESSION_CONTEXT_IS_AVAILABLE(mme_ue)) {
|
||||
ogs_warn("No PDN Connection : UE[%s]", mme_ue->imsi_bcd);
|
||||
nas_eps_send_service_reject(mme_ue,
|
||||
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_service_reject(mme_ue,
|
||||
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK));
|
||||
OGS_FSM_TRAN(s, emm_state_exception);
|
||||
break;
|
||||
}
|
||||
|
||||
if (!SECURITY_CONTEXT_IS_VALID(mme_ue)) {
|
||||
ogs_warn("No Security Context : IMSI[%s]", mme_ue->imsi_bcd);
|
||||
nas_eps_send_service_reject(mme_ue,
|
||||
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_service_reject(mme_ue,
|
||||
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK));
|
||||
OGS_FSM_TRAN(s, &emm_state_exception);
|
||||
break;
|
||||
}
|
||||
|
@ -412,8 +428,10 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e)
|
|||
|
||||
if (!MME_P_TMSI_IS_AVAILABLE(mme_ue)) {
|
||||
ogs_warn("No P-TMSI : UE[%s]", mme_ue->imsi_bcd);
|
||||
nas_eps_send_service_reject(mme_ue,
|
||||
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_service_reject(mme_ue,
|
||||
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK)
|
||||
);
|
||||
mme_send_release_access_bearer_or_ue_context_release(
|
||||
enb_ue);
|
||||
break;
|
||||
|
@ -425,22 +443,28 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e)
|
|||
OGS_NAS_SERVICE_TYPE_CS_FALLBACK_EMERGENCY_CALL_FROM_UE) {
|
||||
ogs_debug(" MO-CSFB-INDICATION[%d]",
|
||||
mme_ue->nas_eps.service.value);
|
||||
sgsap_send_mo_csfb_indication(mme_ue);
|
||||
ogs_assert(OGS_OK ==
|
||||
sgsap_send_mo_csfb_indication(mme_ue));
|
||||
} else if (mme_ue->nas_eps.service.value ==
|
||||
OGS_NAS_SERVICE_TYPE_CS_FALLBACK_TO_UE) {
|
||||
ogs_debug(" SERVICE_REQUEST[%d]",
|
||||
mme_ue->nas_eps.service.value);
|
||||
sgsap_send_service_request(mme_ue, SGSAP_EMM_IDLE_MODE);
|
||||
ogs_assert(OGS_OK ==
|
||||
sgsap_send_service_request(mme_ue, SGSAP_EMM_IDLE_MODE)
|
||||
);
|
||||
} else {
|
||||
ogs_warn(" Unknown CSFB Service Type[%d]",
|
||||
mme_ue->nas_eps.service.value);
|
||||
nas_eps_send_service_reject(mme_ue,
|
||||
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_service_reject(mme_ue,
|
||||
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK)
|
||||
);
|
||||
OGS_FSM_TRAN(s, &emm_state_exception);
|
||||
break;
|
||||
}
|
||||
|
||||
s1ap_send_initial_context_setup_request(mme_ue);
|
||||
ogs_assert(OGS_OK ==
|
||||
s1ap_send_initial_context_setup_request(mme_ue));
|
||||
|
||||
} else if (e->s1ap_code ==
|
||||
S1AP_ProcedureCode_id_uplinkNASTransport) {
|
||||
|
@ -448,8 +472,10 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e)
|
|||
|
||||
if (!MME_P_TMSI_IS_AVAILABLE(mme_ue)) {
|
||||
ogs_warn("No P-TMSI : UE[%s]", mme_ue->imsi_bcd);
|
||||
nas_eps_send_service_reject(mme_ue,
|
||||
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_service_reject(mme_ue,
|
||||
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK)
|
||||
);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -459,23 +485,28 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e)
|
|||
OGS_NAS_SERVICE_TYPE_CS_FALLBACK_EMERGENCY_CALL_FROM_UE) {
|
||||
ogs_debug(" MO-CSFB-INDICATION[%d]",
|
||||
mme_ue->nas_eps.service.value);
|
||||
sgsap_send_mo_csfb_indication(mme_ue);
|
||||
ogs_assert(OGS_OK ==
|
||||
sgsap_send_mo_csfb_indication(mme_ue));
|
||||
} else if (mme_ue->nas_eps.service.value ==
|
||||
OGS_NAS_SERVICE_TYPE_CS_FALLBACK_TO_UE) {
|
||||
ogs_debug(" SERVICE_REQUEST[%d]",
|
||||
mme_ue->nas_eps.service.value);
|
||||
sgsap_send_service_request(
|
||||
mme_ue, SGSAP_EMM_CONNECTED_MODE);
|
||||
ogs_assert(OGS_OK ==
|
||||
sgsap_send_service_request(
|
||||
mme_ue, SGSAP_EMM_CONNECTED_MODE));
|
||||
} else {
|
||||
ogs_warn(" Unknown CSFB Service Type[%d]",
|
||||
mme_ue->nas_eps.service.value);
|
||||
nas_eps_send_service_reject(mme_ue,
|
||||
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_service_reject(mme_ue,
|
||||
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK)
|
||||
);
|
||||
OGS_FSM_TRAN(s, &emm_state_exception);
|
||||
break;
|
||||
}
|
||||
|
||||
s1ap_send_ue_context_modification_request(mme_ue);
|
||||
ogs_assert(OGS_OK ==
|
||||
s1ap_send_ue_context_modification_request(mme_ue));
|
||||
} else {
|
||||
ogs_error("Invalid Procedure Code[%d]", (int)e->s1ap_code);
|
||||
}
|
||||
|
@ -499,7 +530,8 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e)
|
|||
}
|
||||
|
||||
if (MME_P_TMSI_IS_AVAILABLE(mme_ue)) {
|
||||
sgsap_send_detach_indication(mme_ue);
|
||||
ogs_assert(OGS_OK ==
|
||||
sgsap_send_detach_indication(mme_ue));
|
||||
} else {
|
||||
mme_send_delete_session_or_detach(mme_ue);
|
||||
}
|
||||
|
@ -511,8 +543,9 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e)
|
|||
ogs_debug("Uplink NAS Transport");
|
||||
ogs_debug(" IMSI[%s]", mme_ue->imsi_bcd);
|
||||
if (MME_SGSAP_IS_CONNECTED(mme_ue)) {
|
||||
sgsap_send_uplink_unitdata(mme_ue, &message->emm.
|
||||
uplink_nas_transport.nas_message_container);
|
||||
ogs_assert(OGS_OK ==
|
||||
sgsap_send_uplink_unitdata(mme_ue, &message->emm.
|
||||
uplink_nas_transport.nas_message_container));
|
||||
} else {
|
||||
S1AP_MME_UE_S1AP_ID_t MME_UE_S1AP_ID;
|
||||
S1AP_ENB_UE_S1AP_ID_t ENB_UE_S1AP_ID;
|
||||
|
@ -521,10 +554,11 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e)
|
|||
MME_UE_S1AP_ID = enb_ue->mme_ue_s1ap_id;
|
||||
ENB_UE_S1AP_ID = enb_ue->enb_ue_s1ap_id;
|
||||
|
||||
s1ap_send_error_indication(enb_ue->enb,
|
||||
ogs_assert(OGS_OK ==
|
||||
s1ap_send_error_indication(enb_ue->enb,
|
||||
&MME_UE_S1AP_ID, &ENB_UE_S1AP_ID,
|
||||
S1AP_Cause_PR_transport,
|
||||
S1AP_CauseTransport_transport_resource_unavailable);
|
||||
S1AP_CauseTransport_transport_resource_unavailable));
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -557,8 +591,9 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e)
|
|||
|
||||
if (CS_CALL_SERVICE_INDICATOR(mme_ue) ||
|
||||
SMS_SERVICE_INDICATOR(mme_ue)) {
|
||||
sgsap_send_ue_unreachable(mme_ue,
|
||||
SGSAP_SGS_CAUSE_UE_UNREACHABLE);
|
||||
ogs_assert(OGS_OK ==
|
||||
sgsap_send_ue_unreachable(mme_ue,
|
||||
SGSAP_SGS_CAUSE_UE_UNREACHABLE));
|
||||
|
||||
}
|
||||
|
||||
|
@ -583,7 +618,8 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e)
|
|||
OGS_FSM_TRAN(&mme_ue->sm, &emm_state_exception);
|
||||
} else {
|
||||
mme_ue->t3470.retry_count++;
|
||||
nas_eps_send_identity_request(mme_ue);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_identity_request(mme_ue));
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -645,7 +681,8 @@ void emm_state_authentication(ogs_fsm_t *s, mme_event_t *e)
|
|||
authentication_response_parameter->length);
|
||||
ogs_log_hexdump(OGS_LOG_WARN,
|
||||
mme_ue->xres, OGS_MAX_RES_LEN);
|
||||
nas_eps_send_authentication_reject(mme_ue);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_authentication_reject(mme_ue));
|
||||
OGS_FSM_TRAN(&mme_ue->sm, &emm_state_exception);
|
||||
} else {
|
||||
OGS_FSM_TRAN(&mme_ue->sm, &emm_state_security_mode);
|
||||
|
@ -688,7 +725,8 @@ void emm_state_authentication(ogs_fsm_t *s, mme_event_t *e)
|
|||
break;
|
||||
}
|
||||
|
||||
nas_eps_send_authentication_reject(mme_ue);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_authentication_reject(mme_ue));
|
||||
OGS_FSM_TRAN(&mme_ue->sm, &emm_state_exception);
|
||||
|
||||
break;
|
||||
|
@ -739,10 +777,12 @@ void emm_state_authentication(ogs_fsm_t *s, mme_event_t *e)
|
|||
"Stop retransmission", mme_ue->imsi_bcd);
|
||||
OGS_FSM_TRAN(&mme_ue->sm, &emm_state_exception);
|
||||
|
||||
nas_eps_send_authentication_reject(mme_ue);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_authentication_reject(mme_ue));
|
||||
} else {
|
||||
mme_ue->t3460.retry_count++;
|
||||
nas_eps_send_authentication_request(mme_ue);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_authentication_request(mme_ue));
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
@ -775,7 +815,8 @@ void emm_state_security_mode(ogs_fsm_t *s, mme_event_t *e)
|
|||
switch (e->id) {
|
||||
case OGS_FSM_ENTRY_SIG:
|
||||
CLEAR_MME_UE_TIMER(mme_ue->t3460);
|
||||
nas_eps_send_security_mode_command(mme_ue);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_security_mode_command(mme_ue));
|
||||
break;
|
||||
case OGS_FSM_EXIT_SIG:
|
||||
break;
|
||||
|
@ -786,8 +827,9 @@ void emm_state_security_mode(ogs_fsm_t *s, mme_event_t *e)
|
|||
if (message->emm.h.security_header_type
|
||||
== OGS_NAS_SECURITY_HEADER_FOR_SERVICE_REQUEST_MESSAGE) {
|
||||
ogs_debug("Service request");
|
||||
nas_eps_send_service_reject(mme_ue,
|
||||
EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_service_reject(mme_ue,
|
||||
EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED));
|
||||
OGS_FSM_TRAN(s, &emm_state_exception);
|
||||
break;
|
||||
}
|
||||
|
@ -804,18 +846,20 @@ void emm_state_security_mode(ogs_fsm_t *s, mme_event_t *e)
|
|||
if (h.integrity_protected == 0) {
|
||||
ogs_error("[%s] No Integrity Protected", mme_ue->imsi_bcd);
|
||||
|
||||
nas_eps_send_attach_reject(mme_ue,
|
||||
EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED,
|
||||
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_attach_reject(mme_ue,
|
||||
EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED,
|
||||
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED));
|
||||
OGS_FSM_TRAN(s, &emm_state_exception);
|
||||
break;
|
||||
}
|
||||
|
||||
if (!SECURITY_CONTEXT_IS_VALID(mme_ue)) {
|
||||
ogs_warn("[%s] No Security Context", mme_ue->imsi_bcd);
|
||||
nas_eps_send_attach_reject(mme_ue,
|
||||
EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED,
|
||||
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_attach_reject(mme_ue,
|
||||
EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED,
|
||||
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED));
|
||||
OGS_FSM_TRAN(s, &emm_state_exception);
|
||||
break;
|
||||
}
|
||||
|
@ -863,8 +907,9 @@ void emm_state_security_mode(ogs_fsm_t *s, mme_event_t *e)
|
|||
break;
|
||||
case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST:
|
||||
ogs_debug("Tracking area update request");
|
||||
nas_eps_send_tau_reject(mme_ue,
|
||||
EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_tau_reject(mme_ue,
|
||||
EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED));
|
||||
OGS_FSM_TRAN(s, &emm_state_exception);
|
||||
break;
|
||||
case OGS_NAS_EPS_EMM_STATUS:
|
||||
|
@ -900,12 +945,14 @@ void emm_state_security_mode(ogs_fsm_t *s, mme_event_t *e)
|
|||
"Stop retransmission", mme_ue->imsi_bcd);
|
||||
OGS_FSM_TRAN(&mme_ue->sm, &emm_state_exception);
|
||||
|
||||
nas_eps_send_attach_reject(mme_ue,
|
||||
EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED,
|
||||
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_attach_reject(mme_ue,
|
||||
EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED,
|
||||
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED));
|
||||
} else {
|
||||
mme_ue->t3460.retry_count++;
|
||||
nas_eps_send_security_mode_command(mme_ue);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_security_mode_command(mme_ue));
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
@ -947,8 +994,9 @@ void emm_state_initial_context_setup(ogs_fsm_t *s, mme_event_t *e)
|
|||
if (message->emm.h.security_header_type
|
||||
== OGS_NAS_SECURITY_HEADER_FOR_SERVICE_REQUEST_MESSAGE) {
|
||||
ogs_debug("Service request");
|
||||
nas_eps_send_service_reject(mme_ue,
|
||||
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_service_reject(mme_ue,
|
||||
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK));
|
||||
OGS_FSM_TRAN(s, &emm_state_exception);
|
||||
break;
|
||||
}
|
||||
|
@ -963,18 +1011,20 @@ void emm_state_initial_context_setup(ogs_fsm_t *s, mme_event_t *e)
|
|||
if (h.integrity_protected == 0) {
|
||||
ogs_error("[%s] No Integrity Protected", mme_ue->imsi_bcd);
|
||||
|
||||
nas_eps_send_attach_reject(mme_ue,
|
||||
EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED,
|
||||
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_attach_reject(mme_ue,
|
||||
EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED,
|
||||
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED));
|
||||
OGS_FSM_TRAN(s, &emm_state_exception);
|
||||
break;
|
||||
}
|
||||
|
||||
if (!SECURITY_CONTEXT_IS_VALID(mme_ue)) {
|
||||
ogs_warn("[%s] No Security Context", mme_ue->imsi_bcd);
|
||||
nas_eps_send_attach_reject(mme_ue,
|
||||
EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED,
|
||||
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_attach_reject(mme_ue,
|
||||
EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED,
|
||||
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED));
|
||||
OGS_FSM_TRAN(s, &emm_state_exception);
|
||||
break;
|
||||
}
|
||||
|
@ -993,7 +1043,8 @@ void emm_state_initial_context_setup(ogs_fsm_t *s, mme_event_t *e)
|
|||
mme_ue_confirm_guti(mme_ue);
|
||||
|
||||
if (MME_P_TMSI_IS_AVAILABLE(mme_ue))
|
||||
sgsap_send_tmsi_reallocation_complete(mme_ue);
|
||||
ogs_assert(OGS_OK ==
|
||||
sgsap_send_tmsi_reallocation_complete(mme_ue));
|
||||
|
||||
OGS_FSM_TRAN(s, &emm_state_registered);
|
||||
break;
|
||||
|
@ -1007,18 +1058,20 @@ void emm_state_initial_context_setup(ogs_fsm_t *s, mme_event_t *e)
|
|||
if (h.integrity_protected == 0) {
|
||||
ogs_error("[%s] No Integrity Protected", mme_ue->imsi_bcd);
|
||||
|
||||
nas_eps_send_attach_reject(mme_ue,
|
||||
EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED,
|
||||
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_attach_reject(mme_ue,
|
||||
EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED,
|
||||
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED));
|
||||
OGS_FSM_TRAN(s, &emm_state_exception);
|
||||
break;
|
||||
}
|
||||
|
||||
if (!SECURITY_CONTEXT_IS_VALID(mme_ue)) {
|
||||
ogs_warn("[%s] No Security Context", mme_ue->imsi_bcd);
|
||||
nas_eps_send_attach_reject(mme_ue,
|
||||
EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED,
|
||||
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_attach_reject(mme_ue,
|
||||
EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED,
|
||||
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED));
|
||||
OGS_FSM_TRAN(s, &emm_state_exception);
|
||||
break;
|
||||
}
|
||||
|
@ -1155,7 +1208,8 @@ void emm_state_exception(ogs_fsm_t *s, mme_event_t *e)
|
|||
|
||||
if (!MME_UE_HAVE_IMSI(mme_ue)) {
|
||||
CLEAR_MME_UE_TIMER(mme_ue->t3470);
|
||||
nas_eps_send_identity_request(mme_ue);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_identity_request(mme_ue));
|
||||
|
||||
OGS_FSM_TRAN(s, &emm_state_de_registered);
|
||||
break;
|
||||
|
@ -1170,9 +1224,10 @@ void emm_state_exception(ogs_fsm_t *s, mme_event_t *e)
|
|||
&mme_ue->pdn_connectivity_request);
|
||||
if (rv != OGS_OK) {
|
||||
ogs_error("nas_eps_send_emm_to_esm() failed");
|
||||
nas_eps_send_attach_reject(mme_ue,
|
||||
EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED,
|
||||
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_attach_reject(mme_ue,
|
||||
EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED,
|
||||
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED));
|
||||
OGS_FSM_TRAN(s, &emm_state_exception);
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -65,8 +65,9 @@ int esm_handle_pdn_connectivity_request(mme_bearer_t *bearer,
|
|||
mme_ue, req->access_point_name.apn);
|
||||
if (!sess->session) {
|
||||
/* Invalid APN */
|
||||
nas_eps_send_pdn_connectivity_reject(
|
||||
sess, ESM_CAUSE_MISSING_OR_UNKNOWN_APN);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_pdn_connectivity_reject(
|
||||
sess, ESM_CAUSE_MISSING_OR_UNKNOWN_APN));
|
||||
ogs_warn("Invalid APN");
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
@ -83,7 +84,8 @@ int esm_handle_pdn_connectivity_request(mme_bearer_t *bearer,
|
|||
|
||||
if (security_protected_required) {
|
||||
CLEAR_BEARER_TIMER(bearer->t3489);
|
||||
nas_eps_send_esm_information_request(bearer);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_esm_information_request(bearer));
|
||||
|
||||
return OGS_OK;
|
||||
}
|
||||
|
@ -114,11 +116,13 @@ int esm_handle_pdn_connectivity_request(mme_bearer_t *bearer,
|
|||
}
|
||||
}
|
||||
|
||||
mme_gtp_send_create_session_request(sess);
|
||||
ogs_assert(OGS_OK ==
|
||||
mme_gtp_send_create_session_request(sess));
|
||||
} else {
|
||||
ogs_error("No APN");
|
||||
nas_eps_send_pdn_connectivity_reject(
|
||||
sess, ESM_CAUSE_MISSING_OR_UNKNOWN_APN);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_pdn_connectivity_reject(
|
||||
sess, ESM_CAUSE_MISSING_OR_UNKNOWN_APN));
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
|
@ -160,17 +164,21 @@ int esm_handle_information_response(mme_sess_t *sess,
|
|||
mme_ue->csmap = csmap;
|
||||
|
||||
if (csmap) {
|
||||
sgsap_send_location_update_request(mme_ue);
|
||||
ogs_assert(OGS_OK ==
|
||||
sgsap_send_location_update_request(mme_ue));
|
||||
} else {
|
||||
nas_eps_send_attach_accept(mme_ue);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_attach_accept(mme_ue));
|
||||
}
|
||||
} else {
|
||||
mme_gtp_send_create_session_request(sess);
|
||||
ogs_assert(OGS_OK ==
|
||||
mme_gtp_send_create_session_request(sess));
|
||||
}
|
||||
} else {
|
||||
ogs_error("No APN");
|
||||
nas_eps_send_pdn_connectivity_reject(
|
||||
sess, ESM_CAUSE_MISSING_OR_UNKNOWN_APN);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_pdn_connectivity_reject(
|
||||
sess, ESM_CAUSE_MISSING_OR_UNKNOWN_APN));
|
||||
return OGS_ERROR;
|
||||
}
|
||||
|
||||
|
@ -189,8 +197,9 @@ int esm_handle_bearer_resource_allocation_request(
|
|||
mme_ue = sess->mme_ue;
|
||||
ogs_assert(mme_ue);
|
||||
|
||||
nas_eps_send_bearer_resource_allocation_reject(
|
||||
mme_ue, sess->pti, ESM_CAUSE_NETWORK_FAILURE);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_bearer_resource_allocation_reject(
|
||||
mme_ue, sess->pti, ESM_CAUSE_NETWORK_FAILURE));
|
||||
|
||||
return OGS_OK;
|
||||
}
|
||||
|
@ -204,7 +213,8 @@ int esm_handle_bearer_resource_modification_request(
|
|||
mme_ue = bearer->mme_ue;
|
||||
ogs_assert(mme_ue);
|
||||
|
||||
mme_gtp_send_bearer_resource_command(bearer, message);
|
||||
ogs_assert(OGS_OK ==
|
||||
mme_gtp_send_bearer_resource_command(bearer, message));
|
||||
|
||||
return OGS_OK;
|
||||
}
|
||||
|
|
|
@ -117,10 +117,12 @@ void esm_state_inactive(ogs_fsm_t *s, mme_event_t *e)
|
|||
ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]",
|
||||
mme_ue->imsi_bcd, sess->pti, bearer->ebi);
|
||||
if (MME_HAVE_SGW_S1U_PATH(sess)) {
|
||||
mme_gtp_send_delete_session_request(sess,
|
||||
OGS_GTP_DELETE_SEND_DEACTIVATE_BEARER_CONTEXT_REQUEST);
|
||||
ogs_assert(OGS_OK ==
|
||||
mme_gtp_send_delete_session_request(sess,
|
||||
OGS_GTP_DELETE_SEND_DEACTIVATE_BEARER_CONTEXT_REQUEST));
|
||||
} else {
|
||||
nas_eps_send_deactivate_bearer_context_request(bearer);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_deactivate_bearer_context_request(bearer));
|
||||
}
|
||||
OGS_FSM_TRAN(s, esm_state_pdn_will_disconnect);
|
||||
break;
|
||||
|
@ -134,26 +136,30 @@ void esm_state_inactive(ogs_fsm_t *s, mme_event_t *e)
|
|||
h.type = e->nas_type;
|
||||
if (h.integrity_protected == 0) {
|
||||
ogs_error("[%s] No Integrity Protected", mme_ue->imsi_bcd);
|
||||
nas_eps_send_attach_reject(mme_ue,
|
||||
EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED,
|
||||
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_attach_reject(mme_ue,
|
||||
EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED,
|
||||
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED));
|
||||
ogs_assert(mme_ue->enb_ue);
|
||||
s1ap_send_ue_context_release_command(mme_ue->enb_ue,
|
||||
ogs_assert(OGS_OK ==
|
||||
s1ap_send_ue_context_release_command(mme_ue->enb_ue,
|
||||
S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release,
|
||||
S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0);
|
||||
S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0));
|
||||
OGS_FSM_TRAN(s, &esm_state_exception);
|
||||
break;
|
||||
}
|
||||
|
||||
if (!SECURITY_CONTEXT_IS_VALID(mme_ue)) {
|
||||
ogs_warn("[%s] No Security Context", mme_ue->imsi_bcd);
|
||||
nas_eps_send_attach_reject(mme_ue,
|
||||
EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED,
|
||||
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_attach_reject(mme_ue,
|
||||
EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED,
|
||||
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED));
|
||||
ogs_assert(mme_ue->enb_ue);
|
||||
s1ap_send_ue_context_release_command(mme_ue->enb_ue,
|
||||
ogs_assert(OGS_OK ==
|
||||
s1ap_send_ue_context_release_command(mme_ue->enb_ue,
|
||||
S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release,
|
||||
S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0);
|
||||
S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0));
|
||||
OGS_FSM_TRAN(s, &esm_state_exception);
|
||||
break;
|
||||
}
|
||||
|
@ -172,7 +178,8 @@ void esm_state_inactive(ogs_fsm_t *s, mme_event_t *e)
|
|||
/* Check if Initial Context Setup Response or
|
||||
* E-RAB Setup Response is received */
|
||||
if (MME_HAVE_ENB_S1U_PATH(bearer)) {
|
||||
mme_gtp_send_modify_bearer_request(bearer, 0);
|
||||
ogs_assert(OGS_OK ==
|
||||
mme_gtp_send_modify_bearer_request(bearer, 0));
|
||||
}
|
||||
|
||||
nas_eps_send_activate_all_dedicated_bearers(bearer);
|
||||
|
@ -185,8 +192,9 @@ void esm_state_inactive(ogs_fsm_t *s, mme_event_t *e)
|
|||
/* Check if Initial Context Setup Response or
|
||||
* E-RAB Setup Response is received */
|
||||
if (MME_HAVE_ENB_S1U_PATH(bearer)) {
|
||||
mme_gtp_send_create_bearer_response(
|
||||
bearer, OGS_GTP_CAUSE_REQUEST_ACCEPTED);
|
||||
ogs_assert(OGS_OK ==
|
||||
mme_gtp_send_create_bearer_response(
|
||||
bearer, OGS_GTP_CAUSE_REQUEST_ACCEPTED));
|
||||
}
|
||||
|
||||
OGS_FSM_TRAN(s, esm_state_active);
|
||||
|
@ -198,9 +206,10 @@ void esm_state_inactive(ogs_fsm_t *s, mme_event_t *e)
|
|||
activate_dedicated_eps_bearer_context_reject =
|
||||
&message->esm.activate_dedicated_eps_bearer_context_reject;
|
||||
ogs_assert(activate_dedicated_eps_bearer_context_reject);
|
||||
mme_gtp_send_create_bearer_response(bearer,
|
||||
ogs_assert(OGS_OK ==
|
||||
mme_gtp_send_create_bearer_response(bearer,
|
||||
gtp_cause_from_esm(
|
||||
activate_dedicated_eps_bearer_context_reject->esm_cause));
|
||||
activate_dedicated_eps_bearer_context_reject->esm_cause)));
|
||||
OGS_FSM_TRAN(s, esm_state_bearer_deactivated);
|
||||
break;
|
||||
default:
|
||||
|
@ -218,11 +227,13 @@ void esm_state_inactive(ogs_fsm_t *s, mme_event_t *e)
|
|||
mme_ue->imsi_bcd);
|
||||
OGS_FSM_TRAN(&bearer->sm, &esm_state_exception);
|
||||
|
||||
nas_eps_send_pdn_connectivity_reject(sess,
|
||||
ESM_CAUSE_ESM_INFORMATION_NOT_RECEIVED);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_pdn_connectivity_reject(sess,
|
||||
ESM_CAUSE_ESM_INFORMATION_NOT_RECEIVED));
|
||||
} else {
|
||||
bearer->t3489.retry_count++;
|
||||
nas_eps_send_esm_information_request(bearer);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_esm_information_request(bearer));
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
@ -285,10 +296,12 @@ void esm_state_active(ogs_fsm_t *s, mme_event_t *e)
|
|||
ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]",
|
||||
mme_ue->imsi_bcd, sess->pti, bearer->ebi);
|
||||
if (MME_HAVE_SGW_S1U_PATH(sess)) {
|
||||
mme_gtp_send_delete_session_request(sess,
|
||||
OGS_GTP_DELETE_SEND_DEACTIVATE_BEARER_CONTEXT_REQUEST);
|
||||
ogs_assert(OGS_OK ==
|
||||
mme_gtp_send_delete_session_request(sess,
|
||||
OGS_GTP_DELETE_SEND_DEACTIVATE_BEARER_CONTEXT_REQUEST));
|
||||
} else {
|
||||
nas_eps_send_deactivate_bearer_context_request(bearer);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_deactivate_bearer_context_request(bearer));
|
||||
}
|
||||
OGS_FSM_TRAN(s, esm_state_pdn_will_disconnect);
|
||||
break;
|
||||
|
@ -297,16 +310,18 @@ void esm_state_active(ogs_fsm_t *s, mme_event_t *e)
|
|||
ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]",
|
||||
mme_ue->imsi_bcd, sess->pti, bearer->ebi);
|
||||
|
||||
mme_gtp_send_update_bearer_response(
|
||||
bearer, OGS_GTP_CAUSE_REQUEST_ACCEPTED);
|
||||
ogs_assert(OGS_OK ==
|
||||
mme_gtp_send_update_bearer_response(
|
||||
bearer, OGS_GTP_CAUSE_REQUEST_ACCEPTED));
|
||||
break;
|
||||
case OGS_NAS_EPS_DEACTIVATE_EPS_BEARER_CONTEXT_ACCEPT:
|
||||
ogs_debug("Deactivate EPS bearer "
|
||||
"context accept");
|
||||
ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]",
|
||||
mme_ue->imsi_bcd, sess->pti, bearer->ebi);
|
||||
mme_gtp_send_delete_bearer_response(
|
||||
bearer, OGS_GTP_CAUSE_REQUEST_ACCEPTED);
|
||||
ogs_assert(OGS_OK ==
|
||||
mme_gtp_send_delete_bearer_response(
|
||||
bearer, OGS_GTP_CAUSE_REQUEST_ACCEPTED));
|
||||
OGS_FSM_TRAN(s, esm_state_bearer_deactivated);
|
||||
break;
|
||||
case OGS_NAS_EPS_BEARER_RESOURCE_ALLOCATION_REQUEST:
|
||||
|
|
|
@ -2857,9 +2857,10 @@ mme_bearer_t *mme_bearer_find_or_add_by_message(
|
|||
bearer = mme_bearer_find_by_ue_ebi(mme_ue, ebi);
|
||||
if (!bearer) {
|
||||
ogs_error("No Bearer : EBI[%d]", ebi);
|
||||
nas_eps_send_attach_reject(mme_ue,
|
||||
EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED,
|
||||
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_attach_reject(mme_ue,
|
||||
EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED,
|
||||
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -2868,9 +2869,10 @@ mme_bearer_t *mme_bearer_find_or_add_by_message(
|
|||
|
||||
if (pti == OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED) {
|
||||
ogs_error("Both PTI[%d] and EBI[%d] are 0", pti, ebi);
|
||||
nas_eps_send_attach_reject(mme_ue,
|
||||
EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED,
|
||||
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_attach_reject(mme_ue,
|
||||
EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED,
|
||||
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -2885,9 +2887,10 @@ mme_bearer_t *mme_bearer_find_or_add_by_message(
|
|||
if (!bearer) {
|
||||
ogs_error("No Bearer : Linked-EBI[%d]",
|
||||
linked_eps_bearer_identity->eps_bearer_identity);
|
||||
nas_eps_send_attach_reject(mme_ue,
|
||||
EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED,
|
||||
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_attach_reject(mme_ue,
|
||||
EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED,
|
||||
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED));
|
||||
return NULL;
|
||||
}
|
||||
} else if (message->esm.h.message_type ==
|
||||
|
@ -2903,8 +2906,9 @@ mme_bearer_t *mme_bearer_find_or_add_by_message(
|
|||
if (!bearer) {
|
||||
ogs_error("No Bearer : Linked-EBI[%d]",
|
||||
linked_eps_bearer_identity->eps_bearer_identity);
|
||||
nas_eps_send_bearer_resource_allocation_reject(
|
||||
mme_ue, pti, ESM_CAUSE_INVALID_EPS_BEARER_IDENTITY);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_bearer_resource_allocation_reject(
|
||||
mme_ue, pti, ESM_CAUSE_INVALID_EPS_BEARER_IDENTITY));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -2921,8 +2925,9 @@ mme_bearer_t *mme_bearer_find_or_add_by_message(
|
|||
if (!bearer) {
|
||||
ogs_error("No Bearer : Linked-EBI[%d]",
|
||||
linked_eps_bearer_identity->eps_bearer_identity);
|
||||
nas_eps_send_bearer_resource_modification_reject(
|
||||
mme_ue, pti, ESM_CAUSE_INVALID_EPS_BEARER_IDENTITY);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_bearer_resource_modification_reject(
|
||||
mme_ue, pti, ESM_CAUSE_INVALID_EPS_BEARER_IDENTITY));
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
@ -2956,9 +2961,10 @@ mme_bearer_t *mme_bearer_find_or_add_by_message(
|
|||
if (!sess) {
|
||||
ogs_error("No Session : ESM message type[%d], PTI[%d]",
|
||||
message->esm.h.message_type, pti);
|
||||
nas_eps_send_attach_reject(mme_ue,
|
||||
EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED,
|
||||
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_attach_reject(mme_ue,
|
||||
EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED,
|
||||
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED));
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -131,9 +131,10 @@ static void timeout(ogs_gtp_xact_t *xact, void *data)
|
|||
|
||||
enb_ue = enb_ue_cycle(mme_ue->enb_ue);
|
||||
if (enb_ue) {
|
||||
s1ap_send_ue_context_release_command(enb_ue,
|
||||
ogs_assert(OGS_OK ==
|
||||
s1ap_send_ue_context_release_command(enb_ue,
|
||||
S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release,
|
||||
S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0);
|
||||
S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0));
|
||||
} else {
|
||||
ogs_warn("No S1 Context");
|
||||
}
|
||||
|
@ -198,7 +199,7 @@ void mme_gtp_close(void)
|
|||
ogs_socknode_remove_all(&ogs_gtp_self()->gtpc_list6);
|
||||
}
|
||||
|
||||
void mme_gtp_send_create_session_request(mme_sess_t *sess)
|
||||
int mme_gtp_send_create_session_request(mme_sess_t *sess)
|
||||
{
|
||||
int rv;
|
||||
ogs_gtp_header_t h;
|
||||
|
@ -214,16 +215,18 @@ void mme_gtp_send_create_session_request(mme_sess_t *sess)
|
|||
h.teid = mme_ue->sgw_s11_teid;
|
||||
|
||||
pkbuf = mme_s11_build_create_session_request(h.type, sess);
|
||||
ogs_expect_or_return(pkbuf);
|
||||
ogs_expect_or_return_val(pkbuf, OGS_ERROR);
|
||||
|
||||
xact = ogs_gtp_xact_local_create(mme_ue->gnode, &h, pkbuf, timeout, sess);
|
||||
ogs_expect_or_return(xact);
|
||||
ogs_expect_or_return_val(xact, OGS_ERROR);
|
||||
|
||||
rv = ogs_gtp_xact_commit(xact);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void mme_gtp_send_modify_bearer_request(mme_bearer_t *bearer, int uli_presence)
|
||||
int mme_gtp_send_modify_bearer_request(mme_bearer_t *bearer, int uli_presence)
|
||||
{
|
||||
int rv;
|
||||
|
||||
|
@ -242,16 +245,18 @@ void mme_gtp_send_modify_bearer_request(mme_bearer_t *bearer, int uli_presence)
|
|||
h.teid = mme_ue->sgw_s11_teid;
|
||||
|
||||
pkbuf = mme_s11_build_modify_bearer_request(h.type, bearer, uli_presence);
|
||||
ogs_expect_or_return(pkbuf);
|
||||
ogs_expect_or_return_val(pkbuf, OGS_ERROR);
|
||||
|
||||
xact = ogs_gtp_xact_local_create(mme_ue->gnode, &h, pkbuf, timeout, bearer);
|
||||
ogs_expect_or_return(xact);
|
||||
ogs_expect_or_return_val(xact, OGS_ERROR);
|
||||
|
||||
rv = ogs_gtp_xact_commit(xact);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void mme_gtp_send_delete_session_request(mme_sess_t *sess, int action)
|
||||
int mme_gtp_send_delete_session_request(mme_sess_t *sess, int action)
|
||||
{
|
||||
int rv;
|
||||
ogs_pkbuf_t *s11buf = NULL;
|
||||
|
@ -269,14 +274,16 @@ void mme_gtp_send_delete_session_request(mme_sess_t *sess, int action)
|
|||
h.teid = mme_ue->sgw_s11_teid;
|
||||
|
||||
s11buf = mme_s11_build_delete_session_request(h.type, sess);
|
||||
ogs_expect_or_return(s11buf);
|
||||
ogs_expect_or_return_val(s11buf, OGS_ERROR);
|
||||
|
||||
xact = ogs_gtp_xact_local_create(mme_ue->gnode, &h, s11buf, timeout, sess);
|
||||
ogs_expect_or_return(xact);
|
||||
ogs_expect_or_return_val(xact, OGS_ERROR);
|
||||
xact->delete_action = action;
|
||||
|
||||
rv = ogs_gtp_xact_commit(xact);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void mme_gtp_send_delete_all_sessions(mme_ue_t *mme_ue, int action)
|
||||
|
@ -316,7 +323,7 @@ void mme_gtp_send_delete_all_sessions(mme_ue_t *mme_ue, int action)
|
|||
}
|
||||
}
|
||||
|
||||
void mme_gtp_send_create_bearer_response(
|
||||
int mme_gtp_send_create_bearer_response(
|
||||
mme_bearer_t *bearer, uint8_t cause_value)
|
||||
{
|
||||
int rv;
|
||||
|
@ -338,16 +345,18 @@ void mme_gtp_send_create_bearer_response(
|
|||
h.teid = mme_ue->sgw_s11_teid;
|
||||
|
||||
pkbuf = mme_s11_build_create_bearer_response(h.type, bearer, cause_value);
|
||||
ogs_expect_or_return(pkbuf);
|
||||
ogs_expect_or_return_val(pkbuf, OGS_ERROR);
|
||||
|
||||
rv = ogs_gtp_xact_update_tx(xact, &h, pkbuf);
|
||||
ogs_expect_or_return(rv == OGS_OK);
|
||||
ogs_expect_or_return_val(rv == OGS_OK, OGS_ERROR);
|
||||
|
||||
rv = ogs_gtp_xact_commit(xact);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void mme_gtp_send_update_bearer_response(
|
||||
int mme_gtp_send_update_bearer_response(
|
||||
mme_bearer_t *bearer, uint8_t cause_value)
|
||||
{
|
||||
int rv;
|
||||
|
@ -369,16 +378,18 @@ void mme_gtp_send_update_bearer_response(
|
|||
h.teid = mme_ue->sgw_s11_teid;
|
||||
|
||||
pkbuf = mme_s11_build_update_bearer_response(h.type, bearer, cause_value);
|
||||
ogs_expect_or_return(pkbuf);
|
||||
ogs_expect_or_return_val(pkbuf, OGS_ERROR);
|
||||
|
||||
rv = ogs_gtp_xact_update_tx(xact, &h, pkbuf);
|
||||
ogs_expect_or_return(rv == OGS_OK);
|
||||
ogs_expect_or_return_val(rv == OGS_OK, OGS_ERROR);
|
||||
|
||||
rv = ogs_gtp_xact_commit(xact);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void mme_gtp_send_delete_bearer_response(
|
||||
int mme_gtp_send_delete_bearer_response(
|
||||
mme_bearer_t *bearer, uint8_t cause_value)
|
||||
{
|
||||
int rv;
|
||||
|
@ -400,16 +411,18 @@ void mme_gtp_send_delete_bearer_response(
|
|||
h.teid = mme_ue->sgw_s11_teid;
|
||||
|
||||
pkbuf = mme_s11_build_delete_bearer_response(h.type, bearer, cause_value);
|
||||
ogs_expect_or_return(pkbuf);
|
||||
ogs_expect_or_return_val(pkbuf, OGS_ERROR);
|
||||
|
||||
rv = ogs_gtp_xact_update_tx(xact, &h, pkbuf);
|
||||
ogs_expect_or_return(rv == OGS_OK);
|
||||
ogs_expect_or_return_val(rv == OGS_OK, OGS_ERROR);
|
||||
|
||||
rv = ogs_gtp_xact_commit(xact);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void mme_gtp_send_release_access_bearers_request(mme_ue_t *mme_ue, int action)
|
||||
int mme_gtp_send_release_access_bearers_request(mme_ue_t *mme_ue, int action)
|
||||
{
|
||||
int rv;
|
||||
ogs_gtp_header_t h;
|
||||
|
@ -424,14 +437,16 @@ void mme_gtp_send_release_access_bearers_request(mme_ue_t *mme_ue, int action)
|
|||
h.teid = mme_ue->sgw_s11_teid;
|
||||
|
||||
pkbuf = mme_s11_build_release_access_bearers_request(h.type);
|
||||
ogs_expect_or_return(pkbuf);
|
||||
ogs_expect_or_return_val(pkbuf, OGS_ERROR);
|
||||
|
||||
xact = ogs_gtp_xact_local_create(mme_ue->gnode, &h, pkbuf, timeout, mme_ue);
|
||||
ogs_expect_or_return(xact);
|
||||
ogs_expect_or_return_val(xact, OGS_ERROR);
|
||||
xact->release_action = action;
|
||||
|
||||
rv = ogs_gtp_xact_commit(xact);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void mme_gtp_send_release_all_ue_in_enb(mme_enb_t *enb, int action)
|
||||
|
@ -443,8 +458,8 @@ void mme_gtp_send_release_all_ue_in_enb(mme_enb_t *enb, int action)
|
|||
mme_ue = enb_ue->mme_ue;
|
||||
|
||||
if (mme_ue) {
|
||||
|
||||
mme_gtp_send_release_access_bearers_request(mme_ue, action);
|
||||
ogs_assert(OGS_OK ==
|
||||
mme_gtp_send_release_access_bearers_request(mme_ue, action));
|
||||
|
||||
} else {
|
||||
ogs_warn("mme_gtp_send_release_all_ue_in_enb()");
|
||||
|
@ -462,7 +477,7 @@ void mme_gtp_send_release_all_ue_in_enb(mme_enb_t *enb, int action)
|
|||
}
|
||||
}
|
||||
|
||||
void mme_gtp_send_downlink_data_notification_ack(
|
||||
int mme_gtp_send_downlink_data_notification_ack(
|
||||
mme_bearer_t *bearer, uint8_t cause_value)
|
||||
{
|
||||
int rv;
|
||||
|
@ -484,17 +499,18 @@ void mme_gtp_send_downlink_data_notification_ack(
|
|||
h.teid = mme_ue->sgw_s11_teid;
|
||||
|
||||
s11buf = mme_s11_build_downlink_data_notification_ack(h.type, cause_value);
|
||||
ogs_expect_or_return(s11buf);
|
||||
ogs_expect_or_return_val(s11buf, OGS_ERROR);
|
||||
|
||||
rv = ogs_gtp_xact_update_tx(xact, &h, s11buf);
|
||||
ogs_expect_or_return(rv == OGS_OK);
|
||||
ogs_expect_or_return_val(rv == OGS_OK, OGS_ERROR);
|
||||
|
||||
rv = ogs_gtp_xact_commit(xact);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void mme_gtp_send_create_indirect_data_forwarding_tunnel_request(
|
||||
int mme_gtp_send_create_indirect_data_forwarding_tunnel_request(
|
||||
mme_ue_t *mme_ue)
|
||||
{
|
||||
int rv;
|
||||
|
@ -510,16 +526,18 @@ void mme_gtp_send_create_indirect_data_forwarding_tunnel_request(
|
|||
|
||||
pkbuf = mme_s11_build_create_indirect_data_forwarding_tunnel_request(
|
||||
h.type, mme_ue);
|
||||
ogs_expect_or_return(pkbuf);
|
||||
ogs_expect_or_return_val(pkbuf, OGS_ERROR);
|
||||
|
||||
xact = ogs_gtp_xact_local_create(mme_ue->gnode, &h, pkbuf, timeout, mme_ue);
|
||||
ogs_expect_or_return(xact);
|
||||
ogs_expect_or_return_val(xact, OGS_ERROR);
|
||||
|
||||
rv = ogs_gtp_xact_commit(xact);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void mme_gtp_send_delete_indirect_data_forwarding_tunnel_request(
|
||||
int mme_gtp_send_delete_indirect_data_forwarding_tunnel_request(
|
||||
mme_ue_t *mme_ue, int action)
|
||||
{
|
||||
int rv;
|
||||
|
@ -535,18 +553,20 @@ void mme_gtp_send_delete_indirect_data_forwarding_tunnel_request(
|
|||
h.teid = mme_ue->sgw_s11_teid;
|
||||
|
||||
pkbuf = ogs_pkbuf_alloc(NULL, OGS_TLV_MAX_HEADROOM);
|
||||
ogs_assert(pkbuf);
|
||||
ogs_expect_or_return_val(pkbuf, OGS_ERROR);
|
||||
ogs_pkbuf_reserve(pkbuf, OGS_TLV_MAX_HEADROOM);
|
||||
|
||||
xact = ogs_gtp_xact_local_create(mme_ue->gnode, &h, pkbuf, timeout, mme_ue);
|
||||
ogs_expect_or_return(xact);
|
||||
ogs_expect_or_return_val(xact, OGS_ERROR);
|
||||
xact->delete_indirect_action = action;
|
||||
|
||||
rv = ogs_gtp_xact_commit(xact);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void mme_gtp_send_bearer_resource_command(
|
||||
int mme_gtp_send_bearer_resource_command(
|
||||
mme_bearer_t *bearer, ogs_nas_eps_message_t *nas_message)
|
||||
{
|
||||
int rv;
|
||||
|
@ -565,12 +585,14 @@ void mme_gtp_send_bearer_resource_command(
|
|||
h.teid = mme_ue->sgw_s11_teid;
|
||||
|
||||
pkbuf = mme_s11_build_bearer_resource_command(h.type, bearer, nas_message);
|
||||
ogs_expect_or_return(pkbuf);
|
||||
ogs_expect_or_return_val(pkbuf, OGS_ERROR);
|
||||
|
||||
xact = ogs_gtp_xact_local_create(mme_ue->gnode, &h, pkbuf, timeout, bearer);
|
||||
ogs_expect_or_return(xact);
|
||||
ogs_expect_or_return_val(xact, OGS_ERROR);
|
||||
xact->xid |= OGS_GTP_CMD_XACT_ID;
|
||||
|
||||
rv = ogs_gtp_xact_commit(xact);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
|
@ -29,32 +29,32 @@ extern "C" {
|
|||
int mme_gtp_open(void);
|
||||
void mme_gtp_close(void);
|
||||
|
||||
void mme_gtp_send_create_session_request(mme_sess_t *sess);
|
||||
void mme_gtp_send_modify_bearer_request(mme_bearer_t *bearer, int uli_presence);
|
||||
void mme_gtp_send_delete_session_request(mme_sess_t *sess, int action);
|
||||
int mme_gtp_send_create_session_request(mme_sess_t *sess);
|
||||
int mme_gtp_send_modify_bearer_request(mme_bearer_t *bearer, int uli_presence);
|
||||
int mme_gtp_send_delete_session_request(mme_sess_t *sess, int action);
|
||||
void mme_gtp_send_delete_all_sessions(mme_ue_t *mme_ue, int action);
|
||||
void mme_gtp_send_create_bearer_response(
|
||||
int mme_gtp_send_create_bearer_response(
|
||||
mme_bearer_t *bearer, uint8_t cause_value);
|
||||
void mme_gtp_send_update_bearer_response(
|
||||
int mme_gtp_send_update_bearer_response(
|
||||
mme_bearer_t *bearer, uint8_t cause_value);
|
||||
void mme_gtp_send_delete_bearer_response(
|
||||
int mme_gtp_send_delete_bearer_response(
|
||||
mme_bearer_t *bearer, uint8_t cause_value);
|
||||
void mme_gtp_send_release_access_bearers_request(mme_ue_t *mme_ue, int action);
|
||||
int mme_gtp_send_release_access_bearers_request(mme_ue_t *mme_ue, int action);
|
||||
void mme_gtp_send_release_all_ue_in_enb(mme_enb_t *enb, int action);
|
||||
|
||||
void mme_gtp_send_downlink_data_notification_ack(
|
||||
int mme_gtp_send_downlink_data_notification_ack(
|
||||
mme_bearer_t *bearer, uint8_t cause_value);
|
||||
|
||||
void mme_gtp_send_create_indirect_data_forwarding_tunnel_request(
|
||||
int mme_gtp_send_create_indirect_data_forwarding_tunnel_request(
|
||||
mme_ue_t *mme_ue);
|
||||
void mme_gtp_send_delete_indirect_data_forwarding_tunnel_request(
|
||||
int mme_gtp_send_delete_indirect_data_forwarding_tunnel_request(
|
||||
mme_ue_t *mme_ue, int action);
|
||||
|
||||
void mme_gtp_send_bearer_resource_command(
|
||||
int mme_gtp_send_bearer_resource_command(
|
||||
mme_bearer_t *bearer, ogs_nas_eps_message_t *nas_message);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* MME_S11_PATH_H */
|
||||
#endif /* MME_S11_PATH_H */
|
|
@ -30,7 +30,8 @@ void mme_send_delete_session_or_detach(mme_ue_t *mme_ue)
|
|||
mme_gtp_send_delete_all_sessions(mme_ue,
|
||||
OGS_GTP_DELETE_SEND_DETACH_ACCEPT);
|
||||
} else {
|
||||
nas_eps_send_detach_accept(mme_ue);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_detach_accept(mme_ue));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -44,9 +45,10 @@ void mme_send_delete_session_or_mme_ue_context_release(mme_ue_t *mme_ue)
|
|||
} else {
|
||||
enb_ue_t *enb_ue = enb_ue_cycle(mme_ue->enb_ue);
|
||||
if (enb_ue) {
|
||||
s1ap_send_ue_context_release_command(enb_ue,
|
||||
ogs_assert(OGS_OK ==
|
||||
s1ap_send_ue_context_release_command(enb_ue,
|
||||
S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release,
|
||||
S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0);
|
||||
S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0));
|
||||
} else {
|
||||
ogs_warn("[%s] No S1 Context", mme_ue->imsi_bcd);
|
||||
}
|
||||
|
@ -61,13 +63,15 @@ void mme_send_release_access_bearer_or_ue_context_release(enb_ue_t *enb_ue)
|
|||
mme_ue = enb_ue->mme_ue;
|
||||
if (mme_ue) {
|
||||
ogs_debug("[%s] Release access bearer request", mme_ue->imsi_bcd);
|
||||
mme_gtp_send_release_access_bearers_request(
|
||||
mme_ue, OGS_GTP_RELEASE_SEND_UE_CONTEXT_RELEASE_COMMAND);
|
||||
ogs_assert(OGS_OK ==
|
||||
mme_gtp_send_release_access_bearers_request(
|
||||
mme_ue, OGS_GTP_RELEASE_SEND_UE_CONTEXT_RELEASE_COMMAND));
|
||||
} else {
|
||||
ogs_debug("[%s] No UE Context", mme_ue->imsi_bcd);
|
||||
s1ap_send_ue_context_release_command(enb_ue,
|
||||
ogs_assert(OGS_OK ==
|
||||
s1ap_send_ue_context_release_command(enb_ue,
|
||||
S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release,
|
||||
S1AP_UE_CTX_REL_S1_CONTEXT_REMOVE, 0);
|
||||
S1AP_UE_CTX_REL_S1_CONTEXT_REMOVE, 0));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -94,36 +98,43 @@ void mme_send_after_paging(mme_ue_t *mme_ue, uint8_t cause_value)
|
|||
|
||||
switch (type) {
|
||||
case OGS_GTP_DOWNLINK_DATA_NOTIFICATION_TYPE:
|
||||
mme_gtp_send_downlink_data_notification_ack(
|
||||
bearer, cause_value);
|
||||
ogs_assert(OGS_OK ==
|
||||
mme_gtp_send_downlink_data_notification_ack(
|
||||
bearer, cause_value));
|
||||
break;
|
||||
case OGS_GTP_CREATE_BEARER_REQUEST_TYPE:
|
||||
if (cause_value == OGS_GTP_CAUSE_REQUEST_ACCEPTED) {
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_activate_dedicated_bearer_context_request(
|
||||
bearer);
|
||||
bearer));
|
||||
} else {
|
||||
mme_gtp_send_create_bearer_response(
|
||||
bearer, cause_value);
|
||||
ogs_assert(OGS_OK ==
|
||||
mme_gtp_send_create_bearer_response(
|
||||
bearer, cause_value));
|
||||
}
|
||||
break;
|
||||
case OGS_GTP_UPDATE_BEARER_REQUEST_TYPE:
|
||||
if (cause_value == OGS_GTP_CAUSE_REQUEST_ACCEPTED) {
|
||||
nas_eps_send_modify_bearer_context_request(bearer,
|
||||
(xact->update_flags &
|
||||
OGS_GTP_MODIFY_QOS_UPDATE) ? 1 : 0,
|
||||
(xact->update_flags &
|
||||
OGS_GTP_MODIFY_TFT_UPDATE) ? 1 : 0);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_modify_bearer_context_request(bearer,
|
||||
(xact->update_flags &
|
||||
OGS_GTP_MODIFY_QOS_UPDATE) ? 1 : 0,
|
||||
(xact->update_flags &
|
||||
OGS_GTP_MODIFY_TFT_UPDATE) ? 1 : 0));
|
||||
} else {
|
||||
mme_gtp_send_update_bearer_response(
|
||||
bearer, cause_value);
|
||||
ogs_assert(OGS_OK ==
|
||||
mme_gtp_send_update_bearer_response(
|
||||
bearer, cause_value));
|
||||
}
|
||||
break;
|
||||
case OGS_GTP_DELETE_BEARER_REQUEST_TYPE:
|
||||
if (cause_value == OGS_GTP_CAUSE_REQUEST_ACCEPTED) {
|
||||
nas_eps_send_deactivate_bearer_context_request(bearer);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_deactivate_bearer_context_request(bearer));
|
||||
} else {
|
||||
mme_gtp_send_delete_bearer_response(
|
||||
bearer, cause_value);
|
||||
ogs_assert(OGS_OK ==
|
||||
mme_gtp_send_delete_bearer_response(
|
||||
bearer, cause_value));
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
|
|
@ -168,8 +168,9 @@ void mme_s11_handle_create_session_response(
|
|||
if (cause_value != OGS_GTP_CAUSE_REQUEST_ACCEPTED) {
|
||||
if (sess && SESSION_CONTEXT_IN_ATTACH(sess)) {
|
||||
ogs_error("[%s] Attach reject", mme_ue->imsi_bcd);
|
||||
nas_eps_send_attach_reject(mme_ue,
|
||||
EMM_CAUSE_NETWORK_FAILURE, ESM_CAUSE_NETWORK_FAILURE);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_attach_reject(mme_ue,
|
||||
EMM_CAUSE_NETWORK_FAILURE, ESM_CAUSE_NETWORK_FAILURE));
|
||||
}
|
||||
mme_send_delete_session_or_mme_ue_context_release(mme_ue);
|
||||
return;
|
||||
|
@ -236,16 +237,19 @@ void mme_s11_handle_create_session_response(
|
|||
if (csmap) {
|
||||
ogs_assert(OGS_PDU_SESSION_TYPE_IS_VALID(
|
||||
session->paa.session_type));
|
||||
sgsap_send_location_update_request(mme_ue);
|
||||
ogs_assert(OGS_OK ==
|
||||
sgsap_send_location_update_request(mme_ue));
|
||||
} else {
|
||||
ogs_assert(OGS_PDU_SESSION_TYPE_IS_VALID(
|
||||
session->paa.session_type));
|
||||
nas_eps_send_attach_accept(mme_ue);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_attach_accept(mme_ue));
|
||||
}
|
||||
|
||||
} else {
|
||||
ogs_assert(OGS_PDU_SESSION_TYPE_IS_VALID(session->paa.session_type));
|
||||
nas_eps_send_activate_default_bearer_context_request(bearer);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_activate_default_bearer_context_request(bearer));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -293,11 +297,13 @@ void mme_s11_handle_modify_bearer_response(
|
|||
mme_ue->mme_s11_teid, mme_ue->sgw_s11_teid);
|
||||
|
||||
GTP_COUNTER_CHECK(mme_ue, GTP_COUNTER_MODIFY_BEARER_BY_PATH_SWITCH,
|
||||
s1ap_send_path_switch_ack(mme_ue);
|
||||
ogs_assert(OGS_OK ==
|
||||
s1ap_send_path_switch_ack(mme_ue));
|
||||
);
|
||||
|
||||
GTP_COUNTER_CHECK(mme_ue, GTP_COUNTER_MODIFY_BEARER_BY_E_RAB_MODIFICATION,
|
||||
s1ap_send_e_rab_modification_confirm(mme_ue);
|
||||
ogs_assert(OGS_OK ==
|
||||
s1ap_send_e_rab_modification_confirm(mme_ue));
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -344,7 +350,8 @@ void mme_s11_handle_delete_session_response(
|
|||
|
||||
} else if (action == OGS_GTP_DELETE_SEND_DETACH_ACCEPT) {
|
||||
if (mme_sess_count(mme_ue) == 1) /* Last Session */ {
|
||||
nas_eps_send_detach_accept(mme_ue);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_detach_accept(mme_ue));
|
||||
}
|
||||
|
||||
} else if (action ==
|
||||
|
@ -352,7 +359,8 @@ void mme_s11_handle_delete_session_response(
|
|||
mme_bearer_t *bearer = mme_default_bearer_in_sess(sess);
|
||||
ogs_expect_or_return(bearer);
|
||||
|
||||
nas_eps_send_deactivate_bearer_context_request(bearer);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_deactivate_bearer_context_request(bearer));
|
||||
|
||||
/*
|
||||
* mme_sess_remove() should not be called here.
|
||||
|
@ -368,9 +376,10 @@ void mme_s11_handle_delete_session_response(
|
|||
|
||||
enb_ue = enb_ue_cycle(mme_ue->enb_ue);
|
||||
if (enb_ue) {
|
||||
s1ap_send_ue_context_release_command(enb_ue,
|
||||
ogs_assert(OGS_OK ==
|
||||
s1ap_send_ue_context_release_command(enb_ue,
|
||||
S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release,
|
||||
S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0);
|
||||
S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0));
|
||||
} else
|
||||
ogs_warn("ENB-S1 Context has already been removed");
|
||||
}
|
||||
|
@ -381,9 +390,10 @@ void mme_s11_handle_delete_session_response(
|
|||
&mme_ue->pdn_connectivity_request);
|
||||
if (rv != OGS_OK) {
|
||||
ogs_error("nas_eps_send_emm_to_esm() failed");
|
||||
nas_eps_send_attach_reject(mme_ue,
|
||||
EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED,
|
||||
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_attach_reject(mme_ue,
|
||||
EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED,
|
||||
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -524,7 +534,8 @@ void mme_s11_handle_create_bearer_request(
|
|||
if (ECM_IDLE(mme_ue)) {
|
||||
s1ap_send_paging(mme_ue, S1AP_CNDomain_ps);
|
||||
} else {
|
||||
nas_eps_send_activate_dedicated_bearer_context_request(bearer);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_activate_dedicated_bearer_context_request(bearer));
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
|
@ -629,9 +640,10 @@ void mme_s11_handle_update_bearer_request(
|
|||
if (ECM_IDLE(mme_ue)) {
|
||||
s1ap_send_paging(mme_ue, S1AP_CNDomain_ps);
|
||||
} else {
|
||||
nas_eps_send_modify_bearer_context_request(bearer,
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_modify_bearer_context_request(bearer,
|
||||
req->bearer_contexts.bearer_level_qos.presence,
|
||||
req->bearer_contexts.tft.presence);
|
||||
req->bearer_contexts.tft.presence));
|
||||
}
|
||||
} else {
|
||||
ogs_warn("[IGNORE] Update Bearer Request : "
|
||||
|
@ -639,12 +651,14 @@ void mme_s11_handle_update_bearer_request(
|
|||
|
||||
if (xact->xid & OGS_GTP_CMD_XACT_ID) {
|
||||
/* MME received Bearer Resource Modification Request */
|
||||
nas_eps_send_bearer_resource_modification_reject(
|
||||
mme_ue, sess->pti, ESM_CAUSE_SERVICE_OPTION_NOT_SUPPORTED);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_bearer_resource_modification_reject(
|
||||
mme_ue, sess->pti, ESM_CAUSE_SERVICE_OPTION_NOT_SUPPORTED));
|
||||
}
|
||||
|
||||
mme_gtp_send_update_bearer_response(
|
||||
bearer, OGS_GTP_CAUSE_REQUEST_ACCEPTED);
|
||||
ogs_assert(OGS_OK ==
|
||||
mme_gtp_send_update_bearer_response(
|
||||
bearer, OGS_GTP_CAUSE_REQUEST_ACCEPTED));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -710,7 +724,8 @@ void mme_s11_handle_delete_bearer_request(
|
|||
if (ECM_IDLE(mme_ue)) {
|
||||
s1ap_send_paging(mme_ue, S1AP_CNDomain_ps);
|
||||
} else {
|
||||
nas_eps_send_deactivate_bearer_context_request(bearer);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_deactivate_bearer_context_request(bearer));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -763,9 +778,10 @@ void mme_s11_handle_release_access_bearers_response(
|
|||
if (action == OGS_GTP_RELEASE_SEND_UE_CONTEXT_RELEASE_COMMAND) {
|
||||
enb_ue = enb_ue_cycle(mme_ue->enb_ue);
|
||||
if (enb_ue) {
|
||||
s1ap_send_ue_context_release_command(enb_ue,
|
||||
ogs_assert(OGS_OK ==
|
||||
s1ap_send_ue_context_release_command(enb_ue,
|
||||
S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release,
|
||||
S1AP_UE_CTX_REL_S1_REMOVE_AND_UNLINK, 0);
|
||||
S1AP_UE_CTX_REL_S1_REMOVE_AND_UNLINK, 0));
|
||||
} else {
|
||||
ogs_warn("ENB-S1 Context has already been removed");
|
||||
}
|
||||
|
@ -805,7 +821,8 @@ void mme_s11_handle_release_access_bearers_response(
|
|||
enb_ue_remove(enb_ue);
|
||||
|
||||
if (ogs_list_count(&enb->enb_ue_list) == 0)
|
||||
s1ap_send_s1_reset_ack(enb, NULL);
|
||||
ogs_assert(OGS_OK ==
|
||||
s1ap_send_s1_reset_ack(enb, NULL));
|
||||
} else {
|
||||
ogs_warn("ENB-S1 Context has already been removed");
|
||||
}
|
||||
|
@ -964,12 +981,14 @@ void mme_s11_handle_downlink_data_notification(
|
|||
enb_ue_t *enb_ue = enb_ue_cycle(mme_ue->enb_ue);
|
||||
ogs_assert(enb_ue);
|
||||
|
||||
s1ap_send_ue_context_release_command(enb_ue,
|
||||
ogs_assert(OGS_OK ==
|
||||
s1ap_send_ue_context_release_command(enb_ue,
|
||||
S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release,
|
||||
S1AP_UE_CTX_REL_S1_PAGING, 0);
|
||||
S1AP_UE_CTX_REL_S1_PAGING, 0));
|
||||
} else {
|
||||
mme_gtp_send_downlink_data_notification_ack(
|
||||
bearer, OGS_GTP_CAUSE_UE_ALREADY_RE_ATTACHED);
|
||||
ogs_assert(OGS_OK ==
|
||||
mme_gtp_send_downlink_data_notification_ack(
|
||||
bearer, OGS_GTP_CAUSE_UE_ALREADY_RE_ATTACHED));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1048,7 +1067,8 @@ void mme_s11_handle_create_indirect_data_forwarding_tunnel_response(
|
|||
source_ue = enb_ue_cycle(mme_ue->enb_ue);
|
||||
ogs_assert(source_ue);
|
||||
|
||||
s1ap_send_handover_command(source_ue);
|
||||
ogs_assert(OGS_OK ==
|
||||
s1ap_send_handover_command(source_ue));
|
||||
}
|
||||
|
||||
void mme_s11_handle_delete_indirect_data_forwarding_tunnel_response(
|
||||
|
@ -1097,7 +1117,8 @@ void mme_s11_handle_delete_indirect_data_forwarding_tunnel_response(
|
|||
if (action == OGS_GTP_DELETE_INDIRECT_HANDOVER_COMPLETE) {
|
||||
/* Nothing to do */
|
||||
} else if (action == OGS_GTP_DELETE_INDIRECT_HANDOVER_CANCEL) {
|
||||
s1ap_send_handover_cancel_ack(mme_ue->enb_ue);
|
||||
ogs_assert(OGS_OK ==
|
||||
s1ap_send_handover_cancel_ack(mme_ue->enb_ue));
|
||||
} else {
|
||||
ogs_fatal("Invalid action = %d", action);
|
||||
ogs_assert_if_reached();
|
||||
|
@ -1139,8 +1160,9 @@ void mme_s11_handle_bearer_resource_failure_indication(
|
|||
ogs_debug(" MME_S11_TEID[%d] SGW_S11_TEID[%d]",
|
||||
mme_ue->mme_s11_teid, mme_ue->sgw_s11_teid);
|
||||
|
||||
nas_eps_send_bearer_resource_modification_reject(
|
||||
mme_ue, sess->pti, esm_cause_from_gtp(cause_value));
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_bearer_resource_modification_reject(
|
||||
mme_ue, sess->pti, esm_cause_from_gtp(cause_value)));
|
||||
|
||||
if (cause_value == OGS_GTP_CAUSE_CONTEXT_NOT_FOUND) {
|
||||
ogs_warn("No Bearer");
|
||||
|
|
|
@ -44,7 +44,8 @@ void mme_s6a_handle_aia(mme_ue_t *mme_ue,
|
|||
if (mme_ue->nas_eps.ksi == OGS_NAS_KSI_NO_KEY_IS_AVAILABLE)
|
||||
mme_ue->nas_eps.ksi = 0;
|
||||
|
||||
nas_eps_send_authentication_request(mme_ue);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_authentication_request(mme_ue));
|
||||
}
|
||||
|
||||
void mme_s6a_handle_ula(mme_ue_t *mme_ue,
|
||||
|
|
|
@ -239,9 +239,10 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e)
|
|||
ogs_fsm_dispatch(&enb->sm, e);
|
||||
} else {
|
||||
ogs_warn("Cannot decode S1AP message");
|
||||
s1ap_send_error_indication(
|
||||
ogs_assert(OGS_OK ==
|
||||
s1ap_send_error_indication(
|
||||
enb, NULL, NULL, S1AP_Cause_PR_protocol,
|
||||
S1AP_CauseProtocol_abstract_syntax_error_falsely_constructed_message);
|
||||
S1AP_CauseProtocol_abstract_syntax_error_falsely_constructed_message));
|
||||
}
|
||||
|
||||
ogs_s1ap_free(&s1ap_message);
|
||||
|
@ -330,9 +331,10 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e)
|
|||
/* De-associate S1 with NAS/EMM */
|
||||
enb_ue_deassociate(mme_ue->enb_ue);
|
||||
|
||||
s1ap_send_ue_context_release_command(mme_ue->enb_ue,
|
||||
ogs_assert(OGS_OK ==
|
||||
s1ap_send_ue_context_release_command(mme_ue->enb_ue,
|
||||
S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release,
|
||||
S1AP_UE_CTX_REL_S1_CONTEXT_REMOVE, 0);
|
||||
S1AP_UE_CTX_REL_S1_CONTEXT_REMOVE, 0));
|
||||
}
|
||||
mme_ue_associate_enb_ue(mme_ue, enb_ue);
|
||||
}
|
||||
|
@ -446,15 +448,17 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e)
|
|||
|
||||
ogs_info("[%s] Attach reject [EMM_CAUSE:%d]",
|
||||
mme_ue->imsi_bcd, emm_cause);
|
||||
nas_eps_send_attach_reject(mme_ue,
|
||||
emm_cause, ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_attach_reject(mme_ue,
|
||||
emm_cause, ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED));
|
||||
|
||||
enb_ue = enb_ue_cycle(mme_ue->enb_ue);
|
||||
ogs_assert(enb_ue);
|
||||
|
||||
s1ap_send_ue_context_release_command(enb_ue,
|
||||
ogs_assert(OGS_OK ==
|
||||
s1ap_send_ue_context_release_command(enb_ue,
|
||||
S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release,
|
||||
S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0);
|
||||
S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0));
|
||||
|
||||
ogs_subscription_data_free(
|
||||
&s6a_message->ula_message.subscription_data);
|
||||
|
@ -474,13 +478,15 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e)
|
|||
&mme_ue->pdn_connectivity_request);
|
||||
if (rv != OGS_OK) {
|
||||
ogs_error("nas_eps_send_emm_to_esm() failed");
|
||||
nas_eps_send_attach_reject(mme_ue,
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_attach_reject(mme_ue,
|
||||
EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED,
|
||||
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
|
||||
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED));
|
||||
}
|
||||
} else if (mme_ue->nas_eps.type == MME_EPS_TYPE_TAU_REQUEST) {
|
||||
nas_eps_send_tau_accept(mme_ue,
|
||||
S1AP_ProcedureCode_id_InitialContextSetup);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_tau_accept(mme_ue,
|
||||
S1AP_ProcedureCode_id_InitialContextSetup));
|
||||
} else if (mme_ue->nas_eps.type == MME_EPS_TYPE_SERVICE_REQUEST) {
|
||||
ogs_error("[%s] Service request", mme_ue->imsi_bcd);
|
||||
} else if (mme_ue->nas_eps.type ==
|
||||
|
|
|
@ -57,9 +57,7 @@ int nas_eps_send_emm_to_esm(mme_ue_t *mme_ue,
|
|||
esm_message_container->buffer, esm_message_container->length);
|
||||
|
||||
rv = s1ap_send_to_esm(mme_ue, esmbuf, 0);
|
||||
if (rv != OGS_OK) {
|
||||
ogs_error("s1ap_send_to_esm() failed");
|
||||
}
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
@ -77,23 +75,19 @@ int nas_eps_send_to_downlink_nas_transport(mme_ue_t *mme_ue, ogs_pkbuf_t *pkbuf)
|
|||
ogs_warn("S1 context has already been removed");
|
||||
ogs_pkbuf_free(pkbuf);
|
||||
|
||||
return OGS_ERROR;
|
||||
} else {
|
||||
s1apbuf = s1ap_build_downlink_nas_transport(enb_ue, pkbuf);
|
||||
if (!s1apbuf) {
|
||||
ogs_error("s1ap_build_downlink_nas_transport() failed");
|
||||
return OGS_ERROR;
|
||||
}
|
||||
ogs_expect_or_return_val(s1apbuf, OGS_ERROR);
|
||||
|
||||
rv = nas_eps_send_to_enb(mme_ue, s1apbuf);
|
||||
if (rv != OGS_OK) {
|
||||
return OGS_ERROR;
|
||||
}
|
||||
}
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return OGS_OK;
|
||||
return rv;
|
||||
}
|
||||
}
|
||||
|
||||
void nas_eps_send_attach_accept(mme_ue_t *mme_ue)
|
||||
int nas_eps_send_attach_accept(mme_ue_t *mme_ue)
|
||||
{
|
||||
int rv;
|
||||
mme_sess_t *sess = NULL;
|
||||
|
@ -112,10 +106,10 @@ void nas_eps_send_attach_accept(mme_ue_t *mme_ue)
|
|||
ogs_debug("[%s] Attach accept", mme_ue->imsi_bcd);
|
||||
|
||||
esmbuf = esm_build_activate_default_bearer_context_request(sess);
|
||||
ogs_expect_or_return(esmbuf);
|
||||
ogs_expect_or_return_val(esmbuf, OGS_ERROR);
|
||||
|
||||
emmbuf = emm_build_attach_accept(mme_ue, esmbuf);
|
||||
ogs_expect_or_return(emmbuf);
|
||||
ogs_expect_or_return_val(emmbuf, OGS_ERROR);
|
||||
|
||||
CLEAR_MME_UE_TIMER(mme_ue->t3450);
|
||||
mme_ue->t3450.pkbuf = ogs_pkbuf_copy(emmbuf);
|
||||
|
@ -124,13 +118,15 @@ void nas_eps_send_attach_accept(mme_ue_t *mme_ue)
|
|||
mme_timer_cfg(MME_TIMER_T3450)->duration);
|
||||
|
||||
s1apbuf = s1ap_build_initial_context_setup_request(mme_ue, emmbuf);
|
||||
ogs_expect_or_return(s1apbuf);
|
||||
ogs_expect_or_return_val(s1apbuf, OGS_ERROR);
|
||||
|
||||
rv = nas_eps_send_to_enb(mme_ue, s1apbuf);
|
||||
ogs_expect_or_return(rv == OGS_OK);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void nas_eps_send_attach_reject(mme_ue_t *mme_ue,
|
||||
int nas_eps_send_attach_reject(mme_ue_t *mme_ue,
|
||||
ogs_nas_emm_cause_t emm_cause, ogs_nas_esm_cause_t esm_cause)
|
||||
{
|
||||
int rv;
|
||||
|
@ -145,16 +141,18 @@ void nas_eps_send_attach_reject(mme_ue_t *mme_ue,
|
|||
sess = mme_sess_first(mme_ue);
|
||||
if (sess) {
|
||||
esmbuf = esm_build_pdn_connectivity_reject(sess, esm_cause);
|
||||
ogs_expect_or_return(esmbuf);
|
||||
ogs_expect_or_return_val(esmbuf, OGS_ERROR);
|
||||
}
|
||||
|
||||
emmbuf = emm_build_attach_reject(emm_cause, esmbuf);
|
||||
ogs_expect_or_return(emmbuf);
|
||||
ogs_expect_or_return_val(emmbuf, OGS_ERROR);
|
||||
rv = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void nas_eps_send_identity_request(mme_ue_t *mme_ue)
|
||||
int nas_eps_send_identity_request(mme_ue_t *mme_ue)
|
||||
{
|
||||
int rv;
|
||||
ogs_pkbuf_t *emmbuf = NULL;
|
||||
|
@ -165,10 +163,10 @@ void nas_eps_send_identity_request(mme_ue_t *mme_ue)
|
|||
|
||||
if (mme_ue->t3470.pkbuf) {
|
||||
emmbuf = mme_ue->t3470.pkbuf;
|
||||
ogs_expect_or_return(emmbuf);
|
||||
ogs_expect_or_return_val(emmbuf, OGS_ERROR);
|
||||
} else {
|
||||
emmbuf = emm_build_identity_request(mme_ue);
|
||||
ogs_expect_or_return(emmbuf);
|
||||
ogs_expect_or_return_val(emmbuf, OGS_ERROR);
|
||||
}
|
||||
|
||||
mme_ue->t3470.pkbuf = ogs_pkbuf_copy(emmbuf);
|
||||
|
@ -178,9 +176,11 @@ void nas_eps_send_identity_request(mme_ue_t *mme_ue)
|
|||
|
||||
rv = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void nas_eps_send_authentication_request(mme_ue_t *mme_ue)
|
||||
int nas_eps_send_authentication_request(mme_ue_t *mme_ue)
|
||||
{
|
||||
int rv;
|
||||
ogs_pkbuf_t *emmbuf = NULL;
|
||||
|
@ -191,10 +191,10 @@ void nas_eps_send_authentication_request(mme_ue_t *mme_ue)
|
|||
|
||||
if (mme_ue->t3460.pkbuf) {
|
||||
emmbuf = mme_ue->t3460.pkbuf;
|
||||
ogs_expect_or_return(emmbuf);
|
||||
ogs_expect_or_return_val(emmbuf, OGS_ERROR);
|
||||
} else {
|
||||
emmbuf = emm_build_authentication_request(mme_ue);
|
||||
ogs_expect_or_return(emmbuf);
|
||||
ogs_expect_or_return_val(emmbuf, OGS_ERROR);
|
||||
}
|
||||
|
||||
mme_ue->t3460.pkbuf = ogs_pkbuf_copy(emmbuf);
|
||||
|
@ -204,9 +204,11 @@ void nas_eps_send_authentication_request(mme_ue_t *mme_ue)
|
|||
|
||||
rv = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void nas_eps_send_security_mode_command(mme_ue_t *mme_ue)
|
||||
int nas_eps_send_security_mode_command(mme_ue_t *mme_ue)
|
||||
{
|
||||
int rv;
|
||||
ogs_pkbuf_t *emmbuf = NULL;
|
||||
|
@ -217,10 +219,10 @@ void nas_eps_send_security_mode_command(mme_ue_t *mme_ue)
|
|||
|
||||
if (mme_ue->t3460.pkbuf) {
|
||||
emmbuf = mme_ue->t3460.pkbuf;
|
||||
ogs_expect_or_return(emmbuf);
|
||||
ogs_expect_or_return_val(emmbuf, OGS_ERROR);
|
||||
} else {
|
||||
emmbuf = emm_build_security_mode_command(mme_ue);
|
||||
ogs_expect_or_return(emmbuf);
|
||||
ogs_expect_or_return_val(emmbuf, OGS_ERROR);
|
||||
}
|
||||
|
||||
mme_ue->t3460.pkbuf = ogs_pkbuf_copy(emmbuf);
|
||||
|
@ -230,9 +232,11 @@ void nas_eps_send_security_mode_command(mme_ue_t *mme_ue)
|
|||
|
||||
rv = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void nas_eps_send_authentication_reject(mme_ue_t *mme_ue)
|
||||
int nas_eps_send_authentication_reject(mme_ue_t *mme_ue)
|
||||
{
|
||||
int rv;
|
||||
ogs_pkbuf_t *emmbuf = NULL;
|
||||
|
@ -242,14 +246,18 @@ void nas_eps_send_authentication_reject(mme_ue_t *mme_ue)
|
|||
ogs_debug("[%s] Authentication reject", mme_ue->imsi_bcd);
|
||||
|
||||
emmbuf = emm_build_authentication_reject();
|
||||
ogs_expect_or_return(emmbuf);
|
||||
ogs_expect_or_return_val(emmbuf, OGS_ERROR);
|
||||
|
||||
rv = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void nas_eps_send_detach_accept(mme_ue_t *mme_ue)
|
||||
int nas_eps_send_detach_accept(mme_ue_t *mme_ue)
|
||||
{
|
||||
int rv;
|
||||
|
||||
enb_ue_t *enb_ue = NULL;
|
||||
ogs_pkbuf_t *emmbuf = NULL;
|
||||
|
||||
|
@ -261,21 +269,22 @@ void nas_eps_send_detach_accept(mme_ue_t *mme_ue)
|
|||
|
||||
/* reply with detach accept */
|
||||
if (mme_ue->nas_eps.detach.switch_off == 0) {
|
||||
int rv;
|
||||
emmbuf = emm_build_detach_accept(mme_ue);
|
||||
ogs_expect_or_return(emmbuf);
|
||||
ogs_expect_or_return_val(emmbuf, OGS_ERROR);
|
||||
|
||||
rv = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf);
|
||||
ogs_expect_or_return(rv == OGS_OK);
|
||||
ogs_expect_or_return_val(rv == OGS_OK, OGS_ERROR);
|
||||
}
|
||||
|
||||
s1ap_send_ue_context_release_command(enb_ue,
|
||||
rv = s1ap_send_ue_context_release_command(enb_ue,
|
||||
S1AP_Cause_PR_nas, S1AP_CauseNas_detach,
|
||||
S1AP_UE_CTX_REL_S1_REMOVE_AND_UNLINK, 0);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
||||
void nas_eps_send_pdn_connectivity_reject(
|
||||
int nas_eps_send_pdn_connectivity_reject(
|
||||
mme_sess_t *sess, ogs_nas_esm_cause_t esm_cause)
|
||||
{
|
||||
int rv;
|
||||
|
@ -289,18 +298,21 @@ void nas_eps_send_pdn_connectivity_reject(
|
|||
if (SESSION_CONTEXT_IN_ATTACH(sess)) {
|
||||
/* During the UE-attach process, we'll send Attach-Reject
|
||||
* with pyggybacking PDN-connectivity-Reject */
|
||||
nas_eps_send_attach_reject(mme_ue,
|
||||
rv = nas_eps_send_attach_reject(mme_ue,
|
||||
EMM_CAUSE_EPS_SERVICES_AND_NON_EPS_SERVICES_NOT_ALLOWED, esm_cause);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
} else {
|
||||
esmbuf = esm_build_pdn_connectivity_reject(sess, esm_cause);
|
||||
ogs_expect_or_return(esmbuf);
|
||||
ogs_expect_or_return_val(esmbuf, OGS_ERROR);
|
||||
|
||||
rv = nas_eps_send_to_downlink_nas_transport(mme_ue, esmbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void nas_eps_send_esm_information_request(mme_bearer_t *bearer)
|
||||
int nas_eps_send_esm_information_request(mme_bearer_t *bearer)
|
||||
{
|
||||
int rv;
|
||||
mme_ue_t *mme_ue = NULL;
|
||||
|
@ -312,10 +324,10 @@ void nas_eps_send_esm_information_request(mme_bearer_t *bearer)
|
|||
|
||||
if (bearer->t3489.pkbuf) {
|
||||
esmbuf = bearer->t3489.pkbuf;
|
||||
ogs_expect_or_return(esmbuf);
|
||||
ogs_expect_or_return_val(esmbuf, OGS_ERROR);
|
||||
} else {
|
||||
esmbuf = esm_build_information_request(bearer);
|
||||
ogs_expect_or_return(esmbuf);
|
||||
ogs_expect_or_return_val(esmbuf, OGS_ERROR);
|
||||
}
|
||||
|
||||
bearer->t3489.pkbuf = ogs_pkbuf_copy(esmbuf);
|
||||
|
@ -325,9 +337,11 @@ void nas_eps_send_esm_information_request(mme_bearer_t *bearer)
|
|||
|
||||
rv = nas_eps_send_to_downlink_nas_transport(mme_ue, esmbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void nas_eps_send_activate_default_bearer_context_request(mme_bearer_t *bearer)
|
||||
int nas_eps_send_activate_default_bearer_context_request(mme_bearer_t *bearer)
|
||||
{
|
||||
int rv;
|
||||
ogs_pkbuf_t *s1apbuf = NULL;
|
||||
|
@ -342,16 +356,18 @@ void nas_eps_send_activate_default_bearer_context_request(mme_bearer_t *bearer)
|
|||
ogs_assert(mme_ue);
|
||||
|
||||
esmbuf = esm_build_activate_default_bearer_context_request(sess);
|
||||
ogs_expect_or_return(esmbuf);
|
||||
ogs_expect_or_return_val(esmbuf, OGS_ERROR);
|
||||
|
||||
s1apbuf = s1ap_build_e_rab_setup_request(bearer, esmbuf);
|
||||
ogs_expect_or_return(s1apbuf);
|
||||
ogs_expect_or_return_val(s1apbuf, OGS_ERROR);
|
||||
|
||||
rv = nas_eps_send_to_enb(mme_ue, s1apbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void nas_eps_send_activate_dedicated_bearer_context_request(
|
||||
int nas_eps_send_activate_dedicated_bearer_context_request(
|
||||
mme_bearer_t *bearer)
|
||||
{
|
||||
int rv;
|
||||
|
@ -364,13 +380,15 @@ void nas_eps_send_activate_dedicated_bearer_context_request(
|
|||
ogs_assert(mme_ue);
|
||||
|
||||
esmbuf = esm_build_activate_dedicated_bearer_context_request(bearer);
|
||||
ogs_expect_or_return(esmbuf);
|
||||
ogs_expect_or_return_val(esmbuf, OGS_ERROR);
|
||||
|
||||
s1apbuf = s1ap_build_e_rab_setup_request(bearer, esmbuf);
|
||||
ogs_expect_or_return(s1apbuf);
|
||||
ogs_expect_or_return_val(s1apbuf, OGS_ERROR);
|
||||
|
||||
rv = nas_eps_send_to_enb(mme_ue, s1apbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void nas_eps_send_activate_all_dedicated_bearers(mme_bearer_t *default_bearer)
|
||||
|
@ -385,7 +403,7 @@ void nas_eps_send_activate_all_dedicated_bearers(mme_bearer_t *default_bearer)
|
|||
}
|
||||
}
|
||||
|
||||
void nas_eps_send_modify_bearer_context_request(
|
||||
int nas_eps_send_modify_bearer_context_request(
|
||||
mme_bearer_t *bearer, int qos_presence, int tft_presence)
|
||||
{
|
||||
int rv;
|
||||
|
@ -399,11 +417,11 @@ void nas_eps_send_modify_bearer_context_request(
|
|||
|
||||
esmbuf = esm_build_modify_bearer_context_request(
|
||||
bearer, qos_presence, tft_presence);
|
||||
ogs_expect_or_return(esmbuf);
|
||||
ogs_expect_or_return_val(esmbuf, OGS_ERROR);
|
||||
|
||||
if (qos_presence == 1) {
|
||||
s1apbuf = s1ap_build_e_rab_modify_request(bearer, esmbuf);
|
||||
ogs_expect_or_return(s1apbuf);
|
||||
ogs_expect_or_return_val(s1apbuf, OGS_ERROR);
|
||||
|
||||
rv = nas_eps_send_to_enb(mme_ue, s1apbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
@ -411,9 +429,11 @@ void nas_eps_send_modify_bearer_context_request(
|
|||
rv = nas_eps_send_to_downlink_nas_transport(mme_ue, esmbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void nas_eps_send_deactivate_bearer_context_request(mme_bearer_t *bearer)
|
||||
int nas_eps_send_deactivate_bearer_context_request(mme_bearer_t *bearer)
|
||||
{
|
||||
int rv;
|
||||
ogs_pkbuf_t *s1apbuf = NULL;
|
||||
|
@ -426,17 +446,19 @@ void nas_eps_send_deactivate_bearer_context_request(mme_bearer_t *bearer)
|
|||
|
||||
esmbuf = esm_build_deactivate_bearer_context_request(
|
||||
bearer, ESM_CAUSE_REGULAR_DEACTIVATION);
|
||||
ogs_expect_or_return(esmbuf);
|
||||
ogs_expect_or_return_val(esmbuf, OGS_ERROR);
|
||||
|
||||
s1apbuf = s1ap_build_e_rab_release_command(bearer, esmbuf,
|
||||
S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release);
|
||||
ogs_expect_or_return(s1apbuf);
|
||||
ogs_expect_or_return_val(s1apbuf, OGS_ERROR);
|
||||
|
||||
rv = nas_eps_send_to_enb(mme_ue, s1apbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void nas_eps_send_bearer_resource_allocation_reject(
|
||||
int nas_eps_send_bearer_resource_allocation_reject(
|
||||
mme_ue_t *mme_ue, uint8_t pti, ogs_nas_esm_cause_t esm_cause)
|
||||
{
|
||||
int rv;
|
||||
|
@ -447,13 +469,15 @@ void nas_eps_send_bearer_resource_allocation_reject(
|
|||
|
||||
esmbuf = esm_build_bearer_resource_allocation_reject(
|
||||
mme_ue, pti, esm_cause);
|
||||
ogs_expect_or_return(esmbuf);
|
||||
ogs_expect_or_return_val(esmbuf, OGS_ERROR);
|
||||
|
||||
rv = nas_eps_send_to_downlink_nas_transport(mme_ue, esmbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void nas_eps_send_bearer_resource_modification_reject(
|
||||
int nas_eps_send_bearer_resource_modification_reject(
|
||||
mme_ue_t *mme_ue, uint8_t pti, ogs_nas_esm_cause_t esm_cause)
|
||||
{
|
||||
int rv;
|
||||
|
@ -464,13 +488,15 @@ void nas_eps_send_bearer_resource_modification_reject(
|
|||
|
||||
esmbuf = esm_build_bearer_resource_modification_reject(
|
||||
mme_ue, pti, esm_cause);
|
||||
ogs_expect_or_return(esmbuf);
|
||||
ogs_expect_or_return_val(esmbuf, OGS_ERROR);
|
||||
|
||||
rv = nas_eps_send_to_downlink_nas_transport(mme_ue, esmbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void nas_eps_send_tau_accept(
|
||||
int nas_eps_send_tau_accept(
|
||||
mme_ue_t *mme_ue, S1AP_ProcedureCode_t procedureCode)
|
||||
{
|
||||
int rv;
|
||||
|
@ -481,7 +507,7 @@ void nas_eps_send_tau_accept(
|
|||
ogs_debug("[%s] Tracking area update accept", mme_ue->imsi_bcd);
|
||||
|
||||
emmbuf = emm_build_tau_accept(mme_ue);
|
||||
ogs_expect_or_return(emmbuf);
|
||||
ogs_expect_or_return_val(emmbuf, OGS_ERROR);
|
||||
|
||||
if (mme_ue->next.m_tmsi) {
|
||||
CLEAR_MME_UE_TIMER(mme_ue->t3450);
|
||||
|
@ -494,7 +520,7 @@ void nas_eps_send_tau_accept(
|
|||
if (procedureCode == S1AP_ProcedureCode_id_InitialContextSetup) {
|
||||
ogs_pkbuf_t *s1apbuf = NULL;
|
||||
s1apbuf = s1ap_build_initial_context_setup_request(mme_ue, emmbuf);
|
||||
ogs_expect_or_return(s1apbuf);
|
||||
ogs_expect_or_return_val(s1apbuf, OGS_ERROR);
|
||||
|
||||
rv = nas_eps_send_to_enb(mme_ue, s1apbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
@ -503,9 +529,11 @@ void nas_eps_send_tau_accept(
|
|||
ogs_expect(rv == OGS_OK);
|
||||
} else
|
||||
ogs_assert_if_reached();
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void nas_eps_send_tau_reject(mme_ue_t *mme_ue, ogs_nas_emm_cause_t emm_cause)
|
||||
int nas_eps_send_tau_reject(mme_ue_t *mme_ue, ogs_nas_emm_cause_t emm_cause)
|
||||
{
|
||||
int rv;
|
||||
ogs_pkbuf_t *emmbuf = NULL;
|
||||
|
@ -516,13 +544,15 @@ void nas_eps_send_tau_reject(mme_ue_t *mme_ue, ogs_nas_emm_cause_t emm_cause)
|
|||
|
||||
/* Build TAU reject */
|
||||
emmbuf = emm_build_tau_reject(emm_cause, mme_ue);
|
||||
ogs_expect_or_return(emmbuf);
|
||||
ogs_expect_or_return_val(emmbuf, OGS_ERROR);
|
||||
|
||||
rv = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void nas_eps_send_service_reject(mme_ue_t *mme_ue,
|
||||
int nas_eps_send_service_reject(mme_ue_t *mme_ue,
|
||||
ogs_nas_emm_cause_t emm_cause)
|
||||
{
|
||||
int rv;
|
||||
|
@ -534,13 +564,15 @@ void nas_eps_send_service_reject(mme_ue_t *mme_ue,
|
|||
|
||||
/* Build Service Reject */
|
||||
emmbuf = emm_build_service_reject(emm_cause, mme_ue);
|
||||
ogs_expect_or_return(emmbuf);
|
||||
ogs_expect_or_return_val(emmbuf, OGS_ERROR);
|
||||
|
||||
rv = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void nas_eps_send_cs_service_notification(mme_ue_t *mme_ue)
|
||||
int nas_eps_send_cs_service_notification(mme_ue_t *mme_ue)
|
||||
{
|
||||
int rv;
|
||||
ogs_pkbuf_t *emmbuf = NULL;
|
||||
|
@ -550,13 +582,15 @@ void nas_eps_send_cs_service_notification(mme_ue_t *mme_ue)
|
|||
ogs_debug("[%s] CS Service Notification", mme_ue->imsi_bcd);
|
||||
|
||||
emmbuf = emm_build_cs_service_notification(mme_ue);
|
||||
ogs_expect_or_return(emmbuf);
|
||||
ogs_expect_or_return_val(emmbuf, OGS_ERROR);
|
||||
|
||||
rv = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void nas_eps_send_downlink_nas_transport(
|
||||
int nas_eps_send_downlink_nas_transport(
|
||||
mme_ue_t *mme_ue, uint8_t *buffer, uint8_t length)
|
||||
{
|
||||
int rv;
|
||||
|
@ -569,8 +603,10 @@ void nas_eps_send_downlink_nas_transport(
|
|||
ogs_debug("[%s] Downlink NAS transport", mme_ue->imsi_bcd);
|
||||
|
||||
emmbuf = emm_build_downlink_nas_transport(mme_ue, buffer, length);
|
||||
ogs_expect_or_return(emmbuf);
|
||||
ogs_expect_or_return_val(emmbuf, OGS_ERROR);
|
||||
|
||||
rv = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
|
|
@ -32,47 +32,47 @@ int nas_eps_send_emm_to_esm(
|
|||
int nas_eps_send_to_downlink_nas_transport(
|
||||
mme_ue_t *mme_ue, ogs_pkbuf_t *pkbuf);
|
||||
|
||||
void nas_eps_send_attach_accept(mme_ue_t *mme_ue);
|
||||
void nas_eps_send_attach_reject(mme_ue_t *mme_ue,
|
||||
int nas_eps_send_attach_accept(mme_ue_t *mme_ue);
|
||||
int nas_eps_send_attach_reject(mme_ue_t *mme_ue,
|
||||
ogs_nas_emm_cause_t emm_cause, ogs_nas_esm_cause_t esm_cause);
|
||||
|
||||
void nas_eps_send_identity_request(mme_ue_t *mme_ue);
|
||||
int nas_eps_send_identity_request(mme_ue_t *mme_ue);
|
||||
|
||||
void nas_eps_send_authentication_request(mme_ue_t *mme_ue);
|
||||
void nas_eps_send_authentication_reject(mme_ue_t *mme_ue);
|
||||
int nas_eps_send_authentication_request(mme_ue_t *mme_ue);
|
||||
int nas_eps_send_authentication_reject(mme_ue_t *mme_ue);
|
||||
|
||||
void nas_eps_send_security_mode_command(mme_ue_t *mme_ue);
|
||||
int nas_eps_send_security_mode_command(mme_ue_t *mme_ue);
|
||||
|
||||
void nas_eps_send_detach_accept(mme_ue_t *mme_ue);
|
||||
int nas_eps_send_detach_accept(mme_ue_t *mme_ue);
|
||||
|
||||
void nas_eps_send_pdn_connectivity_reject(
|
||||
int nas_eps_send_pdn_connectivity_reject(
|
||||
mme_sess_t *sess, ogs_nas_esm_cause_t esm_cause);
|
||||
void nas_eps_send_esm_information_request(mme_bearer_t *bearer);
|
||||
void nas_eps_send_activate_default_bearer_context_request(mme_bearer_t *bearer);
|
||||
void nas_eps_send_activate_dedicated_bearer_context_request(
|
||||
int nas_eps_send_esm_information_request(mme_bearer_t *bearer);
|
||||
int nas_eps_send_activate_default_bearer_context_request(mme_bearer_t *bearer);
|
||||
int nas_eps_send_activate_dedicated_bearer_context_request(
|
||||
mme_bearer_t *bearer);
|
||||
void nas_eps_send_activate_all_dedicated_bearers(mme_bearer_t *default_bearer);
|
||||
void nas_eps_send_modify_bearer_context_request(
|
||||
int nas_eps_send_modify_bearer_context_request(
|
||||
mme_bearer_t *bearer, int qos_presence, int tft_presence);
|
||||
void nas_eps_send_deactivate_bearer_context_request(mme_bearer_t *bearer);
|
||||
void nas_eps_send_bearer_resource_allocation_reject(
|
||||
int nas_eps_send_deactivate_bearer_context_request(mme_bearer_t *bearer);
|
||||
int nas_eps_send_bearer_resource_allocation_reject(
|
||||
mme_ue_t *mme_ue, uint8_t pti, ogs_nas_esm_cause_t esm_cause);
|
||||
void nas_eps_send_bearer_resource_modification_reject(
|
||||
int nas_eps_send_bearer_resource_modification_reject(
|
||||
mme_ue_t *mme_ue, uint8_t pti, ogs_nas_esm_cause_t esm_cause);
|
||||
|
||||
void nas_eps_send_tau_accept(
|
||||
int nas_eps_send_tau_accept(
|
||||
mme_ue_t *mme_ue, S1AP_ProcedureCode_t procedureCode);
|
||||
void nas_eps_send_tau_reject(mme_ue_t *mme_ue, ogs_nas_esm_cause_t emm_cause);
|
||||
int nas_eps_send_tau_reject(mme_ue_t *mme_ue, ogs_nas_esm_cause_t emm_cause);
|
||||
|
||||
void nas_eps_send_service_reject(
|
||||
int nas_eps_send_service_reject(
|
||||
mme_ue_t *mme_ue, ogs_nas_emm_cause_t emm_cause);
|
||||
|
||||
void nas_eps_send_cs_service_notification(mme_ue_t *mme_ue);
|
||||
void nas_eps_send_downlink_nas_transport(
|
||||
int nas_eps_send_cs_service_notification(mme_ue_t *mme_ue);
|
||||
int nas_eps_send_downlink_nas_transport(
|
||||
mme_ue_t *mme_ue, uint8_t *buffer, uint8_t length);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* NAS_EPS_PATH_H */
|
||||
#endif /* NAS_EPS_PATH_H */
|
File diff suppressed because it is too large
Load Diff
|
@ -240,32 +240,38 @@ int s1ap_send_to_nas(enb_ue_t *enb_ue,
|
|||
}
|
||||
}
|
||||
|
||||
void s1ap_send_s1_setup_response(mme_enb_t *enb)
|
||||
int s1ap_send_s1_setup_response(mme_enb_t *enb)
|
||||
{
|
||||
int rv;
|
||||
ogs_pkbuf_t *s1ap_buffer;
|
||||
|
||||
ogs_debug("[MME] S1-Setup response");
|
||||
s1ap_buffer = s1ap_build_setup_rsp();
|
||||
ogs_expect_or_return(s1ap_buffer);
|
||||
ogs_expect_or_return_val(s1ap_buffer, OGS_ERROR);
|
||||
|
||||
ogs_expect(OGS_OK ==
|
||||
s1ap_send_to_enb(enb, s1ap_buffer, S1AP_NON_UE_SIGNALLING));
|
||||
rv = s1ap_send_to_enb(enb, s1ap_buffer, S1AP_NON_UE_SIGNALLING);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void s1ap_send_s1_setup_failure(
|
||||
int s1ap_send_s1_setup_failure(
|
||||
mme_enb_t *enb, S1AP_Cause_PR group, long cause)
|
||||
{
|
||||
int rv;
|
||||
ogs_pkbuf_t *s1ap_buffer;
|
||||
|
||||
ogs_debug("[MME] S1-Setup failure");
|
||||
s1ap_buffer = s1ap_build_setup_failure(group, cause, S1AP_TimeToWait_v10s);
|
||||
ogs_expect_or_return(s1ap_buffer);
|
||||
ogs_expect_or_return_val(s1ap_buffer, OGS_ERROR);
|
||||
|
||||
ogs_expect(OGS_OK ==
|
||||
s1ap_send_to_enb(enb, s1ap_buffer, S1AP_NON_UE_SIGNALLING));
|
||||
rv = s1ap_send_to_enb(enb, s1ap_buffer, S1AP_NON_UE_SIGNALLING);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void s1ap_send_initial_context_setup_request(mme_ue_t *mme_ue)
|
||||
int s1ap_send_initial_context_setup_request(mme_ue_t *mme_ue)
|
||||
{
|
||||
int rv;
|
||||
ogs_pkbuf_t *s1apbuf = NULL;
|
||||
|
@ -273,13 +279,15 @@ void s1ap_send_initial_context_setup_request(mme_ue_t *mme_ue)
|
|||
ogs_assert(mme_ue);
|
||||
|
||||
s1apbuf = s1ap_build_initial_context_setup_request(mme_ue, NULL);
|
||||
ogs_expect_or_return(s1apbuf);
|
||||
ogs_expect_or_return_val(s1apbuf, OGS_ERROR);
|
||||
|
||||
rv = nas_eps_send_to_enb(mme_ue, s1apbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void s1ap_send_ue_context_modification_request(mme_ue_t *mme_ue)
|
||||
int s1ap_send_ue_context_modification_request(mme_ue_t *mme_ue)
|
||||
{
|
||||
int rv;
|
||||
ogs_pkbuf_t *s1apbuf = NULL;
|
||||
|
@ -287,13 +295,15 @@ void s1ap_send_ue_context_modification_request(mme_ue_t *mme_ue)
|
|||
ogs_assert(mme_ue);
|
||||
|
||||
s1apbuf = s1ap_build_ue_context_modification_request(mme_ue);
|
||||
ogs_expect_or_return(s1apbuf);
|
||||
ogs_expect_or_return_val(s1apbuf, OGS_ERROR);
|
||||
|
||||
rv = nas_eps_send_to_enb(mme_ue, s1apbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void s1ap_send_ue_context_release_command(
|
||||
int s1ap_send_ue_context_release_command(
|
||||
enb_ue_t *enb_ue, S1AP_Cause_PR group, long cause,
|
||||
uint8_t action, ogs_time_t duration)
|
||||
{
|
||||
|
@ -313,13 +323,15 @@ void s1ap_send_ue_context_release_command(
|
|||
group, (int)cause, action, (int)duration);
|
||||
|
||||
s1apbuf = s1ap_build_ue_context_release_command(enb_ue, group, cause);
|
||||
ogs_expect_or_return(s1apbuf);
|
||||
ogs_expect_or_return_val(s1apbuf, OGS_ERROR);
|
||||
|
||||
rv = s1ap_delayed_send_to_enb_ue(enb_ue, s1apbuf, duration);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
ogs_timer_start(enb_ue->t_s1_holding,
|
||||
mme_timer_cfg(MME_TIMER_S1_HOLDING)->duration);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void s1ap_send_paging(mme_ue_t *mme_ue, S1AP_CNDomain_t cn_domain)
|
||||
|
@ -357,7 +369,7 @@ void s1ap_send_paging(mme_ue_t *mme_ue, S1AP_CNDomain_t cn_domain)
|
|||
mme_timer_cfg(MME_TIMER_T3413)->duration);
|
||||
}
|
||||
|
||||
void s1ap_send_mme_configuration_transfer(
|
||||
int s1ap_send_mme_configuration_transfer(
|
||||
mme_enb_t *target_enb,
|
||||
S1AP_SONConfigurationTransfer_t *SONConfigurationTransfer)
|
||||
{
|
||||
|
@ -368,13 +380,15 @@ void s1ap_send_mme_configuration_transfer(
|
|||
ogs_assert(SONConfigurationTransfer);
|
||||
|
||||
s1apbuf = s1ap_build_mme_configuration_transfer(SONConfigurationTransfer);
|
||||
ogs_expect_or_return(s1apbuf);
|
||||
ogs_expect_or_return_val(s1apbuf, OGS_ERROR);
|
||||
|
||||
rv = s1ap_send_to_enb(target_enb, s1apbuf, S1AP_NON_UE_SIGNALLING);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void s1ap_send_e_rab_modification_confirm(mme_ue_t *mme_ue)
|
||||
int s1ap_send_e_rab_modification_confirm(mme_ue_t *mme_ue)
|
||||
{
|
||||
int rv;
|
||||
ogs_pkbuf_t *s1apbuf = NULL;
|
||||
|
@ -382,13 +396,15 @@ void s1ap_send_e_rab_modification_confirm(mme_ue_t *mme_ue)
|
|||
ogs_assert(mme_ue);
|
||||
|
||||
s1apbuf = s1ap_build_e_rab_modification_confirm(mme_ue);
|
||||
ogs_expect_or_return(s1apbuf);
|
||||
ogs_expect_or_return_val(s1apbuf, OGS_ERROR);
|
||||
|
||||
rv = nas_eps_send_to_enb(mme_ue, s1apbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void s1ap_send_path_switch_ack(mme_ue_t *mme_ue)
|
||||
int s1ap_send_path_switch_ack(mme_ue_t *mme_ue)
|
||||
{
|
||||
int rv;
|
||||
ogs_pkbuf_t *s1apbuf = NULL;
|
||||
|
@ -396,13 +412,15 @@ void s1ap_send_path_switch_ack(mme_ue_t *mme_ue)
|
|||
ogs_assert(mme_ue);
|
||||
|
||||
s1apbuf = s1ap_build_path_switch_ack(mme_ue);
|
||||
ogs_expect_or_return(s1apbuf);
|
||||
ogs_expect_or_return_val(s1apbuf, OGS_ERROR);
|
||||
|
||||
rv = nas_eps_send_to_enb(mme_ue, s1apbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void s1ap_send_handover_command(enb_ue_t *source_ue)
|
||||
int s1ap_send_handover_command(enb_ue_t *source_ue)
|
||||
{
|
||||
int rv;
|
||||
ogs_pkbuf_t *s1apbuf = NULL;
|
||||
|
@ -410,13 +428,15 @@ void s1ap_send_handover_command(enb_ue_t *source_ue)
|
|||
ogs_assert(source_ue);
|
||||
|
||||
s1apbuf = s1ap_build_handover_command(source_ue);
|
||||
ogs_expect_or_return(s1apbuf);
|
||||
ogs_expect_or_return_val(s1apbuf, OGS_ERROR);
|
||||
|
||||
rv = s1ap_send_to_enb_ue(source_ue, s1apbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void s1ap_send_handover_preparation_failure(
|
||||
int s1ap_send_handover_preparation_failure(
|
||||
enb_ue_t *source_ue, S1AP_Cause_PR group, long cause)
|
||||
{
|
||||
int rv;
|
||||
|
@ -426,13 +446,15 @@ void s1ap_send_handover_preparation_failure(
|
|||
ogs_assert(group);
|
||||
|
||||
s1apbuf = s1ap_build_handover_preparation_failure(source_ue, group, cause);
|
||||
ogs_expect_or_return(s1apbuf);
|
||||
ogs_expect_or_return_val(s1apbuf, OGS_ERROR);
|
||||
|
||||
rv = s1ap_send_to_enb_ue(source_ue, s1apbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void s1ap_send_handover_cancel_ack(enb_ue_t *source_ue)
|
||||
int s1ap_send_handover_cancel_ack(enb_ue_t *source_ue)
|
||||
{
|
||||
int rv;
|
||||
ogs_pkbuf_t *s1apbuf = NULL;
|
||||
|
@ -440,14 +462,16 @@ void s1ap_send_handover_cancel_ack(enb_ue_t *source_ue)
|
|||
ogs_assert(source_ue);
|
||||
|
||||
s1apbuf = s1ap_build_handover_cancel_ack(source_ue);
|
||||
ogs_expect_or_return(s1apbuf);
|
||||
ogs_expect_or_return_val(s1apbuf, OGS_ERROR);
|
||||
|
||||
rv = s1ap_send_to_enb_ue(source_ue, s1apbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
||||
void s1ap_send_handover_request(
|
||||
int s1ap_send_handover_request(
|
||||
enb_ue_t *source_ue, mme_enb_t *target_enb,
|
||||
S1AP_HandoverType_t *handovertype, S1AP_Cause_t *cause,
|
||||
S1AP_Source_ToTarget_TransparentContainer_t
|
||||
|
@ -477,13 +501,15 @@ void s1ap_send_handover_request(
|
|||
s1apbuf = s1ap_build_handover_request(
|
||||
target_ue, handovertype, cause,
|
||||
source_totarget_transparentContainer);
|
||||
ogs_expect_or_return(s1apbuf);
|
||||
ogs_expect_or_return_val(s1apbuf, OGS_ERROR);
|
||||
|
||||
rv = s1ap_send_to_enb_ue(target_ue, s1apbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void s1ap_send_mme_status_transfer(
|
||||
int s1ap_send_mme_status_transfer(
|
||||
enb_ue_t *target_ue,
|
||||
S1AP_ENB_StatusTransfer_TransparentContainer_t
|
||||
*enb_statustransfer_transparentContainer)
|
||||
|
@ -495,13 +521,15 @@ void s1ap_send_mme_status_transfer(
|
|||
|
||||
s1apbuf = s1ap_build_mme_status_transfer(target_ue,
|
||||
enb_statustransfer_transparentContainer);
|
||||
ogs_expect_or_return(s1apbuf);
|
||||
ogs_expect_or_return_val(s1apbuf, OGS_ERROR);
|
||||
|
||||
rv = s1ap_send_to_enb_ue(target_ue, s1apbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void s1ap_send_error_indication(
|
||||
int s1ap_send_error_indication(
|
||||
mme_enb_t *enb,
|
||||
S1AP_MME_UE_S1AP_ID_t *mme_ue_s1ap_id,
|
||||
S1AP_ENB_UE_S1AP_ID_t *enb_ue_s1ap_id,
|
||||
|
@ -514,15 +542,18 @@ void s1ap_send_error_indication(
|
|||
|
||||
s1apbuf = ogs_s1ap_build_error_indication(
|
||||
mme_ue_s1ap_id, enb_ue_s1ap_id, group, cause);
|
||||
ogs_expect_or_return(s1apbuf);
|
||||
ogs_expect_or_return_val(s1apbuf, OGS_ERROR);
|
||||
|
||||
rv = s1ap_send_to_enb(enb, s1apbuf, S1AP_NON_UE_SIGNALLING);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void s1ap_send_error_indication2(
|
||||
int s1ap_send_error_indication2(
|
||||
mme_ue_t *mme_ue, S1AP_Cause_PR group, long cause)
|
||||
{
|
||||
int rv;
|
||||
mme_enb_t *enb;
|
||||
enb_ue_t *enb_ue;
|
||||
|
||||
|
@ -531,18 +562,21 @@ void s1ap_send_error_indication2(
|
|||
|
||||
ogs_assert(mme_ue);
|
||||
enb_ue = enb_ue_cycle(mme_ue->enb_ue);
|
||||
ogs_expect_or_return(enb_ue);
|
||||
ogs_expect_or_return_val(enb_ue, OGS_ERROR);
|
||||
enb = enb_ue->enb;
|
||||
ogs_expect_or_return(enb);
|
||||
ogs_expect_or_return_val(enb, OGS_ERROR);
|
||||
|
||||
mme_ue_s1ap_id = enb_ue->mme_ue_s1ap_id,
|
||||
enb_ue_s1ap_id = enb_ue->enb_ue_s1ap_id,
|
||||
|
||||
s1ap_send_error_indication(
|
||||
rv = s1ap_send_error_indication(
|
||||
enb, &mme_ue_s1ap_id, &enb_ue_s1ap_id, group, cause);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void s1ap_send_s1_reset_ack(
|
||||
int s1ap_send_s1_reset_ack(
|
||||
mme_enb_t *enb,
|
||||
S1AP_UE_associatedLogicalS1_ConnectionListRes_t *partOfS1_Interface)
|
||||
{
|
||||
|
@ -552,8 +586,10 @@ void s1ap_send_s1_reset_ack(
|
|||
ogs_assert(enb);
|
||||
|
||||
s1apbuf = ogs_s1ap_build_s1_reset_ack(partOfS1_Interface);
|
||||
ogs_expect_or_return(s1apbuf);
|
||||
ogs_expect_or_return_val(s1apbuf, OGS_ERROR);
|
||||
|
||||
rv = s1ap_send_to_enb(enb, s1apbuf, S1AP_NON_UE_SIGNALLING);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
|
@ -46,50 +46,50 @@ int s1ap_send_to_nas(enb_ue_t *enb_ue,
|
|||
S1AP_ProcedureCode_t procedureCode, S1AP_NAS_PDU_t *nasPdu);
|
||||
int s1ap_send_to_esm(mme_ue_t *mme_ue, ogs_pkbuf_t *esmbuf, uint8_t nas_type);
|
||||
|
||||
void s1ap_send_s1_setup_response(mme_enb_t *enb);
|
||||
void s1ap_send_s1_setup_failure(
|
||||
int s1ap_send_s1_setup_response(mme_enb_t *enb);
|
||||
int s1ap_send_s1_setup_failure(
|
||||
mme_enb_t *enb, S1AP_Cause_PR group, long cause);
|
||||
|
||||
void s1ap_send_initial_context_setup_request(mme_ue_t *mme_ue);
|
||||
void s1ap_send_ue_context_modification_request(mme_ue_t *mme_ue);
|
||||
void s1ap_send_ue_context_release_command(
|
||||
int s1ap_send_initial_context_setup_request(mme_ue_t *mme_ue);
|
||||
int s1ap_send_ue_context_modification_request(mme_ue_t *mme_ue);
|
||||
int s1ap_send_ue_context_release_command(
|
||||
enb_ue_t *enb_ue, S1AP_Cause_PR group, long cause,
|
||||
uint8_t action, ogs_time_t duration);
|
||||
|
||||
void s1ap_send_paging(mme_ue_t *mme_ue, S1AP_CNDomain_t cn_domain);
|
||||
|
||||
void s1ap_send_mme_configuration_transfer(
|
||||
int s1ap_send_mme_configuration_transfer(
|
||||
mme_enb_t *target_enb,
|
||||
S1AP_SONConfigurationTransfer_t *SONConfigurationTransfer);
|
||||
|
||||
void s1ap_send_e_rab_modification_confirm(mme_ue_t *mme_ue);
|
||||
int s1ap_send_e_rab_modification_confirm(mme_ue_t *mme_ue);
|
||||
|
||||
void s1ap_send_path_switch_ack(mme_ue_t *mme_ue);
|
||||
int s1ap_send_path_switch_ack(mme_ue_t *mme_ue);
|
||||
|
||||
void s1ap_send_handover_command(enb_ue_t *source_ue);
|
||||
void s1ap_send_handover_preparation_failure(
|
||||
int s1ap_send_handover_command(enb_ue_t *source_ue);
|
||||
int s1ap_send_handover_preparation_failure(
|
||||
enb_ue_t *source_ue, S1AP_Cause_PR group, long cause);
|
||||
|
||||
void s1ap_send_handover_request(
|
||||
int s1ap_send_handover_request(
|
||||
enb_ue_t *source_ue, mme_enb_t *target_enb,
|
||||
S1AP_HandoverType_t *handovertype, S1AP_Cause_t *cause,
|
||||
S1AP_Source_ToTarget_TransparentContainer_t
|
||||
*source_totarget_transparentContainer);
|
||||
|
||||
void s1ap_send_handover_cancel_ack(enb_ue_t *source_ue);
|
||||
int s1ap_send_handover_cancel_ack(enb_ue_t *source_ue);
|
||||
|
||||
void s1ap_send_mme_status_transfer(
|
||||
int s1ap_send_mme_status_transfer(
|
||||
enb_ue_t *target_ue,
|
||||
S1AP_ENB_StatusTransfer_TransparentContainer_t
|
||||
*enb_statustransfer_transparentContainer);
|
||||
void s1ap_send_error_indication(
|
||||
int s1ap_send_error_indication(
|
||||
mme_enb_t *enb,
|
||||
S1AP_MME_UE_S1AP_ID_t *mme_ue_s1ap_id,
|
||||
S1AP_ENB_UE_S1AP_ID_t *enb_ue_s1ap_id,
|
||||
S1AP_Cause_PR group, long cause);
|
||||
void s1ap_send_error_indication2(
|
||||
int s1ap_send_error_indication2(
|
||||
mme_ue_t *mme_ue, S1AP_Cause_PR group, long cause);
|
||||
void s1ap_send_s1_reset_ack(
|
||||
int s1ap_send_s1_reset_ack(
|
||||
mme_enb_t *enb,
|
||||
S1AP_UE_associatedLogicalS1_ConnectionListRes_t *partOfS1_Interface);
|
||||
|
||||
|
|
|
@ -105,14 +105,16 @@ void sgsap_handle_location_update_accept(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf)
|
|||
ogs_debug(" P-TMSI[0x%08x]", mme_ue->p_tmsi);
|
||||
}
|
||||
|
||||
nas_eps_send_attach_accept(mme_ue);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_attach_accept(mme_ue));
|
||||
|
||||
return;
|
||||
|
||||
error:
|
||||
nas_eps_send_attach_reject(mme_ue,
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_attach_reject(mme_ue,
|
||||
EMM_CAUSE_EPS_SERVICES_AND_NON_EPS_SERVICES_NOT_ALLOWED,
|
||||
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
|
||||
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED));
|
||||
mme_send_delete_session_or_mme_ue_context_release(mme_ue);
|
||||
}
|
||||
|
||||
|
@ -181,8 +183,9 @@ void sgsap_handle_location_update_reject(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf)
|
|||
ogs_plmn_id_hexdump(&lai->nas_plmn_id), lai->lac);
|
||||
}
|
||||
|
||||
nas_eps_send_attach_reject(mme_ue,
|
||||
emm_cause, ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_attach_reject(mme_ue,
|
||||
emm_cause, ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED));
|
||||
mme_send_delete_session_or_mme_ue_context_release(mme_ue);
|
||||
|
||||
return;
|
||||
|
@ -337,9 +340,12 @@ void sgsap_handle_paging_request(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf)
|
|||
|
||||
} else {
|
||||
if (CS_CALL_SERVICE_INDICATOR(mme_ue)) {
|
||||
nas_eps_send_cs_service_notification(mme_ue);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_cs_service_notification(mme_ue));
|
||||
} else if (SMS_SERVICE_INDICATOR(mme_ue)) {
|
||||
sgsap_send_service_request(mme_ue, SGSAP_EMM_CONNECTED_MODE);
|
||||
ogs_assert(OGS_OK ==
|
||||
sgsap_send_service_request(
|
||||
mme_ue, SGSAP_EMM_CONNECTED_MODE));
|
||||
} else
|
||||
goto paging_reject;
|
||||
}
|
||||
|
@ -421,8 +427,9 @@ void sgsap_handle_downlink_unitdata(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf)
|
|||
nas_message_container_buffer,
|
||||
nas_message_container_length);
|
||||
|
||||
nas_eps_send_downlink_nas_transport(mme_ue,
|
||||
nas_message_container_buffer, nas_message_container_length);
|
||||
ogs_assert(OGS_OK ==
|
||||
nas_eps_send_downlink_nas_transport(mme_ue,
|
||||
nas_message_container_buffer, nas_message_container_length));
|
||||
}
|
||||
|
||||
void sgsap_handle_reset_indication(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf)
|
||||
|
@ -432,7 +439,7 @@ void sgsap_handle_reset_indication(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf)
|
|||
ogs_assert(vlr);
|
||||
ogs_assert(pkbuf);
|
||||
|
||||
sgsap_send_reset_ack(vlr);
|
||||
ogs_assert(OGS_OK == sgsap_send_reset_ack(vlr));
|
||||
}
|
||||
|
||||
void sgsap_handle_release_request(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf)
|
||||
|
|
|
@ -114,7 +114,7 @@ int sgsap_send_to_vlr(mme_ue_t *mme_ue, ogs_pkbuf_t *pkbuf)
|
|||
return sgsap_send_to_vlr_with_sid(vlr, pkbuf, mme_ue->vlr_ostream_id);
|
||||
}
|
||||
|
||||
void sgsap_send_location_update_request(mme_ue_t *mme_ue)
|
||||
int sgsap_send_location_update_request(mme_ue_t *mme_ue)
|
||||
{
|
||||
int rv;
|
||||
ogs_pkbuf_t *pkbuf = NULL;
|
||||
|
@ -124,12 +124,14 @@ void sgsap_send_location_update_request(mme_ue_t *mme_ue)
|
|||
ogs_debug(" IMSI[%s]", mme_ue->imsi_bcd);
|
||||
|
||||
pkbuf = sgsap_build_location_update_request(mme_ue);
|
||||
ogs_expect_or_return(pkbuf);
|
||||
ogs_expect_or_return_val(pkbuf, OGS_ERROR);
|
||||
rv = sgsap_send_to_vlr(mme_ue, pkbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void sgsap_send_tmsi_reallocation_complete(mme_ue_t *mme_ue)
|
||||
int sgsap_send_tmsi_reallocation_complete(mme_ue_t *mme_ue)
|
||||
{
|
||||
int rv;
|
||||
ogs_pkbuf_t *pkbuf = NULL;
|
||||
|
@ -139,24 +141,28 @@ void sgsap_send_tmsi_reallocation_complete(mme_ue_t *mme_ue)
|
|||
ogs_debug(" IMSI[%s]", mme_ue->imsi_bcd);
|
||||
|
||||
pkbuf = sgsap_build_tmsi_reallocation_complete(mme_ue);
|
||||
ogs_expect_or_return(pkbuf);
|
||||
ogs_expect_or_return_val(pkbuf, OGS_ERROR);
|
||||
rv = sgsap_send_to_vlr(mme_ue, pkbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void sgsap_send_detach_indication(mme_ue_t *mme_ue)
|
||||
int sgsap_send_detach_indication(mme_ue_t *mme_ue)
|
||||
{
|
||||
int rv;
|
||||
ogs_pkbuf_t *pkbuf = NULL;
|
||||
ogs_assert(mme_ue);
|
||||
|
||||
pkbuf = sgsap_build_detach_indication(mme_ue);
|
||||
ogs_expect_or_return(pkbuf);
|
||||
ogs_expect_or_return_val(pkbuf, OGS_ERROR);
|
||||
rv = sgsap_send_to_vlr(mme_ue, pkbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void sgsap_send_mo_csfb_indication(mme_ue_t *mme_ue)
|
||||
int sgsap_send_mo_csfb_indication(mme_ue_t *mme_ue)
|
||||
{
|
||||
int rv;
|
||||
ogs_pkbuf_t *pkbuf = NULL;
|
||||
|
@ -166,12 +172,14 @@ void sgsap_send_mo_csfb_indication(mme_ue_t *mme_ue)
|
|||
ogs_debug(" IMSI[%s]", mme_ue->imsi_bcd);
|
||||
|
||||
pkbuf = sgsap_build_mo_csfb_indication(mme_ue);
|
||||
ogs_expect_or_return(pkbuf);
|
||||
ogs_expect_or_return_val(pkbuf, OGS_ERROR);
|
||||
rv = sgsap_send_to_vlr(mme_ue, pkbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void sgsap_send_service_request(mme_ue_t *mme_ue, uint8_t emm_mode)
|
||||
int sgsap_send_service_request(mme_ue_t *mme_ue, uint8_t emm_mode)
|
||||
{
|
||||
int rv;
|
||||
ogs_pkbuf_t *pkbuf = NULL;
|
||||
|
@ -183,12 +191,14 @@ void sgsap_send_service_request(mme_ue_t *mme_ue, uint8_t emm_mode)
|
|||
ogs_debug(" EMM_MODE[%d]", emm_mode);
|
||||
|
||||
pkbuf = sgsap_build_service_request(mme_ue, emm_mode);
|
||||
ogs_expect_or_return(pkbuf);
|
||||
ogs_expect_or_return_val(pkbuf, OGS_ERROR);
|
||||
rv = sgsap_send_to_vlr(mme_ue, pkbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void sgsap_send_reset_ack(mme_vlr_t *vlr)
|
||||
int sgsap_send_reset_ack(mme_vlr_t *vlr)
|
||||
{
|
||||
int rv;
|
||||
ogs_pkbuf_t *pkbuf = NULL;
|
||||
|
@ -197,12 +207,14 @@ void sgsap_send_reset_ack(mme_vlr_t *vlr)
|
|||
ogs_debug("[SGSAP] RESET-ACK");
|
||||
|
||||
pkbuf = sgsap_build_reset_ack(vlr);
|
||||
ogs_expect_or_return(pkbuf);
|
||||
ogs_expect_or_return_val(pkbuf, OGS_ERROR);
|
||||
rv = sgsap_send_to_vlr_with_sid(vlr, pkbuf, 0);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void sgsap_send_uplink_unitdata(mme_ue_t *mme_ue,
|
||||
int sgsap_send_uplink_unitdata(mme_ue_t *mme_ue,
|
||||
ogs_nas_eps_message_container_t *nas_message_container)
|
||||
{
|
||||
int rv;
|
||||
|
@ -216,12 +228,14 @@ void sgsap_send_uplink_unitdata(mme_ue_t *mme_ue,
|
|||
nas_message_container->buffer, nas_message_container->length);
|
||||
|
||||
pkbuf = sgsap_build_uplink_unidata(mme_ue, nas_message_container);
|
||||
ogs_expect_or_return(pkbuf);
|
||||
ogs_expect_or_return_val(pkbuf, OGS_ERROR);
|
||||
rv = sgsap_send_to_vlr(mme_ue, pkbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void sgsap_send_ue_unreachable(mme_ue_t *mme_ue, uint8_t sgs_cause)
|
||||
int sgsap_send_ue_unreachable(mme_ue_t *mme_ue, uint8_t sgs_cause)
|
||||
{
|
||||
int rv;
|
||||
ogs_pkbuf_t *pkbuf = NULL;
|
||||
|
@ -232,7 +246,9 @@ void sgsap_send_ue_unreachable(mme_ue_t *mme_ue, uint8_t sgs_cause)
|
|||
ogs_debug(" CAUSE[%d]", sgs_cause);
|
||||
|
||||
pkbuf = sgsap_build_ue_unreachable(mme_ue, sgs_cause);
|
||||
ogs_expect_or_return(pkbuf);
|
||||
ogs_expect_or_return_val(pkbuf, OGS_ERROR);
|
||||
rv = sgsap_send_to_vlr(mme_ue, pkbuf);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
|
@ -41,15 +41,15 @@ int sgsap_send_to_vlr_with_sid(
|
|||
mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf, uint16_t stream_no);
|
||||
int sgsap_send_to_vlr(mme_ue_t *mme_ue, ogs_pkbuf_t *pkbuf);
|
||||
|
||||
void sgsap_send_location_update_request(mme_ue_t *mme_ue);
|
||||
void sgsap_send_tmsi_reallocation_complete(mme_ue_t *mme_ue);
|
||||
void sgsap_send_detach_indication(mme_ue_t *mme_ue);
|
||||
void sgsap_send_mo_csfb_indication(mme_ue_t *mme_ue);
|
||||
void sgsap_send_service_request(mme_ue_t *mme_ue, uint8_t emm_mode);
|
||||
void sgsap_send_reset_ack(mme_vlr_t *vlr);
|
||||
void sgsap_send_uplink_unitdata(mme_ue_t *mme_ue,
|
||||
int sgsap_send_location_update_request(mme_ue_t *mme_ue);
|
||||
int sgsap_send_tmsi_reallocation_complete(mme_ue_t *mme_ue);
|
||||
int sgsap_send_detach_indication(mme_ue_t *mme_ue);
|
||||
int sgsap_send_mo_csfb_indication(mme_ue_t *mme_ue);
|
||||
int sgsap_send_service_request(mme_ue_t *mme_ue, uint8_t emm_mode);
|
||||
int sgsap_send_reset_ack(mme_vlr_t *vlr);
|
||||
int sgsap_send_uplink_unitdata(mme_ue_t *mme_ue,
|
||||
ogs_nas_eps_message_container_t *nas_message_container);
|
||||
void sgsap_send_ue_unreachable(mme_ue_t *mme_ue, uint8_t sgs_cause);
|
||||
int sgsap_send_ue_unreachable(mme_ue_t *mme_ue, uint8_t sgs_cause);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
@ -159,7 +159,7 @@ static void bearer_timeout(ogs_gtp_xact_t *xact, void *data)
|
|||
}
|
||||
}
|
||||
|
||||
void sgwc_gtp_send_downlink_data_notification(
|
||||
int sgwc_gtp_send_downlink_data_notification(
|
||||
uint8_t cause_value, sgwc_bearer_t *bearer)
|
||||
{
|
||||
int rv;
|
||||
|
@ -189,12 +189,14 @@ void sgwc_gtp_send_downlink_data_notification(
|
|||
h.teid = sgwc_ue->mme_s11_teid;
|
||||
|
||||
pkbuf = sgwc_s11_build_downlink_data_notification(cause_value, bearer);
|
||||
ogs_expect_or_return(pkbuf);
|
||||
ogs_expect_or_return_val(pkbuf, OGS_ERROR);
|
||||
|
||||
gtp_xact = ogs_gtp_xact_local_create(
|
||||
sgwc_ue->gnode, &h, pkbuf, bearer_timeout, bearer);
|
||||
ogs_expect_or_return(gtp_xact);
|
||||
ogs_expect_or_return_val(gtp_xact, OGS_ERROR);
|
||||
|
||||
rv = ogs_gtp_xact_commit(gtp_xact);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
|
|
@ -29,7 +29,7 @@ extern "C" {
|
|||
int sgwc_gtp_open(void);
|
||||
void sgwc_gtp_close(void);
|
||||
|
||||
void sgwc_gtp_send_downlink_data_notification(
|
||||
int sgwc_gtp_send_downlink_data_notification(
|
||||
uint8_t cause_value, sgwc_bearer_t *bearer);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
|
@ -202,7 +202,7 @@ static void bearer_timeout(ogs_pfcp_xact_t *xact, void *data)
|
|||
}
|
||||
}
|
||||
|
||||
void sgwc_pfcp_send_session_establishment_request(
|
||||
int sgwc_pfcp_send_session_establishment_request(
|
||||
sgwc_sess_t *sess, ogs_gtp_xact_t *gtp_xact, ogs_pkbuf_t *gtpbuf)
|
||||
{
|
||||
int rv;
|
||||
|
@ -217,11 +217,11 @@ void sgwc_pfcp_send_session_establishment_request(
|
|||
h.seid = sess->sgwu_sxa_seid;
|
||||
|
||||
sxabuf = sgwc_sxa_build_session_establishment_request(h.type, sess);
|
||||
ogs_expect_or_return(sxabuf);
|
||||
ogs_expect_or_return_val(sxabuf, OGS_ERROR);
|
||||
|
||||
xact = ogs_pfcp_xact_local_create(
|
||||
sess->pfcp_node, &h, sxabuf, sess_timeout, sess);
|
||||
ogs_expect_or_return(xact);
|
||||
ogs_expect_or_return_val(xact, OGS_ERROR);
|
||||
xact->assoc_xact = gtp_xact;
|
||||
if (gtpbuf) {
|
||||
xact->gtpbuf = ogs_pkbuf_copy(gtpbuf);
|
||||
|
@ -230,9 +230,11 @@ void sgwc_pfcp_send_session_establishment_request(
|
|||
|
||||
rv = ogs_pfcp_xact_commit(xact);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void sgwc_pfcp_send_sess_modification_request(
|
||||
int sgwc_pfcp_send_sess_modification_request(
|
||||
sgwc_sess_t *sess, ogs_gtp_xact_t *gtp_xact,
|
||||
ogs_pkbuf_t *gtpbuf, uint64_t flags)
|
||||
{
|
||||
|
@ -248,11 +250,11 @@ void sgwc_pfcp_send_sess_modification_request(
|
|||
h.seid = sess->sgwu_sxa_seid;
|
||||
|
||||
sxabuf = sgwc_sxa_build_sess_modification_request(h.type, sess, flags);
|
||||
ogs_expect_or_return(sxabuf);
|
||||
ogs_expect_or_return_val(sxabuf, OGS_ERROR);
|
||||
|
||||
xact = ogs_pfcp_xact_local_create(
|
||||
sess->pfcp_node, &h, sxabuf, sess_timeout, sess);
|
||||
ogs_expect_or_return(xact);
|
||||
ogs_expect_or_return_val(xact, OGS_ERROR);
|
||||
xact->assoc_xact = gtp_xact;
|
||||
xact->modify_flags = flags | OGS_PFCP_MODIFY_SESSION;
|
||||
if (gtpbuf) {
|
||||
|
@ -262,9 +264,11 @@ void sgwc_pfcp_send_sess_modification_request(
|
|||
|
||||
rv = ogs_pfcp_xact_commit(xact);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void sgwc_pfcp_send_bearer_modification_request(
|
||||
int sgwc_pfcp_send_bearer_modification_request(
|
||||
sgwc_bearer_t *bearer, ogs_gtp_xact_t *gtp_xact,
|
||||
ogs_pkbuf_t *gtpbuf, uint64_t flags)
|
||||
{
|
||||
|
@ -283,11 +287,11 @@ void sgwc_pfcp_send_bearer_modification_request(
|
|||
h.seid = sess->sgwu_sxa_seid;
|
||||
|
||||
sxabuf = sgwc_sxa_build_bearer_modification_request(h.type, bearer, flags);
|
||||
ogs_expect_or_return(sxabuf);
|
||||
ogs_expect_or_return_val(sxabuf, OGS_ERROR);
|
||||
|
||||
xact = ogs_pfcp_xact_local_create(
|
||||
sess->pfcp_node, &h, sxabuf, bearer_timeout, bearer);
|
||||
ogs_expect_or_return(xact);
|
||||
ogs_expect_or_return_val(xact, OGS_ERROR);
|
||||
xact->assoc_xact = gtp_xact;
|
||||
xact->modify_flags = flags;
|
||||
if (gtpbuf) {
|
||||
|
@ -297,9 +301,11 @@ void sgwc_pfcp_send_bearer_modification_request(
|
|||
|
||||
rv = ogs_pfcp_xact_commit(xact);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void sgwc_pfcp_send_session_deletion_request(
|
||||
int sgwc_pfcp_send_session_deletion_request(
|
||||
sgwc_sess_t *sess, ogs_gtp_xact_t *gtp_xact, ogs_pkbuf_t *gtpbuf)
|
||||
{
|
||||
int rv;
|
||||
|
@ -314,11 +320,11 @@ void sgwc_pfcp_send_session_deletion_request(
|
|||
h.seid = sess->sgwu_sxa_seid;
|
||||
|
||||
sxabuf = sgwc_sxa_build_session_deletion_request(h.type, sess);
|
||||
ogs_expect_or_return(sxabuf);
|
||||
ogs_expect_or_return_val(sxabuf, OGS_ERROR);
|
||||
|
||||
xact = ogs_pfcp_xact_local_create(
|
||||
sess->pfcp_node, &h, sxabuf, sess_timeout, sess);
|
||||
ogs_expect_or_return(xact);
|
||||
ogs_expect_or_return_val(xact, OGS_ERROR);
|
||||
xact->assoc_xact = gtp_xact;
|
||||
if (gtpbuf) {
|
||||
xact->gtpbuf = ogs_pkbuf_copy(gtpbuf);
|
||||
|
@ -327,9 +333,11 @@ void sgwc_pfcp_send_session_deletion_request(
|
|||
|
||||
rv = ogs_pfcp_xact_commit(xact);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void sgwc_pfcp_send_session_report_response(
|
||||
int sgwc_pfcp_send_session_report_response(
|
||||
ogs_pfcp_xact_t *xact, sgwc_sess_t *sess, uint8_t cause)
|
||||
{
|
||||
int rv;
|
||||
|
@ -343,11 +351,13 @@ void sgwc_pfcp_send_session_report_response(
|
|||
h.seid = sess->sgwu_sxa_seid;
|
||||
|
||||
sxabuf = ogs_pfcp_build_session_report_response(h.type, cause);
|
||||
ogs_expect_or_return(sxabuf);
|
||||
ogs_expect_or_return_val(sxabuf, OGS_ERROR);
|
||||
|
||||
rv = ogs_pfcp_xact_update_tx(xact, &h, sxabuf);
|
||||
ogs_expect_or_return(rv == OGS_OK);
|
||||
ogs_expect_or_return_val(rv == OGS_OK, OGS_ERROR);
|
||||
|
||||
rv = ogs_pfcp_xact_commit(xact);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
|
@ -29,18 +29,18 @@ extern "C" {
|
|||
int sgwc_pfcp_open(void);
|
||||
void sgwc_pfcp_close(void);
|
||||
|
||||
void sgwc_pfcp_send_session_establishment_request(
|
||||
int sgwc_pfcp_send_session_establishment_request(
|
||||
sgwc_sess_t *sess, ogs_gtp_xact_t *gtp_xact, ogs_pkbuf_t *gtpbuf);
|
||||
void sgwc_pfcp_send_sess_modification_request(
|
||||
int sgwc_pfcp_send_sess_modification_request(
|
||||
sgwc_sess_t *sess, ogs_gtp_xact_t *gtp_xact,
|
||||
ogs_pkbuf_t *gtpbuf, uint64_t flags);
|
||||
void sgwc_pfcp_send_bearer_modification_request(
|
||||
int sgwc_pfcp_send_bearer_modification_request(
|
||||
sgwc_bearer_t *bearer, ogs_gtp_xact_t *gtp_xact,
|
||||
ogs_pkbuf_t *gtpbuf, uint64_t flags);
|
||||
void sgwc_pfcp_send_session_deletion_request(
|
||||
int sgwc_pfcp_send_session_deletion_request(
|
||||
sgwc_sess_t *sess, ogs_gtp_xact_t *gtp_xact, ogs_pkbuf_t *gtpbuf);
|
||||
|
||||
void sgwc_pfcp_send_session_report_response(
|
||||
int sgwc_pfcp_send_session_report_response(
|
||||
ogs_pfcp_xact_t *xact, sgwc_sess_t *sess, uint8_t cause);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
|
@ -43,7 +43,8 @@ static void sess_timeout(ogs_gtp_xact_t *xact, void *data)
|
|||
sgwc_ue->imsi_bcd);
|
||||
break;
|
||||
}
|
||||
sgwc_pfcp_send_session_deletion_request(sess, NULL, NULL);
|
||||
ogs_assert(OGS_OK ==
|
||||
sgwc_pfcp_send_session_deletion_request(sess, NULL, NULL));
|
||||
break;
|
||||
default:
|
||||
ogs_error("GTP Timeout : IMSI[%s] Message-Type[%d]",
|
||||
|
@ -262,7 +263,8 @@ void sgwc_s11_handle_create_session_request(
|
|||
ogs_debug(" MME_S11_TEID[%d] SGW_S11_TEID[%d]",
|
||||
sgwc_ue->mme_s11_teid, sgwc_ue->sgw_s11_teid);
|
||||
|
||||
sgwc_pfcp_send_session_establishment_request(sess, s11_xact, gtpbuf);
|
||||
ogs_assert(OGS_OK ==
|
||||
sgwc_pfcp_send_session_establishment_request(sess, s11_xact, gtpbuf));
|
||||
}
|
||||
|
||||
void sgwc_s11_handle_modify_bearer_request(
|
||||
|
@ -403,8 +405,9 @@ void sgwc_s11_handle_modify_bearer_request(
|
|||
ogs_debug(" ENB_S1U_TEID[%d] SGW_S1U_TEID[%d]",
|
||||
dl_tunnel->remote_teid, dl_tunnel->local_teid);
|
||||
|
||||
sgwc_pfcp_send_bearer_modification_request(
|
||||
bearer, s11_xact, gtpbuf, flags);
|
||||
ogs_assert(OGS_OK ==
|
||||
sgwc_pfcp_send_bearer_modification_request(
|
||||
bearer, s11_xact, gtpbuf, flags));
|
||||
}
|
||||
|
||||
void sgwc_s11_handle_delete_session_request(
|
||||
|
@ -577,9 +580,10 @@ void sgwc_s11_handle_create_bearer_response(
|
|||
}
|
||||
|
||||
if (cause_value != OGS_GTP_CAUSE_REQUEST_ACCEPTED) {
|
||||
sgwc_pfcp_send_bearer_modification_request(
|
||||
ogs_assert(OGS_OK ==
|
||||
sgwc_pfcp_send_bearer_modification_request(
|
||||
bearer, NULL, NULL,
|
||||
OGS_PFCP_MODIFY_UL_ONLY|OGS_PFCP_MODIFY_REMOVE);
|
||||
OGS_PFCP_MODIFY_UL_ONLY|OGS_PFCP_MODIFY_REMOVE));
|
||||
ogs_gtp_send_error_message(s5c_xact, sess ? sess->pgw_s5c_teid : 0,
|
||||
OGS_GTP_CREATE_BEARER_RESPONSE_TYPE, cause_value);
|
||||
return;
|
||||
|
@ -636,9 +640,10 @@ void sgwc_s11_handle_create_bearer_response(
|
|||
ogs_plmn_id_hexdump(&sgwc_ue->e_cgi.plmn_id),
|
||||
sgwc_ue->e_cgi.cell_id);
|
||||
|
||||
sgwc_pfcp_send_bearer_modification_request(
|
||||
ogs_assert(OGS_OK ==
|
||||
sgwc_pfcp_send_bearer_modification_request(
|
||||
bearer, s5c_xact, gtpbuf,
|
||||
OGS_PFCP_MODIFY_DL_ONLY|OGS_PFCP_MODIFY_CREATE);
|
||||
OGS_PFCP_MODIFY_DL_ONLY|OGS_PFCP_MODIFY_CREATE));
|
||||
}
|
||||
|
||||
void sgwc_s11_handle_update_bearer_response(
|
||||
|
@ -824,8 +829,9 @@ void sgwc_s11_handle_delete_bearer_response(
|
|||
ogs_debug(" SGW_S5C_TEID[0x%x] PGW_S5C_TEID[0x%x]",
|
||||
sess->sgw_s5c_teid, sess->pgw_s5c_teid);
|
||||
|
||||
sgwc_pfcp_send_bearer_modification_request(
|
||||
bearer, s5c_xact, gtpbuf, OGS_PFCP_MODIFY_REMOVE);
|
||||
ogs_assert(OGS_OK ==
|
||||
sgwc_pfcp_send_bearer_modification_request(
|
||||
bearer, s5c_xact, gtpbuf, OGS_PFCP_MODIFY_REMOVE));
|
||||
}
|
||||
|
||||
void sgwc_s11_handle_release_access_bearers_request(
|
||||
|
@ -867,9 +873,10 @@ void sgwc_s11_handle_release_access_bearers_request(
|
|||
ogs_list_for_each(&sgwc_ue->sess_list, sess) {
|
||||
|
||||
sess->state.release_access_bearers = false;
|
||||
sgwc_pfcp_send_sess_modification_request(
|
||||
ogs_assert(OGS_OK ==
|
||||
sgwc_pfcp_send_sess_modification_request(
|
||||
sess, s11_xact, gtpbuf,
|
||||
OGS_PFCP_MODIFY_DL_ONLY|OGS_PFCP_MODIFY_DEACTIVATE);
|
||||
OGS_PFCP_MODIFY_DL_ONLY|OGS_PFCP_MODIFY_DEACTIVATE));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1042,9 +1049,10 @@ void sgwc_s11_handle_create_indirect_data_forwarding_tunnel_request(
|
|||
ogs_list_for_each(&sgwc_ue->sess_list, sess) {
|
||||
|
||||
sess->state.create_indirect_tunnel = false;
|
||||
sgwc_pfcp_send_sess_modification_request(
|
||||
ogs_assert(OGS_OK ==
|
||||
sgwc_pfcp_send_sess_modification_request(
|
||||
sess, s11_xact, gtpbuf,
|
||||
OGS_PFCP_MODIFY_INDIRECT|OGS_PFCP_MODIFY_CREATE);
|
||||
OGS_PFCP_MODIFY_INDIRECT|OGS_PFCP_MODIFY_CREATE));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1084,9 +1092,10 @@ void sgwc_s11_handle_delete_indirect_data_forwarding_tunnel_request(
|
|||
ogs_list_for_each(&sgwc_ue->sess_list, sess) {
|
||||
|
||||
sess->state.delete_indirect_tunnel = false;
|
||||
sgwc_pfcp_send_sess_modification_request(
|
||||
ogs_assert(OGS_OK ==
|
||||
sgwc_pfcp_send_sess_modification_request(
|
||||
sess, s11_xact, gtpbuf,
|
||||
OGS_PFCP_MODIFY_INDIRECT| OGS_PFCP_MODIFY_REMOVE);
|
||||
OGS_PFCP_MODIFY_INDIRECT| OGS_PFCP_MODIFY_REMOVE));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -48,8 +48,9 @@ static void bearer_timeout(ogs_gtp_xact_t *xact, void *data)
|
|||
ogs_warn("[%s] Bearer has already been removed", sgwc_ue->imsi_bcd);
|
||||
break;
|
||||
}
|
||||
sgwc_pfcp_send_bearer_modification_request(
|
||||
bearer, NULL, NULL, OGS_PFCP_MODIFY_REMOVE);
|
||||
ogs_assert(OGS_OK ==
|
||||
sgwc_pfcp_send_bearer_modification_request(
|
||||
bearer, NULL, NULL, OGS_PFCP_MODIFY_REMOVE));
|
||||
break;
|
||||
default:
|
||||
ogs_error("GTP Timeout : IMSI[%s] Message-Type[%d]",
|
||||
|
@ -179,7 +180,8 @@ void sgwc_s5c_handle_create_session_response(
|
|||
}
|
||||
|
||||
if (cause_value != OGS_GTP_CAUSE_REQUEST_ACCEPTED) {
|
||||
sgwc_pfcp_send_session_deletion_request(sess, NULL, NULL);
|
||||
ogs_assert(OGS_OK ==
|
||||
sgwc_pfcp_send_session_deletion_request(sess, NULL, NULL));
|
||||
ogs_gtp_send_error_message(
|
||||
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
OGS_GTP_CREATE_SESSION_RESPONSE_TYPE, cause_value);
|
||||
|
@ -225,9 +227,10 @@ void sgwc_s5c_handle_create_session_response(
|
|||
ogs_debug(" SGW_S5U_TEID[%d] PGW_S5U_TEID[%d]",
|
||||
ul_tunnel->local_teid, ul_tunnel->remote_teid);
|
||||
|
||||
sgwc_pfcp_send_bearer_modification_request(
|
||||
ogs_assert(OGS_OK ==
|
||||
sgwc_pfcp_send_bearer_modification_request(
|
||||
bearer, s11_xact, gtpbuf,
|
||||
OGS_PFCP_MODIFY_UL_ONLY|OGS_PFCP_MODIFY_ACTIVATE);
|
||||
OGS_PFCP_MODIFY_UL_ONLY|OGS_PFCP_MODIFY_ACTIVATE));
|
||||
}
|
||||
|
||||
void sgwc_s5c_handle_delete_session_response(
|
||||
|
@ -276,7 +279,8 @@ void sgwc_s5c_handle_delete_session_response(
|
|||
}
|
||||
|
||||
if (cause_value != OGS_GTP_CAUSE_REQUEST_ACCEPTED) {
|
||||
sgwc_pfcp_send_session_deletion_request(sess, NULL, NULL);
|
||||
ogs_assert(OGS_OK ==
|
||||
sgwc_pfcp_send_session_deletion_request(sess, NULL, NULL));
|
||||
ogs_gtp_send_error_message(
|
||||
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
|
||||
OGS_GTP_DELETE_SESSION_RESPONSE_TYPE, cause_value);
|
||||
|
@ -289,7 +293,8 @@ void sgwc_s5c_handle_delete_session_response(
|
|||
ogs_debug(" SGW_S5C_TEID[0x%x] PGW_S5C_TEID[0x%x]",
|
||||
sess->sgw_s5c_teid, sess->pgw_s5c_teid);
|
||||
|
||||
sgwc_pfcp_send_session_deletion_request(sess, s11_xact, gtpbuf);
|
||||
ogs_assert(OGS_OK ==
|
||||
sgwc_pfcp_send_session_deletion_request(sess, s11_xact, gtpbuf));
|
||||
}
|
||||
|
||||
void sgwc_s5c_handle_create_bearer_request(
|
||||
|
@ -381,9 +386,10 @@ void sgwc_s5c_handle_create_bearer_request(
|
|||
&far->outer_header_creation, &far->outer_header_creation_len);
|
||||
far->outer_header_creation.teid = ul_tunnel->remote_teid;
|
||||
|
||||
sgwc_pfcp_send_bearer_modification_request(
|
||||
ogs_assert(OGS_OK ==
|
||||
sgwc_pfcp_send_bearer_modification_request(
|
||||
bearer, s5c_xact, gtpbuf,
|
||||
OGS_PFCP_MODIFY_UL_ONLY|OGS_PFCP_MODIFY_CREATE);
|
||||
OGS_PFCP_MODIFY_UL_ONLY|OGS_PFCP_MODIFY_CREATE));
|
||||
}
|
||||
|
||||
void sgwc_s5c_handle_update_bearer_request(
|
||||
|
|
|
@ -81,7 +81,8 @@ static void sess_timeout(ogs_gtp_xact_t *xact, void *data)
|
|||
sgwc_ue->imsi_bcd);
|
||||
break;
|
||||
}
|
||||
sgwc_pfcp_send_session_deletion_request(sess, NULL, NULL);
|
||||
ogs_assert(OGS_OK ==
|
||||
sgwc_pfcp_send_session_deletion_request(sess, NULL, NULL));
|
||||
break;
|
||||
default:
|
||||
ogs_error("GTP Timeout : IMSI[%s] Message-Type[%d]",
|
||||
|
@ -112,9 +113,10 @@ static void bearer_timeout(ogs_gtp_xact_t *xact, void *data)
|
|||
ogs_warn("[%s] Bearer has already been removed", sgwc_ue->imsi_bcd);
|
||||
break;
|
||||
}
|
||||
sgwc_pfcp_send_bearer_modification_request(
|
||||
ogs_assert(OGS_OK ==
|
||||
sgwc_pfcp_send_bearer_modification_request(
|
||||
bearer, NULL, NULL,
|
||||
OGS_PFCP_MODIFY_UL_ONLY|OGS_PFCP_MODIFY_REMOVE);
|
||||
OGS_PFCP_MODIFY_UL_ONLY|OGS_PFCP_MODIFY_REMOVE));
|
||||
break;
|
||||
default:
|
||||
ogs_error("GTP Timeout : IMSI[%s] Message-Type[%d]",
|
||||
|
@ -962,8 +964,9 @@ void sgwc_sxa_handle_session_modification_response(
|
|||
bearer = pfcp_xact->assoc_xact;
|
||||
ogs_assert(bearer);
|
||||
|
||||
sgwc_gtp_send_downlink_data_notification(
|
||||
OGS_GTP_CAUSE_ERROR_INDICATION_RECEIVED, bearer);
|
||||
ogs_assert(OGS_OK ==
|
||||
sgwc_gtp_send_downlink_data_notification(
|
||||
OGS_GTP_CAUSE_ERROR_INDICATION_RECEIVED, bearer));
|
||||
|
||||
} else {
|
||||
ogs_gtp_release_access_bearers_response_t *gtp_rsp = NULL;
|
||||
|
@ -1123,8 +1126,9 @@ void sgwc_sxa_handle_session_report_request(
|
|||
return;
|
||||
}
|
||||
|
||||
sgwc_pfcp_send_session_report_response(
|
||||
pfcp_xact, sess, OGS_PFCP_CAUSE_REQUEST_ACCEPTED);
|
||||
ogs_assert(OGS_OK ==
|
||||
sgwc_pfcp_send_session_report_response(
|
||||
pfcp_xact, sess, OGS_PFCP_CAUSE_REQUEST_ACCEPTED));
|
||||
|
||||
report_type.value = pfcp_req->report_type.u8;
|
||||
|
||||
|
@ -1145,8 +1149,9 @@ void sgwc_sxa_handle_session_report_request(
|
|||
ogs_list_for_each(&bearer->tunnel_list, tunnel) {
|
||||
ogs_assert(tunnel->pdr);
|
||||
if (tunnel->pdr->id == pdr_id) {
|
||||
sgwc_gtp_send_downlink_data_notification(
|
||||
OGS_GTP_CAUSE_INVALID_VALUE, bearer);
|
||||
ogs_assert(OGS_OK ==
|
||||
sgwc_gtp_send_downlink_data_notification(
|
||||
OGS_GTP_CAUSE_INVALID_VALUE, bearer));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -1164,13 +1169,14 @@ void sgwc_sxa_handle_session_report_request(
|
|||
|
||||
sess->state.release_access_bearers = false;
|
||||
|
||||
sgwc_pfcp_send_sess_modification_request(sess,
|
||||
/* We only use the `assoc_xact` parameter temporarily here
|
||||
* to pass the `bearer` context. */
|
||||
ogs_assert(OGS_OK ==
|
||||
sgwc_pfcp_send_sess_modification_request(sess,
|
||||
/* We only use the `assoc_xact` parameter temporarily here
|
||||
* to pass the `bearer` context. */
|
||||
(ogs_gtp_xact_t *)bearer,
|
||||
NULL,
|
||||
OGS_PFCP_MODIFY_DL_ONLY|OGS_PFCP_MODIFY_DEACTIVATE|
|
||||
OGS_PFCP_MODIFY_ERROR_INDICATION);
|
||||
OGS_PFCP_MODIFY_ERROR_INDICATION));
|
||||
}
|
||||
|
||||
} else {
|
||||
|
|
|
@ -140,7 +140,8 @@ static void _gtpv1_u_recv_cb(short when, ogs_socket_t fd, void *data)
|
|||
sess = SGWU_SESS(far->sess);
|
||||
ogs_assert(sess);
|
||||
|
||||
sgwu_pfcp_send_session_report_request(sess, &report);
|
||||
ogs_assert(OGS_OK ==
|
||||
sgwu_pfcp_send_session_report_request(sess, &report));
|
||||
}
|
||||
|
||||
} else {
|
||||
|
@ -216,7 +217,8 @@ static void _gtpv1_u_recv_cb(short when, ogs_socket_t fd, void *data)
|
|||
report.downlink_data.pdr_id = pdr->id;
|
||||
report.downlink_data.qfi = qfi; /* for 5GC */
|
||||
|
||||
sgwu_pfcp_send_session_report_request(sess, &report);
|
||||
ogs_assert(OGS_OK ==
|
||||
sgwu_pfcp_send_session_report_request(sess, &report));
|
||||
}
|
||||
} else {
|
||||
ogs_error("[DROP] Invalid GTPU Type [%d]", gtp_h->type);
|
||||
|
@ -271,4 +273,4 @@ int sgwu_gtp_open(void)
|
|||
void sgwu_gtp_close(void)
|
||||
{
|
||||
ogs_socknode_remove_all(&ogs_gtp_self()->gtpu_list);
|
||||
}
|
||||
}
|
|
@ -162,7 +162,7 @@ void sgwu_pfcp_close(void)
|
|||
ogs_socknode_remove_all(&ogs_pfcp_self()->pfcp_list6);
|
||||
}
|
||||
|
||||
void sgwu_pfcp_send_session_establishment_response(
|
||||
int sgwu_pfcp_send_session_establishment_response(
|
||||
ogs_pfcp_xact_t *xact, sgwu_sess_t *sess,
|
||||
ogs_pfcp_pdr_t *created_pdr[], int num_of_created_pdr)
|
||||
{
|
||||
|
@ -178,16 +178,18 @@ void sgwu_pfcp_send_session_establishment_response(
|
|||
|
||||
sxabuf = sgwu_sxa_build_session_establishment_response(
|
||||
h.type, sess, created_pdr, num_of_created_pdr);
|
||||
ogs_expect_or_return(sxabuf);
|
||||
ogs_expect_or_return_val(sxabuf, OGS_ERROR);
|
||||
|
||||
rv = ogs_pfcp_xact_update_tx(xact, &h, sxabuf);
|
||||
ogs_expect_or_return(rv == OGS_OK);
|
||||
ogs_expect_or_return_val(rv == OGS_OK, OGS_ERROR);
|
||||
|
||||
rv = ogs_pfcp_xact_commit(xact);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void sgwu_pfcp_send_session_modification_response(
|
||||
int sgwu_pfcp_send_session_modification_response(
|
||||
ogs_pfcp_xact_t *xact, sgwu_sess_t *sess,
|
||||
ogs_pfcp_pdr_t *created_pdr[], int num_of_created_pdr)
|
||||
{
|
||||
|
@ -204,16 +206,18 @@ void sgwu_pfcp_send_session_modification_response(
|
|||
|
||||
sxabuf = sgwu_sxa_build_session_modification_response(
|
||||
h.type, sess, created_pdr, num_of_created_pdr);
|
||||
ogs_expect_or_return(sxabuf);
|
||||
ogs_expect_or_return_val(sxabuf, OGS_ERROR);
|
||||
|
||||
rv = ogs_pfcp_xact_update_tx(xact, &h, sxabuf);
|
||||
ogs_expect_or_return(rv == OGS_OK);
|
||||
ogs_expect_or_return_val(rv == OGS_OK, OGS_ERROR);
|
||||
|
||||
rv = ogs_pfcp_xact_commit(xact);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void sgwu_pfcp_send_session_deletion_response(ogs_pfcp_xact_t *xact,
|
||||
int sgwu_pfcp_send_session_deletion_response(ogs_pfcp_xact_t *xact,
|
||||
sgwu_sess_t *sess)
|
||||
{
|
||||
int rv;
|
||||
|
@ -227,13 +231,15 @@ void sgwu_pfcp_send_session_deletion_response(ogs_pfcp_xact_t *xact,
|
|||
h.seid = sess->sgwc_sxa_seid;
|
||||
|
||||
sxabuf = sgwu_sxa_build_session_deletion_response(h.type, sess);
|
||||
ogs_expect_or_return(sxabuf);
|
||||
ogs_expect_or_return_val(sxabuf, OGS_ERROR);
|
||||
|
||||
rv = ogs_pfcp_xact_update_tx(xact, &h, sxabuf);
|
||||
ogs_expect_or_return(rv == OGS_OK);
|
||||
ogs_expect_or_return_val(rv == OGS_OK, OGS_ERROR);
|
||||
|
||||
rv = ogs_pfcp_xact_commit(xact);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
static void sess_timeout(ogs_pfcp_xact_t *xact, void *data)
|
||||
|
@ -253,7 +259,7 @@ static void sess_timeout(ogs_pfcp_xact_t *xact, void *data)
|
|||
}
|
||||
}
|
||||
|
||||
void sgwu_pfcp_send_session_report_request(
|
||||
int sgwu_pfcp_send_session_report_request(
|
||||
sgwu_sess_t *sess, ogs_pfcp_user_plane_report_t *report)
|
||||
{
|
||||
int rv;
|
||||
|
@ -269,12 +275,14 @@ void sgwu_pfcp_send_session_report_request(
|
|||
h.seid = sess->sgwc_sxa_seid;
|
||||
|
||||
sxabuf = ogs_pfcp_build_session_report_request(h.type, report);
|
||||
ogs_expect_or_return(sxabuf);
|
||||
ogs_expect_or_return_val(sxabuf, OGS_ERROR);
|
||||
|
||||
xact = ogs_pfcp_xact_local_create(
|
||||
sess->pfcp_node, &h, sxabuf, sess_timeout, sess);
|
||||
ogs_expect_or_return(xact);
|
||||
ogs_expect_or_return_val(xact, OGS_ERROR);
|
||||
|
||||
rv = ogs_pfcp_xact_commit(xact);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
|
@ -29,16 +29,16 @@ extern "C" {
|
|||
int sgwu_pfcp_open(void);
|
||||
void sgwu_pfcp_close(void);
|
||||
|
||||
void sgwu_pfcp_send_session_establishment_response(
|
||||
int sgwu_pfcp_send_session_establishment_response(
|
||||
ogs_pfcp_xact_t *xact, sgwu_sess_t *sess,
|
||||
ogs_pfcp_pdr_t *created_pdr[], int num_of_created_pdr);
|
||||
void sgwu_pfcp_send_session_modification_response(
|
||||
int sgwu_pfcp_send_session_modification_response(
|
||||
ogs_pfcp_xact_t *xact, sgwu_sess_t *sess,
|
||||
ogs_pfcp_pdr_t *created_pdr[], int num_of_created_pdr);
|
||||
void sgwu_pfcp_send_session_deletion_response(ogs_pfcp_xact_t *xact,
|
||||
int sgwu_pfcp_send_session_deletion_response(ogs_pfcp_xact_t *xact,
|
||||
sgwu_sess_t *sess);
|
||||
|
||||
void sgwu_pfcp_send_session_report_request(
|
||||
int sgwu_pfcp_send_session_report_request(
|
||||
sgwu_sess_t *sess, ogs_pfcp_user_plane_report_t *report);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
|
@ -152,8 +152,9 @@ void sgwu_sxa_handle_session_establishment_request(
|
|||
}
|
||||
}
|
||||
|
||||
sgwu_pfcp_send_session_establishment_response(
|
||||
xact, sess, created_pdr, num_of_created_pdr);
|
||||
ogs_assert(OGS_OK ==
|
||||
sgwu_pfcp_send_session_establishment_response(
|
||||
xact, sess, created_pdr, num_of_created_pdr));
|
||||
return;
|
||||
|
||||
cleanup:
|
||||
|
@ -357,8 +358,9 @@ void sgwu_sxa_handle_session_modification_request(
|
|||
}
|
||||
}
|
||||
|
||||
sgwu_pfcp_send_session_modification_response(
|
||||
xact, sess, created_pdr, num_of_created_pdr);
|
||||
ogs_assert(OGS_OK ==
|
||||
sgwu_pfcp_send_session_modification_response(
|
||||
xact, sess, created_pdr, num_of_created_pdr));
|
||||
return;
|
||||
|
||||
cleanup:
|
||||
|
|
|
@ -45,8 +45,9 @@ static void bearer_timeout(ogs_gtp_xact_t *xact, void *data)
|
|||
ogs_warn("[%s] Bearer has already been removed", smf_ue->imsi_bcd);
|
||||
break;
|
||||
}
|
||||
smf_epc_pfcp_send_bearer_modification_request(
|
||||
bearer, OGS_PFCP_MODIFY_REMOVE);
|
||||
ogs_assert(OGS_OK ==
|
||||
smf_epc_pfcp_send_bearer_modification_request(
|
||||
bearer, OGS_PFCP_MODIFY_REMOVE));
|
||||
break;
|
||||
case OGS_GTP_UPDATE_BEARER_REQUEST_TYPE:
|
||||
ogs_error("[%s] No Update Bearer Response", smf_ue->imsi_bcd);
|
||||
|
@ -57,8 +58,10 @@ static void bearer_timeout(ogs_gtp_xact_t *xact, void *data)
|
|||
ogs_warn("[%s] Bearer has already been removed", smf_ue->imsi_bcd);
|
||||
break;
|
||||
}
|
||||
smf_epc_pfcp_send_bearer_modification_request(
|
||||
bearer, OGS_PFCP_MODIFY_REMOVE);
|
||||
|
||||
ogs_assert(OGS_OK ==
|
||||
smf_epc_pfcp_send_bearer_modification_request(
|
||||
bearer, OGS_PFCP_MODIFY_REMOVE));
|
||||
break;
|
||||
default:
|
||||
ogs_error("GTP Timeout : IMSI[%s] Message-Type[%d]",
|
||||
|
@ -314,8 +317,9 @@ void smf_bearer_binding(smf_sess_t *sess)
|
|||
qer->gbr.downlink = bearer->qos.gbr.downlink;
|
||||
}
|
||||
|
||||
smf_epc_pfcp_send_bearer_modification_request(
|
||||
bearer, OGS_PFCP_MODIFY_CREATE);
|
||||
ogs_assert(OGS_OK ==
|
||||
smf_epc_pfcp_send_bearer_modification_request(
|
||||
bearer, OGS_PFCP_MODIFY_CREATE));
|
||||
|
||||
} else {
|
||||
ogs_gtp_tft_t tft;
|
||||
|
@ -595,8 +599,9 @@ void smf_qos_flow_binding(smf_sess_t *sess, ogs_sbi_stream_t *stream)
|
|||
qer->gbr.downlink = qos_flow->qos.gbr.downlink;
|
||||
}
|
||||
|
||||
smf_5gc_pfcp_send_qos_flow_modification_request(
|
||||
qos_flow, NULL, OGS_PFCP_MODIFY_CREATE);
|
||||
ogs_assert(OGS_OK ==
|
||||
smf_5gc_pfcp_send_qos_flow_modification_request(
|
||||
qos_flow, NULL, OGS_PFCP_MODIFY_CREATE));
|
||||
|
||||
} else {
|
||||
ogs_fatal("Update Qos Flow Not Implemented");
|
||||
|
|
|
@ -231,8 +231,9 @@ void smf_gsm_state_operational(ogs_fsm_t *s, smf_event_t *e)
|
|||
break;
|
||||
|
||||
case OGS_NAS_5GS_PDU_SESSION_RELEASE_REQUEST:
|
||||
smf_5gc_pfcp_send_session_deletion_request(
|
||||
sess, stream, OGS_PFCP_DELETE_TRIGGER_UE_REQUESTED);
|
||||
ogs_assert(OGS_OK ==
|
||||
smf_5gc_pfcp_send_session_deletion_request(
|
||||
sess, stream, OGS_PFCP_DELETE_TRIGGER_UE_REQUESTED));
|
||||
break;
|
||||
|
||||
case OGS_NAS_5GS_PDU_SESSION_RELEASE_COMPLETE:
|
||||
|
|
|
@ -273,7 +273,7 @@ void smf_gtp_close(void)
|
|||
ogs_socknode_remove_all(&ogs_gtp_self()->gtpu_list);
|
||||
}
|
||||
|
||||
void smf_gtp_send_create_session_response(
|
||||
int smf_gtp_send_create_session_response(
|
||||
smf_sess_t *sess, ogs_gtp_xact_t *xact)
|
||||
{
|
||||
int rv;
|
||||
|
@ -288,16 +288,18 @@ void smf_gtp_send_create_session_response(
|
|||
h.teid = sess->sgw_s5c_teid;
|
||||
|
||||
pkbuf = smf_s5c_build_create_session_response(h.type, sess);
|
||||
ogs_expect_or_return(pkbuf);
|
||||
ogs_expect_or_return_val(pkbuf, OGS_ERROR);
|
||||
|
||||
rv = ogs_gtp_xact_update_tx(xact, &h, pkbuf);
|
||||
ogs_expect_or_return(rv == OGS_OK);
|
||||
ogs_expect_or_return_val(rv == OGS_OK, OGS_ERROR);
|
||||
|
||||
rv = ogs_gtp_xact_commit(xact);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void smf_gtp_send_delete_session_response(
|
||||
int smf_gtp_send_delete_session_response(
|
||||
smf_sess_t *sess, ogs_gtp_xact_t *xact)
|
||||
{
|
||||
int rv;
|
||||
|
@ -312,13 +314,15 @@ void smf_gtp_send_delete_session_response(
|
|||
h.teid = sess->sgw_s5c_teid;
|
||||
|
||||
pkbuf = smf_s5c_build_delete_session_response(h.type, sess);
|
||||
ogs_expect_or_return(pkbuf);
|
||||
ogs_expect_or_return_val(pkbuf, OGS_ERROR);
|
||||
|
||||
rv = ogs_gtp_xact_update_tx(xact, &h, pkbuf);
|
||||
ogs_expect_or_return(rv == OGS_OK);
|
||||
ogs_expect_or_return_val(rv == OGS_OK, OGS_ERROR);
|
||||
|
||||
rv = ogs_gtp_xact_commit(xact);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
static bool check_if_router_solicit(ogs_pkbuf_t *pkbuf)
|
||||
|
@ -442,4 +446,4 @@ static void send_router_advertisement(smf_sess_t *sess, uint8_t *ip6_dst)
|
|||
}
|
||||
|
||||
ogs_pkbuf_free(pkbuf);
|
||||
}
|
||||
}
|
|
@ -29,9 +29,9 @@ extern "C" {
|
|||
int smf_gtp_open(void);
|
||||
void smf_gtp_close(void);
|
||||
|
||||
void smf_gtp_send_create_session_response(
|
||||
int smf_gtp_send_create_session_response(
|
||||
smf_sess_t *sess, ogs_gtp_xact_t *xact);
|
||||
void smf_gtp_send_delete_session_response(
|
||||
int smf_gtp_send_delete_session_response(
|
||||
smf_sess_t *sess, ogs_gtp_xact_t *xact);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
|
@ -248,7 +248,8 @@ void smf_gx_handle_cca_initial_request(
|
|||
ogs_pfcp_pdr_associate_qer(ul_pdr, qer);
|
||||
}
|
||||
|
||||
smf_epc_pfcp_send_session_establishment_request(sess, gtp_xact);
|
||||
ogs_assert(OGS_OK ==
|
||||
smf_epc_pfcp_send_session_establishment_request(sess, gtp_xact));
|
||||
}
|
||||
|
||||
void smf_gx_handle_cca_termination_request(
|
||||
|
@ -263,7 +264,8 @@ void smf_gx_handle_cca_termination_request(
|
|||
ogs_debug(" SGW_S5C_TEID[0x%x] SMF_N4_TEID[0x%x]",
|
||||
sess->sgw_s5c_teid, sess->smf_n4_teid);
|
||||
|
||||
smf_epc_pfcp_send_session_deletion_request(sess, gtp_xact);
|
||||
ogs_assert(OGS_OK ==
|
||||
smf_epc_pfcp_send_session_deletion_request(sess, gtp_xact));
|
||||
}
|
||||
|
||||
void smf_gx_handle_re_auth_request(
|
||||
|
|
|
@ -208,44 +208,6 @@ ogs_pkbuf_t *smf_n4_build_session_modification_request(
|
|||
|
||||
}
|
||||
|
||||
#if 0
|
||||
i = 0;
|
||||
ogs_list_for_each(&sess->bearer_list, qos_flow) {
|
||||
if (modify_flags & OGS_PFCP_MODIFY_ACTIVATE) {
|
||||
|
||||
/* Update FAR - Only DL */
|
||||
if (qos_flow->dl_far) {
|
||||
if (qos_flow->dl_far->apply_action &
|
||||
OGS_PFCP_APPLY_ACTION_FORW) {
|
||||
|
||||
if (modify_flags & OGS_PFCP_MODIFY_END_MARKER) {
|
||||
qos_flow->dl_far->
|
||||
smreq_flags.send_end_marker_packets = 1;
|
||||
}
|
||||
|
||||
ogs_fatal("FAR = %d", qos_flow->dl_far->id);
|
||||
|
||||
ogs_pfcp_build_update_far_activate(
|
||||
&req->update_far[i], i, qos_flow->dl_far);
|
||||
|
||||
/* Clear all FAR flags */
|
||||
qos_flow->dl_far->smreq_flags.value = 0;
|
||||
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
} else if (modify_flags & OGS_PFCP_MODIFY_DEACTIVATE) {
|
||||
if (qos_flow->dl_far) {
|
||||
ogs_pfcp_build_update_far_deactivate(
|
||||
&req->update_far[i], i, qos_flow->dl_far);
|
||||
ogs_error("FAR = %d", qos_flow->dl_far->id);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
pfcp_message.h.type = type;
|
||||
pkbuf = ogs_pfcp_build_msg(&pfcp_message);
|
||||
|
||||
|
|
|
@ -339,10 +339,11 @@ void smf_5gc_n4_handle_session_modification_response(
|
|||
} else if (flags & OGS_PFCP_MODIFY_N2_HANDOVER) {
|
||||
|
||||
if (smf_sess_have_indirect_data_forwarding(sess) == true) {
|
||||
smf_5gc_pfcp_send_session_modification_request(
|
||||
ogs_assert(OGS_OK ==
|
||||
smf_5gc_pfcp_send_session_modification_request(
|
||||
sess, stream,
|
||||
OGS_PFCP_MODIFY_INDIRECT|OGS_PFCP_MODIFY_REMOVE,
|
||||
ogs_app()->time.handover.duration);
|
||||
ogs_app()->time.handover.duration));
|
||||
}
|
||||
|
||||
smf_sbi_send_sm_context_updated_data_ho_state(
|
||||
|
@ -392,10 +393,11 @@ void smf_5gc_n4_handle_session_modification_response(
|
|||
if (flags & OGS_PFCP_MODIFY_CREATE) {
|
||||
smf_sess_create_indirect_data_forwarding(sess);
|
||||
|
||||
smf_5gc_pfcp_send_session_modification_request(
|
||||
ogs_assert(OGS_OK ==
|
||||
smf_5gc_pfcp_send_session_modification_request(
|
||||
sess, stream,
|
||||
OGS_PFCP_MODIFY_INDIRECT|OGS_PFCP_MODIFY_CREATE,
|
||||
0);
|
||||
0));
|
||||
} else if (flags & OGS_PFCP_MODIFY_HANDOVER_CANCEL) {
|
||||
smf_sbi_send_sm_context_updated_data_ho_state(
|
||||
sess, stream, OpenAPI_ho_state_CANCELLED);
|
||||
|
@ -621,7 +623,8 @@ void smf_epc_n4_handle_session_establishment_response(
|
|||
ogs_assert(up_f_seid);
|
||||
sess->upf_n4_seid = be64toh(up_f_seid->seid);
|
||||
|
||||
smf_gtp_send_create_session_response(sess, gtp_xact);
|
||||
ogs_assert(OGS_OK ==
|
||||
smf_gtp_send_create_session_response(sess, gtp_xact));
|
||||
|
||||
smf_bearer_binding(sess);
|
||||
}
|
||||
|
@ -758,7 +761,8 @@ void smf_epc_n4_handle_session_deletion_response(
|
|||
|
||||
ogs_assert(sess);
|
||||
|
||||
smf_gtp_send_delete_session_response(sess, gtp_xact);
|
||||
ogs_assert(OGS_OK ==
|
||||
smf_gtp_send_delete_session_response(sess, gtp_xact));
|
||||
|
||||
SMF_SESS_CLEAR(sess);
|
||||
}
|
||||
|
@ -862,8 +866,9 @@ void smf_n4_handle_session_report_request(
|
|||
cause_value, 0);
|
||||
}
|
||||
|
||||
smf_pfcp_send_session_report_response(
|
||||
pfcp_xact, sess, OGS_PFCP_CAUSE_REQUEST_ACCEPTED);
|
||||
ogs_assert(OGS_OK ==
|
||||
smf_pfcp_send_session_report_response(
|
||||
pfcp_xact, sess, OGS_PFCP_CAUSE_REQUEST_ACCEPTED));
|
||||
|
||||
if (sess->paging.ue_requested_pdu_session_establishment_done == true) {
|
||||
smf_n1_n2_message_transfer_param_t param;
|
||||
|
@ -885,23 +890,26 @@ void smf_n4_handle_session_report_request(
|
|||
smf_sess_t *error_indication_session = NULL;
|
||||
ogs_assert(smf_ue);
|
||||
|
||||
smf_pfcp_send_session_report_response(
|
||||
pfcp_xact, sess, OGS_PFCP_CAUSE_REQUEST_ACCEPTED);
|
||||
ogs_assert(OGS_OK ==
|
||||
smf_pfcp_send_session_report_response(
|
||||
pfcp_xact, sess, OGS_PFCP_CAUSE_REQUEST_ACCEPTED));
|
||||
|
||||
error_indication_session = smf_sess_find_by_error_indication_report(
|
||||
smf_ue, &pfcp_req->error_indication_report);
|
||||
|
||||
if (!error_indication_session) return;
|
||||
|
||||
smf_5gc_pfcp_send_session_modification_request(
|
||||
ogs_assert(OGS_OK ==
|
||||
smf_5gc_pfcp_send_session_modification_request(
|
||||
error_indication_session, NULL,
|
||||
OGS_PFCP_MODIFY_DL_ONLY|OGS_PFCP_MODIFY_DEACTIVATE|
|
||||
OGS_PFCP_MODIFY_ERROR_INDICATION,
|
||||
0);
|
||||
0));
|
||||
|
||||
} else {
|
||||
ogs_error("Not supported Report Type[%d]", report_type.value);
|
||||
smf_pfcp_send_session_report_response(
|
||||
pfcp_xact, sess, OGS_PFCP_CAUSE_SYSTEM_FAILURE);
|
||||
ogs_assert(OGS_OK ==
|
||||
smf_pfcp_send_session_report_response(
|
||||
pfcp_xact, sess, OGS_PFCP_CAUSE_SYSTEM_FAILURE));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -138,9 +138,10 @@ int ngap_handle_pdu_session_resource_setup_response_transfer(
|
|||
}
|
||||
|
||||
if (far_update) {
|
||||
smf_5gc_pfcp_send_session_modification_request(
|
||||
ogs_assert(OGS_OK ==
|
||||
smf_5gc_pfcp_send_session_modification_request(
|
||||
sess, stream, OGS_PFCP_MODIFY_DL_ONLY|OGS_PFCP_MODIFY_ACTIVATE,
|
||||
0);
|
||||
0));
|
||||
} else {
|
||||
/* ACTIVATED Is NOT Included in RESPONSE */
|
||||
smf_sbi_send_http_status_no_content(stream);
|
||||
|
@ -223,8 +224,9 @@ int ngap_handle_pdu_session_resource_modify_response_transfer(
|
|||
&dl_far->outer_header_creation_len);
|
||||
dl_far->outer_header_creation.teid = sess->gnb_n3_teid;
|
||||
|
||||
smf_5gc_pfcp_send_qos_flow_modification_request(
|
||||
qos_flow, stream, OGS_PFCP_MODIFY_ACTIVATE);
|
||||
ogs_assert(OGS_OK ==
|
||||
smf_5gc_pfcp_send_qos_flow_modification_request(
|
||||
qos_flow, stream, OGS_PFCP_MODIFY_ACTIVATE));
|
||||
|
||||
rv = OGS_OK;
|
||||
|
||||
|
@ -341,11 +343,12 @@ int ngap_handle_path_switch_request_transfer(
|
|||
}
|
||||
|
||||
if (far_update) {
|
||||
smf_5gc_pfcp_send_session_modification_request(
|
||||
ogs_assert(OGS_OK ==
|
||||
smf_5gc_pfcp_send_session_modification_request(
|
||||
sess, stream,
|
||||
OGS_PFCP_MODIFY_DL_ONLY|OGS_PFCP_MODIFY_ACTIVATE|
|
||||
OGS_PFCP_MODIFY_XN_HANDOVER|OGS_PFCP_MODIFY_END_MARKER,
|
||||
0);
|
||||
0));
|
||||
} else {
|
||||
/* ACTIVATED Is NOT Included in RESPONSE */
|
||||
smf_sbi_send_http_status_no_content(stream);
|
||||
|
@ -534,7 +537,8 @@ int ngap_handle_handover_request_ack(
|
|||
ogs_error("We found redundant INDIRECT Tunnel");
|
||||
ogs_error("It will be automatically removed");
|
||||
|
||||
smf_5gc_pfcp_send_session_modification_request(
|
||||
ogs_assert(OGS_OK ==
|
||||
smf_5gc_pfcp_send_session_modification_request(
|
||||
sess, stream,
|
||||
OGS_PFCP_MODIFY_INDIRECT|
|
||||
/*
|
||||
|
@ -550,15 +554,16 @@ int ngap_handle_handover_request_ack(
|
|||
* ...
|
||||
*/
|
||||
OGS_PFCP_MODIFY_REMOVE|OGS_PFCP_MODIFY_CREATE,
|
||||
0);
|
||||
0));
|
||||
} else {
|
||||
|
||||
smf_sess_create_indirect_data_forwarding(sess);
|
||||
|
||||
smf_5gc_pfcp_send_session_modification_request(
|
||||
ogs_assert(OGS_OK ==
|
||||
smf_5gc_pfcp_send_session_modification_request(
|
||||
sess, stream,
|
||||
OGS_PFCP_MODIFY_INDIRECT|OGS_PFCP_MODIFY_CREATE,
|
||||
0);
|
||||
0));
|
||||
}
|
||||
} else {
|
||||
ogs_pkbuf_t *n2smbuf = ngap_build_handover_command_transfer(sess);
|
||||
|
|
|
@ -40,4 +40,4 @@ void ngap_send_to_n2sm(smf_sess_t *sess,
|
|||
ogs_pkbuf_free(e->pkbuf);
|
||||
smf_event_free(e);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -487,7 +487,8 @@ bool smf_npcf_smpolicycontrol_handle_create(
|
|||
cp2up_pdr->precedence = OGS_PFCP_CP2UP_PDR_PRECEDENCE;
|
||||
up2cp_pdr->precedence = OGS_PFCP_UP2CP_PDR_PRECEDENCE;
|
||||
|
||||
smf_5gc_pfcp_send_session_establishment_request(sess, stream);
|
||||
ogs_assert(OGS_OK ==
|
||||
smf_5gc_pfcp_send_session_establishment_request(sess, stream));
|
||||
|
||||
return true;
|
||||
|
||||
|
|
|
@ -347,10 +347,11 @@ bool smf_nsmf_handle_update_sm_context(
|
|||
/*********************************************************
|
||||
* Handle DEACTIVATED
|
||||
********************************************************/
|
||||
smf_5gc_pfcp_send_session_modification_request(
|
||||
ogs_assert(OGS_OK ==
|
||||
smf_5gc_pfcp_send_session_modification_request(
|
||||
sess, stream,
|
||||
OGS_PFCP_MODIFY_DL_ONLY|OGS_PFCP_MODIFY_DEACTIVATE,
|
||||
0);
|
||||
0));
|
||||
|
||||
} else if (SmContextUpdateData->up_cnx_state ==
|
||||
OpenAPI_up_cnx_state_ACTIVATING) {
|
||||
|
@ -481,11 +482,12 @@ bool smf_nsmf_handle_update_sm_context(
|
|||
}
|
||||
|
||||
if (far_update) {
|
||||
smf_5gc_pfcp_send_session_modification_request(
|
||||
ogs_assert(OGS_OK ==
|
||||
smf_5gc_pfcp_send_session_modification_request(
|
||||
sess, stream,
|
||||
OGS_PFCP_MODIFY_DL_ONLY|OGS_PFCP_MODIFY_ACTIVATE|
|
||||
OGS_PFCP_MODIFY_N2_HANDOVER|OGS_PFCP_MODIFY_END_MARKER,
|
||||
0);
|
||||
0));
|
||||
} else {
|
||||
char *strerror = ogs_msprintf(
|
||||
"[%s:%d] No FAR Update", smf_ue->supi, sess->psi);
|
||||
|
@ -513,11 +515,12 @@ bool smf_nsmf_handle_update_sm_context(
|
|||
}
|
||||
|
||||
if (smf_sess_have_indirect_data_forwarding(sess) == true) {
|
||||
smf_5gc_pfcp_send_session_modification_request(
|
||||
ogs_assert(OGS_OK ==
|
||||
smf_5gc_pfcp_send_session_modification_request(
|
||||
sess, stream,
|
||||
OGS_PFCP_MODIFY_INDIRECT|OGS_PFCP_MODIFY_REMOVE|
|
||||
OGS_PFCP_MODIFY_HANDOVER_CANCEL,
|
||||
0);
|
||||
0));
|
||||
} else {
|
||||
smf_sbi_send_sm_context_updated_data_ho_state(
|
||||
sess, stream, OpenAPI_ho_state_CANCELLED);
|
||||
|
@ -536,8 +539,9 @@ bool smf_nsmf_handle_update_sm_context(
|
|||
return false;
|
||||
}
|
||||
} else if (SmContextUpdateData->release) {
|
||||
smf_5gc_pfcp_send_session_deletion_request(sess, stream,
|
||||
OGS_PFCP_DELETE_TRIGGER_AMF_UPDATE_SM_CONTEXT);
|
||||
ogs_assert(OGS_OK ==
|
||||
smf_5gc_pfcp_send_session_deletion_request(sess, stream,
|
||||
OGS_PFCP_DELETE_TRIGGER_AMF_UPDATE_SM_CONTEXT));
|
||||
} else {
|
||||
ogs_error("[%s:%d] No UpdateData", smf_ue->supi, sess->psi);
|
||||
smf_sbi_send_sm_context_update_error(stream,
|
||||
|
@ -585,8 +589,9 @@ bool smf_nsmf_handle_release_sm_context(
|
|||
}
|
||||
}
|
||||
|
||||
smf_5gc_pfcp_send_session_deletion_request(sess, stream,
|
||||
OGS_PFCP_DELETE_TRIGGER_AMF_RELEASE_SM_CONTEXT);
|
||||
ogs_assert(OGS_OK ==
|
||||
smf_5gc_pfcp_send_session_deletion_request(sess, stream,
|
||||
OGS_PFCP_DELETE_TRIGGER_AMF_RELEASE_SM_CONTEXT));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -290,7 +290,7 @@ static void bearer_epc_timeout(ogs_pfcp_xact_t *xact, void *data)
|
|||
}
|
||||
}
|
||||
|
||||
void smf_5gc_pfcp_send_session_establishment_request(
|
||||
int smf_5gc_pfcp_send_session_establishment_request(
|
||||
smf_sess_t *sess, ogs_sbi_stream_t *stream)
|
||||
{
|
||||
int rv;
|
||||
|
@ -306,18 +306,20 @@ void smf_5gc_pfcp_send_session_establishment_request(
|
|||
h.seid = sess->upf_n4_seid;
|
||||
|
||||
n4buf = smf_n4_build_session_establishment_request(h.type, sess);
|
||||
ogs_expect_or_return(n4buf);
|
||||
ogs_expect_or_return_val(n4buf, OGS_ERROR);
|
||||
|
||||
xact = ogs_pfcp_xact_local_create(
|
||||
sess->pfcp_node, &h, n4buf, sess_5gc_timeout, sess);
|
||||
ogs_expect_or_return(xact);
|
||||
ogs_expect_or_return_val(xact, OGS_ERROR);
|
||||
xact->assoc_stream = stream;
|
||||
|
||||
rv = ogs_pfcp_xact_commit(xact);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void smf_5gc_pfcp_send_session_modification_request(
|
||||
int smf_5gc_pfcp_send_session_modification_request(
|
||||
smf_sess_t *sess, ogs_sbi_stream_t *stream,
|
||||
uint64_t flags, ogs_time_t duration)
|
||||
{
|
||||
|
@ -335,23 +337,27 @@ void smf_5gc_pfcp_send_session_modification_request(
|
|||
h.seid = sess->upf_n4_seid;
|
||||
|
||||
n4buf = smf_n4_build_session_modification_request(h.type, sess, flags);
|
||||
ogs_expect_or_return(n4buf);
|
||||
ogs_expect_or_return_val(n4buf, OGS_ERROR);
|
||||
|
||||
xact = ogs_pfcp_xact_local_create(
|
||||
sess->pfcp_node, &h, n4buf, sess_5gc_timeout, sess);
|
||||
ogs_expect_or_return(xact);
|
||||
ogs_expect_or_return_val(xact, OGS_ERROR);
|
||||
xact->assoc_stream = stream;
|
||||
xact->modify_flags = flags | OGS_PFCP_MODIFY_SESSION;
|
||||
|
||||
if (duration) {
|
||||
ogs_pfcp_xact_delayed_commit(xact, duration);
|
||||
|
||||
return OGS_OK;
|
||||
} else {
|
||||
rv = ogs_pfcp_xact_commit(xact);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
}
|
||||
|
||||
void smf_5gc_pfcp_send_qos_flow_modification_request(smf_bearer_t *qos_flow,
|
||||
int smf_5gc_pfcp_send_qos_flow_modification_request(smf_bearer_t *qos_flow,
|
||||
ogs_sbi_stream_t *stream, uint64_t flags)
|
||||
{
|
||||
int rv;
|
||||
|
@ -369,20 +375,22 @@ void smf_5gc_pfcp_send_qos_flow_modification_request(smf_bearer_t *qos_flow,
|
|||
h.seid = sess->upf_n4_seid;
|
||||
|
||||
n4buf = smf_n4_build_qos_flow_modification_request(h.type, qos_flow, flags);
|
||||
ogs_expect_or_return(n4buf);
|
||||
ogs_expect_or_return_val(n4buf, OGS_ERROR);
|
||||
|
||||
xact = ogs_pfcp_xact_local_create(
|
||||
sess->pfcp_node, &h, n4buf, qos_flow_5gc_timeout, qos_flow);
|
||||
ogs_expect_or_return(xact);
|
||||
ogs_expect_or_return_val(xact, OGS_ERROR);
|
||||
|
||||
xact->assoc_stream = stream;
|
||||
xact->modify_flags = flags;
|
||||
|
||||
rv = ogs_pfcp_xact_commit(xact);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void smf_5gc_pfcp_send_session_deletion_request(
|
||||
int smf_5gc_pfcp_send_session_deletion_request(
|
||||
smf_sess_t *sess, ogs_sbi_stream_t *stream, int trigger)
|
||||
{
|
||||
int rv;
|
||||
|
@ -399,19 +407,21 @@ void smf_5gc_pfcp_send_session_deletion_request(
|
|||
h.seid = sess->upf_n4_seid;
|
||||
|
||||
n4buf = smf_n4_build_session_deletion_request(h.type, sess);
|
||||
ogs_expect_or_return(n4buf);
|
||||
ogs_expect_or_return_val(n4buf, OGS_ERROR);
|
||||
|
||||
xact = ogs_pfcp_xact_local_create(
|
||||
sess->pfcp_node, &h, n4buf, sess_5gc_timeout, sess);
|
||||
ogs_expect_or_return(xact);
|
||||
ogs_expect_or_return_val(xact, OGS_ERROR);
|
||||
xact->assoc_stream = stream;
|
||||
xact->delete_trigger = trigger;
|
||||
|
||||
rv = ogs_pfcp_xact_commit(xact);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void smf_epc_pfcp_send_session_establishment_request(
|
||||
int smf_epc_pfcp_send_session_establishment_request(
|
||||
smf_sess_t *sess, void *gtp_xact)
|
||||
{
|
||||
int rv;
|
||||
|
@ -426,20 +436,22 @@ void smf_epc_pfcp_send_session_establishment_request(
|
|||
h.seid = sess->upf_n4_seid;
|
||||
|
||||
n4buf = smf_n4_build_session_establishment_request(h.type, sess);
|
||||
ogs_expect_or_return(n4buf);
|
||||
ogs_expect_or_return_val(n4buf, OGS_ERROR);
|
||||
|
||||
xact = ogs_pfcp_xact_local_create(
|
||||
sess->pfcp_node, &h, n4buf, sess_epc_timeout, sess);
|
||||
ogs_expect_or_return(xact);
|
||||
ogs_expect_or_return_val(xact, OGS_ERROR);
|
||||
|
||||
xact->epc = true; /* EPC PFCP transaction */
|
||||
xact->assoc_xact = gtp_xact;
|
||||
|
||||
rv = ogs_pfcp_xact_commit(xact);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void smf_epc_pfcp_send_bearer_modification_request(
|
||||
int smf_epc_pfcp_send_bearer_modification_request(
|
||||
smf_bearer_t *bearer, uint64_t flags)
|
||||
{
|
||||
int rv;
|
||||
|
@ -457,20 +469,22 @@ void smf_epc_pfcp_send_bearer_modification_request(
|
|||
h.seid = sess->upf_n4_seid;
|
||||
|
||||
n4buf = smf_n4_build_qos_flow_modification_request(h.type, bearer, flags);
|
||||
ogs_expect_or_return(n4buf);
|
||||
ogs_expect_or_return_val(n4buf, OGS_ERROR);
|
||||
|
||||
xact = ogs_pfcp_xact_local_create(
|
||||
sess->pfcp_node, &h, n4buf, bearer_epc_timeout, bearer);
|
||||
ogs_expect_or_return(xact);
|
||||
ogs_expect_or_return_val(xact, OGS_ERROR);
|
||||
|
||||
xact->epc = true; /* EPC PFCP transaction */
|
||||
xact->modify_flags = flags;
|
||||
|
||||
rv = ogs_pfcp_xact_commit(xact);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void smf_epc_pfcp_send_session_deletion_request(
|
||||
int smf_epc_pfcp_send_session_deletion_request(
|
||||
smf_sess_t *sess, void *gtp_xact)
|
||||
{
|
||||
int rv;
|
||||
|
@ -485,20 +499,22 @@ void smf_epc_pfcp_send_session_deletion_request(
|
|||
h.seid = sess->upf_n4_seid;
|
||||
|
||||
n4buf = smf_n4_build_session_deletion_request(h.type, sess);
|
||||
ogs_expect_or_return(n4buf);
|
||||
ogs_expect_or_return_val(n4buf, OGS_ERROR);
|
||||
|
||||
xact = ogs_pfcp_xact_local_create(
|
||||
sess->pfcp_node, &h, n4buf, sess_epc_timeout, sess);
|
||||
ogs_expect_or_return(xact);
|
||||
ogs_expect_or_return_val(xact, OGS_ERROR);
|
||||
|
||||
xact->epc = true; /* EPC PFCP transaction */
|
||||
xact->assoc_xact = gtp_xact;
|
||||
|
||||
rv = ogs_pfcp_xact_commit(xact);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void smf_pfcp_send_session_report_response(
|
||||
int smf_pfcp_send_session_report_response(
|
||||
ogs_pfcp_xact_t *xact, smf_sess_t *sess, uint8_t cause)
|
||||
{
|
||||
int rv;
|
||||
|
@ -512,11 +528,13 @@ void smf_pfcp_send_session_report_response(
|
|||
h.seid = sess->upf_n4_seid;
|
||||
|
||||
sxabuf = ogs_pfcp_build_session_report_response(h.type, cause);
|
||||
ogs_expect_or_return(sxabuf);
|
||||
ogs_expect_or_return_val(sxabuf, OGS_ERROR);
|
||||
|
||||
rv = ogs_pfcp_xact_update_tx(xact, &h, sxabuf);
|
||||
ogs_expect_or_return(rv == OGS_OK);
|
||||
ogs_expect_or_return_val(rv == OGS_OK, OGS_ERROR);
|
||||
|
||||
rv = ogs_pfcp_xact_commit(xact);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
|
|
@ -29,24 +29,24 @@ extern "C" {
|
|||
int smf_pfcp_open(void);
|
||||
void smf_pfcp_close(void);
|
||||
|
||||
void smf_5gc_pfcp_send_session_establishment_request(
|
||||
int smf_5gc_pfcp_send_session_establishment_request(
|
||||
smf_sess_t *sess, ogs_sbi_stream_t *stream);
|
||||
void smf_5gc_pfcp_send_session_modification_request(
|
||||
int smf_5gc_pfcp_send_session_modification_request(
|
||||
smf_sess_t *sess, ogs_sbi_stream_t *stream,
|
||||
uint64_t flags, ogs_time_t duration);
|
||||
void smf_5gc_pfcp_send_qos_flow_modification_request(smf_bearer_t *qos_flow,
|
||||
int smf_5gc_pfcp_send_qos_flow_modification_request(smf_bearer_t *qos_flow,
|
||||
ogs_sbi_stream_t *stream, uint64_t flags);
|
||||
void smf_5gc_pfcp_send_session_deletion_request(
|
||||
int smf_5gc_pfcp_send_session_deletion_request(
|
||||
smf_sess_t *sess, ogs_sbi_stream_t *stream, int trigger);
|
||||
|
||||
void smf_epc_pfcp_send_session_establishment_request(
|
||||
int smf_epc_pfcp_send_session_establishment_request(
|
||||
smf_sess_t *sess, void *gtp_xact);
|
||||
void smf_epc_pfcp_send_bearer_modification_request(
|
||||
int smf_epc_pfcp_send_bearer_modification_request(
|
||||
smf_bearer_t *bearer, uint64_t flags);
|
||||
void smf_epc_pfcp_send_session_deletion_request(
|
||||
int smf_epc_pfcp_send_session_deletion_request(
|
||||
smf_sess_t *sess, void *gtp_xact);
|
||||
|
||||
void smf_pfcp_send_session_report_response(
|
||||
int smf_pfcp_send_session_report_response(
|
||||
ogs_pfcp_xact_t *xact, smf_sess_t *sess, uint8_t cause);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
|
@ -344,8 +344,9 @@ void smf_s5c_handle_create_bearer_response(
|
|||
}
|
||||
|
||||
if (cause_value != OGS_GTP_CAUSE_REQUEST_ACCEPTED) {
|
||||
smf_epc_pfcp_send_bearer_modification_request(
|
||||
bearer, OGS_PFCP_MODIFY_REMOVE);
|
||||
ogs_assert(OGS_OK ==
|
||||
smf_epc_pfcp_send_bearer_modification_request(
|
||||
bearer, OGS_PFCP_MODIFY_REMOVE));
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -380,8 +381,9 @@ void smf_s5c_handle_create_bearer_response(
|
|||
&dl_far->outer_header_creation, &dl_far->outer_header_creation_len);
|
||||
dl_far->outer_header_creation.teid = bearer->sgw_s5u_teid;
|
||||
|
||||
smf_epc_pfcp_send_bearer_modification_request(
|
||||
bearer, OGS_PFCP_MODIFY_ACTIVATE);
|
||||
ogs_assert(OGS_OK ==
|
||||
smf_epc_pfcp_send_bearer_modification_request(
|
||||
bearer, OGS_PFCP_MODIFY_ACTIVATE));
|
||||
}
|
||||
|
||||
void smf_s5c_handle_update_bearer_response(
|
||||
|
@ -506,7 +508,8 @@ void smf_s5c_handle_update_bearer_response(
|
|||
}
|
||||
|
||||
if (pfcp_flags)
|
||||
smf_epc_pfcp_send_bearer_modification_request(bearer, pfcp_flags);
|
||||
ogs_assert(OGS_OK ==
|
||||
smf_epc_pfcp_send_bearer_modification_request(bearer, pfcp_flags));
|
||||
}
|
||||
|
||||
void smf_s5c_handle_delete_bearer_response(
|
||||
|
@ -577,8 +580,9 @@ void smf_s5c_handle_delete_bearer_response(
|
|||
ogs_debug("Delete Bearer Response : SGW[0x%x] --> SMF[0x%x]",
|
||||
sess->sgw_s5c_teid, sess->smf_n4_teid);
|
||||
|
||||
smf_epc_pfcp_send_bearer_modification_request(
|
||||
bearer, OGS_PFCP_MODIFY_REMOVE);
|
||||
ogs_assert(OGS_OK ==
|
||||
smf_epc_pfcp_send_bearer_modification_request(
|
||||
bearer, OGS_PFCP_MODIFY_REMOVE));
|
||||
}
|
||||
|
||||
static int reconfigure_packet_filter(smf_pf_t *pf, ogs_gtp_tft_t *tft, int i)
|
||||
|
|
|
@ -119,7 +119,8 @@ static void _gtpv1_tun_recv_cb(short when, ogs_socket_t fd, void *data)
|
|||
if (pdr->qer && pdr->qer->qfi)
|
||||
report.downlink_data.qfi = pdr->qer->qfi; /* for 5GC */
|
||||
|
||||
upf_pfcp_send_session_report_request(sess, &report);
|
||||
ogs_assert(OGS_OK ==
|
||||
upf_pfcp_send_session_report_request(sess, &report));
|
||||
}
|
||||
|
||||
cleanup:
|
||||
|
@ -243,7 +244,8 @@ static void _gtpv1_u_recv_cb(short when, ogs_socket_t fd, void *data)
|
|||
sess = UPF_SESS(far->sess);
|
||||
ogs_assert(sess);
|
||||
|
||||
upf_pfcp_send_session_report_request(sess, &report);
|
||||
ogs_assert(OGS_OK ==
|
||||
upf_pfcp_send_session_report_request(sess, &report));
|
||||
}
|
||||
|
||||
} else {
|
||||
|
@ -353,7 +355,8 @@ static void _gtpv1_u_recv_cb(short when, ogs_socket_t fd, void *data)
|
|||
if (pdr->qer && pdr->qer->qfi)
|
||||
report.downlink_data.qfi = pdr->qer->qfi; /* for 5GC */
|
||||
|
||||
upf_pfcp_send_session_report_request(sess, &report);
|
||||
ogs_assert(OGS_OK ==
|
||||
upf_pfcp_send_session_report_request(sess, &report));
|
||||
}
|
||||
|
||||
} else if (far->dst_if == OGS_PFCP_INTERFACE_CP_FUNCTION) {
|
||||
|
@ -530,4 +533,4 @@ static void upf_gtp_handle_multicast(ogs_pkbuf_t *recvbuf)
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -157,8 +157,9 @@ void upf_n4_handle_session_establishment_request(
|
|||
}
|
||||
}
|
||||
|
||||
upf_pfcp_send_session_establishment_response(
|
||||
xact, sess, created_pdr, num_of_created_pdr);
|
||||
ogs_assert(OGS_OK ==
|
||||
upf_pfcp_send_session_establishment_response(
|
||||
xact, sess, created_pdr, num_of_created_pdr));
|
||||
return;
|
||||
|
||||
cleanup:
|
||||
|
@ -370,8 +371,9 @@ void upf_n4_handle_session_modification_request(
|
|||
}
|
||||
}
|
||||
|
||||
upf_pfcp_send_session_modification_response(
|
||||
xact, sess, created_pdr, num_of_created_pdr);
|
||||
ogs_assert(OGS_OK ==
|
||||
upf_pfcp_send_session_modification_response(
|
||||
xact, sess, created_pdr, num_of_created_pdr));
|
||||
return;
|
||||
|
||||
cleanup:
|
||||
|
|
|
@ -165,7 +165,7 @@ void upf_pfcp_close(void)
|
|||
ogs_socknode_remove_all(&ogs_pfcp_self()->pfcp_list6);
|
||||
}
|
||||
|
||||
void upf_pfcp_send_session_establishment_response(
|
||||
int upf_pfcp_send_session_establishment_response(
|
||||
ogs_pfcp_xact_t *xact, upf_sess_t *sess,
|
||||
ogs_pfcp_pdr_t *created_pdr[], int num_of_created_pdr)
|
||||
{
|
||||
|
@ -181,16 +181,18 @@ void upf_pfcp_send_session_establishment_response(
|
|||
|
||||
n4buf = upf_n4_build_session_establishment_response(
|
||||
h.type, sess, created_pdr, num_of_created_pdr);
|
||||
ogs_expect_or_return(n4buf);
|
||||
ogs_expect_or_return_val(n4buf, OGS_ERROR);
|
||||
|
||||
rv = ogs_pfcp_xact_update_tx(xact, &h, n4buf);
|
||||
ogs_expect_or_return(rv == OGS_OK);
|
||||
ogs_expect_or_return_val(rv == OGS_OK, OGS_ERROR);
|
||||
|
||||
rv = ogs_pfcp_xact_commit(xact);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void upf_pfcp_send_session_modification_response(
|
||||
int upf_pfcp_send_session_modification_response(
|
||||
ogs_pfcp_xact_t *xact, upf_sess_t *sess,
|
||||
ogs_pfcp_pdr_t *created_pdr[], int num_of_created_pdr)
|
||||
{
|
||||
|
@ -207,16 +209,18 @@ void upf_pfcp_send_session_modification_response(
|
|||
|
||||
n4buf = upf_n4_build_session_modification_response(
|
||||
h.type, sess, created_pdr, num_of_created_pdr);
|
||||
ogs_expect_or_return(n4buf);
|
||||
ogs_expect_or_return_val(n4buf, OGS_ERROR);
|
||||
|
||||
rv = ogs_pfcp_xact_update_tx(xact, &h, n4buf);
|
||||
ogs_expect_or_return(rv == OGS_OK);
|
||||
ogs_expect_or_return_val(rv == OGS_OK, OGS_ERROR);
|
||||
|
||||
rv = ogs_pfcp_xact_commit(xact);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void upf_pfcp_send_session_deletion_response(ogs_pfcp_xact_t *xact,
|
||||
int upf_pfcp_send_session_deletion_response(ogs_pfcp_xact_t *xact,
|
||||
upf_sess_t *sess)
|
||||
{
|
||||
int rv;
|
||||
|
@ -230,13 +234,15 @@ void upf_pfcp_send_session_deletion_response(ogs_pfcp_xact_t *xact,
|
|||
h.seid = sess->smf_n4_seid;
|
||||
|
||||
n4buf = upf_n4_build_session_deletion_response(h.type, sess);
|
||||
ogs_expect_or_return(n4buf);
|
||||
ogs_expect_or_return_val(n4buf, OGS_ERROR);
|
||||
|
||||
rv = ogs_pfcp_xact_update_tx(xact, &h, n4buf);
|
||||
ogs_expect_or_return(rv == OGS_OK);
|
||||
ogs_expect_or_return_val(rv == OGS_OK, OGS_ERROR);
|
||||
|
||||
rv = ogs_pfcp_xact_commit(xact);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
static void sess_timeout(ogs_pfcp_xact_t *xact, void *data)
|
||||
|
@ -256,7 +262,7 @@ static void sess_timeout(ogs_pfcp_xact_t *xact, void *data)
|
|||
}
|
||||
}
|
||||
|
||||
void upf_pfcp_send_session_report_request(
|
||||
int upf_pfcp_send_session_report_request(
|
||||
upf_sess_t *sess, ogs_pfcp_user_plane_report_t *report)
|
||||
{
|
||||
int rv;
|
||||
|
@ -272,12 +278,14 @@ void upf_pfcp_send_session_report_request(
|
|||
h.seid = sess->smf_n4_seid;
|
||||
|
||||
n4buf = ogs_pfcp_build_session_report_request(h.type, report);
|
||||
ogs_expect_or_return(n4buf);
|
||||
ogs_expect_or_return_val(n4buf, OGS_ERROR);
|
||||
|
||||
xact = ogs_pfcp_xact_local_create(
|
||||
sess->pfcp_node, &h, n4buf, sess_timeout, sess);
|
||||
ogs_expect_or_return(xact);
|
||||
ogs_expect_or_return_val(xact, OGS_ERROR);
|
||||
|
||||
rv = ogs_pfcp_xact_commit(xact);
|
||||
ogs_expect(rv == OGS_OK);
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
|
@ -29,16 +29,16 @@ extern "C" {
|
|||
int upf_pfcp_open(void);
|
||||
void upf_pfcp_close(void);
|
||||
|
||||
void upf_pfcp_send_session_establishment_response(
|
||||
int upf_pfcp_send_session_establishment_response(
|
||||
ogs_pfcp_xact_t *xact, upf_sess_t *sess,
|
||||
ogs_pfcp_pdr_t *created_pdr[], int num_of_created_pdr);
|
||||
void upf_pfcp_send_session_modification_response(
|
||||
int upf_pfcp_send_session_modification_response(
|
||||
ogs_pfcp_xact_t *xact, upf_sess_t *sess,
|
||||
ogs_pfcp_pdr_t *created_pdr[], int num_of_created_pdr);
|
||||
void upf_pfcp_send_session_deletion_response(ogs_pfcp_xact_t *xact,
|
||||
int upf_pfcp_send_session_deletion_response(ogs_pfcp_xact_t *xact,
|
||||
upf_sess_t *sess);
|
||||
|
||||
void upf_pfcp_send_session_report_request(
|
||||
int upf_pfcp_send_session_report_request(
|
||||
upf_sess_t *sess, ogs_pfcp_user_plane_report_t *report);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
Loading…
Reference in New Issue