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.
This commit is contained in:
Bostjan Meglic 2022-05-20 10:33:49 +02:00 committed by GitHub
parent 43a7259781
commit 8efa364f89
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 83 additions and 34 deletions

View File

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

View File

@ -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

View File

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

View File

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

View File

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