2018-05-12 14:37:33 +00:00
|
|
|
From 0a496f059c1e9d75c33cce4c1211d58422ba4f62 Mon Sep 17 00:00:00 2001
|
|
|
|
From: Maarten de Vries <maarten+dnsmasq@m.de-vri.es>
|
|
|
|
Date: Fri, 11 May 2018 23:20:58 +0100
|
2018-06-03 03:44:12 +00:00
|
|
|
Subject: [PATCH 09/17] Do unsolicited RAs for interfaces which appear after
|
2018-05-12 14:37:33 +00:00
|
|
|
dnsmasq startup.
|
|
|
|
|
|
|
|
I noticed that dnsmasq often wasn't sending any unsolicited RAs for me.
|
|
|
|
|
|
|
|
This turned out to happen when the interface (a bridge interface) wasn't
|
|
|
|
created yet at the time dnsmasq started. When dnsmasq is started after
|
|
|
|
the interface is created, it sends RAs as expected. I assume this also
|
|
|
|
extends to other types of virtual interfaces that are created after
|
|
|
|
dnsmasq starts.
|
|
|
|
|
|
|
|
Digging into the source, it seems to be caused by a missing call to
|
|
|
|
ra_start_unsolicited for non-template contexts in construct_worker from
|
|
|
|
src/dhcp6.c. The attached patch adds that call, but only if the
|
|
|
|
interface index or address changed to prevent doing fast RAs for no reason.
|
|
|
|
|
|
|
|
I tested it on my own server and it appears to work as expected. When
|
|
|
|
the interface is created and configured, dnsmasq does fast RAs for a
|
|
|
|
while and then settles into slow RAs.
|
|
|
|
|
|
|
|
Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
|
|
|
|
---
|
|
|
|
src/dhcp6.c | 7 +++++++
|
|
|
|
1 file changed, 7 insertions(+)
|
|
|
|
|
|
|
|
--- a/src/dhcp6.c
|
|
|
|
+++ b/src/dhcp6.c
|
|
|
|
@@ -647,6 +647,13 @@ static int construct_worker(struct in6_a
|
|
|
|
is_same_net6(local, &template->start6, template->prefix) &&
|
|
|
|
is_same_net6(local, &template->end6, template->prefix))
|
|
|
|
{
|
|
|
|
+ /* First time found, do fast RA. */
|
|
|
|
+ if (template->if_index != if_index || !IN6_ARE_ADDR_EQUAL(&template->local6, local))
|
|
|
|
+ {
|
|
|
|
+ ra_start_unsolicited(param->now, template);
|
|
|
|
+ param->newone = 1;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
template->if_index = if_index;
|
|
|
|
template->local6 = *local;
|
|
|
|
}
|