]> git.proxmox.com Git - pve-network.git/commitdiff
add qinq plugin
authorAlexandre Derumier <aderumier@odiso.com>
Mon, 30 Sep 2019 09:03:38 +0000 (11:03 +0200)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Thu, 17 Oct 2019 17:25:49 +0000 (19:25 +0200)
move code from vlanplugin, add transport tag option

Signed-off-by: Alexandre Derumier <aderumier@odiso.com>
PVE/API2/Network/SDN.pm
PVE/Network/SDN.pm
PVE/Network/SDN/Makefile
PVE/Network/SDN/QinQPlugin.pm [new file with mode: 0644]
PVE/Network/SDN/VlanPlugin.pm

index 8294cb86f3fa9f0cf21564ca4bcee0f86fac0c07..36d293d968757fe68502ae2adc3722bd845e7e4c 100644 (file)
@@ -15,6 +15,7 @@ use PVE::Network::SDN::FaucetControllerPlugin;
 use PVE::Network::SDN::FaucetPlugin;
 use PVE::Network::SDN::EvpnControllerPlugin;
 use PVE::Network::SDN::EvpnPlugin;
+use PVE::Network::SDN::QinQPlugin;
 
 use Storable qw(dclone);
 use PVE::JSONSchema qw(get_standard_option);
index 8e8e6379a727e64f85289e302faecefaa2cece91..96f76d1821293b4707daf552ff728833e824ff4e 100644 (file)
@@ -16,6 +16,7 @@ use PVE::Network::SDN::FaucetPlugin;
 use PVE::Network::SDN::FaucetControllerPlugin;
 use PVE::Network::SDN::EvpnPlugin;
 use PVE::Network::SDN::EvpnControllerPlugin;
+use PVE::Network::SDN::QinQPlugin;
 
 PVE::Network::SDN::VnetPlugin->register();
 PVE::Network::SDN::VlanPlugin->register();
@@ -24,6 +25,7 @@ PVE::Network::SDN::FaucetControllerPlugin->register();
 PVE::Network::SDN::FaucetPlugin->register();
 PVE::Network::SDN::EvpnPlugin->register();
 PVE::Network::SDN::EvpnControllerPlugin->register();
+PVE::Network::SDN::QinQPlugin->register();
 PVE::Network::SDN::Plugin->init();
 
 
index ba8f90379572bec742301ae498afb6105cc95eed..232db52bc02ba6f5db09510cbe7488d85ab8b65a 100644 (file)
@@ -1,4 +1,4 @@
-SOURCES=Plugin.pm VnetPlugin.pm VlanPlugin.pm VxlanPlugin.pm FaucetControllerPlugin.pm FaucetPlugin.pm EvpnPlugin.pm EvpnControllerPlugin.pm
+SOURCES=Plugin.pm VnetPlugin.pm VlanPlugin.pm VxlanPlugin.pm FaucetControllerPlugin.pm FaucetPlugin.pm EvpnPlugin.pm EvpnControllerPlugin.pm QinQPlugin.pm
 
 
 PERL5DIR=${DESTDIR}/usr/share/perl5
diff --git a/PVE/Network/SDN/QinQPlugin.pm b/PVE/Network/SDN/QinQPlugin.pm
new file mode 100644 (file)
index 0000000..9f40e84
--- /dev/null
@@ -0,0 +1,81 @@
+package PVE::Network::SDN::QinQPlugin;
+
+use strict;
+use warnings;
+use PVE::Network::SDN::VlanPlugin;
+
+use base('PVE::Network::SDN::VlanPlugin');
+
+sub type {
+    return 'qinq';
+}
+
+sub plugindata {
+    return {
+       role => 'transport',
+    };
+}
+
+sub properties {
+    return {
+       'vlan-protocol' => {
+           type => 'string',
+            enum => ['802.1q', '802.1ad'],
+           default => '802.1q',
+           optional => 1,
+           description => "vlan protocol",
+       }
+    };
+}
+
+sub options {
+
+    return {
+       'uplink-id' => { optional => 0 },
+       'tag' => { optional => 0 },
+        'vlan-allowed' => { optional => 1 },
+       'vlan-protocol' => { optional => 1 },
+    };
+}
+
+# Plugin implementation
+sub generate_sdn_config {
+    my ($class, $plugin_config, $zoneid, $vnetid, $vnet, $uplinks, $config) = @_;
+
+    my $tag = $vnet->{tag};
+    my $transport_tag = $plugin_config->{tag};
+    my $mtu = $vnet->{mtu};
+    my $alias = $vnet->{alias};
+    my $vlanprotocol = $plugin_config->{'vlan-protocol'};
+    my $uplink = $plugin_config->{'uplink-id'};
+    my $vlanallowed = $plugin_config->{'vlan-allowed'};
+
+    die "missing vlan tag" if !$tag;
+    die "missing transport vlan tag" if !$transport_tag;
+
+    my $iface = $uplinks->{$uplink}->{name};
+    $iface = "uplink${uplink}" if !$iface;
+    $iface .= ".$transport_tag";
+
+    #tagged interface
+    my @iface_config = ();
+    push @iface_config, "vlan-protocol $vlanprotocol" if $vlanprotocol;
+    push @iface_config, "mtu $mtu" if $mtu;
+    push(@{$config->{$iface}}, @iface_config) if !$config->{$iface};
+
+    $iface .= ".$tag";
+    #vnet bridge
+    @iface_config = ();
+    push @iface_config, "bridge_ports $iface";
+    push @iface_config, "bridge_stp off";
+    push @iface_config, "bridge_fd 0";
+    push @iface_config, "mtu $mtu" if $mtu;
+    push @iface_config, "alias $alias" if $alias;
+    push(@{$config->{$vnetid}}, @iface_config) if !$config->{$vnetid};
+
+    return $config;
+}
+
+1;
+
+
index 60782064a11bc3e24c450b074e13baf8b5860f07..5a38f596e9df5ac9f7483e5808a5f21014fb9906 100644 (file)
@@ -36,17 +36,6 @@ sub properties {
            type => 'string', format => 'pve-sdn-vlanrange',
            description => "Allowed vlan range",
        },
-       'vlan-aware' => {
-            type => 'boolean',
-           description => "enable 802.1q stacked vlan",
-       },
-       'vlan-protocol' => {
-           type => 'string',
-            enum => ['802.1q', '802.1ad'],
-           default => '802.1q',
-           optional => 1,
-           description => "vlan protocol",
-       }
     };
 }
 
@@ -55,9 +44,6 @@ sub options {
     return {
        'uplink-id' => { optional => 0 },
         'vlan-allowed' => { optional => 1 },
-       'vlan-protocol' => { optional => 1 },
-       'vlan-aware' => { optional => 1 },
-
     };
 }
 
@@ -68,10 +54,7 @@ sub generate_sdn_config {
     my $tag = $vnet->{tag};
     my $mtu = $vnet->{mtu};
     my $alias = $vnet->{alias};
-    my $vlanaware = $plugin_config->{'vlan-aware'};
-    my $vlanprotocol = $plugin_config->{'vlan-protocol'};
     my $uplink = $plugin_config->{'uplink-id'};
-    my $vlanallowed = $plugin_config->{'vlan-allowed'};
 
     die "missing vlan tag" if !$tag;
 
@@ -81,7 +64,6 @@ sub generate_sdn_config {
 
     #tagged interface
     my @iface_config = ();
-    push @iface_config, "vlan-protocol $vlanprotocol" if $vlanprotocol;
     push @iface_config, "mtu $mtu" if $mtu;
     push(@{$config->{$iface}}, @iface_config) if !$config->{$iface};
 
@@ -90,7 +72,6 @@ sub generate_sdn_config {
     push @iface_config, "bridge_ports $iface";
     push @iface_config, "bridge_stp off";
     push @iface_config, "bridge_fd 0";
-    push @iface_config, "bridge-vlan-aware yes" if $vlanaware;
     push @iface_config, "mtu $mtu" if $mtu;
     push @iface_config, "alias $alias" if $alias;
     push(@{$config->{$vnetid}}, @iface_config) if !$config->{$vnetid};