Handle firewire and EUI-64 addresses in the SLAAC code.

This commit is contained in:
Simon Kelley
2012-03-07 13:13:56 +00:00
parent f444cddbaf
commit bc26f9a03f

View File

@@ -417,7 +417,9 @@ void lease_update_dns(void)
if (lease->last_interface == map->iface) if (lease->last_interface == map->iface)
{ {
struct in6_addr addr = map->subnet; 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 */ /* convert MAC address to EUI-64 */
memcpy(&addr.s6_addr[8], lease->hwaddr, 3); memcpy(&addr.s6_addr[8], lease->hwaddr, 3);
@@ -426,8 +428,24 @@ void lease_update_dns(void)
addr.s6_addr[12] = 0xfe; addr.s6_addr[12] = 0xfe;
addr.s6_addr[8] ^= 0x02; addr.s6_addr[8] ^= 0x02;
} }
else if (lease->hwaddr_len == 8) #if defined(ARPHRD_EUI64)
memcpy(&addr.s6_addr[8], lease->hwaddr, 8); 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 else
continue; continue;