]> git.proxmox.com Git - pve-network.git/blame - PVE/Network/Network/VxlanMulticastPlugin.pm
vxlan: use vxlan<id> interface name
[pve-network.git] / PVE / Network / Network / VxlanMulticastPlugin.pm
CommitLineData
6bad73d0 1package PVE::Network::Network::VxlanMulticastPlugin;
7e720d4d
AD
2
3use strict;
4use warnings;
6bad73d0 5use PVE::Network::Network::Plugin;
7e720d4d 6
6bad73d0 7use base('PVE::Network::Network::Plugin');
7e720d4d
AD
8
9PVE::JSONSchema::register_format('pve-network-vxlanrange', \&pve_verify_network_vxlanrange);
10sub pve_verify_network_vxlanrange {
11 my ($vxlanstr) = @_;
12
6bad73d0 13 PVE::Network::Network::Plugin::parse_tag_number_or_range($vxlanstr, '16777216');
7e720d4d
AD
14
15 return $vxlanstr;
16}
17
18sub type {
19 return 'vxlanmulticast';
20}
21
22sub properties {
23 return {
24 'vxlan-allowed' => {
25 type => 'string', format => 'pve-network-vxlanrange',
26 description => "Allowed vlan range",
27 },
28 'multicast-address' => {
29 description => "Multicast address.",
30 type => 'string', #fixme: format
31 },
32
33 };
34}
35
36sub options {
37
38 return {
85533e98
AD
39 'uplink-id' => { optional => 0 },
40 'multicast-address' => { optional => 0 },
7e720d4d
AD
41 'vxlan-allowed' => { optional => 1 },
42 };
43}
44
45# Plugin implementation
46sub generate_network_config {
bad3d113 47 my ($class, $plugin_config, $zoneid, $vnetid, $vnet, $uplinks) = @_;
7e720d4d
AD
48
49 my $tag = $vnet->{tag};
50 my $mtu = $vnet->{mtu};
dc7e431e 51 my $alias = $vnet->{alias};
7e720d4d
AD
52 my $multicastaddress = $plugin_config->{'multicast-address'};
53 my $uplink = $plugin_config->{'uplink-id'};
54 my $vxlanallowed = $plugin_config->{'vxlan-allowed'};
55
56 die "missing vxlan tag" if !$tag;
57 die "uplink $uplink is not defined" if !$uplinks->{$uplink};
58 my $iface = $uplinks->{$uplink};
59
60 eval {
6bad73d0 61 PVE::Network::Network::Plugin::parse_tag_number_or_range($vxlanallowed, '16777216', $tag) if $vxlanallowed;
7e720d4d
AD
62 };
63 if($@) {
64 die "vlan $tag is not allowed in transport $zoneid";
65 }
66
67 my $config = "\n";
4394cbf2
AD
68 $config .= "auto vxlan$tag\n";
69 $config .= "iface vxlan$tag inet manual\n";
70 $config .= " vxlan-id $tag\n";
7e720d4d
AD
71 $config .= " vxlan-svcnodeip $multicastaddress\n" if $multicastaddress;
72 $config .= " vxlan-physdev $iface\n" if $iface;
9c2f5e3f 73 $config .= " mtu $mtu\n" if $mtu;
7e720d4d
AD
74 $config .= "\n";
75 $config .= "auto $vnetid\n";
76 $config .= "iface $vnetid inet manual\n";
4394cbf2 77 $config .= " bridge_ports vxlan$tag\n";
7e720d4d
AD
78 $config .= " bridge_stp off\n";
79 $config .= " bridge_fd 0\n";
80 $config .= " mtu $mtu\n" if $mtu;
dc7e431e 81 $config .= " alias $alias\n" if $alias;
7e720d4d
AD
82
83 return $config;
84}
85
fe0c6b9e 86sub on_delete_hook {
a8ad2789 87 my ($class, $transportid, $network_cfg) = @_;
fe0c6b9e
AD
88
89 # verify that no vnet are associated to this transport
a8ad2789
AD
90 foreach my $id (keys %{$network_cfg->{ids}}) {
91 my $network = $network_cfg->{ids}->{$id};
92 die "transport $transportid is used by vnet $id"
93 if ($network->{type} eq 'vnet' && defined($network->{transportzone}) && $network->{transportzone} eq $transportid);
94 }
fe0c6b9e
AD
95}
96
e8d5906e 97sub on_update_hook {
c723980e
AD
98 my ($class, $transportid, $network_cfg) = @_;
99
100 my $transport = $network_cfg->{ids}->{$transportid};
e8d5906e
AD
101
102 # verify that vxlan-allowed don't conflict with another vxlan-allowed transport
103
104 # verify that vxlan-allowed is matching currently vnet tag in this transport
c723980e
AD
105 my $vxlanallowed = $transport->{'vxlan-allowed'};
106 if ($vxlanallowed) {
107 foreach my $id (keys %{$network_cfg->{ids}}) {
108 my $network = $network_cfg->{ids}->{$id};
109 if ($network->{type} eq 'vnet' && defined($network->{tag})) {
110 if(defined($network->{transportzone}) && $network->{transportzone} eq $transportid) {
111 my $tag = $network->{tag};
112 eval {
113 PVE::Network::Network::Plugin::parse_tag_number_or_range($vxlanallowed, '16777216', $tag);
114 };
115 if($@) {
116 die "vnet $id - vlan $tag is not allowed in transport $transportid";
117 }
118 }
119 }
120 }
121 }
e8d5906e
AD
122}
123
7e720d4d
AD
1241;
125
126