]>
git.proxmox.com Git - pve-network.git/blob - PVE/Network/SDN/Zones/QinQPlugin.pm
1 package PVE
::Network
::SDN
::Zones
::QinQPlugin
;
5 use PVE
::Network
::SDN
::Zones
::VlanPlugin
;
7 use base
('PVE::Network::SDN::Zones::VlanPlugin');
17 description
=> "vlan tag",
30 nodes
=> { optional
=> 1},
31 'tag' => { optional
=> 0 },
32 'bridge' => { optional
=> 0 },
33 'mtu' => { optional
=> 1 },
37 # Plugin implementation
38 sub generate_sdn_config
{
39 my ($class, $plugin_config, $zoneid, $vnetid, $vnet, $controller, $interfaces_config, $config) = @_;
41 my $tag = $plugin_config->{tag
};
42 my $mtu = $plugin_config->{mtu
};
43 my $bridge = $plugin_config->{'bridge'};
45 die "missing vlan tag" if !$tag;
47 if (!$config->{$zoneid}) {
49 my @iface_config = ();
50 push @iface_config, "mtu $mtu" if $mtu;
51 push @iface_config, "bridge-stp off";
52 push @iface_config, "bridge-fd 0";
53 push @iface_config, "bridge-vlan-aware yes";
54 push @iface_config, "bridge-vids 2-4094";
55 push(@{$config->{$zoneid}}, @iface_config);
57 #main bridge. ifupdown2 will merge it
59 push @iface_config, "bridge-ports $zoneid.$tag";
60 push(@{$config->{$bridge}}, @iface_config);
66 my ($class, $plugin_config, $zone, $id, $vnet, $err_config, $status, $vnet_status, $zone_status) = @_;
68 my $bridge = $plugin_config->{bridge
};
69 $vnet_status->{$id}->{zone
} = $zone;
70 $zone_status->{$zone}->{status
} = 'available' if !defined($zone_status->{$zone}->{status
});
73 $vnet_status->{$id}->{status
} = 'pending';
74 $vnet_status->{$id}->{statusmsg
} = $err_config;
75 $zone_status->{$zone}->{status
} = 'pending';
76 } elsif ($status->{$bridge}->{status
} && $status->{$bridge}->{status
} eq 'pass') {
77 $vnet_status->{$id}->{status
} = 'available';
79 $vnet_status->{$id}->{status
} = 'error';
80 $vnet_status->{$id}->{statusmsg
} = 'missing bridge';
81 $zone_status->{$zone}->{status
} = 'error';
86 my ($class, $plugin_config, $zoneid, $vnetid, $tag) = @_;
88 my $bridge = $plugin_config->{bridge
};
89 die "bridge $bridge is missing" if !-d
"/sys/class/net/$bridge/";
91 my $vlan_aware = PVE
::Tools
::file_read_firstline
("/sys/class/net/$bridge/bridge/vlan_filtering");
92 my $is_ovs = 1 if !-d
"/sys/class/net/$bridge/brif";
94 die "ovs $bridge is not supported by qinq" if $is_ovs;
95 die "bridge $bridge is not vlan aware" if !$vlan_aware;
97 return ($bridge, $tag);