From 0219596da20533e88c6638c593c66c302ad1218e Mon Sep 17 00:00:00 2001 From: Aaron Lauterer Date: Wed, 2 Oct 2024 15:11:53 +0200 Subject: [PATCH] fix #3893: network: add vlan id and range parameter definitions This is one step to make it possible to define the VLAN IDs and ranges for bridges. It is expected to be used in combination with the `-list` magic property. Therefore it defines and checks the validity of a single list item that could just be a single VLAN tag ID or a range. Signed-off-by: Aaron Lauterer --- src/PVE/JSONSchema.pm | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/PVE/JSONSchema.pm b/src/PVE/JSONSchema.pm index ce39092..7c63af1 100644 --- a/src/PVE/JSONSchema.pm +++ b/src/PVE/JSONSchema.pm @@ -81,6 +81,12 @@ register_standard_option('pve-iface', { minLength => 2, maxLength => 20, }); +register_standard_option('pve-vlan-id-or-range', { + description => "VLAN ID or range.", + type => 'string', format => 'pve-vlan-id-or-range', + minLength => 1, maxLength => 9, +}); + register_standard_option('pve-storage-id', { description => "The storage identifier.", type => 'string', format => 'pve-storage-id', @@ -595,6 +601,39 @@ sub pve_verify_iface { return $id; } +# vlan id (vids), single or range +register_format('pve-vlan-id-or-range', \&pve_verify_vlan_id_or_range); +sub pve_verify_vlan_id_or_range { + my ($vlan, $noerr) = @_; + + my $valid_vid = sub { + my $tag = shift; + if ($tag < 2 || $tag > 4094) { + return 0 if $noerr; + die "invalid VLAN tag '$tag'\n"; + } + return 1; + }; + + if ($vlan !~ m/^(\d+)(?:-(\d+))?$/) { + return if $noerr; + die "invalid VLAN configuration '$vlan'\n"; + } + my $start = $1; + my $end = $2; + return if !$valid_vid->($start); + if ($end) { + return if !$valid_vid->($end); + + if ($start >= $end) { + return if $noerr; + die "VLAN range must go from lower to higher tag '$vlan'\n"; + } + } + + return $vlan; +} + # general addresses by name or IP register_format('address', \&pve_verify_address); sub pve_verify_address {