From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: <s.lendl@proxmox.com> Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by lists.proxmox.com (Postfix) with ESMTPS id 8BA249DA5B for <pve-devel@lists.proxmox.com>; Fri, 27 Oct 2023 13:51:51 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 6EAA9391B5 for <pve-devel@lists.proxmox.com>; Fri, 27 Oct 2023 13:51:51 +0200 (CEST) Received: from proxmox-new.maurer-it.com (proxmox-new.maurer-it.com [94.136.29.106]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by firstgate.proxmox.com (Proxmox) with ESMTPS for <pve-devel@lists.proxmox.com>; Fri, 27 Oct 2023 13:51:50 +0200 (CEST) Received: from proxmox-new.maurer-it.com (localhost.localdomain [127.0.0.1]) by proxmox-new.maurer-it.com (Proxmox) with ESMTP id B195B4255E; Fri, 27 Oct 2023 13:51:50 +0200 (CEST) From: Stefan Lendl <s.lendl@proxmox.com> To: Stefan Hanreich <s.hanreich@proxmox.com>, pve-devel@lists.proxmox.com In-Reply-To: <20231017135507.2220948-7-s.hanreich@proxmox.com> References: <20231017135507.2220948-1-s.hanreich@proxmox.com> <20231017135507.2220948-7-s.hanreich@proxmox.com> Date: Fri, 27 Oct 2023 13:51:50 +0200 Message-ID: <87jzr8mgfd.fsf@gmail.com> MIME-Version: 1.0 Content-Type: text/plain X-SPAM-LEVEL: Spam detection results: 0 AWL 0.060 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Subject: Re: [pve-devel] [WIP v2 pve-network 06/10] ipam: Add helper methods for DHCP to PVE IPAM X-BeenThere: pve-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox VE development discussion <pve-devel.lists.proxmox.com> List-Unsubscribe: <https://lists.proxmox.com/cgi-bin/mailman/options/pve-devel>, <mailto:pve-devel-request@lists.proxmox.com?subject=unsubscribe> List-Archive: <http://lists.proxmox.com/pipermail/pve-devel/> List-Post: <mailto:pve-devel@lists.proxmox.com> List-Help: <mailto:pve-devel-request@lists.proxmox.com?subject=help> List-Subscribe: <https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel>, <mailto:pve-devel-request@lists.proxmox.com?subject=subscribe> X-List-Received-Date: Fri, 27 Oct 2023 11:51:51 -0000 Stefan Hanreich <s.hanreich@proxmox.com> writes: > Those methods are used by the DHCP plugins to attain the next free > IP address for a given DHCP range, as well as delete all entries with > a certain MAC address. > > Signed-off-by: Stefan Hanreich <s.hanreich@proxmox.com> > --- > src/PVE/Network/SDN/Ipams/PVEPlugin.pm | 64 ++++++++++++++++++++++++++ > 1 file changed, 64 insertions(+) > > diff --git a/src/PVE/Network/SDN/Ipams/PVEPlugin.pm b/src/PVE/Network/SDN/Ipams/PVEPlugin.pm > index 3e8ffc5..fcc8282 100644 > --- a/src/PVE/Network/SDN/Ipams/PVEPlugin.pm > +++ b/src/PVE/Network/SDN/Ipams/PVEPlugin.pm > @@ -156,6 +156,70 @@ sub add_next_freeip { > return "$freeip/$mask"; > } > > +sub add_dhcp_ip { > + my ($class, $subnet, $dhcp_range, $data) = @_; > + > + my $cidr = $subnet->{cidr}; > + my $zone = $subnet->{zone}; > + > + cfs_lock_file($ipamdb_file, undef, sub { > + my $db = read_db(); > + > + my $dbzone = $db->{zones}->{$zone}; > + die "zone '$zone' doesn't exist in IPAM DB\n" if !$dbzone; > + > + my $dbsubnet = $dbzone->{subnets}->{$cidr}; > + die "subnet '$cidr' doesn't exist in IPAM DB\n" if !$dbsubnet; > + > + my $ip = new Net::IP ("$dhcp_range->{'start-address'} - $dhcp_range->{'end-address'}") > + or die "Invalid IP address(es) in DHCP Range!\n"; > + > + do { > + my $ip_address = $ip->ip(); > + if (!$dbsubnet->{ips}->{$ip_address}) { > + $dbsubnet->{ips}->{$ip_address} = $data; > + write_db($db); > + > + return $ip_address; > + } > + } while (++$ip); > + > + die "No free IP left in DHCP Range $dhcp_range->{'start-address'}:$dhcp_range->{'end-address'}}\n"; > + }); > +} This duplicates existing functionality to find a new IP. Regarding the reply from Alexandre, we may not need to implement dhcp_range feature and solely rely on IPAM generating a new IP. > + > +sub del_dhcp_ip { > + my ($class, $subnet, $mac) = @_; > + > + my $cidr = $subnet->{cidr}; > + my $zone = $subnet->{zone}; > + > + my $returned_ip = undef; > + > + cfs_lock_file($ipamdb_file, undef, sub { > + my $db = read_db(); > + > + die "zone $zone don't exist in ipam db" if !$db->{zones}->{$zone}; > + my $dbzone = $db->{zones}->{$zone}; > + > + die "subnet $cidr don't exist in ipam db" if !$dbzone->{subnets}->{$cidr}; > + my $dbsubnet = $dbzone->{subnets}->{$cidr}; > + > + foreach my $ip_address (keys %{$dbsubnet->{ips}}) { > + my $data = $dbsubnet->{ips}->{$ip_address}; > + next if !$data->{mac} || $data->{mac} ne $mac; > + > + delete $dbsubnet->{ips}->{$ip_address}; > + write_db($db); > + > + $returned_ip = $ip_address; > + } > + }); > + die "$@" if $@; > + > + return $returned_ip; > +} > + > sub del_ip { > my ($class, $plugin_config, $subnetid, $subnet, $ip) = @_;