forked from acouzens/open5gs
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:
parent
43a7259781
commit
8efa364f89
|
@ -124,9 +124,12 @@ void ogs_sbi_message_free(ogs_sbi_message_t *message)
|
||||||
OpenAPI_sm_context_release_data_free(message->SmContextReleaseData);
|
OpenAPI_sm_context_release_data_free(message->SmContextReleaseData);
|
||||||
if (message->SmContextReleasedData)
|
if (message->SmContextReleasedData)
|
||||||
OpenAPI_sm_context_released_data_free(message->SmContextReleasedData);
|
OpenAPI_sm_context_released_data_free(message->SmContextReleasedData);
|
||||||
if (message->SessionManagementSubscriptionData)
|
if (message->SessionManagementSubscriptionDataList) {
|
||||||
OpenAPI_session_management_subscription_data_free(
|
OpenAPI_lnode_t *node = NULL;
|
||||||
message->SessionManagementSubscriptionData);
|
OpenAPI_list_for_each(message->SessionManagementSubscriptionDataList, node)
|
||||||
|
OpenAPI_session_management_subscription_data_free(node->data);
|
||||||
|
OpenAPI_list_free(message->SessionManagementSubscriptionDataList);
|
||||||
|
}
|
||||||
if (message->N1N2MessageTransferReqData)
|
if (message->N1N2MessageTransferReqData)
|
||||||
OpenAPI_n1_n2_message_transfer_req_data_free(
|
OpenAPI_n1_n2_message_transfer_req_data_free(
|
||||||
message->N1N2MessageTransferReqData);
|
message->N1N2MessageTransferReqData);
|
||||||
|
@ -801,10 +804,18 @@ static char *build_json(ogs_sbi_message_t *message)
|
||||||
item = OpenAPI_sm_context_released_data_convertToJSON(
|
item = OpenAPI_sm_context_released_data_convertToJSON(
|
||||||
message->SmContextReleasedData);
|
message->SmContextReleasedData);
|
||||||
ogs_assert(item);
|
ogs_assert(item);
|
||||||
} else if (message->SessionManagementSubscriptionData) {
|
} else if (message->SessionManagementSubscriptionDataList) {
|
||||||
item = OpenAPI_session_management_subscription_data_convertToJSON(
|
OpenAPI_lnode_t *node = NULL;
|
||||||
message->SessionManagementSubscriptionData);
|
|
||||||
|
item = cJSON_CreateArray();
|
||||||
ogs_assert(item);
|
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) {
|
} else if (message->N1N2MessageTransferReqData) {
|
||||||
item = OpenAPI_n1_n2_message_transfer_req_data_convertToJSON(
|
item = OpenAPI_n1_n2_message_transfer_req_data_convertToJSON(
|
||||||
message->N1N2MessageTransferReqData);
|
message->N1N2MessageTransferReqData);
|
||||||
|
@ -1140,12 +1151,20 @@ static int parse_json(ogs_sbi_message_t *message,
|
||||||
break;
|
break;
|
||||||
|
|
||||||
CASE(OGS_SBI_RESOURCE_NAME_SM_DATA)
|
CASE(OGS_SBI_RESOURCE_NAME_SM_DATA)
|
||||||
message->SessionManagementSubscriptionData =
|
if (item) {
|
||||||
OpenAPI_session_management_subscription_data_parseFromJSON(
|
OpenAPI_session_management_subscription_data_t *smsub_item = NULL;
|
||||||
item);
|
cJSON *smsubJSON = NULL;
|
||||||
if (!message->SessionManagementSubscriptionData) {
|
message->SessionManagementSubscriptionDataList = OpenAPI_list_create();
|
||||||
rv = OGS_ERROR;
|
cJSON_ArrayForEach(smsubJSON, item) {
|
||||||
ogs_error("JSON parse error");
|
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;
|
break;
|
||||||
|
|
||||||
|
@ -1230,11 +1249,20 @@ static int parse_json(ogs_sbi_message_t *message,
|
||||||
break;
|
break;
|
||||||
|
|
||||||
CASE(OGS_SBI_RESOURCE_NAME_SM_DATA)
|
CASE(OGS_SBI_RESOURCE_NAME_SM_DATA)
|
||||||
message->SessionManagementSubscriptionData =
|
if (item) {
|
||||||
OpenAPI_session_management_subscription_data_parseFromJSON(item);
|
OpenAPI_session_management_subscription_data_t *smsub_item = NULL;
|
||||||
if (!message->SessionManagementSubscriptionData) {
|
cJSON *smsubJSON = NULL;
|
||||||
rv = OGS_ERROR;
|
message->SessionManagementSubscriptionDataList = OpenAPI_list_create();
|
||||||
ogs_error("JSON parse error");
|
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;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -385,8 +385,7 @@ typedef struct ogs_sbi_message_s {
|
||||||
OpenAPI_sm_context_update_error_t *SmContextUpdateError;
|
OpenAPI_sm_context_update_error_t *SmContextUpdateError;
|
||||||
OpenAPI_sm_context_release_data_t *SmContextReleaseData;
|
OpenAPI_sm_context_release_data_t *SmContextReleaseData;
|
||||||
OpenAPI_sm_context_released_data_t *SmContextReleasedData;
|
OpenAPI_sm_context_released_data_t *SmContextReleasedData;
|
||||||
OpenAPI_session_management_subscription_data_t *
|
OpenAPI_list_t *SessionManagementSubscriptionDataList;
|
||||||
SessionManagementSubscriptionData;
|
|
||||||
OpenAPI_n1_n2_message_transfer_req_data_t *N1N2MessageTransferReqData;
|
OpenAPI_n1_n2_message_transfer_req_data_t *N1N2MessageTransferReqData;
|
||||||
OpenAPI_n1_n2_message_transfer_rsp_data_t *N1N2MessageTransferRspData;
|
OpenAPI_n1_n2_message_transfer_rsp_data_t *N1N2MessageTransferRspData;
|
||||||
OpenAPI_n1_n2_msg_txfr_failure_notification_t
|
OpenAPI_n1_n2_msg_txfr_failure_notification_t
|
||||||
|
|
|
@ -56,8 +56,23 @@ bool smf_nudm_sdm_handle_get(smf_sess_t *sess, ogs_sbi_stream_t *stream,
|
||||||
|
|
||||||
ogs_assert(recvmsg);
|
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) {
|
if (!SessionManagementSubscriptionData) {
|
||||||
strerror = ogs_msprintf("[%s:%d] No SessionManagementSubscriptionData",
|
strerror = ogs_msprintf("[%s:%d] No SessionManagementSubscriptionData",
|
||||||
smf_ue->supi, sess->psi);
|
smf_ue->supi, sess->psi);
|
||||||
|
|
|
@ -627,12 +627,10 @@ bool udm_nudr_dr_handle_subscription_provisioned(
|
||||||
break;
|
break;
|
||||||
|
|
||||||
CASE(OGS_SBI_RESOURCE_NAME_SM_DATA)
|
CASE(OGS_SBI_RESOURCE_NAME_SM_DATA)
|
||||||
OpenAPI_session_management_subscription_data_t *
|
OpenAPI_lnode_t *node;
|
||||||
SessionManagementSubscriptionData = NULL;
|
|
||||||
|
|
||||||
SessionManagementSubscriptionData =
|
if ((!recvmsg->SessionManagementSubscriptionDataList) ||
|
||||||
recvmsg->SessionManagementSubscriptionData;
|
(recvmsg->SessionManagementSubscriptionDataList->count == 0)) {
|
||||||
if (!SessionManagementSubscriptionData) {
|
|
||||||
ogs_error("[%s] No SessionManagementSubscriptionData",
|
ogs_error("[%s] No SessionManagementSubscriptionData",
|
||||||
udm_ue->supi);
|
udm_ue->supi);
|
||||||
ogs_assert(true ==
|
ogs_assert(true ==
|
||||||
|
@ -644,18 +642,23 @@ bool udm_nudr_dr_handle_subscription_provisioned(
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(&sendmsg, 0, sizeof(sendmsg));
|
memset(&sendmsg, 0, sizeof(sendmsg));
|
||||||
|
sendmsg.SessionManagementSubscriptionDataList = OpenAPI_list_create();
|
||||||
|
|
||||||
sendmsg.SessionManagementSubscriptionData =
|
OpenAPI_list_for_each(recvmsg->SessionManagementSubscriptionDataList, node)
|
||||||
OpenAPI_session_management_subscription_data_copy(
|
{
|
||||||
sendmsg.SessionManagementSubscriptionData,
|
OpenAPI_session_management_subscription_data_t *item = NULL;
|
||||||
recvmsg->SessionManagementSubscriptionData);
|
|
||||||
|
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);
|
response = ogs_sbi_build_response(&sendmsg, recvmsg->res_status);
|
||||||
ogs_assert(response);
|
ogs_assert(response);
|
||||||
ogs_assert(true == ogs_sbi_server_send_response(stream, response));
|
ogs_assert(true == ogs_sbi_server_send_response(stream, response));
|
||||||
|
|
||||||
OpenAPI_session_management_subscription_data_free(
|
OpenAPI_list_for_each(sendmsg.SessionManagementSubscriptionDataList, node)
|
||||||
sendmsg.SessionManagementSubscriptionData);
|
OpenAPI_session_management_subscription_data_free(node->data);
|
||||||
|
OpenAPI_list_free(sendmsg.SessionManagementSubscriptionDataList);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -793,8 +793,12 @@ bool udr_nudr_dr_handle_subscription_provisioned(
|
||||||
dnnConfigurationList;
|
dnnConfigurationList;
|
||||||
|
|
||||||
memset(&sendmsg, 0, sizeof(sendmsg));
|
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);
|
response = ogs_sbi_build_response(&sendmsg, OGS_SBI_HTTP_STATUS_OK);
|
||||||
ogs_assert(response);
|
ogs_assert(response);
|
||||||
|
|
Loading…
Reference in New Issue