]> git.proxmox.com Git - pve-network.git/commitdiff
add get_bridge_vlan
authorAlexandre Derumier <aderumier@odiso.com>
Mon, 10 Feb 2020 16:26:10 +0000 (17:26 +0100)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Tue, 11 Feb 2020 18:03:38 +0000 (19:03 +0100)
return correct bridge/vlan from sdn for tap/veth create/plug

PVE/Network/SDN/Zones.pm
PVE/Network/SDN/Zones/Plugin.pm
PVE/Network/SDN/Zones/QinQPlugin.pm
PVE/Network/SDN/Zones/VlanPlugin.pm

index e3d72e87a35572bc06d4d4511d4cb83fba63f8d0..4a154f44bc5fdc31485a55ec1f800d37ec5c00ff 100644 (file)
@@ -214,5 +214,25 @@ sub status {
     return($zone_status, $vnet_status);
 }
 
+sub get_bridge_vlan {
+    my ($vnetid) = @_;
+
+    my $vnet_cfg = PVE::Cluster::cfs_read_file('sdn/vnets.cfg');
+    my $zone_cfg = PVE::Cluster::cfs_read_file('sdn/zones.cfg');
+    my $nodename = PVE::INotify::nodename();
+
+    my $vnet = $vnet_cfg->{ids}->{$vnetid};
+    return if !$vnet;
+
+    my $zoneid = $vnet->{zone};
+    my $tag = $vnet->{tag};
+
+    die "vnet $vnetid is not allowed on this node" if defined($zone_cfg->{ids}->{$zoneid}->{nodes}) && !$zone_cfg->{ids}->{$zoneid}->{nodes}->{$nodename};
+
+    my $plugin_config = $zone_cfg->{ids}->{$zoneid};
+    my $plugin = PVE::Network::SDN::Zones::Plugin->lookup($plugin_config->{type});
+    return $plugin->get_bridge_vlan($plugin_config, $zoneid, $vnetid, $tag);
+}
+
 1;
 
index 5aeff190013c9387d8a24eba7dc1e9847a0698b4..13a6e573bf9e1c4aa414c332c7fc620fcf67f091 100644 (file)
@@ -206,6 +206,19 @@ sub status {
     }
 }
 
+
+sub get_bridge_vlan {
+    my ($class, $plugin_config, $zoneid, $vnetid, $tag) = @_;
+
+    my $bridge = $plugin_config->{bridge};
+    die "bridge $bridge is missing" if !-d "/sys/class/net/$bridge/";
+
+    $bridge = $vnetid;
+    $tag = undef;
+
+    return ($bridge, $tag);
+}
+
 #helper
 
 sub get_uplink_iface {
index 28527b61c7b473dbd181b9a26b53c595d4c00443..0557499fe8f186886b328cbd349f9349f2d67e8f 100644 (file)
@@ -82,6 +82,21 @@ sub status {
     }
 }
 
+sub get_bridge_vlan {
+    my ($class, $plugin_config, $zoneid, $vnetid, $tag) = @_;
+
+    my $bridge = $plugin_config->{bridge};
+    die "bridge $bridge is missing" if !-d "/sys/class/net/$bridge/";
+
+    my $vlan_aware = PVE::Tools::file_read_firstline("/sys/class/net/$bridge/bridge/vlan_filtering");
+    my $is_ovs = 1 if !-d "/sys/class/net/$bridge/brif";
+
+    die "ovs $bridge is not supported by qinq" if $is_ovs;
+    die "bridge $bridge is not vlan aware" if !$vlan_aware;
+
+    return ($bridge, $tag);
+}
+
 1;
 
 
index b5f00ca1cba6707ff62431f9b5c570e52461cf6b..bc13e6735dea56689fa4b44cc7e5339b41d6af79 100644 (file)
@@ -61,6 +61,20 @@ sub status {
     }
 }
 
+sub get_bridge_vlan {
+    my ($class, $plugin_config, $zoneid, $vnetid, $tag) = @_;
+
+    my $bridge = $plugin_config->{bridge};
+    die "bridge $bridge is missing" if !-d "/sys/class/net/$bridge/";
+
+    my $vlan_aware = PVE::Tools::file_read_firstline("/sys/class/net/$bridge/bridge/vlan_filtering");
+    my $is_ovs = 1 if !-d "/sys/class/net/$bridge/brif";
+
+    die "bridge $bridge is not vlan aware" if !$is_ovs && !$vlan_aware;
+
+    return ($bridge, $tag);
+}
+
 1;