]> git.proxmox.com Git - pve-network.git/blame - PVE/Network/SDN/Zones/VlanPlugin.pm
vlan plugin: add support for no vlan-aware bridge
[pve-network.git] / PVE / Network / SDN / Zones / VlanPlugin.pm
CommitLineData
f5eabba0 1package PVE::Network::SDN::Zones::VlanPlugin;
f8140d53
AD
2
3use strict;
4use warnings;
f5eabba0 5use PVE::Network::SDN::Zones::Plugin;
f8140d53 6
f5eabba0 7use base('PVE::Network::SDN::Zones::Plugin');
f8140d53
AD
8
9sub type {
10 return 'vlan';
11}
12
6bffe819
AD
13PVE::JSONSchema::register_format('pve-sdn-vlanrange', \&pve_verify_sdn_vlanrange);
14sub pve_verify_sdn_vlanrange {
f8140d53
AD
15 my ($vlanstr) = @_;
16
f5eabba0 17 PVE::Network::SDN::Zones::Plugin::parse_tag_number_or_range($vlanstr, '4096');
f8140d53
AD
18
19 return $vlanstr;
20}
21
22sub properties {
23 return {
938ebef7
AD
24 'bridge' => {
25 type => 'string',
eec580bf 26 },
f8140d53
AD
27 };
28}
29
30sub options {
31
32 return {
c2b9c173 33 nodes => { optional => 1},
938ebef7 34 'bridge' => { optional => 0 },
7d1035b2 35 mtu => { optional => 1 }
f8140d53
AD
36 };
37}
38
39# Plugin implementation
6bffe819 40sub generate_sdn_config {
ba7ac021 41 my ($class, $plugin_config, $zoneid, $vnetid, $vnet, $controller, $interfaces_config, $config) = @_;
7d1035b2
AD
42
43 my $bridge = $plugin_config->{bridge};
44 my $vlan_aware = PVE::Tools::file_read_firstline("/sys/class/net/$bridge/bridge/vlan_filtering");
45 my $is_ovs = 1 if !-d "/sys/class/net/$bridge/brif";
46 return if $vlan_aware || $is_ovs;
47
48 my $tag = $vnet->{tag};
49 my $alias = $vnet->{alias};
50 my $mtu = $plugin_config->{mtu} if $plugin_config->{mtu};
51 my $bridgevlan = $bridge."v".$tag;
52
53 my @bridge_ifaces = ();
54 my $dir = "/sys/class/net/$bridge/brif";
55 PVE::Tools::dir_glob_foreach($dir, '(((eth|bond)\d+|en[^.]+)(\.\d+)?)', sub {
56 push @bridge_ifaces, $_[0];
57 });
58
59 my $bridge_ports = "";
60 $bridge_ports = "none" if scalar(@bridge_ifaces) == 0;
61
62 foreach my $bridge_iface (@bridge_ifaces) {
63 $bridge_ports .= " $bridge_iface.$tag";
64 }
65
66 #vnet bridge (keep vmbrXvY for compatibility)
67 my @iface_config = ();
68 push @iface_config, "bridge_ports $bridge_ports";
69 push @iface_config, "bridge_stp off";
70 push @iface_config, "bridge_fd 0";
71 push @iface_config, "mtu $mtu" if $mtu;
72 push @iface_config, "alias $alias" if $alias;
73 push(@{$config->{$bridgevlan}}, @iface_config) if !$config->{$vnetid};
74
75 return $config;
f8140d53
AD
76}
77
6ed053c1
AD
78sub status {
79 my ($class, $plugin_config, $zone, $id, $vnet, $err_config, $status, $vnet_status, $zone_status) = @_;
80
81 my $bridge = $plugin_config->{bridge};
82 $vnet_status->{$id}->{zone} = $zone;
83 $zone_status->{$zone}->{status} = 'available' if !defined($zone_status->{$zone}->{status});
84
85 if($err_config) {
86 $vnet_status->{$id}->{status} = 'pending';
87 $vnet_status->{$id}->{statusmsg} = $err_config;
88 $zone_status->{$zone}->{status} = 'pending';
89 } elsif ($status->{$bridge}->{status} && $status->{$bridge}->{status} eq 'pass') {
90 $vnet_status->{$id}->{status} = 'available';
91 } else {
92 $vnet_status->{$id}->{status} = 'error';
93 $vnet_status->{$id}->{statusmsg} = 'missing bridge';
94 $zone_status->{$zone}->{status} = 'error';
95 }
96}
97
2ba9613b 98sub get_bridge_vlan {
eb1549e7 99 my ($class, $plugin_config, $vnetid, $tag) = @_;
2ba9613b
AD
100
101 my $bridge = $plugin_config->{bridge};
eb1549e7 102
2ba9613b
AD
103 die "bridge $bridge is missing" if !-d "/sys/class/net/$bridge/";
104
105 my $vlan_aware = PVE::Tools::file_read_firstline("/sys/class/net/$bridge/bridge/vlan_filtering");
106 my $is_ovs = 1 if !-d "/sys/class/net/$bridge/brif";
107
7d1035b2
AD
108
109 return ($bridge."v".$tag, undef) if !$is_ovs && !$vlan_aware;
2ba9613b
AD
110
111 return ($bridge, $tag);
112}
113
f8140d53
AD
1141;
115
116