diff options
| -rw-r--r-- | wifi/java/android/net/wifi/WifiConfiguration.java | 39 | ||||
| -rw-r--r-- | wifi/tests/src/android/net/wifi/WifiConfigurationTest.java | 32 |
2 files changed, 52 insertions, 19 deletions
diff --git a/wifi/java/android/net/wifi/WifiConfiguration.java b/wifi/java/android/net/wifi/WifiConfiguration.java index 21ae3a923946..b77b1ad5f255 100644 --- a/wifi/java/android/net/wifi/WifiConfiguration.java +++ b/wifi/java/android/net/wifi/WifiConfiguration.java @@ -25,11 +25,13 @@ import android.net.MacAddress; import android.net.ProxyInfo; import android.net.StaticIpConfiguration; import android.net.Uri; +import android.net.wifi.WifiInfo; import android.os.Parcel; import android.os.Parcelable; import android.os.UserHandle; import android.text.TextUtils; import android.util.BackupUtils; +import android.util.Log; import java.io.ByteArrayOutputStream; import java.io.DataInputStream; @@ -76,6 +78,8 @@ public class WifiConfiguration implements Parcelable { /** {@hide} */ private String mPasspointManagementObjectTree; + /** {@hide} */ + private static final int MAXIMUM_RANDOM_MAC_GENERATION_RETRY = 3; /** * Recognized key management schemes. @@ -798,27 +802,37 @@ public class WifiConfiguration implements Parcelable { * @hide * Randomized MAC address to use with this particular network */ + @NonNull private MacAddress mRandomizedMacAddress; /** * @hide * Checks if the given MAC address can be used for Connected Mac Randomization - * by verifying that it is non-null, unicast, and locally assigned. + * by verifying that it is non-null, unicast, locally assigned, and not default mac. * @param mac MacAddress to check * @return true if mac is good to use */ - private boolean isValidMacAddressForRandomization(MacAddress mac) { - return mac != null && !mac.isMulticastAddress() && mac.isLocallyAssigned(); + public static boolean isValidMacAddressForRandomization(MacAddress mac) { + return mac != null && !mac.isMulticastAddress() && mac.isLocallyAssigned() + && !MacAddress.fromString(WifiInfo.DEFAULT_MAC_ADDRESS).equals(mac); } /** * @hide * Returns Randomized MAC address to use with the network. - * If it is not set/valid, create a new randomized address. + * If it is not set/valid, creates a new randomized address. + * If it can't generate a valid mac, returns the default MAC. */ - public MacAddress getOrCreateRandomizedMacAddress() { - if (!isValidMacAddressForRandomization(mRandomizedMacAddress)) { + public @NonNull MacAddress getOrCreateRandomizedMacAddress() { + int randomMacGenerationCount = 0; + while (!isValidMacAddressForRandomization(mRandomizedMacAddress) + && randomMacGenerationCount < MAXIMUM_RANDOM_MAC_GENERATION_RETRY) { mRandomizedMacAddress = MacAddress.createRandomUnicastAddress(); + randomMacGenerationCount++; + } + + if (!isValidMacAddressForRandomization(mRandomizedMacAddress)) { + mRandomizedMacAddress = MacAddress.fromString(WifiInfo.DEFAULT_MAC_ADDRESS); } return mRandomizedMacAddress; } @@ -828,10 +842,7 @@ public class WifiConfiguration implements Parcelable { * Returns MAC address set to be the local randomized MAC address. * Does not guarantee that the returned address is valid for use. */ - public MacAddress getRandomizedMacAddress() { - if (mRandomizedMacAddress == null) { - mRandomizedMacAddress = MacAddress.ALL_ZEROS_ADDRESS; - } + public @NonNull MacAddress getRandomizedMacAddress() { return mRandomizedMacAddress; } @@ -839,7 +850,11 @@ public class WifiConfiguration implements Parcelable { * @hide * @param mac MacAddress to change into */ - public void setRandomizedMacAddress(MacAddress mac) { + public void setRandomizedMacAddress(@NonNull MacAddress mac) { + if (mac == null) { + Log.e(TAG, "setRandomizedMacAddress received null MacAddress."); + return; + } mRandomizedMacAddress = mac; } @@ -1532,7 +1547,7 @@ public class WifiConfiguration implements Parcelable { creatorUid = -1; shared = true; dtimInterval = 0; - mRandomizedMacAddress = MacAddress.ALL_ZEROS_ADDRESS; + mRandomizedMacAddress = MacAddress.fromString(WifiInfo.DEFAULT_MAC_ADDRESS); } /** diff --git a/wifi/tests/src/android/net/wifi/WifiConfigurationTest.java b/wifi/tests/src/android/net/wifi/WifiConfigurationTest.java index 8a3a7f5a2d79..35179847541c 100644 --- a/wifi/tests/src/android/net/wifi/WifiConfigurationTest.java +++ b/wifi/tests/src/android/net/wifi/WifiConfigurationTest.java @@ -18,12 +18,14 @@ package android.net.wifi; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertFalse; import android.os.Parcel; import android.net.MacAddress; import android.net.wifi.WifiConfiguration.NetworkSelectionStatus; +import android.net.wifi.WifiInfo; import org.junit.Before; import org.junit.Test; @@ -176,22 +178,25 @@ public class WifiConfigurationTest { @Test public void testGetOrCreateRandomizedMacAddress_SavesAndReturnsSameAddress() { WifiConfiguration config = new WifiConfiguration(); - assertEquals(MacAddress.ALL_ZEROS_ADDRESS, config.getRandomizedMacAddress()); + MacAddress defaultMac = MacAddress.fromString(WifiInfo.DEFAULT_MAC_ADDRESS); + assertEquals(defaultMac, config.getRandomizedMacAddress()); MacAddress firstMacAddress = config.getOrCreateRandomizedMacAddress(); MacAddress secondMacAddress = config.getOrCreateRandomizedMacAddress(); + assertNotEquals(defaultMac, firstMacAddress); assertEquals(firstMacAddress, secondMacAddress); } @Test public void testSetRandomizedMacAddress_ChangesSavedAddress() { WifiConfiguration config = new WifiConfiguration(); - assertEquals(MacAddress.ALL_ZEROS_ADDRESS, config.getRandomizedMacAddress()); + MacAddress defaultMac = MacAddress.fromString(WifiInfo.DEFAULT_MAC_ADDRESS); + assertEquals(defaultMac, config.getRandomizedMacAddress()); MacAddress macToChangeInto = MacAddress.createRandomUnicastAddress(); config.setRandomizedMacAddress(macToChangeInto); - MacAddress macAfterChange = config.getOrCreateRandomizedMacAddress(); + MacAddress macAfterChange = config.getRandomizedMacAddress(); assertEquals(macToChangeInto, macAfterChange); } @@ -200,24 +205,37 @@ public class WifiConfigurationTest { public void testGetOrCreateRandomizedMacAddress_ReRandomizesInvalidAddress() { WifiConfiguration config = new WifiConfiguration(); + MacAddress defaultMac = MacAddress.fromString(WifiInfo.DEFAULT_MAC_ADDRESS); MacAddress macAddressZeroes = MacAddress.ALL_ZEROS_ADDRESS; MacAddress macAddressMulticast = MacAddress.fromString("03:ff:ff:ff:ff:ff"); MacAddress macAddressGlobal = MacAddress.fromString("fc:ff:ff:ff:ff:ff"); config.setRandomizedMacAddress(null); MacAddress macAfterChange = config.getOrCreateRandomizedMacAddress(); - assertFalse(macAfterChange.equals(null)); + assertNotEquals(macAfterChange, null); + + config.setRandomizedMacAddress(defaultMac); + macAfterChange = config.getOrCreateRandomizedMacAddress(); + assertNotEquals(macAfterChange, defaultMac); config.setRandomizedMacAddress(macAddressZeroes); macAfterChange = config.getOrCreateRandomizedMacAddress(); - assertFalse(macAfterChange.equals(macAddressZeroes)); + assertNotEquals(macAfterChange, macAddressZeroes); config.setRandomizedMacAddress(macAddressMulticast); macAfterChange = config.getOrCreateRandomizedMacAddress(); - assertFalse(macAfterChange.equals(macAddressMulticast)); + assertNotEquals(macAfterChange, macAddressMulticast); config.setRandomizedMacAddress(macAddressGlobal); macAfterChange = config.getOrCreateRandomizedMacAddress(); - assertFalse(macAfterChange.equals(macAddressGlobal)); + assertNotEquals(macAfterChange, macAddressGlobal); + } + + @Test + public void testSetRandomizedMacAddress_DoesNothingWhenNull() { + WifiConfiguration config = new WifiConfiguration(); + MacAddress defaultMac = MacAddress.fromString(WifiInfo.DEFAULT_MAC_ADDRESS); + config.setRandomizedMacAddress(null); + assertEquals(defaultMac, config.getRandomizedMacAddress()); } } |