WifiStateMachine.java revision ebe870ef4051da2fc307114ed3c14927f548d9d4
1155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande/* 2155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Copyright (C) 2010 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 198639f6266cb70bf92d1561af43ac2d7b2b97298eJeff Davidsonimport static android.net.wifi.WifiManager.WIFI_AP_STATE_DISABLED; 208639f6266cb70bf92d1561af43ac2d7b2b97298eJeff Davidsonimport static android.net.wifi.WifiManager.WIFI_AP_STATE_DISABLING; 218639f6266cb70bf92d1561af43ac2d7b2b97298eJeff Davidsonimport static android.net.wifi.WifiManager.WIFI_AP_STATE_ENABLED; 228639f6266cb70bf92d1561af43ac2d7b2b97298eJeff Davidsonimport static android.net.wifi.WifiManager.WIFI_AP_STATE_ENABLING; 238639f6266cb70bf92d1561af43ac2d7b2b97298eJeff Davidsonimport static android.net.wifi.WifiManager.WIFI_AP_STATE_FAILED; 24155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeimport static android.net.wifi.WifiManager.WIFI_STATE_DISABLED; 25155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeimport static android.net.wifi.WifiManager.WIFI_STATE_DISABLING; 26155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeimport static android.net.wifi.WifiManager.WIFI_STATE_ENABLED; 27155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeimport static android.net.wifi.WifiManager.WIFI_STATE_ENABLING; 28155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande/** 29155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * TODO: 30155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Deprecate WIFI_STATE_UNKNOWN 31155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 328639f6266cb70bf92d1561af43ac2d7b2b97298eJeff Davidsonimport static android.net.wifi.WifiManager.WIFI_STATE_UNKNOWN; 33155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 34935a9c0c9e091829ac359a6d99ae3bd69fe9041bDianne Hackbornimport android.app.ActivityManager; 35155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeimport android.app.AlarmManager; 36155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeimport android.app.PendingIntent; 37155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeimport android.app.backup.IBackupManager; 38155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeimport android.bluetooth.BluetoothAdapter; 39155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeimport android.content.BroadcastReceiver; 40155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeimport android.content.Context; 41155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeimport android.content.Intent; 42155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeimport android.content.IntentFilter; 43155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeimport android.content.pm.PackageManager; 44155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeimport android.database.ContentObserver; 45a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpandeimport android.net.ConnectivityManager; 46a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpandeimport android.net.DhcpResults; 47a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpandeimport android.net.DhcpStateMachine; 48a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpandeimport android.net.InterfaceConfiguration; 49a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpandeimport android.net.LinkAddress; 50a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpandeimport android.net.LinkProperties; 51a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpandeimport android.net.NetworkAgent; 52a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpandeimport android.net.NetworkCapabilities; 53a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpandeimport android.net.NetworkFactory; 54a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpandeimport android.net.NetworkInfo; 55155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeimport android.net.NetworkInfo.DetailedState; 568639f6266cb70bf92d1561af43ac2d7b2b97298eJeff Davidsonimport android.net.NetworkRequest; 57a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpandeimport android.net.NetworkUtils; 58a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpandeimport android.net.RouteInfo; 593b26801d62a06475b722bbf29cba7f48f376654eLorenzo Colittiimport android.net.StaticIpConfiguration; 60a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpandeimport android.net.TrafficStats; 618639f6266cb70bf92d1561af43ac2d7b2b97298eJeff Davidsonimport android.net.wifi.BatchedScanResult; 628639f6266cb70bf92d1561af43ac2d7b2b97298eJeff Davidsonimport android.net.wifi.BatchedScanSettings; 638639f6266cb70bf92d1561af43ac2d7b2b97298eJeff Davidsonimport android.net.wifi.RssiPacketCountInfo; 648639f6266cb70bf92d1561af43ac2d7b2b97298eJeff Davidsonimport android.net.wifi.ScanResult; 658639f6266cb70bf92d1561af43ac2d7b2b97298eJeff Davidsonimport android.net.wifi.ScanSettings; 6656d0178183460eed9afbd85e5c0d215e27d5f5bcvandwalleimport android.net.wifi.SupplicantState; 678639f6266cb70bf92d1561af43ac2d7b2b97298eJeff Davidsonimport android.net.wifi.WifiChannel; 688639f6266cb70bf92d1561af43ac2d7b2b97298eJeff Davidsonimport android.net.wifi.WifiConfiguration; 698639f6266cb70bf92d1561af43ac2d7b2b97298eJeff Davidsonimport android.net.wifi.WifiConnectionStatistics; 708639f6266cb70bf92d1561af43ac2d7b2b97298eJeff Davidsonimport android.net.wifi.WifiEnterpriseConfig; 718639f6266cb70bf92d1561af43ac2d7b2b97298eJeff Davidsonimport android.net.wifi.WifiInfo; 728639f6266cb70bf92d1561af43ac2d7b2b97298eJeff Davidsonimport android.net.wifi.WifiLinkLayerStats; 738639f6266cb70bf92d1561af43ac2d7b2b97298eJeff Davidsonimport android.net.wifi.WifiManager; 748639f6266cb70bf92d1561af43ac2d7b2b97298eJeff Davidsonimport android.net.wifi.WifiSsid; 758639f6266cb70bf92d1561af43ac2d7b2b97298eJeff Davidsonimport android.net.wifi.WpsInfo; 768639f6266cb70bf92d1561af43ac2d7b2b97298eJeff Davidsonimport android.net.wifi.WpsResult; 77155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeimport android.net.wifi.WpsResult.Status; 78f933721551d39adc4924e5f69dcc51c16c520850Navtej Singh Mannimport android.net.wifi.p2p.IWifiP2pManager; 79a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpandeimport android.os.BatteryStats; 80a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpandeimport android.os.Bundle; 81a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpandeimport android.os.IBinder; 82a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpandeimport android.os.INetworkManagementService; 83a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpandeimport android.os.Looper; 84a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpandeimport android.os.Message; 85a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpandeimport android.os.Messenger; 86a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpandeimport android.os.PowerManager; 87b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalleimport android.os.Process; 88a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpandeimport android.os.RemoteException; 89a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpandeimport android.os.ServiceManager; 90a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpandeimport android.os.SystemClock; 91a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpandeimport android.os.SystemProperties; 92a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpandeimport android.os.UserHandle; 93a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpandeimport android.os.WorkSource; 94155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeimport android.provider.Settings; 9533b575ca6bee66183929f9474b5a161432918604Vinit Deshpandeimport android.telephony.TelephonyManager; 96155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeimport android.text.TextUtils; 97f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalleimport android.util.Log; 988639f6266cb70bf92d1561af43ac2d7b2b97298eJeff Davidsonimport android.util.LruCache; 99155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 100155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeimport com.android.internal.R; 101155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeimport com.android.internal.app.IBatteryStats; 102155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeimport com.android.internal.util.AsyncChannel; 103155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeimport com.android.internal.util.Protocol; 104155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeimport com.android.internal.util.State; 105155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeimport com.android.internal.util.StateMachine; 106d60cf2efc576f016506ebe6d8a83b4a6217b2e0eLorenzo Colittiimport com.android.server.net.NetlinkTracker; 107155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeimport com.android.server.wifi.p2p.WifiP2pServiceImpl; 108155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1098639f6266cb70bf92d1561af43ac2d7b2b97298eJeff Davidsonimport java.io.BufferedReader; 110155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeimport java.io.FileDescriptor; 1118639f6266cb70bf92d1561af43ac2d7b2b97298eJeff Davidsonimport java.io.FileNotFoundException; 1128639f6266cb70bf92d1561af43ac2d7b2b97298eJeff Davidsonimport java.io.FileReader; 1138639f6266cb70bf92d1561af43ac2d7b2b97298eJeff Davidsonimport java.io.IOException; 114155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeimport java.io.PrintWriter; 1158639f6266cb70bf92d1561af43ac2d7b2b97298eJeff Davidsonimport java.net.Inet4Address; 116155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeimport java.net.InetAddress; 1178639f6266cb70bf92d1561af43ac2d7b2b97298eJeff Davidsonimport java.util.ArrayList; 1188639f6266cb70bf92d1561af43ac2d7b2b97298eJeff Davidsonimport java.util.HashSet; 1198639f6266cb70bf92d1561af43ac2d7b2b97298eJeff Davidsonimport java.util.LinkedList; 1208639f6266cb70bf92d1561af43ac2d7b2b97298eJeff Davidsonimport java.util.List; 1218639f6266cb70bf92d1561af43ac2d7b2b97298eJeff Davidsonimport java.util.Locale; 1228639f6266cb70bf92d1561af43ac2d7b2b97298eJeff Davidsonimport java.util.Queue; 123155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeimport java.util.concurrent.atomic.AtomicBoolean; 1248639f6266cb70bf92d1561af43ac2d7b2b97298eJeff Davidsonimport java.util.concurrent.atomic.AtomicInteger; 125155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeimport java.util.regex.Pattern; 126155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 127155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande/** 128155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Track the state of Wifi connectivity. All event handling is done here, 129155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * and all changes in connectivity state are initiated here. 130155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * 131155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Wi-Fi now supports three modes of operation: Client, SoftAp and p2p 132155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * In the current implementation, we support concurrent wifi p2p and wifi operation. 133155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * The WifiStateMachine handles SoftAp and Client operations while WifiP2pService 134155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * handles p2p operation. 135155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * 136155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * @hide 137155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 138155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandepublic class WifiStateMachine extends StateMachine { 139155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 140155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private static final String NETWORKTYPE = "WIFI"; 141ebe870ef4051da2fc307114ed3c14927f548d9d4Jeff Davidson private static final String NETWORKTYPE_UNTRUSTED = "WIFI_UT"; 142ed9938883ae2dade81c8be6cd6ceaef3febd5239vandwalle private static boolean DBG = false; 143ed9938883ae2dade81c8be6cd6ceaef3febd5239vandwalle private static boolean VDBG = false; 1449f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle private static boolean VVDBG = false; 145ed9938883ae2dade81c8be6cd6ceaef3febd5239vandwalle private static boolean mLogMessages = false; 146f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 147931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle private static final int ONE_HOUR_MILLI = 1000 * 60 * 60; 148931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle 149eedd70ee3fa7f161ea1f4ae26543ac927e82a681Vinit Deshpande private static final String GOOGLE_OUI = "DA-A1-19"; 150042c54bfd5144ce8e720585b2093796e7e28de5eVinit Deshpande 151117be607246604e875de62aa8cdd99700b77a2b4vandwalle /* temporary debug flag - best network selection development */ 152ed9938883ae2dade81c8be6cd6ceaef3febd5239vandwalle private static boolean PDBG = false; 1532451dbcc4f9641df188326215b204b798eb70c46vandwalle 1542451dbcc4f9641df188326215b204b798eb70c46vandwalle /* debug flag, indicating if handling of ASSOCIATION_REJECT ended up blacklisting 1552451dbcc4f9641df188326215b204b798eb70c46vandwalle * the corresponding BSSID. 1562451dbcc4f9641df188326215b204b798eb70c46vandwalle */ 1572451dbcc4f9641df188326215b204b798eb70c46vandwalle private boolean didBlackListBSSID = false; 1582451dbcc4f9641df188326215b204b798eb70c46vandwalle 159f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle /** 160f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle * Log with error attribute 161f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle * 162f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle * @param s is string log 163f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle */ 164f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle protected void loge(String s) { 165b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle Log.e(getName(), s); 166f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle } 167b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle protected void log(String s) {; 168b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle Log.e(getName(), s); 169f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle } 170155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 171155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private WifiMonitor mWifiMonitor; 172155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private WifiNative mWifiNative; 173155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private WifiConfigStore mWifiConfigStore; 174f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle private WifiAutoJoinController mWifiAutoJoinController; 175155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private INetworkManagementService mNwService; 176155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private ConnectivityManager mCm; 177155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 178155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private final boolean mP2pSupported; 179155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private final AtomicBoolean mP2pConnected = new AtomicBoolean(false); 180155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private boolean mTemporarilyDisconnectWifi = false; 181155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private final String mPrimaryDeviceType; 182155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 183155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Scan results handling */ 184155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private List<ScanResult> mScanResults = new ArrayList<ScanResult>(); 185155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private static final Pattern scanResultPattern = Pattern.compile("\t+"); 186e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle private static final int SCAN_RESULT_CACHE_SIZE = 160; 187155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private final LruCache<String, ScanResult> mScanResultCache; 1882f2cf21662275a0e93d7d7a6ad3d98b4c596dcf0vandwalle // For debug, number of known scan results that were found as part of last scan result event, 1892f2cf21662275a0e93d7d7a6ad3d98b4c596dcf0vandwalle // as well the number of scans results returned by the supplicant with that message 190be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle private int mNumScanResultsKnown; 1912f2cf21662275a0e93d7d7a6ad3d98b4c596dcf0vandwalle private int mNumScanResultsReturned; 192155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 193155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Batch scan results */ 194155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private final List<BatchedScanResult> mBatchedScanResults = 195155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande new ArrayList<BatchedScanResult>(); 196155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private int mBatchedScanOwnerUid = UNKNOWN_SCAN_SOURCE; 197155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private int mExpectedBatchedScans = 0; 198155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private long mBatchedScanMinPollTime = 0; 199155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 200f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle private boolean mScreenOn = false; 201f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 202155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Chipset supports background scan */ 203155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private final boolean mBackgroundScanSupported; 204155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 205155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private String mInterfaceName; 206155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Tethering interface could be separate from wlan interface */ 207155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private String mTetherInterfaceName; 208155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 209155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private int mLastSignalLevel = -1; 210155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private String mLastBssid; 211931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle private int mLastNetworkId; // The network Id we successfully joined 2127806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle private boolean linkDebouncing = false; 2137806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle 2147806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle // Testing various network disconnect cases by sending lots of spurious 2157806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle // disconnect to supplicant 2167806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle private boolean testNetworkDisconnect = false; 2177806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle 218155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private boolean mEnableRssiPolling = false; 219155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private boolean mEnableBackgroundScan = false; 220155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private int mRssiPollToken = 0; 221155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* 3 operational states for STA operation: CONNECT_MODE, SCAN_ONLY_MODE, SCAN_ONLY_WIFI_OFF_MODE 222155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * In CONNECT_MODE, the STA can scan and connect to an access point 223155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * In SCAN_ONLY_MODE, the STA can only scan for access points 224155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * In SCAN_ONLY_WIFI_OFF_MODE, the STA can only scan for access points with wifi toggle being off 225155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 226155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private int mOperationalMode = CONNECT_MODE; 227a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng private boolean mIsScanOngoing = false; 228a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng private boolean mIsFullScanOngoing = false; 2299086afccf6938a49eb9a2cd248917c1cb0943942vandwalle private boolean mSendScanResultsBroadcast = false; 2309086afccf6938a49eb9a2cd248917c1cb0943942vandwalle 231a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng private final Queue<Message> mBufferedScanMsg = new LinkedList<Message>(); 232155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private WorkSource mScanWorkSource = null; 233155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private static final int UNKNOWN_SCAN_SOURCE = -1; 2344dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle private static final int SCAN_ALARM_SOURCE = -2; 235b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle private static final int ADD_OR_UPDATE_SOURCE = -3; 236005c1ef113192f898499a407dd266393a8d6b076vandwalle private static final int SET_ALLOW_UNTRUSTED_SOURCE = -4; 23768fee36dac1dda5c596c00ef33fdbc0962e9ec9fvandwalle private static final int ENABLE_WIFI = -5; 2389086afccf6938a49eb9a2cd248917c1cb0943942vandwalle public static final int DFS_RESTRICTED_SCAN_REQUEST = -6; 2394dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle 240a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng private static final int SCAN_REQUEST_BUFFER_MAX_SIZE = 10; 241a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng private static final String CUSTOMIZED_SCAN_SETTING = "customized_scan_settings"; 242a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng private static final String CUSTOMIZED_SCAN_WORKSOURCE = "customized_scan_worksource"; 243ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle private static final String SCAN_REQUEST_TIME = "scan_request_time"; 244ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle 245a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng private static final String BATCHED_SETTING = "batched_settings"; 246a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng private static final String BATCHED_WORKSOURCE = "batched_worksource"; 247a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng 248155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Tracks if state machine has received any screen state change broadcast yet. 249155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * We can miss one of these at boot. 250155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 251155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private AtomicBoolean mScreenBroadcastReceived = new AtomicBoolean(false); 252155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 253155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private boolean mBluetoothConnectionActive = false; 254155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 255155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private PowerManager.WakeLock mSuspendWakeLock; 256155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 257155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 258155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Interval in milliseconds between polling for RSSI 259155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * and linkspeed information 260155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 261155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private static final int POLL_RSSI_INTERVAL_MSECS = 3000; 262155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 263155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 2647806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle * Interval in milliseconds between receiving a disconnect event 2657806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle * while connected to a good AP, and handling the disconnect proper 2667806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle */ 2677806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle private static final int LINK_FLAPPING_DEBOUNCE_MSEC = 7000; 2687806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle 2697806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle /** 270155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Delay between supplicant restarts upon failure to establish connection 271155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 272155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private static final int SUPPLICANT_RESTART_INTERVAL_MSECS = 5000; 273155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 274155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 275155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Number of times we attempt to restart supplicant 276155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 277155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private static final int SUPPLICANT_RESTART_TRIES = 5; 278155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 279155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private int mSupplicantRestartCount = 0; 280155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Tracks sequence number on stop failure message */ 281155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private int mSupplicantStopFailureToken = 0; 282155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 283155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 284155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Tether state change notification time out 285155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 286155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private static final int TETHER_NOTIFICATION_TIME_OUT_MSECS = 5000; 287155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 288155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Tracks sequence number on a tether notification time out */ 289155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private int mTetherToken = 0; 290155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 291155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 292155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Driver start time out. 293155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 294155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private static final int DRIVER_START_TIME_OUT_MSECS = 10000; 295155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 296155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Tracks sequence number on a driver time out */ 297155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private int mDriverStartToken = 0; 298155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 299155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 300155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * The link properties of the wifi interface. 301155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Do not modify this directly; use updateLinkProperties instead. 302155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 303155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private LinkProperties mLinkProperties; 304155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 305155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Tracks sequence number on a periodic scan message */ 306155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private int mPeriodicScanToken = 0; 307155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 308155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Wakelock held during wifi start/stop and driver load/unload 309155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private PowerManager.WakeLock mWakeLock; 310155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 311155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private Context mContext; 312155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 313155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private final Object mDhcpResultsLock = new Object(); 314155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private DhcpResults mDhcpResults; 315155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private WifiInfo mWifiInfo; 316155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private NetworkInfo mNetworkInfo; 3173831a926f6762a3b4c398da51cc67e9d81572458Robert Greenwalt private NetworkCapabilities mNetworkCapabilities; 318155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private SupplicantStateTracker mSupplicantStateTracker; 319155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private DhcpStateMachine mDhcpStateMachine; 320155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private boolean mDhcpActive = false; 321155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 322200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle private int mWifiLinkLayerStatsSupported = 4; // Temporary disable 32327355a942653264388e909a4276196ee63e57811vandwalle 3249c22c8ea193360f50ad490368ca6a11af0684362Robert Greenwalt private final AtomicInteger mCountryCodeSequence = new AtomicInteger(); 3259c22c8ea193360f50ad490368ca6a11af0684362Robert Greenwalt 3260d616ef3bf635dff8722e064c0be842676390ed8vandwalle // Whether the state machine goes thru the Disconnecting->Disconnected->ObtainingIpAddress 327b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle private int mAutoRoaming = WifiAutoJoinController.AUTO_JOIN_IDLE; 3284dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle 3290d616ef3bf635dff8722e064c0be842676390ed8vandwalle // Roaming failure count 3300d616ef3bf635dff8722e064c0be842676390ed8vandwalle private int mRoamFailCount = 0; 3310d616ef3bf635dff8722e064c0be842676390ed8vandwalle 332e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle // This is the BSSID we are trying to associate to, it can be set to "any" 333e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle // if we havent selected a BSSID for joining. 334005c1ef113192f898499a407dd266393a8d6b076vandwalle // if we havent selected a BSSID for joining. 335e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle // The BSSID we are associated to is found in mWifiInfo 336b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle private String mTargetRoamBSSID = "any"; 337b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle 33885f2d77b1b858c063471951f3a5f93c96bd5e72bvandwalle private long mLastDriverRoamAttempt = 0; 33985f2d77b1b858c063471951f3a5f93c96bd5e72bvandwalle 34040ff222cec1bd05879edb53abc75c6deead734cavandwalle private WifiConfiguration targetWificonfiguration = null; 34140ff222cec1bd05879edb53abc75c6deead734cavandwalle 342be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle // Used as debug to indicate which configuration last was saved 343be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle private WifiConfiguration lastSavedConfigurationAttempt = null; 344be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle 345be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle // Used as debug to indicate which configuration last was removed 346be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle private WifiConfiguration lastForgetConfigurationAttempt = null; 347be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle 348b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle boolean isRoaming() { 349b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle return mAutoRoaming == WifiAutoJoinController.AUTO_JOIN_ROAMING 350b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle || mAutoRoaming == WifiAutoJoinController.AUTO_JOIN_EXTENDED_ROAMING; 351b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle } 352b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle 353b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle public void autoRoamSetBSSID(int netId, String bssid) { 354b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle autoRoamSetBSSID(mWifiConfigStore.getWifiConfiguration(netId), bssid); 355b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle } 356b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle 3579f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle public boolean autoRoamSetBSSID(WifiConfiguration config, String bssid) { 3589f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle boolean ret = true; 3599f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle if (mTargetRoamBSSID == null) mTargetRoamBSSID = "any"; 3609f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle if (bssid == null) bssid = "any"; 3619f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle if (config == null) return false; // Nothing to do 3629f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle 3639f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle if (mTargetRoamBSSID != null && bssid == mTargetRoamBSSID && bssid == config.BSSID) { 3649f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle return false; // We didnt change anything 3659f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle } 366e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle if (!mTargetRoamBSSID.equals("any") && bssid.equals("any")) { 3679f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle // Changing to ANY 3689f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle if (!mWifiConfigStore.roamOnAny) { 3699f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle ret = false; // Nothing to do 3709f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle } 3719f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle } 3722f2cf21662275a0e93d7d7a6ad3d98b4c596dcf0vandwalle if (VDBG) { 3732f2cf21662275a0e93d7d7a6ad3d98b4c596dcf0vandwalle loge("autoRoamSetBSSID " + bssid 3742f2cf21662275a0e93d7d7a6ad3d98b4c596dcf0vandwalle + " key=" + config.configKey()); 375b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle } 3762f2cf21662275a0e93d7d7a6ad3d98b4c596dcf0vandwalle config.autoJoinBSSID = bssid; 3772f2cf21662275a0e93d7d7a6ad3d98b4c596dcf0vandwalle mTargetRoamBSSID = bssid; 3782f2cf21662275a0e93d7d7a6ad3d98b4c596dcf0vandwalle mWifiConfigStore.saveWifiConfigBSSID(config); 379e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle return ret; 380b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle } 3814dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle 382d60cf2efc576f016506ebe6d8a83b4a6217b2e0eLorenzo Colitti /** 383d60cf2efc576f016506ebe6d8a83b4a6217b2e0eLorenzo Colitti * Subset of link properties coming from netlink. 384d60cf2efc576f016506ebe6d8a83b4a6217b2e0eLorenzo Colitti * Currently includes IPv4 and IPv6 addresses. In the future will also include IPv6 DNS servers 385d60cf2efc576f016506ebe6d8a83b4a6217b2e0eLorenzo Colitti * and domains obtained from router advertisements (RFC 6106). 386d60cf2efc576f016506ebe6d8a83b4a6217b2e0eLorenzo Colitti */ 387d60cf2efc576f016506ebe6d8a83b4a6217b2e0eLorenzo Colitti private NetlinkTracker mNetlinkTracker; 388155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 389155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private AlarmManager mAlarmManager; 390155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private PendingIntent mScanIntent; 391155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private PendingIntent mDriverStopIntent; 392155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private PendingIntent mBatchedScanIntervalIntent; 393155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 394155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Tracks current frequency mode */ 395155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private AtomicInteger mFrequencyBand = new AtomicInteger(WifiManager.WIFI_FREQUENCY_BAND_AUTO); 396155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 397155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Tracks if we are filtering Multicast v4 packets. Default is to filter. */ 398155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private AtomicBoolean mFilteringMulticastV4Packets = new AtomicBoolean(true); 399155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 400155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Channel for sending replies. 401155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private AsyncChannel mReplyChannel = new AsyncChannel(); 402155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 403f933721551d39adc4924e5f69dcc51c16c520850Navtej Singh Mann private WifiP2pServiceImpl mWifiP2pServiceImpl; 404446db2d5457456743e4476029e14d7c3bb9f5bccYuhao Zheng 405446db2d5457456743e4476029e14d7c3bb9f5bccYuhao Zheng // Used to initiate a connection with WifiP2pService 406155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private AsyncChannel mWifiP2pChannel; 407155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private AsyncChannel mWifiApConfigChannel; 408155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 4090af9c80053bd2736d5bea095b363d6a0c8ce71d0Lorenzo Colitti private int mConnectionRequests = 0; 4107d6e0b86655bf9862ae81fe37c9c8dc3f70d51f9Robert Greenwalt private WifiNetworkFactory mNetworkFactory; 411ebe870ef4051da2fc307114ed3c14927f548d9d4Jeff Davidson private UntrustedWifiNetworkFactory mUntrustedNetworkFactory; 4127d6e0b86655bf9862ae81fe37c9c8dc3f70d51f9Robert Greenwalt private WifiNetworkAgent mNetworkAgent; 4133831a926f6762a3b4c398da51cc67e9d81572458Robert Greenwalt 414c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalle // Keep track of various statistics, for retrieval by System Apps, i.e. under @SystemApi 415c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalle // We should really persist that into the networkHistory.txt file, and read it back when 416c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalle // WifiStateMachine starts up 417c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalle private WifiConnectionStatistics mWifiConnectionStatistics = new WifiConnectionStatistics(); 418c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalle 4193831a926f6762a3b4c398da51cc67e9d81572458Robert Greenwalt // Used to filter out requests we couldn't possibly satisfy. 4203831a926f6762a3b4c398da51cc67e9d81572458Robert Greenwalt private final NetworkCapabilities mNetworkCapabilitiesFilter = new NetworkCapabilities(); 4213831a926f6762a3b4c398da51cc67e9d81572458Robert Greenwalt 422155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* The base for wifi message types */ 423155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande static final int BASE = Protocol.BASE_WIFI; 424155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Start the supplicant */ 425155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande static final int CMD_START_SUPPLICANT = BASE + 11; 426155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Stop the supplicant */ 427155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande static final int CMD_STOP_SUPPLICANT = BASE + 12; 428155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Start the driver */ 429155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande static final int CMD_START_DRIVER = BASE + 13; 430155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Stop the driver */ 431155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande static final int CMD_STOP_DRIVER = BASE + 14; 432155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Indicates Static IP succeeded */ 433155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande static final int CMD_STATIC_IP_SUCCESS = BASE + 15; 434155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Indicates Static IP failed */ 435155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande static final int CMD_STATIC_IP_FAILURE = BASE + 16; 436155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Indicates supplicant stop failed */ 437155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande static final int CMD_STOP_SUPPLICANT_FAILED = BASE + 17; 438155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Delayed stop to avoid shutting down driver too quick*/ 439155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande static final int CMD_DELAYED_STOP_DRIVER = BASE + 18; 440155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* A delayed message sent to start driver when it fail to come up */ 441155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande static final int CMD_DRIVER_START_TIMED_OUT = BASE + 19; 442155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 443155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Start the soft access point */ 444155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande static final int CMD_START_AP = BASE + 21; 445155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Indicates soft ap start succeeded */ 446155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande static final int CMD_START_AP_SUCCESS = BASE + 22; 447155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Indicates soft ap start failed */ 448155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande static final int CMD_START_AP_FAILURE = BASE + 23; 449155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Stop the soft access point */ 450155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande static final int CMD_STOP_AP = BASE + 24; 451155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Set the soft access point configuration */ 452155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande static final int CMD_SET_AP_CONFIG = BASE + 25; 453155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Soft access point configuration set completed */ 454155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande static final int CMD_SET_AP_CONFIG_COMPLETED = BASE + 26; 455155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Request the soft access point configuration */ 456155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande static final int CMD_REQUEST_AP_CONFIG = BASE + 27; 457155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Response to access point configuration request */ 458155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande static final int CMD_RESPONSE_AP_CONFIG = BASE + 28; 459155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Invoked when getting a tether state change notification */ 460155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande static final int CMD_TETHER_STATE_CHANGE = BASE + 29; 461155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* A delayed message sent to indicate tether state change failed to arrive */ 462155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande static final int CMD_TETHER_NOTIFICATION_TIMED_OUT = BASE + 30; 463155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 464155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande static final int CMD_BLUETOOTH_ADAPTER_STATE_CHANGE = BASE + 31; 465155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 466155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Supplicant commands */ 467155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Is supplicant alive ? */ 468155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande static final int CMD_PING_SUPPLICANT = BASE + 51; 469155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Add/update a network configuration */ 470155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande static final int CMD_ADD_OR_UPDATE_NETWORK = BASE + 52; 471155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Delete a network */ 472155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande static final int CMD_REMOVE_NETWORK = BASE + 53; 473155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Enable a network. The device will attempt a connection to the given network. */ 474155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande static final int CMD_ENABLE_NETWORK = BASE + 54; 475155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Enable all networks */ 476155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande static final int CMD_ENABLE_ALL_NETWORKS = BASE + 55; 477155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Blacklist network. De-prioritizes the given BSSID for connection. */ 478155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande static final int CMD_BLACKLIST_NETWORK = BASE + 56; 479155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Clear the blacklist network list */ 480155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande static final int CMD_CLEAR_BLACKLIST = BASE + 57; 481155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Save configuration */ 482155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande static final int CMD_SAVE_CONFIG = BASE + 58; 483a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng /* Get configured networks */ 484155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande static final int CMD_GET_CONFIGURED_NETWORKS = BASE + 59; 485a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng /* Get available frequencies */ 486a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng static final int CMD_GET_CAPABILITY_FREQ = BASE + 60; 487a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande /* Get adaptors */ 488048dc8df2bd9394979dbb090b0cfe8d6627d23e3Vinit Deshpande static final int CMD_GET_SUPPORTED_FEATURES = BASE + 61; 4899878c61bbd81176561991be025af44efc67332feWenchao Tong /* Get configured networks with real preSharedKey */ 4909878c61bbd81176561991be025af44efc67332feWenchao Tong static final int CMD_GET_PRIVILEGED_CONFIGURED_NETWORKS = BASE + 62; 491200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle /* Get Link Layer Stats thru HAL */ 492200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle static final int CMD_GET_LINK_LAYER_STATS = BASE + 63; 493155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Supplicant commands after driver start*/ 494155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Initiate a scan */ 495155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande static final int CMD_START_SCAN = BASE + 71; 496155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Set operational mode. CONNECT, SCAN ONLY, SCAN_ONLY with Wi-Fi off mode */ 497155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande static final int CMD_SET_OPERATIONAL_MODE = BASE + 72; 498155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Disconnect from a network */ 499155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande static final int CMD_DISCONNECT = BASE + 73; 500155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Reconnect to a network */ 501155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande static final int CMD_RECONNECT = BASE + 74; 502155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Reassociate to a network */ 503155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande static final int CMD_REASSOCIATE = BASE + 75; 504c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalle /* Get Connection Statistis */ 505c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalle static final int CMD_GET_CONNECTION_STATISTICS = BASE + 76; 506c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalle 507155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Controls suspend mode optimizations 508155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * 509155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * When high perf mode is enabled, suspend mode optimizations are disabled 510155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * 511155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * When high perf mode is disabled, suspend mode optimizations are enabled 512155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * 513155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Suspend mode optimizations include: 514155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * - packet filtering 515155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * - turn off roaming 516155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * - DTIM wake up settings 517155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 518155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande static final int CMD_SET_HIGH_PERF_MODE = BASE + 77; 519155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Set the country code */ 520155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande static final int CMD_SET_COUNTRY_CODE = BASE + 80; 521155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Enables RSSI poll */ 522155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande static final int CMD_ENABLE_RSSI_POLL = BASE + 82; 523155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* RSSI poll */ 524155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande static final int CMD_RSSI_POLL = BASE + 83; 525155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Set up packet filtering */ 526155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande static final int CMD_START_PACKET_FILTERING = BASE + 84; 527155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Clear packet filter */ 528155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande static final int CMD_STOP_PACKET_FILTERING = BASE + 85; 529155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Enable suspend mode optimizations in the driver */ 530155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande static final int CMD_SET_SUSPEND_OPT_ENABLED = BASE + 86; 5317806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle /* Delayed NETWORK_DISCONNECT */ 5327806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle static final int CMD_DELAYED_NETWORK_DISCONNECT = BASE + 87; 533155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* When there are no saved networks, we do a periodic scan to notify user of 534155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * an open network */ 535155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande static final int CMD_NO_NETWORKS_PERIODIC_SCAN = BASE + 88; 5367806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle /* Test network Disconnection NETWORK_DISCONNECT */ 5377806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle static final int CMD_TEST_NETWORK_DISCONNECT = BASE + 89; 5387806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle private int testNetworkDisconnectCounter = 0; 539155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 540155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* arg1 values to CMD_STOP_PACKET_FILTERING and CMD_START_PACKET_FILTERING */ 541155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande static final int MULTICAST_V6 = 1; 542155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande static final int MULTICAST_V4 = 0; 543155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 544155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Set the frequency band */ 545155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande static final int CMD_SET_FREQUENCY_BAND = BASE + 90; 546155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Enable TDLS on a specific MAC address */ 547155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande static final int CMD_ENABLE_TDLS = BASE + 92; 5480d616ef3bf635dff8722e064c0be842676390ed8vandwalle /* DHCP/IP configuration watchdog */ 5497806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle static final int CMD_OBTAINING_IP_ADDRESS_WATCHDOG_TIMER = BASE + 93; 5507806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle 5517806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle /** 5520d616ef3bf635dff8722e064c0be842676390ed8vandwalle * Make this timer 40 seconds, which is about the normal DHCP timeout. 5537806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle * In no valid case, the WiFiStateMachine should remain stuck in ObtainingIpAddress 5547806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle * for more than 30 seconds. 5557806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle */ 5560d616ef3bf635dff8722e064c0be842676390ed8vandwalle static final int OBTAINING_IP_ADDRESS_GUARD_TIMER_MSEC = 40000; 557155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 5587806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle int obtainingIpWatchdogCount = 0; 5590d616ef3bf635dff8722e064c0be842676390ed8vandwalle 560155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Commands from/to the SupplicantStateTracker */ 561155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Reset the supplicant state tracker */ 562155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande static final int CMD_RESET_SUPPLICANT_STATE = BASE + 111; 563155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 5640d616ef3bf635dff8722e064c0be842676390ed8vandwalle 5650d616ef3bf635dff8722e064c0be842676390ed8vandwalle /** 5660d616ef3bf635dff8722e064c0be842676390ed8vandwalle * Watchdog for protecting against b/16823537 5670d616ef3bf635dff8722e064c0be842676390ed8vandwalle * Leave time for 4-ways handshake to succeed 5680d616ef3bf635dff8722e064c0be842676390ed8vandwalle */ 5690d616ef3bf635dff8722e064c0be842676390ed8vandwalle static final int ROAM_GUARD_TIMER_MSEC = 15000; 5700d616ef3bf635dff8722e064c0be842676390ed8vandwalle 5710d616ef3bf635dff8722e064c0be842676390ed8vandwalle int roamWatchdogCount = 0; 572be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle /* Roam state watchdog */ 5730d616ef3bf635dff8722e064c0be842676390ed8vandwalle static final int CMD_ROAM_WATCHDOG_TIMER = BASE + 94; 57482199a285f4a45a46b44eb8253999aa918534753vandwalle /* Screen change intent handling */ 57582199a285f4a45a46b44eb8253999aa918534753vandwalle static final int CMD_SCREEN_STATE_CHANGED = BASE + 95; 5760d616ef3bf635dff8722e064c0be842676390ed8vandwalle 577be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle int disconnectingWatchdogCount = 0; 578be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle static final int DISCONNECTING_GUARD_TIMER_MSEC = 5000; 579be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle 580be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle /* Disconnecting state watchdog */ 5812f2cf21662275a0e93d7d7a6ad3d98b4c596dcf0vandwalle static final int CMD_DISCONNECTING_WATCHDOG_TIMER = BASE + 96; 582be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle 5832ce99b40c36ed0352b31aa85d5f9383d5f0506f5vandwalle /* Disable an ephemeral network */ 5842ce99b40c36ed0352b31aa85d5f9383d5f0506f5vandwalle static final int CMD_DISABLE_EPHEMERAL_NETWORK = BASE + 98; 5852ce99b40c36ed0352b31aa85d5f9383d5f0506f5vandwalle 586155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* P2p commands */ 587155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* We are ok with no response here since we wont do much with it anyway */ 588155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public static final int CMD_ENABLE_P2P = BASE + 131; 589155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* In order to shut down supplicant cleanly, we wait till p2p has 590155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * been disabled */ 591155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public static final int CMD_DISABLE_P2P_REQ = BASE + 132; 592155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public static final int CMD_DISABLE_P2P_RSP = BASE + 133; 593155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 594155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public static final int CMD_BOOT_COMPLETED = BASE + 134; 595155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 596155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* change the batch scan settings. 597155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * arg1 = responsible UID 598155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * arg2 = csph (channel scans per hour) 599155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * obj = bundle with the new settings and the optional worksource 600155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 601155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public static final int CMD_SET_BATCHED_SCAN = BASE + 135; 602155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public static final int CMD_START_NEXT_BATCHED_SCAN = BASE + 136; 603155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public static final int CMD_POLL_BATCHED_SCAN = BASE + 137; 604155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 60514be3cde626bd5935f599cd6e0fca72cf1c4695dLorenzo Colitti /* We now have a valid IP configuration. */ 60614be3cde626bd5935f599cd6e0fca72cf1c4695dLorenzo Colitti static final int CMD_IP_CONFIGURATION_SUCCESSFUL = BASE + 138; 60714be3cde626bd5935f599cd6e0fca72cf1c4695dLorenzo Colitti /* We no longer have a valid IP configuration. */ 60814be3cde626bd5935f599cd6e0fca72cf1c4695dLorenzo Colitti static final int CMD_IP_CONFIGURATION_LOST = BASE + 139; 609d60cf2efc576f016506ebe6d8a83b4a6217b2e0eLorenzo Colitti /* Link configuration (IP address, DNS, ...) changes notified via netlink */ 610badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti static final int CMD_UPDATE_LINKPROPERTIES = BASE + 140; 611d60cf2efc576f016506ebe6d8a83b4a6217b2e0eLorenzo Colitti 612e6574ec7b6b2e7a678da7f77bdaaf31463852b2fvandwalle /* Supplicant is trying to associate to a given BSSID */ 613e6574ec7b6b2e7a678da7f77bdaaf31463852b2fvandwalle static final int CMD_TARGET_BSSID = BASE + 141; 614b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle 615155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Reload all networks and reconnect */ 616155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande static final int CMD_RELOAD_TLS_AND_RECONNECT = BASE + 142; 617155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 618f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle static final int CMD_AUTO_CONNECT = BASE + 143; 619f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 620e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle static final int network_status_unwanted_disconnect = 0; 621e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle static final int network_status_unwanted_disable_autojoin = 1; 622e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle 62327355a942653264388e909a4276196ee63e57811vandwalle static final int CMD_UNWANTED_NETWORK = BASE + 144; 62427355a942653264388e909a4276196ee63e57811vandwalle 6254dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle static final int CMD_AUTO_ROAM = BASE + 145; 6264dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle 627be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle static final int CMD_AUTO_SAVE_NETWORK = BASE + 146; 628be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle 6299f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle static final int CMD_ASSOCIATED_BSSID = BASE + 147; 6304dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle 631d30127db46224e45554f8964209221bba8ad41d9vandwalle static final int CMD_NETWORK_STATUS = BASE + 148; 632d30127db46224e45554f8964209221bba8ad41d9vandwalle 633155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Wifi state machine modes of operation */ 634155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* CONNECT_MODE - connect to any 'known' AP when it becomes available */ 635155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public static final int CONNECT_MODE = 1; 636155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* SCAN_ONLY_MODE - don't connect to any APs; scan, but only while apps hold lock */ 637155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public static final int SCAN_ONLY_MODE = 2; 638155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* SCAN_ONLY_WITH_WIFI_OFF - scan, but don't connect to any APs */ 639155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public static final int SCAN_ONLY_WITH_WIFI_OFF_MODE = 3; 640155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 641155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private static final int SUCCESS = 1; 642155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private static final int FAILURE = -1; 643155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 644155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Tracks if suspend optimizations need to be disabled by DHCP, 645155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * screen or due to high perf mode. 646155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * When any of them needs to disable it, we keep the suspend optimizations 647155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * disabled 648155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 649155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private int mSuspendOptNeedsDisabled = 0; 650155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 651155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private static final int SUSPEND_DUE_TO_DHCP = 1; 652155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private static final int SUSPEND_DUE_TO_HIGH_PERF = 1<<1; 653155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private static final int SUSPEND_DUE_TO_SCREEN = 1<<2; 654155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 655155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Tracks if user has enabled suspend optimizations through settings */ 656155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private AtomicBoolean mUserWantsSuspendOpt = new AtomicBoolean(true); 657155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 658155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 659155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Default framework scan interval in milliseconds. This is used in the scenario in which 660155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * wifi chipset does not support background scanning to set up a 661155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * periodic wake up scan so that the device can connect to a new access 662155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * point on the move. {@link Settings.Global#WIFI_FRAMEWORK_SCAN_INTERVAL_MS} can 663155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * override this. 664155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 665155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private final int mDefaultFrameworkScanIntervalMs; 666155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 66766f8e08b668ebdc4c9b180f90e71cbb4f3e1c37fvandwalle private int mDisconnectedScanPeriodMs = 10000; 668f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 669f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle /** 670155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Supplicant scan interval in milliseconds. 671155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Comes from {@link Settings.Global#WIFI_SUPPLICANT_SCAN_INTERVAL_MS} or 672155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * from the default config if the setting is not set 673155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 674155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private long mSupplicantScanIntervalMs; 675155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 676155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 677b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle * timeStamp of last full band scan we perfoemed for autojoin while connected with screen lit 678b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle */ 679b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle private long lastFullBandConnectedTimeMilli; 680b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle 681b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle /** 68240ff222cec1bd05879edb53abc75c6deead734cavandwalle * time interval to the next full band scan we will perform for 68340ff222cec1bd05879edb53abc75c6deead734cavandwalle * autojoin while connected with screen lit 684b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle */ 685b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle private long fullBandConnectedTimeIntervalMilli; 686b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle 687b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle /** 68840ff222cec1bd05879edb53abc75c6deead734cavandwalle * max time interval to the next full band scan we will perform for 68940ff222cec1bd05879edb53abc75c6deead734cavandwalle * autojoin while connected with screen lit 690b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle * Max time is 5 minutes 691b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle */ 692b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle private static final long maxFullBandConnectedTimeIntervalMilli = 1000 * 60 * 5; 693b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle 694b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle /** 695155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Minimum time interval between enabling all networks. 696155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * A device can end up repeatedly connecting to a bad network on screen on/off toggle 697155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * due to enabling every time. We add a threshold to avoid this. 698155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 699155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private static final int MIN_INTERVAL_ENABLE_ALL_NETWORKS_MS = 10 * 60 * 1000; /* 10 minutes */ 700155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private long mLastEnableAllNetworksTime; 701155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 702dd0c558776fcfba3f754bb0cd6533f2c9c23ec1evandwalle int mRunningBeaconCount = 0; 703dd0c558776fcfba3f754bb0cd6533f2c9c23ec1evandwalle 704155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 705155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Starting and shutting down driver too quick causes problems leading to driver 706155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * being in a bad state. Delay driver stop. 707155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 708155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private final int mDriverStopDelayMs; 709155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private int mDelayedStopCounter; 710155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private boolean mInDelayedStop = false; 711155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 712155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // sometimes telephony gives us this data before boot is complete and we can't store it 713155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // until after, so the write is deferred 714155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private volatile String mPersistedCountryCode; 715155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 716155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Supplicant doesn't like setting the same country code multiple times (it may drop 717155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // currently connected network), so we save the country code here to avoid redundency 718155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private String mLastSetCountryCode; 719155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 720155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Default parent state */ 721155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private State mDefaultState = new DefaultState(); 722155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Temporary initial state */ 723155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private State mInitialState = new InitialState(); 724155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Driver loaded, waiting for supplicant to start */ 725155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private State mSupplicantStartingState = new SupplicantStartingState(); 726155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Driver loaded and supplicant ready */ 727155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private State mSupplicantStartedState = new SupplicantStartedState(); 728155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Waiting for supplicant to stop and monitor to exit */ 729155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private State mSupplicantStoppingState = new SupplicantStoppingState(); 730155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Driver start issued, waiting for completed event */ 731155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private State mDriverStartingState = new DriverStartingState(); 732155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Driver started */ 733155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private State mDriverStartedState = new DriverStartedState(); 734155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Wait until p2p is disabled 735155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * This is a special state which is entered right after we exit out of DriverStartedState 736155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * before transitioning to another state. 737155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 738155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private State mWaitForP2pDisableState = new WaitForP2pDisableState(); 739155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Driver stopping */ 740155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private State mDriverStoppingState = new DriverStoppingState(); 741155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Driver stopped */ 742155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private State mDriverStoppedState = new DriverStoppedState(); 743155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Scan for networks, no connection will be established */ 744155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private State mScanModeState = new ScanModeState(); 745155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Connecting to an access point */ 746155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private State mConnectModeState = new ConnectModeState(); 747155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Connected at 802.11 (L2) level */ 748155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private State mL2ConnectedState = new L2ConnectedState(); 749155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* fetching IP after connection to access point (assoc+auth complete) */ 750155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private State mObtainingIpState = new ObtainingIpState(); 751155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Waiting for link quality verification to be complete */ 752155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private State mVerifyingLinkState = new VerifyingLinkState(); 753155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Connected with IP addr */ 754155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private State mConnectedState = new ConnectedState(); 7554dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle /* Roaming */ 7564dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle private State mRoamingState = new RoamingState(); 757155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* disconnect issued, waiting for network disconnect confirmation */ 758155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private State mDisconnectingState = new DisconnectingState(); 759155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Network is not connected, supplicant assoc+auth is not complete */ 760155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private State mDisconnectedState = new DisconnectedState(); 761155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Waiting for WPS to be completed*/ 762155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private State mWpsRunningState = new WpsRunningState(); 763155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 764155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Soft ap is starting up */ 765155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private State mSoftApStartingState = new SoftApStartingState(); 766155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Soft ap is running */ 767155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private State mSoftApStartedState = new SoftApStartedState(); 768155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Soft ap is running and we are waiting for tether notification */ 769155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private State mTetheringState = new TetheringState(); 770155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Soft ap is running and we are tethered through connectivity service */ 771155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private State mTetheredState = new TetheredState(); 772155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Waiting for untether confirmation before stopping soft Ap */ 773155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private State mUntetheringState = new UntetheringState(); 774155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 775155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private class TetherStateChange { 776155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande ArrayList<String> available; 777155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande ArrayList<String> active; 778155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande TetherStateChange(ArrayList<String> av, ArrayList<String> ac) { 779155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande available = av; 780155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande active = ac; 781155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 782155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 783155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 78433b575ca6bee66183929f9474b5a161432918604Vinit Deshpande public static class SimAuthRequestData { 78533b575ca6bee66183929f9474b5a161432918604Vinit Deshpande int networkId; 786dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande int protocol; 78733b575ca6bee66183929f9474b5a161432918604Vinit Deshpande String ssid; 788dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande String[] challenges; 78933b575ca6bee66183929f9474b5a161432918604Vinit Deshpande } 79033b575ca6bee66183929f9474b5a161432918604Vinit Deshpande 79133b575ca6bee66183929f9474b5a161432918604Vinit Deshpande public static class SimAuthResponseData { 79233b575ca6bee66183929f9474b5a161432918604Vinit Deshpande int id; 79333b575ca6bee66183929f9474b5a161432918604Vinit Deshpande String Kc1; 79433b575ca6bee66183929f9474b5a161432918604Vinit Deshpande String SRES1; 79533b575ca6bee66183929f9474b5a161432918604Vinit Deshpande String Kc2; 79633b575ca6bee66183929f9474b5a161432918604Vinit Deshpande String SRES2; 79733b575ca6bee66183929f9474b5a161432918604Vinit Deshpande String Kc3; 79833b575ca6bee66183929f9474b5a161432918604Vinit Deshpande String SRES3; 79933b575ca6bee66183929f9474b5a161432918604Vinit Deshpande } 800155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 801155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 802155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * One of {@link WifiManager#WIFI_STATE_DISABLED}, 803155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * {@link WifiManager#WIFI_STATE_DISABLING}, 804155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * {@link WifiManager#WIFI_STATE_ENABLED}, 805155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * {@link WifiManager#WIFI_STATE_ENABLING}, 806155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * {@link WifiManager#WIFI_STATE_UNKNOWN} 807155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * 808155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 809155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private final AtomicInteger mWifiState = new AtomicInteger(WIFI_STATE_DISABLED); 810155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 811155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 812155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * One of {@link WifiManager#WIFI_AP_STATE_DISABLED}, 813155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * {@link WifiManager#WIFI_AP_STATE_DISABLING}, 814155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * {@link WifiManager#WIFI_AP_STATE_ENABLED}, 815155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * {@link WifiManager#WIFI_AP_STATE_ENABLING}, 816155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * {@link WifiManager#WIFI_AP_STATE_FAILED} 817155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * 818155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 819155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private final AtomicInteger mWifiApState = new AtomicInteger(WIFI_AP_STATE_DISABLED); 820155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 821155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private static final int SCAN_REQUEST = 0; 822155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private static final String ACTION_START_SCAN = 823155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande "com.android.server.WifiManager.action.START_SCAN"; 824155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 825155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private static final String DELAYED_STOP_COUNTER = "DelayedStopCounter"; 826155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private static final int DRIVER_STOP_REQUEST = 0; 827155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private static final String ACTION_DELAYED_DRIVER_STOP = 828155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande "com.android.server.WifiManager.action.DELAYED_DRIVER_STOP"; 829155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 830155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private static final String ACTION_REFRESH_BATCHED_SCAN = 831155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande "com.android.server.WifiManager.action.REFRESH_BATCHED_SCAN"; 832155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 833155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Keep track of whether WIFI is running. 834155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 835155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private boolean mIsRunning = false; 836155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 837155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 838155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Keep track of whether we last told the battery stats we had started. 839155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 840155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private boolean mReportedRunning = false; 841155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 842155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 843155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Most recently set source of starting WIFI. 844155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 845155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private final WorkSource mRunningWifiUids = new WorkSource(); 846155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 847155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 848155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * The last reported UIDs that were responsible for starting WIFI. 849155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 850155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private final WorkSource mLastRunningWifiUids = new WorkSource(); 851155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 852155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private final IBatteryStats mBatteryStats; 853155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 854155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private BatchedScanSettings mBatchedScanSettings = null; 855155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 856155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 857155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Track the worksource/cost of the current settings and track what's been noted 858155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * to the battery stats, so we can mark the end of the previous when changing. 859155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 860155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private WorkSource mBatchedScanWorkSource = null; 861155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private int mBatchedScanCsph = 0; 862155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private WorkSource mNotedBatchedScanWorkSource = null; 863155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private int mNotedBatchedScanCsph = 0; 864155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 8653c3c5b64726f04920109e4c8f20a1c58ea7050aaRobert Greenwalt private String mTcpBufferSizes = null; 8663c3c5b64726f04920109e4c8f20a1c58ea7050aaRobert Greenwalt 86782199a285f4a45a46b44eb8253999aa918534753vandwalle // Used for debug and stats gathering 86882199a285f4a45a46b44eb8253999aa918534753vandwalle private static int sScanAlarmIntentCount = 0; 86982199a285f4a45a46b44eb8253999aa918534753vandwalle 8708242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle final static int frameworkMinScanIntervalSaneValue = 10000; 8718242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle 872931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle public WifiStateMachine(Context context, String wlanInterface, 873931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle WifiTrafficPoller trafficPoller){ 874155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande super("WifiStateMachine"); 875155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mContext = context; 876155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mInterfaceName = wlanInterface; 877155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mNetworkInfo = new NetworkInfo(ConnectivityManager.TYPE_WIFI, 0, NETWORKTYPE, ""); 878155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mBatteryStats = IBatteryStats.Stub.asInterface(ServiceManager.getService( 879155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande BatteryStats.SERVICE_NAME)); 880155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 881155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE); 882155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mNwService = INetworkManagementService.Stub.asInterface(b); 883155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 884155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mP2pSupported = mContext.getPackageManager().hasSystemFeature( 885155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande PackageManager.FEATURE_WIFI_DIRECT); 886155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 887155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiNative = new WifiNative(mInterfaceName); 888155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiConfigStore = new WifiConfigStore(context, mWifiNative); 889f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle mWifiAutoJoinController = new WifiAutoJoinController(context, this, 890c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalle mWifiConfigStore, mWifiConnectionStatistics, mWifiNative); 891155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiMonitor = new WifiMonitor(this, mWifiNative); 892155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiInfo = new WifiInfo(); 893155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mSupplicantStateTracker = new SupplicantStateTracker(context, this, mWifiConfigStore, 894155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande getHandler()); 895155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mLinkProperties = new LinkProperties(); 896155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 897511a412adce5a46c41e61f90c0df6de5fb4e491cYuhao Zheng IBinder s1 = ServiceManager.getService(Context.WIFI_P2P_SERVICE); 898511a412adce5a46c41e61f90c0df6de5fb4e491cYuhao Zheng mWifiP2pServiceImpl = (WifiP2pServiceImpl)IWifiP2pManager.Stub.asInterface(s1); 899511a412adce5a46c41e61f90c0df6de5fb4e491cYuhao Zheng 900155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mNetworkInfo.setIsAvailable(false); 901155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mLastBssid = null; 902155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mLastNetworkId = WifiConfiguration.INVALID_NETWORK_ID; 903155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mLastSignalLevel = -1; 904155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 905d60cf2efc576f016506ebe6d8a83b4a6217b2e0eLorenzo Colitti mNetlinkTracker = new NetlinkTracker(mInterfaceName, new NetlinkTracker.Callback() { 906d60cf2efc576f016506ebe6d8a83b4a6217b2e0eLorenzo Colitti public void update() { 907badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti sendMessage(CMD_UPDATE_LINKPROPERTIES); 908d60cf2efc576f016506ebe6d8a83b4a6217b2e0eLorenzo Colitti } 909d60cf2efc576f016506ebe6d8a83b4a6217b2e0eLorenzo Colitti }); 910155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande try { 911d60cf2efc576f016506ebe6d8a83b4a6217b2e0eLorenzo Colitti mNwService.registerObserver(mNetlinkTracker); 912155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } catch (RemoteException e) { 913d60cf2efc576f016506ebe6d8a83b4a6217b2e0eLorenzo Colitti loge("Couldn't register netlink tracker: " + e.toString()); 914155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 915155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 916155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mAlarmManager = (AlarmManager)mContext.getSystemService(Context.ALARM_SERVICE); 917cc9395f7b604c626e8c45021b52dad3abff9bd18Vinit Deshpande mScanIntent = getPrivateBroadcast(ACTION_START_SCAN, SCAN_REQUEST); 918cc9395f7b604c626e8c45021b52dad3abff9bd18Vinit Deshpande mBatchedScanIntervalIntent = getPrivateBroadcast(ACTION_REFRESH_BATCHED_SCAN, 0); 919155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 9208242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle // Make sure the interval is not configured less than 10 seconds 9218242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle int period = mContext.getResources().getInteger( 922155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande R.integer.config_wifi_framework_scan_interval); 9238242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle if (period < frameworkMinScanIntervalSaneValue) { 9248242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle period = frameworkMinScanIntervalSaneValue; 9258242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle } 9268242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle mDefaultFrameworkScanIntervalMs = period; 927155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mDriverStopDelayMs = mContext.getResources().getInteger( 928155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande R.integer.config_wifi_driver_stop_delay); 929155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 930155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mBackgroundScanSupported = mContext.getResources().getBoolean( 931155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande R.bool.config_wifi_background_scan_support); 932155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 933155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mPrimaryDeviceType = mContext.getResources().getString( 934155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande R.string.config_wifi_p2p_device_type); 935155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 936155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mUserWantsSuspendOpt.set(Settings.Global.getInt(mContext.getContentResolver(), 937155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Settings.Global.WIFI_SUSPEND_OPTIMIZATIONS_ENABLED, 1) == 1); 938155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 9393831a926f6762a3b4c398da51cc67e9d81572458Robert Greenwalt mNetworkCapabilitiesFilter.addTransportType(NetworkCapabilities.TRANSPORT_WIFI); 940937be0625eb1daa1b9d5a0991a3fe6ab2f4804c7Robert Greenwalt mNetworkCapabilitiesFilter.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET); 941937be0625eb1daa1b9d5a0991a3fe6ab2f4804c7Robert Greenwalt mNetworkCapabilitiesFilter.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED); 9423831a926f6762a3b4c398da51cc67e9d81572458Robert Greenwalt mNetworkCapabilitiesFilter.setLinkUpstreamBandwidthKbps(1024 * 1024); 9433831a926f6762a3b4c398da51cc67e9d81572458Robert Greenwalt mNetworkCapabilitiesFilter.setLinkDownstreamBandwidthKbps(1024 * 1024); 9443831a926f6762a3b4c398da51cc67e9d81572458Robert Greenwalt // TODO - needs to be a bit more dynamic 9453831a926f6762a3b4c398da51cc67e9d81572458Robert Greenwalt mNetworkCapabilities = new NetworkCapabilities(mNetworkCapabilitiesFilter); 9463831a926f6762a3b4c398da51cc67e9d81572458Robert Greenwalt 947155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mContext.registerReceiver( 948155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande new BroadcastReceiver() { 949155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande @Override 950155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public void onReceive(Context context, Intent intent) { 951155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande ArrayList<String> available = intent.getStringArrayListExtra( 952155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande ConnectivityManager.EXTRA_AVAILABLE_TETHER); 953155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande ArrayList<String> active = intent.getStringArrayListExtra( 954155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande ConnectivityManager.EXTRA_ACTIVE_TETHER); 955155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendMessage(CMD_TETHER_STATE_CHANGE, new TetherStateChange(available, active)); 956155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 957155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande },new IntentFilter(ConnectivityManager.ACTION_TETHER_STATE_CHANGED)); 958155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 959155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mContext.registerReceiver( 960155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande new BroadcastReceiver() { 961155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande @Override 962155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public void onReceive(Context context, Intent intent) { 9638242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle sScanAlarmIntentCount++; // Used for debug only 9648242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle startScan(SCAN_ALARM_SOURCE, mDelayedScanCounter.incrementAndGet(), null, null); 965f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle if (VDBG) 9668242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle loge("WiFiStateMachine SCAN ALARM -> " + mDelayedScanCounter.get()); 967155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 968155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande }, 969155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande new IntentFilter(ACTION_START_SCAN)); 970155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 971155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande IntentFilter filter = new IntentFilter(); 972155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande filter.addAction(Intent.ACTION_SCREEN_ON); 973155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande filter.addAction(Intent.ACTION_SCREEN_OFF); 974155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande filter.addAction(ACTION_REFRESH_BATCHED_SCAN); 975155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mContext.registerReceiver( 976155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande new BroadcastReceiver() { 977155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande @Override 978155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public void onReceive(Context context, Intent intent) { 979155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande String action = intent.getAction(); 980155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 981155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (action.equals(Intent.ACTION_SCREEN_ON)) { 98282199a285f4a45a46b44eb8253999aa918534753vandwalle sendMessage(CMD_SCREEN_STATE_CHANGED, 1); 983155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else if (action.equals(Intent.ACTION_SCREEN_OFF)) { 98482199a285f4a45a46b44eb8253999aa918534753vandwalle sendMessage(CMD_SCREEN_STATE_CHANGED, 0); 985155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else if (action.equals(ACTION_REFRESH_BATCHED_SCAN)) { 986155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande startNextBatchedScanAsync(); 987155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 988155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 989155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande }, filter); 990155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 991155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mContext.registerReceiver( 992155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande new BroadcastReceiver() { 993155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande @Override 994155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public void onReceive(Context context, Intent intent) { 995155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande int counter = intent.getIntExtra(DELAYED_STOP_COUNTER, 0); 996155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendMessage(CMD_DELAYED_STOP_DRIVER, counter, 0); 997155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 998155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande }, 999155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande new IntentFilter(ACTION_DELAYED_DRIVER_STOP)); 1000155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1001155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mContext.getContentResolver().registerContentObserver(Settings.Global.getUriFor( 1002155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Settings.Global.WIFI_SUSPEND_OPTIMIZATIONS_ENABLED), false, 1003155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande new ContentObserver(getHandler()) { 1004155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande @Override 1005155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public void onChange(boolean selfChange) { 1006155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mUserWantsSuspendOpt.set(Settings.Global.getInt(mContext.getContentResolver(), 1007155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Settings.Global.WIFI_SUSPEND_OPTIMIZATIONS_ENABLED, 1) == 1); 1008155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1009155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande }); 1010155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1011155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mContext.registerReceiver( 1012155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande new BroadcastReceiver() { 1013155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande @Override 1014155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public void onReceive(Context context, Intent intent) { 1015155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendMessage(CMD_BOOT_COMPLETED); 1016155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1017155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande }, 1018155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande new IntentFilter(Intent.ACTION_BOOT_COMPLETED)); 1019155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1020155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mScanResultCache = new LruCache<String, ScanResult>(SCAN_RESULT_CACHE_SIZE); 1021155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1022155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande PowerManager powerManager = (PowerManager)mContext.getSystemService(Context.POWER_SERVICE); 1023155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, getName()); 1024155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1025155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mSuspendWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "WifiSuspend"); 1026155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mSuspendWakeLock.setReferenceCounted(false); 1027155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 10283c3c5b64726f04920109e4c8f20a1c58ea7050aaRobert Greenwalt mTcpBufferSizes = mContext.getResources().getString( 10293c3c5b64726f04920109e4c8f20a1c58ea7050aaRobert Greenwalt com.android.internal.R.string.config_wifi_tcp_buffers); 10303c3c5b64726f04920109e4c8f20a1c58ea7050aaRobert Greenwalt 1031155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande addState(mDefaultState); 1032155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande addState(mInitialState, mDefaultState); 1033155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande addState(mSupplicantStartingState, mDefaultState); 1034155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande addState(mSupplicantStartedState, mDefaultState); 1035155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande addState(mDriverStartingState, mSupplicantStartedState); 1036155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande addState(mDriverStartedState, mSupplicantStartedState); 1037155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande addState(mScanModeState, mDriverStartedState); 1038155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande addState(mConnectModeState, mDriverStartedState); 1039155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande addState(mL2ConnectedState, mConnectModeState); 1040155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande addState(mObtainingIpState, mL2ConnectedState); 1041155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande addState(mVerifyingLinkState, mL2ConnectedState); 1042155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande addState(mConnectedState, mL2ConnectedState); 10434dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle addState(mRoamingState, mL2ConnectedState); 1044155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande addState(mDisconnectingState, mConnectModeState); 1045155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande addState(mDisconnectedState, mConnectModeState); 1046155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande addState(mWpsRunningState, mConnectModeState); 1047155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande addState(mWaitForP2pDisableState, mSupplicantStartedState); 1048155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande addState(mDriverStoppingState, mSupplicantStartedState); 1049155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande addState(mDriverStoppedState, mSupplicantStartedState); 1050155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande addState(mSupplicantStoppingState, mDefaultState); 1051155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande addState(mSoftApStartingState, mDefaultState); 1052155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande addState(mSoftApStartedState, mDefaultState); 1053155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande addState(mTetheringState, mSoftApStartedState); 1054155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande addState(mTetheredState, mSoftApStartedState); 1055155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande addState(mUntetheringState, mSoftApStartedState); 1056155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1057155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande setInitialState(mInitialState); 1058155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1059935a9c0c9e091829ac359a6d99ae3bd69fe9041bDianne Hackborn setLogRecSize(ActivityManager.isLowRamDeviceStatic() ? 100 : 3000); 1060155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande setLogOnlyTransitions(false); 1061f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle if (VDBG) setDbg(true); 1062155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1063155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande //start the state machine 1064155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande start(); 1065155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1066155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande final Intent intent = new Intent(WifiManager.WIFI_SCAN_AVAILABLE); 1067155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); 1068155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande intent.putExtra(WifiManager.EXTRA_SCAN_AVAILABLE, WIFI_STATE_DISABLED); 1069155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL); 1070155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1071155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1072cc9395f7b604c626e8c45021b52dad3abff9bd18Vinit Deshpande 1073cc9395f7b604c626e8c45021b52dad3abff9bd18Vinit Deshpande PendingIntent getPrivateBroadcast(String action, int requestCode) { 1074cc9395f7b604c626e8c45021b52dad3abff9bd18Vinit Deshpande Intent intent = new Intent(action, null); 1075f5a84fcd66298ee6e96b781d2645422a1571ac07Vinit Deshpande intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); 1076cc9395f7b604c626e8c45021b52dad3abff9bd18Vinit Deshpande intent.setPackage(this.getClass().getPackage().getName()); 1077cc9395f7b604c626e8c45021b52dad3abff9bd18Vinit Deshpande return PendingIntent.getBroadcast(mContext, requestCode, intent, 0); 1078cc9395f7b604c626e8c45021b52dad3abff9bd18Vinit Deshpande } 1079cc9395f7b604c626e8c45021b52dad3abff9bd18Vinit Deshpande 1080ed9938883ae2dade81c8be6cd6ceaef3febd5239vandwalle private int mVerboseLoggingLevel = 0; 1081ed9938883ae2dade81c8be6cd6ceaef3febd5239vandwalle 1082ed9938883ae2dade81c8be6cd6ceaef3febd5239vandwalle int getVerboseLoggingLevel() { 1083ed9938883ae2dade81c8be6cd6ceaef3febd5239vandwalle return mVerboseLoggingLevel; 1084ed9938883ae2dade81c8be6cd6ceaef3febd5239vandwalle } 1085ed9938883ae2dade81c8be6cd6ceaef3febd5239vandwalle 1086ed9938883ae2dade81c8be6cd6ceaef3febd5239vandwalle void enableVerboseLogging(int verbose) { 1087ed9938883ae2dade81c8be6cd6ceaef3febd5239vandwalle mVerboseLoggingLevel = verbose; 1088ed9938883ae2dade81c8be6cd6ceaef3febd5239vandwalle if (verbose > 0) { 1089ed9938883ae2dade81c8be6cd6ceaef3febd5239vandwalle DBG = true; 1090ed9938883ae2dade81c8be6cd6ceaef3febd5239vandwalle VDBG = true; 1091ed9938883ae2dade81c8be6cd6ceaef3febd5239vandwalle PDBG = true; 1092ed9938883ae2dade81c8be6cd6ceaef3febd5239vandwalle mLogMessages = true; 1093ad7319939c424d42fa6a3791c47f613db8ef3cd8vandwalle mWifiNative.setSupplicantLogLevel("DEBUG"); 1094ed9938883ae2dade81c8be6cd6ceaef3febd5239vandwalle } else { 1095ed9938883ae2dade81c8be6cd6ceaef3febd5239vandwalle DBG = false; 1096ed9938883ae2dade81c8be6cd6ceaef3febd5239vandwalle VDBG = false; 1097ed9938883ae2dade81c8be6cd6ceaef3febd5239vandwalle PDBG = false; 1098ed9938883ae2dade81c8be6cd6ceaef3febd5239vandwalle mLogMessages = false; 1099ad7319939c424d42fa6a3791c47f613db8ef3cd8vandwalle mWifiNative.setSupplicantLogLevel("INFO"); 1100ed9938883ae2dade81c8be6cd6ceaef3febd5239vandwalle } 11010888ce6f90bdaeee799dd8361ea4781e23a33b87vandwalle mWifiAutoJoinController.enableVerboseLogging(verbose); 11020888ce6f90bdaeee799dd8361ea4781e23a33b87vandwalle mWifiMonitor.enableVerboseLogging(verbose); 11030888ce6f90bdaeee799dd8361ea4781e23a33b87vandwalle mWifiNative.enableVerboseLogging(verbose); 11040888ce6f90bdaeee799dd8361ea4781e23a33b87vandwalle mWifiConfigStore.enableVerboseLogging(verbose); 11050888ce6f90bdaeee799dd8361ea4781e23a33b87vandwalle mSupplicantStateTracker.enableVerboseLogging(verbose); 1106ed9938883ae2dade81c8be6cd6ceaef3febd5239vandwalle } 1107ed9938883ae2dade81c8be6cd6ceaef3febd5239vandwalle 1108c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle private int mAggressiveHandover = 0; 1109c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle 1110c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle int getAggressiveHandover() { 1111c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle return mAggressiveHandover; 1112c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle } 1113c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle 1114c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle void enableAggressiveHandover(int enabled) { 1115c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle mAggressiveHandover = enabled; 1116c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle } 1117c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle 1118c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle public void setAllowScansWithTraffic(int enabled) { 11199f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle mWifiConfigStore.alwaysEnableScansWhileAssociated = enabled; 1120c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle } 1121c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle 1122c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle public int getAllowScansWithTraffic() { 11239f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle return mWifiConfigStore.alwaysEnableScansWhileAssociated; 1124c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle } 1125c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle 1126f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle /* 1127f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle * 1128f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle * Framework scan control 1129f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle */ 1130f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 1131f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle private boolean mAlarmEnabled = false; 1132f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle /* This is set from the overlay config file or from a secure setting. 1133f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle * A value of 0 disables scanning in the framework. 1134f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle */ 1135f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle private long mFrameworkScanIntervalMs = 10000; 1136f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 11378242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle private AtomicInteger mDelayedScanCounter = new AtomicInteger(); 11388242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle 11398242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle private void setScanAlarm(boolean enabled) { 1140f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle if (PDBG) { 11419f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle loge("setScanAlarm " + enabled 11428242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle + " period " + mDefaultFrameworkScanIntervalMs 11438242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle + " mBackgroundScanSupported " + mBackgroundScanSupported); 11448242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle } 11458242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle if (mBackgroundScanSupported == false) { 11468242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle // Scan alarm is only used for background scans if they are not 11478242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle // offloaded to the wifi chipset, hence enable the scan alarm 11488242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle // gicing us RTC_WAKEUP of backgroundScan is NOT supported 11498242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle enabled = true; 1150f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle } 11518242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle 1152f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle if (enabled == mAlarmEnabled) return; 1153f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle if (enabled) { 11547c8a4effa2442b9d00fd421b443ea9645f8651c8Vinit Deshpande /* Set RTC_WAKEUP alarms if PNO is not supported - because no one is */ 11557c8a4effa2442b9d00fd421b443ea9645f8651c8Vinit Deshpande /* going to wake up the host processor to look for access points */ 11568242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle mAlarmManager.set(AlarmManager.RTC_WAKEUP, 11578242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle System.currentTimeMillis() + mDefaultFrameworkScanIntervalMs, 115866f8e08b668ebdc4c9b180f90e71cbb4f3e1c37fvandwalle mScanIntent); 115966f8e08b668ebdc4c9b180f90e71cbb4f3e1c37fvandwalle mAlarmEnabled = true; 1160f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle } else { 1161f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle mAlarmManager.cancel(mScanIntent); 1162f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle mAlarmEnabled = false; 1163f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle } 1164f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle } 1165f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 11668242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle private void cancelDelayedScan() { 11678242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle mDelayedScanCounter.incrementAndGet(); 11688242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle loge("cancelDelayedScan -> " + mDelayedScanCounter); 11698242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle } 11708242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle 11718242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle private boolean checkAndRestartDelayedScan(int counter, boolean restart, int milli, 11728242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle ScanSettings settings, WorkSource workSource) { 11738242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle if (counter != mDelayedScanCounter.get()) { 11748242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle return false; 11758242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle } 11768242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle if (restart) 11778242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle startDelayedScan(milli, settings, workSource); 11788242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle return true; 11798242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle } 11808242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle 11818242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle private void startDelayedScan(int milli, ScanSettings settings, WorkSource workSource) { 11828242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle if (milli <= 0) return; 11838242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle /** 11848242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle * The cases where the scan alarm should be run are : 11858242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle * - DisconnectedState && screenOn => used delayed timer 11868242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle * - DisconnectedState && !screenOn && mBackgroundScanSupported => PNO 11878242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle * - DisconnectedState && !screenOn && !mBackgroundScanSupported => used RTC_WAKEUP Alarm 11888242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle * - ConnectedState && screenOn => used delayed timer 11898242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle */ 11908242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle 11918242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle mDelayedScanCounter.incrementAndGet(); 11928242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle if (mScreenOn && 11938242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle (getCurrentState() == mDisconnectedState 11948242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle || getCurrentState() == mConnectedState)) { 11958242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle Bundle bundle = new Bundle(); 11968242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle bundle.putParcelable(CUSTOMIZED_SCAN_SETTING, settings); 11978242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle bundle.putParcelable(CUSTOMIZED_SCAN_WORKSOURCE, workSource); 11988242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle bundle.putLong(SCAN_REQUEST_TIME, System.currentTimeMillis()); 11998242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle sendMessageDelayed(CMD_START_SCAN, SCAN_ALARM_SOURCE, 12008242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle mDelayedScanCounter.get(), bundle, milli); 12018242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle if (DBG) loge("startDelayedScan send -> " + mDelayedScanCounter + " milli " + milli); 12028242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle } else if (mBackgroundScanSupported == false 12038242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle && !mScreenOn && getCurrentState() == mDisconnectedState) { 12048242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle setScanAlarm(true); 12058242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle if (DBG) loge("startDelayedScan start scan alarm -> " 12068242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle + mDelayedScanCounter + " milli " + milli); 12078242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle } else { 12088242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle if (DBG) loge("startDelayedScan unhandled -> " 12098242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle + mDelayedScanCounter + " milli " + milli); 12108242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle } 12118242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle } 12128242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle 1213eedd70ee3fa7f161ea1f4ae26543ac927e82a681Vinit Deshpande private boolean setRandomMacOui() { 1214eedd70ee3fa7f161ea1f4ae26543ac927e82a681Vinit Deshpande String oui = mContext.getResources().getString( 1215eedd70ee3fa7f161ea1f4ae26543ac927e82a681Vinit Deshpande R.string.config_wifi_random_mac_oui, GOOGLE_OUI); 1216eedd70ee3fa7f161ea1f4ae26543ac927e82a681Vinit Deshpande String[] ouiParts = oui.split("-"); 1217eedd70ee3fa7f161ea1f4ae26543ac927e82a681Vinit Deshpande byte[] ouiBytes = new byte[3]; 1218eedd70ee3fa7f161ea1f4ae26543ac927e82a681Vinit Deshpande ouiBytes[0] = (byte) (Integer.parseInt(ouiParts[0], 16) & 0xFF); 1219eedd70ee3fa7f161ea1f4ae26543ac927e82a681Vinit Deshpande ouiBytes[1] = (byte) (Integer.parseInt(ouiParts[1], 16) & 0xFF); 1220eedd70ee3fa7f161ea1f4ae26543ac927e82a681Vinit Deshpande ouiBytes[2] = (byte) (Integer.parseInt(ouiParts[2], 16) & 0xFF); 1221eedd70ee3fa7f161ea1f4ae26543ac927e82a681Vinit Deshpande 1222eedd70ee3fa7f161ea1f4ae26543ac927e82a681Vinit Deshpande logd("Setting OUI to " + oui); 1223eedd70ee3fa7f161ea1f4ae26543ac927e82a681Vinit Deshpande return mWifiNative.setScanningMacOui(ouiBytes); 1224eedd70ee3fa7f161ea1f4ae26543ac927e82a681Vinit Deshpande } 1225eedd70ee3fa7f161ea1f4ae26543ac927e82a681Vinit Deshpande 1226155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /********************************************************* 1227155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Methods exposed for public use 1228155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande ********************************************************/ 1229155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1230155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public Messenger getMessenger() { 1231155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return new Messenger(getHandler()); 1232155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 12339ae6b45c038fa74a9e7285ef4834551dd93da332Yuhao Zheng 1234511a412adce5a46c41e61f90c0df6de5fb4e491cYuhao Zheng public WifiMonitor getWifiMonitor() { 12359ae6b45c038fa74a9e7285ef4834551dd93da332Yuhao Zheng return mWifiMonitor; 12369ae6b45c038fa74a9e7285ef4834551dd93da332Yuhao Zheng } 12379ae6b45c038fa74a9e7285ef4834551dd93da332Yuhao Zheng 1238155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 1239155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * TODO: doc 1240155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 1241155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public boolean syncPingSupplicant(AsyncChannel channel) { 1242155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Message resultMsg = channel.sendMessageSynchronously(CMD_PING_SUPPLICANT); 1243155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande boolean result = (resultMsg.arg1 != FAILURE); 1244155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande resultMsg.recycle(); 1245155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return result; 1246155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1247155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1248a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng public List<WifiChannel> syncGetChannelList(AsyncChannel channel) { 1249a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng Message resultMsg = channel.sendMessageSynchronously(CMD_GET_CAPABILITY_FREQ); 1250a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng List<WifiChannel> list = null; 1251a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng if (resultMsg.obj != null) { 1252a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng list = new ArrayList<WifiChannel>(); 1253a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng String freqs = (String) resultMsg.obj; 1254a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng String[] lines = freqs.split("\n"); 1255a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng for (String line : lines) 1256a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng if (line.contains("MHz")) { 1257a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng // line format: " 52 = 5260 MHz (NO_IBSS) (DFS)" 1258a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng WifiChannel c = new WifiChannel(); 1259a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng String[] prop = line.split(" "); 1260a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng if (prop.length < 5) continue; 1261a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng try { 1262a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng c.channelNum = Integer.parseInt(prop[1]); 1263a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng c.freqMHz = Integer.parseInt(prop[3]); 1264a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng } catch (NumberFormatException e) { } 1265a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng c.isDFS = line.contains("(DFS)"); 1266a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng list.add(c); 1267a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng } else if (line.contains("Mode[B] Channels:")) { 1268a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng // B channels are the same as G channels, skipped 1269a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng break; 1270a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng } 1271a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng } 1272a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng resultMsg.recycle(); 1273a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng return (list != null && list.size() > 0) ? list : null; 1274a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng } 1275a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng 1276005c1ef113192f898499a407dd266393a8d6b076vandwalle /** 1277005c1ef113192f898499a407dd266393a8d6b076vandwalle * When settings allowing making use of untrusted networks change, trigger a scan 1278005c1ef113192f898499a407dd266393a8d6b076vandwalle * so as to kick of autojoin. 1279005c1ef113192f898499a407dd266393a8d6b076vandwalle */ 1280005c1ef113192f898499a407dd266393a8d6b076vandwalle public void startScanForUntrustedSettingChange() { 1281d406991cea796c4b75e484bd0d47a85a0f8a4daeJeff Davidson startScan(SET_ALLOW_UNTRUSTED_SOURCE, 0, null, null); 1282005c1ef113192f898499a407dd266393a8d6b076vandwalle } 1283a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng 1284155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 1285a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng * Initiate a wifi scan. If workSource is not null, blame is given to it, otherwise blame is 1286a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng * given to callingUid. 1287155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * 1288a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng * @param callingUid The uid initiating the wifi scan. Blame will be given here unless 1289a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng * workSource is specified. 1290155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * @param workSource If not null, blame is given to workSource. 1291a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng * @param settings Scan settings, see {@link ScanSettings}. 1292155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 1293ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle public void startScan(int callingUid, int scanCounter, 1294ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle ScanSettings settings, WorkSource workSource) { 1295a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng Bundle bundle = new Bundle(); 1296a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng bundle.putParcelable(CUSTOMIZED_SCAN_SETTING, settings); 1297a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng bundle.putParcelable(CUSTOMIZED_SCAN_WORKSOURCE, workSource); 1298ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle bundle.putLong(SCAN_REQUEST_TIME, System.currentTimeMillis()); 1299ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle sendMessage(CMD_START_SCAN, callingUid, scanCounter, bundle); 1300155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1301155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1302155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 1303155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * start or stop batched scanning using the given settings 1304155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 1305155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public void setBatchedScanSettings(BatchedScanSettings settings, int callingUid, int csph, 1306155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande WorkSource workSource) { 1307155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Bundle bundle = new Bundle(); 1308155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande bundle.putParcelable(BATCHED_SETTING, settings); 1309155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande bundle.putParcelable(BATCHED_WORKSOURCE, workSource); 1310155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendMessage(CMD_SET_BATCHED_SCAN, callingUid, csph, bundle); 1311155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1312155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1313155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public List<BatchedScanResult> syncGetBatchedScanResultsList() { 1314155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande synchronized (mBatchedScanResults) { 1315155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande List<BatchedScanResult> batchedScanList = 1316155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande new ArrayList<BatchedScanResult>(mBatchedScanResults.size()); 1317155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande for(BatchedScanResult result: mBatchedScanResults) { 1318155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande batchedScanList.add(new BatchedScanResult(result)); 1319155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1320155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return batchedScanList; 1321155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1322155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1323155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1324155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public void requestBatchedScanPoll() { 1325155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendMessage(CMD_POLL_BATCHED_SCAN); 1326155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1327155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1328155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private void startBatchedScan() { 1329155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mBatchedScanSettings == null) return; 1330155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1331155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mDhcpActive) { 1332155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (DBG) log("not starting Batched Scans due to DHCP"); 1333155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return; 1334155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1335155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1336155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // first grab any existing data 1337155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande retrieveBatchedScanData(); 1338155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1339f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle if (PDBG) loge("try starting Batched Scans due to DHCP"); 1340f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 1341f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 1342155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mAlarmManager.cancel(mBatchedScanIntervalIntent); 1343155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1344155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande String scansExpected = mWifiNative.setBatchedScanSettings(mBatchedScanSettings); 1345155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande try { 1346155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mExpectedBatchedScans = Integer.parseInt(scansExpected); 1347155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande setNextBatchedAlarm(mExpectedBatchedScans); 1348155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mExpectedBatchedScans > 0) noteBatchedScanStart(); 1349155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } catch (NumberFormatException e) { 1350155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande stopBatchedScan(); 1351155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("Exception parsing WifiNative.setBatchedScanSettings response " + e); 1352155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1353155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1354155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1355155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // called from BroadcastListener 1356155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private void startNextBatchedScanAsync() { 1357155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendMessage(CMD_START_NEXT_BATCHED_SCAN); 1358155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1359155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1360155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private void startNextBatchedScan() { 1361155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // first grab any existing data 1362155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande retrieveBatchedScanData(); 1363155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1364155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande setNextBatchedAlarm(mExpectedBatchedScans); 1365155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1366155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1367155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private void handleBatchedScanPollRequest() { 1368155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (DBG) { 1369155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande log("handleBatchedScanPoll Request - mBatchedScanMinPollTime=" + 1370155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mBatchedScanMinPollTime + " , mBatchedScanSettings=" + 1371155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mBatchedScanSettings); 1372155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1373155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // if there is no appropriate PollTime that's because we either aren't 1374155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // batching or we've already set a time for a poll request 1375155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mBatchedScanMinPollTime == 0) return; 1376155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mBatchedScanSettings == null) return; 1377155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1378155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande long now = System.currentTimeMillis(); 1379155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1380155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (now > mBatchedScanMinPollTime) { 1381155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // do the poll and reset our timers 1382155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande startNextBatchedScan(); 1383155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 1384155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mAlarmManager.setExact(AlarmManager.RTC_WAKEUP, mBatchedScanMinPollTime, 1385155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mBatchedScanIntervalIntent); 1386155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mBatchedScanMinPollTime = 0; 1387155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1388155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1389155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1390155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // return true if new/different 1391155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private boolean recordBatchedScanSettings(int responsibleUid, int csph, Bundle bundle) { 1392155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande BatchedScanSettings settings = bundle.getParcelable(BATCHED_SETTING); 1393155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande WorkSource responsibleWorkSource = bundle.getParcelable(BATCHED_WORKSOURCE); 1394155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1395155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (DBG) { 1396155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande log("set batched scan to " + settings + " for uid=" + responsibleUid + 1397155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande ", worksource=" + responsibleWorkSource); 1398155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1399155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (settings != null) { 1400155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (settings.equals(mBatchedScanSettings)) return false; 1401155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 1402155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mBatchedScanSettings == null) return false; 1403155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1404155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mBatchedScanSettings = settings; 1405155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (responsibleWorkSource == null) responsibleWorkSource = new WorkSource(responsibleUid); 1406155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mBatchedScanWorkSource = responsibleWorkSource; 1407155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mBatchedScanCsph = csph; 1408155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return true; 1409155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1410155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1411155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private void stopBatchedScan() { 1412155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mAlarmManager.cancel(mBatchedScanIntervalIntent); 1413155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande retrieveBatchedScanData(); 1414155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiNative.setBatchedScanSettings(null); 1415155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande noteBatchedScanStop(); 1416155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1417155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1418155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private void setNextBatchedAlarm(int scansExpected) { 1419155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1420155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mBatchedScanSettings == null || scansExpected < 1) return; 1421155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1422155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mBatchedScanMinPollTime = System.currentTimeMillis() + 1423155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mBatchedScanSettings.scanIntervalSec * 1000; 1424155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1425155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mBatchedScanSettings.maxScansPerBatch < scansExpected) { 1426155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande scansExpected = mBatchedScanSettings.maxScansPerBatch; 1427155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1428155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1429155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande int secToFull = mBatchedScanSettings.scanIntervalSec; 1430155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande secToFull *= scansExpected; 1431155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1432155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande int debugPeriod = SystemProperties.getInt("wifi.batchedScan.pollPeriod", 0); 1433155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (debugPeriod > 0) secToFull = debugPeriod; 1434155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1435155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // set the alarm to do the next poll. We set it a little short as we'd rather 1436155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // wake up wearly than miss a scan due to buffer overflow 1437155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mAlarmManager.setExact(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() 1438155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande + ((secToFull - (mBatchedScanSettings.scanIntervalSec / 2)) * 1000), 1439155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mBatchedScanIntervalIntent); 1440155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1441155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1442155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 1443155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Start reading new scan data 1444155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Data comes in as: 1445155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * "scancount=5\n" 1446155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * "nextcount=5\n" 1447155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * "apcount=3\n" 1448155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * "trunc\n" (optional) 1449155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * "bssid=...\n" 1450155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * "ssid=...\n" 1451155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * "freq=...\n" (in Mhz) 1452155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * "level=...\n" 1453155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * "dist=...\n" (in cm) 1454155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * "distsd=...\n" (standard deviation, in cm) 1455155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * "====" 1456155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * "bssid=...\n" 1457155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * etc 1458155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * "====" 1459155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * "bssid=...\n" 1460155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * etc 1461155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * "%%%%" 1462155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * "apcount=2\n" 1463155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * "bssid=...\n" 1464155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * etc 1465155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * "%%%% 1466155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * etc 1467155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * "----" 1468155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 1469155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private final static boolean DEBUG_PARSE = false; 1470155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private void retrieveBatchedScanData() { 1471155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande String rawData = mWifiNative.getBatchedScanResults(); 1472155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (DEBUG_PARSE) log("rawData = " + rawData); 1473155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mBatchedScanMinPollTime = 0; 1474155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (rawData == null || rawData.equalsIgnoreCase("OK")) { 1475155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("Unexpected BatchedScanResults :" + rawData); 1476155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return; 1477155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1478155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1479155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande int scanCount = 0; 1480155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande final String END_OF_BATCHES = "----"; 1481155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande final String SCANCOUNT = "scancount="; 1482155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande final String TRUNCATED = "trunc"; 1483155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande final String AGE = "age="; 1484155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande final String DIST = "dist="; 1485155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande final String DISTSD = "distSd="; 1486155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1487155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande String splitData[] = rawData.split("\n"); 1488155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande int n = 0; 1489155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (splitData[n].startsWith(SCANCOUNT)) { 1490155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande try { 1491155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande scanCount = Integer.parseInt(splitData[n++].substring(SCANCOUNT.length())); 1492155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } catch (NumberFormatException e) { 1493155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("scancount parseInt Exception from " + splitData[n]); 1494155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1495155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else log("scancount not found"); 1496155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (scanCount == 0) { 1497155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("scanCount==0 - aborting"); 1498155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return; 1499155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1500155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1501155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande final Intent intent = new Intent(WifiManager.BATCHED_SCAN_RESULTS_AVAILABLE_ACTION); 1502155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); 1503155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1504155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande synchronized (mBatchedScanResults) { 1505155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mBatchedScanResults.clear(); 1506155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande BatchedScanResult batchedScanResult = new BatchedScanResult(); 1507155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1508155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande String bssid = null; 1509155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande WifiSsid wifiSsid = null; 1510155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande int level = 0; 1511155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande int freq = 0; 1512155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande int dist, distSd; 1513155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande long tsf = 0; 1514155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande dist = distSd = ScanResult.UNSPECIFIED; 1515155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande final long now = SystemClock.elapsedRealtime(); 1516155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande final int bssidStrLen = BSSID_STR.length(); 1517155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1518155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande while (true) { 1519155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande while (n < splitData.length) { 1520155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (DEBUG_PARSE) logd("parsing " + splitData[n]); 1521155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (splitData[n].equals(END_OF_BATCHES)) { 1522155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (n+1 != splitData.length) { 1523155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("didn't consume " + (splitData.length-n)); 1524155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1525155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mBatchedScanResults.size() > 0) { 1526155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mContext.sendBroadcastAsUser(intent, UserHandle.ALL); 1527155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1528155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande logd("retrieveBatchedScanResults X"); 1529155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return; 1530155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1531155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if ((splitData[n].equals(END_STR)) || splitData[n].equals(DELIMITER_STR)) { 1532155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (bssid != null) { 1533155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande batchedScanResult.scanResults.add(new ScanResult( 1534155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande wifiSsid, bssid, "", level, freq, tsf, dist, distSd)); 1535155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande wifiSsid = null; 1536155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande bssid = null; 1537155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande level = 0; 1538155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande freq = 0; 1539155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande tsf = 0; 1540155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande dist = distSd = ScanResult.UNSPECIFIED; 1541155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1542155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (splitData[n].equals(END_STR)) { 1543155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (batchedScanResult.scanResults.size() != 0) { 1544155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mBatchedScanResults.add(batchedScanResult); 1545155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande batchedScanResult = new BatchedScanResult(); 1546155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 1547155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande logd("Found empty batch"); 1548155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1549155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1550155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else if (splitData[n].equals(TRUNCATED)) { 1551155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande batchedScanResult.truncated = true; 1552155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else if (splitData[n].startsWith(BSSID_STR)) { 1553155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande bssid = new String(splitData[n].getBytes(), bssidStrLen, 1554155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande splitData[n].length() - bssidStrLen); 1555155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else if (splitData[n].startsWith(FREQ_STR)) { 1556155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande try { 1557155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande freq = Integer.parseInt(splitData[n].substring(FREQ_STR.length())); 1558155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } catch (NumberFormatException e) { 1559155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("Invalid freqency: " + splitData[n]); 1560155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande freq = 0; 1561155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1562155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else if (splitData[n].startsWith(AGE)) { 1563155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande try { 1564155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande tsf = now - Long.parseLong(splitData[n].substring(AGE.length())); 1565155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande tsf *= 1000; // convert mS -> uS 1566155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } catch (NumberFormatException e) { 1567155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("Invalid timestamp: " + splitData[n]); 1568155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande tsf = 0; 1569155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1570155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else if (splitData[n].startsWith(SSID_STR)) { 1571155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande wifiSsid = WifiSsid.createFromAsciiEncoded( 1572155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande splitData[n].substring(SSID_STR.length())); 1573155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else if (splitData[n].startsWith(LEVEL_STR)) { 1574155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande try { 1575155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande level = Integer.parseInt(splitData[n].substring(LEVEL_STR.length())); 1576155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (level > 0) level -= 256; 1577155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } catch (NumberFormatException e) { 1578155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("Invalid level: " + splitData[n]); 1579155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande level = 0; 1580155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1581155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else if (splitData[n].startsWith(DIST)) { 1582155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande try { 1583155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande dist = Integer.parseInt(splitData[n].substring(DIST.length())); 1584155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } catch (NumberFormatException e) { 1585155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("Invalid distance: " + splitData[n]); 1586155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande dist = ScanResult.UNSPECIFIED; 1587155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1588155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else if (splitData[n].startsWith(DISTSD)) { 1589155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande try { 1590155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande distSd = Integer.parseInt(splitData[n].substring(DISTSD.length())); 1591155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } catch (NumberFormatException e) { 1592155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("Invalid distanceSd: " + splitData[n]); 1593155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande distSd = ScanResult.UNSPECIFIED; 1594155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1595155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 1596155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("Unable to parse batched scan result line: " + splitData[n]); 1597155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1598155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande n++; 1599155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1600155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande rawData = mWifiNative.getBatchedScanResults(); 1601155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (DEBUG_PARSE) log("reading more data:\n" + rawData); 1602155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (rawData == null) { 1603155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("Unexpected null BatchedScanResults"); 1604155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return; 1605155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1606155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande splitData = rawData.split("\n"); 1607155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (splitData.length == 0 || splitData[0].equals("ok")) { 1608155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("batch scan results just ended!"); 1609155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mBatchedScanResults.size() > 0) { 1610155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL); 1611155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1612155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return; 1613155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1614155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande n = 0; 1615155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1616155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1617155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1618155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 16190eebae7334d6129f7ca1344e4b20199794994358vandwalle private long mDisconnectedTimeStamp = 0; 16200eebae7334d6129f7ca1344e4b20199794994358vandwalle 16210eebae7334d6129f7ca1344e4b20199794994358vandwalle public long getDisconnectedTimeMilli() { 16220eebae7334d6129f7ca1344e4b20199794994358vandwalle if (getCurrentState() == mDisconnectedState 16230eebae7334d6129f7ca1344e4b20199794994358vandwalle && mDisconnectedTimeStamp != 0) { 16240eebae7334d6129f7ca1344e4b20199794994358vandwalle long now_ms = System.currentTimeMillis(); 16250eebae7334d6129f7ca1344e4b20199794994358vandwalle return now_ms - mDisconnectedTimeStamp; 16260eebae7334d6129f7ca1344e4b20199794994358vandwalle } 16270eebae7334d6129f7ca1344e4b20199794994358vandwalle return 0; 16280eebae7334d6129f7ca1344e4b20199794994358vandwalle } 16290eebae7334d6129f7ca1344e4b20199794994358vandwalle 1630ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle // Keeping track of scan requests 1631b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle private long lastStartScanTimeStamp = 0; 1632b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle private long lastScanDuration = 0; 1633ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle // Last connect attempt is used to prevent scan requests: 1634ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle // - for a period of 10 seconds after attempting to connect 1635b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle private long lastConnectAttempt = 0; 1636b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle private String lastScanFreqs = null; 1637b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle 1638ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle // For debugging, keep track of last message status handling 1639ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle // TODO, find an equivalent mechanism as part of parent class 16402f2cf21662275a0e93d7d7a6ad3d98b4c596dcf0vandwalle private static int MESSAGE_HANDLING_STATUS_PROCESSED = 2; 1641ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle private static int MESSAGE_HANDLING_STATUS_OK = 1; 1642ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle private static int MESSAGE_HANDLING_STATUS_UNKNOWN = 0; 1643ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle private static int MESSAGE_HANDLING_STATUS_REFUSED = -1; 1644ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle private static int MESSAGE_HANDLING_STATUS_FAIL = -2; 16458242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle private static int MESSAGE_HANDLING_STATUS_OBSOLETE = -3; 1646ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle private static int MESSAGE_HANDLING_STATUS_DEFERRED = -4; 1647ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle private static int MESSAGE_HANDLING_STATUS_DISCARD = -5; 1648ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle private static int MESSAGE_HANDLING_STATUS_LOOPED = -6; 1649ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle private static int MESSAGE_HANDLING_STATUS_HANDLING_ERROR = -7; 1650ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle 1651ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle private int messageHandlingStatus = 0; 1652ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle 1653b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle //TODO: this is used only to track connection attempts, however the link state and packet per 1654b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle //TODO: second logic should be folded into that 16558242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle private boolean checkOrDeferScanAllowed(Message msg) { 1656b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle long now = System.currentTimeMillis(); 1657b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle if (lastConnectAttempt != 0 && (now - lastConnectAttempt) < 10000) { 16588242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle Message dmsg = Message.obtain(msg); 16598242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle sendMessageDelayed(dmsg, 11000 - (now - lastConnectAttempt)); 1660b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle return false; 1661b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle } 1662b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle return true; 1663b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle } 1664b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle 16650eebae7334d6129f7ca1344e4b20199794994358vandwalle private int mOnTime = 0; 16660eebae7334d6129f7ca1344e4b20199794994358vandwalle private int mTxTime = 0; 16670eebae7334d6129f7ca1344e4b20199794994358vandwalle private int mRxTime = 0; 16687b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle private int mOnTimeStartScan = 0; 16697b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle private int mTxTimeStartScan = 0; 16707b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle private int mRxTimeStartScan = 0; 16710eebae7334d6129f7ca1344e4b20199794994358vandwalle private int mOnTimeScan = 0; 16720eebae7334d6129f7ca1344e4b20199794994358vandwalle private int mTxTimeScan = 0; 16730eebae7334d6129f7ca1344e4b20199794994358vandwalle private int mRxTimeScan = 0; 16740eebae7334d6129f7ca1344e4b20199794994358vandwalle private int mOnTimeThisScan = 0; 16750eebae7334d6129f7ca1344e4b20199794994358vandwalle private int mTxTimeThisScan = 0; 16760eebae7334d6129f7ca1344e4b20199794994358vandwalle private int mRxTimeThisScan = 0; 16770eebae7334d6129f7ca1344e4b20199794994358vandwalle 16787b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle private int mOnTimeScreenStateChange = 0; 16797b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle private int mOnTimeAtLastReport = 0; 16807b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle private long lastOntimeReportTimeStamp = 0; 16817b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle private long lastScreenStateChangeTimeStamp = 0; 16827b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle private int mOnTimeLastReport = 0; 16837b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle private int mTxTimeLastReport = 0; 16847b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle private int mRxTimeLastReport = 0; 16857b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle 16867b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle private long lastLinkLayerStatsUpdate = 0; 16877b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle 16887b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle String reportOnTime() { 16897b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle long now = System.currentTimeMillis(); 16907b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle StringBuilder sb = new StringBuilder(); 16917b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle // Report stats since last report 16927b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle int on = mOnTime - mOnTimeLastReport; 16937b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle mOnTimeLastReport = mOnTime; 16947b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle int tx = mTxTime - mTxTimeLastReport; 16957b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle mTxTimeLastReport = mTxTime; 16967b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle int rx = mRxTime - mRxTimeLastReport; 16977b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle mRxTimeLastReport = mRxTime; 16987b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle int period = (int)(now - lastOntimeReportTimeStamp); 16997b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle lastOntimeReportTimeStamp = now; 17007b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle sb.append(String.format("[on:%d tx:%d rx:%d period:%d]", on, tx, rx, period)); 17017b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle // Report stats since Screen State Changed 17027b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle on = mOnTime - mOnTimeScreenStateChange; 17037b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle period = (int)(now - lastScreenStateChangeTimeStamp); 17047b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle sb.append(String.format(" from screen [on:%d period:%d]", on, period)); 17057b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle return sb.toString(); 17060eebae7334d6129f7ca1344e4b20199794994358vandwalle } 17070eebae7334d6129f7ca1344e4b20199794994358vandwalle 17087b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle WifiLinkLayerStats getWifiLinkLayerStats(boolean dbg) { 17097b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle WifiLinkLayerStats stats = null; 17100eebae7334d6129f7ca1344e4b20199794994358vandwalle if (mWifiLinkLayerStatsSupported > 0) { 17110eebae7334d6129f7ca1344e4b20199794994358vandwalle String name = "wlan0"; 17127b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle stats = mWifiNative.getWifiLinkLayerStats(name); 17130eebae7334d6129f7ca1344e4b20199794994358vandwalle if (name != null && stats == null && mWifiLinkLayerStatsSupported > 0) { 17140eebae7334d6129f7ca1344e4b20199794994358vandwalle mWifiLinkLayerStatsSupported -= 1; 17150eebae7334d6129f7ca1344e4b20199794994358vandwalle } else if (stats != null) { 17167b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle lastLinkLayerStatsUpdate = System.currentTimeMillis(); 17170eebae7334d6129f7ca1344e4b20199794994358vandwalle mOnTime = stats.on_time; 17180eebae7334d6129f7ca1344e4b20199794994358vandwalle mTxTime = stats.tx_time; 17190eebae7334d6129f7ca1344e4b20199794994358vandwalle mRxTime = stats.rx_time; 1720dd0c558776fcfba3f754bb0cd6533f2c9c23ec1evandwalle mRunningBeaconCount = stats.beacon_rx; 17217b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle if (dbg) { 17227b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle loge(stats.toString()); 17237b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle } 17240eebae7334d6129f7ca1344e4b20199794994358vandwalle } 17250eebae7334d6129f7ca1344e4b20199794994358vandwalle } 1726efad8ec6cb12e5658ee0288cc7e5aa755267aeb6vandwalle if (stats == null || mWifiLinkLayerStatsSupported <= 0) { 1727efad8ec6cb12e5658ee0288cc7e5aa755267aeb6vandwalle long mTxPkts = TrafficStats.getTxPackets(mInterfaceName); 1728efad8ec6cb12e5658ee0288cc7e5aa755267aeb6vandwalle long mRxPkts = TrafficStats.getRxPackets(mInterfaceName); 1729efad8ec6cb12e5658ee0288cc7e5aa755267aeb6vandwalle mWifiInfo.updatePacketRates(mTxPkts, mRxPkts); 1730efad8ec6cb12e5658ee0288cc7e5aa755267aeb6vandwalle } else { 1731efad8ec6cb12e5658ee0288cc7e5aa755267aeb6vandwalle mWifiInfo.updatePacketRates(stats); 1732efad8ec6cb12e5658ee0288cc7e5aa755267aeb6vandwalle } 17337b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle return stats; 17347b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle } 17357b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle 17367b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle void startRadioScanStats() { 17377b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle WifiLinkLayerStats stats = getWifiLinkLayerStats(false); 17387b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle if (stats != null) { 17397b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle mOnTimeStartScan = stats.on_time; 17407b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle mTxTimeStartScan = stats.tx_time; 17417b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle mRxTimeStartScan = stats.rx_time; 17427b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle mOnTime = stats.on_time; 17437b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle mTxTime = stats.tx_time; 17447b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle mRxTime = stats.rx_time; 17457b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle } 17467b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle } 17477b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle 17487b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle void closeRadioScanStats() { 17497b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle WifiLinkLayerStats stats = getWifiLinkLayerStats(false); 17507b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle if (stats != null) { 17517b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle mOnTimeThisScan = stats.on_time - mOnTimeStartScan; 17527b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle mTxTimeThisScan = stats.tx_time - mTxTimeStartScan; 17537b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle mRxTimeThisScan = stats.rx_time - mRxTimeStartScan; 17547b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle mOnTimeScan += mOnTimeThisScan; 17557b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle mTxTimeScan += mTxTimeThisScan; 17567b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle mRxTimeScan += mRxTimeThisScan; 17577b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle } 17580eebae7334d6129f7ca1344e4b20199794994358vandwalle } 17590eebae7334d6129f7ca1344e4b20199794994358vandwalle 1760155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // If workSource is not null, blame is given to it, otherwise blame is given to callingUid. 1761155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private void noteScanStart(int callingUid, WorkSource workSource) { 1762b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle long now = System.currentTimeMillis(); 1763b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle lastStartScanTimeStamp = now; 1764b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle lastScanDuration = 0; 1765f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle if (DBG) { 1766b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle String ts = String.format("[%,d ms]", now); 1767f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle if (workSource != null) { 1768f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle loge(ts + " noteScanStart" + workSource.toString() 1769f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle + " uid " + Integer.toString(callingUid)); 1770f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle } else { 17718242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle loge(ts + " noteScanstart no scan source" 17728242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle + " uid " + Integer.toString(callingUid)); 1773f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle } 1774f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle } 17757b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle startRadioScanStats(); 1776b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle if (mScanWorkSource == null && ((callingUid != UNKNOWN_SCAN_SOURCE 1777b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle && callingUid != SCAN_ALARM_SOURCE) 17784dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle || workSource != null)) { 1779155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mScanWorkSource = workSource != null ? workSource : new WorkSource(callingUid); 1780155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande try { 1781155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mBatteryStats.noteWifiScanStartedFromSource(mScanWorkSource); 1782155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } catch (RemoteException e) { 1783155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande log(e.toString()); 1784155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1785155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1786155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1787155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1788155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private void noteScanEnd() { 1789b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle long now = System.currentTimeMillis(); 1790b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle if (lastStartScanTimeStamp != 0) { 1791b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle lastScanDuration = now - lastStartScanTimeStamp; 1792b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle } 1793b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle lastStartScanTimeStamp = 0; 1794f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle if (DBG) { 1795b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle String ts = String.format("[%,d ms]", now); 1796f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle if (mScanWorkSource != null) 17978242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle loge(ts + " noteScanEnd " + mScanWorkSource.toString() 17988242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle + " onTime=" + mOnTimeThisScan); 1799f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle else 18008242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle loge(ts + " noteScanEnd no scan source" 18018242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle + " onTime=" + mOnTimeThisScan); 1802f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle } 1803155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mScanWorkSource != null) { 1804155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande try { 1805155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mBatteryStats.noteWifiScanStoppedFromSource(mScanWorkSource); 1806155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } catch (RemoteException e) { 1807155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande log(e.toString()); 1808155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } finally { 1809155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mScanWorkSource = null; 1810155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1811155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1812155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1813155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1814155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private void noteBatchedScanStart() { 1815f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle if (PDBG) loge("noteBatchedScanstart()"); 1816155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // note the end of a previous scan set 1817155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mNotedBatchedScanWorkSource != null && 1818155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande (mNotedBatchedScanWorkSource.equals(mBatchedScanWorkSource) == false || 1819155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mNotedBatchedScanCsph != mBatchedScanCsph)) { 1820155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande try { 1821155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mBatteryStats.noteWifiBatchedScanStoppedFromSource(mNotedBatchedScanWorkSource); 1822155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } catch (RemoteException e) { 1823155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande log(e.toString()); 1824155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } finally { 1825155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mNotedBatchedScanWorkSource = null; 1826155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mNotedBatchedScanCsph = 0; 1827155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1828155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1829155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // note the start of the new 1830155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande try { 1831155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mBatteryStats.noteWifiBatchedScanStartedFromSource(mBatchedScanWorkSource, 1832155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mBatchedScanCsph); 1833155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mNotedBatchedScanWorkSource = mBatchedScanWorkSource; 1834155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mNotedBatchedScanCsph = mBatchedScanCsph; 1835155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } catch (RemoteException e) { 1836155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande log(e.toString()); 1837155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1838155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1839155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1840155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private void noteBatchedScanStop() { 1841f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle if (PDBG) loge("noteBatchedScanstop()"); 1842f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 1843155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mNotedBatchedScanWorkSource != null) { 1844155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande try { 1845155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mBatteryStats.noteWifiBatchedScanStoppedFromSource(mNotedBatchedScanWorkSource); 1846155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } catch (RemoteException e) { 1847155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande log(e.toString()); 1848155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } finally { 1849155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mNotedBatchedScanWorkSource = null; 1850155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mNotedBatchedScanCsph = 0; 1851155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1852155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1853155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1854155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1855a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng private void handleScanRequest(int type, Message message) { 185612ecdb7b85152b47a5469f0942f3e9d811d6d90bvandwalle ScanSettings settings = null; 185712ecdb7b85152b47a5469f0942f3e9d811d6d90bvandwalle WorkSource workSource = null; 185812ecdb7b85152b47a5469f0942f3e9d811d6d90bvandwalle 1859a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng // unbundle parameters 1860a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng Bundle bundle = (Bundle) message.obj; 186112ecdb7b85152b47a5469f0942f3e9d811d6d90bvandwalle 186212ecdb7b85152b47a5469f0942f3e9d811d6d90bvandwalle if (bundle != null) { 186312ecdb7b85152b47a5469f0942f3e9d811d6d90bvandwalle settings = bundle.getParcelable(CUSTOMIZED_SCAN_SETTING); 186412ecdb7b85152b47a5469f0942f3e9d811d6d90bvandwalle workSource = bundle.getParcelable(CUSTOMIZED_SCAN_WORKSOURCE); 186512ecdb7b85152b47a5469f0942f3e9d811d6d90bvandwalle } 1866a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng 1867a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng // parse scan settings 1868a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng String freqs = null; 1869a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng if (settings != null && settings.channelSet != null) { 1870a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng StringBuilder sb = new StringBuilder(); 1871a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng boolean first = true; 1872a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng for (WifiChannel channel : settings.channelSet) { 1873a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng if (!first) sb.append(','); else first = false; 1874a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng sb.append(channel.freqMHz); 1875a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng } 1876a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng freqs = sb.toString(); 1877a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng } 1878a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng 1879a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng // call wifi native to start the scan 1880a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng if (startScanNative(type, freqs)) { 1881a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng // only count battery consumption if scan request is accepted 1882a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng noteScanStart(message.arg1, workSource); 1883a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng // a full scan covers everything, clearing scan request buffer 1884a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng if (freqs == null) 1885a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng mBufferedScanMsg.clear(); 1886ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle messageHandlingStatus = MESSAGE_HANDLING_STATUS_OK; 18879086afccf6938a49eb9a2cd248917c1cb0943942vandwalle if (workSource != null) { 18889086afccf6938a49eb9a2cd248917c1cb0943942vandwalle // External worksource was passed along the scan request, 18899086afccf6938a49eb9a2cd248917c1cb0943942vandwalle // hence always send a broadcast 18909086afccf6938a49eb9a2cd248917c1cb0943942vandwalle mSendScanResultsBroadcast = true; 18919086afccf6938a49eb9a2cd248917c1cb0943942vandwalle } 1892a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng return; 1893a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng } 1894a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng 1895a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng // if reach here, scan request is rejected 1896a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng 1897a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng if (!mIsScanOngoing) { 1898a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng // if rejection is NOT due to ongoing scan (e.g. bad scan parameters), 1899ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle 1900a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng // discard this request and pop up the next one 1901ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle if (mBufferedScanMsg.size() > 0) { 1902a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng sendMessage(mBufferedScanMsg.remove()); 1903ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle } 1904ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle messageHandlingStatus = MESSAGE_HANDLING_STATUS_DISCARD; 1905a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng } else if (!mIsFullScanOngoing) { 1906a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng // if rejection is due to an ongoing scan, and the ongoing one is NOT a full scan, 1907a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng // buffer the scan request to make sure specified channels will be scanned eventually 1908a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng if (freqs == null) 1909a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng mBufferedScanMsg.clear(); 1910a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng if (mBufferedScanMsg.size() < SCAN_REQUEST_BUFFER_MAX_SIZE) { 1911ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle Message msg = obtainMessage(CMD_START_SCAN, 1912ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle message.arg1, message.arg2, bundle); 1913a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng mBufferedScanMsg.add(msg); 1914a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng } else { 1915a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng // if too many requests in buffer, combine them into a single full scan 1916a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng bundle = new Bundle(); 1917a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng bundle.putParcelable(CUSTOMIZED_SCAN_SETTING, null); 1918a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng bundle.putParcelable(CUSTOMIZED_SCAN_WORKSOURCE, workSource); 1919ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle Message msg = obtainMessage(CMD_START_SCAN, message.arg1, message.arg2, bundle); 1920a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng mBufferedScanMsg.clear(); 1921a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng mBufferedScanMsg.add(msg); 1922a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng } 1923ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle messageHandlingStatus = MESSAGE_HANDLING_STATUS_LOOPED; 1924ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle } else { 1925ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle // mIsScanOngoing and mIsFullScanOngoing 1926ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle messageHandlingStatus = MESSAGE_HANDLING_STATUS_FAIL; 1927a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng } 1928a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng } 1929a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng 1930a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng 1931a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng /** return true iff scan request is accepted */ 1932a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng private boolean startScanNative(int type, String freqs) { 1933a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng if (mWifiNative.scan(type, freqs)) { 1934a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng mIsScanOngoing = true; 1935a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng mIsFullScanOngoing = (freqs == null); 1936b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle lastScanFreqs = freqs; 1937a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng return true; 1938a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng } 1939a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng return false; 1940155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1941155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1942155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 1943155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * TODO: doc 1944155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 1945155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public void setSupplicantRunning(boolean enable) { 1946155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (enable) { 1947155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendMessage(CMD_START_SUPPLICANT); 1948155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 1949155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendMessage(CMD_STOP_SUPPLICANT); 1950155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1951155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1952155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1953155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 1954155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * TODO: doc 1955155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 1956155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public void setHostApRunning(WifiConfiguration wifiConfig, boolean enable) { 1957155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (enable) { 1958155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendMessage(CMD_START_AP, wifiConfig); 1959155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 1960155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendMessage(CMD_STOP_AP); 1961155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1962155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1963155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1964155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public void setWifiApConfiguration(WifiConfiguration config) { 1965155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiApConfigChannel.sendMessage(CMD_SET_AP_CONFIG, config); 1966155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1967155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1968155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public WifiConfiguration syncGetWifiApConfiguration() { 1969155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Message resultMsg = mWifiApConfigChannel.sendMessageSynchronously(CMD_REQUEST_AP_CONFIG); 1970155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande WifiConfiguration ret = (WifiConfiguration) resultMsg.obj; 1971155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande resultMsg.recycle(); 1972155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return ret; 1973155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1974155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1975155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 1976155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * TODO: doc 1977155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 1978155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public int syncGetWifiState() { 1979155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return mWifiState.get(); 1980155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 1981155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1982155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 1983155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * TODO: doc 1984155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 1985155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public String syncGetWifiStateByName() { 1986155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande switch (mWifiState.get()) { 1987155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WIFI_STATE_DISABLING: 1988155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return "disabling"; 1989155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WIFI_STATE_DISABLED: 1990155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return "disabled"; 1991155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WIFI_STATE_ENABLING: 1992155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return "enabling"; 1993155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WIFI_STATE_ENABLED: 1994155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return "enabled"; 1995155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WIFI_STATE_UNKNOWN: 1996155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return "unknown state"; 1997155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande default: 1998155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return "[invalid state]"; 1999155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2000155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2001155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 2002155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 2003155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * TODO: doc 2004155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 2005155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public int syncGetWifiApState() { 2006155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return mWifiApState.get(); 2007155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2008155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 2009155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 2010155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * TODO: doc 2011155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 2012155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public String syncGetWifiApStateByName() { 2013155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande switch (mWifiApState.get()) { 2014155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WIFI_AP_STATE_DISABLING: 2015155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return "disabling"; 2016155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WIFI_AP_STATE_DISABLED: 2017155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return "disabled"; 2018155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WIFI_AP_STATE_ENABLING: 2019155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return "enabling"; 2020155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WIFI_AP_STATE_ENABLED: 2021155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return "enabled"; 2022155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WIFI_AP_STATE_FAILED: 2023155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return "failed"; 2024155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande default: 2025155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return "[invalid state]"; 2026155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2027155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2028155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 2029155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 2030155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Get status information for the current connection, if any. 2031155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * @return a {@link WifiInfo} object containing information about the current connection 2032155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * 2033155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 2034155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public WifiInfo syncRequestConnectionInfo() { 2035155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return mWifiInfo; 2036155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2037155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 2038155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public DhcpResults syncGetDhcpResults() { 2039155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande synchronized (mDhcpResultsLock) { 2040155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return new DhcpResults(mDhcpResults); 2041155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2042155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2043155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 2044155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 2045155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * TODO: doc 2046155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 2047155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public void setDriverStart(boolean enable) { 2048155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (enable) { 2049155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendMessage(CMD_START_DRIVER); 2050155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 2051155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendMessage(CMD_STOP_DRIVER); 2052155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2053155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2054155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 2055155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 2056155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * TODO: doc 2057155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 2058155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public void setOperationalMode(int mode) { 2059155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (DBG) log("setting operational mode to " + String.valueOf(mode)); 2060155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendMessage(CMD_SET_OPERATIONAL_MODE, mode, 0); 2061155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2062155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 2063155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 2064155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * TODO: doc 2065155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 2066155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public List<ScanResult> syncGetScanResultsList() { 2067155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande synchronized (mScanResultCache) { 2068155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande List<ScanResult> scanList = new ArrayList<ScanResult>(); 2069155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande for(ScanResult result: mScanResults) { 2070155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande scanList.add(new ScanResult(result)); 2071155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2072155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return scanList; 2073155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2074155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2075155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 20762ce99b40c36ed0352b31aa85d5f9383d5f0506f5vandwalle public void disableEphemeralNetwork(String SSID) { 20772ce99b40c36ed0352b31aa85d5f9383d5f0506f5vandwalle if (SSID != null) { 20782ce99b40c36ed0352b31aa85d5f9383d5f0506f5vandwalle sendMessage(CMD_DISABLE_EPHEMERAL_NETWORK, SSID); 20792ce99b40c36ed0352b31aa85d5f9383d5f0506f5vandwalle } 20802ce99b40c36ed0352b31aa85d5f9383d5f0506f5vandwalle } 20812ce99b40c36ed0352b31aa85d5f9383d5f0506f5vandwalle 2082155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 2083e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle * Get unsynchronized pointer to scan result list 2084e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle * Can be called only from AutoJoinController which runs in the WifiStateMachine context 2085e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle */ 2086e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle public List<ScanResult> getScanResultsListNoCopyUnsync() { 2087e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle return mScanResults; 2088e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle } 2089e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle 2090e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle /** 2091155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Disconnect from Access Point 2092155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 2093155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public void disconnectCommand() { 2094155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendMessage(CMD_DISCONNECT); 2095155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2096155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 2097155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 2098155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Initiate a reconnection to AP 2099155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 2100155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public void reconnectCommand() { 2101155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendMessage(CMD_RECONNECT); 2102155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2103155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 2104155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 2105155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Initiate a re-association to AP 2106155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 2107155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public void reassociateCommand() { 2108155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendMessage(CMD_REASSOCIATE); 2109155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2110155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 2111155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 2112155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Reload networks and then reconnect; helps load correct data for TLS networks 2113155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 2114155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 2115155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public void reloadTlsNetworksAndReconnect() { 2116155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendMessage(CMD_RELOAD_TLS_AND_RECONNECT); 2117155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2118155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 2119155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 2120155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Add a network synchronously 2121155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * 2122155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * @return network id of the new network 2123155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 2124155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public int syncAddOrUpdateNetwork(AsyncChannel channel, WifiConfiguration config) { 2125155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Message resultMsg = channel.sendMessageSynchronously(CMD_ADD_OR_UPDATE_NETWORK, config); 2126155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande int result = resultMsg.arg1; 2127155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande resultMsg.recycle(); 2128155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return result; 2129155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2130155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 2131a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande /** 2132a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande * Get configured networks synchronously 2133a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande * @param channel 2134a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande * @return 2135a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande */ 2136a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande 213782199a285f4a45a46b44eb8253999aa918534753vandwalle public List<WifiConfiguration> syncGetConfiguredNetworks(int uuid, AsyncChannel channel) { 213882199a285f4a45a46b44eb8253999aa918534753vandwalle Message resultMsg = channel.sendMessageSynchronously(CMD_GET_CONFIGURED_NETWORKS, uuid); 2139155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande List<WifiConfiguration> result = (List<WifiConfiguration>) resultMsg.obj; 2140155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande resultMsg.recycle(); 2141155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return result; 2142155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2143155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 21449878c61bbd81176561991be025af44efc67332feWenchao Tong public List<WifiConfiguration> syncGetPrivilegedConfiguredNetwork(AsyncChannel channel) { 21459878c61bbd81176561991be025af44efc67332feWenchao Tong Message resultMsg = channel.sendMessageSynchronously( 21469878c61bbd81176561991be025af44efc67332feWenchao Tong CMD_GET_PRIVILEGED_CONFIGURED_NETWORKS); 21479878c61bbd81176561991be025af44efc67332feWenchao Tong List<WifiConfiguration> result = (List<WifiConfiguration>) resultMsg.obj; 21489878c61bbd81176561991be025af44efc67332feWenchao Tong resultMsg.recycle(); 21499878c61bbd81176561991be025af44efc67332feWenchao Tong return result; 21509878c61bbd81176561991be025af44efc67332feWenchao Tong } 21519878c61bbd81176561991be025af44efc67332feWenchao Tong 2152c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalle 2153c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalle /** 2154c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalle * Get connection statistics synchronously 2155c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalle * @param channel 2156c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalle * @return 2157c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalle */ 2158c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalle 2159c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalle public WifiConnectionStatistics syncGetConnectionStatistics(AsyncChannel channel) { 2160c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalle Message resultMsg = channel.sendMessageSynchronously(CMD_GET_CONNECTION_STATISTICS); 2161c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalle WifiConnectionStatistics result = (WifiConnectionStatistics) resultMsg.obj; 2162c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalle resultMsg.recycle(); 2163c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalle return result; 2164c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalle } 2165c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalle 2166155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 2167a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande * Get adaptors synchronously 2168a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande */ 2169a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande 2170048dc8df2bd9394979dbb090b0cfe8d6627d23e3Vinit Deshpande public int syncGetSupportedFeatures(AsyncChannel channel) { 2171048dc8df2bd9394979dbb090b0cfe8d6627d23e3Vinit Deshpande Message resultMsg = channel.sendMessageSynchronously(CMD_GET_SUPPORTED_FEATURES); 2172048dc8df2bd9394979dbb090b0cfe8d6627d23e3Vinit Deshpande int supportedFeatureSet = resultMsg.arg1; 2173a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande resultMsg.recycle(); 2174048dc8df2bd9394979dbb090b0cfe8d6627d23e3Vinit Deshpande return supportedFeatureSet; 2175a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande } 2176a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande 2177a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande /** 2178200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle * Get link layers stats for adapter synchronously 2179200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle */ 2180048dc8df2bd9394979dbb090b0cfe8d6627d23e3Vinit Deshpande public WifiLinkLayerStats syncGetLinkLayerStats(AsyncChannel channel) { 2181048dc8df2bd9394979dbb090b0cfe8d6627d23e3Vinit Deshpande Message resultMsg = channel.sendMessageSynchronously(CMD_GET_LINK_LAYER_STATS); 2182200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle WifiLinkLayerStats result = (WifiLinkLayerStats) resultMsg.obj; 2183200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle resultMsg.recycle(); 2184200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle return result; 2185200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle } 2186200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle 2187200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle /** 2188155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Delete a network 2189155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * 2190155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * @param networkId id of the network to be removed 2191155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 2192155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public boolean syncRemoveNetwork(AsyncChannel channel, int networkId) { 2193155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Message resultMsg = channel.sendMessageSynchronously(CMD_REMOVE_NETWORK, networkId); 2194155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande boolean result = (resultMsg.arg1 != FAILURE); 2195155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande resultMsg.recycle(); 2196155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return result; 2197155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2198155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 2199155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 2200155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Enable a network 2201155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * 2202155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * @param netId network id of the network 2203155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * @param disableOthers true, if all other networks have to be disabled 2204155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * @return {@code true} if the operation succeeds, {@code false} otherwise 2205155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 2206155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public boolean syncEnableNetwork(AsyncChannel channel, int netId, boolean disableOthers) { 2207155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Message resultMsg = channel.sendMessageSynchronously(CMD_ENABLE_NETWORK, netId, 2208155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande disableOthers ? 1 : 0); 2209155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande boolean result = (resultMsg.arg1 != FAILURE); 2210155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande resultMsg.recycle(); 2211155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return result; 2212155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2213155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 2214155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 2215155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Disable a network 2216155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * 2217155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * @param netId network id of the network 2218155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * @return {@code true} if the operation succeeds, {@code false} otherwise 2219155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 2220155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public boolean syncDisableNetwork(AsyncChannel channel, int netId) { 2221155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Message resultMsg = channel.sendMessageSynchronously(WifiManager.DISABLE_NETWORK, netId); 2222155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande boolean result = (resultMsg.arg1 != WifiManager.DISABLE_NETWORK_FAILED); 2223155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande resultMsg.recycle(); 2224155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return result; 2225155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2226155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 2227155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 22283f7ef65ab71619040032aee96b5599849881d6fdAndres Morales * Retrieves a WPS-NFC configuration token for the specified network 22293f7ef65ab71619040032aee96b5599849881d6fdAndres Morales * @return a hex string representation of the WPS-NFC configuration token 22303f7ef65ab71619040032aee96b5599849881d6fdAndres Morales */ 22313f7ef65ab71619040032aee96b5599849881d6fdAndres Morales public String syncGetWpsNfcConfigurationToken(int netId) { 22323f7ef65ab71619040032aee96b5599849881d6fdAndres Morales return mWifiNative.getNfcWpsConfigurationToken(netId); 22333f7ef65ab71619040032aee96b5599849881d6fdAndres Morales } 22343f7ef65ab71619040032aee96b5599849881d6fdAndres Morales 2235cce5b9e0eded28096991578e020883484ece8c54Vinit Deshpande void enableBackgroundScan(boolean enable) { 2236cce5b9e0eded28096991578e020883484ece8c54Vinit Deshpande if (enable) { 2237cce5b9e0eded28096991578e020883484ece8c54Vinit Deshpande mWifiConfigStore.enableAllNetworks(); 2238cce5b9e0eded28096991578e020883484ece8c54Vinit Deshpande } 2239cce5b9e0eded28096991578e020883484ece8c54Vinit Deshpande mWifiNative.enableBackgroundScan(enable); 2240cce5b9e0eded28096991578e020883484ece8c54Vinit Deshpande } 2241cce5b9e0eded28096991578e020883484ece8c54Vinit Deshpande 22423f7ef65ab71619040032aee96b5599849881d6fdAndres Morales /** 2243155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Blacklist a BSSID. This will avoid the AP if there are 2244155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * alternate APs to connect 2245155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * 2246155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * @param bssid BSSID of the network 2247155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 2248155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public void addToBlacklist(String bssid) { 2249155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendMessage(CMD_BLACKLIST_NETWORK, bssid); 2250155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2251155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 2252155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 2253155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Clear the blacklist list 2254155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * 2255155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 2256155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public void clearBlacklist() { 2257155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendMessage(CMD_CLEAR_BLACKLIST); 2258155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2259155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 2260155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public void enableRssiPolling(boolean enabled) { 2261155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendMessage(CMD_ENABLE_RSSI_POLL, enabled ? 1 : 0, 0); 2262155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2263155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 2264155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public void enableAllNetworks() { 2265155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendMessage(CMD_ENABLE_ALL_NETWORKS); 2266155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2267155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 2268155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 2269155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Start filtering Multicast v4 packets 2270155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 2271155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public void startFilteringMulticastV4Packets() { 2272155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mFilteringMulticastV4Packets.set(true); 2273155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendMessage(CMD_START_PACKET_FILTERING, MULTICAST_V4, 0); 2274155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2275155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 2276155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 2277155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Stop filtering Multicast v4 packets 2278155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 2279155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public void stopFilteringMulticastV4Packets() { 2280155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mFilteringMulticastV4Packets.set(false); 2281155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendMessage(CMD_STOP_PACKET_FILTERING, MULTICAST_V4, 0); 2282155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2283155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 2284155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 2285155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Start filtering Multicast v4 packets 2286155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 2287155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public void startFilteringMulticastV6Packets() { 2288155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendMessage(CMD_START_PACKET_FILTERING, MULTICAST_V6, 0); 2289155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2290155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 2291155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 2292155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Stop filtering Multicast v4 packets 2293155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 2294155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public void stopFilteringMulticastV6Packets() { 2295155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendMessage(CMD_STOP_PACKET_FILTERING, MULTICAST_V6, 0); 2296155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2297155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 2298155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 2299155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Set high performance mode of operation. 2300155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Enabling would set active power mode and disable suspend optimizations; 2301155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * disabling would set auto power mode and enable suspend optimizations 2302155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * @param enable true if enable, false otherwise 2303155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 2304155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public void setHighPerfModeEnabled(boolean enable) { 2305155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendMessage(CMD_SET_HIGH_PERF_MODE, enable ? 1 : 0, 0); 2306155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2307155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 2308155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 2309155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Set the country code 2310155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * @param countryCode following ISO 3166 format 2311155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * @param persist {@code true} if the setting should be remembered. 2312155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 2313155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public void setCountryCode(String countryCode, boolean persist) { 2314f449336da3fc8f8f9b65de3ba359129779511199Vinit Deshapnde // If it's a good country code, apply after the current 2315f449336da3fc8f8f9b65de3ba359129779511199Vinit Deshapnde // wifi connection is terminated; ignore resetting of code 2316f449336da3fc8f8f9b65de3ba359129779511199Vinit Deshapnde // for now (it is unclear what the chipset should do when 2317f449336da3fc8f8f9b65de3ba359129779511199Vinit Deshapnde // country code is reset) 23189c22c8ea193360f50ad490368ca6a11af0684362Robert Greenwalt int countryCodeSequence = mCountryCodeSequence.incrementAndGet(); 23199c22c8ea193360f50ad490368ca6a11af0684362Robert Greenwalt if (TextUtils.isEmpty(countryCode)) { 2320f449336da3fc8f8f9b65de3ba359129779511199Vinit Deshapnde log("Ignoring resetting of country code"); 23219c22c8ea193360f50ad490368ca6a11af0684362Robert Greenwalt } else { 23229c22c8ea193360f50ad490368ca6a11af0684362Robert Greenwalt sendMessage(CMD_SET_COUNTRY_CODE, countryCodeSequence, persist ? 1 : 0, countryCode); 2323155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2324155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2325155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 2326155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 2327155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Set the operational frequency band 2328155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * @param band 2329155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * @param persist {@code true} if the setting should be remembered. 2330155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 2331155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public void setFrequencyBand(int band, boolean persist) { 2332155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (persist) { 2333155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Settings.Global.putInt(mContext.getContentResolver(), 2334155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Settings.Global.WIFI_FREQUENCY_BAND, 2335155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande band); 2336155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2337155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendMessage(CMD_SET_FREQUENCY_BAND, band, 0); 2338155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2339155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 2340155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 2341155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Enable TDLS for a specific MAC address 2342155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 2343155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public void enableTdls(String remoteMacAddress, boolean enable) { 2344155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande int enabler = enable ? 1 : 0; 2345155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendMessage(CMD_ENABLE_TDLS, enabler, 0, remoteMacAddress); 2346155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2347155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 2348155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 2349155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Returns the operational frequency band 2350155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 2351155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public int getFrequencyBand() { 2352155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return mFrequencyBand.get(); 2353155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2354155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 2355155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 2356155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Returns the wifi configuration file 2357155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 2358155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public String getConfigFile() { 2359155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return mWifiConfigStore.getConfigFile(); 2360155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2361155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 2362155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 2363155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Send a message indicating bluetooth adapter connection state changed 2364155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 2365155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public void sendBluetoothAdapterStateChange(int state) { 2366155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendMessage(CMD_BLUETOOTH_ADAPTER_STATE_CHANGE, state, 0); 2367155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2368155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 2369155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 2370155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Save configuration on supplicant 2371155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * 2372155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * @return {@code true} if the operation succeeds, {@code false} otherwise 2373155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * 2374155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * TODO: deprecate this 2375155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 2376155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public boolean syncSaveConfig(AsyncChannel channel) { 2377155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Message resultMsg = channel.sendMessageSynchronously(CMD_SAVE_CONFIG); 2378155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande boolean result = (resultMsg.arg1 != FAILURE); 2379155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande resultMsg.recycle(); 2380155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return result; 2381155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2382155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 2383155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public void updateBatteryWorkSource(WorkSource newSource) { 2384155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande synchronized (mRunningWifiUids) { 2385155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande try { 2386155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (newSource != null) { 2387155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mRunningWifiUids.set(newSource); 2388155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2389155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mIsRunning) { 2390155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mReportedRunning) { 2391155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // If the work source has changed since last time, need 2392155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // to remove old work from battery stats. 2393155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mLastRunningWifiUids.diff(mRunningWifiUids)) { 2394155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mBatteryStats.noteWifiRunningChanged(mLastRunningWifiUids, 2395155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mRunningWifiUids); 2396155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mLastRunningWifiUids.set(mRunningWifiUids); 2397155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2398155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 2399155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Now being started, report it. 2400155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mBatteryStats.noteWifiRunning(mRunningWifiUids); 2401155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mLastRunningWifiUids.set(mRunningWifiUids); 2402155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mReportedRunning = true; 2403155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2404155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 2405155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mReportedRunning) { 2406155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Last reported we were running, time to stop. 2407155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mBatteryStats.noteWifiStopped(mLastRunningWifiUids); 2408155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mLastRunningWifiUids.clear(); 2409155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mReportedRunning = false; 2410155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2411155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2412155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWakeLock.setWorkSource(newSource); 2413155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } catch (RemoteException ignore) { 2414155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2415155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2416155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2417155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 2418155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande @Override 2419155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 2420155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande super.dump(fd, pw, args); 2421155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mSupplicantStateTracker.dump(fd, pw, args); 2422155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande pw.println("mLinkProperties " + mLinkProperties); 2423155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande pw.println("mWifiInfo " + mWifiInfo); 2424155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande pw.println("mDhcpResults " + mDhcpResults); 2425155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande pw.println("mNetworkInfo " + mNetworkInfo); 2426155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande pw.println("mLastSignalLevel " + mLastSignalLevel); 2427155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande pw.println("mLastBssid " + mLastBssid); 2428155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande pw.println("mLastNetworkId " + mLastNetworkId); 2429155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande pw.println("mOperationalMode " + mOperationalMode); 2430155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande pw.println("mUserWantsSuspendOpt " + mUserWantsSuspendOpt); 2431155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande pw.println("mSuspendOptNeedsDisabled " + mSuspendOptNeedsDisabled); 243299d385e3b4d34841d6efcfd7cc9bf1d5ae25de14vandwalle pw.println("Supplicant status " + mWifiNative.status(true)); 2433155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande pw.println("mEnableBackgroundScan " + mEnableBackgroundScan); 2434f449336da3fc8f8f9b65de3ba359129779511199Vinit Deshapnde pw.println("mLastSetCountryCode " + mLastSetCountryCode); 2435f449336da3fc8f8f9b65de3ba359129779511199Vinit Deshapnde pw.println("mPersistedCountryCode " + mPersistedCountryCode); 24360af9c80053bd2736d5bea095b363d6a0c8ce71d0Lorenzo Colitti mNetworkFactory.dump(fd, pw, args); 2437ebe870ef4051da2fc307114ed3c14927f548d9d4Jeff Davidson mUntrustedNetworkFactory.dump(fd, pw, args); 2438155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande pw.println(); 2439155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiConfigStore.dump(fd, pw, args); 2440155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 2441155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 2442155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /********************************************************* 2443155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Internal private functions 2444155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande ********************************************************/ 2445155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 2446f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle private void logStateAndMessage(Message message, String state) { 2447ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle messageHandlingStatus = 0; 2448f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle if (mLogMessages) { 2449f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle //long now = SystemClock.elapsedRealtimeNanos(); 2450f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle //String ts = String.format("[%,d us]", now/1000); 2451f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 2452b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle loge( " " + state + " " + getLogRecString(message)); 2453f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle } 2454f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle } 2455f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 2456b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle /** 2457b5120326b58f35217dcedc5f19e8cf3eb42b28d0vandwalle * helper, prints the milli time since boot wi and w/o suspended time 2458b5120326b58f35217dcedc5f19e8cf3eb42b28d0vandwalle */ 2459b5120326b58f35217dcedc5f19e8cf3eb42b28d0vandwalle String printTime() { 2460b5120326b58f35217dcedc5f19e8cf3eb42b28d0vandwalle StringBuilder sb = new StringBuilder(); 2461b5120326b58f35217dcedc5f19e8cf3eb42b28d0vandwalle sb.append(" rt=").append(SystemClock.uptimeMillis()); 2462b5120326b58f35217dcedc5f19e8cf3eb42b28d0vandwalle sb.append("/").append(SystemClock.elapsedRealtime()); 2463b5120326b58f35217dcedc5f19e8cf3eb42b28d0vandwalle return sb.toString(); 2464b5120326b58f35217dcedc5f19e8cf3eb42b28d0vandwalle } 2465b5120326b58f35217dcedc5f19e8cf3eb42b28d0vandwalle 2466b5120326b58f35217dcedc5f19e8cf3eb42b28d0vandwalle /** 2467b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle * Return the additional string to be logged by LogRec, default 2468b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle * 2469b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle * @param msg that was processed 2470b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle * @return information to be logged as a String 2471b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle */ 2472b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle protected String getLogRecString(Message msg) { 2473b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle WifiConfiguration config; 2474ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle Long now; 24757b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle String report; 24768242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle String key; 2477b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle StringBuilder sb = new StringBuilder(); 2478b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle if (mScreenOn) { 2479b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle sb.append("!"); 2480b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle } 2481ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle if (messageHandlingStatus != MESSAGE_HANDLING_STATUS_UNKNOWN) { 2482ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle sb.append("(").append(messageHandlingStatus).append(")"); 2483ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle } 2484b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle sb.append(smToString(msg)); 24857b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle if (msg.sendingUid > 0 && msg.sendingUid != Process.WIFI_UID) { 24862f2cf21662275a0e93d7d7a6ad3d98b4c596dcf0vandwalle sb.append(" uid=" + msg.sendingUid); 24872f2cf21662275a0e93d7d7a6ad3d98b4c596dcf0vandwalle } 2488b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle switch (msg.what) { 2489b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle case CMD_START_SCAN: 2490ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle now = System.currentTimeMillis(); 2491b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle sb.append(" "); 2492b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle sb.append(Integer.toString(msg.arg1)); 2493b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle sb.append(" "); 2494b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle sb.append(Integer.toString(msg.arg2)); 2495ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle sb.append(" ic="); 249682199a285f4a45a46b44eb8253999aa918534753vandwalle sb.append(Integer.toString(sScanAlarmIntentCount)); 2497ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle if (msg.obj != null) { 2498ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle Bundle bundle = (Bundle)msg.obj; 2499ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle Long request = bundle.getLong(SCAN_REQUEST_TIME, 0); 2500ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle if (request != 0) { 2501ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle sb.append(" proc(ms):").append(now - request); 2502ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle } 2503ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle } 2504b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle if (mIsScanOngoing) sb.append(" onGoing"); 2505b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle if (mIsFullScanOngoing) sb.append(" full"); 2506b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle if (lastStartScanTimeStamp != 0) { 2507b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle sb.append(" started:").append(lastStartScanTimeStamp); 2508ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle sb.append(",").append(now - lastStartScanTimeStamp); 2509b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle } 2510b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle if (lastScanDuration != 0) { 2511b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle sb.append(" dur:").append(lastScanDuration); 2512b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle } 25138242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle sb.append(" cnt=").append(mDelayedScanCounter); 2514b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle sb.append(" rssi=").append(mWifiInfo.getRssi()); 2515b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle sb.append(" f=").append(mWifiInfo.getFrequency()); 2516b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle sb.append(" sc=").append(mWifiInfo.score); 2517b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle sb.append(" link=").append(mWifiInfo.getLinkSpeed()); 2518b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle sb.append(String.format(" tx=%.1f,", mWifiInfo.txSuccessRate)); 2519b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle sb.append(String.format(" %.1f,", mWifiInfo.txRetriesRate)); 2520b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle sb.append(String.format(" %.1f ", mWifiInfo.txBadRate)); 2521b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle sb.append(String.format(" rx=%.1f", mWifiInfo.rxSuccessRate)); 2522e0ba94ba9abde13173ae0de8c8939aa4eb9a9085vandwalle if (lastScanFreqs != null) { 2523e0ba94ba9abde13173ae0de8c8939aa4eb9a9085vandwalle sb.append(" list=").append(lastScanFreqs); 2524e0ba94ba9abde13173ae0de8c8939aa4eb9a9085vandwalle } else { 2525e0ba94ba9abde13173ae0de8c8939aa4eb9a9085vandwalle sb.append(" fiv=").append(fullBandConnectedTimeIntervalMilli); 2526e0ba94ba9abde13173ae0de8c8939aa4eb9a9085vandwalle } 25277b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle report = reportOnTime(); 25287b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle if (report != null) { 25297b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle sb.append(" ").append(report); 25307b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle } 2531b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle break; 2532b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle case WifiMonitor.SUPPLICANT_STATE_CHANGE_EVENT: 2533b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle sb.append(" "); 2534b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle sb.append(Integer.toString(msg.arg1)); 2535b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle sb.append(" "); 2536b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle sb.append(Integer.toString(msg.arg2)); 2537b5120326b58f35217dcedc5f19e8cf3eb42b28d0vandwalle sb.append(printTime()); 2538b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle StateChangeResult stateChangeResult = (StateChangeResult) msg.obj; 2539b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle if (stateChangeResult != null) { 2540b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle sb.append(stateChangeResult.toString()); 2541b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle } 2542b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle break; 2543be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle case WifiManager.SAVE_NETWORK: 2544be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle case WifiStateMachine.CMD_AUTO_SAVE_NETWORK: 2545be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle sb.append(" "); 2546be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle sb.append(Integer.toString(msg.arg1)); 2547be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle sb.append(" "); 2548be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle sb.append(Integer.toString(msg.arg2)); 2549be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle if (lastSavedConfigurationAttempt != null) { 2550be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle sb.append(" ").append(lastSavedConfigurationAttempt.configKey()); 2551be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle sb.append(" nid=").append(lastSavedConfigurationAttempt.networkId); 2552be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle if (lastSavedConfigurationAttempt.hiddenSSID) { 2553be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle sb.append(" hidden"); 2554be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle } 2555b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle if (lastSavedConfigurationAttempt.preSharedKey != null 2556b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle && !lastSavedConfigurationAttempt.preSharedKey.equals("*")) { 2557be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle sb.append(" hasPSK"); 2558be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle } 2559be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle if (lastSavedConfigurationAttempt.ephemeral) { 2560be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle sb.append(" ephemeral"); 2561be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle } 2562be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle if (lastSavedConfigurationAttempt.selfAdded) { 2563be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle sb.append(" selfAdded"); 2564be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle } 2565be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle sb.append(" cuid=").append(lastSavedConfigurationAttempt.creatorUid); 2566be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle sb.append(" suid=").append(lastSavedConfigurationAttempt.lastUpdateUid); 2567be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle } 2568be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle break; 2569be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle case WifiManager.FORGET_NETWORK: 2570be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle sb.append(" "); 2571be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle sb.append(Integer.toString(msg.arg1)); 2572be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle sb.append(" "); 2573be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle sb.append(Integer.toString(msg.arg2)); 2574be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle if (lastForgetConfigurationAttempt != null) { 2575be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle sb.append(" ").append(lastForgetConfigurationAttempt.configKey()); 2576be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle sb.append(" nid=").append(lastForgetConfigurationAttempt.networkId); 2577be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle if (lastForgetConfigurationAttempt.hiddenSSID) { 2578be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle sb.append(" hidden"); 2579be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle } 2580be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle if (lastForgetConfigurationAttempt.preSharedKey != null) { 2581be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle sb.append(" hasPSK"); 2582be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle } 2583be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle if (lastForgetConfigurationAttempt.ephemeral) { 2584be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle sb.append(" ephemeral"); 2585be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle } 2586be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle if (lastForgetConfigurationAttempt.selfAdded) { 2587be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle sb.append(" selfAdded"); 2588be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle } 2589be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle sb.append(" cuid=").append(lastForgetConfigurationAttempt.creatorUid); 2590be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle sb.append(" suid=").append(lastForgetConfigurationAttempt.lastUpdateUid); 2591be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle sb.append(" ajst=").append(lastForgetConfigurationAttempt.autoJoinStatus); 2592be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle } 2593be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle break; 259440ff222cec1bd05879edb53abc75c6deead734cavandwalle case WifiMonitor.ASSOCIATION_REJECTION_EVENT: 259540ff222cec1bd05879edb53abc75c6deead734cavandwalle sb.append(" "); 259640ff222cec1bd05879edb53abc75c6deead734cavandwalle sb.append(Integer.toString(msg.arg1)); 259740ff222cec1bd05879edb53abc75c6deead734cavandwalle sb.append(" "); 259840ff222cec1bd05879edb53abc75c6deead734cavandwalle sb.append(Integer.toString(msg.arg2)); 259940ff222cec1bd05879edb53abc75c6deead734cavandwalle String bssid = (String)msg.obj; 260040ff222cec1bd05879edb53abc75c6deead734cavandwalle if (bssid != null && bssid.length()>0) { 260140ff222cec1bd05879edb53abc75c6deead734cavandwalle sb.append(" "); 260240ff222cec1bd05879edb53abc75c6deead734cavandwalle sb.append(bssid); 260340ff222cec1bd05879edb53abc75c6deead734cavandwalle } 26042451dbcc4f9641df188326215b204b798eb70c46vandwalle sb.append(" blacklist=" + Boolean.toString(didBlackListBSSID)); 2605b5120326b58f35217dcedc5f19e8cf3eb42b28d0vandwalle sb.append(printTime()); 260640ff222cec1bd05879edb53abc75c6deead734cavandwalle break; 2607b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle case WifiMonitor.SCAN_RESULTS_EVENT: 2608b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle sb.append(" "); 2609b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle sb.append(Integer.toString(msg.arg1)); 2610b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle sb.append(" "); 2611b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle sb.append(Integer.toString(msg.arg2)); 2612b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle if (mScanResults != null) { 2613be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle sb.append(" found="); 2614b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle sb.append(mScanResults.size()); 2615b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle } 2616be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle sb.append(" known=").append(mNumScanResultsKnown); 26172f2cf21662275a0e93d7d7a6ad3d98b4c596dcf0vandwalle sb.append(" got=").append(mNumScanResultsReturned); 2618b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle if (lastScanDuration != 0) { 2619b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle sb.append(" dur:").append(lastScanDuration); 2620b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle } 26210eebae7334d6129f7ca1344e4b20199794994358vandwalle if (mOnTime != 0) { 26227b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle sb.append(" on:").append(mOnTimeThisScan).append(",").append(mOnTimeScan); 26237b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle sb.append(",").append(mOnTime); 26240eebae7334d6129f7ca1344e4b20199794994358vandwalle } 26250eebae7334d6129f7ca1344e4b20199794994358vandwalle if (mTxTime != 0) { 26267b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle sb.append(" tx:").append(mTxTimeThisScan).append(",").append(mTxTimeScan); 26277b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle sb.append(",").append(mTxTime); 26280eebae7334d6129f7ca1344e4b20199794994358vandwalle } 26290eebae7334d6129f7ca1344e4b20199794994358vandwalle if (mRxTime != 0) { 26307b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle sb.append(" rx:").append(mRxTimeThisScan).append(",").append(mRxTimeScan); 26317b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle sb.append(",").append(mRxTime); 26320eebae7334d6129f7ca1344e4b20199794994358vandwalle } 2633dd0c558776fcfba3f754bb0cd6533f2c9c23ec1evandwalle sb.append(String.format(" bcn=%d", mRunningBeaconCount)); 26348242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle sb.append(String.format(" con=%d", mConnectionRequests)); 26358242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle key = mWifiConfigStore.getLastSelectedConfiguration(); 26368242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle if (key != null) { 26378242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle sb.append(" last=").append(key); 26388242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle } 2639b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle break; 2640b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle case WifiMonitor.NETWORK_CONNECTION_EVENT: 2641b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle sb.append(" "); 2642b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle sb.append(Integer.toString(msg.arg1)); 2643b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle sb.append(" "); 2644b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle sb.append(Integer.toString(msg.arg2)); 2645b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle sb.append(" ").append(mLastBssid); 2646b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle sb.append(" nid=").append(mLastNetworkId); 2647b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle config = getCurrentWifiConfiguration(); 2648b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle if (config != null) { 2649b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle sb.append(" ").append(config.configKey()); 2650b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle } 2651b5120326b58f35217dcedc5f19e8cf3eb42b28d0vandwalle sb.append(printTime()); 26528242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle key = mWifiConfigStore.getLastSelectedConfiguration(); 26538242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle if (key != null) { 26548242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle sb.append(" last=").append(key); 26558242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle } 2656b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle break; 2657e6574ec7b6b2e7a678da7f77bdaaf31463852b2fvandwalle case CMD_TARGET_BSSID: 26589f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle case CMD_ASSOCIATED_BSSID: 2659e6574ec7b6b2e7a678da7f77bdaaf31463852b2fvandwalle sb.append(" "); 2660e6574ec7b6b2e7a678da7f77bdaaf31463852b2fvandwalle sb.append(Integer.toString(msg.arg1)); 2661e6574ec7b6b2e7a678da7f77bdaaf31463852b2fvandwalle sb.append(" "); 2662e6574ec7b6b2e7a678da7f77bdaaf31463852b2fvandwalle sb.append(Integer.toString(msg.arg2)); 2663e6574ec7b6b2e7a678da7f77bdaaf31463852b2fvandwalle if (msg.obj != null) { 2664e6574ec7b6b2e7a678da7f77bdaaf31463852b2fvandwalle sb.append(" BSSID=").append((String)msg.obj); 2665e6574ec7b6b2e7a678da7f77bdaaf31463852b2fvandwalle } 2666e6574ec7b6b2e7a678da7f77bdaaf31463852b2fvandwalle if (mTargetRoamBSSID != null) { 2667e6574ec7b6b2e7a678da7f77bdaaf31463852b2fvandwalle sb.append(" Target=").append(mTargetRoamBSSID); 2668e6574ec7b6b2e7a678da7f77bdaaf31463852b2fvandwalle } 2669e6574ec7b6b2e7a678da7f77bdaaf31463852b2fvandwalle sb.append(" roam=").append(Integer.toString(mAutoRoaming)); 2670b5120326b58f35217dcedc5f19e8cf3eb42b28d0vandwalle sb.append(printTime()); 2671e6574ec7b6b2e7a678da7f77bdaaf31463852b2fvandwalle break; 2672b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle case WifiMonitor.NETWORK_DISCONNECTION_EVENT: 2673b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle if (msg.obj != null) { 2674b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle sb.append(" ").append((String)msg.obj); 2675b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle } 2676b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle sb.append(" nid=").append(msg.arg1); 2677b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle sb.append(" reason=").append(msg.arg2); 26787806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle if (mLastBssid != null) { 26797806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle sb.append(" lastbssid=").append(mLastBssid); 26807806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle } 26817806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle if (mWifiInfo.getFrequency() != -1) { 26827806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle sb.append(" freq=").append(mWifiInfo.getFrequency()); 26837806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle sb.append(" rssi=").append(mWifiInfo.getRssi()); 26847806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle } 26857806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle if (linkDebouncing) { 26867806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle sb.append(" debounce"); 26877806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle } 2688b5120326b58f35217dcedc5f19e8cf3eb42b28d0vandwalle sb.append(printTime()); 2689b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle break; 2690b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle case WifiMonitor.SSID_TEMP_DISABLED: 2691b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle case WifiMonitor.SSID_REENABLED: 2692b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle sb.append(" nid=").append(msg.arg1); 2693b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle if (msg.obj != null) { 2694b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle sb.append(" ").append((String)msg.obj); 2695b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle } 2696be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle config = getCurrentWifiConfiguration(); 2697be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle if (config != null) { 2698be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle sb.append(" cur=").append(config.configKey()); 2699be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle sb.append(" ajst=").append(config.autoJoinStatus); 2700be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle if (config.selfAdded) { 2701be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle sb.append(" selfAdded"); 2702be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle } 2703be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle if (config.status != 0) { 2704be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle sb.append(" st=").append(config.status); 2705be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle sb.append(" rs=").append(config.disableReason); 2706be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle } 2707be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle if (config.lastConnected != 0) { 2708ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle now = System.currentTimeMillis(); 2709be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle sb.append(" lastconn=").append(now - config.lastConnected).append("(ms)"); 2710be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle } 2711be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle if (mLastBssid != null) { 2712be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle sb.append(" lastbssid=").append(mLastBssid); 2713be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle } 2714be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle if (mWifiInfo.getFrequency() != -1) { 2715be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle sb.append(" freq=").append(mWifiInfo.getFrequency()); 2716be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle sb.append(" rssi=").append(mWifiInfo.getRssi()); 2717be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle sb.append(" bssid=").append(mWifiInfo.getBSSID()); 2718be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle } 2719be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle } 2720b5120326b58f35217dcedc5f19e8cf3eb42b28d0vandwalle sb.append(printTime()); 2721b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle break; 2722b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle case CMD_RSSI_POLL: 2723b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle case CMD_UNWANTED_NETWORK: 2724326120045502363422cf5c52a467163d4bcb703avandwalle case WifiManager.RSSI_PKTCNT_FETCH: 2725b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle sb.append(" "); 2726b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle sb.append(Integer.toString(msg.arg1)); 2727b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle sb.append(" "); 2728b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle sb.append(Integer.toString(msg.arg2)); 2729b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle if (mWifiInfo.getSSID() != null) 27307b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle if (mWifiInfo.getSSID() != null) 2731b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle sb.append(" ").append(mWifiInfo.getSSID()); 2732b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle if (mWifiInfo.getBSSID() != null) 2733b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle sb.append(" ").append(mWifiInfo.getBSSID()); 2734b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle sb.append(" rssi=").append(mWifiInfo.getRssi()); 2735b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle sb.append(" f=").append(mWifiInfo.getFrequency()); 2736b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle sb.append(" sc=").append(mWifiInfo.score); 2737b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle sb.append(" link=").append(mWifiInfo.getLinkSpeed()); 2738b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle sb.append(String.format(" tx=%.1f,", mWifiInfo.txSuccessRate)); 2739b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle sb.append(String.format(" %.1f,", mWifiInfo.txRetriesRate)); 2740b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle sb.append(String.format(" %.1f ", mWifiInfo.txBadRate)); 2741b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle sb.append(String.format(" rx=%.1f", mWifiInfo.rxSuccessRate)); 2742dd0c558776fcfba3f754bb0cd6533f2c9c23ec1evandwalle sb.append(String.format(" bcn=%d", mRunningBeaconCount)); 27437b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle report = reportOnTime(); 27447b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle if (report != null) { 27457b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle sb.append(" ").append(report); 27467b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle } 27477b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle if (wifiScoringReport != null) { 27487b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle sb.append(wifiScoringReport); 27497b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle } 2750b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle break; 2751b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle case CMD_AUTO_CONNECT: 2752b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle case WifiManager.CONNECT_NETWORK: 2753b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle sb.append(" "); 2754b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle sb.append(Integer.toString(msg.arg1)); 2755b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle sb.append(" "); 2756b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle sb.append(Integer.toString(msg.arg2)); 2757b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle config = (WifiConfiguration) msg.obj; 2758b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle if (config != null) { 2759b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle sb.append(" ").append(config.configKey()); 2760b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle if (config.visibility != null) { 2761b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle sb.append(" [").append(config.visibility.num24); 2762b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle sb.append(" ,").append(config.visibility.rssi24); 2763b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle sb.append(" ;").append(config.visibility.num5); 2764b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle sb.append(" ,").append(config.visibility.rssi5).append("]"); 2765b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle } 2766b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle } 27678c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle if (mTargetRoamBSSID != null) { 27688c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle sb.append(" ").append(mTargetRoamBSSID); 27698c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle } 27708c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle sb.append(" roam=").append(Integer.toString(mAutoRoaming)); 2771b5120326b58f35217dcedc5f19e8cf3eb42b28d0vandwalle sb.append(printTime()); 2772dd0c558776fcfba3f754bb0cd6533f2c9c23ec1evandwalle config = getCurrentWifiConfiguration(); 2773dd0c558776fcfba3f754bb0cd6533f2c9c23ec1evandwalle if (config != null) { 2774dd0c558776fcfba3f754bb0cd6533f2c9c23ec1evandwalle sb.append(" ").append(config.configKey()); 2775dd0c558776fcfba3f754bb0cd6533f2c9c23ec1evandwalle if (config.visibility != null) { 2776dd0c558776fcfba3f754bb0cd6533f2c9c23ec1evandwalle sb.append(" [").append(config.visibility.num24); 2777dd0c558776fcfba3f754bb0cd6533f2c9c23ec1evandwalle sb.append(" ,").append(config.visibility.rssi24); 2778dd0c558776fcfba3f754bb0cd6533f2c9c23ec1evandwalle sb.append(" ;").append(config.visibility.num5); 2779dd0c558776fcfba3f754bb0cd6533f2c9c23ec1evandwalle sb.append(" ,").append(config.visibility.rssi5).append("]"); 2780dd0c558776fcfba3f754bb0cd6533f2c9c23ec1evandwalle } 2781dd0c558776fcfba3f754bb0cd6533f2c9c23ec1evandwalle } 2782b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle break; 2783b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle case CMD_AUTO_ROAM: 2784b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle sb.append(" "); 2785b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle sb.append(Integer.toString(msg.arg1)); 2786b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle sb.append(" "); 2787b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle sb.append(Integer.toString(msg.arg2)); 2788b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle ScanResult result = (ScanResult)msg.obj; 2789b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle if (result != null) { 27909e806a8d9f297e4de826e65322859a89e4d95c8bvandwalle now = System.currentTimeMillis(); 27910d616ef3bf635dff8722e064c0be842676390ed8vandwalle sb.append(" bssid=").append(result.BSSID); 2792b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle sb.append(" rssi=").append(result.level); 2793b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle sb.append(" freq=").append(result.frequency); 27949e806a8d9f297e4de826e65322859a89e4d95c8bvandwalle if (result.seen > 0 && result.seen < now) { 27959e806a8d9f297e4de826e65322859a89e4d95c8bvandwalle sb.append(" seen=").append(now - result.seen); 27969e806a8d9f297e4de826e65322859a89e4d95c8bvandwalle } else { 27979e806a8d9f297e4de826e65322859a89e4d95c8bvandwalle // Somehow the timestamp for this scan result is inconsistent 27989e806a8d9f297e4de826e65322859a89e4d95c8bvandwalle sb.append(" !seen=").append(result.seen); 27999e806a8d9f297e4de826e65322859a89e4d95c8bvandwalle } 2800b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle } 28018c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle if (mTargetRoamBSSID != null) { 28028c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle sb.append(" ").append(mTargetRoamBSSID); 28038c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle } 28048c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle sb.append(" roam=").append(Integer.toString(mAutoRoaming)); 28050d616ef3bf635dff8722e064c0be842676390ed8vandwalle sb.append(" fail count=").append(Integer.toString(mRoamFailCount)); 2806b5120326b58f35217dcedc5f19e8cf3eb42b28d0vandwalle sb.append(printTime()); 2807b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle break; 28089f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle case CMD_ADD_OR_UPDATE_NETWORK: 28099f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle sb.append(" "); 28109f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle sb.append(Integer.toString(msg.arg1)); 28119f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle sb.append(" "); 28129f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle sb.append(Integer.toString(msg.arg2)); 28139f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle if (msg.obj != null) { 28149f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle config = (WifiConfiguration)msg.obj; 28159f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle sb.append(" ").append(config.configKey()); 2816b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle sb.append(" prio=").append(config.priority); 2817b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle sb.append(" status=").append(config.status); 2818b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle if (config.BSSID != null) { 2819b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle sb.append(" ").append(config.BSSID); 2820b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle } 2821b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle WifiConfiguration curConfig = getCurrentWifiConfiguration(); 2822b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle if (curConfig != null) { 2823b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle if (curConfig.configKey().equals(config.configKey())) { 2824b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle sb.append(" is current"); 2825b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle } else { 2826b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle sb.append(" current=").append(curConfig.configKey()); 2827b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle sb.append(" prio=").append(curConfig.priority); 2828b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle sb.append(" status=").append(curConfig.status); 2829b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle } 2830b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle } 28319f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle } 28329f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle break; 2833b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle case WifiManager.DISABLE_NETWORK: 2834b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle case CMD_ENABLE_NETWORK: 2835b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle sb.append(" "); 2836b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle sb.append(Integer.toString(msg.arg1)); 2837b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle sb.append(" "); 2838b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle sb.append(Integer.toString(msg.arg2)); 28398242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle key = mWifiConfigStore.getLastSelectedConfiguration(); 2840b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle if (key != null) { 28419f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle sb.append(" last=").append(key); 28429f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle } 28439f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle config = mWifiConfigStore.getWifiConfiguration(msg.arg1); 28449f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle if (config != null && (key == null || !config.configKey().equals(key))) { 2845b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle sb.append(" target=").append(key); 2846b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle } 2847b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle break; 2848931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle case CMD_GET_CONFIGURED_NETWORKS: 2849931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle sb.append(" "); 2850931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle sb.append(Integer.toString(msg.arg1)); 2851931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle sb.append(" "); 2852931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle sb.append(Integer.toString(msg.arg2)); 2853931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle sb.append(" num=").append(mWifiConfigStore.getConfiguredNetworksSize()); 2854931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle break; 2855a5283c01ac413e378e2261050cac3a6d6e9cf385vandwalle case DhcpStateMachine.CMD_PRE_DHCP_ACTION: 2856a5283c01ac413e378e2261050cac3a6d6e9cf385vandwalle sb.append(" "); 2857a5283c01ac413e378e2261050cac3a6d6e9cf385vandwalle sb.append(Integer.toString(msg.arg1)); 2858a5283c01ac413e378e2261050cac3a6d6e9cf385vandwalle sb.append(" "); 2859a5283c01ac413e378e2261050cac3a6d6e9cf385vandwalle sb.append(Integer.toString(msg.arg2)); 2860a5283c01ac413e378e2261050cac3a6d6e9cf385vandwalle sb.append(" txpkts=").append(mWifiInfo.txSuccess); 2861a5283c01ac413e378e2261050cac3a6d6e9cf385vandwalle sb.append(",").append(mWifiInfo.txBad); 2862a5283c01ac413e378e2261050cac3a6d6e9cf385vandwalle sb.append(",").append(mWifiInfo.txRetries); 2863a5283c01ac413e378e2261050cac3a6d6e9cf385vandwalle break; 28642451dbcc4f9641df188326215b204b798eb70c46vandwalle case DhcpStateMachine.CMD_POST_DHCP_ACTION: 28652451dbcc4f9641df188326215b204b798eb70c46vandwalle sb.append(" "); 28662451dbcc4f9641df188326215b204b798eb70c46vandwalle sb.append(Integer.toString(msg.arg1)); 28672451dbcc4f9641df188326215b204b798eb70c46vandwalle sb.append(" "); 28682451dbcc4f9641df188326215b204b798eb70c46vandwalle sb.append(Integer.toString(msg.arg2)); 28692451dbcc4f9641df188326215b204b798eb70c46vandwalle if (msg.arg1 == DhcpStateMachine.DHCP_SUCCESS) { 28702451dbcc4f9641df188326215b204b798eb70c46vandwalle sb.append(" OK "); 28712451dbcc4f9641df188326215b204b798eb70c46vandwalle } else if (msg.arg1 == DhcpStateMachine.DHCP_FAILURE) { 28722451dbcc4f9641df188326215b204b798eb70c46vandwalle sb.append(" FAIL "); 28732451dbcc4f9641df188326215b204b798eb70c46vandwalle } 287482d20190c3ec3a080d928a581c40311c66345cc8vandwalle if (mLinkProperties != null) { 287582d20190c3ec3a080d928a581c40311c66345cc8vandwalle if (mLinkProperties.hasIPv4Address()) { 287682d20190c3ec3a080d928a581c40311c66345cc8vandwalle sb.append(" v4"); 287782d20190c3ec3a080d928a581c40311c66345cc8vandwalle } 287882d20190c3ec3a080d928a581c40311c66345cc8vandwalle if (mLinkProperties.hasGlobalIPv6Address()) { 287982d20190c3ec3a080d928a581c40311c66345cc8vandwalle sb.append(" v6"); 288082d20190c3ec3a080d928a581c40311c66345cc8vandwalle } 288182d20190c3ec3a080d928a581c40311c66345cc8vandwalle if (mLinkProperties.hasIPv4DefaultRoute()) { 288282d20190c3ec3a080d928a581c40311c66345cc8vandwalle sb.append(" v4r"); 288382d20190c3ec3a080d928a581c40311c66345cc8vandwalle } 288482d20190c3ec3a080d928a581c40311c66345cc8vandwalle if (mLinkProperties.hasIPv6DefaultRoute()) { 288582d20190c3ec3a080d928a581c40311c66345cc8vandwalle sb.append(" v6r"); 288682d20190c3ec3a080d928a581c40311c66345cc8vandwalle } 288782d20190c3ec3a080d928a581c40311c66345cc8vandwalle if (mLinkProperties.hasIPv4DnsServer()) { 288882d20190c3ec3a080d928a581c40311c66345cc8vandwalle sb.append(" v4dns"); 288982d20190c3ec3a080d928a581c40311c66345cc8vandwalle } 289082d20190c3ec3a080d928a581c40311c66345cc8vandwalle if (mLinkProperties.hasIPv6DnsServer()) { 289182d20190c3ec3a080d928a581c40311c66345cc8vandwalle sb.append(" v6dns"); 289282d20190c3ec3a080d928a581c40311c66345cc8vandwalle } 289382d20190c3ec3a080d928a581c40311c66345cc8vandwalle } 28942451dbcc4f9641df188326215b204b798eb70c46vandwalle break; 28952451dbcc4f9641df188326215b204b798eb70c46vandwalle case WifiP2pServiceImpl.P2P_CONNECTION_CHANGED: 28962451dbcc4f9641df188326215b204b798eb70c46vandwalle sb.append(" "); 28972451dbcc4f9641df188326215b204b798eb70c46vandwalle sb.append(Integer.toString(msg.arg1)); 28982451dbcc4f9641df188326215b204b798eb70c46vandwalle sb.append(" "); 28992451dbcc4f9641df188326215b204b798eb70c46vandwalle sb.append(Integer.toString(msg.arg2)); 29002451dbcc4f9641df188326215b204b798eb70c46vandwalle if (msg.obj != null) { 29012451dbcc4f9641df188326215b204b798eb70c46vandwalle NetworkInfo info = (NetworkInfo)msg.obj; 29022451dbcc4f9641df188326215b204b798eb70c46vandwalle NetworkInfo.State state = info.getState(); 29032451dbcc4f9641df188326215b204b798eb70c46vandwalle NetworkInfo.DetailedState detailedState = info.getDetailedState(); 29042451dbcc4f9641df188326215b204b798eb70c46vandwalle if (state != null) { 29052451dbcc4f9641df188326215b204b798eb70c46vandwalle sb.append(" st=").append(state); 29062451dbcc4f9641df188326215b204b798eb70c46vandwalle } 29072451dbcc4f9641df188326215b204b798eb70c46vandwalle if (detailedState != null) { 29082451dbcc4f9641df188326215b204b798eb70c46vandwalle sb.append("/").append(detailedState); 29092451dbcc4f9641df188326215b204b798eb70c46vandwalle } 29102451dbcc4f9641df188326215b204b798eb70c46vandwalle } 29112451dbcc4f9641df188326215b204b798eb70c46vandwalle break; 2912c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle case CMD_IP_CONFIGURATION_LOST: 2913c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle int count = -1; 2914c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle WifiConfiguration c = getCurrentWifiConfiguration(); 2915e0ba94ba9abde13173ae0de8c8939aa4eb9a9085vandwalle if (c != null) count = c.numIpConfigFailures; 2916c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle sb.append(" "); 2917c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle sb.append(Integer.toString(msg.arg1)); 2918c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle sb.append(" "); 2919c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle sb.append(Integer.toString(msg.arg2)); 2920c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle sb.append(" failures: "); 2921c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle sb.append(Integer.toString(count)); 2922c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle sb.append("/"); 2923c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle sb.append(Integer.toString(mWifiConfigStore.getMaxDhcpRetries())); 2924e0ba94ba9abde13173ae0de8c8939aa4eb9a9085vandwalle if (mWifiInfo.getBSSID() != null) { 2925a5283c01ac413e378e2261050cac3a6d6e9cf385vandwalle sb.append(" ").append(mWifiInfo.getBSSID()); 2926e0ba94ba9abde13173ae0de8c8939aa4eb9a9085vandwalle } 2927a5283c01ac413e378e2261050cac3a6d6e9cf385vandwalle if (c != null) { 2928a5283c01ac413e378e2261050cac3a6d6e9cf385vandwalle if (c.scanResultCache != null) { 2929a5283c01ac413e378e2261050cac3a6d6e9cf385vandwalle for (ScanResult r : c.scanResultCache.values()) { 2930a5283c01ac413e378e2261050cac3a6d6e9cf385vandwalle if (r.BSSID.equals(mWifiInfo.getBSSID())) { 2931a5283c01ac413e378e2261050cac3a6d6e9cf385vandwalle sb.append(" ipfail=").append(r.numIpConfigFailures); 2932a5283c01ac413e378e2261050cac3a6d6e9cf385vandwalle sb.append(",st=").append(r.autoJoinStatus); 2933a5283c01ac413e378e2261050cac3a6d6e9cf385vandwalle } 2934e0ba94ba9abde13173ae0de8c8939aa4eb9a9085vandwalle } 2935e0ba94ba9abde13173ae0de8c8939aa4eb9a9085vandwalle } 2936a5283c01ac413e378e2261050cac3a6d6e9cf385vandwalle sb.append(" -> ajst=").append(c.autoJoinStatus); 2937a5283c01ac413e378e2261050cac3a6d6e9cf385vandwalle sb.append(" ").append(c.disableReason); 2938a5283c01ac413e378e2261050cac3a6d6e9cf385vandwalle sb.append(" txpkts=").append(mWifiInfo.txSuccess); 2939a5283c01ac413e378e2261050cac3a6d6e9cf385vandwalle sb.append(",").append(mWifiInfo.txBad); 2940a5283c01ac413e378e2261050cac3a6d6e9cf385vandwalle sb.append(",").append(mWifiInfo.txRetries); 2941e0ba94ba9abde13173ae0de8c8939aa4eb9a9085vandwalle } 2942b5120326b58f35217dcedc5f19e8cf3eb42b28d0vandwalle sb.append(printTime()); 2943dd0c558776fcfba3f754bb0cd6533f2c9c23ec1evandwalle sb.append(String.format(" bcn=%d", mRunningBeaconCount)); 2944c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle break; 29457806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle case CMD_UPDATE_LINKPROPERTIES: 29467806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle sb.append(" "); 29477806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle sb.append(Integer.toString(msg.arg1)); 29487806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle sb.append(" "); 29497806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle sb.append(Integer.toString(msg.arg2)); 29507806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle if (mLinkProperties != null) { 29517806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle if (mLinkProperties.hasIPv4Address()) { 29527806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle sb.append(" v4"); 29537806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle } 29547806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle if (mLinkProperties.hasGlobalIPv6Address()) { 29557806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle sb.append(" v6"); 29567806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle } 29577806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle if (mLinkProperties.hasIPv4DefaultRoute()) { 29587806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle sb.append(" v4r"); 29597806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle } 29607806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle if (mLinkProperties.hasIPv6DefaultRoute()) { 29617806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle sb.append(" v6r"); 29627806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle } 29637806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle if (mLinkProperties.hasIPv4DnsServer()) { 29647806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle sb.append(" v4dns"); 29657806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle } 29667806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle if (mLinkProperties.hasIPv6DnsServer()) { 29677806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle sb.append(" v6dns"); 29687806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle } 29697806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle } 29707806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle break; 2971be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle case CMD_SET_COUNTRY_CODE: 2972be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle sb.append(" "); 2973be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle sb.append(Integer.toString(msg.arg1)); 2974be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle sb.append(" "); 2975be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle sb.append(Integer.toString(msg.arg2)); 2976be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle if (msg.obj != null) { 2977be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle sb.append(" ").append((String)msg.obj); 2978be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle } 2979be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle break; 2980be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle case CMD_ROAM_WATCHDOG_TIMER: 2981be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle sb.append(" "); 2982be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle sb.append(Integer.toString(msg.arg1)); 2983be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle sb.append(" "); 2984be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle sb.append(Integer.toString(msg.arg2)); 2985be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle sb.append(" cur=").append(roamWatchdogCount); 2986be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle break; 2987be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle case CMD_DISCONNECTING_WATCHDOG_TIMER: 2988be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle sb.append(" "); 2989be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle sb.append(Integer.toString(msg.arg1)); 2990be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle sb.append(" "); 2991be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle sb.append(Integer.toString(msg.arg2)); 2992be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle sb.append(" cur=").append(disconnectingWatchdogCount); 2993be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle break; 2994b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle default: 2995b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle sb.append(" "); 2996b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle sb.append(Integer.toString(msg.arg1)); 2997b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle sb.append(" "); 2998b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle sb.append(Integer.toString(msg.arg2)); 2999b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle break; 3000b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle } 3001b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle 3002b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle return sb.toString(); 3003b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle } 3004b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle 30057c8a4effa2442b9d00fd421b443ea9645f8651c8Vinit Deshpande private void handleScreenStateChanged(boolean screenOn, boolean startBackgroundScanIfNeeded) { 3006f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle mScreenOn = screenOn; 3007f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle if (PDBG) { 3008f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle loge(" handleScreenStateChanged Enter: screenOn=" + screenOn 3009f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle + " mUserWantsSuspendOpt=" + mUserWantsSuspendOpt 3010f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle + " state " + getCurrentState().getName() 3011f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle + " suppState:" + mSupplicantStateTracker.getSupplicantStateName()); 3012f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle } 3013155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande enableRssiPolling(screenOn); 3014155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (screenOn) enableAllNetworks(); 3015155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mUserWantsSuspendOpt.get()) { 3016155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (screenOn) { 3017155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendMessage(CMD_SET_SUSPEND_OPT_ENABLED, 0, 0); 3018155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 30197b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle // Allow 2s for suspend optimizations to be set 3020155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mSuspendWakeLock.acquire(2000); 3021155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendMessage(CMD_SET_SUSPEND_OPT_ENABLED, 1, 0); 3022155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3023155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3024155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mScreenBroadcastReceived.set(true); 3025f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 30267b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle getWifiLinkLayerStats(false); 30277b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle mOnTimeScreenStateChange = mOnTime; 30287b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle lastScreenStateChangeTimeStamp = lastLinkLayerStatsUpdate; 30298242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle mEnableBackgroundScan = false; 30308242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle cancelDelayedScan(); 30317b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle 3032f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle if (screenOn) { 30338242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle setScanAlarm(false); 3034e0ba94ba9abde13173ae0de8c8939aa4eb9a9085vandwalle clearBlacklist(); 3035e0ba94ba9abde13173ae0de8c8939aa4eb9a9085vandwalle 30360eebae7334d6129f7ca1344e4b20199794994358vandwalle fullBandConnectedTimeIntervalMilli = mWifiConfigStore.associatedPartialScanPeriodMilli; 30378242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle // In either Disconnectedstate or ConnectedState, 30388242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle // start the scan alarm so as to enable autojoin 30392f2cf21662275a0e93d7d7a6ad3d98b4c596dcf0vandwalle if (getCurrentState() == mConnectedState 304070468b47454c8657e8963932f2e08a3f4d7e3881vandwalle && mWifiConfigStore.enableAutoJoinScanWhenAssociated) { 30418242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle // Scan after 500ms 30428242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle startDelayedScan(500, null, null); 3043e67ec726c07410073575473c0f50dc737629f5davandwalle } else if (getCurrentState() == mDisconnectedState) { 30449f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle // Scan after 200ms 30458242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle startDelayedScan(200, null, null); 30468242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle } 30478242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle } else if (startBackgroundScanIfNeeded) { 30488242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle // Screen Off and Disconnected and chipset doesn't support scan offload 30498242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle // => start scan alarm 30508242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle // Screen Off and Disconnected and chipset does support scan offload 30518242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle // => will use scan offload (i.e. background scan) 30528242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle if (!mBackgroundScanSupported) { 30538242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle setScanAlarm(true); 30548242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle } else { 30558242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle mEnableBackgroundScan = true; 3056f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle } 30577c8a4effa2442b9d00fd421b443ea9645f8651c8Vinit Deshpande } 30587c8a4effa2442b9d00fd421b443ea9645f8651c8Vinit Deshpande if (DBG) logd("backgroundScan enabled=" + mEnableBackgroundScan 30597c8a4effa2442b9d00fd421b443ea9645f8651c8Vinit Deshpande + " startBackgroundScanIfNeeded:" + startBackgroundScanIfNeeded); 30607c8a4effa2442b9d00fd421b443ea9645f8651c8Vinit Deshpande if (startBackgroundScanIfNeeded) { 3061cce5b9e0eded28096991578e020883484ece8c54Vinit Deshpande // to scan for them in background, we need all networks enabled 3062cce5b9e0eded28096991578e020883484ece8c54Vinit Deshpande enableBackgroundScan(mEnableBackgroundScan); 30637c8a4effa2442b9d00fd421b443ea9645f8651c8Vinit Deshpande } 3064f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle if (DBG) log("handleScreenStateChanged Exit: " + screenOn); 3065155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3066155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 3067155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private void checkAndSetConnectivityInstance() { 3068155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mCm == null) { 3069155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mCm = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE); 3070155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3071155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3072155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 3073155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private boolean startTethering(ArrayList<String> available) { 3074155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 3075155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande boolean wifiAvailable = false; 3076155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 3077155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande checkAndSetConnectivityInstance(); 3078155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 3079155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande String[] wifiRegexs = mCm.getTetherableWifiRegexs(); 3080155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 3081155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande for (String intf : available) { 3082155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande for (String regex : wifiRegexs) { 3083155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (intf.matches(regex)) { 3084155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 3085155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande InterfaceConfiguration ifcg = null; 3086155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande try { 3087155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande ifcg = mNwService.getInterfaceConfig(intf); 3088155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (ifcg != null) { 3089155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* IP/netmask: 192.168.43.1/255.255.255.0 */ 3090155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande ifcg.setLinkAddress(new LinkAddress( 3091155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande NetworkUtils.numericToInetAddress("192.168.43.1"), 24)); 3092155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande ifcg.setInterfaceUp(); 3093155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 3094155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mNwService.setInterfaceConfig(intf, ifcg); 3095155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3096155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } catch (Exception e) { 3097155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("Error configuring interface " + intf + ", :" + e); 3098155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return false; 3099155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3100155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 3101155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if(mCm.tether(intf) != ConnectivityManager.TETHER_ERROR_NO_ERROR) { 3102155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("Error tethering on " + intf); 3103155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return false; 3104155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3105155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mTetherInterfaceName = intf; 3106155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return true; 3107155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3108155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3109155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3110155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // We found no interfaces to tether 3111155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return false; 3112155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3113155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 3114155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private void stopTethering() { 3115155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 3116155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande checkAndSetConnectivityInstance(); 3117155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 3118155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Clear the interface config to allow dhcp correctly configure new 3119155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande ip settings */ 3120155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande InterfaceConfiguration ifcg = null; 3121155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande try { 3122155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande ifcg = mNwService.getInterfaceConfig(mTetherInterfaceName); 3123155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (ifcg != null) { 3124155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande ifcg.setLinkAddress( 3125155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande new LinkAddress(NetworkUtils.numericToInetAddress("0.0.0.0"), 0)); 3126155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mNwService.setInterfaceConfig(mTetherInterfaceName, ifcg); 3127155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3128155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } catch (Exception e) { 3129155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("Error resetting interface " + mTetherInterfaceName + ", :" + e); 3130155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3131155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 3132155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mCm.untether(mTetherInterfaceName) != ConnectivityManager.TETHER_ERROR_NO_ERROR) { 3133155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("Untether initiate failed!"); 3134155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3135155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3136155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 3137155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private boolean isWifiTethered(ArrayList<String> active) { 3138155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 3139155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande checkAndSetConnectivityInstance(); 3140155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 3141155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande String[] wifiRegexs = mCm.getTetherableWifiRegexs(); 3142155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande for (String intf : active) { 3143155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande for (String regex : wifiRegexs) { 3144155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (intf.matches(regex)) { 3145155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return true; 3146155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3147155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3148155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3149155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // We found no interfaces that are tethered 3150155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return false; 3151155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3152155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 3153155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 3154155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Set the country code from the system setting value, if any. 3155155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 3156155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private void setCountryCode() { 3157155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande String countryCode = Settings.Global.getString(mContext.getContentResolver(), 3158155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Settings.Global.WIFI_COUNTRY_CODE); 3159155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (countryCode != null && !countryCode.isEmpty()) { 3160155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande setCountryCode(countryCode, false); 3161155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 3162155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande //use driver default 3163155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3164155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3165155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 3166155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 3167155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Set the frequency band from the system setting value, if any. 3168155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 3169155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private void setFrequencyBand() { 3170155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande int band = Settings.Global.getInt(mContext.getContentResolver(), 3171155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Settings.Global.WIFI_FREQUENCY_BAND, WifiManager.WIFI_FREQUENCY_BAND_AUTO); 3172155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande setFrequencyBand(band, false); 3173155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3174155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 3175155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private void setSuspendOptimizationsNative(int reason, boolean enabled) { 3176f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle if (DBG) { 3177f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle log("setSuspendOptimizationsNative: " + reason + " " + enabled 3178f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle + " -want " + mUserWantsSuspendOpt.get() 3179f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle + " stack:" + Thread.currentThread().getStackTrace()[2].getMethodName() 3180f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle +" - "+ Thread.currentThread().getStackTrace()[3].getMethodName() 3181f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle +" - "+ Thread.currentThread().getStackTrace()[4].getMethodName() 3182f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle +" - "+ Thread.currentThread().getStackTrace()[5].getMethodName()); 3183f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle } 3184a2903b7c6fc2419d48fd9976fa24852370653c4avandwalle //mWifiNative.setSuspendOptimizations(enabled); 3185f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 3186155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (enabled) { 3187155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mSuspendOptNeedsDisabled &= ~reason; 3188155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* None of dhcp, screen or highperf need it disabled and user wants it enabled */ 3189155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mSuspendOptNeedsDisabled == 0 && mUserWantsSuspendOpt.get()) { 3190f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle if (DBG) { 3191f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle log("setSuspendOptimizationsNative do it " + reason + " " + enabled 3192f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle + " stack:" + Thread.currentThread().getStackTrace()[2].getMethodName() 3193f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle +" - "+ Thread.currentThread().getStackTrace()[3].getMethodName() 3194f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle +" - "+ Thread.currentThread().getStackTrace()[4].getMethodName() 3195f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle +" - "+ Thread.currentThread().getStackTrace()[5].getMethodName()); 3196f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle } 3197155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiNative.setSuspendOptimizations(true); 3198155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3199155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 3200155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mSuspendOptNeedsDisabled |= reason; 3201155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiNative.setSuspendOptimizations(false); 3202155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3203155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3204155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 3205155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private void setSuspendOptimizations(int reason, boolean enabled) { 3206155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (DBG) log("setSuspendOptimizations: " + reason + " " + enabled); 3207155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (enabled) { 3208155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mSuspendOptNeedsDisabled &= ~reason; 3209155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 3210155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mSuspendOptNeedsDisabled |= reason; 3211155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3212155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (DBG) log("mSuspendOptNeedsDisabled " + mSuspendOptNeedsDisabled); 3213155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3214155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 3215155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private void setWifiState(int wifiState) { 3216155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande final int previousWifiState = mWifiState.get(); 3217155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 3218155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande try { 3219155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (wifiState == WIFI_STATE_ENABLED) { 3220155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mBatteryStats.noteWifiOn(); 3221155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else if (wifiState == WIFI_STATE_DISABLED) { 3222155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mBatteryStats.noteWifiOff(); 3223155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3224155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } catch (RemoteException e) { 3225155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("Failed to note battery stats in wifi"); 3226155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3227155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 3228155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiState.set(wifiState); 3229155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 3230155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (DBG) log("setWifiState: " + syncGetWifiStateByName()); 3231155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 3232155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande final Intent intent = new Intent(WifiManager.WIFI_STATE_CHANGED_ACTION); 3233155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); 3234155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande intent.putExtra(WifiManager.EXTRA_WIFI_STATE, wifiState); 3235155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande intent.putExtra(WifiManager.EXTRA_PREVIOUS_WIFI_STATE, previousWifiState); 3236155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL); 3237155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3238155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 3239155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private void setWifiApState(int wifiApState) { 3240155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande final int previousWifiApState = mWifiApState.get(); 3241155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 3242155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande try { 3243155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (wifiApState == WIFI_AP_STATE_ENABLED) { 3244155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mBatteryStats.noteWifiOn(); 3245155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else if (wifiApState == WIFI_AP_STATE_DISABLED) { 3246155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mBatteryStats.noteWifiOff(); 3247155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3248155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } catch (RemoteException e) { 3249155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("Failed to note battery stats in wifi"); 3250155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3251155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 3252155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Update state 3253155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiApState.set(wifiApState); 3254155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 3255155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (DBG) log("setWifiApState: " + syncGetWifiApStateByName()); 3256155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 3257155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande final Intent intent = new Intent(WifiManager.WIFI_AP_STATE_CHANGED_ACTION); 3258155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); 3259155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande intent.putExtra(WifiManager.EXTRA_WIFI_AP_STATE, wifiApState); 3260155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande intent.putExtra(WifiManager.EXTRA_PREVIOUS_WIFI_AP_STATE, previousWifiApState); 3261155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL); 3262155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3263155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 3264e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle /* 3265e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle void ageOutScanResults(int age) { 3266e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle synchronized(mScanResultCache) { 3267e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle // Trim mScanResults, which prevent WifiStateMachine to return 3268e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle // obsolete scan results to queriers 3269e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle long now = System.CurrentTimeMillis(); 3270e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle for (int i = 0; i < mScanResults.size(); i++) { 3271e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle ScanResult result = mScanResults.get(i); 3272e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle if ((result.seen > now || (now - result.seen) > age)) { 3273e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle mScanResults.remove(i); 3274e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle } 3275e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle } 3276e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle } 3277e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle }*/ 3278e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle 3279155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private static final String ID_STR = "id="; 3280155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private static final String BSSID_STR = "bssid="; 3281155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private static final String FREQ_STR = "freq="; 3282155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private static final String LEVEL_STR = "level="; 3283155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private static final String TSF_STR = "tsf="; 3284155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private static final String FLAGS_STR = "flags="; 3285155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private static final String SSID_STR = "ssid="; 3286155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private static final String DELIMITER_STR = "===="; 3287155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private static final String END_STR = "####"; 3288155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 3289e0ba94ba9abde13173ae0de8c8939aa4eb9a9085vandwalle int emptyScanResultCount = 0; 3290e0ba94ba9abde13173ae0de8c8939aa4eb9a9085vandwalle 3291155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 3292155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Format: 3293155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * 3294155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * id=1 3295155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * bssid=68:7f:76:d7:1a:6e 3296155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * freq=2412 3297155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * level=-44 3298155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * tsf=1344626243700342 3299155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * flags=[WPA2-PSK-CCMP][WPS][ESS] 3300155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * ssid=zfdy 3301155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * ==== 3302155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * id=2 3303155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * bssid=68:5f:74:d7:1a:6f 3304155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * freq=5180 3305155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * level=-73 3306155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * tsf=1344626243700373 3307155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * flags=[WPA2-PSK-CCMP][WPS][ESS] 3308155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * ssid=zuby 3309155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * ==== 3310155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 3311155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private void setScanResults() { 3312be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle mNumScanResultsKnown = 0; 33132f2cf21662275a0e93d7d7a6ad3d98b4c596dcf0vandwalle mNumScanResultsReturned = 0; 3314155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande String bssid = ""; 3315155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande int level = 0; 3316155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande int freq = 0; 3317155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande long tsf = 0; 3318155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande String flags = ""; 3319155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande WifiSsid wifiSsid = null; 3320155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande String scanResults; 3321155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande String tmpResults; 3322155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande StringBuffer scanResultsBuf = new StringBuffer(); 3323155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande int sid = 0; 3324155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 3325155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande while (true) { 3326155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande tmpResults = mWifiNative.scanResults(sid); 3327155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (TextUtils.isEmpty(tmpResults)) break; 3328155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande scanResultsBuf.append(tmpResults); 3329155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande scanResultsBuf.append("\n"); 3330155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande String[] lines = tmpResults.split("\n"); 3331155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sid = -1; 3332155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande for (int i=lines.length - 1; i >= 0; i--) { 3333155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (lines[i].startsWith(END_STR)) { 3334155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 3335155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else if (lines[i].startsWith(ID_STR)) { 3336155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande try { 3337155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sid = Integer.parseInt(lines[i].substring(ID_STR.length())) + 1; 3338155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } catch (NumberFormatException e) { 3339155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Nothing to do 3340155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3341155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 3342155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3343155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3344155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (sid == -1) break; 3345155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3346155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 3347e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle // Age out scan results, we return all scan results found in the last 12 seconds, 3348e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle // and NOT all scan results since last scan. 3349e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle // ageOutScanResults(12000); 3350e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle 3351155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande scanResults = scanResultsBuf.toString(); 3352155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (TextUtils.isEmpty(scanResults)) { 3353e0ba94ba9abde13173ae0de8c8939aa4eb9a9085vandwalle emptyScanResultCount++; 3354e0ba94ba9abde13173ae0de8c8939aa4eb9a9085vandwalle if (emptyScanResultCount > 10) { 3355e0ba94ba9abde13173ae0de8c8939aa4eb9a9085vandwalle // If we got too many empty scan results, the current scan cache is stale, 3356e0ba94ba9abde13173ae0de8c8939aa4eb9a9085vandwalle // hence clear it. 3357e0ba94ba9abde13173ae0de8c8939aa4eb9a9085vandwalle mScanResults = new ArrayList<ScanResult>(); 3358e0ba94ba9abde13173ae0de8c8939aa4eb9a9085vandwalle } 3359155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return; 3360155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3361155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 3362e0ba94ba9abde13173ae0de8c8939aa4eb9a9085vandwalle emptyScanResultCount = 0; 3363a0708b09ad17b086c008ab100aec7143d7613c80vandwalle 3364155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // note that all these splits and substrings keep references to the original 3365155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // huge string buffer while the amount we really want is generally pretty small 3366155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // so make copies instead (one example b/11087956 wasted 400k of heap here). 3367155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande synchronized(mScanResultCache) { 3368155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mScanResults = new ArrayList<ScanResult>(); 3369155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande String[] lines = scanResults.split("\n"); 3370155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande final int bssidStrLen = BSSID_STR.length(); 3371155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande final int flagLen = FLAGS_STR.length(); 3372155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 3373155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande for (String line : lines) { 3374155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (line.startsWith(BSSID_STR)) { 3375155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande bssid = new String(line.getBytes(), bssidStrLen, line.length() - bssidStrLen); 3376155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else if (line.startsWith(FREQ_STR)) { 3377155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande try { 3378155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande freq = Integer.parseInt(line.substring(FREQ_STR.length())); 3379155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } catch (NumberFormatException e) { 3380155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande freq = 0; 3381155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3382155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else if (line.startsWith(LEVEL_STR)) { 3383155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande try { 3384155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande level = Integer.parseInt(line.substring(LEVEL_STR.length())); 3385155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* some implementations avoid negative values by adding 256 3386155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * so we need to adjust for that here. 3387155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 3388155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (level > 0) level -= 256; 3389155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } catch(NumberFormatException e) { 3390155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande level = 0; 3391155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3392155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else if (line.startsWith(TSF_STR)) { 3393155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande try { 3394155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande tsf = Long.parseLong(line.substring(TSF_STR.length())); 3395155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } catch (NumberFormatException e) { 3396155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande tsf = 0; 3397155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3398155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else if (line.startsWith(FLAGS_STR)) { 3399155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande flags = new String(line.getBytes(), flagLen, line.length() - flagLen); 3400155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else if (line.startsWith(SSID_STR)) { 3401155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande wifiSsid = WifiSsid.createFromAsciiEncoded( 3402155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande line.substring(SSID_STR.length())); 3403155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else if (line.startsWith(DELIMITER_STR) || line.startsWith(END_STR)) { 3404155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (bssid != null) { 3405155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande String ssid = (wifiSsid != null) ? wifiSsid.toString() : WifiSsid.NONE; 3406155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande String key = bssid + ssid; 3407155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande ScanResult scanResult = mScanResultCache.get(key); 3408155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (scanResult != null) { 3409e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle // TODO: average the RSSI, instead of overwriting it 3410155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande scanResult.level = level; 3411155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande scanResult.wifiSsid = wifiSsid; 3412155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Keep existing API 3413155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande scanResult.SSID = (wifiSsid != null) ? wifiSsid.toString() : 3414155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande WifiSsid.NONE; 3415155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande scanResult.capabilities = flags; 3416155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande scanResult.frequency = freq; 3417155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande scanResult.timestamp = tsf; 3418ed9938883ae2dade81c8be6cd6ceaef3febd5239vandwalle scanResult.seen = System.currentTimeMillis(); 3419155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 3420155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande scanResult = 3421155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande new ScanResult( 3422155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande wifiSsid, bssid, flags, level, freq, tsf); 3423be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle scanResult.seen = System.currentTimeMillis(); 3424155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mScanResultCache.put(key, scanResult); 3425155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 34262f2cf21662275a0e93d7d7a6ad3d98b4c596dcf0vandwalle mNumScanResultsReturned ++; // Keep track of how many scan results we got 34272f2cf21662275a0e93d7d7a6ad3d98b4c596dcf0vandwalle // as part of this scan's processing 3428155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mScanResults.add(scanResult); 3429155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3430155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande bssid = null; 3431155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande level = 0; 3432155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande freq = 0; 3433155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande tsf = 0; 3434155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande flags = ""; 3435155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande wifiSsid = null; 3436155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3437155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3438155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 34397806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle boolean attemptAutoJoin = true; 344056d0178183460eed9afbd85e5c0d215e27d5f5bcvandwalle SupplicantState state = mWifiInfo.getSupplicantState(); 34417806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle if (getCurrentState() == mRoamingState 34427806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle || getCurrentState() == mObtainingIpState 34439f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle || getCurrentState() == mScanModeState 34449f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle || getCurrentState() == mDisconnectingState 34452f2cf21662275a0e93d7d7a6ad3d98b4c596dcf0vandwalle || (getCurrentState() == mConnectedState 344670468b47454c8657e8963932f2e08a3f4d7e3881vandwalle && !mWifiConfigStore.enableAutoJoinWhenAssociated) 344756d0178183460eed9afbd85e5c0d215e27d5f5bcvandwalle || linkDebouncing 344856d0178183460eed9afbd85e5c0d215e27d5f5bcvandwalle || state == SupplicantState.ASSOCIATING 344956d0178183460eed9afbd85e5c0d215e27d5f5bcvandwalle || state == SupplicantState.AUTHENTICATING 345056d0178183460eed9afbd85e5c0d215e27d5f5bcvandwalle || state == SupplicantState.FOUR_WAY_HANDSHAKE 34510af9c80053bd2736d5bea095b363d6a0c8ce71d0Lorenzo Colitti || state == SupplicantState.GROUP_HANDSHAKE 34520af9c80053bd2736d5bea095b363d6a0c8ce71d0Lorenzo Colitti || mConnectionRequests == 0) { 34537806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle // Dont attempt auto-joining again while we are already attempting to join 34547806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle // and/or obtaining Ip address 34557806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle attemptAutoJoin = false; 34567806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle } 34579f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle if (DBG) { 34588242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle String selection = mWifiConfigStore.getLastSelectedConfiguration(); 34598242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle if (selection == null) { 34608242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle selection = "<none>"; 34618242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle } 34629f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle loge("wifi setScanResults state" + getCurrentState() 34639f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle + " sup_state=" + state 3464833dcce8f6712f7594f06ea33208e3e106c15afcvandwalle + " debouncing=" + linkDebouncing 34658242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle + " mConnectionRequests=" + mConnectionRequests 34668242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle + " selection=" + selection); 34679f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle } 34682f2cf21662275a0e93d7d7a6ad3d98b4c596dcf0vandwalle if (attemptAutoJoin) { 34692f2cf21662275a0e93d7d7a6ad3d98b4c596dcf0vandwalle messageHandlingStatus = MESSAGE_HANDLING_STATUS_PROCESSED; 34702f2cf21662275a0e93d7d7a6ad3d98b4c596dcf0vandwalle } 3471abd1740f753ac14e9dec8fced8d3de5059122c2avandwalle // Loose last selected configuration if we have been disconnected for 5 minutes 3472abd1740f753ac14e9dec8fced8d3de5059122c2avandwalle if (getDisconnectedTimeMilli() > mWifiConfigStore.wifiConfigLastSelectionHysteresis) { 34730eebae7334d6129f7ca1344e4b20199794994358vandwalle mWifiConfigStore.setLastSelectedConfiguration(WifiConfiguration.INVALID_NETWORK_ID); 34740eebae7334d6129f7ca1344e4b20199794994358vandwalle } 3475e0ba94ba9abde13173ae0de8c8939aa4eb9a9085vandwalle 3476e0ba94ba9abde13173ae0de8c8939aa4eb9a9085vandwalle if (mWifiConfigStore.enableAutoJoinWhenAssociated) { 3477e0ba94ba9abde13173ae0de8c8939aa4eb9a9085vandwalle synchronized(mScanResultCache) { 3478e0ba94ba9abde13173ae0de8c8939aa4eb9a9085vandwalle // AutoJoincontroller will directly acces the scan result list and update it with 3479e0ba94ba9abde13173ae0de8c8939aa4eb9a9085vandwalle // ScanResult status 3480e0ba94ba9abde13173ae0de8c8939aa4eb9a9085vandwalle mNumScanResultsKnown = mWifiAutoJoinController.newSupplicantResults(attemptAutoJoin); 3481e0ba94ba9abde13173ae0de8c8939aa4eb9a9085vandwalle } 3482e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle } 34837806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle if (linkDebouncing) { 34847806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle // If debouncing, we dont re-select a SSID or BSSID hence 34857806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle // there is no need to call the network selection code 34867806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle // in WifiAutoJoinController, instead, 34877806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle // just try to reconnect to the same SSID by triggering a roam 34887806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle sendMessage(CMD_AUTO_ROAM, mLastNetworkId, 1, null); 34897806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle } 3490155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3491155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 3492155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* 349374b0804ef846b9b4888025092dd5c75143b559dcFelipe Leme * Fetch RSSI, linkspeed, and frequency on current connection 3494155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 349574b0804ef846b9b4888025092dd5c75143b559dcFelipe Leme private void fetchRssiLinkSpeedAndFrequencyNative() { 3496155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande int newRssi = -1; 3497155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande int newLinkSpeed = -1; 349874b0804ef846b9b4888025092dd5c75143b559dcFelipe Leme int newFrequency = -1; 3499155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 3500155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande String signalPoll = mWifiNative.signalPoll(); 3501155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 3502155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (signalPoll != null) { 3503155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande String[] lines = signalPoll.split("\n"); 3504155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande for (String line : lines) { 3505155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande String[] prop = line.split("="); 3506155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (prop.length < 2) continue; 3507155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande try { 3508155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (prop[0].equals("RSSI")) { 3509155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande newRssi = Integer.parseInt(prop[1]); 3510155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else if (prop[0].equals("LINKSPEED")) { 3511155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande newLinkSpeed = Integer.parseInt(prop[1]); 351274b0804ef846b9b4888025092dd5c75143b559dcFelipe Leme } else if (prop[0].equals("FREQUENCY")) { 351374b0804ef846b9b4888025092dd5c75143b559dcFelipe Leme newFrequency = Integer.parseInt(prop[1]); 3514155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3515155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } catch (NumberFormatException e) { 3516155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande //Ignore, defaults on rssi and linkspeed are assigned 3517155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3518155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3519155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3520155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 3521117be607246604e875de62aa8cdd99700b77a2b4vandwalle if (PDBG) { 3522117be607246604e875de62aa8cdd99700b77a2b4vandwalle loge("fetchRssiLinkSpeedAndFrequencyNative rssi=" 3523117be607246604e875de62aa8cdd99700b77a2b4vandwalle + Integer.toString(newRssi) + " linkspeed=" 3524117be607246604e875de62aa8cdd99700b77a2b4vandwalle + Integer.toString(newLinkSpeed)); 3525117be607246604e875de62aa8cdd99700b77a2b4vandwalle } 3526117be607246604e875de62aa8cdd99700b77a2b4vandwalle 35274b50786546ce4c4fee555d66028991fe257b8811vandwalle if (newRssi > WifiInfo.INVALID_RSSI && newRssi < WifiInfo.MAX_RSSI) { 35284b50786546ce4c4fee555d66028991fe257b8811vandwalle // screen out invalid values 3529155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* some implementations avoid negative values by adding 256 3530155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * so we need to adjust for that here. 3531155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 3532155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (newRssi > 0) newRssi -= 256; 3533155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiInfo.setRssi(newRssi); 3534155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* 3535155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Rather then sending the raw RSSI out every time it 3536155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * changes, we precalculate the signal level that would 3537155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * be displayed in the status bar, and only send the 3538155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * broadcast if that much more coarse-grained number 3539155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * changes. This cuts down greatly on the number of 3540155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * broadcasts, at the cost of not informing others 3541155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * interested in RSSI of all the changes in signal 3542155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * level. 3543155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 3544155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande int newSignalLevel = WifiManager.calculateSignalLevel(newRssi, WifiManager.RSSI_LEVELS); 3545155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (newSignalLevel != mLastSignalLevel) { 3546155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendRssiChangeBroadcast(newRssi); 3547155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3548155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mLastSignalLevel = newSignalLevel; 3549155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 35504dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle mWifiInfo.setRssi(WifiInfo.INVALID_RSSI); 3551155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3552155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 3553155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (newLinkSpeed != -1) { 3554155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiInfo.setLinkSpeed(newLinkSpeed); 3555155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 355674b0804ef846b9b4888025092dd5c75143b559dcFelipe Leme if (newFrequency > 0) { 35570e916560ab551ac44e6ce0324bdc511f66268944Brian Williammee if (ScanResult.is5GHz(newFrequency)) { 3558c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalle mWifiConnectionStatistics.num5GhzConnected++; 3559c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalle } 3560c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalle if (ScanResult.is24GHz(newFrequency)) { 3561c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalle mWifiConnectionStatistics.num24GhzConnected++; 3562c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalle } 356374b0804ef846b9b4888025092dd5c75143b559dcFelipe Leme mWifiInfo.setFrequency(newFrequency); 356474b0804ef846b9b4888025092dd5c75143b559dcFelipe Leme } 3565c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalle mWifiConfigStore.updateConfiguration(mWifiInfo); 3566155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3567155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 3568931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle /** 3569931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle * Determine if we need to switch network: 35704dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle * - the delta determine the urgency to switch and/or or the expected evilness of the disruption 35714dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle * - match the uregncy of the switch versus the packet usage at the interface 35724dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle */ 35734dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle boolean shouldSwitchNetwork(int networkDelta) { 35744dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle int delta; 3575b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle if (networkDelta <= 0) { 3576b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle return false; 35774dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle } 35784dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle delta = networkDelta; 35794dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle if (mWifiInfo != null) { 358070468b47454c8657e8963932f2e08a3f4d7e3881vandwalle if (!mWifiConfigStore.enableAutoJoinWhenAssociated 35818c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle && mWifiInfo.getNetworkId() != WifiConfiguration.INVALID_NETWORK_ID) { 35828c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle // If AutoJoin while associated is not enabled, 35838c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle // we should never switch network when already associated 35848c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle delta = -1000; 35858c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle } else { 35868c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle // TODO: Look at per AC packet count, do not switch if VO/VI traffic is present 35878c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle // TODO: at the interface. We should also discriminate between ucast and mcast, 35888c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle // TODO: since the rxSuccessRate include all the bonjour and Ipv6 35898c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle // TODO: broadcasts 35908c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle if ((mWifiInfo.txSuccessRate > 20) || (mWifiInfo.rxSuccessRate > 80)) { 35918c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle delta -= 999; 35928c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle } else if ((mWifiInfo.txSuccessRate > 5) || (mWifiInfo.rxSuccessRate > 30)) { 35938c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle delta -= 6; 35948c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle } 35958c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle loge("WifiStateMachine shouldSwitchNetwork " 35968c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle + " txSuccessRate=" + String.format("%.2f", mWifiInfo.txSuccessRate) 35978c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle + " rxSuccessRate=" + String.format("%.2f", mWifiInfo.rxSuccessRate) 35988c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle + " delta " + networkDelta + " -> " + delta); 35994dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle } 36004dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle } else { 36014dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle loge("WifiStateMachine shouldSwitchNetwork " 36024dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle + " delta " + networkDelta + " -> " + delta); 36034dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle } 36044dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle if (delta > 0) { 36054dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle return true; 36064dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle } 36074dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle return false; 36084dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle } 360927355a942653264388e909a4276196ee63e57811vandwalle 3610ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle // Polling has completed, hence we wont have a score anymore 3611ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle private void cleanWifiScore() { 3612ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle mWifiInfo.txBadRate = 0; 3613ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle mWifiInfo.txSuccessRate = 0; 3614ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle mWifiInfo.txRetriesRate = 0; 3615ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle mWifiInfo.rxSuccessRate = 0; 3616ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle } 3617ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle 36187736c07a4cad4e2d86e1ec2f4221c7f788c18d3avandwalle int mBadLinkspeedcount = 0; 36197736c07a4cad4e2d86e1ec2f4221c7f788c18d3avandwalle 36207b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle // For debug, provide information about the last scoring operation 36217b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle String wifiScoringReport = null; 362227355a942653264388e909a4276196ee63e57811vandwalle private void calculateWifiScore(WifiLinkLayerStats stats) { 36237b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle StringBuilder sb = new StringBuilder(); 3624efad8ec6cb12e5658ee0288cc7e5aa755267aeb6vandwalle 36257b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle int score = 56; // Starting score, temporarily hardcoded in between 50 and 60 362627355a942653264388e909a4276196ee63e57811vandwalle boolean isBadLinkspeed = (mWifiInfo.is24GHz() 362717e828848eebb4eb11d27ce32d02716334dd6011vandwalle && mWifiInfo.getLinkSpeed() < mWifiConfigStore.badLinkSpeed24) 362817e828848eebb4eb11d27ce32d02716334dd6011vandwalle || (mWifiInfo.is5GHz() && mWifiInfo.getLinkSpeed() 362917e828848eebb4eb11d27ce32d02716334dd6011vandwalle < mWifiConfigStore.badLinkSpeed5); 363027355a942653264388e909a4276196ee63e57811vandwalle boolean isGoodLinkspeed = (mWifiInfo.is24GHz() 363117e828848eebb4eb11d27ce32d02716334dd6011vandwalle && mWifiInfo.getLinkSpeed() >= mWifiConfigStore.goodLinkSpeed24) 363217e828848eebb4eb11d27ce32d02716334dd6011vandwalle || (mWifiInfo.is5GHz() && mWifiInfo.getLinkSpeed() 363317e828848eebb4eb11d27ce32d02716334dd6011vandwalle >= mWifiConfigStore.goodLinkSpeed5); 36344b50786546ce4c4fee555d66028991fe257b8811vandwalle 36357736c07a4cad4e2d86e1ec2f4221c7f788c18d3avandwalle if (isBadLinkspeed) { 36367736c07a4cad4e2d86e1ec2f4221c7f788c18d3avandwalle if (mBadLinkspeedcount < 6) 36377736c07a4cad4e2d86e1ec2f4221c7f788c18d3avandwalle mBadLinkspeedcount++; 36387736c07a4cad4e2d86e1ec2f4221c7f788c18d3avandwalle } else { 36397736c07a4cad4e2d86e1ec2f4221c7f788c18d3avandwalle if (mBadLinkspeedcount > 0) 36407736c07a4cad4e2d86e1ec2f4221c7f788c18d3avandwalle mBadLinkspeedcount--; 36417736c07a4cad4e2d86e1ec2f4221c7f788c18d3avandwalle } 36427736c07a4cad4e2d86e1ec2f4221c7f788c18d3avandwalle 36437736c07a4cad4e2d86e1ec2f4221c7f788c18d3avandwalle if (isBadLinkspeed) sb.append(" bl(").append(mBadLinkspeedcount).append(")"); 36447b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle if (isGoodLinkspeed) sb.append(" gl"); 36457b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle 3646931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle /** 3647a5283c01ac413e378e2261050cac3a6d6e9cf385vandwalle * We want to make sure that we use the 24GHz RSSI thresholds if 3648931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle * there are 2.4GHz scan results 3649931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle * otherwise we end up lowering the score based on 5GHz values 3650931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle * which may cause a switch to LTE before roaming has a chance to try 2.4GHz 3651931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle * We also might unblacklist the configuation based on 2.4GHz 3652931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle * thresholds but joining 5GHz anyhow, and failing over to 2.4GHz because 5GHz is not good 3653931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle */ 36544b50786546ce4c4fee555d66028991fe257b8811vandwalle boolean use24Thresholds = false; 36554b50786546ce4c4fee555d66028991fe257b8811vandwalle boolean homeNetworkBoost = false; 36564b50786546ce4c4fee555d66028991fe257b8811vandwalle WifiConfiguration currentConfiguration = getCurrentWifiConfiguration(); 36574b50786546ce4c4fee555d66028991fe257b8811vandwalle if (currentConfiguration != null 36584b50786546ce4c4fee555d66028991fe257b8811vandwalle && currentConfiguration.scanResultCache != null) { 36594b50786546ce4c4fee555d66028991fe257b8811vandwalle currentConfiguration.setVisibility(12000); 36604b50786546ce4c4fee555d66028991fe257b8811vandwalle if (currentConfiguration.visibility != null) { 36614b50786546ce4c4fee555d66028991fe257b8811vandwalle if (currentConfiguration.visibility.rssi24 != WifiConfiguration.INVALID_RSSI 36624b50786546ce4c4fee555d66028991fe257b8811vandwalle && currentConfiguration.visibility.rssi24 36634b50786546ce4c4fee555d66028991fe257b8811vandwalle >= (currentConfiguration.visibility.rssi5-2)) { 36644b50786546ce4c4fee555d66028991fe257b8811vandwalle use24Thresholds = true; 36654b50786546ce4c4fee555d66028991fe257b8811vandwalle } 36664b50786546ce4c4fee555d66028991fe257b8811vandwalle } 3667ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle if (currentConfiguration.scanResultCache.size() <= 6 36684b50786546ce4c4fee555d66028991fe257b8811vandwalle && currentConfiguration.allowedKeyManagement.cardinality() == 1 36694b50786546ce4c4fee555d66028991fe257b8811vandwalle && currentConfiguration.allowedKeyManagement. 36704b50786546ce4c4fee555d66028991fe257b8811vandwalle get(WifiConfiguration.KeyMgmt.WPA_PSK) == true) { 3671ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle // A PSK network with less than 6 known BSSIDs 3672931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle // This is most likely a home network and thus we want to stick to wifi more 36734b50786546ce4c4fee555d66028991fe257b8811vandwalle homeNetworkBoost = true; 36744b50786546ce4c4fee555d66028991fe257b8811vandwalle } 36754b50786546ce4c4fee555d66028991fe257b8811vandwalle } 36767b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle if (homeNetworkBoost) sb.append(" hn"); 36777b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle if (use24Thresholds) sb.append(" u24"); 36784b50786546ce4c4fee555d66028991fe257b8811vandwalle 36794b50786546ce4c4fee555d66028991fe257b8811vandwalle int rssi = mWifiInfo.getRssi() - 6 * mAggressiveHandover 36804b50786546ce4c4fee555d66028991fe257b8811vandwalle + (homeNetworkBoost ? WifiConfiguration.HOME_NETWORK_RSSI_BOOST : 0); 36817b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle sb.append(String.format(" rssi=%d ag=%d", rssi, mAggressiveHandover)); 36827b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle 36834b50786546ce4c4fee555d66028991fe257b8811vandwalle boolean is24GHz = use24Thresholds || mWifiInfo.is24GHz(); 36844b50786546ce4c4fee555d66028991fe257b8811vandwalle 36858c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle boolean isBadRSSI = (is24GHz && rssi < mWifiConfigStore.thresholdBadRssi24) 36868c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle || (!is24GHz && rssi < mWifiConfigStore.thresholdBadRssi5); 36878c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle boolean isLowRSSI = (is24GHz && rssi < mWifiConfigStore.thresholdLowRssi24) 36888c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle || (!is24GHz && mWifiInfo.getRssi() < mWifiConfigStore.thresholdLowRssi5); 36898c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle boolean isHighRSSI = (is24GHz && rssi >= mWifiConfigStore.thresholdGoodRssi24) 36908c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle || (!is24GHz && mWifiInfo.getRssi() >= mWifiConfigStore.thresholdGoodRssi5); 369127355a942653264388e909a4276196ee63e57811vandwalle 36927b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle if (isBadRSSI) sb.append(" br"); 36937b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle if (isLowRSSI) sb.append(" lr"); 36947b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle if (isHighRSSI) sb.append(" hr"); 36957b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle 36960eebae7334d6129f7ca1344e4b20199794994358vandwalle int penalizedDueToUserTriggeredDisconnect = 0; // For debug information 36979f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle if (currentConfiguration!= null && 36987b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle (mWifiInfo.txSuccessRate > 5 || mWifiInfo.rxSuccessRate > 5)) { 36999f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle if (isBadRSSI) { 37009f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle currentConfiguration.numTicksAtBadRSSI++; 37019f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle if (currentConfiguration.numTicksAtBadRSSI > 1000) { 37029f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle // We remained associated for a compound amount of time while passing 37039f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle // traffic, hence loose the corresponding user triggered disabled stats 37049f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle if (currentConfiguration.numUserTriggeredWifiDisableBadRSSI > 0) { 37059f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle currentConfiguration.numUserTriggeredWifiDisableBadRSSI--; 37069f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle } 37079f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle if (currentConfiguration.numUserTriggeredWifiDisableLowRSSI > 0) { 37089f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle currentConfiguration.numUserTriggeredWifiDisableLowRSSI--; 37099f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle } 37109f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle if (currentConfiguration.numUserTriggeredWifiDisableNotHighRSSI > 0) { 37119f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle currentConfiguration.numUserTriggeredWifiDisableNotHighRSSI--; 37129f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle } 37139f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle currentConfiguration.numTicksAtBadRSSI = 0; 37149f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle } 371517e828848eebb4eb11d27ce32d02716334dd6011vandwalle if (mWifiConfigStore.enableWifiCellularHandoverUserTriggeredAdjustment && 371617e828848eebb4eb11d27ce32d02716334dd6011vandwalle (currentConfiguration.numUserTriggeredWifiDisableBadRSSI > 0 37170eebae7334d6129f7ca1344e4b20199794994358vandwalle || currentConfiguration.numUserTriggeredWifiDisableLowRSSI > 0 371817e828848eebb4eb11d27ce32d02716334dd6011vandwalle || currentConfiguration.numUserTriggeredWifiDisableNotHighRSSI > 0)) { 37190eebae7334d6129f7ca1344e4b20199794994358vandwalle score = score -5; 37200eebae7334d6129f7ca1344e4b20199794994358vandwalle penalizedDueToUserTriggeredDisconnect = 1; 37217b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle sb.append(" p1"); 37220eebae7334d6129f7ca1344e4b20199794994358vandwalle } 37239f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle } else if (isLowRSSI) { 37249f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle currentConfiguration.numTicksAtLowRSSI++; 37259f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle if (currentConfiguration.numTicksAtLowRSSI > 1000) { 37269f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle // We remained associated for a compound amount of time while passing 37279f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle // traffic, hence loose the corresponding user triggered disabled stats 37289f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle if (currentConfiguration.numUserTriggeredWifiDisableLowRSSI > 0) { 37299f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle currentConfiguration.numUserTriggeredWifiDisableLowRSSI--; 37309f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle } 37319f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle if (currentConfiguration.numUserTriggeredWifiDisableNotHighRSSI > 0) { 37329f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle currentConfiguration.numUserTriggeredWifiDisableNotHighRSSI--; 37339f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle } 37349f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle currentConfiguration.numTicksAtLowRSSI = 0; 37359f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle } 373617e828848eebb4eb11d27ce32d02716334dd6011vandwalle if (mWifiConfigStore.enableWifiCellularHandoverUserTriggeredAdjustment && 373717e828848eebb4eb11d27ce32d02716334dd6011vandwalle (currentConfiguration.numUserTriggeredWifiDisableLowRSSI > 0 373817e828848eebb4eb11d27ce32d02716334dd6011vandwalle || currentConfiguration.numUserTriggeredWifiDisableNotHighRSSI > 0)) { 37390eebae7334d6129f7ca1344e4b20199794994358vandwalle score = score -5; 37400eebae7334d6129f7ca1344e4b20199794994358vandwalle penalizedDueToUserTriggeredDisconnect = 2; 37417b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle sb.append(" p2"); 37420eebae7334d6129f7ca1344e4b20199794994358vandwalle } 37439f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle } else if (!isHighRSSI) { 37449f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle currentConfiguration.numTicksAtNotHighRSSI++; 37459f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle if (currentConfiguration.numTicksAtNotHighRSSI > 1000) { 37469f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle // We remained associated for a compound amount of time while passing 37479f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle // traffic, hence loose the corresponding user triggered disabled stats 37489f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle if (currentConfiguration.numUserTriggeredWifiDisableNotHighRSSI > 0) { 37499f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle currentConfiguration.numUserTriggeredWifiDisableNotHighRSSI--; 37509f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle } 37519f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle currentConfiguration.numTicksAtNotHighRSSI = 0; 37529f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle } 375317e828848eebb4eb11d27ce32d02716334dd6011vandwalle if (mWifiConfigStore.enableWifiCellularHandoverUserTriggeredAdjustment && 375417e828848eebb4eb11d27ce32d02716334dd6011vandwalle currentConfiguration.numUserTriggeredWifiDisableNotHighRSSI > 0) { 37550eebae7334d6129f7ca1344e4b20199794994358vandwalle score = score -5; 37560eebae7334d6129f7ca1344e4b20199794994358vandwalle penalizedDueToUserTriggeredDisconnect = 3; 37577b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle sb.append(" p3"); 37580eebae7334d6129f7ca1344e4b20199794994358vandwalle } 37599f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle } 376070468b47454c8657e8963932f2e08a3f4d7e3881vandwalle sb.append(String.format(" ticks %d,%d,%d", currentConfiguration.numTicksAtBadRSSI, 376170468b47454c8657e8963932f2e08a3f4d7e3881vandwalle currentConfiguration.numTicksAtLowRSSI, 376270468b47454c8657e8963932f2e08a3f4d7e3881vandwalle currentConfiguration.numTicksAtNotHighRSSI)); 37639f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle } 37649f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle 37650eebae7334d6129f7ca1344e4b20199794994358vandwalle if (PDBG) { 37660eebae7334d6129f7ca1344e4b20199794994358vandwalle String rssiStatus = ""; 37670eebae7334d6129f7ca1344e4b20199794994358vandwalle if (isBadRSSI) rssiStatus += " badRSSI "; 37680eebae7334d6129f7ca1344e4b20199794994358vandwalle else if (isHighRSSI) rssiStatus += " highRSSI "; 37690eebae7334d6129f7ca1344e4b20199794994358vandwalle else if (isLowRSSI) rssiStatus += " lowRSSI "; 37700eebae7334d6129f7ca1344e4b20199794994358vandwalle if (isBadLinkspeed) rssiStatus += " lowSpeed "; 37710eebae7334d6129f7ca1344e4b20199794994358vandwalle loge("calculateWifiScore freq=" + Integer.toString(mWifiInfo.getFrequency()) 37720eebae7334d6129f7ca1344e4b20199794994358vandwalle + " speed=" + Integer.toString(mWifiInfo.getLinkSpeed()) 37730eebae7334d6129f7ca1344e4b20199794994358vandwalle + " score=" + Integer.toString(mWifiInfo.score) 37740eebae7334d6129f7ca1344e4b20199794994358vandwalle + rssiStatus 37750eebae7334d6129f7ca1344e4b20199794994358vandwalle + " -> txbadrate=" + String.format( "%.2f", mWifiInfo.txBadRate ) 37760eebae7334d6129f7ca1344e4b20199794994358vandwalle + " txgoodrate=" + String.format("%.2f", mWifiInfo.txSuccessRate) 37770eebae7334d6129f7ca1344e4b20199794994358vandwalle + " txretriesrate=" + String.format("%.2f", mWifiInfo.txRetriesRate) 37780eebae7334d6129f7ca1344e4b20199794994358vandwalle + " rxrate=" + String.format("%.2f", mWifiInfo.rxSuccessRate) 37790eebae7334d6129f7ca1344e4b20199794994358vandwalle + " userTriggerdPenalty" + penalizedDueToUserTriggeredDisconnect); 37800eebae7334d6129f7ca1344e4b20199794994358vandwalle } 37810eebae7334d6129f7ca1344e4b20199794994358vandwalle 3782c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle if ((mWifiInfo.txBadRate >= 1) && (mWifiInfo.txSuccessRate < 3) 3783c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle && (isBadRSSI || isLowRSSI)) { 3784931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle // Link is stuck 3785c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle if (mWifiInfo.linkStuckCount < 5) 3786c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle mWifiInfo.linkStuckCount += 1; 37877b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle sb.append(String.format(" ls+=%d", mWifiInfo.linkStuckCount)); 37884b50786546ce4c4fee555d66028991fe257b8811vandwalle if (PDBG) loge(" bad link -> stuck count =" 37894b50786546ce4c4fee555d66028991fe257b8811vandwalle + Integer.toString(mWifiInfo.linkStuckCount)); 3790c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle } else if (mWifiInfo.txSuccessRate > 2 || mWifiInfo.txBadRate < 0.1) { 3791c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle if (mWifiInfo.linkStuckCount > 0) 3792c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle mWifiInfo.linkStuckCount -= 1; 37937b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle sb.append(String.format(" ls-=%d", mWifiInfo.linkStuckCount)); 37944b50786546ce4c4fee555d66028991fe257b8811vandwalle if (PDBG) loge(" good link -> stuck count =" 37954b50786546ce4c4fee555d66028991fe257b8811vandwalle + Integer.toString(mWifiInfo.linkStuckCount)); 3796c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle } 3797c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle 37987b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle sb.append(String.format(" [%d", score)); 37997b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle 3800c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle if (mWifiInfo.linkStuckCount > 1) { 3801931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle // Once link gets stuck for more than 3 seconds, start reducing the score 3802c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle score = score - 2 * (mWifiInfo.linkStuckCount - 1); 380327355a942653264388e909a4276196ee63e57811vandwalle } 38047b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle sb.append(String.format(",%d", score)); 380527355a942653264388e909a4276196ee63e57811vandwalle 380627355a942653264388e909a4276196ee63e57811vandwalle if (isBadLinkspeed) { 3807a5283c01ac413e378e2261050cac3a6d6e9cf385vandwalle score -= 4 ; 38087736c07a4cad4e2d86e1ec2f4221c7f788c18d3avandwalle if (PDBG) { 38097736c07a4cad4e2d86e1ec2f4221c7f788c18d3avandwalle loge(" isBadLinkspeed ---> count=" + mBadLinkspeedcount 38107736c07a4cad4e2d86e1ec2f4221c7f788c18d3avandwalle + " score=" + Integer.toString(score)); 38117736c07a4cad4e2d86e1ec2f4221c7f788c18d3avandwalle } 381227355a942653264388e909a4276196ee63e57811vandwalle } else if ((isGoodLinkspeed) && (mWifiInfo.txSuccessRate > 5)) { 3813931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle score += 4; // So as bad rssi alone dont kill us 381427355a942653264388e909a4276196ee63e57811vandwalle } 38157b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle sb.append(String.format(",%d", score)); 381627355a942653264388e909a4276196ee63e57811vandwalle 381727355a942653264388e909a4276196ee63e57811vandwalle if (isBadRSSI) { 381827355a942653264388e909a4276196ee63e57811vandwalle if (mWifiInfo.badRssiCount < 7) 381927355a942653264388e909a4276196ee63e57811vandwalle mWifiInfo.badRssiCount += 1; 382027355a942653264388e909a4276196ee63e57811vandwalle } else if (isLowRSSI) { 38217b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle mWifiInfo.lowRssiCount = 1; // Dont increment the lowRssi count above 1 3822c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle if (mWifiInfo.badRssiCount > 0) { 38237b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle // Decrement bad Rssi count 3824c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle mWifiInfo.badRssiCount -= 1; 3825c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle } 382627355a942653264388e909a4276196ee63e57811vandwalle } else { 382727355a942653264388e909a4276196ee63e57811vandwalle mWifiInfo.badRssiCount = 0; 382827355a942653264388e909a4276196ee63e57811vandwalle mWifiInfo.lowRssiCount = 0; 382927355a942653264388e909a4276196ee63e57811vandwalle } 383027355a942653264388e909a4276196ee63e57811vandwalle 3831c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle score -= mWifiInfo.badRssiCount * 2 + mWifiInfo.lowRssiCount ; 38327b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle sb.append(String.format(",%d", score)); 383327355a942653264388e909a4276196ee63e57811vandwalle 383427355a942653264388e909a4276196ee63e57811vandwalle if (PDBG) loge(" badRSSI count" + Integer.toString(mWifiInfo.badRssiCount) 383527355a942653264388e909a4276196ee63e57811vandwalle + " lowRSSI count" + Integer.toString(mWifiInfo.lowRssiCount) 383627355a942653264388e909a4276196ee63e57811vandwalle + " --> score " + Integer.toString(score)); 383727355a942653264388e909a4276196ee63e57811vandwalle 383827355a942653264388e909a4276196ee63e57811vandwalle 383927355a942653264388e909a4276196ee63e57811vandwalle if (isHighRSSI) { 384027355a942653264388e909a4276196ee63e57811vandwalle score += 5; 384127355a942653264388e909a4276196ee63e57811vandwalle if (PDBG) loge(" isHighRSSI ---> score=" + Integer.toString(score)); 384227355a942653264388e909a4276196ee63e57811vandwalle } 38437b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle sb.append(String.format(",%d]", score)); 38447b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle 38457b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle sb.append(String.format(" brc=%d lrc=%d", mWifiInfo.badRssiCount, mWifiInfo.lowRssiCount)); 384627355a942653264388e909a4276196ee63e57811vandwalle 384727355a942653264388e909a4276196ee63e57811vandwalle //sanitize boundaries 384827355a942653264388e909a4276196ee63e57811vandwalle if (score > NetworkAgent.WIFI_BASE_SCORE) 384927355a942653264388e909a4276196ee63e57811vandwalle score = NetworkAgent.WIFI_BASE_SCORE; 385027355a942653264388e909a4276196ee63e57811vandwalle if (score < 0) 385127355a942653264388e909a4276196ee63e57811vandwalle score = 0; 385227355a942653264388e909a4276196ee63e57811vandwalle 385327355a942653264388e909a4276196ee63e57811vandwalle //report score 385427355a942653264388e909a4276196ee63e57811vandwalle if (score != mWifiInfo.score) { 385527355a942653264388e909a4276196ee63e57811vandwalle if (DBG) { 385627355a942653264388e909a4276196ee63e57811vandwalle loge("calculateWifiScore() report new score " + Integer.toString(score)); 385727355a942653264388e909a4276196ee63e57811vandwalle } 385827355a942653264388e909a4276196ee63e57811vandwalle mWifiInfo.score = score; 38596e51388c5b7d7840644570de5bc61edbd173b203vandwalle if (mNetworkAgent != null) { 38606e51388c5b7d7840644570de5bc61edbd173b203vandwalle mNetworkAgent.sendNetworkScore(score); 38616e51388c5b7d7840644570de5bc61edbd173b203vandwalle } 386227355a942653264388e909a4276196ee63e57811vandwalle } 38637b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle wifiScoringReport = sb.toString(); 386427355a942653264388e909a4276196ee63e57811vandwalle } 386527355a942653264388e909a4276196ee63e57811vandwalle 386627355a942653264388e909a4276196ee63e57811vandwalle public double getTxPacketRate() { 386727355a942653264388e909a4276196ee63e57811vandwalle if (mWifiInfo != null) { 386827355a942653264388e909a4276196ee63e57811vandwalle return mWifiInfo.txSuccessRate; 386927355a942653264388e909a4276196ee63e57811vandwalle } 387027355a942653264388e909a4276196ee63e57811vandwalle return -1; 387127355a942653264388e909a4276196ee63e57811vandwalle } 387227355a942653264388e909a4276196ee63e57811vandwalle 387327355a942653264388e909a4276196ee63e57811vandwalle public double getRxPacketRate() { 387427355a942653264388e909a4276196ee63e57811vandwalle if (mWifiInfo != null) { 387527355a942653264388e909a4276196ee63e57811vandwalle return mWifiInfo.rxSuccessRate; 387627355a942653264388e909a4276196ee63e57811vandwalle } 387727355a942653264388e909a4276196ee63e57811vandwalle return -1; 387827355a942653264388e909a4276196ee63e57811vandwalle } 387927355a942653264388e909a4276196ee63e57811vandwalle 3880931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle /** 3881155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Fetch TX packet counters on current connection 3882155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 3883155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private void fetchPktcntNative(RssiPacketCountInfo info) { 3884155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande String pktcntPoll = mWifiNative.pktcntPoll(); 3885155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 3886155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (pktcntPoll != null) { 3887155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande String[] lines = pktcntPoll.split("\n"); 3888155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande for (String line : lines) { 3889155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande String[] prop = line.split("="); 3890155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (prop.length < 2) continue; 3891155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande try { 3892155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (prop[0].equals("TXGOOD")) { 3893155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande info.txgood = Integer.parseInt(prop[1]); 3894155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else if (prop[0].equals("TXBAD")) { 3895155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande info.txbad = Integer.parseInt(prop[1]); 3896155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3897155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } catch (NumberFormatException e) { 3898931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle // Ignore 3899155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3900155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3901155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3902155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3903155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 39040ebd6d71cecb5147fad1ca7a7f807aec7ffeddd9Lorenzo Colitti private boolean clearIPv4Address(String iface) { 39050ebd6d71cecb5147fad1ca7a7f807aec7ffeddd9Lorenzo Colitti try { 39060ebd6d71cecb5147fad1ca7a7f807aec7ffeddd9Lorenzo Colitti InterfaceConfiguration ifcg = new InterfaceConfiguration(); 39070ebd6d71cecb5147fad1ca7a7f807aec7ffeddd9Lorenzo Colitti ifcg.setLinkAddress(new LinkAddress("0.0.0.0/0")); 39080ebd6d71cecb5147fad1ca7a7f807aec7ffeddd9Lorenzo Colitti mNwService.setInterfaceConfig(iface, ifcg); 39090ebd6d71cecb5147fad1ca7a7f807aec7ffeddd9Lorenzo Colitti return true; 39100ebd6d71cecb5147fad1ca7a7f807aec7ffeddd9Lorenzo Colitti } catch (RemoteException e) { 39110ebd6d71cecb5147fad1ca7a7f807aec7ffeddd9Lorenzo Colitti return false; 39120ebd6d71cecb5147fad1ca7a7f807aec7ffeddd9Lorenzo Colitti } 39130ebd6d71cecb5147fad1ca7a7f807aec7ffeddd9Lorenzo Colitti } 39140ebd6d71cecb5147fad1ca7a7f807aec7ffeddd9Lorenzo Colitti 3915badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti private boolean isProvisioned(LinkProperties lp) { 39166d66b5730446fa4df96c6dcda8612a64ed5bf383Erik Kline return lp.isProvisioned() || 39176d66b5730446fa4df96c6dcda8612a64ed5bf383Erik Kline (mWifiConfigStore.isUsingStaticIp(mLastNetworkId) && lp.hasIPv4Address()); 3918badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti } 3919badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti 3920155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 3921155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Updates mLinkProperties by merging information from various sources. 3922155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * 3923155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * This is needed because the information in mLinkProperties comes from multiple sources (DHCP, 3924155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * netlink, static configuration, ...). When one of these sources of information has updated 3925155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * link properties, we can't just assign them to mLinkProperties or we'd lose track of the 3926155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * information that came from other sources. Instead, when one of those sources has new 3927155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * information, we update the object that tracks the information from that source and then 3928155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * call this method to apply the change to mLinkProperties. 3929155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * 3930155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * The information in mLinkProperties is currently obtained as follows: 3931155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * - Interface name: set in the constructor. 3932d60cf2efc576f016506ebe6d8a83b4a6217b2e0eLorenzo Colitti * - IPv4 and IPv6 addresses: netlink, passed in by mNetlinkTracker. 3933155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * - IPv4 routes, DNS servers, and domains: DHCP. 3934a43d6d71ad51ce7fe54198d9b60d554208054eb8Lorenzo Colitti * - IPv6 routes and DNS servers: netlink, passed in by mNetlinkTracker. 3935155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * - HTTP proxy: the wifi config store. 3936155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 3937badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti private void updateLinkProperties(int reason) { 3938155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande LinkProperties newLp = new LinkProperties(); 3939155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 3940155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Interface name and proxy are locally configured. 3941155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande newLp.setInterfaceName(mInterfaceName); 3942155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande newLp.setHttpProxy(mWifiConfigStore.getProxyProperties(mLastNetworkId)); 3943155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 3944a43d6d71ad51ce7fe54198d9b60d554208054eb8Lorenzo Colitti // IPv4/v6 addresses, IPv6 routes and IPv6 DNS servers come from netlink. 3945ec474c010a79c12d24c34e79383b328cc53d5eceLorenzo Colitti LinkProperties netlinkLinkProperties = mNetlinkTracker.getLinkProperties(); 3946ec474c010a79c12d24c34e79383b328cc53d5eceLorenzo Colitti newLp.setLinkAddresses(netlinkLinkProperties.getLinkAddresses()); 3947c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle for (RouteInfo route : netlinkLinkProperties.getRoutes()) { 3948ec474c010a79c12d24c34e79383b328cc53d5eceLorenzo Colitti newLp.addRoute(route); 3949ec474c010a79c12d24c34e79383b328cc53d5eceLorenzo Colitti } 3950a43d6d71ad51ce7fe54198d9b60d554208054eb8Lorenzo Colitti for (InetAddress dns : netlinkLinkProperties.getDnsServers()) { 3951a43d6d71ad51ce7fe54198d9b60d554208054eb8Lorenzo Colitti newLp.addDnsServer(dns); 3952a43d6d71ad51ce7fe54198d9b60d554208054eb8Lorenzo Colitti } 3953155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 3954a43d6d71ad51ce7fe54198d9b60d554208054eb8Lorenzo Colitti // IPv4 routes, DNS servers and domains come from mDhcpResults. 3955155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande synchronized (mDhcpResultsLock) { 3956155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Even when we're using static configuration, we don't need to look at the config 3957155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // store, because static IP configuration also populates mDhcpResults. 39583b26801d62a06475b722bbf29cba7f48f376654eLorenzo Colitti if ((mDhcpResults != null)) { 39593b26801d62a06475b722bbf29cba7f48f376654eLorenzo Colitti for (RouteInfo route : mDhcpResults.getRoutes(mInterfaceName)) { 3960155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande newLp.addRoute(route); 3961155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 39623b26801d62a06475b722bbf29cba7f48f376654eLorenzo Colitti for (InetAddress dns : mDhcpResults.dnsServers) { 396382d1c6aeadfa24797b314ae2b2a55717df064b57Robert Greenwalt newLp.addDnsServer(dns); 3964155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 39653b26801d62a06475b722bbf29cba7f48f376654eLorenzo Colitti newLp.setDomains(mDhcpResults.domains); 3966155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3967155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3968155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 3969e0e491671f348cceb6e20fdc55438d8cfd2f07f1Robert Greenwalt final boolean linkChanged = !newLp.equals(mLinkProperties); 3970badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti final boolean wasProvisioned = isProvisioned(mLinkProperties); 3971badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti final boolean isProvisioned = isProvisioned(newLp); 3972e0e491671f348cceb6e20fdc55438d8cfd2f07f1Robert Greenwalt final DetailedState detailedState = getNetworkDetailedState(); 3973e0e491671f348cceb6e20fdc55438d8cfd2f07f1Robert Greenwalt 3974e0e491671f348cceb6e20fdc55438d8cfd2f07f1Robert Greenwalt if (linkChanged) { 3975155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (DBG) { 3976155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande log("Link configuration changed for netId: " + mLastNetworkId 3977badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti + " old: " + mLinkProperties + " new: " + newLp); 3978155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 3979155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mLinkProperties = newLp; 39803c3c5b64726f04920109e4c8f20a1c58ea7050aaRobert Greenwalt if (TextUtils.isEmpty(mTcpBufferSizes) == false) { 39813c3c5b64726f04920109e4c8f20a1c58ea7050aaRobert Greenwalt mLinkProperties.setTcpBufferSizes(mTcpBufferSizes); 39823c3c5b64726f04920109e4c8f20a1c58ea7050aaRobert Greenwalt } 39837d6e0b86655bf9862ae81fe37c9c8dc3f70d51f9Robert Greenwalt if (mNetworkAgent != null) mNetworkAgent.sendLinkProperties(mLinkProperties); 3984e0e491671f348cceb6e20fdc55438d8cfd2f07f1Robert Greenwalt } 398514be3cde626bd5935f599cd6e0fca72cf1c4695dLorenzo Colitti 3986c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle if (DBG) { 3987c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle StringBuilder sb = new StringBuilder(); 3988c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle sb.append("updateLinkProperties nid: " + mLastNetworkId); 3989c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle sb.append(" state: " + detailedState); 3990badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti sb.append(" reason: " + smToString(reason)); 3991c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle 3992c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle if (mLinkProperties != null) { 3993c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle if (mLinkProperties.hasIPv4Address()) { 3994c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle sb.append(" v4"); 3995c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle } 3996c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle if (mLinkProperties.hasGlobalIPv6Address()) { 3997c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle sb.append(" v6"); 3998c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle } 3999c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle if (mLinkProperties.hasIPv4DefaultRoute()) { 4000c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle sb.append(" v4r"); 4001c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle } 4002c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle if (mLinkProperties.hasIPv6DefaultRoute()) { 4003c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle sb.append(" v6r"); 4004c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle } 4005c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle if (mLinkProperties.hasIPv4DnsServer()) { 4006c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle sb.append(" v4dns"); 4007c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle } 4008c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle if (mLinkProperties.hasIPv6DnsServer()) { 4009c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle sb.append(" v6dns"); 4010c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle } 4011badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti if (isProvisioned) { 4012c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle sb.append(" isprov"); 4013c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle } 4014c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle } 4015c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle loge(sb.toString()); 4016c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle } 4017c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle 4018e0e491671f348cceb6e20fdc55438d8cfd2f07f1Robert Greenwalt // If we just configured or lost IP configuration, do the needful. 4019e0e491671f348cceb6e20fdc55438d8cfd2f07f1Robert Greenwalt // We don't just call handleSuccessfulIpConfiguration() or handleIpConfigurationLost() 4020e0e491671f348cceb6e20fdc55438d8cfd2f07f1Robert Greenwalt // here because those should only be called if we're attempting to connect or already 4021e0e491671f348cceb6e20fdc55438d8cfd2f07f1Robert Greenwalt // connected, whereas updateLinkProperties can be called at any time. 4022badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti switch (reason) { 4023badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti case DhcpStateMachine.DHCP_SUCCESS: 4024badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti case CMD_STATIC_IP_SUCCESS: 4025badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti // IPv4 provisioning succeded. Advance to connected state. 4026badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti sendMessage(CMD_IP_CONFIGURATION_SUCCESSFUL); 4027badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti if (!isProvisioned) { 4028badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti // Can never happen unless DHCP reports success but isProvisioned thinks the 4029badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti // resulting configuration is invalid (e.g., no IPv4 address, or the state in 4030badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti // mLinkProperties is out of sync with reality, or there's a bug in this code). 4031badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti // TODO: disconnect here instead. If our configuration is not usable, there's no 4032badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti // point in staying connected, and if mLinkProperties is out of sync with 4033badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti // reality, that will cause problems in the future. 4034badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti loge("IPv4 config succeeded, but not provisioned"); 4035badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti } 4036badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti break; 4037badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti 4038badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti case DhcpStateMachine.DHCP_FAILURE: 4039badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti // DHCP failed. If we're not already provisioned, give up and disconnect. 4040badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti // If we're already provisioned (e.g., IPv6-only network), stay connected. 4041badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti if (!isProvisioned) { 4042badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti sendMessage(CMD_IP_CONFIGURATION_LOST); 4043badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti } else { 4044badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti // DHCP failed, but we're provisioned (e.g., if we're on an IPv6-only network). 4045badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti sendMessage(CMD_IP_CONFIGURATION_SUCCESSFUL); 4046badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti 4047badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti // To be sure we don't get stuck with a non-working network if all we had is 4048badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti // IPv4, remove the IPv4 address from the interface (since we're using DHCP, 4049badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti // and DHCP failed). If we had an IPv4 address before, the deletion of the 4050badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti // address will cause a CMD_UPDATE_LINKPROPERTIES. If the IPv4 address was 4051badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti // necessary for provisioning, its deletion will cause us to disconnect. 4052badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti // 40530ebd6d71cecb5147fad1ca7a7f807aec7ffeddd9Lorenzo Colitti // This shouldn't be needed, because on an IPv4-only network a DHCP failure will 40540ebd6d71cecb5147fad1ca7a7f807aec7ffeddd9Lorenzo Colitti // have empty DhcpResults and thus empty LinkProperties, and isProvisioned will 40550ebd6d71cecb5147fad1ca7a7f807aec7ffeddd9Lorenzo Colitti // not return true if we're using DHCP and don't have an IPv4 default route. So 40560ebd6d71cecb5147fad1ca7a7f807aec7ffeddd9Lorenzo Colitti // for now it's only here for extra redundancy. However, it will increase 40570ebd6d71cecb5147fad1ca7a7f807aec7ffeddd9Lorenzo Colitti // robustness if we move to getting IPv4 routes from netlink as well. 40580ebd6d71cecb5147fad1ca7a7f807aec7ffeddd9Lorenzo Colitti loge("DHCP failure: provisioned, clearing IPv4 address."); 40590ebd6d71cecb5147fad1ca7a7f807aec7ffeddd9Lorenzo Colitti if (!clearIPv4Address(mInterfaceName)) { 4060badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti sendMessage(CMD_IP_CONFIGURATION_LOST); 4061badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti } 4062badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti } 4063badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti break; 4064badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti 4065badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti case CMD_STATIC_IP_FAILURE: 4066badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti // Static configuration was invalid, or an error occurred in applying it. Give up. 4067badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti sendMessage(CMD_IP_CONFIGURATION_LOST); 4068badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti break; 4069badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti 4070badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti case CMD_UPDATE_LINKPROPERTIES: 4071badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti // IP addresses, DNS servers, etc. changed. Act accordingly. 4072badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti if (wasProvisioned && !isProvisioned) { 4073badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti // We no longer have a usable network configuration. Disconnect. 4074badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti sendMessage(CMD_IP_CONFIGURATION_LOST); 4075badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti } else if (!wasProvisioned && isProvisioned) { 4076badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti // We have a usable IPv6-only config. Advance to connected state. 4077badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti sendMessage(CMD_IP_CONFIGURATION_SUCCESSFUL); 4078badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti } 4079badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti if (linkChanged && getNetworkDetailedState() == DetailedState.CONNECTED) { 4080badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti // If anything has changed and we're already connected, send out a notification. 4081badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti sendLinkConfigurationChangedBroadcast(); 4082badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti } 4083badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti break; 4084155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 4085155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 408614be3cde626bd5935f599cd6e0fca72cf1c4695dLorenzo Colitti 4087155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 4088155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Clears all our link properties. 4089155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 4090c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle private void clearLinkProperties() { 4091c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle // Clear the link properties obtained from DHCP and netlink. 4092c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle synchronized (mDhcpResultsLock) { 40933b26801d62a06475b722bbf29cba7f48f376654eLorenzo Colitti if (mDhcpResults != null) { 40943b26801d62a06475b722bbf29cba7f48f376654eLorenzo Colitti mDhcpResults.clear(); 4095c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle } 4096c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle } 4097c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle mNetlinkTracker.clearLinkProperties(); 4098f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 4099c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle // Now clear the merged link properties. 4100c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle mLinkProperties.clear(); 4101c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle if (mNetworkAgent != null) mNetworkAgent.sendLinkProperties(mLinkProperties); 4102c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle } 4103155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 4104f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle /** 4105f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle * try to update default route MAC address. 4106f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle */ 4107f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle private String updateDefaultRouteMacAddress(int timeout) { 4108c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle String address = null; 4109c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle for (RouteInfo route : mLinkProperties.getRoutes()) { 4110c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle if (route.isDefaultRoute() && route.hasGateway()) { 4111c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle InetAddress gateway = route.getGateway(); 4112c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle if (gateway instanceof Inet4Address) { 4113c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle if (PDBG) { 4114c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle loge("updateDefaultRouteMacAddress found Ipv4 default :" 4115c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle + gateway.getHostAddress()); 4116c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle } 4117c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle address = macAddressFromRoute(gateway.getHostAddress()); 4118931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle /* The gateway's MAC address is known */ 4119c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle if ((address == null) && (timeout > 0)) { 4120c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle boolean reachable = false; 4121c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle try { 4122c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle reachable = gateway.isReachable(timeout); 4123c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle } catch (Exception e) { 4124c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle loge("updateDefaultRouteMacAddress exception reaching :" 4125c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle + gateway.getHostAddress()); 4126c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle 4127c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle } finally { 4128c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle if (reachable == true) { 4129c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle 4130c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle address = macAddressFromRoute(gateway.getHostAddress()); 4131c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle if (PDBG) { 4132c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle loge("updateDefaultRouteMacAddress reachable (tried again) :" 4133c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle + gateway.getHostAddress() + " found " + address); 4134c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle } 4135c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle } 4136c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle } 4137c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle } 4138c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle if (address != null) { 4139c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle mWifiConfigStore.setDefaultGwMacAddress(mLastNetworkId, address); 4140c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle } 4141c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle } 4142c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle } 4143c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle } 4144c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle return address; 4145f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle } 4146155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 4147155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private void sendScanResultsAvailableBroadcast() { 4148155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Intent intent = new Intent(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION); 4149155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); 4150155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mContext.sendBroadcastAsUser(intent, UserHandle.ALL); 4151155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 4152155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 4153155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private void sendRssiChangeBroadcast(final int newRssi) { 415451991e784c605a7432a90c9e9a91b080fb106197Dianne Hackborn try { 415551991e784c605a7432a90c9e9a91b080fb106197Dianne Hackborn mBatteryStats.noteWifiRssiChanged(newRssi); 415651991e784c605a7432a90c9e9a91b080fb106197Dianne Hackborn } catch (RemoteException e) { 415751991e784c605a7432a90c9e9a91b080fb106197Dianne Hackborn // Won't happen. 415851991e784c605a7432a90c9e9a91b080fb106197Dianne Hackborn } 4159155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Intent intent = new Intent(WifiManager.RSSI_CHANGED_ACTION); 4160155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); 4161155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande intent.putExtra(WifiManager.EXTRA_NEW_RSSI, newRssi); 4162155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL); 4163155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 4164155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 4165155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private void sendNetworkStateChangeBroadcast(String bssid) { 4166155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Intent intent = new Intent(WifiManager.NETWORK_STATE_CHANGED_ACTION); 4167155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); 4168155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande intent.putExtra(WifiManager.EXTRA_NETWORK_INFO, new NetworkInfo(mNetworkInfo)); 4169155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande intent.putExtra(WifiManager.EXTRA_LINK_PROPERTIES, new LinkProperties (mLinkProperties)); 4170155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (bssid != null) 4171155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande intent.putExtra(WifiManager.EXTRA_BSSID, bssid); 4172155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mNetworkInfo.getDetailedState() == DetailedState.VERIFYING_POOR_LINK || 4173155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mNetworkInfo.getDetailedState() == DetailedState.CONNECTED) { 4174155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande intent.putExtra(WifiManager.EXTRA_WIFI_INFO, new WifiInfo(mWifiInfo)); 4175155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 4176155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL); 4177155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 4178155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 4179155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private void sendLinkConfigurationChangedBroadcast() { 4180155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Intent intent = new Intent(WifiManager.LINK_CONFIGURATION_CHANGED_ACTION); 4181155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); 4182155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande intent.putExtra(WifiManager.EXTRA_LINK_PROPERTIES, new LinkProperties(mLinkProperties)); 4183155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mContext.sendBroadcastAsUser(intent, UserHandle.ALL); 4184155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 4185155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 4186155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private void sendSupplicantConnectionChangedBroadcast(boolean connected) { 4187155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Intent intent = new Intent(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION); 4188155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); 4189155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande intent.putExtra(WifiManager.EXTRA_SUPPLICANT_CONNECTED, connected); 4190155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mContext.sendBroadcastAsUser(intent, UserHandle.ALL); 4191155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 4192155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 4193155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 4194155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Record the detailed state of a network. 4195155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * @param state the new {@code DetailedState} 4196155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 41979f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle private boolean setNetworkDetailedState(NetworkInfo.DetailedState state) { 41987806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle boolean hidden = false; 41997806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle 42007806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle if (linkDebouncing || isRoaming()) { 42017806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle // There is generally a confusion in the system about colluding 42027806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle // WiFi Layer 2 state (as reported by supplicant) and the Network state 42037806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle // which leads to multiple confusion. 42047806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle // 42057806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle // If link is de-bouncing or roaming, we already have an IP address 42067806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle // as well we were connected and are doing L2 cycles of 42077806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle // reconnecting or renewing IP address to check that we still have it 42087806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle // This L2 link flapping should ne be reflected into the Network state 42097806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle // which is the state of the WiFi Network visible to Layer 3 and applications 42107806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle // Note that once debouncing and roaming are completed, we will 42117806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle // set the Network state to where it should be, or leave it as unchanged 42127806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle // 42137806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle hidden = true; 42147806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle } 4215155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (DBG) { 4216155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande log("setDetailed state, old =" 42177806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle + mNetworkInfo.getDetailedState() + " and new state=" + state 42187806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle + " hidden=" + hidden); 4219155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 42209f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle if (mNetworkInfo.getExtraInfo() != null && mWifiInfo.getSSID() != null) { 42219f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle // Always indicate that SSID has changed 42229f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle if (!mNetworkInfo.getExtraInfo().equals(mWifiInfo.getSSID())) { 42239f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle if (DBG) { 42249f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle log("setDetailed state send new extra info" + mWifiInfo.getSSID()); 42259f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle } 42269f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle mNetworkInfo.setExtraInfo(mWifiInfo.getSSID()); 42279f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle sendNetworkStateChangeBroadcast(null); 42289f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle } 42299f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle } 42309f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle if (hidden == true) { 42319f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle return false; 42329f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle } 4233155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 4234155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (state != mNetworkInfo.getDetailedState()) { 4235155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mNetworkInfo.setDetailedState(state, null, mWifiInfo.getSSID()); 42364dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle if (mNetworkAgent != null) { 42379f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle mNetworkAgent.sendNetworkInfo(mNetworkInfo); 42384dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle } 42399f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle sendNetworkStateChangeBroadcast(null); 42409f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle return true; 4241155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 42429f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle return false; 4243155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 4244155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 4245155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private DetailedState getNetworkDetailedState() { 4246155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return mNetworkInfo.getDetailedState(); 4247155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 4248155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 4249155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 4250155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private SupplicantState handleSupplicantStateChange(Message message) { 4251155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande StateChangeResult stateChangeResult = (StateChangeResult) message.obj; 4252155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande SupplicantState state = stateChangeResult.state; 4253155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Supplicant state change 4254155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // [31-13] Reserved for future use 4255155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // [8 - 0] Supplicant state (as defined in SupplicantState.java) 4256155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // 50023 supplicant_state_changed (custom|1|5) 4257155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiInfo.setSupplicantState(state); 4258155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Network id is only valid when we start connecting 4259155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (SupplicantState.isConnecting(state)) { 4260155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiInfo.setNetworkId(stateChangeResult.networkId); 4261155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 4262155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiInfo.setNetworkId(WifiConfiguration.INVALID_NETWORK_ID); 4263155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 4264155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 4265155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiInfo.setBSSID(stateChangeResult.BSSID); 4266155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiInfo.setSSID(stateChangeResult.wifiSsid); 4267155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 4268155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mSupplicantStateTracker.sendMessage(Message.obtain(message)); 4269155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 4270155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return state; 4271155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 4272155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 4273155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 4274155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Resets the Wi-Fi Connections by clearing any state, resetting any sockets 4275155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * using the interface, stopping DHCP & disabling interface 4276155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 4277155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private void handleNetworkDisconnect() { 42784dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle if (DBG) log("handleNetworkDisconnect: Stopping DHCP and clearing IP" 42794dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle + " stack:" + Thread.currentThread().getStackTrace()[2].getMethodName() 42804dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle +" - "+ Thread.currentThread().getStackTrace()[3].getMethodName() 42814dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle +" - "+ Thread.currentThread().getStackTrace()[4].getMethodName() 42824dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle +" - "+ Thread.currentThread().getStackTrace()[5].getMethodName()); 4283155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 42842f2cf21662275a0e93d7d7a6ad3d98b4c596dcf0vandwalle 42859f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle clearCurrentConfigBSSID("handleNetworkDisconnect"); 42869f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle 4287155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande stopDhcp(); 4288155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 4289155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande try { 4290155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mNwService.clearInterfaceAddresses(mInterfaceName); 4291155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mNwService.disableIpv6(mInterfaceName); 4292155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } catch (Exception e) { 4293155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("Failed to clear addresses or disable ipv6" + e); 4294155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 4295155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 4296155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Reset data structures */ 42977736c07a4cad4e2d86e1ec2f4221c7f788c18d3avandwalle mBadLinkspeedcount = 0; 42984dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle mWifiInfo.reset(); 42997806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle linkDebouncing = false; 43007806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle /* Reset roaming parameters */ 43017806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle mAutoRoaming = WifiAutoJoinController.AUTO_JOIN_IDLE; 43028242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle 43038242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle /** 43048242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle * fullBandConnectedTimeIntervalMilli: 43058242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle * - start scans at mWifiConfigStore.associatedPartialScanPeriodMilli seconds interval 43068242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle * - exponentially increase to mWifiConfigStore.associatedFullScanMaxIntervalMilli 43078242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle * Initialize to sane value = 20 seconds 43088242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle */ 43098242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle fullBandConnectedTimeIntervalMilli = 20 * 1000; 4310155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 4311155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande setNetworkDetailedState(DetailedState.DISCONNECTED); 43127d6e0b86655bf9862ae81fe37c9c8dc3f70d51f9Robert Greenwalt if (mNetworkAgent != null) { 43137d6e0b86655bf9862ae81fe37c9c8dc3f70d51f9Robert Greenwalt mNetworkAgent.sendNetworkInfo(mNetworkInfo); 43147d6e0b86655bf9862ae81fe37c9c8dc3f70d51f9Robert Greenwalt mNetworkAgent = null; 43157d6e0b86655bf9862ae81fe37c9c8dc3f70d51f9Robert Greenwalt } 4316155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiConfigStore.updateStatus(mLastNetworkId, DetailedState.DISCONNECTED); 4317155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 4318155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Clear network properties */ 4319155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande clearLinkProperties(); 4320155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 4321931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle /* Cend event to CM & network change broadcast */ 4322155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendNetworkStateChangeBroadcast(mLastBssid); 4323155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 4324931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle /* Cancel auto roam requests */ 4325b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle autoRoamSetBSSID(mLastNetworkId, "any"); 4326b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle 4327155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mLastBssid= null; 43284dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle registerDisconnected(); 4329155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mLastNetworkId = WifiConfiguration.INVALID_NETWORK_ID; 4330155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 4331155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 4332155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private void handleSupplicantConnectionLoss() { 4333155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Socket connection can be lost when we do a graceful shutdown 4334155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * or when the driver is hung. Ensure supplicant is stopped here. 4335155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 4336155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiMonitor.killSupplicant(mP2pSupported); 4337ae0b5cce21686ad00fd0a3d5aab35fe2152c4737Vinit Deshapnde mWifiNative.closeSupplicantConnection(); 4338155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendSupplicantConnectionChangedBroadcast(false); 4339155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande setWifiState(WIFI_STATE_DISABLED); 4340155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 4341155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 4342155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande void handlePreDhcpSetup() { 4343155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mDhcpActive = true; 4344155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (!mBluetoothConnectionActive) { 4345155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* 4346155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * There are problems setting the Wi-Fi driver's power 4347155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * mode to active when bluetooth coexistence mode is 4348155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * enabled or sense. 4349155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * <p> 4350155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * We set Wi-Fi to active mode when 4351155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * obtaining an IP address because we've found 4352155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * compatibility issues with some routers with low power 4353155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * mode. 4354155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * <p> 4355155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * In order for this active power mode to properly be set, 4356155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * we disable coexistence mode until we're done with 4357155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * obtaining an IP address. One exception is if we 4358155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * are currently connected to a headset, since disabling 4359155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * coexistence would interrupt that connection. 4360155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 4361155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Disable the coexistence mode 4362155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiNative.setBluetoothCoexistenceMode( 4363155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiNative.BLUETOOTH_COEXISTENCE_MODE_DISABLED); 4364155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 4365155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 4366931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle // Disable power save and suspend optimizations during DHCP 4367155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Note: The order here is important for now. Brcm driver changes 4368155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // power settings when we control suspend mode optimizations. 4369155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // TODO: Remove this comment when the driver is fixed. 4370155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande setSuspendOptimizationsNative(SUSPEND_DUE_TO_DHCP, false); 4371155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiNative.setPowerSave(false); 4372155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 4373155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande stopBatchedScan(); 4374b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande WifiNative.pauseScan(); 4375155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 4376efad8ec6cb12e5658ee0288cc7e5aa755267aeb6vandwalle // Update link layer stats 4377efad8ec6cb12e5658ee0288cc7e5aa755267aeb6vandwalle getWifiLinkLayerStats(false); 4378efad8ec6cb12e5658ee0288cc7e5aa755267aeb6vandwalle 4379155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* P2p discovery breaks dhcp, shut it down in order to get through this */ 4380155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Message msg = new Message(); 4381155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande msg.what = WifiP2pServiceImpl.BLOCK_DISCOVERY; 4382155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande msg.arg1 = WifiP2pServiceImpl.ENABLED; 4383155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande msg.arg2 = DhcpStateMachine.CMD_PRE_DHCP_ACTION_COMPLETE; 4384155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande msg.obj = mDhcpStateMachine; 4385155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiP2pChannel.sendMessage(msg); 4386155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 4387155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 4388155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 4389155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande void startDhcp() { 4390155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mDhcpStateMachine == null) { 4391155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mDhcpStateMachine = DhcpStateMachine.makeDhcpStateMachine( 4392155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mContext, WifiStateMachine.this, mInterfaceName); 4393155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 4394155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 4395155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mDhcpStateMachine.registerForPreDhcpNotification(); 4396155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mDhcpStateMachine.sendMessage(DhcpStateMachine.CMD_START_DHCP); 4397155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 4398155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 43994dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle void renewDhcp() { 44004dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle if (mDhcpStateMachine == null) { 44014dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle mDhcpStateMachine = DhcpStateMachine.makeDhcpStateMachine( 44024dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle mContext, WifiStateMachine.this, mInterfaceName); 44034dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle 44044dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle } 44054dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle mDhcpStateMachine.registerForPreDhcpNotification(); 44064dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle mDhcpStateMachine.sendMessage(DhcpStateMachine.CMD_RENEW_DHCP); 44074dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle } 44084dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle 4409155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande void stopDhcp() { 4410155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mDhcpStateMachine != null) { 4411155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* In case we were in middle of DHCP operation restore back powermode */ 4412155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande handlePostDhcpSetup(); 4413155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mDhcpStateMachine.sendMessage(DhcpStateMachine.CMD_STOP_DHCP); 4414155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 4415155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 4416155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 4417155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande void handlePostDhcpSetup() { 4418155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Restore power save and suspend optimizations */ 4419155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande setSuspendOptimizationsNative(SUSPEND_DUE_TO_DHCP, true); 4420155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiNative.setPowerSave(true); 4421155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 4422155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiP2pChannel.sendMessage(WifiP2pServiceImpl.BLOCK_DISCOVERY, WifiP2pServiceImpl.DISABLED); 4423155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 4424155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Set the coexistence mode back to its default value 4425155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiNative.setBluetoothCoexistenceMode( 4426155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiNative.BLUETOOTH_COEXISTENCE_MODE_SENSE); 4427155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 4428155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mDhcpActive = false; 4429155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 4430155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande startBatchedScan(); 4431b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande WifiNative.restartScan(); 4432155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 4433155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 4434badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti private void handleIPv4Success(DhcpResults dhcpResults, int reason) { 4435f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 4436f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle if (PDBG) { 44373b26801d62a06475b722bbf29cba7f48f376654eLorenzo Colitti loge("wifistatemachine handleIPv4Success <" + dhcpResults.toString() + ">"); 44383b26801d62a06475b722bbf29cba7f48f376654eLorenzo Colitti loge("link address " + dhcpResults.ipAddress); 4439f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle } 4440f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 4441155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande synchronized (mDhcpResultsLock) { 4442155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mDhcpResults = dhcpResults; 4443155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 44444dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle 44453b26801d62a06475b722bbf29cba7f48f376654eLorenzo Colitti Inet4Address addr = (Inet4Address) dhcpResults.ipAddress.getAddress(); 4446b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle if (isRoaming()) { 44474dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle if (addr instanceof Inet4Address) { 44484dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle int previousAddress = mWifiInfo.getIpAddress(); 44493b26801d62a06475b722bbf29cba7f48f376654eLorenzo Colitti int newAddress = NetworkUtils.inetAddressToInt(addr); 44504dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle if (previousAddress != newAddress) { 445114be3cde626bd5935f599cd6e0fca72cf1c4695dLorenzo Colitti loge("handleIPv4Success, roaming and address changed" + 44524dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle mWifiInfo + " got: " + addr); 44534dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle } else { 44544dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle 44554dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle } 44564dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle } else { 445714be3cde626bd5935f599cd6e0fca72cf1c4695dLorenzo Colitti loge("handleIPv4Success, roaming and didnt get an IPv4 address" + 44584dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle addr.toString()); 44594dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle } 44604dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle } 4461155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiInfo.setInetAddress(addr); 4462155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiInfo.setMeteredHint(dhcpResults.hasMeteredHint()); 4463badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti updateLinkProperties(reason); 4464155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 4465155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 446614be3cde626bd5935f599cd6e0fca72cf1c4695dLorenzo Colitti private void handleSuccessfulIpConfiguration() { 4467931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle mLastSignalLevel = -1; // Force update of signal strength 4468c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle WifiConfiguration c = getCurrentWifiConfiguration(); 4469c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle if (c != null) { 44708639f6266cb70bf92d1561af43ac2d7b2b97298eJeff Davidson // Reset IP failure tracking 4471c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle c.numConnectionFailures = 0; 44728639f6266cb70bf92d1561af43ac2d7b2b97298eJeff Davidson 44738639f6266cb70bf92d1561af43ac2d7b2b97298eJeff Davidson // Tell the framework whether the newly connected network is trusted or untrusted. 44743aed1e5a7a7f2ec730c393e2c7d129e3e551a711Jeff Davidson updateCapabilities(c); 4475c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle } 4476e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle if (c != null) { 4477e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle ScanResult result = getCurrentScanResult(); 4478e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle if (result == null) { 4479e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle loge("WifiStateMachine: handleSuccessfulIpConfiguration and no scan results" + 4480e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle c.configKey()); 4481e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle } else { 4482e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle // Clear the per BSSID failure count 4483e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle result.numIpConfigFailures = 0; 4484e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle // Clear the WHOLE BSSID blacklist, which means supplicant is free to retry 4485e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle // any BSSID, even though it may already have a non zero ip failure count, 4486e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle // this will typically happen if the user walks away and come back to his arrea 4487e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle // TODO: implement blacklisting based on a timer, i.e. keep BSSID blacklisted 4488e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle // in supplicant for a couple of hours or a day 4489a5283c01ac413e378e2261050cac3a6d6e9cf385vandwalle mWifiNative.clearBlacklist(); 4490e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle } 4491e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle } 449214be3cde626bd5935f599cd6e0fca72cf1c4695dLorenzo Colitti } 4493155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 4494badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti private void handleIPv4Failure(int reason) { 449514be3cde626bd5935f599cd6e0fca72cf1c4695dLorenzo Colitti synchronized(mDhcpResultsLock) { 44963b26801d62a06475b722bbf29cba7f48f376654eLorenzo Colitti if (mDhcpResults != null) { 44973b26801d62a06475b722bbf29cba7f48f376654eLorenzo Colitti mDhcpResults.clear(); 449814be3cde626bd5935f599cd6e0fca72cf1c4695dLorenzo Colitti } 449914be3cde626bd5935f599cd6e0fca72cf1c4695dLorenzo Colitti } 4500c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle if (PDBG) { 4501c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle loge("wifistatemachine handleIPv4Failure"); 4502c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle } 4503badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti updateLinkProperties(reason); 450414be3cde626bd5935f599cd6e0fca72cf1c4695dLorenzo Colitti } 450514be3cde626bd5935f599cd6e0fca72cf1c4695dLorenzo Colitti 450614be3cde626bd5935f599cd6e0fca72cf1c4695dLorenzo Colitti private void handleIpConfigurationLost() { 4507155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiInfo.setInetAddress(null); 4508155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiInfo.setMeteredHint(false); 4509c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle 4510e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle mWifiConfigStore.handleSSIDStateChange(mLastNetworkId, false, 4511e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle "DHCP FAILURE", mWifiInfo.getBSSID()); 4512155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 4513155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* DHCP times out after about 30 seconds, we do a 4514c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle * disconnect thru supplicant, we will let autojoin retry connecting to the network 4515155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 4516155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiNative.disconnect(); 4517155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 4518155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 4519155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Current design is to not set the config on a running hostapd but instead 4520155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * stop and start tethering when user changes config on a running access point 4521155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * 4522155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * TODO: Add control channel setup through hostapd that allows changing config 4523155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * on a running daemon 4524155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 4525155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private void startSoftApWithConfig(final WifiConfiguration config) { 4526931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle // Start hostapd on a separate thread 4527155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande new Thread(new Runnable() { 4528155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public void run() { 4529155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande try { 4530155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mNwService.startAccessPoint(config, mInterfaceName); 4531155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } catch (Exception e) { 4532155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("Exception in softap start " + e); 4533155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande try { 4534155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mNwService.stopAccessPoint(mInterfaceName); 4535155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mNwService.startAccessPoint(config, mInterfaceName); 4536155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } catch (Exception e1) { 4537155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("Exception in softap re-start " + e1); 4538155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendMessage(CMD_START_AP_FAILURE); 4539155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return; 4540155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 4541155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 4542155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (DBG) log("Soft AP start successful"); 4543155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendMessage(CMD_START_AP_SUCCESS); 4544155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 4545155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande }).start(); 4546155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 4547155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 4548f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle /* 4549f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle * Read a MAC address in /proc/arp/table, used by WifistateMachine 4550f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle * so as to record MAC address of default gateway. 4551f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle **/ 4552f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle private String macAddressFromRoute(String ipAddress) { 4553f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle String macAddress = null; 4554f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle BufferedReader reader = null; 4555f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle try { 4556f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle reader = new BufferedReader(new FileReader("/proc/net/arp")); 4557f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 4558f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle // Skip over the line bearing colum titles 4559f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle String line = reader.readLine(); 4560f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 4561f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle while ((line = reader.readLine()) != null) { 4562f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle String[] tokens = line.split("[ ]+"); 4563f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle if (tokens.length < 6) { 4564f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle continue; 4565f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle } 4566f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 4567f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle // ARP column format is 4568f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle // Address HWType HWAddress Flags Mask IFace 4569f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle String ip = tokens[0]; 4570f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle String mac = tokens[3]; 4571f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 4572f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle if (ipAddress.equals(ip)) { 4573f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle macAddress = mac; 4574f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 4575f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle } 4576f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle } 4577f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 4578f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle if (macAddress == null) { 4579f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle loge("Did not find remoteAddress {" + ipAddress + "} in " + 4580f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle "/proc/net/arp"); 4581f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle } 4582f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 4583f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle } catch (FileNotFoundException e) { 4584f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle loge("Could not open /proc/net/arp to lookup mac address"); 4585f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle } catch (IOException e) { 4586f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle loge("Could not read /proc/net/arp to lookup mac address"); 4587f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle } finally { 4588f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle try { 4589f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle if (reader != null) { 4590f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle reader.close(); 4591f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle } 4592f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle } catch (IOException e) { 4593f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle // Do nothing 4594f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle } 4595f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle } 4596f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle return macAddress; 4597f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 4598f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle } 45997d6e0b86655bf9862ae81fe37c9c8dc3f70d51f9Robert Greenwalt 46007d6e0b86655bf9862ae81fe37c9c8dc3f70d51f9Robert Greenwalt private class WifiNetworkFactory extends NetworkFactory { 46017d6e0b86655bf9862ae81fe37c9c8dc3f70d51f9Robert Greenwalt public WifiNetworkFactory(Looper l, Context c, String TAG, NetworkCapabilities f) { 46027d6e0b86655bf9862ae81fe37c9c8dc3f70d51f9Robert Greenwalt super(l, c, TAG, f); 46037d6e0b86655bf9862ae81fe37c9c8dc3f70d51f9Robert Greenwalt } 46048639f6266cb70bf92d1561af43ac2d7b2b97298eJeff Davidson 46058639f6266cb70bf92d1561af43ac2d7b2b97298eJeff Davidson @Override 46068639f6266cb70bf92d1561af43ac2d7b2b97298eJeff Davidson protected void needNetworkFor(NetworkRequest networkRequest, int score) { 46070af9c80053bd2736d5bea095b363d6a0c8ce71d0Lorenzo Colitti ++mConnectionRequests; 4608ebe870ef4051da2fc307114ed3c14927f548d9d4Jeff Davidson } 4609ebe870ef4051da2fc307114ed3c14927f548d9d4Jeff Davidson 4610ebe870ef4051da2fc307114ed3c14927f548d9d4Jeff Davidson @Override 4611ebe870ef4051da2fc307114ed3c14927f548d9d4Jeff Davidson protected void releaseNetworkFor(NetworkRequest networkRequest) { 4612ebe870ef4051da2fc307114ed3c14927f548d9d4Jeff Davidson --mConnectionRequests; 4613ebe870ef4051da2fc307114ed3c14927f548d9d4Jeff Davidson } 4614ebe870ef4051da2fc307114ed3c14927f548d9d4Jeff Davidson 4615ebe870ef4051da2fc307114ed3c14927f548d9d4Jeff Davidson public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 4616ebe870ef4051da2fc307114ed3c14927f548d9d4Jeff Davidson pw.println("mConnectionRequests " + mConnectionRequests); 4617ebe870ef4051da2fc307114ed3c14927f548d9d4Jeff Davidson } 4618ebe870ef4051da2fc307114ed3c14927f548d9d4Jeff Davidson 4619ebe870ef4051da2fc307114ed3c14927f548d9d4Jeff Davidson } 4620ebe870ef4051da2fc307114ed3c14927f548d9d4Jeff Davidson 4621ebe870ef4051da2fc307114ed3c14927f548d9d4Jeff Davidson private class UntrustedWifiNetworkFactory extends NetworkFactory { 4622ebe870ef4051da2fc307114ed3c14927f548d9d4Jeff Davidson private int mUntrustedReqCount; 4623ebe870ef4051da2fc307114ed3c14927f548d9d4Jeff Davidson 4624ebe870ef4051da2fc307114ed3c14927f548d9d4Jeff Davidson public UntrustedWifiNetworkFactory(Looper l, Context c, String tag, NetworkCapabilities f) { 4625ebe870ef4051da2fc307114ed3c14927f548d9d4Jeff Davidson super(l, c, tag, f); 4626ebe870ef4051da2fc307114ed3c14927f548d9d4Jeff Davidson } 4627ebe870ef4051da2fc307114ed3c14927f548d9d4Jeff Davidson 4628ebe870ef4051da2fc307114ed3c14927f548d9d4Jeff Davidson @Override 4629ebe870ef4051da2fc307114ed3c14927f548d9d4Jeff Davidson protected void needNetworkFor(NetworkRequest networkRequest, int score) { 46308639f6266cb70bf92d1561af43ac2d7b2b97298eJeff Davidson if (!networkRequest.networkCapabilities.hasCapability( 46318639f6266cb70bf92d1561af43ac2d7b2b97298eJeff Davidson NetworkCapabilities.NET_CAPABILITY_TRUSTED)) { 46328639f6266cb70bf92d1561af43ac2d7b2b97298eJeff Davidson if (++mUntrustedReqCount == 1) { 46338639f6266cb70bf92d1561af43ac2d7b2b97298eJeff Davidson mWifiAutoJoinController.setAllowUntrustedConnections(true); 46348639f6266cb70bf92d1561af43ac2d7b2b97298eJeff Davidson } 46358639f6266cb70bf92d1561af43ac2d7b2b97298eJeff Davidson } 46367d6e0b86655bf9862ae81fe37c9c8dc3f70d51f9Robert Greenwalt } 46378639f6266cb70bf92d1561af43ac2d7b2b97298eJeff Davidson 46388639f6266cb70bf92d1561af43ac2d7b2b97298eJeff Davidson @Override 46398639f6266cb70bf92d1561af43ac2d7b2b97298eJeff Davidson protected void releaseNetworkFor(NetworkRequest networkRequest) { 46408639f6266cb70bf92d1561af43ac2d7b2b97298eJeff Davidson if (!networkRequest.networkCapabilities.hasCapability( 46418639f6266cb70bf92d1561af43ac2d7b2b97298eJeff Davidson NetworkCapabilities.NET_CAPABILITY_TRUSTED)) { 46428639f6266cb70bf92d1561af43ac2d7b2b97298eJeff Davidson if (--mUntrustedReqCount == 0) { 46438639f6266cb70bf92d1561af43ac2d7b2b97298eJeff Davidson mWifiAutoJoinController.setAllowUntrustedConnections(false); 46448639f6266cb70bf92d1561af43ac2d7b2b97298eJeff Davidson } 46458639f6266cb70bf92d1561af43ac2d7b2b97298eJeff Davidson } 46467d6e0b86655bf9862ae81fe37c9c8dc3f70d51f9Robert Greenwalt } 46470af9c80053bd2736d5bea095b363d6a0c8ce71d0Lorenzo Colitti 46480af9c80053bd2736d5bea095b363d6a0c8ce71d0Lorenzo Colitti public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 46490af9c80053bd2736d5bea095b363d6a0c8ce71d0Lorenzo Colitti pw.println("mUntrustedReqCount " + mUntrustedReqCount); 46500af9c80053bd2736d5bea095b363d6a0c8ce71d0Lorenzo Colitti } 46517d6e0b86655bf9862ae81fe37c9c8dc3f70d51f9Robert Greenwalt } 46529f2b11623eec3b20edc93e30f94b263f287a4ca3vandwalle 46539f2b11623eec3b20edc93e30f94b263f287a4ca3vandwalle void maybeRegisterNetworkFactory() { 46549f2b11623eec3b20edc93e30f94b263f287a4ca3vandwalle if (mNetworkFactory == null) { 46559f2b11623eec3b20edc93e30f94b263f287a4ca3vandwalle checkAndSetConnectivityInstance(); 46569f2b11623eec3b20edc93e30f94b263f287a4ca3vandwalle if (mCm != null) { 46579f2b11623eec3b20edc93e30f94b263f287a4ca3vandwalle mNetworkFactory = new WifiNetworkFactory(getHandler().getLooper(), mContext, 46589f2b11623eec3b20edc93e30f94b263f287a4ca3vandwalle NETWORKTYPE, mNetworkCapabilitiesFilter); 46599f2b11623eec3b20edc93e30f94b263f287a4ca3vandwalle mNetworkFactory.setScoreFilter(60); 46609f2b11623eec3b20edc93e30f94b263f287a4ca3vandwalle mNetworkFactory.register(); 4661ebe870ef4051da2fc307114ed3c14927f548d9d4Jeff Davidson 4662ebe870ef4051da2fc307114ed3c14927f548d9d4Jeff Davidson // We can't filter untrusted network in the capabilities filter because a trusted 4663ebe870ef4051da2fc307114ed3c14927f548d9d4Jeff Davidson // network would still satisfy a request that accepts untrusted ones. 4664ebe870ef4051da2fc307114ed3c14927f548d9d4Jeff Davidson mUntrustedNetworkFactory = new UntrustedWifiNetworkFactory(getHandler().getLooper(), 4665ebe870ef4051da2fc307114ed3c14927f548d9d4Jeff Davidson mContext, NETWORKTYPE_UNTRUSTED, mNetworkCapabilitiesFilter); 4666ebe870ef4051da2fc307114ed3c14927f548d9d4Jeff Davidson mUntrustedNetworkFactory.setScoreFilter(Integer.MAX_VALUE); 4667ebe870ef4051da2fc307114ed3c14927f548d9d4Jeff Davidson mUntrustedNetworkFactory.register(); 46689f2b11623eec3b20edc93e30f94b263f287a4ca3vandwalle } 46699f2b11623eec3b20edc93e30f94b263f287a4ca3vandwalle } 46709f2b11623eec3b20edc93e30f94b263f287a4ca3vandwalle } 46719f2b11623eec3b20edc93e30f94b263f287a4ca3vandwalle 4672155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /******************************************************** 4673155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * HSM states 4674155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande *******************************************************/ 4675155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 4676155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande class DefaultState extends State { 4677155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande @Override 4678155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public boolean processMessage(Message message) { 4679f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle logStateAndMessage(message, getClass().getSimpleName()); 4680f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 4681155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande switch (message.what) { 46823831a926f6762a3b4c398da51cc67e9d81572458Robert Greenwalt case AsyncChannel.CMD_CHANNEL_HALF_CONNECTED: { 46833831a926f6762a3b4c398da51cc67e9d81572458Robert Greenwalt AsyncChannel ac = (AsyncChannel) message.obj; 46843831a926f6762a3b4c398da51cc67e9d81572458Robert Greenwalt if (ac == mWifiP2pChannel) { 46853831a926f6762a3b4c398da51cc67e9d81572458Robert Greenwalt if (message.arg1 == AsyncChannel.STATUS_SUCCESSFUL) { 46863831a926f6762a3b4c398da51cc67e9d81572458Robert Greenwalt mWifiP2pChannel.sendMessage(AsyncChannel.CMD_CHANNEL_FULL_CONNECTION); 46873831a926f6762a3b4c398da51cc67e9d81572458Robert Greenwalt } else { 46883831a926f6762a3b4c398da51cc67e9d81572458Robert Greenwalt loge("WifiP2pService connection failure, error=" + message.arg1); 46893831a926f6762a3b4c398da51cc67e9d81572458Robert Greenwalt } 4690155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 46913831a926f6762a3b4c398da51cc67e9d81572458Robert Greenwalt loge("got HALF_CONNECTED for unknown channel"); 4692155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 4693155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 46943831a926f6762a3b4c398da51cc67e9d81572458Robert Greenwalt } 46953831a926f6762a3b4c398da51cc67e9d81572458Robert Greenwalt case AsyncChannel.CMD_CHANNEL_DISCONNECTED: { 46963831a926f6762a3b4c398da51cc67e9d81572458Robert Greenwalt AsyncChannel ac = (AsyncChannel) message.obj; 46973831a926f6762a3b4c398da51cc67e9d81572458Robert Greenwalt if (ac == mWifiP2pChannel) { 46983831a926f6762a3b4c398da51cc67e9d81572458Robert Greenwalt loge("WifiP2pService channel lost, message.arg1 =" + message.arg1); 46993831a926f6762a3b4c398da51cc67e9d81572458Robert Greenwalt //TODO: Re-establish connection to state machine after a delay 4700931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle // mWifiP2pChannel.connect(mContext, getHandler(), 47010888ce6f90bdaeee799dd8361ea4781e23a33b87vandwalle // mWifiP2pManager.getMessenger()); 47023831a926f6762a3b4c398da51cc67e9d81572458Robert Greenwalt } 4703155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 47043831a926f6762a3b4c398da51cc67e9d81572458Robert Greenwalt } 4705155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_BLUETOOTH_ADAPTER_STATE_CHANGE: 4706155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mBluetoothConnectionActive = (message.arg1 != 4707155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande BluetoothAdapter.STATE_DISCONNECTED); 4708155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 4709155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Synchronous call returns */ 4710155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_PING_SUPPLICANT: 4711155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_ENABLE_NETWORK: 4712155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_ADD_OR_UPDATE_NETWORK: 4713155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_REMOVE_NETWORK: 4714155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_SAVE_CONFIG: 4715155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande replyToMessage(message, message.what, FAILURE); 4716155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 4717a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng case CMD_GET_CAPABILITY_FREQ: 4718a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng replyToMessage(message, message.what, null); 4719a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng break; 4720155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_GET_CONFIGURED_NETWORKS: 4721155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande replyToMessage(message, message.what, (List<WifiConfiguration>) null); 4722155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 47239878c61bbd81176561991be025af44efc67332feWenchao Tong case CMD_GET_PRIVILEGED_CONFIGURED_NETWORKS: 47249878c61bbd81176561991be025af44efc67332feWenchao Tong replyToMessage(message, message.what, (List<WifiConfiguration>) null); 47259878c61bbd81176561991be025af44efc67332feWenchao Tong break; 4726155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_ENABLE_RSSI_POLL: 4727155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mEnableRssiPolling = (message.arg1 == 1); 4728155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 4729155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_SET_HIGH_PERF_MODE: 4730155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (message.arg1 == 1) { 4731155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande setSuspendOptimizations(SUSPEND_DUE_TO_HIGH_PERF, false); 4732155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 4733155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande setSuspendOptimizations(SUSPEND_DUE_TO_HIGH_PERF, true); 4734155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 4735155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 4736155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_BOOT_COMPLETED: 4737155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande String countryCode = mPersistedCountryCode; 4738155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (TextUtils.isEmpty(countryCode) == false) { 4739155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Settings.Global.putString(mContext.getContentResolver(), 4740155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Settings.Global.WIFI_COUNTRY_CODE, 4741155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande countryCode); 4742931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle // It may be that the state transition that should send this info 4743155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // to the driver happened between mPersistedCountryCode getting set 4744155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // and now, so simply persisting it here would mean we have sent 4745155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // nothing to the driver. Send the cmd so it might be set now. 47469c22c8ea193360f50ad490368ca6a11af0684362Robert Greenwalt int sequenceNum = mCountryCodeSequence.incrementAndGet(); 47479c22c8ea193360f50ad490368ca6a11af0684362Robert Greenwalt sendMessageAtFrontOfQueue(CMD_SET_COUNTRY_CODE, 47489c22c8ea193360f50ad490368ca6a11af0684362Robert Greenwalt sequenceNum, 0, countryCode); 4749155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 47509f2b11623eec3b20edc93e30f94b263f287a4ca3vandwalle maybeRegisterNetworkFactory(); 4751155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 4752155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_SET_BATCHED_SCAN: 4753155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande recordBatchedScanSettings(message.arg1, message.arg2, (Bundle)message.obj); 4754155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 4755155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_POLL_BATCHED_SCAN: 4756155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande handleBatchedScanPollRequest(); 4757155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 4758155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_START_NEXT_BATCHED_SCAN: 4759155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande startNextBatchedScan(); 4760155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 476182199a285f4a45a46b44eb8253999aa918534753vandwalle case CMD_SCREEN_STATE_CHANGED: 47627c8a4effa2442b9d00fd421b443ea9645f8651c8Vinit Deshpande handleScreenStateChanged(message.arg1 != 0, 47637c8a4effa2442b9d00fd421b443ea9645f8651c8Vinit Deshpande /* startBackgroundScanIfNeeded = */ false); 476482199a285f4a45a46b44eb8253999aa918534753vandwalle break; 4765155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Discard */ 4766155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_START_SCAN: 4767ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle messageHandlingStatus = MESSAGE_HANDLING_STATUS_DISCARD; 4768ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle break; 4769155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_START_SUPPLICANT: 4770155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_STOP_SUPPLICANT: 4771155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_STOP_SUPPLICANT_FAILED: 4772155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_START_DRIVER: 4773155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_STOP_DRIVER: 4774155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_DELAYED_STOP_DRIVER: 4775155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_DRIVER_START_TIMED_OUT: 4776155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_START_AP: 4777155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_START_AP_SUCCESS: 4778155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_START_AP_FAILURE: 4779155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_STOP_AP: 4780155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_TETHER_STATE_CHANGE: 4781155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_TETHER_NOTIFICATION_TIMED_OUT: 4782155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_DISCONNECT: 4783155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_RECONNECT: 4784155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_REASSOCIATE: 4785155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_RELOAD_TLS_AND_RECONNECT: 4786155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiMonitor.SUP_CONNECTION_EVENT: 4787155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiMonitor.SUP_DISCONNECTION_EVENT: 4788155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiMonitor.NETWORK_CONNECTION_EVENT: 4789155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiMonitor.NETWORK_DISCONNECTION_EVENT: 4790155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiMonitor.SCAN_RESULTS_EVENT: 4791155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiMonitor.SUPPLICANT_STATE_CHANGE_EVENT: 4792155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiMonitor.AUTHENTICATION_FAILURE_EVENT: 4793155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiMonitor.ASSOCIATION_REJECTION_EVENT: 4794155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiMonitor.WPS_OVERLAP_EVENT: 4795155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_BLACKLIST_NETWORK: 4796155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_CLEAR_BLACKLIST: 4797155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_SET_OPERATIONAL_MODE: 4798155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_SET_COUNTRY_CODE: 4799155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_SET_FREQUENCY_BAND: 4800155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_RSSI_POLL: 4801155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_ENABLE_ALL_NETWORKS: 4802155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case DhcpStateMachine.CMD_PRE_DHCP_ACTION: 4803155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case DhcpStateMachine.CMD_POST_DHCP_ACTION: 4804155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Handled by WifiApConfigStore */ 4805155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_SET_AP_CONFIG: 4806155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_SET_AP_CONFIG_COMPLETED: 4807155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_REQUEST_AP_CONFIG: 4808155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_RESPONSE_AP_CONFIG: 4809155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiWatchdogStateMachine.POOR_LINK_DETECTED: 4810155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiWatchdogStateMachine.GOOD_LINK_DETECTED: 4811155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_NO_NETWORKS_PERIODIC_SCAN: 4812155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_DISABLE_P2P_RSP: 481340ff222cec1bd05879edb53abc75c6deead734cavandwalle case WifiMonitor.SUP_REQUEST_IDENTITY: 48147806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle case CMD_TEST_NETWORK_DISCONNECT: 48157806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle case CMD_OBTAINING_IP_ADDRESS_WATCHDOG_TIMER: 481633b575ca6bee66183929f9474b5a161432918604Vinit Deshpande case WifiMonitor.SUP_REQUEST_SIM_AUTH: 4817e6574ec7b6b2e7a678da7f77bdaaf31463852b2fvandwalle case CMD_TARGET_BSSID: 4818be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle case CMD_AUTO_CONNECT: 4819be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle case CMD_AUTO_ROAM: 4820be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle case CMD_AUTO_SAVE_NETWORK: 48212f2cf21662275a0e93d7d7a6ad3d98b4c596dcf0vandwalle case CMD_ASSOCIATED_BSSID: 4822e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle case CMD_UNWANTED_NETWORK: 4823e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle case CMD_DISCONNECTING_WATCHDOG_TIMER: 4824a0708b09ad17b086c008ab100aec7143d7613c80vandwalle case CMD_ROAM_WATCHDOG_TIMER: 48252ce99b40c36ed0352b31aa85d5f9383d5f0506f5vandwalle case CMD_DISABLE_EPHEMERAL_NETWORK: 4826ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle messageHandlingStatus = MESSAGE_HANDLING_STATUS_DISCARD; 4827155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 4828155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case DhcpStateMachine.CMD_ON_QUIT: 4829155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mDhcpStateMachine = null; 4830155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 4831155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_SET_SUSPEND_OPT_ENABLED: 4832155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (message.arg1 == 1) { 4833155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mSuspendWakeLock.release(); 4834155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande setSuspendOptimizations(SUSPEND_DUE_TO_SCREEN, true); 4835155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 4836155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande setSuspendOptimizations(SUSPEND_DUE_TO_SCREEN, false); 4837155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 4838155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 4839155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiMonitor.DRIVER_HUNG_EVENT: 4840155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande setSupplicantRunning(false); 4841155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande setSupplicantRunning(true); 4842155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 4843155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiManager.CONNECT_NETWORK: 4844155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande replyToMessage(message, WifiManager.CONNECT_NETWORK_FAILED, 4845155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande WifiManager.BUSY); 4846155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 4847155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiManager.FORGET_NETWORK: 4848155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande replyToMessage(message, WifiManager.FORGET_NETWORK_FAILED, 4849155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande WifiManager.BUSY); 4850155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 4851155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiManager.SAVE_NETWORK: 4852b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle messageHandlingStatus = MESSAGE_HANDLING_STATUS_FAIL; 4853155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande replyToMessage(message, WifiManager.SAVE_NETWORK_FAILED, 4854155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande WifiManager.BUSY); 4855155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 4856155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiManager.START_WPS: 4857155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande replyToMessage(message, WifiManager.WPS_FAILED, 4858155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande WifiManager.BUSY); 4859155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 4860155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiManager.CANCEL_WPS: 4861155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande replyToMessage(message, WifiManager.CANCEL_WPS_FAILED, 4862155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande WifiManager.BUSY); 4863155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 4864155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiManager.DISABLE_NETWORK: 4865155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande replyToMessage(message, WifiManager.DISABLE_NETWORK_FAILED, 4866155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande WifiManager.BUSY); 4867155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 4868155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiManager.RSSI_PKTCNT_FETCH: 4869155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande replyToMessage(message, WifiManager.RSSI_PKTCNT_FETCH_FAILED, 4870155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande WifiManager.BUSY); 4871155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 4872048dc8df2bd9394979dbb090b0cfe8d6627d23e3Vinit Deshpande case CMD_GET_SUPPORTED_FEATURES: 4873981e966999f4448a682084d6657d07bab2bbc13eVinit Deshpande if (WifiNative.startHal()) { 4874981e966999f4448a682084d6657d07bab2bbc13eVinit Deshpande int featureSet = WifiNative.getSupportedFeatureSet(); 4875048dc8df2bd9394979dbb090b0cfe8d6627d23e3Vinit Deshpande replyToMessage(message, message.what, featureSet); 4876981e966999f4448a682084d6657d07bab2bbc13eVinit Deshpande } else { 4877048dc8df2bd9394979dbb090b0cfe8d6627d23e3Vinit Deshpande replyToMessage(message, message.what, 0); 4878981e966999f4448a682084d6657d07bab2bbc13eVinit Deshpande } 4879981e966999f4448a682084d6657d07bab2bbc13eVinit Deshpande break; 4880200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle case CMD_GET_LINK_LAYER_STATS: 4881200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle // Not supported hence reply with error message 4882200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle replyToMessage(message, message.what, null); 4883200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle break; 4884155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiP2pServiceImpl.P2P_CONNECTION_CHANGED: 4885155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande NetworkInfo info = (NetworkInfo) message.obj; 4886155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mP2pConnected.set(info.isConnected()); 4887155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 4888155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiP2pServiceImpl.DISCONNECT_WIFI_REQUEST: 4889155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mTemporarilyDisconnectWifi = (message.arg1 == 1); 4890155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande replyToMessage(message, WifiP2pServiceImpl.DISCONNECT_WIFI_RESPONSE); 4891155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 4892d60cf2efc576f016506ebe6d8a83b4a6217b2e0eLorenzo Colitti /* Link configuration (IP address, DNS, ...) changes notified via netlink */ 4893badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti case CMD_UPDATE_LINKPROPERTIES: 4894badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti updateLinkProperties(CMD_UPDATE_LINKPROPERTIES); 489514be3cde626bd5935f599cd6e0fca72cf1c4695dLorenzo Colitti break; 489614be3cde626bd5935f599cd6e0fca72cf1c4695dLorenzo Colitti case CMD_IP_CONFIGURATION_SUCCESSFUL: 489714be3cde626bd5935f599cd6e0fca72cf1c4695dLorenzo Colitti case CMD_IP_CONFIGURATION_LOST: 4898ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle messageHandlingStatus = MESSAGE_HANDLING_STATUS_DISCARD; 489914be3cde626bd5935f599cd6e0fca72cf1c4695dLorenzo Colitti break; 4900c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalle case CMD_GET_CONNECTION_STATISTICS: 4901c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalle replyToMessage(message, message.what, mWifiConnectionStatistics); 4902c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalle break; 4903155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande default: 4904155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("Error! unhandled message" + message); 4905155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 4906155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 4907155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return HANDLED; 4908155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 4909155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 4910155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 4911155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande class InitialState extends State { 4912155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande @Override 4913155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public void enter() { 4914155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiNative.unloadDriver(); 4915155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 4916155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mWifiP2pChannel == null) { 4917155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiP2pChannel = new AsyncChannel(); 4918f933721551d39adc4924e5f69dcc51c16c520850Navtej Singh Mann mWifiP2pChannel.connect(mContext, getHandler(), 4919f933721551d39adc4924e5f69dcc51c16c520850Navtej Singh Mann mWifiP2pServiceImpl.getP2pStateMachineMessenger()); 4920155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 4921155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 4922155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mWifiApConfigChannel == null) { 4923155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiApConfigChannel = new AsyncChannel(); 4924155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande WifiApConfigStore wifiApConfigStore = WifiApConfigStore.makeWifiApConfigStore( 4925155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mContext, getHandler()); 4926155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande wifiApConfigStore.loadApConfiguration(); 4927155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiApConfigChannel.connectSync(mContext, getHandler(), 4928155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande wifiApConfigStore.getMessenger()); 4929155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 4930155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 4931155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande @Override 4932155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public boolean processMessage(Message message) { 4933f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle logStateAndMessage(message, getClass().getSimpleName()); 4934155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande switch (message.what) { 4935155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_START_SUPPLICANT: 4936155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mWifiNative.loadDriver()) { 4937155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande try { 4938155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mNwService.wifiFirmwareReload(mInterfaceName, "STA"); 4939155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } catch (Exception e) { 4940155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("Failed to reload STA firmware " + e); 4941931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle // Continue 4942155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 4943155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 4944155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande try { 4945155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // A runtime crash can leave the interface up and 494608b2a6f380652e7836687632a10e5183fd7ac689Lorenzo Colitti // IP addresses configured, and this affects 494708b2a6f380652e7836687632a10e5183fd7ac689Lorenzo Colitti // connectivity when supplicant starts up. 494808b2a6f380652e7836687632a10e5183fd7ac689Lorenzo Colitti // Ensure interface is down and we have no IP 494908b2a6f380652e7836687632a10e5183fd7ac689Lorenzo Colitti // addresses before a supplicant start. 4950155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mNwService.setInterfaceDown(mInterfaceName); 495108b2a6f380652e7836687632a10e5183fd7ac689Lorenzo Colitti mNwService.clearInterfaceAddresses(mInterfaceName); 495208b2a6f380652e7836687632a10e5183fd7ac689Lorenzo Colitti 4953155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Set privacy extensions 4954155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mNwService.setInterfaceIpv6PrivacyExtensions(mInterfaceName, true); 4955155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 4956155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // IPv6 is enabled only as long as access point is connected since: 4957155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // - IPv6 addresses and routes stick around after disconnection 4958155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // - kernel is unaware when connected and fails to start IPv6 negotiation 4959155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // - kernel can start autoconfiguration when 802.1x is not complete 4960155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mNwService.disableIpv6(mInterfaceName); 4961155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } catch (RemoteException re) { 4962155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("Unable to change interface settings: " + re); 4963155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } catch (IllegalStateException ie) { 4964155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("Unable to change interface settings: " + ie); 4965155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 4966155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 4967155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Stop a running supplicant after a runtime restart 4968155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Avoids issues with drivers that do not handle interface down 4969155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * on a running supplicant properly. 4970155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 4971155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiMonitor.killSupplicant(mP2pSupported); 4972155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if(mWifiNative.startSupplicant(mP2pSupported)) { 4973155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande setWifiState(WIFI_STATE_ENABLING); 4974155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (DBG) log("Supplicant start successful"); 4975155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiMonitor.startMonitoring(); 4976155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande transitionTo(mSupplicantStartingState); 4977155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 4978155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("Failed to start supplicant!"); 4979155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 4980155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 4981155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("Failed to load driver"); 4982155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 4983155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 4984155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_START_AP: 4985155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mWifiNative.loadDriver()) { 4986155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande setWifiApState(WIFI_AP_STATE_ENABLING); 4987155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande transitionTo(mSoftApStartingState); 4988155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 4989155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("Failed to load driver for softap"); 4990155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 4991155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande default: 4992155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return NOT_HANDLED; 4993155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 4994155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return HANDLED; 4995155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 4996155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 4997155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 4998155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande class SupplicantStartingState extends State { 4999155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private void initializeWpsDetails() { 5000155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande String detail; 5001155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande detail = SystemProperties.get("ro.product.name", ""); 5002155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (!mWifiNative.setDeviceName(detail)) { 5003155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("Failed to set device name " + detail); 5004155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5005155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande detail = SystemProperties.get("ro.product.manufacturer", ""); 5006155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (!mWifiNative.setManufacturer(detail)) { 5007155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("Failed to set manufacturer " + detail); 5008155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5009155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande detail = SystemProperties.get("ro.product.model", ""); 5010155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (!mWifiNative.setModelName(detail)) { 5011155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("Failed to set model name " + detail); 5012155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5013155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande detail = SystemProperties.get("ro.product.model", ""); 5014155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (!mWifiNative.setModelNumber(detail)) { 5015155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("Failed to set model number " + detail); 5016155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5017155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande detail = SystemProperties.get("ro.serialno", ""); 5018155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (!mWifiNative.setSerialNumber(detail)) { 5019155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("Failed to set serial number " + detail); 5020155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5021155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (!mWifiNative.setConfigMethods("physical_display virtual_push_button")) { 5022155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("Failed to set WPS config methods"); 5023155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5024155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (!mWifiNative.setDeviceType(mPrimaryDeviceType)) { 5025155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("Failed to set primary device type " + mPrimaryDeviceType); 5026155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5027155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5028155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 5029155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande @Override 5030155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public boolean processMessage(Message message) { 5031f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle logStateAndMessage(message, getClass().getSimpleName()); 5032f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 5033155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande switch(message.what) { 5034155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiMonitor.SUP_CONNECTION_EVENT: 5035155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (DBG) log("Supplicant connection established"); 5036155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande setWifiState(WIFI_STATE_ENABLED); 5037155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mSupplicantRestartCount = 0; 5038155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Reset the supplicant state to indicate the supplicant 5039155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * state is not known at this time */ 5040155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mSupplicantStateTracker.sendMessage(CMD_RESET_SUPPLICANT_STATE); 5041155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Initialize data structures */ 5042155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mLastBssid = null; 5043155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mLastNetworkId = WifiConfiguration.INVALID_NETWORK_ID; 5044155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mLastSignalLevel = -1; 5045155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 5046155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiInfo.setMacAddress(mWifiNative.getMacAddress()); 50470a696d168d7ad98ab5084d2a16e3d02c545a85aaVinit Deshapnde mWifiNative.enableSaveConfig(); 5048155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiConfigStore.loadAndEnableAllNetworks(); 5049a0708b09ad17b086c008ab100aec7143d7613c80vandwalle if (mWifiConfigStore.enableVerboseLogging > 0) { 5050a0708b09ad17b086c008ab100aec7143d7613c80vandwalle enableVerboseLogging(mWifiConfigStore.enableVerboseLogging); 5051a0708b09ad17b086c008ab100aec7143d7613c80vandwalle } 50520eebae7334d6129f7ca1344e4b20199794994358vandwalle if (mWifiConfigStore.associatedPartialScanPeriodMilli < 0) { 50530eebae7334d6129f7ca1344e4b20199794994358vandwalle mWifiConfigStore.associatedPartialScanPeriodMilli = 0; 5054e67ec726c07410073575473c0f50dc737629f5davandwalle } 5055155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande initializeWpsDetails(); 5056155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 5057155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendSupplicantConnectionChangedBroadcast(true); 5058155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande transitionTo(mDriverStartedState); 5059155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 5060155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiMonitor.SUP_DISCONNECTION_EVENT: 5061155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (++mSupplicantRestartCount <= SUPPLICANT_RESTART_TRIES) { 5062155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("Failed to setup control channel, restart supplicant"); 5063155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiMonitor.killSupplicant(mP2pSupported); 5064155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande transitionTo(mInitialState); 5065155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendMessageDelayed(CMD_START_SUPPLICANT, SUPPLICANT_RESTART_INTERVAL_MSECS); 5066155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 5067155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("Failed " + mSupplicantRestartCount + 5068155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande " times to start supplicant, unload driver"); 5069155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mSupplicantRestartCount = 0; 5070155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande setWifiState(WIFI_STATE_UNKNOWN); 5071155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande transitionTo(mInitialState); 5072155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5073155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 5074155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_START_SUPPLICANT: 5075155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_STOP_SUPPLICANT: 5076155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_START_AP: 5077155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_STOP_AP: 5078155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_START_DRIVER: 5079155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_STOP_DRIVER: 5080155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_SET_OPERATIONAL_MODE: 5081155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_SET_COUNTRY_CODE: 5082155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_SET_FREQUENCY_BAND: 5083155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_START_PACKET_FILTERING: 5084155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_STOP_PACKET_FILTERING: 5085ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle messageHandlingStatus = MESSAGE_HANDLING_STATUS_DEFERRED; 5086155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande deferMessage(message); 5087155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 5088155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande default: 5089155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return NOT_HANDLED; 5090155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5091155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return HANDLED; 5092155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5093155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5094155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 5095155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande class SupplicantStartedState extends State { 5096155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande @Override 5097155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public void enter() { 5098155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Wifi is available as long as we have a connection to supplicant */ 5099155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mNetworkInfo.setIsAvailable(true); 51003831a926f6762a3b4c398da51cc67e9d81572458Robert Greenwalt if (mNetworkAgent != null) mNetworkAgent.sendNetworkInfo(mNetworkInfo); 5101155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 5102155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande int defaultInterval = mContext.getResources().getInteger( 5103155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande R.integer.config_wifi_supplicant_scan_interval); 5104155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 5105155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mSupplicantScanIntervalMs = Settings.Global.getLong(mContext.getContentResolver(), 5106155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Settings.Global.WIFI_SUPPLICANT_SCAN_INTERVAL_MS, 5107155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande defaultInterval); 5108155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 5109155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiNative.setScanInterval((int)mSupplicantScanIntervalMs / 1000); 511033b575ca6bee66183929f9474b5a161432918604Vinit Deshpande mWifiNative.setExternalSim(true); 5111f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 5112eedd70ee3fa7f161ea1f4ae26543ac927e82a681Vinit Deshpande setRandomMacOui(); 5113be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle mWifiNative.enableAutoConnect(false); 5114155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5115eedd70ee3fa7f161ea1f4ae26543ac927e82a681Vinit Deshpande 5116155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande @Override 5117155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public boolean processMessage(Message message) { 5118f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle logStateAndMessage(message, getClass().getSimpleName()); 5119f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 5120155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande switch(message.what) { 5121155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_STOP_SUPPLICANT: /* Supplicant stopped by user */ 5122155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mP2pSupported) { 5123155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande transitionTo(mWaitForP2pDisableState); 5124155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 5125155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande transitionTo(mSupplicantStoppingState); 5126155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5127155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 5128155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiMonitor.SUP_DISCONNECTION_EVENT: /* Supplicant connection lost */ 5129155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("Connection lost, restart supplicant"); 5130155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande handleSupplicantConnectionLoss(); 5131155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande handleNetworkDisconnect(); 5132155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mSupplicantStateTracker.sendMessage(CMD_RESET_SUPPLICANT_STATE); 5133155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mP2pSupported) { 5134155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande transitionTo(mWaitForP2pDisableState); 5135155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 5136155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande transitionTo(mInitialState); 5137155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5138155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendMessageDelayed(CMD_START_SUPPLICANT, SUPPLICANT_RESTART_INTERVAL_MSECS); 5139155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 5140155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiMonitor.SCAN_RESULTS_EVENT: 51419f2b11623eec3b20edc93e30f94b263f287a4ca3vandwalle maybeRegisterNetworkFactory(); // Make sure our NetworkFactory is registered 51420eebae7334d6129f7ca1344e4b20199794994358vandwalle closeRadioScanStats(); 51437b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle noteScanEnd(); 5144155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande setScanResults(); 51459086afccf6938a49eb9a2cd248917c1cb0943942vandwalle if (mIsFullScanOngoing || mSendScanResultsBroadcast) { 5146765b9dc1c45bbeed87243d21cc5938bd5f1ba0d4Vinit Deshpande /* Just updated results from full scan, let apps know about this */ 5147765b9dc1c45bbeed87243d21cc5938bd5f1ba0d4Vinit Deshpande sendScanResultsAvailableBroadcast(); 5148765b9dc1c45bbeed87243d21cc5938bd5f1ba0d4Vinit Deshpande } 51499086afccf6938a49eb9a2cd248917c1cb0943942vandwalle mSendScanResultsBroadcast = false; 5150a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng mIsScanOngoing = false; 5151a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng mIsFullScanOngoing = false; 5152a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng if (mBufferedScanMsg.size() > 0) 5153a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng sendMessage(mBufferedScanMsg.remove()); 5154155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 5155155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_PING_SUPPLICANT: 5156155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande boolean ok = mWifiNative.ping(); 5157155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande replyToMessage(message, message.what, ok ? SUCCESS : FAILURE); 5158155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 5159a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng case CMD_GET_CAPABILITY_FREQ: 5160a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng String freqs = mWifiNative.getFreqCapability(); 5161a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng replyToMessage(message, message.what, freqs); 5162a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng break; 5163155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_START_AP: 5164a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng /* Cannot start soft AP while in client mode */ 5165155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("Failed to start soft AP with a running supplicant"); 5166155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande setWifiApState(WIFI_AP_STATE_FAILED); 5167155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 5168155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_SET_OPERATIONAL_MODE: 5169155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mOperationalMode = message.arg1; 5170abd1740f753ac14e9dec8fced8d3de5059122c2avandwalle mWifiConfigStore. 5171abd1740f753ac14e9dec8fced8d3de5059122c2avandwalle setLastSelectedConfiguration(WifiConfiguration.INVALID_NETWORK_ID); 5172155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 5173e6574ec7b6b2e7a678da7f77bdaaf31463852b2fvandwalle case CMD_TARGET_BSSID: 5174e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle // Trying to associate to this BSSID 5175e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle if (message.obj != null) { 5176e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle mTargetRoamBSSID = (String) message.obj; 5177e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle } 5178e6574ec7b6b2e7a678da7f77bdaaf31463852b2fvandwalle break; 5179200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle case CMD_GET_LINK_LAYER_STATS: 51807b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle WifiLinkLayerStats stats = getWifiLinkLayerStats(DBG); 51817b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle if (stats == null) { 5182048dc8df2bd9394979dbb090b0cfe8d6627d23e3Vinit Deshpande // When firmware doesnt support link layer stats, return an empty object 5183048dc8df2bd9394979dbb090b0cfe8d6627d23e3Vinit Deshpande stats = new WifiLinkLayerStats(); 5184200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle } 5185200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle replyToMessage(message, message.what, stats); 5186200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle break; 5187155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande default: 5188155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return NOT_HANDLED; 5189155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5190155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return HANDLED; 5191155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5192155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 5193155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande @Override 5194155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public void exit() { 5195155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mNetworkInfo.setIsAvailable(false); 51967d6e0b86655bf9862ae81fe37c9c8dc3f70d51f9Robert Greenwalt if (mNetworkAgent != null) mNetworkAgent.sendNetworkInfo(mNetworkInfo); 5197155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5198155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5199155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 5200155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande class SupplicantStoppingState extends State { 5201155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande @Override 5202155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public void enter() { 5203155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Send any reset commands to supplicant before shutting it down */ 5204155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande handleNetworkDisconnect(); 5205155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mDhcpStateMachine != null) { 5206155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mDhcpStateMachine.doQuit(); 5207155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5208155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 5209005c1ef113192f898499a407dd266393a8d6b076vandwalle String suppState = System.getProperty("init.svc.wpa_supplicant"); 5210005c1ef113192f898499a407dd266393a8d6b076vandwalle if (suppState == null) suppState = "unknown"; 5211005c1ef113192f898499a407dd266393a8d6b076vandwalle String p2pSuppState = System.getProperty("init.svc.p2p_supplicant"); 5212005c1ef113192f898499a407dd266393a8d6b076vandwalle if (p2pSuppState == null) p2pSuppState = "unknown"; 5213005c1ef113192f898499a407dd266393a8d6b076vandwalle 5214005c1ef113192f898499a407dd266393a8d6b076vandwalle loge("SupplicantStoppingState: stopSupplicant " 5215005c1ef113192f898499a407dd266393a8d6b076vandwalle + " init.svc.wpa_supplicant=" + suppState 5216005c1ef113192f898499a407dd266393a8d6b076vandwalle + " init.svc.p2p_supplicant=" + p2pSuppState); 5217155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiMonitor.stopSupplicant(); 5218155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 5219155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Send ourselves a delayed message to indicate failure after a wait time */ 5220155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendMessageDelayed(obtainMessage(CMD_STOP_SUPPLICANT_FAILED, 5221155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande ++mSupplicantStopFailureToken, 0), SUPPLICANT_RESTART_INTERVAL_MSECS); 5222155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande setWifiState(WIFI_STATE_DISABLING); 5223155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mSupplicantStateTracker.sendMessage(CMD_RESET_SUPPLICANT_STATE); 5224155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5225155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande @Override 5226155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public boolean processMessage(Message message) { 5227f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle logStateAndMessage(message, getClass().getSimpleName()); 5228f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 5229155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande switch(message.what) { 5230155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiMonitor.SUP_CONNECTION_EVENT: 5231155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("Supplicant connection received while stopping"); 5232155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 5233155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiMonitor.SUP_DISCONNECTION_EVENT: 5234155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (DBG) log("Supplicant connection lost"); 5235155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande handleSupplicantConnectionLoss(); 5236155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande transitionTo(mInitialState); 5237155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 5238155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_STOP_SUPPLICANT_FAILED: 5239155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (message.arg1 == mSupplicantStopFailureToken) { 5240155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("Timed out on a supplicant stop, kill and proceed"); 5241155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande handleSupplicantConnectionLoss(); 5242155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande transitionTo(mInitialState); 5243155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5244155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 5245155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_START_SUPPLICANT: 5246155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_STOP_SUPPLICANT: 5247155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_START_AP: 5248155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_STOP_AP: 5249155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_START_DRIVER: 5250155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_STOP_DRIVER: 5251155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_SET_OPERATIONAL_MODE: 5252155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_SET_COUNTRY_CODE: 5253155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_SET_FREQUENCY_BAND: 5254155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_START_PACKET_FILTERING: 5255155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_STOP_PACKET_FILTERING: 5256155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande deferMessage(message); 5257155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 5258155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande default: 5259155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return NOT_HANDLED; 5260155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5261155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return HANDLED; 5262155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5263155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5264155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 5265155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande class DriverStartingState extends State { 5266155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private int mTries; 5267155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande @Override 5268155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public void enter() { 5269155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mTries = 1; 5270155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Send ourselves a delayed message to start driver a second time */ 5271155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendMessageDelayed(obtainMessage(CMD_DRIVER_START_TIMED_OUT, 5272155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande ++mDriverStartToken, 0), DRIVER_START_TIME_OUT_MSECS); 5273155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5274155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande @Override 5275155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public boolean processMessage(Message message) { 5276f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle logStateAndMessage(message, getClass().getSimpleName()); 5277f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 5278155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande switch(message.what) { 5279155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiMonitor.SUPPLICANT_STATE_CHANGE_EVENT: 5280155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande SupplicantState state = handleSupplicantStateChange(message); 5281155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* If suplicant is exiting out of INTERFACE_DISABLED state into 5282155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * a state that indicates driver has started, it is ready to 5283155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * receive driver commands 5284155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 5285155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (SupplicantState.isDriverActive(state)) { 5286155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande transitionTo(mDriverStartedState); 5287155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5288155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 5289155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_DRIVER_START_TIMED_OUT: 5290155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (message.arg1 == mDriverStartToken) { 5291155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mTries >= 2) { 5292155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("Failed to start driver after " + mTries); 5293155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande transitionTo(mDriverStoppedState); 5294155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 5295155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("Driver start failed, retrying"); 5296155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWakeLock.acquire(); 5297155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiNative.startDriver(); 5298155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWakeLock.release(); 5299155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 5300155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande ++mTries; 5301155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Send ourselves a delayed message to start driver again */ 5302155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendMessageDelayed(obtainMessage(CMD_DRIVER_START_TIMED_OUT, 5303155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande ++mDriverStartToken, 0), DRIVER_START_TIME_OUT_MSECS); 5304155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5305155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5306155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 5307155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Queue driver commands & connection events */ 5308155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_START_DRIVER: 5309155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_STOP_DRIVER: 5310155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiMonitor.NETWORK_CONNECTION_EVENT: 5311155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiMonitor.NETWORK_DISCONNECTION_EVENT: 5312155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiMonitor.AUTHENTICATION_FAILURE_EVENT: 5313155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiMonitor.ASSOCIATION_REJECTION_EVENT: 5314155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiMonitor.WPS_OVERLAP_EVENT: 5315155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_SET_COUNTRY_CODE: 5316155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_SET_FREQUENCY_BAND: 5317155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_START_PACKET_FILTERING: 5318155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_STOP_PACKET_FILTERING: 5319155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_START_SCAN: 5320155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_DISCONNECT: 5321155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_REASSOCIATE: 5322155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_RECONNECT: 5323ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle messageHandlingStatus = MESSAGE_HANDLING_STATUS_DEFERRED; 5324155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande deferMessage(message); 5325155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 53269f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle case WifiMonitor.SCAN_RESULTS_EVENT: 53279f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle // Loose scan results obtained in Driver Starting state, they can only confuse 53289f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle // the state machine 53299f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle break; 5330155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande default: 5331155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return NOT_HANDLED; 5332155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5333155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return HANDLED; 5334155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5335155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5336155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 5337155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande class DriverStartedState extends State { 5338155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande @Override 5339155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public void enter() { 5340f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 5341f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle if (PDBG) { 53428242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle loge("DriverStartedState enter"); 5343f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle } 5344155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mIsRunning = true; 5345155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mInDelayedStop = false; 5346155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mDelayedStopCounter++; 5347155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande updateBatteryWorkSource(null); 5348155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 5349155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Enable bluetooth coexistence scan mode when bluetooth connection is active. 5350155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * When this mode is on, some of the low-level scan parameters used by the 5351155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * driver are changed to reduce interference with bluetooth 5352155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 5353155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiNative.setBluetoothCoexistenceScanMode(mBluetoothConnectionActive); 5354155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* set country code */ 5355155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande setCountryCode(); 5356155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* set frequency band of operation */ 5357155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande setFrequencyBand(); 5358155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* initialize network state */ 5359155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande setNetworkDetailedState(DetailedState.DISCONNECTED); 5360155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 5361155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Remove any filtering on Multicast v6 at start */ 5362155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiNative.stopFilteringMulticastV6Packets(); 5363155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 5364155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Reset Multicast v4 filtering state */ 5365155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mFilteringMulticastV4Packets.get()) { 5366155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiNative.startFilteringMulticastV4Packets(); 5367155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 5368155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiNative.stopFilteringMulticastV4Packets(); 5369155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5370155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 5371155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mDhcpActive = false; 5372155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 5373155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande startBatchedScan(); 5374155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 5375155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mOperationalMode != CONNECT_MODE) { 5376155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiNative.disconnect(); 5377155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiConfigStore.disableAllNetworks(); 5378155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mOperationalMode == SCAN_ONLY_WITH_WIFI_OFF_MODE) { 5379155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande setWifiState(WIFI_STATE_DISABLED); 5380155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5381155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande transitionTo(mScanModeState); 5382155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 5383155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 5384155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Status pulls in the current supplicant state and network connection state 5385155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // events over the monitor connection. This helps framework sync up with 5386155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // current supplicant state 53879f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle // TODO: actually check th supplicant status string and make sure the supplicant 53889f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle // is in disconnecte4d state. 5389155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiNative.status(); 53909f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle // Transitioning to Disconnected state will trigger a scan and subsequently AutoJoin 5391155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande transitionTo(mDisconnectedState); 5392155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5393155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 5394155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // We may have missed screen update at boot 5395155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mScreenBroadcastReceived.get() == false) { 5396155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande PowerManager powerManager = (PowerManager)mContext.getSystemService( 5397155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Context.POWER_SERVICE); 53987c8a4effa2442b9d00fd421b443ea9645f8651c8Vinit Deshpande handleScreenStateChanged(powerManager.isScreenOn(), 53997c8a4effa2442b9d00fd421b443ea9645f8651c8Vinit Deshpande /* startBackgroundScanIfNeeded = */ false); 5400155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 5401155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Set the right suspend mode settings 5402155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiNative.setSuspendOptimizations(mSuspendOptNeedsDisabled == 0 5403155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande && mUserWantsSuspendOpt.get()); 5404155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5405155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiNative.setPowerSave(true); 5406155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 5407155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mP2pSupported) { 5408155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mOperationalMode == CONNECT_MODE) { 5409155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiP2pChannel.sendMessage(WifiStateMachine.CMD_ENABLE_P2P); 5410155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 5411155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // P2P statemachine starts in disabled state, and is not enabled until 5412155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // CMD_ENABLE_P2P is sent from here; so, nothing needs to be done to 5413155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // keep it disabled. 5414155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5415155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5416155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 5417155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande final Intent intent = new Intent(WifiManager.WIFI_SCAN_AVAILABLE); 5418155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); 5419155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande intent.putExtra(WifiManager.EXTRA_SCAN_AVAILABLE, WIFI_STATE_ENABLED); 5420155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL); 5421f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 5422f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle if (PDBG) { 5423f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle loge("Driverstarted State enter done"); 5424f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle } 5425155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5426155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 5427155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande @Override 5428155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public boolean processMessage(Message message) { 5429f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle logStateAndMessage(message, getClass().getSimpleName()); 5430f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 5431155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande switch(message.what) { 5432155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_START_SCAN: 5433b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle handleScanRequest(WifiNative.SCAN_WITHOUT_CONNECTION_SETUP, message); 5434155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 5435155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_SET_BATCHED_SCAN: 5436155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (recordBatchedScanSettings(message.arg1, message.arg2, 5437155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande (Bundle)message.obj)) { 54389bd0507bf45c39dcb6beca7ae885bc790352eda8Wei Wang if (mBatchedScanSettings != null) { 54399bd0507bf45c39dcb6beca7ae885bc790352eda8Wei Wang startBatchedScan(); 54409bd0507bf45c39dcb6beca7ae885bc790352eda8Wei Wang } else { 54419bd0507bf45c39dcb6beca7ae885bc790352eda8Wei Wang stopBatchedScan(); 54429bd0507bf45c39dcb6beca7ae885bc790352eda8Wei Wang } 5443155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5444155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 5445155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_SET_COUNTRY_CODE: 5446155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande String country = (String) message.obj; 54479c22c8ea193360f50ad490368ca6a11af0684362Robert Greenwalt final boolean persist = (message.arg2 == 1); 54489c22c8ea193360f50ad490368ca6a11af0684362Robert Greenwalt final int sequence = message.arg1; 54499c22c8ea193360f50ad490368ca6a11af0684362Robert Greenwalt if (sequence != mCountryCodeSequence.get()) { 54509c22c8ea193360f50ad490368ca6a11af0684362Robert Greenwalt if (DBG) log("set country code ignored due to sequnce num"); 54519c22c8ea193360f50ad490368ca6a11af0684362Robert Greenwalt break; 54529c22c8ea193360f50ad490368ca6a11af0684362Robert Greenwalt } 5453155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (DBG) log("set country code " + country); 54549c22c8ea193360f50ad490368ca6a11af0684362Robert Greenwalt if (persist) { 54559c22c8ea193360f50ad490368ca6a11af0684362Robert Greenwalt mPersistedCountryCode = country; 54569c22c8ea193360f50ad490368ca6a11af0684362Robert Greenwalt Settings.Global.putString(mContext.getContentResolver(), 54579c22c8ea193360f50ad490368ca6a11af0684362Robert Greenwalt Settings.Global.WIFI_COUNTRY_CODE, 54589c22c8ea193360f50ad490368ca6a11af0684362Robert Greenwalt country); 54599c22c8ea193360f50ad490368ca6a11af0684362Robert Greenwalt } 54609c22c8ea193360f50ad490368ca6a11af0684362Robert Greenwalt country = country.toUpperCase(Locale.ROOT); 54619c22c8ea193360f50ad490368ca6a11af0684362Robert Greenwalt if (mLastSetCountryCode == null 54629c22c8ea193360f50ad490368ca6a11af0684362Robert Greenwalt || country.equals(mLastSetCountryCode) == false) { 54639c22c8ea193360f50ad490368ca6a11af0684362Robert Greenwalt if (mWifiNative.setCountryCode(country)) { 54649c22c8ea193360f50ad490368ca6a11af0684362Robert Greenwalt mLastSetCountryCode = country; 54659c22c8ea193360f50ad490368ca6a11af0684362Robert Greenwalt } else { 54669c22c8ea193360f50ad490368ca6a11af0684362Robert Greenwalt loge("Failed to set country code " + country); 5467155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5468155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 54699c22c8ea193360f50ad490368ca6a11af0684362Robert Greenwalt mWifiP2pChannel.sendMessage(WifiP2pServiceImpl.SET_COUNTRY_CODE, country); 5470155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 5471155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_SET_FREQUENCY_BAND: 5472155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande int band = message.arg1; 5473155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (DBG) log("set frequency band " + band); 5474155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mWifiNative.setBand(band)) { 5475f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 5476f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle if (PDBG) loge("did set frequency band " + band); 5477f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 5478155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mFrequencyBand.set(band); 5479931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle // Flush old data - like scan results 5480155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiNative.bssFlush(); 5481931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle // Fetch the latest scan results when frequency band is set 5482be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle startScanNative(WifiNative.SCAN_WITHOUT_CONNECTION_SETUP, null); 5483be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle 5484f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle if (PDBG) loge("done set frequency band " + band); 5485f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 5486155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 5487155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("Failed to set frequency band " + band); 5488155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5489155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 5490155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_BLUETOOTH_ADAPTER_STATE_CHANGE: 5491155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mBluetoothConnectionActive = (message.arg1 != 5492155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande BluetoothAdapter.STATE_DISCONNECTED); 5493155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiNative.setBluetoothCoexistenceScanMode(mBluetoothConnectionActive); 5494155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 5495155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_STOP_DRIVER: 5496155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande int mode = message.arg1; 5497155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 5498155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Already doing a delayed stop */ 5499155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mInDelayedStop) { 5500155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (DBG) log("Already in delayed stop"); 5501155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 5502155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5503155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* disconnect right now, but leave the driver running for a bit */ 5504155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiConfigStore.disableAllNetworks(); 5505155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 5506155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mInDelayedStop = true; 5507155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mDelayedStopCounter++; 5508155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (DBG) log("Delayed stop message " + mDelayedStopCounter); 5509155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 5510155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* send regular delayed shut down */ 5511155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Intent driverStopIntent = new Intent(ACTION_DELAYED_DRIVER_STOP, null); 5512cc9395f7b604c626e8c45021b52dad3abff9bd18Vinit Deshpande driverStopIntent.setPackage(this.getClass().getPackage().getName()); 5513155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande driverStopIntent.putExtra(DELAYED_STOP_COUNTER, mDelayedStopCounter); 5514155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mDriverStopIntent = PendingIntent.getBroadcast(mContext, 5515155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande DRIVER_STOP_REQUEST, driverStopIntent, 5516155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande PendingIntent.FLAG_UPDATE_CURRENT); 5517155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 5518155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mAlarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() 5519155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande + mDriverStopDelayMs, mDriverStopIntent); 5520155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 5521155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_START_DRIVER: 5522155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mInDelayedStop) { 5523155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mInDelayedStop = false; 5524155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mDelayedStopCounter++; 5525155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mAlarmManager.cancel(mDriverStopIntent); 5526155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (DBG) log("Delayed stop ignored due to start"); 5527155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mOperationalMode == CONNECT_MODE) { 5528155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiConfigStore.enableAllNetworks(); 5529155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5530155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5531155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 5532155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_DELAYED_STOP_DRIVER: 5533155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (DBG) log("delayed stop " + message.arg1 + " " + mDelayedStopCounter); 5534155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (message.arg1 != mDelayedStopCounter) break; 5535155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (getCurrentState() != mDisconnectedState) { 5536155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiNative.disconnect(); 5537155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande handleNetworkDisconnect(); 5538155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5539155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWakeLock.acquire(); 5540155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiNative.stopDriver(); 5541155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWakeLock.release(); 5542155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mP2pSupported) { 5543155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande transitionTo(mWaitForP2pDisableState); 5544155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 5545155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande transitionTo(mDriverStoppingState); 5546155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5547155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 5548155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_START_PACKET_FILTERING: 5549155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (message.arg1 == MULTICAST_V6) { 5550155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiNative.startFilteringMulticastV6Packets(); 5551155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else if (message.arg1 == MULTICAST_V4) { 5552155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiNative.startFilteringMulticastV4Packets(); 5553155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 5554155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("Illegal arugments to CMD_START_PACKET_FILTERING"); 5555155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5556155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 5557155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_STOP_PACKET_FILTERING: 5558155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (message.arg1 == MULTICAST_V6) { 5559155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiNative.stopFilteringMulticastV6Packets(); 5560155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else if (message.arg1 == MULTICAST_V4) { 5561155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiNative.stopFilteringMulticastV4Packets(); 5562155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 5563155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("Illegal arugments to CMD_STOP_PACKET_FILTERING"); 5564155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5565155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 5566155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_SET_SUSPEND_OPT_ENABLED: 5567155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (message.arg1 == 1) { 5568155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande setSuspendOptimizationsNative(SUSPEND_DUE_TO_SCREEN, true); 5569155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mSuspendWakeLock.release(); 5570155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 5571155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande setSuspendOptimizationsNative(SUSPEND_DUE_TO_SCREEN, false); 5572155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5573155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 5574155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_SET_HIGH_PERF_MODE: 5575155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (message.arg1 == 1) { 5576155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande setSuspendOptimizationsNative(SUSPEND_DUE_TO_HIGH_PERF, false); 5577155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 5578155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande setSuspendOptimizationsNative(SUSPEND_DUE_TO_HIGH_PERF, true); 5579155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5580155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 5581155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_ENABLE_TDLS: 5582155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (message.obj != null) { 5583155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande String remoteAddress = (String) message.obj; 5584155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande boolean enable = (message.arg1 == 1); 5585155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiNative.startTdls(remoteAddress, enable); 5586155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5587155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 5588155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande default: 5589155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return NOT_HANDLED; 5590155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5591155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return HANDLED; 5592155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5593155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande @Override 5594155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public void exit() { 5595155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mIsRunning = false; 5596155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande updateBatteryWorkSource(null); 5597155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mScanResults = new ArrayList<ScanResult>(); 5598155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 5599155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande stopBatchedScan(); 5600155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 5601155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande final Intent intent = new Intent(WifiManager.WIFI_SCAN_AVAILABLE); 5602155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); 5603155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande intent.putExtra(WifiManager.EXTRA_SCAN_AVAILABLE, WIFI_STATE_DISABLED); 5604155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL); 5605155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande noteScanEnd(); // wrap up any pending request. 5606a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng mBufferedScanMsg.clear(); 5607155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 5608155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mLastSetCountryCode = null; 5609155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5610155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5611155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 5612155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande class WaitForP2pDisableState extends State { 5613155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private State mTransitionToState; 5614155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande @Override 5615155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public void enter() { 5616155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande switch (getCurrentMessage().what) { 5617155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiMonitor.SUP_DISCONNECTION_EVENT: 5618155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mTransitionToState = mInitialState; 5619155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 5620155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_DELAYED_STOP_DRIVER: 5621155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mTransitionToState = mDriverStoppingState; 5622155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 5623155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_STOP_SUPPLICANT: 5624155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mTransitionToState = mSupplicantStoppingState; 5625155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 5626155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande default: 5627155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mTransitionToState = mDriverStoppingState; 5628155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 5629155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5630155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiP2pChannel.sendMessage(WifiStateMachine.CMD_DISABLE_P2P_REQ); 5631155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5632155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande @Override 5633155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public boolean processMessage(Message message) { 5634f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle logStateAndMessage(message, getClass().getSimpleName()); 5635f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 5636155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande switch(message.what) { 5637155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiStateMachine.CMD_DISABLE_P2P_RSP: 5638155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande transitionTo(mTransitionToState); 5639155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 5640155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Defer wifi start/shut and driver commands */ 5641155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiMonitor.SUPPLICANT_STATE_CHANGE_EVENT: 5642155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_START_SUPPLICANT: 5643155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_STOP_SUPPLICANT: 5644155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_START_AP: 5645155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_STOP_AP: 5646155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_START_DRIVER: 5647155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_STOP_DRIVER: 5648155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_SET_OPERATIONAL_MODE: 5649155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_SET_COUNTRY_CODE: 5650155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_SET_FREQUENCY_BAND: 5651155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_START_PACKET_FILTERING: 5652155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_STOP_PACKET_FILTERING: 5653155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_START_SCAN: 5654155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_DISCONNECT: 5655155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_REASSOCIATE: 5656155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_RECONNECT: 5657ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle messageHandlingStatus = MESSAGE_HANDLING_STATUS_DEFERRED; 5658155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande deferMessage(message); 5659155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 5660155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande default: 5661155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return NOT_HANDLED; 5662155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5663155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return HANDLED; 5664155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5665155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5666155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 5667155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande class DriverStoppingState extends State { 5668155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande @Override 5669155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public boolean processMessage(Message message) { 5670f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle logStateAndMessage(message, getClass().getSimpleName()); 5671f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 5672155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande switch(message.what) { 5673155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiMonitor.SUPPLICANT_STATE_CHANGE_EVENT: 5674155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande SupplicantState state = handleSupplicantStateChange(message); 5675155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (state == SupplicantState.INTERFACE_DISABLED) { 5676155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande transitionTo(mDriverStoppedState); 5677155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5678155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 5679155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Queue driver commands */ 5680155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_START_DRIVER: 5681155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_STOP_DRIVER: 5682155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_SET_COUNTRY_CODE: 5683155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_SET_FREQUENCY_BAND: 5684155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_START_PACKET_FILTERING: 5685155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_STOP_PACKET_FILTERING: 5686155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_START_SCAN: 5687155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_DISCONNECT: 5688155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_REASSOCIATE: 5689155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_RECONNECT: 5690ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle messageHandlingStatus = MESSAGE_HANDLING_STATUS_DEFERRED; 5691155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande deferMessage(message); 5692155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 5693155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande default: 5694155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return NOT_HANDLED; 5695155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5696155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return HANDLED; 5697155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5698155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5699155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 5700155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande class DriverStoppedState extends State { 5701155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande @Override 5702155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public boolean processMessage(Message message) { 5703f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle logStateAndMessage(message, getClass().getSimpleName()); 5704155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande switch (message.what) { 5705155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiMonitor.SUPPLICANT_STATE_CHANGE_EVENT: 5706155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande StateChangeResult stateChangeResult = (StateChangeResult) message.obj; 5707155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande SupplicantState state = stateChangeResult.state; 5708155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // A WEXT bug means that we can be back to driver started state 5709155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // unexpectedly 5710155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (SupplicantState.isDriverActive(state)) { 5711155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande transitionTo(mDriverStartedState); 5712155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5713155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 5714155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_START_DRIVER: 5715155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWakeLock.acquire(); 5716155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiNative.startDriver(); 5717155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWakeLock.release(); 5718155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande transitionTo(mDriverStartingState); 5719155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 5720155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande default: 5721155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return NOT_HANDLED; 5722155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5723155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return HANDLED; 5724155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5725155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5726155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 5727155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande class ScanModeState extends State { 5728155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private int mLastOperationMode; 5729155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande @Override 5730155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public void enter() { 5731155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mLastOperationMode = mOperationalMode; 5732155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5733155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande @Override 5734155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public boolean processMessage(Message message) { 5735f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle logStateAndMessage(message, getClass().getSimpleName()); 5736f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 5737155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande switch(message.what) { 5738155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_SET_OPERATIONAL_MODE: 5739155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (message.arg1 == CONNECT_MODE) { 5740155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 5741155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mLastOperationMode == SCAN_ONLY_WITH_WIFI_OFF_MODE) { 5742155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande setWifiState(WIFI_STATE_ENABLED); 5743155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Load and re-enable networks when going back to enabled state 5744155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // This is essential for networks to show up after restore 5745155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiConfigStore.loadAndEnableAllNetworks(); 5746155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiP2pChannel.sendMessage(CMD_ENABLE_P2P); 5747155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 5748155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiConfigStore.enableAllNetworks(); 5749155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5750155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 575168fee36dac1dda5c596c00ef33fdbc0962e9ec9fvandwalle // Try autojoining with recent network already present in the cache 575268fee36dac1dda5c596c00ef33fdbc0962e9ec9fvandwalle // If none are found then trigger a scan which will trigger autojoin 575368fee36dac1dda5c596c00ef33fdbc0962e9ec9fvandwalle // upon reception of scan results event 575468fee36dac1dda5c596c00ef33fdbc0962e9ec9fvandwalle if (!mWifiAutoJoinController.attemptAutoJoin()) { 575568fee36dac1dda5c596c00ef33fdbc0962e9ec9fvandwalle startScan(ENABLE_WIFI, 0, null, null); 575668fee36dac1dda5c596c00ef33fdbc0962e9ec9fvandwalle } 5757155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 5758abd1740f753ac14e9dec8fced8d3de5059122c2avandwalle // Loose last selection choice since user toggled WiFi 5759abd1740f753ac14e9dec8fced8d3de5059122c2avandwalle mWifiConfigStore. 5760abd1740f753ac14e9dec8fced8d3de5059122c2avandwalle setLastSelectedConfiguration(WifiConfiguration.INVALID_NETWORK_ID); 5761abd1740f753ac14e9dec8fced8d3de5059122c2avandwalle 5762155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mOperationalMode = CONNECT_MODE; 5763155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande transitionTo(mDisconnectedState); 5764155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 5765155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Nothing to do 5766155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return HANDLED; 5767155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5768155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 5769155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Handle scan. All the connection related commands are 5770155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // handled only in ConnectModeState 5771155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_START_SCAN: 5772a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng handleScanRequest(WifiNative.SCAN_WITHOUT_CONNECTION_SETUP, message); 5773155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 5774155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande default: 5775155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return NOT_HANDLED; 5776155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5777155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return HANDLED; 5778155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5779155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 5780155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 5781f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 5782f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle String smToString(Message message) { 5783badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti return smToString(message.what); 5784badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti } 5785badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti 5786badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti String smToString(int what) { 5787f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle String s = "unknown"; 5788badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti switch (what) { 5789b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle case WifiMonitor.DRIVER_HUNG_EVENT: 5790b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle s = "DRIVER_HUNG_EVENT"; 5791b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle break; 5792f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case AsyncChannel.CMD_CHANNEL_HALF_CONNECTED: 5793f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle s = "AsyncChannel.CMD_CHANNEL_HALF_CONNECTED"; 5794f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 5795f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case AsyncChannel.CMD_CHANNEL_DISCONNECTED: 5796f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle s = "AsyncChannel.CMD_CHANNEL_DISCONNECTED"; 5797f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 5798f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case CMD_SET_FREQUENCY_BAND: 5799f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle s = "CMD_SET_FREQUENCY_BAND"; 5800f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 58017806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle case CMD_DELAYED_NETWORK_DISCONNECT: 58027806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle s = "CMD_DELAYED_NETWORK_DISCONNECT"; 58037806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle break; 58047806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle case CMD_TEST_NETWORK_DISCONNECT: 58057806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle s = "CMD_TEST_NETWORK_DISCONNECT"; 58067806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle break; 58077806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle case CMD_OBTAINING_IP_ADDRESS_WATCHDOG_TIMER: 58087806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle s = "CMD_OBTAINING_IP_ADDRESS_WATCHDOG_TIMER"; 58097806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle break; 58102ce99b40c36ed0352b31aa85d5f9383d5f0506f5vandwalle case CMD_DISABLE_EPHEMERAL_NETWORK: 58112ce99b40c36ed0352b31aa85d5f9383d5f0506f5vandwalle s = "CMD_DISABLE_EPHEMERAL_NETWORK"; 58122ce99b40c36ed0352b31aa85d5f9383d5f0506f5vandwalle break; 5813f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case CMD_START_DRIVER: 5814f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle s = "CMD_START_DRIVER"; 5815f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 5816f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case CMD_STOP_DRIVER: 5817f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle s = "CMD_STOP_DRIVER"; 5818f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 5819f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case CMD_STOP_SUPPLICANT: 5820f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle s = "CMD_STOP_SUPPLICANT"; 5821f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 5822e6574ec7b6b2e7a678da7f77bdaaf31463852b2fvandwalle case CMD_STOP_SUPPLICANT_FAILED: 5823e6574ec7b6b2e7a678da7f77bdaaf31463852b2fvandwalle s = "CMD_STOP_SUPPLICANT_FAILED"; 5824e6574ec7b6b2e7a678da7f77bdaaf31463852b2fvandwalle break; 5825f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case CMD_START_SUPPLICANT: 5826f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle s = "CMD_START_SUPPLICANT"; 5827f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 5828f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case CMD_REQUEST_AP_CONFIG: 5829f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle s = "CMD_REQUEST_AP_CONFIG"; 5830f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 5831f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case CMD_RESPONSE_AP_CONFIG: 5832f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle s = "CMD_RESPONSE_AP_CONFIG"; 5833f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 5834f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case CMD_TETHER_STATE_CHANGE: 5835f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle s = "CMD_TETHER_STATE_CHANGE"; 5836f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 5837f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case CMD_TETHER_NOTIFICATION_TIMED_OUT: 5838f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle s = "CMD_TETHER_NOTIFICATION_TIMED_OUT"; 5839f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 5840f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case CMD_BLUETOOTH_ADAPTER_STATE_CHANGE: 5841f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle s = "CMD_BLUETOOTH_ADAPTER_STATE_CHANGE"; 5842f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 5843f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case CMD_ADD_OR_UPDATE_NETWORK: 5844931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle s = "CMD_ADD_OR_UPDATE_NETWORK"; 5845f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 5846f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case CMD_REMOVE_NETWORK: 5847931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle s = "CMD_REMOVE_NETWORK"; 5848f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 5849f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case CMD_ENABLE_NETWORK: 5850931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle s = "CMD_ENABLE_NETWORK"; 5851f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 5852f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case CMD_ENABLE_ALL_NETWORKS: 5853931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle s = "CMD_ENABLE_ALL_NETWORKS"; 5854f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 5855f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case CMD_AUTO_CONNECT: 5856f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle s = "CMD_AUTO_CONNECT"; 5857f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 58584dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle case CMD_AUTO_ROAM: 58594dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle s = "CMD_AUTO_ROAM"; 58604dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle break; 5861be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle case CMD_AUTO_SAVE_NETWORK: 5862be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle s = "CMD_AUTO_SAVE_NETWORK"; 5863be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle break; 5864f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case CMD_BOOT_COMPLETED: 5865f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle s = "CMD_BOOT_COMPLETED"; 5866f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 5867f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case DhcpStateMachine.CMD_START_DHCP: 5868b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle s = "CMD_START_DHCP"; 5869f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 5870f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case DhcpStateMachine.CMD_STOP_DHCP: 5871b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle s = "CMD_STOP_DHCP"; 5872f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 5873f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case DhcpStateMachine.CMD_RENEW_DHCP: 5874b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle s = "CMD_RENEW_DHCP"; 5875f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 5876f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case DhcpStateMachine.CMD_PRE_DHCP_ACTION: 5877b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle s = "CMD_PRE_DHCP_ACTION"; 5878f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 5879f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case DhcpStateMachine.CMD_POST_DHCP_ACTION: 5880b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle s = "CMD_POST_DHCP_ACTION"; 5881f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 5882f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case DhcpStateMachine.CMD_PRE_DHCP_ACTION_COMPLETE: 5883b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle s = "CMD_PRE_DHCP_ACTION_COMPLETE"; 5884f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 5885f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case DhcpStateMachine.CMD_ON_QUIT: 5886b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle s = "CMD_ON_QUIT"; 5887f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 5888f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case WifiP2pServiceImpl.DISCONNECT_WIFI_REQUEST: 5889f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle s = "WifiP2pServiceImpl.DISCONNECT_WIFI_REQUEST"; 5890f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 5891f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case WifiManager.DISABLE_NETWORK: 5892931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle s = "WifiManager.DISABLE_NETWORK"; 5893f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 5894f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case CMD_BLACKLIST_NETWORK: 5895931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle s = "CMD_BLACKLIST_NETWORK"; 5896f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 5897f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case CMD_CLEAR_BLACKLIST: 5898931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle s = "CMD_CLEAR_BLACKLIST"; 5899f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 5900f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case CMD_SAVE_CONFIG: 5901931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle s = "CMD_SAVE_CONFIG"; 5902f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 5903f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case CMD_GET_CONFIGURED_NETWORKS: 5904931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle s = "CMD_GET_CONFIGURED_NETWORKS"; 5905f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 5906048dc8df2bd9394979dbb090b0cfe8d6627d23e3Vinit Deshpande case CMD_GET_SUPPORTED_FEATURES: 5907931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle s = "CMD_GET_ADAPTORS"; 5908e6574ec7b6b2e7a678da7f77bdaaf31463852b2fvandwalle break; 5909e6574ec7b6b2e7a678da7f77bdaaf31463852b2fvandwalle case CMD_UNWANTED_NETWORK: 5910e6574ec7b6b2e7a678da7f77bdaaf31463852b2fvandwalle s = "CMD_UNWANTED_NETWORK"; 5911e6574ec7b6b2e7a678da7f77bdaaf31463852b2fvandwalle break; 5912d30127db46224e45554f8964209221bba8ad41d9vandwalle case CMD_NETWORK_STATUS: 5913d30127db46224e45554f8964209221bba8ad41d9vandwalle s = "CMD_NETWORK_STATUS"; 5914d30127db46224e45554f8964209221bba8ad41d9vandwalle break; 5915200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle case CMD_GET_LINK_LAYER_STATS: 5916200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle s = "CMD_GET_LINK_LAYER_STATS"; 5917200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle break; 59189878c61bbd81176561991be025af44efc67332feWenchao Tong case CMD_GET_PRIVILEGED_CONFIGURED_NETWORKS: 5919931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle s = "CMD_GET_PRIVILEGED_CONFIGURED_NETWORKS"; 5920a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande break; 5921f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case CMD_DISCONNECT: 5922931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle s = "CMD_DISCONNECT"; 5923f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 5924f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case CMD_RECONNECT: 5925931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle s = "CMD_RECONNECT"; 5926f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 5927f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case CMD_REASSOCIATE: 5928931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle s = "CMD_REASSOCIATE"; 5929f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 5930c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalle case CMD_GET_CONNECTION_STATISTICS: 5931c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalle s = "CMD_GET_CONNECTION_STATISTICS"; 5932c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalle break; 5933f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case CMD_SET_HIGH_PERF_MODE: 5934931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle s = "CMD_SET_HIGH_PERF_MODE"; 5935f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 5936f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case CMD_SET_COUNTRY_CODE: 5937931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle s = "CMD_SET_COUNTRY_CODE"; 5938f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 5939f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case CMD_ENABLE_RSSI_POLL: 5940931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle s = "CMD_ENABLE_RSSI_POLL"; 5941f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 5942f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case CMD_RSSI_POLL: 5943931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle s = "CMD_RSSI_POLL"; 5944f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 5945f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case CMD_START_PACKET_FILTERING: 5946931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle s = "CMD_START_PACKET_FILTERING"; 5947f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 5948f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case CMD_STOP_PACKET_FILTERING: 5949931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle s = "CMD_STOP_PACKET_FILTERING"; 5950f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 5951f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case CMD_SET_SUSPEND_OPT_ENABLED: 5952931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle s = "CMD_SET_SUSPEND_OPT_ENABLED"; 5953f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 5954f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case CMD_NO_NETWORKS_PERIODIC_SCAN: 5955931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle s = "CMD_NO_NETWORKS_PERIODIC_SCAN"; 5956f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 5957f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case CMD_SET_BATCHED_SCAN: 5958931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle s = "CMD_SET_BATCHED_SCAN"; 5959f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 5960f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case CMD_START_NEXT_BATCHED_SCAN: 5961931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle s = "CMD_START_NEXT_BATCHED_SCAN"; 5962f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 5963f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case CMD_POLL_BATCHED_SCAN: 5964931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle s = "CMD_POLL_BATCHED_SCAN"; 5965f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 5966badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti case CMD_UPDATE_LINKPROPERTIES: 5967badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti s = "CMD_UPDATE_LINKPROPERTIES"; 5968f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 5969f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case CMD_RELOAD_TLS_AND_RECONNECT: 5970931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle s = "CMD_RELOAD_TLS_AND_RECONNECT"; 5971f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 5972f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case WifiManager.CONNECT_NETWORK: 5973931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle s = "CONNECT_NETWORK"; 5974f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 5975f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case WifiManager.SAVE_NETWORK: 5976931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle s = "SAVE_NETWORK"; 5977f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 5978f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case WifiManager.FORGET_NETWORK: 5979b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle s = "FORGET_NETWORK"; 5980f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 5981f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case WifiMonitor.SUP_CONNECTION_EVENT: 5982931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle s = "SUP_CONNECTION_EVENT"; 5983f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 5984f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case WifiMonitor.SUP_DISCONNECTION_EVENT: 5985931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle s = "SUP_DISCONNECTION_EVENT"; 5986f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 5987f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case WifiMonitor.SCAN_RESULTS_EVENT: 5988931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle s = "SCAN_RESULTS_EVENT"; 5989f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 5990f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case WifiMonitor.SUPPLICANT_STATE_CHANGE_EVENT: 5991931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle s = "SUPPLICANT_STATE_CHANGE_EVENT"; 5992f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 5993f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case WifiMonitor.AUTHENTICATION_FAILURE_EVENT: 5994931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle s = "AUTHENTICATION_FAILURE_EVENT"; 5995f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 5996453aee50caf7e332e77ab3d995d7c87a958e4fd4vandwalle case WifiMonitor.SSID_TEMP_DISABLED: 5997931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle s = "SSID_TEMP_DISABLED"; 5998453aee50caf7e332e77ab3d995d7c87a958e4fd4vandwalle break; 5999453aee50caf7e332e77ab3d995d7c87a958e4fd4vandwalle case WifiMonitor.SSID_REENABLED: 6000931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle s = "SSID_REENABLED"; 6001453aee50caf7e332e77ab3d995d7c87a958e4fd4vandwalle break; 6002f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case WifiMonitor.WPS_SUCCESS_EVENT: 6003931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle s = "WPS_SUCCESS_EVENT"; 6004f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 6005f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case WifiMonitor.WPS_FAIL_EVENT: 6006931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle s = "WPS_FAIL_EVENT"; 6007f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 600840ff222cec1bd05879edb53abc75c6deead734cavandwalle case WifiMonitor.SUP_REQUEST_IDENTITY: 600940ff222cec1bd05879edb53abc75c6deead734cavandwalle s = "SUP_REQUEST_IDENTITY"; 601040ff222cec1bd05879edb53abc75c6deead734cavandwalle break; 6011f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case WifiMonitor.NETWORK_CONNECTION_EVENT: 6012931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle s = "NETWORK_CONNECTION_EVENT"; 6013f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 6014f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case WifiMonitor.NETWORK_DISCONNECTION_EVENT: 6015931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle s = "NETWORK_DISCONNECTION_EVENT"; 6016f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 601740ff222cec1bd05879edb53abc75c6deead734cavandwalle case WifiMonitor.ASSOCIATION_REJECTION_EVENT: 6018931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle s = "ASSOCIATION_REJECTION_EVENT"; 601940ff222cec1bd05879edb53abc75c6deead734cavandwalle break; 6020f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case CMD_SET_OPERATIONAL_MODE: 6021931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle s = "CMD_SET_OPERATIONAL_MODE"; 6022f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 6023f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case CMD_START_SCAN: 6024931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle s = "CMD_START_SCAN"; 6025f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 6026b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle case CMD_DISABLE_P2P_RSP: 6027931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle s = "CMD_DISABLE_P2P_RSP"; 6028b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle break; 6029b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle case CMD_DISABLE_P2P_REQ: 6030931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle s = "CMD_DISABLE_P2P_REQ"; 6031b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle break; 603240ff222cec1bd05879edb53abc75c6deead734cavandwalle case WifiWatchdogStateMachine.GOOD_LINK_DETECTED: 603340ff222cec1bd05879edb53abc75c6deead734cavandwalle s = "GOOD_LINK_DETECTED"; 603440ff222cec1bd05879edb53abc75c6deead734cavandwalle break; 603540ff222cec1bd05879edb53abc75c6deead734cavandwalle case WifiWatchdogStateMachine.POOR_LINK_DETECTED: 603640ff222cec1bd05879edb53abc75c6deead734cavandwalle s = "POOR_LINK_DETECTED"; 603740ff222cec1bd05879edb53abc75c6deead734cavandwalle break; 6038931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle case WifiP2pServiceImpl.GROUP_CREATING_TIMED_OUT: 6039931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle s = "GROUP_CREATING_TIMED_OUT"; 6040931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle break; 6041931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle case WifiP2pServiceImpl.P2P_CONNECTION_CHANGED: 6042931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle s = "P2P_CONNECTION_CHANGED"; 6043931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle break; 6044931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle case WifiP2pServiceImpl.DISCONNECT_WIFI_RESPONSE: 6045931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle s = "P2P.DISCONNECT_WIFI_RESPONSE"; 6046931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle break; 6047931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle case WifiP2pServiceImpl.SET_MIRACAST_MODE: 6048931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle s = "P2P.SET_MIRACAST_MODE"; 6049931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle break; 6050931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle case WifiP2pServiceImpl.BLOCK_DISCOVERY: 6051931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle s = "P2P.BLOCK_DISCOVERY"; 6052931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle break; 6053931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle case WifiP2pServiceImpl.SET_COUNTRY_CODE: 6054931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle s = "P2P.SET_COUNTRY_CODE"; 6055931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle break; 6056ede507649471f1113e9e1919812115ca5a6bc0c8vandwalle case WifiManager.CANCEL_WPS: 6057ede507649471f1113e9e1919812115ca5a6bc0c8vandwalle s = "CANCEL_WPS"; 6058ede507649471f1113e9e1919812115ca5a6bc0c8vandwalle break; 6059ede507649471f1113e9e1919812115ca5a6bc0c8vandwalle case WifiManager.CANCEL_WPS_FAILED: 6060ede507649471f1113e9e1919812115ca5a6bc0c8vandwalle s = "CANCEL_WPS_FAILED"; 6061ede507649471f1113e9e1919812115ca5a6bc0c8vandwalle break; 6062ede507649471f1113e9e1919812115ca5a6bc0c8vandwalle case WifiManager.CANCEL_WPS_SUCCEDED: 6063ede507649471f1113e9e1919812115ca5a6bc0c8vandwalle s = "CANCEL_WPS_SUCCEDED"; 6064ede507649471f1113e9e1919812115ca5a6bc0c8vandwalle break; 6065ede507649471f1113e9e1919812115ca5a6bc0c8vandwalle case WifiManager.START_WPS: 6066ede507649471f1113e9e1919812115ca5a6bc0c8vandwalle s = "START_WPS"; 6067ede507649471f1113e9e1919812115ca5a6bc0c8vandwalle break; 6068ede507649471f1113e9e1919812115ca5a6bc0c8vandwalle case WifiManager.START_WPS_SUCCEEDED: 6069ede507649471f1113e9e1919812115ca5a6bc0c8vandwalle s = "START_WPS_SUCCEEDED"; 6070ede507649471f1113e9e1919812115ca5a6bc0c8vandwalle break; 6071ede507649471f1113e9e1919812115ca5a6bc0c8vandwalle case WifiManager.WPS_FAILED: 6072ede507649471f1113e9e1919812115ca5a6bc0c8vandwalle s = "WPS_FAILED"; 6073ede507649471f1113e9e1919812115ca5a6bc0c8vandwalle break; 6074ede507649471f1113e9e1919812115ca5a6bc0c8vandwalle case WifiManager.WPS_COMPLETED: 6075ede507649471f1113e9e1919812115ca5a6bc0c8vandwalle s = "WPS_COMPLETED"; 6076ede507649471f1113e9e1919812115ca5a6bc0c8vandwalle break; 6077326120045502363422cf5c52a467163d4bcb703avandwalle case WifiManager.RSSI_PKTCNT_FETCH: 6078326120045502363422cf5c52a467163d4bcb703avandwalle s = "RSSI_PKTCNT_FETCH"; 6079326120045502363422cf5c52a467163d4bcb703avandwalle break; 6080c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle case CMD_IP_CONFIGURATION_LOST: 6081c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle s = "CMD_IP_CONFIGURATION_LOST"; 6082c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle break; 6083c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle case CMD_IP_CONFIGURATION_SUCCESSFUL: 6084c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle s = "CMD_IP_CONFIGURATION_SUCCESSFUL"; 6085c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle break; 6086badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti case CMD_STATIC_IP_SUCCESS: 6087badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti s = "CMD_STATIC_IP_SUCCESSFUL"; 6088badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti break; 6089badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti case CMD_STATIC_IP_FAILURE: 6090badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti s = "CMD_STATIC_IP_FAILURE"; 6091badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti break; 6092badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti case DhcpStateMachine.DHCP_SUCCESS: 6093badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti s = "DHCP_SUCCESS"; 6094badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti break; 6095badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti case DhcpStateMachine.DHCP_FAILURE: 6096badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti s = "DHCP_FAILURE"; 6097badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti break; 6098e6574ec7b6b2e7a678da7f77bdaaf31463852b2fvandwalle case CMD_TARGET_BSSID: 6099e6574ec7b6b2e7a678da7f77bdaaf31463852b2fvandwalle s = "CMD_TARGET_BSSID"; 6100e6574ec7b6b2e7a678da7f77bdaaf31463852b2fvandwalle break; 61019f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle case CMD_ASSOCIATED_BSSID: 61029f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle s = "CMD_ASSOCIATED_BSSID"; 61039f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle break; 61040d616ef3bf635dff8722e064c0be842676390ed8vandwalle case CMD_ROAM_WATCHDOG_TIMER: 61050d616ef3bf635dff8722e064c0be842676390ed8vandwalle s = "CMD_ROAM_WATCHDOG_TIMER"; 61060d616ef3bf635dff8722e064c0be842676390ed8vandwalle break; 610782199a285f4a45a46b44eb8253999aa918534753vandwalle case CMD_SCREEN_STATE_CHANGED: 610882199a285f4a45a46b44eb8253999aa918534753vandwalle s = "CMD_SCREEN_STATE_CHANGED"; 610982199a285f4a45a46b44eb8253999aa918534753vandwalle break; 61107b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle case CMD_DISCONNECTING_WATCHDOG_TIMER: 61117b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle s = "CMD_DISCONNECTING_WATCHDOG_TIMER"; 61127b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle break; 6113b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle default: 6114badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti s = "what:" + Integer.toString(what); 6115b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle break; 6116f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle } 6117f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle return s; 6118f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle } 6119f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 61204dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle void registerConnected() { 61214dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle if (mLastNetworkId != WifiConfiguration.INVALID_NETWORK_ID) { 61224dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle long now_ms = System.currentTimeMillis(); 6123931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle // We are switching away from this configuration, 6124931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle // hence record the time we were connected last 61254dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle WifiConfiguration config = mWifiConfigStore.getWifiConfiguration(mLastNetworkId); 61264dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle if (config != null) { 61274dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle config.lastConnected = System.currentTimeMillis(); 61280eebae7334d6129f7ca1344e4b20199794994358vandwalle config.autoJoinBailedDueToLowRssi = false; 61290eebae7334d6129f7ca1344e4b20199794994358vandwalle config.setAutoJoinStatus(WifiConfiguration.AUTO_JOIN_ENABLED); 6130e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle config.numConnectionFailures = 0; 6131e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle config.numIpConfigFailures = 0; 6132e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle config.numAuthFailures = 0; 6133e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle config.numAssociation++; 61344dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle } 61357736c07a4cad4e2d86e1ec2f4221c7f788c18d3avandwalle mBadLinkspeedcount = 0; 61364dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle } 61374dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle } 61384dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle 61394dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle void registerDisconnected() { 61404dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle if (mLastNetworkId != WifiConfiguration.INVALID_NETWORK_ID) { 61414dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle long now_ms = System.currentTimeMillis(); 6142931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle // We are switching away from this configuration, 6143931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle // hence record the time we were connected last 61444dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle WifiConfiguration config = mWifiConfigStore.getWifiConfiguration(mLastNetworkId); 61454dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle if (config != null) { 61464dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle config.lastDisconnected = System.currentTimeMillis(); 61472ce99b40c36ed0352b31aa85d5f9383d5f0506f5vandwalle if (config.ephemeral) { 61482ce99b40c36ed0352b31aa85d5f9383d5f0506f5vandwalle // Remove ephemeral WifiConfigurations from file 61492ce99b40c36ed0352b31aa85d5f9383d5f0506f5vandwalle mWifiConfigStore.forgetNetwork(mLastNetworkId); 61502ce99b40c36ed0352b31aa85d5f9383d5f0506f5vandwalle } 61514dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle } 61524dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle } 61534dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle } 61544dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle 61559f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle void noteWifiDisabledWhileAssociated() { 61569f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle // We got disabled by user while we were associated, make note of it 61579f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle int rssi = mWifiInfo.getRssi(); 61589f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle WifiConfiguration config = getCurrentWifiConfiguration(); 61599f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle if (getCurrentState() == mConnectedState 61609f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle && rssi != WifiInfo.INVALID_RSSI 61619f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle && config != null) { 61629f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle boolean is24GHz = mWifiInfo.is24GHz(); 61639f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle boolean isBadRSSI = (is24GHz && rssi < mWifiConfigStore.thresholdBadRssi24) 61649f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle || (!is24GHz && rssi < mWifiConfigStore.thresholdBadRssi5); 61659f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle boolean isLowRSSI = (is24GHz && rssi < mWifiConfigStore.thresholdLowRssi24) 61669f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle || (!is24GHz && mWifiInfo.getRssi() < mWifiConfigStore.thresholdLowRssi5); 61679f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle boolean isHighRSSI = (is24GHz && rssi >= mWifiConfigStore.thresholdGoodRssi24) 61689f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle || (!is24GHz && mWifiInfo.getRssi() >= mWifiConfigStore.thresholdGoodRssi5); 61699f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle if (isBadRSSI) { 61709f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle // Take note that we got disabled while RSSI was Bad 61719f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle config.numUserTriggeredWifiDisableLowRSSI++; 61729f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle } else if (isLowRSSI) { 61739f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle // Take note that we got disabled while RSSI was Low 61749f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle config.numUserTriggeredWifiDisableBadRSSI++; 61759f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle } else if (!isHighRSSI) { 61769f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle // Take note that we got disabled while RSSI was Not high 61779f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle config.numUserTriggeredWifiDisableNotHighRSSI++; 61789f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle } 61799f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle } 61809f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle } 61819f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle 6182f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle WifiConfiguration getCurrentWifiConfiguration() { 6183f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle if (mLastNetworkId == WifiConfiguration.INVALID_NETWORK_ID) { 6184f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle return null; 6185f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle } 6186f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle return mWifiConfigStore.getWifiConfiguration(mLastNetworkId); 6187f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle } 6188f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 6189e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle ScanResult getCurrentScanResult() { 6190e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle WifiConfiguration config = getCurrentWifiConfiguration(); 6191e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle if (config == null) { 6192e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle return null; 6193e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle } 6194e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle String BSSID = mWifiInfo.getBSSID(); 6195e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle if (BSSID == null) { 6196e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle BSSID = mTargetRoamBSSID; 6197e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle } 6198e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle if (config.scanResultCache == null) { 6199e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle return null; 6200e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle } 6201e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle return config.scanResultCache.get(BSSID); 6202e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle } 6203e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle 62044dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle String getCurrentBSSID() { 62057806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle if (linkDebouncing) { 62067806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle return null; 62077806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle } 62084dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle return mLastBssid; 62094dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle } 62104dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle 6211155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande class ConnectModeState extends State { 6212155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande @Override 6213155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public boolean processMessage(Message message) { 6214155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande WifiConfiguration config; 6215f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle int netId; 6216155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande boolean ok; 6217e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle boolean didDisconnect; 621840ff222cec1bd05879edb53abc75c6deead734cavandwalle String bssid; 621940ff222cec1bd05879edb53abc75c6deead734cavandwalle String ssid; 6220b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle NetworkUpdateResult result; 6221f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle logStateAndMessage(message, getClass().getSimpleName()); 6222f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 6223200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle switch (message.what) { 6224155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiMonitor.ASSOCIATION_REJECTION_EVENT: 62252451dbcc4f9641df188326215b204b798eb70c46vandwalle didBlackListBSSID = false; 6226200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle bssid = (String) message.obj; 6227931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle if (bssid == null || TextUtils.isEmpty(bssid)) { 6228931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle // If BSSID is null, use the target roam BSSID 622940ff222cec1bd05879edb53abc75c6deead734cavandwalle bssid = mTargetRoamBSSID; 6230931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle } 623140ff222cec1bd05879edb53abc75c6deead734cavandwalle if (bssid != null) { 6232931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle // If we have a BSSID, tell configStore to black list it 6233e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle synchronized(mScanResultCache) { 6234e0ba94ba9abde13173ae0de8c8939aa4eb9a9085vandwalle didBlackListBSSID = mWifiConfigStore.handleBSSIDBlackList 6235e0ba94ba9abde13173ae0de8c8939aa4eb9a9085vandwalle (mLastNetworkId, bssid, false); 6236e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle } 623740ff222cec1bd05879edb53abc75c6deead734cavandwalle } 6238155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mSupplicantStateTracker.sendMessage(WifiMonitor.ASSOCIATION_REJECTION_EVENT); 6239155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 6240155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiMonitor.AUTHENTICATION_FAILURE_EVENT: 6241155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mSupplicantStateTracker.sendMessage(WifiMonitor.AUTHENTICATION_FAILURE_EVENT); 6242ede1310be531a84faa08f02c3fd243448dd936ddvandwalle break; 6243ede1310be531a84faa08f02c3fd243448dd936ddvandwalle case WifiMonitor.SSID_TEMP_DISABLED: 6244ede1310be531a84faa08f02c3fd243448dd936ddvandwalle case WifiMonitor.SSID_REENABLED: 6245200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle String substr = (String) message.obj; 6246ede1310be531a84faa08f02c3fd243448dd936ddvandwalle String en = message.what == WifiMonitor.SSID_TEMP_DISABLED ? 6247200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle "temp-disabled" : "re-enabled"; 6248ede1310be531a84faa08f02c3fd243448dd936ddvandwalle loge("ConnectModeState SSID state=" + en + " nid=" 6249ede1310be531a84faa08f02c3fd243448dd936ddvandwalle + Integer.toString(message.arg1) + " [" + substr + "]"); 6250e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle synchronized(mScanResultCache) { 6251e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle mWifiConfigStore.handleSSIDStateChange(message.arg1, message.what == 6252e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle WifiMonitor.SSID_REENABLED, substr, mWifiInfo.getBSSID()); 6253e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle } 6254155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 6255155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiMonitor.SUPPLICANT_STATE_CHANGE_EVENT: 6256155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande SupplicantState state = handleSupplicantStateChange(message); 6257155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // A driver/firmware hang can now put the interface in a down state. 6258155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // We detect the interface going down and recover from it 6259155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (!SupplicantState.isDriverActive(state)) { 6260155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mNetworkInfo.getState() != NetworkInfo.State.DISCONNECTED) { 6261155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande handleNetworkDisconnect(); 6262155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 6263155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande log("Detected an interface down, restart driver"); 6264155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande transitionTo(mDriverStoppedState); 6265155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendMessage(CMD_START_DRIVER); 6266155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 6267155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 6268155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 6269155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Supplicant can fail to report a NETWORK_DISCONNECTION_EVENT 6270155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // when authentication times out after a successful connection, 6271155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // we can figure this from the supplicant state. If supplicant 6272155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // state is DISCONNECTED, but the mNetworkInfo says we are not 6273155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // disconnected, we need to handle a disconnection 62747806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle if (!linkDebouncing && state == SupplicantState.DISCONNECTED && 6275155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mNetworkInfo.getState() != NetworkInfo.State.DISCONNECTED) { 6276155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (DBG) log("Missed CTRL-EVENT-DISCONNECTED, disconnect"); 6277155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande handleNetworkDisconnect(); 6278155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande transitionTo(mDisconnectedState); 6279155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 6280155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 6281155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiP2pServiceImpl.DISCONNECT_WIFI_REQUEST: 6282155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (message.arg1 == 1) { 6283155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiNative.disconnect(); 6284155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mTemporarilyDisconnectWifi = true; 6285155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 6286155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiNative.reconnect(); 6287155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mTemporarilyDisconnectWifi = false; 6288155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 6289155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 6290155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_ADD_OR_UPDATE_NETWORK: 6291155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande config = (WifiConfiguration) message.obj; 62922f2cf21662275a0e93d7d7a6ad3d98b4c596dcf0vandwalle int res = mWifiConfigStore.addOrUpdateNetwork(config, message.sendingUid); 6293b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle if (res < 0) { 6294b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle messageHandlingStatus = MESSAGE_HANDLING_STATUS_FAIL; 6295b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle } else { 6296b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle WifiConfiguration curConfig = getCurrentWifiConfiguration(); 6297b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle if (curConfig != null && config != null) { 62982f2cf21662275a0e93d7d7a6ad3d98b4c596dcf0vandwalle if (curConfig.priority < config.priority 62992f2cf21662275a0e93d7d7a6ad3d98b4c596dcf0vandwalle && config.status == WifiConfiguration.Status.ENABLED) { 6300b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle // Interpret this as a connect attempt 6301b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle // Set the last selected configuration so as to allow the system to 6302b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle // stick the last user choice without persisting the choice 6303b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle mWifiConfigStore.setLastSelectedConfiguration(res); 6304b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle 6305b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle // Remember time of last connection attempt 6306b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle lastConnectAttempt = System.currentTimeMillis(); 6307b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle 6308b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle mWifiConnectionStatistics.numWifiManagerJoinAttempt++; 6309b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle 6310b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle // As a courtesy to the caller, trigger a scan now 6311b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle startScan(ADD_OR_UPDATE_SOURCE, 0, null, null); 6312b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle } 6313b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle } 6314b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle } 6315b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle replyToMessage(message, CMD_ADD_OR_UPDATE_NETWORK, res); 6316155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 6317155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_REMOVE_NETWORK: 6318155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande ok = mWifiConfigStore.removeNetwork(message.arg1); 6319b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle if (!ok) { 6320b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle messageHandlingStatus = MESSAGE_HANDLING_STATUS_FAIL; 6321b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle } 6322155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande replyToMessage(message, message.what, ok ? SUCCESS : FAILURE); 6323155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 6324155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_ENABLE_NETWORK: 6325ecd2b88214b5d214fd1f63a9560caff9058912ddvandwalle boolean others = message.arg2 == 1; 6326992ae00f25a9cc22cf5db3261bd7e72927069cf7vandwalle // Tell autojoin the user did try to select to that network 6327992ae00f25a9cc22cf5db3261bd7e72927069cf7vandwalle // However, do NOT persist the choice by bumping the priority of the network 6328b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle if (others) { 6329992ae00f25a9cc22cf5db3261bd7e72927069cf7vandwalle mWifiAutoJoinController. 6330992ae00f25a9cc22cf5db3261bd7e72927069cf7vandwalle updateConfigurationHistory(message.arg1, true, false); 6331b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle // Set the last selected configuration so as to allow the system to 6332b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle // stick the last user choice without persisting the choice 6333b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle mWifiConfigStore.setLastSelectedConfiguration(message.arg1); 633452e79f112225e158c5de12685e55906de5e222b9vandwalle 6335931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle // Remember time of last connection attempt 633652e79f112225e158c5de12685e55906de5e222b9vandwalle lastConnectAttempt = System.currentTimeMillis(); 6337e8c89583e489d451880471b7cc7659bd9fa802f4vandwalle 6338e8c89583e489d451880471b7cc7659bd9fa802f4vandwalle mWifiConnectionStatistics.numWifiManagerJoinAttempt++; 6339992ae00f25a9cc22cf5db3261bd7e72927069cf7vandwalle } 6340931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle // Cancel auto roam requests 6341b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle autoRoamSetBSSID(message.arg1, "any"); 6342b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle 6343155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande ok = mWifiConfigStore.enableNetwork(message.arg1, message.arg2 == 1); 6344b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle if (!ok) { 6345b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle messageHandlingStatus = MESSAGE_HANDLING_STATUS_FAIL; 6346b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle } 6347155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande replyToMessage(message, message.what, ok ? SUCCESS : FAILURE); 6348155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 6349155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_ENABLE_ALL_NETWORKS: 6350200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle long time = android.os.SystemClock.elapsedRealtime(); 6351155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (time - mLastEnableAllNetworksTime > MIN_INTERVAL_ENABLE_ALL_NETWORKS_MS) { 6352155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiConfigStore.enableAllNetworks(); 6353155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mLastEnableAllNetworksTime = time; 6354155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 6355155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 6356155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiManager.DISABLE_NETWORK: 6357155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mWifiConfigStore.disableNetwork(message.arg1, 63580eebae7334d6129f7ca1344e4b20199794994358vandwalle WifiConfiguration.DISABLED_BY_WIFI_MANAGER) == true) { 6359155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande replyToMessage(message, WifiManager.DISABLE_NETWORK_SUCCEEDED); 6360155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 6361b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle messageHandlingStatus = MESSAGE_HANDLING_STATUS_FAIL; 6362155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande replyToMessage(message, WifiManager.DISABLE_NETWORK_FAILED, 6363155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande WifiManager.ERROR); 6364155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 6365155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 63662ce99b40c36ed0352b31aa85d5f9383d5f0506f5vandwalle case CMD_DISABLE_EPHEMERAL_NETWORK: 63672ce99b40c36ed0352b31aa85d5f9383d5f0506f5vandwalle config = mWifiConfigStore.disableEphemeralNetwork((String)message.obj); 63682ce99b40c36ed0352b31aa85d5f9383d5f0506f5vandwalle if (config != null) { 63692ce99b40c36ed0352b31aa85d5f9383d5f0506f5vandwalle if (config.networkId == mLastNetworkId) { 63702ce99b40c36ed0352b31aa85d5f9383d5f0506f5vandwalle // Disconnect and let autojoin reselect a new network 63712ce99b40c36ed0352b31aa85d5f9383d5f0506f5vandwalle sendMessage(CMD_DISCONNECT); 63722ce99b40c36ed0352b31aa85d5f9383d5f0506f5vandwalle } 63732ce99b40c36ed0352b31aa85d5f9383d5f0506f5vandwalle } 63742ce99b40c36ed0352b31aa85d5f9383d5f0506f5vandwalle break; 6375155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_BLACKLIST_NETWORK: 6376200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle mWifiNative.addToBlacklist((String) message.obj); 6377155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 6378155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_CLEAR_BLACKLIST: 6379155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiNative.clearBlacklist(); 6380155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 6381155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_SAVE_CONFIG: 6382155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande ok = mWifiConfigStore.saveConfig(); 6383f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 6384b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle if (DBG) loge("wifistatemachine did save config " + ok); 6385155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande replyToMessage(message, CMD_SAVE_CONFIG, ok ? SUCCESS : FAILURE); 6386155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 6387155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Inform the backup manager about a data change 6388155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande IBackupManager ibm = IBackupManager.Stub.asInterface( 6389155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande ServiceManager.getService(Context.BACKUP_SERVICE)); 6390155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (ibm != null) { 6391155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande try { 6392155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande ibm.dataChanged("com.android.providers.settings"); 6393155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } catch (Exception e) { 6394155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Try again later 6395155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 6396155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 6397155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 6398155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_GET_CONFIGURED_NETWORKS: 6399155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande replyToMessage(message, message.what, 6400155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiConfigStore.getConfiguredNetworks()); 6401155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 640240ff222cec1bd05879edb53abc75c6deead734cavandwalle case WifiMonitor.SUP_REQUEST_IDENTITY: 6403931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle // Supplicant lacks credentials to connect to that network, hence black list 6404931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle ssid = (String) message.obj; 640540ff222cec1bd05879edb53abc75c6deead734cavandwalle 640640ff222cec1bd05879edb53abc75c6deead734cavandwalle if (targetWificonfiguration != null && ssid != null 640740ff222cec1bd05879edb53abc75c6deead734cavandwalle && targetWificonfiguration.SSID != null 640840ff222cec1bd05879edb53abc75c6deead734cavandwalle && targetWificonfiguration.SSID.equals("\"" + ssid + "\"")) { 640940ff222cec1bd05879edb53abc75c6deead734cavandwalle mWifiConfigStore.handleSSIDStateChange(targetWificonfiguration.networkId, 6410e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle false, "AUTH_FAILED no identity", null); 641140ff222cec1bd05879edb53abc75c6deead734cavandwalle } 6412931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle // Disconnect now, as we don't have any way to fullfill the supplicant request. 6413931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle mWifiConfigStore.setLastSelectedConfiguration 6414931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle (WifiConfiguration.INVALID_NETWORK_ID); 6415931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle mWifiNative.disconnect(); 6416931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle break; 641733b575ca6bee66183929f9474b5a161432918604Vinit Deshpande case WifiMonitor.SUP_REQUEST_SIM_AUTH: 641833b575ca6bee66183929f9474b5a161432918604Vinit Deshpande logd("Received SUP_REQUEST_SIM_AUTH"); 641933b575ca6bee66183929f9474b5a161432918604Vinit Deshpande SimAuthRequestData requestData = (SimAuthRequestData) message.obj; 642033b575ca6bee66183929f9474b5a161432918604Vinit Deshpande if (requestData != null) { 6421dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande if (requestData.protocol == WifiEnterpriseConfig.Eap.SIM) { 6422dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande handleGsmAuthRequest(requestData); 6423dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande } else if (requestData.protocol == WifiEnterpriseConfig.Eap.AKA) { 6424dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande handle3GAuthRequest(requestData); 6425dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande } 642633b575ca6bee66183929f9474b5a161432918604Vinit Deshpande } else { 642733b575ca6bee66183929f9474b5a161432918604Vinit Deshpande loge("Invalid sim auth request"); 642833b575ca6bee66183929f9474b5a161432918604Vinit Deshpande } 642933b575ca6bee66183929f9474b5a161432918604Vinit Deshpande break; 64309878c61bbd81176561991be025af44efc67332feWenchao Tong case CMD_GET_PRIVILEGED_CONFIGURED_NETWORKS: 64319878c61bbd81176561991be025af44efc67332feWenchao Tong replyToMessage(message, message.what, 64329878c61bbd81176561991be025af44efc67332feWenchao Tong mWifiConfigStore.getPrivilegedConfiguredNetworks()); 64339878c61bbd81176561991be025af44efc67332feWenchao Tong break; 64349878c61bbd81176561991be025af44efc67332feWenchao Tong /* Do a redundant disconnect without transition */ 6435155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_DISCONNECT: 6436117be607246604e875de62aa8cdd99700b77a2b4vandwalle mWifiConfigStore.setLastSelectedConfiguration 6437ecd2b88214b5d214fd1f63a9560caff9058912ddvandwalle (WifiConfiguration.INVALID_NETWORK_ID); 6438155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiNative.disconnect(); 6439155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 6440155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_RECONNECT: 6441f5a84fcd66298ee6e96b781d2645422a1571ac07Vinit Deshpande mWifiAutoJoinController.attemptAutoJoin(); 6442155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 6443155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_REASSOCIATE: 6444b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle lastConnectAttempt = System.currentTimeMillis(); 6445155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiNative.reassociate(); 6446155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 6447155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_RELOAD_TLS_AND_RECONNECT: 6448155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mWifiConfigStore.needsUnlockedKeyStore()) { 6449155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande logd("Reconnecting to give a chance to un-connected TLS networks"); 6450155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiNative.disconnect(); 6451b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle lastConnectAttempt = System.currentTimeMillis(); 6452155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiNative.reconnect(); 6453155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 6454155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 64554dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle case CMD_AUTO_ROAM: 6456b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle messageHandlingStatus = MESSAGE_HANDLING_STATUS_DISCARD; 64574dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle return HANDLED; 6458f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle case CMD_AUTO_CONNECT: 6459952d359198cb1f04c180fc0f795dc316fe97cb5evandwalle /* Work Around: wpa_supplicant can get in a bad state where it returns a non 64607806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle * associated status to the STATUS command but somehow-someplace still thinks 64611e0d2b64c03a05da87d59a5f0774e549e82080ccvandwalle * it is associated and thus will ignore select/reconnect command with 64621e0d2b64c03a05da87d59a5f0774e549e82080ccvandwalle * following message: 64631e0d2b64c03a05da87d59a5f0774e549e82080ccvandwalle * "Already associated with the selected network - do nothing" 64641e0d2b64c03a05da87d59a5f0774e549e82080ccvandwalle * 6465952d359198cb1f04c180fc0f795dc316fe97cb5evandwalle * Hence, sends a disconnect to supplicant first. 64661e0d2b64c03a05da87d59a5f0774e549e82080ccvandwalle */ 6467e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle didDisconnect = false; 6468e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle if (getCurrentState() != mDisconnectedState) { 6469e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle /** Supplicant will ignore the reconnect if we are currently associated, 6470e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle * hence trigger a disconnect 6471e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle */ 6472e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle didDisconnect = true; 6473e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle mWifiNative.disconnect(); 6474e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle } 64751e0d2b64c03a05da87d59a5f0774e549e82080ccvandwalle 6476f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle /* connect command coming from auto-join */ 6477f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle config = (WifiConfiguration) message.obj; 6478f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle netId = message.arg1; 64794dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle int roam = message.arg2; 6480ecd2b88214b5d214fd1f63a9560caff9058912ddvandwalle loge("CMD_AUTO_CONNECT sup state " 6481ecd2b88214b5d214fd1f63a9560caff9058912ddvandwalle + mSupplicantStateTracker.getSupplicantStateName() 6482f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle + " my state " + getCurrentState().getName() 64834dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle + " nid=" + Integer.toString(netId) 64844dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle + " roam=" + Integer.toString(roam)); 6485b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle if (config == null) { 6486b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle loge("AUTO_CONNECT and no config, bail out..."); 6487b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle break; 6488b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle } 64894dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle 6490931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle /* Make sure we cancel any previous roam request */ 64919f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle autoRoamSetBSSID(netId, config.BSSID); 6492f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 6493f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle /* Save the network config */ 6494b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle loge("CMD_AUTO_CONNECT will save config -> " + config.SSID 6495200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle + " nid=" + Integer.toString(netId)); 64960eebae7334d6129f7ca1344e4b20199794994358vandwalle result = mWifiConfigStore.saveNetwork(config, -1); 6497b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle netId = result.getNetworkId(); 6498b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle loge("CMD_AUTO_CONNECT did save config -> " 6499200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle + " nid=" + Integer.toString(netId)); 6500f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 6501b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle // Make sure the network is enabled, since supplicant will not reenable it 6502b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle mWifiConfigStore.enableNetworkWithoutBroadcast(netId, false); 6503b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle 6504f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle if (mWifiConfigStore.selectNetwork(netId) && 6505f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle mWifiNative.reconnect()) { 6506b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle lastConnectAttempt = System.currentTimeMillis(); 650740ff222cec1bd05879edb53abc75c6deead734cavandwalle targetWificonfiguration = mWifiConfigStore.getWifiConfiguration(netId); 6508833dcce8f6712f7594f06ea33208e3e106c15afcvandwalle config = mWifiConfigStore.getWifiConfiguration(netId); 6509833dcce8f6712f7594f06ea33208e3e106c15afcvandwalle if (config != null 6510833dcce8f6712f7594f06ea33208e3e106c15afcvandwalle && !mWifiConfigStore.isLastSelectedConfiguration(config)) { 6511833dcce8f6712f7594f06ea33208e3e106c15afcvandwalle // If we autojoined a different config than the user selected one, 6512833dcce8f6712f7594f06ea33208e3e106c15afcvandwalle // it means we could not see the last user selection, 6513833dcce8f6712f7594f06ea33208e3e106c15afcvandwalle // or that the last user selection was faulty and ended up blacklisted 6514833dcce8f6712f7594f06ea33208e3e106c15afcvandwalle // for some reason (in which case the user is notified with an error 6515833dcce8f6712f7594f06ea33208e3e106c15afcvandwalle // message in the Wifi picker), and thus we managed to auto-join away 6516833dcce8f6712f7594f06ea33208e3e106c15afcvandwalle // from the selected config. -> in that case we need to forget 6517833dcce8f6712f7594f06ea33208e3e106c15afcvandwalle // the selection because we don't want to abruptly switch back to it. 6518833dcce8f6712f7594f06ea33208e3e106c15afcvandwalle // 6519833dcce8f6712f7594f06ea33208e3e106c15afcvandwalle // Note that the user selection is also forgotten after a period of time 6520833dcce8f6712f7594f06ea33208e3e106c15afcvandwalle // during which the device has been disconnected. 6521833dcce8f6712f7594f06ea33208e3e106c15afcvandwalle // The default value is 30 minutes : see the code path at bottom of 6522833dcce8f6712f7594f06ea33208e3e106c15afcvandwalle // setScanResults() function. 6523833dcce8f6712f7594f06ea33208e3e106c15afcvandwalle mWifiConfigStore. 6524833dcce8f6712f7594f06ea33208e3e106c15afcvandwalle setLastSelectedConfiguration(WifiConfiguration.INVALID_NETWORK_ID); 6525833dcce8f6712f7594f06ea33208e3e106c15afcvandwalle } 6526b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle mAutoRoaming = roam; 65277806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle if (isRoaming() || linkDebouncing) { 65284dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle transitionTo(mRoamingState); 6529e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle } else if (didDisconnect) { 65304dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle transitionTo(mDisconnectingState); 6531e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle } else { 6532cce5b9e0eded28096991578e020883484ece8c54Vinit Deshpande /* Already in disconnected state, nothing to change */ 65334dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle } 6534f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle } else { 6535f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle loge("Failed to connect config: " + config + " netId: " + netId); 6536f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle replyToMessage(message, WifiManager.CONNECT_NETWORK_FAILED, 6537f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle WifiManager.ERROR); 6538f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 6539f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle } 6540f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle break; 6541155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiManager.CONNECT_NETWORK: 6542931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle /** 6543931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle * The connect message can contain a network id passed as arg1 on message or 6544155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * or a config passed as obj on message. 6545155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * For a new network, a config is passed to create and connect. 6546155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * For an existing network, a network id is passed 6547155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 6548f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle netId = message.arg1; 6549155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande config = (WifiConfiguration) message.obj; 6550e8c89583e489d451880471b7cc7659bd9fa802f4vandwalle mWifiConnectionStatistics.numWifiManagerJoinAttempt++; 65513aed1e5a7a7f2ec730c393e2c7d129e3e551a711Jeff Davidson boolean updatedExisting = false; 6552155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 6553448c9536a302c58a79e271b1721c08b8882f800evandwalle /* Save the network config */ 6554448c9536a302c58a79e271b1721c08b8882f800evandwalle if (config != null) { 65553aed1e5a7a7f2ec730c393e2c7d129e3e551a711Jeff Davidson String configKey = config.configKey(true /* allowCached */); 65563aed1e5a7a7f2ec730c393e2c7d129e3e551a711Jeff Davidson WifiConfiguration savedConfig = 65573aed1e5a7a7f2ec730c393e2c7d129e3e551a711Jeff Davidson mWifiConfigStore.getWifiConfiguration(configKey); 65583aed1e5a7a7f2ec730c393e2c7d129e3e551a711Jeff Davidson if (savedConfig != null) { 65593aed1e5a7a7f2ec730c393e2c7d129e3e551a711Jeff Davidson // There is an existing config with this netId, but it wasn't exposed 65603aed1e5a7a7f2ec730c393e2c7d129e3e551a711Jeff Davidson // (either AUTO_JOIN_DELETED or ephemeral; see WifiConfigStore# 65613aed1e5a7a7f2ec730c393e2c7d129e3e551a711Jeff Davidson // getConfiguredNetworks). Remove those bits and update the config. 65623aed1e5a7a7f2ec730c393e2c7d129e3e551a711Jeff Davidson config = savedConfig; 65633aed1e5a7a7f2ec730c393e2c7d129e3e551a711Jeff Davidson loge("CONNECT_NETWORK updating existing config with id=" + 65643aed1e5a7a7f2ec730c393e2c7d129e3e551a711Jeff Davidson config.networkId + " configKey=" + configKey); 65653aed1e5a7a7f2ec730c393e2c7d129e3e551a711Jeff Davidson config.ephemeral = false; 65663aed1e5a7a7f2ec730c393e2c7d129e3e551a711Jeff Davidson config.autoJoinStatus = WifiConfiguration.AUTO_JOIN_ENABLED; 65673aed1e5a7a7f2ec730c393e2c7d129e3e551a711Jeff Davidson updatedExisting = true; 65683aed1e5a7a7f2ec730c393e2c7d129e3e551a711Jeff Davidson } 65693aed1e5a7a7f2ec730c393e2c7d129e3e551a711Jeff Davidson 65700eebae7334d6129f7ca1344e4b20199794994358vandwalle result = mWifiConfigStore.saveNetwork(config, message.sendingUid); 6571448c9536a302c58a79e271b1721c08b8882f800evandwalle netId = result.getNetworkId(); 6572448c9536a302c58a79e271b1721c08b8882f800evandwalle } 65730eebae7334d6129f7ca1344e4b20199794994358vandwalle config = mWifiConfigStore.getWifiConfiguration(netId); 6574448c9536a302c58a79e271b1721c08b8882f800evandwalle 6575f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle if (config == null) { 6576f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle loge("CONNECT_NETWORK id=" + Integer.toString(netId) + " " 6577f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle + mSupplicantStateTracker.getSupplicantStateName() + " my state " 6578f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle + getCurrentState().getName()); 6579f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle } else { 65800eebae7334d6129f7ca1344e4b20199794994358vandwalle String wasSkipped = config.autoJoinBailedDueToLowRssi ? " skipped" : ""; 6581f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle loge("CONNECT_NETWORK id=" + Integer.toString(netId) 6582f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle + " config=" + config.SSID 6583f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle + " cnid=" + config.networkId 6584f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle + " supstate=" + mSupplicantStateTracker.getSupplicantStateName() 65852f2cf21662275a0e93d7d7a6ad3d98b4c596dcf0vandwalle + " my state " + getCurrentState().getName() 65860eebae7334d6129f7ca1344e4b20199794994358vandwalle + " uid = " + message.sendingUid 65870eebae7334d6129f7ca1344e4b20199794994358vandwalle + wasSkipped); 6588f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle } 6589f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 6590b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle autoRoamSetBSSID(netId, "any"); 65912f2cf21662275a0e93d7d7a6ad3d98b4c596dcf0vandwalle 65922f2cf21662275a0e93d7d7a6ad3d98b4c596dcf0vandwalle if (message.sendingUid == Process.WIFI_UID 65932f2cf21662275a0e93d7d7a6ad3d98b4c596dcf0vandwalle || message.sendingUid == Process.SYSTEM_UID) { 65942f2cf21662275a0e93d7d7a6ad3d98b4c596dcf0vandwalle // As a sanity measure, clear the BSSID in the supplicant network block. 65952f2cf21662275a0e93d7d7a6ad3d98b4c596dcf0vandwalle // If system or Wifi Settings want to connect, they will not 65962f2cf21662275a0e93d7d7a6ad3d98b4c596dcf0vandwalle // specify the BSSID. 65972f2cf21662275a0e93d7d7a6ad3d98b4c596dcf0vandwalle // If an app however had added a BSSID to this configuration, and the BSSID 65982f2cf21662275a0e93d7d7a6ad3d98b4c596dcf0vandwalle // was wrong, Then we would forever fail to connect until that BSSID 65992f2cf21662275a0e93d7d7a6ad3d98b4c596dcf0vandwalle // is cleaned up. 66002f2cf21662275a0e93d7d7a6ad3d98b4c596dcf0vandwalle clearConfigBSSID(config, "CONNECT_NETWORK"); 66012f2cf21662275a0e93d7d7a6ad3d98b4c596dcf0vandwalle } 66022f2cf21662275a0e93d7d7a6ad3d98b4c596dcf0vandwalle 6603b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle mAutoRoaming = WifiAutoJoinController.AUTO_JOIN_IDLE; 6604b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle 6605be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle /* Tell autojoin the user did try to connect to that network */ 6606be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle mWifiAutoJoinController.updateConfigurationHistory(netId, true, true); 6607be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle 6608117be607246604e875de62aa8cdd99700b77a2b4vandwalle mWifiConfigStore.setLastSelectedConfiguration(netId); 6609ecd2b88214b5d214fd1f63a9560caff9058912ddvandwalle 6610e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle didDisconnect = false; 6611b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle if (mLastNetworkId != WifiConfiguration.INVALID_NETWORK_ID 6612b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle && mLastNetworkId != netId) { 6613931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle /** Supplicant will ignore the reconnect if we are currently associated, 6614b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle * hence trigger a disconnect 6615931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle */ 6616e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle didDisconnect = true; 6617b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle mWifiNative.disconnect(); 6618b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle } 6619b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle 6620b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle // Make sure the network is enabled, since supplicant will not reenable it 6621b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle mWifiConfigStore.enableNetworkWithoutBroadcast(netId, false); 6622b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle 6623155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mWifiConfigStore.selectNetwork(netId) && 6624155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiNative.reconnect()) { 6625b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle lastConnectAttempt = System.currentTimeMillis(); 662640ff222cec1bd05879edb53abc75c6deead734cavandwalle targetWificonfiguration = mWifiConfigStore.getWifiConfiguration(netId); 6627b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle 6628155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* The state tracker handles enabling networks upon completion/failure */ 6629155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mSupplicantStateTracker.sendMessage(WifiManager.CONNECT_NETWORK); 6630155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande replyToMessage(message, WifiManager.CONNECT_NETWORK_SUCCEEDED); 6631e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle if (didDisconnect) { 6632e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle /* Expect a disconnection from the old connection */ 6633e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle transitionTo(mDisconnectingState); 66343aed1e5a7a7f2ec730c393e2c7d129e3e551a711Jeff Davidson } else if (updatedExisting && getCurrentState() == mConnectedState && 66353aed1e5a7a7f2ec730c393e2c7d129e3e551a711Jeff Davidson getCurrentWifiConfiguration().networkId == netId) { 66363aed1e5a7a7f2ec730c393e2c7d129e3e551a711Jeff Davidson // Update the current set of network capabilities, but stay in the 66373aed1e5a7a7f2ec730c393e2c7d129e3e551a711Jeff Davidson // current state. 66383aed1e5a7a7f2ec730c393e2c7d129e3e551a711Jeff Davidson updateCapabilities(config); 6639e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle } else { 6640e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle /** 6641e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle * Directly go to disconnected state where we 6642e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle * process the connection events from supplicant 6643e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle **/ 6644e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle transitionTo(mDisconnectedState); 6645e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle } 6646155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 6647155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("Failed to connect config: " + config + " netId: " + netId); 6648155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande replyToMessage(message, WifiManager.CONNECT_NETWORK_FAILED, 6649155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande WifiManager.ERROR); 6650155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 6651155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 6652155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 6653155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiManager.SAVE_NETWORK: 6654be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle mWifiConnectionStatistics.numWifiManagerJoinAttempt++; 6655be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle // Fall thru 6656be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle case WifiStateMachine.CMD_AUTO_SAVE_NETWORK: 6657be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle lastSavedConfigurationAttempt = null; // Used for debug 6658155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande config = (WifiConfiguration) message.obj; 6659f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle if (config == null) { 6660be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle loge("ERROR: SAVE_NETWORK with null configuration" 6661be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle + mSupplicantStateTracker.getSupplicantStateName() 6662f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle + " my state " + getCurrentState().getName()); 6663b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle messageHandlingStatus = MESSAGE_HANDLING_STATUS_FAIL; 6664be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle replyToMessage(message, WifiManager.SAVE_NETWORK_FAILED, 6665be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle WifiManager.ERROR); 6666be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle break; 6667be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle } 6668be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle lastSavedConfigurationAttempt = new WifiConfiguration(config); 6669be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle int nid = config.networkId; 6670be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle loge("SAVE_NETWORK id=" + Integer.toString(nid) 6671f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle + " config=" + config.SSID 6672be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle + " nid=" + config.networkId 6673f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle + " supstate=" + mSupplicantStateTracker.getSupplicantStateName() 6674f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle + " my state " + getCurrentState().getName()); 6675f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 66760eebae7334d6129f7ca1344e4b20199794994358vandwalle result = mWifiConfigStore.saveNetwork(config, -1); 6677155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (result.getNetworkId() != WifiConfiguration.INVALID_NETWORK_ID) { 6678be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle if (mWifiInfo.getNetworkId() == result.getNetworkId()) { 6679be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle if (result.hasIpChanged()) { 6680be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle // The currently connection configuration was changed 6681be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle // We switched from DHCP to static or from static to DHCP, or the 6682be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle // static IP address has changed. 6683be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle log("Reconfiguring IP on connection"); 6684be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle // TODO: clear addresses and disable IPv6 6685be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle // to simplify obtainingIpState. 6686be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle transitionTo(mObtainingIpState); 6687be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle } 6688be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle if (result.hasProxyChanged()) { 6689be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle log("Reconfiguring proxy on connection"); 6690be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle updateLinkProperties(CMD_UPDATE_LINKPROPERTIES); 6691be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle } 66920ff9728ea843a291b2665c705cfe6f0357e1aa44vandwalle } 66930ff9728ea843a291b2665c705cfe6f0357e1aa44vandwalle replyToMessage(message, WifiManager.SAVE_NETWORK_SUCCEEDED); 66940ff9728ea843a291b2665c705cfe6f0357e1aa44vandwalle if (VDBG) { 66950ff9728ea843a291b2665c705cfe6f0357e1aa44vandwalle loge("Success save network nid=" 6696be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle + Integer.toString(result.getNetworkId())); 6697992ae00f25a9cc22cf5db3261bd7e72927069cf7vandwalle } 6698be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle 6699e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle synchronized(mScanResultCache) { 67009d082c381274f27dad1e344223189e00148e2124vandwalle /** 67019d082c381274f27dad1e344223189e00148e2124vandwalle * If the command comes from WifiManager, then 67029d082c381274f27dad1e344223189e00148e2124vandwalle * tell autojoin the user did try to modify and save that network, 67039d082c381274f27dad1e344223189e00148e2124vandwalle * and interpret the SAVE_NETWORK as a request to connect 67049d082c381274f27dad1e344223189e00148e2124vandwalle */ 67059d082c381274f27dad1e344223189e00148e2124vandwalle boolean user = message.what == WifiManager.SAVE_NETWORK; 6706e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle mWifiAutoJoinController.updateConfigurationHistory(result.getNetworkId() 67079d082c381274f27dad1e344223189e00148e2124vandwalle , user, true); 6708e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle mWifiAutoJoinController.attemptAutoJoin(); 6709e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle } 6710155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 6711155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("Failed to save network"); 6712b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle messageHandlingStatus = MESSAGE_HANDLING_STATUS_FAIL; 6713155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande replyToMessage(message, WifiManager.SAVE_NETWORK_FAILED, 6714155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande WifiManager.ERROR); 6715155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 6716155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 6717155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiManager.FORGET_NETWORK: 6718be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle // Debug only, remember last configuration that was forgotten 6719be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle WifiConfiguration toRemove 6720be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle = mWifiConfigStore.getWifiConfiguration(message.arg1); 6721be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle if (toRemove == null) { 6722be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle lastForgetConfigurationAttempt = null; 6723be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle } else { 6724be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle lastForgetConfigurationAttempt = new WifiConfiguration(toRemove); 6725be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle } 6726155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mWifiConfigStore.forgetNetwork(message.arg1)) { 6727155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande replyToMessage(message, WifiManager.FORGET_NETWORK_SUCCEEDED); 6728155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 6729155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("Failed to forget network"); 6730155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande replyToMessage(message, WifiManager.FORGET_NETWORK_FAILED, 6731155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande WifiManager.ERROR); 6732155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 6733155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 6734155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiManager.START_WPS: 6735155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande WpsInfo wpsInfo = (WpsInfo) message.obj; 6736155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande WpsResult wpsResult; 6737155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande switch (wpsInfo.setup) { 6738155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WpsInfo.PBC: 6739155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande wpsResult = mWifiConfigStore.startWpsPbc(wpsInfo); 6740155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 6741155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WpsInfo.KEYPAD: 6742155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande wpsResult = mWifiConfigStore.startWpsWithPinFromAccessPoint(wpsInfo); 6743155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 6744155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WpsInfo.DISPLAY: 6745155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande wpsResult = mWifiConfigStore.startWpsWithPinFromDevice(wpsInfo); 6746155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 6747155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande default: 6748155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande wpsResult = new WpsResult(Status.FAILURE); 6749155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("Invalid setup for WPS"); 6750155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 6751155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 6752117be607246604e875de62aa8cdd99700b77a2b4vandwalle mWifiConfigStore.setLastSelectedConfiguration 6753ecd2b88214b5d214fd1f63a9560caff9058912ddvandwalle (WifiConfiguration.INVALID_NETWORK_ID); 6754155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (wpsResult.status == Status.SUCCESS) { 6755155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande replyToMessage(message, WifiManager.START_WPS_SUCCEEDED, wpsResult); 6756155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande transitionTo(mWpsRunningState); 6757155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 6758155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("Failed to start WPS with config " + wpsInfo.toString()); 6759155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande replyToMessage(message, WifiManager.WPS_FAILED, WifiManager.ERROR); 6760155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 6761155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 6762155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiMonitor.NETWORK_CONNECTION_EVENT: 6763155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (DBG) log("Network connection established"); 6764155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mLastNetworkId = message.arg1; 6765155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mLastBssid = (String) message.obj; 6766155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 6767155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiInfo.setBSSID(mLastBssid); 6768155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiInfo.setNetworkId(mLastNetworkId); 6769cdc5b747a9c6ff40a38a66bdd8f86dbf11852a7avandwalle 6770155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendNetworkStateChangeBroadcast(mLastBssid); 6771155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande transitionTo(mObtainingIpState); 6772155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 6773155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiMonitor.NETWORK_DISCONNECTION_EVENT: 677456d0178183460eed9afbd85e5c0d215e27d5f5bcvandwalle // Calling handleNetworkDisconnect here is redundant because we might already 677556d0178183460eed9afbd85e5c0d215e27d5f5bcvandwalle // have called it when leaving L2ConnectedState to go to disconnecting state 677656d0178183460eed9afbd85e5c0d215e27d5f5bcvandwalle // or thru other path 677756d0178183460eed9afbd85e5c0d215e27d5f5bcvandwalle // We should normally check the mWifiInfo or mLastNetworkId so as to check 677856d0178183460eed9afbd85e5c0d215e27d5f5bcvandwalle // if they are valid, and only in this case call handleNEtworkDisconnect, 677956d0178183460eed9afbd85e5c0d215e27d5f5bcvandwalle // TODO: this should be fixed for a L MR release 678056d0178183460eed9afbd85e5c0d215e27d5f5bcvandwalle // The side effect of calling handleNetworkDisconnect twice is that a bunch of 678156d0178183460eed9afbd85e5c0d215e27d5f5bcvandwalle // idempotent commands are executed twice (stopping Dhcp, enabling the SPS mode 678256d0178183460eed9afbd85e5c0d215e27d5f5bcvandwalle // at the chip etc... 6783b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle if (DBG) log("ConnectModeState: Network connection lost "); 6784155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande handleNetworkDisconnect(); 6785155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande transitionTo(mDisconnectedState); 6786155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 6787155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande default: 6788155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return NOT_HANDLED; 6789155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 6790155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return HANDLED; 6791155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 6792155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 6793155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 67943aed1e5a7a7f2ec730c393e2c7d129e3e551a711Jeff Davidson private void updateCapabilities(WifiConfiguration config) { 67953aed1e5a7a7f2ec730c393e2c7d129e3e551a711Jeff Davidson if (config.ephemeral) { 67963aed1e5a7a7f2ec730c393e2c7d129e3e551a711Jeff Davidson mNetworkCapabilities.removeCapability( 67973aed1e5a7a7f2ec730c393e2c7d129e3e551a711Jeff Davidson NetworkCapabilities.NET_CAPABILITY_TRUSTED); 67983aed1e5a7a7f2ec730c393e2c7d129e3e551a711Jeff Davidson } else { 67993aed1e5a7a7f2ec730c393e2c7d129e3e551a711Jeff Davidson mNetworkCapabilities.addCapability( 68003aed1e5a7a7f2ec730c393e2c7d129e3e551a711Jeff Davidson NetworkCapabilities.NET_CAPABILITY_TRUSTED); 68013aed1e5a7a7f2ec730c393e2c7d129e3e551a711Jeff Davidson } 68023aed1e5a7a7f2ec730c393e2c7d129e3e551a711Jeff Davidson mNetworkAgent.sendNetworkCapabilities(mNetworkCapabilities); 68033aed1e5a7a7f2ec730c393e2c7d129e3e551a711Jeff Davidson } 68043aed1e5a7a7f2ec730c393e2c7d129e3e551a711Jeff Davidson 68057d6e0b86655bf9862ae81fe37c9c8dc3f70d51f9Robert Greenwalt private class WifiNetworkAgent extends NetworkAgent { 68067d6e0b86655bf9862ae81fe37c9c8dc3f70d51f9Robert Greenwalt public WifiNetworkAgent(Looper l, Context c, String TAG, NetworkInfo ni, 68077d6e0b86655bf9862ae81fe37c9c8dc3f70d51f9Robert Greenwalt NetworkCapabilities nc, LinkProperties lp, int score) { 68087d6e0b86655bf9862ae81fe37c9c8dc3f70d51f9Robert Greenwalt super(l, c, TAG, ni, nc, lp, score); 68097d6e0b86655bf9862ae81fe37c9c8dc3f70d51f9Robert Greenwalt } 68107d6e0b86655bf9862ae81fe37c9c8dc3f70d51f9Robert Greenwalt protected void unwanted() { 6811931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle // Ignore if we're not the current networkAgent. 68127d6e0b86655bf9862ae81fe37c9c8dc3f70d51f9Robert Greenwalt if (this != mNetworkAgent) return; 681327355a942653264388e909a4276196ee63e57811vandwalle if (DBG) log("WifiNetworkAgent -> Wifi unwanted score " 681427355a942653264388e909a4276196ee63e57811vandwalle + Integer.toString(mWifiInfo.score)); 6815e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle unwantedNetwork(network_status_unwanted_disconnect); 6816e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle } 6817e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle 6818e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle protected void networkStatus(int status) { 6819e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle if (status == NetworkAgent.INVALID_NETWORK) { 6820d30127db46224e45554f8964209221bba8ad41d9vandwalle if (DBG) log("WifiNetworkAgent -> Wifi networkStatus invalid, score=" 6821e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle + Integer.toString(mWifiInfo.score)); 6822e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle unwantedNetwork(network_status_unwanted_disable_autojoin); 6823d30127db46224e45554f8964209221bba8ad41d9vandwalle } else if (status == NetworkAgent.VALID_NETWORK) { 6824d30127db46224e45554f8964209221bba8ad41d9vandwalle if (DBG && mWifiInfo != null) log("WifiNetworkAgent -> Wifi networkStatus valid, score= " 6825d30127db46224e45554f8964209221bba8ad41d9vandwalle + Integer.toString(mWifiInfo.score)); 6826d30127db46224e45554f8964209221bba8ad41d9vandwalle doNetworkStatus(status); 6827e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle } 68287d6e0b86655bf9862ae81fe37c9c8dc3f70d51f9Robert Greenwalt } 68297d6e0b86655bf9862ae81fe37c9c8dc3f70d51f9Robert Greenwalt } 68307d6e0b86655bf9862ae81fe37c9c8dc3f70d51f9Robert Greenwalt 6831e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle void unwantedNetwork(int reason) { 6832e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle sendMessage(CMD_UNWANTED_NETWORK, reason); 683327355a942653264388e909a4276196ee63e57811vandwalle } 683427355a942653264388e909a4276196ee63e57811vandwalle 6835d30127db46224e45554f8964209221bba8ad41d9vandwalle void doNetworkStatus(int status) { 6836d30127db46224e45554f8964209221bba8ad41d9vandwalle sendMessage(CMD_NETWORK_STATUS, status); 6837d30127db46224e45554f8964209221bba8ad41d9vandwalle } 6838e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle 68397806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle boolean startScanForConfiguration(WifiConfiguration config, boolean restrictChannelList) { 68407b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle if (config == null) 68417b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle return false; 68421ec92c57244311c7fca3ab6b244a06c2b2b58902vandwalle 68431ec92c57244311c7fca3ab6b244a06c2b2b58902vandwalle // We are still seeing a fairly high power consumption triggered by autojoin scans 68441ec92c57244311c7fca3ab6b244a06c2b2b58902vandwalle // Hence do partial scans only for PSK configuration that are roamable since the 68451ec92c57244311c7fca3ab6b244a06c2b2b58902vandwalle // primary purpose of the partial scans is roaming. 68461ec92c57244311c7fca3ab6b244a06c2b2b58902vandwalle // Full badn scans with exponential backoff for the purpose or extended roaming and 68471ec92c57244311c7fca3ab6b244a06c2b2b58902vandwalle // network switching are performed unconditionally. 68481ec92c57244311c7fca3ab6b244a06c2b2b58902vandwalle if (config.scanResultCache == null 68491ec92c57244311c7fca3ab6b244a06c2b2b58902vandwalle || !config.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.WPA_PSK) 68501ec92c57244311c7fca3ab6b244a06c2b2b58902vandwalle || config.scanResultCache.size() > 6) { 68511ec92c57244311c7fca3ab6b244a06c2b2b58902vandwalle //return true but to not trigger the scan 68521ec92c57244311c7fca3ab6b244a06c2b2b58902vandwalle return true; 68531ec92c57244311c7fca3ab6b244a06c2b2b58902vandwalle } 68547806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle HashSet<Integer> channels 68557806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle = mWifiConfigStore.makeChannelList(config, 68567806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle ONE_HOUR_MILLI, restrictChannelList); 68577806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle if (channels != null && channels.size() != 0) { 68587806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle StringBuilder freqs = new StringBuilder(); 68597806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle boolean first = true; 68607806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle for (Integer channel : channels) { 68617806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle if (!first) 68627806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle freqs.append(","); 68637806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle freqs.append(channel.toString()); 68647806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle first = false; 68657806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle } 68661ec92c57244311c7fca3ab6b244a06c2b2b58902vandwalle //if (DBG) { 68671ec92c57244311c7fca3ab6b244a06c2b2b58902vandwalle loge("WifiStateMachine starting scan for " + config.configKey() + " with " + freqs); 68681ec92c57244311c7fca3ab6b244a06c2b2b58902vandwalle //} 68697806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle // Call wifi native to start the scan 68707806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle if (startScanNative( 68717806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle WifiNative.SCAN_WITHOUT_CONNECTION_SETUP, 68727806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle freqs.toString())) { 68737806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle // Only count battery consumption if scan request is accepted 68747806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle noteScanStart(SCAN_ALARM_SOURCE, null); 68751ec92c57244311c7fca3ab6b244a06c2b2b58902vandwalle messageHandlingStatus = MESSAGE_HANDLING_STATUS_OK; 68761ec92c57244311c7fca3ab6b244a06c2b2b58902vandwalle } else { 68771ec92c57244311c7fca3ab6b244a06c2b2b58902vandwalle // used for debug only, mark scan as failed 68781ec92c57244311c7fca3ab6b244a06c2b2b58902vandwalle messageHandlingStatus = MESSAGE_HANDLING_STATUS_HANDLING_ERROR; 68797806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle } 68807806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle return true; 68817806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle } else { 68827b581f46f6c9bc6edf0edd287d47106712fb2144vandwalle if (DBG) loge("WifiStateMachine no channels for " + config.configKey()); 68837806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle return false; 68847806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle } 68857806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle } 68867806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle 68879f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle void clearCurrentConfigBSSID(String dbg) { 68889f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle // Clear the bssid in the current config's network block 68899f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle WifiConfiguration config = getCurrentWifiConfiguration(); 68909f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle if (config == null) 68919f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle return; 68922f2cf21662275a0e93d7d7a6ad3d98b4c596dcf0vandwalle clearConfigBSSID(config, dbg); 68932f2cf21662275a0e93d7d7a6ad3d98b4c596dcf0vandwalle } 68942f2cf21662275a0e93d7d7a6ad3d98b4c596dcf0vandwalle void clearConfigBSSID(WifiConfiguration config, String dbg) { 68952f2cf21662275a0e93d7d7a6ad3d98b4c596dcf0vandwalle if (config == null) 68962f2cf21662275a0e93d7d7a6ad3d98b4c596dcf0vandwalle return; 68979f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle if (DBG) { 68989f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle loge(dbg + " " + mTargetRoamBSSID + " config " + config.configKey() 68999f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle + " config.bssid " + config.BSSID); 69009f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle } 69012f2cf21662275a0e93d7d7a6ad3d98b4c596dcf0vandwalle config.autoJoinBSSID = "any"; 69022f2cf21662275a0e93d7d7a6ad3d98b4c596dcf0vandwalle config.BSSID = "any"; 69032f2cf21662275a0e93d7d7a6ad3d98b4c596dcf0vandwalle if (DBG) { 69042f2cf21662275a0e93d7d7a6ad3d98b4c596dcf0vandwalle loge(dbg + " " + config.SSID 69052f2cf21662275a0e93d7d7a6ad3d98b4c596dcf0vandwalle + " nid=" + Integer.toString(config.networkId)); 69069f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle } 69072f2cf21662275a0e93d7d7a6ad3d98b4c596dcf0vandwalle mWifiConfigStore.saveWifiConfigBSSID(config); 69089f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle } 69099f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle 6910155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande class L2ConnectedState extends State { 6911155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande @Override 6912155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public void enter() { 6913155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mRssiPollToken++; 6914155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mEnableRssiPolling) { 6915155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendMessage(CMD_RSSI_POLL, mRssiPollToken, 0); 6916155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 69177d6e0b86655bf9862ae81fe37c9c8dc3f70d51f9Robert Greenwalt if (mNetworkAgent != null) { 69187d6e0b86655bf9862ae81fe37c9c8dc3f70d51f9Robert Greenwalt loge("Have NetworkAgent when entering L2Connected"); 69197d6e0b86655bf9862ae81fe37c9c8dc3f70d51f9Robert Greenwalt setNetworkDetailedState(DetailedState.DISCONNECTED); 69207d6e0b86655bf9862ae81fe37c9c8dc3f70d51f9Robert Greenwalt } 69217d6e0b86655bf9862ae81fe37c9c8dc3f70d51f9Robert Greenwalt setNetworkDetailedState(DetailedState.CONNECTING); 6922e693d9490d27bcd91bb1f012bb88ef4c95cdaee3Robert Greenwalt 69233c3c5b64726f04920109e4c8f20a1c58ea7050aaRobert Greenwalt if (TextUtils.isEmpty(mTcpBufferSizes) == false) { 69243c3c5b64726f04920109e4c8f20a1c58ea7050aaRobert Greenwalt mLinkProperties.setTcpBufferSizes(mTcpBufferSizes); 69253c3c5b64726f04920109e4c8f20a1c58ea7050aaRobert Greenwalt } 69267d6e0b86655bf9862ae81fe37c9c8dc3f70d51f9Robert Greenwalt mNetworkAgent = new WifiNetworkAgent(getHandler().getLooper(), mContext, 69277d6e0b86655bf9862ae81fe37c9c8dc3f70d51f9Robert Greenwalt "WifiNetworkAgent", mNetworkInfo, mNetworkCapabilitiesFilter, 69287d6e0b86655bf9862ae81fe37c9c8dc3f70d51f9Robert Greenwalt mLinkProperties, 60); 69299f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle 69302f2cf21662275a0e93d7d7a6ad3d98b4c596dcf0vandwalle // We must clear the config BSSID, as the wifi chipset may decide to roam 69312f2cf21662275a0e93d7d7a6ad3d98b4c596dcf0vandwalle // from this point on and having the BSSID specified in the network block would 69322f2cf21662275a0e93d7d7a6ad3d98b4c596dcf0vandwalle // cause the roam to faile and the device to disconnect 69339f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle clearCurrentConfigBSSID("L2ConnectedState"); 6934155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 6935155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 6936155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande @Override 6937155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public void exit() { 6938931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle // This is handled by receiving a NETWORK_DISCONNECTION_EVENT in ConnectModeState 6939931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle // Bug: 15347363 69408c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle // For paranoia's sake, call handleNetworkDisconnect 69418c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle // only if BSSID is null or last networkId 6942931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle // is not invalid. 694356d0178183460eed9afbd85e5c0d215e27d5f5bcvandwalle if (DBG) { 694456d0178183460eed9afbd85e5c0d215e27d5f5bcvandwalle StringBuilder sb = new StringBuilder(); 694556d0178183460eed9afbd85e5c0d215e27d5f5bcvandwalle sb.append("leaving L2ConnectedState state nid=" + Integer.toString(mLastNetworkId)); 694656d0178183460eed9afbd85e5c0d215e27d5f5bcvandwalle if (mLastBssid !=null) { 694756d0178183460eed9afbd85e5c0d215e27d5f5bcvandwalle sb.append(" ").append(mLastBssid); 694856d0178183460eed9afbd85e5c0d215e27d5f5bcvandwalle } 694956d0178183460eed9afbd85e5c0d215e27d5f5bcvandwalle } 6950b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle if (mLastBssid != null || mLastNetworkId != WifiConfiguration.INVALID_NETWORK_ID) { 6951b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle handleNetworkDisconnect(); 6952b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle } 6953155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 6954155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 6955155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande @Override 6956155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public boolean processMessage(Message message) { 6957f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle logStateAndMessage(message, getClass().getSimpleName()); 6958f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 6959155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande switch (message.what) { 6960155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case DhcpStateMachine.CMD_PRE_DHCP_ACTION: 6961155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande handlePreDhcpSetup(); 6962155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 6963155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case DhcpStateMachine.CMD_POST_DHCP_ACTION: 6964155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande handlePostDhcpSetup(); 6965155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (message.arg1 == DhcpStateMachine.DHCP_SUCCESS) { 6966c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle if (DBG) log("WifiStateMachine DHCP successful"); 6967badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti handleIPv4Success((DhcpResults) message.obj, DhcpStateMachine.DHCP_SUCCESS); 696814be3cde626bd5935f599cd6e0fca72cf1c4695dLorenzo Colitti // We advance to mVerifyingLinkState because handleIPv4Success will call 696914be3cde626bd5935f599cd6e0fca72cf1c4695dLorenzo Colitti // updateLinkProperties, which then sends CMD_IP_CONFIGURATION_SUCCESSFUL. 6970155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else if (message.arg1 == DhcpStateMachine.DHCP_FAILURE) { 6971c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle if (DBG) { 6972c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle int count = -1; 6973c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle WifiConfiguration config = getCurrentWifiConfiguration(); 6974c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle if (config != null) { 6975c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle count = config.numConnectionFailures; 6976c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle } 6977c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle log("WifiStateMachine DHCP failure count=" + count); 6978c290d8dff6172d5fde7b9dfd74d3a20785dab246vandwalle } 6979badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti handleIPv4Failure(DhcpStateMachine.DHCP_FAILURE); 698014be3cde626bd5935f599cd6e0fca72cf1c4695dLorenzo Colitti // As above, we transition to mDisconnectingState via updateLinkProperties. 6981155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 6982155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 698314be3cde626bd5935f599cd6e0fca72cf1c4695dLorenzo Colitti case CMD_IP_CONFIGURATION_SUCCESSFUL: 698414be3cde626bd5935f599cd6e0fca72cf1c4695dLorenzo Colitti handleSuccessfulIpConfiguration(); 69854dd46ff3cff8e4e66516600ffdac98601e8bf73dRobert Greenwalt sendConnectedState(); 69864dd46ff3cff8e4e66516600ffdac98601e8bf73dRobert Greenwalt transitionTo(mConnectedState); 698714be3cde626bd5935f599cd6e0fca72cf1c4695dLorenzo Colitti break; 698814be3cde626bd5935f599cd6e0fca72cf1c4695dLorenzo Colitti case CMD_IP_CONFIGURATION_LOST: 6989efad8ec6cb12e5658ee0288cc7e5aa755267aeb6vandwalle // Get Link layer stats so as we get fresh tx packet counters 6990efad8ec6cb12e5658ee0288cc7e5aa755267aeb6vandwalle getWifiLinkLayerStats(true); 699114be3cde626bd5935f599cd6e0fca72cf1c4695dLorenzo Colitti handleIpConfigurationLost(); 699214be3cde626bd5935f599cd6e0fca72cf1c4695dLorenzo Colitti transitionTo(mDisconnectingState); 699314be3cde626bd5935f599cd6e0fca72cf1c4695dLorenzo Colitti break; 6994155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_DISCONNECT: 6995155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiNative.disconnect(); 6996155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande transitionTo(mDisconnectingState); 6997155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 6998155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiP2pServiceImpl.DISCONNECT_WIFI_REQUEST: 6999155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (message.arg1 == 1) { 7000155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiNative.disconnect(); 7001155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mTemporarilyDisconnectWifi = true; 7002155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande transitionTo(mDisconnectingState); 7003155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 7004155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 7005155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_SET_OPERATIONAL_MODE: 7006155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (message.arg1 != CONNECT_MODE) { 7007155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendMessage(CMD_DISCONNECT); 7008155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande deferMessage(message); 70099f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle if (message.arg1 == SCAN_ONLY_WITH_WIFI_OFF_MODE) { 70109f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle noteWifiDisabledWhileAssociated(); 70119f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle } 70128242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle mWifiConfigStore. 70138242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle setLastSelectedConfiguration(WifiConfiguration.INVALID_NETWORK_ID); 7014155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 7015155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 7016f449336da3fc8f8f9b65de3ba359129779511199Vinit Deshapnde case CMD_SET_COUNTRY_CODE: 7017ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle messageHandlingStatus = MESSAGE_HANDLING_STATUS_DEFERRED; 7018f449336da3fc8f8f9b65de3ba359129779511199Vinit Deshapnde deferMessage(message); 7019f449336da3fc8f8f9b65de3ba359129779511199Vinit Deshapnde break; 7020155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_START_SCAN: 70211ec92c57244311c7fca3ab6b244a06c2b2b58902vandwalle //if (DBG) { 7022c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle loge("WifiStateMachine CMD_START_SCAN source " + message.arg1 7023c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle + " txSuccessRate="+String.format( "%.2f", mWifiInfo.txSuccessRate) 7024c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle + " rxSuccessRate="+String.format( "%.2f", mWifiInfo.rxSuccessRate) 7025e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle + " targetRoamBSSID=" + mTargetRoamBSSID 7026c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle + " RSSI=" + mWifiInfo.getRssi()); 70271ec92c57244311c7fca3ab6b244a06c2b2b58902vandwalle //} 70284dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle if (message.arg1 == SCAN_ALARM_SOURCE) { 70298242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle // Check if the CMD_START_SCAN message is obsolete (and thus if it should 70308242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle // not be processed) and restart the scan if needed 70318242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle boolean shouldScan = 70328242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle mScreenOn && mWifiConfigStore.enableAutoJoinScanWhenAssociated; 70338242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle if (!checkAndRestartDelayedScan(message.arg2, 70348242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle shouldScan, 70358242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle mWifiConfigStore.associatedPartialScanPeriodMilli, null, null)) { 70368242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle messageHandlingStatus = MESSAGE_HANDLING_STATUS_OBSOLETE; 70378242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle loge("WifiStateMachine L2Connected CMD_START_SCAN source " 70388242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle + message.arg1 70398242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle + " " + message.arg2 + ", " + mDelayedScanCounter 70408242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle + " -> obsolete"); 70418242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle return HANDLED; 70428242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle } 7043a1c02f0a73ee35e198e2652cd65b8830a163d9ddvandwalle if (mP2pConnected.get()) { 7044a1c02f0a73ee35e198e2652cd65b8830a163d9ddvandwalle loge("WifiStateMachine L2Connected CMD_START_SCAN source " 7045a1c02f0a73ee35e198e2652cd65b8830a163d9ddvandwalle + message.arg1 7046a1c02f0a73ee35e198e2652cd65b8830a163d9ddvandwalle + " " + message.arg2 + ", " + mDelayedScanCounter 7047a1c02f0a73ee35e198e2652cd65b8830a163d9ddvandwalle + " ignore because P2P is connected"); 7048a1c02f0a73ee35e198e2652cd65b8830a163d9ddvandwalle messageHandlingStatus = MESSAGE_HANDLING_STATUS_DISCARD; 7049a1c02f0a73ee35e198e2652cd65b8830a163d9ddvandwalle return HANDLED; 7050a1c02f0a73ee35e198e2652cd65b8830a163d9ddvandwalle } 7051b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle boolean tryFullBandScan = false; 7052c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle boolean restrictChannelList = false; 7053b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle long now_ms = System.currentTimeMillis(); 7054e67ec726c07410073575473c0f50dc737629f5davandwalle if (DBG) { 7055e67ec726c07410073575473c0f50dc737629f5davandwalle loge("WifiStateMachine CMD_START_SCAN with age=" 7056e67ec726c07410073575473c0f50dc737629f5davandwalle + Long.toString(now_ms - lastFullBandConnectedTimeMilli) 7057e67ec726c07410073575473c0f50dc737629f5davandwalle + " interval=" + fullBandConnectedTimeIntervalMilli 7058e67ec726c07410073575473c0f50dc737629f5davandwalle + " maxinterval=" + maxFullBandConnectedTimeIntervalMilli); 7059e67ec726c07410073575473c0f50dc737629f5davandwalle } 70604dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle if (mWifiInfo != null) { 7061e0ba94ba9abde13173ae0de8c8939aa4eb9a9085vandwalle if (mWifiConfigStore.enableFullBandScanWhenAssociated && 7062e0ba94ba9abde13173ae0de8c8939aa4eb9a9085vandwalle (now_ms - lastFullBandConnectedTimeMilli) 7063c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle > fullBandConnectedTimeIntervalMilli) { 7064c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle if (DBG) { 7065c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle loge("WifiStateMachine CMD_START_SCAN try full band scan age=" 7066e67ec726c07410073575473c0f50dc737629f5davandwalle + Long.toString(now_ms - lastFullBandConnectedTimeMilli) 7067e67ec726c07410073575473c0f50dc737629f5davandwalle + " interval=" + fullBandConnectedTimeIntervalMilli 7068e67ec726c07410073575473c0f50dc737629f5davandwalle + " maxinterval=" + maxFullBandConnectedTimeIntervalMilli); 7069c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle } 7070b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle tryFullBandScan = true; 7071b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle } 7072b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle 70739f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle if (mWifiInfo.txSuccessRate > 70741ec92c57244311c7fca3ab6b244a06c2b2b58902vandwalle mWifiConfigStore.maxTxPacketForFullScans 70759f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle || mWifiInfo.rxSuccessRate > 70761ec92c57244311c7fca3ab6b244a06c2b2b58902vandwalle mWifiConfigStore.maxRxPacketForFullScans) { 7077931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle // Too much traffic at the interface, hence no full band scan 7078c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle if (DBG) { 7079c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle loge("WifiStateMachine CMD_START_SCAN " + 7080c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle "prevent full band scan due to pkt rate"); 7081c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle } 7082b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle tryFullBandScan = false; 7083b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle } 7084b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle 70858c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle if (mWifiInfo.txSuccessRate > 70869f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle mWifiConfigStore.maxTxPacketForPartialScans 70878c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle || mWifiInfo.rxSuccessRate > 70889f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle mWifiConfigStore.maxRxPacketForPartialScans) { 7089931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle // Don't scan if lots of packets are being sent 7090c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle restrictChannelList = true; 70919f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle if (mWifiConfigStore.alwaysEnableScansWhileAssociated == 0) { 7092c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle if (DBG) { 7093c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle loge("WifiStateMachine CMD_START_SCAN source " + message.arg1 7094c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle + " ...and ignore scans" 7095c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle + " tx=" + String.format("%.2f", mWifiInfo.txSuccessRate) 7096c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle + " rx=" + String.format("%.2f", mWifiInfo.rxSuccessRate)); 7097c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle } 7098ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle messageHandlingStatus = MESSAGE_HANDLING_STATUS_REFUSED; 7099c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle return HANDLED; 71004dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle } 71014dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle } 71024dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle } 7103b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle 71044dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle WifiConfiguration currentConfiguration = getCurrentWifiConfiguration(); 7105e67ec726c07410073575473c0f50dc737629f5davandwalle if (DBG) { 7106e67ec726c07410073575473c0f50dc737629f5davandwalle loge("WifiStateMachine CMD_START_SCAN full=" + 7107e67ec726c07410073575473c0f50dc737629f5davandwalle tryFullBandScan); 7108e67ec726c07410073575473c0f50dc737629f5davandwalle } 71094dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle if (currentConfiguration != null) { 7110e0ba94ba9abde13173ae0de8c8939aa4eb9a9085vandwalle if (fullBandConnectedTimeIntervalMilli 7111e0ba94ba9abde13173ae0de8c8939aa4eb9a9085vandwalle < mWifiConfigStore.associatedPartialScanPeriodMilli) { 7112e0ba94ba9abde13173ae0de8c8939aa4eb9a9085vandwalle // Sanity 7113e0ba94ba9abde13173ae0de8c8939aa4eb9a9085vandwalle fullBandConnectedTimeIntervalMilli 7114e0ba94ba9abde13173ae0de8c8939aa4eb9a9085vandwalle = mWifiConfigStore.associatedPartialScanPeriodMilli; 7115e0ba94ba9abde13173ae0de8c8939aa4eb9a9085vandwalle } 7116b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle if (tryFullBandScan) { 7117b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle lastFullBandConnectedTimeMilli = now_ms; 7118e67ec726c07410073575473c0f50dc737629f5davandwalle if (fullBandConnectedTimeIntervalMilli 71190eebae7334d6129f7ca1344e4b20199794994358vandwalle < mWifiConfigStore.associatedFullScanMaxIntervalMilli) { 7120931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle // Increase the interval 7121c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle fullBandConnectedTimeIntervalMilli 7122e67ec726c07410073575473c0f50dc737629f5davandwalle = fullBandConnectedTimeIntervalMilli 7123e67ec726c07410073575473c0f50dc737629f5davandwalle * mWifiConfigStore.associatedFullScanBackoff / 8; 7124e67ec726c07410073575473c0f50dc737629f5davandwalle 7125e67ec726c07410073575473c0f50dc737629f5davandwalle if (DBG) { 7126e67ec726c07410073575473c0f50dc737629f5davandwalle loge("WifiStateMachine CMD_START_SCAN bump interval =" 7127e67ec726c07410073575473c0f50dc737629f5davandwalle + fullBandConnectedTimeIntervalMilli); 7128e67ec726c07410073575473c0f50dc737629f5davandwalle } 71294dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle } 7130c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle handleScanRequest( 7131c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle WifiNative.SCAN_WITHOUT_CONNECTION_SETUP, message); 71324dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle } else { 71338c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle if (!startScanForConfiguration( 71348c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle currentConfiguration, restrictChannelList)) { 7135b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle if (DBG) { 71368c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle loge("WifiStateMachine starting scan, " + 7137e67ec726c07410073575473c0f50dc737629f5davandwalle " did not find channels -> full"); 7138b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle } 7139e0ba94ba9abde13173ae0de8c8939aa4eb9a9085vandwalle lastFullBandConnectedTimeMilli = now_ms; 7140e0ba94ba9abde13173ae0de8c8939aa4eb9a9085vandwalle if (fullBandConnectedTimeIntervalMilli 7141e0ba94ba9abde13173ae0de8c8939aa4eb9a9085vandwalle < mWifiConfigStore.associatedFullScanMaxIntervalMilli) { 7142e0ba94ba9abde13173ae0de8c8939aa4eb9a9085vandwalle // Increase the interval 7143e0ba94ba9abde13173ae0de8c8939aa4eb9a9085vandwalle fullBandConnectedTimeIntervalMilli 7144e0ba94ba9abde13173ae0de8c8939aa4eb9a9085vandwalle = fullBandConnectedTimeIntervalMilli 7145e0ba94ba9abde13173ae0de8c8939aa4eb9a9085vandwalle * mWifiConfigStore.associatedFullScanBackoff / 8; 7146e0ba94ba9abde13173ae0de8c8939aa4eb9a9085vandwalle 7147e0ba94ba9abde13173ae0de8c8939aa4eb9a9085vandwalle if (DBG) { 7148e0ba94ba9abde13173ae0de8c8939aa4eb9a9085vandwalle loge("WifiStateMachine CMD_START_SCAN bump interval =" 7149e0ba94ba9abde13173ae0de8c8939aa4eb9a9085vandwalle + fullBandConnectedTimeIntervalMilli); 7150e0ba94ba9abde13173ae0de8c8939aa4eb9a9085vandwalle } 7151e0ba94ba9abde13173ae0de8c8939aa4eb9a9085vandwalle } 7152e67ec726c07410073575473c0f50dc737629f5davandwalle handleScanRequest( 7153e67ec726c07410073575473c0f50dc737629f5davandwalle WifiNative.SCAN_WITHOUT_CONNECTION_SETUP, message); 71544dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle } 71554dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle } 71568242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle 7157ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle } else { 7158ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle loge("CMD_START_SCAN : connected mode and no configuration"); 7159ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle messageHandlingStatus = MESSAGE_HANDLING_STATUS_HANDLING_ERROR; 71604dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle } 71614dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle } else { 7162ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle // Not scan alarm source 71638242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle return NOT_HANDLED; 71644dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle } 7165155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 7166155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Ignore connection to same network */ 7167155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiManager.CONNECT_NETWORK: 7168155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande int netId = message.arg1; 7169155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mWifiInfo.getNetworkId() == netId) { 7170155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 7171155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 7172155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return NOT_HANDLED; 7173155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Ignore */ 7174155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiMonitor.NETWORK_CONNECTION_EVENT: 7175155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 7176155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_RSSI_POLL: 7177155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (message.arg1 == mRssiPollToken) { 717870468b47454c8657e8963932f2e08a3f4d7e3881vandwalle if (mWifiConfigStore.enableChipWakeUpWhenAssociated) { 717970468b47454c8657e8963932f2e08a3f4d7e3881vandwalle if (VVDBG) log(" get link layer stats " + mWifiLinkLayerStatsSupported); 718070468b47454c8657e8963932f2e08a3f4d7e3881vandwalle WifiLinkLayerStats stats = getWifiLinkLayerStats(VDBG); 718170468b47454c8657e8963932f2e08a3f4d7e3881vandwalle if (stats != null) { 718270468b47454c8657e8963932f2e08a3f4d7e3881vandwalle // Sanity check the results provided by driver 718370468b47454c8657e8963932f2e08a3f4d7e3881vandwalle if (mWifiInfo.getRssi() != WifiInfo.INVALID_RSSI 718470468b47454c8657e8963932f2e08a3f4d7e3881vandwalle && (stats.rssi_mgmt == 0 718570468b47454c8657e8963932f2e08a3f4d7e3881vandwalle || stats.beacon_rx == 0)) { 718670468b47454c8657e8963932f2e08a3f4d7e3881vandwalle stats = null; 718770468b47454c8657e8963932f2e08a3f4d7e3881vandwalle } 718870468b47454c8657e8963932f2e08a3f4d7e3881vandwalle } 718970468b47454c8657e8963932f2e08a3f4d7e3881vandwalle // Get Info and continue polling 719070468b47454c8657e8963932f2e08a3f4d7e3881vandwalle fetchRssiLinkSpeedAndFrequencyNative(); 719170468b47454c8657e8963932f2e08a3f4d7e3881vandwalle calculateWifiScore(stats); 719227355a942653264388e909a4276196ee63e57811vandwalle } 7193155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendMessageDelayed(obtainMessage(CMD_RSSI_POLL, 7194155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mRssiPollToken, 0), POLL_RSSI_INTERVAL_MSECS); 7195e0ba94ba9abde13173ae0de8c8939aa4eb9a9085vandwalle 71969f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle if (DBG) sendRssiChangeBroadcast(mWifiInfo.getRssi()); 7197155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 7198155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Polling has completed 7199155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 7200155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 7201155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_ENABLE_RSSI_POLL: 720270468b47454c8657e8963932f2e08a3f4d7e3881vandwalle if (mWifiConfigStore.enableRssiPollWhenAssociated) { 720370468b47454c8657e8963932f2e08a3f4d7e3881vandwalle mEnableRssiPolling = (message.arg1 == 1); 720470468b47454c8657e8963932f2e08a3f4d7e3881vandwalle } else { 720570468b47454c8657e8963932f2e08a3f4d7e3881vandwalle mEnableRssiPolling = false; 720670468b47454c8657e8963932f2e08a3f4d7e3881vandwalle } 7207155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mRssiPollToken++; 7208155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mEnableRssiPolling) { 7209931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle // First poll 721074b0804ef846b9b4888025092dd5c75143b559dcFelipe Leme fetchRssiLinkSpeedAndFrequencyNative(); 7211155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendMessageDelayed(obtainMessage(CMD_RSSI_POLL, 7212155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mRssiPollToken, 0), POLL_RSSI_INTERVAL_MSECS); 7213ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle } else { 7214ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle cleanWifiScore(); 7215155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 7216155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 7217155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiManager.RSSI_PKTCNT_FETCH: 7218155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande RssiPacketCountInfo info = new RssiPacketCountInfo(); 721974b0804ef846b9b4888025092dd5c75143b559dcFelipe Leme fetchRssiLinkSpeedAndFrequencyNative(); 7220155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande info.rssi = mWifiInfo.getRssi(); 7221155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande fetchPktcntNative(info); 7222155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande replyToMessage(message, WifiManager.RSSI_PKTCNT_FETCH_SUCCEEDED, info); 7223155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 72247806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle case CMD_DELAYED_NETWORK_DISCONNECT: 72250eebae7334d6129f7ca1344e4b20199794994358vandwalle if (!linkDebouncing && mWifiConfigStore.enableLinkDebouncing) { 7226200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle 72277806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle // Ignore if we are not debouncing 72288c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle loge("CMD_DELAYED_NETWORK_DISCONNECT and not debouncing - ignore " 72298c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle + message.arg1); 72307806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle return HANDLED; 72317806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle } else { 72328c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle loge("CMD_DELAYED_NETWORK_DISCONNECT and debouncing - disconnect " 72338c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle + message.arg1); 72347806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle 72357806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle linkDebouncing = false; 72367806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle // If we are still debouncing while this message comes, 72377806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle // it means we were not able to reconnect within the alloted time 72387806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle // = LINK_FLAPPING_DEBOUNCE_MSEC 72397806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle // and thus, trigger a real disconnect 72407806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle handleNetworkDisconnect(); 72417806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle transitionTo(mDisconnectedState); 72427806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle } 72437806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle break; 72449f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle case CMD_ASSOCIATED_BSSID: 72459f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle if ((String) message.obj == null) { 72469f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle loge("Associated command w/o BSSID"); 72479f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle break; 72489f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle } 72499f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle mLastBssid = (String) message.obj; 72509f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle mWifiInfo.setBSSID((String) message.obj); 72519f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle break; 7252155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande default: 7253155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return NOT_HANDLED; 7254155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 7255155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 7256155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return HANDLED; 7257155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 7258155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 7259155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 7260155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande class ObtainingIpState extends State { 7261155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande @Override 7262155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public void enter() { 7263b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle if (DBG) { 7264b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle String key = ""; 7265b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle if (getCurrentWifiConfiguration() != null) { 7266b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle key = getCurrentWifiConfiguration().configKey(); 7267b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle } 7268b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle log("enter ObtainingIpState netId=" + Integer.toString(mLastNetworkId) 7269b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle + " " + key + " " 7270b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle + " roam=" + mAutoRoaming 72717806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle + " static=" + mWifiConfigStore.isUsingStaticIp(mLastNetworkId) 72727806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle + " watchdog= " + obtainingIpWatchdogCount); 7273b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle } 7274b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle 72757806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle // Reset link Debouncing, indicating we have successfully re-connected to the AP 72767806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle // We might still be roaming 72777806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle linkDebouncing = false; 72787806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle 7279cdc5b747a9c6ff40a38a66bdd8f86dbf11852a7avandwalle // Send event to CM & network change broadcast 7280cdc5b747a9c6ff40a38a66bdd8f86dbf11852a7avandwalle setNetworkDetailedState(DetailedState.OBTAINING_IPADDR); 7281cdc5b747a9c6ff40a38a66bdd8f86dbf11852a7avandwalle 72822f2cf21662275a0e93d7d7a6ad3d98b4c596dcf0vandwalle // We must clear the config BSSID, as the wifi chipset may decide to roam 72832f2cf21662275a0e93d7d7a6ad3d98b4c596dcf0vandwalle // from this point on and having the BSSID specified in the network block would 72842f2cf21662275a0e93d7d7a6ad3d98b4c596dcf0vandwalle // cause the roam to faile and the device to disconnect 72859f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle clearCurrentConfigBSSID("ObtainingIpAddress"); 72869f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle 72878b2bd657976c86e0909ad792f6f96ad94db45c28Lorenzo Colitti try { 72888b2bd657976c86e0909ad792f6f96ad94db45c28Lorenzo Colitti mNwService.enableIpv6(mInterfaceName); 72898b2bd657976c86e0909ad792f6f96ad94db45c28Lorenzo Colitti } catch (RemoteException re) { 72908b2bd657976c86e0909ad792f6f96ad94db45c28Lorenzo Colitti loge("Failed to enable IPv6: " + re); 72918b2bd657976c86e0909ad792f6f96ad94db45c28Lorenzo Colitti } catch (IllegalStateException e) { 72928b2bd657976c86e0909ad792f6f96ad94db45c28Lorenzo Colitti loge("Failed to enable IPv6: " + e); 72938b2bd657976c86e0909ad792f6f96ad94db45c28Lorenzo Colitti } 72948b2bd657976c86e0909ad792f6f96ad94db45c28Lorenzo Colitti 7295155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (!mWifiConfigStore.isUsingStaticIp(mLastNetworkId)) { 7296b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle if (isRoaming()) { 72974dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle renewDhcp(); 72984dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle } else { 72993b26801d62a06475b722bbf29cba7f48f376654eLorenzo Colitti // Remove any IP address on the interface in case we're switching from static 73003b26801d62a06475b722bbf29cba7f48f376654eLorenzo Colitti // IP configuration to DHCP. This is safe because if we get here when not 73013b26801d62a06475b722bbf29cba7f48f376654eLorenzo Colitti // roaming, we don't have a usable address. 73020ebd6d71cecb5147fad1ca7a7f807aec7ffeddd9Lorenzo Colitti clearIPv4Address(mInterfaceName); 73034dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle startDhcp(); 73044dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle } 73057806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle obtainingIpWatchdogCount++; 73067806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle loge("Start Dhcp Watchdog " + obtainingIpWatchdogCount); 73078242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle // Get Link layer stats so as we get fresh tx packet counters 73088242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle getWifiLinkLayerStats(true); 73097806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle sendMessageDelayed(obtainMessage(CMD_OBTAINING_IP_ADDRESS_WATCHDOG_TIMER, 73107806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle obtainingIpWatchdogCount, 0), OBTAINING_IP_ADDRESS_GUARD_TIMER_MSEC); 7311155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 7312155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // stop any running dhcp before assigning static IP 7313155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande stopDhcp(); 73143b26801d62a06475b722bbf29cba7f48f376654eLorenzo Colitti StaticIpConfiguration config = mWifiConfigStore.getStaticIpConfiguration( 73153b26801d62a06475b722bbf29cba7f48f376654eLorenzo Colitti mLastNetworkId); 73163b26801d62a06475b722bbf29cba7f48f376654eLorenzo Colitti if (config.ipAddress == null) { 7317155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("Static IP lacks address"); 7318155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendMessage(CMD_STATIC_IP_FAILURE); 7319155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 73203b26801d62a06475b722bbf29cba7f48f376654eLorenzo Colitti InterfaceConfiguration ifcg = new InterfaceConfiguration(); 73213b26801d62a06475b722bbf29cba7f48f376654eLorenzo Colitti ifcg.setLinkAddress(config.ipAddress); 7322155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande ifcg.setInterfaceUp(); 7323155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande try { 7324155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mNwService.setInterfaceConfig(mInterfaceName, ifcg); 7325155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (DBG) log("Static IP configuration succeeded"); 73263b26801d62a06475b722bbf29cba7f48f376654eLorenzo Colitti DhcpResults dhcpResults = new DhcpResults(config); 7327155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendMessage(CMD_STATIC_IP_SUCCESS, dhcpResults); 7328155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } catch (RemoteException re) { 7329155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("Static IP configuration failed: " + re); 7330155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendMessage(CMD_STATIC_IP_FAILURE); 7331155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } catch (IllegalStateException e) { 7332155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("Static IP configuration failed: " + e); 7333155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendMessage(CMD_STATIC_IP_FAILURE); 7334155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 7335155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 7336155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 7337155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 7338155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande @Override 7339155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public boolean processMessage(Message message) { 7340f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle logStateAndMessage(message, getClass().getSimpleName()); 7341f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 7342155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande switch(message.what) { 73438c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle case CMD_STATIC_IP_SUCCESS: 7344badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti handleIPv4Success((DhcpResults) message.obj, CMD_STATIC_IP_SUCCESS); 7345155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 7346155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_STATIC_IP_FAILURE: 7347badd604178e757a65dcff91ab1ff818e3527c8e3Lorenzo Colitti handleIPv4Failure(CMD_STATIC_IP_FAILURE); 7348155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 73498c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle case CMD_AUTO_CONNECT: 73508c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle case CMD_AUTO_ROAM: 7351ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle messageHandlingStatus = MESSAGE_HANDLING_STATUS_DISCARD; 73528c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle break; 73538c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle case WifiManager.SAVE_NETWORK: 7354be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle case WifiStateMachine.CMD_AUTO_SAVE_NETWORK: 7355ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle messageHandlingStatus = MESSAGE_HANDLING_STATUS_DEFERRED; 7356155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande deferMessage(message); 7357155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 7358155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Defer any power mode changes since we must keep active power mode at DHCP */ 7359155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_SET_HIGH_PERF_MODE: 7360ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle messageHandlingStatus = MESSAGE_HANDLING_STATUS_DEFERRED; 7361155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande deferMessage(message); 7362155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 7363155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Defer scan request since we should not switch to other channels at DHCP */ 7364155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_START_SCAN: 7365ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle messageHandlingStatus = MESSAGE_HANDLING_STATUS_DEFERRED; 7366155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande deferMessage(message); 7367155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 73687806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle case CMD_OBTAINING_IP_ADDRESS_WATCHDOG_TIMER: 73697806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle if (message.arg1 == obtainingIpWatchdogCount) { 73708c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle loge("ObtainingIpAddress: Watchdog Triggered, count=" 73718c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle + obtainingIpWatchdogCount); 73727806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle handleIpConfigurationLost(); 73737806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle transitionTo(mDisconnectingState); 73747806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle break; 73757806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle } 7376ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle messageHandlingStatus = MESSAGE_HANDLING_STATUS_DISCARD; 7377ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle break; 7378155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande default: 7379155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return NOT_HANDLED; 7380155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 7381155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return HANDLED; 7382155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 7383155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 7384155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 7385155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande class VerifyingLinkState extends State { 7386155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande @Override 7387155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public void enter() { 7388155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande log(getName() + " enter"); 7389155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande setNetworkDetailedState(DetailedState.VERIFYING_POOR_LINK); 7390155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiConfigStore.updateStatus(mLastNetworkId, DetailedState.VERIFYING_POOR_LINK); 7391155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendNetworkStateChangeBroadcast(mLastBssid); 73927806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle // End roaming 7393b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle mAutoRoaming = WifiAutoJoinController.AUTO_JOIN_IDLE; 7394155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 7395155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande @Override 7396155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public boolean processMessage(Message message) { 7397f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle logStateAndMessage(message, getClass().getSimpleName()); 7398f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 7399155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande switch (message.what) { 7400155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiWatchdogStateMachine.POOR_LINK_DETECTED: 7401931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle // Stay here 7402155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande log(getName() + " POOR_LINK_DETECTED: no transition"); 7403155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 7404155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiWatchdogStateMachine.GOOD_LINK_DETECTED: 7405155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande log(getName() + " GOOD_LINK_DETECTED: transition to captive portal check"); 7406155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 7407155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande log(getName() + " GOOD_LINK_DETECTED: transition to CONNECTED"); 74084dd46ff3cff8e4e66516600ffdac98601e8bf73dRobert Greenwalt sendConnectedState(); 7409155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande transitionTo(mConnectedState); 7410155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 7411155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande default: 7412155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (DBG) log(getName() + " what=" + message.what + " NOT_HANDLED"); 7413155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return NOT_HANDLED; 7414155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 7415155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return HANDLED; 7416155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 7417155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 7418155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 74194dd46ff3cff8e4e66516600ffdac98601e8bf73dRobert Greenwalt private void sendConnectedState() { 74204dd46ff3cff8e4e66516600ffdac98601e8bf73dRobert Greenwalt // Send out a broadcast with the CAPTIVE_PORTAL_CHECK to preserve 74214dd46ff3cff8e4e66516600ffdac98601e8bf73dRobert Greenwalt // existing behaviour. The captive portal check really happens after we 74224dd46ff3cff8e4e66516600ffdac98601e8bf73dRobert Greenwalt // transition into DetailedState.CONNECTED. 74234dd46ff3cff8e4e66516600ffdac98601e8bf73dRobert Greenwalt setNetworkDetailedState(DetailedState.CAPTIVE_PORTAL_CHECK); 74244dd46ff3cff8e4e66516600ffdac98601e8bf73dRobert Greenwalt mWifiConfigStore.updateStatus(mLastNetworkId, 74254dd46ff3cff8e4e66516600ffdac98601e8bf73dRobert Greenwalt DetailedState.CAPTIVE_PORTAL_CHECK); 74264dd46ff3cff8e4e66516600ffdac98601e8bf73dRobert Greenwalt sendNetworkStateChangeBroadcast(mLastBssid); 74274dd46ff3cff8e4e66516600ffdac98601e8bf73dRobert Greenwalt 74282dbf6c027271518d868ae52ad90789eb2bc3c363Robert Greenwalt if (mWifiConfigStore.getLastSelectedConfiguration() != null) { 74292dbf6c027271518d868ae52ad90789eb2bc3c363Robert Greenwalt if (mNetworkAgent != null) mNetworkAgent.explicitlySelected(); 74302dbf6c027271518d868ae52ad90789eb2bc3c363Robert Greenwalt } 74312dbf6c027271518d868ae52ad90789eb2bc3c363Robert Greenwalt 74324dd46ff3cff8e4e66516600ffdac98601e8bf73dRobert Greenwalt setNetworkDetailedState(DetailedState.CONNECTED); 74334dd46ff3cff8e4e66516600ffdac98601e8bf73dRobert Greenwalt mWifiConfigStore.updateStatus(mLastNetworkId, DetailedState.CONNECTED); 74344dd46ff3cff8e4e66516600ffdac98601e8bf73dRobert Greenwalt sendNetworkStateChangeBroadcast(mLastBssid); 74354dd46ff3cff8e4e66516600ffdac98601e8bf73dRobert Greenwalt } 74364dd46ff3cff8e4e66516600ffdac98601e8bf73dRobert Greenwalt 74374dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle class RoamingState extends State { 7438448c9536a302c58a79e271b1721c08b8882f800evandwalle boolean mAssociated; 74394dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle @Override 74404dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle public void enter() { 74414dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle if (DBG) { 74424dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle log("RoamingState Enter" 74434dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle + " mScreenOn=" + mScreenOn ); 74444dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle } 74458242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle setScanAlarm(false); 74460d616ef3bf635dff8722e064c0be842676390ed8vandwalle 74470d616ef3bf635dff8722e064c0be842676390ed8vandwalle // Make sure we disconnect if roaming fails 74480d616ef3bf635dff8722e064c0be842676390ed8vandwalle roamWatchdogCount++; 74490d616ef3bf635dff8722e064c0be842676390ed8vandwalle loge("Start Roam Watchdog " + roamWatchdogCount); 74500d616ef3bf635dff8722e064c0be842676390ed8vandwalle sendMessageDelayed(obtainMessage(CMD_ROAM_WATCHDOG_TIMER, 74510d616ef3bf635dff8722e064c0be842676390ed8vandwalle roamWatchdogCount, 0), ROAM_GUARD_TIMER_MSEC); 7452448c9536a302c58a79e271b1721c08b8882f800evandwalle mAssociated = false; 74534dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle } 74544dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle @Override 74554dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle public boolean processMessage(Message message) { 74564dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle logStateAndMessage(message, getClass().getSimpleName()); 74574dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle 74584dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle switch (message.what) { 74594dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle case WifiWatchdogStateMachine.POOR_LINK_DETECTED: 74604dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle if (DBG) log("Roaming and Watchdog reports poor link -> ignore"); 74614dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle return HANDLED; 74624dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle case CMD_UNWANTED_NETWORK: 74634dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle if (DBG) log("Roaming and CS doesnt want the network -> ignore"); 74644dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle return HANDLED; 74654dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle case CMD_SET_OPERATIONAL_MODE: 74664dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle if (message.arg1 != CONNECT_MODE) { 74674dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle deferMessage(message); 74684dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle } 74694dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle break; 74704dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle case WifiMonitor.SUPPLICANT_STATE_CHANGE_EVENT: 7471931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle /** 747297b9c4fef6e372d1f19b333c7a67ff27ef80baf0vandwalle * If we get a SUPPLICANT_STATE_CHANGE_EVENT indicating a DISCONNECT 747397b9c4fef6e372d1f19b333c7a67ff27ef80baf0vandwalle * before NETWORK_DISCONNECTION_EVENT 747497b9c4fef6e372d1f19b333c7a67ff27ef80baf0vandwalle * And there is an associated BSSID corresponding to our target BSSID, then 74754dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle * we have missed the network disconnection, transition to mDisconnectedState 747697b9c4fef6e372d1f19b333c7a67ff27ef80baf0vandwalle * and handle the rest of the events there. 74774dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle */ 74784dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle StateChangeResult stateChangeResult = (StateChangeResult) message.obj; 747997b9c4fef6e372d1f19b333c7a67ff27ef80baf0vandwalle if (stateChangeResult.state == SupplicantState.DISCONNECTED 748097b9c4fef6e372d1f19b333c7a67ff27ef80baf0vandwalle || stateChangeResult.state == SupplicantState.INACTIVE 748197b9c4fef6e372d1f19b333c7a67ff27ef80baf0vandwalle || stateChangeResult.state == SupplicantState.INTERFACE_DISABLED) { 748297b9c4fef6e372d1f19b333c7a67ff27ef80baf0vandwalle if (DBG) { 748397b9c4fef6e372d1f19b333c7a67ff27ef80baf0vandwalle log("STATE_CHANGE_EVENT in roaming state " 748497b9c4fef6e372d1f19b333c7a67ff27ef80baf0vandwalle + stateChangeResult.toString() ); 748597b9c4fef6e372d1f19b333c7a67ff27ef80baf0vandwalle } 748697b9c4fef6e372d1f19b333c7a67ff27ef80baf0vandwalle if (stateChangeResult.BSSID != null 748797b9c4fef6e372d1f19b333c7a67ff27ef80baf0vandwalle && stateChangeResult.BSSID.equals(mTargetRoamBSSID)) { 748897b9c4fef6e372d1f19b333c7a67ff27ef80baf0vandwalle handleNetworkDisconnect(); 74890d616ef3bf635dff8722e064c0be842676390ed8vandwalle transitionTo(mDisconnectedState); 749097b9c4fef6e372d1f19b333c7a67ff27ef80baf0vandwalle } 749197b9c4fef6e372d1f19b333c7a67ff27ef80baf0vandwalle } 7492448c9536a302c58a79e271b1721c08b8882f800evandwalle if (stateChangeResult.state == SupplicantState.ASSOCIATED) { 7493448c9536a302c58a79e271b1721c08b8882f800evandwalle // We completed the layer2 roaming part 7494448c9536a302c58a79e271b1721c08b8882f800evandwalle mAssociated = true; 7495e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle if (stateChangeResult.BSSID != null) { 7496e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle mTargetRoamBSSID = (String) stateChangeResult.BSSID; 7497e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle } 7498448c9536a302c58a79e271b1721c08b8882f800evandwalle } 74994dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle break; 75000d616ef3bf635dff8722e064c0be842676390ed8vandwalle case CMD_ROAM_WATCHDOG_TIMER: 75010d616ef3bf635dff8722e064c0be842676390ed8vandwalle if (roamWatchdogCount == message.arg1) { 75020d616ef3bf635dff8722e064c0be842676390ed8vandwalle if (DBG) log("roaming watchdog! -> disconnect"); 75039f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle mRoamFailCount++; 75040d616ef3bf635dff8722e064c0be842676390ed8vandwalle handleNetworkDisconnect(); 75050d616ef3bf635dff8722e064c0be842676390ed8vandwalle mWifiNative.disconnect(); 75060d616ef3bf635dff8722e064c0be842676390ed8vandwalle transitionTo(mDisconnectedState); 75070d616ef3bf635dff8722e064c0be842676390ed8vandwalle } 75080d616ef3bf635dff8722e064c0be842676390ed8vandwalle break; 75094dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle case WifiMonitor.NETWORK_CONNECTION_EVENT: 7510448c9536a302c58a79e271b1721c08b8882f800evandwalle if (mAssociated) { 7511448c9536a302c58a79e271b1721c08b8882f800evandwalle if (DBG) log("roaming and Network connection established"); 7512448c9536a302c58a79e271b1721c08b8882f800evandwalle mLastNetworkId = message.arg1; 7513448c9536a302c58a79e271b1721c08b8882f800evandwalle mLastBssid = (String) message.obj; 7514448c9536a302c58a79e271b1721c08b8882f800evandwalle mWifiInfo.setBSSID(mLastBssid); 7515448c9536a302c58a79e271b1721c08b8882f800evandwalle mWifiInfo.setNetworkId(mLastNetworkId); 7516448c9536a302c58a79e271b1721c08b8882f800evandwalle mWifiConfigStore.handleBSSIDBlackList(mLastNetworkId, mLastBssid, true); 7517448c9536a302c58a79e271b1721c08b8882f800evandwalle transitionTo(mObtainingIpState); 7518448c9536a302c58a79e271b1721c08b8882f800evandwalle } else { 7519448c9536a302c58a79e271b1721c08b8882f800evandwalle messageHandlingStatus = MESSAGE_HANDLING_STATUS_DISCARD; 7520448c9536a302c58a79e271b1721c08b8882f800evandwalle } 75214dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle break; 75224dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle case WifiMonitor.NETWORK_DISCONNECTION_EVENT: 75230d616ef3bf635dff8722e064c0be842676390ed8vandwalle // Throw away but only if it corresponds to the network we're roaming to 7524b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle String bssid = (String)message.obj; 75258c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle if (true) { 75268c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle String target = ""; 75278c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle if (mTargetRoamBSSID != null) target = mTargetRoamBSSID; 7528b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle log("NETWORK_DISCONNECTION_EVENT in roaming state" 75298c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle + " BSSID=" + bssid 75308c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle + " target=" + target); 7531b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle } 7532b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle if (bssid != null && bssid.equals(mTargetRoamBSSID)) { 7533b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle handleNetworkDisconnect(); 75348c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle transitionTo(mDisconnectedState); 7535b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle } 75364dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle break; 7537b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle case WifiMonitor.SSID_TEMP_DISABLED: 7538931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle // Auth error while roaming 75398c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle loge("SSID_TEMP_DISABLED nid=" + Integer.toString(mLastNetworkId) 75408c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle + " id=" + Integer.toString(message.arg1) 75418c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle + " isRoaming=" + isRoaming() 75428c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle + " roam=" + Integer.toString(mAutoRoaming)); 7543b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle if (message.arg1 == mLastNetworkId) { 75448c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle handleNetworkDisconnect(); 7545b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle transitionTo(mDisconnectingState); 7546b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle } 7547b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle return NOT_HANDLED; 7548b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle case CMD_START_SCAN: 7549b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle deferMessage(message); 7550b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle break; 7551b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle default: 75524dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle return NOT_HANDLED; 75534dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle } 75544dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle return HANDLED; 75554dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle } 75564dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle 75574dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle @Override 75584dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle public void exit() { 75594dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle loge("WifiStateMachine: Leaving Roaming state"); 75604dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle } 75614dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle } 75624dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle 7563155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande class ConnectedState extends State { 7564155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande @Override 7565f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle public void enter() { 7566f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle String address; 7567f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle updateDefaultRouteMacAddress(1000); 7568f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle if (DBG) { 7569be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle log("ConnectedState Enter " 7570f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle + " mScreenOn=" + mScreenOn 7571e67ec726c07410073575473c0f50dc737629f5davandwalle + " scanperiod=" 75720eebae7334d6129f7ca1344e4b20199794994358vandwalle + Integer.toString(mWifiConfigStore.associatedPartialScanPeriodMilli) ); 7573f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle } 75742f2cf21662275a0e93d7d7a6ad3d98b4c596dcf0vandwalle if (mScreenOn 757570468b47454c8657e8963932f2e08a3f4d7e3881vandwalle && mWifiConfigStore.enableAutoJoinScanWhenAssociated) { 75768242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle // restart scan alarm 75778242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle startDelayedScan(mWifiConfigStore.associatedPartialScanPeriodMilli, null, null); 7578f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle } 75794dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle registerConnected(); 7580b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle lastConnectAttempt = 0; 758140ff222cec1bd05879edb53abc75c6deead734cavandwalle targetWificonfiguration = null; 75827806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle // Paranoia 75837806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle linkDebouncing = false; 75847806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle 75857806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle // Not roaming anymore 75867806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle mAutoRoaming = WifiAutoJoinController.AUTO_JOIN_IDLE; 758740ff222cec1bd05879edb53abc75c6deead734cavandwalle 75887806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle if (testNetworkDisconnect) { 75897806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle testNetworkDisconnectCounter++; 75907806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle loge("ConnectedState Enter start disconnect test " + 75917806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle testNetworkDisconnectCounter); 75927806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle sendMessageDelayed(obtainMessage(CMD_TEST_NETWORK_DISCONNECT, 75937806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle testNetworkDisconnectCounter, 0), 15000); 75947806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle } 75959f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle 7596be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle // Reenable all networks, allow for hidden networks to be scanned 7597be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle mWifiConfigStore.enableAllNetworks(); 759885f2d77b1b858c063471951f3a5f93c96bd5e72bvandwalle 759985f2d77b1b858c063471951f3a5f93c96bd5e72bvandwalle mLastDriverRoamAttempt = 0; 7600f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle } 7601f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle @Override 7602155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public boolean processMessage(Message message) { 7603be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle WifiConfiguration config = null; 7604f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle logStateAndMessage(message, getClass().getSimpleName()); 7605f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 7606155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande switch (message.what) { 76074dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle case WifiWatchdogStateMachine.POOR_LINK_DETECTED: 7608155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (DBG) log("Watchdog reports poor link"); 7609155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande transitionTo(mVerifyingLinkState); 7610155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 761127355a942653264388e909a4276196ee63e57811vandwalle case CMD_UNWANTED_NETWORK: 7612e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle if (message.arg1 == network_status_unwanted_disconnect) { 7613e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle mWifiConfigStore.handleBadNetworkDisconnectReport(mLastNetworkId, mWifiInfo); 7614e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle mWifiNative.disconnect(); 7615e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle transitionTo(mDisconnectingState); 7616f9715cc118c446695b2a82211881c7d6c5e59761vandwalle } else if (message.arg1 == network_status_unwanted_disable_autojoin) { 7617e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle config = getCurrentWifiConfiguration(); 7618e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle if (config != null) { 7619e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle // Disable autojoin 7620d30127db46224e45554f8964209221bba8ad41d9vandwalle config.numNoInternetAccessReports += 1; 7621d30127db46224e45554f8964209221bba8ad41d9vandwalle } 7622d30127db46224e45554f8964209221bba8ad41d9vandwalle } 7623d30127db46224e45554f8964209221bba8ad41d9vandwalle return HANDLED; 7624d30127db46224e45554f8964209221bba8ad41d9vandwalle case CMD_NETWORK_STATUS: 7625d30127db46224e45554f8964209221bba8ad41d9vandwalle if (message.arg1 == NetworkAgent.VALID_NETWORK) { 7626d30127db46224e45554f8964209221bba8ad41d9vandwalle config = getCurrentWifiConfiguration(); 7627d30127db46224e45554f8964209221bba8ad41d9vandwalle if (config != null) { 7628d30127db46224e45554f8964209221bba8ad41d9vandwalle // re-enable autojoin 7629d30127db46224e45554f8964209221bba8ad41d9vandwalle config.numNoInternetAccessReports = 0; 7630d30127db46224e45554f8964209221bba8ad41d9vandwalle config.validatedInternetAccess = true; 7631e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle } 7632e0aa0a004d161173992a0e9af1b431fae91f4a71vandwalle } 763327355a942653264388e909a4276196ee63e57811vandwalle return HANDLED; 76347806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle case CMD_TEST_NETWORK_DISCONNECT: 76357806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle // Force a disconnect 76367806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle if (message.arg1 == testNetworkDisconnectCounter) { 76377806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle mWifiNative.disconnect(); 76387806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle } 76397806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle break; 764085f2d77b1b858c063471951f3a5f93c96bd5e72bvandwalle case CMD_ASSOCIATED_BSSID: 764185f2d77b1b858c063471951f3a5f93c96bd5e72bvandwalle // ASSOCIATING to a new BSSID while already connected, indicates 764285f2d77b1b858c063471951f3a5f93c96bd5e72bvandwalle // that driver is roaming 764385f2d77b1b858c063471951f3a5f93c96bd5e72bvandwalle mLastDriverRoamAttempt = System.currentTimeMillis(); 76441ec92c57244311c7fca3ab6b244a06c2b2b58902vandwalle String toBSSID = (String)message.obj; 76451ec92c57244311c7fca3ab6b244a06c2b2b58902vandwalle if (toBSSID != null && !toBSSID.equals(mWifiInfo.getBSSID())) { 76461ec92c57244311c7fca3ab6b244a06c2b2b58902vandwalle mWifiConfigStore.driverRoamedFrom(mWifiInfo); 76471ec92c57244311c7fca3ab6b244a06c2b2b58902vandwalle } 764885f2d77b1b858c063471951f3a5f93c96bd5e72bvandwalle return NOT_HANDLED; 76497806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle case WifiMonitor.NETWORK_DISCONNECTION_EVENT: 765085f2d77b1b858c063471951f3a5f93c96bd5e72bvandwalle long lastRoam = 0; 765185f2d77b1b858c063471951f3a5f93c96bd5e72bvandwalle if (mLastDriverRoamAttempt != 0) { 765285f2d77b1b858c063471951f3a5f93c96bd5e72bvandwalle // Calculate time since last driver roam attempt 765385f2d77b1b858c063471951f3a5f93c96bd5e72bvandwalle lastRoam = System.currentTimeMillis() - mLastDriverRoamAttempt; 765485f2d77b1b858c063471951f3a5f93c96bd5e72bvandwalle mLastDriverRoamAttempt = 0; 765585f2d77b1b858c063471951f3a5f93c96bd5e72bvandwalle } 7656be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle config = getCurrentWifiConfiguration(); 7657c9b047b4cb480edbb490516746cfcbb4a4eedeeavandwalle if (mScreenOn 7658c9b047b4cb480edbb490516746cfcbb4a4eedeeavandwalle && !linkDebouncing 7659c9b047b4cb480edbb490516746cfcbb4a4eedeeavandwalle && config != null 7660c9b047b4cb480edbb490516746cfcbb4a4eedeeavandwalle && config.autoJoinStatus == WifiConfiguration.AUTO_JOIN_ENABLED 7661c9b047b4cb480edbb490516746cfcbb4a4eedeeavandwalle && !mWifiConfigStore.isLastSelectedConfiguration(config) 766285f2d77b1b858c063471951f3a5f93c96bd5e72bvandwalle && (message.arg2 != 3 /* reason cannot be 3, i.e. locally generated */ 766385f2d77b1b858c063471951f3a5f93c96bd5e72bvandwalle || (lastRoam > 0 && lastRoam < 2000) /* unless driver is roaming */) 7664c9b047b4cb480edbb490516746cfcbb4a4eedeeavandwalle && ((ScanResult.is24GHz(mWifiInfo.getFrequency()) 76657806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle && mWifiInfo.getRssi() > 76667806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle WifiConfiguration.BAD_RSSI_24) 76677806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle || (ScanResult.is5GHz(mWifiInfo.getFrequency()) 76687806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle && mWifiInfo.getRssi() > 76697806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle WifiConfiguration.BAD_RSSI_5))) { 76707806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle // Start de-bouncing the L2 disconnection: 76717806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle // this L2 disconnection might be spurious. 76727806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle // Hence we allow 7 seconds for the state machine to try 76737806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle // to reconnect, go thru the 76747806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle // roaming cycle and enter Obtaining IP address 76757806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle // before signalling the disconnect to ConnectivityService and L3 76767806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle startScanForConfiguration(getCurrentWifiConfiguration(), false); 76777806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle linkDebouncing = true; 76787806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle 76797806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle sendMessageDelayed(obtainMessage(CMD_DELAYED_NETWORK_DISCONNECT, 76807806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle 0, mLastNetworkId), LINK_FLAPPING_DEBOUNCE_MSEC); 76817806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle if (DBG) { 76827806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle log("NETWORK_DISCONNECTION_EVENT in connected state" 76837806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle + " BSSID=" + mWifiInfo.getBSSID() 76847806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle + " RSSI=" + mWifiInfo.getRssi() 76857806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle + " freq=" + mWifiInfo.getFrequency() 7686c9b047b4cb480edbb490516746cfcbb4a4eedeeavandwalle + " reason=" + message.arg2 76877806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle + " -> debounce"); 76887806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle } 76897806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle return HANDLED; 76907806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle } else { 76917806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle if (DBG) { 7692be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle int ajst = -1; 7693be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle if (config != null) ajst = config.autoJoinStatus; 76947806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle log("NETWORK_DISCONNECTION_EVENT in connected state" 76957806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle + " BSSID=" + mWifiInfo.getBSSID() 76967806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle + " RSSI=" + mWifiInfo.getRssi() 76977806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle + " freq=" + mWifiInfo.getFrequency() 7698be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle + " was debouncing=" + linkDebouncing 7699c9b047b4cb480edbb490516746cfcbb4a4eedeeavandwalle + " reason=" + message.arg2 7700be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle + " ajst=" + ajst); 77017806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle } 77027806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle } 77037806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle break; 77044dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle case CMD_AUTO_ROAM: 770585f2d77b1b858c063471951f3a5f93c96bd5e72bvandwalle // Clear the driver roam indication since we are attempting a framerwork roam 770685f2d77b1b858c063471951f3a5f93c96bd5e72bvandwalle mLastDriverRoamAttempt = 0; 770785f2d77b1b858c063471951f3a5f93c96bd5e72bvandwalle 7708931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle /* Connect command coming from auto-join */ 7709b07da189850a4bfa268f8ab9be7867935eb2ecb5vandwalle ScanResult candidate = (ScanResult)message.obj; 77107806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle String bssid = "any"; 7711e67ec726c07410073575473c0f50dc737629f5davandwalle if (candidate != null && candidate.is5GHz()) { 7712e67ec726c07410073575473c0f50dc737629f5davandwalle // Only lock BSSID for 5GHz networks 77137806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle bssid = candidate.BSSID; 77147806f8c800754da0f76d7a0c1a6a590381dac7a8vandwalle } 77154dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle int netId = mLastNetworkId; 7716be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle config = getCurrentWifiConfiguration(); 77174dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle 77189f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle 77199f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle if (config == null) { 77209f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle loge("AUTO_ROAM and no config, bail out..."); 77219f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle break; 77229f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle } 77239f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle 77244dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle loge("CMD_AUTO_ROAM sup state " 77254dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle + mSupplicantStateTracker.getSupplicantStateName() 77264dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle + " my state " + getCurrentState().getName() 77274dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle + " nid=" + Integer.toString(netId) 77289f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle + " config " + config.configKey() 7729b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle + " roam=" + Integer.toString(message.arg2) 77309f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle + " to " + bssid 77319f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle + " targetRoamBSSID " + mTargetRoamBSSID); 77324dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle 7733931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle /* Save the BSSID so as to lock it @ firmware */ 77349d082c381274f27dad1e344223189e00148e2124vandwalle if (!autoRoamSetBSSID(config, bssid) && !linkDebouncing) { 77359f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle loge("AUTO_ROAM nothing to do"); 77369f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle // Same BSSID, nothing to do 77379e806a8d9f297e4de826e65322859a89e4d95c8bvandwalle messageHandlingStatus = MESSAGE_HANDLING_STATUS_DISCARD; 77389f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle break; 77399f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle }; 77409f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle 7741b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle // Make sure the network is enabled, since supplicant will not reenable it 7742b664cfeab6f02e24376ea0a15beb83d142f0b14dvandwalle mWifiConfigStore.enableNetworkWithoutBroadcast(netId, false); 7743b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle 7744e67ec726c07410073575473c0f50dc737629f5davandwalle boolean ret = false; 77451ec92c57244311c7fca3ab6b244a06c2b2b58902vandwalle if (mLastNetworkId != netId) { 77461ec92c57244311c7fca3ab6b244a06c2b2b58902vandwalle if (mWifiConfigStore.selectNetwork(netId) && 77471ec92c57244311c7fca3ab6b244a06c2b2b58902vandwalle mWifiNative.reconnect()) { 77481ec92c57244311c7fca3ab6b244a06c2b2b58902vandwalle ret = true; 77491ec92c57244311c7fca3ab6b244a06c2b2b58902vandwalle } 7750e67ec726c07410073575473c0f50dc737629f5davandwalle } else { 77511ec92c57244311c7fca3ab6b244a06c2b2b58902vandwalle ret = mWifiNative.reassociate(); 7752e67ec726c07410073575473c0f50dc737629f5davandwalle } 7753e67ec726c07410073575473c0f50dc737629f5davandwalle if (ret) { 7754b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle lastConnectAttempt = System.currentTimeMillis(); 775540ff222cec1bd05879edb53abc75c6deead734cavandwalle targetWificonfiguration = mWifiConfigStore.getWifiConfiguration(netId); 775640ff222cec1bd05879edb53abc75c6deead734cavandwalle 7757931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle // replyToMessage(message, WifiManager.CONNECT_NETWORK_SUCCEEDED); 7758b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle mAutoRoaming = message.arg2; 77594dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle transitionTo(mRoamingState); 77604dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle 77614dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle } else { 77624dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle loge("Failed to connect config: " + config + " netId: " + netId); 77634dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle replyToMessage(message, WifiManager.CONNECT_NETWORK_FAILED, 77644dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle WifiManager.ERROR); 77659e806a8d9f297e4de826e65322859a89e4d95c8bvandwalle messageHandlingStatus = MESSAGE_HANDLING_STATUS_FAIL; 77664dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle break; 77674dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle } 77684dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle break; 7769155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande default: 7770155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return NOT_HANDLED; 7771155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 7772155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return HANDLED; 7773155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 7774155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 7775155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande @Override 7776155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public void exit() { 7777f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle loge("WifiStateMachine: Leaving Connected state"); 77788242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle setScanAlarm(false); 777985f2d77b1b858c063471951f3a5f93c96bd5e72bvandwalle mLastDriverRoamAttempt = 0; 7780155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 7781155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 7782155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 7783155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande class DisconnectingState extends State { 7784f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 7785f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle @Override 7786f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle public void enter() { 7787f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 7788f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle if (PDBG) { 7789f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle loge(" Enter DisconnectingState State scan interval " + mFrameworkScanIntervalMs 7790f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle + " mEnableBackgroundScan= " + mEnableBackgroundScan 7791f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle + " screenOn=" + mScreenOn); 7792f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle } 7793be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle 7794be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle // Make sure we disconnect: we enter this state prior connecting to a new 7795be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle // network, waiting for either a DISCONECT event or a SUPPLICANT_STATE_CHANGE 7796be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle // event which in this case will be indicating that supplicant started to associate. 7797be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle // In some cases supplicant doesn't ignore the connect requests (it might not 7798be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle // find the target SSID in its cache), 7799be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle // Therefore we end up stuck that state, hence the need for the watchdog. 7800be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle disconnectingWatchdogCount++; 7801be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle loge("Start Disconnecting Watchdog " + disconnectingWatchdogCount); 7802be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle sendMessageDelayed(obtainMessage(CMD_DISCONNECTING_WATCHDOG_TIMER, 7803be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle disconnectingWatchdogCount, 0), DISCONNECTING_GUARD_TIMER_MSEC); 7804f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle } 7805f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 7806155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande @Override 7807155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public boolean processMessage(Message message) { 7808f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle logStateAndMessage(message, getClass().getSimpleName()); 7809155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande switch (message.what) { 7810155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_SET_OPERATIONAL_MODE: 7811155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (message.arg1 != CONNECT_MODE) { 7812155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande deferMessage(message); 7813155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 7814155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 7815b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle case CMD_START_SCAN: 78168242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle deferMessage(message); 7817b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle return HANDLED; 7818be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle case CMD_DISCONNECTING_WATCHDOG_TIMER: 7819be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle if (disconnectingWatchdogCount == message.arg1) { 7820be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle if (DBG) log("disconnecting watchdog! -> disconnect"); 7821be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle handleNetworkDisconnect(); 7822be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle transitionTo(mDisconnectedState); 7823be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle } 7824be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle break; 7825155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiMonitor.SUPPLICANT_STATE_CHANGE_EVENT: 7826be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle /** 7827be3095ed758fca076b9ccb9fdae48f7f865c078avandwalle * If we get a SUPPLICANT_STATE_CHANGE_EVENT before NETWORK_DISCONNECTION_EVENT 7828155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * we have missed the network disconnection, transition to mDisconnectedState 7829155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * and handle the rest of the events there 7830155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 7831155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande deferMessage(message); 7832155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande handleNetworkDisconnect(); 7833155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande transitionTo(mDisconnectedState); 7834155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 7835155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande default: 7836155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return NOT_HANDLED; 7837155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 7838155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return HANDLED; 7839155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 7840f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle } 7841155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 7842f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle class DisconnectedState extends State { 7843155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande @Override 7844155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public void enter() { 7845155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // We dont scan frequently if this is a temporary disconnect 7846155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // due to p2p 7847155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mTemporarilyDisconnectWifi) { 7848155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiP2pChannel.sendMessage(WifiP2pServiceImpl.DISCONNECT_WIFI_RESPONSE); 7849155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return; 7850155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 7851155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 7852155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mFrameworkScanIntervalMs = Settings.Global.getLong(mContext.getContentResolver(), 7853155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Settings.Global.WIFI_FRAMEWORK_SCAN_INTERVAL_MS, 7854155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mDefaultFrameworkScanIntervalMs); 7855f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 7856f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle if (PDBG) { 7857f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle loge(" Enter disconnected State scan interval " + mFrameworkScanIntervalMs 7858f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle + " mEnableBackgroundScan= " + mEnableBackgroundScan 7859833dcce8f6712f7594f06ea33208e3e106c15afcvandwalle + " screenOn=" + mScreenOn 7860833dcce8f6712f7594f06ea33208e3e106c15afcvandwalle + " mFrameworkScanIntervalMs=" + mFrameworkScanIntervalMs); 7861f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle } 7862f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 78634dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle /** clear the roaming state, if we were roaming, we failed */ 7864b97e66604f472f67c233bb8f8d9630bb36131e2cvandwalle mAutoRoaming = WifiAutoJoinController.AUTO_JOIN_IDLE; 78654dc6f3a322806b25d50039614cde1b94fe91ab17vandwalle 78668242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle if (mScreenOn) { 78678242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle /** 78688242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle * screen lit and => delayed timer 7869155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 78708242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle startDelayedScan(mDisconnectedScanPeriodMs, null, null); 7871155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 78728242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle /** 78738242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle * screen dark and PNO supported => scan alarm disabled 78748242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle */ 78758242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle if (mEnableBackgroundScan) { 78768242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle /* If a regular scan result is pending, do not initiate background 78778242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle * scan until the scan results are returned. This is needed because 78788242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle * initiating a background scan will cancel the regular scan and 78798242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle * scan results will not be returned until background scanning is 78808242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle * cleared 78818242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle */ 78828242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle if (!mIsScanOngoing) { 78838242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle enableBackgroundScan(true); 78848242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle } 78858242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle } else { 78868242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle setScanAlarm(true); 78878242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle } 7888f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle } 7889f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 7890155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 7891155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * If we have no networks saved, the supplicant stops doing the periodic scan. 7892155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * The scans are useful to notify the user of the presence of an open network. 7893155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Note that these are not wake up scans. 7894155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 7895155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (!mP2pConnected.get() && mWifiConfigStore.getConfiguredNetworks().size() == 0) { 7896155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendMessageDelayed(obtainMessage(CMD_NO_NETWORKS_PERIODIC_SCAN, 7897c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle ++mPeriodicScanToken, 0), mSupplicantScanIntervalMs); 7898155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 78990eebae7334d6129f7ca1344e4b20199794994358vandwalle 79000eebae7334d6129f7ca1344e4b20199794994358vandwalle mDisconnectedTimeStamp = System.currentTimeMillis(); 79010eebae7334d6129f7ca1344e4b20199794994358vandwalle 7902155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 7903155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande @Override 7904155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public boolean processMessage(Message message) { 7905155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande boolean ret = HANDLED; 7906f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 7907f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle logStateAndMessage(message, getClass().getSimpleName()); 7908f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 7909155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande switch (message.what) { 7910155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_NO_NETWORKS_PERIODIC_SCAN: 7911155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mP2pConnected.get()) break; 7912155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (message.arg1 == mPeriodicScanToken && 7913155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiConfigStore.getConfiguredNetworks().size() == 0) { 7914ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle startScan(UNKNOWN_SCAN_SOURCE, -1, null, null); 7915155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendMessageDelayed(obtainMessage(CMD_NO_NETWORKS_PERIODIC_SCAN, 7916155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande ++mPeriodicScanToken, 0), mSupplicantScanIntervalMs); 7917155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 7918155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 7919155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiManager.FORGET_NETWORK: 7920155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_REMOVE_NETWORK: 7921155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Set up a delayed message here. After the forget/remove is handled 7922155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // the handled delayed message will determine if there is a need to 7923155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // scan and continue 7924155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendMessageDelayed(obtainMessage(CMD_NO_NETWORKS_PERIODIC_SCAN, 7925155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande ++mPeriodicScanToken, 0), mSupplicantScanIntervalMs); 7926155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande ret = NOT_HANDLED; 7927155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 7928155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_SET_OPERATIONAL_MODE: 7929155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (message.arg1 != CONNECT_MODE) { 7930155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mOperationalMode = message.arg1; 7931155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 7932155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiConfigStore.disableAllNetworks(); 7933155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mOperationalMode == SCAN_ONLY_WITH_WIFI_OFF_MODE) { 7934155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiP2pChannel.sendMessage(CMD_DISABLE_P2P_REQ); 7935155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande setWifiState(WIFI_STATE_DISABLED); 7936155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 7937155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 7938155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande transitionTo(mScanModeState); 7939155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 7940155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 7941155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Ignore network disconnect */ 7942155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiMonitor.NETWORK_DISCONNECTION_EVENT: 7943155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 7944155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiMonitor.SUPPLICANT_STATE_CHANGE_EVENT: 7945155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande StateChangeResult stateChangeResult = (StateChangeResult) message.obj; 79469f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle if (DBG) { 79479f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle loge("SUPPLICANT_STATE_CHANGE_EVENT state=" + stateChangeResult.state + 79489f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle " -> state= " + WifiInfo.getDetailedStateOf(stateChangeResult.state) 79499f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle + " debouncing=" + linkDebouncing); 79509f3349fa2cd39d690d1e2b7c3b71ced412e24f2cvandwalle } 7951155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande setNetworkDetailedState(WifiInfo.getDetailedStateOf(stateChangeResult.state)); 7952155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* ConnectModeState does the rest of the handling */ 7953155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande ret = NOT_HANDLED; 7954155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 7955155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_START_SCAN: 79568242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle if (!checkOrDeferScanAllowed(message)) { 79578242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle // The scan request was rescheduled 79588242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle messageHandlingStatus = MESSAGE_HANDLING_STATUS_REFUSED; 7959b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle return HANDLED; 7960b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle } 7961155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Disable background scan temporarily during a regular scan */ 7962155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mEnableBackgroundScan) { 7963cce5b9e0eded28096991578e020883484ece8c54Vinit Deshpande enableBackgroundScan(false); 7964155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 79658242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle if (message.arg1 == SCAN_ALARM_SOURCE) { 79668242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle // Check if the CMD_START_SCAN message is obsolete (and thus if it should 79678242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle // not be processed) and restart the scan 7968a1c02f0a73ee35e198e2652cd65b8830a163d9ddvandwalle int period = mDisconnectedScanPeriodMs; 7969a1c02f0a73ee35e198e2652cd65b8830a163d9ddvandwalle if (mP2pConnected.get()) { 7970a1c02f0a73ee35e198e2652cd65b8830a163d9ddvandwalle period = (int)Settings.Global.getLong(mContext.getContentResolver(), 7971a1c02f0a73ee35e198e2652cd65b8830a163d9ddvandwalle Settings.Global.WIFI_SCAN_INTERVAL_WHEN_P2P_CONNECTED_MS, 7972a1c02f0a73ee35e198e2652cd65b8830a163d9ddvandwalle mDisconnectedScanPeriodMs); 7973a1c02f0a73ee35e198e2652cd65b8830a163d9ddvandwalle } 79748242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle if (!checkAndRestartDelayedScan(message.arg2, 7975a1c02f0a73ee35e198e2652cd65b8830a163d9ddvandwalle true, period, null, null)) { 79768242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle messageHandlingStatus = MESSAGE_HANDLING_STATUS_OBSOLETE; 79778242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle loge("WifiStateMachine Disconnected CMD_START_SCAN source " 79788242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle + message.arg1 79798242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle + " " + message.arg2 + ", " + mDelayedScanCounter 79808242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle + " -> obsolete"); 79818242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle return HANDLED; 79828242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle } 79838242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle handleScanRequest(WifiNative.SCAN_WITHOUT_CONNECTION_SETUP, message); 79848242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle ret = HANDLED; 79858242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle } else { 79868242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle ret = NOT_HANDLED; 79878242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle } 7988155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 7989155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiMonitor.SCAN_RESULTS_EVENT: 7990155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Re-enable background scan when a pending scan result is received */ 7991a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng if (mEnableBackgroundScan && mIsScanOngoing) { 7992cce5b9e0eded28096991578e020883484ece8c54Vinit Deshpande enableBackgroundScan(true); 7993155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 7994155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Handled in parent state */ 7995155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande ret = NOT_HANDLED; 7996155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 7997155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiP2pServiceImpl.P2P_CONNECTION_CHANGED: 7998155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande NetworkInfo info = (NetworkInfo) message.obj; 7999155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mP2pConnected.set(info.isConnected()); 8000155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mP2pConnected.get()) { 8001155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande int defaultInterval = mContext.getResources().getInteger( 8002155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande R.integer.config_wifi_scan_interval_p2p_connected); 8003155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande long scanIntervalMs = Settings.Global.getLong(mContext.getContentResolver(), 8004155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Settings.Global.WIFI_SCAN_INTERVAL_WHEN_P2P_CONNECTED_MS, 8005155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande defaultInterval); 8006155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiNative.setScanInterval((int) scanIntervalMs/1000); 8007155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else if (mWifiConfigStore.getConfiguredNetworks().size() == 0) { 8008155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (DBG) log("Turn on scanning after p2p disconnected"); 8009155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendMessageDelayed(obtainMessage(CMD_NO_NETWORKS_PERIODIC_SCAN, 8010155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande ++mPeriodicScanToken, 0), mSupplicantScanIntervalMs); 8011a1c02f0a73ee35e198e2652cd65b8830a163d9ddvandwalle } else { 8012a1c02f0a73ee35e198e2652cd65b8830a163d9ddvandwalle // If P2P is not connected and there are saved networks, then restart 8013a1c02f0a73ee35e198e2652cd65b8830a163d9ddvandwalle // scanning at the normal period. This is necessary because scanning might 8014a1c02f0a73ee35e198e2652cd65b8830a163d9ddvandwalle // have been disabled altogether if WIFI_SCAN_INTERVAL_WHEN_P2P_CONNECTED_MS 8015a1c02f0a73ee35e198e2652cd65b8830a163d9ddvandwalle // was set to zero. 8016a1c02f0a73ee35e198e2652cd65b8830a163d9ddvandwalle startDelayedScan(mDisconnectedScanPeriodMs, null, null); 8017155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 8018155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_RECONNECT: 8019155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_REASSOCIATE: 8020155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mTemporarilyDisconnectWifi) { 8021155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Drop a third party reconnect/reassociate if STA is 8022155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // temporarily disconnected for p2p 8023155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 8024155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 8025155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // ConnectModeState handles it 8026155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande ret = NOT_HANDLED; 8027155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 8028155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 80297c8a4effa2442b9d00fd421b443ea9645f8651c8Vinit Deshpande case CMD_SCREEN_STATE_CHANGED: 80307c8a4effa2442b9d00fd421b443ea9645f8651c8Vinit Deshpande handleScreenStateChanged(message.arg1 != 0, 80317c8a4effa2442b9d00fd421b443ea9645f8651c8Vinit Deshpande /* startBackgroundScanIfNeeded = */ true); 80327c8a4effa2442b9d00fd421b443ea9645f8651c8Vinit Deshpande break; 8033155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande default: 8034155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande ret = NOT_HANDLED; 8035155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 8036155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return ret; 8037155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 8038155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 8039155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande @Override 8040155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public void exit() { 8041155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* No need for a background scan upon exit from a disconnected state */ 8042155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mEnableBackgroundScan) { 8043cce5b9e0eded28096991578e020883484ece8c54Vinit Deshpande enableBackgroundScan(false); 8044155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 80458242cc81341c80ab5bc057ffdad99a3a1d95be5cvandwalle setScanAlarm(false); 8046155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 8047155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 8048155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 8049155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande class WpsRunningState extends State { 8050931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle // Tracks the source to provide a reply 8051155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private Message mSourceMessage; 8052155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande @Override 8053155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public void enter() { 8054155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mSourceMessage = Message.obtain(getCurrentMessage()); 8055155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 8056155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande @Override 8057155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public boolean processMessage(Message message) { 8058f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle logStateAndMessage(message, getClass().getSimpleName()); 8059f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 8060155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande switch (message.what) { 8061155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiMonitor.WPS_SUCCESS_EVENT: 8062155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Ignore intermediate success, wait for full connection 8063155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 8064155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiMonitor.NETWORK_CONNECTION_EVENT: 8065155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande replyToMessage(mSourceMessage, WifiManager.WPS_COMPLETED); 8066155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mSourceMessage.recycle(); 8067155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mSourceMessage = null; 8068155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande deferMessage(message); 8069155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande transitionTo(mDisconnectedState); 8070155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 8071155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiMonitor.WPS_OVERLAP_EVENT: 8072155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande replyToMessage(mSourceMessage, WifiManager.WPS_FAILED, 8073155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande WifiManager.WPS_OVERLAP_ERROR); 8074155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mSourceMessage.recycle(); 8075155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mSourceMessage = null; 8076155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande transitionTo(mDisconnectedState); 8077155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 8078155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiMonitor.WPS_FAIL_EVENT: 8079931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle // Arg1 has the reason for the failure 808082b91fd1a87ae9000bac54fb44981d5003958de1Vinit Deshpande if ((message.arg1 != WifiManager.ERROR) || (message.arg2 != 0)) { 808182b91fd1a87ae9000bac54fb44981d5003958de1Vinit Deshpande replyToMessage(mSourceMessage, WifiManager.WPS_FAILED, message.arg1); 808282b91fd1a87ae9000bac54fb44981d5003958de1Vinit Deshpande mSourceMessage.recycle(); 808382b91fd1a87ae9000bac54fb44981d5003958de1Vinit Deshpande mSourceMessage = null; 808482b91fd1a87ae9000bac54fb44981d5003958de1Vinit Deshpande transitionTo(mDisconnectedState); 808582b91fd1a87ae9000bac54fb44981d5003958de1Vinit Deshpande } else { 808682b91fd1a87ae9000bac54fb44981d5003958de1Vinit Deshpande if (DBG) log("Ignore unspecified fail event during WPS connection"); 808782b91fd1a87ae9000bac54fb44981d5003958de1Vinit Deshpande } 8088155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 8089155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiMonitor.WPS_TIMEOUT_EVENT: 8090155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande replyToMessage(mSourceMessage, WifiManager.WPS_FAILED, 8091155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande WifiManager.WPS_TIMED_OUT); 8092155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mSourceMessage.recycle(); 8093155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mSourceMessage = null; 8094155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande transitionTo(mDisconnectedState); 8095155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 8096155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiManager.START_WPS: 8097155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande replyToMessage(message, WifiManager.WPS_FAILED, WifiManager.IN_PROGRESS); 8098155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 8099155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiManager.CANCEL_WPS: 8100155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mWifiNative.cancelWps()) { 8101155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande replyToMessage(message, WifiManager.CANCEL_WPS_SUCCEDED); 8102155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 8103155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande replyToMessage(message, WifiManager.CANCEL_WPS_FAILED, WifiManager.ERROR); 8104155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 8105155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande transitionTo(mDisconnectedState); 8106155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 8107931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle /** 8108931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle * Defer all commands that can cause connections to a different network 8109155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * or put the state machine out of connect mode 8110155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 8111155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_STOP_DRIVER: 8112155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_SET_OPERATIONAL_MODE: 8113155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiManager.CONNECT_NETWORK: 8114155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_ENABLE_NETWORK: 8115155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_RECONNECT: 8116155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_REASSOCIATE: 8117155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande deferMessage(message); 8118155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 8119e65cebc4284fd320a155a274cb647f73cecabd11Navtej Singh Mann case CMD_AUTO_CONNECT: 8120b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle case CMD_AUTO_ROAM: 8121ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle messageHandlingStatus = MESSAGE_HANDLING_STATUS_DISCARD; 8122ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle return HANDLED; 8123b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle case CMD_START_SCAN: 8124ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle messageHandlingStatus = MESSAGE_HANDLING_STATUS_DISCARD; 8125b57df70bdf17ba45ef4d18b11414cb24dcbe1fb9vandwalle return HANDLED; 8126155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiMonitor.NETWORK_DISCONNECTION_EVENT: 8127155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (DBG) log("Network connection lost"); 8128155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande handleNetworkDisconnect(); 8129155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 8130155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiMonitor.ASSOCIATION_REJECTION_EVENT: 8131155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (DBG) log("Ignore Assoc reject event during WPS Connection"); 8132155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 8133155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiMonitor.AUTHENTICATION_FAILURE_EVENT: 8134155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Disregard auth failure events during WPS connection. The 8135155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // EAP sequence is retried several times, and there might be 8136155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // failures (especially for wps pin). We will get a WPS_XXX 8137155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // event at the end of the sequence anyway. 8138155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (DBG) log("Ignore auth failure during WPS connection"); 8139155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 8140155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiMonitor.SUPPLICANT_STATE_CHANGE_EVENT: 8141931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle // Throw away supplicant state changes when WPS is running. 8142931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle // We will start getting supplicant state changes once we get 8143931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle // a WPS success or failure 8144155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 8145155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande default: 8146155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return NOT_HANDLED; 8147155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 8148155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return HANDLED; 8149155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 8150155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 8151155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande @Override 8152155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public void exit() { 8153155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiConfigStore.enableAllNetworks(); 8154155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiConfigStore.loadConfiguredNetworks(); 8155155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 8156155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 8157155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 8158155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande class SoftApStartingState extends State { 8159155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande @Override 8160155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public void enter() { 8161155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande final Message message = getCurrentMessage(); 8162155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (message.what == CMD_START_AP) { 8163155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande final WifiConfiguration config = (WifiConfiguration) message.obj; 8164155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 8165155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (config == null) { 8166155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiApConfigChannel.sendMessage(CMD_REQUEST_AP_CONFIG); 8167155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 8168155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mWifiApConfigChannel.sendMessage(CMD_SET_AP_CONFIG, config); 8169155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande startSoftApWithConfig(config); 8170155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 8171155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 8172155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande throw new RuntimeException("Illegal transition to SoftApStartingState: " + message); 8173155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 8174155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 8175155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande @Override 8176155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public boolean processMessage(Message message) { 8177f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle logStateAndMessage(message, getClass().getSimpleName()); 8178f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 8179155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande switch(message.what) { 8180155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_START_SUPPLICANT: 8181155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_STOP_SUPPLICANT: 8182155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_START_AP: 8183155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_STOP_AP: 8184155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_START_DRIVER: 8185155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_STOP_DRIVER: 8186155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_SET_OPERATIONAL_MODE: 8187155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_SET_COUNTRY_CODE: 8188155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_SET_FREQUENCY_BAND: 8189155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_START_PACKET_FILTERING: 8190155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_STOP_PACKET_FILTERING: 8191155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_TETHER_STATE_CHANGE: 8192155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande deferMessage(message); 8193155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 8194155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case WifiStateMachine.CMD_RESPONSE_AP_CONFIG: 8195155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande WifiConfiguration config = (WifiConfiguration) message.obj; 8196155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (config != null) { 8197155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande startSoftApWithConfig(config); 8198155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 8199155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("Softap config is null!"); 8200155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendMessage(CMD_START_AP_FAILURE); 8201155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 8202155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 8203155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_START_AP_SUCCESS: 8204155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande setWifiApState(WIFI_AP_STATE_ENABLED); 8205155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande transitionTo(mSoftApStartedState); 8206155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 8207155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_START_AP_FAILURE: 8208155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande setWifiApState(WIFI_AP_STATE_FAILED); 8209155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande transitionTo(mInitialState); 8210155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 8211155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande default: 8212155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return NOT_HANDLED; 8213155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 8214155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return HANDLED; 8215155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 8216155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 8217155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 8218155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande class SoftApStartedState extends State { 8219155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande @Override 8220155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public boolean processMessage(Message message) { 8221f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle logStateAndMessage(message, getClass().getSimpleName()); 8222f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 8223155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande switch(message.what) { 8224155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_STOP_AP: 8225155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (DBG) log("Stopping Soft AP"); 8226155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* We have not tethered at this point, so we just shutdown soft Ap */ 8227155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande try { 8228155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mNwService.stopAccessPoint(mInterfaceName); 8229155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } catch(Exception e) { 8230155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("Exception in stopAccessPoint()"); 8231155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 8232155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande setWifiApState(WIFI_AP_STATE_DISABLED); 8233155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande transitionTo(mInitialState); 8234155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 8235155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_START_AP: 8236155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Ignore a start on a running access point 8237155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 8238931338d1533d1bd11ba0e5aebb4e4b7b2c8ab056vandwalle // Fail client mode operation when soft AP is enabled 8239155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_START_SUPPLICANT: 8240155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("Cannot start supplicant with a running soft AP"); 8241155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande setWifiState(WIFI_STATE_UNKNOWN); 8242155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 8243155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_TETHER_STATE_CHANGE: 8244155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande TetherStateChange stateChange = (TetherStateChange) message.obj; 8245155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (startTethering(stateChange.available)) { 8246155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande transitionTo(mTetheringState); 8247155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 8248155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 8249155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande default: 8250155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return NOT_HANDLED; 8251155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 8252155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return HANDLED; 8253155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 8254155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 8255155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 8256155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande class TetheringState extends State { 8257155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande @Override 8258155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public void enter() { 8259155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Send ourselves a delayed message to shut down if tethering fails to notify */ 8260155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendMessageDelayed(obtainMessage(CMD_TETHER_NOTIFICATION_TIMED_OUT, 8261155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande ++mTetherToken, 0), TETHER_NOTIFICATION_TIME_OUT_MSECS); 8262155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 8263155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande @Override 8264155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public boolean processMessage(Message message) { 8265f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle logStateAndMessage(message, getClass().getSimpleName()); 8266f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 8267155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande switch(message.what) { 8268155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_TETHER_STATE_CHANGE: 8269155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande TetherStateChange stateChange = (TetherStateChange) message.obj; 8270155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (isWifiTethered(stateChange.active)) { 8271155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande transitionTo(mTetheredState); 8272155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 8273155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return HANDLED; 8274155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_TETHER_NOTIFICATION_TIMED_OUT: 8275155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (message.arg1 == mTetherToken) { 8276155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("Failed to get tether update, shutdown soft access point"); 8277155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande transitionTo(mSoftApStartedState); 8278155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Needs to be first thing handled 8279155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendMessageAtFrontOfQueue(CMD_STOP_AP); 8280155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 8281155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 8282155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_START_SUPPLICANT: 8283155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_STOP_SUPPLICANT: 8284155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_START_AP: 8285155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_STOP_AP: 8286155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_START_DRIVER: 8287155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_STOP_DRIVER: 8288155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_SET_OPERATIONAL_MODE: 8289155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_SET_COUNTRY_CODE: 8290155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_SET_FREQUENCY_BAND: 8291155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_START_PACKET_FILTERING: 8292155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_STOP_PACKET_FILTERING: 8293155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande deferMessage(message); 8294155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 8295155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande default: 8296155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return NOT_HANDLED; 8297155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 8298155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return HANDLED; 8299155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 8300155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 8301155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 8302155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande class TetheredState extends State { 8303155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande @Override 8304155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public boolean processMessage(Message message) { 8305f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle logStateAndMessage(message, getClass().getSimpleName()); 8306f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 8307155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande switch(message.what) { 8308155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_TETHER_STATE_CHANGE: 8309155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande TetherStateChange stateChange = (TetherStateChange) message.obj; 8310155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (!isWifiTethered(stateChange.active)) { 8311155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("Tethering reports wifi as untethered!, shut down soft Ap"); 8312155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande setHostApRunning(null, false); 8313155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande setHostApRunning(null, true); 8314155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 8315155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return HANDLED; 8316155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_STOP_AP: 8317155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (DBG) log("Untethering before stopping AP"); 8318155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande setWifiApState(WIFI_AP_STATE_DISABLING); 8319155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande stopTethering(); 8320155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande transitionTo(mUntetheringState); 8321155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // More work to do after untethering 8322155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande deferMessage(message); 8323155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 8324155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande default: 8325155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return NOT_HANDLED; 8326155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 8327155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return HANDLED; 8328155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 8329155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 8330155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 8331155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande class UntetheringState extends State { 8332155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande @Override 8333155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public void enter() { 8334155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Send ourselves a delayed message to shut down if tethering fails to notify */ 8335155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendMessageDelayed(obtainMessage(CMD_TETHER_NOTIFICATION_TIMED_OUT, 8336155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande ++mTetherToken, 0), TETHER_NOTIFICATION_TIME_OUT_MSECS); 8337155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 8338155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 8339155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande @Override 8340155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public boolean processMessage(Message message) { 8341f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle logStateAndMessage(message, getClass().getSimpleName()); 8342f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle 8343155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande switch(message.what) { 8344155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_TETHER_STATE_CHANGE: 8345155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande TetherStateChange stateChange = (TetherStateChange) message.obj; 8346155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 8347155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Wait till wifi is untethered */ 8348155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (isWifiTethered(stateChange.active)) break; 8349155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 8350155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande transitionTo(mSoftApStartedState); 8351155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 8352155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_TETHER_NOTIFICATION_TIMED_OUT: 8353155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (message.arg1 == mTetherToken) { 8354155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande loge("Failed to get tether update, force stop access point"); 8355155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande transitionTo(mSoftApStartedState); 8356155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 8357155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 8358155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_START_SUPPLICANT: 8359155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_STOP_SUPPLICANT: 8360155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_START_AP: 8361155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_STOP_AP: 8362155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_START_DRIVER: 8363155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_STOP_DRIVER: 8364155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_SET_OPERATIONAL_MODE: 8365155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_SET_COUNTRY_CODE: 8366155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_SET_FREQUENCY_BAND: 8367155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_START_PACKET_FILTERING: 8368155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case CMD_STOP_PACKET_FILTERING: 8369155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande deferMessage(message); 8370155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 8371155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande default: 8372155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return NOT_HANDLED; 8373155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 8374155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return HANDLED; 8375155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 8376155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 8377155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 83780a0694d89195ac361a02bf73d5bf35b1e9050c6cChelsea Derrick //State machine initiated requests can have replyTo set to null indicating 83790a0694d89195ac361a02bf73d5bf35b1e9050c6cChelsea Derrick //there are no recepients, we ignore those reply actions 8380155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private void replyToMessage(Message msg, int what) { 8381155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (msg.replyTo == null) return; 83820a0694d89195ac361a02bf73d5bf35b1e9050c6cChelsea Derrick Message dstMsg = obtainMessageWithArg2(msg); 83830a0694d89195ac361a02bf73d5bf35b1e9050c6cChelsea Derrick dstMsg.what = what; 8384155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mReplyChannel.replyToMessage(msg, dstMsg); 8385155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 8386155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 8387155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private void replyToMessage(Message msg, int what, int arg1) { 8388155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (msg.replyTo == null) return; 83890a0694d89195ac361a02bf73d5bf35b1e9050c6cChelsea Derrick Message dstMsg = obtainMessageWithArg2(msg); 83900a0694d89195ac361a02bf73d5bf35b1e9050c6cChelsea Derrick dstMsg.what = what; 8391155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande dstMsg.arg1 = arg1; 8392155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mReplyChannel.replyToMessage(msg, dstMsg); 8393155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 8394155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 8395155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private void replyToMessage(Message msg, int what, Object obj) { 8396155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (msg.replyTo == null) return; 83970a0694d89195ac361a02bf73d5bf35b1e9050c6cChelsea Derrick Message dstMsg = obtainMessageWithArg2(msg); 83980a0694d89195ac361a02bf73d5bf35b1e9050c6cChelsea Derrick dstMsg.what = what; 8399155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande dstMsg.obj = obj; 8400155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mReplyChannel.replyToMessage(msg, dstMsg); 8401155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 8402155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 8403155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 8404155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * arg2 on the source message has a unique id that needs to be retained in replies 8405155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * to match the request 84060a0694d89195ac361a02bf73d5bf35b1e9050c6cChelsea Derrick 84070a0694d89195ac361a02bf73d5bf35b1e9050c6cChelsea Derrick * see WifiManager for details 8408155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 84090a0694d89195ac361a02bf73d5bf35b1e9050c6cChelsea Derrick private Message obtainMessageWithArg2(Message srcMsg) { 8410155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Message msg = Message.obtain(); 8411155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande msg.arg2 = srcMsg.arg2; 8412155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande return msg; 8413155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 841433b575ca6bee66183929f9474b5a161432918604Vinit Deshpande 841533b575ca6bee66183929f9474b5a161432918604Vinit Deshpande private static int parseHex(char ch) { 841633b575ca6bee66183929f9474b5a161432918604Vinit Deshpande if ('0' <= ch && ch <= '9') { 841733b575ca6bee66183929f9474b5a161432918604Vinit Deshpande return ch - '0'; 841833b575ca6bee66183929f9474b5a161432918604Vinit Deshpande } else if ('a' <= ch && ch <= 'f') { 841933b575ca6bee66183929f9474b5a161432918604Vinit Deshpande return ch - 'a' + 10; 842033b575ca6bee66183929f9474b5a161432918604Vinit Deshpande } else if ('A' <= ch && ch <= 'F') { 842133b575ca6bee66183929f9474b5a161432918604Vinit Deshpande return ch - 'A' + 10; 842233b575ca6bee66183929f9474b5a161432918604Vinit Deshpande } else { 842333b575ca6bee66183929f9474b5a161432918604Vinit Deshpande throw new NumberFormatException("" + ch + " is not a valid hex digit"); 842433b575ca6bee66183929f9474b5a161432918604Vinit Deshpande } 842533b575ca6bee66183929f9474b5a161432918604Vinit Deshpande } 842633b575ca6bee66183929f9474b5a161432918604Vinit Deshpande 842733b575ca6bee66183929f9474b5a161432918604Vinit Deshpande private byte[] parseHex(String hex) { 842833b575ca6bee66183929f9474b5a161432918604Vinit Deshpande /* This only works for good input; don't throw bad data at it */ 842933b575ca6bee66183929f9474b5a161432918604Vinit Deshpande if (hex == null) { 843033b575ca6bee66183929f9474b5a161432918604Vinit Deshpande return new byte[0]; 843133b575ca6bee66183929f9474b5a161432918604Vinit Deshpande } 843233b575ca6bee66183929f9474b5a161432918604Vinit Deshpande 843333b575ca6bee66183929f9474b5a161432918604Vinit Deshpande if (hex.length() % 2 != 0) { 843433b575ca6bee66183929f9474b5a161432918604Vinit Deshpande throw new NumberFormatException(hex + " is not a valid hex string"); 843533b575ca6bee66183929f9474b5a161432918604Vinit Deshpande } 843633b575ca6bee66183929f9474b5a161432918604Vinit Deshpande 8437dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande byte[] result = new byte[(hex.length())/2 + 1]; 8438dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande result[0] = (byte) ((hex.length())/2); 8439dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande for (int i = 0, j = 1; i < hex.length(); i += 2, j++) { 844033b575ca6bee66183929f9474b5a161432918604Vinit Deshpande int val = parseHex(hex.charAt(i)) * 16 + parseHex(hex.charAt(i+1)); 844133b575ca6bee66183929f9474b5a161432918604Vinit Deshpande byte b = (byte) (val & 0xFF); 844233b575ca6bee66183929f9474b5a161432918604Vinit Deshpande result[j] = b; 844333b575ca6bee66183929f9474b5a161432918604Vinit Deshpande } 844433b575ca6bee66183929f9474b5a161432918604Vinit Deshpande 844533b575ca6bee66183929f9474b5a161432918604Vinit Deshpande return result; 844633b575ca6bee66183929f9474b5a161432918604Vinit Deshpande } 844733b575ca6bee66183929f9474b5a161432918604Vinit Deshpande 844833b575ca6bee66183929f9474b5a161432918604Vinit Deshpande private static String makeHex(byte[] bytes) { 844933b575ca6bee66183929f9474b5a161432918604Vinit Deshpande StringBuilder sb = new StringBuilder(); 845033b575ca6bee66183929f9474b5a161432918604Vinit Deshpande for (byte b : bytes) { 845133b575ca6bee66183929f9474b5a161432918604Vinit Deshpande sb.append(String.format("%02x", b)); 845233b575ca6bee66183929f9474b5a161432918604Vinit Deshpande } 845333b575ca6bee66183929f9474b5a161432918604Vinit Deshpande return sb.toString(); 845433b575ca6bee66183929f9474b5a161432918604Vinit Deshpande } 845533b575ca6bee66183929f9474b5a161432918604Vinit Deshpande 8456dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande private static String makeHex(byte[] bytes, int from, int len) { 8457dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande StringBuilder sb = new StringBuilder(); 8458dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande for (int i = 0; i < len; i++) { 8459dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande sb.append(String.format("%02x", bytes[from+i])); 8460dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande } 8461dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande return sb.toString(); 8462dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande } 8463dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande 8464dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande 846533b575ca6bee66183929f9474b5a161432918604Vinit Deshpande private static byte[] concat(byte[] array1, byte[] array2, byte[] array3) { 846633b575ca6bee66183929f9474b5a161432918604Vinit Deshpande 846733b575ca6bee66183929f9474b5a161432918604Vinit Deshpande int len = array1.length + array2.length + array3.length; 846833b575ca6bee66183929f9474b5a161432918604Vinit Deshpande 846933b575ca6bee66183929f9474b5a161432918604Vinit Deshpande if (array1.length != 0) { 847033b575ca6bee66183929f9474b5a161432918604Vinit Deshpande len++; /* add another byte for size */ 847133b575ca6bee66183929f9474b5a161432918604Vinit Deshpande } 847233b575ca6bee66183929f9474b5a161432918604Vinit Deshpande 847333b575ca6bee66183929f9474b5a161432918604Vinit Deshpande if (array2.length != 0) { 847433b575ca6bee66183929f9474b5a161432918604Vinit Deshpande len++; /* add another byte for size */ 847533b575ca6bee66183929f9474b5a161432918604Vinit Deshpande } 847633b575ca6bee66183929f9474b5a161432918604Vinit Deshpande 847733b575ca6bee66183929f9474b5a161432918604Vinit Deshpande if (array3.length != 0) { 847833b575ca6bee66183929f9474b5a161432918604Vinit Deshpande len++; /* add another byte for size */ 847933b575ca6bee66183929f9474b5a161432918604Vinit Deshpande } 848033b575ca6bee66183929f9474b5a161432918604Vinit Deshpande 848133b575ca6bee66183929f9474b5a161432918604Vinit Deshpande byte[] result = new byte[len]; 848233b575ca6bee66183929f9474b5a161432918604Vinit Deshpande 848333b575ca6bee66183929f9474b5a161432918604Vinit Deshpande int index = 0; 848433b575ca6bee66183929f9474b5a161432918604Vinit Deshpande if (array1.length != 0) { 848533b575ca6bee66183929f9474b5a161432918604Vinit Deshpande result[index] = (byte) (array1.length & 0xFF); 848633b575ca6bee66183929f9474b5a161432918604Vinit Deshpande index++; 848733b575ca6bee66183929f9474b5a161432918604Vinit Deshpande for (byte b : array1) { 848833b575ca6bee66183929f9474b5a161432918604Vinit Deshpande result[index] = b; 848933b575ca6bee66183929f9474b5a161432918604Vinit Deshpande index++; 849033b575ca6bee66183929f9474b5a161432918604Vinit Deshpande } 849133b575ca6bee66183929f9474b5a161432918604Vinit Deshpande } 849233b575ca6bee66183929f9474b5a161432918604Vinit Deshpande 849333b575ca6bee66183929f9474b5a161432918604Vinit Deshpande if (array2.length != 0) { 849433b575ca6bee66183929f9474b5a161432918604Vinit Deshpande result[index] = (byte) (array2.length & 0xFF); 849533b575ca6bee66183929f9474b5a161432918604Vinit Deshpande index++; 849633b575ca6bee66183929f9474b5a161432918604Vinit Deshpande for (byte b : array2) { 849733b575ca6bee66183929f9474b5a161432918604Vinit Deshpande result[index] = b; 849833b575ca6bee66183929f9474b5a161432918604Vinit Deshpande index++; 849933b575ca6bee66183929f9474b5a161432918604Vinit Deshpande } 850033b575ca6bee66183929f9474b5a161432918604Vinit Deshpande } 850133b575ca6bee66183929f9474b5a161432918604Vinit Deshpande 850233b575ca6bee66183929f9474b5a161432918604Vinit Deshpande if (array3.length != 0) { 850333b575ca6bee66183929f9474b5a161432918604Vinit Deshpande result[index] = (byte) (array3.length & 0xFF); 850433b575ca6bee66183929f9474b5a161432918604Vinit Deshpande index++; 850533b575ca6bee66183929f9474b5a161432918604Vinit Deshpande for (byte b : array3) { 850633b575ca6bee66183929f9474b5a161432918604Vinit Deshpande result[index] = b; 850733b575ca6bee66183929f9474b5a161432918604Vinit Deshpande index++; 850833b575ca6bee66183929f9474b5a161432918604Vinit Deshpande } 850933b575ca6bee66183929f9474b5a161432918604Vinit Deshpande } 851033b575ca6bee66183929f9474b5a161432918604Vinit Deshpande return result; 851133b575ca6bee66183929f9474b5a161432918604Vinit Deshpande } 851233b575ca6bee66183929f9474b5a161432918604Vinit Deshpande 8513dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande void handleGsmAuthRequest(SimAuthRequestData requestData) { 851433b575ca6bee66183929f9474b5a161432918604Vinit Deshpande if (targetWificonfiguration == null 851533b575ca6bee66183929f9474b5a161432918604Vinit Deshpande || targetWificonfiguration.networkId == requestData.networkId) { 851633b575ca6bee66183929f9474b5a161432918604Vinit Deshpande logd("id matches targetWifiConfiguration"); 851733b575ca6bee66183929f9474b5a161432918604Vinit Deshpande } else { 851833b575ca6bee66183929f9474b5a161432918604Vinit Deshpande logd("id does not match targetWifiConfiguration"); 851933b575ca6bee66183929f9474b5a161432918604Vinit Deshpande return; 852033b575ca6bee66183929f9474b5a161432918604Vinit Deshpande } 852133b575ca6bee66183929f9474b5a161432918604Vinit Deshpande 852233b575ca6bee66183929f9474b5a161432918604Vinit Deshpande TelephonyManager tm = (TelephonyManager) 852333b575ca6bee66183929f9474b5a161432918604Vinit Deshpande mContext.getSystemService(Context.TELEPHONY_SERVICE); 852433b575ca6bee66183929f9474b5a161432918604Vinit Deshpande 852533b575ca6bee66183929f9474b5a161432918604Vinit Deshpande if (tm != null) { 8526dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande StringBuilder sb = new StringBuilder(); 8527dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande for (String challenge : requestData.challenges) { 852833b575ca6bee66183929f9474b5a161432918604Vinit Deshpande 8529dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande logd("RAND = " + challenge); 853033b575ca6bee66183929f9474b5a161432918604Vinit Deshpande 8531dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande byte[] rand = null; 8532dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande try { 8533dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande rand = parseHex(challenge); 8534dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande } catch (NumberFormatException e) { 8535dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande loge("malformed challenge"); 8536dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande continue; 8537dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande } 8538dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande 8539dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande String base64Challenge = android.util.Base64.encodeToString( 8540dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande rand, android.util.Base64.NO_WRAP); 8541dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande /* 8542dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande * appType = 1 => SIM, 2 => USIM according to 8543dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande * com.android.internal.telephony.PhoneConstants#APPTYPE_xxx 8544dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande */ 8545dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande int appType = 2; 8546dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande String tmResponse = tm.getIccSimChallengeResponse(appType, base64Challenge); 8547dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande logv("Raw Response - " + tmResponse); 8548dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande 8549dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande if (tmResponse != null && tmResponse.length() > 4) { 85508c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle byte[] result = android.util.Base64.decode(tmResponse, 85518c0a54e9b0d3713cab52d06ad8fd7f3a1b6f73a8vandwalle android.util.Base64.DEFAULT); 8552dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande logv("Hex Response -" + makeHex(result)); 8553dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande int sres_len = result[0]; 8554dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande String sres = makeHex(result, 1, sres_len); 8555dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande int kc_offset = 1+sres_len; 8556dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande int kc_len = result[kc_offset]; 8557dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande String kc = makeHex(result, 1+kc_offset, kc_len); 8558dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande sb.append(":" + kc + ":" + sres); 8559dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande logv("kc:" + kc + " sres:" + sres); 8560dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande } else { 8561dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande loge("bad response - " + tmResponse); 8562dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande } 856333b575ca6bee66183929f9474b5a161432918604Vinit Deshpande } 856433b575ca6bee66183929f9474b5a161432918604Vinit Deshpande 8565dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande String response = sb.toString(); 8566dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande logv("Supplicant Response -" + response); 8567dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande mWifiNative.simAuthResponse(requestData.networkId, response); 856833b575ca6bee66183929f9474b5a161432918604Vinit Deshpande } else { 856933b575ca6bee66183929f9474b5a161432918604Vinit Deshpande loge("could not get telephony manager"); 857033b575ca6bee66183929f9474b5a161432918604Vinit Deshpande } 8571dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande } 8572dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande 8573dbd6933aae99302b75683f8463cd17df554dc599Vinit Deshpande void handle3GAuthRequest(SimAuthRequestData requestData) { 857433b575ca6bee66183929f9474b5a161432918604Vinit Deshpande 857533b575ca6bee66183929f9474b5a161432918604Vinit Deshpande } 8576155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 8577