[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:
Sukchan Lee 2021-05-16 12:22:10 +09:00
parent dfaf2f1567
commit 873cf398c7
65 changed files with 2506 additions and 1679 deletions

View File

@ -134,6 +134,15 @@ void ogs_log_hexdump_func(ogs_log_level_e level, int domain_id,
} \ } \
} while (0) } 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 #ifdef __cplusplus
} }
#endif #endif

View File

@ -49,7 +49,7 @@ static ogs_tlv_t *tlv_add_leaf(
desc->type, 1, desc->instance, &v->u8); desc->type, 1, desc->instance, &v->u8);
else else
tlv = ogs_tlv_add(tlv, desc->type, 1, desc->instance, &v->u8); tlv = ogs_tlv_add(tlv, desc->type, 1, desc->instance, &v->u8);
ogs_assert(tlv); ogs_expect_or_return_val(tlv, NULL);
break; break;
} }
case OGS_TLV_UINT16: case OGS_TLV_UINT16:
@ -63,7 +63,7 @@ static ogs_tlv_t *tlv_add_leaf(
desc->type, 2, desc->instance, &v->u16); desc->type, 2, desc->instance, &v->u16);
else else
tlv = ogs_tlv_add(tlv, desc->type, 2, desc->instance, &v->u16); tlv = ogs_tlv_add(tlv, desc->type, 2, desc->instance, &v->u16);
ogs_assert(tlv); ogs_expect_or_return_val(tlv, NULL);
break; break;
} }
case OGS_TLV_UINT24: case OGS_TLV_UINT24:
@ -79,7 +79,7 @@ static ogs_tlv_t *tlv_add_leaf(
desc->type, 3, desc->instance, &v->u24); desc->type, 3, desc->instance, &v->u24);
else else
tlv = ogs_tlv_add(tlv, desc->type, 3, desc->instance, &v->u24); tlv = ogs_tlv_add(tlv, desc->type, 3, desc->instance, &v->u24);
ogs_assert(tlv); ogs_expect_or_return_val(tlv, NULL);
break; break;
} }
case OGS_TLV_UINT32: case OGS_TLV_UINT32:
@ -95,7 +95,7 @@ static ogs_tlv_t *tlv_add_leaf(
else else
tlv = ogs_tlv_add(tlv, tlv = ogs_tlv_add(tlv,
desc->type, 4, desc->instance, &v->u32); desc->type, 4, desc->instance, &v->u32);
ogs_assert(tlv); ogs_expect_or_return_val(tlv, NULL);
break; break;
} }
case OGS_TLV_FIXED_STR: case OGS_TLV_FIXED_STR:
@ -108,7 +108,7 @@ static ogs_tlv_t *tlv_add_leaf(
else else
tlv = ogs_tlv_add(tlv, tlv = ogs_tlv_add(tlv,
desc->type, desc->length, desc->instance, v->data); desc->type, desc->length, desc->instance, v->data);
ogs_assert(tlv); ogs_expect_or_return_val(tlv, NULL);
break; break;
} }
case OGS_TLV_VAR_STR: 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; ogs_tlv_octet_t *v = (ogs_tlv_octet_t *)msg;
if (v->len == 0) { 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); desc->name, desc->type, desc->instance, desc->vsize);
ogs_assert_if_reached(); ogs_expect_or_return_val(0, NULL);
} }
if (parent_tlv) if (parent_tlv)
@ -127,7 +127,7 @@ static ogs_tlv_t *tlv_add_leaf(
else else
tlv = ogs_tlv_add(tlv, tlv = ogs_tlv_add(tlv,
desc->type, v->len, desc->instance, v->data); desc->type, v->len, desc->instance, v->data);
ogs_assert(tlv); ogs_expect_or_return_val(tlv, NULL);
break; break;
} }
case OGS_TLV_NULL: case OGS_TLV_NULL:
@ -138,11 +138,11 @@ static ogs_tlv_t *tlv_add_leaf(
else else
tlv = ogs_tlv_add(tlv, tlv = ogs_tlv_add(tlv,
desc->type, 0, desc->instance, NULL); desc->type, 0, desc->instance, NULL);
ogs_assert(tlv); ogs_expect_or_return_val(tlv, NULL);
break; break;
} }
default: default:
ogs_assert_if_reached(); ogs_expect_or_return_val(0, NULL);
break; 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, r = tlv_add_compound(&emb_tlv, tlv, desc,
p + offset2 + sizeof(ogs_tlv_presence_t), p + offset2 + sizeof(ogs_tlv_presence_t),
depth + 1); depth + 1);
ogs_assert(r > 0 && emb_tlv); ogs_expect_or_return_val(r > 0 && emb_tlv, 0);
count += 1 + r; count += 1 + r;
} else { } else {
ogs_trace("BUILD %sL#%d [%s] T:%d L:%d I:%d " 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); p + offset2);
tlv = tlv_add_leaf(parent_tlv, tlv, desc, p + offset2); tlv = tlv_add_leaf(parent_tlv, tlv, desc, p + offset2);
ogs_assert(tlv); ogs_expect_or_return_val(tlv, 0);
count++; 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, r = tlv_add_compound(&emb_tlv, tlv, desc,
p + offset + sizeof(ogs_tlv_presence_t), p + offset + sizeof(ogs_tlv_presence_t),
depth + 1); depth + 1);
ogs_assert(r > 0 && emb_tlv); ogs_expect_or_return_val(r > 0 && emb_tlv, 0);
count += 1 + r; count += 1 + r;
} else { } else {
ogs_trace("BUILD %sL#%d [%s] T:%d L:%d I:%d " 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); p + offset);
tlv = tlv_add_leaf(parent_tlv, tlv, desc, p + offset); tlv = tlv_add_leaf(parent_tlv, tlv, desc, p + offset);
ogs_assert(tlv); ogs_expect_or_return_val(tlv, 0);
count++; 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]) { if (desc->child_descs[0]) {
r = tlv_add_compound(&root, NULL, desc, msg, 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); length = ogs_tlv_calc_length(root, mode);
} else { } else {
length = 0; length = 0;
} }
pkbuf = ogs_pkbuf_alloc(NULL, OGS_TLV_MAX_HEADROOM+length); 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_reserve(pkbuf, OGS_TLV_MAX_HEADROOM);
ogs_pkbuf_put(pkbuf, length); ogs_pkbuf_put(pkbuf, length);
if (desc->child_descs[0]) { if (desc->child_descs[0]) {
rendlen = ogs_tlv_render(root, pkbuf->data, length, mode); 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); ogs_tlv_free_all(root);
} }

View File

@ -546,8 +546,9 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e)
amf_ue = (amf_ue_t *)sbi_object; amf_ue = (amf_ue_t *)sbi_object;
ogs_assert(amf_ue); ogs_assert(amf_ue);
ogs_error("[%s] Cannot receive SBI message", amf_ue->suci); ogs_error("[%s] Cannot receive SBI message", amf_ue->suci);
nas_5gs_send_gmm_reject_from_sbi(amf_ue, ogs_assert(OGS_OK ==
OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT); nas_5gs_send_gmm_reject_from_sbi(amf_ue,
OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT));
break; break;
case OGS_SBI_OBJ_SESS_TYPE: 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", ogs_error("[%d:%d] Cannot receive SBI message",
sess->psi, sess->pti); sess->psi, sess->pti);
if (sess->payload_container_type) { if (sess->payload_container_type) {
nas_5gs_send_back_5gsm_message_from_sbi(sess, ogs_assert(OGS_OK ==
OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT); nas_5gs_send_back_5gsm_message_from_sbi(sess,
OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT));
} else { } else {
ngap_send_error_indication2(amf_ue, ogs_assert(OGS_OK ==
ngap_send_error_indication2(amf_ue,
NGAP_Cause_PR_transport, NGAP_Cause_PR_transport,
NGAP_CauseTransport_transport_resource_unavailable); NGAP_CauseTransport_transport_resource_unavailable)
);
} }
break; break;
@ -665,9 +669,10 @@ void amf_state_operational(ogs_fsm_t *s, amf_event_t *e)
ogs_fsm_dispatch(&gnb->sm, e); ogs_fsm_dispatch(&gnb->sm, e);
} else { } else {
ogs_error("Cannot decode NGAP message"); 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, 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); 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 */ /* De-associate NG with NAS/EMM */
ran_ue_deassociate(amf_ue->ran_ue); 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_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); amf_ue_associate_ran_ue(amf_ue, ran_ue);
} }

View File

@ -110,8 +110,9 @@ int gmm_handle_registration_request(amf_ue_t *amf_ue,
~OGS_REGISTRATION_CLEARTEXT_PRESENT) { ~OGS_REGISTRATION_CLEARTEXT_PRESENT) {
ogs_error("Non cleartext IEs is included [0x%llx]", ogs_error("Non cleartext IEs is included [0x%llx]",
(long long)registration_request->presencemask); (long long)registration_request->presencemask);
nas_5gs_send_registration_reject(amf_ue, ogs_assert(OGS_OK ==
OGS_5GMM_CAUSE_SEMANTICALLY_INCORRECT_MESSAGE); nas_5gs_send_registration_reject(amf_ue,
OGS_5GMM_CAUSE_SEMANTICALLY_INCORRECT_MESSAGE));
return OGS_ERROR; return OGS_ERROR;
} }
@ -119,15 +120,17 @@ int gmm_handle_registration_request(amf_ue_t *amf_ue,
(registration_request->presencemask & (registration_request->presencemask &
OGS_NAS_5GS_REGISTRATION_REQUEST_NAS_MESSAGE_CONTAINER_PRESENT)) { OGS_NAS_5GS_REGISTRATION_REQUEST_NAS_MESSAGE_CONTAINER_PRESENT)) {
ogs_error("NAS container present without Integrity-protected"); ogs_error("NAS container present without Integrity-protected");
nas_5gs_send_registration_reject(amf_ue, ogs_assert(OGS_OK ==
OGS_5GMM_CAUSE_SEMANTICALLY_INCORRECT_MESSAGE); nas_5gs_send_registration_reject(amf_ue,
OGS_5GMM_CAUSE_SEMANTICALLY_INCORRECT_MESSAGE));
return OGS_ERROR; return OGS_ERROR;
} }
if (!mobile_identity->length || !mobile_identity->buffer) { if (!mobile_identity->length || !mobile_identity->buffer) {
ogs_error("No Mobile Identity"); ogs_error("No Mobile Identity");
nas_5gs_send_registration_reject(amf_ue, ogs_assert(OGS_OK ==
OGS_5GMM_CAUSE_SEMANTICALLY_INCORRECT_MESSAGE); nas_5gs_send_registration_reject(amf_ue,
OGS_5GMM_CAUSE_SEMANTICALLY_INCORRECT_MESSAGE));
return OGS_ERROR; return OGS_ERROR;
} }
@ -142,8 +145,10 @@ int gmm_handle_registration_request(amf_ue_t *amf_ue,
OGS_NAS_5GS_NULL_SCHEME) { OGS_NAS_5GS_NULL_SCHEME) {
ogs_error("Not implemented ProtectionSchemeID(%d) in SUCI", ogs_error("Not implemented ProtectionSchemeID(%d) in SUCI",
mobile_identity_suci->protection_scheme_id); mobile_identity_suci->protection_scheme_id);
nas_5gs_send_registration_reject(amf_ue, ogs_assert(OGS_OK ==
OGS_5GMM_CAUSE_MESSAGE_TYPE_NON_EXISTENT_OR_NOT_IMPLEMENTED); nas_5gs_send_registration_reject(amf_ue,
OGS_5GMM_CAUSE_MESSAGE_TYPE_NON_EXISTENT_OR_NOT_IMPLEMENTED)
);
return OGS_ERROR; return OGS_ERROR;
} }
amf_ue_set_suci(amf_ue, mobile_identity); 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 */ /* Send Registration Reject */
ogs_warn("Cannot find Served TAI[PLMN_ID:%06x,TAC:%d]", 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); ogs_plmn_id_hexdump(&amf_ue->nr_tai.plmn_id), amf_ue->nr_tai.tac.v);
nas_5gs_send_registration_reject(amf_ue, ogs_assert(OGS_OK ==
OGS_5GMM_CAUSE_TRACKING_AREA_NOT_ALLOWED); nas_5gs_send_registration_reject(amf_ue,
OGS_5GMM_CAUSE_TRACKING_AREA_NOT_ALLOWED));
return OGS_ERROR; return OGS_ERROR;
} }
ogs_debug(" SERVED_TAI_INDEX[%d]", served_tai_index); 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, ue_security_capability->nr_ea, ue_security_capability->nr_ia,
amf_selected_enc_algorithm(amf_ue), amf_selected_enc_algorithm(amf_ue),
amf_selected_int_algorithm(amf_ue)); amf_selected_int_algorithm(amf_ue));
nas_5gs_send_registration_reject(amf_ue, ogs_assert(OGS_OK ==
OGS_5GMM_CAUSE_UE_SECURITY_CAPABILITIES_MISMATCH); nas_5gs_send_registration_reject(amf_ue,
OGS_5GMM_CAUSE_UE_SECURITY_CAPABILITIES_MISMATCH));
return OGS_ERROR; 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) { if (service_request->presencemask & ~OGS_SERVICE_CLEARTEXT_PRESENT) {
ogs_error("Non cleartext IEs is included [0x%llx]", ogs_error("Non cleartext IEs is included [0x%llx]",
(long long)service_request->presencemask); (long long)service_request->presencemask);
nas_5gs_send_service_reject(amf_ue, ogs_assert(OGS_OK ==
OGS_5GMM_CAUSE_SEMANTICALLY_INCORRECT_MESSAGE); nas_5gs_send_service_reject(amf_ue,
OGS_5GMM_CAUSE_SEMANTICALLY_INCORRECT_MESSAGE));
return OGS_ERROR; return OGS_ERROR;
} }
@ -455,8 +463,9 @@ int gmm_handle_service_request(amf_ue_t *amf_ue,
(service_request->presencemask & (service_request->presencemask &
OGS_NAS_5GS_SERVICE_REQUEST_NAS_MESSAGE_CONTAINER_PRESENT)) { OGS_NAS_5GS_SERVICE_REQUEST_NAS_MESSAGE_CONTAINER_PRESENT)) {
ogs_error("NAS container present without Integrity-protected"); ogs_error("NAS container present without Integrity-protected");
nas_5gs_send_service_reject(amf_ue, ogs_assert(OGS_OK ==
OGS_5GMM_CAUSE_SEMANTICALLY_INCORRECT_MESSAGE); nas_5gs_send_service_reject(amf_ue,
OGS_5GMM_CAUSE_SEMANTICALLY_INCORRECT_MESSAGE));
return OGS_ERROR; return OGS_ERROR;
} }
@ -514,8 +523,9 @@ int gmm_handle_service_request(amf_ue_t *amf_ue,
/* Send Registration Reject */ /* Send Registration Reject */
ogs_warn("Cannot find Served TAI[PLMN_ID:%06x,TAC:%d]", 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); ogs_plmn_id_hexdump(&amf_ue->nr_tai.plmn_id), amf_ue->nr_tai.tac.v);
nas_5gs_send_registration_reject(amf_ue, ogs_assert(OGS_OK ==
OGS_5GMM_CAUSE_TRACKING_AREA_NOT_ALLOWED); nas_5gs_send_registration_reject(amf_ue,
OGS_5GMM_CAUSE_TRACKING_AREA_NOT_ALLOWED));
return OGS_ERROR; return OGS_ERROR;
} }
ogs_debug(" SERVED_TAI_INDEX[%d]", served_tai_index); 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) 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; 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); amf_sbi_send_release_all_sessions(amf_ue, AMF_RELEASE_SM_CONTEXT_NO_STATE);
if (ogs_list_count(&amf_ue->sess_list) == 0) 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; return OGS_OK;
} }
@ -866,30 +878,34 @@ int gmm_handle_ul_nas_transport(amf_ue_t *amf_ue,
if (!payload_container_type->value) { if (!payload_container_type->value) {
ogs_error("[%s] No Payload container type", amf_ue->supi); ogs_error("[%s] No Payload container type", amf_ue->supi);
nas_5gs_send_gmm_status( ogs_assert(OGS_OK ==
amf_ue, OGS_5GMM_CAUSE_INVALID_MANDATORY_INFORMATION); nas_5gs_send_gmm_status(
amf_ue, OGS_5GMM_CAUSE_INVALID_MANDATORY_INFORMATION));
return OGS_ERROR; return OGS_ERROR;
} }
if (!payload_container->length) { if (!payload_container->length) {
ogs_error("[%s] No Payload container length", amf_ue->supi); ogs_error("[%s] No Payload container length", amf_ue->supi);
nas_5gs_send_gmm_status( ogs_assert(OGS_OK ==
amf_ue, OGS_5GMM_CAUSE_INVALID_MANDATORY_INFORMATION); nas_5gs_send_gmm_status(
amf_ue, OGS_5GMM_CAUSE_INVALID_MANDATORY_INFORMATION));
return OGS_ERROR; return OGS_ERROR;
} }
if (!payload_container->buffer) { if (!payload_container->buffer) {
ogs_error("[%s] No Payload container buffer", amf_ue->supi); ogs_error("[%s] No Payload container buffer", amf_ue->supi);
nas_5gs_send_gmm_status( ogs_assert(OGS_OK ==
amf_ue, OGS_5GMM_CAUSE_INVALID_MANDATORY_INFORMATION); nas_5gs_send_gmm_status(
amf_ue, OGS_5GMM_CAUSE_INVALID_MANDATORY_INFORMATION));
return OGS_ERROR; return OGS_ERROR;
} }
if ((ul_nas_transport->presencemask & if ((ul_nas_transport->presencemask &
OGS_NAS_5GS_UL_NAS_TRANSPORT_PDU_SESSION_ID_PRESENT) == 0) { OGS_NAS_5GS_UL_NAS_TRANSPORT_PDU_SESSION_ID_PRESENT) == 0) {
ogs_error("[%s] No PDU session ID", amf_ue->supi); ogs_error("[%s] No PDU session ID", amf_ue->supi);
nas_5gs_send_gmm_status( ogs_assert(OGS_OK ==
amf_ue, OGS_5GMM_CAUSE_INVALID_MANDATORY_INFORMATION); nas_5gs_send_gmm_status(
amf_ue, OGS_5GMM_CAUSE_INVALID_MANDATORY_INFORMATION));
return OGS_ERROR; 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) { if (*pdu_session_id == OGS_NAS_PDU_SESSION_IDENTITY_UNASSIGNED) {
ogs_error("[%s] PDU session identity is unassigned", ogs_error("[%s] PDU session identity is unassigned",
amf_ue->supi); amf_ue->supi);
nas_5gs_send_gmm_status( ogs_assert(OGS_OK ==
amf_ue, OGS_5GMM_CAUSE_INVALID_MANDATORY_INFORMATION); nas_5gs_send_gmm_status(
amf_ue, OGS_5GMM_CAUSE_INVALID_MANDATORY_INFORMATION));
return OGS_ERROR; return OGS_ERROR;
} }
@ -924,8 +941,9 @@ int gmm_handle_ul_nas_transport(amf_ue_t *amf_ue,
if (!sess) { if (!sess) {
ogs_error("[%s] No Session Context [%d]", ogs_error("[%s] No Session Context [%d]",
amf_ue->supi, gsm_header->message_type); amf_ue->supi, gsm_header->message_type);
nas_5gs_send_gmm_status(amf_ue, ogs_assert(OGS_OK ==
OGS_5GMM_CAUSE_INSUFFICIENT_USER_PLANE_RESOURCES_FOR_THE_PDU_SESSION); nas_5gs_send_gmm_status(amf_ue,
OGS_5GMM_CAUSE_INSUFFICIENT_USER_PLANE_RESOURCES_FOR_THE_PDU_SESSION));
return OGS_ERROR; return OGS_ERROR;
} }
} }
@ -964,8 +982,9 @@ int gmm_handle_ul_nas_transport(amf_ue_t *amf_ue,
if (!selected_slice) { if (!selected_slice) {
ogs_error("[%s] No S-NSSAI", amf_ue->supi); ogs_error("[%s] No S-NSSAI", amf_ue->supi);
nas_5gs_send_gmm_status(amf_ue, ogs_assert(OGS_OK ==
OGS_5GMM_CAUSE_INSUFFICIENT_RESOURCES_FOR_SPECIFIC_SLICE); nas_5gs_send_gmm_status(amf_ue,
OGS_5GMM_CAUSE_INSUFFICIENT_RESOURCES_FOR_SPECIFIC_SLICE));
return OGS_ERROR; return OGS_ERROR;
} }
@ -988,7 +1007,8 @@ int gmm_handle_ul_nas_transport(amf_ue_t *amf_ue,
if (!sess->dnn) { if (!sess->dnn) {
ogs_error("[%s] No DNN", amf_ue->supi); 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; return OGS_ERROR;
} }
@ -1032,8 +1052,9 @@ int gmm_handle_ul_nas_transport(amf_ue_t *amf_ue,
if (!SESSION_CONTEXT_IN_SMF(sess)) { if (!SESSION_CONTEXT_IN_SMF(sess)) {
ogs_error("[%s:%d] Session Context is not in SMF [%d]", ogs_error("[%s:%d] Session Context is not in SMF [%d]",
amf_ue->supi, sess->psi, gsm_header->message_type); amf_ue->supi, sess->psi, gsm_header->message_type);
nas_5gs_send_back_5gsm_message(sess, ogs_assert(OGS_OK ==
OGS_5GSM_CAUSE_PDU_SESSION_DOES_NOT_EXIST); nas_5gs_send_back_5gsm_message(sess,
OGS_5GSM_CAUSE_PDU_SESSION_DOES_NOT_EXIST));
return OGS_ERROR; return OGS_ERROR;
} }
@ -1061,8 +1082,9 @@ int gmm_handle_ul_nas_transport(amf_ue_t *amf_ue,
default: default:
ogs_error("[%s] Unknown Payload container type [%d]", ogs_error("[%s] Unknown Payload container type [%d]",
amf_ue->supi, payload_container_type->value); amf_ue->supi, payload_container_type->value);
nas_5gs_send_gmm_status(amf_ue, ogs_assert(OGS_OK ==
OGS_5GMM_CAUSE_MESSAGE_TYPE_NON_EXISTENT_OR_NOT_IMPLEMENTED); nas_5gs_send_gmm_status(amf_ue,
OGS_5GMM_CAUSE_MESSAGE_TYPE_NON_EXISTENT_OR_NOT_IMPLEMENTED));
return OGS_ERROR; return OGS_ERROR;
} }

View File

@ -139,7 +139,8 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e)
if (!AMF_UE_HAVE_SUCI(amf_ue)) { if (!AMF_UE_HAVE_SUCI(amf_ue)) {
CLEAR_AMF_UE_TIMER(amf_ue->t3570); 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; 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); 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) 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)) { if (!AMF_UE_HAVE_SUCI(amf_ue)) {
ogs_info("Service request : Unknown UE"); ogs_info("Service request : Unknown UE");
nas_5gs_send_service_reject(amf_ue, ogs_assert(OGS_OK ==
OGS_5GMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); 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); OGS_FSM_TRAN(s, gmm_state_exception);
break; break;
} }
if (!h.integrity_protected || !SECURITY_CONTEXT_IS_VALID(amf_ue)) { if (!h.integrity_protected || !SECURITY_CONTEXT_IS_VALID(amf_ue)) {
ogs_error("No Security Context"); ogs_error("No Security Context");
nas_5gs_send_service_reject(amf_ue, ogs_assert(OGS_OK ==
OGS_5GMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); 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); OGS_FSM_TRAN(s, gmm_state_exception);
break; 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. * If t3555 is timeout, the saved pkbuf is used.
* In this case, ack should be set to 1 for timer expiration * 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; 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); OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception);
} else { } else {
amf_ue->t3570.retry_count++; amf_ue->t3570.retry_count++;
nas_5gs_send_identity_request(amf_ue); ogs_assert(OGS_OK ==
nas_5gs_send_identity_request(amf_ue));
} }
break; break;
@ -451,7 +459,8 @@ void gmm_state_authentication(ogs_fsm_t *s, amf_event_t *e)
amf_ue, &nas_message->gmm.authentication_response); amf_ue, &nas_message->gmm.authentication_response);
if (rv != OGS_OK) { 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); OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception);
} }
break; break;
@ -503,7 +512,8 @@ void gmm_state_authentication(ogs_fsm_t *s, amf_event_t *e)
break; 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); OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception);
break; 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) { amf_timer_cfg(AMF_TIMER_T3560)->max_count) {
ogs_warn("[%s] Retransmission failed. Stop retransmission", ogs_warn("[%s] Retransmission failed. Stop retransmission",
amf_ue->suci); 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); OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception);
} else { } else {
amf_ue->t3560.retry_count++; amf_ue->t3560.retry_count++;
nas_5gs_send_authentication_request(amf_ue); ogs_assert(OGS_OK ==
nas_5gs_send_authentication_request(amf_ue));
} }
break; break;
default: default:
@ -581,8 +593,9 @@ void gmm_state_authentication(ogs_fsm_t *s, amf_event_t *e)
ogs_error("[%s] HTTP response error [%d]", ogs_error("[%s] HTTP response error [%d]",
amf_ue->suci, sbi_message->res_status); amf_ue->suci, sbi_message->res_status);
} }
nas_5gs_send_gmm_reject_from_sbi( ogs_assert(OGS_OK ==
amf_ue, sbi_message->res_status); nas_5gs_send_gmm_reject_from_sbi(
amf_ue, sbi_message->res_status));
OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception); OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception);
break; break;
} }
@ -594,7 +607,8 @@ void gmm_state_authentication(ogs_fsm_t *s, amf_event_t *e)
if (rv != OGS_OK) { if (rv != OGS_OK) {
ogs_error("[%s] Cannot handle SBI message", ogs_error("[%s] Cannot handle SBI message",
amf_ue->suci); 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); OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception);
} }
break; break;
@ -604,7 +618,8 @@ void gmm_state_authentication(ogs_fsm_t *s, amf_event_t *e)
if (rv != OGS_OK) { if (rv != OGS_OK) {
ogs_error("[%s] Cannot handle SBI message", ogs_error("[%s] Cannot handle SBI message",
amf_ue->suci); 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); OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception);
} else { } else {
OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_security_mode); 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) { switch (e->id) {
case OGS_FSM_ENTRY_SIG: case OGS_FSM_ENTRY_SIG:
CLEAR_AMF_UE_TIMER(amf_ue->t3560); 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; break;
case OGS_FSM_EXIT_SIG: case OGS_FSM_EXIT_SIG:
break; 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", ogs_error("[%s] Security-mode : No Integrity Protected",
amf_ue->supi); amf_ue->supi);
nas_5gs_send_gmm_reject(amf_ue, ogs_assert(OGS_OK ==
OGS_5GMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED); nas_5gs_send_gmm_reject(amf_ue,
OGS_5GMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED));
OGS_FSM_TRAN(s, &gmm_state_exception); OGS_FSM_TRAN(s, &gmm_state_exception);
break; break;
} }
if (!SECURITY_CONTEXT_IS_VALID(amf_ue)) { if (!SECURITY_CONTEXT_IS_VALID(amf_ue)) {
ogs_warn("[%s] No Security Context", amf_ue->supi); ogs_warn("[%s] No Security Context", amf_ue->supi);
nas_5gs_send_gmm_reject(amf_ue, ogs_assert(OGS_OK ==
OGS_5GMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED); nas_5gs_send_gmm_reject(amf_ue,
OGS_5GMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED));
OGS_FSM_TRAN(s, &gmm_state_exception); OGS_FSM_TRAN(s, &gmm_state_exception);
break; 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); amf_ue, &nas_message->gmm.security_mode_complete);
if (rv != OGS_OK) { if (rv != OGS_OK) {
ogs_error("[%s] Cannot handle NAS message", amf_ue->suci); ogs_error("[%s] Cannot handle NAS message", amf_ue->suci);
nas_5gs_send_gmm_reject(amf_ue, ogs_assert(OGS_OK ==
OGS_5GMM_CAUSE_5GS_SERVICES_NOT_ALLOWED); nas_5gs_send_gmm_reject(amf_ue,
OGS_5GMM_CAUSE_5GS_SERVICES_NOT_ALLOWED));
OGS_FSM_TRAN(s, gmm_state_exception); OGS_FSM_TRAN(s, gmm_state_exception);
break; break;
} }
@ -744,8 +763,10 @@ void gmm_state_security_mode(ogs_fsm_t *s, amf_event_t *e)
case OGS_NAS_5GS_SERVICE_REQUEST: case OGS_NAS_5GS_SERVICE_REQUEST:
ogs_info("[%s] Service request", amf_ue->supi); ogs_info("[%s] Service request", amf_ue->supi);
nas_5gs_send_service_reject(amf_ue, ogs_assert(OGS_OK ==
OGS_5GMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); 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); OGS_FSM_TRAN(s, &gmm_state_exception);
break; break;
@ -774,12 +795,14 @@ void gmm_state_security_mode(ogs_fsm_t *s, amf_event_t *e)
if (amf_ue->t3560.retry_count >= if (amf_ue->t3560.retry_count >=
amf_timer_cfg(AMF_TIMER_T3560)->max_count) { amf_timer_cfg(AMF_TIMER_T3560)->max_count) {
ogs_warn("[%s] Retransmission failed. Stop", amf_ue->supi); ogs_warn("[%s] Retransmission failed. Stop", amf_ue->supi);
nas_5gs_send_gmm_reject(amf_ue, ogs_assert(OGS_OK ==
OGS_5GMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED); nas_5gs_send_gmm_reject(amf_ue,
OGS_5GMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED));
OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception); OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception);
} else { } else {
amf_ue->t3560.retry_count++; 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; break;
default: 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) { sbi_message->res_status != OGS_SBI_HTTP_STATUS_OK) {
ogs_error("[%s] HTTP response error [%d]", ogs_error("[%s] HTTP response error [%d]",
amf_ue->supi, sbi_message->res_status); amf_ue->supi, sbi_message->res_status);
nas_5gs_send_gmm_reject( ogs_assert(OGS_OK ==
amf_ue, OGS_5GMM_CAUSE_5GS_SERVICES_NOT_ALLOWED); nas_5gs_send_gmm_reject(
amf_ue, OGS_5GMM_CAUSE_5GS_SERVICES_NOT_ALLOWED));
OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception); OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception);
break; 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) { if (sbi_message->res_status != OGS_SBI_HTTP_STATUS_OK) {
ogs_error("[%s] HTTP response error [%d]", ogs_error("[%s] HTTP response error [%d]",
amf_ue->supi, sbi_message->res_status); amf_ue->supi, sbi_message->res_status);
nas_5gs_send_gmm_reject( ogs_assert(OGS_OK ==
amf_ue, OGS_5GMM_CAUSE_5GS_SERVICES_NOT_ALLOWED); nas_5gs_send_gmm_reject(
amf_ue, OGS_5GMM_CAUSE_5GS_SERVICES_NOT_ALLOWED));
OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception); OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception);
break; break;
} }
@ -888,8 +913,9 @@ void gmm_state_initial_context_setup(ogs_fsm_t *s, amf_event_t *e)
if (rv != OGS_OK) { if (rv != OGS_OK) {
ogs_error("[%s] amf_nudm_sdm_handle_provisioned(%s) failed", ogs_error("[%s] amf_nudm_sdm_handle_provisioned(%s) failed",
amf_ue->supi, sbi_message->h.resource.component[1]); amf_ue->supi, sbi_message->h.resource.component[1]);
nas_5gs_send_gmm_reject( ogs_assert(OGS_OK ==
amf_ue, OGS_5GMM_CAUSE_5GS_SERVICES_NOT_ALLOWED); nas_5gs_send_gmm_reject(
amf_ue, OGS_5GMM_CAUSE_5GS_SERVICES_NOT_ALLOWED));
OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception); OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception);
break; 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_assert(amf_ue->nas.message_type ==
OGS_NAS_5GS_REGISTRATION_REQUEST); OGS_NAS_5GS_REGISTRATION_REQUEST);
CLEAR_AMF_UE_TIMER(amf_ue->t3550); 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) if (!amf_ue->next.m_tmsi)
OGS_FSM_TRAN(s, &gmm_state_registered); 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(&param, 0, sizeof(param)); memset(&param, 0, sizeof(param));
param.nitz = 1; param.nitz = 1;
nas_5gs_send_configuration_update_command(amf_ue, &param); ogs_assert(OGS_OK ==
nas_5gs_send_configuration_update_command(amf_ue, &param));
OGS_FSM_TRAN(s, &gmm_state_registered); OGS_FSM_TRAN(s, &gmm_state_registered);
break; 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: case OGS_NAS_5GS_SERVICE_REQUEST:
ogs_info("[%s] Service request", amf_ue->supi); ogs_info("[%s] Service request", amf_ue->supi);
nas_5gs_send_service_reject(amf_ue, ogs_assert(OGS_OK ==
OGS_5GMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); 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); OGS_FSM_TRAN(s, &gmm_state_exception);
break; 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); OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception);
} else { } else {
amf_ue->t3550.retry_count++; amf_ue->t3550.retry_count++;
nas_5gs_send_registration_accept(amf_ue); ogs_assert(OGS_OK ==
nas_5gs_send_registration_accept(amf_ue));
} }
break; break;
default: 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); amf_ue, AMF_RELEASE_SM_CONTEXT_NO_STATE);
if (ogs_list_count(&amf_ue->sess_list) == 0) 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_Cause_PR_nas, NGAP_CauseNas_normal_release,
NGAP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0); NGAP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0));
break; break;
case OGS_FSM_EXIT_SIG: case OGS_FSM_EXIT_SIG:
break; break;
@ -1121,7 +1153,8 @@ void gmm_state_exception(ogs_fsm_t *s, amf_event_t *e)
if (!AMF_UE_HAVE_SUCI(amf_ue)) { if (!AMF_UE_HAVE_SUCI(amf_ue)) {
CLEAR_AMF_UE_TIMER(amf_ue->t3570); 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); OGS_FSM_TRAN(s, &gmm_state_de_registered);
break; break;
@ -1176,7 +1209,8 @@ void gmm_state_exception(ogs_fsm_t *s, amf_event_t *e)
} }
CLEAR_AMF_UE_TIMER(amf_ue->t3550); 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) if (amf_ue->next.m_tmsi)

View File

@ -287,7 +287,8 @@ int amf_namf_comm_handle_n1_n2_message_transfer(
ngap_send_paging(amf_ue); ngap_send_paging(amf_ue);
} else if (CM_CONNECTED(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 { } else {

View File

@ -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_warn("NG context has already been removed");
ogs_pkbuf_free(pkbuf); ogs_pkbuf_free(pkbuf);
return OGS_ERROR;
} else { } else {
ngapbuf = ngap_build_downlink_nas_transport( ngapbuf = ngap_build_downlink_nas_transport(
ran_ue, pkbuf, false, false); ran_ue, pkbuf, false, false);
if (!ngapbuf) { ogs_expect_or_return_val(ngapbuf, OGS_ERROR);
ogs_error("ngap_build_downlink_nas_transport() failed");
return OGS_ERROR;
}
rv = nas_5gs_send_to_gnb(amf_ue, ngapbuf); rv = nas_5gs_send_to_gnb(amf_ue, ngapbuf);
if (rv != OGS_OK) { ogs_expect(rv == OGS_OK);
return OGS_ERROR;
}
}
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; int rv;
bool transfer_needed = false; 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->next.m_tmsi) {
if (amf_ue->t3550.pkbuf) { if (amf_ue->t3550.pkbuf) {
gmmbuf = amf_ue->t3550.pkbuf; gmmbuf = amf_ue->t3550.pkbuf;
ogs_expect_or_return(gmmbuf); ogs_expect_or_return_val(gmmbuf, OGS_ERROR);
} else { } else {
gmmbuf = gmm_build_registration_accept(amf_ue); 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); 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); amf_timer_cfg(AMF_TIMER_T3550)->duration);
} else { } else {
gmmbuf = gmm_build_registration_accept(amf_ue); 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 && if (ran_ue->initial_context_setup_request_sent == false &&
(ran_ue->ue_context_requested == true || transfer_needed == true)) { (ran_ue->ue_context_requested == true || transfer_needed == true)) {
ngapbuf = ngap_ue_build_initial_context_setup_request(amf_ue, gmmbuf); 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); 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; ran_ue->initial_context_setup_request_sent = true;
} else { } else {
if (transfer_needed == true) { if (transfer_needed == true) {
ngapbuf = ngap_ue_build_pdu_session_resource_setup_request( ngapbuf = ngap_ue_build_pdu_session_resource_setup_request(
amf_ue, gmmbuf); 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); 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 { } else {
ngapbuf = ngap_build_downlink_nas_transport( ngapbuf = ngap_build_downlink_nas_transport(
ran_ue, gmmbuf, true, true); 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); 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) amf_ue_t *amf_ue, ogs_nas_5gmm_cause_t gmm_cause)
{ {
int rv; int rv;
@ -156,13 +154,15 @@ void nas_5gs_send_registration_reject(
ogs_warn("[%s] Registration reject [%d]", amf_ue->suci, gmm_cause); ogs_warn("[%s] Registration reject [%d]", amf_ue->suci, gmm_cause);
gmmbuf = gmm_build_registration_reject(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); rv = nas_5gs_send_to_downlink_nas_transport(amf_ue, gmmbuf);
ogs_expect(rv == OGS_OK); 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; int rv;
bool transfer_needed = false; 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); ogs_debug("[%s] Service accept", amf_ue->supi);
gmmbuf = gmm_build_service_accept(amf_ue); 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 * 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 && if (ran_ue->initial_context_setup_request_sent == false &&
(ran_ue->ue_context_requested == true || transfer_needed == true)) { (ran_ue->ue_context_requested == true || transfer_needed == true)) {
ngapbuf = ngap_ue_build_initial_context_setup_request(amf_ue, gmmbuf); 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); 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; ran_ue->initial_context_setup_request_sent = true;
} else { } else {
if (transfer_needed == true) { if (transfer_needed == true) {
ngapbuf = ngap_ue_build_pdu_session_resource_setup_request( ngapbuf = ngap_ue_build_pdu_session_resource_setup_request(
amf_ue, gmmbuf); 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); 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 { } else {
rv = nas_5gs_send_to_downlink_nas_transport(amf_ue, gmmbuf); 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) amf_ue_t *amf_ue, ogs_nas_5gmm_cause_t gmm_cause)
{ {
int rv; int rv;
@ -235,14 +237,18 @@ void nas_5gs_send_service_reject(
ogs_debug("[%s] Service reject", amf_ue->supi); ogs_debug("[%s] Service reject", amf_ue->supi);
gmmbuf = gmm_build_service_reject(amf_ue, gmm_cause); 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); rv = nas_5gs_send_to_downlink_nas_transport(amf_ue, gmmbuf);
ogs_expect(rv == OGS_OK); 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; ran_ue_t *ran_ue = NULL;
ogs_pkbuf_t *gmmbuf = NULL; ogs_pkbuf_t *gmmbuf = NULL;
@ -256,18 +262,21 @@ void nas_5gs_send_de_registration_accept(amf_ue_t *amf_ue)
int rv; int rv;
gmmbuf = gmm_build_de_registration_accept(amf_ue); 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); 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_Cause_PR_nas, NGAP_CauseNas_deregister,
NGAP_UE_CTX_REL_NG_REMOVE_AND_UNLINK, 0); 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; int rv;
ogs_pkbuf_t *gmmbuf = NULL; 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) { if (amf_ue->t3570.pkbuf) {
gmmbuf = amf_ue->t3570.pkbuf; gmmbuf = amf_ue->t3570.pkbuf;
ogs_expect_or_return(gmmbuf); ogs_expect_or_return_val(gmmbuf, OGS_ERROR);
} else { } else {
gmmbuf = gmm_build_identity_request(amf_ue); 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); 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); rv = nas_5gs_send_to_downlink_nas_transport(amf_ue, gmmbuf);
ogs_expect(rv == OGS_OK); 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; int rv;
ogs_pkbuf_t *gmmbuf = NULL; 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) { if (amf_ue->t3560.pkbuf) {
gmmbuf = amf_ue->t3560.pkbuf; gmmbuf = amf_ue->t3560.pkbuf;
ogs_expect_or_return(gmmbuf); ogs_expect_or_return_val(gmmbuf, OGS_ERROR);
} else { } else {
gmmbuf = gmm_build_authentication_request(amf_ue); 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); 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); rv = nas_5gs_send_to_downlink_nas_transport(amf_ue, gmmbuf);
ogs_expect(rv == OGS_OK); 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; int rv;
ogs_pkbuf_t *gmmbuf = NULL; 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); ogs_warn("[%s] Authentication reject", amf_ue->suci);
gmmbuf = gmm_build_authentication_reject(); 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); rv = nas_5gs_send_to_downlink_nas_transport(amf_ue, gmmbuf);
ogs_expect(rv == OGS_OK); 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; int rv;
ogs_pkbuf_t *gmmbuf = NULL; 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) { if (amf_ue->t3560.pkbuf) {
gmmbuf = amf_ue->t3560.pkbuf; gmmbuf = amf_ue->t3560.pkbuf;
ogs_expect_or_return(gmmbuf); ogs_expect_or_return_val(gmmbuf, OGS_ERROR);
} else { } else {
gmmbuf = gmm_build_security_mode_command(amf_ue); 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); 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); rv = nas_5gs_send_to_downlink_nas_transport(amf_ue, gmmbuf);
ogs_expect(rv == OGS_OK); 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) amf_ue_t *amf_ue, gmm_configuration_update_command_param_t *param)
{ {
int rv; int rv;
@ -373,7 +390,7 @@ void nas_5gs_send_configuration_update_command(
if (amf_ue->t3555.pkbuf) { if (amf_ue->t3555.pkbuf) {
gmmbuf = 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); amf_ue->t3555.pkbuf = ogs_pkbuf_copy(gmmbuf);
ogs_assert(amf_ue->t3555.pkbuf); ogs_assert(amf_ue->t3555.pkbuf);
@ -381,9 +398,9 @@ void nas_5gs_send_configuration_update_command(
amf_timer_cfg(AMF_TIMER_T3555)->duration); amf_timer_cfg(AMF_TIMER_T3555)->duration);
} else { } else {
ogs_expect_or_return(param); ogs_expect_or_return_val(param, OGS_ERROR);
gmmbuf = gmm_build_configuration_update_command(amf_ue, param); 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) { if (param->acknowledgement_requested) {
amf_ue->t3555.pkbuf = ogs_pkbuf_copy(gmmbuf); 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); rv = nas_5gs_send_to_downlink_nas_transport(amf_ue, gmmbuf);
ogs_expect(rv == OGS_OK); 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) ogs_pkbuf_t *n1smbuf, ogs_pkbuf_t *n2smbuf)
{ {
int rv; int rv;
@ -415,17 +434,19 @@ void nas_send_pdu_session_release_command(amf_sess_t *sess,
gmmbuf = gmm_build_dl_nas_transport(sess, gmmbuf = gmm_build_dl_nas_transport(sess,
OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, n1smbuf, 0, 0); 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( ngapbuf = ngap_build_pdu_session_resource_release_command(
sess, gmmbuf, n2smbuf); 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); rv = nas_5gs_send_to_gnb(amf_ue, ngapbuf);
ogs_expect(rv == OGS_OK); 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; int rv;
ogs_pkbuf_t *gmmbuf = NULL; 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); ogs_debug("[%s] 5GMM status", amf_ue->supi);
gmmbuf = gmm_build_status(amf_ue, cause); 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); rv = nas_5gs_send_to_downlink_nas_transport(amf_ue, gmmbuf);
ogs_expect(rv == OGS_OK); 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) amf_ue_t *amf_ue, ogs_nas_5gmm_cause_t gmm_cause)
{ {
int rv;
ogs_assert(amf_ue); ogs_assert(amf_ue);
switch(amf_ue->nas.message_type) { switch(amf_ue->nas.message_type) {
case OGS_NAS_5GS_REGISTRATION_REQUEST: 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; break;
case OGS_NAS_5GS_SERVICE_REQUEST: 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; break;
default: default:
ogs_error("Unknown message type [%d]", amf_ue->nas.message_type); 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) 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; 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); 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, uint8_t payload_container_type, ogs_pkbuf_t *payload_container,
ogs_nas_5gmm_cause_t cause, uint8_t backoff_time) 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, gmmbuf = gmm_build_dl_nas_transport(sess,
payload_container_type, payload_container, cause, backoff_time); 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); 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, uint8_t payload_container_type, ogs_pkbuf_t *payload_container,
int status) int status)
{ {
int rv;
ogs_assert(sess); ogs_assert(sess);
ogs_assert(payload_container_type); ogs_assert(payload_container_type);
ogs_assert(payload_container); 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); 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) amf_sess_t *sess, ogs_nas_5gmm_cause_t cause)
{ {
int rv;
ogs_pkbuf_t *pbuf = NULL; ogs_pkbuf_t *pbuf = NULL;
ogs_assert(sess); ogs_assert(sess);
@ -538,12 +580,21 @@ void nas_5gs_send_back_5gsm_message(
pbuf = ogs_pkbuf_copy(sess->payload_container); pbuf = ogs_pkbuf_copy(sess->payload_container);
ogs_assert(pbuf); 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); 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); 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;
}

View File

@ -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( int nas_5gs_send_to_downlink_nas_transport(
amf_ue_t *amf_ue, ogs_pkbuf_t *pkbuf); amf_ue_t *amf_ue, ogs_pkbuf_t *pkbuf);
void nas_5gs_send_registration_accept(amf_ue_t *amf_ue); int nas_5gs_send_registration_accept(amf_ue_t *amf_ue);
void nas_5gs_send_registration_reject( int nas_5gs_send_registration_reject(
amf_ue_t *amf_ue, ogs_nas_5gmm_cause_t gmm_cause); amf_ue_t *amf_ue, ogs_nas_5gmm_cause_t gmm_cause);
void nas_5gs_send_service_accept(amf_ue_t *amf_ue); int nas_5gs_send_service_accept(amf_ue_t *amf_ue);
void nas_5gs_send_service_reject( int nas_5gs_send_service_reject(
amf_ue_t *amf_ue, ogs_nas_5gmm_cause_t gmm_cause); 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); int 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_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); 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); 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); 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, uint8_t payload_container_type, ogs_pkbuf_t *payload_container,
ogs_nas_5gmm_cause_t cause, uint8_t backoff_time); 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, uint8_t payload_container_type, ogs_pkbuf_t *payload_container,
int status); 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); 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); int 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
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
#endif /* AMF_NAS_5GS_PATH_H */ #endif /* AMF_NAS_5GS_PATH_H */

View File

@ -110,7 +110,8 @@ int amf_nausf_auth_handle_authenticate(
amf_ue->nas.ue.ksi = amf_ue->nas.amf.ksi; 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; return OGS_OK;
} }

File diff suppressed because it is too large Load Diff

View File

@ -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_pkbuf_t *ngap_buffer;
ogs_debug("NG-Setup response"); ogs_debug("NG-Setup response");
ngap_buffer = ngap_build_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 == rv = ngap_send_to_gnb(gnb, ngap_buffer, NGAP_NON_UE_SIGNALLING);
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) amf_gnb_t *gnb, NGAP_Cause_PR group, long cause)
{ {
int rv;
ogs_pkbuf_t *ngap_buffer; ogs_pkbuf_t *ngap_buffer;
ogs_debug("NG-Setup failure"); ogs_debug("NG-Setup failure");
ngap_buffer = ngap_build_ng_setup_failure( ngap_buffer = ngap_build_ng_setup_failure(
group, cause, NGAP_TimeToWait_v10s); group, cause, NGAP_TimeToWait_v10s);
ogs_expect_or_return(ngap_buffer); ogs_expect_or_return_val(ngap_buffer, OGS_ERROR);
ogs_expect(OGS_OK == rv = ngap_send_to_gnb(gnb, ngap_buffer, NGAP_NON_UE_SIGNALLING);
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_pkbuf_t *ngap_buffer;
ogs_debug("RANConfigurationUpdateAcknowledge"); ogs_debug("RANConfigurationUpdateAcknowledge");
ngap_buffer = ngap_build_ran_configuration_update_ack(); 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 == rv = ngap_send_to_gnb(gnb, ngap_buffer, NGAP_NON_UE_SIGNALLING);
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) amf_gnb_t *gnb, NGAP_Cause_PR group, long cause)
{ {
int rv;
ogs_pkbuf_t *ngap_buffer; ogs_pkbuf_t *ngap_buffer;
ogs_debug("RANConfigurationUpdateFailure"); ogs_debug("RANConfigurationUpdateFailure");
ngap_buffer = ngap_build_ran_configuration_update_failure( ngap_buffer = ngap_build_ran_configuration_update_failure(
group, cause, NGAP_TimeToWait_v10s); group, cause, NGAP_TimeToWait_v10s);
ogs_expect_or_return(ngap_buffer); ogs_expect_or_return_val(ngap_buffer, OGS_ERROR);
ogs_expect(OGS_OK == rv = ngap_send_to_gnb(gnb, ngap_buffer, NGAP_NON_UE_SIGNALLING);
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);
ogs_expect(rv == OGS_OK); 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, ran_ue_t *ran_ue, NGAP_Cause_PR group, long cause,
uint8_t action, ogs_time_t duration) 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); group, (int)cause, action, (int)duration);
ngapbuf = ngap_build_ue_context_release_command(ran_ue, group, cause); 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); rv = ngap_delayed_send_to_ran_ue(ran_ue, ngapbuf, duration);
ogs_expect(rv == OGS_OK); ogs_expect(rv == OGS_OK);
ogs_timer_start(ran_ue->t_ng_holding, ogs_timer_start(ran_ue->t_ng_holding,
amf_timer_cfg(AMF_TIMER_NG_HOLDING)->duration); 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, amf_ue_t *amf_ue, NGAP_Cause_PR group, long cause,
uint8_t action, ogs_time_t duration) 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); ran_ue_t *ran_ue = ran_ue_cycle(amf_ue->ran_ue);
if (ran_ue) { if (ran_ue) {
ngap_send_ran_ue_context_release_command(ran_ue, ogs_assert(OGS_OK ==
group, cause, action, duration); ngap_send_ran_ue_context_release_command(ran_ue,
group, cause, action, duration));
ogs_debug(" SUPI[%s]", amf_ue->supi); ogs_debug(" SUPI[%s]", amf_ue->supi);
} else { } else {
ogs_error("[%s] No NG Context - " ogs_error("[%s] No NG Context - "
"Group[%d] Cause[%d] Action[%d] Duration[%d]", "Group[%d] Cause[%d] Action[%d] Duration[%d]",
amf_ue->supi, group, (int)cause, action, (int)duration); amf_ue->supi, group, (int)cause, action, (int)duration);
} }
return OGS_OK;
} }
void ngap_send_paging(amf_ue_t *amf_ue) 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); 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) amf_sess_t *sess, ogs_pkbuf_t *n2smbuf)
{ {
int rv; int rv;
@ -406,23 +407,25 @@ void ngap_send_pdu_resource_setup_request(
ran_ue->initial_context_setup_request_sent == false) { ran_ue->initial_context_setup_request_sent == false) {
ngapbuf = ngap_sess_build_initial_context_setup_request( ngapbuf = ngap_sess_build_initial_context_setup_request(
sess, NULL, n2smbuf); 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); 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; ran_ue->initial_context_setup_request_sent = true;
} else { } else {
ngapbuf = ngap_sess_build_pdu_session_resource_setup_request( ngapbuf = ngap_sess_build_pdu_session_resource_setup_request(
sess, NULL, n2smbuf); 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); 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) amf_gnb_t *target_gnb, NGAP_SONConfigurationTransfer_t *transfer)
{ {
int rv; int rv;
@ -432,13 +435,15 @@ void ngap_send_downlink_ran_configuration_transfer(
ogs_assert(transfer); ogs_assert(transfer);
ngapbuf = ngap_build_downlink_ran_configuration_transfer(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); rv = ngap_send_to_gnb(target_gnb, ngapbuf, NGAP_NON_UE_SIGNALLING);
ogs_expect(rv == OGS_OK); 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; int rv;
@ -450,13 +455,15 @@ void ngap_send_path_switch_ack(amf_sess_t *sess)
ogs_assert(amf_ue); ogs_assert(amf_ue);
ngapbuf = ngap_build_path_switch_ack(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); rv = nas_5gs_send_to_gnb(amf_ue, ngapbuf);
ogs_expect(rv == OGS_OK); 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; int rv;
@ -471,13 +478,15 @@ void ngap_send_handover_request(amf_ue_t *amf_ue)
ogs_assert(target_ue); ogs_assert(target_ue);
ngapbuf = ngap_build_handover_request(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); rv = ngap_send_to_ran_ue(target_ue, ngapbuf);
ogs_expect(rv == OGS_OK); 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) ran_ue_t *source_ue, NGAP_Cause_t *cause)
{ {
int rv; int rv;
@ -487,13 +496,15 @@ void ngap_send_handover_preparation_failure(
ogs_assert(cause); ogs_assert(cause);
ngapbuf = ngap_build_handover_preparation_failure(source_ue, 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); rv = ngap_send_to_ran_ue(source_ue, ngapbuf);
ogs_expect(rv == OGS_OK); 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; int rv;
@ -505,13 +516,15 @@ void ngap_send_handover_command(amf_ue_t *amf_ue)
ogs_assert(source_ue); ogs_assert(source_ue);
ngapbuf = ngap_build_handover_command(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); rv = ngap_send_to_ran_ue(source_ue, ngapbuf);
ogs_expect(rv == OGS_OK); 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; int rv;
ogs_pkbuf_t *ngapbuf = NULL; ogs_pkbuf_t *ngapbuf = NULL;
@ -519,13 +532,15 @@ void ngap_send_handover_cancel_ack(ran_ue_t *source_ue)
ogs_assert(source_ue); ogs_assert(source_ue);
ngapbuf = ngap_build_handover_cancel_ack(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); rv = ngap_send_to_ran_ue(source_ue, ngapbuf);
ogs_expect(rv == OGS_OK); 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, ran_ue_t *target_ue,
NGAP_RANStatusTransfer_TransparentContainer_t *transfer) NGAP_RANStatusTransfer_TransparentContainer_t *transfer)
{ {
@ -536,13 +551,15 @@ void ngap_send_downlink_ran_status_transfer(
ogs_assert(transfer); ogs_assert(transfer);
ngapbuf = ngap_build_uplink_ran_status_transfer(target_ue, 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); rv = ngap_send_to_ran_ue(target_ue, ngapbuf);
ogs_expect(rv == OGS_OK); ogs_expect(rv == OGS_OK);
return rv;
} }
void ngap_send_error_indication( int ngap_send_error_indication(
amf_gnb_t *gnb, amf_gnb_t *gnb,
uint32_t *ran_ue_ngap_id, uint32_t *ran_ue_ngap_id,
uint64_t *amf_ue_ngap_id, uint64_t *amf_ue_ngap_id,
@ -555,29 +572,35 @@ void ngap_send_error_indication(
ngapbuf = ogs_ngap_build_error_indication( ngapbuf = ogs_ngap_build_error_indication(
ran_ue_ngap_id, amf_ue_ngap_id, group, cause); 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); rv = ngap_send_to_gnb(gnb, ngapbuf, NGAP_NON_UE_SIGNALLING);
ogs_expect(rv == OGS_OK); 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) amf_ue_t *amf_ue, NGAP_Cause_PR group, long cause)
{ {
int rv;
amf_gnb_t *gnb; amf_gnb_t *gnb;
ran_ue_t *ran_ue; ran_ue_t *ran_ue;
ogs_assert(amf_ue); ogs_assert(amf_ue);
ran_ue = ran_ue_cycle(amf_ue->ran_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; 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); 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, amf_gnb_t *gnb,
NGAP_UE_associatedLogicalNG_connectionList_t *partOfNG_Interface) NGAP_UE_associatedLogicalNG_connectionList_t *partOfNG_Interface)
{ {
@ -587,8 +610,10 @@ void ngap_send_ng_reset_ack(
ogs_assert(gnb); ogs_assert(gnb);
ngapbuf = ogs_ngap_build_ng_reset_ack(partOfNG_Interface); 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); rv = ngap_send_to_gnb(gnb, ngapbuf, NGAP_NON_UE_SIGNALLING);
ogs_expect(rv == OGS_OK); ogs_expect(rv == OGS_OK);
return rv;
} }

View File

@ -47,49 +47,47 @@ int ngap_send_to_nas(ran_ue_t *ran_ue,
NGAP_ProcedureCode_t procedureCode, NGAP_NAS_PDU_t *nasPdu); NGAP_ProcedureCode_t procedureCode, NGAP_NAS_PDU_t *nasPdu);
int ngap_send_to_5gsm(amf_ue_t *amf_ue, ogs_pkbuf_t *esmbuf); int ngap_send_to_5gsm(amf_ue_t *amf_ue, ogs_pkbuf_t *esmbuf);
void ngap_send_ng_setup_response(amf_gnb_t *gnb); int ngap_send_ng_setup_response(amf_gnb_t *gnb);
void ngap_send_ng_setup_failure( int ngap_send_ng_setup_failure(
amf_gnb_t *gnb, NGAP_Cause_PR group, long cause); amf_gnb_t *gnb, NGAP_Cause_PR group, long cause);
void ngap_send_ran_configuration_update_ack(amf_gnb_t *gnb); int ngap_send_ran_configuration_update_ack(amf_gnb_t *gnb);
void ngap_send_ran_configuration_update_failure( int ngap_send_ran_configuration_update_failure(
amf_gnb_t *gnb, NGAP_Cause_PR group, long cause); amf_gnb_t *gnb, NGAP_Cause_PR group, long cause);
void ngap_send_ue_context_modification_request(amf_ue_t *amf_ue); int ngap_send_ran_ue_context_release_command(
void ngap_send_ran_ue_context_release_command(
ran_ue_t *ran_ue, NGAP_Cause_PR group, long cause, ran_ue_t *ran_ue, NGAP_Cause_PR group, long cause,
uint8_t action, ogs_time_t delay); 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, amf_ue_t *amf_ue, NGAP_Cause_PR group, long cause,
uint8_t action, ogs_time_t delay); uint8_t action, ogs_time_t delay);
void ngap_send_paging(amf_ue_t *amf_ue); 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); 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); 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); int ngap_send_handover_request(amf_ue_t *amf_ue);
void ngap_send_handover_preparation_failure( int ngap_send_handover_preparation_failure(
ran_ue_t *source_ue, NGAP_Cause_t *cause); ran_ue_t *source_ue, NGAP_Cause_t *cause);
void ngap_send_handover_command(amf_ue_t *amf_ue); int ngap_send_handover_command(amf_ue_t *amf_ue);
void ngap_send_handover_cancel_ack(ran_ue_t *source_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, ran_ue_t *target_ue,
NGAP_RANStatusTransfer_TransparentContainer_t *transfer); NGAP_RANStatusTransfer_TransparentContainer_t *transfer);
void ngap_send_error_indication( int ngap_send_error_indication(
amf_gnb_t *gnb, amf_gnb_t *gnb,
uint32_t *ran_ue_ngap_id, uint32_t *ran_ue_ngap_id,
uint64_t *amf_ue_ngap_id, uint64_t *amf_ue_ngap_id,
NGAP_Cause_PR group, long cause); 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); 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, amf_gnb_t *gnb,
NGAP_UE_associatedLogicalNG_connectionList_t *partOfNG_Interface); NGAP_UE_associatedLogicalNG_connectionList_t *partOfNG_Interface);
@ -97,4 +95,4 @@ void ngap_send_ng_reset_ack(
} }
#endif #endif
#endif /* NGAP_PATH_H */ #endif /* NGAP_PATH_H */

View File

@ -276,8 +276,9 @@ void amf_nnrf_handle_nf_discover(
ogs_assert(amf_ue); ogs_assert(amf_ue);
ogs_error("[%s] (NF discover) No [%s]", amf_ue->suci, ogs_error("[%s] (NF discover) No [%s]", amf_ue->suci,
OpenAPI_nf_type_ToString(xact->target_nf_type)); OpenAPI_nf_type_ToString(xact->target_nf_type));
nas_5gs_send_gmm_reject_from_sbi(amf_ue, ogs_assert(OGS_OK ==
OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT); nas_5gs_send_gmm_reject_from_sbi(amf_ue,
OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT));
break; break;
case OGS_SBI_OBJ_SESS_TYPE: case OGS_SBI_OBJ_SESS_TYPE:
sess = (amf_sess_t *)sbi_object; 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, ogs_error("[%d:%d] (NF discover) No [%s]", sess->psi, sess->pti,
OpenAPI_nf_type_ToString(xact->target_nf_type)); OpenAPI_nf_type_ToString(xact->target_nf_type));
if (sess->payload_container_type) { if (sess->payload_container_type) {
nas_5gs_send_back_5gsm_message_from_sbi(sess, ogs_assert(OGS_OK ==
OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT); nas_5gs_send_back_5gsm_message_from_sbi(sess,
OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT));
} else { } else {
ngap_send_error_indication2(amf_ue, ogs_assert(OGS_OK ==
ngap_send_error_indication2(amf_ue,
NGAP_Cause_PR_transport, NGAP_Cause_PR_transport,
NGAP_CauseTransport_transport_resource_unavailable); NGAP_CauseTransport_transport_resource_unavailable));
} }
break; break;
default: default:

View File

@ -42,30 +42,34 @@ int amf_nnssf_nsselection_handle_get(
if (recvmsg->res_status != OGS_SBI_HTTP_STATUS_OK) { if (recvmsg->res_status != OGS_SBI_HTTP_STATUS_OK) {
ogs_error("[%s] HTTP response error [%d]", ogs_error("[%s] HTTP response error [%d]",
amf_ue->supi, recvmsg->res_status); 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; return OGS_ERROR;
} }
AuthorizedNetworkSliceInfo = recvmsg->AuthorizedNetworkSliceInfo; AuthorizedNetworkSliceInfo = recvmsg->AuthorizedNetworkSliceInfo;
if (!AuthorizedNetworkSliceInfo) { if (!AuthorizedNetworkSliceInfo) {
ogs_error("No AuthorizedNetworkSliceInfo"); ogs_error("No AuthorizedNetworkSliceInfo");
nas_5gs_send_gmm_reject_from_sbi( ogs_assert(OGS_OK ==
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR); nas_5gs_send_gmm_reject_from_sbi(
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR));
return OGS_ERROR; return OGS_ERROR;
} }
NsiInformation = AuthorizedNetworkSliceInfo->nsi_information; NsiInformation = AuthorizedNetworkSliceInfo->nsi_information;
if (!NsiInformation) { if (!NsiInformation) {
ogs_error("No NsiInformation"); ogs_error("No NsiInformation");
nas_5gs_send_gmm_reject_from_sbi( ogs_assert(OGS_OK ==
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR); nas_5gs_send_gmm_reject_from_sbi(
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR));
return OGS_ERROR; return OGS_ERROR;
} }
if (!NsiInformation->nrf_id) { if (!NsiInformation->nrf_id) {
ogs_error("No nrfId"); ogs_error("No nrfId");
nas_5gs_send_gmm_reject_from_sbi( ogs_assert(OGS_OK ==
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR); nas_5gs_send_gmm_reject_from_sbi(
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR));
return OGS_ERROR; return OGS_ERROR;
} }
@ -77,8 +81,9 @@ int amf_nnssf_nsselection_handle_get(
if (!addr) { if (!addr) {
ogs_error("[%s:%d] Invalid URI [%s]", ogs_error("[%s:%d] Invalid URI [%s]",
amf_ue->supi, sess->psi, NsiInformation->nrf_id); amf_ue->supi, sess->psi, NsiInformation->nrf_id);
nas_5gs_send_gmm_reject_from_sbi( ogs_assert(OGS_OK ==
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR); nas_5gs_send_gmm_reject_from_sbi(
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR));
return OGS_ERROR;; return OGS_ERROR;;
} }

View File

@ -38,29 +38,33 @@ int amf_npcf_am_policy_control_handle_create(
if (recvmsg->res_status != OGS_SBI_HTTP_STATUS_CREATED) { if (recvmsg->res_status != OGS_SBI_HTTP_STATUS_CREATED) {
ogs_error("[%s] HTTP response error [%d]", ogs_error("[%s] HTTP response error [%d]",
amf_ue->supi, recvmsg->res_status); 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; return OGS_ERROR;
} }
if (!recvmsg->http.location) { if (!recvmsg->http.location) {
ogs_error("[%s] No http.location", amf_ue->supi); ogs_error("[%s] No http.location", amf_ue->supi);
nas_5gs_send_gmm_reject_from_sbi( ogs_assert(OGS_OK ==
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR); nas_5gs_send_gmm_reject_from_sbi(
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR));
return OGS_ERROR; return OGS_ERROR;
} }
PolicyAssociation = recvmsg->PolicyAssociation; PolicyAssociation = recvmsg->PolicyAssociation;
if (!PolicyAssociation) { if (!PolicyAssociation) {
ogs_error("No PolicyAssociation"); ogs_error("No PolicyAssociation");
nas_5gs_send_gmm_reject_from_sbi( ogs_assert(OGS_OK ==
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR); nas_5gs_send_gmm_reject_from_sbi(
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR));
return OGS_ERROR; return OGS_ERROR;
} }
if (!PolicyAssociation->supp_feat) { if (!PolicyAssociation->supp_feat) {
ogs_error("No suppFeat"); ogs_error("No suppFeat");
nas_5gs_send_gmm_reject_from_sbi( ogs_assert(OGS_OK ==
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR); nas_5gs_send_gmm_reject_from_sbi(
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR));
return OGS_ERROR; return OGS_ERROR;
} }
@ -71,8 +75,9 @@ int amf_npcf_am_policy_control_handle_create(
if (rv != OGS_OK) { if (rv != OGS_OK) {
ogs_error("[%s] Cannot parse http.location [%s]", ogs_error("[%s] Cannot parse http.location [%s]",
amf_ue->supi, recvmsg->http.location); amf_ue->supi, recvmsg->http.location);
nas_5gs_send_gmm_reject_from_sbi( ogs_assert(OGS_OK ==
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR); nas_5gs_send_gmm_reject_from_sbi(
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR));
return OGS_ERROR; return OGS_ERROR;
} }
@ -81,8 +86,9 @@ int amf_npcf_am_policy_control_handle_create(
amf_ue->supi, recvmsg->http.location); amf_ue->supi, recvmsg->http.location);
ogs_sbi_header_free(&header); ogs_sbi_header_free(&header);
nas_5gs_send_gmm_reject_from_sbi( ogs_assert(OGS_OK ==
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR); nas_5gs_send_gmm_reject_from_sbi(
amf_ue, OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR));
return OGS_ERROR; return OGS_ERROR;
} }

View File

@ -38,8 +38,9 @@ int amf_nsmf_pdusession_handle_create_sm_context(
if (!recvmsg->http.location) { if (!recvmsg->http.location) {
ogs_error("[%d:%d] No http.location", sess->psi, sess->pti); ogs_error("[%d:%d] No http.location", sess->psi, sess->pti);
nas_5gs_send_back_5gsm_message_from_sbi(sess, ogs_assert(OGS_OK ==
OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR); nas_5gs_send_back_5gsm_message_from_sbi(sess,
OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR));
return OGS_ERROR; return OGS_ERROR;
} }
@ -50,8 +51,9 @@ int amf_nsmf_pdusession_handle_create_sm_context(
if (rv != OGS_OK) { if (rv != OGS_OK) {
ogs_error("[%d:%d] Cannot parse http.location [%s]", ogs_error("[%d:%d] Cannot parse http.location [%s]",
sess->psi, sess->pti, recvmsg->http.location); sess->psi, sess->pti, recvmsg->http.location);
nas_5gs_send_back_5gsm_message_from_sbi(sess, ogs_assert(OGS_OK ==
OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR); nas_5gs_send_back_5gsm_message_from_sbi(sess,
OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR));
return OGS_ERROR; return OGS_ERROR;
} }
@ -60,8 +62,9 @@ int amf_nsmf_pdusession_handle_create_sm_context(
sess->psi, sess->pti, recvmsg->http.location); sess->psi, sess->pti, recvmsg->http.location);
ogs_sbi_header_free(&header); ogs_sbi_header_free(&header);
nas_5gs_send_back_5gsm_message_from_sbi(sess, ogs_assert(OGS_OK ==
OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR); nas_5gs_send_back_5gsm_message_from_sbi(sess,
OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR));
return OGS_ERROR; return OGS_ERROR;
} }
@ -87,8 +90,9 @@ int amf_nsmf_pdusession_handle_create_sm_context(
sess->psi, sess->pti); sess->psi, sess->pti);
ogs_sbi_header_free(&header); ogs_sbi_header_free(&header);
nas_5gs_send_back_5gsm_message_from_sbi(sess, ogs_assert(OGS_OK ==
OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR); nas_5gs_send_back_5gsm_message_from_sbi(sess,
OGS_SBI_HTTP_STATUS_INTERNAL_SERVER_ERROR));
return OGS_ERROR; return OGS_ERROR;
} }
} }
@ -107,12 +111,16 @@ int amf_nsmf_pdusession_handle_create_sm_context(
SmContextCreateError = recvmsg->SmContextCreateError; SmContextCreateError = recvmsg->SmContextCreateError;
if (!SmContextCreateError) { if (!SmContextCreateError) {
ogs_error("[%d:%d] No SmContextCreateError", sess->psi, sess->pti); 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; return OGS_ERROR;
} }
if (!SmContextCreateError->error) { if (!SmContextCreateError->error) {
ogs_error("[%d:%d] No Error", sess->psi, sess->pti); 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; return OGS_ERROR;
} }
@ -127,14 +135,17 @@ int amf_nsmf_pdusession_handle_create_sm_context(
*/ */
n1smbuf = ogs_pkbuf_copy(n1smbuf); n1smbuf = ogs_pkbuf_copy(n1smbuf);
ogs_assert(n1smbuf); ogs_assert(n1smbuf);
nas_5gs_send_gsm_reject_from_sbi(sess, ogs_assert(OGS_OK ==
OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, nas_5gs_send_gsm_reject_from_sbi(sess,
n1smbuf, recvmsg->res_status); OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION,
n1smbuf, recvmsg->res_status));
return OGS_ERROR; 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; return OGS_ERROR;
} }
@ -199,7 +210,8 @@ int amf_nsmf_pdusession_handle_update_sm_context(
AMF_UPDATE_SM_CONTEXT_REGISTRATION_REQUEST)) { AMF_UPDATE_SM_CONTEXT_REGISTRATION_REQUEST)) {
CLEAR_AMF_UE_TIMER(amf_ue->t3550); 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_CLEAR_N2_TRANSFER(
amf_ue, pdu_session_resource_setup_request); 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) && AMF_RELEASE_SM_CONTEXT_SERVICE_ACCEPT) &&
SESSION_SYNC_DONE(amf_ue, SESSION_SYNC_DONE(amf_ue,
AMF_UPDATE_SM_CONTEXT_SERVICE_REQUEST)) { 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_CLEAR_N2_TRANSFER(
amf_ue, pdu_session_resource_setup_request); 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, if (SESSION_SYNC_DONE(amf_ue,
AMF_UPDATE_SM_CONTEXT_HANDOVER_REQUIRED)) { 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); AMF_UE_CLEAR_N2_TRANSFER(amf_ue, handover_request);
} }
@ -238,16 +252,18 @@ int amf_nsmf_pdusession_handle_update_sm_context(
if (!n1smbuf) { if (!n1smbuf) {
ogs_error("[%s:%d] No N1 SM Content [%s]", ogs_error("[%s:%d] No N1 SM Content [%s]",
amf_ue->supi, sess->psi, n1SmMsg->content_id); amf_ue->supi, sess->psi, n1SmMsg->content_id);
nas_5gs_send_back_5gsm_message(sess, ogs_assert(OGS_OK ==
OGS_5GMM_CAUSE_SEMANTICALLY_INCORRECT_MESSAGE); nas_5gs_send_back_5gsm_message(sess,
OGS_5GMM_CAUSE_SEMANTICALLY_INCORRECT_MESSAGE));
return OGS_ERROR; return OGS_ERROR;
} }
if (!n2smbuf) { if (!n2smbuf) {
ogs_error("[%s:%d] No N2 SM Content", ogs_error("[%s:%d] No N2 SM Content",
amf_ue->supi, sess->psi); amf_ue->supi, sess->psi);
nas_5gs_send_back_5gsm_message(sess, ogs_assert(OGS_OK ==
OGS_5GMM_CAUSE_SEMANTICALLY_INCORRECT_MESSAGE); nas_5gs_send_back_5gsm_message(sess,
OGS_5GMM_CAUSE_SEMANTICALLY_INCORRECT_MESSAGE));
return OGS_ERROR; return OGS_ERROR;
} }
@ -261,16 +277,19 @@ int amf_nsmf_pdusession_handle_update_sm_context(
n2smbuf = ogs_pkbuf_copy(n2smbuf); n2smbuf = ogs_pkbuf_copy(n2smbuf);
ogs_assert(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; break;
case OpenAPI_n2_sm_info_type_PATH_SWITCH_REQ_ACK: case OpenAPI_n2_sm_info_type_PATH_SWITCH_REQ_ACK:
if (!n2smbuf) { if (!n2smbuf) {
ogs_error("[%s:%d] No N2 SM Content", ogs_error("[%s:%d] No N2 SM Content",
amf_ue->supi, sess->psi); 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_Cause_PR_protocol,
NGAP_CauseProtocol_semantic_error); NGAP_CauseProtocol_semantic_error));
return OGS_ERROR; return OGS_ERROR;
} }
@ -279,7 +298,8 @@ int amf_nsmf_pdusession_handle_update_sm_context(
ogs_pkbuf_copy(n2smbuf)); ogs_pkbuf_copy(n2smbuf));
if (SESSION_SYNC_DONE(amf_ue, state)) { 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); 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) { if (!n2smbuf) {
ogs_error("[%s:%d] No N2 SM Content", ogs_error("[%s:%d] No N2 SM Content",
amf_ue->supi, sess->psi); 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_Cause_PR_protocol,
NGAP_CauseProtocol_semantic_error); NGAP_CauseProtocol_semantic_error));
return OGS_ERROR; return OGS_ERROR;
} }
@ -299,7 +320,8 @@ int amf_nsmf_pdusession_handle_update_sm_context(
sess, handover_command, ogs_pkbuf_copy(n2smbuf)); sess, handover_command, ogs_pkbuf_copy(n2smbuf));
if (SESSION_SYNC_DONE(amf_ue, state)) { 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); AMF_UE_CLEAR_N2_TRANSFER(amf_ue, handover_command);
} }
@ -308,8 +330,10 @@ int amf_nsmf_pdusession_handle_update_sm_context(
default: default:
ogs_error("Not implemented [%d]", ogs_error("Not implemented [%d]",
SmContextUpdatedData->n2_sm_info_type); SmContextUpdatedData->n2_sm_info_type);
ngap_send_error_indication2(amf_ue, ogs_assert(OGS_OK ==
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ngap_send_error_indication2(amf_ue,
NGAP_Cause_PR_protocol,
NGAP_CauseProtocol_semantic_error));
} }
} else { } else {
@ -350,9 +374,11 @@ int amf_nsmf_pdusession_handle_update_sm_context(
if (SESSION_SYNC_DONE(amf_ue, state)) { if (SESSION_SYNC_DONE(amf_ue, state)) {
ogs_assert(amf_ue->deactivation.group); ogs_assert(amf_ue->deactivation.group);
ngap_send_amf_ue_context_release_command(amf_ue, ogs_assert(OGS_OK ==
amf_ue->deactivation.group, amf_ue->deactivation.cause, ngap_send_amf_ue_context_release_command(amf_ue,
NGAP_UE_CTX_REL_NG_REMOVE_AND_UNLINK, 0); 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) { } 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; target_ue = source_ue->target_ue;
ogs_assert(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_Cause_PR_radioNetwork,
NGAP_CauseRadioNetwork_handover_cancelled, 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) { } 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); ran_ue_remove(ran_ue);
if (ogs_list_count(&gnb->ran_ue_list) == 0) 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 { } else {
ogs_warn("[%s] RAN-NG Context has already been removed", ogs_warn("[%s] RAN-NG Context has already been removed",
@ -552,15 +580,17 @@ int amf_nsmf_pdusession_handle_update_sm_context(
if (!SmContextUpdateError) { if (!SmContextUpdateError) {
ogs_error("[%d:%d] No SmContextUpdateError [%d]", ogs_error("[%d:%d] No SmContextUpdateError [%d]",
sess->psi, sess->pti, recvmsg->res_status); sess->psi, sess->pti, recvmsg->res_status);
ngap_send_error_indication2(amf_ue, ogs_assert(OGS_OK ==
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ngap_send_error_indication2(amf_ue,
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error));
return OGS_ERROR; return OGS_ERROR;
} }
if (!SmContextUpdateError->error) { if (!SmContextUpdateError->error) {
ogs_error("[%d:%d] No Error [%d]", ogs_error("[%d:%d] No Error [%d]",
sess->psi, sess->pti, recvmsg->res_status); sess->psi, sess->pti, recvmsg->res_status);
ngap_send_error_indication2(amf_ue, ogs_assert(OGS_OK ==
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ngap_send_error_indication2(amf_ue,
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error));
return OGS_ERROR; return OGS_ERROR;
} }
@ -575,9 +605,10 @@ int amf_nsmf_pdusession_handle_update_sm_context(
*/ */
n1smbuf = ogs_pkbuf_copy(n1smbuf); n1smbuf = ogs_pkbuf_copy(n1smbuf);
ogs_assert(n1smbuf); ogs_assert(n1smbuf);
nas_5gs_send_gsm_reject_from_sbi(sess, ogs_assert(OGS_OK ==
OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION, nas_5gs_send_gsm_reject_from_sbi(sess,
n1smbuf, recvmsg->res_status); OGS_NAS_PAYLOAD_CONTAINER_N1_SM_INFORMATION,
n1smbuf, recvmsg->res_status));
return OGS_ERROR; return OGS_ERROR;
} }
} }
@ -586,8 +617,9 @@ int amf_nsmf_pdusession_handle_update_sm_context(
n2SmInfo = SmContextUpdateError->n2_sm_info; n2SmInfo = SmContextUpdateError->n2_sm_info;
if (!n2SmInfo || !n2SmInfo->content_id) { if (!n2SmInfo || !n2SmInfo->content_id) {
ogs_error("[%d:%d] No N2 SM Message", sess->psi, sess->pti); ogs_error("[%d:%d] No N2 SM Message", sess->psi, sess->pti);
ngap_send_error_indication2(amf_ue, ogs_assert(OGS_OK ==
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ngap_send_error_indication2(amf_ue,
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error));
return OGS_ERROR; return OGS_ERROR;
} }
@ -596,16 +628,18 @@ int amf_nsmf_pdusession_handle_update_sm_context(
if (!n2smbuf) { if (!n2smbuf) {
ogs_error("[%d:%d] No N2 SM Content [%s]", ogs_error("[%d:%d] No N2 SM Content [%s]",
sess->psi, sess->pti, n2SmInfo->content_id); sess->psi, sess->pti, n2SmInfo->content_id);
ngap_send_error_indication2(amf_ue, ogs_assert(OGS_OK ==
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ngap_send_error_indication2(amf_ue,
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error));
return OGS_ERROR; return OGS_ERROR;
} }
#endif #endif
ogs_error("[%d:%d] HTTP response error [%d]", ogs_error("[%d:%d] HTTP response error [%d]",
sess->psi, sess->pti, recvmsg->res_status); sess->psi, sess->pti, recvmsg->res_status);
ngap_send_error_indication2(amf_ue, ogs_assert(OGS_OK ==
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error); ngap_send_error_indication2(amf_ue,
NGAP_Cause_PR_protocol, NGAP_CauseProtocol_semantic_error));
return OGS_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)) amf_ue, AMF_UPDATE_SM_CONTEXT_REGISTRATION_REQUEST))
CLEAR_AMF_UE_TIMER(amf_ue->t3550); 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) { } 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) && if (SESSION_SYNC_DONE(amf_ue, AMF_RELEASE_SM_CONTEXT_SERVICE_ACCEPT) &&
SESSION_SYNC_DONE(amf_ue, AMF_UPDATE_SM_CONTEXT_SERVICE_REQUEST)) 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 { } else {
@ -658,9 +694,10 @@ int amf_nsmf_pdusession_handle_release_sm_context(amf_sess_t *sess, int state)
* 3. UE Context release command * 3. UE Context release command
* 4. UE Context release complete * 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_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) { } 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 * 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)) { } 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 * 3. UE Context release command
* 4. UE Context release complete * 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_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, } else if (OGS_FSM_CHECK(&amf_ue->sm,
gmm_state_initial_context_setup)) { gmm_state_initial_context_setup)) {

View File

@ -151,16 +151,18 @@ void amf_ue_sbi_discover_and_send(
amf_timer_sbi_client_wait_expire); amf_timer_sbi_client_wait_expire);
if (!xact) { if (!xact) {
ogs_error("amf_ue_sbi_discover_and_send() failed"); ogs_error("amf_ue_sbi_discover_and_send() failed");
nas_5gs_send_gmm_reject_from_sbi( ogs_assert(OGS_OK ==
amf_ue, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT); nas_5gs_send_gmm_reject_from_sbi(
amf_ue, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT));
return; return;
} }
if (ogs_sbi_discover_and_send(xact, if (ogs_sbi_discover_and_send(xact,
(ogs_fsm_handler_t)amf_nf_state_registered, client_cb) != true) { (ogs_fsm_handler_t)amf_nf_state_registered, client_cb) != true) {
ogs_error("amf_ue_sbi_discover_and_send() failed"); ogs_error("amf_ue_sbi_discover_and_send() failed");
nas_5gs_send_gmm_reject_from_sbi( ogs_assert(OGS_OK ==
amf_ue, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT); nas_5gs_send_gmm_reject_from_sbi(
amf_ue, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT));
return; 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); amf_timer_sbi_client_wait_expire);
if (!xact) { if (!xact) {
ogs_error("amf_sess_sbi_discover_and_send() failed"); ogs_error("amf_sess_sbi_discover_and_send() failed");
nas_5gs_send_back_5gsm_message_from_sbi( ogs_assert(OGS_OK ==
sess, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT); nas_5gs_send_back_5gsm_message_from_sbi(
sess, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT));
return; 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, if (ogs_sbi_discover_and_send(xact,
(ogs_fsm_handler_t)amf_nf_state_registered, client_cb) != true) { (ogs_fsm_handler_t)amf_nf_state_registered, client_cb) != true) {
ogs_error("amf_sess_sbi_discover_and_send() failed"); ogs_error("amf_sess_sbi_discover_and_send() failed");
nas_5gs_send_back_5gsm_message_from_sbi( ogs_assert(OGS_OK ==
sess, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT); nas_5gs_send_back_5gsm_message_from_sbi(
sess, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT));
return; return;
} }
} }
@ -209,24 +213,27 @@ static int client_discover_cb(ogs_sbi_response_t *response, void *data)
rv = ogs_sbi_parse_response(&message, response); rv = ogs_sbi_parse_response(&message, response);
if (rv != OGS_OK) { if (rv != OGS_OK) {
ogs_error("cannot parse HTTP response"); ogs_error("cannot parse HTTP response");
nas_5gs_send_back_5gsm_message_from_sbi( ogs_assert(OGS_OK ==
sess, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT); nas_5gs_send_back_5gsm_message_from_sbi(
sess, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT));
goto cleanup; goto cleanup;
} }
if (message.res_status != OGS_SBI_HTTP_STATUS_OK) { if (message.res_status != OGS_SBI_HTTP_STATUS_OK) {
ogs_error("NF-Discover failed [%d]", message.res_status); ogs_error("NF-Discover failed [%d]", message.res_status);
nas_5gs_send_back_5gsm_message_from_sbi( ogs_assert(OGS_OK ==
sess, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT); nas_5gs_send_back_5gsm_message_from_sbi(
sess, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT));
goto cleanup; goto cleanup;
} }
if (!message.SearchResult) { if (!message.SearchResult) {
ogs_error("No SearchResult"); ogs_error("No SearchResult");
nas_5gs_send_back_5gsm_message_from_sbi( ogs_assert(OGS_OK ==
sess, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT); nas_5gs_send_back_5gsm_message_from_sbi(
sess, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT));
goto cleanup; 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)) { if (!OGS_SBI_NF_INSTANCE(&sess->sbi, OpenAPI_nf_type_SMF)) {
ogs_error("Cannot discover [%s]", ogs_error("Cannot discover [%s]",
OpenAPI_nf_type_ToString(OpenAPI_nf_type_SMF)); OpenAPI_nf_type_ToString(OpenAPI_nf_type_SMF));
nas_5gs_send_back_5gsm_message_from_sbi( ogs_assert(OGS_OK ==
sess, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT); nas_5gs_send_back_5gsm_message_from_sbi(
sess, OGS_SBI_HTTP_STATUS_GATEWAY_TIMEOUT));
goto cleanup; goto cleanup;
} }

View File

@ -110,9 +110,10 @@ int emm_handle_attach_request(mme_ue_t *mme_ue,
/* Send Attach Reject */ /* Send Attach Reject */
ogs_warn("Cannot find Served TAI[PLMN_ID:%06x,TAC:%d]", ogs_warn("Cannot find Served TAI[PLMN_ID:%06x,TAC:%d]",
ogs_plmn_id_hexdump(&mme_ue->tai.plmn_id), mme_ue->tai.tac); ogs_plmn_id_hexdump(&mme_ue->tai.plmn_id), mme_ue->tai.tac);
nas_eps_send_attach_reject(mme_ue, ogs_assert(OGS_OK ==
EMM_CAUSE_TRACKING_AREA_NOT_ALLOWED, nas_eps_send_attach_reject(mme_ue,
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); EMM_CAUSE_TRACKING_AREA_NOT_ALLOWED,
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED));
return OGS_ERROR; return OGS_ERROR;
} }
ogs_debug(" SERVED_TAI_INDEX[%d]", served_tai_index); 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", "but Integrity[0x%x] cannot be bypassed with EIA0",
mme_selected_enc_algorithm(mme_ue), mme_selected_enc_algorithm(mme_ue),
mme_selected_int_algorithm(mme_ue)); mme_selected_int_algorithm(mme_ue));
nas_eps_send_attach_reject(mme_ue, ogs_assert(OGS_OK ==
EMM_CAUSE_UE_SECURITY_CAPABILITIES_MISMATCH, nas_eps_send_attach_reject(mme_ue,
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); EMM_CAUSE_UE_SECURITY_CAPABILITIES_MISMATCH,
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED));
return OGS_ERROR; return OGS_ERROR;
} }
@ -501,7 +503,9 @@ int emm_handle_tau_request(mme_ue_t *mme_ue,
/* Send TAU reject */ /* Send TAU reject */
ogs_warn("Cannot find Served TAI[PLMN_ID:%06x,TAC:%d]", ogs_warn("Cannot find Served TAI[PLMN_ID:%06x,TAC:%d]",
ogs_plmn_id_hexdump(&mme_ue->tai.plmn_id), mme_ue->tai.tac); 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; return OGS_ERROR;
} }
ogs_debug(" SERVED_TAI_INDEX[%d]", served_tai_index); 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 */ /* Send TAU reject */
ogs_warn("Cannot find Served TAI[PLMN_ID:%06x,TAC:%d]", ogs_warn("Cannot find Served TAI[PLMN_ID:%06x,TAC:%d]",
ogs_plmn_id_hexdump(&mme_ue->tai.plmn_id), mme_ue->tai.tac); 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; return OGS_ERROR;
} }
ogs_debug(" SERVED_TAI_INDEX[%d]", served_tai_index); ogs_debug(" SERVED_TAI_INDEX[%d]", served_tai_index);

View File

@ -131,37 +131,42 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e)
if (!MME_UE_HAVE_IMSI(mme_ue)) { if (!MME_UE_HAVE_IMSI(mme_ue)) {
ogs_info("Service request : Unknown UE"); ogs_info("Service request : Unknown UE");
nas_eps_send_service_reject(mme_ue, ogs_assert(OGS_OK ==
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); nas_eps_send_service_reject(mme_ue,
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK));
OGS_FSM_TRAN(s, &emm_state_exception); OGS_FSM_TRAN(s, &emm_state_exception);
break; break;
} }
if (!SECURITY_CONTEXT_IS_VALID(mme_ue)) { if (!SECURITY_CONTEXT_IS_VALID(mme_ue)) {
ogs_warn("No Security Context : IMSI[%s]", mme_ue->imsi_bcd); ogs_warn("No Security Context : IMSI[%s]", mme_ue->imsi_bcd);
nas_eps_send_service_reject(mme_ue, ogs_assert(OGS_OK ==
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); nas_eps_send_service_reject(mme_ue,
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK));
OGS_FSM_TRAN(s, &emm_state_exception); OGS_FSM_TRAN(s, &emm_state_exception);
break; break;
} }
if (!SESSION_CONTEXT_IS_AVAILABLE(mme_ue)) { if (!SESSION_CONTEXT_IS_AVAILABLE(mme_ue)) {
ogs_warn("No Session Context : IMSI[%s]", mme_ue->imsi_bcd); ogs_warn("No Session Context : IMSI[%s]", mme_ue->imsi_bcd);
nas_eps_send_service_reject(mme_ue, ogs_assert(OGS_OK ==
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); nas_eps_send_service_reject(mme_ue,
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK));
OGS_FSM_TRAN(s, &emm_state_exception); OGS_FSM_TRAN(s, &emm_state_exception);
break; break;
} }
if (!ACTIVE_EPS_BEARERS_IS_AVAIABLE(mme_ue)) { if (!ACTIVE_EPS_BEARERS_IS_AVAIABLE(mme_ue)) {
ogs_warn("No active EPS bearers : IMSI[%s]", mme_ue->imsi_bcd); ogs_warn("No active EPS bearers : IMSI[%s]", mme_ue->imsi_bcd);
nas_eps_send_service_reject(mme_ue, ogs_assert(OGS_OK ==
EMM_CAUSE_NO_EPS_BEARER_CONTEXT_ACTIVATED); nas_eps_send_service_reject(mme_ue,
EMM_CAUSE_NO_EPS_BEARER_CONTEXT_ACTIVATED));
OGS_FSM_TRAN(s, &emm_state_exception); OGS_FSM_TRAN(s, &emm_state_exception);
break; 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); OGS_FSM_TRAN(s, &emm_state_registered);
break; 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)) { if (!MME_UE_HAVE_IMSI(mme_ue)) {
CLEAR_MME_UE_TIMER(mme_ue->t3470); 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; break;
} }
@ -219,9 +225,10 @@ static void common_register_state(ogs_fsm_t *s, mme_event_t *e)
&mme_ue->pdn_connectivity_request); &mme_ue->pdn_connectivity_request);
if (rv != OGS_OK) { if (rv != OGS_OK) {
ogs_error("nas_eps_send_emm_to_esm() failed"); ogs_error("nas_eps_send_emm_to_esm() failed");
nas_eps_send_attach_reject(mme_ue, ogs_assert(OGS_OK ==
EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED, nas_eps_send_attach_reject(mme_ue,
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED,
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED));
OGS_FSM_TRAN(s, &emm_state_exception); OGS_FSM_TRAN(s, &emm_state_exception);
break; 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)) { if (!MME_UE_HAVE_IMSI(mme_ue)) {
ogs_info("TAU request : Unknown UE"); ogs_info("TAU request : Unknown UE");
nas_eps_send_tau_reject(mme_ue, ogs_assert(OGS_OK ==
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); nas_eps_send_tau_reject(mme_ue,
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK));
OGS_FSM_TRAN(s, &emm_state_exception); OGS_FSM_TRAN(s, &emm_state_exception);
break; break;
} }
if (!SESSION_CONTEXT_IS_AVAILABLE(mme_ue)) { if (!SESSION_CONTEXT_IS_AVAILABLE(mme_ue)) {
ogs_warn("No PDN Connection : UE[%s]", mme_ue->imsi_bcd); ogs_warn("No PDN Connection : UE[%s]", mme_ue->imsi_bcd);
nas_eps_send_tau_reject(mme_ue, ogs_assert(OGS_OK ==
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); nas_eps_send_tau_reject(mme_ue,
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK));
OGS_FSM_TRAN(s, emm_state_exception); OGS_FSM_TRAN(s, emm_state_exception);
break; break;
} }
if (!ACTIVE_EPS_BEARERS_IS_AVAIABLE(mme_ue)) { if (!ACTIVE_EPS_BEARERS_IS_AVAIABLE(mme_ue)) {
ogs_warn("No active EPS bearers : IMSI[%s]", mme_ue->imsi_bcd); ogs_warn("No active EPS bearers : IMSI[%s]", mme_ue->imsi_bcd);
nas_eps_send_tau_reject(mme_ue, ogs_assert(OGS_OK ==
EMM_CAUSE_NO_EPS_BEARER_CONTEXT_ACTIVATED); nas_eps_send_tau_reject(mme_ue,
EMM_CAUSE_NO_EPS_BEARER_CONTEXT_ACTIVATED));
OGS_FSM_TRAN(s, &emm_state_exception); OGS_FSM_TRAN(s, &emm_state_exception);
break; 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) { if (e->s1ap_code == S1AP_ProcedureCode_id_initialUEMessage) {
ogs_debug(" Iniital UE Message"); ogs_debug(" Iniital UE Message");
if (mme_ue->nas_eps.update.active_flag) { if (mme_ue->nas_eps.update.active_flag) {
nas_eps_send_tau_accept(mme_ue, ogs_assert(OGS_OK ==
S1AP_ProcedureCode_id_InitialContextSetup); nas_eps_send_tau_accept(mme_ue,
S1AP_ProcedureCode_id_InitialContextSetup));
} else { } else {
nas_eps_send_tau_accept(mme_ue, ogs_assert(OGS_OK ==
S1AP_ProcedureCode_id_downlinkNASTransport); nas_eps_send_tau_accept(mme_ue,
S1AP_ProcedureCode_id_downlinkNASTransport));
} }
} else if (e->s1ap_code == } else if (e->s1ap_code ==
S1AP_ProcedureCode_id_uplinkNASTransport) { S1AP_ProcedureCode_id_uplinkNASTransport) {
ogs_debug(" Uplink NAS Transport"); ogs_debug(" Uplink NAS Transport");
nas_eps_send_tau_accept(mme_ue, ogs_assert(OGS_OK ==
S1AP_ProcedureCode_id_downlinkNASTransport); nas_eps_send_tau_accept(mme_ue,
S1AP_ProcedureCode_id_downlinkNASTransport));
} else { } else {
ogs_fatal("Invalid Procedure Code[%d]", (int)e->s1ap_code); 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)) { if (!MME_UE_HAVE_IMSI(mme_ue)) {
ogs_warn("Extended Service request : Unknown UE"); ogs_warn("Extended Service request : Unknown UE");
nas_eps_send_service_reject(mme_ue, ogs_assert(OGS_OK ==
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); nas_eps_send_service_reject(mme_ue,
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK));
OGS_FSM_TRAN(s, &emm_state_exception); OGS_FSM_TRAN(s, &emm_state_exception);
break; break;
} }
if (!SESSION_CONTEXT_IS_AVAILABLE(mme_ue)) { if (!SESSION_CONTEXT_IS_AVAILABLE(mme_ue)) {
ogs_warn("No PDN Connection : UE[%s]", mme_ue->imsi_bcd); ogs_warn("No PDN Connection : UE[%s]", mme_ue->imsi_bcd);
nas_eps_send_service_reject(mme_ue, ogs_assert(OGS_OK ==
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); nas_eps_send_service_reject(mme_ue,
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK));
OGS_FSM_TRAN(s, emm_state_exception); OGS_FSM_TRAN(s, emm_state_exception);
break; break;
} }
if (!SECURITY_CONTEXT_IS_VALID(mme_ue)) { if (!SECURITY_CONTEXT_IS_VALID(mme_ue)) {
ogs_warn("No Security Context : IMSI[%s]", mme_ue->imsi_bcd); ogs_warn("No Security Context : IMSI[%s]", mme_ue->imsi_bcd);
nas_eps_send_service_reject(mme_ue, ogs_assert(OGS_OK ==
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); nas_eps_send_service_reject(mme_ue,
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK));
OGS_FSM_TRAN(s, &emm_state_exception); OGS_FSM_TRAN(s, &emm_state_exception);
break; 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)) { if (!MME_P_TMSI_IS_AVAILABLE(mme_ue)) {
ogs_warn("No P-TMSI : UE[%s]", mme_ue->imsi_bcd); ogs_warn("No P-TMSI : UE[%s]", mme_ue->imsi_bcd);
nas_eps_send_service_reject(mme_ue, ogs_assert(OGS_OK ==
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); 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( mme_send_release_access_bearer_or_ue_context_release(
enb_ue); enb_ue);
break; 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_NAS_SERVICE_TYPE_CS_FALLBACK_EMERGENCY_CALL_FROM_UE) {
ogs_debug(" MO-CSFB-INDICATION[%d]", ogs_debug(" MO-CSFB-INDICATION[%d]",
mme_ue->nas_eps.service.value); 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 == } else if (mme_ue->nas_eps.service.value ==
OGS_NAS_SERVICE_TYPE_CS_FALLBACK_TO_UE) { OGS_NAS_SERVICE_TYPE_CS_FALLBACK_TO_UE) {
ogs_debug(" SERVICE_REQUEST[%d]", ogs_debug(" SERVICE_REQUEST[%d]",
mme_ue->nas_eps.service.value); 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 { } else {
ogs_warn(" Unknown CSFB Service Type[%d]", ogs_warn(" Unknown CSFB Service Type[%d]",
mme_ue->nas_eps.service.value); mme_ue->nas_eps.service.value);
nas_eps_send_service_reject(mme_ue, ogs_assert(OGS_OK ==
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); nas_eps_send_service_reject(mme_ue,
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK)
);
OGS_FSM_TRAN(s, &emm_state_exception); OGS_FSM_TRAN(s, &emm_state_exception);
break; 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 == } else if (e->s1ap_code ==
S1AP_ProcedureCode_id_uplinkNASTransport) { 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)) { if (!MME_P_TMSI_IS_AVAILABLE(mme_ue)) {
ogs_warn("No P-TMSI : UE[%s]", mme_ue->imsi_bcd); ogs_warn("No P-TMSI : UE[%s]", mme_ue->imsi_bcd);
nas_eps_send_service_reject(mme_ue, ogs_assert(OGS_OK ==
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); nas_eps_send_service_reject(mme_ue,
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK)
);
break; 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_NAS_SERVICE_TYPE_CS_FALLBACK_EMERGENCY_CALL_FROM_UE) {
ogs_debug(" MO-CSFB-INDICATION[%d]", ogs_debug(" MO-CSFB-INDICATION[%d]",
mme_ue->nas_eps.service.value); 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 == } else if (mme_ue->nas_eps.service.value ==
OGS_NAS_SERVICE_TYPE_CS_FALLBACK_TO_UE) { OGS_NAS_SERVICE_TYPE_CS_FALLBACK_TO_UE) {
ogs_debug(" SERVICE_REQUEST[%d]", ogs_debug(" SERVICE_REQUEST[%d]",
mme_ue->nas_eps.service.value); mme_ue->nas_eps.service.value);
sgsap_send_service_request( ogs_assert(OGS_OK ==
mme_ue, SGSAP_EMM_CONNECTED_MODE); sgsap_send_service_request(
mme_ue, SGSAP_EMM_CONNECTED_MODE));
} else { } else {
ogs_warn(" Unknown CSFB Service Type[%d]", ogs_warn(" Unknown CSFB Service Type[%d]",
mme_ue->nas_eps.service.value); mme_ue->nas_eps.service.value);
nas_eps_send_service_reject(mme_ue, ogs_assert(OGS_OK ==
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); nas_eps_send_service_reject(mme_ue,
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK)
);
OGS_FSM_TRAN(s, &emm_state_exception); OGS_FSM_TRAN(s, &emm_state_exception);
break; break;
} }
s1ap_send_ue_context_modification_request(mme_ue); ogs_assert(OGS_OK ==
s1ap_send_ue_context_modification_request(mme_ue));
} else { } else {
ogs_error("Invalid Procedure Code[%d]", (int)e->s1ap_code); 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)) { 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 { } else {
mme_send_delete_session_or_detach(mme_ue); 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("Uplink NAS Transport");
ogs_debug(" IMSI[%s]", mme_ue->imsi_bcd); ogs_debug(" IMSI[%s]", mme_ue->imsi_bcd);
if (MME_SGSAP_IS_CONNECTED(mme_ue)) { if (MME_SGSAP_IS_CONNECTED(mme_ue)) {
sgsap_send_uplink_unitdata(mme_ue, &message->emm. ogs_assert(OGS_OK ==
uplink_nas_transport.nas_message_container); sgsap_send_uplink_unitdata(mme_ue, &message->emm.
uplink_nas_transport.nas_message_container));
} else { } else {
S1AP_MME_UE_S1AP_ID_t MME_UE_S1AP_ID; S1AP_MME_UE_S1AP_ID_t MME_UE_S1AP_ID;
S1AP_ENB_UE_S1AP_ID_t ENB_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; MME_UE_S1AP_ID = enb_ue->mme_ue_s1ap_id;
ENB_UE_S1AP_ID = enb_ue->enb_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, &MME_UE_S1AP_ID, &ENB_UE_S1AP_ID,
S1AP_Cause_PR_transport, S1AP_Cause_PR_transport,
S1AP_CauseTransport_transport_resource_unavailable); S1AP_CauseTransport_transport_resource_unavailable));
} }
break; 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) || if (CS_CALL_SERVICE_INDICATOR(mme_ue) ||
SMS_SERVICE_INDICATOR(mme_ue)) { SMS_SERVICE_INDICATOR(mme_ue)) {
sgsap_send_ue_unreachable(mme_ue, ogs_assert(OGS_OK ==
SGSAP_SGS_CAUSE_UE_UNREACHABLE); 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); OGS_FSM_TRAN(&mme_ue->sm, &emm_state_exception);
} else { } else {
mme_ue->t3470.retry_count++; mme_ue->t3470.retry_count++;
nas_eps_send_identity_request(mme_ue); ogs_assert(OGS_OK ==
nas_eps_send_identity_request(mme_ue));
} }
break; break;
@ -645,7 +681,8 @@ void emm_state_authentication(ogs_fsm_t *s, mme_event_t *e)
authentication_response_parameter->length); authentication_response_parameter->length);
ogs_log_hexdump(OGS_LOG_WARN, ogs_log_hexdump(OGS_LOG_WARN,
mme_ue->xres, OGS_MAX_RES_LEN); 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); OGS_FSM_TRAN(&mme_ue->sm, &emm_state_exception);
} else { } else {
OGS_FSM_TRAN(&mme_ue->sm, &emm_state_security_mode); 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; 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); OGS_FSM_TRAN(&mme_ue->sm, &emm_state_exception);
break; break;
@ -739,10 +777,12 @@ void emm_state_authentication(ogs_fsm_t *s, mme_event_t *e)
"Stop retransmission", mme_ue->imsi_bcd); "Stop retransmission", mme_ue->imsi_bcd);
OGS_FSM_TRAN(&mme_ue->sm, &emm_state_exception); 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 { } else {
mme_ue->t3460.retry_count++; mme_ue->t3460.retry_count++;
nas_eps_send_authentication_request(mme_ue); ogs_assert(OGS_OK ==
nas_eps_send_authentication_request(mme_ue));
} }
break; break;
default: default:
@ -775,7 +815,8 @@ void emm_state_security_mode(ogs_fsm_t *s, mme_event_t *e)
switch (e->id) { switch (e->id) {
case OGS_FSM_ENTRY_SIG: case OGS_FSM_ENTRY_SIG:
CLEAR_MME_UE_TIMER(mme_ue->t3460); 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; break;
case OGS_FSM_EXIT_SIG: case OGS_FSM_EXIT_SIG:
break; 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 if (message->emm.h.security_header_type
== OGS_NAS_SECURITY_HEADER_FOR_SERVICE_REQUEST_MESSAGE) { == OGS_NAS_SECURITY_HEADER_FOR_SERVICE_REQUEST_MESSAGE) {
ogs_debug("Service request"); ogs_debug("Service request");
nas_eps_send_service_reject(mme_ue, ogs_assert(OGS_OK ==
EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED); nas_eps_send_service_reject(mme_ue,
EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED));
OGS_FSM_TRAN(s, &emm_state_exception); OGS_FSM_TRAN(s, &emm_state_exception);
break; break;
} }
@ -804,18 +846,20 @@ void emm_state_security_mode(ogs_fsm_t *s, mme_event_t *e)
if (h.integrity_protected == 0) { if (h.integrity_protected == 0) {
ogs_error("[%s] No Integrity Protected", mme_ue->imsi_bcd); ogs_error("[%s] No Integrity Protected", mme_ue->imsi_bcd);
nas_eps_send_attach_reject(mme_ue, ogs_assert(OGS_OK ==
EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED, nas_eps_send_attach_reject(mme_ue,
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED,
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED));
OGS_FSM_TRAN(s, &emm_state_exception); OGS_FSM_TRAN(s, &emm_state_exception);
break; break;
} }
if (!SECURITY_CONTEXT_IS_VALID(mme_ue)) { if (!SECURITY_CONTEXT_IS_VALID(mme_ue)) {
ogs_warn("[%s] No Security Context", mme_ue->imsi_bcd); ogs_warn("[%s] No Security Context", mme_ue->imsi_bcd);
nas_eps_send_attach_reject(mme_ue, ogs_assert(OGS_OK ==
EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED, nas_eps_send_attach_reject(mme_ue,
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED,
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED));
OGS_FSM_TRAN(s, &emm_state_exception); OGS_FSM_TRAN(s, &emm_state_exception);
break; break;
} }
@ -863,8 +907,9 @@ void emm_state_security_mode(ogs_fsm_t *s, mme_event_t *e)
break; break;
case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST: case OGS_NAS_EPS_TRACKING_AREA_UPDATE_REQUEST:
ogs_debug("Tracking area update request"); ogs_debug("Tracking area update request");
nas_eps_send_tau_reject(mme_ue, ogs_assert(OGS_OK ==
EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED); nas_eps_send_tau_reject(mme_ue,
EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED));
OGS_FSM_TRAN(s, &emm_state_exception); OGS_FSM_TRAN(s, &emm_state_exception);
break; break;
case OGS_NAS_EPS_EMM_STATUS: 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); "Stop retransmission", mme_ue->imsi_bcd);
OGS_FSM_TRAN(&mme_ue->sm, &emm_state_exception); OGS_FSM_TRAN(&mme_ue->sm, &emm_state_exception);
nas_eps_send_attach_reject(mme_ue, ogs_assert(OGS_OK ==
EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED, nas_eps_send_attach_reject(mme_ue,
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED,
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED));
} else { } else {
mme_ue->t3460.retry_count++; 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; break;
default: 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 if (message->emm.h.security_header_type
== OGS_NAS_SECURITY_HEADER_FOR_SERVICE_REQUEST_MESSAGE) { == OGS_NAS_SECURITY_HEADER_FOR_SERVICE_REQUEST_MESSAGE) {
ogs_debug("Service request"); ogs_debug("Service request");
nas_eps_send_service_reject(mme_ue, ogs_assert(OGS_OK ==
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK); nas_eps_send_service_reject(mme_ue,
EMM_CAUSE_UE_IDENTITY_CANNOT_BE_DERIVED_BY_THE_NETWORK));
OGS_FSM_TRAN(s, &emm_state_exception); OGS_FSM_TRAN(s, &emm_state_exception);
break; break;
} }
@ -963,18 +1011,20 @@ void emm_state_initial_context_setup(ogs_fsm_t *s, mme_event_t *e)
if (h.integrity_protected == 0) { if (h.integrity_protected == 0) {
ogs_error("[%s] No Integrity Protected", mme_ue->imsi_bcd); ogs_error("[%s] No Integrity Protected", mme_ue->imsi_bcd);
nas_eps_send_attach_reject(mme_ue, ogs_assert(OGS_OK ==
EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED, nas_eps_send_attach_reject(mme_ue,
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED,
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED));
OGS_FSM_TRAN(s, &emm_state_exception); OGS_FSM_TRAN(s, &emm_state_exception);
break; break;
} }
if (!SECURITY_CONTEXT_IS_VALID(mme_ue)) { if (!SECURITY_CONTEXT_IS_VALID(mme_ue)) {
ogs_warn("[%s] No Security Context", mme_ue->imsi_bcd); ogs_warn("[%s] No Security Context", mme_ue->imsi_bcd);
nas_eps_send_attach_reject(mme_ue, ogs_assert(OGS_OK ==
EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED, nas_eps_send_attach_reject(mme_ue,
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED,
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED));
OGS_FSM_TRAN(s, &emm_state_exception); OGS_FSM_TRAN(s, &emm_state_exception);
break; 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); mme_ue_confirm_guti(mme_ue);
if (MME_P_TMSI_IS_AVAILABLE(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); OGS_FSM_TRAN(s, &emm_state_registered);
break; break;
@ -1007,18 +1058,20 @@ void emm_state_initial_context_setup(ogs_fsm_t *s, mme_event_t *e)
if (h.integrity_protected == 0) { if (h.integrity_protected == 0) {
ogs_error("[%s] No Integrity Protected", mme_ue->imsi_bcd); ogs_error("[%s] No Integrity Protected", mme_ue->imsi_bcd);
nas_eps_send_attach_reject(mme_ue, ogs_assert(OGS_OK ==
EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED, nas_eps_send_attach_reject(mme_ue,
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED,
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED));
OGS_FSM_TRAN(s, &emm_state_exception); OGS_FSM_TRAN(s, &emm_state_exception);
break; break;
} }
if (!SECURITY_CONTEXT_IS_VALID(mme_ue)) { if (!SECURITY_CONTEXT_IS_VALID(mme_ue)) {
ogs_warn("[%s] No Security Context", mme_ue->imsi_bcd); ogs_warn("[%s] No Security Context", mme_ue->imsi_bcd);
nas_eps_send_attach_reject(mme_ue, ogs_assert(OGS_OK ==
EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED, nas_eps_send_attach_reject(mme_ue,
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED,
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED));
OGS_FSM_TRAN(s, &emm_state_exception); OGS_FSM_TRAN(s, &emm_state_exception);
break; break;
} }
@ -1155,7 +1208,8 @@ void emm_state_exception(ogs_fsm_t *s, mme_event_t *e)
if (!MME_UE_HAVE_IMSI(mme_ue)) { if (!MME_UE_HAVE_IMSI(mme_ue)) {
CLEAR_MME_UE_TIMER(mme_ue->t3470); 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); OGS_FSM_TRAN(s, &emm_state_de_registered);
break; break;
@ -1170,9 +1224,10 @@ void emm_state_exception(ogs_fsm_t *s, mme_event_t *e)
&mme_ue->pdn_connectivity_request); &mme_ue->pdn_connectivity_request);
if (rv != OGS_OK) { if (rv != OGS_OK) {
ogs_error("nas_eps_send_emm_to_esm() failed"); ogs_error("nas_eps_send_emm_to_esm() failed");
nas_eps_send_attach_reject(mme_ue, ogs_assert(OGS_OK ==
EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED, nas_eps_send_attach_reject(mme_ue,
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED,
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED));
OGS_FSM_TRAN(s, &emm_state_exception); OGS_FSM_TRAN(s, &emm_state_exception);
break; break;
} }

View File

@ -65,8 +65,9 @@ int esm_handle_pdn_connectivity_request(mme_bearer_t *bearer,
mme_ue, req->access_point_name.apn); mme_ue, req->access_point_name.apn);
if (!sess->session) { if (!sess->session) {
/* Invalid APN */ /* Invalid APN */
nas_eps_send_pdn_connectivity_reject( ogs_assert(OGS_OK ==
sess, ESM_CAUSE_MISSING_OR_UNKNOWN_APN); nas_eps_send_pdn_connectivity_reject(
sess, ESM_CAUSE_MISSING_OR_UNKNOWN_APN));
ogs_warn("Invalid APN"); ogs_warn("Invalid APN");
return OGS_ERROR; return OGS_ERROR;
} }
@ -83,7 +84,8 @@ int esm_handle_pdn_connectivity_request(mme_bearer_t *bearer,
if (security_protected_required) { if (security_protected_required) {
CLEAR_BEARER_TIMER(bearer->t3489); 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; 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 { } else {
ogs_error("No APN"); ogs_error("No APN");
nas_eps_send_pdn_connectivity_reject( ogs_assert(OGS_OK ==
sess, ESM_CAUSE_MISSING_OR_UNKNOWN_APN); nas_eps_send_pdn_connectivity_reject(
sess, ESM_CAUSE_MISSING_OR_UNKNOWN_APN));
return OGS_ERROR; return OGS_ERROR;
} }
@ -160,17 +164,21 @@ int esm_handle_information_response(mme_sess_t *sess,
mme_ue->csmap = csmap; mme_ue->csmap = csmap;
if (csmap) { if (csmap) {
sgsap_send_location_update_request(mme_ue); ogs_assert(OGS_OK ==
sgsap_send_location_update_request(mme_ue));
} else { } else {
nas_eps_send_attach_accept(mme_ue); ogs_assert(OGS_OK ==
nas_eps_send_attach_accept(mme_ue));
} }
} else { } else {
mme_gtp_send_create_session_request(sess); ogs_assert(OGS_OK ==
mme_gtp_send_create_session_request(sess));
} }
} else { } else {
ogs_error("No APN"); ogs_error("No APN");
nas_eps_send_pdn_connectivity_reject( ogs_assert(OGS_OK ==
sess, ESM_CAUSE_MISSING_OR_UNKNOWN_APN); nas_eps_send_pdn_connectivity_reject(
sess, ESM_CAUSE_MISSING_OR_UNKNOWN_APN));
return OGS_ERROR; return OGS_ERROR;
} }
@ -189,8 +197,9 @@ int esm_handle_bearer_resource_allocation_request(
mme_ue = sess->mme_ue; mme_ue = sess->mme_ue;
ogs_assert(mme_ue); ogs_assert(mme_ue);
nas_eps_send_bearer_resource_allocation_reject( ogs_assert(OGS_OK ==
mme_ue, sess->pti, ESM_CAUSE_NETWORK_FAILURE); nas_eps_send_bearer_resource_allocation_reject(
mme_ue, sess->pti, ESM_CAUSE_NETWORK_FAILURE));
return OGS_OK; return OGS_OK;
} }
@ -204,7 +213,8 @@ int esm_handle_bearer_resource_modification_request(
mme_ue = bearer->mme_ue; mme_ue = bearer->mme_ue;
ogs_assert(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; return OGS_OK;
} }

View File

@ -117,10 +117,12 @@ void esm_state_inactive(ogs_fsm_t *s, mme_event_t *e)
ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]", ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]",
mme_ue->imsi_bcd, sess->pti, bearer->ebi); mme_ue->imsi_bcd, sess->pti, bearer->ebi);
if (MME_HAVE_SGW_S1U_PATH(sess)) { if (MME_HAVE_SGW_S1U_PATH(sess)) {
mme_gtp_send_delete_session_request(sess, ogs_assert(OGS_OK ==
OGS_GTP_DELETE_SEND_DEACTIVATE_BEARER_CONTEXT_REQUEST); mme_gtp_send_delete_session_request(sess,
OGS_GTP_DELETE_SEND_DEACTIVATE_BEARER_CONTEXT_REQUEST));
} else { } 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); OGS_FSM_TRAN(s, esm_state_pdn_will_disconnect);
break; break;
@ -134,26 +136,30 @@ void esm_state_inactive(ogs_fsm_t *s, mme_event_t *e)
h.type = e->nas_type; h.type = e->nas_type;
if (h.integrity_protected == 0) { if (h.integrity_protected == 0) {
ogs_error("[%s] No Integrity Protected", mme_ue->imsi_bcd); ogs_error("[%s] No Integrity Protected", mme_ue->imsi_bcd);
nas_eps_send_attach_reject(mme_ue, ogs_assert(OGS_OK ==
EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED, nas_eps_send_attach_reject(mme_ue,
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED,
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED));
ogs_assert(mme_ue->enb_ue); 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_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); OGS_FSM_TRAN(s, &esm_state_exception);
break; break;
} }
if (!SECURITY_CONTEXT_IS_VALID(mme_ue)) { if (!SECURITY_CONTEXT_IS_VALID(mme_ue)) {
ogs_warn("[%s] No Security Context", mme_ue->imsi_bcd); ogs_warn("[%s] No Security Context", mme_ue->imsi_bcd);
nas_eps_send_attach_reject(mme_ue, ogs_assert(OGS_OK ==
EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED, nas_eps_send_attach_reject(mme_ue,
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); EMM_CAUSE_SECURITY_MODE_REJECTED_UNSPECIFIED,
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED));
ogs_assert(mme_ue->enb_ue); 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_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); OGS_FSM_TRAN(s, &esm_state_exception);
break; break;
} }
@ -172,7 +178,8 @@ void esm_state_inactive(ogs_fsm_t *s, mme_event_t *e)
/* Check if Initial Context Setup Response or /* Check if Initial Context Setup Response or
* E-RAB Setup Response is received */ * E-RAB Setup Response is received */
if (MME_HAVE_ENB_S1U_PATH(bearer)) { 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); 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 /* Check if Initial Context Setup Response or
* E-RAB Setup Response is received */ * E-RAB Setup Response is received */
if (MME_HAVE_ENB_S1U_PATH(bearer)) { if (MME_HAVE_ENB_S1U_PATH(bearer)) {
mme_gtp_send_create_bearer_response( ogs_assert(OGS_OK ==
bearer, OGS_GTP_CAUSE_REQUEST_ACCEPTED); mme_gtp_send_create_bearer_response(
bearer, OGS_GTP_CAUSE_REQUEST_ACCEPTED));
} }
OGS_FSM_TRAN(s, esm_state_active); 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 = activate_dedicated_eps_bearer_context_reject =
&message->esm.activate_dedicated_eps_bearer_context_reject; &message->esm.activate_dedicated_eps_bearer_context_reject;
ogs_assert(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( 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); OGS_FSM_TRAN(s, esm_state_bearer_deactivated);
break; break;
default: default:
@ -218,11 +227,13 @@ void esm_state_inactive(ogs_fsm_t *s, mme_event_t *e)
mme_ue->imsi_bcd); mme_ue->imsi_bcd);
OGS_FSM_TRAN(&bearer->sm, &esm_state_exception); OGS_FSM_TRAN(&bearer->sm, &esm_state_exception);
nas_eps_send_pdn_connectivity_reject(sess, ogs_assert(OGS_OK ==
ESM_CAUSE_ESM_INFORMATION_NOT_RECEIVED); nas_eps_send_pdn_connectivity_reject(sess,
ESM_CAUSE_ESM_INFORMATION_NOT_RECEIVED));
} else { } else {
bearer->t3489.retry_count++; bearer->t3489.retry_count++;
nas_eps_send_esm_information_request(bearer); ogs_assert(OGS_OK ==
nas_eps_send_esm_information_request(bearer));
} }
break; break;
default: 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]", ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]",
mme_ue->imsi_bcd, sess->pti, bearer->ebi); mme_ue->imsi_bcd, sess->pti, bearer->ebi);
if (MME_HAVE_SGW_S1U_PATH(sess)) { if (MME_HAVE_SGW_S1U_PATH(sess)) {
mme_gtp_send_delete_session_request(sess, ogs_assert(OGS_OK ==
OGS_GTP_DELETE_SEND_DEACTIVATE_BEARER_CONTEXT_REQUEST); mme_gtp_send_delete_session_request(sess,
OGS_GTP_DELETE_SEND_DEACTIVATE_BEARER_CONTEXT_REQUEST));
} else { } 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); OGS_FSM_TRAN(s, esm_state_pdn_will_disconnect);
break; 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]", ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]",
mme_ue->imsi_bcd, sess->pti, bearer->ebi); mme_ue->imsi_bcd, sess->pti, bearer->ebi);
mme_gtp_send_update_bearer_response( ogs_assert(OGS_OK ==
bearer, OGS_GTP_CAUSE_REQUEST_ACCEPTED); mme_gtp_send_update_bearer_response(
bearer, OGS_GTP_CAUSE_REQUEST_ACCEPTED));
break; break;
case OGS_NAS_EPS_DEACTIVATE_EPS_BEARER_CONTEXT_ACCEPT: case OGS_NAS_EPS_DEACTIVATE_EPS_BEARER_CONTEXT_ACCEPT:
ogs_debug("Deactivate EPS bearer " ogs_debug("Deactivate EPS bearer "
"context accept"); "context accept");
ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]", ogs_debug(" IMSI[%s] PTI[%d] EBI[%d]",
mme_ue->imsi_bcd, sess->pti, bearer->ebi); mme_ue->imsi_bcd, sess->pti, bearer->ebi);
mme_gtp_send_delete_bearer_response( ogs_assert(OGS_OK ==
bearer, OGS_GTP_CAUSE_REQUEST_ACCEPTED); mme_gtp_send_delete_bearer_response(
bearer, OGS_GTP_CAUSE_REQUEST_ACCEPTED));
OGS_FSM_TRAN(s, esm_state_bearer_deactivated); OGS_FSM_TRAN(s, esm_state_bearer_deactivated);
break; break;
case OGS_NAS_EPS_BEARER_RESOURCE_ALLOCATION_REQUEST: case OGS_NAS_EPS_BEARER_RESOURCE_ALLOCATION_REQUEST:

View File

@ -2857,9 +2857,10 @@ mme_bearer_t *mme_bearer_find_or_add_by_message(
bearer = mme_bearer_find_by_ue_ebi(mme_ue, ebi); bearer = mme_bearer_find_by_ue_ebi(mme_ue, ebi);
if (!bearer) { if (!bearer) {
ogs_error("No Bearer : EBI[%d]", ebi); ogs_error("No Bearer : EBI[%d]", ebi);
nas_eps_send_attach_reject(mme_ue, ogs_assert(OGS_OK ==
EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED, nas_eps_send_attach_reject(mme_ue,
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED,
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED));
return NULL; return NULL;
} }
@ -2868,9 +2869,10 @@ mme_bearer_t *mme_bearer_find_or_add_by_message(
if (pti == OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED) { if (pti == OGS_NAS_PROCEDURE_TRANSACTION_IDENTITY_UNASSIGNED) {
ogs_error("Both PTI[%d] and EBI[%d] are 0", pti, ebi); ogs_error("Both PTI[%d] and EBI[%d] are 0", pti, ebi);
nas_eps_send_attach_reject(mme_ue, ogs_assert(OGS_OK ==
EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED, nas_eps_send_attach_reject(mme_ue,
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED,
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED));
return NULL; return NULL;
} }
@ -2885,9 +2887,10 @@ mme_bearer_t *mme_bearer_find_or_add_by_message(
if (!bearer) { if (!bearer) {
ogs_error("No Bearer : Linked-EBI[%d]", ogs_error("No Bearer : Linked-EBI[%d]",
linked_eps_bearer_identity->eps_bearer_identity); linked_eps_bearer_identity->eps_bearer_identity);
nas_eps_send_attach_reject(mme_ue, ogs_assert(OGS_OK ==
EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED, nas_eps_send_attach_reject(mme_ue,
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED,
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED));
return NULL; return NULL;
} }
} else if (message->esm.h.message_type == } else if (message->esm.h.message_type ==
@ -2903,8 +2906,9 @@ mme_bearer_t *mme_bearer_find_or_add_by_message(
if (!bearer) { if (!bearer) {
ogs_error("No Bearer : Linked-EBI[%d]", ogs_error("No Bearer : Linked-EBI[%d]",
linked_eps_bearer_identity->eps_bearer_identity); linked_eps_bearer_identity->eps_bearer_identity);
nas_eps_send_bearer_resource_allocation_reject( ogs_assert(OGS_OK ==
mme_ue, pti, ESM_CAUSE_INVALID_EPS_BEARER_IDENTITY); nas_eps_send_bearer_resource_allocation_reject(
mme_ue, pti, ESM_CAUSE_INVALID_EPS_BEARER_IDENTITY));
return NULL; return NULL;
} }
@ -2921,8 +2925,9 @@ mme_bearer_t *mme_bearer_find_or_add_by_message(
if (!bearer) { if (!bearer) {
ogs_error("No Bearer : Linked-EBI[%d]", ogs_error("No Bearer : Linked-EBI[%d]",
linked_eps_bearer_identity->eps_bearer_identity); linked_eps_bearer_identity->eps_bearer_identity);
nas_eps_send_bearer_resource_modification_reject( ogs_assert(OGS_OK ==
mme_ue, pti, ESM_CAUSE_INVALID_EPS_BEARER_IDENTITY); nas_eps_send_bearer_resource_modification_reject(
mme_ue, pti, ESM_CAUSE_INVALID_EPS_BEARER_IDENTITY));
return NULL; return NULL;
} }
} }
@ -2956,9 +2961,10 @@ mme_bearer_t *mme_bearer_find_or_add_by_message(
if (!sess) { if (!sess) {
ogs_error("No Session : ESM message type[%d], PTI[%d]", ogs_error("No Session : ESM message type[%d], PTI[%d]",
message->esm.h.message_type, pti); message->esm.h.message_type, pti);
nas_eps_send_attach_reject(mme_ue, ogs_assert(OGS_OK ==
EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED, nas_eps_send_attach_reject(mme_ue,
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED,
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED));
return NULL; return NULL;
} }
} }

View File

@ -131,9 +131,10 @@ static void timeout(ogs_gtp_xact_t *xact, void *data)
enb_ue = enb_ue_cycle(mme_ue->enb_ue); enb_ue = enb_ue_cycle(mme_ue->enb_ue);
if (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_Cause_PR_nas, S1AP_CauseNas_normal_release,
S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0); S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0));
} else { } else {
ogs_warn("No S1 Context"); ogs_warn("No S1 Context");
} }
@ -198,7 +199,7 @@ void mme_gtp_close(void)
ogs_socknode_remove_all(&ogs_gtp_self()->gtpc_list6); 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; int rv;
ogs_gtp_header_t h; 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; h.teid = mme_ue->sgw_s11_teid;
pkbuf = mme_s11_build_create_session_request(h.type, sess); 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); 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); rv = ogs_gtp_xact_commit(xact);
ogs_expect(rv == OGS_OK); 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; 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; h.teid = mme_ue->sgw_s11_teid;
pkbuf = mme_s11_build_modify_bearer_request(h.type, bearer, uli_presence); 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); 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); rv = ogs_gtp_xact_commit(xact);
ogs_expect(rv == OGS_OK); 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; int rv;
ogs_pkbuf_t *s11buf = NULL; 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; h.teid = mme_ue->sgw_s11_teid;
s11buf = mme_s11_build_delete_session_request(h.type, sess); 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); 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; xact->delete_action = action;
rv = ogs_gtp_xact_commit(xact); rv = ogs_gtp_xact_commit(xact);
ogs_expect(rv == OGS_OK); ogs_expect(rv == OGS_OK);
return rv;
} }
void mme_gtp_send_delete_all_sessions(mme_ue_t *mme_ue, int action) 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) mme_bearer_t *bearer, uint8_t cause_value)
{ {
int rv; int rv;
@ -338,16 +345,18 @@ void mme_gtp_send_create_bearer_response(
h.teid = mme_ue->sgw_s11_teid; h.teid = mme_ue->sgw_s11_teid;
pkbuf = mme_s11_build_create_bearer_response(h.type, bearer, cause_value); 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); 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); rv = ogs_gtp_xact_commit(xact);
ogs_expect(rv == OGS_OK); 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) mme_bearer_t *bearer, uint8_t cause_value)
{ {
int rv; int rv;
@ -369,16 +378,18 @@ void mme_gtp_send_update_bearer_response(
h.teid = mme_ue->sgw_s11_teid; h.teid = mme_ue->sgw_s11_teid;
pkbuf = mme_s11_build_update_bearer_response(h.type, bearer, cause_value); 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); 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); rv = ogs_gtp_xact_commit(xact);
ogs_expect(rv == OGS_OK); 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) mme_bearer_t *bearer, uint8_t cause_value)
{ {
int rv; int rv;
@ -400,16 +411,18 @@ void mme_gtp_send_delete_bearer_response(
h.teid = mme_ue->sgw_s11_teid; h.teid = mme_ue->sgw_s11_teid;
pkbuf = mme_s11_build_delete_bearer_response(h.type, bearer, cause_value); 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); 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); rv = ogs_gtp_xact_commit(xact);
ogs_expect(rv == OGS_OK); 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; int rv;
ogs_gtp_header_t h; 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; h.teid = mme_ue->sgw_s11_teid;
pkbuf = mme_s11_build_release_access_bearers_request(h.type); 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); 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; xact->release_action = action;
rv = ogs_gtp_xact_commit(xact); rv = ogs_gtp_xact_commit(xact);
ogs_expect(rv == OGS_OK); ogs_expect(rv == OGS_OK);
return rv;
} }
void mme_gtp_send_release_all_ue_in_enb(mme_enb_t *enb, int action) 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; mme_ue = enb_ue->mme_ue;
if (mme_ue) { if (mme_ue) {
ogs_assert(OGS_OK ==
mme_gtp_send_release_access_bearers_request(mme_ue, action); mme_gtp_send_release_access_bearers_request(mme_ue, action));
} else { } else {
ogs_warn("mme_gtp_send_release_all_ue_in_enb()"); 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) mme_bearer_t *bearer, uint8_t cause_value)
{ {
int rv; int rv;
@ -484,17 +499,18 @@ void mme_gtp_send_downlink_data_notification_ack(
h.teid = mme_ue->sgw_s11_teid; h.teid = mme_ue->sgw_s11_teid;
s11buf = mme_s11_build_downlink_data_notification_ack(h.type, cause_value); 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); 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); rv = ogs_gtp_xact_commit(xact);
ogs_expect(rv == OGS_OK); 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) mme_ue_t *mme_ue)
{ {
int rv; 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( pkbuf = mme_s11_build_create_indirect_data_forwarding_tunnel_request(
h.type, mme_ue); 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); 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); rv = ogs_gtp_xact_commit(xact);
ogs_expect(rv == OGS_OK); 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) mme_ue_t *mme_ue, int action)
{ {
int rv; int rv;
@ -535,18 +553,20 @@ void mme_gtp_send_delete_indirect_data_forwarding_tunnel_request(
h.teid = mme_ue->sgw_s11_teid; h.teid = mme_ue->sgw_s11_teid;
pkbuf = ogs_pkbuf_alloc(NULL, OGS_TLV_MAX_HEADROOM); 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); ogs_pkbuf_reserve(pkbuf, OGS_TLV_MAX_HEADROOM);
xact = ogs_gtp_xact_local_create(mme_ue->gnode, &h, pkbuf, timeout, mme_ue); 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; xact->delete_indirect_action = action;
rv = ogs_gtp_xact_commit(xact); rv = ogs_gtp_xact_commit(xact);
ogs_expect(rv == OGS_OK); 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) mme_bearer_t *bearer, ogs_nas_eps_message_t *nas_message)
{ {
int rv; int rv;
@ -565,12 +585,14 @@ void mme_gtp_send_bearer_resource_command(
h.teid = mme_ue->sgw_s11_teid; h.teid = mme_ue->sgw_s11_teid;
pkbuf = mme_s11_build_bearer_resource_command(h.type, bearer, nas_message); 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); 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; xact->xid |= OGS_GTP_CMD_XACT_ID;
rv = ogs_gtp_xact_commit(xact); rv = ogs_gtp_xact_commit(xact);
ogs_expect(rv == OGS_OK); ogs_expect(rv == OGS_OK);
}
return rv;
}

View File

@ -29,32 +29,32 @@ extern "C" {
int mme_gtp_open(void); int mme_gtp_open(void);
void mme_gtp_close(void); void mme_gtp_close(void);
void mme_gtp_send_create_session_request(mme_sess_t *sess); int mme_gtp_send_create_session_request(mme_sess_t *sess);
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);
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);
void mme_gtp_send_delete_all_sessions(mme_ue_t *mme_ue, 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); 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); 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); 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_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); 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); 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); 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); mme_bearer_t *bearer, ogs_nas_eps_message_t *nas_message);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
#endif /* MME_S11_PATH_H */ #endif /* MME_S11_PATH_H */

View File

@ -30,7 +30,8 @@ void mme_send_delete_session_or_detach(mme_ue_t *mme_ue)
mme_gtp_send_delete_all_sessions(mme_ue, mme_gtp_send_delete_all_sessions(mme_ue,
OGS_GTP_DELETE_SEND_DETACH_ACCEPT); OGS_GTP_DELETE_SEND_DETACH_ACCEPT);
} else { } 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 { } else {
enb_ue_t *enb_ue = enb_ue_cycle(mme_ue->enb_ue); enb_ue_t *enb_ue = enb_ue_cycle(mme_ue->enb_ue);
if (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_Cause_PR_nas, S1AP_CauseNas_normal_release,
S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0); S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0));
} else { } else {
ogs_warn("[%s] No S1 Context", mme_ue->imsi_bcd); 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; mme_ue = enb_ue->mme_ue;
if (mme_ue) { if (mme_ue) {
ogs_debug("[%s] Release access bearer request", mme_ue->imsi_bcd); ogs_debug("[%s] Release access bearer request", mme_ue->imsi_bcd);
mme_gtp_send_release_access_bearers_request( ogs_assert(OGS_OK ==
mme_ue, OGS_GTP_RELEASE_SEND_UE_CONTEXT_RELEASE_COMMAND); mme_gtp_send_release_access_bearers_request(
mme_ue, OGS_GTP_RELEASE_SEND_UE_CONTEXT_RELEASE_COMMAND));
} else { } else {
ogs_debug("[%s] No UE Context", mme_ue->imsi_bcd); 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_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) { switch (type) {
case OGS_GTP_DOWNLINK_DATA_NOTIFICATION_TYPE: case OGS_GTP_DOWNLINK_DATA_NOTIFICATION_TYPE:
mme_gtp_send_downlink_data_notification_ack( ogs_assert(OGS_OK ==
bearer, cause_value); mme_gtp_send_downlink_data_notification_ack(
bearer, cause_value));
break; break;
case OGS_GTP_CREATE_BEARER_REQUEST_TYPE: case OGS_GTP_CREATE_BEARER_REQUEST_TYPE:
if (cause_value == OGS_GTP_CAUSE_REQUEST_ACCEPTED) { if (cause_value == OGS_GTP_CAUSE_REQUEST_ACCEPTED) {
ogs_assert(OGS_OK ==
nas_eps_send_activate_dedicated_bearer_context_request( nas_eps_send_activate_dedicated_bearer_context_request(
bearer); bearer));
} else { } else {
mme_gtp_send_create_bearer_response( ogs_assert(OGS_OK ==
bearer, cause_value); mme_gtp_send_create_bearer_response(
bearer, cause_value));
} }
break; break;
case OGS_GTP_UPDATE_BEARER_REQUEST_TYPE: case OGS_GTP_UPDATE_BEARER_REQUEST_TYPE:
if (cause_value == OGS_GTP_CAUSE_REQUEST_ACCEPTED) { if (cause_value == OGS_GTP_CAUSE_REQUEST_ACCEPTED) {
nas_eps_send_modify_bearer_context_request(bearer, ogs_assert(OGS_OK ==
(xact->update_flags & nas_eps_send_modify_bearer_context_request(bearer,
OGS_GTP_MODIFY_QOS_UPDATE) ? 1 : 0, (xact->update_flags &
(xact->update_flags & OGS_GTP_MODIFY_QOS_UPDATE) ? 1 : 0,
OGS_GTP_MODIFY_TFT_UPDATE) ? 1 : 0); (xact->update_flags &
OGS_GTP_MODIFY_TFT_UPDATE) ? 1 : 0));
} else { } else {
mme_gtp_send_update_bearer_response( ogs_assert(OGS_OK ==
bearer, cause_value); mme_gtp_send_update_bearer_response(
bearer, cause_value));
} }
break; break;
case OGS_GTP_DELETE_BEARER_REQUEST_TYPE: case OGS_GTP_DELETE_BEARER_REQUEST_TYPE:
if (cause_value == OGS_GTP_CAUSE_REQUEST_ACCEPTED) { 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 { } else {
mme_gtp_send_delete_bearer_response( ogs_assert(OGS_OK ==
bearer, cause_value); mme_gtp_send_delete_bearer_response(
bearer, cause_value));
} }
break; break;
default: default:

View File

@ -168,8 +168,9 @@ void mme_s11_handle_create_session_response(
if (cause_value != OGS_GTP_CAUSE_REQUEST_ACCEPTED) { if (cause_value != OGS_GTP_CAUSE_REQUEST_ACCEPTED) {
if (sess && SESSION_CONTEXT_IN_ATTACH(sess)) { if (sess && SESSION_CONTEXT_IN_ATTACH(sess)) {
ogs_error("[%s] Attach reject", mme_ue->imsi_bcd); ogs_error("[%s] Attach reject", mme_ue->imsi_bcd);
nas_eps_send_attach_reject(mme_ue, ogs_assert(OGS_OK ==
EMM_CAUSE_NETWORK_FAILURE, ESM_CAUSE_NETWORK_FAILURE); 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); mme_send_delete_session_or_mme_ue_context_release(mme_ue);
return; return;
@ -236,16 +237,19 @@ void mme_s11_handle_create_session_response(
if (csmap) { if (csmap) {
ogs_assert(OGS_PDU_SESSION_TYPE_IS_VALID( ogs_assert(OGS_PDU_SESSION_TYPE_IS_VALID(
session->paa.session_type)); session->paa.session_type));
sgsap_send_location_update_request(mme_ue); ogs_assert(OGS_OK ==
sgsap_send_location_update_request(mme_ue));
} else { } else {
ogs_assert(OGS_PDU_SESSION_TYPE_IS_VALID( ogs_assert(OGS_PDU_SESSION_TYPE_IS_VALID(
session->paa.session_type)); session->paa.session_type));
nas_eps_send_attach_accept(mme_ue); ogs_assert(OGS_OK ==
nas_eps_send_attach_accept(mme_ue));
} }
} else { } else {
ogs_assert(OGS_PDU_SESSION_TYPE_IS_VALID(session->paa.session_type)); 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); mme_ue->mme_s11_teid, mme_ue->sgw_s11_teid);
GTP_COUNTER_CHECK(mme_ue, GTP_COUNTER_MODIFY_BEARER_BY_PATH_SWITCH, 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, 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) { } else if (action == OGS_GTP_DELETE_SEND_DETACH_ACCEPT) {
if (mme_sess_count(mme_ue) == 1) /* Last Session */ { 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 == } else if (action ==
@ -352,7 +359,8 @@ void mme_s11_handle_delete_session_response(
mme_bearer_t *bearer = mme_default_bearer_in_sess(sess); mme_bearer_t *bearer = mme_default_bearer_in_sess(sess);
ogs_expect_or_return(bearer); 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. * 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); enb_ue = enb_ue_cycle(mme_ue->enb_ue);
if (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_Cause_PR_nas, S1AP_CauseNas_normal_release,
S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0); S1AP_UE_CTX_REL_UE_CONTEXT_REMOVE, 0));
} else } else
ogs_warn("ENB-S1 Context has already been removed"); 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); &mme_ue->pdn_connectivity_request);
if (rv != OGS_OK) { if (rv != OGS_OK) {
ogs_error("nas_eps_send_emm_to_esm() failed"); ogs_error("nas_eps_send_emm_to_esm() failed");
nas_eps_send_attach_reject(mme_ue, ogs_assert(OGS_OK ==
EMM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED, nas_eps_send_attach_reject(mme_ue,
ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); 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)) { if (ECM_IDLE(mme_ue)) {
s1ap_send_paging(mme_ue, S1AP_CNDomain_ps); s1ap_send_paging(mme_ue, S1AP_CNDomain_ps);
} else { } else {
nas_eps_send_activate_dedicated_bearer_context_request(bearer); ogs_assert(OGS_OK ==
nas_eps_send_activate_dedicated_bearer_context_request(bearer));
} }
} else { } else {
/* /*
@ -629,9 +640,10 @@ void mme_s11_handle_update_bearer_request(
if (ECM_IDLE(mme_ue)) { if (ECM_IDLE(mme_ue)) {
s1ap_send_paging(mme_ue, S1AP_CNDomain_ps); s1ap_send_paging(mme_ue, S1AP_CNDomain_ps);
} else { } 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.bearer_level_qos.presence,
req->bearer_contexts.tft.presence); req->bearer_contexts.tft.presence));
} }
} else { } else {
ogs_warn("[IGNORE] Update Bearer Request : " 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) { if (xact->xid & OGS_GTP_CMD_XACT_ID) {
/* MME received Bearer Resource Modification Request */ /* MME received Bearer Resource Modification Request */
nas_eps_send_bearer_resource_modification_reject( ogs_assert(OGS_OK ==
mme_ue, sess->pti, ESM_CAUSE_SERVICE_OPTION_NOT_SUPPORTED); nas_eps_send_bearer_resource_modification_reject(
mme_ue, sess->pti, ESM_CAUSE_SERVICE_OPTION_NOT_SUPPORTED));
} }
mme_gtp_send_update_bearer_response( ogs_assert(OGS_OK ==
bearer, OGS_GTP_CAUSE_REQUEST_ACCEPTED); 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)) { if (ECM_IDLE(mme_ue)) {
s1ap_send_paging(mme_ue, S1AP_CNDomain_ps); s1ap_send_paging(mme_ue, S1AP_CNDomain_ps);
} else { } 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) { if (action == OGS_GTP_RELEASE_SEND_UE_CONTEXT_RELEASE_COMMAND) {
enb_ue = enb_ue_cycle(mme_ue->enb_ue); enb_ue = enb_ue_cycle(mme_ue->enb_ue);
if (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_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 { } else {
ogs_warn("ENB-S1 Context has already been removed"); 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); enb_ue_remove(enb_ue);
if (ogs_list_count(&enb->enb_ue_list) == 0) 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 { } else {
ogs_warn("ENB-S1 Context has already been removed"); 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); enb_ue_t *enb_ue = enb_ue_cycle(mme_ue->enb_ue);
ogs_assert(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_Cause_PR_nas, S1AP_CauseNas_normal_release,
S1AP_UE_CTX_REL_S1_PAGING, 0); S1AP_UE_CTX_REL_S1_PAGING, 0));
} else { } else {
mme_gtp_send_downlink_data_notification_ack( ogs_assert(OGS_OK ==
bearer, OGS_GTP_CAUSE_UE_ALREADY_RE_ATTACHED); 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); source_ue = enb_ue_cycle(mme_ue->enb_ue);
ogs_assert(source_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( 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) { if (action == OGS_GTP_DELETE_INDIRECT_HANDOVER_COMPLETE) {
/* Nothing to do */ /* Nothing to do */
} else if (action == OGS_GTP_DELETE_INDIRECT_HANDOVER_CANCEL) { } 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 { } else {
ogs_fatal("Invalid action = %d", action); ogs_fatal("Invalid action = %d", action);
ogs_assert_if_reached(); 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]", ogs_debug(" MME_S11_TEID[%d] SGW_S11_TEID[%d]",
mme_ue->mme_s11_teid, mme_ue->sgw_s11_teid); mme_ue->mme_s11_teid, mme_ue->sgw_s11_teid);
nas_eps_send_bearer_resource_modification_reject( ogs_assert(OGS_OK ==
mme_ue, sess->pti, esm_cause_from_gtp(cause_value)); 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) { if (cause_value == OGS_GTP_CAUSE_CONTEXT_NOT_FOUND) {
ogs_warn("No Bearer"); ogs_warn("No Bearer");

View File

@ -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) if (mme_ue->nas_eps.ksi == OGS_NAS_KSI_NO_KEY_IS_AVAILABLE)
mme_ue->nas_eps.ksi = 0; 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, void mme_s6a_handle_ula(mme_ue_t *mme_ue,

View File

@ -239,9 +239,10 @@ void mme_state_operational(ogs_fsm_t *s, mme_event_t *e)
ogs_fsm_dispatch(&enb->sm, e); ogs_fsm_dispatch(&enb->sm, e);
} else { } else {
ogs_warn("Cannot decode S1AP message"); 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, 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); 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 */ /* De-associate S1 with NAS/EMM */
enb_ue_deassociate(mme_ue->enb_ue); 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_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); 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]", ogs_info("[%s] Attach reject [EMM_CAUSE:%d]",
mme_ue->imsi_bcd, emm_cause); mme_ue->imsi_bcd, emm_cause);
nas_eps_send_attach_reject(mme_ue, ogs_assert(OGS_OK ==
emm_cause, ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); nas_eps_send_attach_reject(mme_ue,
emm_cause, ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED));
enb_ue = enb_ue_cycle(mme_ue->enb_ue); enb_ue = enb_ue_cycle(mme_ue->enb_ue);
ogs_assert(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_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( ogs_subscription_data_free(
&s6a_message->ula_message.subscription_data); &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); &mme_ue->pdn_connectivity_request);
if (rv != OGS_OK) { if (rv != OGS_OK) {
ogs_error("nas_eps_send_emm_to_esm() failed"); 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, 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) { } else if (mme_ue->nas_eps.type == MME_EPS_TYPE_TAU_REQUEST) {
nas_eps_send_tau_accept(mme_ue, ogs_assert(OGS_OK ==
S1AP_ProcedureCode_id_InitialContextSetup); nas_eps_send_tau_accept(mme_ue,
S1AP_ProcedureCode_id_InitialContextSetup));
} else if (mme_ue->nas_eps.type == MME_EPS_TYPE_SERVICE_REQUEST) { } else if (mme_ue->nas_eps.type == MME_EPS_TYPE_SERVICE_REQUEST) {
ogs_error("[%s] Service request", mme_ue->imsi_bcd); ogs_error("[%s] Service request", mme_ue->imsi_bcd);
} else if (mme_ue->nas_eps.type == } else if (mme_ue->nas_eps.type ==

View File

@ -57,9 +57,7 @@ int nas_eps_send_emm_to_esm(mme_ue_t *mme_ue,
esm_message_container->buffer, esm_message_container->length); esm_message_container->buffer, esm_message_container->length);
rv = s1ap_send_to_esm(mme_ue, esmbuf, 0); rv = s1ap_send_to_esm(mme_ue, esmbuf, 0);
if (rv != OGS_OK) { ogs_expect(rv == OGS_OK);
ogs_error("s1ap_send_to_esm() failed");
}
return rv; 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_warn("S1 context has already been removed");
ogs_pkbuf_free(pkbuf); ogs_pkbuf_free(pkbuf);
return OGS_ERROR;
} else { } else {
s1apbuf = s1ap_build_downlink_nas_transport(enb_ue, pkbuf); s1apbuf = s1ap_build_downlink_nas_transport(enb_ue, pkbuf);
if (!s1apbuf) { ogs_expect_or_return_val(s1apbuf, OGS_ERROR);
ogs_error("s1ap_build_downlink_nas_transport() failed");
return OGS_ERROR;
}
rv = nas_eps_send_to_enb(mme_ue, s1apbuf); rv = nas_eps_send_to_enb(mme_ue, s1apbuf);
if (rv != OGS_OK) { ogs_expect(rv == OGS_OK);
return OGS_ERROR;
}
}
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; int rv;
mme_sess_t *sess = NULL; 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); ogs_debug("[%s] Attach accept", mme_ue->imsi_bcd);
esmbuf = esm_build_activate_default_bearer_context_request(sess); 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); 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); CLEAR_MME_UE_TIMER(mme_ue->t3450);
mme_ue->t3450.pkbuf = ogs_pkbuf_copy(emmbuf); 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); mme_timer_cfg(MME_TIMER_T3450)->duration);
s1apbuf = s1ap_build_initial_context_setup_request(mme_ue, emmbuf); 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); 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) ogs_nas_emm_cause_t emm_cause, ogs_nas_esm_cause_t esm_cause)
{ {
int rv; int rv;
@ -145,16 +141,18 @@ void nas_eps_send_attach_reject(mme_ue_t *mme_ue,
sess = mme_sess_first(mme_ue); sess = mme_sess_first(mme_ue);
if (sess) { if (sess) {
esmbuf = esm_build_pdn_connectivity_reject(sess, esm_cause); 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); 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); rv = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf);
ogs_expect(rv == OGS_OK); 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; int rv;
ogs_pkbuf_t *emmbuf = NULL; 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) { if (mme_ue->t3470.pkbuf) {
emmbuf = mme_ue->t3470.pkbuf; emmbuf = mme_ue->t3470.pkbuf;
ogs_expect_or_return(emmbuf); ogs_expect_or_return_val(emmbuf, OGS_ERROR);
} else { } else {
emmbuf = emm_build_identity_request(mme_ue); 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); 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); rv = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf);
ogs_expect(rv == OGS_OK); 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; int rv;
ogs_pkbuf_t *emmbuf = NULL; 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) { if (mme_ue->t3460.pkbuf) {
emmbuf = mme_ue->t3460.pkbuf; emmbuf = mme_ue->t3460.pkbuf;
ogs_expect_or_return(emmbuf); ogs_expect_or_return_val(emmbuf, OGS_ERROR);
} else { } else {
emmbuf = emm_build_authentication_request(mme_ue); 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); 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); rv = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf);
ogs_expect(rv == OGS_OK); 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; int rv;
ogs_pkbuf_t *emmbuf = NULL; 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) { if (mme_ue->t3460.pkbuf) {
emmbuf = mme_ue->t3460.pkbuf; emmbuf = mme_ue->t3460.pkbuf;
ogs_expect_or_return(emmbuf); ogs_expect_or_return_val(emmbuf, OGS_ERROR);
} else { } else {
emmbuf = emm_build_security_mode_command(mme_ue); 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); 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); rv = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf);
ogs_expect(rv == OGS_OK); 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; int rv;
ogs_pkbuf_t *emmbuf = NULL; 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); ogs_debug("[%s] Authentication reject", mme_ue->imsi_bcd);
emmbuf = emm_build_authentication_reject(); 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); rv = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf);
ogs_expect(rv == OGS_OK); 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; enb_ue_t *enb_ue = NULL;
ogs_pkbuf_t *emmbuf = 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 */ /* reply with detach accept */
if (mme_ue->nas_eps.detach.switch_off == 0) { if (mme_ue->nas_eps.detach.switch_off == 0) {
int rv;
emmbuf = emm_build_detach_accept(mme_ue); 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); 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_Cause_PR_nas, S1AP_CauseNas_detach,
S1AP_UE_CTX_REL_S1_REMOVE_AND_UNLINK, 0); S1AP_UE_CTX_REL_S1_REMOVE_AND_UNLINK, 0);
ogs_expect(rv == OGS_OK);
return rv;
} }
int nas_eps_send_pdn_connectivity_reject(
void nas_eps_send_pdn_connectivity_reject(
mme_sess_t *sess, ogs_nas_esm_cause_t esm_cause) mme_sess_t *sess, ogs_nas_esm_cause_t esm_cause)
{ {
int rv; int rv;
@ -289,18 +298,21 @@ void nas_eps_send_pdn_connectivity_reject(
if (SESSION_CONTEXT_IN_ATTACH(sess)) { if (SESSION_CONTEXT_IN_ATTACH(sess)) {
/* During the UE-attach process, we'll send Attach-Reject /* During the UE-attach process, we'll send Attach-Reject
* with pyggybacking PDN-connectivity-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); EMM_CAUSE_EPS_SERVICES_AND_NON_EPS_SERVICES_NOT_ALLOWED, esm_cause);
ogs_expect(rv == OGS_OK);
} else { } else {
esmbuf = esm_build_pdn_connectivity_reject(sess, esm_cause); 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); rv = nas_eps_send_to_downlink_nas_transport(mme_ue, esmbuf);
ogs_expect(rv == OGS_OK); 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; int rv;
mme_ue_t *mme_ue = NULL; 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) { if (bearer->t3489.pkbuf) {
esmbuf = bearer->t3489.pkbuf; esmbuf = bearer->t3489.pkbuf;
ogs_expect_or_return(esmbuf); ogs_expect_or_return_val(esmbuf, OGS_ERROR);
} else { } else {
esmbuf = esm_build_information_request(bearer); 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); 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); rv = nas_eps_send_to_downlink_nas_transport(mme_ue, esmbuf);
ogs_expect(rv == OGS_OK); 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; int rv;
ogs_pkbuf_t *s1apbuf = NULL; 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); ogs_assert(mme_ue);
esmbuf = esm_build_activate_default_bearer_context_request(sess); 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); 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); rv = nas_eps_send_to_enb(mme_ue, s1apbuf);
ogs_expect(rv == OGS_OK); 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) mme_bearer_t *bearer)
{ {
int rv; int rv;
@ -364,13 +380,15 @@ void nas_eps_send_activate_dedicated_bearer_context_request(
ogs_assert(mme_ue); ogs_assert(mme_ue);
esmbuf = esm_build_activate_dedicated_bearer_context_request(bearer); 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); 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); rv = nas_eps_send_to_enb(mme_ue, s1apbuf);
ogs_expect(rv == OGS_OK); ogs_expect(rv == OGS_OK);
return rv;
} }
void nas_eps_send_activate_all_dedicated_bearers(mme_bearer_t *default_bearer) 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) mme_bearer_t *bearer, int qos_presence, int tft_presence)
{ {
int rv; int rv;
@ -399,11 +417,11 @@ void nas_eps_send_modify_bearer_context_request(
esmbuf = esm_build_modify_bearer_context_request( esmbuf = esm_build_modify_bearer_context_request(
bearer, qos_presence, tft_presence); bearer, qos_presence, tft_presence);
ogs_expect_or_return(esmbuf); ogs_expect_or_return_val(esmbuf, OGS_ERROR);
if (qos_presence == 1) { if (qos_presence == 1) {
s1apbuf = s1ap_build_e_rab_modify_request(bearer, esmbuf); 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); rv = nas_eps_send_to_enb(mme_ue, s1apbuf);
ogs_expect(rv == OGS_OK); 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); rv = nas_eps_send_to_downlink_nas_transport(mme_ue, esmbuf);
ogs_expect(rv == OGS_OK); 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; int rv;
ogs_pkbuf_t *s1apbuf = NULL; 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( esmbuf = esm_build_deactivate_bearer_context_request(
bearer, ESM_CAUSE_REGULAR_DEACTIVATION); 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, s1apbuf = s1ap_build_e_rab_release_command(bearer, esmbuf,
S1AP_Cause_PR_nas, S1AP_CauseNas_normal_release); 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); rv = nas_eps_send_to_enb(mme_ue, s1apbuf);
ogs_expect(rv == OGS_OK); 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) mme_ue_t *mme_ue, uint8_t pti, ogs_nas_esm_cause_t esm_cause)
{ {
int rv; int rv;
@ -447,13 +469,15 @@ void nas_eps_send_bearer_resource_allocation_reject(
esmbuf = esm_build_bearer_resource_allocation_reject( esmbuf = esm_build_bearer_resource_allocation_reject(
mme_ue, pti, esm_cause); 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); rv = nas_eps_send_to_downlink_nas_transport(mme_ue, esmbuf);
ogs_expect(rv == OGS_OK); 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) mme_ue_t *mme_ue, uint8_t pti, ogs_nas_esm_cause_t esm_cause)
{ {
int rv; int rv;
@ -464,13 +488,15 @@ void nas_eps_send_bearer_resource_modification_reject(
esmbuf = esm_build_bearer_resource_modification_reject( esmbuf = esm_build_bearer_resource_modification_reject(
mme_ue, pti, esm_cause); 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); rv = nas_eps_send_to_downlink_nas_transport(mme_ue, esmbuf);
ogs_expect(rv == OGS_OK); 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) mme_ue_t *mme_ue, S1AP_ProcedureCode_t procedureCode)
{ {
int rv; int rv;
@ -481,7 +507,7 @@ void nas_eps_send_tau_accept(
ogs_debug("[%s] Tracking area update accept", mme_ue->imsi_bcd); ogs_debug("[%s] Tracking area update accept", mme_ue->imsi_bcd);
emmbuf = emm_build_tau_accept(mme_ue); 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) { if (mme_ue->next.m_tmsi) {
CLEAR_MME_UE_TIMER(mme_ue->t3450); CLEAR_MME_UE_TIMER(mme_ue->t3450);
@ -494,7 +520,7 @@ void nas_eps_send_tau_accept(
if (procedureCode == S1AP_ProcedureCode_id_InitialContextSetup) { if (procedureCode == S1AP_ProcedureCode_id_InitialContextSetup) {
ogs_pkbuf_t *s1apbuf = NULL; ogs_pkbuf_t *s1apbuf = NULL;
s1apbuf = s1ap_build_initial_context_setup_request(mme_ue, emmbuf); 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); rv = nas_eps_send_to_enb(mme_ue, s1apbuf);
ogs_expect(rv == OGS_OK); ogs_expect(rv == OGS_OK);
@ -503,9 +529,11 @@ void nas_eps_send_tau_accept(
ogs_expect(rv == OGS_OK); ogs_expect(rv == OGS_OK);
} else } else
ogs_assert_if_reached(); 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; int rv;
ogs_pkbuf_t *emmbuf = NULL; 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 */ /* Build TAU reject */
emmbuf = emm_build_tau_reject(emm_cause, mme_ue); 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); rv = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf);
ogs_expect(rv == OGS_OK); 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) ogs_nas_emm_cause_t emm_cause)
{ {
int rv; int rv;
@ -534,13 +564,15 @@ void nas_eps_send_service_reject(mme_ue_t *mme_ue,
/* Build Service Reject */ /* Build Service Reject */
emmbuf = emm_build_service_reject(emm_cause, mme_ue); 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); rv = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf);
ogs_expect(rv == OGS_OK); 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; int rv;
ogs_pkbuf_t *emmbuf = NULL; 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); ogs_debug("[%s] CS Service Notification", mme_ue->imsi_bcd);
emmbuf = emm_build_cs_service_notification(mme_ue); 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); rv = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf);
ogs_expect(rv == OGS_OK); 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) mme_ue_t *mme_ue, uint8_t *buffer, uint8_t length)
{ {
int rv; int rv;
@ -569,8 +603,10 @@ void nas_eps_send_downlink_nas_transport(
ogs_debug("[%s] Downlink NAS transport", mme_ue->imsi_bcd); ogs_debug("[%s] Downlink NAS transport", mme_ue->imsi_bcd);
emmbuf = emm_build_downlink_nas_transport(mme_ue, buffer, length); 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); rv = nas_eps_send_to_downlink_nas_transport(mme_ue, emmbuf);
ogs_expect(rv == OGS_OK); ogs_expect(rv == OGS_OK);
return rv;
} }

View File

@ -32,47 +32,47 @@ int nas_eps_send_emm_to_esm(
int nas_eps_send_to_downlink_nas_transport( int nas_eps_send_to_downlink_nas_transport(
mme_ue_t *mme_ue, ogs_pkbuf_t *pkbuf); mme_ue_t *mme_ue, ogs_pkbuf_t *pkbuf);
void nas_eps_send_attach_accept(mme_ue_t *mme_ue); int 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_reject(mme_ue_t *mme_ue,
ogs_nas_emm_cause_t emm_cause, ogs_nas_esm_cause_t esm_cause); 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); int 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_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); mme_sess_t *sess, ogs_nas_esm_cause_t esm_cause);
void nas_eps_send_esm_information_request(mme_bearer_t *bearer); int nas_eps_send_esm_information_request(mme_bearer_t *bearer);
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);
void nas_eps_send_activate_dedicated_bearer_context_request( int nas_eps_send_activate_dedicated_bearer_context_request(
mme_bearer_t *bearer); mme_bearer_t *bearer);
void nas_eps_send_activate_all_dedicated_bearers(mme_bearer_t *default_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); mme_bearer_t *bearer, int qos_presence, int tft_presence);
void nas_eps_send_deactivate_bearer_context_request(mme_bearer_t *bearer); int nas_eps_send_deactivate_bearer_context_request(mme_bearer_t *bearer);
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); 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); 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); 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); mme_ue_t *mme_ue, ogs_nas_emm_cause_t emm_cause);
void nas_eps_send_cs_service_notification(mme_ue_t *mme_ue); int nas_eps_send_cs_service_notification(mme_ue_t *mme_ue);
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); mme_ue_t *mme_ue, uint8_t *buffer, uint8_t length);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
#endif /* NAS_EPS_PATH_H */ #endif /* NAS_EPS_PATH_H */

File diff suppressed because it is too large Load Diff

View File

@ -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_pkbuf_t *s1ap_buffer;
ogs_debug("[MME] S1-Setup response"); ogs_debug("[MME] S1-Setup response");
s1ap_buffer = s1ap_build_setup_rsp(); 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 == rv = s1ap_send_to_enb(enb, s1ap_buffer, S1AP_NON_UE_SIGNALLING);
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) mme_enb_t *enb, S1AP_Cause_PR group, long cause)
{ {
int rv;
ogs_pkbuf_t *s1ap_buffer; ogs_pkbuf_t *s1ap_buffer;
ogs_debug("[MME] S1-Setup failure"); ogs_debug("[MME] S1-Setup failure");
s1ap_buffer = s1ap_build_setup_failure(group, cause, S1AP_TimeToWait_v10s); 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 == rv = s1ap_send_to_enb(enb, s1ap_buffer, S1AP_NON_UE_SIGNALLING);
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; int rv;
ogs_pkbuf_t *s1apbuf = NULL; 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); ogs_assert(mme_ue);
s1apbuf = s1ap_build_initial_context_setup_request(mme_ue, NULL); 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); rv = nas_eps_send_to_enb(mme_ue, s1apbuf);
ogs_expect(rv == OGS_OK); 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; int rv;
ogs_pkbuf_t *s1apbuf = NULL; 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); ogs_assert(mme_ue);
s1apbuf = s1ap_build_ue_context_modification_request(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); rv = nas_eps_send_to_enb(mme_ue, s1apbuf);
ogs_expect(rv == OGS_OK); 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, enb_ue_t *enb_ue, S1AP_Cause_PR group, long cause,
uint8_t action, ogs_time_t duration) uint8_t action, ogs_time_t duration)
{ {
@ -313,13 +323,15 @@ void s1ap_send_ue_context_release_command(
group, (int)cause, action, (int)duration); group, (int)cause, action, (int)duration);
s1apbuf = s1ap_build_ue_context_release_command(enb_ue, group, cause); 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); rv = s1ap_delayed_send_to_enb_ue(enb_ue, s1apbuf, duration);
ogs_expect(rv == OGS_OK); ogs_expect(rv == OGS_OK);
ogs_timer_start(enb_ue->t_s1_holding, ogs_timer_start(enb_ue->t_s1_holding,
mme_timer_cfg(MME_TIMER_S1_HOLDING)->duration); mme_timer_cfg(MME_TIMER_S1_HOLDING)->duration);
return rv;
} }
void s1ap_send_paging(mme_ue_t *mme_ue, S1AP_CNDomain_t cn_domain) 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); mme_timer_cfg(MME_TIMER_T3413)->duration);
} }
void s1ap_send_mme_configuration_transfer( int s1ap_send_mme_configuration_transfer(
mme_enb_t *target_enb, mme_enb_t *target_enb,
S1AP_SONConfigurationTransfer_t *SONConfigurationTransfer) S1AP_SONConfigurationTransfer_t *SONConfigurationTransfer)
{ {
@ -368,13 +380,15 @@ void s1ap_send_mme_configuration_transfer(
ogs_assert(SONConfigurationTransfer); ogs_assert(SONConfigurationTransfer);
s1apbuf = s1ap_build_mme_configuration_transfer(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); rv = s1ap_send_to_enb(target_enb, s1apbuf, S1AP_NON_UE_SIGNALLING);
ogs_expect(rv == OGS_OK); 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; int rv;
ogs_pkbuf_t *s1apbuf = NULL; 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); ogs_assert(mme_ue);
s1apbuf = s1ap_build_e_rab_modification_confirm(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); rv = nas_eps_send_to_enb(mme_ue, s1apbuf);
ogs_expect(rv == OGS_OK); 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; int rv;
ogs_pkbuf_t *s1apbuf = NULL; ogs_pkbuf_t *s1apbuf = NULL;
@ -396,13 +412,15 @@ void s1ap_send_path_switch_ack(mme_ue_t *mme_ue)
ogs_assert(mme_ue); ogs_assert(mme_ue);
s1apbuf = s1ap_build_path_switch_ack(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); rv = nas_eps_send_to_enb(mme_ue, s1apbuf);
ogs_expect(rv == OGS_OK); 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; int rv;
ogs_pkbuf_t *s1apbuf = NULL; ogs_pkbuf_t *s1apbuf = NULL;
@ -410,13 +428,15 @@ void s1ap_send_handover_command(enb_ue_t *source_ue)
ogs_assert(source_ue); ogs_assert(source_ue);
s1apbuf = s1ap_build_handover_command(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); rv = s1ap_send_to_enb_ue(source_ue, s1apbuf);
ogs_expect(rv == OGS_OK); 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) enb_ue_t *source_ue, S1AP_Cause_PR group, long cause)
{ {
int rv; int rv;
@ -426,13 +446,15 @@ void s1ap_send_handover_preparation_failure(
ogs_assert(group); ogs_assert(group);
s1apbuf = s1ap_build_handover_preparation_failure(source_ue, group, cause); 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); rv = s1ap_send_to_enb_ue(source_ue, s1apbuf);
ogs_expect(rv == OGS_OK); 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; int rv;
ogs_pkbuf_t *s1apbuf = NULL; ogs_pkbuf_t *s1apbuf = NULL;
@ -440,14 +462,16 @@ void s1ap_send_handover_cancel_ack(enb_ue_t *source_ue)
ogs_assert(source_ue); ogs_assert(source_ue);
s1apbuf = s1ap_build_handover_cancel_ack(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); rv = s1ap_send_to_enb_ue(source_ue, s1apbuf);
ogs_expect(rv == OGS_OK); 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, enb_ue_t *source_ue, mme_enb_t *target_enb,
S1AP_HandoverType_t *handovertype, S1AP_Cause_t *cause, S1AP_HandoverType_t *handovertype, S1AP_Cause_t *cause,
S1AP_Source_ToTarget_TransparentContainer_t S1AP_Source_ToTarget_TransparentContainer_t
@ -477,13 +501,15 @@ void s1ap_send_handover_request(
s1apbuf = s1ap_build_handover_request( s1apbuf = s1ap_build_handover_request(
target_ue, handovertype, cause, target_ue, handovertype, cause,
source_totarget_transparentContainer); 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); rv = s1ap_send_to_enb_ue(target_ue, s1apbuf);
ogs_expect(rv == OGS_OK); ogs_expect(rv == OGS_OK);
return rv;
} }
void s1ap_send_mme_status_transfer( int s1ap_send_mme_status_transfer(
enb_ue_t *target_ue, enb_ue_t *target_ue,
S1AP_ENB_StatusTransfer_TransparentContainer_t S1AP_ENB_StatusTransfer_TransparentContainer_t
*enb_statustransfer_transparentContainer) *enb_statustransfer_transparentContainer)
@ -495,13 +521,15 @@ void s1ap_send_mme_status_transfer(
s1apbuf = s1ap_build_mme_status_transfer(target_ue, s1apbuf = s1ap_build_mme_status_transfer(target_ue,
enb_statustransfer_transparentContainer); 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); rv = s1ap_send_to_enb_ue(target_ue, s1apbuf);
ogs_expect(rv == OGS_OK); ogs_expect(rv == OGS_OK);
return rv;
} }
void s1ap_send_error_indication( int s1ap_send_error_indication(
mme_enb_t *enb, mme_enb_t *enb,
S1AP_MME_UE_S1AP_ID_t *mme_ue_s1ap_id, S1AP_MME_UE_S1AP_ID_t *mme_ue_s1ap_id,
S1AP_ENB_UE_S1AP_ID_t *enb_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( s1apbuf = ogs_s1ap_build_error_indication(
mme_ue_s1ap_id, enb_ue_s1ap_id, group, cause); 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); rv = s1ap_send_to_enb(enb, s1apbuf, S1AP_NON_UE_SIGNALLING);
ogs_expect(rv == OGS_OK); 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) mme_ue_t *mme_ue, S1AP_Cause_PR group, long cause)
{ {
int rv;
mme_enb_t *enb; mme_enb_t *enb;
enb_ue_t *enb_ue; enb_ue_t *enb_ue;
@ -531,18 +562,21 @@ void s1ap_send_error_indication2(
ogs_assert(mme_ue); ogs_assert(mme_ue);
enb_ue = enb_ue_cycle(mme_ue->enb_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; 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, mme_ue_s1ap_id = enb_ue->mme_ue_s1ap_id,
enb_ue_s1ap_id = enb_ue->enb_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); 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, mme_enb_t *enb,
S1AP_UE_associatedLogicalS1_ConnectionListRes_t *partOfS1_Interface) S1AP_UE_associatedLogicalS1_ConnectionListRes_t *partOfS1_Interface)
{ {
@ -552,8 +586,10 @@ void s1ap_send_s1_reset_ack(
ogs_assert(enb); ogs_assert(enb);
s1apbuf = ogs_s1ap_build_s1_reset_ack(partOfS1_Interface); 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); rv = s1ap_send_to_enb(enb, s1apbuf, S1AP_NON_UE_SIGNALLING);
ogs_expect(rv == OGS_OK); ogs_expect(rv == OGS_OK);
}
return rv;
}

View File

@ -46,50 +46,50 @@ int s1ap_send_to_nas(enb_ue_t *enb_ue,
S1AP_ProcedureCode_t procedureCode, S1AP_NAS_PDU_t *nasPdu); 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); 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); int s1ap_send_s1_setup_response(mme_enb_t *enb);
void s1ap_send_s1_setup_failure( int s1ap_send_s1_setup_failure(
mme_enb_t *enb, S1AP_Cause_PR group, long cause); mme_enb_t *enb, S1AP_Cause_PR group, long cause);
void s1ap_send_initial_context_setup_request(mme_ue_t *mme_ue); int s1ap_send_initial_context_setup_request(mme_ue_t *mme_ue);
void s1ap_send_ue_context_modification_request(mme_ue_t *mme_ue); int s1ap_send_ue_context_modification_request(mme_ue_t *mme_ue);
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, enb_ue_t *enb_ue, S1AP_Cause_PR group, long cause,
uint8_t action, ogs_time_t duration); uint8_t action, ogs_time_t duration);
void s1ap_send_paging(mme_ue_t *mme_ue, S1AP_CNDomain_t cn_domain); 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, mme_enb_t *target_enb,
S1AP_SONConfigurationTransfer_t *SONConfigurationTransfer); 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); int s1ap_send_handover_command(enb_ue_t *source_ue);
void s1ap_send_handover_preparation_failure( int s1ap_send_handover_preparation_failure(
enb_ue_t *source_ue, S1AP_Cause_PR group, long cause); 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, enb_ue_t *source_ue, mme_enb_t *target_enb,
S1AP_HandoverType_t *handovertype, S1AP_Cause_t *cause, S1AP_HandoverType_t *handovertype, S1AP_Cause_t *cause,
S1AP_Source_ToTarget_TransparentContainer_t S1AP_Source_ToTarget_TransparentContainer_t
*source_totarget_transparentContainer); *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, enb_ue_t *target_ue,
S1AP_ENB_StatusTransfer_TransparentContainer_t S1AP_ENB_StatusTransfer_TransparentContainer_t
*enb_statustransfer_transparentContainer); *enb_statustransfer_transparentContainer);
void s1ap_send_error_indication( int s1ap_send_error_indication(
mme_enb_t *enb, mme_enb_t *enb,
S1AP_MME_UE_S1AP_ID_t *mme_ue_s1ap_id, S1AP_MME_UE_S1AP_ID_t *mme_ue_s1ap_id,
S1AP_ENB_UE_S1AP_ID_t *enb_ue_s1ap_id, S1AP_ENB_UE_S1AP_ID_t *enb_ue_s1ap_id,
S1AP_Cause_PR group, long cause); 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); 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, mme_enb_t *enb,
S1AP_UE_associatedLogicalS1_ConnectionListRes_t *partOfS1_Interface); S1AP_UE_associatedLogicalS1_ConnectionListRes_t *partOfS1_Interface);

View File

@ -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); 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; return;
error: 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, 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); 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); ogs_plmn_id_hexdump(&lai->nas_plmn_id), lai->lac);
} }
nas_eps_send_attach_reject(mme_ue, ogs_assert(OGS_OK ==
emm_cause, ESM_CAUSE_PROTOCOL_ERROR_UNSPECIFIED); 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); mme_send_delete_session_or_mme_ue_context_release(mme_ue);
return; return;
@ -337,9 +340,12 @@ void sgsap_handle_paging_request(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf)
} else { } else {
if (CS_CALL_SERVICE_INDICATOR(mme_ue)) { 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)) { } 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 } else
goto paging_reject; 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_buffer,
nas_message_container_length); nas_message_container_length);
nas_eps_send_downlink_nas_transport(mme_ue, ogs_assert(OGS_OK ==
nas_message_container_buffer, nas_message_container_length); 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) 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(vlr);
ogs_assert(pkbuf); 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) void sgsap_handle_release_request(mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf)

View File

@ -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); 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; int rv;
ogs_pkbuf_t *pkbuf = NULL; 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); ogs_debug(" IMSI[%s]", mme_ue->imsi_bcd);
pkbuf = sgsap_build_location_update_request(mme_ue); 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); rv = sgsap_send_to_vlr(mme_ue, pkbuf);
ogs_expect(rv == OGS_OK); 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; int rv;
ogs_pkbuf_t *pkbuf = NULL; 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); ogs_debug(" IMSI[%s]", mme_ue->imsi_bcd);
pkbuf = sgsap_build_tmsi_reallocation_complete(mme_ue); 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); rv = sgsap_send_to_vlr(mme_ue, pkbuf);
ogs_expect(rv == OGS_OK); 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; int rv;
ogs_pkbuf_t *pkbuf = NULL; ogs_pkbuf_t *pkbuf = NULL;
ogs_assert(mme_ue); ogs_assert(mme_ue);
pkbuf = sgsap_build_detach_indication(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); rv = sgsap_send_to_vlr(mme_ue, pkbuf);
ogs_expect(rv == OGS_OK); 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; int rv;
ogs_pkbuf_t *pkbuf = NULL; 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); ogs_debug(" IMSI[%s]", mme_ue->imsi_bcd);
pkbuf = sgsap_build_mo_csfb_indication(mme_ue); 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); rv = sgsap_send_to_vlr(mme_ue, pkbuf);
ogs_expect(rv == OGS_OK); 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; int rv;
ogs_pkbuf_t *pkbuf = NULL; 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); ogs_debug(" EMM_MODE[%d]", emm_mode);
pkbuf = sgsap_build_service_request(mme_ue, 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); rv = sgsap_send_to_vlr(mme_ue, pkbuf);
ogs_expect(rv == OGS_OK); 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; int rv;
ogs_pkbuf_t *pkbuf = NULL; ogs_pkbuf_t *pkbuf = NULL;
@ -197,12 +207,14 @@ void sgsap_send_reset_ack(mme_vlr_t *vlr)
ogs_debug("[SGSAP] RESET-ACK"); ogs_debug("[SGSAP] RESET-ACK");
pkbuf = sgsap_build_reset_ack(vlr); 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); rv = sgsap_send_to_vlr_with_sid(vlr, pkbuf, 0);
ogs_expect(rv == OGS_OK); 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) ogs_nas_eps_message_container_t *nas_message_container)
{ {
int rv; int rv;
@ -216,12 +228,14 @@ void sgsap_send_uplink_unitdata(mme_ue_t *mme_ue,
nas_message_container->buffer, nas_message_container->length); nas_message_container->buffer, nas_message_container->length);
pkbuf = sgsap_build_uplink_unidata(mme_ue, nas_message_container); 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); rv = sgsap_send_to_vlr(mme_ue, pkbuf);
ogs_expect(rv == OGS_OK); 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; int rv;
ogs_pkbuf_t *pkbuf = NULL; 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); ogs_debug(" CAUSE[%d]", sgs_cause);
pkbuf = sgsap_build_ue_unreachable(mme_ue, 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); rv = sgsap_send_to_vlr(mme_ue, pkbuf);
ogs_expect(rv == OGS_OK); ogs_expect(rv == OGS_OK);
}
return rv;
}

View File

@ -41,15 +41,15 @@ int sgsap_send_to_vlr_with_sid(
mme_vlr_t *vlr, ogs_pkbuf_t *pkbuf, uint16_t stream_no); 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); 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); int sgsap_send_location_update_request(mme_ue_t *mme_ue);
void sgsap_send_tmsi_reallocation_complete(mme_ue_t *mme_ue); int sgsap_send_tmsi_reallocation_complete(mme_ue_t *mme_ue);
void sgsap_send_detach_indication(mme_ue_t *mme_ue); int sgsap_send_detach_indication(mme_ue_t *mme_ue);
void sgsap_send_mo_csfb_indication(mme_ue_t *mme_ue); int sgsap_send_mo_csfb_indication(mme_ue_t *mme_ue);
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);
void sgsap_send_reset_ack(mme_vlr_t *vlr); int sgsap_send_reset_ack(mme_vlr_t *vlr);
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); 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 #ifdef __cplusplus
} }

View File

@ -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) uint8_t cause_value, sgwc_bearer_t *bearer)
{ {
int rv; int rv;
@ -189,12 +189,14 @@ void sgwc_gtp_send_downlink_data_notification(
h.teid = sgwc_ue->mme_s11_teid; h.teid = sgwc_ue->mme_s11_teid;
pkbuf = sgwc_s11_build_downlink_data_notification(cause_value, bearer); 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( gtp_xact = ogs_gtp_xact_local_create(
sgwc_ue->gnode, &h, pkbuf, bearer_timeout, bearer); 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); rv = ogs_gtp_xact_commit(gtp_xact);
ogs_expect(rv == OGS_OK); ogs_expect(rv == OGS_OK);
return rv;
} }

View File

@ -29,7 +29,7 @@ extern "C" {
int sgwc_gtp_open(void); int sgwc_gtp_open(void);
void sgwc_gtp_close(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); uint8_t cause_value, sgwc_bearer_t *bearer);
#ifdef __cplusplus #ifdef __cplusplus

View File

@ -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) sgwc_sess_t *sess, ogs_gtp_xact_t *gtp_xact, ogs_pkbuf_t *gtpbuf)
{ {
int rv; int rv;
@ -217,11 +217,11 @@ void sgwc_pfcp_send_session_establishment_request(
h.seid = sess->sgwu_sxa_seid; h.seid = sess->sgwu_sxa_seid;
sxabuf = sgwc_sxa_build_session_establishment_request(h.type, sess); 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( xact = ogs_pfcp_xact_local_create(
sess->pfcp_node, &h, sxabuf, sess_timeout, sess); 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->assoc_xact = gtp_xact;
if (gtpbuf) { if (gtpbuf) {
xact->gtpbuf = ogs_pkbuf_copy(gtpbuf); xact->gtpbuf = ogs_pkbuf_copy(gtpbuf);
@ -230,9 +230,11 @@ void sgwc_pfcp_send_session_establishment_request(
rv = ogs_pfcp_xact_commit(xact); rv = ogs_pfcp_xact_commit(xact);
ogs_expect(rv == OGS_OK); 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, sgwc_sess_t *sess, ogs_gtp_xact_t *gtp_xact,
ogs_pkbuf_t *gtpbuf, uint64_t flags) ogs_pkbuf_t *gtpbuf, uint64_t flags)
{ {
@ -248,11 +250,11 @@ void sgwc_pfcp_send_sess_modification_request(
h.seid = sess->sgwu_sxa_seid; h.seid = sess->sgwu_sxa_seid;
sxabuf = sgwc_sxa_build_sess_modification_request(h.type, sess, flags); 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( xact = ogs_pfcp_xact_local_create(
sess->pfcp_node, &h, sxabuf, sess_timeout, sess); 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->assoc_xact = gtp_xact;
xact->modify_flags = flags | OGS_PFCP_MODIFY_SESSION; xact->modify_flags = flags | OGS_PFCP_MODIFY_SESSION;
if (gtpbuf) { if (gtpbuf) {
@ -262,9 +264,11 @@ void sgwc_pfcp_send_sess_modification_request(
rv = ogs_pfcp_xact_commit(xact); rv = ogs_pfcp_xact_commit(xact);
ogs_expect(rv == OGS_OK); 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, sgwc_bearer_t *bearer, ogs_gtp_xact_t *gtp_xact,
ogs_pkbuf_t *gtpbuf, uint64_t flags) ogs_pkbuf_t *gtpbuf, uint64_t flags)
{ {
@ -283,11 +287,11 @@ void sgwc_pfcp_send_bearer_modification_request(
h.seid = sess->sgwu_sxa_seid; h.seid = sess->sgwu_sxa_seid;
sxabuf = sgwc_sxa_build_bearer_modification_request(h.type, bearer, flags); 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( xact = ogs_pfcp_xact_local_create(
sess->pfcp_node, &h, sxabuf, bearer_timeout, bearer); 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->assoc_xact = gtp_xact;
xact->modify_flags = flags; xact->modify_flags = flags;
if (gtpbuf) { if (gtpbuf) {
@ -297,9 +301,11 @@ void sgwc_pfcp_send_bearer_modification_request(
rv = ogs_pfcp_xact_commit(xact); rv = ogs_pfcp_xact_commit(xact);
ogs_expect(rv == OGS_OK); 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) sgwc_sess_t *sess, ogs_gtp_xact_t *gtp_xact, ogs_pkbuf_t *gtpbuf)
{ {
int rv; int rv;
@ -314,11 +320,11 @@ void sgwc_pfcp_send_session_deletion_request(
h.seid = sess->sgwu_sxa_seid; h.seid = sess->sgwu_sxa_seid;
sxabuf = sgwc_sxa_build_session_deletion_request(h.type, sess); 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( xact = ogs_pfcp_xact_local_create(
sess->pfcp_node, &h, sxabuf, sess_timeout, sess); 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->assoc_xact = gtp_xact;
if (gtpbuf) { if (gtpbuf) {
xact->gtpbuf = ogs_pkbuf_copy(gtpbuf); xact->gtpbuf = ogs_pkbuf_copy(gtpbuf);
@ -327,9 +333,11 @@ void sgwc_pfcp_send_session_deletion_request(
rv = ogs_pfcp_xact_commit(xact); rv = ogs_pfcp_xact_commit(xact);
ogs_expect(rv == OGS_OK); 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) ogs_pfcp_xact_t *xact, sgwc_sess_t *sess, uint8_t cause)
{ {
int rv; int rv;
@ -343,11 +351,13 @@ void sgwc_pfcp_send_session_report_response(
h.seid = sess->sgwu_sxa_seid; h.seid = sess->sgwu_sxa_seid;
sxabuf = ogs_pfcp_build_session_report_response(h.type, cause); 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); 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); rv = ogs_pfcp_xact_commit(xact);
ogs_expect(rv == OGS_OK); ogs_expect(rv == OGS_OK);
}
return rv;
}

View File

@ -29,18 +29,18 @@ extern "C" {
int sgwc_pfcp_open(void); int sgwc_pfcp_open(void);
void sgwc_pfcp_close(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); 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, sgwc_sess_t *sess, ogs_gtp_xact_t *gtp_xact,
ogs_pkbuf_t *gtpbuf, uint64_t flags); 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, sgwc_bearer_t *bearer, ogs_gtp_xact_t *gtp_xact,
ogs_pkbuf_t *gtpbuf, uint64_t flags); 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); 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); ogs_pfcp_xact_t *xact, sgwc_sess_t *sess, uint8_t cause);
#ifdef __cplusplus #ifdef __cplusplus

View File

@ -43,7 +43,8 @@ static void sess_timeout(ogs_gtp_xact_t *xact, void *data)
sgwc_ue->imsi_bcd); sgwc_ue->imsi_bcd);
break; break;
} }
sgwc_pfcp_send_session_deletion_request(sess, NULL, NULL); ogs_assert(OGS_OK ==
sgwc_pfcp_send_session_deletion_request(sess, NULL, NULL));
break; break;
default: default:
ogs_error("GTP Timeout : IMSI[%s] Message-Type[%d]", 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]", ogs_debug(" MME_S11_TEID[%d] SGW_S11_TEID[%d]",
sgwc_ue->mme_s11_teid, sgwc_ue->sgw_s11_teid); 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( 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]", ogs_debug(" ENB_S1U_TEID[%d] SGW_S1U_TEID[%d]",
dl_tunnel->remote_teid, dl_tunnel->local_teid); dl_tunnel->remote_teid, dl_tunnel->local_teid);
sgwc_pfcp_send_bearer_modification_request( ogs_assert(OGS_OK ==
bearer, s11_xact, gtpbuf, flags); sgwc_pfcp_send_bearer_modification_request(
bearer, s11_xact, gtpbuf, flags));
} }
void sgwc_s11_handle_delete_session_request( 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) { 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, 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_send_error_message(s5c_xact, sess ? sess->pgw_s5c_teid : 0,
OGS_GTP_CREATE_BEARER_RESPONSE_TYPE, cause_value); OGS_GTP_CREATE_BEARER_RESPONSE_TYPE, cause_value);
return; return;
@ -636,9 +640,10 @@ void sgwc_s11_handle_create_bearer_response(
ogs_plmn_id_hexdump(&sgwc_ue->e_cgi.plmn_id), ogs_plmn_id_hexdump(&sgwc_ue->e_cgi.plmn_id),
sgwc_ue->e_cgi.cell_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, 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( 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]", ogs_debug(" SGW_S5C_TEID[0x%x] PGW_S5C_TEID[0x%x]",
sess->sgw_s5c_teid, sess->pgw_s5c_teid); sess->sgw_s5c_teid, sess->pgw_s5c_teid);
sgwc_pfcp_send_bearer_modification_request( ogs_assert(OGS_OK ==
bearer, s5c_xact, gtpbuf, OGS_PFCP_MODIFY_REMOVE); sgwc_pfcp_send_bearer_modification_request(
bearer, s5c_xact, gtpbuf, OGS_PFCP_MODIFY_REMOVE));
} }
void sgwc_s11_handle_release_access_bearers_request( 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) { ogs_list_for_each(&sgwc_ue->sess_list, sess) {
sess->state.release_access_bearers = false; 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, 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) { ogs_list_for_each(&sgwc_ue->sess_list, sess) {
sess->state.create_indirect_tunnel = false; 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, 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) { ogs_list_for_each(&sgwc_ue->sess_list, sess) {
sess->state.delete_indirect_tunnel = false; 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, sess, s11_xact, gtpbuf,
OGS_PFCP_MODIFY_INDIRECT| OGS_PFCP_MODIFY_REMOVE); OGS_PFCP_MODIFY_INDIRECT| OGS_PFCP_MODIFY_REMOVE));
} }
} }

View File

@ -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); ogs_warn("[%s] Bearer has already been removed", sgwc_ue->imsi_bcd);
break; break;
} }
sgwc_pfcp_send_bearer_modification_request( ogs_assert(OGS_OK ==
bearer, NULL, NULL, OGS_PFCP_MODIFY_REMOVE); sgwc_pfcp_send_bearer_modification_request(
bearer, NULL, NULL, OGS_PFCP_MODIFY_REMOVE));
break; break;
default: default:
ogs_error("GTP Timeout : IMSI[%s] Message-Type[%d]", 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) { 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( ogs_gtp_send_error_message(
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
OGS_GTP_CREATE_SESSION_RESPONSE_TYPE, cause_value); 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]", ogs_debug(" SGW_S5U_TEID[%d] PGW_S5U_TEID[%d]",
ul_tunnel->local_teid, ul_tunnel->remote_teid); 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, 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( 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) { 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( ogs_gtp_send_error_message(
s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0, s11_xact, sgwc_ue ? sgwc_ue->mme_s11_teid : 0,
OGS_GTP_DELETE_SESSION_RESPONSE_TYPE, cause_value); 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]", ogs_debug(" SGW_S5C_TEID[0x%x] PGW_S5C_TEID[0x%x]",
sess->sgw_s5c_teid, sess->pgw_s5c_teid); 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( 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, &far->outer_header_creation_len);
far->outer_header_creation.teid = ul_tunnel->remote_teid; 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, 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( void sgwc_s5c_handle_update_bearer_request(

View File

@ -81,7 +81,8 @@ static void sess_timeout(ogs_gtp_xact_t *xact, void *data)
sgwc_ue->imsi_bcd); sgwc_ue->imsi_bcd);
break; break;
} }
sgwc_pfcp_send_session_deletion_request(sess, NULL, NULL); ogs_assert(OGS_OK ==
sgwc_pfcp_send_session_deletion_request(sess, NULL, NULL));
break; break;
default: default:
ogs_error("GTP Timeout : IMSI[%s] Message-Type[%d]", 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); ogs_warn("[%s] Bearer has already been removed", sgwc_ue->imsi_bcd);
break; break;
} }
sgwc_pfcp_send_bearer_modification_request( ogs_assert(OGS_OK ==
sgwc_pfcp_send_bearer_modification_request(
bearer, NULL, NULL, bearer, NULL, NULL,
OGS_PFCP_MODIFY_UL_ONLY|OGS_PFCP_MODIFY_REMOVE); OGS_PFCP_MODIFY_UL_ONLY|OGS_PFCP_MODIFY_REMOVE));
break; break;
default: default:
ogs_error("GTP Timeout : IMSI[%s] Message-Type[%d]", 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; bearer = pfcp_xact->assoc_xact;
ogs_assert(bearer); ogs_assert(bearer);
sgwc_gtp_send_downlink_data_notification( ogs_assert(OGS_OK ==
OGS_GTP_CAUSE_ERROR_INDICATION_RECEIVED, bearer); sgwc_gtp_send_downlink_data_notification(
OGS_GTP_CAUSE_ERROR_INDICATION_RECEIVED, bearer));
} else { } else {
ogs_gtp_release_access_bearers_response_t *gtp_rsp = NULL; ogs_gtp_release_access_bearers_response_t *gtp_rsp = NULL;
@ -1123,8 +1126,9 @@ void sgwc_sxa_handle_session_report_request(
return; return;
} }
sgwc_pfcp_send_session_report_response( ogs_assert(OGS_OK ==
pfcp_xact, sess, OGS_PFCP_CAUSE_REQUEST_ACCEPTED); sgwc_pfcp_send_session_report_response(
pfcp_xact, sess, OGS_PFCP_CAUSE_REQUEST_ACCEPTED));
report_type.value = pfcp_req->report_type.u8; 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_list_for_each(&bearer->tunnel_list, tunnel) {
ogs_assert(tunnel->pdr); ogs_assert(tunnel->pdr);
if (tunnel->pdr->id == pdr_id) { if (tunnel->pdr->id == pdr_id) {
sgwc_gtp_send_downlink_data_notification( ogs_assert(OGS_OK ==
OGS_GTP_CAUSE_INVALID_VALUE, bearer); sgwc_gtp_send_downlink_data_notification(
OGS_GTP_CAUSE_INVALID_VALUE, bearer));
return; return;
} }
} }
@ -1164,13 +1169,14 @@ void sgwc_sxa_handle_session_report_request(
sess->state.release_access_bearers = false; sess->state.release_access_bearers = false;
sgwc_pfcp_send_sess_modification_request(sess, ogs_assert(OGS_OK ==
/* We only use the `assoc_xact` parameter temporarily here sgwc_pfcp_send_sess_modification_request(sess,
* to pass the `bearer` context. */ /* We only use the `assoc_xact` parameter temporarily here
* to pass the `bearer` context. */
(ogs_gtp_xact_t *)bearer, (ogs_gtp_xact_t *)bearer,
NULL, NULL,
OGS_PFCP_MODIFY_DL_ONLY|OGS_PFCP_MODIFY_DEACTIVATE| OGS_PFCP_MODIFY_DL_ONLY|OGS_PFCP_MODIFY_DEACTIVATE|
OGS_PFCP_MODIFY_ERROR_INDICATION); OGS_PFCP_MODIFY_ERROR_INDICATION));
} }
} else { } else {

View File

@ -140,7 +140,8 @@ static void _gtpv1_u_recv_cb(short when, ogs_socket_t fd, void *data)
sess = SGWU_SESS(far->sess); sess = SGWU_SESS(far->sess);
ogs_assert(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 { } 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.pdr_id = pdr->id;
report.downlink_data.qfi = qfi; /* for 5GC */ 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 { } else {
ogs_error("[DROP] Invalid GTPU Type [%d]", gtp_h->type); ogs_error("[DROP] Invalid GTPU Type [%d]", gtp_h->type);
@ -271,4 +273,4 @@ int sgwu_gtp_open(void)
void sgwu_gtp_close(void) void sgwu_gtp_close(void)
{ {
ogs_socknode_remove_all(&ogs_gtp_self()->gtpu_list); ogs_socknode_remove_all(&ogs_gtp_self()->gtpu_list);
} }

View File

@ -162,7 +162,7 @@ void sgwu_pfcp_close(void)
ogs_socknode_remove_all(&ogs_pfcp_self()->pfcp_list6); 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_xact_t *xact, sgwu_sess_t *sess,
ogs_pfcp_pdr_t *created_pdr[], int num_of_created_pdr) 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( sxabuf = sgwu_sxa_build_session_establishment_response(
h.type, sess, created_pdr, num_of_created_pdr); 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); 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); rv = ogs_pfcp_xact_commit(xact);
ogs_expect(rv == OGS_OK); 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_xact_t *xact, sgwu_sess_t *sess,
ogs_pfcp_pdr_t *created_pdr[], int num_of_created_pdr) 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( sxabuf = sgwu_sxa_build_session_modification_response(
h.type, sess, created_pdr, num_of_created_pdr); 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); 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); rv = ogs_pfcp_xact_commit(xact);
ogs_expect(rv == OGS_OK); 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) sgwu_sess_t *sess)
{ {
int rv; int rv;
@ -227,13 +231,15 @@ void sgwu_pfcp_send_session_deletion_response(ogs_pfcp_xact_t *xact,
h.seid = sess->sgwc_sxa_seid; h.seid = sess->sgwc_sxa_seid;
sxabuf = sgwu_sxa_build_session_deletion_response(h.type, sess); 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); 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); rv = ogs_pfcp_xact_commit(xact);
ogs_expect(rv == OGS_OK); ogs_expect(rv == OGS_OK);
return rv;
} }
static void sess_timeout(ogs_pfcp_xact_t *xact, void *data) 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) sgwu_sess_t *sess, ogs_pfcp_user_plane_report_t *report)
{ {
int rv; int rv;
@ -269,12 +275,14 @@ void sgwu_pfcp_send_session_report_request(
h.seid = sess->sgwc_sxa_seid; h.seid = sess->sgwc_sxa_seid;
sxabuf = ogs_pfcp_build_session_report_request(h.type, report); 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( xact = ogs_pfcp_xact_local_create(
sess->pfcp_node, &h, sxabuf, sess_timeout, sess); 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); rv = ogs_pfcp_xact_commit(xact);
ogs_expect(rv == OGS_OK); ogs_expect(rv == OGS_OK);
}
return rv;
}

View File

@ -29,16 +29,16 @@ extern "C" {
int sgwu_pfcp_open(void); int sgwu_pfcp_open(void);
void sgwu_pfcp_close(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_xact_t *xact, sgwu_sess_t *sess,
ogs_pfcp_pdr_t *created_pdr[], int num_of_created_pdr); 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_xact_t *xact, sgwu_sess_t *sess,
ogs_pfcp_pdr_t *created_pdr[], int num_of_created_pdr); 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); 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); sgwu_sess_t *sess, ogs_pfcp_user_plane_report_t *report);
#ifdef __cplusplus #ifdef __cplusplus

View File

@ -152,8 +152,9 @@ void sgwu_sxa_handle_session_establishment_request(
} }
} }
sgwu_pfcp_send_session_establishment_response( ogs_assert(OGS_OK ==
xact, sess, created_pdr, num_of_created_pdr); sgwu_pfcp_send_session_establishment_response(
xact, sess, created_pdr, num_of_created_pdr));
return; return;
cleanup: cleanup:
@ -357,8 +358,9 @@ void sgwu_sxa_handle_session_modification_request(
} }
} }
sgwu_pfcp_send_session_modification_response( ogs_assert(OGS_OK ==
xact, sess, created_pdr, num_of_created_pdr); sgwu_pfcp_send_session_modification_response(
xact, sess, created_pdr, num_of_created_pdr));
return; return;
cleanup: cleanup:

View File

@ -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); ogs_warn("[%s] Bearer has already been removed", smf_ue->imsi_bcd);
break; break;
} }
smf_epc_pfcp_send_bearer_modification_request( ogs_assert(OGS_OK ==
bearer, OGS_PFCP_MODIFY_REMOVE); smf_epc_pfcp_send_bearer_modification_request(
bearer, OGS_PFCP_MODIFY_REMOVE));
break; break;
case OGS_GTP_UPDATE_BEARER_REQUEST_TYPE: case OGS_GTP_UPDATE_BEARER_REQUEST_TYPE:
ogs_error("[%s] No Update Bearer Response", smf_ue->imsi_bcd); 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); ogs_warn("[%s] Bearer has already been removed", smf_ue->imsi_bcd);
break; 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; break;
default: default:
ogs_error("GTP Timeout : IMSI[%s] Message-Type[%d]", 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; qer->gbr.downlink = bearer->qos.gbr.downlink;
} }
smf_epc_pfcp_send_bearer_modification_request( ogs_assert(OGS_OK ==
bearer, OGS_PFCP_MODIFY_CREATE); smf_epc_pfcp_send_bearer_modification_request(
bearer, OGS_PFCP_MODIFY_CREATE));
} else { } else {
ogs_gtp_tft_t tft; 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; qer->gbr.downlink = qos_flow->qos.gbr.downlink;
} }
smf_5gc_pfcp_send_qos_flow_modification_request( ogs_assert(OGS_OK ==
qos_flow, NULL, OGS_PFCP_MODIFY_CREATE); smf_5gc_pfcp_send_qos_flow_modification_request(
qos_flow, NULL, OGS_PFCP_MODIFY_CREATE));
} else { } else {
ogs_fatal("Update Qos Flow Not Implemented"); ogs_fatal("Update Qos Flow Not Implemented");

View File

@ -231,8 +231,9 @@ void smf_gsm_state_operational(ogs_fsm_t *s, smf_event_t *e)
break; break;
case OGS_NAS_5GS_PDU_SESSION_RELEASE_REQUEST: case OGS_NAS_5GS_PDU_SESSION_RELEASE_REQUEST:
smf_5gc_pfcp_send_session_deletion_request( ogs_assert(OGS_OK ==
sess, stream, OGS_PFCP_DELETE_TRIGGER_UE_REQUESTED); smf_5gc_pfcp_send_session_deletion_request(
sess, stream, OGS_PFCP_DELETE_TRIGGER_UE_REQUESTED));
break; break;
case OGS_NAS_5GS_PDU_SESSION_RELEASE_COMPLETE: case OGS_NAS_5GS_PDU_SESSION_RELEASE_COMPLETE:

View File

@ -273,7 +273,7 @@ void smf_gtp_close(void)
ogs_socknode_remove_all(&ogs_gtp_self()->gtpu_list); 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) smf_sess_t *sess, ogs_gtp_xact_t *xact)
{ {
int rv; int rv;
@ -288,16 +288,18 @@ void smf_gtp_send_create_session_response(
h.teid = sess->sgw_s5c_teid; h.teid = sess->sgw_s5c_teid;
pkbuf = smf_s5c_build_create_session_response(h.type, sess); 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); 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); rv = ogs_gtp_xact_commit(xact);
ogs_expect(rv == OGS_OK); 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) smf_sess_t *sess, ogs_gtp_xact_t *xact)
{ {
int rv; int rv;
@ -312,13 +314,15 @@ void smf_gtp_send_delete_session_response(
h.teid = sess->sgw_s5c_teid; h.teid = sess->sgw_s5c_teid;
pkbuf = smf_s5c_build_delete_session_response(h.type, sess); 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); 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); rv = ogs_gtp_xact_commit(xact);
ogs_expect(rv == OGS_OK); ogs_expect(rv == OGS_OK);
return rv;
} }
static bool check_if_router_solicit(ogs_pkbuf_t *pkbuf) 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); ogs_pkbuf_free(pkbuf);
} }

View File

@ -29,9 +29,9 @@ extern "C" {
int smf_gtp_open(void); int smf_gtp_open(void);
void smf_gtp_close(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); 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); smf_sess_t *sess, ogs_gtp_xact_t *xact);
#ifdef __cplusplus #ifdef __cplusplus

View File

@ -248,7 +248,8 @@ void smf_gx_handle_cca_initial_request(
ogs_pfcp_pdr_associate_qer(ul_pdr, qer); 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( 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]", ogs_debug(" SGW_S5C_TEID[0x%x] SMF_N4_TEID[0x%x]",
sess->sgw_s5c_teid, sess->smf_n4_teid); 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( void smf_gx_handle_re_auth_request(

View File

@ -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; pfcp_message.h.type = type;
pkbuf = ogs_pfcp_build_msg(&pfcp_message); pkbuf = ogs_pfcp_build_msg(&pfcp_message);

View File

@ -339,10 +339,11 @@ void smf_5gc_n4_handle_session_modification_response(
} else if (flags & OGS_PFCP_MODIFY_N2_HANDOVER) { } else if (flags & OGS_PFCP_MODIFY_N2_HANDOVER) {
if (smf_sess_have_indirect_data_forwarding(sess) == true) { 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, sess, stream,
OGS_PFCP_MODIFY_INDIRECT|OGS_PFCP_MODIFY_REMOVE, 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( 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) { if (flags & OGS_PFCP_MODIFY_CREATE) {
smf_sess_create_indirect_data_forwarding(sess); 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, sess, stream,
OGS_PFCP_MODIFY_INDIRECT|OGS_PFCP_MODIFY_CREATE, OGS_PFCP_MODIFY_INDIRECT|OGS_PFCP_MODIFY_CREATE,
0); 0));
} else if (flags & OGS_PFCP_MODIFY_HANDOVER_CANCEL) { } else if (flags & OGS_PFCP_MODIFY_HANDOVER_CANCEL) {
smf_sbi_send_sm_context_updated_data_ho_state( smf_sbi_send_sm_context_updated_data_ho_state(
sess, stream, OpenAPI_ho_state_CANCELLED); sess, stream, OpenAPI_ho_state_CANCELLED);
@ -621,7 +623,8 @@ void smf_epc_n4_handle_session_establishment_response(
ogs_assert(up_f_seid); ogs_assert(up_f_seid);
sess->upf_n4_seid = be64toh(up_f_seid->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); smf_bearer_binding(sess);
} }
@ -758,7 +761,8 @@ void smf_epc_n4_handle_session_deletion_response(
ogs_assert(sess); 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); SMF_SESS_CLEAR(sess);
} }
@ -862,8 +866,9 @@ void smf_n4_handle_session_report_request(
cause_value, 0); cause_value, 0);
} }
smf_pfcp_send_session_report_response( ogs_assert(OGS_OK ==
pfcp_xact, sess, OGS_PFCP_CAUSE_REQUEST_ACCEPTED); smf_pfcp_send_session_report_response(
pfcp_xact, sess, OGS_PFCP_CAUSE_REQUEST_ACCEPTED));
if (sess->paging.ue_requested_pdu_session_establishment_done == true) { if (sess->paging.ue_requested_pdu_session_establishment_done == true) {
smf_n1_n2_message_transfer_param_t param; 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; smf_sess_t *error_indication_session = NULL;
ogs_assert(smf_ue); ogs_assert(smf_ue);
smf_pfcp_send_session_report_response( ogs_assert(OGS_OK ==
pfcp_xact, sess, OGS_PFCP_CAUSE_REQUEST_ACCEPTED); smf_pfcp_send_session_report_response(
pfcp_xact, sess, OGS_PFCP_CAUSE_REQUEST_ACCEPTED));
error_indication_session = smf_sess_find_by_error_indication_report( error_indication_session = smf_sess_find_by_error_indication_report(
smf_ue, &pfcp_req->error_indication_report); smf_ue, &pfcp_req->error_indication_report);
if (!error_indication_session) return; 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, error_indication_session, NULL,
OGS_PFCP_MODIFY_DL_ONLY|OGS_PFCP_MODIFY_DEACTIVATE| OGS_PFCP_MODIFY_DL_ONLY|OGS_PFCP_MODIFY_DEACTIVATE|
OGS_PFCP_MODIFY_ERROR_INDICATION, OGS_PFCP_MODIFY_ERROR_INDICATION,
0); 0));
} else { } else {
ogs_error("Not supported Report Type[%d]", report_type.value); ogs_error("Not supported Report Type[%d]", report_type.value);
smf_pfcp_send_session_report_response( ogs_assert(OGS_OK ==
pfcp_xact, sess, OGS_PFCP_CAUSE_SYSTEM_FAILURE); smf_pfcp_send_session_report_response(
pfcp_xact, sess, OGS_PFCP_CAUSE_SYSTEM_FAILURE));
} }
} }

View File

@ -138,9 +138,10 @@ int ngap_handle_pdu_session_resource_setup_response_transfer(
} }
if (far_update) { 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, sess, stream, OGS_PFCP_MODIFY_DL_ONLY|OGS_PFCP_MODIFY_ACTIVATE,
0); 0));
} else { } else {
/* ACTIVATED Is NOT Included in RESPONSE */ /* ACTIVATED Is NOT Included in RESPONSE */
smf_sbi_send_http_status_no_content(stream); 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_len);
dl_far->outer_header_creation.teid = sess->gnb_n3_teid; dl_far->outer_header_creation.teid = sess->gnb_n3_teid;
smf_5gc_pfcp_send_qos_flow_modification_request( ogs_assert(OGS_OK ==
qos_flow, stream, OGS_PFCP_MODIFY_ACTIVATE); smf_5gc_pfcp_send_qos_flow_modification_request(
qos_flow, stream, OGS_PFCP_MODIFY_ACTIVATE));
rv = OGS_OK; rv = OGS_OK;
@ -341,11 +343,12 @@ int ngap_handle_path_switch_request_transfer(
} }
if (far_update) { if (far_update) {
smf_5gc_pfcp_send_session_modification_request( ogs_assert(OGS_OK ==
smf_5gc_pfcp_send_session_modification_request(
sess, stream, sess, stream,
OGS_PFCP_MODIFY_DL_ONLY|OGS_PFCP_MODIFY_ACTIVATE| OGS_PFCP_MODIFY_DL_ONLY|OGS_PFCP_MODIFY_ACTIVATE|
OGS_PFCP_MODIFY_XN_HANDOVER|OGS_PFCP_MODIFY_END_MARKER, OGS_PFCP_MODIFY_XN_HANDOVER|OGS_PFCP_MODIFY_END_MARKER,
0); 0));
} else { } else {
/* ACTIVATED Is NOT Included in RESPONSE */ /* ACTIVATED Is NOT Included in RESPONSE */
smf_sbi_send_http_status_no_content(stream); 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("We found redundant INDIRECT Tunnel");
ogs_error("It will be automatically removed"); 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, sess, stream,
OGS_PFCP_MODIFY_INDIRECT| OGS_PFCP_MODIFY_INDIRECT|
/* /*
@ -550,15 +554,16 @@ int ngap_handle_handover_request_ack(
* ... * ...
*/ */
OGS_PFCP_MODIFY_REMOVE|OGS_PFCP_MODIFY_CREATE, OGS_PFCP_MODIFY_REMOVE|OGS_PFCP_MODIFY_CREATE,
0); 0));
} else { } else {
smf_sess_create_indirect_data_forwarding(sess); 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, sess, stream,
OGS_PFCP_MODIFY_INDIRECT|OGS_PFCP_MODIFY_CREATE, OGS_PFCP_MODIFY_INDIRECT|OGS_PFCP_MODIFY_CREATE,
0); 0));
} }
} else { } else {
ogs_pkbuf_t *n2smbuf = ngap_build_handover_command_transfer(sess); ogs_pkbuf_t *n2smbuf = ngap_build_handover_command_transfer(sess);

View File

@ -40,4 +40,4 @@ void ngap_send_to_n2sm(smf_sess_t *sess,
ogs_pkbuf_free(e->pkbuf); ogs_pkbuf_free(e->pkbuf);
smf_event_free(e); smf_event_free(e);
} }
} }

View File

@ -487,7 +487,8 @@ bool smf_npcf_smpolicycontrol_handle_create(
cp2up_pdr->precedence = OGS_PFCP_CP2UP_PDR_PRECEDENCE; cp2up_pdr->precedence = OGS_PFCP_CP2UP_PDR_PRECEDENCE;
up2cp_pdr->precedence = OGS_PFCP_UP2CP_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; return true;

View File

@ -347,10 +347,11 @@ bool smf_nsmf_handle_update_sm_context(
/********************************************************* /*********************************************************
* Handle DEACTIVATED * Handle DEACTIVATED
********************************************************/ ********************************************************/
smf_5gc_pfcp_send_session_modification_request( ogs_assert(OGS_OK ==
smf_5gc_pfcp_send_session_modification_request(
sess, stream, sess, stream,
OGS_PFCP_MODIFY_DL_ONLY|OGS_PFCP_MODIFY_DEACTIVATE, OGS_PFCP_MODIFY_DL_ONLY|OGS_PFCP_MODIFY_DEACTIVATE,
0); 0));
} else if (SmContextUpdateData->up_cnx_state == } else if (SmContextUpdateData->up_cnx_state ==
OpenAPI_up_cnx_state_ACTIVATING) { OpenAPI_up_cnx_state_ACTIVATING) {
@ -481,11 +482,12 @@ bool smf_nsmf_handle_update_sm_context(
} }
if (far_update) { if (far_update) {
smf_5gc_pfcp_send_session_modification_request( ogs_assert(OGS_OK ==
smf_5gc_pfcp_send_session_modification_request(
sess, stream, sess, stream,
OGS_PFCP_MODIFY_DL_ONLY|OGS_PFCP_MODIFY_ACTIVATE| OGS_PFCP_MODIFY_DL_ONLY|OGS_PFCP_MODIFY_ACTIVATE|
OGS_PFCP_MODIFY_N2_HANDOVER|OGS_PFCP_MODIFY_END_MARKER, OGS_PFCP_MODIFY_N2_HANDOVER|OGS_PFCP_MODIFY_END_MARKER,
0); 0));
} else { } else {
char *strerror = ogs_msprintf( char *strerror = ogs_msprintf(
"[%s:%d] No FAR Update", smf_ue->supi, sess->psi); "[%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) { 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, sess, stream,
OGS_PFCP_MODIFY_INDIRECT|OGS_PFCP_MODIFY_REMOVE| OGS_PFCP_MODIFY_INDIRECT|OGS_PFCP_MODIFY_REMOVE|
OGS_PFCP_MODIFY_HANDOVER_CANCEL, OGS_PFCP_MODIFY_HANDOVER_CANCEL,
0); 0));
} else { } else {
smf_sbi_send_sm_context_updated_data_ho_state( smf_sbi_send_sm_context_updated_data_ho_state(
sess, stream, OpenAPI_ho_state_CANCELLED); sess, stream, OpenAPI_ho_state_CANCELLED);
@ -536,8 +539,9 @@ bool smf_nsmf_handle_update_sm_context(
return false; return false;
} }
} else if (SmContextUpdateData->release) { } else if (SmContextUpdateData->release) {
smf_5gc_pfcp_send_session_deletion_request(sess, stream, ogs_assert(OGS_OK ==
OGS_PFCP_DELETE_TRIGGER_AMF_UPDATE_SM_CONTEXT); smf_5gc_pfcp_send_session_deletion_request(sess, stream,
OGS_PFCP_DELETE_TRIGGER_AMF_UPDATE_SM_CONTEXT));
} else { } else {
ogs_error("[%s:%d] No UpdateData", smf_ue->supi, sess->psi); ogs_error("[%s:%d] No UpdateData", smf_ue->supi, sess->psi);
smf_sbi_send_sm_context_update_error(stream, 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_assert(OGS_OK ==
OGS_PFCP_DELETE_TRIGGER_AMF_RELEASE_SM_CONTEXT); smf_5gc_pfcp_send_session_deletion_request(sess, stream,
OGS_PFCP_DELETE_TRIGGER_AMF_RELEASE_SM_CONTEXT));
return true; return true;
} }

View File

@ -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) smf_sess_t *sess, ogs_sbi_stream_t *stream)
{ {
int rv; int rv;
@ -306,18 +306,20 @@ void smf_5gc_pfcp_send_session_establishment_request(
h.seid = sess->upf_n4_seid; h.seid = sess->upf_n4_seid;
n4buf = smf_n4_build_session_establishment_request(h.type, sess); 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( xact = ogs_pfcp_xact_local_create(
sess->pfcp_node, &h, n4buf, sess_5gc_timeout, sess); 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->assoc_stream = stream;
rv = ogs_pfcp_xact_commit(xact); rv = ogs_pfcp_xact_commit(xact);
ogs_expect(rv == OGS_OK); 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, smf_sess_t *sess, ogs_sbi_stream_t *stream,
uint64_t flags, ogs_time_t duration) 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; h.seid = sess->upf_n4_seid;
n4buf = smf_n4_build_session_modification_request(h.type, sess, flags); 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( xact = ogs_pfcp_xact_local_create(
sess->pfcp_node, &h, n4buf, sess_5gc_timeout, sess); 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->assoc_stream = stream;
xact->modify_flags = flags | OGS_PFCP_MODIFY_SESSION; xact->modify_flags = flags | OGS_PFCP_MODIFY_SESSION;
if (duration) { if (duration) {
ogs_pfcp_xact_delayed_commit(xact, duration); ogs_pfcp_xact_delayed_commit(xact, duration);
return OGS_OK;
} else { } else {
rv = ogs_pfcp_xact_commit(xact); rv = ogs_pfcp_xact_commit(xact);
ogs_expect(rv == OGS_OK); 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) ogs_sbi_stream_t *stream, uint64_t flags)
{ {
int rv; 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; h.seid = sess->upf_n4_seid;
n4buf = smf_n4_build_qos_flow_modification_request(h.type, qos_flow, flags); 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( xact = ogs_pfcp_xact_local_create(
sess->pfcp_node, &h, n4buf, qos_flow_5gc_timeout, qos_flow); 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->assoc_stream = stream;
xact->modify_flags = flags; xact->modify_flags = flags;
rv = ogs_pfcp_xact_commit(xact); rv = ogs_pfcp_xact_commit(xact);
ogs_expect(rv == OGS_OK); 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) smf_sess_t *sess, ogs_sbi_stream_t *stream, int trigger)
{ {
int rv; int rv;
@ -399,19 +407,21 @@ void smf_5gc_pfcp_send_session_deletion_request(
h.seid = sess->upf_n4_seid; h.seid = sess->upf_n4_seid;
n4buf = smf_n4_build_session_deletion_request(h.type, sess); 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( xact = ogs_pfcp_xact_local_create(
sess->pfcp_node, &h, n4buf, sess_5gc_timeout, sess); 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->assoc_stream = stream;
xact->delete_trigger = trigger; xact->delete_trigger = trigger;
rv = ogs_pfcp_xact_commit(xact); rv = ogs_pfcp_xact_commit(xact);
ogs_expect(rv == OGS_OK); 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) smf_sess_t *sess, void *gtp_xact)
{ {
int rv; int rv;
@ -426,20 +436,22 @@ void smf_epc_pfcp_send_session_establishment_request(
h.seid = sess->upf_n4_seid; h.seid = sess->upf_n4_seid;
n4buf = smf_n4_build_session_establishment_request(h.type, sess); 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( xact = ogs_pfcp_xact_local_create(
sess->pfcp_node, &h, n4buf, sess_epc_timeout, sess); 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->epc = true; /* EPC PFCP transaction */
xact->assoc_xact = gtp_xact; xact->assoc_xact = gtp_xact;
rv = ogs_pfcp_xact_commit(xact); rv = ogs_pfcp_xact_commit(xact);
ogs_expect(rv == OGS_OK); 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) smf_bearer_t *bearer, uint64_t flags)
{ {
int rv; int rv;
@ -457,20 +469,22 @@ void smf_epc_pfcp_send_bearer_modification_request(
h.seid = sess->upf_n4_seid; h.seid = sess->upf_n4_seid;
n4buf = smf_n4_build_qos_flow_modification_request(h.type, bearer, flags); 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( xact = ogs_pfcp_xact_local_create(
sess->pfcp_node, &h, n4buf, bearer_epc_timeout, bearer); 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->epc = true; /* EPC PFCP transaction */
xact->modify_flags = flags; xact->modify_flags = flags;
rv = ogs_pfcp_xact_commit(xact); rv = ogs_pfcp_xact_commit(xact);
ogs_expect(rv == OGS_OK); 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) smf_sess_t *sess, void *gtp_xact)
{ {
int rv; int rv;
@ -485,20 +499,22 @@ void smf_epc_pfcp_send_session_deletion_request(
h.seid = sess->upf_n4_seid; h.seid = sess->upf_n4_seid;
n4buf = smf_n4_build_session_deletion_request(h.type, sess); 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( xact = ogs_pfcp_xact_local_create(
sess->pfcp_node, &h, n4buf, sess_epc_timeout, sess); 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->epc = true; /* EPC PFCP transaction */
xact->assoc_xact = gtp_xact; xact->assoc_xact = gtp_xact;
rv = ogs_pfcp_xact_commit(xact); rv = ogs_pfcp_xact_commit(xact);
ogs_expect(rv == OGS_OK); 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) ogs_pfcp_xact_t *xact, smf_sess_t *sess, uint8_t cause)
{ {
int rv; int rv;
@ -512,11 +528,13 @@ void smf_pfcp_send_session_report_response(
h.seid = sess->upf_n4_seid; h.seid = sess->upf_n4_seid;
sxabuf = ogs_pfcp_build_session_report_response(h.type, cause); 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); 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); rv = ogs_pfcp_xact_commit(xact);
ogs_expect(rv == OGS_OK); ogs_expect(rv == OGS_OK);
return rv;
} }

View File

@ -29,24 +29,24 @@ extern "C" {
int smf_pfcp_open(void); int smf_pfcp_open(void);
void smf_pfcp_close(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); 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, smf_sess_t *sess, ogs_sbi_stream_t *stream,
uint64_t flags, ogs_time_t duration); 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); 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); 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); 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); 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); 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); ogs_pfcp_xact_t *xact, smf_sess_t *sess, uint8_t cause);
#ifdef __cplusplus #ifdef __cplusplus

View File

@ -344,8 +344,9 @@ void smf_s5c_handle_create_bearer_response(
} }
if (cause_value != OGS_GTP_CAUSE_REQUEST_ACCEPTED) { if (cause_value != OGS_GTP_CAUSE_REQUEST_ACCEPTED) {
smf_epc_pfcp_send_bearer_modification_request( ogs_assert(OGS_OK ==
bearer, OGS_PFCP_MODIFY_REMOVE); smf_epc_pfcp_send_bearer_modification_request(
bearer, OGS_PFCP_MODIFY_REMOVE));
return; 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, &dl_far->outer_header_creation_len);
dl_far->outer_header_creation.teid = bearer->sgw_s5u_teid; dl_far->outer_header_creation.teid = bearer->sgw_s5u_teid;
smf_epc_pfcp_send_bearer_modification_request( ogs_assert(OGS_OK ==
bearer, OGS_PFCP_MODIFY_ACTIVATE); smf_epc_pfcp_send_bearer_modification_request(
bearer, OGS_PFCP_MODIFY_ACTIVATE));
} }
void smf_s5c_handle_update_bearer_response( void smf_s5c_handle_update_bearer_response(
@ -506,7 +508,8 @@ void smf_s5c_handle_update_bearer_response(
} }
if (pfcp_flags) 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( 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]", ogs_debug("Delete Bearer Response : SGW[0x%x] --> SMF[0x%x]",
sess->sgw_s5c_teid, sess->smf_n4_teid); sess->sgw_s5c_teid, sess->smf_n4_teid);
smf_epc_pfcp_send_bearer_modification_request( ogs_assert(OGS_OK ==
bearer, OGS_PFCP_MODIFY_REMOVE); 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) static int reconfigure_packet_filter(smf_pf_t *pf, ogs_gtp_tft_t *tft, int i)

View File

@ -119,7 +119,8 @@ static void _gtpv1_tun_recv_cb(short when, ogs_socket_t fd, void *data)
if (pdr->qer && pdr->qer->qfi) if (pdr->qer && pdr->qer->qfi)
report.downlink_data.qfi = pdr->qer->qfi; /* for 5GC */ 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: cleanup:
@ -243,7 +244,8 @@ static void _gtpv1_u_recv_cb(short when, ogs_socket_t fd, void *data)
sess = UPF_SESS(far->sess); sess = UPF_SESS(far->sess);
ogs_assert(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 { } 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) if (pdr->qer && pdr->qer->qfi)
report.downlink_data.qfi = pdr->qer->qfi; /* for 5GC */ 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) { } else if (far->dst_if == OGS_PFCP_INTERFACE_CP_FUNCTION) {
@ -530,4 +533,4 @@ static void upf_gtp_handle_multicast(ogs_pkbuf_t *recvbuf)
} }
} }
} }
} }

View File

@ -157,8 +157,9 @@ void upf_n4_handle_session_establishment_request(
} }
} }
upf_pfcp_send_session_establishment_response( ogs_assert(OGS_OK ==
xact, sess, created_pdr, num_of_created_pdr); upf_pfcp_send_session_establishment_response(
xact, sess, created_pdr, num_of_created_pdr));
return; return;
cleanup: cleanup:
@ -370,8 +371,9 @@ void upf_n4_handle_session_modification_request(
} }
} }
upf_pfcp_send_session_modification_response( ogs_assert(OGS_OK ==
xact, sess, created_pdr, num_of_created_pdr); upf_pfcp_send_session_modification_response(
xact, sess, created_pdr, num_of_created_pdr));
return; return;
cleanup: cleanup:

View File

@ -165,7 +165,7 @@ void upf_pfcp_close(void)
ogs_socknode_remove_all(&ogs_pfcp_self()->pfcp_list6); 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_xact_t *xact, upf_sess_t *sess,
ogs_pfcp_pdr_t *created_pdr[], int num_of_created_pdr) 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( n4buf = upf_n4_build_session_establishment_response(
h.type, sess, created_pdr, num_of_created_pdr); 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); 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); rv = ogs_pfcp_xact_commit(xact);
ogs_expect(rv == OGS_OK); 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_xact_t *xact, upf_sess_t *sess,
ogs_pfcp_pdr_t *created_pdr[], int num_of_created_pdr) 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( n4buf = upf_n4_build_session_modification_response(
h.type, sess, created_pdr, num_of_created_pdr); 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); 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); rv = ogs_pfcp_xact_commit(xact);
ogs_expect(rv == OGS_OK); 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) upf_sess_t *sess)
{ {
int rv; int rv;
@ -230,13 +234,15 @@ void upf_pfcp_send_session_deletion_response(ogs_pfcp_xact_t *xact,
h.seid = sess->smf_n4_seid; h.seid = sess->smf_n4_seid;
n4buf = upf_n4_build_session_deletion_response(h.type, sess); 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); 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); rv = ogs_pfcp_xact_commit(xact);
ogs_expect(rv == OGS_OK); ogs_expect(rv == OGS_OK);
return rv;
} }
static void sess_timeout(ogs_pfcp_xact_t *xact, void *data) 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) upf_sess_t *sess, ogs_pfcp_user_plane_report_t *report)
{ {
int rv; int rv;
@ -272,12 +278,14 @@ void upf_pfcp_send_session_report_request(
h.seid = sess->smf_n4_seid; h.seid = sess->smf_n4_seid;
n4buf = ogs_pfcp_build_session_report_request(h.type, report); 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( xact = ogs_pfcp_xact_local_create(
sess->pfcp_node, &h, n4buf, sess_timeout, sess); 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); rv = ogs_pfcp_xact_commit(xact);
ogs_expect(rv == OGS_OK); ogs_expect(rv == OGS_OK);
}
return rv;
}

View File

@ -29,16 +29,16 @@ extern "C" {
int upf_pfcp_open(void); int upf_pfcp_open(void);
void upf_pfcp_close(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_xact_t *xact, upf_sess_t *sess,
ogs_pfcp_pdr_t *created_pdr[], int num_of_created_pdr); 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_xact_t *xact, upf_sess_t *sess,
ogs_pfcp_pdr_t *created_pdr[], int num_of_created_pdr); 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); 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); upf_sess_t *sess, ogs_pfcp_user_plane_report_t *report);
#ifdef __cplusplus #ifdef __cplusplus