mirror of
https://github.com/open5gs/open5gs.git
synced 2025-10-22 23:31:57 +00:00
Compare commits
5 Commits
fd897f35a3
...
b7cd0d6a7c
Author | SHA1 | Date | |
---|---|---|---|
|
b7cd0d6a7c | ||
|
a90544f312 | ||
|
2434f1e4f1 | ||
|
40351e5a38 | ||
|
37c74da44f |
@@ -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);
|
||||
}
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
}
|
||||
|
@@ -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 */
|
||||
|
@@ -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 */
|
||||
|
@@ -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) {
|
||||
|
@@ -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;
|
||||
|
@@ -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"
|
||||
|
||||
|
@@ -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;
|
||||
}
|
||||
|
@@ -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);
|
||||
|
@@ -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.
|
||||
|
@@ -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; }
|
||||
|
||||
|
@@ -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
|
||||
}
|
||||
|
@@ -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;
|
||||
|
@@ -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; }
|
||||
|
@@ -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
|
||||
}
|
||||
|
@@ -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; }
|
||||
|
||||
|
@@ -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
|
||||
}
|
||||
|
@@ -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;
|
||||
|
@@ -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;
|
||||
|
@@ -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
|
||||
}
|
||||
|
@@ -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;
|
||||
|
||||
|
@@ -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;
|
||||
|
@@ -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
|
||||
|
@@ -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)
|
||||
|
@@ -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
|
||||
|
@@ -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,
|
||||
|
@@ -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(
|
||||
|
@@ -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
Reference in New Issue
Block a user