From 0c0502426faca34781da59502c8a448c38261048 Mon Sep 17 00:00:00 2001 From: Simon Kelley Date: Sat, 22 Dec 2012 22:13:19 +0000 Subject: [PATCH] Check for new SLAAC addresses when we add new prefixes. --- src/dhcp6.c | 18 ++++++++++++++---- src/dnsmasq.h | 1 + src/lease.c | 12 ++++++++++++ 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/dhcp6.c b/src/dhcp6.c index 2296ab9..9db87d3 100644 --- a/src/dhcp6.c +++ b/src/dhcp6.c @@ -475,7 +475,7 @@ static int make_duid1(int index, unsigned int type, char *mac, size_t maclen, vo struct cparam { time_t now; - int newone; + int newone, newname; }; static int construct_worker(struct in6_addr *local, int prefix, @@ -548,6 +548,10 @@ static int construct_worker(struct in6_addr *local, int prefix, /* we created a new one, need to call lease_update_file to get periodic functions called */ param->newone = 1; + + /* Will need to add new putative SLAAC addresses to existing leases */ + if (context->flags & CONTEXT_RA_NAME) + param->newname = 1; log_context(AF_INET6, context); } @@ -561,6 +565,7 @@ void dhcp_construct_contexts(time_t now) struct dhcp_context *tmp, *context, **up; struct cparam param; param.newone = 0; + param.newname = 0; param.now = now; for (context = daemon->dhcp6; context; context = context->next) @@ -578,10 +583,11 @@ void dhcp_construct_contexts(time_t now) if (context->flags & CONTEXT_GC) { - if (daemon->dhcp6 == context) - daemon->dhcp6 = context->next; *up = context->next; free(context); + param.newone = 1; /* include deletion */ + if (context->flags & CONTEXT_RA_NAME) + param.newname = 1; } else up = &context->next; @@ -590,7 +596,11 @@ void dhcp_construct_contexts(time_t now) if (param.newone) { if (daemon->dhcp || daemon->doing_dhcp6) - lease_update_file(now); + { + if (param.newname) + lease_update_slaac(now); + lease_update_file(now); + } else /* Not doing DHCP, so no lease system, manage alarms for ra only */ send_alarm(periodic_ra(now), now); diff --git a/src/dnsmasq.h b/src/dnsmasq.h index 02ac627..be062f6 100644 --- a/src/dnsmasq.h +++ b/src/dnsmasq.h @@ -1047,6 +1047,7 @@ void lease6_filter(int lease_type, int iaid, struct dhcp_context *context); struct dhcp_lease *lease6_find_by_addr(struct in6_addr *net, int prefix, u64 addr); u64 lease_find_max_addr6(struct dhcp_context *context); void lease_ping_reply(struct in6_addr *sender, unsigned char *packet, char *interface); +void lease_update_slaac(time_t now); #endif void lease_set_hwaddr(struct dhcp_lease *lease, unsigned char *hwaddr, unsigned char *clid, int hw_len, int hw_type, int clid_len, time_t now, int force); diff --git a/src/lease.c b/src/lease.c index 6add538..3856649 100644 --- a/src/lease.c +++ b/src/lease.c @@ -389,6 +389,18 @@ void lease_ping_reply(struct in6_addr *sender, unsigned char *packet, char *inte slaac_ping_reply(sender, packet, interface, leases); } +void lease_update_slaac(time_t now) +{ + /* Called when we contruct a new RA-names context, to add putative + new SLAAC addresses to existing leases. */ + + struct dhcp_lease *lease; + + if (daemon->dhcp) + for (lease = leases; lease; lease = lease->next) + slaac_add_addrs(lease, now, 0); +} + #endif