[Dnsmasq-discuss] [PATCH v2] Change dhcp_release to use default address when no IP subnet matches

Brian Haley haleyb.dev at gmail.com
Tue Oct 1 19:52:33 BST 2019


On 10/1/19 10:24 AM, Petr Mensik wrote:
> Hi Brian and Simon,
> 
> I have one objection here. I think the tool should never end without
> sending the request or showing some error. There is still one case left,
> where it would do nothing and still exit without error. I admit it would
> be rare, as IPv4 address has to be missing on given device. Anyway, I
> think showing error and returning error code does not hurt.
> 
> Patch attached.

LGTM, thanks Petr.

-Brian


> On 8/30/19 10:22 PM, Simon Kelley wrote:
>> That looks fine. Patch applied.
>>
>>
>> Cheers,
>>
>> Simon.
>>
>>
>>
>> On 28/08/2019 21:13, haleyb.dev at gmail.com wrote:
>>> From: Brian Haley <haleyb.dev at gmail.com>
>>>
>>> Currently, dhcp_release will only send a 'fake' release
>>> when the address given is in the same subnet as an IP
>>> on the interface that was given.
>>>
>>> This doesn't work in an environment where dnsmasq is
>>> managing leases for remote subnets via a DHCP relay, as
>>> running dhcp_release locally will just cause it to
>>> silently exit without doing anything, leaving the lease
>>> in the database.
>>>
>>> Change it to use the default IP on the interface, as the
>>> dnsmasq source code at src/dhcp.c does, if no matching subnet
>>> IP is found, as a fall-back.  This fixes an issue we are
>>> seeing in certain Openstack deployments where we are using
>>> dnsmasq to provision baremetal systems in a datacenter.
>>>
>>> While using Dbus might have seemed like an obvious solution,
>>> because of our extensive use of network namespaces (which
>>> Dbus doesn't support), this seemed like a better solution
>>> than creating system.d policy files for each dnsmasq we
>>> might spawn and using --enable-dbus=$id in order to isolate
>>> messages to specific dnsmasq instances.
>>>
>>> Signed-off-by: Brian Haley <haleyb.dev at gmail.com>
>>> ---
>>>   contrib/lease-tools/dhcp_release.c | 12 +++++++++---
>>>   1 file changed, 9 insertions(+), 3 deletions(-)
>>>
>>> diff --git a/contrib/lease-tools/dhcp_release.c b/contrib/lease-tools/dhcp_release.c
>>> index 59883d4..c866cd9 100644
>>> --- a/contrib/lease-tools/dhcp_release.c
>>> +++ b/contrib/lease-tools/dhcp_release.c
>>> @@ -178,7 +178,7 @@ static int is_same_net(struct in_addr a, struct in_addr b, struct in_addr mask)
>>>     return (a.s_addr & mask.s_addr) == (b.s_addr & mask.s_addr);
>>>   }
>>>   
>>> -static struct in_addr find_interface(struct in_addr client, int fd, unsigned int index)
>>> +static struct in_addr find_interface(struct in_addr client, int fd, unsigned int index, int ifrfd, struct ifreq *ifr)
>>>   {
>>>     struct sockaddr_nl addr;
>>>     struct nlmsghdr *h;
>>> @@ -218,7 +218,13 @@ static struct in_addr find_interface(struct in_addr client, int fd, unsigned int
>>>   
>>>         for (h = (struct nlmsghdr *)iov.iov_base; NLMSG_OK(h, (size_t)len); h = NLMSG_NEXT(h, len))
>>>   	if (h->nlmsg_type == NLMSG_DONE)
>>> -	  exit(0);
>>> +          {
>>> +	    /* No match found, return first address as src/dhcp.c code does */
>>> +	    ifr->ifr_addr.sa_family = AF_INET;
>>> +	    if (ioctl(ifrfd, SIOCGIFADDR, ifr) != -1)
>>> +	      return ((struct sockaddr_in *)&ifr->ifr_addr)->sin_addr;
>>> +	    exit(0);
>>> +          }
>>>   	else if (h->nlmsg_type == RTM_NEWADDR)
>>>             {
>>>               struct ifaddrmsg *ifa = NLMSG_DATA(h);
>>> @@ -285,7 +291,7 @@ int main(int argc, char **argv)
>>>       }
>>>     
>>>     lease.s_addr = inet_addr(argv[2]);
>>> -  server = find_interface(lease, nl, if_nametoindex(argv[1]));
>>> +  server = find_interface(lease, nl, if_nametoindex(argv[1]), fd, &ifr);
>>>     
>>>     memset(&packet, 0, sizeof(packet));
>>>    
>>>
>>
>>
>> _______________________________________________
>> Dnsmasq-discuss mailing list
>> Dnsmasq-discuss at lists.thekelleys.org.uk
>> http://lists.thekelleys.org.uk/mailman/listinfo/dnsmasq-discuss
>>
> 
> 
> _______________________________________________
> Dnsmasq-discuss mailing list
> Dnsmasq-discuss at lists.thekelleys.org.uk
> http://lists.thekelleys.org.uk/mailman/listinfo/dnsmasq-discuss
> 



More information about the Dnsmasq-discuss mailing list