1 package PVE
::Network
::SDN
::VlanPlugin
;
5 use PVE
::Network
::SDN
::Plugin
;
7 use base
('PVE::Network::SDN::Plugin');
19 PVE
::JSONSchema
::register_format
('pve-sdn-vlanrange', \
&pve_verify_sdn_vlanrange
);
20 sub pve_verify_sdn_vlanrange
{
23 PVE
::Network
::SDN
::Plugin
::parse_tag_number_or_range
($vlanstr, '4096');
32 minimum
=> 1, maximum
=> 4096,
33 description
=> 'Uplink interface',
36 type
=> 'string', format
=> 'pve-sdn-vlanrange',
37 description
=> "Allowed vlan range",
41 description
=> "enable 802.1q stacked vlan",
45 enum
=> ['802.1q', '802.1ad'],
48 description
=> "vlan protocol",
56 'uplink-id' => { optional
=> 0 },
57 'vlan-allowed' => { optional
=> 1 },
58 'vlan-protocol' => { optional
=> 1 },
59 'vlan-aware' => { optional
=> 1 },
64 # Plugin implementation
65 sub generate_sdn_config
{
66 my ($class, $plugin_config, $zoneid, $vnetid, $vnet, $uplinks, $config) = @_;
68 my $tag = $vnet->{tag
};
69 my $mtu = $vnet->{mtu
};
70 my $alias = $vnet->{alias
};
71 my $vlanaware = $plugin_config->{'vlan-aware'};
72 my $vlanprotocol = $plugin_config->{'vlan-protocol'};
73 my $uplink = $plugin_config->{'uplink-id'};
74 my $vlanallowed = $plugin_config->{'vlan-allowed'};
76 die "missing vlan tag" if !$tag;
78 my $iface = $uplinks->{$uplink}->{name
};
79 $iface = "uplink${uplink}" if !$iface;
83 my @iface_config = ();
84 push @iface_config, "vlan-protocol $vlanprotocol" if $vlanprotocol;
85 push @iface_config, "mtu $mtu" if $mtu;
86 push(@{$config->{$iface}}, @iface_config) if !$config->{$iface};
90 push @iface_config, "bridge_ports $iface";
91 push @iface_config, "bridge_stp off";
92 push @iface_config, "bridge_fd 0";
93 push @iface_config, "bridge-vlan-aware yes" if $vlanaware;
94 push @iface_config, "mtu $mtu" if $mtu;
95 push @iface_config, "alias $alias" if $alias;
96 push(@{$config->{$vnetid}}, @iface_config) if !$config->{$vnetid};
102 my ($class, $transportid, $sdn_cfg) = @_;
104 # verify that no vnet are associated to this transport
105 foreach my $id (keys %{$sdn_cfg->{ids
}}) {
106 my $sdn = $sdn_cfg->{ids
}->{$id};
107 die "transport $transportid is used by vnet $id"
108 if ($sdn->{type
} eq 'vnet' && defined($sdn->{transportzone
}) && $sdn->{transportzone
} eq $transportid);
113 my ($class, $transportid, $sdn_cfg) = @_;
115 my $transport = $sdn_cfg->{ids
}->{$transportid};
117 # verify that vlan-allowed don't conflict with another vlan-allowed transport
119 # verify that vlan-allowed is matching currently vnet tag in this transport
120 my $vlanallowed = $transport->{'vlan-allowed'};
122 foreach my $id (keys %{$sdn_cfg->{ids
}}) {
123 my $sdn = $sdn_cfg->{ids
}->{$id};
124 if ($sdn->{type
} eq 'vnet' && defined($sdn->{tag
})) {
125 if(defined($sdn->{transportzone
}) && $sdn->{transportzone
} eq $transportid) {
126 my $tag = $sdn->{tag
};
128 PVE
::Network
::SDN
::Plugin
::parse_tag_number_or_range
($vlanallowed, '4096', $tag);
131 die "vlan $tag is not allowed in transport $transportid";