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
19155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeimport android.net.wifi.SupplicantState;
20dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpandeimport android.net.wifi.WifiEnterpriseConfig;
21155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeimport android.net.wifi.WifiManager;
22155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeimport android.net.wifi.WifiSsid;
234e210ea1c7eb7d3a70792571651181e429b39582Mitchell Willsimport android.os.Handler;
24155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeimport android.os.Message;
253c83d4783673c1e2fa64c56dc586c5f7c3ab73e0Mitchell Willsimport android.util.ArraySet;
26155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeimport android.util.Log;
274e210ea1c7eb7d3a70792571651181e429b39582Mitchell Willsimport android.util.SparseArray;
28155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
29ef027b4240eb994976dc6173fa396fe10b45ae52Roshan Piusimport com.android.internal.annotations.VisibleForTesting;
30259fb5a5265e0a2aa8a851d5e694d28afe9a87f2Mitchell Willsimport com.android.internal.util.Protocol;
31259fb5a5265e0a2aa8a851d5e694d28afe9a87f2Mitchell Willsimport com.android.internal.util.StateMachine;
3265d8ba5dd551cd132789e8feb270dfc7998dfbdcRoshan Piusimport com.android.server.wifi.hotspot2.AnqpEvent;
336dd42662e45750910d8743f7f154269c2755df93Jan Nordqvistimport com.android.server.wifi.hotspot2.IconEvent;
341241ac94aa2f5d6c5f5c3e935c7f7baa8045ee5cSohani Raoimport com.android.server.wifi.hotspot2.WnmData;
35259fb5a5265e0a2aa8a851d5e694d28afe9a87f2Mitchell Willsimport com.android.server.wifi.util.TelephonyUtil.SimAuthRequestData;
36155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
37155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeimport java.util.HashMap;
381d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvistimport java.util.Map;
393c83d4783673c1e2fa64c56dc586c5f7c3ab73e0Mitchell Willsimport java.util.Set;
40155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
41155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande/**
42155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Listens for events from the wpa_supplicant server, and passes them on
43163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius * to the {@link StateMachine} for handling.
44155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande *
45155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * @hide
46155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */
47155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandepublic class WifiMonitor {
48155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    private static final String TAG = "WifiMonitor";
49155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
50155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    /* Supplicant events reported to a state machine */
51155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    private static final int BASE = Protocol.BASE_WIFI_MONITOR;
52155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
53155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    /* Connection to supplicant established */
54155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    public static final int SUP_CONNECTION_EVENT                 = BASE + 1;
55155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    /* Connection to supplicant lost */
56155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    public static final int SUP_DISCONNECTION_EVENT              = BASE + 2;
57155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande   /* Network connection completed */
58155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    public static final int NETWORK_CONNECTION_EVENT             = BASE + 3;
59155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    /* Network disconnection completed */
60155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    public static final int NETWORK_DISCONNECTION_EVENT          = BASE + 4;
61155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    /* Scan results are available */
62155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    public static final int SCAN_RESULTS_EVENT                   = BASE + 5;
63155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    /* Supplicate state changed */
64155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    public static final int SUPPLICANT_STATE_CHANGE_EVENT        = BASE + 6;
65155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    /* Password failure and EAP authentication failure */
66155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    public static final int AUTHENTICATION_FAILURE_EVENT         = BASE + 7;
67155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    /* WPS success detected */
68155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    public static final int WPS_SUCCESS_EVENT                    = BASE + 8;
69155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    /* WPS failure detected */
70155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    public static final int WPS_FAIL_EVENT                       = BASE + 9;
71155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande     /* WPS overlap detected */
72155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    public static final int WPS_OVERLAP_EVENT                    = BASE + 10;
73155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande     /* WPS timeout detected */
74155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    public static final int WPS_TIMEOUT_EVENT                    = BASE + 11;
75155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
7640ff222cec1bd05879edb53abc75c6deead734cavandwalle    /* Request Identity */
7740ff222cec1bd05879edb53abc75c6deead734cavandwalle    public static final int SUP_REQUEST_IDENTITY                 = BASE + 15;
7840ff222cec1bd05879edb53abc75c6deead734cavandwalle
7933b575ca6bee66183929f9474b5a161432918604Vinit Deshpande    /* Request SIM Auth */
8033b575ca6bee66183929f9474b5a161432918604Vinit Deshpande    public static final int SUP_REQUEST_SIM_AUTH                 = BASE + 16;
8133b575ca6bee66183929f9474b5a161432918604Vinit Deshpande
8204d29dfffd4c64bc0eb3f109269c1ad2bde6e363Vinit Deshpande    public static final int SCAN_FAILED_EVENT                    = BASE + 17;
8351493e199ebf1e1191ccf652f0081d229018a11fNingyuan Wang    /* Pno scan results are available */
8451493e199ebf1e1191ccf652f0081d229018a11fNingyuan Wang    public static final int PNO_SCAN_RESULTS_EVENT               = BASE + 18;
8551493e199ebf1e1191ccf652f0081d229018a11fNingyuan Wang
8604d29dfffd4c64bc0eb3f109269c1ad2bde6e363Vinit Deshpande
87155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    /* Indicates assoc reject event */
88155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    public static final int ASSOCIATION_REJECTION_EVENT          = BASE + 43;
89ef1567e413c9ed5f5c4fdb9e354861632f7b2f87Jan Nordqvist    public static final int ANQP_DONE_EVENT                      = BASE + 44;
90155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
91446db2d5457456743e4476029e14d7c3bb9f5bccYuhao Zheng    /* hotspot 2.0 ANQP events */
92446db2d5457456743e4476029e14d7c3bb9f5bccYuhao Zheng    public static final int GAS_QUERY_START_EVENT                = BASE + 51;
93446db2d5457456743e4476029e14d7c3bb9f5bccYuhao Zheng    public static final int GAS_QUERY_DONE_EVENT                 = BASE + 52;
94446db2d5457456743e4476029e14d7c3bb9f5bccYuhao Zheng    public static final int RX_HS20_ANQP_ICON_EVENT              = BASE + 53;
95446db2d5457456743e4476029e14d7c3bb9f5bccYuhao Zheng
965d30d5c2e0eec4db2303da3f225f52da748e2060Yuhao Zheng    /* hotspot 2.0 events */
975d30d5c2e0eec4db2303da3f225f52da748e2060Yuhao Zheng    public static final int HS20_REMEDIATION_EVENT               = BASE + 61;
985d30d5c2e0eec4db2303da3f225f52da748e2060Yuhao Zheng
99b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /* WPS config errrors */
100b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    private static final int CONFIG_MULTIPLE_PBC_DETECTED = 12;
101b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    private static final int CONFIG_AUTH_FAILURE = 18;
1024e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills
103b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    /* WPS error indications */
104b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    private static final int REASON_TKIP_ONLY_PROHIBITED = 1;
105b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    private static final int REASON_WEP_PROHIBITED = 2;
106155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
107b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    private final WifiInjector mWifiInjector;
1087002981cd8cf4ed73e9bbb2c1a877c3594e0ab39Samuel Tan    private boolean mVerboseLoggingEnabled = false;
109b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    private boolean mConnected = false;
110b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius
111b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    public WifiMonitor(WifiInjector wifiInjector) {
112b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius        mWifiInjector = wifiInjector;
113b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius    }
1144e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills
115ed9938883ae2dade81c8be6cd6ceaef3febd5239vandwalle    void enableVerboseLogging(int verbose) {
116ed9938883ae2dade81c8be6cd6ceaef3febd5239vandwalle        if (verbose > 0) {
1177002981cd8cf4ed73e9bbb2c1a877c3594e0ab39Samuel Tan            mVerboseLoggingEnabled = true;
118ed9938883ae2dade81c8be6cd6ceaef3febd5239vandwalle        } else {
1197002981cd8cf4ed73e9bbb2c1a877c3594e0ab39Samuel Tan            mVerboseLoggingEnabled = false;
120ed9938883ae2dade81c8be6cd6ceaef3febd5239vandwalle        }
121ed9938883ae2dade81c8be6cd6ceaef3febd5239vandwalle    }
122ed9938883ae2dade81c8be6cd6ceaef3febd5239vandwalle
1233c83d4783673c1e2fa64c56dc586c5f7c3ab73e0Mitchell Wills    // TODO(b/27569474) remove support for multiple handlers for the same event
1243c83d4783673c1e2fa64c56dc586c5f7c3ab73e0Mitchell Wills    private final Map<String, SparseArray<Set<Handler>>> mHandlerMap = new HashMap<>();
1254e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills    public synchronized void registerHandler(String iface, int what, Handler handler) {
1263c83d4783673c1e2fa64c56dc586c5f7c3ab73e0Mitchell Wills        SparseArray<Set<Handler>> ifaceHandlers = mHandlerMap.get(iface);
1274e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills        if (ifaceHandlers == null) {
1284e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills            ifaceHandlers = new SparseArray<>();
1294e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills            mHandlerMap.put(iface, ifaceHandlers);
1304e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills        }
1313c83d4783673c1e2fa64c56dc586c5f7c3ab73e0Mitchell Wills        Set<Handler> ifaceWhatHandlers = ifaceHandlers.get(what);
1323c83d4783673c1e2fa64c56dc586c5f7c3ab73e0Mitchell Wills        if (ifaceWhatHandlers == null) {
1333c83d4783673c1e2fa64c56dc586c5f7c3ab73e0Mitchell Wills            ifaceWhatHandlers = new ArraySet<>();
1343c83d4783673c1e2fa64c56dc586c5f7c3ab73e0Mitchell Wills            ifaceHandlers.put(what, ifaceWhatHandlers);
1354e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills        }
1363c83d4783673c1e2fa64c56dc586c5f7c3ab73e0Mitchell Wills        ifaceWhatHandlers.add(handler);
137155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
138155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
1394e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills    private final Map<String, Boolean> mMonitoringMap = new HashMap<>();
1404e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills    private boolean isMonitoring(String iface) {
1414e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills        Boolean val = mMonitoringMap.get(iface);
1424e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills        if (val == null) {
1434e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills            return false;
144163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        } else {
1454e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills            return val.booleanValue();
1464e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills        }
147155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
148155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
149ef027b4240eb994976dc6173fa396fe10b45ae52Roshan Pius    /**
150ef027b4240eb994976dc6173fa396fe10b45ae52Roshan Pius     * Enable/Disable monitoring for the provided iface.
151ef027b4240eb994976dc6173fa396fe10b45ae52Roshan Pius     *
152ef027b4240eb994976dc6173fa396fe10b45ae52Roshan Pius     * @param iface Name of the iface.
153ef027b4240eb994976dc6173fa396fe10b45ae52Roshan Pius     * @param enabled true to enable, false to disable.
154ef027b4240eb994976dc6173fa396fe10b45ae52Roshan Pius     */
155ef027b4240eb994976dc6173fa396fe10b45ae52Roshan Pius    @VisibleForTesting
156ef027b4240eb994976dc6173fa396fe10b45ae52Roshan Pius    public void setMonitoring(String iface, boolean enabled) {
1574e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills        mMonitoringMap.put(iface, enabled);
1584e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills    }
1598249dec7f00e21218bcff6e16cf584ef37d87686Christopher Wiley
1604e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills    private void setMonitoringNone() {
1614e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills        for (String iface : mMonitoringMap.keySet()) {
1624e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills            setMonitoring(iface, false);
1634e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills        }
1644e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills    }
165155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
166fdffec5da789c47a99dccdde29cbc6740e015f0bRoshan Pius    /**
167fdffec5da789c47a99dccdde29cbc6740e015f0bRoshan Pius     * Wait for wpa_supplicant's control interface to be ready.
168fdffec5da789c47a99dccdde29cbc6740e015f0bRoshan Pius     *
169fdffec5da789c47a99dccdde29cbc6740e015f0bRoshan Pius     * TODO: Add unit tests for these once we remove the legacy code.
170fdffec5da789c47a99dccdde29cbc6740e015f0bRoshan Pius     */
171163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    private boolean ensureConnectedLocked() {
1724e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills        if (mConnected) {
1734e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills            return true;
174155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande        }
1757002981cd8cf4ed73e9bbb2c1a877c3594e0ab39Samuel Tan        if (mVerboseLoggingEnabled) Log.d(TAG, "connecting to supplicant");
1764e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills        int connectTries = 0;
1774e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills        while (true) {
178163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius            mConnected = mWifiInjector.getWifiNative().connectToSupplicant();
179b8b3fb8228a1f90106bad8c59ce006b81ef7921cRoshan Pius            if (mConnected) {
1804e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills                return true;
181155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande            }
182b97757e4930ae6e9a5319e071d383c464fcb5546Roshan Pius            if (connectTries++ < 50) {
1834e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills                try {
184b97757e4930ae6e9a5319e071d383c464fcb5546Roshan Pius                    Thread.sleep(100);
1854e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills                } catch (InterruptedException ignore) {
186155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande                }
1874e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills            } else {
1884e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills                return false;
189155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande            }
190155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande        }
1914e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills    }
192155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
193fdffec5da789c47a99dccdde29cbc6740e015f0bRoshan Pius    /**
194fdffec5da789c47a99dccdde29cbc6740e015f0bRoshan Pius     * Start Monitoring for wpa_supplicant events.
195fdffec5da789c47a99dccdde29cbc6740e015f0bRoshan Pius     *
196fdffec5da789c47a99dccdde29cbc6740e015f0bRoshan Pius     * @param iface Name of iface.
197fdffec5da789c47a99dccdde29cbc6740e015f0bRoshan Pius     * TODO: Add unit tests for these once we remove the legacy code.
198fdffec5da789c47a99dccdde29cbc6740e015f0bRoshan Pius     */
199fdffec5da789c47a99dccdde29cbc6740e015f0bRoshan Pius    public synchronized void startMonitoring(String iface, boolean isStaIface) {
200163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        if (ensureConnectedLocked()) {
2014e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills            setMonitoring(iface, true);
2025317e7c11c99d5cc8417c65cc73cf548f8f52b87Roshan Pius            broadcastSupplicantConnectionEvent(iface);
203163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        } else {
2044e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills            boolean originalMonitoring = isMonitoring(iface);
2054e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills            setMonitoring(iface, true);
2065317e7c11c99d5cc8417c65cc73cf548f8f52b87Roshan Pius            broadcastSupplicantDisconnectionEvent(iface);
2074e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills            setMonitoring(iface, originalMonitoring);
2084e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills            Log.e(TAG, "startMonitoring(" + iface + ") failed!");
2094e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills        }
2104e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills    }
211155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
212163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    /**
213163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * Stop Monitoring for wpa_supplicant events.
214163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     *
215163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * @param iface Name of iface.
216163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * TODO: Add unit tests for these once we remove the legacy code.
217163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     */
2184e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills    public synchronized void stopMonitoring(String iface) {
2197002981cd8cf4ed73e9bbb2c1a877c3594e0ab39Samuel Tan        if (mVerboseLoggingEnabled) Log.d(TAG, "stopMonitoring(" + iface + ")");
2204e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills        setMonitoring(iface, true);
2215317e7c11c99d5cc8417c65cc73cf548f8f52b87Roshan Pius        broadcastSupplicantDisconnectionEvent(iface);
2224e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills        setMonitoring(iface, false);
2234e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills    }
224155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
225163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    /**
226163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * Stop Monitoring for wpa_supplicant events.
227163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     *
228163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * TODO: Add unit tests for these once we remove the legacy code.
229163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     */
2308249dec7f00e21218bcff6e16cf584ef37d87686Christopher Wiley    public synchronized void stopAllMonitoring() {
2314e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills        mConnected = false;
2324e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills        setMonitoringNone();
2334e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills    }
234155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
235005c1ef113192f898499a407dd266393a8d6b076vandwalle
2364e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills    /**
2374e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills     * Similar functions to Handler#sendMessage that send the message to the registered handler
2384e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills     * for the given interface and message what.
2394e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills     * All of these should be called with the WifiMonitor class lock
2404e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills     */
2414e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills    private void sendMessage(String iface, int what) {
2424e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills        sendMessage(iface, Message.obtain(null, what));
2434e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills    }
244155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
2454e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills    private void sendMessage(String iface, int what, Object obj) {
2464e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills        sendMessage(iface, Message.obtain(null, what, obj));
2474e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills    }
2484e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills
2494e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills    private void sendMessage(String iface, int what, int arg1) {
2504e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills        sendMessage(iface, Message.obtain(null, what, arg1, 0));
2514e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills    }
252155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
2534e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills    private void sendMessage(String iface, int what, int arg1, int arg2) {
2544e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills        sendMessage(iface, Message.obtain(null, what, arg1, arg2));
2554e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills    }
256155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
2574e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills    private void sendMessage(String iface, int what, int arg1, int arg2, Object obj) {
2584e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills        sendMessage(iface, Message.obtain(null, what, arg1, arg2, obj));
2594e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills    }
260155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
2614e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills    private void sendMessage(String iface, Message message) {
2623c83d4783673c1e2fa64c56dc586c5f7c3ab73e0Mitchell Wills        SparseArray<Set<Handler>> ifaceHandlers = mHandlerMap.get(iface);
2634e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills        if (iface != null && ifaceHandlers != null) {
2644e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills            if (isMonitoring(iface)) {
2653c83d4783673c1e2fa64c56dc586c5f7c3ab73e0Mitchell Wills                Set<Handler> ifaceWhatHandlers = ifaceHandlers.get(message.what);
26618456db02b67d04d9e601aca68538b64c7a374f8Mitchell Wills                if (ifaceWhatHandlers != null) {
26718456db02b67d04d9e601aca68538b64c7a374f8Mitchell Wills                    for (Handler handler : ifaceWhatHandlers) {
268098640f533f3fc04cb49cb860f9dc45ad8a19e69Randy Pan                        if (handler != null) {
26918456db02b67d04d9e601aca68538b64c7a374f8Mitchell Wills                            sendMessage(handler, Message.obtain(message));
27018456db02b67d04d9e601aca68538b64c7a374f8Mitchell Wills                        }
2713c83d4783673c1e2fa64c56dc586c5f7c3ab73e0Mitchell Wills                    }
2723c83d4783673c1e2fa64c56dc586c5f7c3ab73e0Mitchell Wills                }
273155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande            } else {
2747002981cd8cf4ed73e9bbb2c1a877c3594e0ab39Samuel Tan                if (mVerboseLoggingEnabled) {
2757002981cd8cf4ed73e9bbb2c1a877c3594e0ab39Samuel Tan                    Log.d(TAG, "Dropping event because (" + iface + ") is stopped");
2767002981cd8cf4ed73e9bbb2c1a877c3594e0ab39Samuel Tan                }
2774e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills            }
2784e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills        } else {
2797002981cd8cf4ed73e9bbb2c1a877c3594e0ab39Samuel Tan            if (mVerboseLoggingEnabled) {
2807002981cd8cf4ed73e9bbb2c1a877c3594e0ab39Samuel Tan                Log.d(TAG, "Sending to all monitors because there's no matching iface");
2817002981cd8cf4ed73e9bbb2c1a877c3594e0ab39Samuel Tan            }
2823c83d4783673c1e2fa64c56dc586c5f7c3ab73e0Mitchell Wills            for (Map.Entry<String, SparseArray<Set<Handler>>> entry : mHandlerMap.entrySet()) {
2834e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills                if (isMonitoring(entry.getKey())) {
2847ce3d79fd3ed12a379d6abbe31c680d6fd8abf51Paul Stewart                    Set<Handler> ifaceWhatHandlers = entry.getValue().get(message.what);
2853c83d4783673c1e2fa64c56dc586c5f7c3ab73e0Mitchell Wills                    for (Handler handler : ifaceWhatHandlers) {
286098640f533f3fc04cb49cb860f9dc45ad8a19e69Randy Pan                        if (handler != null) {
2873c83d4783673c1e2fa64c56dc586c5f7c3ab73e0Mitchell Wills                            sendMessage(handler, Message.obtain(message));
2883c83d4783673c1e2fa64c56dc586c5f7c3ab73e0Mitchell Wills                        }
289155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande                    }
290155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande                }
291155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande            }
292155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande        }
293098640f533f3fc04cb49cb860f9dc45ad8a19e69Randy Pan
294098640f533f3fc04cb49cb860f9dc45ad8a19e69Randy Pan        message.recycle();
295155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
296155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
2973c83d4783673c1e2fa64c56dc586c5f7c3ab73e0Mitchell Wills    private void sendMessage(Handler handler, Message message) {
298098640f533f3fc04cb49cb860f9dc45ad8a19e69Randy Pan        message.setTarget(handler);
299098640f533f3fc04cb49cb860f9dc45ad8a19e69Randy Pan        message.sendToTarget();
3004e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills    }
3014e210ea1c7eb7d3a70792571651181e429b39582Mitchell Wills
302ef027b4240eb994976dc6173fa396fe10b45ae52Roshan Pius    /**
303ef027b4240eb994976dc6173fa396fe10b45ae52Roshan Pius     * Broadcast the WPS fail event to all the handlers registered for this event.
304ef027b4240eb994976dc6173fa396fe10b45ae52Roshan Pius     *
305ef027b4240eb994976dc6173fa396fe10b45ae52Roshan Pius     * @param iface Name of iface on which this occurred.
306ef027b4240eb994976dc6173fa396fe10b45ae52Roshan Pius     * @param cfgError Configuration error code.
307ef027b4240eb994976dc6173fa396fe10b45ae52Roshan Pius     * @param vendorErrorCode Vendor specific error indication code.
308ef027b4240eb994976dc6173fa396fe10b45ae52Roshan Pius     */
309ef027b4240eb994976dc6173fa396fe10b45ae52Roshan Pius    public void broadcastWpsFailEvent(String iface, int cfgError, int vendorErrorCode) {
310ef027b4240eb994976dc6173fa396fe10b45ae52Roshan Pius        int reason = 0;
311ef027b4240eb994976dc6173fa396fe10b45ae52Roshan Pius        switch(vendorErrorCode) {
312ef027b4240eb994976dc6173fa396fe10b45ae52Roshan Pius            case REASON_TKIP_ONLY_PROHIBITED:
313ef027b4240eb994976dc6173fa396fe10b45ae52Roshan Pius                sendMessage(iface, WPS_FAIL_EVENT, WifiManager.WPS_TKIP_ONLY_PROHIBITED);
314ef027b4240eb994976dc6173fa396fe10b45ae52Roshan Pius                return;
315ef027b4240eb994976dc6173fa396fe10b45ae52Roshan Pius            case REASON_WEP_PROHIBITED:
316ef027b4240eb994976dc6173fa396fe10b45ae52Roshan Pius                sendMessage(iface, WPS_FAIL_EVENT, WifiManager.WPS_WEP_PROHIBITED);
317ef027b4240eb994976dc6173fa396fe10b45ae52Roshan Pius                return;
318ef027b4240eb994976dc6173fa396fe10b45ae52Roshan Pius            default:
319ef027b4240eb994976dc6173fa396fe10b45ae52Roshan Pius                reason = vendorErrorCode;
320ef027b4240eb994976dc6173fa396fe10b45ae52Roshan Pius                break;
321ef027b4240eb994976dc6173fa396fe10b45ae52Roshan Pius        }
322ef027b4240eb994976dc6173fa396fe10b45ae52Roshan Pius        switch(cfgError) {
323ef027b4240eb994976dc6173fa396fe10b45ae52Roshan Pius            case CONFIG_AUTH_FAILURE:
324ef027b4240eb994976dc6173fa396fe10b45ae52Roshan Pius                sendMessage(iface, WPS_FAIL_EVENT, WifiManager.WPS_AUTH_FAILURE);
325ef027b4240eb994976dc6173fa396fe10b45ae52Roshan Pius                return;
326ef027b4240eb994976dc6173fa396fe10b45ae52Roshan Pius            case CONFIG_MULTIPLE_PBC_DETECTED:
327ef027b4240eb994976dc6173fa396fe10b45ae52Roshan Pius                sendMessage(iface, WPS_FAIL_EVENT, WifiManager.WPS_OVERLAP_ERROR);
328ef027b4240eb994976dc6173fa396fe10b45ae52Roshan Pius                return;
329ef027b4240eb994976dc6173fa396fe10b45ae52Roshan Pius            default:
330ef027b4240eb994976dc6173fa396fe10b45ae52Roshan Pius                if (reason == 0) {
331ef027b4240eb994976dc6173fa396fe10b45ae52Roshan Pius                    reason = cfgError;
332ef027b4240eb994976dc6173fa396fe10b45ae52Roshan Pius                }
333ef027b4240eb994976dc6173fa396fe10b45ae52Roshan Pius                break;
334ef027b4240eb994976dc6173fa396fe10b45ae52Roshan Pius        }
335ef027b4240eb994976dc6173fa396fe10b45ae52Roshan Pius        //For all other errors, return a generic internal error
336ef027b4240eb994976dc6173fa396fe10b45ae52Roshan Pius        sendMessage(iface, WPS_FAIL_EVENT, WifiManager.ERROR, reason);
337ef027b4240eb994976dc6173fa396fe10b45ae52Roshan Pius    }
338c626bc21f7ebac14daa31ca7014767970127efeeRoshan Pius
339c626bc21f7ebac14daa31ca7014767970127efeeRoshan Pius   /**
340c626bc21f7ebac14daa31ca7014767970127efeeRoshan Pius    * Broadcast the WPS succes event to all the handlers registered for this event.
341c626bc21f7ebac14daa31ca7014767970127efeeRoshan Pius    *
342c626bc21f7ebac14daa31ca7014767970127efeeRoshan Pius    * @param iface Name of iface on which this occurred.
343c626bc21f7ebac14daa31ca7014767970127efeeRoshan Pius    */
344c626bc21f7ebac14daa31ca7014767970127efeeRoshan Pius    public void broadcastWpsSuccessEvent(String iface) {
345c626bc21f7ebac14daa31ca7014767970127efeeRoshan Pius        sendMessage(iface, WPS_SUCCESS_EVENT);
346c626bc21f7ebac14daa31ca7014767970127efeeRoshan Pius    }
347c626bc21f7ebac14daa31ca7014767970127efeeRoshan Pius
348c626bc21f7ebac14daa31ca7014767970127efeeRoshan Pius    /**
349c626bc21f7ebac14daa31ca7014767970127efeeRoshan Pius     * Broadcast the WPS overlap event to all the handlers registered for this event.
350c626bc21f7ebac14daa31ca7014767970127efeeRoshan Pius     *
351c626bc21f7ebac14daa31ca7014767970127efeeRoshan Pius     * @param iface Name of iface on which this occurred.
352c626bc21f7ebac14daa31ca7014767970127efeeRoshan Pius     */
353c626bc21f7ebac14daa31ca7014767970127efeeRoshan Pius    public void broadcastWpsOverlapEvent(String iface) {
354c626bc21f7ebac14daa31ca7014767970127efeeRoshan Pius        sendMessage(iface, WPS_OVERLAP_EVENT);
355c626bc21f7ebac14daa31ca7014767970127efeeRoshan Pius    }
356c626bc21f7ebac14daa31ca7014767970127efeeRoshan Pius
357c626bc21f7ebac14daa31ca7014767970127efeeRoshan Pius    /**
358c626bc21f7ebac14daa31ca7014767970127efeeRoshan Pius     * Broadcast the WPS timeout event to all the handlers registered for this event.
359c626bc21f7ebac14daa31ca7014767970127efeeRoshan Pius     *
360c626bc21f7ebac14daa31ca7014767970127efeeRoshan Pius     * @param iface Name of iface on which this occurred.
361c626bc21f7ebac14daa31ca7014767970127efeeRoshan Pius     */
362c626bc21f7ebac14daa31ca7014767970127efeeRoshan Pius    public void broadcastWpsTimeoutEvent(String iface) {
363c626bc21f7ebac14daa31ca7014767970127efeeRoshan Pius        sendMessage(iface, WPS_TIMEOUT_EVENT);
364c626bc21f7ebac14daa31ca7014767970127efeeRoshan Pius    }
36565d8ba5dd551cd132789e8feb270dfc7998dfbdcRoshan Pius
36665d8ba5dd551cd132789e8feb270dfc7998dfbdcRoshan Pius    /**
36765d8ba5dd551cd132789e8feb270dfc7998dfbdcRoshan Pius     * Broadcast the ANQP done event to all the handlers registered for this event.
36865d8ba5dd551cd132789e8feb270dfc7998dfbdcRoshan Pius     *
36965d8ba5dd551cd132789e8feb270dfc7998dfbdcRoshan Pius     * @param iface Name of iface on which this occurred.
37065d8ba5dd551cd132789e8feb270dfc7998dfbdcRoshan Pius     * @param anqpEvent ANQP result retrieved.
37165d8ba5dd551cd132789e8feb270dfc7998dfbdcRoshan Pius     */
37265d8ba5dd551cd132789e8feb270dfc7998dfbdcRoshan Pius    public void broadcastAnqpDoneEvent(String iface, AnqpEvent anqpEvent) {
37365d8ba5dd551cd132789e8feb270dfc7998dfbdcRoshan Pius        sendMessage(iface, ANQP_DONE_EVENT, anqpEvent);
37465d8ba5dd551cd132789e8feb270dfc7998dfbdcRoshan Pius    }
375773ef3483e18f1afbd9cdce1564add3d89cb21faRoshan Pius
376773ef3483e18f1afbd9cdce1564add3d89cb21faRoshan Pius    /**
377773ef3483e18f1afbd9cdce1564add3d89cb21faRoshan Pius     * Broadcast the Icon done event to all the handlers registered for this event.
378773ef3483e18f1afbd9cdce1564add3d89cb21faRoshan Pius     *
379773ef3483e18f1afbd9cdce1564add3d89cb21faRoshan Pius     * @param iface Name of iface on which this occurred.
380773ef3483e18f1afbd9cdce1564add3d89cb21faRoshan Pius     * @param iconEvent Instance of IconEvent containing the icon data retrieved.
381773ef3483e18f1afbd9cdce1564add3d89cb21faRoshan Pius     */
382773ef3483e18f1afbd9cdce1564add3d89cb21faRoshan Pius    public void broadcastIconDoneEvent(String iface, IconEvent iconEvent) {
383773ef3483e18f1afbd9cdce1564add3d89cb21faRoshan Pius        sendMessage(iface, RX_HS20_ANQP_ICON_EVENT, iconEvent);
384773ef3483e18f1afbd9cdce1564add3d89cb21faRoshan Pius    }
3857f21b7a68872183ae89545b07f716aafa7dc3674Roshan Pius
3867f21b7a68872183ae89545b07f716aafa7dc3674Roshan Pius    /**
3877f21b7a68872183ae89545b07f716aafa7dc3674Roshan Pius     * Broadcast the WNM event to all the handlers registered for this event.
3887f21b7a68872183ae89545b07f716aafa7dc3674Roshan Pius     *
3897f21b7a68872183ae89545b07f716aafa7dc3674Roshan Pius     * @param iface Name of iface on which this occurred.
3907f21b7a68872183ae89545b07f716aafa7dc3674Roshan Pius     * @param wnmData Instance of WnmData containing the event data.
3917f21b7a68872183ae89545b07f716aafa7dc3674Roshan Pius     */
3927f21b7a68872183ae89545b07f716aafa7dc3674Roshan Pius    public void broadcastWnmEvent(String iface, WnmData wnmData) {
3937f21b7a68872183ae89545b07f716aafa7dc3674Roshan Pius        sendMessage(iface, HS20_REMEDIATION_EVENT, wnmData);
3947f21b7a68872183ae89545b07f716aafa7dc3674Roshan Pius    }
3951e1381333657f0a02bf1b300d1e600f87e5aae38Roshan Pius
3961e1381333657f0a02bf1b300d1e600f87e5aae38Roshan Pius    /**
3971e1381333657f0a02bf1b300d1e600f87e5aae38Roshan Pius     * Broadcast the Network identity request event to all the handlers registered for this event.
3981e1381333657f0a02bf1b300d1e600f87e5aae38Roshan Pius     *
3991e1381333657f0a02bf1b300d1e600f87e5aae38Roshan Pius     * @param iface Name of iface on which this occurred.
4001e1381333657f0a02bf1b300d1e600f87e5aae38Roshan Pius     * @param networkId ID of the network in wpa_supplicant.
4011e1381333657f0a02bf1b300d1e600f87e5aae38Roshan Pius     * @param ssid SSID of the network.
4021e1381333657f0a02bf1b300d1e600f87e5aae38Roshan Pius     */
4031e1381333657f0a02bf1b300d1e600f87e5aae38Roshan Pius    public void broadcastNetworkIdentityRequestEvent(String iface, int networkId, String ssid) {
4041e1381333657f0a02bf1b300d1e600f87e5aae38Roshan Pius        sendMessage(iface, SUP_REQUEST_IDENTITY, 0, networkId, ssid);
4051e1381333657f0a02bf1b300d1e600f87e5aae38Roshan Pius    }
4061e1381333657f0a02bf1b300d1e600f87e5aae38Roshan Pius
4071e1381333657f0a02bf1b300d1e600f87e5aae38Roshan Pius    /**
4081e1381333657f0a02bf1b300d1e600f87e5aae38Roshan Pius     * Broadcast the Network Gsm Sim auth request event to all the handlers registered for this
4091e1381333657f0a02bf1b300d1e600f87e5aae38Roshan Pius     * event.
4101e1381333657f0a02bf1b300d1e600f87e5aae38Roshan Pius     *
4111e1381333657f0a02bf1b300d1e600f87e5aae38Roshan Pius     * @param iface Name of iface on which this occurred.
4121e1381333657f0a02bf1b300d1e600f87e5aae38Roshan Pius     * @param networkId ID of the network in wpa_supplicant.
4131e1381333657f0a02bf1b300d1e600f87e5aae38Roshan Pius     * @param ssid SSID of the network.
4141e1381333657f0a02bf1b300d1e600f87e5aae38Roshan Pius     * @param data Accompanying event data.
4151e1381333657f0a02bf1b300d1e600f87e5aae38Roshan Pius     */
4161e1381333657f0a02bf1b300d1e600f87e5aae38Roshan Pius    public void broadcastNetworkGsmAuthRequestEvent(String iface, int networkId, String ssid,
4171e1381333657f0a02bf1b300d1e600f87e5aae38Roshan Pius                                                    String[] data) {
4181e1381333657f0a02bf1b300d1e600f87e5aae38Roshan Pius        sendMessage(iface, SUP_REQUEST_SIM_AUTH,
4191e1381333657f0a02bf1b300d1e600f87e5aae38Roshan Pius                new SimAuthRequestData(networkId, WifiEnterpriseConfig.Eap.SIM, ssid, data));
4201e1381333657f0a02bf1b300d1e600f87e5aae38Roshan Pius    }
4211e1381333657f0a02bf1b300d1e600f87e5aae38Roshan Pius
4221e1381333657f0a02bf1b300d1e600f87e5aae38Roshan Pius    /**
4231e1381333657f0a02bf1b300d1e600f87e5aae38Roshan Pius     * Broadcast the Network Umts Sim auth request event to all the handlers registered for this
4241e1381333657f0a02bf1b300d1e600f87e5aae38Roshan Pius     * event.
4251e1381333657f0a02bf1b300d1e600f87e5aae38Roshan Pius     *
4261e1381333657f0a02bf1b300d1e600f87e5aae38Roshan Pius     * @param iface Name of iface on which this occurred.
4271e1381333657f0a02bf1b300d1e600f87e5aae38Roshan Pius     * @param networkId ID of the network in wpa_supplicant.
4281e1381333657f0a02bf1b300d1e600f87e5aae38Roshan Pius     * @param ssid SSID of the network.
4291e1381333657f0a02bf1b300d1e600f87e5aae38Roshan Pius     * @param data Accompanying event data.
4301e1381333657f0a02bf1b300d1e600f87e5aae38Roshan Pius     */
4311e1381333657f0a02bf1b300d1e600f87e5aae38Roshan Pius    public void broadcastNetworkUmtsAuthRequestEvent(String iface, int networkId, String ssid,
4321e1381333657f0a02bf1b300d1e600f87e5aae38Roshan Pius                                                     String[] data) {
4331e1381333657f0a02bf1b300d1e600f87e5aae38Roshan Pius        sendMessage(iface, SUP_REQUEST_SIM_AUTH,
4341e1381333657f0a02bf1b300d1e600f87e5aae38Roshan Pius                new SimAuthRequestData(networkId, WifiEnterpriseConfig.Eap.AKA, ssid, data));
4351e1381333657f0a02bf1b300d1e600f87e5aae38Roshan Pius    }
436f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius
437f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius    /**
43870a9b25ee5d051660b8aeb15ffa97d36a181741dNingyuan Wang     * Broadcast scan result event to all the handlers registered for this event.
43970a9b25ee5d051660b8aeb15ffa97d36a181741dNingyuan Wang     * @param iface Name of iface on which this occurred.
44070a9b25ee5d051660b8aeb15ffa97d36a181741dNingyuan Wang     */
44170a9b25ee5d051660b8aeb15ffa97d36a181741dNingyuan Wang    public void broadcastScanResultEvent(String iface) {
44270a9b25ee5d051660b8aeb15ffa97d36a181741dNingyuan Wang        sendMessage(iface, SCAN_RESULTS_EVENT);
44370a9b25ee5d051660b8aeb15ffa97d36a181741dNingyuan Wang    }
44470a9b25ee5d051660b8aeb15ffa97d36a181741dNingyuan Wang
44570a9b25ee5d051660b8aeb15ffa97d36a181741dNingyuan Wang    /**
44651493e199ebf1e1191ccf652f0081d229018a11fNingyuan Wang     * Broadcast pno scan result event to all the handlers registered for this event.
44751493e199ebf1e1191ccf652f0081d229018a11fNingyuan Wang     * @param iface Name of iface on which this occurred.
44851493e199ebf1e1191ccf652f0081d229018a11fNingyuan Wang     */
44951493e199ebf1e1191ccf652f0081d229018a11fNingyuan Wang    public void broadcastPnoScanResultEvent(String iface) {
45051493e199ebf1e1191ccf652f0081d229018a11fNingyuan Wang        sendMessage(iface, PNO_SCAN_RESULTS_EVENT);
45151493e199ebf1e1191ccf652f0081d229018a11fNingyuan Wang    }
45251493e199ebf1e1191ccf652f0081d229018a11fNingyuan Wang
45351493e199ebf1e1191ccf652f0081d229018a11fNingyuan Wang    /**
45470a9b25ee5d051660b8aeb15ffa97d36a181741dNingyuan Wang     * Broadcast scan failed event to all the handlers registered for this event.
45570a9b25ee5d051660b8aeb15ffa97d36a181741dNingyuan Wang     * @param iface Name of iface on which this occurred.
45670a9b25ee5d051660b8aeb15ffa97d36a181741dNingyuan Wang     */
45770a9b25ee5d051660b8aeb15ffa97d36a181741dNingyuan Wang    public void broadcastScanFailedEvent(String iface) {
45870a9b25ee5d051660b8aeb15ffa97d36a181741dNingyuan Wang        sendMessage(iface, SCAN_FAILED_EVENT);
45970a9b25ee5d051660b8aeb15ffa97d36a181741dNingyuan Wang    }
46070a9b25ee5d051660b8aeb15ffa97d36a181741dNingyuan Wang
46170a9b25ee5d051660b8aeb15ffa97d36a181741dNingyuan Wang    /**
462f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius     * Broadcast the authentication failure event to all the handlers registered for this event.
463f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius     *
464f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius     * @param iface Name of iface on which this occurred.
465f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius     * @param reason Reason for authentication failure. This has to be one of the
466efab6719309021b890dc39b1a7434ea6b7f7bb64Sohani Rao     *               {@link android.net.wifi.WifiManager#ERROR_AUTH_FAILURE_NONE},
467efab6719309021b890dc39b1a7434ea6b7f7bb64Sohani Rao     *               {@link android.net.wifi.WifiManager#ERROR_AUTH_FAILURE_TIMEOUT},
468efab6719309021b890dc39b1a7434ea6b7f7bb64Sohani Rao     *               {@link android.net.wifi.WifiManager#ERROR_AUTH_FAILURE_WRONG_PSWD},
469efab6719309021b890dc39b1a7434ea6b7f7bb64Sohani Rao     *               {@link android.net.wifi.WifiManager#ERROR_AUTH_FAILURE_EAP_FAILURE}
470f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius     */
471f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius    public void broadcastAuthenticationFailureEvent(String iface, int reason) {
472f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius        sendMessage(iface, AUTHENTICATION_FAILURE_EVENT, 0, reason);
473f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius    }
474f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius
475f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius    /**
476f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius     * Broadcast the association rejection event to all the handlers registered for this event.
477f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius     *
478f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius     * @param iface Name of iface on which this occurred.
479f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius     * @param status Status code for association rejection.
4806680c62f91f61660d47c34ae435113ca5846b79dRoshan Pius     * @param timedOut Indicates if the association timed out.
481f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius     * @param bssid BSSID of the access point from which we received the reject.
482f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius     */
4836680c62f91f61660d47c34ae435113ca5846b79dRoshan Pius    public void broadcastAssociationRejectionEvent(String iface, int status, boolean timedOut,
4846680c62f91f61660d47c34ae435113ca5846b79dRoshan Pius                                                   String bssid) {
4856680c62f91f61660d47c34ae435113ca5846b79dRoshan Pius        sendMessage(iface, ASSOCIATION_REJECTION_EVENT, timedOut ? 1 : 0, status, bssid);
486f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius    }
487f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius
488f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius    /**
489f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius     * Broadcast the association success event to all the handlers registered for this event.
490f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius     *
491f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius     * @param iface Name of iface on which this occurred.
49235c9c7f7a2f83d81b8d61da834b3960f5b9ffe19Roshan Pius     * @param bssid BSSID of the access point.
493f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius     */
49435c9c7f7a2f83d81b8d61da834b3960f5b9ffe19Roshan Pius    public void broadcastAssociatedBssidEvent(String iface, String bssid) {
495f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius        sendMessage(iface, WifiStateMachine.CMD_ASSOCIATED_BSSID, 0, 0, bssid);
496f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius    }
497f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius
498f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius    /**
49935c9c7f7a2f83d81b8d61da834b3960f5b9ffe19Roshan Pius     * Broadcast the start of association event to all the handlers registered for this event.
50035c9c7f7a2f83d81b8d61da834b3960f5b9ffe19Roshan Pius     *
50135c9c7f7a2f83d81b8d61da834b3960f5b9ffe19Roshan Pius     * @param iface Name of iface on which this occurred.
50235c9c7f7a2f83d81b8d61da834b3960f5b9ffe19Roshan Pius     * @param bssid BSSID of the access point.
50335c9c7f7a2f83d81b8d61da834b3960f5b9ffe19Roshan Pius     */
50435c9c7f7a2f83d81b8d61da834b3960f5b9ffe19Roshan Pius    public void broadcastTargetBssidEvent(String iface, String bssid) {
50535c9c7f7a2f83d81b8d61da834b3960f5b9ffe19Roshan Pius        sendMessage(iface, WifiStateMachine.CMD_TARGET_BSSID, 0, 0, bssid);
50635c9c7f7a2f83d81b8d61da834b3960f5b9ffe19Roshan Pius    }
50735c9c7f7a2f83d81b8d61da834b3960f5b9ffe19Roshan Pius
50835c9c7f7a2f83d81b8d61da834b3960f5b9ffe19Roshan Pius    /**
509f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius     * Broadcast the network connection event to all the handlers registered for this event.
510f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius     *
511f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius     * @param iface Name of iface on which this occurred.
512f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius     * @param networkId ID of the network in wpa_supplicant.
513f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius     * @param bssid BSSID of the access point.
514f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius     */
515f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius    public void broadcastNetworkConnectionEvent(String iface, int networkId, String bssid) {
516f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius        sendMessage(iface, NETWORK_CONNECTION_EVENT, networkId, 0, bssid);
517f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius    }
518f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius
519f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius    /**
520f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius     * Broadcast the network disconnection event to all the handlers registered for this event.
521f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius     *
522f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius     * @param iface Name of iface on which this occurred.
523f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius     * @param local Whether the disconnect was locally triggered.
524f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius     * @param reason Disconnect reason code.
525f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius     * @param bssid BSSID of the access point.
526f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius     */
527bcf35be52f93d09a3f2ac8d4272a6d66467309b9Roshan Pius    public void broadcastNetworkDisconnectionEvent(String iface, int local, int reason,
528f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius                                                   String bssid) {
529f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius        sendMessage(iface, NETWORK_DISCONNECTION_EVENT, local, reason, bssid);
530f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius    }
531f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius
532f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius    /**
533f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius     * Broadcast the supplicant state change event to all the handlers registered for this event.
534f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius     *
535f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius     * @param iface Name of iface on which this occurred.
536f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius     * @param networkId ID of the network in wpa_supplicant.
537f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius     * @param bssid BSSID of the access point.
538f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius     * @param newSupplicantState New supplicant state.
539f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius     */
540f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius    public void broadcastSupplicantStateChangeEvent(String iface, int networkId, WifiSsid wifiSsid,
541f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius                                                    String bssid,
542f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius                                                    SupplicantState newSupplicantState) {
543f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius        sendMessage(iface, SUPPLICANT_STATE_CHANGE_EVENT, 0, 0,
544f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius                new StateChangeResult(networkId, wifiSsid, bssid, newSupplicantState));
545f56bacdb29215639cbfe0aef82b048c246e7a215Roshan Pius    }
5465317e7c11c99d5cc8417c65cc73cf548f8f52b87Roshan Pius
5475317e7c11c99d5cc8417c65cc73cf548f8f52b87Roshan Pius    /**
5485317e7c11c99d5cc8417c65cc73cf548f8f52b87Roshan Pius     * Broadcast the connection to wpa_supplicant event to all the handlers registered for
5495317e7c11c99d5cc8417c65cc73cf548f8f52b87Roshan Pius     * this event.
5505317e7c11c99d5cc8417c65cc73cf548f8f52b87Roshan Pius     *
5515317e7c11c99d5cc8417c65cc73cf548f8f52b87Roshan Pius     * @param iface Name of iface on which this occurred.
5525317e7c11c99d5cc8417c65cc73cf548f8f52b87Roshan Pius     */
5535317e7c11c99d5cc8417c65cc73cf548f8f52b87Roshan Pius    public void broadcastSupplicantConnectionEvent(String iface) {
5545317e7c11c99d5cc8417c65cc73cf548f8f52b87Roshan Pius        sendMessage(iface, SUP_CONNECTION_EVENT);
5555317e7c11c99d5cc8417c65cc73cf548f8f52b87Roshan Pius    }
5565317e7c11c99d5cc8417c65cc73cf548f8f52b87Roshan Pius
5575317e7c11c99d5cc8417c65cc73cf548f8f52b87Roshan Pius    /**
5585317e7c11c99d5cc8417c65cc73cf548f8f52b87Roshan Pius     * Broadcast the loss of connection to wpa_supplicant event to all the handlers registered for
5595317e7c11c99d5cc8417c65cc73cf548f8f52b87Roshan Pius     * this event.
5605317e7c11c99d5cc8417c65cc73cf548f8f52b87Roshan Pius     *
5615317e7c11c99d5cc8417c65cc73cf548f8f52b87Roshan Pius     * @param iface Name of iface on which this occurred.
5625317e7c11c99d5cc8417c65cc73cf548f8f52b87Roshan Pius     */
5635317e7c11c99d5cc8417c65cc73cf548f8f52b87Roshan Pius    public void broadcastSupplicantDisconnectionEvent(String iface) {
5645317e7c11c99d5cc8417c65cc73cf548f8f52b87Roshan Pius        sendMessage(iface, SUP_DISCONNECTION_EVENT);
5655317e7c11c99d5cc8417c65cc73cf548f8f52b87Roshan Pius    }
566155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande}
567