From 5ae34bf3c86ec8f0620e8294bb9e68ea7f420a14 Mon Sep 17 00:00:00 2001 From: Simon Kelley Date: Mon, 4 Jun 2012 21:14:03 +0100 Subject: [PATCH] Fix RA when interface has more than one address on the same network. --- CHANGELOG | 4 ++++ src/radv.c | 16 +++++++++------- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 1358625..aa8c0d2 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -18,6 +18,10 @@ version 2.62 Add --dns-rr, to allow arbitrary DNS resource records. + Fixed bug which broke RA scheduling when an interface had + two addresses in the same network. Thanks to Jim Bos for + his help nailing this. + version 2.61 Re-write interface discovery code on *BSD to use diff --git a/src/radv.c b/src/radv.c index 6ef0dc0..632e008 100644 --- a/src/radv.c +++ b/src/radv.c @@ -380,13 +380,6 @@ static int add_prefixes(struct in6_addr *local, int prefix, if (context->flags & CONTEXT_DEPRECATE) deprecate = 1; - /* subsequent prefixes on the same interface - and subsequent instances of this prefix don't need timers */ - if (!param->first) - context->ra_time = 0; - param->first = 0; - param->found_context = 1; - /* collect dhcp-range tags */ if (context->netid.next == &context->netid && context->netid.net) { @@ -394,11 +387,20 @@ static int add_prefixes(struct in6_addr *local, int prefix, param->tags = &context->netid; } + /* subsequent prefixes on the same interface + and subsequent instances of this prefix don't need timers. + Be careful not to find the same prefix twice with different + addresses. */ if (!(context->flags & CONTEXT_RA_DONE)) { + if (!param->first) + context->ra_time = 0; context->flags |= CONTEXT_RA_DONE; do_prefix = 1; } + + param->first = 0; + param->found_context = 1; } if (do_prefix)