Search in sources :

Example 81 with NetworkStats

use of android.net.NetworkStats in project android_frameworks_base by DirtyUnicorns.

the class NetworkStatsServiceTest method assertNetworkTotal.

private void assertNetworkTotal(NetworkTemplate template, long start, long end, long rxBytes, long rxPackets, long txBytes, long txPackets, int operations) throws Exception {
    // verify history API
    final NetworkStatsHistory history = mSession.getHistoryForNetwork(template, FIELD_ALL);
    assertValues(history, start, end, rxBytes, rxPackets, txBytes, txPackets, operations);
    // verify summary API
    final NetworkStats stats = mSession.getSummaryForNetwork(template, start, end);
    assertValues(stats, IFACE_ALL, UID_ALL, SET_DEFAULT, TAG_NONE, ROAMING_NO, rxBytes, rxPackets, txBytes, txPackets, operations);
}
Also used : NetworkStats(android.net.NetworkStats) NetworkStatsHistory(android.net.NetworkStatsHistory)

Example 82 with NetworkStats

use of android.net.NetworkStats in project android_frameworks_base by DirtyUnicorns.

the class NetworkStatsFactory method readNetworkStatsSummaryDev.

/**
     * Parse and return interface-level summary {@link NetworkStats} measured
     * using {@code /proc/net/dev} style hooks, which may include non IP layer
     * traffic. Values monotonically increase since device boot, and may include
     * details about inactive interfaces.
     *
     * @throws IllegalStateException when problem parsing stats.
     */
public NetworkStats readNetworkStatsSummaryDev() throws IOException {
    final StrictMode.ThreadPolicy savedPolicy = StrictMode.allowThreadDiskReads();
    final NetworkStats stats = new NetworkStats(SystemClock.elapsedRealtime(), 6);
    final NetworkStats.Entry entry = new NetworkStats.Entry();
    ProcFileReader reader = null;
    try {
        reader = new ProcFileReader(new FileInputStream(mStatsXtIfaceAll));
        while (reader.hasMoreData()) {
            entry.iface = reader.nextString();
            entry.uid = UID_ALL;
            entry.set = SET_ALL;
            entry.tag = TAG_NONE;
            final boolean active = reader.nextInt() != 0;
            // always include snapshot values
            entry.rxBytes = reader.nextLong();
            entry.rxPackets = reader.nextLong();
            entry.txBytes = reader.nextLong();
            entry.txPackets = reader.nextLong();
            // fold in active numbers, but only when active
            if (active) {
                entry.rxBytes += reader.nextLong();
                entry.rxPackets += reader.nextLong();
                entry.txBytes += reader.nextLong();
                entry.txPackets += reader.nextLong();
            }
            stats.addValues(entry);
            reader.finishLine();
        }
    } catch (NullPointerException e) {
        throw new ProtocolException("problem parsing stats", e);
    } catch (NumberFormatException e) {
        throw new ProtocolException("problem parsing stats", e);
    } finally {
        IoUtils.closeQuietly(reader);
        StrictMode.setThreadPolicy(savedPolicy);
    }
    return stats;
}
Also used : StrictMode(android.os.StrictMode) ProcFileReader(com.android.internal.util.ProcFileReader) ProtocolException(java.net.ProtocolException) NetworkStats(android.net.NetworkStats) FileInputStream(java.io.FileInputStream)

Example 83 with NetworkStats

use of android.net.NetworkStats in project android_frameworks_base by DirtyUnicorns.

the class NetworkStatsFactory method javaReadNetworkStatsDetail.

/**
     * Parse and return {@link NetworkStats} with UID-level details. Values are
     * expected to monotonically increase since device boot.
     */
@VisibleForTesting
public static NetworkStats javaReadNetworkStatsDetail(File detailPath, int limitUid, String[] limitIfaces, int limitTag) throws IOException {
    final StrictMode.ThreadPolicy savedPolicy = StrictMode.allowThreadDiskReads();
    final NetworkStats stats = new NetworkStats(SystemClock.elapsedRealtime(), 24);
    final NetworkStats.Entry entry = new NetworkStats.Entry();
    int idx = 1;
    int lastIdx = 1;
    ProcFileReader reader = null;
    try {
        // open and consume header line
        reader = new ProcFileReader(new FileInputStream(detailPath));
        reader.finishLine();
        while (reader.hasMoreData()) {
            idx = reader.nextInt();
            if (idx != lastIdx + 1) {
                throw new ProtocolException("inconsistent idx=" + idx + " after lastIdx=" + lastIdx);
            }
            lastIdx = idx;
            entry.iface = reader.nextString();
            entry.tag = kernelToTag(reader.nextString());
            entry.uid = reader.nextInt();
            entry.set = reader.nextInt();
            entry.rxBytes = reader.nextLong();
            entry.rxPackets = reader.nextLong();
            entry.txBytes = reader.nextLong();
            entry.txPackets = reader.nextLong();
            if ((limitIfaces == null || ArrayUtils.contains(limitIfaces, entry.iface)) && (limitUid == UID_ALL || limitUid == entry.uid) && (limitTag == TAG_ALL || limitTag == entry.tag)) {
                stats.addValues(entry);
            }
            reader.finishLine();
        }
    } catch (NullPointerException e) {
        throw new ProtocolException("problem parsing idx " + idx, e);
    } catch (NumberFormatException e) {
        throw new ProtocolException("problem parsing idx " + idx, e);
    } finally {
        IoUtils.closeQuietly(reader);
        StrictMode.setThreadPolicy(savedPolicy);
    }
    return stats;
}
Also used : StrictMode(android.os.StrictMode) ProcFileReader(com.android.internal.util.ProcFileReader) ProtocolException(java.net.ProtocolException) NetworkStats(android.net.NetworkStats) FileInputStream(java.io.FileInputStream) VisibleForTesting(com.android.internal.annotations.VisibleForTesting)

Example 84 with NetworkStats

use of android.net.NetworkStats in project android_frameworks_base by DirtyUnicorns.

the class NetworkStatsFactory method readNetworkStatsDetail.

public NetworkStats readNetworkStatsDetail(int limitUid, String[] limitIfaces, int limitTag, NetworkStats lastStats) throws IOException {
    final NetworkStats stats = readNetworkStatsDetailInternal(limitUid, limitIfaces, limitTag, lastStats);
    synchronized (sStackedIfaces) {
        // Sigh, xt_qtaguid ends up double-counting tx traffic going through
        // clatd interfaces, so we need to subtract it here.
        final int size = sStackedIfaces.size();
        for (int i = 0; i < size; i++) {
            final String stackedIface = sStackedIfaces.keyAt(i);
            final String baseIface = sStackedIfaces.valueAt(i);
            // Count up the tx traffic and subtract from root UID on the
            // base interface.
            NetworkStats.Entry adjust = new NetworkStats.Entry(baseIface, 0, 0, 0, 0L, 0L, 0L, 0L, 0L);
            NetworkStats.Entry entry = null;
            for (int j = 0; j < stats.size(); j++) {
                entry = stats.getValues(j, entry);
                if (Objects.equals(entry.iface, stackedIface)) {
                    adjust.txBytes -= entry.txBytes;
                    adjust.txPackets -= entry.txPackets;
                }
            }
            stats.combineValues(adjust);
        }
    }
    // Double sigh, all rx traffic on clat needs to be tweaked to
    // account for the dropped IPv6 header size post-unwrap.
    NetworkStats.Entry entry = null;
    for (int i = 0; i < stats.size(); i++) {
        entry = stats.getValues(i, entry);
        if (entry.iface != null && entry.iface.startsWith("clat")) {
            // Delta between IPv4 header (20b) and IPv6 header (40b)
            entry.rxBytes = entry.rxPackets * 20;
            entry.rxPackets = 0;
            entry.txBytes = 0;
            entry.txPackets = 0;
            stats.combineValues(entry);
        }
    }
    return stats;
}
Also used : NetworkStats(android.net.NetworkStats)

Example 85 with NetworkStats

use of android.net.NetworkStats in project android_frameworks_base by DirtyUnicorns.

the class NetworkStatsRecorder method recordSnapshotLocked.

/**
     * Record any delta that occurred since last {@link NetworkStats} snapshot,
     * using the given {@link Map} to identify network interfaces. First
     * snapshot is considered bootstrap, and is not counted as delta.
     *
     * @param vpnArray Optional info about the currently active VPN, if any. This is used to
     *                 redistribute traffic from the VPN app to the underlying responsible apps.
     *                 This should always be set to null if the provided snapshot is aggregated
     *                 across all UIDs (e.g. contains UID_ALL buckets), regardless of VPN state.
     */
public void recordSnapshotLocked(NetworkStats snapshot, Map<String, NetworkIdentitySet> ifaceIdent, @Nullable VpnInfo[] vpnArray, long currentTimeMillis) {
    final HashSet<String> unknownIfaces = Sets.newHashSet();
    // skip recording when snapshot missing
    if (snapshot == null)
        return;
    // assume first snapshot is bootstrap and don't record
    if (mLastSnapshot == null) {
        mLastSnapshot = snapshot;
        return;
    }
    final NetworkStatsCollection complete = mComplete != null ? mComplete.get() : null;
    final NetworkStats delta = NetworkStats.subtract(snapshot, mLastSnapshot, mObserver, mCookie);
    final long end = currentTimeMillis;
    final long start = end - delta.getElapsedRealtime();
    if (vpnArray != null) {
        for (VpnInfo info : vpnArray) {
            delta.migrateTun(info.ownerUid, info.vpnIface, info.primaryUnderlyingIface);
        }
    }
    NetworkStats.Entry entry = null;
    for (int i = 0; i < delta.size(); i++) {
        entry = delta.getValues(i, entry);
        final NetworkIdentitySet ident = ifaceIdent.get(entry.iface);
        if (ident == null) {
            unknownIfaces.add(entry.iface);
            continue;
        }
        // skip when no delta occurred
        if (entry.isEmpty())
            continue;
        // only record tag data when requested
        if ((entry.tag == TAG_NONE) != mOnlyTags) {
            if (mPending != null) {
                mPending.recordData(ident, entry.uid, entry.set, entry.tag, start, end, entry);
            }
            // also record against boot stats when present
            if (mSinceBoot != null) {
                mSinceBoot.recordData(ident, entry.uid, entry.set, entry.tag, start, end, entry);
            }
            // also record against complete dataset when present
            if (complete != null) {
                complete.recordData(ident, entry.uid, entry.set, entry.tag, start, end, entry);
            }
        }
    }
    mLastSnapshot = snapshot;
    if (LOGV && unknownIfaces.size() > 0) {
        Slog.w(TAG, "unknown interfaces " + unknownIfaces + ", ignoring those stats");
    }
}
Also used : VpnInfo(com.android.internal.net.VpnInfo) NetworkStats(android.net.NetworkStats)

Aggregations

NetworkStats (android.net.NetworkStats)271 File (java.io.File)49 DataUsageRequest (android.net.DataUsageRequest)32 Intent (android.content.Intent)29 NetworkIdentity (android.net.NetworkIdentity)28 NetworkStatsHistory (android.net.NetworkStatsHistory)21 Bundle (android.os.Bundle)18 StrictMode (android.os.StrictMode)18 ProcFileReader (com.android.internal.util.ProcFileReader)18 FileInputStream (java.io.FileInputStream)18 ProtocolException (java.net.ProtocolException)18 PendingIntent (android.app.PendingIntent)17 IOException (java.io.IOException)17 NetworkPolicy (android.net.NetworkPolicy)15 NetworkState (android.net.NetworkState)15 Test (org.junit.Test)14 Suppress (android.test.suitebuilder.annotation.Suppress)13 VpnInfo (com.android.internal.net.VpnInfo)10 RemoteException (android.os.RemoteException)8 NetworkTemplate (android.net.NetworkTemplate)6