doc: add Meson coding style to contributors guide
[dpdk.git] / lib / librte_power / guest_channel.c
index 8884238..2f7507a 100644 (file)
@@ -2,6 +2,7 @@
  * Copyright(c) 2010-2014 Intel Corporation
  */
 
+#include <glob.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
@@ -14,9 +15,9 @@
 
 
 #include <rte_log.h>
+#include <rte_power.h>
 
 #include "guest_channel.h"
-#include "channel_commands.h"
 
 #define RTE_LOGTYPE_GUEST_CHANNEL RTE_LOGTYPE_USER1
 
 
 static int global_fds[RTE_MAX_LCORE] = { [0 ... RTE_MAX_LCORE-1] = -1 };
 
+int
+guest_channel_host_check_exists(const char *path)
+{
+       char glob_path[PATH_MAX];
+       glob_t g;
+       int ret;
+
+       /* we cannot know in advance which cores have VM channels, so glob */
+       snprintf(glob_path, PATH_MAX, "%s.*", path);
+
+       ret = glob(glob_path, GLOB_NOSORT, NULL, &g);
+       if (ret != 0) {
+               /* couldn't read anything */
+               ret = 0;
+               goto out;
+       }
+
+       /* do we have at least one match? */
+       ret = g.gl_pathc > 0;
+
+out:
+       globfree(&g);
+       return ret;
+}
+
 int
 guest_channel_host_connect(const char *path, unsigned int lcore_id)
 {
        int flags, ret;
-       struct channel_packet pkt;
+       struct rte_power_channel_packet pkt;
        char fd_path[PATH_MAX];
        int fd = -1;
 
@@ -74,7 +100,7 @@ guest_channel_host_connect(const char *path, unsigned int lcore_id)
        /* Send a test packet, this command is ignored by the host, but a successful
         * send indicates that the host endpoint is monitoring.
         */
-       pkt.command = CPU_POWER_CONNECT;
+       pkt.command = RTE_POWER_CPU_POWER_CONNECT;
        global_fds[lcore_id] = fd;
        ret = guest_channel_send_msg(&pkt, lcore_id);
        if (ret != 0) {
@@ -93,7 +119,8 @@ error:
 }
 
 int
-guest_channel_send_msg(struct channel_packet *pkt, unsigned int lcore_id)
+guest_channel_send_msg(struct rte_power_channel_packet *pkt,
+               unsigned int lcore_id)
 {
        int ret, buffer_len = sizeof(*pkt);
        void *buffer = pkt;
@@ -123,19 +150,21 @@ guest_channel_send_msg(struct channel_packet *pkt, unsigned int lcore_id)
        return 0;
 }
 
-int rte_power_guest_channel_send_msg(struct channel_packet *pkt,
+int rte_power_guest_channel_send_msg(struct rte_power_channel_packet *pkt,
                        unsigned int lcore_id)
 {
        return guest_channel_send_msg(pkt, lcore_id);
 }
 
-int power_guest_channel_read_msg(struct channel_packet *pkt,
-                       unsigned int lcore_id)
+int power_guest_channel_read_msg(void *pkt,
+               size_t pkt_len,
+               unsigned int lcore_id)
 {
        int ret;
        struct pollfd fds;
-       void *buffer = pkt;
-       int buffer_len = sizeof(*pkt);
+
+       if (pkt_len == 0 || pkt == NULL)
+               return -1;
 
        fds.fd = global_fds[lcore_id];
        fds.events = POLLIN;
@@ -146,7 +175,7 @@ int power_guest_channel_read_msg(struct channel_packet *pkt,
                return -1;
        } else if (ret < 0) {
                RTE_LOG(ERR, GUEST_CHANNEL, "Error occurred during poll function: %s\n",
-                               strerror(ret));
+                               strerror(errno));
                return -1;
        }
 
@@ -161,29 +190,32 @@ int power_guest_channel_read_msg(struct channel_packet *pkt,
                return -1;
        }
 
-       while (buffer_len > 0) {
+       while (pkt_len > 0) {
                ret = read(global_fds[lcore_id],
-                               buffer, buffer_len);
+                               pkt, pkt_len);
+
                if (ret < 0) {
                        if (errno == EINTR)
                                continue;
                        return -1;
                }
+
                if (ret == 0) {
                        RTE_LOG(ERR, GUEST_CHANNEL, "Expected more data, but connection has been closed.\n");
                        return -1;
                }
-               buffer = (char *)buffer + ret;
-               buffer_len -= ret;
+               pkt = (char *)pkt + ret;
+               pkt_len -= ret;
        }
 
        return 0;
 }
 
-int rte_power_guest_channel_receive_msg(struct channel_packet *pkt,
-                       unsigned int lcore_id)
+int rte_power_guest_channel_receive_msg(void *pkt,
+               size_t pkt_len,
+               unsigned int lcore_id)
 {
-       return power_guest_channel_read_msg(pkt, lcore_id);
+       return power_guest_channel_read_msg(pkt, pkt_len, lcore_id);
 }
 
 void