[libvirt] [PATCH 1/4] vhost-user support: domain configuration

Michele Paolino m.paolino at virtualopensystems.com
Wed Jul 2 13:20:15 UTC 2014


vhost-user is added as a virDomainChrSourceDefPtr variable in the
virtual network interface configuration structure.
This patch adds support to parse vhost-user element. The XML file
looks like:

<interface type='vhostuser'>
    <source type='unix' path='/tmp/vhost.sock' mode='server'/>
    <mac address='52:54:00:3b:83:1a'/>
    <model type='virtio'/>
</interface>

Signed-off-by: Michele Paolino <m.paolino at virtualopensystems.com>
---
 src/conf/domain_conf.c | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++
 src/conf/domain_conf.h | 10 +++++--
 2 files changed, 89 insertions(+), 2 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index ea09bdc..de52ca4 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -349,6 +349,7 @@ VIR_ENUM_IMPL(virDomainFSWrpolicy, VIR_DOMAIN_FS_WRPOLICY_LAST,
 VIR_ENUM_IMPL(virDomainNet, VIR_DOMAIN_NET_TYPE_LAST,
               "user",
               "ethernet",
+              "vhostuser",
               "server",
               "client",
               "mcast",
@@ -1361,6 +1362,10 @@ void virDomainNetDefFree(virDomainNetDefPtr def)
         VIR_FREE(def->data.ethernet.ipaddr);
         break;
 
+    case VIR_DOMAIN_NET_TYPE_VHOSTUSER:
+        virDomainChrSourceDefFree(def->data.vhostuser);
+        break;
+
     case VIR_DOMAIN_NET_TYPE_SERVER:
     case VIR_DOMAIN_NET_TYPE_CLIENT:
     case VIR_DOMAIN_NET_TYPE_MCAST:
@@ -6665,6 +6670,9 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
     char *mode = NULL;
     char *linkstate = NULL;
     char *addrtype = NULL;
+    char *vhostuser_mode = NULL;
+    char *vhostuser_path = NULL;
+    char *vhostuser_type = NULL;
     virNWFilterHashTablePtr filterparams = NULL;
     virDomainActualNetDefPtr actual = NULL;
     xmlNodePtr oldnode = ctxt->node;
@@ -6710,6 +6718,21 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
                        xmlStrEqual(cur->name, BAD_CAST "source")) {
                 dev  = virXMLPropString(cur, "dev");
                 mode = virXMLPropString(cur, "mode");
+            } else if (!vhostuser_path && !vhostuser_mode && !vhostuser_type
+                       && def->type == VIR_DOMAIN_NET_TYPE_VHOSTUSER &&
+                       xmlStrEqual(cur->name, BAD_CAST "source")) {
+                vhostuser_type = virXMLPropString(cur, "type");
+                if (!vhostuser_type || STREQ(vhostuser_type, "unix")) {
+                    vhostuser_path = virXMLPropString(cur, "path");
+                    vhostuser_mode = virXMLPropString(cur, "mode");
+                }
+                else {
+                    virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                                   _("type='%s' unsupported for"
+                                   " <interface type='vhostuser'>"),
+                                   vhostuser_type);
+                    goto error;
+                }
             } else if (!def->virtPortProfile
                        && xmlStrEqual(cur->name, BAD_CAST "virtualport")) {
                 if (def->type == VIR_DOMAIN_NET_TYPE_NETWORK) {
@@ -6867,6 +6890,50 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
         actual = NULL;
         break;
 
+    case VIR_DOMAIN_NET_TYPE_VHOSTUSER:
+        if (!model || STRNEQ(model, "virtio")) {
+            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                           _("Wrong or no <model> 'type' attribute "
+                           "specified with <interface type='vhostuser'/>. "
+                           "vhostuser requires the virtio-net* frontend"));
+            goto error;
+        }
+
+        if (VIR_ALLOC(def->data.vhostuser) < 0)
+            goto error;
+
+        if (STREQ(vhostuser_type, "unix")) {
+
+            (def->data.vhostuser)->type = VIR_DOMAIN_CHR_TYPE_UNIX;
+
+            if (vhostuser_path == NULL) {
+                virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                               _("No <source> 'path' attribute "
+                               "specified with <interface "
+                               "type='vhostuser'/>"));
+                goto error;
+            }
+
+            (def->data.vhostuser)->data.nix.path = vhostuser_path;
+
+            if (vhostuser_mode == NULL) {
+                virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                               _("No <source> 'mode' attribute "
+                               "specified with <interface "
+                               "type='vhostuser'/>"));
+                goto error;
+            }
+
+            if (STREQ(vhostuser_mode, "server"))
+                (def->data.vhostuser)->data.nix.listen = true;
+
+        }
+
+        vhostuser_type = NULL;
+        vhostuser_path = NULL;
+        vhostuser_mode = NULL;
+        break;
+
     case VIR_DOMAIN_NET_TYPE_ETHERNET:
         if (dev != NULL) {
             def->data.ethernet.dev = dev;
@@ -7112,6 +7179,9 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
     VIR_FREE(portgroup);
     VIR_FREE(address);
     VIR_FREE(port);
+    VIR_FREE(vhostuser_type);
+    VIR_FREE(vhostuser_path);
+    VIR_FREE(vhostuser_mode);
     VIR_FREE(ifname);
     VIR_FREE(dev);
     virDomainActualNetDefFree(actual);
@@ -15989,6 +16059,17 @@ virDomainNetDefFormat(virBufferPtr buf,
                                   def->data.ethernet.ipaddr);
             break;
 
+        case VIR_DOMAIN_NET_TYPE_VHOSTUSER:
+            if ((def->data.vhostuser)->type == VIR_DOMAIN_CHR_TYPE_UNIX) {
+                virBufferAddLit(buf, "<source type='unix'");
+                virBufferEscapeString(buf, " path='%s'",
+                                      (def->data.vhostuser)->data.nix.path);
+                if ((def->data.vhostuser)->data.nix.listen)
+                    virBufferAddLit(buf, " mode='server'");
+                virBufferAddLit(buf, "/>\n");
+            }
+            break;
+
         case VIR_DOMAIN_NET_TYPE_BRIDGE:
             virBufferEscapeString(buf, "<source bridge='%s'/>\n",
                                   def->data.bridge.brname);
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index eb5bad7..91f7524 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -133,6 +133,12 @@ typedef virDomainIdMapDef *virDomainIdMapDefPtr;
 typedef struct _virDomainPanicDef virDomainPanicDef;
 typedef virDomainPanicDef *virDomainPanicDefPtr;
 
+/* forward declarations virDomainChrSourceDef, required by
+ * virDomainNetDef
+ */
+typedef struct _virDomainChrSourceDef virDomainChrSourceDef;
+typedef virDomainChrSourceDef *virDomainChrSourceDefPtr;
+
 /* Flags for the 'type' field in virDomainDeviceDef */
 typedef enum {
     VIR_DOMAIN_DEVICE_NONE = 0,
@@ -795,6 +801,7 @@ struct _virDomainFSDef {
 typedef enum {
     VIR_DOMAIN_NET_TYPE_USER,
     VIR_DOMAIN_NET_TYPE_ETHERNET,
+    VIR_DOMAIN_NET_TYPE_VHOSTUSER,
     VIR_DOMAIN_NET_TYPE_SERVER,
     VIR_DOMAIN_NET_TYPE_CLIENT,
     VIR_DOMAIN_NET_TYPE_MCAST,
@@ -880,6 +887,7 @@ struct _virDomainNetDef {
             char *dev;
             char *ipaddr;
         } ethernet;
+        virDomainChrSourceDefPtr vhostuser;
         struct {
             char *address;
             int port;
@@ -1006,8 +1014,6 @@ typedef enum {
 } virDomainChrSpicevmcName;
 
 /* The host side information for a character device.  */
-typedef struct _virDomainChrSourceDef virDomainChrSourceDef;
-typedef virDomainChrSourceDef *virDomainChrSourceDefPtr;
 struct _virDomainChrSourceDef {
     int type; /* virDomainChrType */
     union {
-- 
1.9.3




More information about the libvir-list mailing list