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);