Snap for 11889377 from 78574bf0b879a71876a24a7d5c340263ee46265f to 24Q3-release Change-Id: Ief52e78a2331a0bf74ed0ad012e06e9f3b195ada
diff --git a/flags/wifi_flags.aconfig b/flags/wifi_flags.aconfig index d02996c..42e165c 100644 --- a/flags/wifi_flags.aconfig +++ b/flags/wifi_flags.aconfig
@@ -63,6 +63,14 @@ } flag { + name: "get_channel_width_api" + namespace: "wifi" + description: "Add new API to get channel width" + bug: "335358378" + is_fixed_read_only: true +} + +flag { name: "voip_detection" namespace: "wifi" description: "Detect VoIP over Wifi and execute optimization"
diff --git a/framework/api/current.txt b/framework/api/current.txt index f48cfe8..a277bca 100644 --- a/framework/api/current.txt +++ b/framework/api/current.txt
@@ -145,6 +145,7 @@ public final class WifiAvailableChannel implements android.os.Parcelable { ctor public WifiAvailableChannel(int, int); method public int describeContents(); + method @FlaggedApi("com.android.wifi.flags.get_channel_width_api") public int getChannelWidth(); method public int getFrequencyMhz(); method public int getOperationalModes(); method public void writeToParcel(@NonNull android.os.Parcel, int);
diff --git a/framework/java/android/net/wifi/WifiAvailableChannel.java b/framework/java/android/net/wifi/WifiAvailableChannel.java index 11a4054..4f3596d 100644 --- a/framework/java/android/net/wifi/WifiAvailableChannel.java +++ b/framework/java/android/net/wifi/WifiAvailableChannel.java
@@ -15,12 +15,15 @@ */ package android.net.wifi; +import android.annotation.FlaggedApi; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.os.Parcel; import android.os.Parcelable; +import com.android.wifi.flags.Flags; + import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.Objects; @@ -124,9 +127,23 @@ */ private @OpMode int mOpModes; + /** + * Wifi channel bandwidth. + */ + private @WifiAnnotations.ChannelWidth int mChannelWidth; + public WifiAvailableChannel(int freq, @OpMode int opModes) { + this(freq, opModes, ScanResult.CHANNEL_WIDTH_20MHZ); + } + + /** + * @hide + */ + public WifiAvailableChannel(int freq, @OpMode int opModes, + @WifiAnnotations.ChannelWidth int channelWidth) { mFrequency = freq; mOpModes = opModes; + mChannelWidth = channelWidth; } private WifiAvailableChannel(@NonNull Parcel in) { @@ -136,6 +153,7 @@ private void readFromParcel(@NonNull Parcel in) { mFrequency = in.readInt(); mOpModes = in.readInt(); + mChannelWidth = in.readInt(); } /** @@ -164,6 +182,20 @@ | FILTER_CELLULAR_COEXISTENCE; } + /** + * Get the channel bandwidth, which indicates the amount of frequency spectrum allocated for + * data transmission within a channel. + * + * @return the bandwidth representation of the Wi-Fi channel from + * {@link ScanResult#CHANNEL_WIDTH_20MHZ}, {@link ScanResult#CHANNEL_WIDTH_40MHZ}, + * {@link ScanResult#CHANNEL_WIDTH_80MHZ}, {@link ScanResult#CHANNEL_WIDTH_160MHZ}, + * {@link ScanResult#CHANNEL_WIDTH_80MHZ_PLUS_MHZ} or {@link ScanResult#CHANNEL_WIDTH_320MHZ}. + */ + @FlaggedApi(Flags.FLAG_GET_CHANNEL_WIDTH_API) + public @WifiAnnotations.ChannelWidth int getChannelWidth() { + return mChannelWidth; + } + @Override public int describeContents() { return 0; @@ -175,12 +207,13 @@ if (o == null || getClass() != o.getClass()) return false; WifiAvailableChannel that = (WifiAvailableChannel) o; return mFrequency == that.mFrequency - && mOpModes == that.mOpModes; + && mOpModes == that.mOpModes + && mChannelWidth == that.mChannelWidth; } @Override public int hashCode() { - return Objects.hash(mFrequency, mOpModes); + return Objects.hash(mFrequency, mOpModes, mChannelWidth); } @Override @@ -188,6 +221,8 @@ StringBuilder sbuf = new StringBuilder(); sbuf.append("mFrequency = ") .append(mFrequency) + .append(", mChannelWidth = ") + .append(mChannelWidth) .append(", mOpModes = ") .append(String.format("%x", mOpModes)); return sbuf.toString(); @@ -197,6 +232,7 @@ public void writeToParcel(@NonNull Parcel dest, int flags) { dest.writeInt(mFrequency); dest.writeInt(mOpModes); + dest.writeInt(mChannelWidth); } public static final @android.annotation.NonNull Creator<WifiAvailableChannel> CREATOR =
diff --git a/service/java/com/android/server/wifi/ClientModeImpl.java b/service/java/com/android/server/wifi/ClientModeImpl.java index 5adb0a7..c331d55 100644 --- a/service/java/com/android/server/wifi/ClientModeImpl.java +++ b/service/java/com/android/server/wifi/ClientModeImpl.java
@@ -3513,6 +3513,10 @@ mWakeupController.setLastDisconnectInfo(matchInfo); } mRssiMonitor.reset(); + // On disconnect, restore roaming mode to normal + if (!newConnectionInProgress) { + enableRoaming(true); + } } clearTargetBssid("handleNetworkDisconnect");
diff --git a/service/java/com/android/server/wifi/WifiNetworkSelector.java b/service/java/com/android/server/wifi/WifiNetworkSelector.java index ff6c066..358593d 100644 --- a/service/java/com/android/server/wifi/WifiNetworkSelector.java +++ b/service/java/com/android/server/wifi/WifiNetworkSelector.java
@@ -1453,9 +1453,11 @@ private void updateSecurityParamsForTransitionModeIfNecessary( ScanResult scanResult, SecurityParams params) { if (params.isSecurityType(WifiConfiguration.SECURITY_TYPE_SAE) + && params.isAddedByAutoUpgrade() && ScanResultUtil.isScanResultForPskSaeTransitionNetwork(scanResult)) { params.setRequirePmf(false); } else if (params.isSecurityType(WifiConfiguration.SECURITY_TYPE_EAP_WPA3_ENTERPRISE) + && params.isAddedByAutoUpgrade() && ScanResultUtil.isScanResultForWpa3EnterpriseTransitionNetwork(scanResult)) { params.setRequirePmf(false); }
diff --git a/service/java/com/android/server/wifi/WifiServiceImpl.java b/service/java/com/android/server/wifi/WifiServiceImpl.java index 8f4791a..75cfb7a 100644 --- a/service/java/com/android/server/wifi/WifiServiceImpl.java +++ b/service/java/com/android/server/wifi/WifiServiceImpl.java
@@ -7458,7 +7458,10 @@ if ((band & ScanResult.toBand(freq)) == 0) { continue; } - channels.add(new WifiAvailableChannel(freq, WifiAvailableChannel.OP_MODE_SAP)); + // TODO b/340956906: Save and retrieve channel width in config store along with + // frequency. + channels.add(new WifiAvailableChannel(freq, WifiAvailableChannel.OP_MODE_SAP, + ScanResult.CHANNEL_WIDTH_20MHZ)); } return channels; }
diff --git a/service/java/com/android/server/wifi/hal/WifiChipAidlImpl.java b/service/java/com/android/server/wifi/hal/WifiChipAidlImpl.java index 80e53ca..f9e4ce2 100644 --- a/service/java/com/android/server/wifi/hal/WifiChipAidlImpl.java +++ b/service/java/com/android/server/wifi/hal/WifiChipAidlImpl.java
@@ -16,6 +16,11 @@ package com.android.server.wifi.hal; +import static android.hardware.wifi.WifiChannelWidthInMhz.WIDTH_160; +import static android.hardware.wifi.WifiChannelWidthInMhz.WIDTH_320; +import static android.hardware.wifi.WifiChannelWidthInMhz.WIDTH_40; +import static android.hardware.wifi.WifiChannelWidthInMhz.WIDTH_80; +import static android.hardware.wifi.WifiChannelWidthInMhz.WIDTH_80P80; import static android.net.wifi.CoexUnsafeChannel.POWER_CAP_NONE; import android.annotation.NonNull; @@ -53,6 +58,8 @@ import android.hardware.wifi.WifiUsableChannel; import android.net.wifi.CoexUnsafeChannel; import android.net.wifi.OuiKeyedData; +import android.net.wifi.ScanResult; +import android.net.wifi.WifiAnnotations; import android.net.wifi.WifiAvailableChannel; import android.net.wifi.WifiManager; import android.net.wifi.WifiScanner; @@ -690,7 +697,8 @@ List<WifiAvailableChannel> frameworkChannels = new ArrayList<>(); for (WifiUsableChannel ch : halChannels) { frameworkChannels.add(new WifiAvailableChannel( - ch.channel, halToFrameworkIfaceMode(ch.ifaceModeMask))); + ch.channel, halToFrameworkIfaceMode(ch.ifaceModeMask), + halToFrameworkChannelWidth(ch.channelBandwidth))); } return frameworkChannels; } catch (RemoteException e) { @@ -704,6 +712,23 @@ } } + private @WifiAnnotations.ChannelWidth int halToFrameworkChannelWidth(int channelBandwidth) { + switch(channelBandwidth) { + case WIDTH_40: + return ScanResult.CHANNEL_WIDTH_40MHZ; + case WIDTH_80: + return ScanResult.CHANNEL_WIDTH_80MHZ; + case WIDTH_160: + return ScanResult.CHANNEL_WIDTH_160MHZ; + case WIDTH_80P80: + return ScanResult.CHANNEL_WIDTH_80MHZ_PLUS_MHZ; + case WIDTH_320: + return ScanResult.CHANNEL_WIDTH_320MHZ; + default: + return ScanResult.CHANNEL_WIDTH_20MHZ; + } + } + /** * See comments for {@link IWifiChip#registerCallback(WifiChip.Callback)} */
diff --git a/service/java/com/android/server/wifi/hal/WifiChipHidlImpl.java b/service/java/com/android/server/wifi/hal/WifiChipHidlImpl.java index 430f96a..31101ac 100644 --- a/service/java/com/android/server/wifi/hal/WifiChipHidlImpl.java +++ b/service/java/com/android/server/wifi/hal/WifiChipHidlImpl.java
@@ -16,6 +16,11 @@ package com.android.server.wifi.hal; +import static android.hardware.wifi.V1_6.WifiChannelWidthInMhz.WIDTH_160; +import static android.hardware.wifi.V1_6.WifiChannelWidthInMhz.WIDTH_320; +import static android.hardware.wifi.V1_6.WifiChannelWidthInMhz.WIDTH_40; +import static android.hardware.wifi.V1_6.WifiChannelWidthInMhz.WIDTH_80; +import static android.hardware.wifi.V1_6.WifiChannelWidthInMhz.WIDTH_80P80; import static android.net.wifi.CoexUnsafeChannel.POWER_CAP_NONE; import android.annotation.NonNull; @@ -37,6 +42,8 @@ import android.hardware.wifi.V1_6.WifiRadioConfiguration; import android.net.wifi.CoexUnsafeChannel; import android.net.wifi.OuiKeyedData; +import android.net.wifi.ScanResult; +import android.net.wifi.WifiAnnotations; import android.net.wifi.WifiAvailableChannel; import android.net.wifi.WifiManager; import android.net.wifi.WifiScanner; @@ -1042,7 +1049,8 @@ channelResp.value = new ArrayList<>(); for (android.hardware.wifi.V1_6.WifiUsableChannel ch : channels) { channelResp.value.add(new WifiAvailableChannel(ch.channel, - halToFrameworkIfaceMode(ch.ifaceModeMask))); + halToFrameworkIfaceMode(ch.ifaceModeMask), + halToFrameworkChannelWidth(ch.channelBandwidth))); } } }); @@ -1056,7 +1064,8 @@ channelResp.value = new ArrayList<>(); for (android.hardware.wifi.V1_5.WifiUsableChannel ch : channels) { channelResp.value.add(new WifiAvailableChannel(ch.channel, - halToFrameworkIfaceMode(ch.ifaceModeMask))); + halToFrameworkIfaceMode(ch.ifaceModeMask), + halToFrameworkChannelWidth(ch.channelBandwidth))); } } }); @@ -1067,6 +1076,23 @@ return channelResp.value; } + private @WifiAnnotations.ChannelWidth int halToFrameworkChannelWidth(int channelBandwidth) { + switch (channelBandwidth) { + case WIDTH_40: + return ScanResult.CHANNEL_WIDTH_40MHZ; + case WIDTH_80: + return ScanResult.CHANNEL_WIDTH_80MHZ; + case WIDTH_160: + return ScanResult.CHANNEL_WIDTH_160MHZ; + case WIDTH_80P80: + return ScanResult.CHANNEL_WIDTH_80MHZ_PLUS_MHZ; + case WIDTH_320: + return ScanResult.CHANNEL_WIDTH_320MHZ; + default: + return ScanResult.CHANNEL_WIDTH_20MHZ; + } + } + private boolean registerCallbackInternal(String methodStr, WifiChip.Callback callback) { if (mFrameworkCallback != null) { Log.e(TAG, "Framework callback is already registered");
diff --git a/service/java/com/android/server/wifi/util/WifiPermissionsUtil.java b/service/java/com/android/server/wifi/util/WifiPermissionsUtil.java index c7d97cf..614b0df 100644 --- a/service/java/com/android/server/wifi/util/WifiPermissionsUtil.java +++ b/service/java/com/android/server/wifi/util/WifiPermissionsUtil.java
@@ -180,6 +180,7 @@ try { enforceNearbyDevicesPermission(attributionSource, checkForLocation, message); } catch (SecurityException e) { + Log.e(TAG, "checkNearbyDevicesPermission - " + e); return false; } return true;
diff --git a/service/tests/wifitests/src/com/android/server/wifi/ClientModeImplTest.java b/service/tests/wifitests/src/com/android/server/wifi/ClientModeImplTest.java index 723e2e1..fddabc7 100644 --- a/service/tests/wifitests/src/com/android/server/wifi/ClientModeImplTest.java +++ b/service/tests/wifitests/src/com/android/server/wifi/ClientModeImplTest.java
@@ -7866,6 +7866,39 @@ verifyNoMoreInteractions(mWifiNetworkAgent); } + /** + * Verify that roaming mode is enabled on disconnect for primary. + */ + @Test + public void testRoamingModeOnDisconnectPrimary() throws Exception { + when(mClientModeManager.getRole()).thenReturn(ROLE_CLIENT_PRIMARY); + connect(); + mCmi.disconnect(); + mLooper.dispatchAll(); + mCmi.sendMessage(WifiMonitor.SUPPLICANT_STATE_CHANGE_EVENT, 0, 0, + new StateChangeResult(0, WifiSsid.fromUtf8Text(mConnectedNetwork.SSID), + TEST_BSSID_STR, sFreq, SupplicantState.DISCONNECTED)); + mLooper.dispatchAll(); + verify(mWifiNative).enableFirmwareRoaming(anyString(), + eq(WifiNative.ENABLE_FIRMWARE_ROAMING)); + } + + /** + * Verify that roaming mode doesn't change on disconnect for secondary. + */ + @Test + public void testRoamingModeOnDisconnectSecondary() throws Exception { + when(mClientModeManager.getRole()).thenReturn(ROLE_CLIENT_SECONDARY_TRANSIENT); + connect(); + mCmi.disconnect(); + mLooper.dispatchAll(); + mCmi.sendMessage(WifiMonitor.SUPPLICANT_STATE_CHANGE_EVENT, 0, 0, + new StateChangeResult(0, WifiSsid.fromUtf8Text(mConnectedNetwork.SSID), + TEST_BSSID_STR, sFreq, SupplicantState.DISCONNECTED)); + mLooper.dispatchAll(); + verify(mWifiNative, never()).enableFirmwareRoaming(anyString(), anyInt()); + } + @Test public void testConnectionWhileDisconnecting() throws Exception { connect();
diff --git a/service/tests/wifitests/src/com/android/server/wifi/WifiNativeTest.java b/service/tests/wifitests/src/com/android/server/wifi/WifiNativeTest.java index 4927700..cff2525 100644 --- a/service/tests/wifitests/src/com/android/server/wifi/WifiNativeTest.java +++ b/service/tests/wifitests/src/com/android/server/wifi/WifiNativeTest.java
@@ -1601,8 +1601,10 @@ @Test public void testGetSupportedBandsFromHal() throws Exception { List<WifiAvailableChannel> usableChannelList = new ArrayList<>(); - usableChannelList.add(new WifiAvailableChannel(2412, WifiAvailableChannel.OP_MODE_STA)); - usableChannelList.add(new WifiAvailableChannel(5160, WifiAvailableChannel.OP_MODE_STA)); + usableChannelList.add(new WifiAvailableChannel(2412, WifiAvailableChannel.OP_MODE_STA, + ScanResult.CHANNEL_WIDTH_20MHZ)); + usableChannelList.add(new WifiAvailableChannel(5160, WifiAvailableChannel.OP_MODE_STA, + ScanResult.CHANNEL_WIDTH_40MHZ)); when(mWifiVendorHal.getUsableChannels(WifiScanner.WIFI_BAND_24_5_WITH_DFS_6_60_GHZ, WifiAvailableChannel.OP_MODE_STA, WifiAvailableChannel.FILTER_REGULATORY)).thenReturn(usableChannelList);
diff --git a/service/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java b/service/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java index 8c22ac2..18851ea 100644 --- a/service/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java +++ b/service/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java
@@ -9981,10 +9981,14 @@ mLooper.startAutoDispatch(); assertThat(mWifiServiceImpl.getUsableChannels(WIFI_BAND_24_5_WITH_DFS_6_60_GHZ, OP_MODE_SAP, FILTER_REGULATORY, TEST_PACKAGE_NAME, mExtras)).containsExactly( - new WifiAvailableChannel(2452, WifiAvailableChannel.OP_MODE_SAP), - new WifiAvailableChannel(5180, WifiAvailableChannel.OP_MODE_SAP), - new WifiAvailableChannel(5955, WifiAvailableChannel.OP_MODE_SAP), - new WifiAvailableChannel(58320, WifiAvailableChannel.OP_MODE_SAP)); + new WifiAvailableChannel(2452, WifiAvailableChannel.OP_MODE_SAP, + ScanResult.CHANNEL_WIDTH_20MHZ), + new WifiAvailableChannel(5180, WifiAvailableChannel.OP_MODE_SAP, + ScanResult.CHANNEL_WIDTH_20MHZ), + new WifiAvailableChannel(5955, WifiAvailableChannel.OP_MODE_SAP, + ScanResult.CHANNEL_WIDTH_20MHZ), + new WifiAvailableChannel(58320, WifiAvailableChannel.OP_MODE_SAP, + ScanResult.CHANNEL_WIDTH_20MHZ)); mLooper.stopAutoDispatchAndIgnoreExceptions(); } @@ -10006,13 +10010,16 @@ when(mWifiNative.isHalStarted()).thenReturn(true); when(mWifiNative.getUsableChannels(eq(WIFI_BAND_24_GHZ), anyInt(), anyInt())) .thenReturn(Arrays.asList( - new WifiAvailableChannel(2452, WifiAvailableChannel.OP_MODE_SAP))); + new WifiAvailableChannel(2452, WifiAvailableChannel.OP_MODE_SAP, + ScanResult.CHANNEL_WIDTH_20MHZ))); when(mWifiNative.getUsableChannels(eq(WIFI_BAND_5_GHZ), anyInt(), anyInt())) .thenReturn(Arrays.asList( - new WifiAvailableChannel(5180, WifiAvailableChannel.OP_MODE_SAP))); + new WifiAvailableChannel(5180, WifiAvailableChannel.OP_MODE_SAP, + ScanResult.CHANNEL_WIDTH_20MHZ))); when(mWifiNative.getUsableChannels(eq(WIFI_BAND_6_GHZ), anyInt(), anyInt())) .thenReturn(Arrays.asList( - new WifiAvailableChannel(5955, WifiAvailableChannel.OP_MODE_SAP))); + new WifiAvailableChannel(5955, WifiAvailableChannel.OP_MODE_SAP, + ScanResult.CHANNEL_WIDTH_20MHZ))); when(mWifiNative.getUsableChannels(eq(WIFI_BAND_60_GHZ), anyInt(), anyInt())) .thenReturn(null); @@ -11427,7 +11434,7 @@ when(mWifiNative.isHalStarted()).thenReturn(true); // Channel 9 - 2452Mhz WifiAvailableChannel channels2g = new WifiAvailableChannel(2452, - WifiAvailableChannel.OP_MODE_SAP); + WifiAvailableChannel.OP_MODE_SAP, ScanResult.CHANNEL_WIDTH_20MHZ); when(mWifiNative.isHalSupported()).thenReturn(true); when(mWifiNative.isHalStarted()).thenReturn(true); when(mWifiNative.getUsableChannels(eq(WifiScanner.WIFI_BAND_24_GHZ), anyInt(), anyInt()))
diff --git a/service/tests/wifitests/src/com/android/server/wifi/aware/WifiAwareStateManagerTest.java b/service/tests/wifitests/src/com/android/server/wifi/aware/WifiAwareStateManagerTest.java index f853050..51537dc 100644 --- a/service/tests/wifitests/src/com/android/server/wifi/aware/WifiAwareStateManagerTest.java +++ b/service/tests/wifitests/src/com/android/server/wifi/aware/WifiAwareStateManagerTest.java
@@ -68,6 +68,7 @@ import android.net.ConnectivityManager; import android.net.wifi.IBooleanListener; import android.net.wifi.OuiKeyedData; +import android.net.wifi.ScanResult; import android.net.wifi.WifiAvailableChannel; import android.net.wifi.WifiManager; import android.net.wifi.WifiScanner; @@ -1133,8 +1134,10 @@ when(mWifiNative.getUsableChannels(WifiScanner.WIFI_BAND_5_GHZ, OP_MODE_WIFI_AWARE, WifiAvailableChannel.FILTER_NAN_INSTANT_MODE)) .thenReturn(List.of(new WifiAvailableChannel(5220, - WifiAvailableChannel.OP_MODE_WIFI_AWARE), - new WifiAvailableChannel(5745, WifiAvailableChannel.OP_MODE_WIFI_AWARE))); + WifiAvailableChannel.OP_MODE_WIFI_AWARE, + ScanResult.CHANNEL_WIDTH_80MHZ), + new WifiAvailableChannel(5745, WifiAvailableChannel.OP_MODE_WIFI_AWARE, + ScanResult.CHANNEL_WIDTH_80MHZ))); mActiveCountryCodeChangedCallback.onActiveCountryCodeChanged("US"); mMockLooper.dispatchAll(); inOrder.verify(mMockNative).enableAndConfigure(transactionId.capture(), @@ -1220,7 +1223,7 @@ when(mWifiNative.getUsableChannels(WifiScanner.WIFI_BAND_5_GHZ, OP_MODE_WIFI_AWARE, WifiAvailableChannel.FILTER_NAN_INSTANT_MODE)) .thenReturn(List.of(new WifiAvailableChannel(5220, - WifiAvailableChannel.OP_MODE_WIFI_AWARE))); + WifiAvailableChannel.OP_MODE_WIFI_AWARE, ScanResult.CHANNEL_WIDTH_80MHZ))); mActiveCountryCodeChangedCallback.onActiveCountryCodeChanged("US"); mMockLooper.dispatchAll(); inOrder.verify(mMockNative).enableAndConfigure(transactionId.capture(),