From a9ab732e3540ddadc065e6ae8cea1949c0d7e84a Mon Sep 17 00:00:00 2001 From: Simon Kelley Date: Sat, 28 Apr 2012 11:29:37 +0100 Subject: [PATCH] reconfirm SLAAC addresses when DHCPv4 leases go though INIT_REBOOT state. --- src/dnsmasq.h | 4 ++-- src/lease.c | 15 +++++++++------ src/rfc2131.c | 4 ++-- src/rfc3315.c | 2 +- src/slaac.c | 10 +++++++++- 5 files changed, 23 insertions(+), 12 deletions(-) diff --git a/src/dnsmasq.h b/src/dnsmasq.h index 4161746..445efad 100644 --- a/src/dnsmasq.h +++ b/src/dnsmasq.h @@ -1000,7 +1000,7 @@ u64 lease_find_max_addr6(struct dhcp_context *context); void lease_ping_reply(struct in6_addr *sender, unsigned char *packet, char *interface); #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); + unsigned char *clid, int hw_len, int hw_type, int clid_len, time_t now, int force); void lease_set_hostname(struct dhcp_lease *lease, char *name, int auth, char *domain, char *config_domain); void lease_set_expires(struct dhcp_lease *lease, unsigned int len, time_t now); void lease_set_interface(struct dhcp_lease *lease, int interface, time_t now); @@ -1166,7 +1166,7 @@ void ra_start_unsolicted(time_t now, struct dhcp_context *context); /* slaac.c */ #ifdef HAVE_DHCP6 void build_subnet_map(void); -void slaac_add_addrs(struct dhcp_lease *lease, time_t now); +void slaac_add_addrs(struct dhcp_lease *lease, time_t now, int force); time_t periodic_slaac(time_t now, struct dhcp_lease *leases); void slaac_ping_reply(struct in6_addr *sender, unsigned char *packet, char *interface, struct dhcp_lease *leases); void schedule_subnet_map(void); diff --git a/src/lease.c b/src/lease.c index ca226e0..aeb589e 100644 --- a/src/lease.c +++ b/src/lease.c @@ -98,7 +98,7 @@ void lease_init(time_t now) hw_type = ARPHRD_ETHER; lease_set_hwaddr(lease, (unsigned char *)daemon->dhcp_buff2, (unsigned char *)daemon->packet, - hw_len, hw_type, clid_len, now); + hw_len, hw_type, clid_len, now, 0); if (strcmp(daemon->dhcp_buff, "*") != 0) lease_set_hostname(lease, daemon->dhcp_buff, 0, get_domain(lease->addr), NULL); @@ -119,7 +119,7 @@ void lease_init(time_t now) if ((lease = lease6_allocate(&addr.addr.addr6, lease_type))) { - lease_set_hwaddr(lease, NULL, (unsigned char *)daemon->packet, 0, hw_type, clid_len, now); + lease_set_hwaddr(lease, NULL, (unsigned char *)daemon->packet, 0, hw_type, clid_len, now, 0); if (strcmp(daemon->dhcp_buff, "*") != 0) lease_set_hostname(lease, daemon->dhcp_buff, 0, get_domain6((struct in6_addr *)lease->hwaddr), NULL); @@ -702,13 +702,16 @@ void lease_set_expires(struct dhcp_lease *lease, unsigned int len, time_t now) } 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) + unsigned char *clid, int hw_len, int hw_type, int clid_len, + time_t now, int force) { #ifdef HAVE_DHCP6 - int change = 0; + int change = force; lease->flags |= LEASE_HAVE_HWADDR; #endif + (void)force; + if (hw_len != lease->hwaddr_len || hw_type != lease->hwaddr_type || (hw_len != 0 && memcmp(lease->hwaddr, hwaddr, hw_len) != 0)) @@ -758,7 +761,7 @@ void lease_set_hwaddr(struct dhcp_lease *lease, unsigned char *hwaddr, #ifdef HAVE_DHCP6 if (change) - slaac_add_addrs(lease, now); + slaac_add_addrs(lease, now, force); #endif } @@ -886,7 +889,7 @@ void lease_set_interface(struct dhcp_lease *lease, int interface, time_t now) lease->flags |= LEASE_CHANGED; #ifdef HAVE_DHCP6 - slaac_add_addrs(lease, now); + slaac_add_addrs(lease, now, 0); #endif } diff --git a/src/rfc2131.c b/src/rfc2131.c index aefc5e4..cf22c03 100644 --- a/src/rfc2131.c +++ b/src/rfc2131.c @@ -483,7 +483,7 @@ size_t dhcp_reply(struct dhcp_context *context, char *iface_name, int int_index, { logaddr = &mess->yiaddr; - lease_set_hwaddr(lease, mess->chaddr, NULL, mess->hlen, mess->htype, 0, now); + lease_set_hwaddr(lease, mess->chaddr, NULL, mess->hlen, mess->htype, 0, now, 1); if (hostname) lease_set_hostname(lease, hostname, 1, get_domain(lease->addr), domain); /* infinite lease unless nailed in dhcp-host line. */ @@ -1281,7 +1281,7 @@ size_t dhcp_reply(struct dhcp_context *context, char *iface_name, int int_index, } time = calc_time(context, config, option_find(mess, sz, OPTION_LEASE_TIME, 4)); - lease_set_hwaddr(lease, mess->chaddr, clid, mess->hlen, mess->htype, clid_len, now); + lease_set_hwaddr(lease, mess->chaddr, clid, mess->hlen, mess->htype, clid_len, now, do_classes); /* if all the netids in the ignore_name list are present, ignore client-supplied name */ if (!hostname_auth) diff --git a/src/rfc3315.c b/src/rfc3315.c index 730fdfe..a1c8326 100644 --- a/src/rfc3315.c +++ b/src/rfc3315.c @@ -637,7 +637,7 @@ static int dhcp6_no_relay(int msg_type, struct in6_addr *link_address, struct dh if (lease) { lease_set_expires(lease, lease_time, now); - lease_set_hwaddr(lease, NULL, clid, 0, iaid, clid_len, now); + lease_set_hwaddr(lease, NULL, clid, 0, iaid, clid_len, now, 0); lease_set_interface(lease, interface, now); if (hostname && ia_type == OPTION6_IA_NA) { diff --git a/src/slaac.c b/src/slaac.c index a982060..e74e5e9 100644 --- a/src/slaac.c +++ b/src/slaac.c @@ -23,12 +23,13 @@ static int map_rebuild = 0; static int ping_id = 0; -void slaac_add_addrs(struct dhcp_lease *lease, time_t now) +void slaac_add_addrs(struct dhcp_lease *lease, time_t now, int force) { struct slaac_address *slaac, *old, **up; struct dhcp_context *context; if (!(lease->flags & LEASE_HAVE_HWADDR) || + (lease->flags & (LEASE_TA | LEASE_NA)) || lease->last_interface == 0 || !lease->hostname) return ; @@ -72,6 +73,13 @@ void slaac_add_addrs(struct dhcp_lease *lease, time_t now) if (IN6_ARE_ADDR_EQUAL(&addr, &slaac->addr)) { *up = slaac->next; + /* recheck when DHCPv4 goes through init-reboot */ + if (force) + { + slaac->ping_time = now; + slaac->backoff = 1; + lease_update_dns(1); + } break; } up = &slaac->next;