diff --git a/src/conf/netdev_bandwidth_conf.c b/src/conf/netdev_bandwidth_conf.c index 6307ac4d56..5cbb9f46e4 100644 --- a/src/conf/netdev_bandwidth_conf.c +++ b/src/conf/netdev_bandwidth_conf.c @@ -304,3 +304,23 @@ virNetDevBandwidthHasFloor(const virNetDevBandwidth *b) { return b && b->in && b->in->floor != 0; } + + +bool virNetDevBandwidthSupportsFloor(virNetworkForwardType type) +{ + switch (type) { + case VIR_NETWORK_FORWARD_NONE: + case VIR_NETWORK_FORWARD_NAT: + case VIR_NETWORK_FORWARD_ROUTE: + case VIR_NETWORK_FORWARD_OPEN: + return true; + case VIR_NETWORK_FORWARD_BRIDGE: + case VIR_NETWORK_FORWARD_PRIVATE: + case VIR_NETWORK_FORWARD_VEPA: + case VIR_NETWORK_FORWARD_PASSTHROUGH: + case VIR_NETWORK_FORWARD_HOSTDEV: + case VIR_NETWORK_FORWARD_LAST: + break; + } + return false; +} diff --git a/src/conf/netdev_bandwidth_conf.h b/src/conf/netdev_bandwidth_conf.h index 0e10a4cb01..b9e57168be 100644 --- a/src/conf/netdev_bandwidth_conf.h +++ b/src/conf/netdev_bandwidth_conf.h @@ -23,6 +23,7 @@ #include "virbuffer.h" #include "virxml.h" #include "domain_conf.h" +#include "network_conf.h" int virNetDevBandwidthParse(virNetDevBandwidthPtr *bandwidth, unsigned int *class_id, @@ -60,3 +61,4 @@ static inline bool virNetDevSupportBandwidth(virDomainNetType type) bool virNetDevBandwidthHasFloor(const virNetDevBandwidth *b); +bool virNetDevBandwidthSupportsFloor(virNetworkForwardType type); diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 73c94ed81a..125d1836dd 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -735,6 +735,7 @@ virDomainClearNetBandwidth; virNetDevBandwidthFormat; virNetDevBandwidthHasFloor; virNetDevBandwidthParse; +virNetDevBandwidthSupportsFloor; # conf/netdev_vlan_conf.h diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c index 6d7eadad43..8b1f722eb6 100644 --- a/src/network/bridge_driver.c +++ b/src/network/bridge_driver.c @@ -5065,6 +5065,15 @@ networkCheckBandwidth(virNetworkObjPtr obj, virMacAddrFormat(ifaceMac, ifmac); + if (virNetDevBandwidthHasFloor(ifaceBand) && + !virNetDevBandwidthSupportsFloor(def->forward.type)) { + virReportError(VIR_ERR_OPERATION_UNSUPPORTED, + _("Invalid use of 'floor' on interface with MAC address %s " + "- 'floor' is only supported for interface type 'network' with forward type 'nat', 'route', 'open' or none"), + ifmac); + return -1; + } + if (virNetDevBandwidthHasFloor(ifaceBand) && !(netBand && netBand->in)) { virReportError(VIR_ERR_OPERATION_UNSUPPORTED,