[pve-devel] [PATCH v1 qemu-server 4/5] add fields inrate and outrate to net_fmt, map rate of old configs to out/inrate

Hannes Laimer h.laimer at proxmox.com
Fri Sep 11 12:08:15 CEST 2020


Signed-off-by: Hannes Laimer <h.laimer at proxmox.com>
---
 PVE/QemuServer.pm             | 35 +++++++++++++++++++++++++++++------
 vm-network-scripts/pve-bridge |  9 ++++++---
 2 files changed, 35 insertions(+), 9 deletions(-)

diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm
index 2747c66..ff59d78 100644
--- a/PVE/QemuServer.pm
+++ b/PVE/QemuServer.pm
@@ -886,6 +886,18 @@ my $net_fmt = {
 	description => "Rate limit in mbps (megabytes per second) as floating point number.",
 	optional => 1,
     },
+    outrate => {
+	type => 'number',
+	minimum => 0,
+	description => "Upload rate limit in mbps (megabytes per second) as floating point number.",
+	optional => 1,
+    },
+    inrate => {
+	type => 'number',
+	minimum => 0,
+	description => "Download rate limit in mbps (megabytes per second) as floating point number.",
+	optional => 1,
+	},
     tag => {
 	type => 'integer',
 	minimum => 1, maximum => 4094,
@@ -1732,7 +1744,7 @@ sub parse_numa {
     return $res;
 }
 
-# netX: e1000=XX:XX:XX:XX:XX:XX,bridge=vmbr0,rate=<mbps>
+# netX: e1000=XX:XX:XX:XX:XX:XX,bridge=vmbr0,outrate=<mbps>,inrate=<mbps>,[rate=<mbps>]deprecated
 sub parse_net {
     my ($data) = @_;
 
@@ -3473,7 +3485,10 @@ sub config_to_command {
 	 next if !$d;
 
 	 $use_virtio = 1 if $d->{model} eq 'virtio';
-
+	# setting in/out-rate to rate if rate is set and in/out-rate is not set
+	# if in/out-rate was changed by the user, rate will always be empty
+	$d->{inrate} = $d->{rate} if !$d->{inrate} && $d->{rate};
+	$d->{outrate} = $d->{rate} if !$d->{outrate} && $d->{rate};
 	 if ($bootindex_hash->{n}) {
 	    $d->{bootindex} = $bootindex_hash->{n};
 	    $bootindex_hash->{n} += 1;
@@ -4625,6 +4640,12 @@ sub vmconfig_update_net {
 	    die "internal error" if $opt !~ m/net(\d+)/;
 	    my $iface = "tap${vmid}i$1";
 
+	    # setting out/in-rate to old rate if rate is set and both new and old out/in-rate are not set
+	    # needed for backwards-compatibility, only applies if old config has not changed since update
+            # if the out/in-rate was changed by the user rate will always be empty
+	    $newnet->{inrate} = $oldnet->{rate} if !$oldnet->{inrate} && !$newnet->{inrate} && $oldnet->{rate};
+	    $newnet->{outrate} = $oldnet->{rate} if !$oldnet->{outrate} && !$newnet->{outrate} && $oldnet->{rate};
+
 	    if (safe_string_ne($oldnet->{bridge}, $newnet->{bridge}) ||
 		safe_num_ne($oldnet->{tag}, $newnet->{tag}) ||
 		safe_string_ne($oldnet->{trunks}, $newnet->{trunks}) ||
@@ -4632,14 +4653,16 @@ sub vmconfig_update_net {
 		PVE::Network::tap_unplug($iface);
 
 		if ($have_sdn) {
-		    PVE::Network::SDN::Zones::tap_plug($iface, $newnet->{bridge}, $newnet->{tag}, $newnet->{firewall}, $newnet->{trunks}, $newnet->{rate});
+		    PVE::Network::SDN::Zones::tap_plug($iface, $newnet->{bridge}, $newnet->{tag}, $newnet->{firewall}, $newnet->{trunks}, $newnet->{outrate}, $newnet->{inrate});
 		} else {
-		    PVE::Network::tap_plug($iface, $newnet->{bridge}, $newnet->{tag}, $newnet->{firewall}, $newnet->{trunks}, $newnet->{rate});
+		    PVE::Network::tap_plug($iface, $newnet->{bridge}, $newnet->{tag}, $newnet->{firewall}, $newnet->{trunks}, $newnet->{outrate}, $newnet->{inrate});
 		}
-	    } elsif (safe_num_ne($oldnet->{rate}, $newnet->{rate})) {
+	    } elsif (safe_num_ne($oldnet->{inrate}, $newnet->{inrate}) ||
+		    safe_num_ne($oldnet->{outrate}, $newnet->{outrate})) {
+
 		# Rate can be applied on its own but any change above needs to
 		# include the rate in tap_plug since OVS resets everything.
-		PVE::Network::tap_rate_limit($iface, $newnet->{rate});
+		PVE::Network::tap_rate_limit($iface, $newnet->{outrate}, $newnet->{inrate});
 	    }
 
 	    if (safe_string_ne($oldnet->{link_down}, $newnet->{link_down})) {
diff --git a/vm-network-scripts/pve-bridge b/vm-network-scripts/pve-bridge
index d37ce33..4dfd369 100755
--- a/vm-network-scripts/pve-bridge
+++ b/vm-network-scripts/pve-bridge
@@ -42,13 +42,16 @@ die "unable to get network config '$netid'\n"
 
 my $net = PVE::QemuServer::parse_net($netconf);
 die "unable to parse network config '$netid'\n" if !$net;
-
+# setting out/in-rate to rate if rate is set and out/in-rate is not set
+# if out/int-rate was changed by the user, rate will always be empty
+$net->{outrate} = $net->{rate} if !$net->{outrate} && $net->{rate};
+$net->{inrate} = $net->{rate} if !$net->{inrate} && $net->{rate};
 if ($have_sdn) {
     PVE::Network::SDN::Zones::tap_create($iface, $net->{bridge});
-    PVE::Network::SDN::Zones::tap_plug($iface, $net->{bridge}, $net->{tag}, $net->{firewall}, $net->{trunks}, $net->{rate});
+    PVE::Network::SDN::Zones::tap_plug($iface, $net->{bridge}, $net->{tag}, $net->{firewall}, $net->{trunks}, $net->{outrate}, $net->{inrate});
 } else {
     PVE::Network::tap_create($iface, $net->{bridge});
-    PVE::Network::tap_plug($iface, $net->{bridge}, $net->{tag}, $net->{firewall}, $net->{trunks}, $net->{rate});
+    PVE::Network::tap_plug($iface, $net->{bridge}, $net->{tag}, $net->{firewall}, $net->{trunks}, $net->{outrate}, $net->{inrate});
 }
 
 exit 0;
-- 
2.20.1





More information about the pve-devel mailing list