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