diff --git a/lib/core/ogs-memory.h b/lib/core/ogs-memory.h index 43a066ec4..3df380273 100644 --- a/lib/core/ogs-memory.h +++ b/lib/core/ogs-memory.h @@ -35,14 +35,6 @@ extern "C" { (__dATA) = NULL; \ } \ } while(0) -#define OGS_MEM_STORE(__dST, __sRC) \ - do { \ - ogs_assert((__sRC)); \ - OGS_MEM_CLEAR(__dST); \ - (__dST) = ogs_calloc(sizeof(*(__sRC)), sizeof(uint8_t)); \ - ogs_assert((__dST)); \ - memcpy((__dST), (__sRC), sizeof(*(__sRC))*sizeof(uint8_t)); \ - } while(0) #define ogs_malloc(size) ogs_malloc_debug(size, OGS_FILE_LINE, false) #define ogs_malloc_or_assert(size) \ diff --git a/lib/core/ogs-strings.h b/lib/core/ogs-strings.h index 03e41d798..6f5b85537 100644 --- a/lib/core/ogs-strings.h +++ b/lib/core/ogs-strings.h @@ -75,6 +75,13 @@ char *ogs_vslprintf(char *str, char *last, const char *format, va_list ap) char *ogs_slprintf(char *str, char *last, const char *format, ...) OGS_GNUC_PRINTF(3, 4); +#define OGS_STRING_DUP(__dST, __sRC) \ + do { \ + OGS_MEM_CLEAR(__dST); \ + __dST = ogs_strdup(__sRC); \ + ogs_assert(__dST); \ + } while(0) + #define ogs_strdup(s) ogs_strdup_debug(s, OGS_FILE_LINE, false) #define ogs_strdup_or_assert(s) ogs_strdup_debug(s, OGS_FILE_LINE, true) char *ogs_strdup_debug(const char *s, const char *file_line, bool abort); diff --git a/lib/sbi/message.c b/lib/sbi/message.c index 9432f22b9..d5381d887 100644 --- a/lib/sbi/message.c +++ b/lib/sbi/message.c @@ -1466,24 +1466,34 @@ static int parse_json(ogs_sbi_message_t *message, CASE(OGS_SBI_SERVICE_NAME_NPCF_AM_POLICY_CONTROL) SWITCH(message->h.resource.component[0]) CASE(OGS_SBI_RESOURCE_NAME_POLICIES) - if (message->res_status == 0) { - message->PolicyAssociationRequest = - OpenAPI_policy_association_request_parseFromJSON( - item); - if (!message->PolicyAssociationRequest) { - rv = OGS_ERROR; - ogs_error("JSON parse error"); + SWITCH(message->h.method) + CASE(OGS_SBI_HTTP_METHOD_POST) + if (message->res_status == 0) { + message->PolicyAssociationRequest = + OpenAPI_policy_association_request_parseFromJSON( + item); + if (!message->PolicyAssociationRequest) { + rv = OGS_ERROR; + ogs_error("JSON parse error"); + } + } else if (message->res_status == + OGS_SBI_HTTP_STATUS_CREATED) { + message->PolicyAssociation = + OpenAPI_policy_association_parseFromJSON(item); + if (!message->PolicyAssociation) { + rv = OGS_ERROR; + ogs_error("JSON parse error"); + } } - } else if (message->res_status == OGS_SBI_HTTP_STATUS_CREATED) { - message->PolicyAssociation = - OpenAPI_policy_association_parseFromJSON(item); - if (!message->PolicyAssociation) { - rv = OGS_ERROR; - ogs_error("JSON parse error"); - } - } + break; + CASE(OGS_SBI_HTTP_METHOD_DELETE) + /* Nothing */ + break; + DEFAULT + rv = OGS_ERROR; + ogs_error("Unknown method [%s]", message->h.method); + END break; - DEFAULT rv = OGS_ERROR; ogs_error("Unknown resource name [%s]", @@ -1529,7 +1539,6 @@ static int parse_json(ogs_sbi_message_t *message, ogs_error("Unknown resource name [%s]", message->h.resource.component[2]); END - break; } break; diff --git a/src/amf/context.c b/src/amf/context.c index 0c791fd95..65db16ca5 100644 --- a/src/amf/context.c +++ b/src/amf/context.c @@ -2144,7 +2144,7 @@ static bool check_smf_info_nr_tai( return false; } -void amf_update_allowed_nssai(amf_ue_t *amf_ue) +bool amf_update_allowed_nssai(amf_ue_t *amf_ue) { int i; ogs_assert(amf_ue); @@ -2285,4 +2285,37 @@ void amf_update_allowed_nssai(amf_ue_t *amf_ue) } } } + + if (!amf_ue->allowed_nssai.num_of_s_nssai) { + ogs_error("No Allowed-NSSAI"); + ogs_error(" Number of Subscribed S-NSSAI [%d]", + amf_ue->num_of_slice); + for (i = 0; i < amf_ue->num_of_slice; i++) { + ogs_slice_data_t *slice = &amf_ue->slice[i]; + if (slice->default_indicator == true) { + ogs_error( + " Default S_NSSAI[SST:%d SD:0x%x]", + slice->s_nssai.sst, slice->s_nssai.sd.v); + } else { + ogs_error( + " S_NSSAI[SST:%d SD:0x%x]", + slice->s_nssai.sst, slice->s_nssai.sd.v); + } + } + ogs_error(" Number of Requested NSSAI [%d]", + amf_ue->requested_nssai.num_of_s_nssai); + for (i = 0; i < amf_ue->requested_nssai. + num_of_s_nssai; i++) { + ogs_error(" PLMN_ID[MCC:%d MNC:%d]", + ogs_plmn_id_mcc(&amf_ue->nr_tai.plmn_id), + ogs_plmn_id_mnc(&amf_ue->nr_tai.plmn_id)); + ogs_error(" S_NSSAI[SST:%d SD:0x%x]", + amf_ue->requested_nssai.s_nssai[i].sst, + amf_ue->requested_nssai.s_nssai[i].sd.v); + } + + return false; + } + + return true; } diff --git a/src/amf/context.h b/src/amf/context.h index 95cad8d11..dcfdd1120 100644 --- a/src/amf/context.h +++ b/src/amf/context.h @@ -282,6 +282,13 @@ struct amf_ue_s { /* PCF sends the RESPONSE * of [POST] /npcf-am-polocy-control/v1/policies */ +#define PCF_AM_POLICY_ASSOCIATED(__aMF) \ + ((__aMF) && ((__aMF)->policy_association_id)) + +#define PCF_AM_POLICY_CLEAR(__aMF) \ + OGS_MEM_CLEAR((__aMF)->policy_association_id); +#define PCF_AM_POLICY_STORE(__aMF, __iD) \ + OGS_STRING_DUP((__aMF)->policy_association_id, __iD); char *policy_association_id; /* 5GMM Capability */ @@ -760,7 +767,7 @@ uint8_t amf_selected_enc_algorithm(amf_ue_t *amf_ue); void amf_clear_subscribed_info(amf_ue_t *amf_ue); -void amf_update_allowed_nssai(amf_ue_t *amf_ue); +bool amf_update_allowed_nssai(amf_ue_t *amf_ue); #ifdef __cplusplus } diff --git a/src/amf/gmm-sm.c b/src/amf/gmm-sm.c index f25e40a90..5b23b676c 100644 --- a/src/amf/gmm-sm.c +++ b/src/amf/gmm-sm.c @@ -98,6 +98,9 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e) ogs_nas_5gs_message_t *nas_message = NULL; ogs_nas_security_header_type_t h; + ogs_sbi_response_t *sbi_response = NULL; + ogs_sbi_message_t *sbi_message = NULL; + ogs_assert(e); if (e->sess) { @@ -157,42 +160,22 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e) if (amf_sess_xact_count(amf_ue) == xact_count) { - amf_update_allowed_nssai(amf_ue); - - if (!amf_ue->allowed_nssai.num_of_s_nssai) { - int i; - + if (amf_update_allowed_nssai(amf_ue) == false) { ogs_error("No Allowed-NSSAI"); - ogs_error(" Number of Subscribed S-NSSAI [%d]", - amf_ue->num_of_slice); - for (i = 0; i < amf_ue->num_of_slice; i++) { - ogs_slice_data_t *slice = &amf_ue->slice[i]; - if (slice->default_indicator == true) { - ogs_error( - " Default S_NSSAI[SST:%d SD:0x%x]", - slice->s_nssai.sst, slice->s_nssai.sd.v); - } else { - ogs_error( - " S_NSSAI[SST:%d SD:0x%x]", - slice->s_nssai.sst, slice->s_nssai.sd.v); - } - } - ogs_error(" Number of Requested NSSAI [%d]", - amf_ue->requested_nssai.num_of_s_nssai); - for (i = 0; i < amf_ue->requested_nssai. - num_of_s_nssai; i++) { - ogs_error(" PLMN_ID[MCC:%d MNC:%d]", - ogs_plmn_id_mcc(&amf_ue->nr_tai.plmn_id), - ogs_plmn_id_mnc(&amf_ue->nr_tai.plmn_id)); - ogs_error(" S_NSSAI[SST:%d SD:0x%x]", - amf_ue->requested_nssai.s_nssai[i].sst, - amf_ue->requested_nssai.s_nssai[i].sd.v); - } OGS_FSM_TRAN(s, gmm_state_exception); break; } + if (!PCF_AM_POLICY_ASSOCIATED(amf_ue)) { + ogs_assert(true == + amf_ue_sbi_discover_and_send( + OpenAPI_nf_type_PCF, amf_ue, NULL, + amf_npcf_am_policy_control_build_create)); + OGS_FSM_TRAN(s, &gmm_state_initial_context_setup); + break; + } + CLEAR_AMF_UE_TIMER(amf_ue->t3550); ogs_assert(OGS_OK == nas_5gs_send_registration_accept(amf_ue)); @@ -436,6 +419,43 @@ static void common_register_state(ogs_fsm_t *s, amf_event_t *e) amf_timer_get_name(e->timer_id), e->timer_id); } break; + + case AMF_EVT_SBI_CLIENT: + sbi_response = e->sbi.response; + ogs_assert(sbi_response); + sbi_message = e->sbi.message; + ogs_assert(sbi_message); + + SWITCH(sbi_message->h.service.name) + CASE(OGS_SBI_SERVICE_NAME_NPCF_AM_POLICY_CONTROL) + SWITCH(sbi_message->h.resource.component[0]) + CASE(OGS_SBI_RESOURCE_NAME_POLICIES) + SWITCH(sbi_message->h.method) + CASE(OGS_SBI_HTTP_METHOD_DELETE) + ogs_assert(OGS_OK == + nas_5gs_send_de_registration_accept(amf_ue)); + + PCF_AM_POLICY_CLEAR(amf_ue); + break; + DEFAULT + ogs_error("Unknown method [%s]", sbi_message->h.method); + ogs_assert_if_reached(); + END + break; + + DEFAULT + ogs_error("Invalid resource name [%s]", + sbi_message->h.resource.component[0]); + ogs_assert_if_reached(); + END + break; + + DEFAULT + ogs_error("Invalid service name [%s]", sbi_message->h.service.name); + ogs_assert_if_reached(); + END + break; + default: ogs_error("Unknown event[%s]", amf_event_get_name(e)); } @@ -978,22 +998,45 @@ void gmm_state_initial_context_setup(ogs_fsm_t *s, amf_event_t *e) CASE(OGS_SBI_SERVICE_NAME_NPCF_AM_POLICY_CONTROL) SWITCH(sbi_message->h.resource.component[0]) CASE(OGS_SBI_RESOURCE_NAME_POLICIES) - rv = amf_npcf_am_policy_control_handle_create( - amf_ue, sbi_message); - if (rv != OGS_OK) { - ogs_error("[%s] amf_npcf_am_policy_control_handle_create() " - "failed", amf_ue->supi); - OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception); + SWITCH(sbi_message->h.method) + CASE(OGS_SBI_HTTP_METHOD_POST) + rv = amf_npcf_am_policy_control_handle_create( + amf_ue, sbi_message); + if (rv != OGS_OK) { + ogs_error("[%s] amf_npcf_am_policy_control" + "_handle_create() failed", amf_ue->supi); + OGS_FSM_TRAN(&amf_ue->sm, &gmm_state_exception); + break; + } + + ogs_assert(amf_ue->nas.message_type == + OGS_NAS_5GS_REGISTRATION_REQUEST); + CLEAR_AMF_UE_TIMER(amf_ue->t3550); + ogs_assert(OGS_OK == + nas_5gs_send_registration_accept(amf_ue)); + + /* In nsmf-handler.c + * + * 1. AMF_SESS_STORE_N2_TRANSFER + * 2. if PCF_AM_POLICY is NOT associated + * 3. AMF sends npcf-am-policy-control/create to PCF + * + * In gmm-sm.c + * 4. Send Registration Accept + * 5. We should clear N2 transfer + * (PDUSessionResourceSetupRequest) + */ + AMF_UE_CLEAR_N2_TRANSFER( + amf_ue, pdu_session_resource_setup_request); + + if (!amf_ue->next.m_tmsi) + OGS_FSM_TRAN(s, &gmm_state_registered); break; - } - ogs_assert(amf_ue->nas.message_type == - OGS_NAS_5GS_REGISTRATION_REQUEST); - CLEAR_AMF_UE_TIMER(amf_ue->t3550); - ogs_assert(OGS_OK == nas_5gs_send_registration_accept(amf_ue)); - - if (!amf_ue->next.m_tmsi) - OGS_FSM_TRAN(s, &gmm_state_registered); + DEFAULT + ogs_error("Unknown method [%s]", sbi_message->h.method); + ogs_assert_if_reached(); + END break; DEFAULT @@ -1245,39 +1288,17 @@ void gmm_state_exception(ogs_fsm_t *s, amf_event_t *e) if (amf_sess_xact_count(amf_ue) == xact_count) { - amf_update_allowed_nssai(amf_ue); - - if (!amf_ue->allowed_nssai.num_of_s_nssai) { - int i; - + if (amf_update_allowed_nssai(amf_ue) == false) { ogs_error("No Allowed-NSSAI"); - ogs_error(" Number of Subscribed S-NSSAI [%d]", - amf_ue->num_of_slice); - for (i = 0; i < amf_ue->num_of_slice; i++) { - ogs_slice_data_t *slice = &amf_ue->slice[i]; - if (slice->default_indicator == true) { - ogs_error( - " Default S_NSSAI[SST:%d SD:0x%x]", - slice->s_nssai.sst, slice->s_nssai.sd.v); - } else { - ogs_error( - " S_NSSAI[SST:%d SD:0x%x]", - slice->s_nssai.sst, slice->s_nssai.sd.v); - } - } - ogs_error(" Number of Requested NSSAI [%d]", - amf_ue->requested_nssai.num_of_s_nssai); - for (i = 0; i < amf_ue->requested_nssai. - num_of_s_nssai; i++) { - ogs_error(" PLMN_ID[MCC:%d MNC:%d]", - ogs_plmn_id_mcc(&amf_ue->nr_tai.plmn_id), - ogs_plmn_id_mnc(&amf_ue->nr_tai.plmn_id)); - ogs_error(" S_NSSAI[SST:%d SD:0x%x]", - amf_ue->requested_nssai.s_nssai[i].sst, - amf_ue->requested_nssai.s_nssai[i].sd.v); - } + break; + } - OGS_FSM_TRAN(s, gmm_state_exception); + if (!PCF_AM_POLICY_ASSOCIATED(amf_ue)) { + ogs_assert(true == + amf_ue_sbi_discover_and_send( + OpenAPI_nf_type_PCF, amf_ue, NULL, + amf_npcf_am_policy_control_build_create)); + OGS_FSM_TRAN(s, &gmm_state_initial_context_setup); break; } diff --git a/src/amf/npcf-build.c b/src/amf/npcf-build.c index 96de0f03c..d57ddbc05 100644 --- a/src/amf/npcf-build.c +++ b/src/amf/npcf-build.c @@ -179,3 +179,27 @@ ogs_sbi_request_t *amf_npcf_am_policy_control_build_create( return request; } + +ogs_sbi_request_t *amf_npcf_am_policy_control_build_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->policy_association_id); + + memset(&message, 0, sizeof(message)); + message.h.method = (char *)OGS_SBI_HTTP_METHOD_DELETE; + message.h.service.name = + (char *)OGS_SBI_SERVICE_NAME_NPCF_AM_POLICY_CONTROL; + message.h.api.version = (char *)OGS_SBI_API_V1; + message.h.resource.component[0] = (char *)OGS_SBI_RESOURCE_NAME_POLICIES; + message.h.resource.component[1] = amf_ue->policy_association_id; + + request = ogs_sbi_build_request(&message); + ogs_expect(request); + + return request; +} diff --git a/src/amf/npcf-build.h b/src/amf/npcf-build.h index fdc278743..dbfd8d23f 100644 --- a/src/amf/npcf-build.h +++ b/src/amf/npcf-build.h @@ -28,6 +28,8 @@ extern "C" { ogs_sbi_request_t *amf_npcf_am_policy_control_build_create( amf_ue_t *amf_ue, void *data); +ogs_sbi_request_t *amf_npcf_am_policy_control_build_delete( + amf_ue_t *amf_ue, void *data); #ifdef __cplusplus } diff --git a/src/amf/npcf-handler.c b/src/amf/npcf-handler.c index da633ec13..f3f30df1c 100644 --- a/src/amf/npcf-handler.c +++ b/src/amf/npcf-handler.c @@ -96,10 +96,7 @@ int amf_npcf_am_policy_control_handle_create( supported_features = ogs_uint64_from_string(PolicyAssociation->supp_feat); amf_ue->am_policy_control_features &= supported_features; - if (amf_ue->policy_association_id) - ogs_free(amf_ue->policy_association_id); - amf_ue->policy_association_id = ogs_strdup(message.h.resource.component[1]); - ogs_assert(amf_ue->policy_association_id); + PCF_AM_POLICY_STORE(amf_ue, message.h.resource.component[1]); OpenAPI_list_for_each(PolicyAssociation->triggers, node) { if (node->data) { diff --git a/src/amf/nsmf-handler.c b/src/amf/nsmf-handler.c index 9d4632f80..45c1b087c 100644 --- a/src/amf/nsmf-handler.c +++ b/src/amf/nsmf-handler.c @@ -216,12 +216,19 @@ int amf_nsmf_pdusession_handle_update_sm_context( SESSION_SYNC_DONE(amf_ue, AMF_UPDATE_SM_CONTEXT_REGISTRATION_REQUEST)) { - CLEAR_AMF_UE_TIMER(amf_ue->t3550); - ogs_assert(OGS_OK == - nas_5gs_send_registration_accept(amf_ue)); + if (!PCF_AM_POLICY_ASSOCIATED(amf_ue)) { + ogs_assert(true == + amf_ue_sbi_discover_and_send( + OpenAPI_nf_type_PCF, amf_ue, NULL, + amf_npcf_am_policy_control_build_create)); + } else { + CLEAR_AMF_UE_TIMER(amf_ue->t3550); + ogs_assert(OGS_OK == + nas_5gs_send_registration_accept(amf_ue)); - AMF_UE_CLEAR_N2_TRANSFER( - amf_ue, pdu_session_resource_setup_request); + AMF_UE_CLEAR_N2_TRANSFER( + amf_ue, pdu_session_resource_setup_request); + } } } else if (state == AMF_UPDATE_SM_CONTEXT_SERVICE_REQUEST) { AMF_SESS_STORE_N2_TRANSFER( @@ -767,11 +774,19 @@ int amf_nsmf_pdusession_handle_release_sm_context(amf_sess_t *sess, int state) if (SESSION_SYNC_DONE( amf_ue, AMF_RELEASE_SM_CONTEXT_REGISTRATION_ACCEPT) && SESSION_SYNC_DONE( - amf_ue, AMF_UPDATE_SM_CONTEXT_REGISTRATION_REQUEST)) + amf_ue, AMF_UPDATE_SM_CONTEXT_REGISTRATION_REQUEST)) { - CLEAR_AMF_UE_TIMER(amf_ue->t3550); - ogs_assert(OGS_OK == - nas_5gs_send_registration_accept(amf_ue)); + if (!PCF_AM_POLICY_ASSOCIATED(amf_ue)) { + ogs_assert(true == + amf_ue_sbi_discover_and_send( + OpenAPI_nf_type_PCF, amf_ue, NULL, + amf_npcf_am_policy_control_build_create)); + } else { + CLEAR_AMF_UE_TIMER(amf_ue->t3550); + ogs_assert(OGS_OK == + nas_5gs_send_registration_accept(amf_ue)); + } + } } else if (state == AMF_RELEASE_SM_CONTEXT_SERVICE_ACCEPT) { /* @@ -833,8 +848,10 @@ int amf_nsmf_pdusession_handle_release_sm_context(amf_sess_t *sess, int state) * 7. UEContextReleaseComplete */ - ogs_assert(OGS_OK == - nas_5gs_send_de_registration_accept(amf_ue)); + ogs_assert(true == + amf_ue_sbi_discover_and_send( + OpenAPI_nf_type_PCF, amf_ue, + NULL, amf_npcf_am_policy_control_build_delete)); } else if (OGS_FSM_CHECK(&amf_ue->sm, gmm_state_registered)) { /* diff --git a/src/amf/nudm-handler.c b/src/amf/nudm-handler.c index c2df38601..6958bbdf9 100644 --- a/src/amf/nudm-handler.c +++ b/src/amf/nudm-handler.c @@ -134,32 +134,8 @@ int amf_nudm_sdm_handle_provisioned( } } - amf_update_allowed_nssai(amf_ue); - - if (!amf_ue->allowed_nssai.num_of_s_nssai) { + if (amf_update_allowed_nssai(amf_ue) == false) { ogs_error("No Allowed-NSSAI"); - ogs_error(" Number of Subscribed S-NSSAI [%d]", - amf_ue->num_of_slice); - for (i = 0; i < amf_ue->num_of_slice; i++) { - ogs_slice_data_t *slice = &amf_ue->slice[i]; - if (slice->default_indicator == true) { - ogs_error(" Default S_NSSAI[SST:%d SD:0x%x]", - slice->s_nssai.sst, slice->s_nssai.sd.v); - } else { - ogs_error(" S_NSSAI[SST:%d SD:0x%x]", - slice->s_nssai.sst, slice->s_nssai.sd.v); - } - } - ogs_error(" Number of Requested NSSAI [%d]", - amf_ue->requested_nssai.num_of_s_nssai); - for (i = 0; i < amf_ue->requested_nssai.num_of_s_nssai; i++) { - ogs_error(" PLMN_ID[MCC:%d MNC:%d]", - ogs_plmn_id_mcc(&amf_ue->nr_tai.plmn_id), - ogs_plmn_id_mnc(&amf_ue->nr_tai.plmn_id)); - ogs_error(" S_NSSAI[SST:%d SD:0x%x]", - amf_ue->requested_nssai.s_nssai[i].sst, - amf_ue->requested_nssai.s_nssai[i].sd.v); - } return OGS_ERROR; } diff --git a/src/pcf/am-sm.c b/src/pcf/am-sm.c index c1d29ef0f..7197a6bec 100644 --- a/src/pcf/am-sm.c +++ b/src/pcf/am-sm.c @@ -73,6 +73,11 @@ void pcf_am_state_operational(ogs_fsm_t *s, pcf_event_t *e) } break; + CASE(OGS_SBI_HTTP_METHOD_DELETE) + ogs_assert(true == ogs_sbi_send_http_status_no_content(stream)); + OGS_FSM_TRAN(s, pcf_am_state_deleted); + break; + DEFAULT ogs_error("[%s] Invalid HTTP method [%s]", pcf_ue->supi, message->h.method); @@ -145,6 +150,30 @@ void pcf_am_state_operational(ogs_fsm_t *s, pcf_event_t *e) } } +void pcf_am_state_deleted(ogs_fsm_t *s, pcf_event_t *e) +{ + pcf_ue_t *pcf_ue = NULL; + ogs_assert(s); + ogs_assert(e); + + pcf_sm_debug(e); + + pcf_ue = e->pcf_ue; + ogs_assert(pcf_ue); + + switch (e->id) { + case OGS_FSM_ENTRY_SIG: + break; + + case OGS_FSM_EXIT_SIG: + break; + + default: + ogs_error("[%s] Unknown event %s", pcf_ue->supi, pcf_event_get_name(e)); + break; + } +} + void pcf_am_state_exception(ogs_fsm_t *s, pcf_event_t *e) { pcf_ue_t *pcf_ue = NULL; diff --git a/src/pcf/pcf-sm.c b/src/pcf/pcf-sm.c index 7ce9e4bf1..a815b8f79 100644 --- a/src/pcf/pcf-sm.c +++ b/src/pcf/pcf-sm.c @@ -137,7 +137,14 @@ void pcf_state_operational(ogs_fsm_t *s, pcf_event_t *e) } } break; - + CASE(OGS_SBI_HTTP_METHOD_DELETE) + if (message.h.resource.component[1]) { + pcf_ue = pcf_ue_find_by_association_id( + message.h.resource.component[1]); + } else { + ogs_error("No Policy Association Id"); + } + break; DEFAULT END @@ -158,6 +165,9 @@ void pcf_state_operational(ogs_fsm_t *s, pcf_event_t *e) if (OGS_FSM_CHECK(&pcf_ue->sm, pcf_am_state_exception)) { ogs_error("[%s] State machine exception", pcf_ue->supi); pcf_ue_remove(pcf_ue); + } else if (OGS_FSM_CHECK(&pcf_ue->sm, pcf_am_state_deleted)) { + ogs_debug("[%s] PCF-AM removed", pcf_ue->supi); + pcf_ue_remove(pcf_ue); } break; diff --git a/src/pcf/pcf-sm.h b/src/pcf/pcf-sm.h index 9de1431b5..c281c0fd6 100644 --- a/src/pcf/pcf-sm.h +++ b/src/pcf/pcf-sm.h @@ -43,6 +43,7 @@ void pcf_nf_state_exception(ogs_fsm_t *s, pcf_event_t *e); void pcf_am_state_initial(ogs_fsm_t *s, pcf_event_t *e); void pcf_am_state_final(ogs_fsm_t *s, pcf_event_t *e); void pcf_am_state_operational(ogs_fsm_t *s, pcf_event_t *e); +void pcf_am_state_deleted(ogs_fsm_t *s, pcf_event_t *e); void pcf_am_state_exception(ogs_fsm_t *s, pcf_event_t *e); void pcf_sm_state_initial(ogs_fsm_t *s, pcf_event_t *e);