[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH RFC 2/4] xl: add support for channels



This adds support for channel declarations of the form:

  channel = [ "name=...,type=...[,path=...][,backend=...]" ]

where 'name' is a label to identify the channel to the frontend.

If 'type = none' then the channel is connected to /dev/null
If 'type = pty' then the channel is connected to a pty in the
  backend domain
If 'type = path' then data is read from the channel and written
  to the file given by 'path = ...' in the backend domain.
If 'type = socket' then the channel is connected to a Unix domain
  socket given by 'path = ...' in the backend domain.

Signed-off-by: David Scott <dave.scott@xxxxxxxxxx>
---
 tools/libxl/xl_cmdimpl.c |   62 +++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 61 insertions(+), 1 deletion(-)

diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c
index 5195914..2657b5d 100644
--- a/tools/libxl/xl_cmdimpl.c
+++ b/tools/libxl/xl_cmdimpl.c
@@ -736,7 +736,7 @@ static void parse_config_data(const char *config_source,
     long l;
     XLU_Config *config;
     XLU_ConfigList *cpus, *vbds, *nics, *pcis, *cvfbs, *cpuids, *vtpms;
-    XLU_ConfigList *ioports, *irqs, *iomem;
+    XLU_ConfigList *channels, *ioports, *irqs, *iomem;
     int num_ioports, num_irqs, num_iomem;
     int pci_power_mgmt = 0;
     int pci_msitranslate = 0;
@@ -1289,6 +1289,66 @@ static void parse_config_data(const char *config_source,
         }
     }
 
+    if (!xlu_cfg_get_list (config, "channel", &channels, 0, 0)) {
+        d_config->num_channels = 0;
+        d_config->channels = NULL;
+        while ((buf = xlu_cfg_get_listitem (channels, d_config->num_channels)) 
!= NULL) {
+            libxl_device_channel *channel;
+            char *buf2 = strdup(buf);
+            char *p, *p2;
+            d_config->channels = (libxl_device_channel *) 
realloc(d_config->channels, sizeof (libxl_device_channel) * 
(d_config->num_channels + 1));
+            channel = d_config->channels + d_config->num_channels;
+            libxl_device_channel_init(channel);
+            channel->devid = d_config->num_channels;
+
+            p = strtok(buf2, ",");
+            if (!p)
+                goto skip_channel;
+            do {
+                while (*p == ' ')
+                    p++;
+                if ((p2 = strchr(p, '=')) == NULL)
+                    break;
+                *p2 = '\0';
+                if (!strcmp(p, "backend")) {
+                    free(channel->backend_domname);
+                    channel->backend_domname = strdup(p2 + 1);
+                } else if (!strcmp(p, "name")) {
+                    free(channel->name);
+                    channel->name = strdup(p2 + 1);
+                } else if (!strcmp(p, "type")) {
+                    if (channel->type != LIBXL_CHANNEL_TYPE_NONE) {
+                        fprintf(stderr, "a channel may have only one output,"
+                                        " skipping device\n");
+                        goto skip_channel;
+                    }
+                    if (!strcmp(p2 + 1, "none")) {
+                        channel->type = LIBXL_CHANNEL_TYPE_NONE;
+                    } else if (!strcmp(p2 + 1, "pty")) {
+                        channel->type = LIBXL_CHANNEL_TYPE_PTY;
+                    } else if (!strcmp(p2 + 1, "path")) {
+                        channel->type = LIBXL_CHANNEL_TYPE_PATH;
+                    } else if (!strcmp(p2 + 1, "socket")) {
+                        channel->type = LIBXL_CHANNEL_TYPE_SOCKET;
+                    } else {
+                        fprintf(stderr, "unknown channel type '%s',"
+                                        " skipping device\n", p2 + 1);
+                        goto skip_channel;
+                    }
+                } else if (!strcmp(p, "path")) {
+                    free(channel->path);
+                    channel->path = strdup(p2 + 1);
+                } else {
+                    fprintf(stderr, "unknown channel parameter '%s',"
+                                    " ignoring\n", p);
+                }
+            } while ((p = strtok(NULL, ",")) != NULL);
+skip_channel:
+            free(buf2);
+            d_config->num_channels++;
+        }
+    }
+
     if (!xlu_cfg_get_list (config, "vif", &nics, 0, 0)) {
         d_config->num_nics = 0;
         d_config->nics = NULL;
-- 
1.7.10.4


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.