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@xxxxxxxxxxxxxxxxxxxxxx> --- 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 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list