Signed-off-by: Peter Krempa <pkrempa@xxxxxxxxxx> --- src/conf/domain_conf.c | 130 +++++++++++++++++++++-------------------- 1 file changed, 68 insertions(+), 62 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index dde34404f1..b41e1644a5 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -8964,6 +8964,23 @@ virDomainNetDefParseXMLRequireSource(virDomainNetDef *def, } +typedef enum { + VIR_DOMAIN_NET_VHOSTUSER_MODE_NONE, + VIR_DOMAIN_NET_VHOSTUSER_MODE_CLIENT, + VIR_DOMAIN_NET_VHOSTUSER_MODE_SERVER, + + VIR_DOMAIN_NET_VHOSTUSER_MODE_LAST +} virDomainNetVhostuserMode; + +VIR_ENUM_DECL(virDomainNetVhostuserMode); +VIR_ENUM_IMPL(virDomainNetVhostuserMode, + VIR_DOMAIN_NET_VHOSTUSER_MODE_LAST, + "", + "client", + "server", +); + + static virDomainNetDef * virDomainNetDefParseXML(virDomainXMLOption *xmlopt, xmlNodePtr node, @@ -8981,7 +8998,6 @@ virDomainNetDefParseXML(virDomainXMLOption *xmlopt, xmlNodePtr mac_node = NULL; g_autoptr(GHashTable) filterparams = NULL; VIR_XPATH_NODE_AUTORESTORE(ctxt) - virDomainChrSourceReconnectDef reconnect = {0}; int rv; g_autofree char *macaddr = NULL; g_autofree char *dev = NULL; @@ -8994,9 +9010,6 @@ virDomainNetDefParseXML(virDomainXMLOption *xmlopt, g_autofree char *filter = NULL; g_autofree char *linkstate = NULL; g_autofree char *addrtype = NULL; - g_autofree char *vhostuser_mode = NULL; - g_autofree char *vhostuser_path = NULL; - g_autofree char *vhostuser_type = NULL; g_autofree char *tap = NULL; const char *prefix = xmlopt ? xmlopt->config.netPrefix : NULL; @@ -9123,14 +9136,55 @@ virDomainNetDefParseXML(virDomainXMLOption *xmlopt, } break; - case VIR_DOMAIN_NET_TYPE_VHOSTUSER: - if (source_node) { - vhostuser_type = virXMLPropString(source_node, "type"); - vhostuser_path = virXMLPropString(source_node, "path"); - vhostuser_mode = virXMLPropString(source_node, "mode"); - if (virDomainChrSourceReconnectDefParseXML(&reconnect, source_node, ctxt) < 0) - return NULL; + case VIR_DOMAIN_NET_TYPE_VHOSTUSER: { + g_autofree char *vhostuser_type = NULL; + virDomainNetVhostuserMode vhostuser_mode; + + if (virDomainNetDefParseXMLRequireSource(def, source_node) < 0) + return NULL; + + if (!(vhostuser_type = virXMLPropStringRequired(source_node, "type"))) + return NULL; + + if (STRNEQ_NULLABLE(vhostuser_type, "unix")) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Type='%s' unsupported for <interface type='vhostuser'>"), + vhostuser_type); + return NULL; + } + + if (!(def->data.vhostuser = virDomainChrSourceDefNew(xmlopt))) + return NULL; + + def->data.vhostuser->type = VIR_DOMAIN_CHR_TYPE_UNIX; + + if (!(def->data.vhostuser->data.nix.path = virXMLPropStringRequired(source_node, "path"))) + return NULL; + + if (virXMLPropEnum(source_node, "mode", + virDomainNetVhostuserModeTypeFromString, + VIR_XML_PROP_REQUIRED | VIR_XML_PROP_NONZERO, + &vhostuser_mode) < 0) + return NULL; + + switch (vhostuser_mode) { + case VIR_DOMAIN_NET_VHOSTUSER_MODE_CLIENT: + def->data.vhostuser->data.nix.listen = false; + break; + + case VIR_DOMAIN_NET_VHOSTUSER_MODE_SERVER: + def->data.vhostuser->data.nix.listen = true; + break; + + case VIR_DOMAIN_NET_VHOSTUSER_MODE_NONE: + case VIR_DOMAIN_NET_VHOSTUSER_MODE_LAST: + break; } + + if (virDomainChrSourceReconnectDefParseXML(&def->data.vhostuser->data.nix.reconnect, + source_node, ctxt) < 0) + return NULL; + } break; case VIR_DOMAIN_NET_TYPE_VDPA: @@ -9268,58 +9322,10 @@ virDomainNetDefParseXML(virDomainXMLOption *xmlopt, return NULL; } - if (STRNEQ_NULLABLE(vhostuser_type, "unix")) { - if (vhostuser_type) - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("Type='%s' unsupported for" - " <interface type='vhostuser'>"), - vhostuser_type); - else - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("No <source> 'type' attribute " - "specified for <interface " - "type='vhostuser'>")); - return NULL; - } - - if (vhostuser_path == NULL) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("No <source> 'path' attribute " - "specified with <interface " - "type='vhostuser'/>")); - return NULL; - } - - if (vhostuser_mode == NULL) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("No <source> 'mode' attribute " - "specified with <interface " - "type='vhostuser'/>")); - return NULL; - } - - if (!(def->data.vhostuser = virDomainChrSourceDefNew(xmlopt))) - return NULL; - - def->data.vhostuser->type = VIR_DOMAIN_CHR_TYPE_UNIX; - def->data.vhostuser->data.nix.path = g_steal_pointer(&vhostuser_path); - - if (STREQ(vhostuser_mode, "server")) { - def->data.vhostuser->data.nix.listen = true; - if (reconnect.enabled == VIR_TRISTATE_BOOL_YES) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("'reconnect' attribute unsupported " - "'server' mode for <interface type='vhostuser'>")); - return NULL; - } - } else if (STREQ(vhostuser_mode, "client")) { - def->data.vhostuser->data.nix.listen = false; - def->data.vhostuser->data.nix.reconnect = reconnect; - } else { + if (def->data.vhostuser->data.nix.listen && + def->data.vhostuser->data.nix.reconnect.enabled == VIR_TRISTATE_BOOL_YES) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("Wrong <source> 'mode' attribute " - "specified with <interface " - "type='vhostuser'/>")); + _("'reconnect' attribute unsupported 'server' mode for <interface type='vhostuser'>")); return NULL; } break; -- 2.37.1