On 3/10/25 5:06 PM, Peter Krempa wrote:
On Mon, Mar 10, 2025 at 16:11:03 -0400, Laine Stump wrote:
> The original implementation of the passt backend for vhost-user
> interfaces erroneously forgot to parse:
>
> <source dev='blah'/>
>
> for interface type='vhostuser', so it wasn't being added to the passt
> commandline, and also wasn't being saved to the domain config. Now we
> parse it no matter what the interface type, and then throw an error
> during validation if source/@dev was specified and backend type !=
> 'passt' (or if interface type != 'user|vhostuser').
>
> Fixes: 1e9054b9c79d721a55f413c2983c5370044f8f60
> Resolves:
https://issues.redhat.com/browse/RHEL-82539
> Signed-off-by: Laine Stump <laine(a)redhat.com>
> ---
> src/conf/domain_conf.c | 10 +++++++---
> src/conf/domain_validate.c | 5 +++++
> .../net-vhostuser-passt.x86_64-latest.xml | 2 ++
> 3 files changed, 14 insertions(+), 3 deletions(-)
>
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index d555873848..5daa1f89e8 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -9938,14 +9938,18 @@ virDomainNetDefParseXML(virDomainXMLOption *xmlopt,
> break;
>
> case VIR_DOMAIN_NET_TYPE_USER:
> - def->sourceDev = virXMLPropString(source_node, "dev");
> - break;
> -
> case VIR_DOMAIN_NET_TYPE_NULL:
> case VIR_DOMAIN_NET_TYPE_LAST:
> break;
> }
>
> + /* source/@dev is used for two different interface types and *not*
> + * stored inside the union, so we can parse it out always, and
> + * then log an error during validation if it was specified for one
> + * of the interface types that doesn't support it.
> + */
> + def->sourceDev = virXMLPropString(source_node, "dev");
> +
> if ((virtualport_node = virXPathNode("./virtualport", ctxt))) {
> if (virtualport_flags == 0) {
> virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> diff --git a/src/conf/domain_validate.c b/src/conf/domain_validate.c
> index f2a98f143d..9de442d7d7 100644
> --- a/src/conf/domain_validate.c
> +++ b/src/conf/domain_validate.c
> @@ -2196,6 +2196,11 @@ virDomainNetDefValidate(const virDomainNetDef *net)
> }
> }
>
> + if (net->sourceDev && net->backend.type !=
VIR_DOMAIN_NET_BACKEND_PASST) {
> + virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> + _("The 'dev' attribute of the <source>
element can only be used with interface type='user' or type='vhostuser'
and backend='passt'."));
Missing return/goto statement. Also config errors must not use
VIR_ERR_INTERNAL_ERROR. Use the XML_ERROR or XML_DETAIL codes that I
can't remember the exact spelling of.
That's what happens when you *almost* finish something on Friday, spend
the weekend away from the keyboard, and then come back Monday having
forgotten exactly where you were :-/. Thanks for taking it easy on me :-)
> + }
> +
> if (net->nPortForwards > 0) {
> size_t p;
>
Reviewed-by: Peter Krempa <pkrempa(a)redhat.com>
After I fix the above, of course!