summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorStefan Hanreich <s.hanreich@proxmox.com>2024-04-05 15:17:57 +0200
committerThomas Lamprecht <t.lamprecht@proxmox.com>2024-04-08 17:57:18 +0200
commit27b54a086b527322c6c192c0654e5bd7f9334fc5 (patch)
tree8785d0459b2efc374db21afa92ee4008850f2d74 /src
parentc60a7dc4323f33b75c3128db950e3776d2a3942d (diff)
sdn: dhcp: rollback allocated ips on failure
If DHCP is configured for IPv4 and IPv6, failing to obtain an IPv6 IP does not roll back the allocation made for IPv4. This patch rolls back any changes made in case of failure, so that IP allocation is actually atomic. Signed-off-by: Stefan Hanreich <s.hanreich@proxmox.com> Reviewed-by: Stefan Lendl <s.lendl@proxmox.com> Tested-by: Stefan Lendl <s.lendl@proxmox.com> Signed-off-by: Stefan Lendl <s.lendl@proxmox.com>
Diffstat (limited to 'src')
-rw-r--r--src/PVE/Network/SDN/Vnets.pm12
1 files changed, 11 insertions, 1 deletions
diff --git a/src/PVE/Network/SDN/Vnets.pm b/src/PVE/Network/SDN/Vnets.pm
index cbf0a07..45292e3 100644
--- a/src/PVE/Network/SDN/Vnets.pm
+++ b/src/PVE/Network/SDN/Vnets.pm
@@ -131,7 +131,17 @@ sub add_next_free_cidr {
last;
}
}
- die "can't find any free ip" if !$ip && $subnetcount > 0;
+
+ if (!$ip && $subnetcount > 0) {
+ foreach my $version (sort keys %{$ips}) {
+ my $ip = $ips->{$version};
+ my ($subnetid, $subnet) = PVE::Network::SDN::Subnets::find_ip_subnet($ip, $subnets);
+
+ PVE::Network::SDN::Subnets::del_ip($zone, $subnetid, $subnet, $ip, $hostname, $mac, $skipdns);
+ }
+
+ die "can't find any free ip in zone $zoneid for IPv$ipversion";
+ }
}
}