WifiNative.java revision d39ac242d0a0af8f43657327ece788c97a0644d3
1155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande/* 2155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Copyright (C) 2008 The Android Open Source Project 3155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * 4155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Licensed under the Apache License, Version 2.0 (the "License"); 5155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * you may not use this file except in compliance with the License. 6155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * You may obtain a copy of the License at 7155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * 8155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * http://www.apache.org/licenses/LICENSE-2.0 9155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * 10155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Unless required by applicable law or agreed to in writing, software 11155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * distributed under the License is distributed on an "AS IS" BASIS, 12155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * See the License for the specific language governing permissions and 14155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * limitations under the License. 15155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 16155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 17155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandepackage com.android.server.wifi; 18155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 19c7685b40d77b12820c5b04013592834025086cefRoshan Piusimport android.annotation.NonNull; 2068cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wangimport android.annotation.Nullable; 21e1dab7a2e3ab5911f812a302b4beed1f6eb5aba7Paul Jensenimport android.net.apf.ApfCapabilities; 2270603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wangimport android.net.wifi.IApInterface; 2370603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wangimport android.net.wifi.IClientInterface; 24143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpandeimport android.net.wifi.RttManager; 2568cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wangimport android.net.wifi.RttManager.ResponderConfig; 26e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapndeimport android.net.wifi.ScanResult; 27dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalleimport android.net.wifi.WifiConfiguration; 28e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapndeimport android.net.wifi.WifiScanner; 292a6d76f0899289cd3b96e3428f02076fdbc0363eMitchell Willsimport android.net.wifi.WifiWakeReasonAndCounts; 30f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalleimport android.os.SystemClock; 31155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeimport android.util.Log; 32ce1de180e7652e2b2313b401451ca3d9d027b372Roshan Piusimport android.util.Pair; 33a26a8b33616c94859ba33f33403794cf636baa54Roshan Piusimport android.util.SparseArray; 34fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski 3509b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawalimport com.android.internal.annotations.Immutable; 360fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawalimport com.android.internal.util.HexDump; 37c55e88163b223db0ca6a99ed6ffe91845c30a576Prerepa Viswanadhamimport com.android.server.connectivity.KeepalivePacketData; 38590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tanimport com.android.server.wifi.util.FrameParser; 39fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski 400fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawalimport java.io.PrintWriter; 410fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawalimport java.io.StringWriter; 425cfd8d8b9f241dcad874125a1b5538ee0d6860fexinheimport java.nio.ByteBuffer; 435cfd8d8b9f241dcad874125a1b5538ee0d6860fexinheimport java.nio.CharBuffer; 445cfd8d8b9f241dcad874125a1b5538ee0d6860fexinheimport java.nio.charset.CharacterCodingException; 455cfd8d8b9f241dcad874125a1b5538ee0d6860fexinheimport java.nio.charset.CharsetDecoder; 465cfd8d8b9f241dcad874125a1b5538ee0d6860fexinheimport java.nio.charset.StandardCharsets; 47eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawalimport java.text.SimpleDateFormat; 48155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeimport java.util.ArrayList; 49eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawalimport java.util.Date; 50fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowskiimport java.util.Map; 511bf983a4211f547593a60523e43112ecdb5c8997Roshan Piusimport java.util.Objects; 529ec71f6499e0e3d6f52310a41ff4a59d2fa4f8b2Mitchell Willsimport java.util.Set; 53eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawalimport java.util.TimeZone; 5418786eca942042388748b0d98979f21c9dff4a89Mitchell Wills 55fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski 56155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande/** 57155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Native calls for bring up/shut down of the supplicant daemon and for 58155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * sending requests to the supplicant daemon 59155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * 60155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * {@hide} 61155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 62155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandepublic class WifiNative { 6318786eca942042388748b0d98979f21c9dff4a89Mitchell Wills private final String mTAG; 6418786eca942042388748b0d98979f21c9dff4a89Mitchell Wills private final String mInterfaceName; 65b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius private final SupplicantStaIfaceHal mSupplicantStaIfaceHal; 66b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius private final WifiVendorHal mWifiVendorHal; 67b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius private final WificondControl mWificondControl; 68b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius 69b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius public WifiNative(String interfaceName, WifiVendorHal vendorHal, 70163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius SupplicantStaIfaceHal staIfaceHal, WificondControl condControl) { 71155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mTAG = "WifiNative-" + interfaceName; 72b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius mInterfaceName = interfaceName; 73b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius mWifiVendorHal = vendorHal; 74b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius mSupplicantStaIfaceHal = staIfaceHal; 75b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius mWificondControl = condControl; 76155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 77155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 7818786eca942042388748b0d98979f21c9dff4a89Mitchell Wills public String getInterfaceName() { 7918786eca942042388748b0d98979f21c9dff4a89Mitchell Wills return mInterfaceName; 80e26ad459b63271548abbdeba4f8d77fcca9f88bdxinhe } 81e26ad459b63271548abbdeba4f8d77fcca9f88bdxinhe 82b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 83b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Enable verbose logging for all sub modules. 84b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 85b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius public void enableVerboseLogging(int verbose) { 86b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius mWificondControl.enableVerboseLogging(verbose > 0 ? true : false); 87b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius mSupplicantStaIfaceHal.enableVerboseLogging(verbose > 0); 88b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius mWifiVendorHal.enableVerboseLogging(verbose > 0); 89ed9938883ae2dade81c8be6cd6ceaef3febd5239vandwalle } 90ed9938883ae2dade81c8be6cd6ceaef3febd5239vandwalle 91b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /******************************************************** 92b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Native Initialization/Deinitialization 93b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius ********************************************************/ 94ce1de180e7652e2b2313b401451ca3d9d027b372Roshan Pius public static final int SETUP_SUCCESS = 0; 95ce1de180e7652e2b2313b401451ca3d9d027b372Roshan Pius public static final int SETUP_FAILURE_HAL = 1; 96ce1de180e7652e2b2313b401451ca3d9d027b372Roshan Pius public static final int SETUP_FAILURE_WIFICOND = 2; 97155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 9870603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang /** 993a0679d411c5eb889d38ed32181446c82d5bd825Roshan Pius * Setup wifi native for Client mode operations. 1003a0679d411c5eb889d38ed32181446c82d5bd825Roshan Pius * 1013a0679d411c5eb889d38ed32181446c82d5bd825Roshan Pius * 1. Starts the Wifi HAL and configures it in client/STA mode. 1023a0679d411c5eb889d38ed32181446c82d5bd825Roshan Pius * 2. Setup Wificond to operate in client mode and retrieve the handle to use for client 1033a0679d411c5eb889d38ed32181446c82d5bd825Roshan Pius * operations. 1043a0679d411c5eb889d38ed32181446c82d5bd825Roshan Pius * 105ce1de180e7652e2b2313b401451ca3d9d027b372Roshan Pius * @return Pair of <Integer, IClientInterface> to indicate the status and the associated wificond 106ce1de180e7652e2b2313b401451ca3d9d027b372Roshan Pius * client interface binder handler (will be null on failure). 10770603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang */ 108c7685b40d77b12820c5b04013592834025086cefRoshan Pius public Pair<Integer, IClientInterface> setupForClientMode(@NonNull String ifaceName) { 1098131b04dc799cb0c75240c7b9eb0517ba1f00be8Roshan Pius if (!startHalIfNecessary(true)) { 110b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius Log.e(mTAG, "Failed to start HAL for client mode"); 111ce1de180e7652e2b2313b401451ca3d9d027b372Roshan Pius return Pair.create(SETUP_FAILURE_HAL, null); 11270603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang } 1137065d8fb5b3b814d9f15d053b3a30f4543164baeRoshan Pius IClientInterface iClientInterface = mWificondControl.setupInterfaceForClientMode(ifaceName); 114ce1de180e7652e2b2313b401451ca3d9d027b372Roshan Pius if (iClientInterface == null) { 115ce1de180e7652e2b2313b401451ca3d9d027b372Roshan Pius return Pair.create(SETUP_FAILURE_WIFICOND, null); 116ce1de180e7652e2b2313b401451ca3d9d027b372Roshan Pius } 117ce1de180e7652e2b2313b401451ca3d9d027b372Roshan Pius return Pair.create(SETUP_SUCCESS, iClientInterface); 11870603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang } 119155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 12070603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang /** 1213a0679d411c5eb889d38ed32181446c82d5bd825Roshan Pius * Setup wifi native for AP mode operations. 1223a0679d411c5eb889d38ed32181446c82d5bd825Roshan Pius * 1233a0679d411c5eb889d38ed32181446c82d5bd825Roshan Pius * 1. Starts the Wifi HAL and configures it in AP mode. 1243a0679d411c5eb889d38ed32181446c82d5bd825Roshan Pius * 2. Setup Wificond to operate in AP mode and retrieve the handle to use for ap operations. 1253a0679d411c5eb889d38ed32181446c82d5bd825Roshan Pius * 126ce1de180e7652e2b2313b401451ca3d9d027b372Roshan Pius * @return Pair of <Integer, IApInterface> to indicate the status and the associated wificond 127ce1de180e7652e2b2313b401451ca3d9d027b372Roshan Pius * AP interface binder handler (will be null on failure). 1283a0679d411c5eb889d38ed32181446c82d5bd825Roshan Pius */ 129c7685b40d77b12820c5b04013592834025086cefRoshan Pius public Pair<Integer, IApInterface> setupForSoftApMode(@NonNull String ifaceName) { 1308131b04dc799cb0c75240c7b9eb0517ba1f00be8Roshan Pius if (!startHalIfNecessary(false)) { 131b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius Log.e(mTAG, "Failed to start HAL for AP mode"); 132ce1de180e7652e2b2313b401451ca3d9d027b372Roshan Pius return Pair.create(SETUP_FAILURE_HAL, null); 133ce1de180e7652e2b2313b401451ca3d9d027b372Roshan Pius } 1347065d8fb5b3b814d9f15d053b3a30f4543164baeRoshan Pius IApInterface iApInterface = mWificondControl.setupInterfaceForSoftApMode(ifaceName); 135ce1de180e7652e2b2313b401451ca3d9d027b372Roshan Pius if (iApInterface == null) { 136ce1de180e7652e2b2313b401451ca3d9d027b372Roshan Pius return Pair.create(SETUP_FAILURE_WIFICOND, null); 13770603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang } 138ce1de180e7652e2b2313b401451ca3d9d027b372Roshan Pius return Pair.create(SETUP_SUCCESS, iApInterface); 13970603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang } 14070603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang 14170603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang /** 1423a0679d411c5eb889d38ed32181446c82d5bd825Roshan Pius * Teardown all mode configurations in wifi native. 1433a0679d411c5eb889d38ed32181446c82d5bd825Roshan Pius * 1448e03a147b1d9ca721e1fe4f95b6b67491cfd7084Etan Cohen * 1. Stops the Wifi HAL. 1458e03a147b1d9ca721e1fe4f95b6b67491cfd7084Etan Cohen * 2. Tears down all the interfaces from Wificond. 1463a0679d411c5eb889d38ed32181446c82d5bd825Roshan Pius */ 1477130816d6c62e07d6d41150805515d7fd56f1f0dRoshan Pius public void tearDown() { 1488e03a147b1d9ca721e1fe4f95b6b67491cfd7084Etan Cohen stopHalIfNecessary(); 1493a0679d411c5eb889d38ed32181446c82d5bd825Roshan Pius if (!mWificondControl.tearDownInterfaces()) { 1503a0679d411c5eb889d38ed32181446c82d5bd825Roshan Pius // TODO(b/34859006): Handle failures. 151b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius Log.e(mTAG, "Failed to teardown interfaces from Wificond"); 1523a0679d411c5eb889d38ed32181446c82d5bd825Roshan Pius } 15370603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang } 15470603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang 155d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius /** 156d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius * TODO(b/69426063): NEW API Surface for interface management. This will eventually 157d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius * deprecate the other interface management API's above. But, for now there will be 158d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius * some duplication to ease transition. 159d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius */ 160d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius /** 161d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius * Initialize the native modules. 162d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius * 163d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius * @return true on success, false otherwise. 164d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius */ 165d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius public boolean initialize() { 166d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius return false; 167d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius } 168d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius 169d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius /** 170d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius * Callback to notify when the status of one of the native daemons 171d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius * (wificond, wpa_supplicant & vendor HAL) changes. 172d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius */ 173d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius public interface StatusListener { 174d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius /** 175d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius * @param allReady Indicates if all the native daemons are ready for operation or not. 176d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius */ 177d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius void onStatusChanged(boolean allReady); 178d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius } 179d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius 180d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius /** 181d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius * Register a StatusListener to get notified about any status changes from the native daemons. 182d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius * 183d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius * It is safe to re-register the same callback object - duplicates are detected and only a 184d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius * single copy kept. 185d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius * 186d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius * @param listener StatusListener listener object. 187d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius */ 188d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius public void registerStatusListener(@NonNull StatusListener listener) { 189d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius } 190d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius 191d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius /** 192d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius * Callback to notify when the associated interface is destroyed, up or down. 193d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius */ 194d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius public interface InterfaceCallback { 195d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius /** 196d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius * Interface destroyed by HalDeviceManager. 197d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius * 198d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius * @param ifaceName Name of the iface. 199d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius */ 200d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius void onDestroyed(String ifaceName); 201d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius 202d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius /** 203d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius * Interface is up. 204d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius * 205d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius * @param ifaceName Name of the iface. 206d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius */ 207d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius void onUp(String ifaceName); 208d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius 209d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius /** 210d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius * Interface is down. 211d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius * 212d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius * @param ifaceName Name of the iface. 213d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius */ 214d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius void onDown(String ifaceName); 215d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius } 216d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius 217d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius /** 218d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius * Setup an interface for Client mode operations. 219d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius * 220d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius * This method configures an interface in STA mode in all the native daemons 221d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius * (wificond, wpa_supplicant & vendor HAL). 222d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius * 223d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius * @param interfaceCallback Associated callback for notifying status changes for the iface. 224d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius * @return Returns the name of the allocated interface, will be null on failure. 225d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius */ 226d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius public String setupInterfaceForClientMode(@NonNull InterfaceCallback interfaceCallback) { 227d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius return null; 228d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius } 229d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius 230d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius /** 231d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius * Setup an interface for Soft AP mode operations. 232d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius * 233d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius * This method configures an interface in AP mode in all the native daemons 234d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius * (wificond, wpa_supplicant & vendor HAL). 235d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius * 236d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius * @param interfaceCallback Associated callback for notifying status changes for the iface. 237d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius * @return Returns the name of the allocated interface, will be null on failure. 238d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius */ 239d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius public String setupInterfaceForSoftApMode(@NonNull InterfaceCallback interfaceCallback) { 240d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius return null; 241d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius } 242d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius 243d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius /** 244d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius * Teardown an interface in Client/AP mode. 245d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius * 246d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius * This method tears down the associated interface from all the native daemons 247d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius * (wificond, wpa_supplicant & vendor HAL). 248d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius * 249d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius * @param ifaceName Name of the interface. 250d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius */ 251d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius public void teardownInterface(@NonNull String ifaceName) { 252d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius } 253d39ac242d0a0af8f43657327ece788c97a0644d3Roshan Pius 254b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /******************************************************** 255b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Wificond operations 256b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius ********************************************************/ 257b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 258b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Result of a signal poll. 259b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 260b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius public static class SignalPollResult { 261b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius // RSSI value in dBM. 262b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius public int currentRssi; 263b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius //Transmission bit rate in Mbps. 264b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius public int txBitrate; 265b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius // Association frequency in MHz. 266b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius public int associationFrequency; 267b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius } 268b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius 269b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 270b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * WiFi interface transimission counters. 271b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 272b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius public static class TxPacketCounters { 273b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius // Number of successfully transmitted packets. 274b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius public int txSucceeded; 275b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius // Number of tramsmission failures. 276b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius public int txFailed; 277b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius } 278b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius 27970603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang /** 28055dd51a9f9df48a7b92a57f9c969d256c98d33a7Roshan Pius * Callback to notify wificond death. 28155dd51a9f9df48a7b92a57f9c969d256c98d33a7Roshan Pius */ 28255dd51a9f9df48a7b92a57f9c969d256c98d33a7Roshan Pius public interface WificondDeathEventHandler { 28355dd51a9f9df48a7b92a57f9c969d256c98d33a7Roshan Pius /** 28455dd51a9f9df48a7b92a57f9c969d256c98d33a7Roshan Pius * Invoked when the wificond dies. 28555dd51a9f9df48a7b92a57f9c969d256c98d33a7Roshan Pius */ 28655dd51a9f9df48a7b92a57f9c969d256c98d33a7Roshan Pius void onDeath(); 28755dd51a9f9df48a7b92a57f9c969d256c98d33a7Roshan Pius } 28855dd51a9f9df48a7b92a57f9c969d256c98d33a7Roshan Pius 28955dd51a9f9df48a7b92a57f9c969d256c98d33a7Roshan Pius /** 29055dd51a9f9df48a7b92a57f9c969d256c98d33a7Roshan Pius * Registers a death notification for wificond. 29155dd51a9f9df48a7b92a57f9c969d256c98d33a7Roshan Pius * @return Returns true on success. 29255dd51a9f9df48a7b92a57f9c969d256c98d33a7Roshan Pius */ 29355dd51a9f9df48a7b92a57f9c969d256c98d33a7Roshan Pius public boolean registerWificondDeathHandler(@NonNull WificondDeathEventHandler handler) { 29455dd51a9f9df48a7b92a57f9c969d256c98d33a7Roshan Pius return mWificondControl.registerDeathHandler(handler); 29555dd51a9f9df48a7b92a57f9c969d256c98d33a7Roshan Pius } 29655dd51a9f9df48a7b92a57f9c969d256c98d33a7Roshan Pius 29755dd51a9f9df48a7b92a57f9c969d256c98d33a7Roshan Pius /** 29855dd51a9f9df48a7b92a57f9c969d256c98d33a7Roshan Pius * Deregisters a death notification for wificond. 29955dd51a9f9df48a7b92a57f9c969d256c98d33a7Roshan Pius * @return Returns true on success. 30055dd51a9f9df48a7b92a57f9c969d256c98d33a7Roshan Pius */ 30155dd51a9f9df48a7b92a57f9c969d256c98d33a7Roshan Pius public boolean deregisterWificondDeathHandler() { 30255dd51a9f9df48a7b92a57f9c969d256c98d33a7Roshan Pius return mWificondControl.deregisterDeathHandler(); 30355dd51a9f9df48a7b92a57f9c969d256c98d33a7Roshan Pius } 30455dd51a9f9df48a7b92a57f9c969d256c98d33a7Roshan Pius 30555dd51a9f9df48a7b92a57f9c969d256c98d33a7Roshan Pius /** 30670603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang * Disable wpa_supplicant via wificond. 30770603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang * @return Returns true on success. 30870603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang */ 30970603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang public boolean disableSupplicant() { 31070603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang return mWificondControl.disableSupplicant(); 31170603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang } 31270603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang 31370603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang /** 31470603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang * Enable wpa_supplicant via wificond. 31570603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang * @return Returns true on success. 31670603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang */ 31770603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang public boolean enableSupplicant() { 31870603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang return mWificondControl.enableSupplicant(); 31970603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang } 32018786eca942042388748b0d98979f21c9dff4a89Mitchell Wills 321d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang /** 322d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang * Request signal polling to wificond. 323d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang * Returns an SignalPollResult object. 324d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang * Returns null on failure. 325d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang */ 326d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang public SignalPollResult signalPoll() { 32791375b39b0fdd6b9c692a5d48120673ee472e3ffRoshan Pius return mWificondControl.signalPoll(mInterfaceName); 328d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang } 329d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang 330d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang /** 331d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang * Fetch TX packet counters on current connection from wificond. 332d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang * Returns an TxPacketCounters object. 333d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang * Returns null on failure. 334d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang */ 335d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang public TxPacketCounters getTxPacketCounters() { 33691375b39b0fdd6b9c692a5d48120673ee472e3ffRoshan Pius return mWificondControl.getTxPacketCounters(mInterfaceName); 337d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang } 338d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang 33924250365afbd9a20b2e03364eddf2025c8f1138aRoshan Pius /** 340a70c07d019065187112945c091fc2e924af18980Roshan Pius * Query the list of valid frequencies for the provided band. 341a70c07d019065187112945c091fc2e924af18980Roshan Pius * The result depends on the on the country code that has been set. 342a70c07d019065187112945c091fc2e924af18980Roshan Pius * 343a70c07d019065187112945c091fc2e924af18980Roshan Pius * @param band as specified by one of the WifiScanner.WIFI_BAND_* constants. 344a70c07d019065187112945c091fc2e924af18980Roshan Pius * The following bands are supported: 345a70c07d019065187112945c091fc2e924af18980Roshan Pius * WifiScanner.WIFI_BAND_24_GHZ 346a70c07d019065187112945c091fc2e924af18980Roshan Pius * WifiScanner.WIFI_BAND_5_GHZ 347a70c07d019065187112945c091fc2e924af18980Roshan Pius * WifiScanner.WIFI_BAND_5_GHZ_DFS_ONLY 348a70c07d019065187112945c091fc2e924af18980Roshan Pius * @return frequencies vector of valid frequencies (MHz), or null for error. 349a70c07d019065187112945c091fc2e924af18980Roshan Pius * @throws IllegalArgumentException if band is not recognized. 350a70c07d019065187112945c091fc2e924af18980Roshan Pius */ 351a70c07d019065187112945c091fc2e924af18980Roshan Pius public int [] getChannelsForBand(int band) { 352a70c07d019065187112945c091fc2e924af18980Roshan Pius return mWificondControl.getChannelsForBand(band); 353a70c07d019065187112945c091fc2e924af18980Roshan Pius } 354a70c07d019065187112945c091fc2e924af18980Roshan Pius 355a70c07d019065187112945c091fc2e924af18980Roshan Pius /** 356b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Start a scan using wificond for the given parameters. 357b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param freqs list of frequencies to scan for, if null scan all supported channels. 358b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param hiddenNetworkSSIDs List of hidden networks to be scanned for. 359b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return Returns true on success. 36024250365afbd9a20b2e03364eddf2025c8f1138aRoshan Pius */ 361b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius public boolean scan(Set<Integer> freqs, Set<String> hiddenNetworkSSIDs) { 36291375b39b0fdd6b9c692a5d48120673ee472e3ffRoshan Pius return mWificondControl.scan(mInterfaceName, freqs, hiddenNetworkSSIDs); 363155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 364155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 36518786eca942042388748b0d98979f21c9dff4a89Mitchell Wills /** 366b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Fetch the latest scan result from kernel via wificond. 367b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return Returns an ArrayList of ScanDetail. 368b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Returns an empty ArrayList on failure. 36918786eca942042388748b0d98979f21c9dff4a89Mitchell Wills */ 370b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius public ArrayList<ScanDetail> getScanResults() { 37191375b39b0fdd6b9c692a5d48120673ee472e3ffRoshan Pius return mWificondControl.getScanResults( 37291375b39b0fdd6b9c692a5d48120673ee472e3ffRoshan Pius mInterfaceName, WificondControl.SCAN_TYPE_SINGLE_SCAN); 37371c4c2a898a827a867564159ce78e41aedd2295bSohani Rao } 37471c4c2a898a827a867564159ce78e41aedd2295bSohani Rao 37571c4c2a898a827a867564159ce78e41aedd2295bSohani Rao /** 37671c4c2a898a827a867564159ce78e41aedd2295bSohani Rao * Fetch the latest scan result from kernel via wificond. 37771c4c2a898a827a867564159ce78e41aedd2295bSohani Rao * @return Returns an ArrayList of ScanDetail. 37871c4c2a898a827a867564159ce78e41aedd2295bSohani Rao * Returns an empty ArrayList on failure. 37971c4c2a898a827a867564159ce78e41aedd2295bSohani Rao */ 38071c4c2a898a827a867564159ce78e41aedd2295bSohani Rao public ArrayList<ScanDetail> getPnoScanResults() { 38191375b39b0fdd6b9c692a5d48120673ee472e3ffRoshan Pius return mWificondControl.getScanResults(mInterfaceName, WificondControl.SCAN_TYPE_PNO_SCAN); 382155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 383155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 384b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 385b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Start PNO scan. 386b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param pnoSettings Pno scan configuration. 387b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return true on success. 38818786eca942042388748b0d98979f21c9dff4a89Mitchell Wills */ 389b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius public boolean startPnoScan(PnoSettings pnoSettings) { 39091375b39b0fdd6b9c692a5d48120673ee472e3ffRoshan Pius return mWificondControl.startPnoScan(mInterfaceName, pnoSettings); 391155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 392155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 393b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 394b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Stop PNO scan. 395b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return true on success. 396b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 397b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius public boolean stopPnoScan() { 39891375b39b0fdd6b9c692a5d48120673ee472e3ffRoshan Pius return mWificondControl.stopPnoScan(mInterfaceName); 39918786eca942042388748b0d98979f21c9dff4a89Mitchell Wills } 40018786eca942042388748b0d98979f21c9dff4a89Mitchell Wills 401045079df57626fd6a8b94ac19fcdb0540b508c19Roshan Pius /** 402045079df57626fd6a8b94ac19fcdb0540b508c19Roshan Pius * Callbacks for SoftAp interface. 403045079df57626fd6a8b94ac19fcdb0540b508c19Roshan Pius */ 404045079df57626fd6a8b94ac19fcdb0540b508c19Roshan Pius public interface SoftApListener { 405045079df57626fd6a8b94ac19fcdb0540b508c19Roshan Pius /** 406045079df57626fd6a8b94ac19fcdb0540b508c19Roshan Pius * Invoked when the number of associated stations changes. 407045079df57626fd6a8b94ac19fcdb0540b508c19Roshan Pius */ 408045079df57626fd6a8b94ac19fcdb0540b508c19Roshan Pius void onNumAssociatedStationsChanged(int numStations); 409045079df57626fd6a8b94ac19fcdb0540b508c19Roshan Pius } 410045079df57626fd6a8b94ac19fcdb0540b508c19Roshan Pius 411045079df57626fd6a8b94ac19fcdb0540b508c19Roshan Pius /** 412045079df57626fd6a8b94ac19fcdb0540b508c19Roshan Pius * Start Soft AP operation using the provided configuration. 413045079df57626fd6a8b94ac19fcdb0540b508c19Roshan Pius * 414045079df57626fd6a8b94ac19fcdb0540b508c19Roshan Pius * @param config Configuration to use for the soft ap created. 415045079df57626fd6a8b94ac19fcdb0540b508c19Roshan Pius * @param listener Callback for AP events. 416045079df57626fd6a8b94ac19fcdb0540b508c19Roshan Pius * @return true on success, false otherwise. 417045079df57626fd6a8b94ac19fcdb0540b508c19Roshan Pius */ 418045079df57626fd6a8b94ac19fcdb0540b508c19Roshan Pius public boolean startSoftAp(WifiConfiguration config, SoftApListener listener) { 41991375b39b0fdd6b9c692a5d48120673ee472e3ffRoshan Pius return mWificondControl.startSoftAp(mInterfaceName, config, listener); 420045079df57626fd6a8b94ac19fcdb0540b508c19Roshan Pius } 421045079df57626fd6a8b94ac19fcdb0540b508c19Roshan Pius 422045079df57626fd6a8b94ac19fcdb0540b508c19Roshan Pius /** 423045079df57626fd6a8b94ac19fcdb0540b508c19Roshan Pius * Stop the ongoing Soft AP operation. 424045079df57626fd6a8b94ac19fcdb0540b508c19Roshan Pius * 425045079df57626fd6a8b94ac19fcdb0540b508c19Roshan Pius * @return true on success, false otherwise. 426045079df57626fd6a8b94ac19fcdb0540b508c19Roshan Pius */ 427045079df57626fd6a8b94ac19fcdb0540b508c19Roshan Pius public boolean stopSoftAp() { 42891375b39b0fdd6b9c692a5d48120673ee472e3ffRoshan Pius return mWificondControl.stopSoftAp(mInterfaceName); 429045079df57626fd6a8b94ac19fcdb0540b508c19Roshan Pius } 430045079df57626fd6a8b94ac19fcdb0540b508c19Roshan Pius 431b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /******************************************************** 432b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Supplicant operations 433b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius ********************************************************/ 434f3aae0be78cd02f5fedd7d99b73536d2c799b030Roshan Pius 435f3aae0be78cd02f5fedd7d99b73536d2c799b030Roshan Pius /** 436fd95a68590a4dcc82734e42b85898c953d21dbf7Roshan Pius * Callback to notify supplicant death. 437fd95a68590a4dcc82734e42b85898c953d21dbf7Roshan Pius */ 438fd95a68590a4dcc82734e42b85898c953d21dbf7Roshan Pius public interface SupplicantDeathEventHandler { 439fd95a68590a4dcc82734e42b85898c953d21dbf7Roshan Pius /** 440fd95a68590a4dcc82734e42b85898c953d21dbf7Roshan Pius * Invoked when the supplicant dies. 441fd95a68590a4dcc82734e42b85898c953d21dbf7Roshan Pius */ 442fd95a68590a4dcc82734e42b85898c953d21dbf7Roshan Pius void onDeath(); 443fd95a68590a4dcc82734e42b85898c953d21dbf7Roshan Pius } 444fd95a68590a4dcc82734e42b85898c953d21dbf7Roshan Pius 445fd95a68590a4dcc82734e42b85898c953d21dbf7Roshan Pius /** 446fd95a68590a4dcc82734e42b85898c953d21dbf7Roshan Pius * Registers a death notification for supplicant. 447fd95a68590a4dcc82734e42b85898c953d21dbf7Roshan Pius * @return Returns true on success. 448fd95a68590a4dcc82734e42b85898c953d21dbf7Roshan Pius */ 449fd95a68590a4dcc82734e42b85898c953d21dbf7Roshan Pius public boolean registerSupplicantDeathHandler(@NonNull SupplicantDeathEventHandler handler) { 450fd95a68590a4dcc82734e42b85898c953d21dbf7Roshan Pius return mSupplicantStaIfaceHal.registerDeathHandler(handler); 451fd95a68590a4dcc82734e42b85898c953d21dbf7Roshan Pius } 452fd95a68590a4dcc82734e42b85898c953d21dbf7Roshan Pius 453fd95a68590a4dcc82734e42b85898c953d21dbf7Roshan Pius /** 454b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius * This method is called repeatedly until the connection to wpa_supplicant is 455b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius * established and a STA iface is setup. 456f3aae0be78cd02f5fedd7d99b73536d2c799b030Roshan Pius * 457b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return true if connection is established, false otherwise. 458b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * TODO: Add unit tests for these once we remove the legacy code. 459f3aae0be78cd02f5fedd7d99b73536d2c799b030Roshan Pius */ 460163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius public boolean connectToSupplicant() { 461b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius // Start initialization if not already started. 462b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius if (!mSupplicantStaIfaceHal.isInitializationStarted() 463b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius && !mSupplicantStaIfaceHal.initialize()) { 464b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius return false; 4655cf97c9b13cc06554c8901e63d55ba051b7e7881Roshan Pius } 466b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius // Check if the initialization is complete. 467b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius if (!mSupplicantStaIfaceHal.isInitializationComplete()) { 468b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius return false; 469b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius } 470b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius // Setup the STA iface once connection is established. 471b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius return mSupplicantStaIfaceHal.setupIface(mInterfaceName); 472ad7319939c424d42fa6a3791c47f613db8ef3cd8vandwalle } 473ad7319939c424d42fa6a3791c47f613db8ef3cd8vandwalle 474b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 475b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Close supplicant connection. 476ed6a985c7b63e295248fa7e8292c99b48b7a4283Mitchell Wills */ 477b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius public void closeSupplicantConnection() { 478b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius // Setup the STA iface once connection is established. 479b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius mSupplicantStaIfaceHal.teardownIface(mInterfaceName); 480155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 481155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 482782eac0bacec797262eb4d721ad58cfcf2fbf885Tomasz Wiszkowski /** 483b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Set supplicant log level 484782eac0bacec797262eb4d721ad58cfcf2fbf885Tomasz Wiszkowski * 485b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param turnOnVerbose Whether to turn on verbose logging or not. 486782eac0bacec797262eb4d721ad58cfcf2fbf885Tomasz Wiszkowski */ 487b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius public void setSupplicantLogLevel(boolean turnOnVerbose) { 488f2e03411f137f55940a8f3592e96a272585bd7ddRoshan Pius mSupplicantStaIfaceHal.setLogLevel(turnOnVerbose); 489e3831b70d4a8a967fe8df5496d542a432692c434Roshan Pius } 490e3831b70d4a8a967fe8df5496d542a432692c434Roshan Pius 49138a6c1ba5d461b8c7b11685c5dd2e98d9e106b55Roshan Pius /** 492b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Trigger a reconnection if the iface is disconnected. 493b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 494b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return true if request is sent successfully, false otherwise. 49538a6c1ba5d461b8c7b11685c5dd2e98d9e106b55Roshan Pius */ 496b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius public boolean reconnect() { 497b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius return mSupplicantStaIfaceHal.reconnect(mInterfaceName); 498f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle } 4999d7489491984e86915b2cf4fac38a882de1c8cdbRoshan Pius 5009d7489491984e86915b2cf4fac38a882de1c8cdbRoshan Pius /** 501b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Trigger a reassociation even if the iface is currently connected. 502b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 503b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return true if request is sent successfully, false otherwise. 5049d7489491984e86915b2cf4fac38a882de1c8cdbRoshan Pius */ 505155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public boolean reassociate() { 506b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius return mSupplicantStaIfaceHal.reassociate(mInterfaceName); 507155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 508155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 509155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 510b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Trigger a disconnection from the currently connected network. 511b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 512b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return true if request is sent successfully, false otherwise. 513b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 514b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius public boolean disconnect() { 515b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius return mSupplicantStaIfaceHal.disconnect(mInterfaceName); 51677f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist } 51777f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist 518155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 519b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Makes a callback to HIDL to getMacAddress from supplicant 520b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 521b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return string containing the MAC address, or null on a failed call 522b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 523b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius public String getMacAddress() { 524b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius return mSupplicantStaIfaceHal.getMacAddress(mInterfaceName); 525446db2d5457456743e4476029e14d7c3bb9f5bccYuhao Zheng } 526446db2d5457456743e4476029e14d7c3bb9f5bccYuhao Zheng 527f2e03411f137f55940a8f3592e96a272585bd7ddRoshan Pius public static final int RX_FILTER_TYPE_V4_MULTICAST = 0; 528f2e03411f137f55940a8f3592e96a272585bd7ddRoshan Pius public static final int RX_FILTER_TYPE_V6_MULTICAST = 1; 529155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 530155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Start filtering out Multicast V4 packets 531155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * @return {@code true} if the operation succeeded, {@code false} otherwise 532155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * 533155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Multicast filtering rules work as follows: 534155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * 535155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * The driver can filter multicast (v4 and/or v6) and broadcast packets when in 536155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * a power optimized mode (typically when screen goes off). 537155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * 538155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * In order to prevent the driver from filtering the multicast/broadcast packets, we have to 539155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * add a DRIVER RXFILTER-ADD rule followed by DRIVER RXFILTER-START to make the rule effective 540155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * 541155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * DRIVER RXFILTER-ADD Num 542155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * where Num = 0 - Unicast, 1 - Broadcast, 2 - Mutil4 or 3 - Multi6 543155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * 544155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * and DRIVER RXFILTER-START 545155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * In order to stop the usage of these rules, we do 546155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * 547155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * DRIVER RXFILTER-STOP 548155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * DRIVER RXFILTER-REMOVE Num 549155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * where Num is as described for RXFILTER-ADD 550155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * 551155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * The SETSUSPENDOPT driver command overrides the filtering rules 552155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 553155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public boolean startFilteringMulticastV4Packets() { 554b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius return mSupplicantStaIfaceHal.stopRxFilter(mInterfaceName) 555b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius && mSupplicantStaIfaceHal.removeRxFilter( 556b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius mInterfaceName, RX_FILTER_TYPE_V4_MULTICAST) 557b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius && mSupplicantStaIfaceHal.startRxFilter(mInterfaceName); 558155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 559155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 560155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 561155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Stop filtering out Multicast V4 packets. 562155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * @return {@code true} if the operation succeeded, {@code false} otherwise 563155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 564155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public boolean stopFilteringMulticastV4Packets() { 565b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius return mSupplicantStaIfaceHal.stopRxFilter(mInterfaceName) 566b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius && mSupplicantStaIfaceHal.addRxFilter( 567b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius mInterfaceName, RX_FILTER_TYPE_V4_MULTICAST) 568b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius && mSupplicantStaIfaceHal.startRxFilter(mInterfaceName); 569155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 570155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 571155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 572155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Start filtering out Multicast V6 packets 573155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * @return {@code true} if the operation succeeded, {@code false} otherwise 574155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 575155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public boolean startFilteringMulticastV6Packets() { 576b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius return mSupplicantStaIfaceHal.stopRxFilter(mInterfaceName) 577b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius && mSupplicantStaIfaceHal.removeRxFilter( 578b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius mInterfaceName, RX_FILTER_TYPE_V6_MULTICAST) 579b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius && mSupplicantStaIfaceHal.startRxFilter(mInterfaceName); 580155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 581155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 582155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 583155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Stop filtering out Multicast V6 packets. 584155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * @return {@code true} if the operation succeeded, {@code false} otherwise 585155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 586155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public boolean stopFilteringMulticastV6Packets() { 587b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius return mSupplicantStaIfaceHal.stopRxFilter(mInterfaceName) 588b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius && mSupplicantStaIfaceHal.addRxFilter( 589b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius mInterfaceName, RX_FILTER_TYPE_V6_MULTICAST) 590b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius && mSupplicantStaIfaceHal.startRxFilter(mInterfaceName); 591155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 592155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 593f2e03411f137f55940a8f3592e96a272585bd7ddRoshan Pius public static final int BLUETOOTH_COEXISTENCE_MODE_ENABLED = 0; 594f2e03411f137f55940a8f3592e96a272585bd7ddRoshan Pius public static final int BLUETOOTH_COEXISTENCE_MODE_DISABLED = 1; 595f2e03411f137f55940a8f3592e96a272585bd7ddRoshan Pius public static final int BLUETOOTH_COEXISTENCE_MODE_SENSE = 2; 5967ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde /** 5977ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde * Sets the bluetooth coexistence mode. 5987ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde * 5997ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde * @param mode One of {@link #BLUETOOTH_COEXISTENCE_MODE_DISABLED}, 6007ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde * {@link #BLUETOOTH_COEXISTENCE_MODE_ENABLED}, or 6017ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde * {@link #BLUETOOTH_COEXISTENCE_MODE_SENSE}. 6027ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde * @return Whether the mode was successfully set. 6037ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde */ 604155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public boolean setBluetoothCoexistenceMode(int mode) { 605b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius return mSupplicantStaIfaceHal.setBtCoexistenceMode(mInterfaceName, mode); 606155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 607155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 608155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 609155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Enable or disable Bluetooth coexistence scan mode. When this mode is on, 610155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * some of the low-level scan parameters used by the driver are changed to 611155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * reduce interference with A2DP streaming. 612155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * 613cc180872c51908b15ce5cbf834634ff323e036bcChristopher Wiley * @param setCoexScanMode whether to enable or disable this mode 614155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * @return {@code true} if the command succeeded, {@code false} otherwise. 615155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 616155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public boolean setBluetoothCoexistenceScanMode(boolean setCoexScanMode) { 617b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius return mSupplicantStaIfaceHal.setBtCoexistenceScanModeEnabled( 618b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius mInterfaceName, setCoexScanMode); 619155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 620155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 621b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 622b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Enable or disable suspend mode optimizations. 623b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 624b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param enabled true to enable, false otherwise. 625b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return true if request is sent successfully, false otherwise. 626b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 627155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public boolean setSuspendOptimizations(boolean enabled) { 628b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius return mSupplicantStaIfaceHal.setSuspendModeEnabled(mInterfaceName, enabled); 629155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 630155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 6319153bd67d51b305ffdd61355e0748e3c332c2cafRoshan Pius /** 632b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Set country code. 633b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 634b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param countryCode 2 byte ASCII string. For ex: US, CA. 635b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return true if request is sent successfully, false otherwise. 6369153bd67d51b305ffdd61355e0748e3c332c2cafRoshan Pius */ 637b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius public boolean setCountryCode(String countryCode) { 638b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius return mSupplicantStaIfaceHal.setCountryCode(mInterfaceName, countryCode); 63904c453c2e07efc30b99528926f205740226f1c7bNingyuan Wang } 64004c453c2e07efc30b99528926f205740226f1c7bNingyuan Wang 64104c453c2e07efc30b99528926f205740226f1c7bNingyuan Wang /** 642b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Initiate TDLS discover and setup or teardown with the specified peer. 643b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 644b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param macAddr MAC Address of the peer. 645b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param enable true to start discovery and setup, false to teardown. 64604c453c2e07efc30b99528926f205740226f1c7bNingyuan Wang */ 647155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public void startTdls(String macAddr, boolean enable) { 648b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius if (enable) { 649b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius mSupplicantStaIfaceHal.initiateTdlsDiscover(mInterfaceName, macAddr); 650b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius mSupplicantStaIfaceHal.initiateTdlsSetup(mInterfaceName, macAddr); 651155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 652b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius mSupplicantStaIfaceHal.initiateTdlsTeardown(mInterfaceName, macAddr); 653155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 654155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 655155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 656b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 657b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Start WPS pin display operation with the specified peer. 658b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 659b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param bssid BSSID of the peer. 660b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return true if request is sent successfully, false otherwise. 661b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 662155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public boolean startWpsPbc(String bssid) { 663b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius return mSupplicantStaIfaceHal.startWpsPbc(mInterfaceName, bssid); 664155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 665155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 666b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 667b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Start WPS pin keypad operation with the specified pin. 668b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 669b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param pin Pin to be used. 670b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return true if request is sent successfully, false otherwise. 671b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 672155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public boolean startWpsPinKeypad(String pin) { 673b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius return mSupplicantStaIfaceHal.startWpsPinKeypad(mInterfaceName, pin); 674155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 675155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 676b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 677b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Start WPS pin display operation with the specified peer. 678b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 679b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param bssid BSSID of the peer. 680b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return new pin generated on success, null otherwise. 681b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 682155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public String startWpsPinDisplay(String bssid) { 683b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius return mSupplicantStaIfaceHal.startWpsPinDisplay(mInterfaceName, bssid); 684155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 685155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 686b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 687b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Sets whether to use external sim for SIM/USIM processing. 688b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 689b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param external true to enable, false otherwise. 690b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return true if request is sent successfully, false otherwise. 691b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 69233b575ca6bee66183929f9474b5a161432918604Vinit Deshpande public boolean setExternalSim(boolean external) { 693b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius return mSupplicantStaIfaceHal.setExternalSim(mInterfaceName, external); 69433b575ca6bee66183929f9474b5a161432918604Vinit Deshpande } 69533b575ca6bee66183929f9474b5a161432918604Vinit Deshpande 696b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 697b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Sim auth response types. 698b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 699b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius public static final String SIM_AUTH_RESP_TYPE_GSM_AUTH = "GSM-AUTH"; 700b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius public static final String SIM_AUTH_RESP_TYPE_UMTS_AUTH = "UMTS-AUTH"; 701b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius public static final String SIM_AUTH_RESP_TYPE_UMTS_AUTS = "UMTS-AUTS"; 702b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius 703b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 704b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Send the sim auth response for the currently configured network. 705b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 706b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param type |GSM-AUTH|, |UMTS-AUTH| or |UMTS-AUTS|. 707b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param response Response params. 708b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return true if succeeds, false otherwise. 709b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 710f97140d51d14ce0659d381f443c08dbd94dfea28Honore Tricot public boolean simAuthResponse(int id, String type, String response) { 711b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius if (SIM_AUTH_RESP_TYPE_GSM_AUTH.equals(type)) { 712b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius return mSupplicantStaIfaceHal.sendCurrentNetworkEapSimGsmAuthResponse( 713b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius mInterfaceName, response); 714b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius } else if (SIM_AUTH_RESP_TYPE_UMTS_AUTH.equals(type)) { 715b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius return mSupplicantStaIfaceHal.sendCurrentNetworkEapSimUmtsAuthResponse( 716b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius mInterfaceName, response); 717b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius } else if (SIM_AUTH_RESP_TYPE_UMTS_AUTS.equals(type)) { 718b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius return mSupplicantStaIfaceHal.sendCurrentNetworkEapSimUmtsAutsResponse( 719b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius mInterfaceName, response); 7205cf97c9b13cc06554c8901e63d55ba051b7e7881Roshan Pius } else { 721b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius return false; 7225cf97c9b13cc06554c8901e63d55ba051b7e7881Roshan Pius } 72333b575ca6bee66183929f9474b5a161432918604Vinit Deshpande } 72433b575ca6bee66183929f9474b5a161432918604Vinit Deshpande 725b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 726b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Send the eap sim gsm auth failure for the currently configured network. 727b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 728b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return true if succeeds, false otherwise. 729b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 73026eebecc04b55129a902d1e7b670fe05668c14faVinit Deshpande public boolean simAuthFailedResponse(int id) { 731b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius return mSupplicantStaIfaceHal.sendCurrentNetworkEapSimGsmAuthFailure(mInterfaceName); 73226eebecc04b55129a902d1e7b670fe05668c14faVinit Deshpande } 73326eebecc04b55129a902d1e7b670fe05668c14faVinit Deshpande 734b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 735b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Send the eap sim umts auth failure for the currently configured network. 736b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 737b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return true if succeeds, false otherwise. 738b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 73926eebecc04b55129a902d1e7b670fe05668c14faVinit Deshpande public boolean umtsAuthFailedResponse(int id) { 740b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius return mSupplicantStaIfaceHal.sendCurrentNetworkEapSimUmtsAuthFailure(mInterfaceName); 74126eebecc04b55129a902d1e7b670fe05668c14faVinit Deshpande } 74226eebecc04b55129a902d1e7b670fe05668c14faVinit Deshpande 743b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 744b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Send the eap identity response for the currently configured network. 745b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 746b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param response String to send. 747b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return true if succeeds, false otherwise. 748b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 749ad607d99c372160c7d4b38e755e1b47d6419856eHonore Tricot public boolean simIdentityResponse(int id, String response) { 750b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius return mSupplicantStaIfaceHal.sendCurrentNetworkEapIdentityResponse( 751b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius mInterfaceName, response); 752ad607d99c372160c7d4b38e755e1b47d6419856eHonore Tricot } 753ad607d99c372160c7d4b38e755e1b47d6419856eHonore Tricot 754b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 755a1da73ea4926ce8a5689594ff3685b0fe033d99fNingyuan Wang * This get anonymous identity from supplicant and returns it as a string. 756a1da73ea4926ce8a5689594ff3685b0fe033d99fNingyuan Wang * 757a1da73ea4926ce8a5689594ff3685b0fe033d99fNingyuan Wang * @return anonymous identity string if succeeds, null otherwise. 758a1da73ea4926ce8a5689594ff3685b0fe033d99fNingyuan Wang */ 759a1da73ea4926ce8a5689594ff3685b0fe033d99fNingyuan Wang public String getEapAnonymousIdentity() { 760b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius return mSupplicantStaIfaceHal.getCurrentNetworkEapAnonymousIdentity(mInterfaceName); 761a1da73ea4926ce8a5689594ff3685b0fe033d99fNingyuan Wang } 762a1da73ea4926ce8a5689594ff3685b0fe033d99fNingyuan Wang 763a1da73ea4926ce8a5689594ff3685b0fe033d99fNingyuan Wang /** 764b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Start WPS pin registrar operation with the specified peer and pin. 765b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 766b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param bssid BSSID of the peer. 767b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param pin Pin to be used. 768b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return true if request is sent successfully, false otherwise. 769b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 770155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public boolean startWpsRegistrar(String bssid, String pin) { 771b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius return mSupplicantStaIfaceHal.startWpsRegistrar(mInterfaceName, bssid, pin); 772155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 773155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 774b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 775b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Cancels any ongoing WPS requests. 776b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 777b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return true if request is sent successfully, false otherwise. 778b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 779155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public boolean cancelWps() { 780b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius return mSupplicantStaIfaceHal.cancelWps(mInterfaceName); 781155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 782155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 783b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 784b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Set WPS device name. 785b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 786b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param name String to be set. 787b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return true if request is sent successfully, false otherwise. 788b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 789155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public boolean setDeviceName(String name) { 790b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius return mSupplicantStaIfaceHal.setWpsDeviceName(mInterfaceName, name); 791155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 792155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 793b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 794b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Set WPS device type. 795b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 796b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param type Type specified as a string. Used format: <categ>-<OUI>-<subcateg> 797b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return true if request is sent successfully, false otherwise. 798b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 799155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public boolean setDeviceType(String type) { 800b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius return mSupplicantStaIfaceHal.setWpsDeviceType(mInterfaceName, type); 801155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 802155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 803b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 804b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Set WPS config methods 805b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 806b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param cfg List of config methods. 807b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return true if request is sent successfully, false otherwise. 808b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 809155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public boolean setConfigMethods(String cfg) { 810b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius return mSupplicantStaIfaceHal.setWpsConfigMethods(mInterfaceName, cfg); 811155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 812155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 813b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 814b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Set WPS manufacturer. 815b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 816b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param value String to be set. 817b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return true if request is sent successfully, false otherwise. 818b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 819155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public boolean setManufacturer(String value) { 820b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius return mSupplicantStaIfaceHal.setWpsManufacturer(mInterfaceName, value); 821155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 822155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 823b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 824b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Set WPS model name. 825b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 826b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param value String to be set. 827b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return true if request is sent successfully, false otherwise. 828b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 829155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public boolean setModelName(String value) { 830b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius return mSupplicantStaIfaceHal.setWpsModelName(mInterfaceName, value); 831155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 832155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 833b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 834b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Set WPS model number. 835b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 836b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param value String to be set. 837b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return true if request is sent successfully, false otherwise. 838b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 839155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public boolean setModelNumber(String value) { 840b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius return mSupplicantStaIfaceHal.setWpsModelNumber(mInterfaceName, value); 841155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 842155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 843b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 844b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Set WPS serial number. 845b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 846b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param value String to be set. 847b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return true if request is sent successfully, false otherwise. 848b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 849155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public boolean setSerialNumber(String value) { 850b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius return mSupplicantStaIfaceHal.setWpsSerialNumber(mInterfaceName, value); 851155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 852155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 853b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 854b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Enable or disable power save mode. 855b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 856b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param enabled true to enable, false to disable. 857b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 858155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public void setPowerSave(boolean enabled) { 859b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius mSupplicantStaIfaceHal.setPowerSave(mInterfaceName, enabled); 860155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 861155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 862b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 863b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Set concurrency priority between P2P & STA operations. 864b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 865b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param isStaHigherPriority Set to true to prefer STA over P2P during concurrency operations, 866b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * false otherwise. 867b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return true if request is sent successfully, false otherwise. 868b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 869b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius public boolean setConcurrencyPriority(boolean isStaHigherPriority) { 870b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius return mSupplicantStaIfaceHal.setConcurrencyPriority(isStaHigherPriority); 871155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 872155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 873155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 8743e240b2bfb6fefe8b91ad68e8a12b652b4136c69Roshan Pius * Enable/Disable auto reconnect functionality in wpa_supplicant. 8753e240b2bfb6fefe8b91ad68e8a12b652b4136c69Roshan Pius * 8763e240b2bfb6fefe8b91ad68e8a12b652b4136c69Roshan Pius * @param enable true to enable auto reconnecting, false to disable. 8773e240b2bfb6fefe8b91ad68e8a12b652b4136c69Roshan Pius * @return true if request is sent successfully, false otherwise. 8783e240b2bfb6fefe8b91ad68e8a12b652b4136c69Roshan Pius */ 8793e240b2bfb6fefe8b91ad68e8a12b652b4136c69Roshan Pius public boolean enableStaAutoReconnect(boolean enable) { 880b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius return mSupplicantStaIfaceHal.enableAutoReconnect(mInterfaceName, enable); 8813e240b2bfb6fefe8b91ad68e8a12b652b4136c69Roshan Pius } 8823e240b2bfb6fefe8b91ad68e8a12b652b4136c69Roshan Pius 8833e240b2bfb6fefe8b91ad68e8a12b652b4136c69Roshan Pius /** 884b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Migrate all the configured networks from wpa_supplicant. 885b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 886b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param configs Map of configuration key to configuration objects corresponding to all 887b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * the networks. 888b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param networkExtras Map of extra configuration parameters stored in wpa_supplicant.conf 889b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return Max priority of all the configs. 890155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 891b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius public boolean migrateNetworksFromSupplicant(Map<String, WifiConfiguration> configs, 892b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius SparseArray<Map<String, String>> networkExtras) { 893b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius return mSupplicantStaIfaceHal.loadNetworks(mInterfaceName, configs, networkExtras); 894155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 895155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 896b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 897b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Add the provided network configuration to wpa_supplicant and initiate connection to it. 898b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * This method does the following: 899c4ad341e844e88a34be7ed4c3c9509fb72608b37Ningyuan Wang * 1. Abort any ongoing scan to unblock the connection request. 900c4ad341e844e88a34be7ed4c3c9509fb72608b37Ningyuan Wang * 2. Remove any existing network in wpa_supplicant(This implicitly triggers disconnect). 901c4ad341e844e88a34be7ed4c3c9509fb72608b37Ningyuan Wang * 3. Add a new network to wpa_supplicant. 902c4ad341e844e88a34be7ed4c3c9509fb72608b37Ningyuan Wang * 4. Save the provided configuration to wpa_supplicant. 903c4ad341e844e88a34be7ed4c3c9509fb72608b37Ningyuan Wang * 5. Select the new network in wpa_supplicant. 904c4ad341e844e88a34be7ed4c3c9509fb72608b37Ningyuan Wang * 6. Triggers reconnect command to wpa_supplicant. 905b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 906b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param configuration WifiConfiguration parameters for the provided network. 907b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return {@code true} if it succeeds, {@code false} otherwise 908b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 909a5936a61582404692c6046e3b496d3b1d22a94cbNingyuan Wang public boolean connectToNetwork(WifiConfiguration configuration) { 910c4ad341e844e88a34be7ed4c3c9509fb72608b37Ningyuan Wang // Abort ongoing scan before connect() to unblock connection request. 91191375b39b0fdd6b9c692a5d48120673ee472e3ffRoshan Pius mWificondControl.abortScan(mInterfaceName); 912b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius return mSupplicantStaIfaceHal.connectToNetwork(mInterfaceName, configuration); 913155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 914155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 915b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 916b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Initiates roaming to the already configured network in wpa_supplicant. If the network 917b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * configuration provided does not match the already configured network, then this triggers 918b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * a new connection attempt (instead of roam). 919c4ad341e844e88a34be7ed4c3c9509fb72608b37Ningyuan Wang * 1. Abort any ongoing scan to unblock the roam request. 920c4ad341e844e88a34be7ed4c3c9509fb72608b37Ningyuan Wang * 2. First check if we're attempting to connect to the same network as we currently have 921b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * configured. 922c4ad341e844e88a34be7ed4c3c9509fb72608b37Ningyuan Wang * 3. Set the new bssid for the network in wpa_supplicant. 923c4ad341e844e88a34be7ed4c3c9509fb72608b37Ningyuan Wang * 4. Triggers reassociate command to wpa_supplicant. 924b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 925b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param configuration WifiConfiguration parameters for the provided network. 926b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return {@code true} if it succeeds, {@code false} otherwise 927b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 928b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius public boolean roamToNetwork(WifiConfiguration configuration) { 929c4ad341e844e88a34be7ed4c3c9509fb72608b37Ningyuan Wang // Abort ongoing scan before connect() to unblock roaming request. 93091375b39b0fdd6b9c692a5d48120673ee472e3ffRoshan Pius mWificondControl.abortScan(mInterfaceName); 931b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius return mSupplicantStaIfaceHal.roamToNetwork(mInterfaceName, configuration); 932155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 933155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 934b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 935b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Get the framework network ID corresponding to the provided supplicant network ID for the 936b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * network configured in wpa_supplicant. 937b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 938b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param supplicantNetworkId network ID in wpa_supplicant for the network. 939b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return Corresponding framework network ID if found, -1 if network not found. 940b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 941b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius public int getFrameworkNetworkId(int supplicantNetworkId) { 942b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius return supplicantNetworkId; 943155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 944155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 945b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 946b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Remove all the networks. 947b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 948b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return {@code true} if it succeeds, {@code false} otherwise 949b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 950b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius public boolean removeAllNetworks() { 951b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius return mSupplicantStaIfaceHal.removeAllNetworks(mInterfaceName); 952155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 953155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 954b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 955b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Set the BSSID for the currently configured network in wpa_supplicant. 956b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 957b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return true if successful, false otherwise. 958b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 959b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius public boolean setConfiguredNetworkBSSID(String bssid) { 960b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius return mSupplicantStaIfaceHal.setCurrentNetworkBssid(mInterfaceName, bssid); 961155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 962155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 963b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 964b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Initiate ANQP query. 965b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 966b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param bssid BSSID of the AP to be queried 967b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param anqpIds Set of anqp IDs. 968b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param hs20Subtypes Set of HS20 subtypes. 969b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return true on success, false otherwise. 970b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 971b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius public boolean requestAnqp(String bssid, Set<Integer> anqpIds, Set<Integer> hs20Subtypes) { 972b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius if (bssid == null || ((anqpIds == null || anqpIds.isEmpty()) 973b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius && (hs20Subtypes == null || hs20Subtypes.isEmpty()))) { 974b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius Log.e(mTAG, "Invalid arguments for ANQP request."); 975155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return false; 976155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 977b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius ArrayList<Short> anqpIdList = new ArrayList<>(); 978b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius for (Integer anqpId : anqpIds) { 979b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius anqpIdList.add(anqpId.shortValue()); 98061233efc46707ace6cb3a45dd84766f06df946afTomasz Wiszkowski } 981b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius ArrayList<Integer> hs20SubtypeList = new ArrayList<>(); 982b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius hs20SubtypeList.addAll(hs20Subtypes); 983b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius return mSupplicantStaIfaceHal.initiateAnqpQuery( 984b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius mInterfaceName, bssid, anqpIdList, hs20SubtypeList); 985155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 986155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 987b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 988b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Request a passpoint icon file |filename| from the specified AP |bssid|. 989b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param bssid BSSID of the AP 990b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param fileName name of the icon file 991b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return true if request is sent successfully, false otherwise 992b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 993b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius public boolean requestIcon(String bssid, String fileName) { 994b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius if (bssid == null || fileName == null) { 995b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius Log.e(mTAG, "Invalid arguments for Icon request."); 99661233efc46707ace6cb3a45dd84766f06df946afTomasz Wiszkowski return false; 997155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 998b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius return mSupplicantStaIfaceHal.initiateHs20IconQuery(mInterfaceName, bssid, fileName); 999155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1000155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1001b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 1002b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Get the currently configured network's WPS NFC token. 1003b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 1004b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return Hex string corresponding to the WPS NFC token. 1005b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 1006ba3f5bc64ef27f2ec0d3eae3f53c633ea9e66268Amin Shaikh public String getCurrentNetworkWpsNfcConfigurationToken() { 1007b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius return mSupplicantStaIfaceHal.getCurrentNetworkWpsNfcConfigurationToken(mInterfaceName); 1008155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1009403df479e25031276c738dbea334f09bb7e4bf37Ningyuan Wang 1010403df479e25031276c738dbea334f09bb7e4bf37Ningyuan Wang /** Remove the request |networkId| from supplicant if it's the current network, 1011403df479e25031276c738dbea334f09bb7e4bf37Ningyuan Wang * if the current configured network matches |networkId|. 1012403df479e25031276c738dbea334f09bb7e4bf37Ningyuan Wang * 1013403df479e25031276c738dbea334f09bb7e4bf37Ningyuan Wang * @param networkId network id of the network to be removed from supplicant. 1014403df479e25031276c738dbea334f09bb7e4bf37Ningyuan Wang */ 1015403df479e25031276c738dbea334f09bb7e4bf37Ningyuan Wang public void removeNetworkIfCurrent(int networkId) { 1016b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius mSupplicantStaIfaceHal.removeNetworkIfCurrent(mInterfaceName, networkId); 1017403df479e25031276c738dbea334f09bb7e4bf37Ningyuan Wang } 1018403df479e25031276c738dbea334f09bb7e4bf37Ningyuan Wang 1019b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /******************************************************** 1020b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Vendor HAL operations 1021b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius ********************************************************/ 1022af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius /** 1023af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius * Callback to notify vendor HAL death. 1024af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius */ 1025af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius public interface VendorHalDeathEventHandler { 1026af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius /** 1027af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius * Invoked when the vendor HAL dies. 1028af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius */ 1029af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius void onDeath(); 1030af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius } 1031b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius 1032d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius /** 1033520fbe7db055661af039303c1081236c73b04abdRoshan Pius * Initializes the vendor HAL. This is just used to initialize the {@link HalDeviceManager}. 1034520fbe7db055661af039303c1081236c73b04abdRoshan Pius */ 1035af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius public boolean initializeVendorHal(VendorHalDeathEventHandler handler) { 1036af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius return mWifiVendorHal.initialize(handler); 1037520fbe7db055661af039303c1081236c73b04abdRoshan Pius } 1038520fbe7db055661af039303c1081236c73b04abdRoshan Pius 1039520fbe7db055661af039303c1081236c73b04abdRoshan Pius /** 10408131b04dc799cb0c75240c7b9eb0517ba1f00be8Roshan Pius * Bring up the Vendor HAL and configure for STA mode or AP mode, if vendor HAL is supported. 1041d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius * 1042d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius * @param isStaMode true to start HAL in STA mode, false to start in AP mode. 10438131b04dc799cb0c75240c7b9eb0517ba1f00be8Roshan Pius * @return false if the HAL start fails, true if successful or if vendor HAL not supported. 1044d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius */ 10458131b04dc799cb0c75240c7b9eb0517ba1f00be8Roshan Pius private boolean startHalIfNecessary(boolean isStaMode) { 10468131b04dc799cb0c75240c7b9eb0517ba1f00be8Roshan Pius if (!mWifiVendorHal.isVendorHalSupported()) { 10478131b04dc799cb0c75240c7b9eb0517ba1f00be8Roshan Pius Log.i(mTAG, "Vendor HAL not supported, Ignore start..."); 10488131b04dc799cb0c75240c7b9eb0517ba1f00be8Roshan Pius return true; 10498131b04dc799cb0c75240c7b9eb0517ba1f00be8Roshan Pius } 10503153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius if (isStaMode) { 10513153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius return mWifiVendorHal.startVendorHalSta(); 10523153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius } else { 10533153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius return mWifiVendorHal.startVendorHalAp(); 10543153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius } 10557ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde } 10567ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde 1057b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 10588131b04dc799cb0c75240c7b9eb0517ba1f00be8Roshan Pius * Stops the HAL, if vendor HAL is supported. 1059b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 10608131b04dc799cb0c75240c7b9eb0517ba1f00be8Roshan Pius private void stopHalIfNecessary() { 10618131b04dc799cb0c75240c7b9eb0517ba1f00be8Roshan Pius if (!mWifiVendorHal.isVendorHalSupported()) { 10628131b04dc799cb0c75240c7b9eb0517ba1f00be8Roshan Pius Log.i(mTAG, "Vendor HAL not supported, Ignore stop..."); 10638131b04dc799cb0c75240c7b9eb0517ba1f00be8Roshan Pius return; 10648131b04dc799cb0c75240c7b9eb0517ba1f00be8Roshan Pius } 1065b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius mWifiVendorHal.stopVendorHal(); 10667ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde } 10677f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 1068b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 1069b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Tests whether the HAL is running or not 1070b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 107118786eca942042388748b0d98979f21c9dff4a89Mitchell Wills public boolean isHalStarted() { 1072b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius return mWifiVendorHal.isHalStarted(); 10737f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 10747f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 1075062e3f39e37874fedc01f267de5f4cf7dbebe2b4Randy Pan // TODO: Change variable names to camel style. 1076e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde public static class ScanCapabilities { 1077297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills public int max_scan_cache_size; 1078e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde public int max_scan_buckets; 1079e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde public int max_ap_cache_per_scan; 1080e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde public int max_rssi_sample_size; 1081297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills public int max_scan_reporting_threshold; 1082e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 1083e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 1084b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 1085b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Gets the scan capabilities 1086b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 1087b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param capabilities object to be filled in 1088b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return true for success. false for failure 1089b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 10906ba8a37de432d957e10dd9cc74798758870d02e6Michael Plass public boolean getBgScanCapabilities(ScanCapabilities capabilities) { 1091d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius return mWifiVendorHal.getBgScanCapabilities(mInterfaceName, capabilities); 1092e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 1093e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 1094e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde public static class ChannelSettings { 1095712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills public int frequency; 1096712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills public int dwell_time_ms; 1097712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills public boolean passive; 10987f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 10997f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 1100e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde public static class BucketSettings { 1101712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills public int bucket; 1102712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills public int band; 1103712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills public int period_ms; 1104712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills public int max_period_ms; 1105712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills public int step_count; 1106712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills public int report_events; 1107712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills public int num_channels; 1108712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills public ChannelSettings[] channels; 1109e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 11107f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 11116259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius /** 11126259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius * Network parameters for hidden networks to be scanned for. 11136259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius */ 11146259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius public static class HiddenNetwork { 11156259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius public String ssid; 11166259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius 11176259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius @Override 11186259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius public boolean equals(Object otherObj) { 11196259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius if (this == otherObj) { 11206259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius return true; 11216259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius } else if (otherObj == null || getClass() != otherObj.getClass()) { 11226259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius return false; 11236259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius } 11246259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius HiddenNetwork other = (HiddenNetwork) otherObj; 11256259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius return Objects.equals(ssid, other.ssid); 11266259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius } 1127ef1606e936204c56ffdae305f2f423ee3503fecdMehdi Alizadeh 1128ef1606e936204c56ffdae305f2f423ee3503fecdMehdi Alizadeh @Override 1129ef1606e936204c56ffdae305f2f423ee3503fecdMehdi Alizadeh public int hashCode() { 1130ef1606e936204c56ffdae305f2f423ee3503fecdMehdi Alizadeh return (ssid == null ? 0 : ssid.hashCode()); 1131ef1606e936204c56ffdae305f2f423ee3503fecdMehdi Alizadeh } 11326259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius } 11336259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius 1134e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde public static class ScanSettings { 1135712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills public int base_period_ms; 1136712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills public int max_ap_per_scan; 1137712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills public int report_threshold_percent; 1138712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills public int report_threshold_num_scans; 1139712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills public int num_buckets; 11406259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius /* Not used for bg scans. Only works for single scans. */ 11416259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius public HiddenNetwork[] hiddenNetworks; 1142712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills public BucketSettings[] buckets; 1143e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 11447f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 114568cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang /** 11469bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius * Network parameters to start PNO scan. 11479bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius */ 11489bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius public static class PnoNetwork { 11499bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius public String ssid; 11509bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius public byte flags; 1151ef3ea1092bc17673c0a85a845b053151b7c10e07Roshan Pius public byte auth_bit_field; 11521bf983a4211f547593a60523e43112ecdb5c8997Roshan Pius 11531bf983a4211f547593a60523e43112ecdb5c8997Roshan Pius @Override 11541bf983a4211f547593a60523e43112ecdb5c8997Roshan Pius public boolean equals(Object otherObj) { 11551bf983a4211f547593a60523e43112ecdb5c8997Roshan Pius if (this == otherObj) { 11561bf983a4211f547593a60523e43112ecdb5c8997Roshan Pius return true; 11571bf983a4211f547593a60523e43112ecdb5c8997Roshan Pius } else if (otherObj == null || getClass() != otherObj.getClass()) { 11581bf983a4211f547593a60523e43112ecdb5c8997Roshan Pius return false; 11591bf983a4211f547593a60523e43112ecdb5c8997Roshan Pius } 11601bf983a4211f547593a60523e43112ecdb5c8997Roshan Pius PnoNetwork other = (PnoNetwork) otherObj; 11616259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius return ((Objects.equals(ssid, other.ssid)) && (flags == other.flags) 11621bf983a4211f547593a60523e43112ecdb5c8997Roshan Pius && (auth_bit_field == other.auth_bit_field)); 11631bf983a4211f547593a60523e43112ecdb5c8997Roshan Pius } 1164ef1606e936204c56ffdae305f2f423ee3503fecdMehdi Alizadeh 1165ef1606e936204c56ffdae305f2f423ee3503fecdMehdi Alizadeh @Override 1166ef1606e936204c56ffdae305f2f423ee3503fecdMehdi Alizadeh public int hashCode() { 1167ef1606e936204c56ffdae305f2f423ee3503fecdMehdi Alizadeh int result = (ssid == null ? 0 : ssid.hashCode()); 1168ef1606e936204c56ffdae305f2f423ee3503fecdMehdi Alizadeh result ^= ((int) flags * 31) + ((int) auth_bit_field << 8); 1169ef1606e936204c56ffdae305f2f423ee3503fecdMehdi Alizadeh return result; 1170ef1606e936204c56ffdae305f2f423ee3503fecdMehdi Alizadeh } 11719bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius } 11729bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius 11739bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius /** 11749bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius * Parameters to start PNO scan. This holds the list of networks which are going to used for 11759bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius * PNO scan. 11769bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius */ 11779bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius public static class PnoSettings { 11789bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius public int min5GHzRssi; 11799bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius public int min24GHzRssi; 11809bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius public int initialScoreMax; 11819bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius public int currentConnectionBonus; 11829bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius public int sameNetworkBonus; 11839bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius public int secureBonus; 11849bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius public int band5GHzBonus; 118504c453c2e07efc30b99528926f205740226f1c7bNingyuan Wang public int periodInMs; 1186dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius public boolean isConnected; 11879bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius public PnoNetwork[] networkList; 11889bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius } 11899bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius 1190b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande public static interface ScanEventHandler { 119163539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills /** 119263539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills * Called for each AP as it is found with the entire contents of the beacon/probe response. 119363539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills * Only called when WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT is specified. 119463539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills */ 1195c9e6069eb941d282af213dc20b171877db6b567bMitchell Wills void onFullScanResult(ScanResult fullScanResult, int bucketsScanned); 119663539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills /** 119763539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills * Callback on an event during a gscan scan. 119863539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills * See WifiNative.WIFI_SCAN_* for possible values. 119963539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills */ 120063539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills void onScanStatus(int event); 120163539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills /** 120263539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills * Called with the current cached scan results when gscan is paused. 120363539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills */ 120483a674a18c84ff4f01377bbfd8988699dec93bc2Vinit Deshpande void onScanPaused(WifiScanner.ScanData[] data); 120563539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills /** 120663539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills * Called with the current cached scan results when gscan is resumed. 120763539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills */ 1208b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande void onScanRestarted(); 1209e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 1210e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 12119bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius /** 12129bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius * Handler to notify the occurrence of various events during PNO scan. 12139bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius */ 12149bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius public interface PnoEventHandler { 12159bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius /** 12169bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius * Callback to notify when one of the shortlisted networks is found during PNO scan. 12179bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius * @param results List of Scan results received. 12189bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius */ 12199bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius void onPnoNetworkFound(ScanResult[] results); 1220063cfc7e3eef78fcbda24a66f0c473828b39c854Roshan Pius 1221063cfc7e3eef78fcbda24a66f0c473828b39c854Roshan Pius /** 1222063cfc7e3eef78fcbda24a66f0c473828b39c854Roshan Pius * Callback to notify when the PNO scan schedule fails. 1223063cfc7e3eef78fcbda24a66f0c473828b39c854Roshan Pius */ 1224063cfc7e3eef78fcbda24a66f0c473828b39c854Roshan Pius void onPnoScanFailed(); 12259bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius } 12269bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius 122771af8bb37fee5852ae458edabdef3b487d62a5b8Mitchell Wills public static final int WIFI_SCAN_RESULTS_AVAILABLE = 0; 122871af8bb37fee5852ae458edabdef3b487d62a5b8Mitchell Wills public static final int WIFI_SCAN_THRESHOLD_NUM_SCANS = 1; 122971af8bb37fee5852ae458edabdef3b487d62a5b8Mitchell Wills public static final int WIFI_SCAN_THRESHOLD_PERCENT = 2; 123071af8bb37fee5852ae458edabdef3b487d62a5b8Mitchell Wills public static final int WIFI_SCAN_FAILED = 3; 1231b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande 1232b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 1233b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Starts a background scan. 1234b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Any ongoing scan will be stopped first 1235b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 1236b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param settings to control the scan 1237b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param eventHandler to call with the results 1238b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return true for success 1239b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 12406ba8a37de432d957e10dd9cc74798758870d02e6Michael Plass public boolean startBgScan(ScanSettings settings, ScanEventHandler eventHandler) { 1241d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius return mWifiVendorHal.startBgScan(mInterfaceName, settings, eventHandler); 12427f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde } 12437f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde 1244b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 1245b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Stops any ongoing backgound scan 1246b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 12476ba8a37de432d957e10dd9cc74798758870d02e6Michael Plass public void stopBgScan() { 1248d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius mWifiVendorHal.stopBgScan(mInterfaceName); 1249b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande } 1250b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande 1251b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 1252b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Pauses an ongoing backgound scan 1253b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 12546ba8a37de432d957e10dd9cc74798758870d02e6Michael Plass public void pauseBgScan() { 1255d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius mWifiVendorHal.pauseBgScan(mInterfaceName); 1256b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande } 1257b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande 1258b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 1259b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Restarts a paused scan 1260b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 12616ba8a37de432d957e10dd9cc74798758870d02e6Michael Plass public void restartBgScan() { 1262d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius mWifiVendorHal.restartBgScan(mInterfaceName); 1263e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 1264e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 1265b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 1266b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Gets the latest scan results received. 1267b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 12686ba8a37de432d957e10dd9cc74798758870d02e6Michael Plass public WifiScanner.ScanData[] getBgScanResults() { 1269d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius return mWifiVendorHal.getBgScanResults(mInterfaceName); 1270e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde } 1271e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde 1272d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius public WifiLinkLayerStats getWifiLinkLayerStats() { 1273d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius return mWifiVendorHal.getWifiLinkLayerStats(mInterfaceName); 12745c08cc119b92af69997af194cc8b6d0111e37d31Andres Morales } 12755c08cc119b92af69997af194cc8b6d0111e37d31Andres Morales 1276b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 1277b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Get the supported features 1278b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 1279b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return bitmask defined by WifiManager.WIFI_FEATURE_* 1280b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 128118786eca942042388748b0d98979f21c9dff4a89Mitchell Wills public int getSupportedFeatureSet() { 1282d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius return mWifiVendorHal.getSupportedFeatureSet(mInterfaceName); 1283a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande } 1284143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 1285143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande public static interface RttEventHandler { 1286143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande void onRttResults(RttManager.RttResult[] result); 1287143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande } 1288143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 1289b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 1290b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Starts a new rtt request 1291b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 1292b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param params RTT request params. Refer to {@link RttManager#RttParams}. 1293b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param handler Callback to be invoked to notify any results. 1294b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return true if the request was successful, false otherwise. 1295b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 129618786eca942042388748b0d98979f21c9dff4a89Mitchell Wills public boolean requestRtt( 1297143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande RttManager.RttParams[] params, RttEventHandler handler) { 1298b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius return mWifiVendorHal.requestRtt(params, handler); 1299143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande } 1300143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande 1301b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 1302b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Cancels an outstanding rtt request 1303b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 1304b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param params RTT request params. Refer to {@link RttManager#RttParams} 1305b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return true if there was an outstanding request and it was successfully cancelled 1306b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 130718786eca942042388748b0d98979f21c9dff4a89Mitchell Wills public boolean cancelRtt(RttManager.RttParams[] params) { 1308b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius return mWifiVendorHal.cancelRtt(params); 1309143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande } 1310042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande 131168cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang /** 131268cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang * Enable RTT responder role on the device. Returns {@link ResponderConfig} if the responder 131368cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang * role is successfully enabled, {@code null} otherwise. 1314b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 1315b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param timeoutSeconds timeout to use for the responder. 131668cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang */ 131768cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang @Nullable 1318b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius public ResponderConfig enableRttResponder(int timeoutSeconds) { 1319b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius return mWifiVendorHal.enableRttResponder(timeoutSeconds); 132012cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe } 1321939177ff615062ec826601d536466875d8457375xinhe 1322b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 1323b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Disable RTT responder role. Returns {@code true} if responder role is successfully disabled, 1324b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * {@code false} otherwise. 1325b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 1326b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius public boolean disableRttResponder() { 1327b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius return mWifiVendorHal.disableRttResponder(); 13286609df5a9c14e4440c085567a27437a8cfc50f88Paul Jensen } 13296609df5a9c14e4440c085567a27437a8cfc50f88Paul Jensen 1330b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 1331b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Set the MAC OUI during scanning. 1332b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * An OUI {Organizationally Unique Identifier} is a 24-bit number that 1333b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * uniquely identifies a vendor or manufacturer. 1334b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 1335b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param oui OUI to set. 1336b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return true for success 1337b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 1338b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius public boolean setScanningMacOui(byte[] oui) { 1339d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius return mWifiVendorHal.setScanningMacOui(mInterfaceName, oui); 13406609df5a9c14e4440c085567a27437a8cfc50f88Paul Jensen } 13416609df5a9c14e4440c085567a27437a8cfc50f88Paul Jensen 1342b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 1343b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * RTT (Round Trip Time) measurement capabilities of the device. 1344b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 1345b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius public RttManager.RttCapabilities getRttCapabilities() { 1346b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius return mWifiVendorHal.getRttCapabilities(); 1347d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe } 1348d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe 1349b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 1350b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Get the APF (Android Packet Filter) capabilities of the device 1351b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 1352b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius public ApfCapabilities getApfCapabilities() { 1353d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius return mWifiVendorHal.getApfCapabilities(mInterfaceName); 1354d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe } 1355d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe 1356b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 1357b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Installs an APF program on this iface, replacing any existing program. 1358b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 1359b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param filter is the android packet filter program 1360b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return true for success 1361b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 1362b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius public boolean installPacketFilter(byte[] filter) { 1363d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius return mWifiVendorHal.installPacketFilter(mInterfaceName, filter); 1364d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe } 1365d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe 1366b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 1367b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Set country code for this AP iface. 1368b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 1369b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param countryCode - two-letter country code (as ISO 3166) 1370b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return true for success 1371b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 1372b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius public boolean setCountryCodeHal(String countryCode) { 1373d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius return mWifiVendorHal.setCountryCodeHal(mInterfaceName, countryCode); 1374d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe } 1375d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe 1376a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle //--------------------------------------------------------------------------------- 1377a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle /* Wifi Logger commands/events */ 1378a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle public static interface WifiLoggerEventHandler { 13790bf150b2d69ec62df905bc6f8603437dc4caee1fVinit Deshpande void onRingBufferData(RingBufferStatus status, byte[] buffer); 13800bf150b2d69ec62df905bc6f8603437dc4caee1fVinit Deshpande void onWifiAlert(int errorCode, byte[] buffer); 1381a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle } 1382a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle 1383b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 1384b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Registers the logger callback and enables alerts. 1385b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Ring buffer data collection is only triggered when |startLoggingRingBuffer| is invoked. 1386b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 1387b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param handler Callback to be invoked. 1388b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return true on success, false otherwise. 1389b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 139018786eca942042388748b0d98979f21c9dff4a89Mitchell Wills public boolean setLoggingEventHandler(WifiLoggerEventHandler handler) { 1391b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius return mWifiVendorHal.setLoggingEventHandler(handler); 139203ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe } 139303ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe 1394b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 1395b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Control debug data collection 1396b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 1397b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param verboseLevel 0 to 3, inclusive. 0 stops logging. 1398b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param flags Ignored. 1399b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param maxInterval Maximum interval between reports; ignore if 0. 1400b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param minDataSize Minimum data size in buffer for report; ignore if 0. 1401b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param ringName Name of the ring for which data collection is to start. 1402b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return true for success, false otherwise. 1403b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 140418786eca942042388748b0d98979f21c9dff4a89Mitchell Wills public boolean startLoggingRingBuffer(int verboseLevel, int flags, int maxInterval, 140503ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe int minDataSize, String ringName){ 1406b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius return mWifiVendorHal.startLoggingRingBuffer( 1407b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius verboseLevel, flags, maxInterval, minDataSize, ringName); 140803ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe } 140903ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe 1410b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 1411b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Logger features exposed. 1412b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * This is a no-op now, will always return -1. 1413b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 1414b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return true on success, false otherwise. 1415b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 141618786eca942042388748b0d98979f21c9dff4a89Mitchell Wills public int getSupportedLoggerFeatureSet() { 1417b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius return mWifiVendorHal.getSupportedLoggerFeatureSet(); 141803ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe } 141903ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe 1420b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 1421b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Stops all logging and resets the logger callback. 1422b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * This stops both the alerts and ring buffer data collection. 1423b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return true on success, false otherwise. 1424b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 142518786eca942042388748b0d98979f21c9dff4a89Mitchell Wills public boolean resetLogHandler() { 1426b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius return mWifiVendorHal.resetLogHandler(); 1427b797893fc1966803d0c013faac42e6396a37a384xinhe } 1428b797893fc1966803d0c013faac42e6396a37a384xinhe 1429b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 1430b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Vendor-provided wifi driver version string 1431b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 1432b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return String returned from the HAL. 1433b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 143418786eca942042388748b0d98979f21c9dff4a89Mitchell Wills public String getDriverVersion() { 1435b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius return mWifiVendorHal.getDriverVersion(); 143603ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe } 143703ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe 1438b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 1439b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Vendor-provided wifi firmware version string 1440b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 1441b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return String returned from the HAL. 1442b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 144318786eca942042388748b0d98979f21c9dff4a89Mitchell Wills public String getFirmwareVersion() { 1444b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius return mWifiVendorHal.getFirmwareVersion(); 144503ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe } 144603ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe 14470bf150b2d69ec62df905bc6f8603437dc4caee1fVinit Deshpande public static class RingBufferStatus{ 14480bf150b2d69ec62df905bc6f8603437dc4caee1fVinit Deshpande String name; 14490bf150b2d69ec62df905bc6f8603437dc4caee1fVinit Deshpande int flag; 14500bf150b2d69ec62df905bc6f8603437dc4caee1fVinit Deshpande int ringBufferId; 14510bf150b2d69ec62df905bc6f8603437dc4caee1fVinit Deshpande int ringBufferByteSize; 14520bf150b2d69ec62df905bc6f8603437dc4caee1fVinit Deshpande int verboseLevel; 14530bf150b2d69ec62df905bc6f8603437dc4caee1fVinit Deshpande int writtenBytes; 14540bf150b2d69ec62df905bc6f8603437dc4caee1fVinit Deshpande int readBytes; 14550bf150b2d69ec62df905bc6f8603437dc4caee1fVinit Deshpande int writtenRecords; 14560bf150b2d69ec62df905bc6f8603437dc4caee1fVinit Deshpande 145753f278b6fed422a18d763b07216a21e96d9445f9Michael Plass // Bit masks for interpreting |flag| 145853f278b6fed422a18d763b07216a21e96d9445f9Michael Plass public static final int HAS_BINARY_ENTRIES = (1 << 0); 145953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass public static final int HAS_ASCII_ENTRIES = (1 << 1); 146053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass public static final int HAS_PER_PACKET_ENTRIES = (1 << 2); 146153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass 14620bf150b2d69ec62df905bc6f8603437dc4caee1fVinit Deshpande @Override 14630bf150b2d69ec62df905bc6f8603437dc4caee1fVinit Deshpande public String toString() { 14640bf150b2d69ec62df905bc6f8603437dc4caee1fVinit Deshpande return "name: " + name + " flag: " + flag + " ringBufferId: " + ringBufferId + 14650bf150b2d69ec62df905bc6f8603437dc4caee1fVinit Deshpande " ringBufferByteSize: " +ringBufferByteSize + " verboseLevel: " +verboseLevel + 14660bf150b2d69ec62df905bc6f8603437dc4caee1fVinit Deshpande " writtenBytes: " + writtenBytes + " readBytes: " + readBytes + 14670bf150b2d69ec62df905bc6f8603437dc4caee1fVinit Deshpande " writtenRecords: " + writtenRecords; 14680bf150b2d69ec62df905bc6f8603437dc4caee1fVinit Deshpande } 14690bf150b2d69ec62df905bc6f8603437dc4caee1fVinit Deshpande } 14700bf150b2d69ec62df905bc6f8603437dc4caee1fVinit Deshpande 1471b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 1472b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * API to get the status of all ring buffers supported by driver 1473b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 147418786eca942042388748b0d98979f21c9dff4a89Mitchell Wills public RingBufferStatus[] getRingBufferStatus() { 1475b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius return mWifiVendorHal.getRingBufferStatus(); 147603ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe } 147703ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe 1478b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 1479b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Indicates to driver that all the data has to be uploaded urgently 1480b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 1481b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param ringName Name of the ring buffer requested. 1482b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return true on success, false otherwise. 1483b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 148418786eca942042388748b0d98979f21c9dff4a89Mitchell Wills public boolean getRingBufferData(String ringName) { 1485b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius return mWifiVendorHal.getRingBufferData(ringName); 148603ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe } 1487127f7244183786e6ccae09e81eeccdac31973e69xinhe 1488b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 1489b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Request vendor debug info from the firmware 1490b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 1491b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return Raw data obtained from the HAL. 1492b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 149318786eca942042388748b0d98979f21c9dff4a89Mitchell Wills public byte[] getFwMemoryDump() { 1494b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius return mWifiVendorHal.getFwMemoryDump(); 1495a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle } 1496dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle 1497b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 1498b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Request vendor debug info from the driver 1499b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 1500b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return Raw data obtained from the HAL. 1501b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 1502d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal public byte[] getDriverStateDump() { 1503b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius return mWifiVendorHal.getDriverStateDump(); 1504d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal } 1505d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal 1506dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle //--------------------------------------------------------------------------------- 150709b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal /* Packet fate API */ 150809b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal 150909b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal @Immutable 151009b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal abstract static class FateReport { 1511eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal final static int USEC_PER_MSEC = 1000; 1512eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal // The driver timestamp is a 32-bit counter, in microseconds. This field holds the 1513eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal // maximal value of a driver timestamp in milliseconds. 1514eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal final static int MAX_DRIVER_TIMESTAMP_MSEC = (int) (0xffffffffL / 1000); 1515eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal final static SimpleDateFormat dateFormatter = new SimpleDateFormat("HH:mm:ss.SSS"); 1516eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal 151709b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal final byte mFate; 151809b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal final long mDriverTimestampUSec; 151909b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal final byte mFrameType; 152009b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal final byte[] mFrameBytes; 1521eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal final long mEstimatedWallclockMSec; 152209b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal 152309b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal FateReport(byte fate, long driverTimestampUSec, byte frameType, byte[] frameBytes) { 152409b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal mFate = fate; 152509b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal mDriverTimestampUSec = driverTimestampUSec; 1526eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal mEstimatedWallclockMSec = 1527eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal convertDriverTimestampUSecToWallclockMSec(mDriverTimestampUSec); 152809b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal mFrameType = frameType; 152909b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal mFrameBytes = frameBytes; 153009b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal } 15310fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal 1532590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan public String toTableRowString() { 1533590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan StringWriter sw = new StringWriter(); 1534590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan PrintWriter pw = new PrintWriter(sw); 1535590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan FrameParser parser = new FrameParser(mFrameType, mFrameBytes); 1536eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal dateFormatter.setTimeZone(TimeZone.getDefault()); 1537eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal pw.format("%-15s %12s %-9s %-32s %-12s %-23s %s\n", 1538eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal mDriverTimestampUSec, 1539eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal dateFormatter.format(new Date(mEstimatedWallclockMSec)), 1540eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal directionToString(), fateToString(), parser.mMostSpecificProtocolString, 1541eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal parser.mTypeString, parser.mResultString); 1542590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan return sw.toString(); 1543590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan } 1544590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan 1545590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan public String toVerboseStringWithPiiAllowed() { 15460fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal StringWriter sw = new StringWriter(); 15470fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal PrintWriter pw = new PrintWriter(sw); 1548590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan FrameParser parser = new FrameParser(mFrameType, mFrameBytes); 15490fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal pw.format("Frame direction: %s\n", directionToString()); 15500fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal pw.format("Frame timestamp: %d\n", mDriverTimestampUSec); 15510fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal pw.format("Frame fate: %s\n", fateToString()); 15520fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal pw.format("Frame type: %s\n", frameTypeToString(mFrameType)); 1553590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan pw.format("Frame protocol: %s\n", parser.mMostSpecificProtocolString); 1554590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan pw.format("Frame protocol type: %s\n", parser.mTypeString); 15550fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal pw.format("Frame length: %d\n", mFrameBytes.length); 15560fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal pw.append("Frame bytes"); 1557590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan pw.append(HexDump.dumpHexString(mFrameBytes)); // potentially contains PII 15580fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal pw.append("\n"); 15590fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal return sw.toString(); 15600fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal } 15610fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal 1562590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan /* Returns a header to match the output of toTableRowString(). */ 1563590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan public static String getTableHeader() { 1564590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan StringWriter sw = new StringWriter(); 1565590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan PrintWriter pw = new PrintWriter(sw); 1566eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal pw.format("\n%-15s %-12s %-9s %-32s %-12s %-23s %s\n", 1567eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal "Time usec", "Walltime", "Direction", "Fate", "Protocol", "Type", "Result"); 1568eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal pw.format("%-15s %-12s %-9s %-32s %-12s %-23s %s\n", 1569eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal "---------", "--------", "---------", "----", "--------", "----", "------"); 1570590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan return sw.toString(); 1571590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan } 1572590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan 15730fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal protected abstract String directionToString(); 15740fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal 15750fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal protected abstract String fateToString(); 15760fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal 15770fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal private static String frameTypeToString(byte frameType) { 15780fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal switch (frameType) { 15790fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal case WifiLoggerHal.FRAME_TYPE_UNKNOWN: 15800fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal return "unknown"; 15810fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal case WifiLoggerHal.FRAME_TYPE_ETHERNET_II: 15820fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal return "data"; 15830fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal case WifiLoggerHal.FRAME_TYPE_80211_MGMT: 15840fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal return "802.11 management"; 15850fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal default: 15860fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal return Byte.toString(frameType); 15870fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal } 15880fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal } 1589eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal 1590eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal /** 1591eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal * Converts a driver timestamp to a wallclock time, based on the current 1592eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal * BOOTTIME to wallclock mapping. The driver timestamp is a 32-bit counter of 1593eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal * microseconds, with the same base as BOOTTIME. 1594eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal */ 1595eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal private static long convertDriverTimestampUSecToWallclockMSec(long driverTimestampUSec) { 1596eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal final long wallclockMillisNow = System.currentTimeMillis(); 1597eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal final long boottimeMillisNow = SystemClock.elapsedRealtime(); 1598eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal final long driverTimestampMillis = driverTimestampUSec / USEC_PER_MSEC; 1599eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal 1600eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal long boottimeTimestampMillis = boottimeMillisNow % MAX_DRIVER_TIMESTAMP_MSEC; 1601eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal if (boottimeTimestampMillis < driverTimestampMillis) { 1602eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal // The 32-bit microsecond count has wrapped between the time that the driver 1603eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal // recorded the packet, and the call to this function. Adjust the BOOTTIME 1604eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal // timestamp, to compensate. 1605eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal // 1606eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal // Note that overflow is not a concern here, since the result is less than 1607eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal // 2 * MAX_DRIVER_TIMESTAMP_MSEC. (Given the modulus operation above, 1608eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal // boottimeTimestampMillis must be less than MAX_DRIVER_TIMESTAMP_MSEC.) And, since 1609eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal // MAX_DRIVER_TIMESTAMP_MSEC is an int, 2 * MAX_DRIVER_TIMESTAMP_MSEC must fit 1610eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal // within a long. 1611eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal boottimeTimestampMillis += MAX_DRIVER_TIMESTAMP_MSEC; 1612eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal } 1613eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal 1614eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal final long millisSincePacketTimestamp = boottimeTimestampMillis - driverTimestampMillis; 1615eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal return wallclockMillisNow - millisSincePacketTimestamp; 1616eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal } 161709b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal } 161809b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal 161909b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal /** 162009b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal * Represents the fate information for one outbound packet. 162109b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal */ 162209b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal @Immutable 162309b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal public static final class TxFateReport extends FateReport { 162409b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal TxFateReport(byte fate, long driverTimestampUSec, byte frameType, byte[] frameBytes) { 162509b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal super(fate, driverTimestampUSec, frameType, frameBytes); 162609b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal } 16270fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal 16280fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal @Override 16290fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal protected String directionToString() { 16300fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal return "TX"; 16310fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal } 16320fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal 16330fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal @Override 16340fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal protected String fateToString() { 16350fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal switch (mFate) { 16360fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal case WifiLoggerHal.TX_PKT_FATE_ACKED: 16370fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal return "acked"; 16380fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal case WifiLoggerHal.TX_PKT_FATE_SENT: 16390fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal return "sent"; 16400fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal case WifiLoggerHal.TX_PKT_FATE_FW_QUEUED: 16410fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal return "firmware queued"; 16420fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal case WifiLoggerHal.TX_PKT_FATE_FW_DROP_INVALID: 16430fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal return "firmware dropped (invalid frame)"; 16440fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal case WifiLoggerHal.TX_PKT_FATE_FW_DROP_NOBUFS: 16450fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal return "firmware dropped (no bufs)"; 16460fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal case WifiLoggerHal.TX_PKT_FATE_FW_DROP_OTHER: 16470fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal return "firmware dropped (other)"; 16480fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal case WifiLoggerHal.TX_PKT_FATE_DRV_QUEUED: 16490fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal return "driver queued"; 16500fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal case WifiLoggerHal.TX_PKT_FATE_DRV_DROP_INVALID: 16510fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal return "driver dropped (invalid frame)"; 16520fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal case WifiLoggerHal.TX_PKT_FATE_DRV_DROP_NOBUFS: 16530fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal return "driver dropped (no bufs)"; 16540fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal case WifiLoggerHal.TX_PKT_FATE_DRV_DROP_OTHER: 16550fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal return "driver dropped (other)"; 16560fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal default: 16570fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal return Byte.toString(mFate); 16580fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal } 16590fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal } 166009b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal } 166109b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal 166209b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal /** 166309b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal * Represents the fate information for one inbound packet. 166409b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal */ 166509b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal @Immutable 166609b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal public static final class RxFateReport extends FateReport { 166709b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal RxFateReport(byte fate, long driverTimestampUSec, byte frameType, byte[] frameBytes) { 166809b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal super(fate, driverTimestampUSec, frameType, frameBytes); 166909b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal } 16700fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal 16710fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal @Override 16720fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal protected String directionToString() { 16730fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal return "RX"; 16740fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal } 16750fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal 16760fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal @Override 16770fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal protected String fateToString() { 16780fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal switch (mFate) { 16790fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal case WifiLoggerHal.RX_PKT_FATE_SUCCESS: 16800fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal return "success"; 16810fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal case WifiLoggerHal.RX_PKT_FATE_FW_QUEUED: 16820fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal return "firmware queued"; 16830fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal case WifiLoggerHal.RX_PKT_FATE_FW_DROP_FILTER: 16840fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal return "firmware dropped (filter)"; 16850fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal case WifiLoggerHal.RX_PKT_FATE_FW_DROP_INVALID: 16860fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal return "firmware dropped (invalid frame)"; 16870fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal case WifiLoggerHal.RX_PKT_FATE_FW_DROP_NOBUFS: 16880fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal return "firmware dropped (no bufs)"; 16890fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal case WifiLoggerHal.RX_PKT_FATE_FW_DROP_OTHER: 16900fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal return "firmware dropped (other)"; 16910fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal case WifiLoggerHal.RX_PKT_FATE_DRV_QUEUED: 16920fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal return "driver queued"; 16930fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal case WifiLoggerHal.RX_PKT_FATE_DRV_DROP_FILTER: 16940fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal return "driver dropped (filter)"; 16950fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal case WifiLoggerHal.RX_PKT_FATE_DRV_DROP_INVALID: 16960fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal return "driver dropped (invalid frame)"; 16970fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal case WifiLoggerHal.RX_PKT_FATE_DRV_DROP_NOBUFS: 16980fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal return "driver dropped (no bufs)"; 16990fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal case WifiLoggerHal.RX_PKT_FATE_DRV_DROP_OTHER: 17000fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal return "driver dropped (other)"; 17010fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal default: 17020fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal return Byte.toString(mFate); 17030fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal } 17040fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal } 170509b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal } 170609b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal 17070fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal /** 17080fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal * Ask the HAL to enable packet fate monitoring. Fails unless HAL is started. 1709b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 1710b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return true for success, false otherwise. 17110fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal */ 17120fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal public boolean startPktFateMonitoring() { 1713d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius return mWifiVendorHal.startPktFateMonitoring(mInterfaceName); 17140fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal } 17150fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal 17160fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal /** 17170fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal * Fetch the most recent TX packet fates from the HAL. Fails unless HAL is started. 1718b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 1719b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return true for success, false otherwise. 17200fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal */ 17210fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal public boolean getTxPktFates(TxFateReport[] reportBufs) { 1722d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius return mWifiVendorHal.getTxPktFates(mInterfaceName, reportBufs); 17230fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal } 17240fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal 17250fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal /** 17260fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal * Fetch the most recent RX packet fates from the HAL. Fails unless HAL is started. 17270fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal */ 17280fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal public boolean getRxPktFates(RxFateReport[] reportBufs) { 1729d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius return mWifiVendorHal.getRxPktFates(mInterfaceName, reportBufs); 17300fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal } 173109b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal 17325c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius /** 1733b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Start sending the specified keep alive packets periodically. 1734b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 1735b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param slot Integer used to identify each request. 1736b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param keepAlivePacket Raw packet contents to send. 1737b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param period Period to use for sending these packets. 1738b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return 0 for success, -1 for error 1739b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 1740b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius public int startSendingOffloadedPacket(int slot, KeepalivePacketData keepAlivePacket, 1741b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius int period) { 17423bd22cebc41ed0786d0e7bd2970a634a8bb0093ePrerepa Viswanadham String[] macAddrStr = getMacAddress().split(":"); 17433bd22cebc41ed0786d0e7bd2970a634a8bb0093ePrerepa Viswanadham byte[] srcMac = new byte[6]; 1744520fbe7db055661af039303c1081236c73b04abdRoshan Pius for (int i = 0; i < 6; i++) { 17453bd22cebc41ed0786d0e7bd2970a634a8bb0093ePrerepa Viswanadham Integer hexVal = Integer.parseInt(macAddrStr[i], 16); 17463bd22cebc41ed0786d0e7bd2970a634a8bb0093ePrerepa Viswanadham srcMac[i] = hexVal.byteValue(); 17473bd22cebc41ed0786d0e7bd2970a634a8bb0093ePrerepa Viswanadham } 1748d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius return mWifiVendorHal.startSendingOffloadedPacket(mInterfaceName, 1749b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius slot, srcMac, keepAlivePacket, period); 1750c55e88163b223db0ca6a99ed6ffe91845c30a576Prerepa Viswanadham } 1751c55e88163b223db0ca6a99ed6ffe91845c30a576Prerepa Viswanadham 1752b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 1753b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Stop sending the specified keep alive packets. 1754b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 1755b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param slot id - same as startSendingOffloadedPacket call. 1756b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return 0 for success, -1 for error 1757b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 1758b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius public int stopSendingOffloadedPacket(int slot) { 1759d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius return mWifiVendorHal.stopSendingOffloadedPacket(mInterfaceName, slot); 1760c55e88163b223db0ca6a99ed6ffe91845c30a576Prerepa Viswanadham } 1761aed5cb65d8eefb2eee56a29e33ac3cd8b03312e7Prerepa Viswanadham 1762aed5cb65d8eefb2eee56a29e33ac3cd8b03312e7Prerepa Viswanadham public static interface WifiRssiEventHandler { 1763aed5cb65d8eefb2eee56a29e33ac3cd8b03312e7Prerepa Viswanadham void onRssiThresholdBreached(byte curRssi); 1764aed5cb65d8eefb2eee56a29e33ac3cd8b03312e7Prerepa Viswanadham } 1765aed5cb65d8eefb2eee56a29e33ac3cd8b03312e7Prerepa Viswanadham 1766b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 1767b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Start RSSI monitoring on the currently connected access point. 1768b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 1769b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param maxRssi Maximum RSSI threshold. 1770b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param minRssi Minimum RSSI threshold. 1771b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param rssiEventHandler Called when RSSI goes above maxRssi or below minRssi 1772b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return 0 for success, -1 for failure 1773b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 177418786eca942042388748b0d98979f21c9dff4a89Mitchell Wills public int startRssiMonitoring(byte maxRssi, byte minRssi, 1775b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius WifiRssiEventHandler rssiEventHandler) { 1776d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius return mWifiVendorHal.startRssiMonitoring( 1777d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius mInterfaceName, maxRssi, minRssi, rssiEventHandler); 1778aed5cb65d8eefb2eee56a29e33ac3cd8b03312e7Prerepa Viswanadham } 1779aed5cb65d8eefb2eee56a29e33ac3cd8b03312e7Prerepa Viswanadham 178018786eca942042388748b0d98979f21c9dff4a89Mitchell Wills public int stopRssiMonitoring() { 1781d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius return mWifiVendorHal.stopRssiMonitoring(mInterfaceName); 1782aed5cb65d8eefb2eee56a29e33ac3cd8b03312e7Prerepa Viswanadham } 17835ea42964ba17901a8d724736b450ace6ed48880fPrerepa Viswanadham 17846bf6986d359556010638dfae332b585162f06520Roshan Pius /** 17856bf6986d359556010638dfae332b585162f06520Roshan Pius * Fetch the host wakeup reasons stats from wlan driver. 1786b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 17876bf6986d359556010638dfae332b585162f06520Roshan Pius * @return the |WifiWakeReasonAndCounts| object retrieved from the wlan driver. 17886bf6986d359556010638dfae332b585162f06520Roshan Pius */ 17896bf6986d359556010638dfae332b585162f06520Roshan Pius public WifiWakeReasonAndCounts getWlanWakeReasonCount() { 1790b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius return mWifiVendorHal.getWlanWakeReasonCount(); 17916bf6986d359556010638dfae332b585162f06520Roshan Pius } 17923dd6f75ff2ab823bd0c14581f2e047c74916f16fErik Kline 1793b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 1794b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Enable/Disable Neighbour discovery offload functionality in the firmware. 1795b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 1796b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @param enabled true to enable, false to disable. 1797b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return true for success, false otherwise. 1798b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 17993dd6f75ff2ab823bd0c14581f2e047c74916f16fErik Kline public boolean configureNeighborDiscoveryOffload(boolean enabled) { 1800d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius return mWifiVendorHal.configureNeighborDiscoveryOffload(mInterfaceName, enabled); 18013dd6f75ff2ab823bd0c14581f2e047c74916f16fErik Kline } 1802da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan 1803da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan // Firmware roaming control. 1804da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan 1805da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan /** 1806da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan * Class to retrieve firmware roaming capability parameters. 1807da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan */ 1808da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan public static class RoamingCapabilities { 1809da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan public int maxBlacklistSize; 1810da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan public int maxWhitelistSize; 1811da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan } 1812da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan 1813da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan /** 1814da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan * Query the firmware roaming capabilities. 1815b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return true for success, false otherwise. 1816da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan */ 1817da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan public boolean getRoamingCapabilities(RoamingCapabilities capabilities) { 1818d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius return mWifiVendorHal.getRoamingCapabilities(mInterfaceName, capabilities); 1819da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan } 1820da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan 1821da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan /** 1822da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan * Macros for controlling firmware roaming. 1823da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan */ 1824da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan public static final int DISABLE_FIRMWARE_ROAMING = 0; 1825da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan public static final int ENABLE_FIRMWARE_ROAMING = 1; 1826da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan 1827da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan /** 1828da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan * Enable/disable firmware roaming. 1829b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * 1830b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * @return error code returned from HAL. 1831da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan */ 1832da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan public int enableFirmwareRoaming(int state) { 1833d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius return mWifiVendorHal.enableFirmwareRoaming(mInterfaceName, state); 1834da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan } 1835da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan 1836da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan /** 1837da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan * Class for specifying the roaming configurations. 1838da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan */ 1839da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan public static class RoamingConfig { 1840da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan public ArrayList<String> blacklistBssids; 1841da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan public ArrayList<String> whitelistSsids; 1842da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan } 1843da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan 1844da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan /** 1845da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan * Set firmware roaming configurations. 1846da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan */ 1847da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan public boolean configureRoaming(RoamingConfig config) { 1848b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius Log.d(mTAG, "configureRoaming "); 1849d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius return mWifiVendorHal.configureRoaming(mInterfaceName, config); 1850da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan } 1851da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan 1852374f78d3841f7bf74543dc4d21db66d1d3472c3aRandy Pan /** 1853374f78d3841f7bf74543dc4d21db66d1d3472c3aRandy Pan * Reset firmware roaming configuration. 1854374f78d3841f7bf74543dc4d21db66d1d3472c3aRandy Pan */ 1855374f78d3841f7bf74543dc4d21db66d1d3472c3aRandy Pan public boolean resetRoamingConfiguration() { 1856b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius // Pass in an empty RoamingConfig object which translates to zero size 1857b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius // blacklist and whitelist to reset the firmware roaming configuration. 1858d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius return mWifiVendorHal.configureRoaming(mInterfaceName, new RoamingConfig()); 1859b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius } 1860b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius 1861ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius /** 1862b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius * Tx power level scenarios that can be selected. 1863ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius */ 1864b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius public static final int TX_POWER_SCENARIO_NORMAL = 0; 1865b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius public static final int TX_POWER_SCENARIO_VOICE_CALL = 1; 1866ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius 1867ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius /** 1868b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius * Select one of the pre-configured TX power level scenarios or reset it back to normal. 1869ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius * Primarily used for meeting SAR requirements during voice calls. 1870ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius * 1871b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius * @param scenario Should be one {@link #TX_POWER_SCENARIO_NORMAL} or 1872b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius * {@link #TX_POWER_SCENARIO_VOICE_CALL}. 1873ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius * @return true for success; false for failure or if the HAL version does not support this API. 1874ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius */ 1875b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius public boolean selectTxPowerScenario(int scenario) { 1876b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius return mWifiVendorHal.selectTxPowerScenario(scenario); 1877ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius } 1878ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius 1879b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /******************************************************** 1880b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * JNI operations 1881b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius ********************************************************/ 1882b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /* Register native functions */ 1883b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius static { 1884b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /* Native functions are defined in libwifi-service.so */ 1885b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius System.loadLibrary("wifi-service"); 1886b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius registerNatives(); 1887b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius } 1888b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius 1889b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius private static native int registerNatives(); 1890b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /* kernel logging support */ 1891b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius private static native byte[] readKernelLogNative(); 1892b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius 1893b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius /** 1894b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius * Fetches the latest kernel logs. 1895b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius */ 1896b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius public synchronized String readKernelLog() { 1897b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius byte[] bytes = readKernelLogNative(); 1898b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius if (bytes != null) { 1899b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius CharsetDecoder decoder = StandardCharsets.UTF_8.newDecoder(); 1900b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius try { 1901b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius CharBuffer decoded = decoder.decode(ByteBuffer.wrap(bytes)); 1902b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius return decoded.toString(); 1903b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius } catch (CharacterCodingException cce) { 1904b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius return new String(bytes, StandardCharsets.ISO_8859_1); 1905b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius } 1906520fbe7db055661af039303c1081236c73b04abdRoshan Pius } else { 1907b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius return "*** failed to read kernel log ***"; 1908374f78d3841f7bf74543dc4d21db66d1d3472c3aRandy Pan } 1909da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan } 1910155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 1911