[pve-devel] [PATCH pve-common 3/3] INotify : check_bridge : fix bridge-ports with vlan tagged interface

Alexandre Derumier aderumier at odiso.com
Fri Feb 7 12:40:28 CET 2020


Currently with strip vlan tag, that's wrong because
mtu && others check are done the main interface.
---
 src/PVE/INotify.pm                            | 21 ++++++++++++------
 .../t.create_network.pl                       | 22 +++++++++++++++++--
 2 files changed, 34 insertions(+), 9 deletions(-)

diff --git a/src/PVE/INotify.pm b/src/PVE/INotify.pm
index 7becbde..ba952e3 100644
--- a/src/PVE/INotify.pm
+++ b/src/PVE/INotify.pm
@@ -1,7 +1,6 @@
 package PVE::INotify;
 
 # todo: maybe we do not need update_file() ?
-
 use strict;
 use warnings;
 
@@ -1554,18 +1553,26 @@ sub __write_etc_network_interfaces {
     # check bridgeport option
     my $bridgeports = {};
     my $bridges = {};
-    foreach my $iface (keys %$ifaces) {
-	my $d = $ifaces->{$iface};
+    my $ifaces_copy = { %$ifaces };
+    foreach my $iface (keys %$ifaces_copy) {
+	my $d = $ifaces_copy->{$iface};
 	if ($d->{type} eq 'bridge') {
 	    foreach my $p (split (/\s+/, $d->{bridge_ports})) {
-		$p =~ s/\.\d+$//;
-		my $n = $ifaces->{$p};
+		if($p =~ m/(\S+)\.(\d+)$/) {
+		    my $vlanparent = $1;
+		    if (!defined($ifaces_copy->{$p})) {
+			$ifaces_copy->{$p}->{type} = 'vlan';
+			$ifaces_copy->{$p}->{method} = 'manual';
+			$ifaces_copy->{$p}->{method6} = 'manual';
+			$ifaces_copy->{$p}->{mtu} = $ifaces_copy->{$vlanparent}->{mtu} if defined($ifaces_copy->{$1}->{mtu});
+		    }
+		}
+		my $n = $ifaces_copy->{$p};
 		die "bridge '$iface' - unable to find bridge port '$p'\n" if !$n;
 		die "iface $p - ip address can't be set on interface if bridged in $iface\n"
 		    if ($n->{method} && $n->{method} eq 'static' && $n->{address} ne '0.0.0.0') ||
 		       ($n->{method6} && $n->{method6} eq 'static' && $n->{address} ne '::');
-
-		&$check_mtu($ifaces, $p, $iface);
+		&$check_mtu($ifaces_copy, $p, $iface);
 		$bridgeports->{$p} = $iface;
 	    }
 	    $bridges->{$iface} = $d;
diff --git a/test/etc_network_interfaces/t.create_network.pl b/test/etc_network_interfaces/t.create_network.pl
index d6418f4..700eeef 100644
--- a/test/etc_network_interfaces/t.create_network.pl
+++ b/test/etc_network_interfaces/t.create_network.pl
@@ -205,7 +205,7 @@ $config->{ifaces}->{vmbr3} = {
     families => ['inet'],
     bridge_stp => 'off',
     bridge_fd => 0,
-    bridge_ports => 'vxlan3.50',
+    bridge_ports => 'vxlan3',
     bridge_vlan_aware => 'yes',
     bridge_vids => '2-10',
     autostart => 1
@@ -229,7 +229,7 @@ iface vmbr2 inet manual
 
 auto vmbr3
 iface vmbr3 inet manual
-	bridge-ports vxlan3.50
+	bridge-ports vxlan3
 	bridge-stp off
 	bridge-fd 0
 	bridge-vlan-aware yes
@@ -336,6 +336,17 @@ $config->{ifaces}->{'vmbr4'} = {
     autostart => 1
 };
 
+$config->{ifaces}->{'vmbr5'} = {
+    mtu => 1100,
+    type => 'bridge',
+    method => 'manual',
+    families => ['inet'],
+    bridge_stp => 'off',
+    bridge_fd => 0,
+    bridge_ports => 'vmbr4.99',
+    autostart => 1
+};
+
 expect load('loopback') . <<"CHECK";
 source-directory interfaces.d
 
@@ -373,6 +384,13 @@ iface vmbr4 inet manual
 	bridge-fd 0
 	mtu 1200
 
+auto vmbr5
+iface vmbr5 inet manual
+	bridge-ports vmbr4.99
+	bridge-stp off
+	bridge-fd 0
+	mtu 1100
+
 auto vmbr1.100
 iface vmbr1.100 inet manual
 	mtu 1300
-- 
2.20.1



More information about the pve-devel mailing list