Signed-off-by: Alexandre Derumier <aderum...@odiso.com> --- PVE/Network/SDN/Vnets.pm | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-)
diff --git a/PVE/Network/SDN/Vnets.pm b/PVE/Network/SDN/Vnets.pm index d474037..0de3fd5 100644 --- a/PVE/Network/SDN/Vnets.pm +++ b/PVE/Network/SDN/Vnets.pm @@ -4,6 +4,7 @@ use strict; use warnings; use PVE::Cluster qw(cfs_read_file cfs_write_file cfs_lock_file); +use Net::IP; use PVE::Network::SDN::Subnets; use PVE::Network::SDN::Ipams; @@ -55,26 +56,34 @@ sub get_vnet { } sub get_next_free_ip { - my ($vnetid) = @_; + my ($vnetid, $ipversion) = @_; + $ipversion = 4 if !$ipversion; my $vnets_cfg = PVE::Network::SDN::Vnets::config(); my $subnets_cfg = PVE::Network::SDN::Subnets::config(); my $vnet = $vnets_cfg->{ids}->{$vnetid}; my @subnets = PVE::Tools::split_list($vnet->{subnets}) if $vnet->{subnets}; my $ip = undef; + my $subnet = undef; + my $subnetcount = 0; foreach my $s (@subnets) { - my $subnetid = $s =~ s/\//-/r; - my $subnet = $subnets_cfg->{ids}->{$subnetid}; - if ($subnet && $subnet->{ipam}) { - eval { - $ip = PVE::Network::SDN::Ipams::next_free_ip($subnetid, $subnet); - }; - warn $@ if $@; - } - last if $ip; + my $subnetid = $s =~ s/\//-/r; + my ($network, $mask) = split(/-/, $subnetid); + next if $ipversion != Net::IP::ip_get_version($network); + $subnetcount++; + $subnet = $subnets_cfg->{ids}->{$subnetid}; + if ($subnet && $subnet->{ipam}) { + eval { + $ip = PVE::Network::SDN::Ipams::next_free_ip($subnetid, $subnet); + }; + warn $@ if $@; + } + last if $ip; } - die "can't find any ip" if !$ip; - return $ip; + die "can't find any free ip" if !$ip && $subnetcount > 0; + + $subnet->{freeip} = $ip; + return $subnet; } 1; -- 2.20.1 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel