]>
Commit | Line | Data |
---|---|---|
f5eabba0 | 1 | package PVE::Network::SDN::Zones::QinQPlugin; |
20e19696 AD |
2 | |
3 | use strict; | |
4 | use warnings; | |
f5eabba0 | 5 | use PVE::Network::SDN::Zones::VlanPlugin; |
20e19696 | 6 | |
f5eabba0 | 7 | use base('PVE::Network::SDN::Zones::VlanPlugin'); |
20e19696 AD |
8 | |
9 | sub type { | |
10 | return 'qinq'; | |
11 | } | |
12 | ||
20e19696 AD |
13 | sub properties { |
14 | return { | |
f5eabba0 AD |
15 | tag => { |
16 | type => 'integer', | |
17 | description => "vlan tag", | |
18 | }, | |
20e19696 AD |
19 | }; |
20 | } | |
21 | ||
22 | sub options { | |
23 | ||
24 | return { | |
c2b9c173 | 25 | nodes => { optional => 1}, |
20e19696 | 26 | 'tag' => { optional => 0 }, |
938ebef7 | 27 | 'bridge' => { optional => 0 }, |
20e19696 AD |
28 | }; |
29 | } | |
30 | ||
31 | # Plugin implementation | |
32 | sub generate_sdn_config { | |
ba7ac021 | 33 | my ($class, $plugin_config, $zoneid, $vnetid, $vnet, $controller, $interfaces_config, $config) = @_; |
20e19696 | 34 | |
938ebef7 AD |
35 | my $tag = $plugin_config->{tag}; |
36 | my $mtu = $plugin_config->{mtu}; | |
37 | my $bridge = $plugin_config->{'bridge'}; | |
20e19696 AD |
38 | |
39 | die "missing vlan tag" if !$tag; | |
20e19696 | 40 | |
938ebef7 AD |
41 | if (!$config->{$zoneid}) { |
42 | #zone vlan bridge | |
43 | my @iface_config = (); | |
44 | push @iface_config, "mtu $mtu" if $mtu; | |
45 | push @iface_config, "bridge-stp off"; | |
46 | push @iface_config, "bridge-fd 0"; | |
47 | push @iface_config, "bridge-vlan-aware yes"; | |
48 | push @iface_config, "bridge-vids 2-4094"; | |
49 | push(@{$config->{$zoneid}}, @iface_config); | |
50 | ||
51 | #main bridge. ifupdown2 will merge it | |
52 | @iface_config = (); | |
53 | push @iface_config, "bridge-ports $zoneid.$tag"; | |
54 | push(@{$config->{$bridge}}, @iface_config); | |
55 | return $config; | |
56 | } | |
20e19696 AD |
57 | } |
58 | ||
58433186 AD |
59 | sub status { |
60 | my ($class, $plugin_config, $zone, $id, $vnet, $err_config, $status, $vnet_status, $zone_status) = @_; | |
61 | ||
62 | my $bridge = $plugin_config->{bridge}; | |
63 | $vnet_status->{$id}->{zone} = $zone; | |
64 | $zone_status->{$zone}->{status} = 'available' if !defined($zone_status->{$zone}->{status}); | |
65 | ||
66 | if($err_config) { | |
67 | $vnet_status->{$id}->{status} = 'pending'; | |
68 | $vnet_status->{$id}->{statusmsg} = $err_config; | |
69 | $zone_status->{$zone}->{status} = 'pending'; | |
70 | } elsif ($status->{$bridge}->{status} && $status->{$bridge}->{status} eq 'pass') { | |
71 | $vnet_status->{$id}->{status} = 'available'; | |
72 | } else { | |
73 | $vnet_status->{$id}->{status} = 'error'; | |
74 | $vnet_status->{$id}->{statusmsg} = 'missing bridge'; | |
75 | $zone_status->{$zone}->{status} = 'error'; | |
76 | } | |
77 | } | |
78 | ||
20e19696 AD |
79 | 1; |
80 | ||
81 |