Add VES stndDefined PM and subscription for O-DU.
[sim/o1-interface.git] / ntsimulator / ntsim-ng / features / ves_heartbeat / ves_heartbeat.c
index 74f7f62..517269b 100644 (file)
@@ -32,8 +32,7 @@
 
 #include "core/session.h"
 #include "core/framework.h"
-
-#define HEARTBEAT_SCHEMA_XPATH      "/nts-network-function:simulation/network-function/ves/heartbeat-period" 
+#include "core/xpath.h"
 
 static volatile int ves_heartbeat_period;
 static int ves_sequence_number;
@@ -46,7 +45,7 @@ static pthread_mutex_t ves_heartbeat_lock;
 static int ves_heartbeat_period_get(void);
 static void ves_heartbeat_period_set(int new_period);
 
-static int ves_heartbeat_send_ves_message(void);
+static int ves_heartbeat_send_ves_message(int port);
 static void *ves_heartbeat_thread_routine(void *arg);
 static cJSON* ves_create_heartbeat_fields(int heartbeat_period);
 static int heartbeat_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);
@@ -73,7 +72,7 @@ int ves_heartbeat_feature_start(sr_session_ctx_t *current_session) {
         ves_heartbeat_period = 0;
         ves_sequence_number = 0;
 
-        int rc = sr_get_item(current_session, HEARTBEAT_SCHEMA_XPATH, 0, &value);
+        int rc = sr_get_item(current_session, NTS_NF_VES_HEARTBEAT_SCHEMA_XPATH, 0, &value);
         if(rc == SR_ERR_OK) {
             ves_heartbeat_period_set(value->data.uint16_val);
             sr_free_val(value);
@@ -82,7 +81,7 @@ int ves_heartbeat_feature_start(sr_session_ctx_t *current_session) {
             log_error("sr_get_item failed\n");
         }
 
-        rc = sr_module_change_subscribe(current_session, "nts-network-function", HEARTBEAT_SCHEMA_XPATH, heartbeat_change_cb, NULL, 0, SR_SUBSCR_CTX_REUSE, &ves_heartbeat_subscription);
+        rc = sr_module_change_subscribe(current_session, NTS_NETWORK_FUNCTION_MODULE, NTS_NF_VES_HEARTBEAT_SCHEMA_XPATH, heartbeat_change_cb, NULL, 0, SR_SUBSCR_CTX_REUSE, &ves_heartbeat_subscription);
         if(rc != SR_ERR_OK) {
             log_error("could not subscribe to heartbeat\n");
             return NTS_ERR_FAILED;
@@ -132,7 +131,7 @@ static void ves_heartbeat_period_set(int new_period) {
     pthread_mutex_unlock(&ves_heartbeat_lock);
 }
 
-static int ves_heartbeat_send_ves_message(void) {
+static int ves_heartbeat_send_ves_message(int port) {
     char *hostname_string = framework_environment.settings.hostname;
     cJSON *post_data_json = cJSON_CreateObject();
     if(post_data_json == 0) {
@@ -153,7 +152,7 @@ static int ves_heartbeat_send_ves_message(void) {
         return NTS_ERR_FAILED;
     }
 
-    cJSON *common_event_header = ves_create_common_event_header("heartbeat", "Controller", hostname_string, "Low", ves_sequence_number++);
+    cJSON *common_event_header = ves_create_common_event_header("heartbeat", "Controller", hostname_string, port, "Low", ves_sequence_number++);
     if(common_event_header == 0) {
         log_error("ves_create_common_event_header failed\n");
         cJSON_Delete(post_data_json);
@@ -186,7 +185,7 @@ static int ves_heartbeat_send_ves_message(void) {
         return NTS_ERR_FAILED;
     }
 
-    ves_details_t *ves_details = ves_endpoint_details_get(0);
+    ves_details_t *ves_details = ves_endpoint_details_get(0, 0);
     if(!ves_details) {
         log_error("ves_endpoint_details_get failed\n");
         free(post_data);
@@ -206,9 +205,30 @@ static int ves_heartbeat_send_ves_message(void) {
 }
 
 static void *ves_heartbeat_thread_routine(void *arg) {
+    assert_session();
+
     int current_heartbeat_period = 0;
     unsigned int timer_counter = 0;
 
+    int ssh_base_port = 0;
+    int tls_base_port = 0;
+    nts_mount_point_addressing_method_t mp = nts_mount_point_addressing_method_get(0);
+    if(mp == UNKNOWN_MAPPING) {
+        log_error("mount-point-addressing-method failed, assuming DOCKER_MAPPING\n");
+        mp = DOCKER_MAPPING;
+        ssh_base_port = STANDARD_NETCONF_PORT;
+        tls_base_port = ssh_base_port + framework_environment.settings.ssh_connections;
+    }
+    else if(mp == DOCKER_MAPPING) {
+        ssh_base_port = STANDARD_NETCONF_PORT;
+        tls_base_port = ssh_base_port + framework_environment.settings.ssh_connections;
+    }
+    else {
+        ssh_base_port = framework_environment.host.ssh_base_port;
+        tls_base_port = framework_environment.host.tls_base_port;       
+    }
+
+
     while((!framework_sigint) && (!ves_heartbeat_stopsig)) {
         current_heartbeat_period = ves_heartbeat_period_get();
         timer_counter++;
@@ -216,10 +236,28 @@ static void *ves_heartbeat_thread_routine(void *arg) {
         if((timer_counter >= current_heartbeat_period) && (current_heartbeat_period > 0)) {
             timer_counter = 0;
 
-            int rc = ves_heartbeat_send_ves_message();
-            if(rc != NTS_ERR_FAILED) {
-                log_error("could not send VES heartbeat\n");
+            if((framework_environment.settings.ssh_connections + framework_environment.settings.tls_connections) > 1) {
+                for(int port = ssh_base_port; port < ssh_base_port + framework_environment.settings.ssh_connections; port++) {
+                    int rc = ves_heartbeat_send_ves_message(port);
+                    if(rc != NTS_ERR_FAILED) {
+                        log_error("could not send VES heartbeat\n");
+                    }
+                }
+
+                for(int port = tls_base_port; port < tls_base_port + framework_environment.settings.tls_connections; port++) {
+                    int rc = ves_heartbeat_send_ves_message(port);
+                    if(rc != NTS_ERR_FAILED) {
+                        log_error("could not send VES heartbeat\n");
+                    }
+                }
+            }
+            else {
+                int rc = ves_heartbeat_send_ves_message(0);
+                if(rc != NTS_ERR_FAILED) {
+                    log_error("could not send VES heartbeat\n");
+                }
             }
+            
         }
 
         sleep(1);
@@ -287,7 +325,7 @@ static int heartbeat_change_cb(sr_session_ctx_t *session, const char *module_nam
     sr_val_t *new_value = 0;
 
     if(event == SR_EV_DONE) {
-        rc = sr_get_changes_iter(session, HEARTBEAT_SCHEMA_XPATH, &it);
+        rc = sr_get_changes_iter(session, NTS_NF_VES_HEARTBEAT_SCHEMA_XPATH, &it);
         if(rc != SR_ERR_OK) {
             log_error("sr_get_changes_iter failed\n");
             return SR_ERR_VALIDATION_FAILED;