diff options
Diffstat (limited to 'package/network/services/dnsmasq/patches/0009-Do-unsolicited-RAs-for-interfaces-which-appear-after.patch')
-rw-r--r-- | package/network/services/dnsmasq/patches/0009-Do-unsolicited-RAs-for-interfaces-which-appear-after.patch | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/package/network/services/dnsmasq/patches/0009-Do-unsolicited-RAs-for-interfaces-which-appear-after.patch b/package/network/services/dnsmasq/patches/0009-Do-unsolicited-RAs-for-interfaces-which-appear-after.patch new file mode 100644 index 0000000..0aaec7e --- /dev/null +++ b/package/network/services/dnsmasq/patches/0009-Do-unsolicited-RAs-for-interfaces-which-appear-after.patch @@ -0,0 +1,44 @@ +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 +Subject: [PATCH 09/10] Do unsolicited RAs for interfaces which appear after + 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; + } |