1b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle/* 2b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle * Copyright (C) 2014 The Android Open Source Project 3b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle * 4b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle * Licensed under the Apache License, Version 2.0 (the "License"); 5b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle * you may not use this file except in compliance with the License. 6b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle * You may obtain a copy of the License at 7b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle * 8b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle * http://www.apache.org/licenses/LICENSE-2.0 9b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle * 10b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle * Unless required by applicable law or agreed to in writing, software 11b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle * distributed under the License is distributed on an "AS IS" BASIS, 12b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle * See the License for the specific language governing permissions and 14b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle * limitations under the License. 15b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle */ 16b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle 17b914c3343f94f54d84ce163a38c23212202d7d6dvandwallepackage android.net.wifi; 18b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle 19b914c3343f94f54d84ce163a38c23212202d7d6dvandwalleimport android.os.Parcelable; 20b914c3343f94f54d84ce163a38c23212202d7d6dvandwalleimport android.os.Parcel; 21b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle 223ec7cfeedf50a9403a073e1fe4a76a71865ea2e9Roshan Piusimport java.util.Arrays; 233ec7cfeedf50a9403a073e1fe4a76a71865ea2e9Roshan Pius 24b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle/** 25b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle * A class representing link layer statistics collected over a Wifi Interface. 26b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle */ 27b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle/** {@hide} */ 28b914c3343f94f54d84ce163a38c23212202d7d6dvandwallepublic class WifiLinkLayerStats implements Parcelable { 29b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle private static final String TAG = "WifiLinkLayerStats"; 30b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle 31b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle /** 32b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle * The current status of this network configuration entry. 33b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle * @see Status 34b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle */ 35b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle /** {@hide} */ 36b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle public int status; 37b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle 38b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle /** 39b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle * The network's SSID. Can either be an ASCII string, 40b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle * which must be enclosed in double quotation marks 41b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle * (e.g., {@code "MyNetwork"}, or a string of 42b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle * hex digits,which are not enclosed in quotes 43b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle * (e.g., {@code 01a243f405}). 44b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle */ 45b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle /** {@hide} */ 46b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle public String SSID; 47b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle /** 48b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle * When set. this is the BSSID the radio is currently associated with. 49b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle * The value is a string in the format of an Ethernet MAC address, e.g., 50b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle * <code>XX:XX:XX:XX:XX:XX</code> where each <code>X</code> is a hex digit. 51b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle */ 52b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle /** {@hide} */ 53b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle public String BSSID; 54b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle 55b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle /* number beacons received from our own AP */ 56b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle /** {@hide} */ 57b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle public int beacon_rx; 58b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle 59b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle /* RSSI taken on management frames */ 60b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle /** {@hide} */ 61b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle public int rssi_mgmt; 62b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle 63b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle /* packets counters */ 64b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle /** {@hide} */ 65b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle /* WME Best Effort Access Category (receive mpdu, transmit mpdu, lost mpdu, number of retries)*/ 66b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle public long rxmpdu_be; 67b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle /** {@hide} */ 68b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle public long txmpdu_be; 69b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle /** {@hide} */ 70b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle public long lostmpdu_be; 71b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle /** {@hide} */ 72b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle public long retries_be; 73b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle /** {@hide} */ 74b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle /* WME Background Access Category (receive mpdu, transmit mpdu, lost mpdu, number of retries) */ 75b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle public long rxmpdu_bk; 76b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle /** {@hide} */ 77b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle public long txmpdu_bk; 78b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle /** {@hide} */ 79b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle public long lostmpdu_bk; 80b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle /** {@hide} */ 81b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle public long retries_bk; 82b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle /** {@hide} */ 83b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle /* WME Video Access Category (receive mpdu, transmit mpdu, lost mpdu, number of retries) */ 84b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle public long rxmpdu_vi; 85b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle /** {@hide} */ 86b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle public long txmpdu_vi; 87b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle /** {@hide} */ 88b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle public long lostmpdu_vi; 89b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle /** {@hide} */ 90b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle public long retries_vi; 91b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle /** {@hide} */ 92b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle /* WME Voice Access Category (receive mpdu, transmit mpdu, lost mpdu, number of retries) */ 93b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle public long rxmpdu_vo; 94b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle /** {@hide} */ 95b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle public long txmpdu_vo; 96b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle /** {@hide} */ 97b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle public long lostmpdu_vo; 98b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle /** {@hide} */ 99b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle public long retries_vo; 100b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle 101b928a3802bfcd3aeed592906ddb3e14c653b213cvandwalle /** {@hide} */ 102b928a3802bfcd3aeed592906ddb3e14c653b213cvandwalle public int on_time; 103b928a3802bfcd3aeed592906ddb3e14c653b213cvandwalle /** {@hide} */ 104b928a3802bfcd3aeed592906ddb3e14c653b213cvandwalle public int tx_time; 105b928a3802bfcd3aeed592906ddb3e14c653b213cvandwalle /** {@hide} */ 1063ec7cfeedf50a9403a073e1fe4a76a71865ea2e9Roshan Pius public int[] tx_time_per_level; 1073ec7cfeedf50a9403a073e1fe4a76a71865ea2e9Roshan Pius /** {@hide} */ 108b928a3802bfcd3aeed592906ddb3e14c653b213cvandwalle public int rx_time; 109b928a3802bfcd3aeed592906ddb3e14c653b213cvandwalle /** {@hide} */ 110b928a3802bfcd3aeed592906ddb3e14c653b213cvandwalle public int on_time_scan; 111b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle 112b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle /** {@hide} */ 113b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle public WifiLinkLayerStats() { 114b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle } 115b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle 116b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle @Override 117b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle /** {@hide} */ 118b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle public String toString() { 119b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle StringBuilder sbuf = new StringBuilder(); 1202ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle sbuf.append(" WifiLinkLayerStats: ").append('\n'); 1212ab9089dfa0c0526e8bf0aaade8a09dec021dc90vandwalle 122b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle if (this.SSID != null) { 123b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle sbuf.append(" SSID: ").append(this.SSID).append('\n'); 124b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle } 125b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle if (this.BSSID != null) { 126b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle sbuf.append(" BSSID: ").append(this.BSSID).append('\n'); 127b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle } 128b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle 129b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle sbuf.append(" my bss beacon rx: ").append(Integer.toString(this.beacon_rx)).append('\n'); 130b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle sbuf.append(" RSSI mgmt: ").append(Integer.toString(this.rssi_mgmt)).append('\n'); 131b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle sbuf.append(" BE : ").append(" rx=").append(Long.toString(this.rxmpdu_be)) 132b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle .append(" tx=").append(Long.toString(this.txmpdu_be)) 133b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle .append(" lost=").append(Long.toString(this.lostmpdu_be)) 134b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle .append(" retries=").append(Long.toString(this.retries_be)).append('\n'); 135b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle sbuf.append(" BK : ").append(" rx=").append(Long.toString(this.rxmpdu_bk)) 136b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle .append(" tx=").append(Long.toString(this.txmpdu_bk)) 137b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle .append(" lost=").append(Long.toString(this.lostmpdu_bk)) 138b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle .append(" retries=").append(Long.toString(this.retries_bk)).append('\n'); 139b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle sbuf.append(" VI : ").append(" rx=").append(Long.toString(this.rxmpdu_vi)) 140b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle .append(" tx=").append(Long.toString(this.txmpdu_vi)) 141b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle .append(" lost=").append(Long.toString(this.lostmpdu_vi)) 142b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle .append(" retries=").append(Long.toString(this.retries_vi)).append('\n'); 143b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle sbuf.append(" VO : ").append(" rx=").append(Long.toString(this.rxmpdu_vo)) 144b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle .append(" tx=").append(Long.toString(this.txmpdu_vo)) 145b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle .append(" lost=").append(Long.toString(this.lostmpdu_vo)) 146b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle .append(" retries=").append(Long.toString(this.retries_vo)).append('\n'); 147b928a3802bfcd3aeed592906ddb3e14c653b213cvandwalle sbuf.append(" on_time : ").append(Integer.toString(this.on_time)) 148b928a3802bfcd3aeed592906ddb3e14c653b213cvandwalle .append(" rx_time=").append(Integer.toString(this.rx_time)) 1493ec7cfeedf50a9403a073e1fe4a76a71865ea2e9Roshan Pius .append(" scan_time=").append(Integer.toString(this.on_time_scan)).append('\n') 1503ec7cfeedf50a9403a073e1fe4a76a71865ea2e9Roshan Pius .append(" tx_time=").append(Integer.toString(this.tx_time)) 1513ec7cfeedf50a9403a073e1fe4a76a71865ea2e9Roshan Pius .append(" tx_time_per_level=" + Arrays.toString(tx_time_per_level)); 152b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle return sbuf.toString(); 153b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle } 154b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle 155b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle /** Implement the Parcelable interface {@hide} */ 156b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle public int describeContents() { 157b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle return 0; 158b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle } 159b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle 160b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle /** {@hide} */ 161b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle public String getPrintableSsid() { 162b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle if (SSID == null) return ""; 163b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle final int length = SSID.length(); 164b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle if (length > 2 && (SSID.charAt(0) == '"') && SSID.charAt(length - 1) == '"') { 165b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle return SSID.substring(1, length - 1); 166b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle } 167b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle 168b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle /** The ascii-encoded string format is P"<ascii-encoded-string>" 169b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle * The decoding is implemented in the supplicant for a newly configured 170b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle * network. 171b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle */ 172b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle if (length > 3 && (SSID.charAt(0) == 'P') && (SSID.charAt(1) == '"') && 173b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle (SSID.charAt(length-1) == '"')) { 174b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle WifiSsid wifiSsid = WifiSsid.createFromAsciiEncoded( 175b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle SSID.substring(2, length - 1)); 176b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle return wifiSsid.toString(); 177b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle } 178b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle return SSID; 179b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle } 180b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle 181b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle /** Implement the Parcelable interface {@hide} */ 182b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle public void writeToParcel(Parcel dest, int flags) { 183b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle dest.writeString(SSID); 184b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle dest.writeString(BSSID); 185b928a3802bfcd3aeed592906ddb3e14c653b213cvandwalle dest.writeInt(on_time); 186b928a3802bfcd3aeed592906ddb3e14c653b213cvandwalle dest.writeInt(tx_time); 1873ec7cfeedf50a9403a073e1fe4a76a71865ea2e9Roshan Pius dest.writeIntArray(tx_time_per_level); 188b928a3802bfcd3aeed592906ddb3e14c653b213cvandwalle dest.writeInt(rx_time); 189b928a3802bfcd3aeed592906ddb3e14c653b213cvandwalle dest.writeInt(on_time_scan); 190b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle } 191b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle 192b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle /** Implement the Parcelable interface {@hide} */ 193b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle public static final Creator<WifiLinkLayerStats> CREATOR = 194b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle new Creator<WifiLinkLayerStats>() { 195b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle public WifiLinkLayerStats createFromParcel(Parcel in) { 196b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle WifiLinkLayerStats stats = new WifiLinkLayerStats(); 197b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle stats.SSID = in.readString(); 198b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle stats.BSSID = in.readString(); 199b928a3802bfcd3aeed592906ddb3e14c653b213cvandwalle stats.on_time = in.readInt(); 200b928a3802bfcd3aeed592906ddb3e14c653b213cvandwalle stats.tx_time = in.readInt(); 2013ec7cfeedf50a9403a073e1fe4a76a71865ea2e9Roshan Pius stats.tx_time_per_level = in.createIntArray(); 202b928a3802bfcd3aeed592906ddb3e14c653b213cvandwalle stats.rx_time = in.readInt(); 203b928a3802bfcd3aeed592906ddb3e14c653b213cvandwalle stats.on_time_scan = in.readInt(); 204b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle return stats; 205b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle }; 206b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle public WifiLinkLayerStats[] newArray(int size) { 207b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle return new WifiLinkLayerStats[size]; 208b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle } 209b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle 210b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle }; 211b914c3343f94f54d84ce163a38c23212202d7d6dvandwalle} 212