hostdev, flags) < 0) {
goto error;
}
- } else if (actual->type == VIR_DOMAIN_NET_TYPE_NETWORK) {
+ } else if (actual->type == VIR_DOMAIN_NET_TYPE_BRIDGE ||
+ actual->type == VIR_DOMAIN_NET_TYPE_NETWORK) {
VIR_AUTOFREE(char *) class_id = NULL;
+ xmlNodePtr sourceNode;
class_id = virXPathString("string(./class/@id)", ctxt);
if (class_id &&
class_id);
goto error;
}
- }
- if (actual->type == VIR_DOMAIN_NET_TYPE_BRIDGE ||
- actual->type == VIR_DOMAIN_NET_TYPE_NETWORK) {
- xmlNodePtr sourceNode = virXPathNode("./source", ctxt);
+
+ sourceNode = virXPathNode("./source", ctxt);
if (sourceNode) {
char *brname = virXMLPropString(sourceNode, "bridge");
virPortGroupDefPtr defaultPortGroup = NULL;
virNetworkIPDefPtr ipdef;
bool ipv4def = false, ipv6def = false;
- bool bandwidthAllowed = true;
+ bool bandwidthAllowed = false;
bool usesInterface = false, usesAddress = false;
if (virXMLCheckIllegalChars("name", def->name, "\n") < 0)
return -1;
virNetworkSetBridgeMacAddr(def);
+ bandwidthAllowed = true;
break;
case VIR_NETWORK_FORWARD_BRIDGE:
+ if (def->bridge != NULL)
+ bandwidthAllowed = true;
+
+ ATTRIBUTE_FALLTHROUGH;
+
case VIR_NETWORK_FORWARD_PRIVATE:
case VIR_NETWORK_FORWARD_VEPA:
case VIR_NETWORK_FORWARD_PASSTHROUGH:
virNetworkForwardTypeToString(def->forward.type));
return -1;
}
- if (def->bandwidth) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
- _("Unsupported network-wide <bandwidth> element "
- "in network %s with forward mode='%s'"),
- def->name,
- virNetworkForwardTypeToString(def->forward.type));
- return -1;
- }
- bandwidthAllowed = false;
break;
case VIR_NETWORK_FORWARD_LAST:
return -1;
}
+ if (def->bandwidth &&
+ !bandwidthAllowed) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Unsupported network-wide <bandwidth> element "
+ "in network %s with forward mode='%s'"),
+ def->name,
+ virNetworkForwardTypeToString(def->forward.type));
+ return -1;
+ }
+
/* we support configs with a single PF defined:
* <pf dev='eth0'/>
* or with a list of netdev names:
goto error;
}
}
+
+ if (networkPlugBandwidth(obj, iface) < 0)
+ goto error;
break;
}
break;
case VIR_NETWORK_FORWARD_BRIDGE:
+ if (iface->data.network.actual &&
+ actualType == VIR_DOMAIN_NET_TYPE_BRIDGE &&
+ networkUnplugBandwidth(obj, iface) < 0)
+ goto error;
+ break;
case VIR_NETWORK_FORWARD_PRIVATE:
case VIR_NETWORK_FORWARD_VEPA:
case VIR_NETWORK_FORWARD_PASSTHROUGH:
virNetDevBandwidthPtr ifaceBand;
unsigned long long old_floor, new_floor;
- if (virDomainNetGetActualType(iface) != VIR_DOMAIN_NET_TYPE_NETWORK) {
+ if (virDomainNetGetActualType(iface) != VIR_DOMAIN_NET_TYPE_NETWORK &&
+ (virDomainNetGetActualType(iface) != VIR_DOMAIN_NET_TYPE_BRIDGE ||
+ iface->data.network.actual->data.bridge.brname == NULL)) {
/* This is not an interface that's plugged into a network.
* We don't care. Thus from our POV bandwidth change is allowed. */
return false;