open5gs/lib/app/ogs-context.c

540 lines
22 KiB
C
Raw Normal View History

/*
* Copyright (C) 2019 by Sukchan Lee <acetcom@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/>.
*/
2019-09-13 12:07:47 +00:00
#include "ogs-app.h"
2019-04-27 14:54:30 +00:00
static ogs_app_context_t self;
2019-06-07 23:44:22 +00:00
2019-09-13 12:07:47 +00:00
static int initialized = 0;
2019-04-27 14:54:30 +00:00
2020-09-02 03:04:35 +00:00
static void app_context_prepare(void);
int ogs_app_context_init(void)
2019-04-27 14:54:30 +00:00
{
2019-09-13 12:07:47 +00:00
ogs_assert(initialized == 0);
2019-04-27 14:54:30 +00:00
memset(&self, 0, sizeof(ogs_app_context_t));
2019-04-27 14:54:30 +00:00
2020-09-02 03:04:35 +00:00
app_context_prepare();
2019-09-13 12:07:47 +00:00
initialized = 1;
2019-04-27 14:54:30 +00:00
return OGS_OK;
}
void ogs_app_context_final(void)
2019-04-27 14:54:30 +00:00
{
2019-09-13 12:07:47 +00:00
ogs_assert(initialized == 1);
2019-04-27 14:54:30 +00:00
2019-09-13 12:07:47 +00:00
if (self.document) {
yaml_document_delete(self.document);
free(self.document);
2019-04-27 14:54:30 +00:00
}
if (self.pollset)
ogs_pollset_destroy(self.pollset);
if (self.timer_mgr)
ogs_timer_mgr_destroy(self.timer_mgr);
if (self.queue)
ogs_queue_destroy(self.queue);
2019-04-27 14:54:30 +00:00
initialized = 0;
2019-04-27 14:54:30 +00:00
}
ogs_app_context_t *ogs_app()
2019-04-27 14:54:30 +00:00
{
return &self;
}
static void recalculate_pool_size(void)
2019-04-27 14:54:30 +00:00
{
self.pool.packet = self.max.ue * OGS_MAX_NUM_OF_PACKET_BUFFER;
#define MAX_NUM_OF_TUNNEL 3 /* Num of Tunnel per Bearer */
self.pool.sess = self.max.ue * OGS_MAX_NUM_OF_SESS;
self.pool.bearer = self.pool.sess * OGS_MAX_NUM_OF_BEARER;
self.pool.tunnel = self.pool.bearer * MAX_NUM_OF_TUNNEL;
2019-04-27 14:54:30 +00:00
#define POOL_NUM_PER_UE 16
self.pool.timer = self.max.ue * POOL_NUM_PER_UE;
self.pool.message = self.max.ue * POOL_NUM_PER_UE;
self.pool.event = self.max.ue * POOL_NUM_PER_UE;
self.pool.socket = self.max.ue * POOL_NUM_PER_UE;
self.pool.subscription = self.max.ue * POOL_NUM_PER_UE;
self.pool.xact = self.max.ue * POOL_NUM_PER_UE;
2022-08-10 02:03:10 +00:00
self.pool.stream = self.max.ue * POOL_NUM_PER_UE;
2019-04-27 14:54:30 +00:00
self.pool.nf = self.max.peer;
#define NF_SERVICE_PER_NF_INSTANCE 16
self.pool.nf_service = self.pool.nf * NF_SERVICE_PER_NF_INSTANCE;
self.pool.gtp_node = self.pool.nf;
if (self.max.gtp_peer)
self.pool.gtp_node = self.max.gtp_peer;
/* Num of TAI-LAI Mapping Table */
self.pool.csmap = self.pool.nf;
2021-04-05 08:09:39 +00:00
#define MAX_NUM_OF_IMPU 8
self.pool.impi = self.max.ue;
self.pool.impu = self.pool.impi * MAX_NUM_OF_IMPU;
2019-06-07 23:44:22 +00:00
}
2020-07-27 01:02:40 +00:00
static void regenerate_all_timer_duration(void)
{
ogs_assert(self.time.message.duration);
self.time.message.sbi.client_wait_duration = self.time.message.duration;
self.time.message.sbi.connection_deadline =
2020-07-27 01:02:40 +00:00
self.time.message.sbi.client_wait_duration + ogs_time_from_sec(1);
self.time.message.sbi.nf_register_interval =
ogs_max(ogs_time_from_sec(3),
self.time.message.sbi.client_wait_duration + ogs_time_from_sec(1));
self.time.message.sbi.nf_register_interval_in_exception =
ogs_time_from_sec(2);
2020-07-27 01:02:40 +00:00
#define PFCP_N1_RESPONSE_RETRY_COUNT 3
self.time.message.pfcp.n1_response_rcount = PFCP_N1_RESPONSE_RETRY_COUNT;
self.time.message.pfcp.t1_response_duration =
(self.time.message.duration /
(self.time.message.pfcp.n1_response_rcount + 1));
ogs_assert(self.time.message.pfcp.t1_response_duration);
#define PFCP_N1_HOLDING_RETRY_COUNT 1
self.time.message.pfcp.n1_holding_rcount = PFCP_N1_HOLDING_RETRY_COUNT;
self.time.message.pfcp.t1_holding_duration =
self.time.message.pfcp.n1_response_rcount *
self.time.message.pfcp.t1_response_duration;
ogs_assert(self.time.message.pfcp.t1_holding_duration);
self.time.message.pfcp.association_interval =
ogs_max(ogs_time_from_sec(3),
self.time.message.sbi.client_wait_duration + ogs_time_from_sec(1));
self.time.message.pfcp.no_heartbeat_duration =
ogs_max(ogs_time_from_sec(10),
self.time.message.sbi.client_wait_duration + ogs_time_from_sec(1));
#define GTP_N3_RESPONSE_RETRY_COUNT 3
self.time.message.gtp.n3_response_rcount = GTP_N3_RESPONSE_RETRY_COUNT;
self.time.message.gtp.t3_response_duration =
(self.time.message.duration /
(self.time.message.gtp.n3_response_rcount + 1));
ogs_assert(self.time.message.gtp.t3_response_duration);
#define GTP_N3_HOLDING_RETRY_COUNT 1
self.time.message.gtp.n3_holding_rcount = GTP_N3_HOLDING_RETRY_COUNT;
self.time.message.gtp.t3_holding_duration =
self.time.message.gtp.n3_response_rcount *
self.time.message.gtp.t3_response_duration;
ogs_assert(self.time.message.gtp.t3_holding_duration);
2020-10-05 18:06:17 +00:00
#if 0
ogs_trace("%lld, %lld, %lld, %d, %lld, %d %lld, %d, %lld, %d, %lld",
(long long)self.time.message.duration,
(long long)self.time.message.sbi.client_wait_duration,
(long long)self.time.message.sbi.connection_deadline,
self.time.message.pfcp.n1_response_rcount,
(long long)self.time.message.pfcp.t1_response_duration,
self.time.message.pfcp.n1_holding_rcount,
(long long)self.time.message.pfcp.t1_holding_duration,
self.time.message.gtp.n3_response_rcount,
(long long)self.time.message.gtp.t3_response_duration,
self.time.message.gtp.n3_holding_rcount,
(long long)self.time.message.gtp.t3_holding_duration);
ogs_trace("%lld, %lld, %lld",
(long long)self.time.message.sbi.nf_register_interval,
(long long)self.time.message.pfcp.association_interval,
(long long)self.time.message.pfcp.no_heartbeat_duration);
#endif
2020-07-27 01:02:40 +00:00
}
2020-09-02 03:04:35 +00:00
static void app_context_prepare(void)
2019-04-27 14:54:30 +00:00
{
#define USRSCTP_LOCAL_UDP_PORT 9899
2019-09-13 12:07:47 +00:00
self.usrsctp.udp_port = USRSCTP_LOCAL_UDP_PORT;
self.sockopt.no_delay = true;
#define MAX_NUM_OF_UE 1024 /* Num of UEs */
#define MAX_NUM_OF_PEER 64 /* Num of Peer */
2020-05-25 16:15:22 +00:00
2019-09-13 12:07:47 +00:00
self.max.ue = MAX_NUM_OF_UE;
self.max.peer = MAX_NUM_OF_PEER;
2019-09-13 12:07:47 +00:00
ogs_pkbuf_default_init(&self.pool.defconfig);
2019-06-07 23:44:22 +00:00
2019-09-13 12:07:47 +00:00
recalculate_pool_size();
/* <Heartbeat Checking Interval>
* Heartbeat Interval(e.g: 10 seconds) + No Heartbeat Margin(1 second) */
2020-07-27 01:02:40 +00:00
self.time.nf_instance.no_heartbeat_margin = 1;
/* 3600 seconds = 1 hour */
self.time.nf_instance.validity_duration = 3600;
/* 86400 seconds = 1 day */
self.time.subscription.validity_duration = 86400;
2020-11-07 22:27:12 +00:00
/*
* Message Wait Duration : 10 seconds (Default)
*
* The paging retry timer is 2 seconds and the retry count is 3.
*
* It is recomended to set at least 9 seconds to reflect
* the paging failure result to GTPv2-C or HTTP2(SBI).
*/
self.time.message.duration = ogs_time_from_sec(10);
2020-07-27 01:02:40 +00:00
/*
* Handover Wait Duration : 300 ms (Default)
*
* Time to wait for AMF/MME to send UEContextReleaseCommand
* to the source gNB/eNB after receiving HandoverNotify
*/
self.time.handover.duration = ogs_time_from_msec(300);
Initial metrics support based on Prometheus (#1571) * Initial metrics support based on Prometheus This commit introduces initial support for metrics in open5gs. The metrics code is added as libogsmetrics (lib/metrics/), with a well defined opaque API to manage different types of metrics, allowing for different implementations for different technologies to scrap the metrics (placed as lib/metrics/<impl>/. The implementation is right now selected at build time, in order to be able to opt-out the related dependencies for users not interested in the features. 2 implementations are already provided in this commit to start with: * void: Default implementation. Empty stubs, acts as a NOOP. * prometheus: open5gs processes become Prometheus servers, offering states through an http server to the Prometheus scrappers. Relies on libprom (prometheus-client-ci [1] project) to track the metrics and format them during export, and libmicrohttpd to make the export possible through HTTP. [1] https://github.com/digitalocean/prometheus-client-c The prometheus-client-c is not well maintained nowadays in upstream, and furthermore it uses a quite peculiar mixture of build systems (autolib on the main dir, cmake for libprom in a subdir). This makes it difficult to have it widely available in distros, and difficult to find it if it is installed in the system. Hence, the best is to include it as a meson subproject like we already do for freeDiameter. An open5gs fork is requried in order to have an extra patch adding a top-level CMakeList.txt in order to be able to includ eit from open5gs's meson build. Furthermore, this allows adding bugfixes to the subproject if any are found in the future. * [SMF] Initial metrics support * [SMF] Add metrics at gtp_node level * docs: Add tutorial documenting metrics with Prometheus
2022-06-07 20:51:02 +00:00
/* Size of internal metrics pool (amount of ogs_metrics_spec_t) */
self.metrics.max_specs = 512;
2020-07-27 01:02:40 +00:00
regenerate_all_timer_duration();
2019-04-27 14:54:30 +00:00
}
Initial metrics support based on Prometheus (#1571) * Initial metrics support based on Prometheus This commit introduces initial support for metrics in open5gs. The metrics code is added as libogsmetrics (lib/metrics/), with a well defined opaque API to manage different types of metrics, allowing for different implementations for different technologies to scrap the metrics (placed as lib/metrics/<impl>/. The implementation is right now selected at build time, in order to be able to opt-out the related dependencies for users not interested in the features. 2 implementations are already provided in this commit to start with: * void: Default implementation. Empty stubs, acts as a NOOP. * prometheus: open5gs processes become Prometheus servers, offering states through an http server to the Prometheus scrappers. Relies on libprom (prometheus-client-ci [1] project) to track the metrics and format them during export, and libmicrohttpd to make the export possible through HTTP. [1] https://github.com/digitalocean/prometheus-client-c The prometheus-client-c is not well maintained nowadays in upstream, and furthermore it uses a quite peculiar mixture of build systems (autolib on the main dir, cmake for libprom in a subdir). This makes it difficult to have it widely available in distros, and difficult to find it if it is installed in the system. Hence, the best is to include it as a meson subproject like we already do for freeDiameter. An open5gs fork is requried in order to have an extra patch adding a top-level CMakeList.txt in order to be able to includ eit from open5gs's meson build. Furthermore, this allows adding bugfixes to the subproject if any are found in the future. * [SMF] Initial metrics support * [SMF] Add metrics at gtp_node level * docs: Add tutorial documenting metrics with Prometheus
2022-06-07 20:51:02 +00:00
static int app_context_validation(void)
2019-04-27 14:54:30 +00:00
{
2019-09-13 12:07:47 +00:00
if (self.parameter.no_ipv4 == 1 &&
self.parameter.no_ipv6 == 1) {
2019-04-27 14:54:30 +00:00
ogs_error("Both `no_ipv4` and `no_ipv6` set to `true` in `%s`",
2019-09-13 12:07:47 +00:00
self.file);
2019-04-27 14:54:30 +00:00
return OGS_ERROR;
}
2020-07-27 01:02:40 +00:00
if (self.time.nf_instance.validity_duration == 0) {
2020-05-18 21:00:37 +00:00
ogs_error("NF Instance validity-time should not 0");
ogs_error("time:");
ogs_error(" nf_instance:");
ogs_error(" validity: 0");
return OGS_ERROR;
}
2019-04-27 14:54:30 +00:00
return OGS_OK;
}
int ogs_app_context_parse_config(void)
2019-04-27 14:54:30 +00:00
{
int rv;
yaml_document_t *document = NULL;
ogs_yaml_iter_t root_iter;
document = self.document;
2019-04-27 14:54:30 +00:00
ogs_assert(document);
ogs_yaml_iter_init(&root_iter, document);
2019-05-31 02:20:30 +00:00
while (ogs_yaml_iter_next(&root_iter)) {
2019-04-27 14:54:30 +00:00
const char *root_key = ogs_yaml_iter_key(&root_iter);
ogs_assert(root_key);
2019-05-31 02:20:30 +00:00
if (!strcmp(root_key, "db_uri")) {
2019-09-13 12:07:47 +00:00
self.db_uri = ogs_yaml_iter_value(&root_iter);
} else if (!strcmp(root_key, "db_json")) {
ogs_yaml_iter_t dbjson_iter;
ogs_yaml_iter_recurse(&root_iter, &dbjson_iter);
int apns = 0;
while (ogs_yaml_iter_next(&dbjson_iter)) {
const char *apn = ogs_yaml_iter_key(&dbjson_iter);
const char *apn_filepath;
if (apns >= OGS_APP_DB_JSON_MAX_APNS) {
ogs_error("db_json: too many apns defined!");
return OGS_ERROR;
}
ogs_assert(apn);
apn_filepath = ogs_yaml_iter_value(&dbjson_iter);
ogs_assert(apn_filepath);
self.db_json[apns].apn = apn;
self.db_json[apns].filepath = apn_filepath;
apns++;
}
2019-05-31 07:33:09 +00:00
} else if (!strcmp(root_key, "logger")) {
2019-04-27 14:54:30 +00:00
ogs_yaml_iter_t logger_iter;
ogs_yaml_iter_recurse(&root_iter, &logger_iter);
2019-05-31 02:20:30 +00:00
while (ogs_yaml_iter_next(&logger_iter)) {
2019-04-27 14:54:30 +00:00
const char *logger_key = ogs_yaml_iter_key(&logger_iter);
ogs_assert(logger_key);
2019-05-31 02:20:30 +00:00
if (!strcmp(logger_key, "file")) {
2019-09-13 12:07:47 +00:00
self.logger.file = ogs_yaml_iter_value(&logger_iter);
2019-05-31 07:33:09 +00:00
} else if (!strcmp(logger_key, "level")) {
2019-09-13 12:07:47 +00:00
self.logger.level =
2019-04-27 14:54:30 +00:00
ogs_yaml_iter_value(&logger_iter);
2019-05-31 07:33:09 +00:00
} else if (!strcmp(logger_key, "domain")) {
2019-09-13 12:07:47 +00:00
self.logger.domain =
2019-04-27 14:54:30 +00:00
ogs_yaml_iter_value(&logger_iter);
}
}
2019-05-31 07:33:09 +00:00
} else if (!strcmp(root_key, "parameter")) {
2019-04-27 14:54:30 +00:00
ogs_yaml_iter_t parameter_iter;
ogs_yaml_iter_recurse(&root_iter, &parameter_iter);
2019-05-31 02:20:30 +00:00
while (ogs_yaml_iter_next(&parameter_iter)) {
2019-04-27 14:54:30 +00:00
const char *parameter_key = ogs_yaml_iter_key(&parameter_iter);
ogs_assert(parameter_key);
2019-05-31 07:33:09 +00:00
if (!strcmp(parameter_key, "no_hss")) {
2019-09-13 12:07:47 +00:00
self.parameter.no_hss =
2019-04-27 14:54:30 +00:00
ogs_yaml_iter_bool(&parameter_iter);
2020-08-13 00:31:22 +00:00
} else if (!strcmp(parameter_key, "no_mme")) {
self.parameter.no_mme =
ogs_yaml_iter_bool(&parameter_iter);
} else if (!strcmp(parameter_key, "no_sgwu")) {
self.parameter.no_sgwu =
ogs_yaml_iter_bool(&parameter_iter);
} else if (!strcmp(parameter_key, "no_sgwc")) {
self.parameter.no_sgwc =
ogs_yaml_iter_bool(&parameter_iter);
2019-05-31 02:20:30 +00:00
} else if (!strcmp(parameter_key, "no_sgw")) {
2019-09-13 12:07:47 +00:00
self.parameter.no_sgw =
2019-04-27 14:54:30 +00:00
ogs_yaml_iter_bool(&parameter_iter);
2019-05-31 02:20:30 +00:00
} else if (!strcmp(parameter_key, "no_pgw")) {
2019-09-13 12:07:47 +00:00
self.parameter.no_pgw =
2019-04-27 14:54:30 +00:00
ogs_yaml_iter_bool(&parameter_iter);
2019-05-31 02:20:30 +00:00
} else if (!strcmp(parameter_key, "no_pcrf")) {
2019-09-13 12:07:47 +00:00
self.parameter.no_pcrf =
2019-04-27 14:54:30 +00:00
ogs_yaml_iter_bool(&parameter_iter);
2020-07-04 03:14:48 +00:00
} else if (!strcmp(parameter_key, "no_nrf")) {
self.parameter.no_nrf =
ogs_yaml_iter_bool(&parameter_iter);
} else if (!strcmp(parameter_key, "no_scp")) {
self.parameter.no_scp =
ogs_yaml_iter_bool(&parameter_iter);
2020-07-04 03:14:48 +00:00
} else if (!strcmp(parameter_key, "no_amf")) {
self.parameter.no_amf =
2020-06-04 18:12:05 +00:00
ogs_yaml_iter_bool(&parameter_iter);
} else if (!strcmp(parameter_key, "no_smf")) {
self.parameter.no_smf =
ogs_yaml_iter_bool(&parameter_iter);
2020-07-04 03:14:48 +00:00
} else if (!strcmp(parameter_key, "no_upf")) {
self.parameter.no_upf =
ogs_yaml_iter_bool(&parameter_iter);
2020-06-04 18:12:05 +00:00
} else if (!strcmp(parameter_key, "no_ausf")) {
self.parameter.no_ausf =
ogs_yaml_iter_bool(&parameter_iter);
} else if (!strcmp(parameter_key, "no_udm")) {
self.parameter.no_udm =
ogs_yaml_iter_bool(&parameter_iter);
2020-12-11 19:03:20 +00:00
} else if (!strcmp(parameter_key, "no_pcf")) {
self.parameter.no_pcf =
ogs_yaml_iter_bool(&parameter_iter);
2021-03-15 01:01:55 +00:00
} else if (!strcmp(parameter_key, "no_nssf")) {
self.parameter.no_nssf =
ogs_yaml_iter_bool(&parameter_iter);
} else if (!strcmp(parameter_key, "no_bsf")) {
self.parameter.no_bsf =
ogs_yaml_iter_bool(&parameter_iter);
2020-06-04 18:12:05 +00:00
} else if (!strcmp(parameter_key, "no_udr")) {
self.parameter.no_udr =
ogs_yaml_iter_bool(&parameter_iter);
2019-05-31 02:20:30 +00:00
} else if (!strcmp(parameter_key, "no_ipv4")) {
2019-09-13 12:07:47 +00:00
self.parameter.no_ipv4 =
2019-04-27 14:54:30 +00:00
ogs_yaml_iter_bool(&parameter_iter);
2019-05-31 02:20:30 +00:00
} else if (!strcmp(parameter_key, "no_ipv6")) {
2019-09-13 12:07:47 +00:00
self.parameter.no_ipv6 =
2019-04-27 14:54:30 +00:00
ogs_yaml_iter_bool(&parameter_iter);
2019-05-31 02:20:30 +00:00
} else if (!strcmp(parameter_key, "prefer_ipv4")) {
2019-09-13 12:07:47 +00:00
self.parameter.prefer_ipv4 =
2019-04-27 14:54:30 +00:00
ogs_yaml_iter_bool(&parameter_iter);
2019-05-31 02:20:30 +00:00
} else if (!strcmp(parameter_key, "multicast")) {
2019-09-13 12:07:47 +00:00
self.parameter.multicast =
2019-04-27 14:54:30 +00:00
ogs_yaml_iter_bool(&parameter_iter);
} else if (!strcmp(parameter_key, "use_openair")) {
self.parameter.use_openair =
ogs_yaml_iter_bool(&parameter_iter);
} else if (!strcmp(
parameter_key, "no_ipv4v6_local_addr_in_packet_filter")) {
self.parameter.no_ipv4v6_local_addr_in_packet_filter =
ogs_yaml_iter_bool(&parameter_iter);
} else if (!strcmp(parameter_key, "no_pfcp_rr_select")) {
self.parameter.no_pfcp_rr_select =
ogs_yaml_iter_bool(&parameter_iter);
2019-05-31 02:20:30 +00:00
} else
2019-04-27 14:54:30 +00:00
ogs_warn("unknown key `%s`", parameter_key);
}
} else if (!strcmp(root_key, "sockopt")) {
ogs_yaml_iter_t sockopt_iter;
ogs_yaml_iter_recurse(&root_iter, &sockopt_iter);
while (ogs_yaml_iter_next(&sockopt_iter)) {
const char *sockopt_key = ogs_yaml_iter_key(&sockopt_iter);
ogs_assert(sockopt_key);
if (!strcmp(sockopt_key, "no_delay")) {
self.sockopt.no_delay =
ogs_yaml_iter_bool(&sockopt_iter);
} else if (!strcmp(sockopt_key, "linger")) {
const char *v = ogs_yaml_iter_value(&sockopt_iter);
if (v) self.sockopt.l_linger = atoi(v);
self.sockopt.l_onoff = true;
} else
ogs_warn("unknown key `%s`", sockopt_key);
}
} else if (!strcmp(root_key, "max")) {
ogs_yaml_iter_t max_iter;
ogs_yaml_iter_recurse(&root_iter, &max_iter);
while (ogs_yaml_iter_next(&max_iter)) {
const char *max_key = ogs_yaml_iter_key(&max_iter);
ogs_assert(max_key);
if (!strcmp(max_key, "ue")) {
const char *v = ogs_yaml_iter_value(&max_iter);
2019-09-13 12:07:47 +00:00
if (v) self.max.ue = atoi(v);
} else if (!strcmp(max_key, "peer") ||
!strcmp(max_key, "enb")) {
const char *v = ogs_yaml_iter_value(&max_iter);
if (v) self.max.peer = atoi(v);
} else if (!strcmp(max_key, "gtp_peer") ||
2020-05-25 16:15:22 +00:00
!strcmp(max_key, "enb")) {
const char *v = ogs_yaml_iter_value(&max_iter);
if (v) self.max.gtp_peer = atoi(v);
} else
ogs_warn("unknown key `%s`", max_key);
}
2019-06-07 23:44:22 +00:00
2019-09-13 12:07:47 +00:00
recalculate_pool_size();
} else if (!strcmp(root_key, "pool")) {
ogs_yaml_iter_t pool_iter;
ogs_yaml_iter_recurse(&root_iter, &pool_iter);
while (ogs_yaml_iter_next(&pool_iter)) {
const char *pool_key = ogs_yaml_iter_key(&pool_iter);
ogs_assert(pool_key);
if (!strcmp(pool_key, "128")) {
const char *v = ogs_yaml_iter_value(&pool_iter);
if (v)
self.pool.defconfig.cluster_128_pool = atoi(v);
} else if (!strcmp(pool_key, "256")) {
const char *v = ogs_yaml_iter_value(&pool_iter);
if (v)
self.pool.defconfig.cluster_256_pool = atoi(v);
} else if (!strcmp(pool_key, "512")) {
const char *v = ogs_yaml_iter_value(&pool_iter);
if (v)
self.pool.defconfig.cluster_512_pool = atoi(v);
} else if (!strcmp(pool_key, "1024")) {
const char *v = ogs_yaml_iter_value(&pool_iter);
if (v)
self.pool.defconfig.cluster_1024_pool = atoi(v);
} else if (!strcmp(pool_key, "2048")) {
const char *v = ogs_yaml_iter_value(&pool_iter);
if (v)
self.pool.defconfig.cluster_2048_pool = atoi(v);
} else if (!strcmp(pool_key, "8192")) {
const char *v = ogs_yaml_iter_value(&pool_iter);
if (v)
self.pool.defconfig.cluster_8192_pool = atoi(v);
} else if (!strcmp(pool_key, "big")) {
const char *v = ogs_yaml_iter_value(&pool_iter);
if (v)
self.pool.defconfig.cluster_big_pool = atoi(v);
} else
ogs_warn("unknown key `%s`", pool_key);
}
2020-05-18 21:00:37 +00:00
} else if (!strcmp(root_key, "time")) {
ogs_yaml_iter_t time_iter;
ogs_yaml_iter_recurse(&root_iter, &time_iter);
while (ogs_yaml_iter_next(&time_iter)) {
const char *time_key = ogs_yaml_iter_key(&time_iter);
ogs_assert(time_key);
if (!strcmp(time_key, "nf_instance")) {
ogs_yaml_iter_t sbi_iter;
ogs_yaml_iter_recurse(&time_iter, &sbi_iter);
while (ogs_yaml_iter_next(&sbi_iter)) {
const char *sbi_key =
ogs_yaml_iter_key(&sbi_iter);
ogs_assert(sbi_key);
if (!strcmp(sbi_key, "heartbeat")) {
const char *v = ogs_yaml_iter_value(&sbi_iter);
2020-07-27 01:02:40 +00:00
if (v) self.time.nf_instance.heartbeat_interval =
atoi(v);
2020-05-18 21:00:37 +00:00
} else if (!strcmp(sbi_key, "validity")) {
const char *v = ogs_yaml_iter_value(&sbi_iter);
2020-07-27 01:02:40 +00:00
if (v) self.time.nf_instance.validity_duration =
atoi(v);
2020-05-18 21:00:37 +00:00
} else
ogs_warn("unknown key `%s`", sbi_key);
}
} else if (!strcmp(time_key, "subscription")) {
ogs_yaml_iter_t sbi_iter;
ogs_yaml_iter_recurse(&time_iter, &sbi_iter);
while (ogs_yaml_iter_next(&sbi_iter)) {
const char *sbi_key =
ogs_yaml_iter_key(&sbi_iter);
ogs_assert(sbi_key);
if (!strcmp(sbi_key, "validity")) {
const char *v = ogs_yaml_iter_value(&sbi_iter);
2020-07-27 01:02:40 +00:00
if (v) self.time.subscription.validity_duration =
atoi(v);
2020-05-18 21:00:37 +00:00
} else
ogs_warn("unknown key `%s`", sbi_key);
}
2020-07-27 01:02:40 +00:00
} else if (!strcmp(time_key, "message")) {
ogs_yaml_iter_t msg_iter;
ogs_yaml_iter_recurse(&time_iter, &msg_iter);
while (ogs_yaml_iter_next(&msg_iter)) {
const char *msg_key =
ogs_yaml_iter_key(&msg_iter);
ogs_assert(msg_key);
if (!strcmp(msg_key, "duration")) {
const char *v = ogs_yaml_iter_value(&msg_iter);
if (v) {
self.time.message.duration =
2020-07-27 01:02:40 +00:00
ogs_time_from_msec(atoll(v));
regenerate_all_timer_duration();
}
} else
ogs_warn("unknown key `%s`", msg_key);
}
} else if (!strcmp(time_key, "handover")) {
ogs_yaml_iter_t msg_iter;
ogs_yaml_iter_recurse(&time_iter, &msg_iter);
while (ogs_yaml_iter_next(&msg_iter)) {
const char *msg_key =
ogs_yaml_iter_key(&msg_iter);
ogs_assert(msg_key);
if (!strcmp(msg_key, "duration")) {
const char *v = ogs_yaml_iter_value(&msg_iter);
if (v) {
self.time.handover.duration =
ogs_time_from_msec(atoll(v));
}
} else
ogs_warn("unknown key `%s`", msg_key);
}
2020-05-18 21:00:37 +00:00
} else
ogs_warn("unknown key `%s`", time_key);
}
2019-04-27 14:54:30 +00:00
}
}
rv = app_context_validation();
2019-04-27 14:54:30 +00:00
if (rv != OGS_OK) return rv;
return OGS_OK;
}