summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorStefan Lendl <s.lendl@proxmox.com>2023-11-21 15:55:54 +0100
committerThomas Lamprecht <t.lamprecht@proxmox.com>2023-11-21 20:34:10 +0100
commit596d9c238a0c3bee66ae7625e928a583ac099dbb (patch)
treecc6fb38966b6259943f1af751b9ac7c032cb1d6b /src
parent3bef780a5a8d85b26f4406ef13d14820d759d3e0 (diff)
sdn: register MAC in IPAM if not found
if inside add_dhcp_mapping, which is called at VM or LCX start, we do not find an IP in IPAM, register the MAC. This is very useful as a fallback if for some reason an IP mapping was deleted or there is a bug somewhere that does not register an IP. This acts more like DHCP to allocate an IP on demand. In order to properly register the IP, the VMID and hostname is required as a parameter. Signed-off-by: Stefan Lendl <s.lendl@proxmox.com>
Diffstat (limited to 'src')
-rw-r--r--src/PVE/Network/SDN/Vnets.pm10
1 files changed, 8 insertions, 2 deletions
diff --git a/src/PVE/Network/SDN/Vnets.pm b/src/PVE/Network/SDN/Vnets.pm
index 09378ff..0dfdfd7 100644
--- a/src/PVE/Network/SDN/Vnets.pm
+++ b/src/PVE/Network/SDN/Vnets.pm
@@ -186,7 +186,7 @@ sub del_ips_from_mac {
}
sub add_dhcp_mapping {
- my ($vnetid, $mac) = @_;
+ my ($vnetid, $mac, $vmid, $name) = @_;
my $vnet = PVE::Network::SDN::Vnets::get_vnet($vnetid);
return if !$vnet;
@@ -195,7 +195,13 @@ sub add_dhcp_mapping {
return if !$zone->{ipam} || !$zone->{dhcp};
- my ($ip4,$ip6) = PVE::Network::SDN::Vnets::get_ips_from_mac($vnetid, $mac);
+ my ($ip4, $ip6) = PVE::Network::SDN::Vnets::get_ips_from_mac($vnetid, $mac);
+ if ( ! ($ip4 || $ip6) ) {
+ print "No IP found for MAC: $mac for VMID:$vmid\n";
+ add_next_free_cidr($vnetid, $name, $mac, "$vmid", undef, 1);
+ ($ip4, $ip6) = PVE::Network::SDN::Vnets::get_ips_from_mac($vnetid, $mac);
+ print "got new IP from IPAM: $ip4 $ip6\n";
+ }
PVE::Network::SDN::Dhcp::add_mapping($vnetid, $mac, $ip4, $ip6) if $ip4 || $ip6;
}