qemu: don't raise error upon interface update without <frames/> for <rx/> in coalesce

With this, incomplete XML without <frames/> for <rx/> in coalesce
won't raise error as before. It will leave the coalesce parameter
empty, thanks to passing it as a parameter and return an integer
to indicate error state - previously it returned pointer (or NULL
for both error and incomplete XML).
I also added a test case to test this functionality in the
qemuxml2xmltest.

The code went through some refactoring:
* change of a condition
* addition of a parameter
* change of order, that allowed removal of VIR_FREE
* removal of redundant labels and variables

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1535930
Signed-off-by: Kristina Hanicova <khanicov@redhat.com>
Reviewed-by: Martin Kletzander <mkletzan@redhat.com>
This commit is contained in:
Kristina Hanicova 2021-03-10 18:01:17 +01:00 committed by Martin Kletzander
parent e2602f2bb1
commit 511bdb0bb2
3 changed files with 26 additions and 16 deletions

View File

@ -7598,11 +7598,11 @@ virDomainNetIPInfoParseXML(const char *source,
}
static virNetDevCoalescePtr
static int
virDomainNetDefCoalesceParseXML(xmlNodePtr node,
xmlXPathContextPtr ctxt)
xmlXPathContextPtr ctxt,
virNetDevCoalescePtr *coalesce)
{
virNetDevCoalescePtr ret = NULL;
VIR_XPATH_NODE_AUTORESTORE(ctxt)
unsigned long long tmp = 0;
g_autofree char *str = NULL;
@ -7611,15 +7611,13 @@ virDomainNetDefCoalesceParseXML(xmlNodePtr node,
str = virXPathString("string(./rx/frames/@max)", ctxt);
if (!str)
return NULL;
ret = g_new0(virNetDevCoalesce, 1);
return 0;
if (virStrToLong_ullp(str, NULL, 10, &tmp) < 0) {
virReportError(VIR_ERR_XML_DETAIL,
_("cannot parse value '%s' for coalesce parameter"),
str);
goto error;
return -1;
}
if (tmp > UINT32_MAX) {
@ -7627,15 +7625,13 @@ virDomainNetDefCoalesceParseXML(xmlNodePtr node,
_("value '%llu' is too big for coalesce "
"parameter, maximum is '%lu'"),
tmp, (unsigned long) UINT32_MAX);
goto error;
return -1;
}
ret->rx_max_coalesced_frames = tmp;
return ret;
*coalesce = g_new0(virNetDevCoalesce, 1);
(*coalesce)->rx_max_coalesced_frames = tmp;
error:
VIR_FREE(ret);
return NULL;
return 0;
}
static void
@ -11599,8 +11595,7 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
node = virXPathNode("./coalesce", ctxt);
if (node) {
def->coalesce = virDomainNetDefCoalesceParseXML(node, ctxt);
if (!def->coalesce)
if (virDomainNetDefCoalesceParseXML(node, ctxt, &def->coalesce) < 0)
goto error;
}

View File

@ -55,6 +55,15 @@
</rx>
</coalesce>
</interface>
<interface type='network'>
<source network='default'/>
<mac address='52:54:00:e5:48:60'/>
<model type='virtio'/>
<coalesce>
<rx>
</rx>
</coalesce>
</interface>
<serial type='pty'>
<target port='0'/>
</serial>

View File

@ -56,6 +56,12 @@
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
</interface>
<interface type='network'>
<mac address='52:54:00:e5:48:60'/>
<source network='default'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
</interface>
<serial type='pty'>
<target type='isa-serial' port='0'>
<model name='isa-serial'/>
@ -68,7 +74,7 @@
<input type='keyboard' bus='ps2'/>
<audio id='1' type='none'/>
<memballoon model='virtio'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
</memballoon>
</devices>
</domain>