diff options
| author | Etan Cohen <etancohen@google.com> | 2018-11-19 16:48:22 -0800 |
|---|---|---|
| committer | android-build-merger <android-build-merger@google.com> | 2018-11-19 16:48:22 -0800 |
| commit | 5faec915130783b35719a7bc78fba6096d5f657d (patch) | |
| tree | 113895425b067b0f7b07acd1636ac55c040c8cb7 /core/java | |
| parent | 439ed702daf83f4cefff905f731f77cfffca5ce8 (diff) | |
| parent | 674479afe5c7ddfaa52a5c2064fb64a6533e9322 (diff) | |
Merge "Add IPv6 link-local address generation from EUI-48" am: a2a9df3e3a
am: 674479afe5
Change-Id: I63de4fa185649d9389a771860c479899e90b37e4
Diffstat (limited to 'core/java')
| -rw-r--r-- | core/java/android/net/MacAddress.java | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/core/java/android/net/MacAddress.java b/core/java/android/net/MacAddress.java index 98f356722bf3..058cb941bfbc 100644 --- a/core/java/android/net/MacAddress.java +++ b/core/java/android/net/MacAddress.java @@ -18,6 +18,7 @@ package android.net; import android.annotation.IntDef; import android.annotation.NonNull; +import android.annotation.Nullable; import android.annotation.UnsupportedAppUsage; import android.os.Parcel; import android.os.Parcelable; @@ -27,6 +28,8 @@ import com.android.internal.util.Preconditions; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import java.net.Inet6Address; +import java.net.UnknownHostException; import java.security.SecureRandom; import java.util.Arrays; import java.util.Random; @@ -393,4 +396,34 @@ public final class MacAddress implements Parcelable { } return out; } + + /** + * Create a link-local Inet6Address from the MAC address. The EUI-48 MAC address is converted + * to an EUI-64 MAC address per RFC 4291. The resulting EUI-64 is used to construct a link-local + * IPv6 address per RFC 4862. + * + * @return A link-local Inet6Address constructed from the MAC address. + * @hide + */ + public @Nullable Inet6Address getLinkLocalIpv6FromEui48Mac() { + byte[] macEui48Bytes = toByteArray(); + byte[] addr = new byte[16]; + + addr[0] = (byte) 0xfe; + addr[1] = (byte) 0x80; + addr[8] = (byte) (macEui48Bytes[0] ^ (byte) 0x02); // flip the link-local bit + addr[9] = macEui48Bytes[1]; + addr[10] = macEui48Bytes[2]; + addr[11] = (byte) 0xff; + addr[12] = (byte) 0xfe; + addr[13] = macEui48Bytes[3]; + addr[14] = macEui48Bytes[4]; + addr[15] = macEui48Bytes[5]; + + try { + return Inet6Address.getByAddress(null, addr, 0); + } catch (UnknownHostException e) { + return null; + } + } } |
