/* * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.server.wifi; import android.content.Context; import com.android.wifi.resources.R; import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import javax.annotation.concurrent.ThreadSafe; /** Global wifi service in-memory state that is not persisted. */ @ThreadSafe public class WifiGlobals { /** * Maximum allowable interval in milliseconds between polling for RSSI and linkspeed * information. This is also used as the polling interval for WifiTrafficPoller, which updates * its data activity on every CMD_RSSI_POLL. */ private static final int MAXIMUM_POLL_RSSI_INTERVAL_MSECS = 6000; private final Context mContext; private final AtomicInteger mPollRssiIntervalMillis = new AtomicInteger(-1); private final AtomicBoolean mIpReachabilityDisconnectEnabled = new AtomicBoolean(true); private final AtomicBoolean mIsBluetoothConnected = new AtomicBoolean(false); // This is read from the overlay, cache it after boot up. private final boolean mIsWpa3SaeUpgradeEnabled; // This is read from the overlay, cache it after boot up. private final boolean mIsWpa3SaeUpgradeOffloadEnabled; // This is read from the overlay, cache it after boot up. private final boolean mIsOweUpgradeEnabled; // This is read from the overlay, cache it after boot up. private final boolean mFlushAnqpCacheOnWifiToggleOffEvent; // This is read from the overlay, cache it after boot up. private final boolean mIsWpa3SaeH2eSupported; // This is read from the overlay, cache it after boot up. private final String mP2pDeviceNamePrefix; // This is read from the overlay, cache it after boot up. private final int mP2pDeviceNamePostfixNumDigits; // This is read from the overlay, cache it after boot up. private final int mClientModeImplNumLogRecs; // This is set by WifiManager#setVerboseLoggingEnabled(int). private boolean mIsShowKeyVerboseLoggingModeEnabled = false; public WifiGlobals(Context context) { mContext = context; mIsWpa3SaeUpgradeEnabled = mContext.getResources() .getBoolean(R.bool.config_wifiSaeUpgradeEnabled); mIsWpa3SaeUpgradeOffloadEnabled = mContext.getResources() .getBoolean(R.bool.config_wifiSaeUpgradeOffloadEnabled); mIsOweUpgradeEnabled = mContext.getResources() .getBoolean(R.bool.config_wifiOweUpgradeEnabled); mFlushAnqpCacheOnWifiToggleOffEvent = mContext.getResources() .getBoolean(R.bool.config_wifiFlushAnqpCacheOnWifiToggleOffEvent); mIsWpa3SaeH2eSupported = mContext.getResources() .getBoolean(R.bool.config_wifiSaeH2eSupported); mP2pDeviceNamePrefix = mContext.getResources() .getString(R.string.config_wifiP2pDeviceNamePrefix); mP2pDeviceNamePostfixNumDigits = mContext.getResources() .getInteger(R.integer.config_wifiP2pDeviceNamePostfixNumDigits); mClientModeImplNumLogRecs = mContext.getResources() .getInteger(R.integer.config_wifiClientModeImplNumLogRecs); } /** Get the interval between RSSI polls, in milliseconds. */ public int getPollRssiIntervalMillis() { int interval = mPollRssiIntervalMillis.get(); if (interval > 0) { return interval; } else { return Math.min( mContext.getResources() .getInteger(R.integer.config_wifiPollRssiIntervalMilliseconds), MAXIMUM_POLL_RSSI_INTERVAL_MSECS); } } /** Set the interval between RSSI polls, in milliseconds. */ public void setPollRssiIntervalMillis(int newPollIntervalMillis) { mPollRssiIntervalMillis.set(newPollIntervalMillis); } /** Returns whether CMD_IP_REACHABILITY_LOST events should trigger disconnects. */ public boolean getIpReachabilityDisconnectEnabled() { return mIpReachabilityDisconnectEnabled.get(); } /** Sets whether CMD_IP_REACHABILITY_LOST events should trigger disconnects. */ public void setIpReachabilityDisconnectEnabled(boolean enabled) { mIpReachabilityDisconnectEnabled.set(enabled); } /** Set whether bluetooth is enabled. */ public void setBluetoothEnabled(boolean isEnabled) { // If BT was connected and then turned off, there is no CONNECTION_STATE_CHANGE message. // So set mIsBluetoothConnected to false if we get a bluetooth disable while connected. // But otherwise, Bluetooth being turned on doesn't mean that we're connected. if (!isEnabled) { mIsBluetoothConnected.set(false); } } /** Set whether bluetooth is connected. */ public void setBluetoothConnected(boolean isConnected) { mIsBluetoothConnected.set(isConnected); } /** Get whether bluetooth is connected */ public boolean isBluetoothConnected() { return mIsBluetoothConnected.get(); } /** * Helper method to check if Connected MAC Randomization is supported - onDown events are * skipped if this feature is enabled (b/72459123). * * @return boolean true if Connected MAC randomization is supported, false otherwise */ public boolean isConnectedMacRandomizationEnabled() { return mContext.getResources().getBoolean( R.bool.config_wifi_connected_mac_randomization_supported); } /** * Help method to check if WPA3 SAE auto-upgrade is enabled. * * @return boolean true if auto-upgrade is enabled, false otherwise. */ public boolean isWpa3SaeUpgradeEnabled() { return mIsWpa3SaeUpgradeEnabled; } /** * Help method to check if WPA3 SAE auto-upgrade offload is enabled. * * @return boolean true if auto-upgrade offload is enabled, false otherwise. */ public boolean isWpa3SaeUpgradeOffloadEnabled() { return mIsWpa3SaeUpgradeOffloadEnabled; } /** * Help method to check if OWE auto-upgrade is enabled. * * @return boolean true if auto-upgrade is enabled, false otherwise. */ public boolean isOweUpgradeEnabled() { return mIsOweUpgradeEnabled; } /** * Help method to check if the setting to flush ANQP cache when Wi-Fi is toggled off. * * @return boolean true to flush ANQP cache on Wi-Fi toggle off event, false otherwise. */ public boolean flushAnqpCacheOnWifiToggleOffEvent() { return mFlushAnqpCacheOnWifiToggleOffEvent; } /* * Help method to check if WPA3 SAE Hash-to-Element is supported on this device. * * @return boolean true if supported;otherwise false. */ public boolean isWpa3SaeH2eSupported() { return mIsWpa3SaeH2eSupported; } /** Set if show key verbose logging mode is enabled. */ public void setShowKeyVerboseLoggingModeEnabled(boolean enable) { mIsShowKeyVerboseLoggingModeEnabled = enable; } /** Check if show key verbose logging mode is enabled. */ public boolean getShowKeyVerboseLoggingModeEnabled() { return mIsShowKeyVerboseLoggingModeEnabled; } /** Get the prefix of the default wifi p2p device name. */ public String getWifiP2pDeviceNamePrefix() { return mP2pDeviceNamePrefix; } /** Get the number of the default wifi p2p device name postfix digit. */ public int getWifiP2pDeviceNamePostfixNumDigits() { return mP2pDeviceNamePostfixNumDigits; } /** Get the number of log records to maintain. */ public int getClientModeImplNumLogRecs() { return mClientModeImplNumLogRecs; } /** Dump method for debugging */ public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { pw.println("Dump of WifiGlobals"); pw.println("mPollRssiIntervalMillis=" + mPollRssiIntervalMillis.get()); pw.println("mIpReachabilityDisconnectEnabled=" + mIpReachabilityDisconnectEnabled.get()); pw.println("mIsBluetoothConnected=" + mIsBluetoothConnected.get()); pw.println("mIsWpa3SaeUpgradeEnabled=" + mIsWpa3SaeUpgradeEnabled); pw.println("mIsWpa3SaeUpgradeOffloadEnabled=" + mIsWpa3SaeUpgradeOffloadEnabled); pw.println("mIsOweUpgradeEnabled=" + mIsOweUpgradeEnabled); pw.println("mFlushAnqpCacheOnWifiToggleOffEvent=" + mFlushAnqpCacheOnWifiToggleOffEvent); pw.println("mIsWpa3SaeH2eSupported=" + mIsWpa3SaeH2eSupported); pw.println("mP2pDeviceNamePrefix=" + mP2pDeviceNamePrefix); pw.println("mP2pDeviceNamePostfixNumDigits=" + mP2pDeviceNamePostfixNumDigits); pw.println("mClientModeImplNumLogRecs=" + mClientModeImplNumLogRecs); } }