Add support for supplicant SCAN_INTERVAL
Also, allow scan interval for framework and supplicant
to be configured at build time or run time
Bug: 4144882
Change-Id: I877f4bcc872597b44d3f4da85cf2bc0f16e09444
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 6deb5a0..c75b0fe 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -3303,12 +3303,20 @@
public static final String WIFI_IDLE_MS = "wifi_idle_ms";
/**
- * The interval in milliseconds to issue scans when the driver is
- * started. This is necessary to allow wifi to connect to an
- * access point when the driver is suspended.
+ * The interval in milliseconds to issue wake up scans when wifi needs
+ * to connect. This is necessary to connect to an access point when
+ * device is on the move and the screen is off.
* @hide
*/
- public static final String WIFI_SCAN_INTERVAL_MS = "wifi_scan_interval_ms";
+ public static final String WIFI_FRAMEWORK_SCAN_INTERVAL_MS =
+ "wifi_framework_scan_interval_ms";
+
+ /**
+ * The interval in milliseconds to scan as used by the wifi supplicant
+ * @hide
+ */
+ public static final String WIFI_SUPPLICANT_SCAN_INTERVAL_MS =
+ "wifi_supplicant_scan_interval_ms";
/**
* The interval in milliseconds at which to check packet counts on the
diff --git a/core/jni/android_net_wifi_Wifi.cpp b/core/jni/android_net_wifi_Wifi.cpp
index 667ba75..494dc27 100644
--- a/core/jni/android_net_wifi_Wifi.cpp
+++ b/core/jni/android_net_wifi_Wifi.cpp
@@ -556,7 +556,7 @@
return doBooleanCommand(cmdstr, "OK");
}
-static void android_net_wifi_enableBackgroundScan(JNIEnv* env, jobject clazz, jboolean enable)
+static void android_net_wifi_enableBackgroundScanCommand(JNIEnv* env, jobject clazz, jboolean enable)
{
//Note: BGSCAN-START and BGSCAN-STOP are documented in core/res/res/values/config.xml
//and will need an update if the names are changed
@@ -568,6 +568,16 @@
}
}
+static void android_net_wifi_setScanIntervalCommand(JNIEnv* env, jobject clazz, jint scanInterval)
+{
+ char cmdstr[BUF_SIZE];
+
+ int numWritten = snprintf(cmdstr, sizeof(cmdstr), "SCAN_INTERVAL %d", scanInterval);
+
+ if(numWritten < (int)sizeof(cmdstr)) doBooleanCommand(cmdstr, "OK");
+}
+
+
// ----------------------------------------------------------------------------
/*
@@ -635,7 +645,8 @@
(void*) android_net_wifi_setSuspendOptimizationsCommand},
{ "setCountryCodeCommand", "(Ljava/lang/String;)Z",
(void*) android_net_wifi_setCountryCodeCommand},
- { "enableBackgroundScan", "(Z)V", (void*) android_net_wifi_enableBackgroundScan},
+ { "enableBackgroundScanCommand", "(Z)V", (void*) android_net_wifi_enableBackgroundScanCommand},
+ { "setScanIntervalCommand", "(I)V", (void*) android_net_wifi_setScanIntervalCommand},
};
int register_android_net_wifi_WifiManager(JNIEnv* env)
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 56bc1d3..107a06a 100755
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -209,6 +209,15 @@
The driver commands needed to support the feature are BGSCAN-START and BGSCAN-STOP -->
<bool translatable="false" name="config_wifi_background_scan_support">false</bool>
+ <!-- Integer indicating wpa_supplicant scan interval in milliseconds -->
+ <integer translatable="false" name="config_wifi_supplicant_scan_interval">15000</integer>
+
+ <!-- Integer indicating the framework scan interval in milliseconds. This is used in the scenario
+ where the chipset does not support background scanning (config_wifi_background_scan_suport
+ is false) to set up a periodic wake up scan so that the device can connect to a new access
+ point on the move. A value of 0 means no periodic scans will be used in the framework. -->
+ <integer translatable="false" name="config_wifi_framework_scan_interval">300000</integer>
+
<!-- Flag indicating whether the keyguard should be bypassed when
the slider is open. This can be set or unset depending how easily
the slider can be opened (for example, in a pocket or purse). -->
diff --git a/services/java/com/android/server/WifiService.java b/services/java/com/android/server/WifiService.java
index 915b679..a2d10df 100644
--- a/services/java/com/android/server/WifiService.java
+++ b/services/java/com/android/server/WifiService.java
@@ -937,7 +937,7 @@
evaluateTrafficStatsPolling();
mWifiStateMachine.enableRssiPolling(true);
if (mBackgroundScanSupported) {
- mWifiStateMachine.enableBackgroundScan(false);
+ mWifiStateMachine.enableBackgroundScanCommand(false);
}
mWifiStateMachine.enableAllNetworks();
updateWifiState();
@@ -949,7 +949,7 @@
evaluateTrafficStatsPolling();
mWifiStateMachine.enableRssiPolling(false);
if (mBackgroundScanSupported) {
- mWifiStateMachine.enableBackgroundScan(true);
+ mWifiStateMachine.enableBackgroundScanCommand(true);
}
/*
* Set a timer to put Wi-Fi to sleep, but only if the screen is off
diff --git a/wifi/java/android/net/wifi/WifiNative.java b/wifi/java/android/net/wifi/WifiNative.java
index 909605d..6e13d0f 100644
--- a/wifi/java/android/net/wifi/WifiNative.java
+++ b/wifi/java/android/net/wifi/WifiNative.java
@@ -171,5 +171,7 @@
*/
public native static String waitForEvent();
- public native static void enableBackgroundScan(boolean enable);
+ public native static void enableBackgroundScanCommand(boolean enable);
+
+ public native static void setScanIntervalCommand(int scanInterval);
}
diff --git a/wifi/java/android/net/wifi/WifiStateMachine.java b/wifi/java/android/net/wifi/WifiStateMachine.java
index 4346b327..46c07a3 100644
--- a/wifi/java/android/net/wifi/WifiStateMachine.java
+++ b/wifi/java/android/net/wifi/WifiStateMachine.java
@@ -339,10 +339,20 @@
private static final int POWER_MODE_AUTO = 0;
/**
- * See {@link Settings.Secure#WIFI_SCAN_INTERVAL_MS}. This is the default value if a
- * Settings.Secure value is not present.
+ * Default framework scan interval in milliseconds. This is used in the scenario in which
+ * wifi chipset does not support background scanning to set up a
+ * periodic wake up scan so that the device can connect to a new access
+ * point on the move. {@link Settings.Secure#WIFI_FRAMEWORK_SCAN_INTERVAL_MS} can
+ * override this.
*/
- private static final long DEFAULT_SCAN_INTERVAL_MS = 60 * 1000; /* 1 minute */
+ private final int mDefaultFrameworkScanIntervalMs;
+
+ /**
+ * Default supplicant scan interval in milliseconds.
+ * {@link Settings.Secure#WIFI_SUPPLICANT_SCAN_INTERVAL_MS} can override this.
+ */
+ private final int mDefaultSupplicantScanIntervalMs;
+
private static final int MIN_RSSI = -200;
private static final int MAX_RSSI = 256;
@@ -472,6 +482,12 @@
Intent scanIntent = new Intent(ACTION_START_SCAN, null);
mScanIntent = PendingIntent.getBroadcast(mContext, SCAN_REQUEST, scanIntent, 0);
+ mDefaultFrameworkScanIntervalMs = mContext.getResources().getInteger(
+ com.android.internal.R.integer.config_wifi_framework_scan_interval);
+
+ mDefaultSupplicantScanIntervalMs = mContext.getResources().getInteger(
+ com.android.internal.R.integer.config_wifi_supplicant_scan_interval);
+
mContext.registerReceiver(
new BroadcastReceiver() {
@Override
@@ -819,7 +835,7 @@
sendMessage(obtainMessage(CMD_ENABLE_RSSI_POLL, enabled ? 1 : 0, 0));
}
- public void enableBackgroundScan(boolean enabled) {
+ public void enableBackgroundScanCommand(boolean enabled) {
sendMessage(obtainMessage(CMD_ENABLE_BACKGROUND_SCAN, enabled ? 1 : 0, 0));
}
@@ -1949,6 +1965,11 @@
mIsScanMode = false;
/* Wifi is available as long as we have a connection to supplicant */
mNetworkInfo.setIsAvailable(true);
+ /* Set scan interval */
+ long supplicantScanIntervalMs = Settings.Secure.getLong(mContext.getContentResolver(),
+ Settings.Secure.WIFI_SUPPLICANT_SCAN_INTERVAL_MS,
+ mDefaultSupplicantScanIntervalMs);
+ WifiNative.setScanIntervalCommand((int)supplicantScanIntervalMs / 1000);
}
@Override
public boolean processMessage(Message message) {
@@ -2800,17 +2821,21 @@
class DisconnectedState extends HierarchicalState {
private boolean mAlarmEnabled = false;
- private long mScanIntervalMs;
+ /* This is set from the overlay config file or from a secure setting.
+ * A value of 0 disables scanning in the framework.
+ */
+ private long mFrameworkScanIntervalMs;
private void setScanAlarm(boolean enabled) {
if (enabled == mAlarmEnabled) return;
if (enabled) {
- mAlarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
- System.currentTimeMillis() + mScanIntervalMs,
- mScanIntervalMs,
- mScanIntent);
-
- mAlarmEnabled = true;
+ if (mFrameworkScanIntervalMs > 0) {
+ mAlarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
+ System.currentTimeMillis() + mFrameworkScanIntervalMs,
+ mFrameworkScanIntervalMs,
+ mScanIntent);
+ mAlarmEnabled = true;
+ }
} else {
mAlarmManager.cancel(mScanIntent);
mAlarmEnabled = false;
@@ -2822,8 +2847,9 @@
if (DBG) Log.d(TAG, getName() + "\n");
EventLog.writeEvent(EVENTLOG_WIFI_STATE_CHANGED, getName());
- mScanIntervalMs = Settings.Secure.getLong(mContext.getContentResolver(),
- Settings.Secure.WIFI_SCAN_INTERVAL_MS, DEFAULT_SCAN_INTERVAL_MS);
+ mFrameworkScanIntervalMs = Settings.Secure.getLong(mContext.getContentResolver(),
+ Settings.Secure.WIFI_FRAMEWORK_SCAN_INTERVAL_MS,
+ mDefaultFrameworkScanIntervalMs);
/*
* We initiate background scanning if it is enabled, otherwise we
* initiate an infrequent scan that wakes up the device to ensure
@@ -2837,7 +2863,7 @@
* cleared
*/
if (!mScanResultIsPending) {
- WifiNative.enableBackgroundScan(true);
+ WifiNative.enableBackgroundScanCommand(true);
}
} else {
setScanAlarm(true);
@@ -2859,10 +2885,10 @@
case CMD_ENABLE_BACKGROUND_SCAN:
mEnableBackgroundScan = (message.arg1 == 1);
if (mEnableBackgroundScan) {
- WifiNative.enableBackgroundScan(true);
+ WifiNative.enableBackgroundScanCommand(true);
setScanAlarm(false);
} else {
- WifiNative.enableBackgroundScan(false);
+ WifiNative.enableBackgroundScanCommand(false);
setScanAlarm(true);
}
break;
@@ -2877,14 +2903,14 @@
case CMD_START_SCAN:
/* Disable background scan temporarily during a regular scan */
if (mEnableBackgroundScan) {
- WifiNative.enableBackgroundScan(false);
+ WifiNative.enableBackgroundScanCommand(false);
}
/* Handled in parent state */
return NOT_HANDLED;
case SCAN_RESULTS_EVENT:
/* Re-enable background scan when a pending scan result is received */
if (mEnableBackgroundScan && mScanResultIsPending) {
- WifiNative.enableBackgroundScan(true);
+ WifiNative.enableBackgroundScanCommand(true);
}
/* Handled in parent state */
return NOT_HANDLED;
@@ -2899,7 +2925,7 @@
public void exit() {
/* No need for a background scan upon exit from a disconnected state */
if (mEnableBackgroundScan) {
- WifiNative.enableBackgroundScan(false);
+ WifiNative.enableBackgroundScanCommand(false);
}
setScanAlarm(false);
}