You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
65 lines
2.3 KiB
Diff
65 lines
2.3 KiB
Diff
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))))
|