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