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