Ignore template contexts where appropriate.
diff --git a/src/dhcp6.c b/src/dhcp6.c
index 7f5e7bd..fe3bbd2 100644
--- a/src/dhcp6.c
+++ b/src/dhcp6.c
@@ -214,7 +214,8 @@
for (context = daemon->dhcp6; context; context = context->next)
{
- if (prefix == context->prefix &&
+ if (!(context->flags & CONTEXT_TEMPLATE) &&
+ prefix == context->prefix &&
is_same_net6(local, &context->start6, prefix) &&
is_same_net6(local, &context->end6, prefix))
{
diff --git a/src/radv.c b/src/radv.c
index a935343..6150cfc 100644
--- a/src/radv.c
+++ b/src/radv.c
@@ -97,15 +97,16 @@
if it's not appropriate to advertise those contexts.
This gets re-called on a netlink route-change to re-do the advertisement
and pick up new interfaces */
-
+
if (context)
- context->ra_time = now;
+ context->ra_time = now;
else
for (context = daemon->dhcp6; context; context = context->next)
- context->ra_time = now + (rand16()/13000); /* range 0 - 5 */
-
- /* re-do frequently for a minute or so, in case the first gets lost. */
- ra_short_period_start = now;
+ if (!(context->flags & CONTEXT_TEMPLATE))
+ context->ra_time = now + (rand16()/13000); /* range 0 - 5 */
+
+ /* re-do frequently for a minute or so, in case the first gets lost. */
+ ra_short_period_start = now;
}
void icmp6_packet(time_t now)
@@ -350,7 +351,8 @@
struct dhcp_context *context;
for (context = daemon->dhcp6; context; context = context->next)
- if (prefix == context->prefix &&
+ if (!(context->flags & CONTEXT_TEMPLATE) &&
+ prefix == context->prefix &&
is_same_net6(local, &context->start6, prefix) &&
is_same_net6(local, &context->end6, prefix))
{
@@ -536,35 +538,37 @@
(void)valid;
for (context = daemon->dhcp6; context; context = context->next)
- if (prefix == context->prefix &&
+ if (!(context->flags & CONTEXT_TEMPLATE) &&
+ prefix == context->prefix &&
is_same_net6(local, &context->start6, prefix) &&
- is_same_net6(local, &context->end6, prefix))
- if (context->ra_time != 0 && difftime(context->ra_time, param->now) <= 0.0)
- {
- /* 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 (!dad)
- param->iface = if_index;
-
- if (difftime(param->now, ra_short_period_start) < 60.0)
- /* range 5 - 20 */
- context->ra_time = param->now + 5 + (rand16()/4400);
- else
- /* range 450 - 600 */
- context->ra_time = param->now + 450 + (rand16()/440);
-
- /* zero timers for other contexts on the same subnet, so they don't timeout
- independently */
- for (context = context->next; context; context = context->next)
- if (prefix == context->prefix &&
- is_same_net6(local, &context->start6, prefix) &&
- is_same_net6(local, &context->end6, prefix))
- context->ra_time = 0;
-
- return 0; /* found, abort */
- }
+ is_same_net6(local, &context->end6, prefix) &&
+ context->ra_time != 0 &&
+ difftime(context->ra_time, param->now) <= 0.0)
+ {
+ /* 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 (!dad)
+ param->iface = if_index;
+
+ if (difftime(param->now, ra_short_period_start) < 60.0)
+ /* range 5 - 20 */
+ context->ra_time = param->now + 5 + (rand16()/4400);
+ else
+ /* range 450 - 600 */
+ context->ra_time = param->now + 450 + (rand16()/440);
+
+ /* zero timers for other contexts on the same subnet, so they don't timeout
+ independently */
+ for (context = context->next; context; context = context->next)
+ if (prefix == context->prefix &&
+ is_same_net6(local, &context->start6, prefix) &&
+ is_same_net6(local, &context->end6, prefix))
+ context->ra_time = 0;
+
+ return 0; /* found, abort */
+ }
return 1; /* keep searching */
}