]> git.proxmox.com Git - pve-network.git/blob - PVE/Network/SDN/Zones/QinQPlugin.pm
vlan/qinq: use vlan-raw-device to support long predictable interfaces name
[pve-network.git] / PVE / Network / SDN / Zones / QinQPlugin.pm
1 package PVE::Network::SDN::Zones::QinQPlugin;
2
3 use strict;
4 use warnings;
5 use PVE::Network::SDN::Zones::VlanPlugin;
6
7 use base('PVE::Network::SDN::Zones::VlanPlugin');
8
9 sub type {
10 return 'qinq';
11 }
12
13 sub properties {
14 return {
15 tag => {
16 type => 'integer',
17 description => "vlan tag",
18 },
19 'vlan-protocol' => {
20 type => 'string',
21 enum => ['802.1q', '802.1ad'],
22 default => '802.1q',
23 optional => 1,
24 description => "vlan protocol",
25 }
26 };
27 }
28
29 sub options {
30
31 return {
32 nodes => { optional => 1},
33 'uplink-id' => { optional => 0 },
34 'tag' => { optional => 0 },
35 'vlan-protocol' => { optional => 1 },
36 };
37 }
38
39 # Plugin implementation
40 sub generate_sdn_config {
41 my ($class, $plugin_config, $zoneid, $vnetid, $vnet, $controller, $interfaces_config, $config) = @_;
42
43 my $tag = $vnet->{tag};
44 my $zone_tag = $plugin_config->{tag};
45 my $mtu = $vnet->{mtu};
46 my $alias = $vnet->{alias};
47 my $vlanprotocol = $plugin_config->{'vlan-protocol'};
48 my $uplink = $plugin_config->{'uplink-id'};
49
50 die "missing vlan tag" if !$tag;
51 die "missing zone vlan tag" if !$zone_tag;
52
53 my $iface = PVE::Network::SDN::Zones::Plugin::get_uplink_iface($interfaces_config, $uplink);
54
55 #service vlan
56 my @iface_config = ();
57 push @iface_config, "vlan-raw-device $iface";
58 push @iface_config, "vlan-id $zone_tag";
59 push @iface_config, "vlan-protocol $vlanprotocol" if $vlanprotocol;
60 push @iface_config, "mtu $mtu" if $mtu;
61 push(@{$config->{"qinq$zoneid"}}, @iface_config) if !$config->{$iface};
62
63 #customer vlan
64 @iface_config = ();
65 push @iface_config, "vlan-raw-device qinq$zoneid";
66 push @iface_config, "vlan-id $tag";
67 push @iface_config, "mtu $mtu" if $mtu;
68 push(@{$config->{"vlan$vnetid"}}, @iface_config) if !$config->{$iface};
69
70 #vnet bridge
71 @iface_config = ();
72 push @iface_config, "bridge_ports vlan$vnetid";
73 push @iface_config, "bridge_stp off";
74 push @iface_config, "bridge_fd 0";
75 push @iface_config, "mtu $mtu" if $mtu;
76 push @iface_config, "alias $alias" if $alias;
77 push(@{$config->{$vnetid}}, @iface_config) if !$config->{$vnetid};
78
79 return $config;
80 }
81
82 1;
83
84