WifiNative.java revision fd95a68590a4dcc82734e42b85898c953d21dbf7
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;
28aabe7a9f2f32915fd1f25416a6d2034a844005d6vandwalleimport android.net.wifi.WifiLinkLayerStats;
29e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapndeimport android.net.wifi.WifiScanner;
302a6d76f0899289cd3b96e3428f02076fdbc0363eMitchell Willsimport android.net.wifi.WifiWakeReasonAndCounts;
31f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalleimport android.os.SystemClock;
32155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeimport android.util.Log;
33ce1de180e7652e2b2313b401451ca3d9d027b372Roshan Piusimport android.util.Pair;
34a26a8b33616c94859ba33f33403794cf636baa54Roshan Piusimport android.util.SparseArray;
35fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski
3609b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawalimport com.android.internal.annotations.Immutable;
370fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawalimport com.android.internal.util.HexDump;
38c55e88163b223db0ca6a99ed6ffe91845c30a576Prerepa Viswanadhamimport com.android.server.connectivity.KeepalivePacketData;
39590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tanimport com.android.server.wifi.util.FrameParser;
40fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski
410fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawalimport java.io.PrintWriter;
420fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawalimport java.io.StringWriter;
435cfd8d8b9f241dcad874125a1b5538ee0d6860fexinheimport java.nio.ByteBuffer;
445cfd8d8b9f241dcad874125a1b5538ee0d6860fexinheimport java.nio.CharBuffer;
455cfd8d8b9f241dcad874125a1b5538ee0d6860fexinheimport java.nio.charset.CharacterCodingException;
465cfd8d8b9f241dcad874125a1b5538ee0d6860fexinheimport java.nio.charset.CharsetDecoder;
475cfd8d8b9f241dcad874125a1b5538ee0d6860fexinheimport java.nio.charset.StandardCharsets;
48eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawalimport java.text.SimpleDateFormat;
49155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeimport java.util.ArrayList;
50eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawalimport java.util.Date;
51fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowskiimport java.util.Map;
521bf983a4211f547593a60523e43112ecdb5c8997Roshan Piusimport java.util.Objects;
539ec71f6499e0e3d6f52310a41ff4a59d2fa4f8b2Mitchell Willsimport java.util.Set;
54eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawalimport java.util.TimeZone;
5518786eca942042388748b0d98979f21c9dff4a89Mitchell Wills
56fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski
57155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande/**
58155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Native calls for bring up/shut down of the supplicant daemon and for
59155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * sending requests to the supplicant daemon
60155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande *
61155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * {@hide}
62155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */
63155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandepublic class WifiNative {
6418786eca942042388748b0d98979f21c9dff4a89Mitchell Wills    private final String mTAG;
6518786eca942042388748b0d98979f21c9dff4a89Mitchell Wills    private final String mInterfaceName;
66b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    private final SupplicantStaIfaceHal mSupplicantStaIfaceHal;
67b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    private final WifiVendorHal mWifiVendorHal;
68b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    private final WificondControl mWificondControl;
69b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius
70b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    public WifiNative(String interfaceName, WifiVendorHal vendorHal,
71163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius                      SupplicantStaIfaceHal staIfaceHal, WificondControl condControl) {
72155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande        mTAG = "WifiNative-" + interfaceName;
73b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        mInterfaceName = interfaceName;
74b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        mWifiVendorHal = vendorHal;
75b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        mSupplicantStaIfaceHal = staIfaceHal;
76b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        mWificondControl = condControl;
77155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
78155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
7918786eca942042388748b0d98979f21c9dff4a89Mitchell Wills    public String getInterfaceName() {
8018786eca942042388748b0d98979f21c9dff4a89Mitchell Wills        return mInterfaceName;
81e26ad459b63271548abbdeba4f8d77fcca9f88bdxinhe    }
82e26ad459b63271548abbdeba4f8d77fcca9f88bdxinhe
83b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
84b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Enable verbose logging for all sub modules.
85b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
86b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    public void enableVerboseLogging(int verbose) {
87b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        mWificondControl.enableVerboseLogging(verbose > 0 ? true : false);
88b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        mSupplicantStaIfaceHal.enableVerboseLogging(verbose > 0);
89b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        mWifiVendorHal.enableVerboseLogging(verbose > 0);
90ed9938883ae2dade81c8be6cd6ceaef3febd5239vandwalle    }
91ed9938883ae2dade81c8be6cd6ceaef3febd5239vandwalle
92b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius   /********************************************************
93b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    * Native Initialization/Deinitialization
94b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    ********************************************************/
95ce1de180e7652e2b2313b401451ca3d9d027b372Roshan Pius    public static final int SETUP_SUCCESS = 0;
96ce1de180e7652e2b2313b401451ca3d9d027b372Roshan Pius    public static final int SETUP_FAILURE_HAL = 1;
97ce1de180e7652e2b2313b401451ca3d9d027b372Roshan Pius    public static final int SETUP_FAILURE_WIFICOND = 2;
98155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
9970603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang   /**
1003a0679d411c5eb889d38ed32181446c82d5bd825Roshan Pius    * Setup wifi native for Client mode operations.
1013a0679d411c5eb889d38ed32181446c82d5bd825Roshan Pius    *
1023a0679d411c5eb889d38ed32181446c82d5bd825Roshan Pius    * 1. Starts the Wifi HAL and configures it in client/STA mode.
1033a0679d411c5eb889d38ed32181446c82d5bd825Roshan Pius    * 2. Setup Wificond to operate in client mode and retrieve the handle to use for client
1043a0679d411c5eb889d38ed32181446c82d5bd825Roshan Pius    * operations.
1053a0679d411c5eb889d38ed32181446c82d5bd825Roshan Pius    *
106ce1de180e7652e2b2313b401451ca3d9d027b372Roshan Pius    * @return Pair of <Integer, IClientInterface> to indicate the status and the associated wificond
107ce1de180e7652e2b2313b401451ca3d9d027b372Roshan Pius    * client interface binder handler (will be null on failure).
10870603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang    */
109c7685b40d77b12820c5b04013592834025086cefRoshan Pius    public Pair<Integer, IClientInterface> setupForClientMode(@NonNull String ifaceName) {
1108131b04dc799cb0c75240c7b9eb0517ba1f00be8Roshan Pius        if (!startHalIfNecessary(true)) {
111b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius            Log.e(mTAG, "Failed to start HAL for client mode");
112ce1de180e7652e2b2313b401451ca3d9d027b372Roshan Pius            return Pair.create(SETUP_FAILURE_HAL, null);
11370603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang        }
1147065d8fb5b3b814d9f15d053b3a30f4543164baeRoshan Pius        IClientInterface iClientInterface = mWificondControl.setupInterfaceForClientMode(ifaceName);
115ce1de180e7652e2b2313b401451ca3d9d027b372Roshan Pius        if (iClientInterface == null) {
116ce1de180e7652e2b2313b401451ca3d9d027b372Roshan Pius            return Pair.create(SETUP_FAILURE_WIFICOND, null);
117ce1de180e7652e2b2313b401451ca3d9d027b372Roshan Pius        }
118ce1de180e7652e2b2313b401451ca3d9d027b372Roshan Pius        return Pair.create(SETUP_SUCCESS, iClientInterface);
11970603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang    }
120155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
12170603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang    /**
1223a0679d411c5eb889d38ed32181446c82d5bd825Roshan Pius     * Setup wifi native for AP mode operations.
1233a0679d411c5eb889d38ed32181446c82d5bd825Roshan Pius     *
1243a0679d411c5eb889d38ed32181446c82d5bd825Roshan Pius     * 1. Starts the Wifi HAL and configures it in AP mode.
1253a0679d411c5eb889d38ed32181446c82d5bd825Roshan Pius     * 2. Setup Wificond to operate in AP mode and retrieve the handle to use for ap operations.
1263a0679d411c5eb889d38ed32181446c82d5bd825Roshan Pius     *
127ce1de180e7652e2b2313b401451ca3d9d027b372Roshan Pius     * @return Pair of <Integer, IApInterface> to indicate the status and the associated wificond
128ce1de180e7652e2b2313b401451ca3d9d027b372Roshan Pius     * AP interface binder handler (will be null on failure).
1293a0679d411c5eb889d38ed32181446c82d5bd825Roshan Pius     */
130c7685b40d77b12820c5b04013592834025086cefRoshan Pius    public Pair<Integer, IApInterface> setupForSoftApMode(@NonNull String ifaceName) {
1318131b04dc799cb0c75240c7b9eb0517ba1f00be8Roshan Pius        if (!startHalIfNecessary(false)) {
132b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius            Log.e(mTAG, "Failed to start HAL for AP mode");
133ce1de180e7652e2b2313b401451ca3d9d027b372Roshan Pius            return Pair.create(SETUP_FAILURE_HAL, null);
134ce1de180e7652e2b2313b401451ca3d9d027b372Roshan Pius        }
1357065d8fb5b3b814d9f15d053b3a30f4543164baeRoshan Pius        IApInterface iApInterface = mWificondControl.setupInterfaceForSoftApMode(ifaceName);
136ce1de180e7652e2b2313b401451ca3d9d027b372Roshan Pius        if (iApInterface == null) {
137ce1de180e7652e2b2313b401451ca3d9d027b372Roshan Pius            return Pair.create(SETUP_FAILURE_WIFICOND, null);
13870603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang        }
139ce1de180e7652e2b2313b401451ca3d9d027b372Roshan Pius        return Pair.create(SETUP_SUCCESS, iApInterface);
14070603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang    }
14170603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang
14270603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang    /**
1433a0679d411c5eb889d38ed32181446c82d5bd825Roshan Pius     * Teardown all mode configurations in wifi native.
1443a0679d411c5eb889d38ed32181446c82d5bd825Roshan Pius     *
1458e03a147b1d9ca721e1fe4f95b6b67491cfd7084Etan Cohen     * 1. Stops the Wifi HAL.
1468e03a147b1d9ca721e1fe4f95b6b67491cfd7084Etan Cohen     * 2. Tears down all the interfaces from Wificond.
1473a0679d411c5eb889d38ed32181446c82d5bd825Roshan Pius     */
1487130816d6c62e07d6d41150805515d7fd56f1f0dRoshan Pius    public void tearDown() {
1498e03a147b1d9ca721e1fe4f95b6b67491cfd7084Etan Cohen        stopHalIfNecessary();
1503a0679d411c5eb889d38ed32181446c82d5bd825Roshan Pius        if (!mWificondControl.tearDownInterfaces()) {
1513a0679d411c5eb889d38ed32181446c82d5bd825Roshan Pius            // TODO(b/34859006): Handle failures.
152b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius            Log.e(mTAG, "Failed to teardown interfaces from Wificond");
1533a0679d411c5eb889d38ed32181446c82d5bd825Roshan Pius        }
15470603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang    }
15570603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang
156b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /********************************************************
157b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Wificond operations
158b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     ********************************************************/
159b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
160b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Result of a signal poll.
161b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
162b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    public static class SignalPollResult {
163b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        // RSSI value in dBM.
164b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        public int currentRssi;
165b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        //Transmission bit rate in Mbps.
166b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        public int txBitrate;
167b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        // Association frequency in MHz.
168b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        public int associationFrequency;
169b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    }
170b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius
171b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
172b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * WiFi interface transimission counters.
173b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
174b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    public static class TxPacketCounters {
175b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        // Number of successfully transmitted packets.
176b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        public int txSucceeded;
177b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        // Number of tramsmission failures.
178b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        public int txFailed;
179b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    }
180b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius
18170603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang    /**
18255dd51a9f9df48a7b92a57f9c969d256c98d33a7Roshan Pius     * Callback to notify wificond death.
18355dd51a9f9df48a7b92a57f9c969d256c98d33a7Roshan Pius     */
18455dd51a9f9df48a7b92a57f9c969d256c98d33a7Roshan Pius    public interface WificondDeathEventHandler {
18555dd51a9f9df48a7b92a57f9c969d256c98d33a7Roshan Pius        /**
18655dd51a9f9df48a7b92a57f9c969d256c98d33a7Roshan Pius         * Invoked when the wificond dies.
18755dd51a9f9df48a7b92a57f9c969d256c98d33a7Roshan Pius         */
18855dd51a9f9df48a7b92a57f9c969d256c98d33a7Roshan Pius        void onDeath();
18955dd51a9f9df48a7b92a57f9c969d256c98d33a7Roshan Pius    }
19055dd51a9f9df48a7b92a57f9c969d256c98d33a7Roshan Pius
19155dd51a9f9df48a7b92a57f9c969d256c98d33a7Roshan Pius    /**
19255dd51a9f9df48a7b92a57f9c969d256c98d33a7Roshan Pius     * Registers a death notification for wificond.
19355dd51a9f9df48a7b92a57f9c969d256c98d33a7Roshan Pius     * @return Returns true on success.
19455dd51a9f9df48a7b92a57f9c969d256c98d33a7Roshan Pius     */
19555dd51a9f9df48a7b92a57f9c969d256c98d33a7Roshan Pius    public boolean registerWificondDeathHandler(@NonNull WificondDeathEventHandler handler) {
19655dd51a9f9df48a7b92a57f9c969d256c98d33a7Roshan Pius        return mWificondControl.registerDeathHandler(handler);
19755dd51a9f9df48a7b92a57f9c969d256c98d33a7Roshan Pius    }
19855dd51a9f9df48a7b92a57f9c969d256c98d33a7Roshan Pius
19955dd51a9f9df48a7b92a57f9c969d256c98d33a7Roshan Pius    /**
20055dd51a9f9df48a7b92a57f9c969d256c98d33a7Roshan Pius     * Deregisters a death notification for wificond.
20155dd51a9f9df48a7b92a57f9c969d256c98d33a7Roshan Pius     * @return Returns true on success.
20255dd51a9f9df48a7b92a57f9c969d256c98d33a7Roshan Pius     */
20355dd51a9f9df48a7b92a57f9c969d256c98d33a7Roshan Pius    public boolean deregisterWificondDeathHandler() {
20455dd51a9f9df48a7b92a57f9c969d256c98d33a7Roshan Pius        return mWificondControl.deregisterDeathHandler();
20555dd51a9f9df48a7b92a57f9c969d256c98d33a7Roshan Pius    }
20655dd51a9f9df48a7b92a57f9c969d256c98d33a7Roshan Pius
20755dd51a9f9df48a7b92a57f9c969d256c98d33a7Roshan Pius    /**
20870603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang    * Disable wpa_supplicant via wificond.
20970603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang    * @return Returns true on success.
21070603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang    */
21170603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang    public boolean disableSupplicant() {
21270603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang        return mWificondControl.disableSupplicant();
21370603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang    }
21470603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang
21570603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang    /**
21670603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang    * Enable wpa_supplicant via wificond.
21770603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang    * @return Returns true on success.
21870603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang    */
21970603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang    public boolean enableSupplicant() {
22070603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang        return mWificondControl.enableSupplicant();
22170603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang    }
22218786eca942042388748b0d98979f21c9dff4a89Mitchell Wills
223d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang    /**
224d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang    * Request signal polling to wificond.
225d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang    * Returns an SignalPollResult object.
226d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang    * Returns null on failure.
227d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang    */
228d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang    public SignalPollResult signalPoll() {
22991375b39b0fdd6b9c692a5d48120673ee472e3ffRoshan Pius        return mWificondControl.signalPoll(mInterfaceName);
230d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang    }
231d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang
232d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang    /**
233d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang     * Fetch TX packet counters on current connection from wificond.
234d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang    * Returns an TxPacketCounters object.
235d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang    * Returns null on failure.
236d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang    */
237d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang    public TxPacketCounters getTxPacketCounters() {
23891375b39b0fdd6b9c692a5d48120673ee472e3ffRoshan Pius        return mWificondControl.getTxPacketCounters(mInterfaceName);
239d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang    }
240d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang
24124250365afbd9a20b2e03364eddf2025c8f1138aRoshan Pius    /**
242a70c07d019065187112945c091fc2e924af18980Roshan Pius     * Query the list of valid frequencies for the provided band.
243a70c07d019065187112945c091fc2e924af18980Roshan Pius     * The result depends on the on the country code that has been set.
244a70c07d019065187112945c091fc2e924af18980Roshan Pius     *
245a70c07d019065187112945c091fc2e924af18980Roshan Pius     * @param band as specified by one of the WifiScanner.WIFI_BAND_* constants.
246a70c07d019065187112945c091fc2e924af18980Roshan Pius     * The following bands are supported:
247a70c07d019065187112945c091fc2e924af18980Roshan Pius     * WifiScanner.WIFI_BAND_24_GHZ
248a70c07d019065187112945c091fc2e924af18980Roshan Pius     * WifiScanner.WIFI_BAND_5_GHZ
249a70c07d019065187112945c091fc2e924af18980Roshan Pius     * WifiScanner.WIFI_BAND_5_GHZ_DFS_ONLY
250a70c07d019065187112945c091fc2e924af18980Roshan Pius     * @return frequencies vector of valid frequencies (MHz), or null for error.
251a70c07d019065187112945c091fc2e924af18980Roshan Pius     * @throws IllegalArgumentException if band is not recognized.
252a70c07d019065187112945c091fc2e924af18980Roshan Pius     */
253a70c07d019065187112945c091fc2e924af18980Roshan Pius    public int [] getChannelsForBand(int band) {
254a70c07d019065187112945c091fc2e924af18980Roshan Pius        return mWificondControl.getChannelsForBand(band);
255a70c07d019065187112945c091fc2e924af18980Roshan Pius    }
256a70c07d019065187112945c091fc2e924af18980Roshan Pius
257a70c07d019065187112945c091fc2e924af18980Roshan Pius    /**
258b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Start a scan using wificond for the given parameters.
259b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param freqs list of frequencies to scan for, if null scan all supported channels.
260b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param hiddenNetworkSSIDs List of hidden networks to be scanned for.
261b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return Returns true on success.
26224250365afbd9a20b2e03364eddf2025c8f1138aRoshan Pius     */
263b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    public boolean scan(Set<Integer> freqs, Set<String> hiddenNetworkSSIDs) {
26491375b39b0fdd6b9c692a5d48120673ee472e3ffRoshan Pius        return mWificondControl.scan(mInterfaceName, freqs, hiddenNetworkSSIDs);
265155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
266155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
26718786eca942042388748b0d98979f21c9dff4a89Mitchell Wills    /**
268b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Fetch the latest scan result from kernel via wificond.
269b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return Returns an ArrayList of ScanDetail.
270b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Returns an empty ArrayList on failure.
27118786eca942042388748b0d98979f21c9dff4a89Mitchell Wills     */
272b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    public ArrayList<ScanDetail> getScanResults() {
27391375b39b0fdd6b9c692a5d48120673ee472e3ffRoshan Pius        return mWificondControl.getScanResults(
27491375b39b0fdd6b9c692a5d48120673ee472e3ffRoshan Pius                mInterfaceName, WificondControl.SCAN_TYPE_SINGLE_SCAN);
27571c4c2a898a827a867564159ce78e41aedd2295bSohani Rao    }
27671c4c2a898a827a867564159ce78e41aedd2295bSohani Rao
27771c4c2a898a827a867564159ce78e41aedd2295bSohani Rao    /**
27871c4c2a898a827a867564159ce78e41aedd2295bSohani Rao     * Fetch the latest scan result from kernel via wificond.
27971c4c2a898a827a867564159ce78e41aedd2295bSohani Rao     * @return Returns an ArrayList of ScanDetail.
28071c4c2a898a827a867564159ce78e41aedd2295bSohani Rao     * Returns an empty ArrayList on failure.
28171c4c2a898a827a867564159ce78e41aedd2295bSohani Rao     */
28271c4c2a898a827a867564159ce78e41aedd2295bSohani Rao    public ArrayList<ScanDetail> getPnoScanResults() {
28391375b39b0fdd6b9c692a5d48120673ee472e3ffRoshan Pius        return mWificondControl.getScanResults(mInterfaceName, WificondControl.SCAN_TYPE_PNO_SCAN);
284155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
285155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
286b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
287b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Start PNO scan.
288b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param pnoSettings Pno scan configuration.
289b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return true on success.
29018786eca942042388748b0d98979f21c9dff4a89Mitchell Wills     */
291b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    public boolean startPnoScan(PnoSettings pnoSettings) {
29291375b39b0fdd6b9c692a5d48120673ee472e3ffRoshan Pius        return mWificondControl.startPnoScan(mInterfaceName, pnoSettings);
293155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
294155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
295b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
296b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Stop PNO scan.
297b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return true on success.
298b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
299b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    public boolean stopPnoScan() {
30091375b39b0fdd6b9c692a5d48120673ee472e3ffRoshan Pius        return mWificondControl.stopPnoScan(mInterfaceName);
30118786eca942042388748b0d98979f21c9dff4a89Mitchell Wills    }
30218786eca942042388748b0d98979f21c9dff4a89Mitchell Wills
303045079df57626fd6a8b94ac19fcdb0540b508c19Roshan Pius    /**
304045079df57626fd6a8b94ac19fcdb0540b508c19Roshan Pius     * Callbacks for SoftAp interface.
305045079df57626fd6a8b94ac19fcdb0540b508c19Roshan Pius     */
306045079df57626fd6a8b94ac19fcdb0540b508c19Roshan Pius    public interface SoftApListener {
307045079df57626fd6a8b94ac19fcdb0540b508c19Roshan Pius        /**
308045079df57626fd6a8b94ac19fcdb0540b508c19Roshan Pius         * Invoked when the number of associated stations changes.
309045079df57626fd6a8b94ac19fcdb0540b508c19Roshan Pius         */
310045079df57626fd6a8b94ac19fcdb0540b508c19Roshan Pius        void onNumAssociatedStationsChanged(int numStations);
311045079df57626fd6a8b94ac19fcdb0540b508c19Roshan Pius    }
312045079df57626fd6a8b94ac19fcdb0540b508c19Roshan Pius
313045079df57626fd6a8b94ac19fcdb0540b508c19Roshan Pius    /**
314045079df57626fd6a8b94ac19fcdb0540b508c19Roshan Pius     * Start Soft AP operation using the provided configuration.
315045079df57626fd6a8b94ac19fcdb0540b508c19Roshan Pius     *
316045079df57626fd6a8b94ac19fcdb0540b508c19Roshan Pius     * @param config Configuration to use for the soft ap created.
317045079df57626fd6a8b94ac19fcdb0540b508c19Roshan Pius     * @param listener Callback for AP events.
318045079df57626fd6a8b94ac19fcdb0540b508c19Roshan Pius     * @return true on success, false otherwise.
319045079df57626fd6a8b94ac19fcdb0540b508c19Roshan Pius     */
320045079df57626fd6a8b94ac19fcdb0540b508c19Roshan Pius    public boolean startSoftAp(WifiConfiguration config, SoftApListener listener) {
32191375b39b0fdd6b9c692a5d48120673ee472e3ffRoshan Pius        return mWificondControl.startSoftAp(mInterfaceName, config, listener);
322045079df57626fd6a8b94ac19fcdb0540b508c19Roshan Pius    }
323045079df57626fd6a8b94ac19fcdb0540b508c19Roshan Pius
324045079df57626fd6a8b94ac19fcdb0540b508c19Roshan Pius    /**
325045079df57626fd6a8b94ac19fcdb0540b508c19Roshan Pius     * Stop the ongoing Soft AP operation.
326045079df57626fd6a8b94ac19fcdb0540b508c19Roshan Pius     *
327045079df57626fd6a8b94ac19fcdb0540b508c19Roshan Pius     * @return true on success, false otherwise.
328045079df57626fd6a8b94ac19fcdb0540b508c19Roshan Pius     */
329045079df57626fd6a8b94ac19fcdb0540b508c19Roshan Pius    public boolean stopSoftAp() {
33091375b39b0fdd6b9c692a5d48120673ee472e3ffRoshan Pius        return mWificondControl.stopSoftAp(mInterfaceName);
331045079df57626fd6a8b94ac19fcdb0540b508c19Roshan Pius    }
332045079df57626fd6a8b94ac19fcdb0540b508c19Roshan Pius
333b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /********************************************************
334b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Supplicant operations
335b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     ********************************************************/
336f3aae0be78cd02f5fedd7d99b73536d2c799b030Roshan Pius
337f3aae0be78cd02f5fedd7d99b73536d2c799b030Roshan Pius    /**
338fd95a68590a4dcc82734e42b85898c953d21dbf7Roshan Pius     * Callback to notify supplicant death.
339fd95a68590a4dcc82734e42b85898c953d21dbf7Roshan Pius     */
340fd95a68590a4dcc82734e42b85898c953d21dbf7Roshan Pius    public interface SupplicantDeathEventHandler {
341fd95a68590a4dcc82734e42b85898c953d21dbf7Roshan Pius        /**
342fd95a68590a4dcc82734e42b85898c953d21dbf7Roshan Pius         * Invoked when the supplicant dies.
343fd95a68590a4dcc82734e42b85898c953d21dbf7Roshan Pius         */
344fd95a68590a4dcc82734e42b85898c953d21dbf7Roshan Pius        void onDeath();
345fd95a68590a4dcc82734e42b85898c953d21dbf7Roshan Pius    }
346fd95a68590a4dcc82734e42b85898c953d21dbf7Roshan Pius
347fd95a68590a4dcc82734e42b85898c953d21dbf7Roshan Pius    /**
348fd95a68590a4dcc82734e42b85898c953d21dbf7Roshan Pius     * Registers a death notification for supplicant.
349fd95a68590a4dcc82734e42b85898c953d21dbf7Roshan Pius     * @return Returns true on success.
350fd95a68590a4dcc82734e42b85898c953d21dbf7Roshan Pius     */
351fd95a68590a4dcc82734e42b85898c953d21dbf7Roshan Pius    public boolean registerSupplicantDeathHandler(@NonNull SupplicantDeathEventHandler handler) {
352fd95a68590a4dcc82734e42b85898c953d21dbf7Roshan Pius        return mSupplicantStaIfaceHal.registerDeathHandler(handler);
353fd95a68590a4dcc82734e42b85898c953d21dbf7Roshan Pius    }
354fd95a68590a4dcc82734e42b85898c953d21dbf7Roshan Pius
355fd95a68590a4dcc82734e42b85898c953d21dbf7Roshan Pius    /**
356b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius     * This method is called repeatedly until the connection to wpa_supplicant is
357b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius     * established and a STA iface is setup.
358f3aae0be78cd02f5fedd7d99b73536d2c799b030Roshan Pius     *
359b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return true if connection is established, false otherwise.
360b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * TODO: Add unit tests for these once we remove the legacy code.
361f3aae0be78cd02f5fedd7d99b73536d2c799b030Roshan Pius     */
362163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    public boolean connectToSupplicant() {
363b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        // Start initialization if not already started.
364b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        if (!mSupplicantStaIfaceHal.isInitializationStarted()
365b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius                && !mSupplicantStaIfaceHal.initialize()) {
366b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius            return false;
3675cf97c9b13cc06554c8901e63d55ba051b7e7881Roshan Pius        }
368b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        // Check if the initialization is complete.
369b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius        if (!mSupplicantStaIfaceHal.isInitializationComplete()) {
370b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius            return false;
371b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius        }
372b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius        // Setup the STA iface once connection is established.
373b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius        return mSupplicantStaIfaceHal.setupIface(mInterfaceName);
374ad7319939c424d42fa6a3791c47f613db8ef3cd8vandwalle    }
375ad7319939c424d42fa6a3791c47f613db8ef3cd8vandwalle
376b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
377b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Close supplicant connection.
378ed6a985c7b63e295248fa7e8292c99b48b7a4283Mitchell Wills     */
379b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    public void closeSupplicantConnection() {
380b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius        // Setup the STA iface once connection is established.
381b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius        mSupplicantStaIfaceHal.teardownIface(mInterfaceName);
382155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
383155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
384782eac0bacec797262eb4d721ad58cfcf2fbf885Tomasz Wiszkowski    /**
385b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Set supplicant log level
386782eac0bacec797262eb4d721ad58cfcf2fbf885Tomasz Wiszkowski     *
387b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param turnOnVerbose Whether to turn on verbose logging or not.
388782eac0bacec797262eb4d721ad58cfcf2fbf885Tomasz Wiszkowski     */
389b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    public void setSupplicantLogLevel(boolean turnOnVerbose) {
390f2e03411f137f55940a8f3592e96a272585bd7ddRoshan Pius        mSupplicantStaIfaceHal.setLogLevel(turnOnVerbose);
391e3831b70d4a8a967fe8df5496d542a432692c434Roshan Pius    }
392e3831b70d4a8a967fe8df5496d542a432692c434Roshan Pius
39338a6c1ba5d461b8c7b11685c5dd2e98d9e106b55Roshan Pius    /**
394b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Trigger a reconnection if the iface is disconnected.
395b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
396b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return true if request is sent successfully, false otherwise.
39738a6c1ba5d461b8c7b11685c5dd2e98d9e106b55Roshan Pius     */
398b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    public boolean reconnect() {
399b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius        return mSupplicantStaIfaceHal.reconnect(mInterfaceName);
400f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle    }
4019d7489491984e86915b2cf4fac38a882de1c8cdbRoshan Pius
4029d7489491984e86915b2cf4fac38a882de1c8cdbRoshan Pius    /**
403b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Trigger a reassociation even if the iface is currently connected.
404b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
405b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return true if request is sent successfully, false otherwise.
4069d7489491984e86915b2cf4fac38a882de1c8cdbRoshan Pius     */
407155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    public boolean reassociate() {
408b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius        return mSupplicantStaIfaceHal.reassociate(mInterfaceName);
409155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
410155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
411155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    /**
412b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Trigger a disconnection from the currently connected network.
413b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
414b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return true if request is sent successfully, false otherwise.
415b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
416b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    public boolean disconnect() {
417b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius        return mSupplicantStaIfaceHal.disconnect(mInterfaceName);
41877f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist    }
41977f2b82a2e80af8da52c22d69a76def6d4209757Jan Nordqvist
420155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    /**
421b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Makes a callback to HIDL to getMacAddress from supplicant
422b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
423b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return string containing the MAC address, or null on a failed call
424b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
425b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    public String getMacAddress() {
426b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius        return mSupplicantStaIfaceHal.getMacAddress(mInterfaceName);
427446db2d5457456743e4476029e14d7c3bb9f5bccYuhao Zheng    }
428446db2d5457456743e4476029e14d7c3bb9f5bccYuhao Zheng
429f2e03411f137f55940a8f3592e96a272585bd7ddRoshan Pius    public static final int RX_FILTER_TYPE_V4_MULTICAST = 0;
430f2e03411f137f55940a8f3592e96a272585bd7ddRoshan Pius    public static final int RX_FILTER_TYPE_V6_MULTICAST = 1;
431155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    /**
432155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande     * Start filtering out Multicast V4 packets
433155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande     * @return {@code true} if the operation succeeded, {@code false} otherwise
434155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande     *
435155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande     * Multicast filtering rules work as follows:
436155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande     *
437155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande     * The driver can filter multicast (v4 and/or v6) and broadcast packets when in
438155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande     * a power optimized mode (typically when screen goes off).
439155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande     *
440155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande     * In order to prevent the driver from filtering the multicast/broadcast packets, we have to
441155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande     * add a DRIVER RXFILTER-ADD rule followed by DRIVER RXFILTER-START to make the rule effective
442155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande     *
443155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande     * DRIVER RXFILTER-ADD Num
444155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande     *   where Num = 0 - Unicast, 1 - Broadcast, 2 - Mutil4 or 3 - Multi6
445155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande     *
446155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande     * and DRIVER RXFILTER-START
447155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande     * In order to stop the usage of these rules, we do
448155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande     *
449155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande     * DRIVER RXFILTER-STOP
450155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande     * DRIVER RXFILTER-REMOVE Num
451155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande     *   where Num is as described for RXFILTER-ADD
452155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande     *
453155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande     * The  SETSUSPENDOPT driver command overrides the filtering rules
454155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande     */
455155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    public boolean startFilteringMulticastV4Packets() {
456b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius        return mSupplicantStaIfaceHal.stopRxFilter(mInterfaceName)
457b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius                && mSupplicantStaIfaceHal.removeRxFilter(
458b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius                        mInterfaceName, RX_FILTER_TYPE_V4_MULTICAST)
459b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius                && mSupplicantStaIfaceHal.startRxFilter(mInterfaceName);
460155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
461155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
462155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    /**
463155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande     * Stop filtering out Multicast V4 packets.
464155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande     * @return {@code true} if the operation succeeded, {@code false} otherwise
465155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande     */
466155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    public boolean stopFilteringMulticastV4Packets() {
467b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius        return mSupplicantStaIfaceHal.stopRxFilter(mInterfaceName)
468b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius                && mSupplicantStaIfaceHal.addRxFilter(
469b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius                        mInterfaceName, RX_FILTER_TYPE_V4_MULTICAST)
470b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius                && mSupplicantStaIfaceHal.startRxFilter(mInterfaceName);
471155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
472155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
473155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    /**
474155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande     * Start filtering out Multicast V6 packets
475155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande     * @return {@code true} if the operation succeeded, {@code false} otherwise
476155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande     */
477155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    public boolean startFilteringMulticastV6Packets() {
478b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius        return mSupplicantStaIfaceHal.stopRxFilter(mInterfaceName)
479b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius                && mSupplicantStaIfaceHal.removeRxFilter(
480b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius                        mInterfaceName, RX_FILTER_TYPE_V6_MULTICAST)
481b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius                && mSupplicantStaIfaceHal.startRxFilter(mInterfaceName);
482155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
483155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
484155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    /**
485155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande     * Stop filtering out Multicast V6 packets.
486155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande     * @return {@code true} if the operation succeeded, {@code false} otherwise
487155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande     */
488155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    public boolean stopFilteringMulticastV6Packets() {
489b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius        return mSupplicantStaIfaceHal.stopRxFilter(mInterfaceName)
490b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius                && mSupplicantStaIfaceHal.addRxFilter(
491b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius                        mInterfaceName, RX_FILTER_TYPE_V6_MULTICAST)
492b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius                && mSupplicantStaIfaceHal.startRxFilter(mInterfaceName);
493155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
494155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
495f2e03411f137f55940a8f3592e96a272585bd7ddRoshan Pius    public static final int BLUETOOTH_COEXISTENCE_MODE_ENABLED  = 0;
496f2e03411f137f55940a8f3592e96a272585bd7ddRoshan Pius    public static final int BLUETOOTH_COEXISTENCE_MODE_DISABLED = 1;
497f2e03411f137f55940a8f3592e96a272585bd7ddRoshan Pius    public static final int BLUETOOTH_COEXISTENCE_MODE_SENSE    = 2;
4987ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde    /**
4997ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde      * Sets the bluetooth coexistence mode.
5007ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde      *
5017ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde      * @param mode One of {@link #BLUETOOTH_COEXISTENCE_MODE_DISABLED},
5027ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde      *            {@link #BLUETOOTH_COEXISTENCE_MODE_ENABLED}, or
5037ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde      *            {@link #BLUETOOTH_COEXISTENCE_MODE_SENSE}.
5047ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde      * @return Whether the mode was successfully set.
5057ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde      */
506155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    public boolean setBluetoothCoexistenceMode(int mode) {
507b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius        return mSupplicantStaIfaceHal.setBtCoexistenceMode(mInterfaceName, mode);
508155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
509155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
510155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    /**
511155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande     * Enable or disable Bluetooth coexistence scan mode. When this mode is on,
512155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande     * some of the low-level scan parameters used by the driver are changed to
513155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande     * reduce interference with A2DP streaming.
514155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande     *
515cc180872c51908b15ce5cbf834634ff323e036bcChristopher Wiley     * @param setCoexScanMode whether to enable or disable this mode
516155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande     * @return {@code true} if the command succeeded, {@code false} otherwise.
517155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande     */
518155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    public boolean setBluetoothCoexistenceScanMode(boolean setCoexScanMode) {
519b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius        return mSupplicantStaIfaceHal.setBtCoexistenceScanModeEnabled(
520b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius                mInterfaceName, setCoexScanMode);
521155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
522155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
523b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
524b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Enable or disable suspend mode optimizations.
525b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
526b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param enabled true to enable, false otherwise.
527b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return true if request is sent successfully, false otherwise.
528b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
529155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    public boolean setSuspendOptimizations(boolean enabled) {
530b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius        return mSupplicantStaIfaceHal.setSuspendModeEnabled(mInterfaceName, enabled);
531155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
532155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
5339153bd67d51b305ffdd61355e0748e3c332c2cafRoshan Pius    /**
534b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Set country code.
535b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
536b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param countryCode 2 byte ASCII string. For ex: US, CA.
537b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return true if request is sent successfully, false otherwise.
5389153bd67d51b305ffdd61355e0748e3c332c2cafRoshan Pius     */
539b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    public boolean setCountryCode(String countryCode) {
540b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius        return mSupplicantStaIfaceHal.setCountryCode(mInterfaceName, countryCode);
54104c453c2e07efc30b99528926f205740226f1c7bNingyuan Wang    }
54204c453c2e07efc30b99528926f205740226f1c7bNingyuan Wang
54304c453c2e07efc30b99528926f205740226f1c7bNingyuan Wang    /**
544b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Initiate TDLS discover and setup or teardown with the specified peer.
545b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
546b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param macAddr MAC Address of the peer.
547b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param enable true to start discovery and setup, false to teardown.
54804c453c2e07efc30b99528926f205740226f1c7bNingyuan Wang     */
549155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    public void startTdls(String macAddr, boolean enable) {
550b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        if (enable) {
551b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius            mSupplicantStaIfaceHal.initiateTdlsDiscover(mInterfaceName, macAddr);
552b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius            mSupplicantStaIfaceHal.initiateTdlsSetup(mInterfaceName, macAddr);
553155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande        } else {
554b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius            mSupplicantStaIfaceHal.initiateTdlsTeardown(mInterfaceName, macAddr);
555155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande        }
556155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
557155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
558b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
559b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Start WPS pin display operation with the specified peer.
560b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
561b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param bssid BSSID of the peer.
562b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return true if request is sent successfully, false otherwise.
563b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
564155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    public boolean startWpsPbc(String bssid) {
565b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius        return mSupplicantStaIfaceHal.startWpsPbc(mInterfaceName, bssid);
566155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
567155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
568b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
569b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Start WPS pin keypad operation with the specified pin.
570b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
571b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param pin Pin to be used.
572b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return true if request is sent successfully, false otherwise.
573b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
574155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    public boolean startWpsPinKeypad(String pin) {
575b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius        return mSupplicantStaIfaceHal.startWpsPinKeypad(mInterfaceName, pin);
576155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
577155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
578b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
579b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Start WPS pin display operation with the specified peer.
580b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
581b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param bssid BSSID of the peer.
582b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return new pin generated on success, null otherwise.
583b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
584155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    public String startWpsPinDisplay(String bssid) {
585b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius        return mSupplicantStaIfaceHal.startWpsPinDisplay(mInterfaceName, bssid);
586155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
587155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
588b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
589b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Sets whether to use external sim for SIM/USIM processing.
590b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
591b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param external true to enable, false otherwise.
592b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return true if request is sent successfully, false otherwise.
593b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
59433b575ca6bee66183929f9474b5a161432918604Vinit Deshpande    public boolean setExternalSim(boolean external) {
595b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius        return mSupplicantStaIfaceHal.setExternalSim(mInterfaceName, external);
59633b575ca6bee66183929f9474b5a161432918604Vinit Deshpande    }
59733b575ca6bee66183929f9474b5a161432918604Vinit Deshpande
598b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
599b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Sim auth response types.
600b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
601b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    public static final String SIM_AUTH_RESP_TYPE_GSM_AUTH = "GSM-AUTH";
602b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    public static final String SIM_AUTH_RESP_TYPE_UMTS_AUTH = "UMTS-AUTH";
603b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    public static final String SIM_AUTH_RESP_TYPE_UMTS_AUTS = "UMTS-AUTS";
604b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius
605b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
606b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Send the sim auth response for the currently configured network.
607b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
608b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param type |GSM-AUTH|, |UMTS-AUTH| or |UMTS-AUTS|.
609b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param response Response params.
610b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return true if succeeds, false otherwise.
611b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
612f97140d51d14ce0659d381f443c08dbd94dfea28Honore Tricot    public boolean simAuthResponse(int id, String type, String response) {
613b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        if (SIM_AUTH_RESP_TYPE_GSM_AUTH.equals(type)) {
614b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius            return mSupplicantStaIfaceHal.sendCurrentNetworkEapSimGsmAuthResponse(
615b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius                    mInterfaceName, response);
616b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        } else if (SIM_AUTH_RESP_TYPE_UMTS_AUTH.equals(type)) {
617b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius            return mSupplicantStaIfaceHal.sendCurrentNetworkEapSimUmtsAuthResponse(
618b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius                    mInterfaceName, response);
619b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        } else if (SIM_AUTH_RESP_TYPE_UMTS_AUTS.equals(type)) {
620b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius            return mSupplicantStaIfaceHal.sendCurrentNetworkEapSimUmtsAutsResponse(
621b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius                    mInterfaceName, response);
6225cf97c9b13cc06554c8901e63d55ba051b7e7881Roshan Pius        } else {
623b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius            return false;
6245cf97c9b13cc06554c8901e63d55ba051b7e7881Roshan Pius        }
62533b575ca6bee66183929f9474b5a161432918604Vinit Deshpande    }
62633b575ca6bee66183929f9474b5a161432918604Vinit Deshpande
627b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
628b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Send the eap sim gsm auth failure for the currently configured network.
629b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
630b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return true if succeeds, false otherwise.
631b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
63226eebecc04b55129a902d1e7b670fe05668c14faVinit Deshpande    public boolean simAuthFailedResponse(int id) {
633b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius        return mSupplicantStaIfaceHal.sendCurrentNetworkEapSimGsmAuthFailure(mInterfaceName);
63426eebecc04b55129a902d1e7b670fe05668c14faVinit Deshpande    }
63526eebecc04b55129a902d1e7b670fe05668c14faVinit Deshpande
636b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
637b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Send the eap sim umts auth failure for the currently configured network.
638b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
639b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return true if succeeds, false otherwise.
640b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
64126eebecc04b55129a902d1e7b670fe05668c14faVinit Deshpande    public boolean umtsAuthFailedResponse(int id) {
642b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius        return mSupplicantStaIfaceHal.sendCurrentNetworkEapSimUmtsAuthFailure(mInterfaceName);
64326eebecc04b55129a902d1e7b670fe05668c14faVinit Deshpande    }
64426eebecc04b55129a902d1e7b670fe05668c14faVinit Deshpande
645b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
646b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Send the eap identity response for the currently configured network.
647b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
648b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param response String to send.
649b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return true if succeeds, false otherwise.
650b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
651ad607d99c372160c7d4b38e755e1b47d6419856eHonore Tricot    public boolean simIdentityResponse(int id, String response) {
652b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius        return mSupplicantStaIfaceHal.sendCurrentNetworkEapIdentityResponse(
653b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius                mInterfaceName, response);
654ad607d99c372160c7d4b38e755e1b47d6419856eHonore Tricot    }
655ad607d99c372160c7d4b38e755e1b47d6419856eHonore Tricot
656b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
657a1da73ea4926ce8a5689594ff3685b0fe033d99fNingyuan Wang     * This get anonymous identity from supplicant and returns it as a string.
658a1da73ea4926ce8a5689594ff3685b0fe033d99fNingyuan Wang     *
659a1da73ea4926ce8a5689594ff3685b0fe033d99fNingyuan Wang     * @return anonymous identity string if succeeds, null otherwise.
660a1da73ea4926ce8a5689594ff3685b0fe033d99fNingyuan Wang     */
661a1da73ea4926ce8a5689594ff3685b0fe033d99fNingyuan Wang    public String getEapAnonymousIdentity() {
662b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius        return mSupplicantStaIfaceHal.getCurrentNetworkEapAnonymousIdentity(mInterfaceName);
663a1da73ea4926ce8a5689594ff3685b0fe033d99fNingyuan Wang    }
664a1da73ea4926ce8a5689594ff3685b0fe033d99fNingyuan Wang
665a1da73ea4926ce8a5689594ff3685b0fe033d99fNingyuan Wang    /**
666b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Start WPS pin registrar operation with the specified peer and pin.
667b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
668b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param bssid BSSID of the peer.
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 startWpsRegistrar(String bssid, String pin) {
673b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius        return mSupplicantStaIfaceHal.startWpsRegistrar(mInterfaceName, bssid, pin);
674155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
675155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
676b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
677b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Cancels any ongoing WPS requests.
678b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
679b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return true if request is sent successfully, false otherwise.
680b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
681155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    public boolean cancelWps() {
682b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius        return mSupplicantStaIfaceHal.cancelWps(mInterfaceName);
683155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
684155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
685b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
686b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Set WPS device name.
687b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
688b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param name String to be set.
689b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return true if request is sent successfully, false otherwise.
690b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
691155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    public boolean setDeviceName(String name) {
692b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius        return mSupplicantStaIfaceHal.setWpsDeviceName(mInterfaceName, name);
693155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
694155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
695b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
696b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Set WPS device type.
697b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
698b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param type Type specified as a string. Used format: <categ>-<OUI>-<subcateg>
699b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return true if request is sent successfully, false otherwise.
700b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
701155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    public boolean setDeviceType(String type) {
702b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius        return mSupplicantStaIfaceHal.setWpsDeviceType(mInterfaceName, type);
703155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
704155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
705b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
706b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Set WPS config methods
707b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
708b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param cfg List of config methods.
709b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return true if request is sent successfully, false otherwise.
710b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
711155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    public boolean setConfigMethods(String cfg) {
712b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius        return mSupplicantStaIfaceHal.setWpsConfigMethods(mInterfaceName, cfg);
713155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
714155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
715b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
716b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Set WPS manufacturer.
717b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
718b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param value String to be set.
719b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return true if request is sent successfully, false otherwise.
720b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
721155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    public boolean setManufacturer(String value) {
722b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius        return mSupplicantStaIfaceHal.setWpsManufacturer(mInterfaceName, value);
723155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
724155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
725b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
726b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Set WPS model name.
727b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
728b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param value String to be set.
729b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return true if request is sent successfully, false otherwise.
730b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
731155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    public boolean setModelName(String value) {
732b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius        return mSupplicantStaIfaceHal.setWpsModelName(mInterfaceName, value);
733155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
734155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
735b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
736b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Set WPS model number.
737b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
738b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param value String to be set.
739b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return true if request is sent successfully, false otherwise.
740b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
741155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    public boolean setModelNumber(String value) {
742b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius        return mSupplicantStaIfaceHal.setWpsModelNumber(mInterfaceName, value);
743155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
744155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
745b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
746b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Set WPS serial number.
747b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
748b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param value String to be set.
749b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return true if request is sent successfully, false otherwise.
750b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
751155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    public boolean setSerialNumber(String value) {
752b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius        return mSupplicantStaIfaceHal.setWpsSerialNumber(mInterfaceName, value);
753155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
754155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
755b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
756b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Enable or disable power save mode.
757b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
758b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param enabled true to enable, false to disable.
759b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
760155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    public void setPowerSave(boolean enabled) {
761b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius        mSupplicantStaIfaceHal.setPowerSave(mInterfaceName, enabled);
762155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
763155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
764b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
765b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Set concurrency priority between P2P & STA operations.
766b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
767b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param isStaHigherPriority Set to true to prefer STA over P2P during concurrency operations,
768b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *                            false otherwise.
769b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return true if request is sent successfully, false otherwise.
770b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
771b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    public boolean setConcurrencyPriority(boolean isStaHigherPriority) {
772b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        return mSupplicantStaIfaceHal.setConcurrencyPriority(isStaHigherPriority);
773155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
774155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
775155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    /**
7763e240b2bfb6fefe8b91ad68e8a12b652b4136c69Roshan Pius     * Enable/Disable auto reconnect functionality in wpa_supplicant.
7773e240b2bfb6fefe8b91ad68e8a12b652b4136c69Roshan Pius     *
7783e240b2bfb6fefe8b91ad68e8a12b652b4136c69Roshan Pius     * @param enable true to enable auto reconnecting, false to disable.
7793e240b2bfb6fefe8b91ad68e8a12b652b4136c69Roshan Pius     * @return true if request is sent successfully, false otherwise.
7803e240b2bfb6fefe8b91ad68e8a12b652b4136c69Roshan Pius     */
7813e240b2bfb6fefe8b91ad68e8a12b652b4136c69Roshan Pius    public boolean enableStaAutoReconnect(boolean enable) {
782b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius        return mSupplicantStaIfaceHal.enableAutoReconnect(mInterfaceName, enable);
7833e240b2bfb6fefe8b91ad68e8a12b652b4136c69Roshan Pius    }
7843e240b2bfb6fefe8b91ad68e8a12b652b4136c69Roshan Pius
7853e240b2bfb6fefe8b91ad68e8a12b652b4136c69Roshan Pius    /**
786b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Migrate all the configured networks from wpa_supplicant.
787b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
788b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param configs       Map of configuration key to configuration objects corresponding to all
789b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *                      the networks.
790b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param networkExtras Map of extra configuration parameters stored in wpa_supplicant.conf
791b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return Max priority of all the configs.
792155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande     */
793b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    public boolean migrateNetworksFromSupplicant(Map<String, WifiConfiguration> configs,
794b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius                                                 SparseArray<Map<String, String>> networkExtras) {
795b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius        return mSupplicantStaIfaceHal.loadNetworks(mInterfaceName, configs, networkExtras);
796155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
797155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
798b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
799b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Add the provided network configuration to wpa_supplicant and initiate connection to it.
800b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * This method does the following:
801c4ad341e844e88a34be7ed4c3c9509fb72608b37Ningyuan Wang     * 1. Abort any ongoing scan to unblock the connection request.
802c4ad341e844e88a34be7ed4c3c9509fb72608b37Ningyuan Wang     * 2. Remove any existing network in wpa_supplicant(This implicitly triggers disconnect).
803c4ad341e844e88a34be7ed4c3c9509fb72608b37Ningyuan Wang     * 3. Add a new network to wpa_supplicant.
804c4ad341e844e88a34be7ed4c3c9509fb72608b37Ningyuan Wang     * 4. Save the provided configuration to wpa_supplicant.
805c4ad341e844e88a34be7ed4c3c9509fb72608b37Ningyuan Wang     * 5. Select the new network in wpa_supplicant.
806c4ad341e844e88a34be7ed4c3c9509fb72608b37Ningyuan Wang     * 6. Triggers reconnect command to wpa_supplicant.
807b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
808b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param configuration WifiConfiguration parameters for the provided network.
809b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return {@code true} if it succeeds, {@code false} otherwise
810b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
811a5936a61582404692c6046e3b496d3b1d22a94cbNingyuan Wang    public boolean connectToNetwork(WifiConfiguration configuration) {
812c4ad341e844e88a34be7ed4c3c9509fb72608b37Ningyuan Wang        // Abort ongoing scan before connect() to unblock connection request.
81391375b39b0fdd6b9c692a5d48120673ee472e3ffRoshan Pius        mWificondControl.abortScan(mInterfaceName);
814b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius        return mSupplicantStaIfaceHal.connectToNetwork(mInterfaceName, configuration);
815155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
816155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
817b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
818b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Initiates roaming to the already configured network in wpa_supplicant. If the network
819b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * configuration provided does not match the already configured network, then this triggers
820b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * a new connection attempt (instead of roam).
821c4ad341e844e88a34be7ed4c3c9509fb72608b37Ningyuan Wang     * 1. Abort any ongoing scan to unblock the roam request.
822c4ad341e844e88a34be7ed4c3c9509fb72608b37Ningyuan Wang     * 2. First check if we're attempting to connect to the same network as we currently have
823b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * configured.
824c4ad341e844e88a34be7ed4c3c9509fb72608b37Ningyuan Wang     * 3. Set the new bssid for the network in wpa_supplicant.
825c4ad341e844e88a34be7ed4c3c9509fb72608b37Ningyuan Wang     * 4. Triggers reassociate command to wpa_supplicant.
826b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
827b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param configuration WifiConfiguration parameters for the provided network.
828b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return {@code true} if it succeeds, {@code false} otherwise
829b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
830b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    public boolean roamToNetwork(WifiConfiguration configuration) {
831c4ad341e844e88a34be7ed4c3c9509fb72608b37Ningyuan Wang        // Abort ongoing scan before connect() to unblock roaming request.
83291375b39b0fdd6b9c692a5d48120673ee472e3ffRoshan Pius        mWificondControl.abortScan(mInterfaceName);
833b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius        return mSupplicantStaIfaceHal.roamToNetwork(mInterfaceName, configuration);
834155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
835155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
836b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
837b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Get the framework network ID corresponding to the provided supplicant network ID for the
838b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * network configured in wpa_supplicant.
839b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
840b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param supplicantNetworkId network ID in wpa_supplicant for the network.
841b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return Corresponding framework network ID if found, -1 if network not found.
842b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
843b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    public int getFrameworkNetworkId(int supplicantNetworkId) {
844b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        return supplicantNetworkId;
845155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
846155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
847b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
848b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Remove all the networks.
849b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
850b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return {@code true} if it succeeds, {@code false} otherwise
851b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
852b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    public boolean removeAllNetworks() {
853b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius        return mSupplicantStaIfaceHal.removeAllNetworks(mInterfaceName);
854155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
855155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
856b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
857b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Set the BSSID for the currently configured network in wpa_supplicant.
858b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
859b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return true if successful, false otherwise.
860b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
861b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    public boolean setConfiguredNetworkBSSID(String bssid) {
862b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius        return mSupplicantStaIfaceHal.setCurrentNetworkBssid(mInterfaceName, bssid);
863155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
864155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
865b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
866b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Initiate ANQP query.
867b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
868b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param bssid BSSID of the AP to be queried
869b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param anqpIds Set of anqp IDs.
870b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param hs20Subtypes Set of HS20 subtypes.
871b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return true on success, false otherwise.
872b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
873b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    public boolean requestAnqp(String bssid, Set<Integer> anqpIds, Set<Integer> hs20Subtypes) {
874b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        if (bssid == null || ((anqpIds == null || anqpIds.isEmpty())
875b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius                && (hs20Subtypes == null || hs20Subtypes.isEmpty()))) {
876b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius            Log.e(mTAG, "Invalid arguments for ANQP request.");
877155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande            return false;
878155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande        }
879b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        ArrayList<Short> anqpIdList = new ArrayList<>();
880b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        for (Integer anqpId : anqpIds) {
881b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius            anqpIdList.add(anqpId.shortValue());
88261233efc46707ace6cb3a45dd84766f06df946afTomasz Wiszkowski        }
883b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        ArrayList<Integer> hs20SubtypeList = new ArrayList<>();
884b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        hs20SubtypeList.addAll(hs20Subtypes);
885b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius        return mSupplicantStaIfaceHal.initiateAnqpQuery(
886b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius                mInterfaceName, bssid, anqpIdList, hs20SubtypeList);
887155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
888155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
889b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
890b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Request a passpoint icon file |filename| from the specified AP |bssid|.
891b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param bssid BSSID of the AP
892b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param fileName name of the icon file
893b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return true if request is sent successfully, false otherwise
894b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
895b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    public boolean requestIcon(String  bssid, String fileName) {
896b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        if (bssid == null || fileName == null) {
897b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius            Log.e(mTAG, "Invalid arguments for Icon request.");
89861233efc46707ace6cb3a45dd84766f06df946afTomasz Wiszkowski            return false;
899155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande        }
900b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius        return mSupplicantStaIfaceHal.initiateHs20IconQuery(mInterfaceName, bssid, fileName);
901155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
902155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
903b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
904b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Get the currently configured network's WPS NFC token.
905b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
906b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return Hex string corresponding to the WPS NFC token.
907b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
908ba3f5bc64ef27f2ec0d3eae3f53c633ea9e66268Amin Shaikh    public String getCurrentNetworkWpsNfcConfigurationToken() {
909b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius        return mSupplicantStaIfaceHal.getCurrentNetworkWpsNfcConfigurationToken(mInterfaceName);
910155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
911403df479e25031276c738dbea334f09bb7e4bf37Ningyuan Wang
912403df479e25031276c738dbea334f09bb7e4bf37Ningyuan Wang    /** Remove the request |networkId| from supplicant if it's the current network,
913403df479e25031276c738dbea334f09bb7e4bf37Ningyuan Wang     * if the current configured network matches |networkId|.
914403df479e25031276c738dbea334f09bb7e4bf37Ningyuan Wang     *
915403df479e25031276c738dbea334f09bb7e4bf37Ningyuan Wang     * @param networkId network id of the network to be removed from supplicant.
916403df479e25031276c738dbea334f09bb7e4bf37Ningyuan Wang     */
917403df479e25031276c738dbea334f09bb7e4bf37Ningyuan Wang    public void removeNetworkIfCurrent(int networkId) {
918b8dc0d2fb3b03c84922136452f1aacb43649ae85Roshan Pius        mSupplicantStaIfaceHal.removeNetworkIfCurrent(mInterfaceName, networkId);
919403df479e25031276c738dbea334f09bb7e4bf37Ningyuan Wang    }
920403df479e25031276c738dbea334f09bb7e4bf37Ningyuan Wang
921b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /********************************************************
922b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Vendor HAL operations
923b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     ********************************************************/
924af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius    /**
925af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius     * Callback to notify vendor HAL death.
926af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius     */
927af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius    public interface VendorHalDeathEventHandler {
928af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius        /**
929af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius         * Invoked when the vendor HAL dies.
930af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius         */
931af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius        void onDeath();
932af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius    }
933b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius
934d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    /**
935520fbe7db055661af039303c1081236c73b04abdRoshan Pius     * Initializes the vendor HAL. This is just used to initialize the {@link HalDeviceManager}.
936520fbe7db055661af039303c1081236c73b04abdRoshan Pius     */
937af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius    public boolean initializeVendorHal(VendorHalDeathEventHandler handler) {
938af0e32cfa2f7402c60b9df88a0d9bd19f421026cRoshan Pius        return mWifiVendorHal.initialize(handler);
939520fbe7db055661af039303c1081236c73b04abdRoshan Pius    }
940520fbe7db055661af039303c1081236c73b04abdRoshan Pius
941520fbe7db055661af039303c1081236c73b04abdRoshan Pius    /**
9428131b04dc799cb0c75240c7b9eb0517ba1f00be8Roshan Pius     * Bring up the Vendor HAL and configure for STA mode or AP mode, if vendor HAL is supported.
943d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     *
944d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     * @param isStaMode true to start HAL in STA mode, false to start in AP mode.
9458131b04dc799cb0c75240c7b9eb0517ba1f00be8Roshan Pius     * @return false if the HAL start fails, true if successful or if vendor HAL not supported.
946d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius     */
9478131b04dc799cb0c75240c7b9eb0517ba1f00be8Roshan Pius    private boolean startHalIfNecessary(boolean isStaMode) {
9488131b04dc799cb0c75240c7b9eb0517ba1f00be8Roshan Pius        if (!mWifiVendorHal.isVendorHalSupported()) {
9498131b04dc799cb0c75240c7b9eb0517ba1f00be8Roshan Pius            Log.i(mTAG, "Vendor HAL not supported, Ignore start...");
9508131b04dc799cb0c75240c7b9eb0517ba1f00be8Roshan Pius            return true;
9518131b04dc799cb0c75240c7b9eb0517ba1f00be8Roshan Pius        }
9523153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        if (isStaMode) {
9533153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius            return mWifiVendorHal.startVendorHalSta();
9543153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        } else {
9553153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius            return mWifiVendorHal.startVendorHalAp();
9563153926f9b95f42a8d3175b4f0e4d2e448ea8fc1Roshan Pius        }
9577ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde    }
9587ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde
959b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
9608131b04dc799cb0c75240c7b9eb0517ba1f00be8Roshan Pius     * Stops the HAL, if vendor HAL is supported.
961b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
9628131b04dc799cb0c75240c7b9eb0517ba1f00be8Roshan Pius    private void stopHalIfNecessary() {
9638131b04dc799cb0c75240c7b9eb0517ba1f00be8Roshan Pius        if (!mWifiVendorHal.isVendorHalSupported()) {
9648131b04dc799cb0c75240c7b9eb0517ba1f00be8Roshan Pius            Log.i(mTAG, "Vendor HAL not supported, Ignore stop...");
9658131b04dc799cb0c75240c7b9eb0517ba1f00be8Roshan Pius            return;
9668131b04dc799cb0c75240c7b9eb0517ba1f00be8Roshan Pius        }
967b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        mWifiVendorHal.stopVendorHal();
9687ef73dd1b6e43c72b3841723504cd86dc402a134Vinit Deshapnde    }
9697f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
970b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
971b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Tests whether the HAL is running or not
972b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
97318786eca942042388748b0d98979f21c9dff4a89Mitchell Wills    public boolean isHalStarted() {
974b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        return mWifiVendorHal.isHalStarted();
9757f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    }
9767f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
977062e3f39e37874fedc01f267de5f4cf7dbebe2b4Randy Pan    // TODO: Change variable names to camel style.
978e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    public static class ScanCapabilities {
979297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        public int  max_scan_cache_size;
980e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        public int  max_scan_buckets;
981e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        public int  max_ap_cache_per_scan;
982e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        public int  max_rssi_sample_size;
983297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        public int  max_scan_reporting_threshold;
984e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    }
985e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
986b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
987b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Gets the scan capabilities
988b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
989b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param capabilities object to be filled in
990b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return true for success. false for failure
991b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
9926ba8a37de432d957e10dd9cc74798758870d02e6Michael Plass    public boolean getBgScanCapabilities(ScanCapabilities capabilities) {
993d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        return mWifiVendorHal.getBgScanCapabilities(mInterfaceName, capabilities);
994e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    }
995e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
996e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    public static class ChannelSettings {
997712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills        public int frequency;
998712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills        public int dwell_time_ms;
999712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills        public boolean passive;
10007f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    }
10017f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
1002e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    public static class BucketSettings {
1003712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills        public int bucket;
1004712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills        public int band;
1005712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills        public int period_ms;
1006712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills        public int max_period_ms;
1007712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills        public int step_count;
1008712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills        public int report_events;
1009712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills        public int num_channels;
1010712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills        public ChannelSettings[] channels;
1011e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    }
10127f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
10136259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius    /**
10146259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius     * Network parameters for hidden networks to be scanned for.
10156259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius     */
10166259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius    public static class HiddenNetwork {
10176259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius        public String ssid;
10186259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius
10196259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius        @Override
10206259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius        public boolean equals(Object otherObj) {
10216259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius            if (this == otherObj) {
10226259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius                return true;
10236259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius            } else if (otherObj == null || getClass() != otherObj.getClass()) {
10246259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius                return false;
10256259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius            }
10266259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius            HiddenNetwork other = (HiddenNetwork) otherObj;
10276259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius            return Objects.equals(ssid, other.ssid);
10286259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius        }
1029ef1606e936204c56ffdae305f2f423ee3503fecdMehdi Alizadeh
1030ef1606e936204c56ffdae305f2f423ee3503fecdMehdi Alizadeh        @Override
1031ef1606e936204c56ffdae305f2f423ee3503fecdMehdi Alizadeh        public int hashCode() {
1032ef1606e936204c56ffdae305f2f423ee3503fecdMehdi Alizadeh            return (ssid == null ? 0 : ssid.hashCode());
1033ef1606e936204c56ffdae305f2f423ee3503fecdMehdi Alizadeh        }
10346259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius    }
10356259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius
1036e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    public static class ScanSettings {
1037712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills        public int base_period_ms;
1038712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills        public int max_ap_per_scan;
1039712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills        public int report_threshold_percent;
1040712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills        public int report_threshold_num_scans;
1041712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills        public int num_buckets;
10426259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius        /* Not used for bg scans. Only works for single scans. */
10436259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius        public HiddenNetwork[] hiddenNetworks;
1044712ef6246834caeac3d5b06bea08e85d6b29cd7aMitchell Wills        public BucketSettings[] buckets;
1045e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    }
10467f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
104768cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang    /**
10489bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius     * Network parameters to start PNO scan.
10499bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius     */
10509bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius    public static class PnoNetwork {
10519bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius        public String ssid;
10529bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius        public byte flags;
1053ef3ea1092bc17673c0a85a845b053151b7c10e07Roshan Pius        public byte auth_bit_field;
10541bf983a4211f547593a60523e43112ecdb5c8997Roshan Pius
10551bf983a4211f547593a60523e43112ecdb5c8997Roshan Pius        @Override
10561bf983a4211f547593a60523e43112ecdb5c8997Roshan Pius        public boolean equals(Object otherObj) {
10571bf983a4211f547593a60523e43112ecdb5c8997Roshan Pius            if (this == otherObj) {
10581bf983a4211f547593a60523e43112ecdb5c8997Roshan Pius                return true;
10591bf983a4211f547593a60523e43112ecdb5c8997Roshan Pius            } else if (otherObj == null || getClass() != otherObj.getClass()) {
10601bf983a4211f547593a60523e43112ecdb5c8997Roshan Pius                return false;
10611bf983a4211f547593a60523e43112ecdb5c8997Roshan Pius            }
10621bf983a4211f547593a60523e43112ecdb5c8997Roshan Pius            PnoNetwork other = (PnoNetwork) otherObj;
10636259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius            return ((Objects.equals(ssid, other.ssid)) && (flags == other.flags)
10641bf983a4211f547593a60523e43112ecdb5c8997Roshan Pius                    && (auth_bit_field == other.auth_bit_field));
10651bf983a4211f547593a60523e43112ecdb5c8997Roshan Pius        }
1066ef1606e936204c56ffdae305f2f423ee3503fecdMehdi Alizadeh
1067ef1606e936204c56ffdae305f2f423ee3503fecdMehdi Alizadeh        @Override
1068ef1606e936204c56ffdae305f2f423ee3503fecdMehdi Alizadeh        public int hashCode() {
1069ef1606e936204c56ffdae305f2f423ee3503fecdMehdi Alizadeh            int result = (ssid == null ? 0 : ssid.hashCode());
1070ef1606e936204c56ffdae305f2f423ee3503fecdMehdi Alizadeh            result ^= ((int) flags * 31) + ((int) auth_bit_field << 8);
1071ef1606e936204c56ffdae305f2f423ee3503fecdMehdi Alizadeh            return result;
1072ef1606e936204c56ffdae305f2f423ee3503fecdMehdi Alizadeh        }
10739bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius    }
10749bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius
10759bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius    /**
10769bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius     * Parameters to start PNO scan. This holds the list of networks which are going to used for
10779bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius     * PNO scan.
10789bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius     */
10799bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius    public static class PnoSettings {
10809bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius        public int min5GHzRssi;
10819bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius        public int min24GHzRssi;
10829bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius        public int initialScoreMax;
10839bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius        public int currentConnectionBonus;
10849bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius        public int sameNetworkBonus;
10859bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius        public int secureBonus;
10869bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius        public int band5GHzBonus;
108704c453c2e07efc30b99528926f205740226f1c7bNingyuan Wang        public int periodInMs;
1088dcd877d6c143db557884993ea437e2a432cb0ba3Roshan Pius        public boolean isConnected;
10899bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius        public PnoNetwork[] networkList;
10909bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius    }
10919bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius
1092b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande    public static interface ScanEventHandler {
109363539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills        /**
109463539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills         * Called for each AP as it is found with the entire contents of the beacon/probe response.
109563539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills         * Only called when WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT is specified.
109663539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills         */
1097c9e6069eb941d282af213dc20b171877db6b567bMitchell Wills        void onFullScanResult(ScanResult fullScanResult, int bucketsScanned);
109863539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills        /**
109963539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills         * Callback on an event during a gscan scan.
110063539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills         * See WifiNative.WIFI_SCAN_* for possible values.
110163539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills         */
110263539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills        void onScanStatus(int event);
110363539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills        /**
110463539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills         * Called with the current cached scan results when gscan is paused.
110563539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills         */
110683a674a18c84ff4f01377bbfd8988699dec93bc2Vinit Deshpande        void onScanPaused(WifiScanner.ScanData[] data);
110763539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills        /**
110863539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills         * Called with the current cached scan results when gscan is resumed.
110963539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills         */
1110b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande        void onScanRestarted();
1111e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    }
1112e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
11139bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius    /**
11149bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius     * Handler to notify the occurrence of various events during PNO scan.
11159bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius     */
11169bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius    public interface PnoEventHandler {
11179bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius        /**
11189bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius         * Callback to notify when one of the shortlisted networks is found during PNO scan.
11199bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius         * @param results List of Scan results received.
11209bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius         */
11219bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius        void onPnoNetworkFound(ScanResult[] results);
1122063cfc7e3eef78fcbda24a66f0c473828b39c854Roshan Pius
1123063cfc7e3eef78fcbda24a66f0c473828b39c854Roshan Pius        /**
1124063cfc7e3eef78fcbda24a66f0c473828b39c854Roshan Pius         * Callback to notify when the PNO scan schedule fails.
1125063cfc7e3eef78fcbda24a66f0c473828b39c854Roshan Pius         */
1126063cfc7e3eef78fcbda24a66f0c473828b39c854Roshan Pius        void onPnoScanFailed();
11279bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius    }
11289bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius
112971af8bb37fee5852ae458edabdef3b487d62a5b8Mitchell Wills    public static final int WIFI_SCAN_RESULTS_AVAILABLE = 0;
113071af8bb37fee5852ae458edabdef3b487d62a5b8Mitchell Wills    public static final int WIFI_SCAN_THRESHOLD_NUM_SCANS = 1;
113171af8bb37fee5852ae458edabdef3b487d62a5b8Mitchell Wills    public static final int WIFI_SCAN_THRESHOLD_PERCENT = 2;
113271af8bb37fee5852ae458edabdef3b487d62a5b8Mitchell Wills    public static final int WIFI_SCAN_FAILED = 3;
1133b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande
1134b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
1135b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Starts a background scan.
1136b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Any ongoing scan will be stopped first
1137b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
1138b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param settings     to control the scan
1139b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param eventHandler to call with the results
1140b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return true for success
1141b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
11426ba8a37de432d957e10dd9cc74798758870d02e6Michael Plass    public boolean startBgScan(ScanSettings settings, ScanEventHandler eventHandler) {
1143d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        return mWifiVendorHal.startBgScan(mInterfaceName, settings, eventHandler);
11447f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde    }
11457f9a15d554f69311a0db43347d6473a7c4c46e2eVinit Deshapnde
1146b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
1147b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Stops any ongoing backgound scan
1148b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
11496ba8a37de432d957e10dd9cc74798758870d02e6Michael Plass    public void stopBgScan() {
1150d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        mWifiVendorHal.stopBgScan(mInterfaceName);
1151b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande    }
1152b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande
1153b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
1154b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Pauses an ongoing backgound scan
1155b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
11566ba8a37de432d957e10dd9cc74798758870d02e6Michael Plass    public void pauseBgScan() {
1157d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        mWifiVendorHal.pauseBgScan(mInterfaceName);
1158b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande    }
1159b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande
1160b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
1161b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Restarts a paused scan
1162b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
11636ba8a37de432d957e10dd9cc74798758870d02e6Michael Plass    public void restartBgScan() {
1164d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        mWifiVendorHal.restartBgScan(mInterfaceName);
1165e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    }
1166e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
1167b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
1168b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Gets the latest scan results received.
1169b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
11706ba8a37de432d957e10dd9cc74798758870d02e6Michael Plass    public WifiScanner.ScanData[] getBgScanResults() {
1171d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        return mWifiVendorHal.getBgScanResults(mInterfaceName);
1172e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    }
1173e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
1174d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius    public WifiLinkLayerStats getWifiLinkLayerStats() {
1175d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        return mWifiVendorHal.getWifiLinkLayerStats(mInterfaceName);
11765c08cc119b92af69997af194cc8b6d0111e37d31Andres Morales    }
11775c08cc119b92af69997af194cc8b6d0111e37d31Andres Morales
1178b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
1179b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Get the supported features
1180b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
1181b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return bitmask defined by WifiManager.WIFI_FEATURE_*
1182b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
118318786eca942042388748b0d98979f21c9dff4a89Mitchell Wills    public int getSupportedFeatureSet() {
1184d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        return mWifiVendorHal.getSupportedFeatureSet(mInterfaceName);
1185a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande    }
1186143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande
1187143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande    public static interface RttEventHandler {
1188143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande        void onRttResults(RttManager.RttResult[] result);
1189143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande    }
1190143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande
1191b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
1192b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Starts a new rtt request
1193b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
1194b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param params RTT request params. Refer to {@link RttManager#RttParams}.
1195b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param handler Callback to be invoked to notify any results.
1196b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return true if the request was successful, false otherwise.
1197b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
119818786eca942042388748b0d98979f21c9dff4a89Mitchell Wills    public boolean requestRtt(
1199143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande            RttManager.RttParams[] params, RttEventHandler handler) {
1200b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        return mWifiVendorHal.requestRtt(params, handler);
1201143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande    }
1202143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande
1203b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
1204b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Cancels an outstanding rtt request
1205b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
1206b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param params RTT request params. Refer to {@link RttManager#RttParams}
1207b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return true if there was an outstanding request and it was successfully cancelled
1208b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
120918786eca942042388748b0d98979f21c9dff4a89Mitchell Wills    public boolean cancelRtt(RttManager.RttParams[] params) {
1210b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        return mWifiVendorHal.cancelRtt(params);
1211143657392bf0702a155fe688171a5abbf4c86570Vinit Deshpande    }
1212042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande
121368cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang    /**
121468cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang     * Enable RTT responder role on the device. Returns {@link ResponderConfig} if the responder
121568cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang     * role is successfully enabled, {@code null} otherwise.
1216b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
1217b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param timeoutSeconds timeout to use for the responder.
121868cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang     */
121968cb8c02b4ad079c54a2ffd4407da921d18c7af9Wei Wang    @Nullable
1220b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    public ResponderConfig enableRttResponder(int timeoutSeconds) {
1221b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        return mWifiVendorHal.enableRttResponder(timeoutSeconds);
122212cf388ecf3b2aa5ba66ed680b931fa356ab75b5xinhe    }
1223939177ff615062ec826601d536466875d8457375xinhe
1224b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
1225b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Disable RTT responder role. Returns {@code true} if responder role is successfully disabled,
1226b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * {@code false} otherwise.
1227b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
1228b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    public boolean disableRttResponder() {
1229b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        return mWifiVendorHal.disableRttResponder();
12306609df5a9c14e4440c085567a27437a8cfc50f88Paul Jensen    }
12316609df5a9c14e4440c085567a27437a8cfc50f88Paul Jensen
1232b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
1233b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Set the MAC OUI during scanning.
1234b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * An OUI {Organizationally Unique Identifier} is a 24-bit number that
1235b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * uniquely identifies a vendor or manufacturer.
1236b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
1237b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param oui OUI to set.
1238b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return true for success
1239b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
1240b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    public boolean setScanningMacOui(byte[] oui) {
1241d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        return mWifiVendorHal.setScanningMacOui(mInterfaceName, oui);
12426609df5a9c14e4440c085567a27437a8cfc50f88Paul Jensen    }
12436609df5a9c14e4440c085567a27437a8cfc50f88Paul Jensen
1244b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
1245b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * RTT (Round Trip Time) measurement capabilities of the device.
1246b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
1247b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    public RttManager.RttCapabilities getRttCapabilities() {
1248b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        return mWifiVendorHal.getRttCapabilities();
1249d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe    }
1250d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe
1251b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
1252b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Get the APF (Android Packet Filter) capabilities of the device
1253b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
1254b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    public ApfCapabilities getApfCapabilities() {
1255d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        return mWifiVendorHal.getApfCapabilities(mInterfaceName);
1256d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe    }
1257d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe
1258b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
1259b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Installs an APF program on this iface, replacing any existing program.
1260b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
1261b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param filter is the android packet filter program
1262b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return true for success
1263b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
1264b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    public boolean installPacketFilter(byte[] filter) {
1265d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        return mWifiVendorHal.installPacketFilter(mInterfaceName, filter);
1266d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe    }
1267d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe
1268b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
1269b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Set country code for this AP iface.
1270b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
1271b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param countryCode - two-letter country code (as ISO 3166)
1272b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return true for success
1273b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
1274b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    public boolean setCountryCodeHal(String countryCode) {
1275d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        return mWifiVendorHal.setCountryCodeHal(mInterfaceName, countryCode);
1276d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe    }
1277d57f630f6a7a5fca872d2b96fc4cce1905daee5dxinhe
1278a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle    //---------------------------------------------------------------------------------
1279a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle    /* Wifi Logger commands/events */
1280a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle    public static interface WifiLoggerEventHandler {
12810bf150b2d69ec62df905bc6f8603437dc4caee1fVinit Deshpande        void onRingBufferData(RingBufferStatus status, byte[] buffer);
12820bf150b2d69ec62df905bc6f8603437dc4caee1fVinit Deshpande        void onWifiAlert(int errorCode, byte[] buffer);
1283a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle    }
1284a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle
1285b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
1286b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Registers the logger callback and enables alerts.
1287b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Ring buffer data collection is only triggered when |startLoggingRingBuffer| is invoked.
1288b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
1289b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param handler Callback to be invoked.
1290b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return true on success, false otherwise.
1291b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
129218786eca942042388748b0d98979f21c9dff4a89Mitchell Wills    public boolean setLoggingEventHandler(WifiLoggerEventHandler handler) {
1293b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        return mWifiVendorHal.setLoggingEventHandler(handler);
129403ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe    }
129503ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe
1296b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
1297b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Control debug data collection
1298b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
1299b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param verboseLevel 0 to 3, inclusive. 0 stops logging.
1300b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param flags        Ignored.
1301b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param maxInterval  Maximum interval between reports; ignore if 0.
1302b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param minDataSize  Minimum data size in buffer for report; ignore if 0.
1303b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param ringName     Name of the ring for which data collection is to start.
1304b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return true for success, false otherwise.
1305b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
130618786eca942042388748b0d98979f21c9dff4a89Mitchell Wills    public boolean startLoggingRingBuffer(int verboseLevel, int flags, int maxInterval,
130703ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe            int minDataSize, String ringName){
1308b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        return mWifiVendorHal.startLoggingRingBuffer(
1309b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius                verboseLevel, flags, maxInterval, minDataSize, ringName);
131003ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe    }
131103ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe
1312b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
1313b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Logger features exposed.
1314b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * This is a no-op now, will always return -1.
1315b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
1316b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return true on success, false otherwise.
1317b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
131818786eca942042388748b0d98979f21c9dff4a89Mitchell Wills    public int getSupportedLoggerFeatureSet() {
1319b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        return mWifiVendorHal.getSupportedLoggerFeatureSet();
132003ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe    }
132103ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe
1322b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
1323b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Stops all logging and resets the logger callback.
1324b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * This stops both the alerts and ring buffer data collection.
1325b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return true on success, false otherwise.
1326b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
132718786eca942042388748b0d98979f21c9dff4a89Mitchell Wills    public boolean resetLogHandler() {
1328b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        return mWifiVendorHal.resetLogHandler();
1329b797893fc1966803d0c013faac42e6396a37a384xinhe    }
1330b797893fc1966803d0c013faac42e6396a37a384xinhe
1331b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
1332b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Vendor-provided wifi driver version string
1333b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
1334b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return String returned from the HAL.
1335b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
133618786eca942042388748b0d98979f21c9dff4a89Mitchell Wills    public String getDriverVersion() {
1337b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        return mWifiVendorHal.getDriverVersion();
133803ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe    }
133903ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe
1340b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
1341b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Vendor-provided wifi firmware version string
1342b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
1343b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return String returned from the HAL.
1344b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
134518786eca942042388748b0d98979f21c9dff4a89Mitchell Wills    public String getFirmwareVersion() {
1346b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        return mWifiVendorHal.getFirmwareVersion();
134703ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe    }
134803ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe
13490bf150b2d69ec62df905bc6f8603437dc4caee1fVinit Deshpande    public static class RingBufferStatus{
13500bf150b2d69ec62df905bc6f8603437dc4caee1fVinit Deshpande        String name;
13510bf150b2d69ec62df905bc6f8603437dc4caee1fVinit Deshpande        int flag;
13520bf150b2d69ec62df905bc6f8603437dc4caee1fVinit Deshpande        int ringBufferId;
13530bf150b2d69ec62df905bc6f8603437dc4caee1fVinit Deshpande        int ringBufferByteSize;
13540bf150b2d69ec62df905bc6f8603437dc4caee1fVinit Deshpande        int verboseLevel;
13550bf150b2d69ec62df905bc6f8603437dc4caee1fVinit Deshpande        int writtenBytes;
13560bf150b2d69ec62df905bc6f8603437dc4caee1fVinit Deshpande        int readBytes;
13570bf150b2d69ec62df905bc6f8603437dc4caee1fVinit Deshpande        int writtenRecords;
13580bf150b2d69ec62df905bc6f8603437dc4caee1fVinit Deshpande
135953f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        // Bit masks for interpreting |flag|
136053f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        public static final int HAS_BINARY_ENTRIES = (1 << 0);
136153f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        public static final int HAS_ASCII_ENTRIES = (1 << 1);
136253f278b6fed422a18d763b07216a21e96d9445f9Michael Plass        public static final int HAS_PER_PACKET_ENTRIES = (1 << 2);
136353f278b6fed422a18d763b07216a21e96d9445f9Michael Plass
13640bf150b2d69ec62df905bc6f8603437dc4caee1fVinit Deshpande        @Override
13650bf150b2d69ec62df905bc6f8603437dc4caee1fVinit Deshpande        public String toString() {
13660bf150b2d69ec62df905bc6f8603437dc4caee1fVinit Deshpande            return "name: " + name + " flag: " + flag + " ringBufferId: " + ringBufferId +
13670bf150b2d69ec62df905bc6f8603437dc4caee1fVinit Deshpande                    " ringBufferByteSize: " +ringBufferByteSize + " verboseLevel: " +verboseLevel +
13680bf150b2d69ec62df905bc6f8603437dc4caee1fVinit Deshpande                    " writtenBytes: " + writtenBytes + " readBytes: " + readBytes +
13690bf150b2d69ec62df905bc6f8603437dc4caee1fVinit Deshpande                    " writtenRecords: " + writtenRecords;
13700bf150b2d69ec62df905bc6f8603437dc4caee1fVinit Deshpande        }
13710bf150b2d69ec62df905bc6f8603437dc4caee1fVinit Deshpande    }
13720bf150b2d69ec62df905bc6f8603437dc4caee1fVinit Deshpande
1373b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
1374b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * API to get the status of all ring buffers supported by driver
1375b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
137618786eca942042388748b0d98979f21c9dff4a89Mitchell Wills    public RingBufferStatus[] getRingBufferStatus() {
1377b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        return mWifiVendorHal.getRingBufferStatus();
137803ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe    }
137903ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe
1380b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
1381b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Indicates to driver that all the data has to be uploaded urgently
1382b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
1383b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param ringName Name of the ring buffer requested.
1384b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return true on success, false otherwise.
1385b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
138618786eca942042388748b0d98979f21c9dff4a89Mitchell Wills    public boolean getRingBufferData(String ringName) {
1387b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        return mWifiVendorHal.getRingBufferData(ringName);
138803ba4a5b108ab2bbdb5d0e7be46ac45c00a6d9ffxinhe    }
1389127f7244183786e6ccae09e81eeccdac31973e69xinhe
1390b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
1391b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Request vendor debug info from the firmware
1392b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
1393b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return Raw data obtained from the HAL.
1394b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
139518786eca942042388748b0d98979f21c9dff4a89Mitchell Wills    public byte[] getFwMemoryDump() {
1396b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        return mWifiVendorHal.getFwMemoryDump();
1397a0d34d3626bd9631039a485d2d428b1b7de390e2Pierre Vandwalle    }
1398dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle
1399b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
1400b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Request vendor debug info from the driver
1401b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
1402b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return Raw data obtained from the HAL.
1403b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
1404d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal    public byte[] getDriverStateDump() {
1405b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        return mWifiVendorHal.getDriverStateDump();
1406d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal    }
1407d0cb2fae195ebb9f658095667f3c7b7b8d69a204mukesh agrawal
1408dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle    //---------------------------------------------------------------------------------
140909b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal    /* Packet fate API */
141009b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal
141109b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal    @Immutable
141209b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal    abstract static class FateReport {
1413eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal        final static int USEC_PER_MSEC = 1000;
1414eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal        // The driver timestamp is a 32-bit counter, in microseconds. This field holds the
1415eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal        // maximal value of a driver timestamp in milliseconds.
1416eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal        final static int MAX_DRIVER_TIMESTAMP_MSEC = (int) (0xffffffffL / 1000);
1417eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal        final static SimpleDateFormat dateFormatter = new SimpleDateFormat("HH:mm:ss.SSS");
1418eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal
141909b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal        final byte mFate;
142009b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal        final long mDriverTimestampUSec;
142109b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal        final byte mFrameType;
142209b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal        final byte[] mFrameBytes;
1423eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal        final long mEstimatedWallclockMSec;
142409b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal
142509b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal        FateReport(byte fate, long driverTimestampUSec, byte frameType, byte[] frameBytes) {
142609b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal            mFate = fate;
142709b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal            mDriverTimestampUSec = driverTimestampUSec;
1428eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal            mEstimatedWallclockMSec =
1429eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal                    convertDriverTimestampUSecToWallclockMSec(mDriverTimestampUSec);
143009b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal            mFrameType = frameType;
143109b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal            mFrameBytes = frameBytes;
143209b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal        }
14330fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal
1434590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan        public String toTableRowString() {
1435590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan            StringWriter sw = new StringWriter();
1436590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan            PrintWriter pw = new PrintWriter(sw);
1437590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan            FrameParser parser = new FrameParser(mFrameType, mFrameBytes);
1438eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal            dateFormatter.setTimeZone(TimeZone.getDefault());
1439eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal            pw.format("%-15s  %12s  %-9s  %-32s  %-12s  %-23s  %s\n",
1440eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal                    mDriverTimestampUSec,
1441eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal                    dateFormatter.format(new Date(mEstimatedWallclockMSec)),
1442eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal                    directionToString(), fateToString(), parser.mMostSpecificProtocolString,
1443eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal                    parser.mTypeString, parser.mResultString);
1444590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan            return sw.toString();
1445590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan        }
1446590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan
1447590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan        public String toVerboseStringWithPiiAllowed() {
14480fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal            StringWriter sw = new StringWriter();
14490fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal            PrintWriter pw = new PrintWriter(sw);
1450590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan            FrameParser parser = new FrameParser(mFrameType, mFrameBytes);
14510fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal            pw.format("Frame direction: %s\n", directionToString());
14520fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal            pw.format("Frame timestamp: %d\n", mDriverTimestampUSec);
14530fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal            pw.format("Frame fate: %s\n", fateToString());
14540fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal            pw.format("Frame type: %s\n", frameTypeToString(mFrameType));
1455590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan            pw.format("Frame protocol: %s\n", parser.mMostSpecificProtocolString);
1456590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan            pw.format("Frame protocol type: %s\n", parser.mTypeString);
14570fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal            pw.format("Frame length: %d\n", mFrameBytes.length);
14580fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal            pw.append("Frame bytes");
1459590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan            pw.append(HexDump.dumpHexString(mFrameBytes));  // potentially contains PII
14600fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal            pw.append("\n");
14610fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal            return sw.toString();
14620fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal        }
14630fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal
1464590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan        /* Returns a header to match the output of toTableRowString(). */
1465590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan        public static String getTableHeader() {
1466590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan            StringWriter sw = new StringWriter();
1467590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan            PrintWriter pw = new PrintWriter(sw);
1468eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal            pw.format("\n%-15s  %-12s  %-9s  %-32s  %-12s  %-23s  %s\n",
1469eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal                    "Time usec", "Walltime", "Direction", "Fate", "Protocol", "Type", "Result");
1470eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal            pw.format("%-15s  %-12s  %-9s  %-32s  %-12s  %-23s  %s\n",
1471eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal                    "---------", "--------", "---------", "----", "--------", "----", "------");
1472590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan            return sw.toString();
1473590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan        }
1474590f3fc2045389d5ef274c4b3bd6162d93b1a0acSamuel Tan
14750fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal        protected abstract String directionToString();
14760fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal
14770fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal        protected abstract String fateToString();
14780fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal
14790fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal        private static String frameTypeToString(byte frameType) {
14800fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal            switch (frameType) {
14810fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal                case WifiLoggerHal.FRAME_TYPE_UNKNOWN:
14820fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal                    return "unknown";
14830fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal                case WifiLoggerHal.FRAME_TYPE_ETHERNET_II:
14840fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal                    return "data";
14850fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal                case WifiLoggerHal.FRAME_TYPE_80211_MGMT:
14860fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal                    return "802.11 management";
14870fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal                default:
14880fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal                    return Byte.toString(frameType);
14890fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal            }
14900fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal        }
1491eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal
1492eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal        /**
1493eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal         * Converts a driver timestamp to a wallclock time, based on the current
1494eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal         * BOOTTIME to wallclock mapping. The driver timestamp is a 32-bit counter of
1495eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal         * microseconds, with the same base as BOOTTIME.
1496eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal         */
1497eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal        private static long convertDriverTimestampUSecToWallclockMSec(long driverTimestampUSec) {
1498eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal            final long wallclockMillisNow = System.currentTimeMillis();
1499eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal            final long boottimeMillisNow = SystemClock.elapsedRealtime();
1500eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal            final long driverTimestampMillis = driverTimestampUSec / USEC_PER_MSEC;
1501eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal
1502eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal            long boottimeTimestampMillis = boottimeMillisNow % MAX_DRIVER_TIMESTAMP_MSEC;
1503eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal            if (boottimeTimestampMillis < driverTimestampMillis) {
1504eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal                // The 32-bit microsecond count has wrapped between the time that the driver
1505eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal                // recorded the packet, and the call to this function. Adjust the BOOTTIME
1506eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal                // timestamp, to compensate.
1507eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal                //
1508eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal                // Note that overflow is not a concern here, since the result is less than
1509eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal                // 2 * MAX_DRIVER_TIMESTAMP_MSEC. (Given the modulus operation above,
1510eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal                // boottimeTimestampMillis must be less than MAX_DRIVER_TIMESTAMP_MSEC.) And, since
1511eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal                // MAX_DRIVER_TIMESTAMP_MSEC is an int, 2 * MAX_DRIVER_TIMESTAMP_MSEC must fit
1512eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal                // within a long.
1513eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal                boottimeTimestampMillis += MAX_DRIVER_TIMESTAMP_MSEC;
1514eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal            }
1515eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal
1516eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal            final long millisSincePacketTimestamp = boottimeTimestampMillis - driverTimestampMillis;
1517eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal            return wallclockMillisNow - millisSincePacketTimestamp;
1518eaf6303a081b4a7f2231b5053099da7a1c16b7bdmukesh agrawal        }
151909b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal    }
152009b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal
152109b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal    /**
152209b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal     * Represents the fate information for one outbound packet.
152309b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal     */
152409b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal    @Immutable
152509b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal    public static final class TxFateReport extends FateReport {
152609b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal        TxFateReport(byte fate, long driverTimestampUSec, byte frameType, byte[] frameBytes) {
152709b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal            super(fate, driverTimestampUSec, frameType, frameBytes);
152809b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal        }
15290fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal
15300fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal        @Override
15310fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal        protected String directionToString() {
15320fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal            return "TX";
15330fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal        }
15340fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal
15350fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal        @Override
15360fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal        protected String fateToString() {
15370fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal            switch (mFate) {
15380fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal                case WifiLoggerHal.TX_PKT_FATE_ACKED:
15390fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal                    return "acked";
15400fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal                case WifiLoggerHal.TX_PKT_FATE_SENT:
15410fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal                    return "sent";
15420fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal                case WifiLoggerHal.TX_PKT_FATE_FW_QUEUED:
15430fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal                    return "firmware queued";
15440fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal                case WifiLoggerHal.TX_PKT_FATE_FW_DROP_INVALID:
15450fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal                    return "firmware dropped (invalid frame)";
15460fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal                case WifiLoggerHal.TX_PKT_FATE_FW_DROP_NOBUFS:
15470fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal                    return "firmware dropped (no bufs)";
15480fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal                case WifiLoggerHal.TX_PKT_FATE_FW_DROP_OTHER:
15490fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal                    return "firmware dropped (other)";
15500fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal                case WifiLoggerHal.TX_PKT_FATE_DRV_QUEUED:
15510fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal                    return "driver queued";
15520fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal                case WifiLoggerHal.TX_PKT_FATE_DRV_DROP_INVALID:
15530fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal                    return "driver dropped (invalid frame)";
15540fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal                case WifiLoggerHal.TX_PKT_FATE_DRV_DROP_NOBUFS:
15550fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal                    return "driver dropped (no bufs)";
15560fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal                case WifiLoggerHal.TX_PKT_FATE_DRV_DROP_OTHER:
15570fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal                    return "driver dropped (other)";
15580fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal                default:
15590fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal                    return Byte.toString(mFate);
15600fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal            }
15610fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal        }
156209b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal    }
156309b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal
156409b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal    /**
156509b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal     * Represents the fate information for one inbound packet.
156609b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal     */
156709b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal    @Immutable
156809b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal    public static final class RxFateReport extends FateReport {
156909b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal        RxFateReport(byte fate, long driverTimestampUSec, byte frameType, byte[] frameBytes) {
157009b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal            super(fate, driverTimestampUSec, frameType, frameBytes);
157109b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal        }
15720fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal
15730fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal        @Override
15740fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal        protected String directionToString() {
15750fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal            return "RX";
15760fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal        }
15770fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal
15780fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal        @Override
15790fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal        protected String fateToString() {
15800fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal            switch (mFate) {
15810fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal                case WifiLoggerHal.RX_PKT_FATE_SUCCESS:
15820fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal                    return "success";
15830fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal                case WifiLoggerHal.RX_PKT_FATE_FW_QUEUED:
15840fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal                    return "firmware queued";
15850fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal                case WifiLoggerHal.RX_PKT_FATE_FW_DROP_FILTER:
15860fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal                    return "firmware dropped (filter)";
15870fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal                case WifiLoggerHal.RX_PKT_FATE_FW_DROP_INVALID:
15880fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal                    return "firmware dropped (invalid frame)";
15890fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal                case WifiLoggerHal.RX_PKT_FATE_FW_DROP_NOBUFS:
15900fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal                    return "firmware dropped (no bufs)";
15910fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal                case WifiLoggerHal.RX_PKT_FATE_FW_DROP_OTHER:
15920fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal                    return "firmware dropped (other)";
15930fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal                case WifiLoggerHal.RX_PKT_FATE_DRV_QUEUED:
15940fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal                    return "driver queued";
15950fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal                case WifiLoggerHal.RX_PKT_FATE_DRV_DROP_FILTER:
15960fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal                    return "driver dropped (filter)";
15970fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal                case WifiLoggerHal.RX_PKT_FATE_DRV_DROP_INVALID:
15980fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal                    return "driver dropped (invalid frame)";
15990fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal                case WifiLoggerHal.RX_PKT_FATE_DRV_DROP_NOBUFS:
16000fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal                    return "driver dropped (no bufs)";
16010fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal                case WifiLoggerHal.RX_PKT_FATE_DRV_DROP_OTHER:
16020fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal                    return "driver dropped (other)";
16030fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal                default:
16040fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal                    return Byte.toString(mFate);
16050fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal            }
16060fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal        }
160709b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal    }
160809b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal
16090fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal    /**
16100fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal     * Ask the HAL to enable packet fate monitoring. Fails unless HAL is started.
1611b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
1612b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return true for success, false otherwise.
16130fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal     */
16140fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal    public boolean startPktFateMonitoring() {
1615d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        return mWifiVendorHal.startPktFateMonitoring(mInterfaceName);
16160fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal    }
16170fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal
16180fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal    /**
16190fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal     * Fetch the most recent TX packet fates from the HAL. Fails unless HAL is started.
1620b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
1621b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return true for success, false otherwise.
16220fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal     */
16230fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal    public boolean getTxPktFates(TxFateReport[] reportBufs) {
1624d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        return mWifiVendorHal.getTxPktFates(mInterfaceName, reportBufs);
16250fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal    }
16260fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal
16270fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal    /**
16280fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal     * Fetch the most recent RX packet fates from the HAL. Fails unless HAL is started.
16290fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal     */
16300fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal    public boolean getRxPktFates(RxFateReport[] reportBufs) {
1631d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        return mWifiVendorHal.getRxPktFates(mInterfaceName, reportBufs);
16320fcb06473cbe2824e401a80c0520bb1c14ed8f41mukesh agrawal    }
163309b1d0786d05436d524d7556c269e665a0962ee6mukesh agrawal
16345c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius    /**
1635b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Start sending the specified keep alive packets periodically.
1636b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
1637b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param slot Integer used to identify each request.
1638b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param keepAlivePacket Raw packet contents to send.
1639b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param period Period to use for sending these packets.
1640b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return 0 for success, -1 for error
1641b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
1642b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    public int startSendingOffloadedPacket(int slot, KeepalivePacketData keepAlivePacket,
1643b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius                                           int period) {
16443bd22cebc41ed0786d0e7bd2970a634a8bb0093ePrerepa Viswanadham        String[] macAddrStr = getMacAddress().split(":");
16453bd22cebc41ed0786d0e7bd2970a634a8bb0093ePrerepa Viswanadham        byte[] srcMac = new byte[6];
1646520fbe7db055661af039303c1081236c73b04abdRoshan Pius        for (int i = 0; i < 6; i++) {
16473bd22cebc41ed0786d0e7bd2970a634a8bb0093ePrerepa Viswanadham            Integer hexVal = Integer.parseInt(macAddrStr[i], 16);
16483bd22cebc41ed0786d0e7bd2970a634a8bb0093ePrerepa Viswanadham            srcMac[i] = hexVal.byteValue();
16493bd22cebc41ed0786d0e7bd2970a634a8bb0093ePrerepa Viswanadham        }
1650d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        return mWifiVendorHal.startSendingOffloadedPacket(mInterfaceName,
1651b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius                slot, srcMac, keepAlivePacket, period);
1652c55e88163b223db0ca6a99ed6ffe91845c30a576Prerepa Viswanadham    }
1653c55e88163b223db0ca6a99ed6ffe91845c30a576Prerepa Viswanadham
1654b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
1655b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Stop sending the specified keep alive packets.
1656b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
1657b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param slot id - same as startSendingOffloadedPacket call.
1658b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return 0 for success, -1 for error
1659b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
1660b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    public int stopSendingOffloadedPacket(int slot) {
1661d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        return mWifiVendorHal.stopSendingOffloadedPacket(mInterfaceName, slot);
1662c55e88163b223db0ca6a99ed6ffe91845c30a576Prerepa Viswanadham    }
1663aed5cb65d8eefb2eee56a29e33ac3cd8b03312e7Prerepa Viswanadham
1664aed5cb65d8eefb2eee56a29e33ac3cd8b03312e7Prerepa Viswanadham    public static interface WifiRssiEventHandler {
1665aed5cb65d8eefb2eee56a29e33ac3cd8b03312e7Prerepa Viswanadham        void onRssiThresholdBreached(byte curRssi);
1666aed5cb65d8eefb2eee56a29e33ac3cd8b03312e7Prerepa Viswanadham    }
1667aed5cb65d8eefb2eee56a29e33ac3cd8b03312e7Prerepa Viswanadham
1668b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
1669b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Start RSSI monitoring on the currently connected access point.
1670b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
1671b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param maxRssi          Maximum RSSI threshold.
1672b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param minRssi          Minimum RSSI threshold.
1673b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param rssiEventHandler Called when RSSI goes above maxRssi or below minRssi
1674b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return 0 for success, -1 for failure
1675b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
167618786eca942042388748b0d98979f21c9dff4a89Mitchell Wills    public int startRssiMonitoring(byte maxRssi, byte minRssi,
1677b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius                                   WifiRssiEventHandler rssiEventHandler) {
1678d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        return mWifiVendorHal.startRssiMonitoring(
1679d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius                mInterfaceName, maxRssi, minRssi, rssiEventHandler);
1680aed5cb65d8eefb2eee56a29e33ac3cd8b03312e7Prerepa Viswanadham    }
1681aed5cb65d8eefb2eee56a29e33ac3cd8b03312e7Prerepa Viswanadham
168218786eca942042388748b0d98979f21c9dff4a89Mitchell Wills    public int stopRssiMonitoring() {
1683d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        return mWifiVendorHal.stopRssiMonitoring(mInterfaceName);
1684aed5cb65d8eefb2eee56a29e33ac3cd8b03312e7Prerepa Viswanadham    }
16855ea42964ba17901a8d724736b450ace6ed48880fPrerepa Viswanadham
16866bf6986d359556010638dfae332b585162f06520Roshan Pius    /**
16876bf6986d359556010638dfae332b585162f06520Roshan Pius     * Fetch the host wakeup reasons stats from wlan driver.
1688b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
16896bf6986d359556010638dfae332b585162f06520Roshan Pius     * @return the |WifiWakeReasonAndCounts| object retrieved from the wlan driver.
16906bf6986d359556010638dfae332b585162f06520Roshan Pius     */
16916bf6986d359556010638dfae332b585162f06520Roshan Pius    public WifiWakeReasonAndCounts getWlanWakeReasonCount() {
1692b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        return mWifiVendorHal.getWlanWakeReasonCount();
16936bf6986d359556010638dfae332b585162f06520Roshan Pius    }
16943dd6f75ff2ab823bd0c14581f2e047c74916f16fErik Kline
1695b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
1696b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Enable/Disable Neighbour discovery offload functionality in the firmware.
1697b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
1698b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @param enabled true to enable, false to disable.
1699b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return true for success, false otherwise.
1700b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
17013dd6f75ff2ab823bd0c14581f2e047c74916f16fErik Kline    public boolean configureNeighborDiscoveryOffload(boolean enabled) {
1702d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        return mWifiVendorHal.configureNeighborDiscoveryOffload(mInterfaceName, enabled);
17033dd6f75ff2ab823bd0c14581f2e047c74916f16fErik Kline    }
1704da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan
1705da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan    // Firmware roaming control.
1706da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan
1707da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan    /**
1708da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan     * Class to retrieve firmware roaming capability parameters.
1709da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan     */
1710da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan    public static class RoamingCapabilities {
1711da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan        public int  maxBlacklistSize;
1712da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan        public int  maxWhitelistSize;
1713da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan    }
1714da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan
1715da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan    /**
1716da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan     * Query the firmware roaming capabilities.
1717b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return true for success, false otherwise.
1718da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan     */
1719da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan    public boolean getRoamingCapabilities(RoamingCapabilities capabilities) {
1720d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        return mWifiVendorHal.getRoamingCapabilities(mInterfaceName, capabilities);
1721da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan    }
1722da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan
1723da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan    /**
1724da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan     * Macros for controlling firmware roaming.
1725da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan     */
1726da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan    public static final int DISABLE_FIRMWARE_ROAMING = 0;
1727da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan    public static final int ENABLE_FIRMWARE_ROAMING = 1;
1728da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan
1729da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan    /**
1730da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan     * Enable/disable firmware roaming.
1731b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     *
1732b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * @return error code returned from HAL.
1733da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan     */
1734da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan    public int enableFirmwareRoaming(int state) {
1735d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        return mWifiVendorHal.enableFirmwareRoaming(mInterfaceName, state);
1736da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan    }
1737da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan
1738da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan    /**
1739da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan     * Class for specifying the roaming configurations.
1740da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan     */
1741da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan    public static class RoamingConfig {
1742da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan        public ArrayList<String> blacklistBssids;
1743da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan        public ArrayList<String> whitelistSsids;
1744da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan    }
1745da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan
1746da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan    /**
1747da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan     * Set firmware roaming configurations.
1748da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan     */
1749da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan    public boolean configureRoaming(RoamingConfig config) {
1750b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        Log.d(mTAG, "configureRoaming ");
1751d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        return mWifiVendorHal.configureRoaming(mInterfaceName, config);
1752da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan    }
1753da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan
1754374f78d3841f7bf74543dc4d21db66d1d3472c3aRandy Pan    /**
1755374f78d3841f7bf74543dc4d21db66d1d3472c3aRandy Pan     * Reset firmware roaming configuration.
1756374f78d3841f7bf74543dc4d21db66d1d3472c3aRandy Pan     */
1757374f78d3841f7bf74543dc4d21db66d1d3472c3aRandy Pan    public boolean resetRoamingConfiguration() {
1758b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        // Pass in an empty RoamingConfig object which translates to zero size
1759b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        // blacklist and whitelist to reset the firmware roaming configuration.
1760d77212c2b255b5e6331222fde66bdc735295fbbeRoshan Pius        return mWifiVendorHal.configureRoaming(mInterfaceName, new RoamingConfig());
1761b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    }
1762b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius
1763ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    /**
1764b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius     * Tx power level scenarios that can be selected.
1765ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius     */
1766b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius    public static final int TX_POWER_SCENARIO_NORMAL = 0;
1767b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius    public static final int TX_POWER_SCENARIO_VOICE_CALL = 1;
1768ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius
1769ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    /**
1770b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius     * Select one of the pre-configured TX power level scenarios or reset it back to normal.
1771ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius     * Primarily used for meeting SAR requirements during voice calls.
1772ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius     *
1773b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius     * @param scenario Should be one {@link #TX_POWER_SCENARIO_NORMAL} or
1774b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius     *        {@link #TX_POWER_SCENARIO_VOICE_CALL}.
1775ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius     * @return true for success; false for failure or if the HAL version does not support this API.
1776ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius     */
1777b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius    public boolean selectTxPowerScenario(int scenario) {
1778b7f35c58029fe5dce64813271ad4e8b1b6ea8893Roshan Pius        return mWifiVendorHal.selectTxPowerScenario(scenario);
1779ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius    }
1780ba89009ba7554d5073c0b93c04f167c3a11667faRoshan Pius
1781b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /********************************************************
1782b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * JNI operations
1783b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     ********************************************************/
1784b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /* Register native functions */
1785b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    static {
1786b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        /* Native functions are defined in libwifi-service.so */
1787b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        System.loadLibrary("wifi-service");
1788b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        registerNatives();
1789b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    }
1790b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius
1791b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    private static native int registerNatives();
1792b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /* kernel logging support */
1793b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    private static native byte[] readKernelLogNative();
1794b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius
1795b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /**
1796b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     * Fetches the latest kernel logs.
1797b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius     */
1798b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    public synchronized String readKernelLog() {
1799b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        byte[] bytes = readKernelLogNative();
1800b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        if (bytes != null) {
1801b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius            CharsetDecoder decoder = StandardCharsets.UTF_8.newDecoder();
1802b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius            try {
1803b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius                CharBuffer decoded = decoder.decode(ByteBuffer.wrap(bytes));
1804b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius                return decoded.toString();
1805b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius            } catch (CharacterCodingException cce) {
1806b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius                return new String(bytes, StandardCharsets.ISO_8859_1);
1807b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius            }
1808520fbe7db055661af039303c1081236c73b04abdRoshan Pius        } else {
1809b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius            return "*** failed to read kernel log ***";
1810374f78d3841f7bf74543dc4d21db66d1d3472c3aRandy Pan        }
1811da4958bd7409aaf26ead2b221754d4a5035f7bdfRandy Pan    }
1812155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande}
1813