Mercurial > illumos > illumos-gate
changeset 10773:434ca1ce22f9
6889551 IPv6 interface-id isn't being initialized on IPMP meta-interface
author | Sebastien Roy <Sebastien.Roy@Sun.COM> |
---|---|
date | Mon, 12 Oct 2009 21:46:24 -0400 |
parents | 9a5f742f9516 |
children | 72b99c06d75b |
files | usr/src/uts/common/inet/ip/ip6_if.c usr/src/uts/common/inet/ip/ip_if.c |
diffstat | 2 files changed, 17 insertions(+), 10 deletions(-) [+] |
line wrap: on
line diff
--- a/usr/src/uts/common/inet/ip/ip6_if.c Mon Oct 12 20:23:30 2009 -0500 +++ b/usr/src/uts/common/inet/ip/ip6_if.c Mon Oct 12 21:46:24 2009 -0400 @@ -1150,7 +1150,7 @@ void ill_setdefaulttoken(ill_t *ill) { - if (!ill->ill_manual_token && ill->ill_phys_addr_length != 0) { + if (!ill->ill_manual_token) { bzero(&ill->ill_token, sizeof (ill->ill_token)); MEDIA_V6INTFID(ill->ill_media, ill, &ill->ill_token); ill->ill_token_length = IPV6_TOKEN_LEN;
--- a/usr/src/uts/common/inet/ip/ip_if.c Mon Oct 12 20:23:30 2009 -0500 +++ b/usr/src/uts/common/inet/ip/ip_if.c Mon Oct 12 21:46:24 2009 -0400 @@ -19453,15 +19453,22 @@ { char *addr; - ASSERT(ill->ill_phys_addr_length == ETHERADDRL); - - /* Form EUI-64 like address */ - addr = (char *)&v6addr->s6_addr32[2]; - bcopy(ill->ill_phys_addr, addr, 3); - addr[0] ^= 0x2; /* Toggle Universal/Local bit */ - addr[3] = (char)0xff; - addr[4] = (char)0xfe; - bcopy(ill->ill_phys_addr + 3, addr + 5, 3); + /* + * Note that some IPv6 interfaces get plumbed over links that claim to + * be DL_ETHER, but don't actually have Ethernet MAC addresses (e.g. + * PPP links). The ETHERADDRL check here ensures that we only set the + * interface ID on IPv6 interfaces above links that actually have real + * Ethernet addresses. + */ + if (ill->ill_phys_addr_length == ETHERADDRL) { + /* Form EUI-64 like address */ + addr = (char *)&v6addr->s6_addr32[2]; + bcopy(ill->ill_phys_addr, addr, 3); + addr[0] ^= 0x2; /* Toggle Universal/Local bit */ + addr[3] = (char)0xff; + addr[4] = (char)0xfe; + bcopy(ill->ill_phys_addr + 3, addr + 5, 3); + } } /* ARGSUSED */