From 9b762158a6ef3f8c4f3967d04e01d1a13cc9908a Mon Sep 17 00:00:00 2001 From: Sukchan Lee Date: Sun, 24 Jul 2022 19:47:04 +0900 Subject: [PATCH] Refine code of discovery option param (#1671) --- lib/sbi/message.c | 89 ++++++++++++++++++++++++++---------------- lib/sbi/message.h | 2 +- lib/sbi/nnrf-build.c | 17 +------- src/nrf/nnrf-handler.c | 46 +++++++++++++--------- 4 files changed, 84 insertions(+), 70 deletions(-) diff --git a/lib/sbi/message.c b/lib/sbi/message.c index 388e1858e..461540acb 100644 --- a/lib/sbi/message.c +++ b/lib/sbi/message.c @@ -61,8 +61,8 @@ void ogs_sbi_message_free(ogs_sbi_message_t *message) ogs_assert(message); /* Discovery Option */ - for (i = 0; i < message->param.discovery_option.num_of_service_names; i++) - ogs_free(message->param.discovery_option.service_names[i]); + if (message->param.discovery_option) + ogs_sbi_discovery_option_free(message->param.discovery_option); /* JSON Data */ if (message->NFProfile) @@ -290,32 +290,37 @@ ogs_sbi_request_t *ogs_sbi_build_request(ogs_sbi_message_t *message) } /* Discovery Option Parameter */ - if (message->param.discovery_option.target_nf_instance_id) { - ogs_sbi_header_set(request->http.params, - OGS_SBI_PARAM_TARGET_NF_INSTANCE_ID, - message->param.discovery_option.target_nf_instance_id); - } - if (message->param.discovery_option.requester_nf_instance_id) { - ogs_sbi_header_set(request->http.params, - OGS_SBI_PARAM_REQUESTER_NF_INSTANCE_ID, - message->param.discovery_option.requester_nf_instance_id); - } - if (message->param.discovery_option.num_of_service_names) { - char *v = NULL; - cJSON *item = NULL; + if (message->param.discovery_option) { + ogs_sbi_discovery_option_t *discovery_option = + message->param.discovery_option; - item = cJSON_CreateStringArray( - (const char * const*)message->param.discovery_option.service_names, - message->param.discovery_option.num_of_service_names); - ogs_expect_or_return_val(item, NULL); + if (discovery_option->target_nf_instance_id) { + ogs_sbi_header_set(request->http.params, + OGS_SBI_PARAM_TARGET_NF_INSTANCE_ID, + discovery_option->target_nf_instance_id); + } + if (discovery_option->requester_nf_instance_id) { + ogs_sbi_header_set(request->http.params, + OGS_SBI_PARAM_REQUESTER_NF_INSTANCE_ID, + discovery_option->requester_nf_instance_id); + } + if (discovery_option->num_of_service_names) { + char *v = NULL; + cJSON *item = NULL; - v = cJSON_Print(item); - ogs_expect_or_return_val(v, NULL); - cJSON_Delete(item); + item = cJSON_CreateStringArray( + (const char * const*)discovery_option->service_names, + discovery_option->num_of_service_names); + ogs_expect_or_return_val(item, NULL); - ogs_sbi_header_set( - request->http.params, OGS_SBI_PARAM_SERVICE_NAMES, v); - ogs_free(v); + v = cJSON_Print(item); + ogs_expect_or_return_val(v, NULL); + cJSON_Delete(item); + + ogs_sbi_header_set( + request->http.params, OGS_SBI_PARAM_SERVICE_NAMES, v); + ogs_free(v); + } } /* URL Query Paramemter */ @@ -476,6 +481,8 @@ int ogs_sbi_parse_request( { int rv; ogs_hash_index_t *hi; + ogs_sbi_discovery_option_t *discovery_option = NULL; + bool discovery_option_presence = false; ogs_assert(request); ogs_assert(message); @@ -486,6 +493,10 @@ int ogs_sbi_parse_request( return OGS_ERROR; } + discovery_option_presence = false; + discovery_option = ogs_sbi_discovery_option_new(); + ogs_assert(discovery_option); + for (hi = ogs_hash_first(request->http.params); hi; hi = ogs_hash_next(hi)) { /* Discovery Parameter */ @@ -501,12 +512,14 @@ int ogs_sbi_parse_request( /* Discovery Option Parameter */ } else if (!strcmp(ogs_hash_this_key(hi), OGS_SBI_PARAM_TARGET_NF_INSTANCE_ID)) { - message->param.discovery_option.target_nf_instance_id = - ogs_hash_this_val(hi); + discovery_option_presence = true; + ogs_sbi_discovery_option_set_target_nf_instance_id( + discovery_option, ogs_hash_this_val(hi)); } else if (!strcmp(ogs_hash_this_key(hi), OGS_SBI_PARAM_REQUESTER_NF_INSTANCE_ID)) { - message->param.discovery_option.requester_nf_instance_id = - ogs_hash_this_val(hi); + discovery_option_presence = true; + ogs_sbi_discovery_option_set_requester_nf_instance_id( + discovery_option, ogs_hash_this_val(hi)); } else if (!strcmp(ogs_hash_this_key(hi), OGS_SBI_PARAM_SERVICE_NAMES)) { char *v = NULL; @@ -516,13 +529,14 @@ int ogs_sbi_parse_request( if (v) { array = cJSON_Parse(v); if (cJSON_IsArray(array)) { + + discovery_option_presence = true; + cJSON_ArrayForEach(item, array) { char *names = cJSON_GetStringValue(item); - if (names) { - message->param.discovery_option.service_names[ - message->param.discovery_option. - num_of_service_names++] = ogs_strdup(names); - } + if (names) + ogs_sbi_discovery_option_add_service_names( + discovery_option, names); } } cJSON_Delete(array); @@ -613,6 +627,13 @@ int ogs_sbi_parse_request( } } + if (discovery_option_presence == true) + /* message->param.discovery_option will be freed() + * in ogs_sbi_message_free() */ + message->param.discovery_option = discovery_option; + else + ogs_sbi_discovery_option_free(discovery_option); + for (hi = ogs_hash_first(request->http.headers); hi; hi = ogs_hash_next(hi)) { /* diff --git a/lib/sbi/message.h b/lib/sbi/message.h index 3a657d3d5..55a4bdb87 100644 --- a/lib/sbi/message.h +++ b/lib/sbi/message.h @@ -389,7 +389,7 @@ typedef struct ogs_sbi_message_s { OpenAPI_nf_type_e requester_nf_type; /* Discovery Option Parameter */ - ogs_sbi_discovery_option_t discovery_option; + ogs_sbi_discovery_option_t *discovery_option; /* URL Query Parameter */ char *nf_id; diff --git a/lib/sbi/nnrf-build.c b/lib/sbi/nnrf-build.c index cf43ec90d..8249b4f9c 100644 --- a/lib/sbi/nnrf-build.c +++ b/lib/sbi/nnrf-build.c @@ -504,8 +504,6 @@ ogs_sbi_request_t *ogs_nnrf_disc_build_discover( OpenAPI_nf_type_e target_nf_type, OpenAPI_nf_type_e requester_nf_type, ogs_sbi_discovery_option_t *discovery_option) { - int i; - ogs_sbi_message_t message; ogs_sbi_request_t *request = NULL; @@ -522,20 +520,7 @@ ogs_sbi_request_t *ogs_nnrf_disc_build_discover( message.param.target_nf_type = target_nf_type; message.param.requester_nf_type = requester_nf_type; - if (discovery_option) { - message.param.discovery_option.target_nf_instance_id = - discovery_option->target_nf_instance_id; - message.param.discovery_option.requester_nf_instance_id = - discovery_option->requester_nf_instance_id; - - message.param.discovery_option.num_of_service_names = - discovery_option->num_of_service_names; - for (i = 0; - i < message.param.discovery_option.num_of_service_names; i++) { - message.param.discovery_option.service_names[i] = - discovery_option->service_names[i];; - } - } + message.param.discovery_option = discovery_option; request = ogs_sbi_build_request(&message); diff --git a/src/nrf/nnrf-handler.c b/src/nrf/nnrf-handler.c index 0b7c7e265..8e142ea85 100644 --- a/src/nrf/nnrf-handler.c +++ b/src/nrf/nnrf-handler.c @@ -400,6 +400,7 @@ bool nrf_nnrf_handle_nf_discover( ogs_sbi_message_t sendmsg; ogs_sbi_response_t *response = NULL; ogs_sbi_nf_instance_t *nf_instance = NULL; + ogs_sbi_discovery_option_t *discovery_option = NULL; OpenAPI_search_result_t *SearchResult = NULL; int i; @@ -426,21 +427,6 @@ bool nrf_nnrf_handle_nf_discover( OpenAPI_nf_type_ToString(recvmsg->param.requester_nf_type), OpenAPI_nf_type_ToString(recvmsg->param.target_nf_type)); - if (recvmsg->param.discovery_option.target_nf_instance_id) { - ogs_debug("target-nf-instance-id[%s]", - recvmsg->param.discovery_option.target_nf_instance_id); - } - if (recvmsg->param.discovery_option.requester_nf_instance_id) { - ogs_debug("requester-nf-instance-id[%s]", - recvmsg->param.discovery_option.requester_nf_instance_id); - } - if (recvmsg->param.discovery_option.num_of_service_names) { - for (i = 0; - i < recvmsg->param.discovery_option.num_of_service_names; i++) - ogs_debug("[%d] service-names[%s]", i, - recvmsg->param.discovery_option.service_names[i]); - } - SearchResult = ogs_calloc(1, sizeof(*SearchResult)); ogs_assert(SearchResult); @@ -452,14 +438,36 @@ bool nrf_nnrf_handle_nf_discover( SearchResult->nf_instances = OpenAPI_list_create(); ogs_assert(SearchResult->nf_instances); + if (recvmsg->param.discovery_option) + discovery_option = recvmsg->param.discovery_option; + + if (discovery_option) { + if (discovery_option->target_nf_instance_id) { + ogs_debug("target-nf-instance-id[%s]", + discovery_option->target_nf_instance_id); + } + if (discovery_option->requester_nf_instance_id) { + ogs_debug("requester-nf-instance-id[%s]", + discovery_option->requester_nf_instance_id); + } + if (discovery_option->num_of_service_names) { + for (i = 0; i < discovery_option->num_of_service_names; i++) + ogs_debug("[%d] service-names[%s]", i, + discovery_option->service_names[i]); + } + } + i = 0; ogs_list_for_each(&ogs_sbi_self()->nf_instance_list, nf_instance) { if (nf_instance->nf_type != recvmsg->param.target_nf_type) continue; - if (recvmsg->param.discovery_option.target_nf_instance_id && - strcmp(nf_instance->id, - recvmsg->param.discovery_option.target_nf_instance_id) != 0) - continue; + + if (discovery_option) { + if (discovery_option->target_nf_instance_id && + strcmp(nf_instance->id, + discovery_option->target_nf_instance_id) != 0) + continue; + } if (!recvmsg->param.limit || (recvmsg->param.limit && i < recvmsg->param.limit)) {