diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 97ba8bd53a..5c47ba2b37 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -11280,6 +11280,7 @@ virDomainActualNetDefParseXML(xmlNodePtr node, bandwidth_node = virXPathNode("./bandwidth", ctxt); if (bandwidth_node && virNetDevBandwidthParse(&actual->bandwidth, + NULL, bandwidth_node, actual->type == VIR_DOMAIN_NET_TYPE_NETWORK) < 0) goto error; @@ -11619,6 +11620,7 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt, } } else if (virXMLNodeNameEqual(cur, "bandwidth")) { if (virNetDevBandwidthParse(&def->bandwidth, + NULL, cur, def->type == VIR_DOMAIN_NET_TYPE_NETWORK) < 0) goto error; @@ -25016,7 +25018,7 @@ virDomainActualNetDefContentsFormat(virBufferPtr buf, return -1; if (virNetDevVPortProfileFormat(virDomainNetGetActualVirtPortProfile(def), buf) < 0) return -1; - if (virNetDevBandwidthFormat(virDomainNetGetActualBandwidth(def), buf) < 0) + if (virNetDevBandwidthFormat(virDomainNetGetActualBandwidth(def), 0, buf) < 0) return -1; return 0; } @@ -25393,7 +25395,7 @@ virDomainNetDefFormat(virBufferPtr buf, return -1; if (virNetDevVPortProfileFormat(def->virtPortProfile, buf) < 0) return -1; - if (virNetDevBandwidthFormat(def->bandwidth, buf) < 0) + if (virNetDevBandwidthFormat(def->bandwidth, 0, buf) < 0) return -1; /* ONLY for internal status storage - format the ActualNetDef diff --git a/src/conf/netdev_bandwidth_conf.c b/src/conf/netdev_bandwidth_conf.c index 014941836d..9af2173b7b 100644 --- a/src/conf/netdev_bandwidth_conf.c +++ b/src/conf/netdev_bandwidth_conf.c @@ -99,6 +99,7 @@ virNetDevBandwidthParseRate(xmlNodePtr node, virNetDevBandwidthRatePtr rate) /** * virNetDevBandwidthParse: * @bandwidth: parsed bandwidth + * @class_id: parsed class ID * @node: XML node * @allowFloor: whether "floor" setting is supported * @@ -110,6 +111,7 @@ virNetDevBandwidthParseRate(xmlNodePtr node, virNetDevBandwidthRatePtr rate) */ int virNetDevBandwidthParse(virNetDevBandwidthPtr *bandwidth, + unsigned int *class_id, xmlNodePtr node, bool allowFloor) { @@ -117,6 +119,7 @@ virNetDevBandwidthParse(virNetDevBandwidthPtr *bandwidth, virNetDevBandwidthPtr def = NULL; xmlNodePtr cur; xmlNodePtr in = NULL, out = NULL; + char *class_id_prop = NULL; if (VIR_ALLOC(def) < 0) return ret; @@ -127,6 +130,22 @@ virNetDevBandwidthParse(virNetDevBandwidthPtr *bandwidth, goto cleanup; } + class_id_prop = virXMLPropString(node, "classID"); + if (class_id_prop) { + if (!class_id) { + virReportError(VIR_ERR_XML_DETAIL, "%s", + _("classID attribute not supported on " + "in this usage context")); + goto cleanup; + } + if (virStrToLong_ui(class_id_prop, NULL, 10, class_id) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unable to parse class id '%s'"), + class_id_prop); + goto cleanup; + } + } + cur = node->children; while (cur) { @@ -194,6 +213,7 @@ virNetDevBandwidthParse(virNetDevBandwidthPtr *bandwidth, ret = 0; cleanup: + VIR_FREE(class_id_prop); virNetDevBandwidthFree(def); return ret; } @@ -231,6 +251,7 @@ virNetDevBandwidthRateFormat(virNetDevBandwidthRatePtr def, /** * virNetDevBandwidthFormat: * @def: Data source + * @class_id: the class ID to format, 0 to skip * @buf: Buffer to print to * * Formats bandwidth and prepend each line with @indent. @@ -239,7 +260,9 @@ virNetDevBandwidthRateFormat(virNetDevBandwidthRatePtr def, * Returns 0 on success, else -1. */ int -virNetDevBandwidthFormat(virNetDevBandwidthPtr def, virBufferPtr buf) +virNetDevBandwidthFormat(virNetDevBandwidthPtr def, + unsigned int class_id, + virBufferPtr buf) { int ret = -1; @@ -251,7 +274,10 @@ virNetDevBandwidthFormat(virNetDevBandwidthPtr def, virBufferPtr buf) goto cleanup; } - virBufferAddLit(buf, "\n"); + virBufferAddLit(buf, "\n"); virBufferAdjustIndent(buf, 2); if (virNetDevBandwidthRateFormat(def->in, buf, "inbound") < 0 || virNetDevBandwidthRateFormat(def->out, buf, "outbound") < 0) diff --git a/src/conf/netdev_bandwidth_conf.h b/src/conf/netdev_bandwidth_conf.h index c10574d0b6..42872cc496 100644 --- a/src/conf/netdev_bandwidth_conf.h +++ b/src/conf/netdev_bandwidth_conf.h @@ -25,10 +25,12 @@ #include "domain_conf.h" int virNetDevBandwidthParse(virNetDevBandwidthPtr *bandwidth, + unsigned int *class_id, xmlNodePtr node, bool allowFloor) ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK; int virNetDevBandwidthFormat(virNetDevBandwidthPtr def, + unsigned int class_id, virBufferPtr buf); void virDomainClearNetBandwidth(virDomainObjPtr vm) diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c index 91562de269..09e379ae9a 100644 --- a/src/conf/network_conf.c +++ b/src/conf/network_conf.c @@ -1188,7 +1188,7 @@ virNetworkPortGroupParseXML(virPortGroupDefPtr def, bandwidth_node = virXPathNode("./bandwidth", ctxt); if (bandwidth_node && - virNetDevBandwidthParse(&def->bandwidth, bandwidth_node, false) < 0) + virNetDevBandwidthParse(&def->bandwidth, NULL, bandwidth_node, false) < 0) goto cleanup; vlanNode = virXPathNode("./vlan", ctxt); @@ -1682,7 +1682,7 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt) } if ((bandwidthNode = virXPathNode("./bandwidth", ctxt)) && - virNetDevBandwidthParse(&def->bandwidth, bandwidthNode, false) < 0) + virNetDevBandwidthParse(&def->bandwidth, NULL, bandwidthNode, false) < 0) goto error; vlanNode = virXPathNode("./vlan", ctxt); @@ -2311,7 +2311,7 @@ virPortGroupDefFormat(virBufferPtr buf, return -1; if (virNetDevVPortProfileFormat(def->virtPortProfile, buf) < 0) return -1; - virNetDevBandwidthFormat(def->bandwidth, buf); + virNetDevBandwidthFormat(def->bandwidth, 0, buf); virBufferAdjustIndent(buf, -2); virBufferAddLit(buf, "\n"); return 0; @@ -2566,7 +2566,7 @@ virNetworkDefFormatBuf(virBufferPtr buf, if (virNetDevVlanFormat(&def->vlan, buf) < 0) goto error; - if (virNetDevBandwidthFormat(def->bandwidth, buf) < 0) + if (virNetDevBandwidthFormat(def->bandwidth, 0, buf) < 0) goto error; for (i = 0; i < def->nips; i++) { diff --git a/tests/virnetdevbandwidthtest.c b/tests/virnetdevbandwidthtest.c index 23788b4164..2c0b6a6713 100644 --- a/tests/virnetdevbandwidthtest.c +++ b/tests/virnetdevbandwidthtest.c @@ -54,6 +54,7 @@ struct testSetStruct { goto cleanup; \ \ rc = virNetDevBandwidthParse(&(var), \ + NULL, \ ctxt->node, \ true); \ xmlFreeDoc(doc); \