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);
|
||||
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;
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue