From bc26f9a03f3cce9f4388ba0c7c324dfaf8c82bd0 Mon Sep 17 00:00:00 2001 From: Simon Kelley Date: Wed, 7 Mar 2012 13:13:56 +0000 Subject: [PATCH] Handle firewire and EUI-64 addresses in the SLAAC code. --- src/lease.c | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/lease.c b/src/lease.c index 8271963..3df3926 100644 --- a/src/lease.c +++ b/src/lease.c @@ -417,7 +417,9 @@ void lease_update_dns(void) if (lease->last_interface == map->iface) { struct in6_addr addr = map->subnet; - if (lease->hwaddr_len == 6) + if (lease->hwaddr_len == 6 && + (lease->hwaddr_type == ARPHRD_ETHER || + lease->hwaddr_type == ARPHRD_IEEE802)) { /* convert MAC address to EUI-64 */ memcpy(&addr.s6_addr[8], lease->hwaddr, 3); @@ -426,11 +428,27 @@ void lease_update_dns(void) addr.s6_addr[12] = 0xfe; addr.s6_addr[8] ^= 0x02; } - else if (lease->hwaddr_len == 8) - memcpy(&addr.s6_addr[8], lease->hwaddr, 8); +#if defined(ARPHRD_EUI64) + else if (lease->hwaddr_len == 8 && + lease->hwaddr_type == ARPHRD_EUI64) + { + memcpy(&addr.s6_addr[8], &lease->hwaddr, 8); + addr.s6_addr[8] ^= 0x02; + } +#endif +#if defined(ARPHRD_IEEE1394) && defined(ARPHRD_EUI64) + else if (lease->clid_len == 9 && + lease->clid[0] == ARPHRD_EUI64 && + lease->hwaddr_type == ARPHRD_IEEE1394) + { + /* firewire has EUI-64 identifier as clid */ + memcpy(&addr.s6_addr[8], &lease->clid[1], 8); + addr.s6_addr[8] ^= 0x02; + } +#endif else continue; - + if (lease->fqdn) cache_add_dhcp_entry(lease->fqdn, AF_INET6, (struct all_addr *)&addr, lease->expires); if (!option_bool(OPT_DHCP_FQDN) && lease->hostname)