11059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey/*
21059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey * Copyright (C) 2011 The Android Open Source Project
31059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey *
41059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey * Licensed under the Apache License, Version 2.0 (the "License");
51059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey * you may not use this file except in compliance with the License.
61059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey * You may obtain a copy of the License at
71059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey *
81059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey *      http://www.apache.org/licenses/LICENSE-2.0
91059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey *
101059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey * Unless required by applicable law or agreed to in writing, software
111059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey * distributed under the License is distributed on an "AS IS" BASIS,
121059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey * See the License for the specific language governing permissions and
141059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey * limitations under the License.
151059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey */
161059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
171059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeypackage com.android.internal.net;
181059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
198fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkeyimport static android.net.NetworkStats.SET_ALL;
201059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport static android.net.NetworkStats.TAG_NONE;
211059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport static android.net.NetworkStats.UID_ALL;
221059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport static com.android.server.NetworkManagementSocketTagger.kernelToTag;
231059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
241059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport android.net.NetworkStats;
25453dafa66372308fd5200f1749a2ef8e3e1846e9Jeff Sharkeyimport android.os.StrictMode;
261059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport android.os.SystemClock;
271059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
288b2c3a14603d163d7564e6f60286995079687690Jeff Sharkeyimport com.android.internal.annotations.VisibleForTesting;
29163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkeyimport com.android.internal.util.ProcFileReader;
301059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
311059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport java.io.File;
32163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkeyimport java.io.FileInputStream;
331059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport java.io.IOException;
341059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
351059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport libcore.io.IoUtils;
361059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
371059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey/**
381059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey * Creates {@link NetworkStats} instances by parsing various {@code /proc/}
391059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey * files as needed.
401059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey */
411059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeypublic class NetworkStatsFactory {
421059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    private static final String TAG = "NetworkStatsFactory";
431059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
441059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    // TODO: consider moving parsing to native code
451059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
461059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    /** Path to {@code /proc/net/xt_qtaguid/iface_stat_all}. */
471059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    private final File mStatsXtIfaceAll;
48e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey    /** Path to {@code /proc/net/xt_qtaguid/iface_stat_fmt}. */
49e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey    private final File mStatsXtIfaceFmt;
501059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    /** Path to {@code /proc/net/xt_qtaguid/stats}. */
511059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    private final File mStatsXtUid;
521059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
531059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    public NetworkStatsFactory() {
541059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        this(new File("/proc/"));
551059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    }
561059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
578b2c3a14603d163d7564e6f60286995079687690Jeff Sharkey    @VisibleForTesting
581059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    public NetworkStatsFactory(File procRoot) {
591059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        mStatsXtIfaceAll = new File(procRoot, "net/xt_qtaguid/iface_stat_all");
60e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey        mStatsXtIfaceFmt = new File(procRoot, "net/xt_qtaguid/iface_stat_fmt");
61e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey        mStatsXtUid = new File(procRoot, "net/xt_qtaguid/stats");
621059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    }
631059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
641059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    /**
65e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey     * Parse and return interface-level summary {@link NetworkStats} measured
66e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey     * using {@code /proc/net/dev} style hooks, which may include non IP layer
67e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey     * traffic. Values monotonically increase since device boot, and may include
68e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey     * details about inactive interfaces.
691059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey     *
701059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey     * @throws IllegalStateException when problem parsing stats.
711059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey     */
72e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey    public NetworkStats readNetworkStatsSummaryDev() throws IllegalStateException {
73453dafa66372308fd5200f1749a2ef8e3e1846e9Jeff Sharkey        final StrictMode.ThreadPolicy savedPolicy = StrictMode.allowThreadDiskReads();
74453dafa66372308fd5200f1749a2ef8e3e1846e9Jeff Sharkey
751059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        final NetworkStats stats = new NetworkStats(SystemClock.elapsedRealtime(), 6);
761059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        final NetworkStats.Entry entry = new NetworkStats.Entry();
771059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
781d29a3064f20652416f81ea292adcc07566ba974Jeff Sharkey        ProcFileReader reader = null;
791059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        try {
801d29a3064f20652416f81ea292adcc07566ba974Jeff Sharkey            reader = new ProcFileReader(new FileInputStream(mStatsXtIfaceAll));
811059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
821d29a3064f20652416f81ea292adcc07566ba974Jeff Sharkey            while (reader.hasMoreData()) {
831d29a3064f20652416f81ea292adcc07566ba974Jeff Sharkey                entry.iface = reader.nextString();
841059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                entry.uid = UID_ALL;
858fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey                entry.set = SET_ALL;
861059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                entry.tag = TAG_NONE;
871059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
881d29a3064f20652416f81ea292adcc07566ba974Jeff Sharkey                final boolean active = reader.nextInt() != 0;
891d29a3064f20652416f81ea292adcc07566ba974Jeff Sharkey
901059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                // always include snapshot values
911d29a3064f20652416f81ea292adcc07566ba974Jeff Sharkey                entry.rxBytes = reader.nextLong();
921d29a3064f20652416f81ea292adcc07566ba974Jeff Sharkey                entry.rxPackets = reader.nextLong();
931d29a3064f20652416f81ea292adcc07566ba974Jeff Sharkey                entry.txBytes = reader.nextLong();
941d29a3064f20652416f81ea292adcc07566ba974Jeff Sharkey                entry.txPackets = reader.nextLong();
951059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
961059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                // fold in active numbers, but only when active
971059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                if (active) {
981d29a3064f20652416f81ea292adcc07566ba974Jeff Sharkey                    entry.rxBytes += reader.nextLong();
991d29a3064f20652416f81ea292adcc07566ba974Jeff Sharkey                    entry.rxPackets += reader.nextLong();
1001d29a3064f20652416f81ea292adcc07566ba974Jeff Sharkey                    entry.txBytes += reader.nextLong();
1011d29a3064f20652416f81ea292adcc07566ba974Jeff Sharkey                    entry.txPackets += reader.nextLong();
1021059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                }
1031059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
1041059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                stats.addValues(entry);
1051d29a3064f20652416f81ea292adcc07566ba974Jeff Sharkey                reader.finishLine();
1061059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            }
1071059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        } catch (NullPointerException e) {
1081059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            throw new IllegalStateException("problem parsing stats: " + e);
1091059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        } catch (NumberFormatException e) {
1101059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            throw new IllegalStateException("problem parsing stats: " + e);
1111059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        } catch (IOException e) {
1121059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            throw new IllegalStateException("problem parsing stats: " + e);
1131059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        } finally {
1141059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            IoUtils.closeQuietly(reader);
115453dafa66372308fd5200f1749a2ef8e3e1846e9Jeff Sharkey            StrictMode.setThreadPolicy(savedPolicy);
1161059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        }
1171059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        return stats;
1181059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    }
1191059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
1201059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    /**
121e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey     * Parse and return interface-level summary {@link NetworkStats}. Designed
122e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey     * to return only IP layer traffic. Values monotonically increase since
123e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey     * device boot, and may include details about inactive interfaces.
124e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey     *
125e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey     * @throws IllegalStateException when problem parsing stats.
1261059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey     */
127e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey    public NetworkStats readNetworkStatsSummaryXt() throws IllegalStateException {
128453dafa66372308fd5200f1749a2ef8e3e1846e9Jeff Sharkey        final StrictMode.ThreadPolicy savedPolicy = StrictMode.allowThreadDiskReads();
129453dafa66372308fd5200f1749a2ef8e3e1846e9Jeff Sharkey
130e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey        // return null when kernel doesn't support
131e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey        if (!mStatsXtIfaceFmt.exists()) return null;
132e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey
1331059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        final NetworkStats stats = new NetworkStats(SystemClock.elapsedRealtime(), 6);
1341059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        final NetworkStats.Entry entry = new NetworkStats.Entry();
1351059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
136e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey        ProcFileReader reader = null;
137e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey        try {
138e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey            // open and consume header line
139e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey            reader = new ProcFileReader(new FileInputStream(mStatsXtIfaceFmt));
140e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey            reader.finishLine();
1411059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
142e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey            while (reader.hasMoreData()) {
143e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey                entry.iface = reader.nextString();
144e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey                entry.uid = UID_ALL;
145e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey                entry.set = SET_ALL;
146e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey                entry.tag = TAG_NONE;
1471059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
148e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey                entry.rxBytes = reader.nextLong();
149e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey                entry.rxPackets = reader.nextLong();
150e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey                entry.txBytes = reader.nextLong();
151e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey                entry.txPackets = reader.nextLong();
1521059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
153e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey                stats.addValues(entry);
154e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey                reader.finishLine();
1551059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            }
1561059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        } catch (NullPointerException e) {
1571059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            throw new IllegalStateException("problem parsing stats: " + e);
1581059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        } catch (NumberFormatException e) {
1591059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            throw new IllegalStateException("problem parsing stats: " + e);
1601059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        } catch (IOException e) {
1611059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            throw new IllegalStateException("problem parsing stats: " + e);
1621059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        } finally {
1631059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            IoUtils.closeQuietly(reader);
164453dafa66372308fd5200f1749a2ef8e3e1846e9Jeff Sharkey            StrictMode.setThreadPolicy(savedPolicy);
1651059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        }
1661059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        return stats;
1671059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    }
1681059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
1691059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    public NetworkStats readNetworkStatsDetail() {
1701059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        return readNetworkStatsDetail(UID_ALL);
1711059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    }
1721059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
1731059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    /**
1741059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey     * Parse and return {@link NetworkStats} with UID-level details. Values
1751059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey     * monotonically increase since device boot.
1761059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey     *
1771059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey     * @throws IllegalStateException when problem parsing stats.
1781059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey     */
1791059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    public NetworkStats readNetworkStatsDetail(int limitUid) throws IllegalStateException {
180453dafa66372308fd5200f1749a2ef8e3e1846e9Jeff Sharkey        final StrictMode.ThreadPolicy savedPolicy = StrictMode.allowThreadDiskReads();
181453dafa66372308fd5200f1749a2ef8e3e1846e9Jeff Sharkey
1821059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        final NetworkStats stats = new NetworkStats(SystemClock.elapsedRealtime(), 24);
1831059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        final NetworkStats.Entry entry = new NetworkStats.Entry();
1841059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
185163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey        int idx = 1;
186163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey        int lastIdx = 1;
1871059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
188163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey        ProcFileReader reader = null;
1891059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        try {
190163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey            // open and consume header line
191163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey            reader = new ProcFileReader(new FileInputStream(mStatsXtUid));
192163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey            reader.finishLine();
1931059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
194163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey            while (reader.hasMoreData()) {
195163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                idx = reader.nextInt();
1961059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                if (idx != lastIdx + 1) {
1971059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                    throw new IllegalStateException(
1981059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                            "inconsistent idx=" + idx + " after lastIdx=" + lastIdx);
1991059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                }
2001059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                lastIdx = idx;
2011059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
202163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                entry.iface = reader.nextString();
203163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                entry.tag = kernelToTag(reader.nextString());
204163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                entry.uid = reader.nextInt();
205163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                entry.set = reader.nextInt();
206163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                entry.rxBytes = reader.nextLong();
207163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                entry.rxPackets = reader.nextLong();
208163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                entry.txBytes = reader.nextLong();
209163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                entry.txPackets = reader.nextLong();
2101059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
2111059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                if (limitUid == UID_ALL || limitUid == entry.uid) {
2121059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                    stats.addValues(entry);
2131059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                }
214163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey
215163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey                reader.finishLine();
2161059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            }
2171059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        } catch (NullPointerException e) {
218163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey            throw new IllegalStateException("problem parsing idx " + idx, e);
2191059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        } catch (NumberFormatException e) {
220163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey            throw new IllegalStateException("problem parsing idx " + idx, e);
2211059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        } catch (IOException e) {
222163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey            throw new IllegalStateException("problem parsing idx " + idx, e);
2231059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        } finally {
2241059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            IoUtils.closeQuietly(reader);
225453dafa66372308fd5200f1749a2ef8e3e1846e9Jeff Sharkey            StrictMode.setThreadPolicy(savedPolicy);
2261059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        }
227163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey
2281059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        return stats;
2291059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    }
2301059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey}
231