diff options
author | Etan Cohen <etancohen@google.com> | 2019-12-10 16:53:47 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2019-12-10 16:53:47 +0000 |
commit | b55d1a801204295e9b979a2a358bf306190bf4e6 (patch) | |
tree | 97cff9481ce6c4c87caba92315ec9dcc2e881d8d /service | |
parent | 76eb68da2494199b9aff9497baab273d7a914370 (diff) | |
parent | 324c2515179766a346f6f19160d2daf17d0d9153 (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')
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() { } |