blob: b1c699e3a94e441323cdb8e545809fd5bc0c55a3 [file] [log] [blame]
/*
* 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);
}
}