[AMF] Network Deregister (#2056, #2014, #2021)

Fixed a crash on explicit network-initiated deregister
with SUBSCRIPTION_WITHDRAWN
This commit is contained in:
Sukchan Lee 2023-02-10 23:09:39 +09:00
parent 474b2d4134
commit 888e58a94e
4 changed files with 280 additions and 161 deletions

View File

@ -1252,29 +1252,41 @@ static int parse_json(ogs_sbi_message_t *message,
SWITCH(message->h.resource.component[0])
CASE(OGS_SBI_RESOURCE_NAME_NF_INSTANCES)
message->NFProfile =
OpenAPI_nf_profile_parseFromJSON(item);
if (!message->NFProfile) {
rv = OGS_ERROR;
ogs_error("JSON parse error");
if (message->res_status < 300) {
message->NFProfile =
OpenAPI_nf_profile_parseFromJSON(item);
if (!message->NFProfile) {
rv = OGS_ERROR;
ogs_error("JSON parse error");
}
} else {
ogs_error("HTTP ERROR Status : %d", message->res_status);
}
break;
CASE(OGS_SBI_RESOURCE_NAME_SUBSCRIPTIONS)
message->SubscriptionData =
OpenAPI_subscription_data_parseFromJSON(item);
if (!message->SubscriptionData) {
rv = OGS_ERROR;
ogs_error("JSON parse error");
if (message->res_status < 300) {
message->SubscriptionData =
OpenAPI_subscription_data_parseFromJSON(item);
if (!message->SubscriptionData) {
rv = OGS_ERROR;
ogs_error("JSON parse error");
}
} else {
ogs_error("HTTP ERROR Status : %d", message->res_status);
}
break;
CASE(OGS_SBI_RESOURCE_NAME_NF_STATUS_NOTIFY)
message->NotificationData =
OpenAPI_notification_data_parseFromJSON(item);
if (!message->NotificationData) {
rv = OGS_ERROR;
ogs_error("JSON parse error");
if (message->res_status < 300) {
message->NotificationData =
OpenAPI_notification_data_parseFromJSON(item);
if (!message->NotificationData) {
rv = OGS_ERROR;
ogs_error("JSON parse error");
}
} else {
ogs_error("HTTP ERROR Status : %d", message->res_status);
}
break;
@ -1288,11 +1300,15 @@ static int parse_json(ogs_sbi_message_t *message,
CASE(OGS_SBI_SERVICE_NAME_NNRF_DISC)
SWITCH(message->h.resource.component[0])
CASE(OGS_SBI_RESOURCE_NAME_NF_INSTANCES)
message->SearchResult =
OpenAPI_search_result_parseFromJSON(item);
if (!message->SearchResult) {
rv = OGS_ERROR;
ogs_error("JSON parse error");
if (message->res_status < 300) {
message->SearchResult =
OpenAPI_search_result_parseFromJSON(item);
if (!message->SearchResult) {
rv = OGS_ERROR;
ogs_error("JSON parse error");
}
} else {
ogs_error("HTTP ERROR Status : %d", message->res_status);
}
break;
@ -1389,10 +1405,14 @@ static int parse_json(ogs_sbi_message_t *message,
break;
CASE(OGS_SBI_RESOURCE_NAME_AUTH_EVENTS)
message->AuthEvent = OpenAPI_auth_event_parseFromJSON(item);
if (!message->AuthEvent) {
rv = OGS_ERROR;
ogs_error("JSON parse error");
if (message->res_status < 300) {
message->AuthEvent = OpenAPI_auth_event_parseFromJSON(item);
if (!message->AuthEvent) {
rv = OGS_ERROR;
ogs_error("JSON parse error");
}
} else {
ogs_error("HTTP ERROR Status : %d", message->res_status);
}
break;
@ -1410,7 +1430,8 @@ static int parse_json(ogs_sbi_message_t *message,
CASE(OGS_SBI_RESOURCE_NAME_AMF_3GPP_ACCESS)
SWITCH(message->h.method)
CASE(OGS_SBI_HTTP_METHOD_PUT)
CASE(OGS_SBI_HTTP_METHOD_PUT)
if (message->res_status < 300) {
message->Amf3GppAccessRegistration =
OpenAPI_amf3_gpp_access_registration_parseFromJSON(
item);
@ -1418,8 +1439,13 @@ static int parse_json(ogs_sbi_message_t *message,
rv = OGS_ERROR;
ogs_error("JSON parse error");
}
break;
CASE(OGS_SBI_HTTP_METHOD_PATCH)
} else {
ogs_error("HTTP ERROR Status : %d",
message->res_status);
}
break;
CASE(OGS_SBI_HTTP_METHOD_PATCH)
if (message->res_status < 300) {
message->Amf3GppAccessRegistrationModification =
OpenAPI_amf3_gpp_access_registration_modification_parseFromJSON(
item);
@ -1427,11 +1453,15 @@ static int parse_json(ogs_sbi_message_t *message,
rv = OGS_ERROR;
ogs_error("JSON parse error");
}
break;
DEFAULT
rv = OGS_ERROR;
ogs_error("Unknown method [%s]", message->h.method);
END
} else {
ogs_error("HTTP ERROR Status : %d",
message->res_status);
}
break;
DEFAULT
rv = OGS_ERROR;
ogs_error("Unknown method [%s]", message->h.method);
END
break;
DEFAULT
rv = OGS_ERROR;
@ -1450,57 +1480,80 @@ static int parse_json(ogs_sbi_message_t *message,
CASE(OGS_SBI_SERVICE_NAME_NUDM_SDM)
SWITCH(message->h.resource.component[1])
CASE(OGS_SBI_RESOURCE_NAME_AM_DATA)
message->AccessAndMobilitySubscriptionData =
OpenAPI_access_and_mobility_subscription_data_parseFromJSON(
item);
if (!message->AccessAndMobilitySubscriptionData) {
rv = OGS_ERROR;
ogs_error("JSON parse error");
if (message->res_status < 300) {
message->AccessAndMobilitySubscriptionData =
OpenAPI_access_and_mobility_subscription_data_parseFromJSON(
item);
if (!message->AccessAndMobilitySubscriptionData) {
rv = OGS_ERROR;
ogs_error("JSON parse error");
}
} else {
ogs_error("HTTP ERROR Status : %d", message->res_status);
}
break;
CASE(OGS_SBI_RESOURCE_NAME_SMF_SELECT_DATA)
message->SmfSelectionSubscriptionData =
OpenAPI_smf_selection_subscription_data_parseFromJSON(item);
if (!message->SmfSelectionSubscriptionData) {
rv = OGS_ERROR;
ogs_error("JSON parse error");
if (message->res_status < 300) {
message->SmfSelectionSubscriptionData =
OpenAPI_smf_selection_subscription_data_parseFromJSON(
item);
if (!message->SmfSelectionSubscriptionData) {
rv = OGS_ERROR;
ogs_error("JSON parse error");
}
} else {
ogs_error("HTTP ERROR Status : %d", message->res_status);
}
break;
CASE(OGS_SBI_RESOURCE_NAME_UE_CONTEXT_IN_SMF_DATA)
message->UeContextInSmfData =
OpenAPI_ue_context_in_smf_data_parseFromJSON(item);
if (!message->UeContextInSmfData) {
rv = OGS_ERROR;
ogs_error("JSON parse error");
if (message->res_status < 300) {
message->UeContextInSmfData =
OpenAPI_ue_context_in_smf_data_parseFromJSON(item);
if (!message->UeContextInSmfData) {
rv = OGS_ERROR;
ogs_error("JSON parse error");
}
} else {
ogs_error("HTTP ERROR Status : %d", message->res_status);
}
break;
CASE(OGS_SBI_RESOURCE_NAME_SM_DATA)
if (item) {
OpenAPI_session_management_subscription_data_t *smsub_item = NULL;
cJSON *smsubJSON = NULL;
message->SessionManagementSubscriptionDataList = OpenAPI_list_create();
cJSON_ArrayForEach(smsubJSON, item) {
if (!cJSON_IsObject(smsubJSON)) {
rv = OGS_ERROR;
ogs_error("Unknown JSON");
goto cleanup;
}
if (message->res_status < 300) {
if (item) {
OpenAPI_session_management_subscription_data_t
*smsub_item = NULL;
cJSON *smsubJSON = NULL;
message->SessionManagementSubscriptionDataList =
OpenAPI_list_create();
cJSON_ArrayForEach(smsubJSON, item) {
if (!cJSON_IsObject(smsubJSON)) {
rv = OGS_ERROR;
ogs_error("Unknown JSON");
goto cleanup;
}
smsub_item = OpenAPI_session_management_subscription_data_parseFromJSON(smsubJSON);
OpenAPI_list_add(message->SessionManagementSubscriptionDataList, smsub_item);
smsub_item = OpenAPI_session_management_subscription_data_parseFromJSON(smsubJSON);
OpenAPI_list_add(message->SessionManagementSubscriptionDataList, smsub_item);
}
}
} else {
ogs_error("HTTP ERROR Status : %d", message->res_status);
}
break;
CASE(OGS_SBI_RESOURCE_NAME_SDM_SUBSCRIPTIONS)
message->SDMSubscription =
OpenAPI_sdm_subscription_parseFromJSON(item);
if (!message->SDMSubscription) {
rv = OGS_ERROR;
ogs_error("JSON parse error");
if (message->res_status < 300) {
message->SDMSubscription =
OpenAPI_sdm_subscription_parseFromJSON(item);
if (!message->SDMSubscription) {
rv = OGS_ERROR;
ogs_error("JSON parse error");
}
} else {
ogs_error("HTTP ERROR Status : %d", message->res_status);
}
break;
@ -1528,11 +1581,16 @@ static int parse_json(ogs_sbi_message_t *message,
}
break;
CASE(OGS_SBI_RESOURCE_NAME_AUTHENTICATION_STATUS)
message->AuthEvent =
OpenAPI_auth_event_parseFromJSON(item);
if (!message->AuthEvent) {
rv = OGS_ERROR;
ogs_error("JSON parse error");
if (message->res_status < 300) {
message->AuthEvent =
OpenAPI_auth_event_parseFromJSON(item);
if (!message->AuthEvent) {
rv = OGS_ERROR;
ogs_error("JSON parse error");
}
} else {
ogs_error("HTTP ERROR Status : %d",
message->res_status);
}
break;
DEFAULT
@ -1543,12 +1601,17 @@ static int parse_json(ogs_sbi_message_t *message,
break;
CASE(OGS_SBI_RESOURCE_NAME_CONTEXT_DATA)
message->Amf3GppAccessRegistration =
OpenAPI_amf3_gpp_access_registration_parseFromJSON(
item);
if (!message->Amf3GppAccessRegistration) {
rv = OGS_ERROR;
ogs_error("JSON parse error");
if (message->res_status < 300) {
message->Amf3GppAccessRegistration =
OpenAPI_amf3_gpp_access_registration_parseFromJSON(
item);
if (!message->Amf3GppAccessRegistration) {
rv = OGS_ERROR;
ogs_error("JSON parse error");
}
} else {
ogs_error("HTTP ERROR Status : %d",
message->res_status);
}
break;
@ -1557,48 +1620,69 @@ static int parse_json(ogs_sbi_message_t *message,
CASE(OGS_SBI_RESOURCE_NAME_PROVISIONED_DATA)
SWITCH(message->h.resource.component[4])
CASE(OGS_SBI_RESOURCE_NAME_AM_DATA)
message->AccessAndMobilitySubscriptionData =
OpenAPI_access_and_mobility_subscription_data_parseFromJSON(item);
if (!message->AccessAndMobilitySubscriptionData) {
rv = OGS_ERROR;
ogs_error("JSON parse error");
if (message->res_status < 300) {
message->AccessAndMobilitySubscriptionData =
OpenAPI_access_and_mobility_subscription_data_parseFromJSON(item);
if (!message->
AccessAndMobilitySubscriptionData) {
rv = OGS_ERROR;
ogs_error("JSON parse error");
}
} else {
ogs_error("HTTP ERROR Status : %d",
message->res_status);
}
break;
CASE(OGS_SBI_RESOURCE_NAME_SMF_SELECTION_SUBSCRIPTION_DATA)
message->SmfSelectionSubscriptionData =
OpenAPI_smf_selection_subscription_data_parseFromJSON(item);
if (!message->SmfSelectionSubscriptionData) {
rv = OGS_ERROR;
ogs_error("JSON parse error");
if (message->res_status < 300) {
message->SmfSelectionSubscriptionData =
OpenAPI_smf_selection_subscription_data_parseFromJSON(item);
if (!message->SmfSelectionSubscriptionData) {
rv = OGS_ERROR;
ogs_error("JSON parse error");
}
} else {
ogs_error("HTTP ERROR Status : %d",
message->res_status);
}
break;
CASE(OGS_SBI_RESOURCE_NAME_UE_CONTEXT_IN_SMF_DATA)
message->UeContextInSmfData =
OpenAPI_ue_context_in_smf_data_parseFromJSON(
item);
if (!message->UeContextInSmfData) {
rv = OGS_ERROR;
ogs_error("JSON parse error");
if (message->res_status < 300) {
message->UeContextInSmfData =
OpenAPI_ue_context_in_smf_data_parseFromJSON(
item);
if (!message->UeContextInSmfData) {
rv = OGS_ERROR;
ogs_error("JSON parse error");
}
} else {
ogs_error("HTTP ERROR Status : %d",
message->res_status);
}
break;
CASE(OGS_SBI_RESOURCE_NAME_SM_DATA)
if (item) {
OpenAPI_session_management_subscription_data_t *smsub_item = NULL;
cJSON *smsubJSON = NULL;
message->SessionManagementSubscriptionDataList = OpenAPI_list_create();
cJSON_ArrayForEach(smsubJSON, item) {
if (!cJSON_IsObject(smsubJSON)) {
rv = OGS_ERROR;
ogs_error("Unknown JSON");
goto cleanup;
}
if (message->res_status < 300) {
if (item) {
OpenAPI_session_management_subscription_data_t *smsub_item = NULL;
cJSON *smsubJSON = NULL;
message->SessionManagementSubscriptionDataList = OpenAPI_list_create();
cJSON_ArrayForEach(smsubJSON, item) {
if (!cJSON_IsObject(smsubJSON)) {
rv = OGS_ERROR;
ogs_error("Unknown JSON");
goto cleanup;
}
smsub_item = OpenAPI_session_management_subscription_data_parseFromJSON(smsubJSON);
OpenAPI_list_add(message->SessionManagementSubscriptionDataList, smsub_item);
smsub_item = OpenAPI_session_management_subscription_data_parseFromJSON(smsubJSON);
OpenAPI_list_add(message->SessionManagementSubscriptionDataList, smsub_item);
}
}
} else {
ogs_error("HTTP ERROR Status : %d",
message->res_status);
}
break;
@ -1622,22 +1706,30 @@ static int parse_json(ogs_sbi_message_t *message,
CASE(OGS_SBI_RESOURCE_NAME_UES)
SWITCH(message->h.resource.component[3])
CASE(OGS_SBI_RESOURCE_NAME_AM_DATA)
message->AmPolicyData =
OpenAPI_am_policy_data_parseFromJSON(item);
if (!message->AmPolicyData) {
rv = OGS_ERROR;
ogs_error("JSON parse error");
if (message->res_status < 300) {
message->AmPolicyData =
OpenAPI_am_policy_data_parseFromJSON(item);
if (!message->AmPolicyData) {
rv = OGS_ERROR;
ogs_error("JSON parse error");
}
} else {
ogs_error("HTTP ERROR Status : %d",
message->res_status);
}
break;
CASE(OGS_SBI_RESOURCE_NAME_SM_DATA)
message->SmPolicyData =
OpenAPI_sm_policy_data_parseFromJSON(item);
if (!message->SmPolicyData) {
rv = OGS_ERROR;
ogs_error("JSON parse error");
if (message->res_status < 300) {
message->SmPolicyData =
OpenAPI_sm_policy_data_parseFromJSON(item);
if (!message->SmPolicyData) {
rv = OGS_ERROR;
ogs_error("JSON parse error");
}
} else {
ogs_error("HTTP ERROR Status : %d",
message->res_status);
}
break;
@ -1988,11 +2080,16 @@ static int parse_json(ogs_sbi_message_t *message,
} else {
SWITCH(message->h.method)
CASE(OGS_SBI_HTTP_METHOD_PATCH)
message->AppSessionContextUpdateDataPatch =
OpenAPI_app_session_context_update_data_patch_parseFromJSON(item);
if (!message->AppSessionContextUpdateDataPatch) {
rv = OGS_ERROR;
ogs_error("JSON parse error");
if (message->res_status < 300) {
message->AppSessionContextUpdateDataPatch =
OpenAPI_app_session_context_update_data_patch_parseFromJSON(item);
if (!message->AppSessionContextUpdateDataPatch) {
rv = OGS_ERROR;
ogs_error("JSON parse error");
}
} else {
ogs_error("HTTP ERROR Status : %d",
message->res_status);
}
break;
DEFAULT
@ -2030,29 +2127,42 @@ static int parse_json(ogs_sbi_message_t *message,
CASE(OGS_SBI_SERVICE_NAME_NAMF_CALLBACK)
SWITCH(message->h.resource.component[1])
CASE(OGS_SBI_RESOURCE_NAME_SM_CONTEXT_STATUS)
message->SmContextStatusNotification =
OpenAPI_sm_context_status_notification_parseFromJSON(item);
if (!message->SmContextStatusNotification) {
rv = OGS_ERROR;
ogs_error("JSON parse error");
if (message->res_status < 300) {
message->SmContextStatusNotification =
OpenAPI_sm_context_status_notification_parseFromJSON(
item);
if (!message->SmContextStatusNotification) {
rv = OGS_ERROR;
ogs_error("JSON parse error");
}
} else {
ogs_error("HTTP ERROR Status : %d", message->res_status);
}
break;
CASE(OGS_SBI_RESOURCE_NAME_DEREG_NOTIFY)
message->DeregistrationData =
OpenAPI_deregistration_data_parseFromJSON(item);
if (!message->DeregistrationData) {
rv = OGS_ERROR;
ogs_error("JSON parse error");
if (message->res_status < 300) {
message->DeregistrationData =
OpenAPI_deregistration_data_parseFromJSON(item);
if (!message->DeregistrationData) {
rv = OGS_ERROR;
ogs_error("JSON parse error");
}
} else {
ogs_error("HTTP ERROR Status : %d", message->res_status);
}
break;
CASE(OGS_SBI_RESOURCE_NAME_SDMSUBSCRIPTION_NOTIFY)
message->ModificationNotification =
OpenAPI_modification_notification_parseFromJSON(item);
if (!message->ModificationNotification) {
rv = OGS_ERROR;
ogs_error("JSON parse error");
if (message->res_status < 300) {
message->ModificationNotification =
OpenAPI_modification_notification_parseFromJSON(item);
if (!message->ModificationNotification) {
rv = OGS_ERROR;
ogs_error("JSON parse error");
}
} else {
ogs_error("HTTP ERROR Status : %d", message->res_status);
}
break;
@ -2066,31 +2176,45 @@ static int parse_json(ogs_sbi_message_t *message,
CASE(OGS_SBI_SERVICE_NAME_NSMF_CALLBACK)
SWITCH(message->h.resource.component[0])
CASE(OGS_SBI_RESOURCE_NAME_N1_N2_FAILURE_NOTIFY)
message->N1N2MsgTxfrFailureNotification =
OpenAPI_n1_n2_msg_txfr_failure_notification_parseFromJSON(
item);
if (!message->N1N2MsgTxfrFailureNotification) {
rv = OGS_ERROR;
ogs_error("JSON parse error");
if (message->res_status < 300) {
message->N1N2MsgTxfrFailureNotification =
OpenAPI_n1_n2_msg_txfr_failure_notification_parseFromJSON(
item);
if (!message->N1N2MsgTxfrFailureNotification) {
rv = OGS_ERROR;
ogs_error("JSON parse error");
}
} else {
ogs_error("HTTP ERROR Status : %d", message->res_status);
}
break;
CASE(OGS_SBI_RESOURCE_NAME_SM_POLICY_NOTIFY)
SWITCH(message->h.resource.component[2])
CASE(OGS_SBI_RESOURCE_NAME_UPDATE)
message->SmPolicyNotification =
OpenAPI_sm_policy_notification_parseFromJSON(item);
if (!message->SmPolicyNotification) {
rv = OGS_ERROR;
ogs_error("JSON parse error");
if (message->res_status < 300) {
message->SmPolicyNotification =
OpenAPI_sm_policy_notification_parseFromJSON(item);
if (!message->SmPolicyNotification) {
rv = OGS_ERROR;
ogs_error("JSON parse error");
}
} else {
ogs_error("HTTP ERROR Status : %d",
message->res_status);
}
break;
CASE(OGS_SBI_RESOURCE_NAME_TERMINATE)
message->TerminationNotification =
OpenAPI_termination_notification_parseFromJSON(item);
if (!message->TerminationNotification) {
rv = OGS_ERROR;
ogs_error("JSON parse error");
if (message->res_status < 300) {
message->TerminationNotification =
OpenAPI_termination_notification_parseFromJSON(item);
if (!message->TerminationNotification) {
rv = OGS_ERROR;
ogs_error("JSON parse error");
}
} else {
ogs_error("HTTP ERROR Status : %d",
message->res_status);
}
break;

View File

@ -181,7 +181,6 @@ void gmm_state_de_registered(ogs_fsm_t *s, amf_event_t *e)
ogs_error("[%s] HTTP response error [%d]",
amf_ue->suci, sbi_message->res_status);
}
break;
}
SWITCH(sbi_message->h.method)
@ -222,7 +221,6 @@ void gmm_state_de_registered(ogs_fsm_t *s, amf_event_t *e)
(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])
@ -292,7 +290,6 @@ void gmm_state_de_registered(ogs_fsm_t *s, amf_event_t *e)
sbi_message->res_status != OGS_SBI_HTTP_STATUS_OK) {
ogs_error("[%s] HTTP response error [%d]",
amf_ue->supi, sbi_message->res_status);
break;
}
SWITCH(sbi_message->h.resource.component[1])
@ -663,7 +660,6 @@ void gmm_state_registered(ogs_fsm_t *s, amf_event_t *e)
ogs_error("[%s] HTTP response error [%d]",
amf_ue->suci, sbi_message->res_status);
}
break;
}
SWITCH(sbi_message->h.method)
@ -704,7 +700,6 @@ void gmm_state_registered(ogs_fsm_t *s, amf_event_t *e)
(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])
@ -780,7 +775,6 @@ void gmm_state_registered(ogs_fsm_t *s, amf_event_t *e)
sbi_message->res_status != OGS_SBI_HTTP_STATUS_OK) {
ogs_error("[%s] HTTP response error [%d]",
amf_ue->supi, sbi_message->res_status);
break;
}
SWITCH(sbi_message->h.resource.component[1])

View File

@ -927,7 +927,8 @@ int amf_namf_callback_handle_sdm_data_change_notify(
if (CM_CONNECTED(amf_ue)) {
r = nas_5gs_send_de_registration_request(
amf_ue,
OpenAPI_deregistration_reason_REREGISTRATION_REQUIRED, 0);
OpenAPI_deregistration_reason_REREGISTRATION_REQUIRED,
OGS_5GMM_CAUSE_5GS_SERVICES_NOT_ALLOWED);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);

View File

@ -421,10 +421,11 @@ bool udm_nudm_uecm_handle_registration_update(
ogs_assert(true ==
ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_FORBIDDEN,
message, "Guami mismatch", udm_ue->supi));
return false;
}
if (Amf3GppAccessRegistrationModification->is_purge_flag) {
ogs_assert(udm_ue->amf_3gpp_access_registration);
udm_ue->amf_3gpp_access_registration->is_purge_flag =
Amf3GppAccessRegistrationModification->is_purge_flag;
udm_ue->amf_3gpp_access_registration->purge_flag =
@ -434,7 +435,6 @@ bool udm_nudm_uecm_handle_registration_update(
PatchItemList = OpenAPI_list_create();
ogs_assert(PatchItemList);
if (Amf3GppAccessRegistrationModification->is_purge_flag) {
memset(&item, 0, sizeof(item));
item.op = OpenAPI_patch_operation_replace;