summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libwifi_hal/Android.mk2
-rw-r--r--service/java/com/android/server/wifi/ActiveModeWarden.java3
-rw-r--r--service/java/com/android/server/wifi/BaseWifiService.java12
-rw-r--r--service/java/com/android/server/wifi/ClientModeImpl.java23
-rw-r--r--service/java/com/android/server/wifi/WifiConnectivityManager.java11
-rw-r--r--service/java/com/android/server/wifi/WifiInjector.java7
-rw-r--r--service/java/com/android/server/wifi/WifiServiceImpl.java29
-rw-r--r--service/java/com/android/server/wifi/WifiStaStateNotifier.java72
8 files changed, 151 insertions, 8 deletions
diff --git a/libwifi_hal/Android.mk b/libwifi_hal/Android.mk
index 7bdbc3259..3c05d9b57 100644
--- a/libwifi_hal/Android.mk
+++ b/libwifi_hal/Android.mk
@@ -105,6 +105,8 @@ else ifeq ($(BOARD_WLAN_DEVICE), realtek)
LIB_WIFI_HAL := libwifi-hal-rtk
else ifeq ($(BOARD_WLAN_DEVICE), emulator)
LIB_WIFI_HAL := libwifi-hal-emu
+else ifeq ($(BOARD_WLAN_DEVICE), slsi)
+ LIB_WIFI_HAL := libwifi-hal-slsi
endif
# The WiFi HAL that you should be linking.
diff --git a/service/java/com/android/server/wifi/ActiveModeWarden.java b/service/java/com/android/server/wifi/ActiveModeWarden.java
index cf54e328b..e370a8c02 100644
--- a/service/java/com/android/server/wifi/ActiveModeWarden.java
+++ b/service/java/com/android/server/wifi/ActiveModeWarden.java
@@ -966,4 +966,7 @@ public class ActiveModeWarden {
}
}
}
+
+ public void registerStaEventCallback() {}
+ public void unregisterStaEventCallback() {}
}
diff --git a/service/java/com/android/server/wifi/BaseWifiService.java b/service/java/com/android/server/wifi/BaseWifiService.java
index 7614cf6eb..9e2f93561 100644
--- a/service/java/com/android/server/wifi/BaseWifiService.java
+++ b/service/java/com/android/server/wifi/BaseWifiService.java
@@ -27,6 +27,7 @@ import android.net.wifi.IOnWifiActivityEnergyInfoListener;
import android.net.wifi.IOnWifiUsabilityStatsListener;
import android.net.wifi.IScanResultsCallback;
import android.net.wifi.ISoftApCallback;
+import android.net.wifi.IStaStateCallback;
import android.net.wifi.ISuggestionConnectionStatusListener;
import android.net.wifi.ITrafficStateCallback;
import android.net.wifi.ITxPacketCountListener;
@@ -677,4 +678,15 @@ public class BaseWifiService extends IWifiManager.Stub {
public boolean isAutoWakeupEnabled() {
throw new UnsupportedOperationException();
}
+
+ @Override
+ public void registerStaStateCallback(
+ IBinder binder, IStaStateCallback callback, int callbackIdentifier) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void unregisterStaStateCallback(int callbackIdentifier) {
+ throw new UnsupportedOperationException();
+ }
}
diff --git a/service/java/com/android/server/wifi/ClientModeImpl.java b/service/java/com/android/server/wifi/ClientModeImpl.java
index 3a24f3580..d6645dfd8 100644
--- a/service/java/com/android/server/wifi/ClientModeImpl.java
+++ b/service/java/com/android/server/wifi/ClientModeImpl.java
@@ -355,6 +355,8 @@ public class ClientModeImpl extends StateMachine {
private DetailedState mNetworkAgentState;
private SupplicantStateTracker mSupplicantStateTracker;
+ private int mWifiLinkLayerStatsSupported = 4; // Temporary disable
+
// Indicates that framework is attempting to roam, set true on CMD_START_ROAM, set false when
// wifi connects or fails to connect
private boolean mIsAutoRoaming = false;
@@ -1304,15 +1306,20 @@ public class ClientModeImpl extends StateMachine {
loge("getWifiLinkLayerStats called without an interface");
return null;
}
+ WifiLinkLayerStats stats = null;
mLastLinkLayerStatsUpdate = mClock.getWallClockMillis();
- WifiLinkLayerStats stats = mWifiNative.getWifiLinkLayerStats(mInterfaceName);
- if (stats != null) {
- mOnTime = stats.on_time;
- mTxTime = stats.tx_time;
- mRxTime = stats.rx_time;
- mRunningBeaconCount = stats.beacon_rx;
- mWifiInfo.updatePacketRates(stats, mLastLinkLayerStatsUpdate);
- } else {
+ if (mWifiLinkLayerStatsSupported > 0) {
+ stats = mWifiNative.getWifiLinkLayerStats(mInterfaceName);
+ if (stats == null) {
+ mWifiLinkLayerStatsSupported -= 1;
+ } else {
+ mOnTime = stats.on_time;
+ mTxTime = stats.tx_time;
+ mRxTime = stats.rx_time;
+ mRunningBeaconCount = stats.beacon_rx;
+ mWifiInfo.updatePacketRates(stats, mLastLinkLayerStatsUpdate);
+ }
+ } else { // LinkLayerStats are broken or unsupported
long mTxPkts = mFacade.getTxPackets(mInterfaceName);
long mRxPkts = mFacade.getRxPackets(mInterfaceName);
mWifiInfo.updatePacketRates(mTxPkts, mRxPkts, mLastLinkLayerStatsUpdate);
diff --git a/service/java/com/android/server/wifi/WifiConnectivityManager.java b/service/java/com/android/server/wifi/WifiConnectivityManager.java
index 77af65400..12c64b542 100644
--- a/service/java/com/android/server/wifi/WifiConnectivityManager.java
+++ b/service/java/com/android/server/wifi/WifiConnectivityManager.java
@@ -175,6 +175,7 @@ public class WifiConnectivityManager {
private boolean mPnoScanStarted = false;
private boolean mPeriodicScanTimerSet = false;
private boolean mDelayedPartialScanTimerSet = false;
+ private boolean mWatchdogScanTimerSet = false;
// Used for Initial Scan metrics
private boolean mFailedInitialPartialScan = false;
@@ -1466,6 +1467,15 @@ public class WifiConnectivityManager {
mClock.getElapsedSinceBootMillis() + WATCHDOG_INTERVAL_MS,
WATCHDOG_TIMER_TAG,
mWatchdogListener, mEventHandler);
+ mWatchdogScanTimerSet = true;
+ }
+
+ // Cancel the watchdog scan timer.
+ private void cancelWatchdogScan() {
+ if (mWatchdogScanTimerSet) {
+ mAlarmManager.cancel(mWatchdogListener);
+ mWatchdogScanTimerSet = false;
+ }
}
// Schedules a delayed partial scan, which will scan the frequencies in mCachedWifiCandidates.
@@ -1893,6 +1903,7 @@ public class WifiConnectivityManager {
if (!mRunning) return;
mRunning = false;
stopConnectivityScan();
+ cancelWatchdogScan();
resetLastPeriodicSingleScanTimeStamp();
mOpenNetworkNotifier.clearPendingNotification(true /* resetRepeatDelay */);
mLastConnectionAttemptBssid = null;
diff --git a/service/java/com/android/server/wifi/WifiInjector.java b/service/java/com/android/server/wifi/WifiInjector.java
index 48f1b3f2e..2bfafc02a 100644
--- a/service/java/com/android/server/wifi/WifiInjector.java
+++ b/service/java/com/android/server/wifi/WifiInjector.java
@@ -106,6 +106,7 @@ public class WifiInjector {
private final ScoringParams mScoringParams;
private final ClientModeImpl mClientModeImpl;
private final ActiveModeWarden mActiveModeWarden;
+ private final WifiStaStateNotifier mWifiStaStateNotifier;
private final WifiSettingsStore mSettingsStore;
private OpenNetworkNotifier mOpenNetworkNotifier;
private final WifiLockManager mLockManager;
@@ -382,6 +383,8 @@ public class WifiInjector {
mWifiNetworkSelector.registerNetworkNominator(mNetworkSuggestionNominator);
mWifiNetworkSelector.registerNetworkNominator(mScoredNetworkNominator);
+ mWifiStaStateNotifier = new WifiStaStateNotifier(wifiLooper, this);
+
mClientModeImpl.start();
}
@@ -479,6 +482,10 @@ public class WifiInjector {
return mActiveModeWarden;
}
+ public WifiStaStateNotifier getWifiStaStateNotifier() {
+ return mWifiStaStateNotifier;
+ }
+
public WifiSettingsStore getWifiSettingsStore() {
return mSettingsStore;
}
diff --git a/service/java/com/android/server/wifi/WifiServiceImpl.java b/service/java/com/android/server/wifi/WifiServiceImpl.java
index 3b4f39796..f84337cc0 100644
--- a/service/java/com/android/server/wifi/WifiServiceImpl.java
+++ b/service/java/com/android/server/wifi/WifiServiceImpl.java
@@ -60,6 +60,7 @@ import android.net.wifi.IOnWifiUsabilityStatsListener;
import android.net.wifi.IScanResultsCallback;
import android.net.wifi.ISoftApCallback;
import android.net.wifi.ISuggestionConnectionStatusListener;
+import android.net.wifi.IStaStateCallback;
import android.net.wifi.ITrafficStateCallback;
import android.net.wifi.IWifiConnectedNetworkScorer;
import android.net.wifi.ScanResult;
@@ -188,6 +189,8 @@ public class WifiServiceImpl extends BaseWifiService {
private final WifiConfigManager mWifiConfigManager;
private final PasspointManager mPasspointManager;
private final WifiLog mLog;
+ private final WifiStaStateNotifier mWifiStaStateNotifier;
+
/**
* Verbose logging flag. Toggled by developer options.
*/
@@ -329,6 +332,7 @@ public class WifiServiceImpl extends BaseWifiService {
mWifiScoreCard = mWifiInjector.getWifiScoreCard();
mMemoryStoreImpl = new MemoryStoreImpl(mContext, mWifiInjector,
mWifiScoreCard, mWifiInjector.getWifiHealthMonitor());
+ mWifiStaStateNotifier = mWifiInjector.getWifiStaStateNotifier();
}
/**
@@ -3729,6 +3733,31 @@ public class WifiServiceImpl extends BaseWifiService {
mWifiTrafficPoller.removeCallback(callbackIdentifier));
}
+ @Override
+ public void registerStaStateCallback(IBinder binder, IStaStateCallback callback,
+ int callbackIdentifier) {
+ if (binder == null) {
+ throw new IllegalArgumentException("Binder must not be null");
+ }
+ if (callback == null) {
+ throw new IllegalArgumentException("Callback must not be null");
+ }
+ if (mVerboseLoggingEnabled) {
+ mLog.info("registerStaStateCallback uid=%").c(Binder.getCallingUid()).flush();
+ }
+ mWifiThreadRunner.post(() ->
+ mWifiStaStateNotifier.addCallback(binder, callback, callbackIdentifier));
+ }
+
+ @Override
+ public void unregisterStaStateCallback(int callbackIdentifier) {
+ if (mVerboseLoggingEnabled) {
+ mLog.info("unregisterStaStateCallback uid=%").c(Binder.getCallingUid()).flush();
+ }
+ mWifiThreadRunner.post(() ->
+ mWifiStaStateNotifier.removeCallback(callbackIdentifier));
+ }
+
private long getSupportedFeaturesInternal() {
final AsyncChannel channel = mClientModeImplChannel;
long supportedFeatureSet = 0L;
diff --git a/service/java/com/android/server/wifi/WifiStaStateNotifier.java b/service/java/com/android/server/wifi/WifiStaStateNotifier.java
new file mode 100644
index 000000000..05dd87993
--- /dev/null
+++ b/service/java/com/android/server/wifi/WifiStaStateNotifier.java
@@ -0,0 +1,72 @@
+/*
+ * 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.annotation.NonNull;
+import android.net.wifi.IStaStateCallback;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Looper;
+import android.os.RemoteException;
+import android.util.Log;
+
+import com.android.server.wifi.util.ExternalCallbackTracker;
+
+
+public class WifiStaStateNotifier {
+ private final ExternalCallbackTracker<IStaStateCallback> mRegisteredCallbacks;
+ private static WifiInjector mWifiInjector;
+ private static final String TAG = "WifiStaStateNotifier";
+ private static final boolean DEBUG = false;
+
+ WifiStaStateNotifier(@NonNull Looper looper, WifiInjector wifiInjector) {
+ mRegisteredCallbacks = new ExternalCallbackTracker<IStaStateCallback>(new Handler(looper));
+ mWifiInjector = wifiInjector;
+ }
+
+ public void addCallback(IBinder binder, IStaStateCallback callback,
+ int callbackIdentifier) {
+ if (DEBUG) Log.d(TAG, "addCallback");
+ if (mRegisteredCallbacks.getNumCallbacks() > 0) {
+ if (DEBUG) Log.e(TAG, "Failed to add callback, only support single request!");
+ return;
+ }
+ if (!mRegisteredCallbacks.add(binder, callback, callbackIdentifier)) {
+ if (DEBUG) Log.e(TAG, "Failed to add callback");
+ return;
+ }
+ mWifiInjector.getActiveModeWarden().registerStaEventCallback();
+ }
+
+ public void removeCallback(int callbackIdentifier) {
+ if (DEBUG) Log.d(TAG, "removeCallback");
+ mRegisteredCallbacks.remove(callbackIdentifier);
+ mWifiInjector.getActiveModeWarden().unregisterStaEventCallback();
+ }
+
+ public void onStaToBeOff() {
+ if (DEBUG) Log.d(TAG, "onStaToBeOff");
+ for (IStaStateCallback callback : mRegisteredCallbacks.getCallbacks()) {
+ try {
+ if (DEBUG) Log.d(TAG, "callback onStaToBeOff");
+ callback.onStaToBeOff();
+ } catch (RemoteException e) {
+ // do nothing
+ }
+ }
+ }
+}