aboutsummaryrefslogtreecommitdiffstats
path: root/package/network/services/dnsmasq/patches/0015-Handle-some-corner-cases-in-RA-contructed-interfaces.patch
diff options
context:
space:
mode:
Diffstat (limited to 'package/network/services/dnsmasq/patches/0015-Handle-some-corner-cases-in-RA-contructed-interfaces.patch')
-rw-r--r--package/network/services/dnsmasq/patches/0015-Handle-some-corner-cases-in-RA-contructed-interfaces.patch64
1 files changed, 64 insertions, 0 deletions
diff --git a/package/network/services/dnsmasq/patches/0015-Handle-some-corner-cases-in-RA-contructed-interfaces.patch b/package/network/services/dnsmasq/patches/0015-Handle-some-corner-cases-in-RA-contructed-interfaces.patch
new file mode 100644
index 0000000000..ce9ce4af5a
--- /dev/null
+++ b/package/network/services/dnsmasq/patches/0015-Handle-some-corner-cases-in-RA-contructed-interfaces.patch
@@ -0,0 +1,64 @@
+From db0f488ea8f5ded7c57400c9108ec3c9367d75c5 Mon Sep 17 00:00:00 2001
+From: Simon Kelley <simon@thekelleys.org.uk>
+Date: Thu, 7 Jun 2018 21:37:02 +0100
+Subject: [PATCH 15/17] Handle some corner cases in RA contructed interfaces
+ with addresses changing interface.
+
+Thanks to Vladislav Grishenko for work on this.
+
+Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
+---
+ src/dhcp6.c | 16 ++++++++++------
+ 1 file changed, 10 insertions(+), 6 deletions(-)
+
+--- a/src/dhcp6.c
++++ b/src/dhcp6.c
+@@ -640,7 +640,7 @@ static int construct_worker(struct in6_a
+ return 0;
+
+ for (template = daemon->dhcp6; template; template = template->next)
+- if (!(template->flags & CONTEXT_TEMPLATE))
++ if (!(template->flags & (CONTEXT_TEMPLATE | CONTEXT_CONSTRUCTED)))
+ {
+ /* non-template entries, just fill in interface and local addresses */
+ if (prefix <= template->prefix &&
+@@ -667,20 +667,23 @@ static int construct_worker(struct in6_a
+ end6 = *local;
+ setaddr6part(&end6, addr6part(&template->end6));
+
+- /* If there's an absolute address context covering this address
+- then don't contruct one as well. */
+ for (context = daemon->dhcp6; context; context = context->next)
+ if (!(context->flags & CONTEXT_TEMPLATE) &&
+ IN6_ARE_ADDR_EQUAL(&start6, &context->start6) &&
+ IN6_ARE_ADDR_EQUAL(&end6, &context->end6))
+ {
+- if (context->flags & CONTEXT_CONSTRUCTED)
++ /* If there's an absolute address context covering this address
++ then don't construct one as well. */
++ if (!(context->flags & CONTEXT_CONSTRUCTED))
++ break;
++
++ if (context->if_index == if_index)
+ {
+ int cflags = context->flags;
+ context->flags &= ~(CONTEXT_GC | CONTEXT_OLD);
+ if (cflags & CONTEXT_OLD)
+ {
+- /* address went, now it's back */
++ /* address went, now it's back, and on the same interface */
+ log_context(AF_INET6, context);
+ /* fast RAs for a while */
+ ra_start_unsolicited(param->now, context);
+@@ -688,9 +691,10 @@ static int construct_worker(struct in6_a
+ /* Add address to name again */
+ if (context->flags & CONTEXT_RA_NAME)
+ param->newname = 1;
++
++ break;
+ }
+ }
+- break;
+ }
+
+ if (!context && (context = whine_malloc(sizeof (struct dhcp_context))))