From 8efa364f899666e588435cf68e254685c7813d34 Mon Sep 17 00:00:00 2001 From: Bostjan Meglic <103102696+bmeglicit@users.noreply.github.com> Date: Fri, 20 May 2022 10:33:49 +0200 Subject: [PATCH] Change handling of SessionManagementSubscriptionData as an array (#1551) According to the following standards the response to the endpoint /nudm-sdm/${supi}/sm-data should be an array of SessionManagementSubscriptionData objects, instead of only one object. TS 29.503 version 16.6.0 TS 29.505 version 16.4.0 UDR now responds to the request with only item in the array. UDM copies all items as is. SMF uses only the first item in the array, even if there are more present. --- lib/sbi/message.c | 62 ++++++++++++++++++++++++++++++------------ lib/sbi/message.h | 3 +- src/smf/nudm-handler.c | 19 +++++++++++-- src/udm/nudr-handler.c | 25 +++++++++-------- src/udr/nudr-handler.c | 8 ++++-- 5 files changed, 83 insertions(+), 34 deletions(-) diff --git a/lib/sbi/message.c b/lib/sbi/message.c index 45aa3be38..306058af5 100644 --- a/lib/sbi/message.c +++ b/lib/sbi/message.c @@ -124,9 +124,12 @@ void ogs_sbi_message_free(ogs_sbi_message_t *message) OpenAPI_sm_context_release_data_free(message->SmContextReleaseData); if (message->SmContextReleasedData) OpenAPI_sm_context_released_data_free(message->SmContextReleasedData); - if (message->SessionManagementSubscriptionData) - OpenAPI_session_management_subscription_data_free( - message->SessionManagementSubscriptionData); + if (message->SessionManagementSubscriptionDataList) { + OpenAPI_lnode_t *node = NULL; + OpenAPI_list_for_each(message->SessionManagementSubscriptionDataList, node) + OpenAPI_session_management_subscription_data_free(node->data); + OpenAPI_list_free(message->SessionManagementSubscriptionDataList); + } if (message->N1N2MessageTransferReqData) OpenAPI_n1_n2_message_transfer_req_data_free( message->N1N2MessageTransferReqData); @@ -801,10 +804,18 @@ static char *build_json(ogs_sbi_message_t *message) item = OpenAPI_sm_context_released_data_convertToJSON( message->SmContextReleasedData); ogs_assert(item); - } else if (message->SessionManagementSubscriptionData) { - item = OpenAPI_session_management_subscription_data_convertToJSON( - message->SessionManagementSubscriptionData); + } else if (message->SessionManagementSubscriptionDataList) { + OpenAPI_lnode_t *node = NULL; + + item = cJSON_CreateArray(); ogs_assert(item); + + OpenAPI_list_for_each(message->SessionManagementSubscriptionDataList, node) { + cJSON *smSubDataItem = + OpenAPI_session_management_subscription_data_convertToJSON(node->data); + ogs_assert(smSubDataItem); + cJSON_AddItemToArray(item, smSubDataItem); + } } else if (message->N1N2MessageTransferReqData) { item = OpenAPI_n1_n2_message_transfer_req_data_convertToJSON( message->N1N2MessageTransferReqData); @@ -1140,12 +1151,20 @@ static int parse_json(ogs_sbi_message_t *message, break; CASE(OGS_SBI_RESOURCE_NAME_SM_DATA) - message->SessionManagementSubscriptionData = - OpenAPI_session_management_subscription_data_parseFromJSON( - item); - if (!message->SessionManagementSubscriptionData) { - rv = OGS_ERROR; - ogs_error("JSON parse error"); + 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); + } } break; @@ -1230,11 +1249,20 @@ static int parse_json(ogs_sbi_message_t *message, break; CASE(OGS_SBI_RESOURCE_NAME_SM_DATA) - message->SessionManagementSubscriptionData = - OpenAPI_session_management_subscription_data_parseFromJSON(item); - if (!message->SessionManagementSubscriptionData) { - rv = OGS_ERROR; - ogs_error("JSON parse error"); + 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); + } } break; diff --git a/lib/sbi/message.h b/lib/sbi/message.h index ce86784e8..e3b3f0c9e 100644 --- a/lib/sbi/message.h +++ b/lib/sbi/message.h @@ -385,8 +385,7 @@ typedef struct ogs_sbi_message_s { OpenAPI_sm_context_update_error_t *SmContextUpdateError; OpenAPI_sm_context_release_data_t *SmContextReleaseData; OpenAPI_sm_context_released_data_t *SmContextReleasedData; - OpenAPI_session_management_subscription_data_t * - SessionManagementSubscriptionData; + OpenAPI_list_t *SessionManagementSubscriptionDataList; OpenAPI_n1_n2_message_transfer_req_data_t *N1N2MessageTransferReqData; OpenAPI_n1_n2_message_transfer_rsp_data_t *N1N2MessageTransferRspData; OpenAPI_n1_n2_msg_txfr_failure_notification_t diff --git a/src/smf/nudm-handler.c b/src/smf/nudm-handler.c index 6d3e1578e..9741e5b67 100644 --- a/src/smf/nudm-handler.c +++ b/src/smf/nudm-handler.c @@ -56,8 +56,23 @@ bool smf_nudm_sdm_handle_get(smf_sess_t *sess, ogs_sbi_stream_t *stream, ogs_assert(recvmsg); - SessionManagementSubscriptionData = - recvmsg->SessionManagementSubscriptionData; + + if ((!recvmsg->SessionManagementSubscriptionDataList) || + (recvmsg->SessionManagementSubscriptionDataList->count == 0)) + { + strerror = ogs_msprintf("[%s:%d] No SessionManagementSubscriptionDataList", + smf_ue->supi, sess->psi); + goto cleanup; + } + + OpenAPI_list_for_each(recvmsg->SessionManagementSubscriptionDataList, node) + { + SessionManagementSubscriptionData = node->data; + + /* currently supported to parse only first element of the array */ + break; + } + if (!SessionManagementSubscriptionData) { strerror = ogs_msprintf("[%s:%d] No SessionManagementSubscriptionData", smf_ue->supi, sess->psi); diff --git a/src/udm/nudr-handler.c b/src/udm/nudr-handler.c index d71e30795..a7c9ea57b 100644 --- a/src/udm/nudr-handler.c +++ b/src/udm/nudr-handler.c @@ -627,12 +627,10 @@ bool udm_nudr_dr_handle_subscription_provisioned( break; CASE(OGS_SBI_RESOURCE_NAME_SM_DATA) - OpenAPI_session_management_subscription_data_t * - SessionManagementSubscriptionData = NULL; + OpenAPI_lnode_t *node; - SessionManagementSubscriptionData = - recvmsg->SessionManagementSubscriptionData; - if (!SessionManagementSubscriptionData) { + if ((!recvmsg->SessionManagementSubscriptionDataList) || + (recvmsg->SessionManagementSubscriptionDataList->count == 0)) { ogs_error("[%s] No SessionManagementSubscriptionData", udm_ue->supi); ogs_assert(true == @@ -644,18 +642,23 @@ bool udm_nudr_dr_handle_subscription_provisioned( } memset(&sendmsg, 0, sizeof(sendmsg)); + sendmsg.SessionManagementSubscriptionDataList = OpenAPI_list_create(); - sendmsg.SessionManagementSubscriptionData = - OpenAPI_session_management_subscription_data_copy( - sendmsg.SessionManagementSubscriptionData, - recvmsg->SessionManagementSubscriptionData); + OpenAPI_list_for_each(recvmsg->SessionManagementSubscriptionDataList, node) + { + OpenAPI_session_management_subscription_data_t *item = NULL; + + item = OpenAPI_session_management_subscription_data_copy(item, node->data); + OpenAPI_list_add(sendmsg.SessionManagementSubscriptionDataList, item); + } response = ogs_sbi_build_response(&sendmsg, recvmsg->res_status); ogs_assert(response); ogs_assert(true == ogs_sbi_server_send_response(stream, response)); - OpenAPI_session_management_subscription_data_free( - sendmsg.SessionManagementSubscriptionData); + OpenAPI_list_for_each(sendmsg.SessionManagementSubscriptionDataList, node) + OpenAPI_session_management_subscription_data_free(node->data); + OpenAPI_list_free(sendmsg.SessionManagementSubscriptionDataList); break; diff --git a/src/udr/nudr-handler.c b/src/udr/nudr-handler.c index 3eb582cc1..fe8be5f4e 100644 --- a/src/udr/nudr-handler.c +++ b/src/udr/nudr-handler.c @@ -793,8 +793,12 @@ bool udr_nudr_dr_handle_subscription_provisioned( dnnConfigurationList; memset(&sendmsg, 0, sizeof(sendmsg)); - sendmsg.SessionManagementSubscriptionData = - &SessionManagementSubscriptionData; + + sendmsg.SessionManagementSubscriptionDataList = OpenAPI_list_create(); + ogs_assert(sendmsg.SessionManagementSubscriptionDataList); + + OpenAPI_list_add(sendmsg.SessionManagementSubscriptionDataList, + &SessionManagementSubscriptionData); response = ogs_sbi_build_response(&sendmsg, OGS_SBI_HTTP_STATUS_OK); ogs_assert(response);