19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.net.wifi; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.NetworkInfo.DetailedState; 22124b44d89bc00b150c9478ccddfa83cac0f1df24Robert Greenwaltimport android.net.NetworkUtils; 23b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriffimport android.text.TextUtils; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25124b44d89bc00b150c9478ccddfa83cac0f1df24Robert Greenwaltimport java.net.InetAddress; 264717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwaltimport java.net.Inet4Address; 27124b44d89bc00b150c9478ccddfa83cac0f1df24Robert Greenwaltimport java.net.UnknownHostException; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.EnumMap; 29ee00b353a4070a9ddbdf67fa715dc84e7282f7c2Elliott Hughesimport java.util.Locale; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Describes the state of any Wifi connection that is active or 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is in the process of being set up. 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class WifiInfo implements Parcelable { 36b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff private static final String TAG = "WifiInfo"; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is the map described in the Javadoc comment above. The positions 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of the elements of the array must correspond to the ordinal values 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of <code>DetailedState</code>. 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final EnumMap<SupplicantState, DetailedState> stateMap = 432ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle new EnumMap<SupplicantState, DetailedState>(SupplicantState.class); 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 45408abf7f1bec3253675d0225300d7ee39481d286Svet Ganov /** 46408abf7f1bec3253675d0225300d7ee39481d286Svet Ganov * Default MAC address reported to a client that does not have the 47408abf7f1bec3253675d0225300d7ee39481d286Svet Ganov * android.permission.LOCAL_MAC_ADDRESS permission. 48408abf7f1bec3253675d0225300d7ee39481d286Svet Ganov * 49408abf7f1bec3253675d0225300d7ee39481d286Svet Ganov * @hide 50408abf7f1bec3253675d0225300d7ee39481d286Svet Ganov */ 51408abf7f1bec3253675d0225300d7ee39481d286Svet Ganov public static final String DEFAULT_MAC_ADDRESS = "02:00:00:00:00:00"; 52408abf7f1bec3253675d0225300d7ee39481d286Svet Ganov 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static { 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stateMap.put(SupplicantState.DISCONNECTED, DetailedState.DISCONNECTED); 55319da8c4c59be36fe2e221a0aba230ef6b77a14fIrfan Sheriff stateMap.put(SupplicantState.INTERFACE_DISABLED, DetailedState.DISCONNECTED); 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stateMap.put(SupplicantState.INACTIVE, DetailedState.IDLE); 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stateMap.put(SupplicantState.SCANNING, DetailedState.SCANNING); 58319da8c4c59be36fe2e221a0aba230ef6b77a14fIrfan Sheriff stateMap.put(SupplicantState.AUTHENTICATING, DetailedState.CONNECTING); 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stateMap.put(SupplicantState.ASSOCIATING, DetailedState.CONNECTING); 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stateMap.put(SupplicantState.ASSOCIATED, DetailedState.CONNECTING); 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stateMap.put(SupplicantState.FOUR_WAY_HANDSHAKE, DetailedState.AUTHENTICATING); 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stateMap.put(SupplicantState.GROUP_HANDSHAKE, DetailedState.AUTHENTICATING); 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stateMap.put(SupplicantState.COMPLETED, DetailedState.OBTAINING_IPADDR); 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stateMap.put(SupplicantState.DORMANT, DetailedState.DISCONNECTED); 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stateMap.put(SupplicantState.UNINITIALIZED, DetailedState.IDLE); 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stateMap.put(SupplicantState.INVALID, DetailedState.FAILED); 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private SupplicantState mSupplicantState; 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String mBSSID; 71b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff private WifiSsid mWifiSsid; 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mNetworkId; 73111fa0274d1d6620f9634783585387f3b773949evandwalle 74111fa0274d1d6620f9634783585387f3b773949evandwalle /** @hide **/ 75111fa0274d1d6620f9634783585387f3b773949evandwalle public static final int INVALID_RSSI = -127; 76111fa0274d1d6620f9634783585387f3b773949evandwalle 77111fa0274d1d6620f9634783585387f3b773949evandwalle /** @hide **/ 78111fa0274d1d6620f9634783585387f3b773949evandwalle public static final int MIN_RSSI = -126; 79111fa0274d1d6620f9634783585387f3b773949evandwalle 80111fa0274d1d6620f9634783585387f3b773949evandwalle /** @hide **/ 81111fa0274d1d6620f9634783585387f3b773949evandwalle public static final int MAX_RSSI = 200; 82111fa0274d1d6620f9634783585387f3b773949evandwalle 83111fa0274d1d6620f9634783585387f3b773949evandwalle 842ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle /** 852ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle * Received Signal Strength Indicator 862ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle */ 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mRssi; 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 892ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle /** 902ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle * Link speed in Mbps 912ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle */ 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String LINK_SPEED_UNITS = "Mbps"; 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mLinkSpeed; 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 952ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle /** 962ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle * Frequency in MHz 972ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle */ 9870a415e7fe56ecf0b2591d540913f70ed211d66dFelipe Leme public static final String FREQUENCY_UNITS = "MHz"; 9970a415e7fe56ecf0b2591d540913f70ed211d66dFelipe Leme private int mFrequency; 10070a415e7fe56ecf0b2591d540913f70ed211d66dFelipe Leme 101124b44d89bc00b150c9478ccddfa83cac0f1df24Robert Greenwalt private InetAddress mIpAddress; 102408abf7f1bec3253675d0225300d7ee39481d286Svet Ganov private String mMacAddress = DEFAULT_MAC_ADDRESS; 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 104c7a38ef8405443648688a7950378ac4e4ebb3ae5Shirish Kalele private boolean mEphemeral; 105c7a38ef8405443648688a7950378ac4e4ebb3ae5Shirish Kalele 1069f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey /** 1072ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle * @hide 1082ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle */ 1092ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle public long txBad; 1102ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle /** 1112ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle * @hide 1122ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle */ 1132ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle public long txRetries; 1142ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle /** 1152ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle * @hide 1162ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle */ 1172ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle public long txSuccess; 1182ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle /** 1192ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle * @hide 1202ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle */ 1212ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle public long rxSuccess; 1222ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle /** 1232ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle * @hide 1242ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle */ 1252ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle public double txBadRate; 1262ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle /** 1272ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle * @hide 1282ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle */ 1292ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle public double txRetriesRate; 1302ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle /** 1312ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle * @hide 1322ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle */ 1332ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle public double txSuccessRate; 1342ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle /** 1352ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle * @hide 1362ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle */ 1372ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle public double rxSuccessRate; 1382ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle 1392ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle /** 1402ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle * @hide 1412ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle */ 1422ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle public int badRssiCount; 1432ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle 1442ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle /** 1452ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle * @hide 1462ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle */ 147d524c78d9358e2fa1e67124468cffa5284870c62vandwalle public int linkStuckCount; 148d524c78d9358e2fa1e67124468cffa5284870c62vandwalle 149d524c78d9358e2fa1e67124468cffa5284870c62vandwalle /** 150d524c78d9358e2fa1e67124468cffa5284870c62vandwalle * @hide 151d524c78d9358e2fa1e67124468cffa5284870c62vandwalle */ 1522ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle public int lowRssiCount; 1532ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle 1542ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle /** 15572d87d99b02c6523a4a3cb83e0d5cf6c8e01075fvandwalle * @hide 1562ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle */ 1572ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle public int score; 1582ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle 1592ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle /** 160111fa0274d1d6620f9634783585387f3b773949evandwalle * TODO: get actual timestamp and calculate true rates 161111fa0274d1d6620f9634783585387f3b773949evandwalle * @hide 1622ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle */ 1632ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle public void updatePacketRates(WifiLinkLayerStats stats) { 1642ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle if (stats != null) { 1652ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle long txgood = stats.txmpdu_be + stats.txmpdu_bk + stats.txmpdu_vi + stats.txmpdu_vo; 1662ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle long txretries = stats.retries_be + stats.retries_bk 1672ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle + stats.retries_vi + stats.retries_vo; 1682ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle long rxgood = stats.rxmpdu_be + stats.rxmpdu_bk + stats.rxmpdu_vi + stats.rxmpdu_vo; 1692ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle long txbad = stats.lostmpdu_be + stats.lostmpdu_bk 1702ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle + stats.lostmpdu_vi + stats.lostmpdu_vo; 1712ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle 172d258d7a86e3e2f8e0d2d573c27a2b3c6a7975df1Pierre Vandwalle if (txBad <= txbad 173d258d7a86e3e2f8e0d2d573c27a2b3c6a7975df1Pierre Vandwalle && txSuccess <= txgood 174d258d7a86e3e2f8e0d2d573c27a2b3c6a7975df1Pierre Vandwalle && rxSuccess <= rxgood 175d258d7a86e3e2f8e0d2d573c27a2b3c6a7975df1Pierre Vandwalle && txRetries <= txretries) { 176d258d7a86e3e2f8e0d2d573c27a2b3c6a7975df1Pierre Vandwalle txBadRate = (txBadRate * 0.5) 177d258d7a86e3e2f8e0d2d573c27a2b3c6a7975df1Pierre Vandwalle + ((double) (txbad - txBad) * 0.5); 178d258d7a86e3e2f8e0d2d573c27a2b3c6a7975df1Pierre Vandwalle txSuccessRate = (txSuccessRate * 0.5) 179d258d7a86e3e2f8e0d2d573c27a2b3c6a7975df1Pierre Vandwalle + ((double) (txgood - txSuccess) * 0.5); 180d258d7a86e3e2f8e0d2d573c27a2b3c6a7975df1Pierre Vandwalle rxSuccessRate = (rxSuccessRate * 0.5) 181d258d7a86e3e2f8e0d2d573c27a2b3c6a7975df1Pierre Vandwalle + ((double) (rxgood - rxSuccess) * 0.5); 182d258d7a86e3e2f8e0d2d573c27a2b3c6a7975df1Pierre Vandwalle txRetriesRate = (txRetriesRate * 0.5) 183d258d7a86e3e2f8e0d2d573c27a2b3c6a7975df1Pierre Vandwalle + ((double) (txretries - txRetries) * 0.5); 184d258d7a86e3e2f8e0d2d573c27a2b3c6a7975df1Pierre Vandwalle } else { 185d258d7a86e3e2f8e0d2d573c27a2b3c6a7975df1Pierre Vandwalle txBadRate = 0; 186d258d7a86e3e2f8e0d2d573c27a2b3c6a7975df1Pierre Vandwalle txSuccessRate = 0; 187d258d7a86e3e2f8e0d2d573c27a2b3c6a7975df1Pierre Vandwalle rxSuccessRate = 0; 188d258d7a86e3e2f8e0d2d573c27a2b3c6a7975df1Pierre Vandwalle txRetriesRate = 0; 189d258d7a86e3e2f8e0d2d573c27a2b3c6a7975df1Pierre Vandwalle } 1902ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle txBad = txbad; 1912ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle txSuccess = txgood; 1922ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle rxSuccess = rxgood; 1932ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle txRetries = txretries; 1942ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle } else { 195111fa0274d1d6620f9634783585387f3b773949evandwalle txBad = 0; 1962ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle txSuccess = 0; 1972ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle rxSuccess = 0; 1982ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle txRetries = 0; 199111fa0274d1d6620f9634783585387f3b773949evandwalle txBadRate = 0; 200111fa0274d1d6620f9634783585387f3b773949evandwalle txSuccessRate = 0; 201111fa0274d1d6620f9634783585387f3b773949evandwalle rxSuccessRate = 0; 202111fa0274d1d6620f9634783585387f3b773949evandwalle txRetriesRate = 0; 2032ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle } 2042ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle } 2052ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle 206111fa0274d1d6620f9634783585387f3b773949evandwalle 2072ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle /** 208111fa0274d1d6620f9634783585387f3b773949evandwalle * This function is less powerful and used if the WifiLinkLayerStats API is not implemented 209111fa0274d1d6620f9634783585387f3b773949evandwalle * at the Wifi HAL 210111fa0274d1d6620f9634783585387f3b773949evandwalle * @hide 2119f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey */ 212111fa0274d1d6620f9634783585387f3b773949evandwalle public void updatePacketRates(long txPackets, long rxPackets) { 213111fa0274d1d6620f9634783585387f3b773949evandwalle //paranoia 214111fa0274d1d6620f9634783585387f3b773949evandwalle txBad = 0; 215111fa0274d1d6620f9634783585387f3b773949evandwalle txRetries = 0; 216111fa0274d1d6620f9634783585387f3b773949evandwalle txBadRate = 0; 217111fa0274d1d6620f9634783585387f3b773949evandwalle txRetriesRate = 0; 218d258d7a86e3e2f8e0d2d573c27a2b3c6a7975df1Pierre Vandwalle if (txSuccess <= txPackets && rxSuccess <= rxPackets) { 219d258d7a86e3e2f8e0d2d573c27a2b3c6a7975df1Pierre Vandwalle txSuccessRate = (txSuccessRate * 0.5) 220d258d7a86e3e2f8e0d2d573c27a2b3c6a7975df1Pierre Vandwalle + ((double) (txPackets - txSuccess) * 0.5); 221d258d7a86e3e2f8e0d2d573c27a2b3c6a7975df1Pierre Vandwalle rxSuccessRate = (rxSuccessRate * 0.5) 222d258d7a86e3e2f8e0d2d573c27a2b3c6a7975df1Pierre Vandwalle + ((double) (rxPackets - rxSuccess) * 0.5); 223d258d7a86e3e2f8e0d2d573c27a2b3c6a7975df1Pierre Vandwalle } else { 224d258d7a86e3e2f8e0d2d573c27a2b3c6a7975df1Pierre Vandwalle txBadRate = 0; 225d258d7a86e3e2f8e0d2d573c27a2b3c6a7975df1Pierre Vandwalle txRetriesRate = 0; 226d258d7a86e3e2f8e0d2d573c27a2b3c6a7975df1Pierre Vandwalle } 227111fa0274d1d6620f9634783585387f3b773949evandwalle txSuccess = txPackets; 228111fa0274d1d6620f9634783585387f3b773949evandwalle rxSuccess = rxPackets; 229111fa0274d1d6620f9634783585387f3b773949evandwalle } 230111fa0274d1d6620f9634783585387f3b773949evandwalle 231111fa0274d1d6620f9634783585387f3b773949evandwalle /** 232111fa0274d1d6620f9634783585387f3b773949evandwalle * Flag indicating that AP has hinted that upstream connection is metered, 233111fa0274d1d6620f9634783585387f3b773949evandwalle * and sensitive to heavy data transfers. 234111fa0274d1d6620f9634783585387f3b773949evandwalle */ 2359f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey private boolean mMeteredHint; 2369f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey 237ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde /** @hide */ 238ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde public WifiInfo() { 239b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff mWifiSsid = null; 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBSSID = null; 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNetworkId = -1; 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSupplicantState = SupplicantState.UNINITIALIZED; 243111fa0274d1d6620f9634783585387f3b773949evandwalle mRssi = INVALID_RSSI; 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLinkSpeed = -1; 24570a415e7fe56ecf0b2591d540913f70ed211d66dFelipe Leme mFrequency = -1; 246111fa0274d1d6620f9634783585387f3b773949evandwalle } 247111fa0274d1d6620f9634783585387f3b773949evandwalle 248111fa0274d1d6620f9634783585387f3b773949evandwalle /** @hide */ 249111fa0274d1d6620f9634783585387f3b773949evandwalle public void reset() { 250111fa0274d1d6620f9634783585387f3b773949evandwalle setInetAddress(null); 251111fa0274d1d6620f9634783585387f3b773949evandwalle setBSSID(null); 252111fa0274d1d6620f9634783585387f3b773949evandwalle setSSID(null); 253111fa0274d1d6620f9634783585387f3b773949evandwalle setNetworkId(-1); 254111fa0274d1d6620f9634783585387f3b773949evandwalle setRssi(INVALID_RSSI); 255111fa0274d1d6620f9634783585387f3b773949evandwalle setLinkSpeed(-1); 256111fa0274d1d6620f9634783585387f3b773949evandwalle setFrequency(-1); 257111fa0274d1d6620f9634783585387f3b773949evandwalle setMeteredHint(false); 258c7a38ef8405443648688a7950378ac4e4ebb3ae5Shirish Kalele setEphemeral(false); 25972d87d99b02c6523a4a3cb83e0d5cf6c8e01075fvandwalle txBad = 0; 260f980c53f86affedc51d31c939a1435d26bc0e050vandwalle txSuccess = 0; 261f980c53f86affedc51d31c939a1435d26bc0e050vandwalle rxSuccess = 0; 262f980c53f86affedc51d31c939a1435d26bc0e050vandwalle txRetries = 0; 263f980c53f86affedc51d31c939a1435d26bc0e050vandwalle txBadRate = 0; 264f980c53f86affedc51d31c939a1435d26bc0e050vandwalle txSuccessRate = 0; 265f980c53f86affedc51d31c939a1435d26bc0e050vandwalle rxSuccessRate = 0; 266f980c53f86affedc51d31c939a1435d26bc0e050vandwalle txRetriesRate = 0; 267f980c53f86affedc51d31c939a1435d26bc0e050vandwalle lowRssiCount = 0; 268f980c53f86affedc51d31c939a1435d26bc0e050vandwalle badRssiCount = 0; 269d524c78d9358e2fa1e67124468cffa5284870c62vandwalle linkStuckCount = 0; 270f980c53f86affedc51d31c939a1435d26bc0e050vandwalle score = 0; 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2733550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy /** 2743550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy * Copy constructor 2753550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy * @hide 2763550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy */ 2773550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy public WifiInfo(WifiInfo source) { 2783550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy if (source != null) { 2793550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy mSupplicantState = source.mSupplicantState; 2803550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy mBSSID = source.mBSSID; 281b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff mWifiSsid = source.mWifiSsid; 2823550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy mNetworkId = source.mNetworkId; 2833550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy mRssi = source.mRssi; 2843550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy mLinkSpeed = source.mLinkSpeed; 28570a415e7fe56ecf0b2591d540913f70ed211d66dFelipe Leme mFrequency = source.mFrequency; 2863550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy mIpAddress = source.mIpAddress; 2873550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy mMacAddress = source.mMacAddress; 2889f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey mMeteredHint = source.mMeteredHint; 289c7a38ef8405443648688a7950378ac4e4ebb3ae5Shirish Kalele mEphemeral = source.mEphemeral; 2902ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle txBad = source.txBad; 2912ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle txRetries = source.txRetries; 2922ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle txSuccess = source.txSuccess; 2932ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle rxSuccess = source.rxSuccess; 2942ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle txBadRate = source.txBadRate; 2952ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle txRetriesRate = source.txRetriesRate; 2962ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle txSuccessRate = source.txSuccessRate; 2972ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle rxSuccessRate = source.rxSuccessRate; 2982ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle score = source.score; 2992ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle badRssiCount = source.badRssiCount; 3002ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle lowRssiCount = source.lowRssiCount; 301d524c78d9358e2fa1e67124468cffa5284870c62vandwalle linkStuckCount = source.linkStuckCount; 3023550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy } 3033550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy } 3043550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy 305ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde /** @hide */ 306ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde public void setSSID(WifiSsid wifiSsid) { 307b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff mWifiSsid = wifiSsid; 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the service set identifier (SSID) of the current 802.11 network. 312b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff * If the SSID can be decoded as UTF-8, it will be returned surrounded by double 313b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff * quotation marks. Otherwise, it is returned as a string of hex digits. The 314f92fc1ca6541ab833e2f0fc09b57fb95294411c0Jeff Davidson * SSID may be <unknown ssid> if there is no network currently connected. 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the SSID 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getSSID() { 318b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff if (mWifiSsid != null) { 319b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff String unicode = mWifiSsid.toString(); 320b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff if (!TextUtils.isEmpty(unicode)) { 321b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff return "\"" + unicode + "\""; 322b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff } else { 323f51097c743fc43ac52b343cf1066801d918f6fa0zhangshuxiao String hex = mWifiSsid.getHexString(); 324f51097c743fc43ac52b343cf1066801d918f6fa0zhangshuxiao return (hex != null) ? hex : WifiSsid.NONE; 325b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff } 326b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff } 327b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff return WifiSsid.NONE; 328b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff } 329b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff 330b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff /** @hide */ 331b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff public WifiSsid getWifiSsid() { 332b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff return mWifiSsid; 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 335ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde /** @hide */ 336ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde public void setBSSID(String BSSID) { 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBSSID = BSSID; 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the basic service set identifier (BSSID) of the current access point. 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The BSSID may be {@code null} if there is no network currently connected. 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the BSSID, in the form of a six-byte MAC address: {@code XX:XX:XX:XX:XX:XX} 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getBSSID() { 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mBSSID; 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the received signal strength indicator of the current 802.11 351137ff532ebb062ea513d6ea0dd894b91f373d1a3Brian Williammee * network, in dBm. 352e4ce619880e831992b005c17dfabb7800994d0c7Jeff Davidson * 353e4ce619880e831992b005c17dfabb7800994d0c7Jeff Davidson * <p>Use {@link android.net.wifi.WifiManager#calculateSignalLevel} to convert this number into 354e4ce619880e831992b005c17dfabb7800994d0c7Jeff Davidson * an absolute signal level which can be displayed to a user. 355e4ce619880e831992b005c17dfabb7800994d0c7Jeff Davidson * 356e4ce619880e831992b005c17dfabb7800994d0c7Jeff Davidson * @return the RSSI. 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getRssi() { 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mRssi; 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 362ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde /** @hide */ 363ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde public void setRssi(int rssi) { 364111fa0274d1d6620f9634783585387f3b773949evandwalle if (rssi < INVALID_RSSI) 365111fa0274d1d6620f9634783585387f3b773949evandwalle rssi = INVALID_RSSI; 366111fa0274d1d6620f9634783585387f3b773949evandwalle if (rssi > MAX_RSSI) 367111fa0274d1d6620f9634783585387f3b773949evandwalle rssi = MAX_RSSI; 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRssi = rssi; 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the current link speed in {@link #LINK_SPEED_UNITS}. 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the link speed. 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #LINK_SPEED_UNITS 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getLinkSpeed() { 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mLinkSpeed; 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 380ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde /** @hide */ 381ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde public void setLinkSpeed(int linkSpeed) { 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.mLinkSpeed = linkSpeed; 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 38670a415e7fe56ecf0b2591d540913f70ed211d66dFelipe Leme * Returns the current frequency in {@link #FREQUENCY_UNITS}. 38770a415e7fe56ecf0b2591d540913f70ed211d66dFelipe Leme * @return the frequency. 38870a415e7fe56ecf0b2591d540913f70ed211d66dFelipe Leme * @see #FREQUENCY_UNITS 38970a415e7fe56ecf0b2591d540913f70ed211d66dFelipe Leme */ 39070a415e7fe56ecf0b2591d540913f70ed211d66dFelipe Leme public int getFrequency() { 39170a415e7fe56ecf0b2591d540913f70ed211d66dFelipe Leme return mFrequency; 39270a415e7fe56ecf0b2591d540913f70ed211d66dFelipe Leme } 39370a415e7fe56ecf0b2591d540913f70ed211d66dFelipe Leme 39470a415e7fe56ecf0b2591d540913f70ed211d66dFelipe Leme /** @hide */ 39570a415e7fe56ecf0b2591d540913f70ed211d66dFelipe Leme public void setFrequency(int frequency) { 39670a415e7fe56ecf0b2591d540913f70ed211d66dFelipe Leme this.mFrequency = frequency; 39770a415e7fe56ecf0b2591d540913f70ed211d66dFelipe Leme } 39870a415e7fe56ecf0b2591d540913f70ed211d66dFelipe Leme 39970a415e7fe56ecf0b2591d540913f70ed211d66dFelipe Leme /** 4002ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle * @hide 4012ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle * TODO: makes real freq boundaries 4022ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle */ 4032ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle public boolean is24GHz() { 4044eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle return ScanResult.is24GHz(mFrequency); 4052ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle } 4062ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle 4072ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle /** 4082ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle * @hide 4092ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle * TODO: makes real freq boundaries 4102ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle */ 4112ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle public boolean is5GHz() { 4124eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle return ScanResult.is5GHz(mFrequency); 4132ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle } 4142ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle 4152ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle /** 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Record the MAC address of the WLAN interface 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param macAddress the MAC address in {@code XX:XX:XX:XX:XX:XX} form 418ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde * @hide 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 420ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde public void setMacAddress(String macAddress) { 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.mMacAddress = macAddress; 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getMacAddress() { 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mMacAddress; 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 428a31ebbc439364a4993e79fd385cf6373408a42feMakoto Onuki /** 429a31ebbc439364a4993e79fd385cf6373408a42feMakoto Onuki * @return true if {@link #getMacAddress()} has a real MAC address. 430a31ebbc439364a4993e79fd385cf6373408a42feMakoto Onuki * 431a31ebbc439364a4993e79fd385cf6373408a42feMakoto Onuki * @hide 432a31ebbc439364a4993e79fd385cf6373408a42feMakoto Onuki */ 433a31ebbc439364a4993e79fd385cf6373408a42feMakoto Onuki public boolean hasRealMacAddress() { 434a31ebbc439364a4993e79fd385cf6373408a42feMakoto Onuki return mMacAddress != null && !DEFAULT_MAC_ADDRESS.equals(mMacAddress); 435a31ebbc439364a4993e79fd385cf6373408a42feMakoto Onuki } 436a31ebbc439364a4993e79fd385cf6373408a42feMakoto Onuki 4379f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey /** {@hide} */ 4389f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey public void setMeteredHint(boolean meteredHint) { 4399f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey mMeteredHint = meteredHint; 4409f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey } 4419f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey 4429f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey /** {@hide} */ 4439f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey public boolean getMeteredHint() { 4449f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey return mMeteredHint; 4459f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey } 4469f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey 447c7a38ef8405443648688a7950378ac4e4ebb3ae5Shirish Kalele /** {@hide} */ 448c7a38ef8405443648688a7950378ac4e4ebb3ae5Shirish Kalele public void setEphemeral(boolean ephemeral) { 449c7a38ef8405443648688a7950378ac4e4ebb3ae5Shirish Kalele mEphemeral = ephemeral; 450c7a38ef8405443648688a7950378ac4e4ebb3ae5Shirish Kalele } 451c7a38ef8405443648688a7950378ac4e4ebb3ae5Shirish Kalele 452c7a38ef8405443648688a7950378ac4e4ebb3ae5Shirish Kalele /** {@hide} */ 453c7a38ef8405443648688a7950378ac4e4ebb3ae5Shirish Kalele public boolean isEphemeral() { 454c7a38ef8405443648688a7950378ac4e4ebb3ae5Shirish Kalele return mEphemeral; 455c7a38ef8405443648688a7950378ac4e4ebb3ae5Shirish Kalele } 456c7a38ef8405443648688a7950378ac4e4ebb3ae5Shirish Kalele 457ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde /** @hide */ 458ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde public void setNetworkId(int id) { 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNetworkId = id; 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Each configured network has a unique small integer ID, used to identify 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the network when performing operations on the supplicant. This method 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * returns the ID for the currently connected network. 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the network ID, or -1 if there is no currently connected network 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getNetworkId() { 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mNetworkId; 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the detailed state of the supplicant's negotiation with an 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * access point, in the form of a {@link SupplicantState SupplicantState} object. 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the current {@link SupplicantState SupplicantState} 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SupplicantState getSupplicantState() { 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mSupplicantState; 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 481ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde /** @hide */ 482ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde public void setSupplicantState(SupplicantState state) { 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSupplicantState = state; 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 486ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde /** @hide */ 487ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde public void setInetAddress(InetAddress address) { 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIpAddress = address; 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getIpAddress() { 4924717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt int result = 0; 4934717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt if (mIpAddress instanceof Inet4Address) { 4944717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt result = NetworkUtils.inetAddressToInt((Inet4Address)mIpAddress); 4954717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt } 4964717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt return result; 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if this network does not broadcast its SSID, so an 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * SSID-specific probe request must be used for scans. 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean getHiddenSSID() { 50463edd98d2eb744cc78dc3a3f8ec1ce7e6164d69dvandwalle if (mWifiSsid == null) return false; 5056e86fa8a6b69dfb8c8117791dc0f100b80fb616fNarayan Kamath return mWifiSsid.isHidden(); 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Map a supplicant state into a fine-grained network connectivity state. 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param suppState the supplicant state 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the corresponding {@link DetailedState} 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static DetailedState getDetailedStateOf(SupplicantState suppState) { 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return stateMap.get(suppState); 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the <code>SupplicantState</code> from the string name 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of the state. 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param stateName the name of the state, as a <code>String</code> returned 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in an event sent by {@code wpa_supplicant}. 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void setSupplicantState(String stateName) { 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSupplicantState = valueOf(stateName); 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static SupplicantState valueOf(String stateName) { 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ("4WAY_HANDSHAKE".equalsIgnoreCase(stateName)) 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return SupplicantState.FOUR_WAY_HANDSHAKE; 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else { 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 532ee00b353a4070a9ddbdf67fa715dc84e7282f7c2Elliott Hughes return SupplicantState.valueOf(stateName.toUpperCase(Locale.ROOT)); 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IllegalArgumentException e) { 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return SupplicantState.INVALID; 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5399f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey /** {@hide} */ 5409f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey public static String removeDoubleQuotes(String string) { 54100a10a1494954d124e1b11bc1ba3128e47b8ffbdIrfan Sheriff if (string == null) return null; 5429f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey final int length = string.length(); 5439f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey if ((length > 1) && (string.charAt(0) == '"') && (string.charAt(length - 1) == '"')) { 5449f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey return string.substring(1, length - 1); 5459f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey } 5469f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey return string; 5479f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey } 5489f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringBuffer sb = new StringBuffer(); 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String none = "<none>"; 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 554b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff sb.append("SSID: ").append(mWifiSsid == null ? WifiSsid.NONE : mWifiSsid). 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project append(", BSSID: ").append(mBSSID == null ? none : mBSSID). 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project append(", MAC: ").append(mMacAddress == null ? none : mMacAddress). 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project append(", Supplicant state: "). 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project append(mSupplicantState == null ? none : mSupplicantState). 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project append(", RSSI: ").append(mRssi). 56070a415e7fe56ecf0b2591d540913f70ed211d66dFelipe Leme append(", Link speed: ").append(mLinkSpeed).append(LINK_SPEED_UNITS). 56170a415e7fe56ecf0b2591d540913f70ed211d66dFelipe Leme append(", Frequency: ").append(mFrequency).append(FREQUENCY_UNITS). 5629f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey append(", Net ID: ").append(mNetworkId). 5632ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle append(", Metered hint: ").append(mMeteredHint). 5642ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle append(", score: ").append(Integer.toString(score)); 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sb.toString(); 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Implement the Parcelable interface {@hide} */ 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int describeContents() { 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Implement the Parcelable interface {@hide} */ 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel dest, int flags) { 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(mNetworkId); 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(mRssi); 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(mLinkSpeed); 57870a415e7fe56ecf0b2591d540913f70ed211d66dFelipe Leme dest.writeInt(mFrequency); 579124b44d89bc00b150c9478ccddfa83cac0f1df24Robert Greenwalt if (mIpAddress != null) { 580124b44d89bc00b150c9478ccddfa83cac0f1df24Robert Greenwalt dest.writeByte((byte)1); 581124b44d89bc00b150c9478ccddfa83cac0f1df24Robert Greenwalt dest.writeByteArray(mIpAddress.getAddress()); 582124b44d89bc00b150c9478ccddfa83cac0f1df24Robert Greenwalt } else { 583124b44d89bc00b150c9478ccddfa83cac0f1df24Robert Greenwalt dest.writeByte((byte)0); 584124b44d89bc00b150c9478ccddfa83cac0f1df24Robert Greenwalt } 585b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff if (mWifiSsid != null) { 586b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff dest.writeInt(1); 587b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff mWifiSsid.writeToParcel(dest, flags); 588b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff } else { 589b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff dest.writeInt(0); 590b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff } 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeString(mBSSID); 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeString(mMacAddress); 5939f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey dest.writeInt(mMeteredHint ? 1 : 0); 594c7a38ef8405443648688a7950378ac4e4ebb3ae5Shirish Kalele dest.writeInt(mEphemeral ? 1 : 0); 5952ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle dest.writeInt(score); 5962ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle dest.writeDouble(txSuccessRate); 5972ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle dest.writeDouble(txRetriesRate); 5982ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle dest.writeDouble(txBadRate); 5992ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle dest.writeDouble(rxSuccessRate); 6002ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle dest.writeInt(badRssiCount); 6012ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle dest.writeInt(lowRssiCount); 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSupplicantState.writeToParcel(dest, flags); 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Implement the Parcelable interface {@hide} */ 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Creator<WifiInfo> CREATOR = 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new Creator<WifiInfo>() { 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public WifiInfo createFromParcel(Parcel in) { 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WifiInfo info = new WifiInfo(); 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project info.setNetworkId(in.readInt()); 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project info.setRssi(in.readInt()); 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project info.setLinkSpeed(in.readInt()); 61370a415e7fe56ecf0b2591d540913f70ed211d66dFelipe Leme info.setFrequency(in.readInt()); 614124b44d89bc00b150c9478ccddfa83cac0f1df24Robert Greenwalt if (in.readByte() == 1) { 615124b44d89bc00b150c9478ccddfa83cac0f1df24Robert Greenwalt try { 616124b44d89bc00b150c9478ccddfa83cac0f1df24Robert Greenwalt info.setInetAddress(InetAddress.getByAddress(in.createByteArray())); 617124b44d89bc00b150c9478ccddfa83cac0f1df24Robert Greenwalt } catch (UnknownHostException e) {} 618124b44d89bc00b150c9478ccddfa83cac0f1df24Robert Greenwalt } 619b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff if (in.readInt() == 1) { 620b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff info.mWifiSsid = WifiSsid.CREATOR.createFromParcel(in); 621b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff } 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project info.mBSSID = in.readString(); 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project info.mMacAddress = in.readString(); 6249f6e4ba50e7e73704c7fbd3ba65fe73bdf8ad73fJeff Sharkey info.mMeteredHint = in.readInt() != 0; 625c7a38ef8405443648688a7950378ac4e4ebb3ae5Shirish Kalele info.mEphemeral = in.readInt() != 0; 6262ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle info.score = in.readInt(); 6272ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle info.txSuccessRate = in.readDouble(); 6282ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle info.txRetriesRate = in.readDouble(); 6292ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle info.txBadRate = in.readDouble(); 6302ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle info.rxSuccessRate = in.readDouble(); 6312ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle info.badRssiCount = in.readInt(); 6322ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle info.lowRssiCount = in.readInt(); 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project info.mSupplicantState = SupplicantState.CREATOR.createFromParcel(in); 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return info; 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public WifiInfo[] newArray(int size) { 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new WifiInfo[size]; 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 642