diff options
author | 2025-02-07 00:35:14 +0000 | |
---|---|---|
committer | 2025-02-07 20:37:17 +0000 | |
commit | 0befec7e14fe5c9fdce05c5ccff98bf247a1b0fb (patch) | |
tree | b75dc23996702604f5b639655cd2f0ba65c5b627 /framework | |
parent | d2e6d4ad0ef559166200f27f2b3326212653ec65 (diff) |
Allow WifiNetworkSpecifier to hint preference to secondary
When setPreferSecondarySta is true, the wifi framework will try to use
secondary STA for this connection when possible.
Flag: EXEMPT bugfix
Bug: 391440945
Test: atest android.net.wifi
Test: atest com.android.server.wifi
Change-Id: I3d68c52b66b6ccf389e3e005abfdd026a723827a
Diffstat (limited to 'framework')
3 files changed, 79 insertions, 37 deletions
diff --git a/framework/java/android/net/wifi/WifiNetworkSpecifier.java b/framework/java/android/net/wifi/WifiNetworkSpecifier.java index 199969d9c7..e00e7e6b7b 100644 --- a/framework/java/android/net/wifi/WifiNetworkSpecifier.java +++ b/framework/java/android/net/wifi/WifiNetworkSpecifier.java @@ -192,6 +192,8 @@ public final class WifiNetworkSpecifier extends NetworkSpecifier implements Parc private int[] mChannels; + private boolean mPreferSecondarySta; + public Builder() { mSsidPatternMatcher = null; mBssidPatternMatcher = null; @@ -480,6 +482,19 @@ public final class WifiNetworkSpecifier extends NetworkSpecifier implements Parc return this; } + /** + * Hint the Wifi service to prefer using secondary STA for this connection. + * + * @param value - true to prefer this connection to be started on a secondary STA. + * false to let the wifi framework decide + * @return Instance of {@link Builder} to enable chaining of the builder method. + * @hide + */ + @NonNull public Builder setPreferSecondarySta(boolean value) { + mPreferSecondarySta = value; + return this; + } + private void setSecurityParamsInWifiConfiguration( @NonNull WifiConfiguration configuration) { if (!TextUtils.isEmpty(mWpa2PskPassphrase)) { // WPA-PSK network. @@ -684,7 +699,8 @@ public final class WifiNetworkSpecifier extends NetworkSpecifier implements Parc mBssidPatternMatcher, mBand, buildWifiConfiguration(), - mChannels); + mChannels, + mPreferSecondarySta); } } @@ -707,6 +723,7 @@ public final class WifiNetworkSpecifier extends NetworkSpecifier implements Parc @WifiBand private final int mBand; private final int[] mChannelFreqs; + private boolean mPreferSecondarySta; /** * Security credentials for the network. @@ -729,7 +746,8 @@ public final class WifiNetworkSpecifier extends NetworkSpecifier implements Parc @NonNull Pair<MacAddress, MacAddress> bssidPatternMatcher, @WifiBand int band, @NonNull WifiConfiguration wifiConfiguration, - @NonNull int[] channelFreqs) { + @NonNull int[] channelFreqs, + boolean preferSecondarySta) { checkNotNull(ssidPatternMatcher); checkNotNull(bssidPatternMatcher); checkNotNull(wifiConfiguration); @@ -739,6 +757,7 @@ public final class WifiNetworkSpecifier extends NetworkSpecifier implements Parc this.mBand = band; this.wifiConfiguration = wifiConfiguration; this.mChannelFreqs = channelFreqs; + this.mPreferSecondarySta = preferSecondarySta; } /** @@ -756,6 +775,14 @@ public final class WifiNetworkSpecifier extends NetworkSpecifier implements Parc return mChannelFreqs.clone(); } + /** + * @see Builder#setPreferSecondarySta(boolean) + * @hide + */ + public boolean isPreferSecondarySta() { + return mPreferSecondarySta; + } + public static final @NonNull Creator<WifiNetworkSpecifier> CREATOR = new Creator<WifiNetworkSpecifier>() { @Override @@ -767,9 +794,10 @@ public final class WifiNetworkSpecifier extends NetworkSpecifier implements Parc Pair.create(baseAddress, mask); int band = in.readInt(); WifiConfiguration wifiConfiguration = in.readParcelable(null); - int[] mChannels = in.createIntArray(); + int[] channels = in.createIntArray(); + boolean preferSecondarySta = in.readBoolean(); return new WifiNetworkSpecifier(ssidPatternMatcher, bssidPatternMatcher, band, - wifiConfiguration, mChannels); + wifiConfiguration, channels, preferSecondarySta); } @Override @@ -791,13 +819,15 @@ public final class WifiNetworkSpecifier extends NetworkSpecifier implements Parc dest.writeInt(mBand); dest.writeParcelable(wifiConfiguration, flags); dest.writeIntArray(mChannelFreqs); + dest.writeBoolean(mPreferSecondarySta); } @Override public int hashCode() { return Objects.hash( ssidPatternMatcher.getPath(), ssidPatternMatcher.getType(), bssidPatternMatcher, - mBand, wifiConfiguration.allowedKeyManagement, Arrays.hashCode(mChannelFreqs)); + mBand, wifiConfiguration.allowedKeyManagement, Arrays.hashCode(mChannelFreqs), + mPreferSecondarySta); } @Override @@ -818,7 +848,8 @@ public final class WifiNetworkSpecifier extends NetworkSpecifier implements Parc && this.mBand == lhs.mBand && Objects.equals(this.wifiConfiguration.allowedKeyManagement, lhs.wifiConfiguration.allowedKeyManagement) - && Arrays.equals(mChannelFreqs, lhs.mChannelFreqs); + && Arrays.equals(mChannelFreqs, lhs.mChannelFreqs) + && mPreferSecondarySta == lhs.mPreferSecondarySta; } @Override @@ -831,6 +862,7 @@ public final class WifiNetworkSpecifier extends NetworkSpecifier implements Parc .append(", BSSID=").append(wifiConfiguration.BSSID) .append(", channels=").append(Arrays.toString(mChannelFreqs)) .append(", band=").append(mBand) + .append(", preferSecondarySta=").append(mPreferSecondarySta) .append("]") .toString(); } diff --git a/framework/tests/src/android/net/wifi/WifiNetworkAgentSpecifierTest.java b/framework/tests/src/android/net/wifi/WifiNetworkAgentSpecifierTest.java index bc22b808c5..a6718c1f11 100644 --- a/framework/tests/src/android/net/wifi/WifiNetworkAgentSpecifierTest.java +++ b/framework/tests/src/android/net/wifi/WifiNetworkAgentSpecifierTest.java @@ -195,7 +195,7 @@ public class WifiNetworkAgentSpecifierTest { ssidPattern, bssidPattern, ScanResult.WIFI_BAND_5_GHZ, - wificonfigurationNetworkSpecifier, new int[0]); + wificonfigurationNetworkSpecifier, new int[0], false); assertTrue(wifiNetworkSpecifier.canBeSatisfiedBy(wifiNetworkAgentSpecifier)); assertTrue(wifiNetworkAgentSpecifier.canBeSatisfiedBy(wifiNetworkSpecifier)); @@ -224,7 +224,7 @@ public class WifiNetworkAgentSpecifierTest { ssidPattern, bssidPattern, ScanResult.WIFI_BAND_5_GHZ, - wificonfigurationNetworkSpecifier, new int[0]); + wificonfigurationNetworkSpecifier, new int[0], false); assertTrue(wifiNetworkSpecifier.canBeSatisfiedBy(wifiNetworkAgentSpecifier)); assertTrue(wifiNetworkAgentSpecifier.canBeSatisfiedBy(wifiNetworkSpecifier)); @@ -253,7 +253,7 @@ public class WifiNetworkAgentSpecifierTest { ssidPattern, bssidPattern, ScanResult.WIFI_BAND_5_GHZ, - wificonfigurationNetworkSpecifier, new int[0]); + wificonfigurationNetworkSpecifier, new int[0], false); assertTrue(wifiNetworkSpecifier.canBeSatisfiedBy(wifiNetworkAgentSpecifier)); assertTrue(wifiNetworkAgentSpecifier.canBeSatisfiedBy(wifiNetworkSpecifier)); @@ -285,7 +285,7 @@ public class WifiNetworkAgentSpecifierTest { ssidPattern, bssidPattern, ScanResult.WIFI_BAND_24_GHZ, - wificonfigurationNetworkSpecifier, new int[0]); + wificonfigurationNetworkSpecifier, new int[0], false); assertFalse(wifiNetworkSpecifier.canBeSatisfiedBy(wifiNetworkAgentSpecifier)); assertFalse(wifiNetworkAgentSpecifier.canBeSatisfiedBy(wifiNetworkSpecifier)); @@ -316,7 +316,7 @@ public class WifiNetworkAgentSpecifierTest { ssidPattern, bssidPattern, ScanResult.WIFI_BAND_5_GHZ, - wificonfigurationNetworkSpecifier, new int[0]); + wificonfigurationNetworkSpecifier, new int[0], false); assertTrue(wifiNetworkSpecifier.canBeSatisfiedBy(wifiNetworkAgentSpecifier)); assertTrue(wifiNetworkAgentSpecifier.canBeSatisfiedBy(wifiNetworkSpecifier)); @@ -325,7 +325,7 @@ public class WifiNetworkAgentSpecifierTest { ssidPattern, bssidPattern, ScanResult.WIFI_BAND_24_GHZ, - wificonfigurationNetworkSpecifier, new int[0]); + wificonfigurationNetworkSpecifier, new int[0], false); assertFalse(wifiNetworkSpecifier.canBeSatisfiedBy(wifiNetworkAgentSpecifier)); assertFalse(wifiNetworkAgentSpecifier.canBeSatisfiedBy(wifiNetworkSpecifier)); @@ -334,7 +334,7 @@ public class WifiNetworkAgentSpecifierTest { ssidPattern, bssidPattern, ScanResult.UNSPECIFIED, - wificonfigurationNetworkSpecifier, new int[0]); + wificonfigurationNetworkSpecifier, new int[0], false); assertTrue(wifiNetworkSpecifier.canBeSatisfiedBy(wifiNetworkAgentSpecifier)); assertTrue(wifiNetworkAgentSpecifier.canBeSatisfiedBy(wifiNetworkSpecifier)); } @@ -373,17 +373,17 @@ public class WifiNetworkAgentSpecifierTest { ssidPattern, bssidPattern, ScanResult.WIFI_BAND_5_GHZ, - wificonfigurationNetworkSpecifier, new int[0]); + wificonfigurationNetworkSpecifier, new int[0], false); WifiNetworkSpecifier wifi5GLowNetworkSpecifier = new WifiNetworkSpecifier( ssidPattern, bssidPattern, ScanResult.WIFI_BAND_5_GHZ_LOW, - wificonfigurationNetworkSpecifier, new int[0]); + wificonfigurationNetworkSpecifier, new int[0], false); WifiNetworkSpecifier wifi5GHighNetworkSpecifier = new WifiNetworkSpecifier( ssidPattern, bssidPattern, ScanResult.WIFI_BAND_5_GHZ_HIGH, - wificonfigurationNetworkSpecifier, new int[0]); + wificonfigurationNetworkSpecifier, new int[0], false); // mBand = WIFI_BAND_5_GHZ_LOW // Same band matches. @@ -435,7 +435,7 @@ public class WifiNetworkAgentSpecifierTest { ssidPattern, bssidPattern, ScanResult.WIFI_BAND_5_GHZ, - wificonfigurationNetworkSpecifier, new int[0]); + wificonfigurationNetworkSpecifier, new int[0], false); assertFalse(wifiNetworkSpecifier.canBeSatisfiedBy(wifiNetworkAgentSpecifier)); assertFalse(wifiNetworkAgentSpecifier.canBeSatisfiedBy(wifiNetworkSpecifier)); @@ -454,7 +454,7 @@ public class WifiNetworkAgentSpecifierTest { ssidPattern, bssidPattern, ScanResult.WIFI_BAND_24_GHZ, - wificonfigurationNetworkSpecifier, new int[0]); + wificonfigurationNetworkSpecifier, new int[0], false); assertFalse(wifiNetworkSpecifier.canBeSatisfiedBy(wifiNetworkAgentSpecifier)); assertFalse(wifiNetworkAgentSpecifier.canBeSatisfiedBy(wifiNetworkSpecifier)); @@ -464,7 +464,7 @@ public class WifiNetworkAgentSpecifierTest { ssidPattern, bssidPattern, ScanResult.UNSPECIFIED, - wificonfigurationNetworkSpecifier, new int[0]); + wificonfigurationNetworkSpecifier, new int[0], false); assertFalse(wifiNetworkSpecifier.canBeSatisfiedBy(wifiNetworkAgentSpecifier)); assertFalse(wifiNetworkAgentSpecifier.canBeSatisfiedBy(wifiNetworkSpecifier)); } @@ -496,7 +496,7 @@ public class WifiNetworkAgentSpecifierTest { ssidPattern, bssidPattern, ScanResult.WIFI_BAND_5_GHZ, - wificonfigurationNetworkSpecifier, new int[0]); + wificonfigurationNetworkSpecifier, new int[0], false); assertFalse(wifiNetworkSpecifier.canBeSatisfiedBy(wifiNetworkAgentSpecifier)); assertFalse(wifiNetworkAgentSpecifier.canBeSatisfiedBy(wifiNetworkSpecifier)); @@ -529,7 +529,7 @@ public class WifiNetworkAgentSpecifierTest { ssidPattern, bssidPattern, ScanResult.WIFI_BAND_24_GHZ, - wificonfigurationNetworkSpecifier, new int[0]); + wificonfigurationNetworkSpecifier, new int[0], false); assertFalse(wifiNetworkSpecifier.canBeSatisfiedBy(wifiNetworkAgentSpecifier)); assertFalse(wifiNetworkAgentSpecifier.canBeSatisfiedBy(wifiNetworkSpecifier)); @@ -557,7 +557,7 @@ public class WifiNetworkAgentSpecifierTest { ssidPattern, bssidPattern, ScanResult.UNSPECIFIED, - wificonfigurationNetworkSpecifier, new int[0]); + wificonfigurationNetworkSpecifier, new int[0], false); assertFalse(wifiNetworkSpecifier.canBeSatisfiedBy(wifiNetworkAgentSpecifier)); assertFalse(wifiNetworkAgentSpecifier.canBeSatisfiedBy(wifiNetworkSpecifier)); diff --git a/framework/tests/src/android/net/wifi/WifiNetworkSpecifierTest.java b/framework/tests/src/android/net/wifi/WifiNetworkSpecifierTest.java index 12dfd6e9a5..cc6d008cb2 100644 --- a/framework/tests/src/android/net/wifi/WifiNetworkSpecifierTest.java +++ b/framework/tests/src/android/net/wifi/WifiNetworkSpecifierTest.java @@ -657,7 +657,7 @@ public class WifiNetworkSpecifierTest { Pair.create(MacAddress.fromString(TEST_BSSID_OUI_BASE_ADDRESS), MacAddress.fromString(TEST_BSSID_OUI_MASK)), WIFI_BAND_5_GHZ, - wifiConfiguration, new int[0]); + wifiConfiguration, new int[0], false); Parcel parcelW = Parcel.obtain(); specifier.writeToParcel(parcelW, 0); @@ -689,7 +689,7 @@ public class WifiNetworkSpecifierTest { Pair.create(MacAddress.fromString(TEST_BSSID_OUI_BASE_ADDRESS), MacAddress.fromString(TEST_BSSID_OUI_MASK)), ScanResult.UNSPECIFIED, /* band */ - wifiConfiguration, new int[0]); + wifiConfiguration, new int[0], false); assertFalse(specifier.canBeSatisfiedBy(null)); assertFalse(specifier.canBeSatisfiedBy(new MatchAllNetworkSpecifier())); @@ -712,14 +712,14 @@ public class WifiNetworkSpecifierTest { Pair.create(MacAddress.fromString(TEST_BSSID_OUI_BASE_ADDRESS), MacAddress.fromString(TEST_BSSID_OUI_MASK)), WIFI_BAND_5_GHZ, - wifiConfiguration, new int[0]); + wifiConfiguration, new int[0], false); WifiNetworkSpecifier specifier2 = new WifiNetworkSpecifier(new PatternMatcher(TEST_SSID, PATTERN_LITERAL), Pair.create(MacAddress.fromString(TEST_BSSID_OUI_BASE_ADDRESS), MacAddress.fromString(TEST_BSSID_OUI_MASK)), WIFI_BAND_5_GHZ, - wifiConfiguration, new int[0]); + wifiConfiguration, new int[0], false); assertTrue(specifier2.canBeSatisfiedBy(specifier1)); } @@ -741,7 +741,7 @@ public class WifiNetworkSpecifierTest { Pair.create(MacAddress.fromString(TEST_BSSID_OUI_BASE_ADDRESS), MacAddress.fromString(TEST_BSSID_OUI_MASK)), ScanResult.WIFI_BAND_24_GHZ, - wifiConfiguration1, new int[0]); + wifiConfiguration1, new int[0], false); WifiConfiguration wifiConfiguration2 = new WifiConfiguration(); wifiConfiguration2.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); @@ -750,7 +750,7 @@ public class WifiNetworkSpecifierTest { Pair.create(MacAddress.fromString(TEST_BSSID_OUI_BASE_ADDRESS), MacAddress.fromString(TEST_BSSID_OUI_MASK)), ScanResult.WIFI_BAND_24_GHZ, - wifiConfiguration2, new int[0]); + wifiConfiguration2, new int[0], false); assertFalse(specifier2.canBeSatisfiedBy(specifier1)); } @@ -772,14 +772,14 @@ public class WifiNetworkSpecifierTest { Pair.create(MacAddress.fromString(TEST_BSSID_OUI_BASE_ADDRESS), MacAddress.fromString(TEST_BSSID_OUI_MASK)), WIFI_BAND_5_GHZ, - wifiConfiguration, new int[0]); + wifiConfiguration, new int[0], false); WifiNetworkSpecifier specifier2 = new WifiNetworkSpecifier(new PatternMatcher(TEST_SSID, PATTERN_LITERAL), Pair.create(MacAddress.fromString(TEST_BSSID_OUI_BASE_ADDRESS), MacAddress.fromString(TEST_BSSID_OUI_MASK)), WIFI_BAND_5_GHZ, - wifiConfiguration, new int[0]); + wifiConfiguration, new int[0], false); assertFalse(specifier2.canBeSatisfiedBy(specifier1)); } @@ -801,14 +801,14 @@ public class WifiNetworkSpecifierTest { Pair.create(MacAddress.fromString(TEST_BSSID_OUI_BASE_ADDRESS), MacAddress.fromString(TEST_BSSID_OUI_MASK)), ScanResult.WIFI_BAND_24_GHZ, - wifiConfiguration, new int[0]); + wifiConfiguration, new int[0], false); WifiNetworkSpecifier specifier2 = new WifiNetworkSpecifier(new PatternMatcher(TEST_SSID, PATTERN_LITERAL), Pair.create(WifiManager.ALL_ZEROS_MAC_ADDRESS, WifiManager.ALL_ZEROS_MAC_ADDRESS), ScanResult.WIFI_BAND_24_GHZ, - wifiConfiguration, new int[0]); + wifiConfiguration, new int[0], false); assertFalse(specifier2.canBeSatisfiedBy(specifier1)); } @@ -827,14 +827,14 @@ public class WifiNetworkSpecifierTest { Pair.create(MacAddress.fromString(TEST_BSSID_OUI_BASE_ADDRESS), MacAddress.fromString(TEST_BSSID_OUI_MASK)), ScanResult.WIFI_BAND_24_GHZ, - wifiConfiguration, new int[0]); + wifiConfiguration, new int[0], false); WifiNetworkSpecifier specifier2 = new WifiNetworkSpecifier(new PatternMatcher(TEST_SSID, PATTERN_LITERAL), Pair.create(MacAddress.fromString(TEST_BSSID_OUI_BASE_ADDRESS), MacAddress.fromString(TEST_BSSID_OUI_MASK)), ScanResult.WIFI_BAND_24_GHZ, - wifiConfiguration, new int[0]); + wifiConfiguration, new int[0], false); // Same band matches. assertTrue(specifier2.canBeSatisfiedBy(specifier1)); @@ -845,7 +845,7 @@ public class WifiNetworkSpecifierTest { Pair.create(WifiManager.ALL_ZEROS_MAC_ADDRESS, WifiManager.ALL_ZEROS_MAC_ADDRESS), WIFI_BAND_5_GHZ, - wifiConfiguration, new int[0]); + wifiConfiguration, new int[0], false); // Different band does not match. assertFalse(specifier2.canBeSatisfiedBy(specifier1)); @@ -856,7 +856,7 @@ public class WifiNetworkSpecifierTest { Pair.create(WifiManager.ALL_ZEROS_MAC_ADDRESS, WifiManager.ALL_ZEROS_MAC_ADDRESS), ScanResult.UNSPECIFIED, - wifiConfiguration, new int[0]); + wifiConfiguration, new int[0], false); // An UNSPECIFIED band does not match a specified band, because a WifiNetworkSpecifier // satisfies another only if they are equal. @@ -878,7 +878,7 @@ public class WifiNetworkSpecifierTest { Pair.create(MacAddress.fromString(TEST_BSSID_OUI_BASE_ADDRESS), MacAddress.fromString(TEST_BSSID_OUI_MASK)), WIFI_BAND_5_GHZ, - wifiConfiguration, new int[0]); + wifiConfiguration, new int[0], false); final NetworkSpecifier redacted = specifier.redact(); if (SdkLevel.isAtLeastS()) { @@ -902,4 +902,14 @@ public class WifiNetworkSpecifierTest { builder.setBand(WIFI_BAND_5_GHZ); assertThrows(IllegalStateException.class, builder::build); } + + @Test + public void testSetPreferSecondarySta() { + WifiNetworkSpecifier.Builder builder = new WifiNetworkSpecifier.Builder() + .setSsidPattern(new PatternMatcher(TEST_SSID, PATTERN_PREFIX)); + // By default this should be false + assertEquals(false, builder.build().isPreferSecondarySta()); + // It should be true if set to true + assertEquals(true, builder.setPreferSecondarySta(true).build().isPreferSecondarySta()); + } } |