1b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff/*
2b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff * Copyright (C) 2013 The Android Open Source Project
3b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff *
4b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff * Licensed under the Apache License, Version 2.0 (the "License");
5b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff * you may not use this file except in compliance with the License.
6b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff * You may obtain a copy of the License at
7b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff *
8b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff *      http://www.apache.org/licenses/LICENSE-2.0
9b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff *
10b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff * Unless required by applicable law or agreed to in writing, software
11b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff * distributed under the License is distributed on an "AS IS" BASIS,
12b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff * See the License for the specific language governing permissions and
14b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff * limitations under the License.
15b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff */
16b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff
17b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriffpackage com.android.server.wifi;
18b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff
19b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriffimport android.content.BroadcastReceiver;
20b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriffimport android.content.Context;
21b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriffimport android.content.Intent;
22b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriffimport android.content.IntentFilter;
23b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriffimport android.net.NetworkInfo;
24b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriffimport static android.net.NetworkInfo.DetailedState.CONNECTED;
25b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriffimport android.net.TrafficStats;
26b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriffimport android.net.wifi.WifiManager;
27302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriffimport android.os.Messenger;
28302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriffimport android.os.RemoteException;
29302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriffimport android.util.Log;
30b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriffimport android.os.Handler;
31b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriffimport android.os.Message;
32b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff
33b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriffimport java.io.FileDescriptor;
34b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriffimport java.io.PrintWriter;
35c808a1955f7571108e8c22502897ed82c69a7c3bIrfan Sheriffimport java.util.ArrayList;
36b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriffimport java.util.List;
37b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriffimport java.util.concurrent.atomic.AtomicBoolean;
38b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff
39b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriffimport com.android.internal.util.AsyncChannel;
40b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff
41b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff/* Polls for traffic stats and notifies the clients */
42b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sherifffinal class WifiTrafficPoller {
43b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff    /**
44b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff     * Interval in milliseconds between polling for traffic
45b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff     * statistics
46b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff     */
47b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff    private static final int POLL_TRAFFIC_STATS_INTERVAL_MSECS = 1000;
48b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff
49c808a1955f7571108e8c22502897ed82c69a7c3bIrfan Sheriff    private static final int ENABLE_TRAFFIC_STATS_POLL  = 1;
50c808a1955f7571108e8c22502897ed82c69a7c3bIrfan Sheriff    private static final int TRAFFIC_STATS_POLL         = 2;
51c808a1955f7571108e8c22502897ed82c69a7c3bIrfan Sheriff    private static final int ADD_CLIENT                 = 3;
52c808a1955f7571108e8c22502897ed82c69a7c3bIrfan Sheriff    private static final int REMOVE_CLIENT              = 4;
53c808a1955f7571108e8c22502897ed82c69a7c3bIrfan Sheriff
54b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff    private boolean mEnableTrafficStatsPoll = false;
55b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff    private int mTrafficStatsPollToken = 0;
56b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff    private long mTxPkts;
57b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff    private long mRxPkts;
58b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff    /* Tracks last reported data activity */
59b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff    private int mDataActivity;
60b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff
61c808a1955f7571108e8c22502897ed82c69a7c3bIrfan Sheriff    private final List<Messenger> mClients = new ArrayList<Messenger>();
62b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff    // err on the side of updating at boot since screen on broadcast may be missed
63b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff    // the first time
64b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff    private AtomicBoolean mScreenOn = new AtomicBoolean(true);
65b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff    private final TrafficHandler mTrafficHandler;
66b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff    private NetworkInfo mNetworkInfo;
67b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff    private final String mInterface;
68b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff
69c808a1955f7571108e8c22502897ed82c69a7c3bIrfan Sheriff    WifiTrafficPoller(Context context, String iface) {
70b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff        mInterface = iface;
71b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff        mTrafficHandler = new TrafficHandler();
72b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff
73b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff        IntentFilter filter = new IntentFilter();
74b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff        filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
75b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff        filter.addAction(Intent.ACTION_SCREEN_OFF);
76b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff        filter.addAction(Intent.ACTION_SCREEN_ON);
77b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff
78b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff        context.registerReceiver(
79b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff                new BroadcastReceiver() {
80b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff                    @Override
81b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff                    public void onReceive(Context context, Intent intent) {
82b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff                        if (intent.getAction().equals(
83b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff                                WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
84b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff                            mNetworkInfo = (NetworkInfo) intent.getParcelableExtra(
85b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff                                    WifiManager.EXTRA_NETWORK_INFO);
86b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff                        } else if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
87b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff                            mScreenOn.set(false);
88b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff                        } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
89b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff                            mScreenOn.set(true);
90b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff                        }
91b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff                        evaluateTrafficStatsPolling();
92b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff                    }
93b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff                }, filter);
94b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff    }
95b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff
96c808a1955f7571108e8c22502897ed82c69a7c3bIrfan Sheriff    void addClient(Messenger client) {
97c808a1955f7571108e8c22502897ed82c69a7c3bIrfan Sheriff        Message.obtain(mTrafficHandler, ADD_CLIENT, client).sendToTarget();
98c808a1955f7571108e8c22502897ed82c69a7c3bIrfan Sheriff    }
99c808a1955f7571108e8c22502897ed82c69a7c3bIrfan Sheriff
100c808a1955f7571108e8c22502897ed82c69a7c3bIrfan Sheriff    void removeClient(Messenger client) {
101c808a1955f7571108e8c22502897ed82c69a7c3bIrfan Sheriff        Message.obtain(mTrafficHandler, REMOVE_CLIENT, client).sendToTarget();
102c808a1955f7571108e8c22502897ed82c69a7c3bIrfan Sheriff    }
103c808a1955f7571108e8c22502897ed82c69a7c3bIrfan Sheriff
104b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff
105b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff    private class TrafficHandler extends Handler {
106b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff        public void handleMessage(Message msg) {
107b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff            switch (msg.what) {
108c808a1955f7571108e8c22502897ed82c69a7c3bIrfan Sheriff                case ENABLE_TRAFFIC_STATS_POLL:
109b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff                    mEnableTrafficStatsPoll = (msg.arg1 == 1);
110b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff                    mTrafficStatsPollToken++;
111b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff                    if (mEnableTrafficStatsPoll) {
112b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff                        notifyOnDataActivity();
113c808a1955f7571108e8c22502897ed82c69a7c3bIrfan Sheriff                        sendMessageDelayed(Message.obtain(this, TRAFFIC_STATS_POLL,
114b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff                                mTrafficStatsPollToken, 0), POLL_TRAFFIC_STATS_INTERVAL_MSECS);
115b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff                    }
116b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff                    break;
117c808a1955f7571108e8c22502897ed82c69a7c3bIrfan Sheriff                case TRAFFIC_STATS_POLL:
118b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff                    if (msg.arg1 == mTrafficStatsPollToken) {
119b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff                        notifyOnDataActivity();
120c808a1955f7571108e8c22502897ed82c69a7c3bIrfan Sheriff                        sendMessageDelayed(Message.obtain(this, TRAFFIC_STATS_POLL,
121b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff                                mTrafficStatsPollToken, 0), POLL_TRAFFIC_STATS_INTERVAL_MSECS);
122b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff                    }
123b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff                    break;
124c808a1955f7571108e8c22502897ed82c69a7c3bIrfan Sheriff                case ADD_CLIENT:
125c808a1955f7571108e8c22502897ed82c69a7c3bIrfan Sheriff                    mClients.add((Messenger) msg.obj);
126c808a1955f7571108e8c22502897ed82c69a7c3bIrfan Sheriff                    break;
127c808a1955f7571108e8c22502897ed82c69a7c3bIrfan Sheriff                case REMOVE_CLIENT:
128c808a1955f7571108e8c22502897ed82c69a7c3bIrfan Sheriff                    mClients.remove(msg.obj);
129c808a1955f7571108e8c22502897ed82c69a7c3bIrfan Sheriff                    break;
130b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff            }
131b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff
132b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff        }
133b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff    }
134b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff
135b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff    private void evaluateTrafficStatsPolling() {
136b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff        Message msg;
137b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff        if (mNetworkInfo == null) return;
138b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff        if (mNetworkInfo.getDetailedState() == CONNECTED && mScreenOn.get()) {
139b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff            msg = Message.obtain(mTrafficHandler,
140c808a1955f7571108e8c22502897ed82c69a7c3bIrfan Sheriff                    ENABLE_TRAFFIC_STATS_POLL, 1, 0);
141b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff        } else {
142b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff            msg = Message.obtain(mTrafficHandler,
143c808a1955f7571108e8c22502897ed82c69a7c3bIrfan Sheriff                    ENABLE_TRAFFIC_STATS_POLL, 0, 0);
144b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff        }
145b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff        msg.sendToTarget();
146b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff    }
147b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff
148b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff    private void notifyOnDataActivity() {
149b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff        long sent, received;
150b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff        long preTxPkts = mTxPkts, preRxPkts = mRxPkts;
151b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff        int dataActivity = WifiManager.DATA_ACTIVITY_NONE;
152b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff
153b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff        mTxPkts = TrafficStats.getTxPackets(mInterface);
154b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff        mRxPkts = TrafficStats.getRxPackets(mInterface);
155b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff
156b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff        if (preTxPkts > 0 || preRxPkts > 0) {
157b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff            sent = mTxPkts - preTxPkts;
158b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff            received = mRxPkts - preRxPkts;
159b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff            if (sent > 0) {
160b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff                dataActivity |= WifiManager.DATA_ACTIVITY_OUT;
161b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff            }
162b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff            if (received > 0) {
163b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff                dataActivity |= WifiManager.DATA_ACTIVITY_IN;
164b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff            }
165b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff
166b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff            if (dataActivity != mDataActivity && mScreenOn.get()) {
167b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff                mDataActivity = dataActivity;
168302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff                for (Messenger client : mClients) {
169302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff                    Message msg = Message.obtain();
170302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff                    msg.what = WifiManager.DATA_ACTIVITY_NOTIFICATION;
171302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff                    msg.arg1 = mDataActivity;
172302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff                    try {
173302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff                        client.send(msg);
174302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff                    } catch (RemoteException e) {
175302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff                        // Failed to reach, skip
176302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff                        // Client removal is handled in WifiService
177302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff                    }
178b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff                }
179b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff            }
180b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff        }
181b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff    }
182b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff
183b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff    void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
184b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff        pw.println("mEnableTrafficStatsPoll " + mEnableTrafficStatsPoll);
185b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff        pw.println("mTrafficStatsPollToken " + mTrafficStatsPollToken);
186b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff        pw.println("mTxPkts " + mTxPkts);
187b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff        pw.println("mRxPkts " + mRxPkts);
188b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff        pw.println("mDataActivity " + mDataActivity);
189b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff    }
190b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff
191b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff}
192