Change wifi configuration to wifi monitoring.
The device now does not block the boot complete message on wireless
connectivity, and produces a separate message on successfully
connecting.
Change-Id: I19b3f09edf31784cfe15640b99feb93c09aae2a2
Merged-In: I19b3f09edf31784cfe15640b99feb93c09aae2a2
Test: Local builds with phone and auto userdebug builds.
Bug: 110720387
(cherry picked from commit 4f487a566c2e906b09c2b4c76e5920e433f70e87)
diff --git a/guest/monitoring/vsoc_service/java/com/android/google/gce/gceservice/BootReporter.java b/guest/monitoring/vsoc_service/java/com/android/google/gce/gceservice/BootReporter.java
index 0a1eecc..b866b35 100644
--- a/guest/monitoring/vsoc_service/java/com/android/google/gce/gceservice/BootReporter.java
+++ b/guest/monitoring/vsoc_service/java/com/android/google/gce/gceservice/BootReporter.java
@@ -108,7 +108,7 @@
}
- private void reportMessage(String message) {
+ public void reportMessage(String message) {
Log.i(LOG_TAG, message);
mKmsgWriter.printf(KLOG_FORMAT, KLOG_NOTICE, LOG_TAG, message);
mKmsgWriter.flush();
diff --git a/guest/monitoring/vsoc_service/java/com/android/google/gce/gceservice/GceService.java b/guest/monitoring/vsoc_service/java/com/android/google/gce/gceservice/GceService.java
index 69bd8301..9517e57 100644
--- a/guest/monitoring/vsoc_service/java/com/android/google/gce/gceservice/GceService.java
+++ b/guest/monitoring/vsoc_service/java/com/android/google/gce/gceservice/GceService.java
@@ -63,7 +63,7 @@
mBootReporter.reportBootStarted();
registerBroadcastReceivers();
- mWifiManager = new GceWifiManager(this, mExecutor);
+ mWifiManager = new GceWifiManager(this, mBootReporter, mExecutor);
mExecutor.schedule(mLocationServices);
mExecutor.schedule(mPackageVerifier);
@@ -78,7 +78,6 @@
mLocationServices.getLocationServicesReady(),
mPackageVerifier.getPackageVerifierReady(),
mConnChecker.getConnected(),
- mWifiManager.getInitialWifiStateChangeReady(),
mBluetoothChecker.getEnabled()
// mTombstoneChecker.getTombstoneResult()
);
@@ -149,7 +148,7 @@
pw.println(" Package verifier ready: "
+ mPackageVerifier.getPackageVerifierReady().isDone());
pw.println(" Network connected: " + mConnChecker.getConnected().isDone());
- pw.println(" WiFi configured: " + mWifiManager.getInitialWifiStateChangeReady().isDone());
+ pw.println(" WiFi configured: " + mWifiManager.getWifiReady().isDone());
pw.println(" Bluetooth enabled: " + mBluetoothChecker.getEnabled().isDone());
pw.println(" Tombstone dropped (on boot): "
+ !mTombstoneChecker.getTombstoneResult().isDone());
diff --git a/guest/monitoring/vsoc_service/java/com/android/google/gce/gceservice/GceWifiManager.java b/guest/monitoring/vsoc_service/java/com/android/google/gce/gceservice/GceWifiManager.java
index da1b3cf..2747110 100644
--- a/guest/monitoring/vsoc_service/java/com/android/google/gce/gceservice/GceWifiManager.java
+++ b/guest/monitoring/vsoc_service/java/com/android/google/gce/gceservice/GceWifiManager.java
@@ -32,78 +32,36 @@
*/
public class GceWifiManager extends JobBase {
private static final String LOG_TAG = "GceWifiManager";
- /* Timeout after which another attempt to re-connect wifi will be made. */
- private static final int WIFI_RECONNECTION_TIMEOUT_S = 3;
- /* Maximum number of retries before giving up and marking WIFI as inoperable. */
- private static final int WIFI_RECONNECTION_MAX_ATTEMPTS = 10;
-
- /** Describes possible WIFI states.
- * WifiState is:
- * - UNKNOWN only at the initialization time, replaced with state from
- * from Android's WifiManager.
- * - ENABLED when WIFI is connected and operational,
- * - DISABLED when WIFI is turned off,
- * - FAILED if GceWifiManager was unable to configure WIFI.
- */
- public enum WifiState {
- DISABLED,
- ENABLED;
- };
+ /* Timeout after which the service will check if wifi has come up. */
+ private static final int WIFI_RECONNECTION_TIMEOUT_S = 5;
+ private static final String WIFI_CONNECTED_MESSAGE =
+ "VIRTUAL_DEVICE_NETWORK_WIFI_CONNECTED";
private final JobExecutor mJobExecutor;
private final Context mContext;
private final WifiManager mWifiManager;
private final ConnectivityManager mConnManager;
+ private final BootReporter mBootReporter;
- private ConfigureWifi mConfigureWifiJob = new ConfigureWifi();
- private SetWifiState mSetInitialWifiStateJob = new SetWifiState();
+ private final MonitorWifiJob mMonitorWifiJob;
- /** Constructor.
- */
- public GceWifiManager(Context context, JobExecutor executor) {
+ public GceWifiManager(Context context, BootReporter bootReporter, JobExecutor executor) {
super(LOG_TAG);
mContext = context;
mWifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);
mConnManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
+ mBootReporter = bootReporter;
mJobExecutor = executor;
+ mMonitorWifiJob = new MonitorWifiJob();
}
- private boolean isMobileNetworkAvailable() {
- for (NetworkInfo network : mConnManager.getAllNetworkInfo()) {
- if (network.getType() == ConnectivityManager.TYPE_MOBILE) return true;
- }
- return false;
- }
-
-
- private WifiState getExpectedWifiState() {
- // TODO(ender): we will probably want to define this differently once virtual WIFI is
- // available again.
- return WifiState.DISABLED;
- }
-
-
- /** Executed during initial configuration.
- */
+ /** Executed during initial configuration. */
@Override
public synchronized int execute() {
- WifiState initialState = getExpectedWifiState();
- mSetInitialWifiStateJob.setState(initialState);
-
- // Only configure wifi if expected state is ENABLED.
- // Configuring wifi *requires* wpa_supplicant to be up.
- // This means that in order to configure wifi, we have to enable it first.
- if (initialState == WifiState.ENABLED) {
- mJobExecutor.schedule(mConfigureWifiJob);
- mJobExecutor.schedule(mSetInitialWifiStateJob, mConfigureWifiJob.getWifiConfigured());
- } else {
- // If initial state is DISABLED, there's no need to wait for Wifi configuration to
- // complete. Just shut it off.
- mJobExecutor.schedule(mSetInitialWifiStateJob);
- }
+ mJobExecutor.schedule(mMonitorWifiJob);
return 0;
}
@@ -111,70 +69,12 @@
@Override
public void onDependencyFailed(Exception e) {
Log.e(LOG_TAG, "Initial WIFI configuration failed due to dependency.", e);
- getInitialWifiStateChangeReady().set(e);
+ getWifiReady().set(e);
}
- public GceFuture<Boolean> getInitialWifiStateChangeReady() {
- return mSetInitialWifiStateJob.getWifiReady();
- }
-
-
- /* Configure WIFI network stack.
- *
- * Adds network configuration that covers AndroidWifi virtual hotspot.
- */
- private class ConfigureWifi extends JobBase {
- private final GceFuture<Boolean> mWifiConfigured =
- new GceFuture<Boolean>("WIFI Configured");
- private boolean mReportedWaitingForSupplicant = false;
-
-
- public ConfigureWifi() {
- super(LOG_TAG);
- }
-
-
- @Override
- public int execute() {
- if (mWifiConfigured.isDone()) return 0;
-
- if (!mWifiManager.pingSupplicant()) {
- if (!mWifiManager.isWifiEnabled()) {
- mWifiManager.setWifiEnabled(true);
- }
- if (!mReportedWaitingForSupplicant) {
- Log.i(LOG_TAG, "Supplicant not ready.");
- mReportedWaitingForSupplicant = true;
- }
- return WIFI_RECONNECTION_TIMEOUT_S;
- }
-
- WifiConfiguration conf = new WifiConfiguration();
- conf.SSID = "\"AndroidWifi\"";
- conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
- int network_id = mWifiManager.addNetwork(conf);
- if (network_id < 0) {
- Log.e(LOG_TAG, "Could not update wifi network.");
- mWifiConfigured.set(new Exception("Could not add WIFI network"));
- } else {
- mWifiManager.enableNetwork(network_id, false);
- mWifiConfigured.set(true);
- }
- return 0;
- }
-
-
- @Override
- public void onDependencyFailed(Exception e) {
- Log.e(LOG_TAG, "Could not configure WIFI.", e);
- mWifiConfigured.set(e);
- }
-
-
- public GceFuture<Boolean> getWifiConfigured() {
- return mWifiConfigured;
- }
+ public GceFuture<Boolean> getWifiReady() {
+ return mMonitorWifiJob.getWifiReady();
}
@@ -183,24 +83,17 @@
* - if wifi enable requested (state == true), turns on wifi and arms the
* connection timeout (see startWifiReconnectionTimeout).
*/
- private class SetWifiState extends JobBase {
+ private class MonitorWifiJob extends JobBase {
private final GceFuture<Boolean> mWifiReady =
new GceFuture<Boolean>("WIFI Ready");
- private WifiState mDesiredState = WifiState.DISABLED;
- private int mWifiStateChangeAttempt = 0;
private boolean mReportedWifiNotConnected = false;
- public SetWifiState() {
+ public MonitorWifiJob() {
super(LOG_TAG);
}
- public void setState(WifiState state) {
- mDesiredState = state;
- }
-
-
public synchronized void cancel() {
if (!mWifiReady.isDone()) {
mWifiReady.cancel(false);
@@ -210,62 +103,22 @@
@Override
public synchronized int execute() {
- WifiState currentState = mWifiManager.isWifiEnabled() ?
- WifiState.ENABLED : WifiState.DISABLED;
-
// Could be cancelled or exception.
if (mWifiReady.isDone()) return 0;
- if (mWifiStateChangeAttempt >= WIFI_RECONNECTION_MAX_ATTEMPTS) {
- mWifiReady.set(new Exception(
- String.format("Unable to change wifi state after %d attempts.",
- WIFI_RECONNECTION_MAX_ATTEMPTS)));
+ WifiInfo info = mWifiManager.getConnectionInfo();
+ if (info.getSupplicantState() != SupplicantState.COMPLETED) {
+ if (!mReportedWifiNotConnected) {
+ Log.w(LOG_TAG, "Wifi not yet connected.");
+ mReportedWifiNotConnected = true;
+ }
+ return WIFI_RECONNECTION_TIMEOUT_S;
+ } else {
+ mBootReporter.reportMessage(WIFI_CONNECTED_MESSAGE);
+ Log.i(LOG_TAG, "Wifi connected.");
+ mWifiReady.set(true);
return 0;
}
-
- if (currentState == mDesiredState) {
- switch (currentState) {
- case ENABLED:
- // Wifi is enabled, but probably not yet connected. Check.
- WifiInfo info = mWifiManager.getConnectionInfo();
- if (info.getSupplicantState() != SupplicantState.COMPLETED) {
- if (!mReportedWifiNotConnected) {
- Log.w(LOG_TAG, "Wifi not yet connected.");
- mReportedWifiNotConnected = true;
- }
- } else {
- Log.i(LOG_TAG, "Wifi connected.");
- mWifiReady.set(true);
- }
- break;
-
- case DISABLED:
- // There's nothing extra to check for disable wifi.
- mWifiReady.set(true);
- break;
- }
-
- if (mWifiReady.isDone()) {
- return 0;
- }
- }
-
- // At this point we know that:
- // - current state is different that desired state, or
- // - current state is enabled, but wifi is not yet connected.
- ++mWifiStateChangeAttempt;
-
- switch (mDesiredState) {
- case DISABLED:
- mWifiManager.setWifiEnabled(false);
- break;
-
- case ENABLED:
- mWifiManager.setWifiEnabled(true);
- mWifiManager.reconnect();
- break;
- }
- return WIFI_RECONNECTION_TIMEOUT_S;
}
diff --git a/host/libs/monitor/kernel_log_server.cpp b/host/libs/monitor/kernel_log_server.cpp
index 8d0f5a4..dcf8bce 100644
--- a/host/libs/monitor/kernel_log_server.cpp
+++ b/host/libs/monitor/kernel_log_server.cpp
@@ -27,6 +27,7 @@
"VIRTUAL_DEVICE_BOOT_STARTED",
"VIRTUAL_DEVICE_BOOT_COMPLETED",
"VIRTUAL_DEVICE_BOOT_FAILED",
+ "VIRTUAL_DEVICE_NETWORK_WIFI_CONNECTED",
};
} // namespace