]>
git.proxmox.com Git - pve-network.git/blob - PVE/Network/SDN/Zones/QinQPlugin.pm
fe43d4232e9052204ce762ab12120dacab2ba776
1 package PVE
::Network
::SDN
::Zones
::QinQPlugin
;
5 use PVE
::Network
::SDN
::Zones
::Plugin
;
7 use base
('PVE::Network::SDN::Zones::Plugin');
17 description
=> "vlan tag",
26 enum
=> ['802.1q', '802.1ad'],
36 nodes
=> { optional
=> 1},
37 'tag' => { optional
=> 0 },
38 'bridge' => { optional
=> 0 },
39 'mtu' => { optional
=> 1 },
40 'vlan-protocol' => { optional
=> 1 },
44 # Plugin implementation
45 sub generate_sdn_config
{
46 my ($class, $plugin_config, $zoneid, $vnetid, $vnet, $controller, $interfaces_config, $config) = @_;
48 my $stag = $plugin_config->{tag
};
49 my $mtu = $plugin_config->{mtu
};
50 my $bridge = $plugin_config->{'bridge'};
51 my $vlanprotocol = $plugin_config->{'vlan-protocol'};
52 my $ctag = $vnet->{tag
};
53 my $alias = $vnet->{alias
};
55 my $vlan_aware = PVE
::Tools
::file_read_firstline
("/sys/class/net/$bridge/bridge/vlan_filtering");
56 my $is_ovs = 1 if !-d
"/sys/class/net/$bridge/brif";
58 my @iface_config = ();
59 my $vnet_bridge_ports = "";
63 #ovs--->ovsintport(dot1q-tunnel tag)------->vlanawarebrige-----(tag)--->vnet
65 $vlanprotocol = "802.1q" if !$vlanprotocol;
66 my $svlan_iface = "sv_".$zoneid;
67 my $zone = "z_$zoneid";
69 #ovs dot1q-tunnel port
71 push @iface_config, "ovs_type OVSIntPort";
72 push @iface_config, "ovs_bridge $bridge";
73 push @iface_config, "ovs_options vlan_mode=dot1q-tunnel tag=$stag other_config:qinq-ethtype=$vlanprotocol";
74 push(@{$config->{$svlan_iface}}, @iface_config) if !$config->{$svlan_iface};
77 #zone vlan aware bridge
79 push @iface_config, "mtu $mtu" if $mtu;
80 push @iface_config, "bridge-stp off";
81 push @iface_config, "bridge-ports $svlan_iface";
82 push @iface_config, "bridge-fd 0";
83 push @iface_config, "bridge-vlan-aware yes";
84 push @iface_config, "bridge-vids 2-4094";
85 push(@{$config->{$zone}}, @iface_config) if !$config->{$zone};
87 $vnet_bridge_ports = "$zone.$ctag";
89 } elsif ($vlan_aware) {
91 #vlanawarebrige-(tag)----->vlanwarebridge-(tag)----->vnet
93 my $zone = "z_$zoneid";
97 push @iface_config, "bridge-vlan-protocol $vlanprotocol";
98 push(@{$config->{$bridge}}, @iface_config) if !$config->{$bridge};
103 push @iface_config, "mtu $mtu" if $mtu;
104 push @iface_config, "bridge-stp off";
105 push @iface_config, "bridge-ports $bridge.$stag";
106 push @iface_config, "bridge-fd 0";
107 push @iface_config, "bridge-vlan-aware yes";
108 push @iface_config, "bridge-vids 2-4094";
109 push(@{$config->{$zone}}, @iface_config) if !$config->{$zone};
111 $vnet_bridge_ports = "$zone.$ctag";
115 #eth--->eth.x(svlan)--->eth.x.y(cvlan)---->vnet
117 my @bridge_ifaces = ();
118 my $dir = "/sys/class/net/$bridge/brif";
119 PVE
::Tools
::dir_glob_foreach
($dir, '(((eth|bond)\d+|en[^.]+)(\.\d+)?)', sub {
120 push @bridge_ifaces, $_[0];
123 foreach my $bridge_iface (@bridge_ifaces) {
125 # use named vlan interface to avoid too long names
126 my $svlan_iface = "sv_$vnetid";
127 my $cvlan_iface = "cv_$vnetid";
131 push @iface_config, "vlan-raw-device $bridge_iface";
132 push @iface_config, "vlan-id $stag";
133 push @iface_config, "vlan-protocol $vlanprotocol" if $vlanprotocol;
134 push(@{$config->{$svlan_iface}}, @iface_config) if !$config->{$svlan_iface};
138 push @iface_config, "vlan-raw-device $svlan_iface";
139 push @iface_config, "vlan-id $ctag";
140 push(@{$config->{$cvlan_iface}}, @iface_config) if !$config->{$cvlan_iface};
142 $vnet_bridge_ports .= " $cvlan_iface";
148 push @iface_config, "bridge_ports $vnet_bridge_ports";
149 push @iface_config, "bridge_stp off";
150 push @iface_config, "bridge_fd 0";
151 push @iface_config, "mtu $mtu" if $mtu;
152 push @iface_config, "alias $alias" if $alias;
153 push(@{$config->{$vnetid}}, @iface_config) if !$config->{$vnetid};
158 my ($class, $plugin_config, $zone, $id, $vnet, $err_config, $status, $vnet_status, $zone_status) = @_;
160 my $bridge = $plugin_config->{bridge
};
161 $vnet_status->{$id}->{zone
} = $zone;
162 $zone_status->{$zone}->{status
} = 'available' if !defined($zone_status->{$zone}->{status
});
165 $vnet_status->{$id}->{status
} = 'pending';
166 $vnet_status->{$id}->{statusmsg
} = $err_config;
167 $zone_status->{$zone}->{status
} = 'pending';
168 } elsif ($status->{$bridge}->{status
} && $status->{$bridge}->{status
} eq 'pass') {
169 $vnet_status->{$id}->{status
} = 'available';
171 $vnet_status->{$id}->{status
} = 'error';
172 $vnet_status->{$id}->{statusmsg
} = 'missing bridge';
173 $zone_status->{$zone}->{status
} = 'error';