]> git.proxmox.com Git - pve-network.git/blame - PVE/Network/Transport/VlanPlugin.pm
api2: add networkconfig
[pve-network.git] / PVE / Network / Transport / VlanPlugin.pm
CommitLineData
fb4b3e4a 1package PVE::Network::Transport::VlanPlugin;
f8140d53
AD
2
3use strict;
4use warnings;
fb4b3e4a 5use PVE::Network::Transport::Plugin;
f8140d53 6
fb4b3e4a 7use base('PVE::Network::Transport::Plugin');
f8140d53
AD
8
9sub type {
10 return 'vlan';
11}
12
13PVE::JSONSchema::register_format('pve-network-vlanrange', \&pve_verify_network_vlanrange);
14sub pve_verify_network_vlanrange {
15 my ($vlanstr) = @_;
16
fb4b3e4a 17 PVE::Network::Transport::Plugin::parse_tag_number_or_range($vlanstr, '4096');
f8140d53
AD
18
19 return $vlanstr;
20}
21
22sub properties {
23 return {
eec580bf
AD
24 'uplink-id' => {
25 type => 'integer',
26 minimum => 1, maximum => 4096,
27 description => 'Uplink interface',
28 },
f8140d53
AD
29 'vlan-allowed' => {
30 type => 'string', format => 'pve-network-vlanrange',
31 description => "Allowed vlan range",
32 },
33 'vlan-aware' => {
34 type => 'boolean',
35 description => "enable 802.1q stacked vlan",
36 },
37 'vlan-protocol' => {
38 type => 'string',
39 enum => ['802.1q', '802.1ad'],
40 default => '802.1q',
41 optional => 1,
42 description => "vlan protocol",
43 }
44 };
45}
46
47sub options {
48
49 return {
eec580bf 50 'uplink-id' => { optional => 1 },
f8140d53
AD
51 'vlan-allowed' => { optional => 1 },
52 'vlan-protocol' => { optional => 1 },
53 'vlan-aware' => { optional => 1 },
54
55 };
56}
57
58# Plugin implementation
59sub generate_network_config {
bad3d113 60 my ($class, $plugin_config, $zoneid, $vnetid, $vnet, $uplinks) = @_;
f8140d53
AD
61
62 my $tag = $vnet->{tag};
63 my $mtu = $vnet->{mtu};
64 my $vlanaware = $plugin_config->{'vlan-aware'};
65 my $vlanprotocol = $plugin_config->{'vlan-protocol'};
66 my $uplink = $plugin_config->{'uplink-id'};
67 my $vlanallowed = $plugin_config->{'vlan-allowed'};
68
69 die "missing vlan tag" if !$tag;
70 die "uplink $uplink is not defined" if !$uplinks->{$uplink};
71
72 eval {
fb4b3e4a 73 PVE::Network::Transport::Plugin::parse_tag_number_or_range($vlanallowed, '4096', $tag) if $vlanallowed;
f8140d53
AD
74 };
75 if($@) {
76 die "vlan $tag is not allowed in transport $zoneid";
77 }
78
79 my $iface = $uplinks->{$uplink};
80 $iface .= ".$tag";
81
f8140d53 82 my $config = "\n";
f93d43e8
AD
83 $config .= "auto $iface\n";
84 $config .= "iface $iface inet manual\n";
85 $config .= " vlan-protocol $vlanprotocol\n" if $vlanprotocol;
86 $config .= " mtu $mtu\n" if $mtu;
87 $config .= "\n";
f8140d53
AD
88 $config .= "auto $vnetid\n";
89 $config .= "iface $vnetid inet manual\n";
90 $config .= " bridge_ports $iface\n";
91 $config .= " bridge_stp off\n";
92 $config .= " bridge_fd 0\n";
0ec8cb87 93 $config .= " bridge-vlan-aware yes \n" if $vlanaware;
f8140d53
AD
94 $config .= " mtu $mtu\n" if $mtu;
95
96 return $config;
97}
98
991;
100
101