Fix RA problems with two interfaces on same IPv6 subnet.
diff --git a/CHANGELOG b/CHANGELOG
index 42ad123..80ea482 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -64,8 +64,13 @@
Enhance --conf-dir to load files in a deterministic order. Thanks to
Evgenii Seliavka for the suggestion and initial patch.
-
+ In the router advert code, handle case where we have two
+ different interfaces on the same IPv6 net, and we're doing
+ RA/DHCP service on only one of them. Thanks to NIIBE Yutaka
+ for spotting this case and making the initial patch.
+
+
version 2.80
Add support for RFC 4039 DHCP rapid commit. Thanks to Ashram Method
for the initial patch and motivation.
diff --git a/debian/changelog b/debian/changelog
index d9d39a2..b2fc87f 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -7,8 +7,10 @@
* Add note explaining that ENABLED is SYSV-init only. (closes: #914755)
* Replace ash with dash in contrib/reverse-dns. (closes: #920224)
* Move to libidn2. (closes: #932695)
+ * Fix RA problem with two interfaces on same net, but RA service on
+ only one of the interfaces. (closes: #949565)
- -- Simon Kelley <simon@thekelleys.org.uk> Fri, 8 Apr 2019 17:14:15 +0000
+ -- Simon Kelley <simon@thekelleys.org.uk> Mon, 27 Jan 2020 22:31:15 +0000
dnsmasq (2.80-1) unstable; urgency=low
diff --git a/src/radv.c b/src/radv.c
index cad0530..7ec8cd0 100644
--- a/src/radv.c
+++ b/src/radv.c
@@ -891,11 +891,21 @@
{
struct search_param *param = vparam;
struct dhcp_context *context;
-
+ struct iname *tmp;
+
(void)scope;
(void)preferred;
(void)valid;
-
+
+ /* ignore interfaces we're not doing DHCP on. */
+ if (!indextoname(daemon->icmp6fd, if_index, param->name) ||
+ !iface_check(AF_LOCAL, NULL, param->name, NULL))
+ return 1;
+
+ for (tmp = daemon->dhcp_except; tmp; tmp = tmp->next)
+ if (tmp->name && wildcard_match(tmp->name, param->name))
+ return 1;
+
for (context = daemon->dhcp6; context; context = context->next)
if (!(context->flags & (CONTEXT_TEMPLATE | CONTEXT_OLD)) &&
prefix <= context->prefix &&
@@ -907,17 +917,9 @@
/* found an interface that's overdue for RA determine new
timeout value and arrange for RA to be sent unless interface is
still doing DAD.*/
-
if (!(flags & IFACE_TENTATIVE))
param->iface = if_index;
- /* should never fail */
- if (!indextoname(daemon->icmp6fd, if_index, param->name))
- {
- param->iface = 0;
- return 0;
- }
-
new_timeout(context, param->name, param->now);
/* zero timers for other contexts on the same subnet, so they don't timeout