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