Compare commits

...

5 Commits

Author SHA1 Message Date
Sukchan Lee
b7cd0d6a7c Follow-up on #4105 2025-10-17 09:17:02 +09:00
jmasterfunk84
a90544f312 [UDM][UDR] Add support for dataset-names resource (#4105)
* Enable datasets in UDM

* Remove developer comment
2025-10-17 09:16:28 +09:00
Bostjan Meglic
2434f1e4f1 [ue-info] be compliant with C99/C11 standard 2025-10-17 08:30:45 +09:00
Bostjan Meglic
40351e5a38 [ue-info] consolidate separate function pointers into custom endpoints
Instead of predetermined endpoints in the metrics library, each NF can
now set it's own endpoints on which it listens for requests to dump info
(UE/PDU/gNB/eNB).
2025-10-17 08:30:45 +09:00
Bostjan Meglic
37c74da44f [ue-info] consolidate page/page size for ue-info API interface
Remove function pointers to set page/page sizes per info type
(UE/PDU/gNB/eNB info). Instead, call dumpers functions with this
information as function arguments.
2025-10-17 08:30:45 +09:00
30 changed files with 887 additions and 750 deletions

View File

@@ -25,30 +25,6 @@
#define DEFAULT_PROMETHEUS_HTTP_PORT 9090
size_t (*ogs_metrics_pdu_info_dumper)(char *buf, size_t buflen) = NULL;
size_t (*ogs_metrics_ue_info_dumper)(char *buf, size_t buflen) = NULL;
size_t (*ogs_metrics_gnb_info_dumper)(char *buf, size_t buflen) = NULL;
size_t (*ogs_metrics_enb_info_dumper)(char *buf, size_t buflen) = NULL;
void ogs_metrics_register_ue_info(size_t (*fn)(char *buf, size_t buflen))
{
ogs_metrics_ue_info_dumper = fn;
}
void ogs_metrics_register_pdu_info(size_t (*fn)(char *buf, size_t buflen))
{
ogs_metrics_pdu_info_dumper = fn;
}
void ogs_metrics_register_gnb_info(size_t (*fn)(char *buf, size_t buflen))
{
ogs_metrics_gnb_info_dumper = fn;
}
void ogs_metrics_register_enb_info(size_t (*fn)(char *buf, size_t buflen))
{
ogs_metrics_enb_info_dumper = fn;
}
int __ogs_metrics_domain;
static ogs_metrics_context_t self;
static int context_initialized = 0;
@@ -65,6 +41,8 @@ void ogs_metrics_context_init(void)
ogs_metrics_spec_init(ogs_metrics_self());
ogs_metrics_server_init(ogs_metrics_self());
ogs_list_init(&self.custom_eps);
context_initialized = 1;
}
@@ -74,7 +52,15 @@ void ogs_metrics_context_open(ogs_metrics_context_t *ctx)
}
void ogs_metrics_context_close(ogs_metrics_context_t *ctx)
{
ogs_metrics_custom_ep_t *node = NULL, *node_next = NULL;
ogs_metrics_server_close(ctx);
ogs_list_for_each_safe(&self.custom_eps, node_next, node) {
if (node->endpoint) ogs_free(node->endpoint);
ogs_list_remove(&self.custom_eps, node);
ogs_free(node);
}
}
void ogs_metrics_context_final(void)
@@ -290,3 +276,18 @@ int ogs_metrics_context_parse_config(const char *local)
return OGS_OK;
}
void ogs_metrics_register_custom_ep(ogs_metrics_custom_ep_hdlr_t handler,
const char *endpoint)
{
ogs_metrics_custom_ep_t *ep;
ep = ogs_calloc(1, sizeof(*ep));
ogs_assert(ep);
ep->endpoint = ogs_strdup(endpoint);
ep->handler = handler;
ogs_list_add(&self.custom_eps, ep);
}

View File

@@ -41,6 +41,9 @@ typedef struct ogs_metrics_context_s {
ogs_list_t spec_list;
uint16_t metrics_port;
/* custom endpoints */
ogs_list_t custom_eps;
} ogs_metrics_context_t;
typedef enum ogs_metrics_histogram_bucket_type_s {
@@ -112,6 +115,21 @@ static inline void ogs_metrics_inst_dec(ogs_metrics_inst_t *inst)
ogs_metrics_inst_add(inst, -1);
}
typedef size_t (*ogs_metrics_custom_ep_hdlr_t)(
char *buf, size_t buflen, size_t page, size_t page_size);
typedef struct ogs_metrics_custom_ep_s {
ogs_lnode_t lnode;
char *endpoint;
ogs_metrics_custom_ep_hdlr_t handler;
} ogs_metrics_custom_ep_t;
void ogs_metrics_register_custom_ep(ogs_metrics_custom_ep_hdlr_t handler,
const char *endpoint);
#ifdef __cplusplus
}
#endif

View File

@@ -36,18 +36,6 @@
extern "C" {
#endif
extern size_t (*ogs_metrics_pdu_info_dumper)(char *buf, size_t buflen);
void ogs_metrics_register_pdu_info(size_t (*fn)(char *buf, size_t buflen));
extern size_t (*ogs_metrics_ue_info_dumper)(char *buf, size_t buflen);
void ogs_metrics_register_ue_info(size_t (*fn)(char *buf, size_t buflen));
extern size_t (*ogs_metrics_gnb_info_dumper)(char *buf, size_t buflen);
void ogs_metrics_register_gnb_info(size_t (*fn)(char *buf, size_t buflen));
extern size_t (*ogs_metrics_enb_info_dumper)(char *buf, size_t buflen);
void ogs_metrics_register_enb_info(size_t (*fn)(char *buf, size_t buflen));
#ifdef __cplusplus
}

View File

@@ -36,12 +36,7 @@
#include "prom.h"
#include "microhttpd.h"
#include <string.h>
#include "prometheus/pager.h"
ogs_metrics_pager_fn ogs_metrics_pdu_info_set_pager = NULL;
ogs_metrics_pager_fn ogs_metrics_gnb_info_set_pager = NULL;
ogs_metrics_pager_fn ogs_metrics_enb_info_set_pager = NULL;
ogs_metrics_pager_fn ogs_metrics_ue_info_set_pager = NULL;
extern int __ogs_metrics_domain;
#define MAX_LABELS 8
@@ -199,17 +194,11 @@ typedef int _MHD_Result;
/* Small helper to serve JSON from a registered dumper */
static _MHD_Result serve_json_from_dumper(struct MHD_Connection *connection,
size_t (*dumper)(char*, size_t),
const char *missing_msg)
ogs_metrics_custom_ep_hdlr_t handler,
size_t page, size_t page_size)
{
if (!dumper) {
struct MHD_Response *rsp = MHD_create_response_from_buffer(strlen(missing_msg),
(void*)missing_msg, MHD_RESPMEM_PERSISTENT);
if (!rsp) return (_MHD_Result)MHD_NO;
int ret = MHD_queue_response(connection, MHD_HTTP_NOT_FOUND, rsp);
MHD_destroy_response(rsp);
return (_MHD_Result)ret;
}
ogs_assert(connection);
ogs_assert(handler);
size_t cap = 512 * 1024;
char *bufjson = (char *)ogs_malloc(cap);
@@ -223,7 +212,7 @@ static _MHD_Result serve_json_from_dumper(struct MHD_Connection *connection,
return (_MHD_Result)ret;
}
size_t n = dumper(bufjson, cap);
size_t n = handler(bufjson, cap, page, page_size);
if (n >= cap - 1) {
/* grow once */
size_t newcap = cap * 2;
@@ -239,7 +228,7 @@ static _MHD_Result serve_json_from_dumper(struct MHD_Connection *connection,
return (_MHD_Result)ret;
}
bufjson = tmp; cap = newcap;
n = dumper(bufjson, cap);
n = handler(bufjson, cap, page, page_size);
if (n >= cap - 1) {
/* graceful fallback */
n = ogs_snprintf(bufjson, cap, "[]");
@@ -308,46 +297,17 @@ mhd_server_access_handler(void *cls, struct MHD_Connection *connection,
MHD_destroy_response(rsp);
return (_MHD_Result)ret;
}
/* JSON: connected PDUs (SMF) */
if (strcmp(url, "/pdu-info") == 0) {
size_t page = get_query_size_t(connection, "page", 0);
size_t page_size = get_query_size_t(connection, "page_size", 100);
if (ogs_metrics_pdu_info_set_pager)
ogs_metrics_pdu_info_set_pager(page, page_size);
return serve_json_from_dumper(connection, ogs_metrics_pdu_info_dumper,
"pdu-info endpoint not available on this NF\n");
}
/* JSON: connected gNBs (AMF) */
if (strcmp(url, "/gnb-info") == 0) {
size_t page = get_query_size_t(connection, "page", 0);
size_t page_size = get_query_size_t(connection, "page_size", 100);
if (ogs_metrics_gnb_info_set_pager)
ogs_metrics_gnb_info_set_pager(page, page_size);
return serve_json_from_dumper(connection, ogs_metrics_gnb_info_dumper,
"gnb-info endpoint not available on this NF\n");
}
/* JSON: connected eNBs (MME) */
if (strcmp(url, "/enb-info") == 0) {
size_t page = get_query_size_t(connection, "page", 0);
size_t page_size = get_query_size_t(connection, "page_size", 100);
if (ogs_metrics_enb_info_set_pager)
ogs_metrics_enb_info_set_pager(page, page_size);
return serve_json_from_dumper(connection, ogs_metrics_enb_info_dumper,
"enb-info endpoint not available on this NF\n");
}
/* JSON: connected UEs (AMF/MME) */
if (strcmp(url, "/ue-info") == 0) {
size_t page = get_query_size_t(connection, "page", 0);
size_t page_size = get_query_size_t(connection, "page_size", 100);
if (ogs_metrics_ue_info_set_pager)
ogs_metrics_ue_info_set_pager(page, page_size);
return serve_json_from_dumper(connection, ogs_metrics_ue_info_dumper,
"ue-info endpoint not available on this NF\n");
size_t page = get_query_size_t(connection, "page", 0);
size_t page_size = get_query_size_t(connection, "page_size", 100);
ogs_metrics_custom_ep_t *node = NULL;
ogs_list_for_each(&ogs_metrics_self()->custom_eps, node) {
if (!strcmp(node->endpoint, url)) {
return serve_json_from_dumper(connection,
node->handler,
page, page_size);
}
}
/* No matching route */

View File

@@ -1,38 +0,0 @@
/*
* Copyright (C) 2025 by Juraj Elias <juraj.elias@gmail.com>
*
* This file is part of Open5GS.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef OGS_METRICS_PROM_PAGER_H
#define OGS_METRICS_PROM_PAGER_H
#include <stddef.h>
/* NF-specific optional pager setter signatures.
* NFs may assign these at init time. If left NULL, paging is ignored for that NF.
*/
typedef void (*ogs_metrics_pager_fn)(size_t page, size_t page_size);
/* Connected PDUs (SMF) */
extern ogs_metrics_pager_fn ogs_metrics_pdu_info_set_pager;
extern ogs_metrics_pager_fn ogs_metrics_ue_info_set_pager;
extern ogs_metrics_pager_fn ogs_metrics_gnb_info_set_pager;
extern ogs_metrics_pager_fn ogs_metrics_enb_info_set_pager;
#endif /* OGS_METRICS_PROM_PAGER_H */

View File

@@ -66,6 +66,8 @@ void ogs_sbi_message_free(ogs_sbi_message_t *message)
/* Query parameters */
for (i = 0; i < message->param.num_of_fields; i++)
ogs_free(message->param.fields[i]);
for (i = 0; i < message->param.num_of_dataset_names; i++)
ogs_free(message->param.dataset_names[i]);
/* JSON Data */
if (message->NFProfile)
@@ -113,6 +115,8 @@ void ogs_sbi_message_free(ogs_sbi_message_t *message)
message->Amf3GppAccessRegistrationModification);
if (message->SmfRegistration)
OpenAPI_smf_registration_free(message->SmfRegistration);
if (message->ProvisionedDataSets)
OpenAPI_provisioned_data_sets_free(message->ProvisionedDataSets);
if (message->Nssai)
OpenAPI_nssai_free(message->Nssai);
if (message->AccessAndMobilitySubscriptionData)
@@ -761,6 +765,25 @@ ogs_sbi_request_t *ogs_sbi_build_request(ogs_sbi_message_t *message)
}
}
if (message->param.num_of_dataset_names) {
char *dataset_names;
dataset_names = ogs_strdup(message->param.dataset_names[0]);
if (!dataset_names) {
ogs_error("ogs_strdup() failed");
return NULL;
}
for (i = 1; i < message->param.num_of_dataset_names; i++)
dataset_names = ogs_mstrcatf(
dataset_names, ",%s", message->param.dataset_names[i]);
if (dataset_names) {
ogs_sbi_header_set(request->http.params,
OGS_SBI_PARAM_DATASET_NAMES, dataset_names);
ogs_free(dataset_names);
}
}
if (message->param.ipv4addr) {
ogs_sbi_header_set(request->http.params,
OGS_SBI_PARAM_IPV4ADDR, message->param.ipv4addr);
@@ -1172,6 +1195,34 @@ int ogs_sbi_parse_request(
}
}
ogs_free(v);
} else if (!strcmp(ogs_hash_this_key(hi),
OGS_SBI_PARAM_DATASET_NAMES)) {
char *_v = ogs_hash_this_val(hi), *v = NULL;
char *token = NULL;
char *saveptr = NULL;
v = ogs_strdup(_v);
ogs_assert(v);
token = ogs_strtok_r(v, ",", &saveptr);
while (token != NULL) {
if (message->param.num_of_dataset_names <
OGS_SBI_MAX_NUM_OF_DATASETNAMES) {
message->param.dataset_names
[message->param.num_of_dataset_names] =
ogs_strdup(token);
ogs_assert(message->param.dataset_names
[message->param.num_of_dataset_names]);
message->param.num_of_dataset_names++;
token = ogs_strtok_r(NULL, ",", &saveptr);
} else {
ogs_error("Datasetnames in query exceeds "
"MAX_NUM_OF_DATASETNAMES");
break;
}
}
ogs_free(v);
} else if (!strcmp(ogs_hash_this_key(hi), OGS_SBI_PARAM_IPV4ADDR)) {
message->param.ipv4addr = ogs_hash_this_val(hi);
@@ -1480,6 +1531,10 @@ static char *build_json(ogs_sbi_message_t *message)
} else if (message->SmfRegistration) {
item = OpenAPI_smf_registration_convertToJSON(message->SmfRegistration);
ogs_assert(item);
} else if (message->ProvisionedDataSets) {
item = OpenAPI_provisioned_data_sets_convertToJSON(
message->ProvisionedDataSets);
ogs_assert(item);
} else if (message->Nssai) {
item = OpenAPI_nssai_convertToJSON(message->Nssai);
ogs_assert(item);
@@ -2182,6 +2237,20 @@ static int parse_json(ogs_sbi_message_t *message,
DEFAULT
SWITCH(message->h.resource.component[3])
CASE(OGS_SBI_RESOURCE_NAME_PROVISIONED_DATA)
if (!message->h.resource.component[4]) {
if (message->res_status < 300) {
message->ProvisionedDataSets =
OpenAPI_provisioned_data_sets_parseFromJSON(item);
if (!message->ProvisionedDataSets) {
rv = OGS_ERROR;
ogs_error("JSON parse error");
}
} else {
ogs_error("HTTP ERROR Status : %d",
message->res_status);
}
break;
}
SWITCH(message->h.resource.component[4])
CASE(OGS_SBI_RESOURCE_NAME_AM_DATA)
if (message->res_status < 300) {

View File

@@ -354,6 +354,7 @@ extern "C" {
#define OGS_SBI_PARAM_SLICE_INFO_REQUEST_FOR_PDU_SESSION \
"slice-info-request-for-pdu-session"
#define OGS_SBI_PARAM_FIELDS "fields"
#define OGS_SBI_PARAM_DATASET_NAMES "dataset-names"
#define OGS_SBI_PARAM_IPV4ADDR "ipv4Addr"
#define OGS_SBI_PARAM_IPV6PREFIX "ipv6Prefix"
#define OGS_SBI_PARAM_HOME_PLMN_ID "home-plmn-id"
@@ -369,6 +370,11 @@ extern "C" {
#define OGS_SBI_PARAM_FIELDS_NSSAI "nssai"
#define OGS_SBI_MAX_NUM_OF_FIELDS 8
#define OGS_SBI_PARAM_DATASET_NAME_AM "AM"
#define OGS_SBI_PARAM_DATASET_NAME_SMF_SEL "SMF_SEL"
#define OGS_SBI_PARAM_DATASET_NAME_SM "SM"
#define OGS_SBI_MAX_NUM_OF_DATASETNAMES 8
#define OGS_SBI_CONTENT_JSON_TYPE \
OGS_SBI_APPLICATION_TYPE "/" OGS_SBI_APPLICATION_JSON_TYPE
#define OGS_SBI_CONTENT_PROBLEM_TYPE \
@@ -509,6 +515,8 @@ typedef struct ogs_sbi_message_s {
char *dnn;
int num_of_fields;
char *fields[OGS_SBI_MAX_NUM_OF_FIELDS];
int num_of_dataset_names;
char *dataset_names[OGS_SBI_MAX_NUM_OF_DATASETNAMES];
/* Shared memory */
bool plmn_id_presence;
@@ -552,6 +560,7 @@ typedef struct ogs_sbi_message_s {
OpenAPI_amf3_gpp_access_registration_t *Amf3GppAccessRegistration;
OpenAPI_amf3_gpp_access_registration_modification_t
*Amf3GppAccessRegistrationModification;
OpenAPI_provisioned_data_sets_t *ProvisionedDataSets;
OpenAPI_nssai_t *Nssai;
OpenAPI_access_and_mobility_subscription_data_t
*AccessAndMobilitySubscriptionData;

View File

@@ -100,6 +100,7 @@
#include "model/ue_reg_status_update_req_data.h"
#include "model/ue_reg_status_update_rsp_data.h"
#include "model/status_notification.h"
#include "model/provisioned_data_sets.h"
#include "custom/links.h"

View File

@@ -5,15 +5,15 @@
#include "sm_subs_data.h"
OpenAPI_sm_subs_data_t *OpenAPI_sm_subs_data_create(
OpenAPI_list_t *shared_sm_subs_data_ids,
OpenAPI_list_t *individual_sm_subs_data
OpenAPI_list_t *session_management_subscription_data_list,
OpenAPI_extended_sm_subs_data_t *extended_sm_subs_data
)
{
OpenAPI_sm_subs_data_t *sm_subs_data_local_var = ogs_malloc(sizeof(OpenAPI_sm_subs_data_t));
ogs_assert(sm_subs_data_local_var);
sm_subs_data_local_var->shared_sm_subs_data_ids = shared_sm_subs_data_ids;
sm_subs_data_local_var->individual_sm_subs_data = individual_sm_subs_data;
sm_subs_data_local_var->session_management_subscription_data_list = session_management_subscription_data_list;
sm_subs_data_local_var->extended_sm_subs_data = extended_sm_subs_data;
return sm_subs_data_local_var;
}
@@ -25,19 +25,16 @@ void OpenAPI_sm_subs_data_free(OpenAPI_sm_subs_data_t *sm_subs_data)
if (NULL == sm_subs_data) {
return;
}
if (sm_subs_data->shared_sm_subs_data_ids) {
OpenAPI_list_for_each(sm_subs_data->shared_sm_subs_data_ids, node) {
ogs_free(node->data);
}
OpenAPI_list_free(sm_subs_data->shared_sm_subs_data_ids);
sm_subs_data->shared_sm_subs_data_ids = NULL;
}
if (sm_subs_data->individual_sm_subs_data) {
OpenAPI_list_for_each(sm_subs_data->individual_sm_subs_data, node) {
if (sm_subs_data->session_management_subscription_data_list) {
OpenAPI_list_for_each(sm_subs_data->session_management_subscription_data_list, node) {
OpenAPI_session_management_subscription_data_free(node->data);
}
OpenAPI_list_free(sm_subs_data->individual_sm_subs_data);
sm_subs_data->individual_sm_subs_data = NULL;
OpenAPI_list_free(sm_subs_data->session_management_subscription_data_list);
sm_subs_data->session_management_subscription_data_list = NULL;
}
if (sm_subs_data->extended_sm_subs_data) {
OpenAPI_extended_sm_subs_data_free(sm_subs_data->extended_sm_subs_data);
sm_subs_data->extended_sm_subs_data = NULL;
}
ogs_free(sm_subs_data);
}
@@ -53,35 +50,32 @@ cJSON *OpenAPI_sm_subs_data_convertToJSON(OpenAPI_sm_subs_data_t *sm_subs_data)
}
item = cJSON_CreateObject();
if (!sm_subs_data->shared_sm_subs_data_ids) {
ogs_error("OpenAPI_sm_subs_data_convertToJSON() failed [shared_sm_subs_data_ids]");
return NULL;
}
cJSON *shared_sm_subs_data_idsList = cJSON_AddArrayToObject(item, "sharedSmSubsDataIds");
if (shared_sm_subs_data_idsList == NULL) {
ogs_error("OpenAPI_sm_subs_data_convertToJSON() failed [shared_sm_subs_data_ids]");
if (sm_subs_data->session_management_subscription_data_list) {
cJSON *session_management_subscription_data_listList = cJSON_AddArrayToObject(item, "SessionManagementSubscriptionDataList");
if (session_management_subscription_data_listList == NULL) {
ogs_error("OpenAPI_sm_subs_data_convertToJSON() failed [session_management_subscription_data_list]");
goto end;
}
OpenAPI_list_for_each(sm_subs_data->shared_sm_subs_data_ids, node) {
if (cJSON_AddStringToObject(shared_sm_subs_data_idsList, "", (char*)node->data) == NULL) {
ogs_error("OpenAPI_sm_subs_data_convertToJSON() failed [shared_sm_subs_data_ids]");
goto end;
}
}
if (sm_subs_data->individual_sm_subs_data) {
cJSON *individual_sm_subs_dataList = cJSON_AddArrayToObject(item, "individualSmSubsData");
if (individual_sm_subs_dataList == NULL) {
ogs_error("OpenAPI_sm_subs_data_convertToJSON() failed [individual_sm_subs_data]");
goto end;
}
OpenAPI_list_for_each(sm_subs_data->individual_sm_subs_data, node) {
OpenAPI_list_for_each(sm_subs_data->session_management_subscription_data_list, node) {
cJSON *itemLocal = OpenAPI_session_management_subscription_data_convertToJSON(node->data);
if (itemLocal == NULL) {
ogs_error("OpenAPI_sm_subs_data_convertToJSON() failed [individual_sm_subs_data]");
ogs_error("OpenAPI_sm_subs_data_convertToJSON() failed [session_management_subscription_data_list]");
goto end;
}
cJSON_AddItemToArray(individual_sm_subs_dataList, itemLocal);
cJSON_AddItemToArray(session_management_subscription_data_listList, itemLocal);
}
}
if (sm_subs_data->extended_sm_subs_data) {
cJSON *extended_sm_subs_data_local_JSON = OpenAPI_extended_sm_subs_data_convertToJSON(sm_subs_data->extended_sm_subs_data);
if (extended_sm_subs_data_local_JSON == NULL) {
ogs_error("OpenAPI_sm_subs_data_convertToJSON() failed [extended_sm_subs_data]");
goto end;
}
cJSON_AddItemToObject(item, "ExtendedSmSubsData", extended_sm_subs_data_local_JSON);
if (item->child == NULL) {
ogs_error("OpenAPI_sm_subs_data_convertToJSON() failed [extended_sm_subs_data]");
goto end;
}
}
@@ -93,77 +87,60 @@ OpenAPI_sm_subs_data_t *OpenAPI_sm_subs_data_parseFromJSON(cJSON *sm_subs_dataJS
{
OpenAPI_sm_subs_data_t *sm_subs_data_local_var = NULL;
OpenAPI_lnode_t *node = NULL;
cJSON *shared_sm_subs_data_ids = NULL;
OpenAPI_list_t *shared_sm_subs_data_idsList = NULL;
cJSON *individual_sm_subs_data = NULL;
OpenAPI_list_t *individual_sm_subs_dataList = NULL;
shared_sm_subs_data_ids = cJSON_GetObjectItemCaseSensitive(sm_subs_dataJSON, "sharedSmSubsDataIds");
if (!shared_sm_subs_data_ids) {
ogs_error("OpenAPI_sm_subs_data_parseFromJSON() failed [shared_sm_subs_data_ids]");
cJSON *session_management_subscription_data_list = NULL;
OpenAPI_list_t *session_management_subscription_data_listList = NULL;
cJSON *extended_sm_subs_data = NULL;
OpenAPI_extended_sm_subs_data_t *extended_sm_subs_data_local_nonprim = NULL;
session_management_subscription_data_list = cJSON_GetObjectItemCaseSensitive(sm_subs_dataJSON, "SessionManagementSubscriptionDataList");
if (session_management_subscription_data_list) {
cJSON *session_management_subscription_data_list_local = NULL;
if (!cJSON_IsArray(session_management_subscription_data_list)) {
ogs_error("OpenAPI_sm_subs_data_parseFromJSON() failed [session_management_subscription_data_list]");
goto end;
}
session_management_subscription_data_listList = OpenAPI_list_create();
cJSON_ArrayForEach(session_management_subscription_data_list_local, session_management_subscription_data_list) {
if (!cJSON_IsObject(session_management_subscription_data_list_local)) {
ogs_error("OpenAPI_sm_subs_data_parseFromJSON() failed [session_management_subscription_data_list]");
goto end;
}
OpenAPI_session_management_subscription_data_t *session_management_subscription_data_listItem = OpenAPI_session_management_subscription_data_parseFromJSON(session_management_subscription_data_list_local);
if (!session_management_subscription_data_listItem) {
ogs_error("No session_management_subscription_data_listItem");
goto end;
}
OpenAPI_list_add(session_management_subscription_data_listList, session_management_subscription_data_listItem);
}
}
extended_sm_subs_data = cJSON_GetObjectItemCaseSensitive(sm_subs_dataJSON, "ExtendedSmSubsData");
if (extended_sm_subs_data) {
extended_sm_subs_data_local_nonprim = OpenAPI_extended_sm_subs_data_parseFromJSON(extended_sm_subs_data);
if (!extended_sm_subs_data_local_nonprim) {
ogs_error("OpenAPI_extended_sm_subs_data_parseFromJSON failed [extended_sm_subs_data]");
goto end;
}
cJSON *shared_sm_subs_data_ids_local = NULL;
if (!cJSON_IsArray(shared_sm_subs_data_ids)) {
ogs_error("OpenAPI_sm_subs_data_parseFromJSON() failed [shared_sm_subs_data_ids]");
goto end;
}
shared_sm_subs_data_idsList = OpenAPI_list_create();
cJSON_ArrayForEach(shared_sm_subs_data_ids_local, shared_sm_subs_data_ids) {
double *localDouble = NULL;
int *localInt = NULL;
if (!cJSON_IsString(shared_sm_subs_data_ids_local)) {
ogs_error("OpenAPI_sm_subs_data_parseFromJSON() failed [shared_sm_subs_data_ids]");
goto end;
}
OpenAPI_list_add(shared_sm_subs_data_idsList, ogs_strdup(shared_sm_subs_data_ids_local->valuestring));
}
individual_sm_subs_data = cJSON_GetObjectItemCaseSensitive(sm_subs_dataJSON, "individualSmSubsData");
if (individual_sm_subs_data) {
cJSON *individual_sm_subs_data_local = NULL;
if (!cJSON_IsArray(individual_sm_subs_data)) {
ogs_error("OpenAPI_sm_subs_data_parseFromJSON() failed [individual_sm_subs_data]");
goto end;
}
individual_sm_subs_dataList = OpenAPI_list_create();
cJSON_ArrayForEach(individual_sm_subs_data_local, individual_sm_subs_data) {
if (!cJSON_IsObject(individual_sm_subs_data_local)) {
ogs_error("OpenAPI_sm_subs_data_parseFromJSON() failed [individual_sm_subs_data]");
goto end;
}
OpenAPI_session_management_subscription_data_t *individual_sm_subs_dataItem = OpenAPI_session_management_subscription_data_parseFromJSON(individual_sm_subs_data_local);
if (!individual_sm_subs_dataItem) {
ogs_error("No individual_sm_subs_dataItem");
goto end;
}
OpenAPI_list_add(individual_sm_subs_dataList, individual_sm_subs_dataItem);
}
}
sm_subs_data_local_var = OpenAPI_sm_subs_data_create (
shared_sm_subs_data_idsList,
individual_sm_subs_data ? individual_sm_subs_dataList : NULL
session_management_subscription_data_list ? session_management_subscription_data_listList : NULL,
extended_sm_subs_data ? extended_sm_subs_data_local_nonprim : NULL
);
return sm_subs_data_local_var;
end:
if (shared_sm_subs_data_idsList) {
OpenAPI_list_for_each(shared_sm_subs_data_idsList, node) {
ogs_free(node->data);
}
OpenAPI_list_free(shared_sm_subs_data_idsList);
shared_sm_subs_data_idsList = NULL;
}
if (individual_sm_subs_dataList) {
OpenAPI_list_for_each(individual_sm_subs_dataList, node) {
if (session_management_subscription_data_listList) {
OpenAPI_list_for_each(session_management_subscription_data_listList, node) {
OpenAPI_session_management_subscription_data_free(node->data);
}
OpenAPI_list_free(individual_sm_subs_dataList);
individual_sm_subs_dataList = NULL;
OpenAPI_list_free(session_management_subscription_data_listList);
session_management_subscription_data_listList = NULL;
}
if (extended_sm_subs_data_local_nonprim) {
OpenAPI_extended_sm_subs_data_free(extended_sm_subs_data_local_nonprim);
extended_sm_subs_data_local_nonprim = NULL;
}
return NULL;
}

View File

@@ -21,13 +21,13 @@ extern "C" {
typedef struct OpenAPI_sm_subs_data_s OpenAPI_sm_subs_data_t;
typedef struct OpenAPI_sm_subs_data_s {
OpenAPI_list_t *shared_sm_subs_data_ids;
OpenAPI_list_t *individual_sm_subs_data;
OpenAPI_list_t *session_management_subscription_data_list;
struct OpenAPI_extended_sm_subs_data_s *extended_sm_subs_data;
} OpenAPI_sm_subs_data_t;
OpenAPI_sm_subs_data_t *OpenAPI_sm_subs_data_create(
OpenAPI_list_t *shared_sm_subs_data_ids,
OpenAPI_list_t *individual_sm_subs_data
OpenAPI_list_t *session_management_subscription_data_list,
OpenAPI_extended_sm_subs_data_t *extended_sm_subs_data
);
void OpenAPI_sm_subs_data_free(OpenAPI_sm_subs_data_t *sm_subs_data);
OpenAPI_sm_subs_data_t *OpenAPI_sm_subs_data_parseFromJSON(cJSON *sm_subs_dataJSON);

View File

@@ -3351,12 +3351,15 @@ components:
$ref: 'TS29571_CommonData.yaml#/components/schemas/Gpsi'
SmSubsData:
oneOf:
- type: array
type: object
properties:
SessionManagementSubscriptionDataList:
type: array
items:
$ref: '#/components/schemas/SessionManagementSubscriptionData'
minItems: 1
- $ref: '#/components/schemas/ExtendedSmSubsData'
minItems: 1
ExtendedSmSubsData:
$ref: '#/components/schemas/ExtendedSmSubsData'
ExtendedSmSubsData:
description: Contains identifiers of shared Session Management Subscription Data and optionally individual Session Management Subscription Data.

View File

@@ -94,18 +94,9 @@
#define GNB_INFO_PAGE_SIZE_DEFAULT 100U
#endif
static size_t g_page = SIZE_MAX; /* SIZE_MAX => no paging */
static size_t g_page_size = 0; /* 0 => use default in dumper */
void amf_metrics_gnb_info_set_pager(size_t page, size_t page_size)
size_t amf_dump_gnb_info(char *buf, size_t buflen, size_t page, size_t page_size)
{
g_page = page;
g_page_size = page_size;
}
size_t amf_dump_gnb_info(char *buf, size_t buflen)
{
return amf_dump_gnb_info_paged(buf, buflen, g_page, g_page_size);
return amf_dump_gnb_info_paged(buf, buflen, page, page_size);
}
static inline uint32_t u24_to_u32(ogs_uint24_t v)
@@ -208,8 +199,9 @@ size_t amf_dump_gnb_info_paged(char *buf, size_t buflen, size_t page, size_t pag
if (!tas) { cJSON_Delete(g); oom = true; break; }
bool inner_oom = false;
int t;
for (int t = 0; t < gnb->num_of_supported_ta_list; t++) {
for (t = 0; t < gnb->num_of_supported_ta_list; t++) {
const ogs_uint24_t tac = gnb->supported_ta_list[t].tac;
const int nbp = gnb->supported_ta_list[t].num_of_bplmn_list;
@@ -223,8 +215,9 @@ size_t amf_dump_gnb_info_paged(char *buf, size_t buflen, size_t page, size_t pag
if (!bplmns) { cJSON_Delete(ta); inner_oom = true; break; }
bool inner2_oom = false;
int p;
for (int p = 0; p < nbp; p++) {
for (p = 0; p < nbp; p++) {
const ogs_plmn_id_t *bp_plmn = &gnb->supported_ta_list[t].bplmn_list[p].plmn_id;
const int ns = gnb->supported_ta_list[t].bplmn_list[p].num_of_s_nssai;
const ogs_s_nssai_t *sn = gnb->supported_ta_list[t].bplmn_list[p].s_nssai;
@@ -238,8 +231,9 @@ size_t amf_dump_gnb_info_paged(char *buf, size_t buflen, size_t page, size_t pag
if (!sns) { cJSON_Delete(bp); inner2_oom = true; break; }
bool inner3_oom = false;
int i;
for (int i = 0; i < ns; i++) {
for (i = 0; i < ns; i++) {
cJSON *o = cJSON_CreateObject();
if (!o) { inner3_oom = true; break; }

View File

@@ -33,9 +33,8 @@ extern "C" {
#define GNB_INFO_PAGE_SIZE_DEFAULT 100U
#endif
size_t amf_dump_gnb_info(char *buf, size_t buflen);
size_t amf_dump_gnb_info(char *buf, size_t buflen, size_t page, size_t page_size);
size_t amf_dump_gnb_info_paged(char *buf, size_t buflen, size_t page, size_t page_size);
void amf_metrics_gnb_info_set_pager(size_t page, size_t page_size);
#ifdef __cplusplus
}

View File

@@ -23,7 +23,6 @@
#include "ogs-metrics.h"
#include "metrics/prometheus/json_pager.h"
#include "metrics/prometheus/pager.h"
#include "gnb-info.h"
#include "ue-info.h"
@@ -63,10 +62,8 @@ int amf_initialize(void)
ogs_metrics_context_open(ogs_metrics_self());
/* dumpers /gnb-info /ue-info */
ogs_metrics_register_gnb_info(amf_dump_gnb_info);
ogs_metrics_register_ue_info(amf_dump_ue_info);
ogs_metrics_gnb_info_set_pager = amf_metrics_gnb_info_set_pager;
ogs_metrics_ue_info_set_pager = amf_metrics_ue_info_set_pager;
ogs_metrics_register_custom_ep(amf_dump_gnb_info, "/gnb-info");
ogs_metrics_register_custom_ep(amf_dump_ue_info, "/ue-info");
rv = amf_sbi_open();
if (rv != OGS_OK) return rv;

View File

@@ -115,20 +115,12 @@
#include "sbi/openapi/external/cJSON.h"
#include "metrics/prometheus/json_pager.h"
static size_t g_ue_page = 0;
static size_t g_ue_page_size = 0;
void amf_metrics_ue_info_set_pager(size_t page, size_t page_size)
size_t amf_dump_ue_info(char *buf, size_t buflen, size_t page, size_t page_size)
{
g_ue_page = page;
g_ue_page_size = page_size;
}
size_t amf_dump_ue_info(char *buf, size_t buflen)
{
size_t page = g_ue_page;
size_t page_size = g_ue_page_size ? g_ue_page_size : 100;
page_size = page_size ? page_size : 100;
if (page_size > 100) page_size = 100;
return amf_dump_ue_info_paged(buf, buflen, page, page_size);
}
@@ -343,9 +335,11 @@ static int add_location(cJSON *parent, const amf_ue_t *ue)
static int add_msisdn_array(cJSON *parent, const amf_ue_t *ue)
{
cJSON *arr = cJSON_CreateArray();
int i;
if (!arr) return -1;
for (int i = 0; i < ue->num_of_msisdn; i++) {
for (i = 0; i < ue->num_of_msisdn; i++) {
if (!ue->msisdn[i] || !ue->msisdn[i][0]) continue;
cJSON *s = cJSON_CreateString(ue->msisdn[i]);
if (!s) { cJSON_Delete(arr); return -1; }
@@ -478,10 +472,12 @@ static int add_requested_allowed_slices(cJSON *parent, const amf_ue_t *ue)
{
cJSON *req = cJSON_CreateArray();
cJSON *allow = cJSON_CreateArray();
int i;
if (!req || !allow) { if (req) cJSON_Delete(req); if (allow) cJSON_Delete(allow); return -1; }
/* requested */
for (int i = 0; i < ue->requested_nssai.num_of_s_nssai; i++) {
for (i = 0; i < ue->requested_nssai.num_of_s_nssai; i++) {
const ogs_nas_s_nssai_ie_t *ie = &ue->requested_nssai.s_nssai[i];
cJSON *sn = cJSON_CreateObject();
if (!sn) { cJSON_Delete(req); cJSON_Delete(allow); return -1; }
@@ -493,7 +489,7 @@ static int add_requested_allowed_slices(cJSON *parent, const amf_ue_t *ue)
}
/* allowed */
for (int i = 0; i < ue->allowed_nssai.num_of_s_nssai; i++) {
for (i = 0; i < ue->allowed_nssai.num_of_s_nssai; i++) {
const ogs_nas_s_nssai_ie_t *ie = &ue->allowed_nssai.s_nssai[i];
cJSON *sn = cJSON_CreateObject();
if (!sn) { cJSON_Delete(req); cJSON_Delete(allow); return -1; }
@@ -537,7 +533,8 @@ static int add_am_policy_features(cJSON *parent, const amf_ue_t *ue)
cJSON *labels = cJSON_CreateArray();
if (!bits || !labels) { if (bits) cJSON_Delete(bits); if (labels) cJSON_Delete(labels); cJSON_Delete(feat); return -1; }
for (int i = 0; i < 64; i++) {
int i;
for (i = 0; i < 64; i++) {
if ((f >> i) & 1ULL) {
cJSON *bi = cJSON_CreateNumber((double)i);
if (!bi) { cJSON_Delete(bits); cJSON_Delete(labels); cJSON_Delete(feat); return -1; }

View File

@@ -33,9 +33,10 @@ extern "C" {
#define UE_INFO_PAGE_SIZE_DEFAULT 100U
#endif
size_t amf_dump_ue_info(char *buf, size_t buflen);
size_t amf_dump_ue_info_paged(char *buf, size_t buflen, size_t page, size_t page_size);
void amf_metrics_ue_info_set_pager(size_t page, size_t page_size);
size_t amf_dump_ue_info(char *buf, size_t buflen,
size_t page, size_t page_size);
size_t amf_dump_ue_info_paged(char *buf, size_t buflen,
size_t page, size_t page_size);
#ifdef __cplusplus
}

View File

@@ -73,20 +73,12 @@
#define ENB_INFO_PAGE_SIZE_DEFAULT 100U
#endif
static size_t g_enb_page = 0;
static size_t g_enb_page_size = 0;
void mme_metrics_enb_info_set_pager(size_t page, size_t page_size)
size_t mme_dump_enb_info(char *buf, size_t buflen, size_t page, size_t page_size)
{
g_enb_page = page;
g_enb_page_size = page_size;
}
size_t mme_dump_enb_info(char *buf, size_t buflen)
{
size_t page = g_enb_page;
size_t page_size = g_enb_page_size ? g_enb_page_size : ENB_INFO_PAGE_SIZE_DEFAULT;
page_size = page_size ? page_size : ENB_INFO_PAGE_SIZE_DEFAULT;
if (page_size > ENB_INFO_PAGE_SIZE_DEFAULT) page_size = ENB_INFO_PAGE_SIZE_DEFAULT;
return mme_dump_enb_info_paged(buf, buflen, page, page_size);
}
@@ -206,8 +198,9 @@ size_t mme_dump_enb_info_paged(char *buf, size_t buflen, size_t page, size_t pag
if (!tas) { cJSON_Delete(e); oom = true; break; }
bool inner_oom = false;
int t;
for (int t = 0; t < enb->num_of_supported_ta_list; t++) {
for (t = 0; t < enb->num_of_supported_ta_list; t++) {
cJSON *ta = cJSON_CreateObject();
if (!ta) { inner_oom = true; break; }

View File

@@ -33,9 +33,8 @@ extern "C" {
#define ENB_INFO_PAGE_SIZE_DEFAULT 100U
#endif
size_t mme_dump_enb_info(char *buf, size_t buflen);
size_t mme_dump_enb_info(char *buf, size_t buflen, size_t page, size_t page_size);
size_t mme_dump_enb_info_paged(char *buf, size_t buflen, size_t page, size_t page_size);
void mme_metrics_enb_info_set_pager(size_t page, size_t page_size);
#ifdef __cplusplus
}

View File

@@ -31,7 +31,6 @@
#include "mme-gtp-path.h"
#include "metrics.h"
#include "metrics/prometheus/json_pager.h"
#include "metrics/prometheus/pager.h"
#include "enb-info.h"
#include "ue-info.h"
@@ -72,10 +71,8 @@ int mme_initialize(void)
ogs_metrics_context_open(ogs_metrics_self());
/* dumpers /enb-info /ue-info */
ogs_metrics_register_enb_info(mme_dump_enb_info);
ogs_metrics_register_ue_info(mme_dump_ue_info);
ogs_metrics_enb_info_set_pager = mme_metrics_enb_info_set_pager;
ogs_metrics_ue_info_set_pager = mme_metrics_ue_info_set_pager;
ogs_metrics_register_custom_ep(mme_dump_enb_info, "/enb-info");
ogs_metrics_register_custom_ep(mme_dump_ue_info, "/ue-info");
rv = mme_fd_init();
if (rv != OGS_OK) return OGS_ERROR;

View File

@@ -88,7 +88,6 @@
#include "ue-info.h"
#include "mme-context.h"
#include "metrics/prometheus/pager.h"
#include "metrics/prometheus/json_pager.h"
#include "metrics/ogs-metrics.h"
#include "sbi/openapi/external/cJSON.h"
@@ -97,20 +96,9 @@
#define MME_UE_INFO_PAGE_SIZE_DEFAULT 100U
#endif
static size_t g_ue_page = SIZE_MAX;
static size_t g_ue_page_size = 0;
void mme_metrics_ue_info_set_pager(size_t page, size_t page_size)
size_t mme_dump_ue_info(char *buf, size_t buflen, size_t page, size_t page_size)
{
g_ue_page = page;
g_ue_page_size = page_size;
}
size_t mme_dump_ue_info(char *buf, size_t buflen)
{
size_t page = g_ue_page;
size_t page_size = g_ue_page_size;
if (page == SIZE_MAX) {
page = 0;
page_size = MME_UE_INFO_PAGE_SIZE_DEFAULT;

View File

@@ -33,9 +33,10 @@ extern "C" {
#define UE_INFO_PAGE_SIZE_DEFAULT 100U
#endif
void mme_metrics_ue_info_set_pager(size_t page, size_t page_size);
size_t mme_dump_ue_info(char *buf, size_t buflen);
size_t mme_dump_ue_info_paged(char *buf, size_t buflen, size_t page, size_t page_size);
size_t mme_dump_ue_info(char *buf, size_t buflen,
size_t page, size_t page_size);
size_t mme_dump_ue_info_paged(char *buf, size_t buflen,
size_t page, size_t page_size);
#ifdef __cplusplus
}

View File

@@ -25,7 +25,6 @@
#include "metrics.h"
#include "ogs-metrics.h"
#include "metrics/prometheus/json_pager.h"
#include "metrics/prometheus/pager.h"
#include "pdu-info.h"
static ogs_thread_t *thread;
@@ -95,8 +94,7 @@ int smf_initialize(void)
if (!thread) return OGS_ERROR;
/* dumper /pdu-info */
ogs_metrics_register_pdu_info(smf_dump_pdu_info);
smf_register_metrics_pager();
ogs_metrics_register_custom_ep(smf_dump_pdu_info, "/pdu-info");
initialized = 1;

View File

@@ -67,23 +67,9 @@
#include "ogs-core.h"
#include "context.h"
#include "pdu-info.h"
#include "metrics/prometheus/pager.h"
#include "sbi/openapi/external/cJSON.h"
#include "metrics/prometheus/json_pager.h"
static size_t g_page = SIZE_MAX;
static size_t g_page_size = 0;
static void smf_metrics_pdu_info_set_pager(size_t page, size_t page_size)
{
g_page = page;
g_page_size = page_size;
}
void smf_register_metrics_pager(void)
{
ogs_metrics_pdu_info_set_pager = smf_metrics_pdu_info_set_pager;
}
static inline uint32_t u24_to_u32(ogs_uint24_t v)
{
@@ -393,11 +379,8 @@ size_t smf_dump_pdu_info_paged(char *buf, size_t buflen, size_t page, size_t pag
return json_pager_finalize(root, buf, buflen);
}
size_t smf_dump_pdu_info(char *buf, size_t buflen)
size_t smf_dump_pdu_info(char *buf, size_t buflen, size_t page, size_t page_size)
{
size_t page = g_page;
size_t page_size = g_page_size;
if (page == SIZE_MAX) {
page = 0;
page_size = PDU_INFO_PAGE_SIZE_DEFAULT;

View File

@@ -34,9 +34,10 @@ extern "C" {
#define PDU_INFO_PAGE_SIZE_DEFAULT 100U
#endif
void smf_register_metrics_pager(void);
size_t smf_dump_pdu_info(char *buf, size_t buflen);
size_t smf_dump_pdu_info_paged(char *buf, size_t buflen, size_t page, size_t page_size);
size_t smf_dump_pdu_info(char *buf, size_t buflen,
size_t page, size_t page_size);
size_t smf_dump_pdu_info_paged(char *buf, size_t buflen,
size_t page, size_t page_size);
#ifdef __cplusplus
}
#endif

View File

@@ -221,7 +221,15 @@ ogs_sbi_request_t *udm_nudr_dr_build_query_subscription_provisioned(
(char *)ogs_plmn_id_to_string(&udm_ue->guami.plmn_id, buf);
sendmsg.h.resource.component[3] =
(char *)OGS_SBI_RESOURCE_NAME_PROVISIONED_DATA;
sendmsg.h.resource.component[4] = recvmsg->h.resource.component[1];
if (recvmsg->h.resource.component[1]) {
sendmsg.h.resource.component[4] = recvmsg->h.resource.component[1];
} else if (recvmsg->param.num_of_dataset_names) {
int i;
for (i = 0; i < recvmsg->param.num_of_dataset_names; i++) {
sendmsg.param.dataset_names[i] = recvmsg->param.dataset_names[i];
sendmsg.param.num_of_dataset_names++;
}
}
SWITCH(recvmsg->h.resource.component[1])
CASE(OGS_SBI_RESOURCE_NAME_SM_DATA)

View File

@@ -622,6 +622,37 @@ bool udm_nudr_dr_handle_subscription_provisioned(
ogs_assert(recvmsg);
if (state == UDM_SBI_UE_PROVISIONED_DATASETS) {
OpenAPI_provisioned_data_sets_t *ProvisionedDataSets;
ProvisionedDataSets = recvmsg->ProvisionedDataSets;
if (!ProvisionedDataSets) {
ogs_error("[%s] No ProvisionedDataSets",
udm_ue->supi);
ogs_assert(true ==
ogs_sbi_server_send_error(
stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST,
recvmsg, "No ProvisionedDataSets",
udm_ue->supi, NULL));
return false;
}
memset(&sendmsg, 0, sizeof(sendmsg));
sendmsg.ProvisionedDataSets =
OpenAPI_provisioned_data_sets_copy(
sendmsg.ProvisionedDataSets,
recvmsg->ProvisionedDataSets);
response = ogs_sbi_build_response(&sendmsg, recvmsg->res_status);
ogs_assert(response);
ogs_assert(true == ogs_sbi_server_send_response(stream, response));
OpenAPI_provisioned_data_sets_free(sendmsg.ProvisionedDataSets);
return true;
}
SWITCH(recvmsg->h.resource.component[4])
CASE(OGS_SBI_RESOURCE_NAME_AM_DATA)
OpenAPI_access_and_mobility_subscription_data_t

View File

@@ -34,6 +34,7 @@ bool udm_sbi_send_request(
#define UDM_SBI_NO_STATE 0
#define UDM_SBI_UE_PROVISIONED_NSSAI_ONLY 1
#define UDM_SBI_UE_PROVISIONED_DATASETS 2
int udm_ue_sbi_discover_and_send(
ogs_sbi_service_type_e service_type,

View File

@@ -153,24 +153,26 @@ void udm_state_operational(ogs_fsm_t *s, udm_event_t *e)
break;
}
if (!message.h.resource.component[1]) {
ogs_error("Invalid resource name [%s]", message.h.method);
ogs_assert(true ==
ogs_sbi_server_send_error(stream,
OGS_SBI_HTTP_STATUS_BAD_REQUEST,
&message, "Invalid resource name", message.h.method,
NULL));
break;
}
SWITCH(message.h.resource.component[1])
CASE(OGS_SBI_RESOURCE_NAME_AUTH_EVENTS)
if (message.h.resource.component[2]) {
udm_ue = udm_ue_find_by_ctx_id(
message.h.resource.component[2]);
if (!message.param.num_of_dataset_names) {
if (!message.h.resource.component[1]) {
ogs_error("Invalid resource name [%s]", message.h.method);
ogs_assert(true ==
ogs_sbi_server_send_error(stream,
OGS_SBI_HTTP_STATUS_BAD_REQUEST,
&message, "Invalid resource name", message.h.method,
NULL));
break;
}
DEFAULT
END
SWITCH(message.h.resource.component[1])
CASE(OGS_SBI_RESOURCE_NAME_AUTH_EVENTS)
if (message.h.resource.component[2]) {
udm_ue = udm_ue_find_by_ctx_id(
message.h.resource.component[2]);
}
DEFAULT
END
}
if (!udm_ue) {
udm_ue = udm_ue_find_by_suci_or_supi(

View File

@@ -189,6 +189,17 @@ void udm_ue_state_operational(ogs_fsm_t *s, udm_event_t *e)
CASE(OGS_SBI_SERVICE_NAME_NUDM_SDM)
SWITCH(message->h.method)
CASE(OGS_SBI_HTTP_METHOD_GET)
if (message->param.num_of_dataset_names &&
!message->h.resource.component[1]) {
r = udm_ue_sbi_discover_and_send(
OGS_SBI_SERVICE_TYPE_NUDR_DR, NULL,
udm_nudr_dr_build_query_subscription_provisioned,
udm_ue, stream, UDM_SBI_UE_PROVISIONED_DATASETS,
message);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
break;
}
SWITCH(message->h.resource.component[1])
CASE(OGS_SBI_RESOURCE_NAME_AM_DATA)
CASE(OGS_SBI_RESOURCE_NAME_SMF_SELECT_DATA)

File diff suppressed because it is too large Load Diff