#include "core/context.h"
#include "core/session.h"
#include "core/xpath.h"
+#include "core/datastore/schema.h"
#include "core/datastore/populate.h"
#include "core/faults/faults.h"
#include "features/manual_notification/manual_notification.h"
#include "features/netconf_call_home/netconf_call_home.h"
#include "features/web_cut_through/web_cut_through.h"
+#include "features/ves_o1_pnf_registration/ves_o1_pnf_registration.h"
#include "app_common.h"
+#include "nf_oran_du.h"
#define NF_FUNCTION_CONTROL_BUFFER_LENGTH 32
static int network_function_faults_clear_cb(sr_session_ctx_t *session, const char *path, const sr_val_t *input, const size_t input_cnt, sr_event_t event, uint32_t request_id, sr_val_t **output, size_t *output_cnt, void *private_data);
static int network_function_faults_change_cb(sr_session_ctx_t *session, const char *module_name, const char *xpath, sr_event_t event, uint32_t request_id, void *private_data);
static int network_function_faults_count_get_items_cb(sr_session_ctx_t *session, const char *module_name, const char *xpath, const char *request_xpath, uint32_t request_id, struct lyd_node **parent, void *private_data);
-
-static int network_function_started_features_get_items_cb(sr_session_ctx_t *session, const char *module_name, const char *xpath, const char *request_xpath, uint32_t request_id, struct lyd_node **parent, void *private_data);
+static int network_function_info_get_items_cb(sr_session_ctx_t *session, const char *module_name, const char *xpath, const char *request_xpath, uint32_t request_id, struct lyd_node **parent, void *private_data);
static int network_function_change_cb(sr_session_ctx_t *session, const char *module_name, const char *xpath, sr_event_t event, uint32_t request_id, void *private_data);
}
//ietf-netconf-monitoring schemas populate with modules and submodules (overwrite default Netopeer2 behaviour)
- rc = sr_oper_get_items_subscribe(session_running, IETF_NETCONF_MONITORING_MODULE, IETF_NETCONF_MONITORING_STATE_SCHEMAS_SCHEMA_XPATH, netconf_monitoring_state_schemas_cb, 0, SR_SUBSCR_DEFAULT, &session_subscription);
+ rc = sr_oper_get_items_subscribe(session_running, IETF_NETCONF_MONITORING_MODULE, IETF_NETCONF_MONITORING_STATE_SCHEMAS_SCHEMA_XPATH, netconf_monitoring_state_schemas_cb, 0, SR_SUBSCR_CTX_REUSE, &session_subscription);
if(rc != SR_ERR_OK) {
log_error("error from sr_oper_get_items_subscribe: %s\n", sr_strerror(rc));
return 0;
}
//nc-notifications overwrite
- rc = sr_oper_get_items_subscribe(session_running, NC_NOTIFICATIONS_MODULE, NC_NOTIFICATIONS_STREAMS_SCHEMA_XPATH, notifications_streams_cb, 0, SR_SUBSCR_DEFAULT, &session_subscription);
+ rc = sr_oper_get_items_subscribe(session_running, NC_NOTIFICATIONS_MODULE, NC_NOTIFICATIONS_STREAMS_SCHEMA_XPATH, notifications_streams_cb, 0, SR_SUBSCR_CTX_REUSE, &session_subscription);
if(rc != SR_ERR_OK) {
log_error("error from sr_oper_get_items_subscribe: %s\n", sr_strerror(rc));
return 0;
rc = sr_module_change_subscribe(session_running, NTS_NETWORK_FUNCTION_MODULE, NTS_NF_FAULT_GENERATION_SCHEMA_XPATH, network_function_faults_change_cb, NULL, 0, SR_SUBSCR_CTX_REUSE, &session_subscription);
if(rc != SR_ERR_OK) {
log_error("could not subscribe to faults");
- return 0;
+ return NTS_ERR_FAILED;
}
rc = sr_oper_get_items_subscribe(session_running, NTS_NETWORK_FUNCTION_MODULE, NTS_NF_FAULT_COUNT_LIST_SCHEMA_XPATH, network_function_faults_count_get_items_cb, NULL, SR_SUBSCR_CTX_REUSE, &session_subscription);
if(rc != SR_ERR_OK) {
log_error("could not subscribe to oper faults: %s\n", sr_strerror(rc));
- return 0;
+ return NTS_ERR_FAILED;
}
rc = sr_rpc_subscribe(session_running, NTS_NF_RPC_FAULTS_CLEAR_SCHEMA_XPATH, network_function_faults_clear_cb, 0, 0, SR_SUBSCR_CTX_REUSE, &session_subscription);
return NTS_ERR_FAILED;
}
- rc = sr_oper_get_items_subscribe(session_running, NTS_NETWORK_FUNCTION_MODULE, NTS_NF_INFO_STARTED_FEATURES_SCHEMA_XPATH, network_function_started_features_get_items_cb, NULL, SR_SUBSCR_CTX_REUSE, &session_subscription);
+ rc = sr_oper_get_items_subscribe(session_running, NTS_NETWORK_FUNCTION_MODULE, NTS_NF_INFO_SCHEMA_XPATH, network_function_info_get_items_cb, NULL, SR_SUBSCR_CTX_REUSE | SR_SUBSCR_OPER_MERGE, &session_subscription);
if(rc != SR_ERR_OK) {
log_error("could not subscribe to oper started-features: %s\n", sr_strerror(rc));
- return 0;
+ return NTS_ERR_FAILED;
}
-
//subscribe to any changes on the main
- rc = sr_module_change_subscribe(session_running, NTS_NETWORK_FUNCTION_MODULE, NTS_NF_NETWORK_FUNCTION_SCHEMA_XPATH, network_function_change_cb, NULL, 0, SR_SUBSCR_CTX_REUSE | SR_SUBSCR_UPDATE, &session_subscription);
+ rc = sr_module_change_subscribe(session_running, NTS_NETWORK_FUNCTION_MODULE, NTS_NF_NETWORK_FUNCTION_SCHEMA_XPATH, network_function_change_cb, NULL, 1, SR_SUBSCR_CTX_REUSE | SR_SUBSCR_UPDATE, &session_subscription);
if(rc != SR_ERR_OK) {
- log_error("could not subscribe to simulation changes\n");
+ log_error("could not subscribe to simulation changes: %s\n", sr_strerror(rc));
return NTS_ERR_FAILED;
}
rc = faults_init();
if(rc != NTS_ERR_OK) {
- log_error("faults_init error\n", sr_strerror(rc));
+ log_error("faults_init error\n");
return NTS_ERR_FAILED;
}
log_add(1,"\n");
}
+ if(strcmp(framework_environment.nts.function_type, "NTS_FUNCTION_TYPE_O_RAN_O_DU") == 0) {
+ rc = nf_oran_du_init();
+ if(rc != NTS_ERR_OK) {
+ log_error("nf_oran_du_init failed\n");
+ return NTS_ERR_FAILED;
+ }
+ }
+
while(!framework_sigint) {
pthread_mutex_lock(&nf_function_control_lock);
while(nf_function_control_buffer_in != nf_function_control_buffer_out) {
}
if(strstr(nf_function_control_string, "datastore-populate") != 0) {
- rc = datastore_populate(3);
+ rc = datastore_populate_all();
if(rc != NTS_ERR_OK) {
- log_error("datastore_populate() failed\n");
+ log_error("datastore_populate_all() failed\n");
+ }
+
+ //subscribe to any changes so the operational is dynamic
+ char **xpaths = 0;
+ char **modules = 0;
+ int xpaths_count = datastore_schema_get_running_xpaths(&xpaths, &modules);
+ if(xpaths_count < 0) {
+ log_error("datastore_schema_get_running_xpaths failed\n");
+ return NTS_ERR_FAILED;
+ }
+
+ for(int i = 0; i < xpaths_count; i++) {
+ //subscribe
+ log_add_verbose(1, "subscribing to %s on module %s... ", xpaths[i], modules[i]);
+ rc = sr_module_change_subscribe(session_running, modules[i], xpaths[i], datastore_dynamic_operational_auto_callback, 0, 0, SR_SUBSCR_DONE_ONLY | SR_SUBSCR_CTX_REUSE, &session_subscription);
+ if(rc != SR_ERR_OK) {
+ log_error("sr_module_change_subscribe error\n");
+ }
+ else {
+ log_add(1, "done\n");
+ }
+
+ free(xpaths[i]);
+ free(modules[i]);
}
+ free(modules);
+ free(xpaths);
}
if(strstr(nf_function_control_string, "ves-file-ready") != 0) {
}
}
+ if(strstr(nf_function_control_string, "ves-o1-pnf-registration") != 0) {
+ if(nf_function_control_string[0] == '1') {
+ // check if O1 PNF registration is enabled and send PNF registration message if so
+ rc = ves_o1_pnf_registration_feature_start(session_running);
+ if(rc != 0) {
+ log_error("ves_o1_pnf_registration_feature_start() failed\n");
+ }
+ }
+ }
+
if(strstr(nf_function_control_string, "ves-heartbeat") != 0) {
if(nf_function_control_string[0] == '1') {
// start feature for handling the heartbeat VES message
}
faults_free();
+ nf_oran_du_free();
return NTS_ERR_OK;
}
return SR_ERR_OK;
}
-static int network_function_started_features_get_items_cb(sr_session_ctx_t *session, const char *module_name, const char *xpath, const char *request_xpath, uint32_t request_id, struct lyd_node **parent, void *private_data) {
- char value[1024];
- value[0] = 0;
+static int network_function_info_get_items_cb(sr_session_ctx_t *session, const char *module_name, const char *xpath, const char *request_xpath, uint32_t request_id, struct lyd_node **parent, void *private_data) {
+ char started_features[1024];
+ started_features[0] = 0;
if(ves_file_ready_feature_get_status()) {
- strcat(value, "ves-file-ready ");
+ strcat(started_features, "ves-file-ready ");
}
if(ves_pnf_registration_feature_get_status()) {
- strcat(value, "ves-pnf-registration ");
+ strcat(started_features, "ves-pnf-registration ");
}
if(ves_heartbeat_feature_get_status()) {
- strcat(value, "ves-heartbeat ");
+ strcat(started_features, "ves-heartbeat ");
}
if(manual_notification_feature_get_status()) {
- strcat(value, "manual-notification-generation ");
+ strcat(started_features, "manual-notification-generation ");
}
if(netconf_call_home_feature_get_status()) {
- strcat(value, "netconf-call-home ");
+ strcat(started_features, "netconf-call-home ");
}
if(web_cut_through_feature_get_status()) {
- strcat(value, "web-cut-through ");
+ strcat(started_features, "web-cut-through ");
}
-
- if(strlen(value)) {
- value[strlen(value) - 1] = 0;
+
+ if(ves_o1_pnf_registration_feature_get_status()) {
+ strcat(started_features, "ves-o1-pnf-registration ");
+ }
+
+ if(strlen(started_features)) {
+ started_features[strlen(started_features) - 1] = 0;
}
- *parent = lyd_new_path(NULL, sr_get_context(sr_session_get_connection(session)), NTS_NF_INFO_STARTED_FEATURES_SCHEMA_XPATH, value, 0, 0);
+ *parent = lyd_new_path(NULL, sr_get_context(sr_session_get_connection(session)), NTS_NF_INFO_SCHEMA_XPATH, 0, 0, 0);
if(*parent == 0) {
log_error("lyd_new_path failed\n");
return SR_ERR_OPERATION_FAILED;
}
+ struct lyd_node *n = lyd_new_leaf(*parent, (*parent)->schema->module, "started-features", started_features);
+ if(n == 0) {
+ log_error("lyd_new_leaf failed\n");
+ return SR_ERR_OPERATION_FAILED;
+ }
+
return SR_ERR_OK;
}
}
faults_fault_list_clear();
- faults_counters_clear();
if(data == 0) {
return NTS_ERR_OK;
}