public inbox for pve-devel@lists.proxmox.com
 help / color / mirror / Atom feed
* [pve-devel] [PATCH dnsmasq 0/1] purge previous ip/mac lease of dhcp reply
@ 2023-11-15 21:58 Alexandre Derumier
  2023-11-15 21:58 ` [pve-devel] [PATCH dnsmasq 1/1] purge old ip-mac lease on dhcpreply Alexandre Derumier
  2023-11-16  9:43 ` [pve-devel] [PATCH dnsmasq 0/1] purge previous ip/mac lease of dhcp reply Stefan Hanreich
  0 siblings, 2 replies; 11+ messages in thread
From: Alexandre Derumier @ 2023-11-15 21:58 UTC (permalink / raw)
  To: pve-devel

This patch is specific and work only with dnsmask static lease.

If we try to allocate an existing leased ip to a new mac,
we need to purge first the lease.

This patch is doing it directly in dhcp reply phase.


I have made a deb with the patch for testing:
https://mutulin1.odiso.net:/dnsmasq-base_2.89-1_amd64.deb


ex:

guest ask for ip 192.168.2.10 with mac 12:45:6f:39:c2:a6

Nov 15 22:45:05 formationkvm3 dnsmasq-dhcp[846333]: DHCPDISCOVER(vnetpve) 192.168.2.10 12:45:6f:39:c2:a6
Nov 15 22:45:05 formationkvm3 dnsmasq-dhcp[846333]: DHCPOFFER(vnetpve) 192.168.2.10 12:45:6f:39:c2:a6
Nov 15 22:45:05 formationkvm3 dnsmasq-dhcp[846333]: DHCPREQUEST(vnetpve) 192.168.2.10 12:45:6f:39:c2:a6
Nov 15 22:45:05 formationkvm3 dnsmasq-dhcp[846333]: DHCPACK(vnetpve) 192.168.2.10 12:45:6f:39:c2:a6 testovn1


remove remove nic from guest

create a new nic in another guest, 192.168.2.10 is allocated to new mac 12:45:a3:ed:c8:36

we write ether file and reload dnsmasq

Nov 15 22:45:53 formationkvm3 systemd[1]: Reloading dnsmasq@simpve.service - dnsmasq (simpve) - A lightweight DHCP and caching DNS server...
Nov 15 22:45:53 formationkvm3 dnsmasq[846333]: cleared cache
Nov 15 22:45:53 formationkvm3 dnsmasq-dhcp[846333]: read /etc/dnsmasq.d/simpve/ethers
Nov 15 22:45:53 formationkvm3 systemd[1]: Reloaded dnsmasq@simpve.service - dnsmasq (simpve) - A lightweight DHCP and caching DNS server.

but the old mac:ip is still in lease memory of dnsmasq process


the guest is doing a dhcp query


here the patch: we purge the old lease
Nov 15 22:45:59 formationkvm3 dnsmasq-dhcp[846333]: workaround - pruning old lease

then the guest is able to retrieve the ip.
Nov 15 22:45:59 formationkvm3 dnsmasq-dhcp[846333]: DHCPDISCOVER(vnetpve) 192.168.2.10 12:45:a3:ed:c8:36 no address available
Nov 15 22:46:02 formationkvm3 dnsmasq-dhcp[846333]: DHCPDISCOVER(vnetpve) 192.168.2.10 12:45:a3:ed:c8:36
Nov 15 22:46:02 formationkvm3 dnsmasq-dhcp[846333]: DHCPOFFER(vnetpve) 192.168.2.10 12:45:a3:ed:c8:36
Nov 15 22:46:02 formationkvm3 dnsmasq-dhcp[846333]: DHCPREQUEST(vnetpve) 192.168.2.10 12:45:a3:ed:c8:36
Nov 15 22:46:02 formationkvm3 dnsmasq-dhcp[846333]: DHCPACK(vnetpve) 192.168.2.10 12:45:a3:ed:c8:36 testovn1

Alexandre Derumier (1):
  purge old ip-mac lease  on dhcpreply

 src/rfc2131.c | 15 +++++++++------
 1 file changed, 9 insertions(+), 6 deletions(-)

-- 
2.39.2




^ permalink raw reply	[flat|nested] 11+ messages in thread

* [pve-devel] [PATCH dnsmasq 1/1] purge old ip-mac lease on dhcpreply
  2023-11-15 21:58 [pve-devel] [PATCH dnsmasq 0/1] purge previous ip/mac lease of dhcp reply Alexandre Derumier
@ 2023-11-15 21:58 ` Alexandre Derumier
  2023-11-16  9:43 ` [pve-devel] [PATCH dnsmasq 0/1] purge previous ip/mac lease of dhcp reply Stefan Hanreich
  1 sibling, 0 replies; 11+ messages in thread
From: Alexandre Derumier @ 2023-11-15 21:58 UTC (permalink / raw)
  To: pve-devel

---
 src/rfc2131.c | 15 +++++++++------
 1 file changed, 9 insertions(+), 6 deletions(-)

diff --git a/src/rfc2131.c b/src/rfc2131.c
index 17e97b5..2a4ce76 100644
--- a/src/rfc2131.c
+++ b/src/rfc2131.c
@@ -1095,7 +1095,7 @@ size_t dhcp_reply(struct dhcp_context *context, char *iface_name, int int_index,
 
 	  if ((opt = option_find(mess, sz, OPTION_REQUESTED_IP, INADDRSZ)))	 
 	    addr = option_addr(opt);
-	  
+
 	  if (have_config(config, CONFIG_ADDR))
 	    {
 	      inet_ntop(AF_INET, &config->addr, daemon->addrbuff, ADDRSTRLEN);
@@ -1104,11 +1104,14 @@ size_t dhcp_reply(struct dhcp_context *context, char *iface_name, int int_index,
 		  ltmp != lease &&
 		  !config_has_mac(config, ltmp->hwaddr, ltmp->hwaddr_len, ltmp->hwaddr_type))
 		{
-		  int len;
-		  unsigned char *mac = extended_hwaddr(ltmp->hwaddr_type, ltmp->hwaddr_len,
-						       ltmp->hwaddr, ltmp->clid_len, ltmp->clid, &len);
-		  my_syslog(MS_DHCP | LOG_WARNING, _("not using configured address %s because it is leased to %s"),
-			    daemon->addrbuff, print_mac(daemon->namebuff, mac, len));
+		  lease_prune(ltmp, now);
+		  my_syslog(MS_DHCP | LOG_WARNING, _("workaround - pruning old lease"));
+
+		  //int len;
+		  //unsigned char *mac = extended_hwaddr(ltmp->hwaddr_type, ltmp->hwaddr_len,
+		  //				       ltmp->hwaddr, ltmp->clid_len, ltmp->clid, &len);
+		  //my_syslog(MS_DHCP | LOG_WARNING, _("not using configured address %s because it is leased to %s"),
+		  //	    daemon->addrbuff, print_mac(daemon->namebuff, mac, len));
 		}
 	      else
 		{
-- 
2.39.2




^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [pve-devel] [PATCH dnsmasq 0/1] purge previous ip/mac lease of dhcp reply
  2023-11-15 21:58 [pve-devel] [PATCH dnsmasq 0/1] purge previous ip/mac lease of dhcp reply Alexandre Derumier
  2023-11-15 21:58 ` [pve-devel] [PATCH dnsmasq 1/1] purge old ip-mac lease on dhcpreply Alexandre Derumier
@ 2023-11-16  9:43 ` Stefan Hanreich
  2023-11-16 13:47   ` DERUMIER, Alexandre
  1 sibling, 1 reply; 11+ messages in thread
From: Stefan Hanreich @ 2023-11-16  9:43 UTC (permalink / raw)
  To: Proxmox VE development discussion, Alexandre Derumier

Maybe this [1][2] could be a less intrusive solution for this issue?

[1] https://manpages.ubuntu.com/manpages/focal/en/man1/dhcp_release.1.html
[2] https://packages.debian.org/de/sid/dnsmasq-utils




^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [pve-devel] [PATCH dnsmasq 0/1] purge previous ip/mac lease of dhcp reply
  2023-11-16  9:43 ` [pve-devel] [PATCH dnsmasq 0/1] purge previous ip/mac lease of dhcp reply Stefan Hanreich
@ 2023-11-16 13:47   ` DERUMIER, Alexandre
  2023-11-17  6:49     ` DERUMIER, Alexandre
  0 siblings, 1 reply; 11+ messages in thread
From: DERUMIER, Alexandre @ 2023-11-16 13:47 UTC (permalink / raw)
  To: pve-devel, aderumier, s.hanreich

>>Maybe this [1][2] could be a less intrusive solution for this issue?

Yes, dhcp release packet should be the way, but I don't known if can
simply forge packet why any mac ?

I'll test it this afternoon to see if it's work.

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [pve-devel] [PATCH dnsmasq 0/1] purge previous ip/mac lease of dhcp reply
  2023-11-16 13:47   ` DERUMIER, Alexandre
@ 2023-11-17  6:49     ` DERUMIER, Alexandre
  2023-11-17  8:55       ` Wolfgang Bumiller
  0 siblings, 1 reply; 11+ messages in thread
From: DERUMIER, Alexandre @ 2023-11-17  6:49 UTC (permalink / raw)
  To: pve-devel, aderumier, s.hanreich

-------- Message initial --------
De: "DERUMIER, Alexandre" <alexandre.derumier@groupe-cyllene.com>
À: pve-devel@lists.proxmox.com <pve-devel@lists.proxmox.com>,
aderumier@odiso.com <aderumier@odiso.com>, s.hanreich@proxmox.com
<s.hanreich@proxmox.com>
Objet: Re: [pve-devel] [PATCH dnsmasq 0/1] purge previous ip/mac lease
of dhcp reply
Date: 16/11/2023 14:47:20

> > Maybe this [1][2] could be a less intrusive solution for this
> > issue?

>>Yes, dhcp release packet should be the way, but I don't known if can
>simply forge packet why any mac ?
>>>
>>I'll test it this afternoon to see if it's work.


mmm,It's not working, the dhcp release packet never reach the bridge


I have also try to forge the packet in python with scapy, 
same bahviour.


from scapy.all import send, IP, UDP, BOOTP, DHCP, str2mac
import random

releaseMAC = '12:45:a3:ed:c8:36'
releaseIP='192.168.2.10'
serverIP='192.168.2.1'
releaseMACraw = str2mac(releaseMAC)

dhcp_release =
IP(dst=serverIP)/UDP(sport=68,dport=67)/BOOTP(chaddr=releaseMACraw,
ciaddr=releaseIP, xid=random.randint(0,
0xFFFFFFFF))/DHCP(options=[('message-type','release'), 'end'])
send(dhcp_release)





^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [pve-devel] [PATCH dnsmasq 0/1] purge previous ip/mac lease of dhcp reply
  2023-11-17  6:49     ` DERUMIER, Alexandre
@ 2023-11-17  8:55       ` Wolfgang Bumiller
  2023-11-17  9:19         ` DERUMIER, Alexandre
  0 siblings, 1 reply; 11+ messages in thread
From: Wolfgang Bumiller @ 2023-11-17  8:55 UTC (permalink / raw)
  To: DERUMIER, Alexandre; +Cc: pve-devel, aderumier, s.hanreich

On Fri, Nov 17, 2023 at 06:49:27AM +0000, DERUMIER, Alexandre wrote:
> -------- Message initial --------
> De: "DERUMIER, Alexandre" <alexandre.derumier@groupe-cyllene.com>
> À: pve-devel@lists.proxmox.com <pve-devel@lists.proxmox.com>,
> aderumier@odiso.com <aderumier@odiso.com>, s.hanreich@proxmox.com
> <s.hanreich@proxmox.com>
> Objet: Re: [pve-devel] [PATCH dnsmasq 0/1] purge previous ip/mac lease
> of dhcp reply
> Date: 16/11/2023 14:47:20
> 
> > > Maybe this [1][2] could be a less intrusive solution for this
> > > issue?
> 
> >>Yes, dhcp release packet should be the way, but I don't known if can
> >simply forge packet why any mac ?
> >>>
> >>I'll test it this afternoon to see if it's work.
> 
> 
> mmm,It's not working, the dhcp release packet never reach the bridge

What command did you use?

If all you need is the `lease_prune()` call from your C patch, dnsmasq
also does this on a SIGALRM so you could try to see if sending that
helps.

(dnsmasq also has a dbus api to add/remove leases for the worst case...)

Otherwise, at first glance the C patch seems to potentially break some
other cases, but I don't know the code at all.




^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [pve-devel] [PATCH dnsmasq 0/1] purge previous ip/mac lease of dhcp reply
  2023-11-17  8:55       ` Wolfgang Bumiller
@ 2023-11-17  9:19         ` DERUMIER, Alexandre
  2023-11-17  9:42           ` DERUMIER, Alexandre
  0 siblings, 1 reply; 11+ messages in thread
From: DERUMIER, Alexandre @ 2023-11-17  9:19 UTC (permalink / raw)
  To: w.bumiller; +Cc: pve-devel, aderumier, s.hanreich

#What command did you use?

dhcp_release <bridge> <maclease> <iplease>

or

dhcp_release <vmtap> <maclease> <iplease>



>>If all you need is the `lease_prune()` call from your C patch,
>>dnsmasq
>>also does this on a SIGALRM so you could try to see if sending that
>>helps.
>>
>>(dnsmasq also has a dbus api to add/remove leases for the worst
>>case...)

ah ok ! didn't known that, I'll try the SIGALRM && dbus to see. Thanks
!



>>Otherwise, at first glance the C patch seems to potentially break
>>some
>>other cases, but I don't know the code at all.

Yes, this will break dynamic leases as it's always flush leases at any
request.



^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [pve-devel] [PATCH dnsmasq 0/1] purge previous ip/mac lease of dhcp reply
  2023-11-17  9:19         ` DERUMIER, Alexandre
@ 2023-11-17  9:42           ` DERUMIER, Alexandre
  2023-11-17 10:46             ` DERUMIER, Alexandre
  0 siblings, 1 reply; 11+ messages in thread
From: DERUMIER, Alexandre @ 2023-11-17  9:42 UTC (permalink / raw)
  To: w.bumiller; +Cc: pve-devel, aderumier, s.hanreich

> > If all you need is the `lease_prune()` call from your C patch,
> > dnsmasq
> > also does this on a SIGALRM so you could try to see if sending that
> > helps.
> > 
> > (dnsmasq also has a dbus api to add/remove leases for the worst
> > case...)

>>ah ok ! didn't known that, I'll try the SIGALRM && dbus to see.
>>Thanks
>>!

SIGALRM don't seem to work, 


but looking at dbus doc, that seem really even better
https://github.com/imp/dnsmasq/blob/master/dbus/DBus-interface

we could directly manage leases, without need to manage the ether file
and without reload.






^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [pve-devel] [PATCH dnsmasq 0/1] purge previous ip/mac lease of dhcp reply
  2023-11-17  9:42           ` DERUMIER, Alexandre
@ 2023-11-17 10:46             ` DERUMIER, Alexandre
  2023-11-17 10:49               ` Stefan Hanreich
  0 siblings, 1 reply; 11+ messages in thread
From: DERUMIER, Alexandre @ 2023-11-17 10:46 UTC (permalink / raw)
  To: w.bumiller; +Cc: pve-devel, aderumier, s.hanreich


> > If all you need is the `lease_prune()` call from your C patch,
> > dnsmasq
> > also does this on a SIGALRM so you could try to see if sending that
> > helps.
> > 
> > (dnsmasq also has a dbus api to add/remove leases for the worst
> > case...)

> > ah ok ! didn't known that, I'll try the SIGALRM && dbus to see.
> > Thanks
> > !

>>SIGALRM don't seem to work, 
>>

>>but looking at dbus doc, that seem really even better
>>https://github.com/imp/dnsmasq/blob/master/dbus/DBus-interface
>>
>>we could directly manage leases, without need to manage the ether
>>file
>>and without reload.


Ok, it's working with dbus to update the lease (and etherfile still
needed)

ex:


use Net::DBus;

my $bus = Net::DBus->system();
my $dnsmasq = $bus->get_service("uk.org.thekelleys.dnsmasq");
my $manager = $dnsmasq-
>get_object("/uk/org/thekelleys/dnsmasq","uk.org.thekelleys.dnsmasq");

my @hostname = unpack("C*", "vmhostname");
$manager->AddDhcpLease('192.168.2.10','12:45:6D:33:3C:E8', \@hostname,
undef, 0, 0, 0);




The problem is that dbus is only working with 1 instance of dnsmasq. :/

That mean it'll not work if we need mulitple instance, in differents
zones/vrf for example

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [pve-devel] [PATCH dnsmasq 0/1] purge previous ip/mac lease of dhcp reply
  2023-11-17 10:46             ` DERUMIER, Alexandre
@ 2023-11-17 10:49               ` Stefan Hanreich
  2023-11-17 10:52                 ` DERUMIER, Alexandre
  0 siblings, 1 reply; 11+ messages in thread
From: Stefan Hanreich @ 2023-11-17 10:49 UTC (permalink / raw)
  To: DERUMIER, Alexandre, w.bumiller; +Cc: pve-devel, aderumier



On 11/17/23 11:46, DERUMIER, Alexandre wrote:
> The problem is that dbus is only working with 1 instance of dnsmasq. :/
> 
> That mean it'll not work if we need mulitple instance, in differents
> zones/vrf for example
You should be able to set the service name via `--enable-dbus` then you
can handle multiple instances if I'm not mistaken.




^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [pve-devel] [PATCH dnsmasq 0/1] purge previous ip/mac lease of dhcp reply
  2023-11-17 10:49               ` Stefan Hanreich
@ 2023-11-17 10:52                 ` DERUMIER, Alexandre
  0 siblings, 0 replies; 11+ messages in thread
From: DERUMIER, Alexandre @ 2023-11-17 10:52 UTC (permalink / raw)
  To: w.bumiller, s.hanreich; +Cc: pve-devel, aderumier

On 11/17/23 11:46, DERUMIER, Alexandre wrote:
> The problem is that dbus is only working with 1 instance of dnsmasq.
> :/
> 
> That mean it'll not work if we need mulitple instance, in differents
> zones/vrf for example
>>You should be able to set the service name via `--enable-dbus` then
>>you
>>can handle multiple instances if I'm not mistaken.

oh yes , indeed, just found the doc about it.

So, I think it should work. 


thanks !




^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2023-11-17 10:53 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-11-15 21:58 [pve-devel] [PATCH dnsmasq 0/1] purge previous ip/mac lease of dhcp reply Alexandre Derumier
2023-11-15 21:58 ` [pve-devel] [PATCH dnsmasq 1/1] purge old ip-mac lease on dhcpreply Alexandre Derumier
2023-11-16  9:43 ` [pve-devel] [PATCH dnsmasq 0/1] purge previous ip/mac lease of dhcp reply Stefan Hanreich
2023-11-16 13:47   ` DERUMIER, Alexandre
2023-11-17  6:49     ` DERUMIER, Alexandre
2023-11-17  8:55       ` Wolfgang Bumiller
2023-11-17  9:19         ` DERUMIER, Alexandre
2023-11-17  9:42           ` DERUMIER, Alexandre
2023-11-17 10:46             ` DERUMIER, Alexandre
2023-11-17 10:49               ` Stefan Hanreich
2023-11-17 10:52                 ` DERUMIER, Alexandre

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal