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(a)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