summaryrefslogtreecommitdiff
path: root/service
diff options
context:
space:
mode:
authorEtan Cohen <etancohen@google.com>2019-12-10 16:53:47 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2019-12-10 16:53:47 +0000
commitb55d1a801204295e9b979a2a358bf306190bf4e6 (patch)
tree97cff9481ce6c4c87caba92315ec9dcc2e881d8d /service
parent76eb68da2494199b9aff9497baab273d7a914370 (diff)
parent324c2515179766a346f6f19160d2daf17d0d9153 (diff)
Merge changes from topic "wificond_phase3"
* changes: [WIFI][MAINLINE] Transition WificondControl interfaces: PNO metrics [WIFI][MAINLINE] Transition WificondControl interfaces: scan callbacks [WIFI][MAINLINE] Transition WificondControl interfaces: Scan results
Diffstat (limited to 'service')
-rw-r--r--service/java/com/android/server/wifi/WifiInjector.java3
-rw-r--r--service/java/com/android/server/wifi/WifiMetrics.java2
-rw-r--r--service/java/com/android/server/wifi/WifiNative.java174
-rw-r--r--service/java/com/android/server/wifi/WificondControl.java229
-rw-r--r--service/java/com/android/server/wifi/wificond/NativeScanResult.java3
5 files changed, 253 insertions, 158 deletions
diff --git a/service/java/com/android/server/wifi/WifiInjector.java b/service/java/com/android/server/wifi/WifiInjector.java
index 214e4a223..0b0a30517 100644
--- a/service/java/com/android/server/wifi/WifiInjector.java
+++ b/service/java/com/android/server/wifi/WifiInjector.java
@@ -226,7 +226,7 @@ public class WifiInjector {
mSupplicantStaIfaceHal = new SupplicantStaIfaceHal(
mContext, mWifiMonitor, mFrameworkFacade, wifiHandler, mClock);
mHostapdHal = new HostapdHal(mContext, wifiHandler);
- mWificondControl = new WificondControl(this, mWifiMonitor, mCarrierNetworkConfig,
+ mWificondControl = new WificondControl(this,
(AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE),
wifiHandler, mClock);
mNwManagementService = INetworkManagementService.Stub.asInterface(
@@ -234,6 +234,7 @@ public class WifiInjector {
mWifiNative = new WifiNative(
mWifiVendorHal, mSupplicantStaIfaceHal, mHostapdHal, mWificondControl,
mWifiMonitor, mNwManagementService, mPropertyService, mWifiMetrics,
+ mCarrierNetworkConfig,
wifiHandler, new Random());
mWifiP2pMonitor = new WifiP2pMonitor(this);
mSupplicantP2pIfaceHal = new SupplicantP2pIfaceHal(mWifiP2pMonitor);
diff --git a/service/java/com/android/server/wifi/WifiMetrics.java b/service/java/com/android/server/wifi/WifiMetrics.java
index e8d62a56d..f313cdaa9 100644
--- a/service/java/com/android/server/wifi/WifiMetrics.java
+++ b/service/java/com/android/server/wifi/WifiMetrics.java
@@ -883,7 +883,7 @@ public class WifiMetrics {
/**
* Increment total number of attempts to start a pno scan
*/
- public void incrementPnoScanStartAttempCount() {
+ public void incrementPnoScanStartAttemptCount() {
synchronized (mLock) {
mPnoScanMetrics.numPnoScanAttempts++;
}
diff --git a/service/java/com/android/server/wifi/WifiNative.java b/service/java/com/android/server/wifi/WifiNative.java
index c8c0da8d6..3dde35ed9 100644
--- a/service/java/com/android/server/wifi/WifiNative.java
+++ b/service/java/com/android/server/wifi/WifiNative.java
@@ -16,6 +16,8 @@
package com.android.server.wifi;
+import static android.net.wifi.WifiManager.WIFI_FEATURE_OWE;
+
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.net.InterfaceConfiguration;
@@ -26,6 +28,7 @@ import android.net.wifi.ScanResult;
import android.net.wifi.SoftApConfiguration;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiScanner;
+import android.net.wifi.WifiSsid;
import android.os.Handler;
import android.os.INetworkManagementService;
import android.os.RemoteException;
@@ -37,8 +40,13 @@ import android.util.Log;
import com.android.internal.annotations.Immutable;
import com.android.internal.util.HexDump;
import com.android.server.net.BaseNetworkObserver;
+import com.android.server.wifi.hotspot2.NetworkDetail;
import com.android.server.wifi.util.FrameParser;
+import com.android.server.wifi.util.InformationElementUtil;
import com.android.server.wifi.util.NativeUtil;
+import com.android.server.wifi.util.ScanResultUtil;
+import com.android.server.wifi.wificond.NativeScanResult;
+import com.android.server.wifi.wificond.RadioChainInfo;
import java.io.PrintWriter;
import java.io.StringWriter;
@@ -82,6 +90,7 @@ public class WifiNative {
private final INetworkManagementService mNwManagementService;
private final PropertyService mPropertyService;
private final WifiMetrics mWifiMetrics;
+ private final CarrierNetworkConfig mCarrierNetworkConfig;
private final Handler mHandler;
private final Random mRandom;
private boolean mVerboseLoggingEnabled = false;
@@ -91,7 +100,7 @@ public class WifiNative {
WificondControl condControl, WifiMonitor wifiMonitor,
INetworkManagementService nwService,
PropertyService propertyService, WifiMetrics wifiMetrics,
- Handler handler, Random random) {
+ CarrierNetworkConfig carrierNetworkConfig, Handler handler, Random random) {
mWifiVendorHal = vendorHal;
mSupplicantStaIfaceHal = staIfaceHal;
mHostapdHal = hostapdHal;
@@ -100,6 +109,7 @@ public class WifiNative {
mNwManagementService = nwService;
mPropertyService = propertyService;
mWifiMetrics = wifiMetrics;
+ mCarrierNetworkConfig = carrierNetworkConfig;
mHandler = handler;
mRandom = random;
}
@@ -320,6 +330,47 @@ public class WifiNative {
}
}
+ private class NormalScanEventCallback implements WificondControl.ScanEventCallback {
+ private String mIfaceName;
+
+ NormalScanEventCallback(String ifaceName) {
+ mIfaceName = ifaceName;
+ }
+
+ @Override
+ public void onScanResultReady() {
+ Log.d(TAG, "Scan result ready event");
+ mWifiMonitor.broadcastScanResultEvent(mIfaceName);
+ }
+
+ @Override
+ public void onScanFailed() {
+ Log.d(TAG, "Scan failed event");
+ mWifiMonitor.broadcastScanFailedEvent(mIfaceName);
+ }
+ }
+
+ private class PnoScanEventCallback implements WificondControl.ScanEventCallback {
+ private String mIfaceName;
+
+ PnoScanEventCallback(String ifaceName) {
+ mIfaceName = ifaceName;
+ }
+
+ @Override
+ public void onScanResultReady() {
+ Log.d(TAG, "Pno scan result event");
+ mWifiMonitor.broadcastPnoScanResultEvent(mIfaceName);
+ mWifiMetrics.incrementPnoFoundNetworkEventCount();
+ }
+
+ @Override
+ public void onScanFailed() {
+ Log.d(TAG, "Pno Scan failed event");
+ mWifiMetrics.incrementPnoScanFailedCount();
+ }
+ }
+
private Object mLock = new Object();
private final IfaceManager mIfaceMgr = new IfaceManager();
private HashSet<StatusListener> mStatusListeners = new HashSet<>();
@@ -967,7 +1018,9 @@ public class WifiNative {
mWifiMetrics.incrementNumSetupClientInterfaceFailureDueToHal();
return null;
}
- if (mWificondControl.setupInterfaceForClientMode(iface.name) == null) {
+ if (!mWificondControl.setupInterfaceForClientMode(iface.name,
+ new NormalScanEventCallback(iface.name),
+ new PnoScanEventCallback(iface.name))) {
Log.e(TAG, "Failed to setup iface in wificond on " + iface);
teardownInterface(iface.name);
mWifiMetrics.incrementNumSetupClientInterfaceFailureDueToWificond();
@@ -1027,7 +1080,9 @@ public class WifiNative {
mWifiMetrics.incrementNumSetupClientInterfaceFailureDueToHal();
return null;
}
- if (mWificondControl.setupInterfaceForClientMode(iface.name) == null) {
+ if (!mWificondControl.setupInterfaceForClientMode(iface.name,
+ new NormalScanEventCallback(iface.name),
+ new PnoScanEventCallback(iface.name))) {
Log.e(TAG, "Failed to setup iface in wificond=" + iface.name);
teardownInterface(iface.name);
mWifiMetrics.incrementNumSetupClientInterfaceFailureDueToWificond();
@@ -1084,7 +1139,7 @@ public class WifiNative {
mWifiMetrics.incrementNumSetupSoftApInterfaceFailureDueToHal();
return null;
}
- if (mWificondControl.setupInterfaceForSoftApMode(iface.name) == null) {
+ if (!mWificondControl.setupInterfaceForSoftApMode(iface.name)) {
Log.e(TAG, "Failed to setup iface in wificond on " + iface);
teardownInterface(iface.name);
mWifiMetrics.incrementNumSetupSoftApInterfaceFailureDueToWificond();
@@ -1377,8 +1432,8 @@ public class WifiNative {
* Returns an empty ArrayList on failure.
*/
public ArrayList<ScanDetail> getScanResults(@NonNull String ifaceName) {
- return mWificondControl.getScanResults(
- ifaceName, WificondControl.SCAN_TYPE_SINGLE_SCAN);
+ return convertNativeScanResults(mWificondControl.getScanResults(
+ ifaceName, WificondControl.SCAN_TYPE_SINGLE_SCAN));
}
/**
@@ -1388,7 +1443,98 @@ public class WifiNative {
* Returns an empty ArrayList on failure.
*/
public ArrayList<ScanDetail> getPnoScanResults(@NonNull String ifaceName) {
- return mWificondControl.getScanResults(ifaceName, WificondControl.SCAN_TYPE_PNO_SCAN);
+ return convertNativeScanResults(
+ mWificondControl.getScanResults(ifaceName, WificondControl.SCAN_TYPE_PNO_SCAN));
+ }
+
+ private ArrayList<ScanDetail> convertNativeScanResults(List<NativeScanResult> nativeResults) {
+ ArrayList<ScanDetail> results = new ArrayList<>();
+ for (NativeScanResult result : nativeResults) {
+ WifiSsid wifiSsid = WifiSsid.createFromByteArray(result.ssid);
+ String bssid;
+ try {
+ bssid = NativeUtil.macAddressFromByteArray(result.bssid);
+ } catch (IllegalArgumentException e) {
+ Log.e(TAG, "Illegal argument " + result.bssid, e);
+ continue;
+ }
+ if (bssid == null) {
+ Log.e(TAG, "Illegal null bssid");
+ continue;
+ }
+ ScanResult.InformationElement[] ies =
+ InformationElementUtil.parseInformationElements(result.infoElement);
+ InformationElementUtil.Capabilities capabilities =
+ new InformationElementUtil.Capabilities();
+ capabilities.from(ies, result.capability, isEnhancedOpenSupported());
+ String flags = capabilities.generateCapabilitiesString();
+ NetworkDetail networkDetail;
+ try {
+ networkDetail = new NetworkDetail(bssid, ies, null, result.frequency);
+ } catch (IllegalArgumentException e) {
+ Log.e(TAG, "Illegal argument for scan result with bssid: " + bssid, e);
+ continue;
+ }
+
+ ScanDetail scanDetail = new ScanDetail(networkDetail, wifiSsid, bssid, flags,
+ result.signalMbm / 100, result.frequency, result.tsf, ies, null,
+ result.infoElement);
+ ScanResult scanResult = scanDetail.getScanResult();
+ scanResult.setWifiStandard(networkDetail.getWifiMode());
+
+ // Update carrier network info if this AP's SSID is associated with a carrier Wi-Fi
+ // network and it uses EAP.
+ if (ScanResultUtil.isScanResultForEapNetwork(scanDetail.getScanResult())
+ && mCarrierNetworkConfig.isCarrierNetwork(wifiSsid.toString())) {
+ scanResult.isCarrierAp = true;
+ scanResult.carrierApEapType =
+ mCarrierNetworkConfig.getNetworkEapType(wifiSsid.toString());
+ scanResult.carrierName =
+ mCarrierNetworkConfig.getCarrierName(wifiSsid.toString());
+ }
+ // Fill up the radio chain info.
+ if (result.radioChainInfos != null) {
+ scanResult.radioChainInfos =
+ new ScanResult.RadioChainInfo[result.radioChainInfos.size()];
+ int idx = 0;
+ for (RadioChainInfo nativeRadioChainInfo : result.radioChainInfos) {
+ scanResult.radioChainInfos[idx] = new ScanResult.RadioChainInfo();
+ scanResult.radioChainInfos[idx].id = nativeRadioChainInfo.chainId;
+ scanResult.radioChainInfos[idx].level = nativeRadioChainInfo.level;
+ idx++;
+ }
+ }
+ results.add(scanDetail);
+ }
+ if (mVerboseLoggingEnabled) {
+ Log.d(TAG, "get " + results.size() + " scan results from wificond");
+ }
+
+ return results;
+ }
+
+ private boolean mIsEnhancedOpenSupportedInitialized = false;
+ private boolean mIsEnhancedOpenSupported;
+
+ /**
+ * Check if OWE (Enhanced Open) is supported on the device
+ *
+ * @return true if OWE is supported
+ */
+ private boolean isEnhancedOpenSupported() {
+ if (mIsEnhancedOpenSupportedInitialized) {
+ return mIsEnhancedOpenSupported;
+ }
+
+ String iface = getClientInterfaceName();
+ if (iface == null) {
+ // Client interface might not be initialized during boot or Wi-Fi off
+ return false;
+ }
+
+ mIsEnhancedOpenSupportedInitialized = true;
+ mIsEnhancedOpenSupported = (getSupportedFeatureSet(iface) & WIFI_FEATURE_OWE) != 0;
+ return mIsEnhancedOpenSupported;
}
/**
@@ -1398,7 +1544,19 @@ public class WifiNative {
* @return true on success.
*/
public boolean startPnoScan(@NonNull String ifaceName, PnoSettings pnoSettings) {
- return mWificondControl.startPnoScan(ifaceName, pnoSettings.toNativePnoSettings());
+ return mWificondControl.startPnoScan(ifaceName, pnoSettings.toNativePnoSettings(),
+ new WificondControl.PnoScanRequestCallback() {
+ @Override
+ public void onPnoRequestSucceeded() {
+ mWifiMetrics.incrementPnoScanStartAttemptCount();
+ }
+
+ @Override
+ public void onPnoRequestFailed() {
+ mWifiMetrics.incrementPnoScanStartAttemptCount();
+ mWifiMetrics.incrementPnoScanFailedCount();
+ }
+ });
}
/**
diff --git a/service/java/com/android/server/wifi/WificondControl.java b/service/java/com/android/server/wifi/WificondControl.java
index 2c8d1ac0c..ec813b356 100644
--- a/service/java/com/android/server/wifi/WificondControl.java
+++ b/service/java/com/android/server/wifi/WificondControl.java
@@ -16,8 +16,6 @@
package com.android.server.wifi;
-import static android.net.wifi.WifiManager.WIFI_FEATURE_OWE;
-
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.app.AlarmManager;
@@ -29,25 +27,19 @@ import android.net.wifi.IScanEvent;
import android.net.wifi.ISendMgmtFrameEvent;
import android.net.wifi.IWifiScannerImpl;
import android.net.wifi.IWificond;
-import android.net.wifi.ScanResult;
import android.net.wifi.WifiScanner;
-import android.net.wifi.WifiSsid;
import android.os.Binder;
import android.os.Handler;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
-import com.android.server.wifi.hotspot2.NetworkDetail;
-import com.android.server.wifi.util.InformationElementUtil;
import com.android.server.wifi.util.NativeUtil;
-import com.android.server.wifi.util.ScanResultUtil;
import com.android.server.wifi.wificond.ChannelSettings;
import com.android.server.wifi.wificond.HiddenNetwork;
import com.android.server.wifi.wificond.NativeScanResult;
import com.android.server.wifi.wificond.NativeWifiClient;
import com.android.server.wifi.wificond.PnoSettings;
-import com.android.server.wifi.wificond.RadioChainInfo;
import com.android.server.wifi.wificond.SingleScanSettings;
import java.lang.annotation.Retention;
@@ -79,19 +71,22 @@ public class WificondControl implements IBinder.DeathRecipient {
private static final String TIMEOUT_ALARM_TAG = TAG + " Send Management Frame Timeout";
- /* Get scan results for a single scan */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef(prefix = {"SCAN_TYPE_"},
+ value = {SCAN_TYPE_SINGLE_SCAN,
+ SCAN_TYPE_PNO_SCAN})
+ public @interface ScanResultType {}
+
+ /** Get scan results for a single scan */
public static final int SCAN_TYPE_SINGLE_SCAN = 0;
- /* Get scan results for Pno Scan */
+ /** Get scan results for Pno Scan */
public static final int SCAN_TYPE_PNO_SCAN = 1;
private WifiInjector mWifiInjector;
- private WifiMonitor mWifiMonitor;
- private final CarrierNetworkConfig mCarrierNetworkConfig;
private AlarmManager mAlarmManager;
private Handler mEventHandler;
private Clock mClock;
- private WifiNative mWifiNative = null;
// Cached wificond binder handlers.
private IWificond mWificond;
@@ -106,26 +101,54 @@ public class WificondControl implements IBinder.DeathRecipient {
* Ensures that no more than one sendMgmtFrame operation runs concurrently.
*/
private AtomicBoolean mSendMgmtFrameInProgress = new AtomicBoolean(false);
- private boolean mIsEnhancedOpenSupportedInitialized = false;
- private boolean mIsEnhancedOpenSupported;
+
+ /**
+ * Interface for a callback to be used to handle scan results.
+ */
+ public interface ScanEventCallback {
+ /**
+ * Called when scan results are available.
+ */
+ void onScanResultReady();
+
+ /**
+ * Called when a scan has failed.
+ */
+ void onScanFailed();
+ }
+
+ /**
+ * Interface for a callback to provide information about PNO scan request.
+ */
+ public interface PnoScanRequestCallback {
+ /**
+ * Called when the PNO scan is requested.
+ */
+ void onPnoRequestSucceeded();
+
+ /**
+ * Called when a PNO scan request fails.
+ */
+ void onPnoRequestFailed();
+ }
private class ScanEventHandler extends IScanEvent.Stub {
- private String mIfaceName;
+ private ScanEventCallback mCallback;
- ScanEventHandler(@NonNull String ifaceName) {
- mIfaceName = ifaceName;
+ ScanEventHandler(@NonNull ScanEventCallback callback) {
+ mCallback = callback;
}
@Override
public void OnScanResultReady() {
Log.d(TAG, "Scan result ready event");
- mWifiMonitor.broadcastScanResultEvent(mIfaceName);
+ mCallback.onScanResultReady();
}
@Override
public void OnScanFailed() {
Log.d(TAG, "Scan failed event");
- mWifiMonitor.broadcastScanFailedEvent(mIfaceName);
+ mCallback.onScanFailed();
}
}
@@ -241,35 +264,31 @@ public class WificondControl implements IBinder.DeathRecipient {
public static final int SEND_MGMT_FRAME_ERROR_ALREADY_STARTED = 5;
- WificondControl(WifiInjector wifiInjector, WifiMonitor wifiMonitor,
- CarrierNetworkConfig carrierNetworkConfig, AlarmManager alarmManager, Handler handler,
- Clock clock) {
+ WificondControl(WifiInjector wifiInjector, AlarmManager alarmManager,
+ Handler handler, Clock clock) {
mWifiInjector = wifiInjector;
- mWifiMonitor = wifiMonitor;
- mCarrierNetworkConfig = carrierNetworkConfig;
mAlarmManager = alarmManager;
mEventHandler = handler;
mClock = clock;
}
private class PnoScanEventHandler extends IPnoScanEvent.Stub {
- private String mIfaceName;
+ private ScanEventCallback mCallback;
- PnoScanEventHandler(@NonNull String ifaceName) {
- mIfaceName = ifaceName;
+ PnoScanEventHandler(@NonNull ScanEventCallback callback) {
+ mCallback = callback;
}
@Override
public void OnPnoNetworkFound() {
Log.d(TAG, "Pno scan result event");
- mWifiMonitor.broadcastPnoScanResultEvent(mIfaceName);
- mWifiInjector.getWifiMetrics().incrementPnoFoundNetworkEventCount();
+ mCallback.onScanResultReady();
}
@Override
public void OnPnoScanFailed() {
Log.d(TAG, "Pno Scan failed event");
- mWifiInjector.getWifiMetrics().incrementPnoScanFailedCount();
+ mCallback.onScanFailed();
}
}
@@ -426,13 +445,13 @@ public class WificondControl implements IBinder.DeathRecipient {
/**
* Setup interface for client mode via wificond.
- * @return An IClientInterface as wificond client interface binder handler.
- * Returns null on failure.
+ * @return true on success.
*/
- public IClientInterface setupInterfaceForClientMode(@NonNull String ifaceName) {
+ public boolean setupInterfaceForClientMode(@NonNull String ifaceName,
+ @NonNull ScanEventCallback scanCallback, @NonNull ScanEventCallback pnoScanCallback) {
Log.d(TAG, "Setting up interface for client mode");
if (!retrieveWificondAndRegisterForDeath()) {
- return null;
+ return false;
}
IClientInterface clientInterface = null;
@@ -440,12 +459,12 @@ public class WificondControl implements IBinder.DeathRecipient {
clientInterface = mWificond.createClientInterface(ifaceName);
} catch (RemoteException e1) {
Log.e(TAG, "Failed to get IClientInterface due to remote exception");
- return null;
+ return false;
}
if (clientInterface == null) {
Log.e(TAG, "Could not get IClientInterface instance from wificond");
- return null;
+ return false;
}
Binder.allowBlocking(clientInterface.asBinder());
@@ -455,21 +474,21 @@ public class WificondControl implements IBinder.DeathRecipient {
IWifiScannerImpl wificondScanner = clientInterface.getWifiScannerImpl();
if (wificondScanner == null) {
Log.e(TAG, "Failed to get WificondScannerImpl");
- return null;
+ return false;
}
mWificondScanners.put(ifaceName, wificondScanner);
Binder.allowBlocking(wificondScanner.asBinder());
- ScanEventHandler scanEventHandler = new ScanEventHandler(ifaceName);
+ ScanEventHandler scanEventHandler = new ScanEventHandler(scanCallback);
mScanEventHandlers.put(ifaceName, scanEventHandler);
wificondScanner.subscribeScanEvents(scanEventHandler);
- PnoScanEventHandler pnoScanEventHandler = new PnoScanEventHandler(ifaceName);
+ PnoScanEventHandler pnoScanEventHandler = new PnoScanEventHandler(pnoScanCallback);
mPnoScanEventHandlers.put(ifaceName, pnoScanEventHandler);
wificondScanner.subscribePnoScanEvents(pnoScanEventHandler);
} catch (RemoteException e) {
Log.e(TAG, "Failed to refresh wificond scanner due to remote exception");
}
- return clientInterface;
+ return true;
}
/**
@@ -519,13 +538,12 @@ public class WificondControl implements IBinder.DeathRecipient {
/**
* Setup interface for softAp mode via wificond.
- * @return An IApInterface as wificond Ap interface binder handler.
- * Returns null on failure.
+ * @return true on success.
*/
- public IApInterface setupInterfaceForSoftApMode(@NonNull String ifaceName) {
+ public boolean setupInterfaceForSoftApMode(@NonNull String ifaceName) {
Log.d(TAG, "Setting up interface for soft ap mode");
if (!retrieveWificondAndRegisterForDeath()) {
- return null;
+ return false;
}
IApInterface apInterface = null;
@@ -533,18 +551,18 @@ public class WificondControl implements IBinder.DeathRecipient {
apInterface = mWificond.createApInterface(ifaceName);
} catch (RemoteException e1) {
Log.e(TAG, "Failed to get IApInterface due to remote exception");
- return null;
+ return false;
}
if (apInterface == null) {
Log.e(TAG, "Could not get IApInterface instance from wificond");
- return null;
+ return false;
}
Binder.allowBlocking(apInterface.asBinder());
// Refresh Handlers
mApInterfaces.put(ifaceName, apInterface);
- return apInterface;
+ return true;
}
/**
@@ -681,83 +699,28 @@ public class WificondControl implements IBinder.DeathRecipient {
/**
* Fetch the latest scan result from kernel via wificond.
* @param ifaceName Name of the interface.
- * @return Returns an ArrayList of ScanDetail.
- * Returns an empty ArrayList on failure.
+ * @return Returns an array of native scan results or an empty array on failure.
*/
- public ArrayList<ScanDetail> getScanResults(@NonNull String ifaceName, int scanType) {
- ArrayList<ScanDetail> results = new ArrayList<>();
+ @NonNull public List<NativeScanResult> getScanResults(@NonNull String ifaceName,
+ @ScanResultType int scanType) {
IWifiScannerImpl scannerImpl = getScannerImpl(ifaceName);
if (scannerImpl == null) {
Log.e(TAG, "No valid wificond scanner interface handler");
- return results;
+ return new ArrayList<>();
}
+ List<NativeScanResult> results = null;
try {
- NativeScanResult[] nativeResults;
if (scanType == SCAN_TYPE_SINGLE_SCAN) {
- nativeResults = scannerImpl.getScanResults();
+ results = Arrays.asList(scannerImpl.getScanResults());
} else {
- nativeResults = scannerImpl.getPnoScanResults();
- }
- for (NativeScanResult result : nativeResults) {
- WifiSsid wifiSsid = WifiSsid.createFromByteArray(result.ssid);
- String bssid;
- try {
- bssid = NativeUtil.macAddressFromByteArray(result.bssid);
- } catch (IllegalArgumentException e) {
- Log.e(TAG, "Illegal argument " + result.bssid, e);
- continue;
- }
- if (bssid == null) {
- Log.e(TAG, "Illegal null bssid");
- continue;
- }
- ScanResult.InformationElement[] ies =
- InformationElementUtil.parseInformationElements(result.infoElement);
- InformationElementUtil.Capabilities capabilities =
- new InformationElementUtil.Capabilities();
- capabilities.from(ies, result.capability, isEnhancedOpenSupported());
- String flags = capabilities.generateCapabilitiesString();
- NetworkDetail networkDetail;
- try {
- networkDetail = new NetworkDetail(bssid, ies, null, result.frequency);
- } catch (IllegalArgumentException e) {
- Log.e(TAG, "Illegal argument for scan result with bssid: " + bssid, e);
- continue;
- }
-
- ScanDetail scanDetail = new ScanDetail(networkDetail, wifiSsid, bssid, flags,
- result.signalMbm / 100, result.frequency, result.tsf, ies, null,
- result.infoElement);
- ScanResult scanResult = scanDetail.getScanResult();
- scanResult.setWifiStandard(networkDetail.getWifiMode());
-
- // Update carrier network info if this AP's SSID is associated with a carrier Wi-Fi
- // network and it uses EAP.
- if (ScanResultUtil.isScanResultForEapNetwork(scanDetail.getScanResult())
- && mCarrierNetworkConfig.isCarrierNetwork(wifiSsid.toString())) {
- scanResult.isCarrierAp = true;
- scanResult.carrierApEapType =
- mCarrierNetworkConfig.getNetworkEapType(wifiSsid.toString());
- scanResult.carrierName =
- mCarrierNetworkConfig.getCarrierName(wifiSsid.toString());
- }
- // Fill up the radio chain info.
- if (result.radioChainInfos != null) {
- scanResult.radioChainInfos =
- new ScanResult.RadioChainInfo[result.radioChainInfos.size()];
- int idx = 0;
- for (RadioChainInfo nativeRadioChainInfo : result.radioChainInfos) {
- scanResult.radioChainInfos[idx] = new ScanResult.RadioChainInfo();
- scanResult.radioChainInfos[idx].id = nativeRadioChainInfo.chainId;
- scanResult.radioChainInfos[idx].level = nativeRadioChainInfo.level;
- idx++;
- }
- }
- results.add(scanDetail);
+ results = Arrays.asList(scannerImpl.getPnoScanResults());
}
} catch (RemoteException e1) {
Log.e(TAG, "Failed to create ScanDetail ArrayList");
}
+ if (results == null) {
+ results = new ArrayList<>();
+ }
if (mVerboseLoggingEnabled) {
Log.d(TAG, "get " + results.size() + " scan results from wificond");
}
@@ -844,7 +807,8 @@ public class WificondControl implements IBinder.DeathRecipient {
* @param pnoSettings Pno scan configuration.
* @return true on success.
*/
- public boolean startPnoScan(@NonNull String ifaceName, PnoSettings pnoSettings) {
+ public boolean startPnoScan(@NonNull String ifaceName, PnoSettings pnoSettings,
+ PnoScanRequestCallback callback) {
IWifiScannerImpl scannerImpl = getScannerImpl(ifaceName);
if (scannerImpl == null) {
Log.e(TAG, "No valid wificond scanner interface handler");
@@ -853,9 +817,10 @@ public class WificondControl implements IBinder.DeathRecipient {
try {
boolean success = scannerImpl.startPnoScan(pnoSettings);
- mWifiInjector.getWifiMetrics().incrementPnoScanStartAttempCount();
- if (!success) {
- mWifiInjector.getWifiMetrics().incrementPnoScanFailedCount();
+ if (success) {
+ callback.onPnoRequestSucceeded();
+ } else {
+ callback.onPnoRequestFailed();
}
return success;
} catch (RemoteException e1) {
@@ -1025,34 +990,4 @@ public class WificondControl implements IBinder.DeathRecipient {
mApInterfaceListeners.clear();
mSendMgmtFrameInProgress.set(false);
}
-
- /**
- * Check if OWE (Enhanced Open) is supported on the device
- *
- * @return true if OWE is supported
- */
- private boolean isEnhancedOpenSupported() {
- if (mIsEnhancedOpenSupportedInitialized) {
- return mIsEnhancedOpenSupported;
- }
-
- // WifiNative handle might be null, check this here
- if (mWifiNative == null) {
- mWifiNative = mWifiInjector.getWifiNative();
- if (mWifiNative == null) {
- return false;
- }
- }
-
- String iface = mWifiNative.getClientInterfaceName();
- if (iface == null) {
- // Client interface might not be initialized during boot or Wi-Fi off
- return false;
- }
-
- mIsEnhancedOpenSupportedInitialized = true;
- mIsEnhancedOpenSupported = (mWifiNative.getSupportedFeatureSet(iface)
- & WIFI_FEATURE_OWE) != 0;
- return mIsEnhancedOpenSupported;
- }
}
diff --git a/service/java/com/android/server/wifi/wificond/NativeScanResult.java b/service/java/com/android/server/wifi/wificond/NativeScanResult.java
index d7bfed8f0..304dd013b 100644
--- a/service/java/com/android/server/wifi/wificond/NativeScanResult.java
+++ b/service/java/com/android/server/wifi/wificond/NativeScanResult.java
@@ -21,6 +21,7 @@ import android.os.Parcelable;
import java.util.ArrayList;
import java.util.BitSet;
+import java.util.List;
/**
* ScanResult from wificond
@@ -38,7 +39,7 @@ public class NativeScanResult implements Parcelable {
public long tsf;
public BitSet capability;
public boolean associated;
- public ArrayList<RadioChainInfo> radioChainInfos;
+ public List<RadioChainInfo> radioChainInfos;
/** public constructor */
public NativeScanResult() { }