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 */