app/flow-perf: support meter action
[dpdk.git] / examples / vm_power_manager / channel_manager.c
index 4db2257..a263150 100644 (file)
@@ -4,7 +4,6 @@
 
 #include <stdio.h>
 #include <stdlib.h>
-#include <sys/un.h>
 #include <fcntl.h>
 #include <unistd.h>
 #include <inttypes.h>
@@ -35,6 +34,8 @@
 
 #define RTE_LOGTYPE_CHANNEL_MANAGER RTE_LOGTYPE_USER1
 
+struct libvirt_vm_info lvm_info[MAX_CLIENTS];
+
 /* Global pointer to libvirt connection */
 static virConnectPtr global_vir_conn_ptr;
 
@@ -58,6 +59,7 @@ struct virtual_machine_info {
        virDomainPtr domainPtr;
        virDomainInfo info;
        rte_spinlock_t config_spinlock;
+       int allow_query;
        LIST_ENTRY(virtual_machine_info) vms_info;
 };
 
@@ -465,9 +467,15 @@ add_all_channels(const char *vm_name)
                        continue;
                }
 
-               snprintf(chan_info->channel_path,
+               if ((size_t)snprintf(chan_info->channel_path,
                                sizeof(chan_info->channel_path), "%s%s",
-                               CHANNEL_MGR_SOCKET_PATH, dir->d_name);
+                               CHANNEL_MGR_SOCKET_PATH, dir->d_name)
+                                       >= sizeof(chan_info->channel_path)) {
+                       RTE_LOG(ERR, CHANNEL_MANAGER, "Pathname too long for channel '%s%s'\n",
+                                       CHANNEL_MGR_SOCKET_PATH, dir->d_name);
+                       rte_free(chan_info);
+                       continue;
+               }
 
                if (setup_channel_info(&vm_info, &chan_info, channel_num) < 0) {
                        rte_free(chan_info);
@@ -791,6 +799,7 @@ get_info_vm(const char *vm_name, struct vm_info *info)
                channel_num++;
        }
 
+       info->allow_query = vm_info->allow_query;
        info->num_channels = channel_num;
        info->num_vcpus = vm_info->info.nrVirtCpu;
        rte_spinlock_unlock(&(vm_info->config_spinlock));
@@ -867,6 +876,7 @@ add_vm(const char *vm_name)
        else
                new_domain->status = CHANNEL_MGR_VM_ACTIVE;
 
+       new_domain->allow_query = 0;
        rte_spinlock_init(&(new_domain->config_spinlock));
        LIST_INSERT_HEAD(&vm_list_head, new_domain, vms_info);
        return 0;
@@ -896,6 +906,23 @@ remove_vm(const char *vm_name)
        return 0;
 }
 
+int
+set_query_status(char *vm_name,
+               bool allow_query)
+{
+       struct virtual_machine_info *vm_info;
+
+       vm_info = find_domain_by_name(vm_name);
+       if (vm_info == NULL) {
+               RTE_LOG(ERR, CHANNEL_MANAGER, "VM '%s' not found\n", vm_name);
+               return -1;
+       }
+       rte_spinlock_lock(&(vm_info->config_spinlock));
+       vm_info->allow_query = allow_query ? 1 : 0;
+       rte_spinlock_unlock(&(vm_info->config_spinlock));
+       return 0;
+}
+
 static void
 disconnect_hypervisor(void)
 {