From 3870216a6b134bf383178364e6bece22197435ef Mon Sep 17 00:00:00 2001 From: mitmitmitm Date: Wed, 23 Nov 2022 12:37:27 +0100 Subject: [PATCH] [AMF] Add support for SDM subscription and authentication deletion --- lib/sbi/message.c | 2 + src/amf/gmm-sm.c | 94 ++++++++++++++++++++++++++++++++++++------- src/amf/nausf-build.c | 19 +++++++++ src/amf/nausf-build.h | 2 + src/amf/nudm-build.c | 25 ++++++++++++ src/amf/nudm-build.h | 2 + 6 files changed, 129 insertions(+), 15 deletions(-) diff --git a/lib/sbi/message.c b/lib/sbi/message.c index 90ae995fd..df117025e 100644 --- a/lib/sbi/message.c +++ b/lib/sbi/message.c @@ -1213,6 +1213,8 @@ static int parse_json(ogs_sbi_message_t *message, } } break; + CASE(OGS_SBI_HTTP_METHOD_DELETE) + break; DEFAULT rv = OGS_ERROR; ogs_error("Unknown method [%s]", message->h.method); diff --git a/src/amf/gmm-sm.c b/src/amf/gmm-sm.c index 98322d544..af6c98ef7 100644 --- a/src/amf/gmm-sm.c +++ b/src/amf/gmm-sm.c @@ -164,21 +164,38 @@ void gmm_state_de_registered(ogs_fsm_t *s, amf_event_t *e) break; CASE(OGS_SBI_SERVICE_NAME_NUDM_UECM) + if (sbi_message->res_status != OGS_SBI_HTTP_STATUS_CREATED && + sbi_message->res_status != OGS_SBI_HTTP_STATUS_NO_CONTENT && + sbi_message->res_status != OGS_SBI_HTTP_STATUS_OK) { + ogs_error("[%s] HTTP response error [%d]", + amf_ue->supi, sbi_message->res_status); + break; + } SWITCH(sbi_message->h.resource.component[1]) CASE(OGS_SBI_RESOURCE_NAME_REGISTRATIONS) - if (sbi_message->res_status != OGS_SBI_HTTP_STATUS_CREATED && - sbi_message->res_status != OGS_SBI_HTTP_STATUS_NO_CONTENT && - sbi_message->res_status != OGS_SBI_HTTP_STATUS_OK) { - ogs_error("[%s] HTTP response error [%d]", - amf_ue->supi, sbi_message->res_status); - break; - } - SWITCH(sbi_message->h.method) CASE(OGS_SBI_HTTP_METHOD_PUT) ogs_warn("[%s] Ignore SBI message", amf_ue->supi); break; + CASE(OGS_SBI_HTTP_METHOD_PATCH) + SWITCH(sbi_message->h.resource.component[2]) + CASE(OGS_SBI_RESOURCE_NAME_AMF_3GPP_ACCESS) + if (amf_ue->data_change_subscription_id) { + ogs_free(amf_ue->data_change_subscription_id); + amf_ue->data_change_subscription_id = NULL; + } + ogs_assert(true == + amf_ue_sbi_discover_and_send( + OGS_SBI_SERVICE_TYPE_NAUSF_AUTH, NULL, + amf_nausf_auth_build_authenticate_delete, + amf_ue, NULL)); + break; + DEFAULT + ogs_warn("Ignoring invalid resource name [%s]", + sbi_message->h.resource.component[2]); + END + break; DEFAULT ogs_error("[%s] Invalid HTTP method [%s]", @@ -195,21 +212,36 @@ void gmm_state_de_registered(ogs_fsm_t *s, amf_event_t *e) break; CASE(OGS_SBI_SERVICE_NAME_NUDM_SDM) + if ((sbi_message->res_status != OGS_SBI_HTTP_STATUS_OK) && + (sbi_message->res_status != OGS_SBI_HTTP_STATUS_CREATED) && + (sbi_message->res_status != OGS_SBI_HTTP_STATUS_NO_CONTENT)) { + ogs_error("[%s] HTTP response error [%d]", + amf_ue->supi, sbi_message->res_status); + break; + } SWITCH(sbi_message->h.resource.component[1]) CASE(OGS_SBI_RESOURCE_NAME_AM_DATA) CASE(OGS_SBI_RESOURCE_NAME_SMF_SELECT_DATA) CASE(OGS_SBI_RESOURCE_NAME_UE_CONTEXT_IN_SMF_DATA) - CASE(OGS_SBI_RESOURCE_NAME_SDM_SUBSCRIPTIONS) - if ((sbi_message->res_status != OGS_SBI_HTTP_STATUS_OK) && - (sbi_message->res_status != OGS_SBI_HTTP_STATUS_CREATED)) { - ogs_error("[%s] HTTP response error [%d]", - amf_ue->supi, sbi_message->res_status); - break; - } ogs_warn("[%s] Ignore SBI message", amf_ue->supi); break; + CASE(OGS_SBI_RESOURCE_NAME_SDM_SUBSCRIPTIONS) + SWITCH(sbi_message->h.method) + CASE(OGS_SBI_HTTP_METHOD_DELETE) + ogs_assert(true == + amf_ue_sbi_discover_and_send( + OGS_SBI_SERVICE_TYPE_NUDM_UECM, NULL, + amf_nudm_uecm_build_registration_delete, + amf_ue, NULL)); + break; + DEFAULT + ogs_warn("[%s] Ignore invalid HTTP method [%s]", + amf_ue->suci, sbi_message->h.method); + END + break; + DEFAULT ogs_error("Invalid resource name [%s]", sbi_message->h.resource.component[1]); @@ -217,6 +249,38 @@ void gmm_state_de_registered(ogs_fsm_t *s, amf_event_t *e) END break; + CASE(OGS_SBI_SERVICE_NAME_NAUSF_AUTH) + if (sbi_message->res_status != OGS_SBI_HTTP_STATUS_CREATED && + sbi_message->res_status != OGS_SBI_HTTP_STATUS_NO_CONTENT && + sbi_message->res_status != OGS_SBI_HTTP_STATUS_OK) { + ogs_error("[%s] HTTP response error [%d]", + amf_ue->supi, sbi_message->res_status); + break; + } + SWITCH(sbi_message->h.resource.component[0]) + CASE(OGS_SBI_RESOURCE_NAME_5G_AKA) + CASE(OGS_SBI_RESOURCE_NAME_5G_AKA_CONFIRMATION) + CASE(OGS_SBI_RESOURCE_NAME_EAP_SESSION) + ogs_warn("[%s] Ignore SBI message", amf_ue->supi); + break; + CASE(OGS_SBI_RESOURCE_NAME_UE_AUTHENTICATIONS) + SWITCH(sbi_message->h.method) + CASE(OGS_SBI_HTTP_METHOD_DELETE) + if (amf_ue->confirmation_url_for_5g_aka) + ogs_free(amf_ue->confirmation_url_for_5g_aka); + amf_ue->confirmation_url_for_5g_aka = NULL; + break; + DEFAULT + ogs_error("[%s] Invalid HTTP method [%s]", + amf_ue->suci, sbi_message->h.method); + END + break; + DEFAULT + ogs_error("Invalid resource name [%s]", + sbi_message->h.resource.component[1]); + END + break; + CASE(OGS_SBI_SERVICE_NAME_NPCF_AM_POLICY_CONTROL) SWITCH(sbi_message->h.resource.component[0]) CASE(OGS_SBI_RESOURCE_NAME_POLICIES) diff --git a/src/amf/nausf-build.c b/src/amf/nausf-build.c index 174e11c2a..72c8aee60 100644 --- a/src/amf/nausf-build.c +++ b/src/amf/nausf-build.c @@ -80,6 +80,25 @@ end: return request; } +ogs_sbi_request_t *amf_nausf_auth_build_authenticate_delete( + amf_ue_t *amf_ue, void *data) +{ + ogs_sbi_message_t message; + ogs_sbi_request_t *request = NULL; + + ogs_assert(amf_ue); + ogs_assert(amf_ue->confirmation_url_for_5g_aka); + + memset(&message, 0, sizeof(message)); + message.h.method = (char *)OGS_SBI_HTTP_METHOD_DELETE; + message.h.uri = amf_ue->confirmation_url_for_5g_aka; + + request = ogs_sbi_build_request(&message); + ogs_expect(request); + + return request; +} + ogs_sbi_request_t *amf_nausf_auth_build_authenticate_confirmation( amf_ue_t *amf_ue, void *data) { diff --git a/src/amf/nausf-build.h b/src/amf/nausf-build.h index 2356fb2d3..f923c7865 100644 --- a/src/amf/nausf-build.h +++ b/src/amf/nausf-build.h @@ -28,6 +28,8 @@ extern "C" { ogs_sbi_request_t *amf_nausf_auth_build_authenticate( amf_ue_t *amf_ue, void *data); +ogs_sbi_request_t *amf_nausf_auth_build_authenticate_delete( + amf_ue_t *amf_ue, void *data); ogs_sbi_request_t *amf_nausf_auth_build_authenticate_confirmation( amf_ue_t *amf_ue, void *data); diff --git a/src/amf/nudm-build.c b/src/amf/nudm-build.c index 203490f9c..8b1f62b7a 100644 --- a/src/amf/nudm-build.c +++ b/src/amf/nudm-build.c @@ -239,3 +239,28 @@ end: return request; } + +ogs_sbi_request_t *amf_nudm_sdm_build_subscription_delete( + amf_ue_t *amf_ue, void *data) +{ + ogs_sbi_message_t message; + ogs_sbi_request_t *request = NULL; + + ogs_assert(amf_ue); + ogs_assert(amf_ue->supi); + ogs_assert(amf_ue->data_change_subscription_id); + + memset(&message, 0, sizeof(message)); + message.h.method = (char *)OGS_SBI_HTTP_METHOD_DELETE; + message.h.service.name = (char *)OGS_SBI_SERVICE_NAME_NUDM_SDM; + message.h.api.version = (char *)OGS_SBI_API_V2; + message.h.resource.component[0] = amf_ue->supi; + message.h.resource.component[1] = + (char *)OGS_SBI_RESOURCE_NAME_SDM_SUBSCRIPTIONS; + message.h.resource.component[2] = amf_ue->data_change_subscription_id; + + request = ogs_sbi_build_request(&message); + ogs_expect(request); + + return request; +} diff --git a/src/amf/nudm-build.h b/src/amf/nudm-build.h index 619b125ca..dc6a7219e 100644 --- a/src/amf/nudm-build.h +++ b/src/amf/nudm-build.h @@ -33,6 +33,8 @@ ogs_sbi_request_t *amf_nudm_uecm_build_registration_delete( ogs_sbi_request_t *amf_nudm_sdm_build_get(amf_ue_t *amf_ue, void *data); ogs_sbi_request_t *amf_nudm_sdm_build_subscription( amf_ue_t *amf_ue, void *data); +ogs_sbi_request_t *amf_nudm_sdm_build_subscription_delete( + amf_ue_t *amf_ue, void *data); #ifdef __cplusplus }