Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 47eb102b authored by Jeff Sharkey's avatar Jeff Sharkey
Browse files

Always splice historical data stats, debug info.

When reading network counters, always splice in xt_qtaguid values
to avoid counting backwards. Test to verify.

Remove verbose logging around global alerts, and add dumpsys debug
info for NMS and MDST. Also fix subtle bug around stats persisting
and dumping.

Bug: 5212893, 5211028
Change-Id: I783e5286637a67ee2dd2b09878198711a926d0cb
parent ed191e1f
Loading
Loading
Loading
Loading
+16 −4
Original line number Diff line number Diff line
@@ -43,6 +43,9 @@ import com.android.internal.telephony.Phone;
import com.android.internal.telephony.TelephonyIntents;
import com.android.internal.util.AsyncChannel;

import java.io.CharArrayWriter;
import java.io.PrintWriter;

/**
 * Track the state of mobile data connectivity. This is done by
 * receiving broadcast intents from the Phone process whenever
@@ -69,6 +72,11 @@ public class MobileDataStateTracker implements NetworkStateTracker {
    private boolean mPrivateDnsRouteSet = false;
    private boolean mDefaultRouteSet = false;

    // NOTE: these are only kept for debugging output; actual values are
    // maintained in DataConnectionTracker.
    protected boolean mUserDataEnabled = true;
    protected boolean mPolicyDataEnabled = true;

    private Handler mHandler;
    private AsyncChannel mDataConnectionTrackerAc;
    private Messenger mMessenger;
@@ -458,6 +466,7 @@ public class MobileDataStateTracker implements NetworkStateTracker {
        final AsyncChannel channel = mDataConnectionTrackerAc;
        if (channel != null) {
            channel.sendMessage(CMD_SET_USER_DATA_ENABLE, enabled ? ENABLED : DISABLED);
            mUserDataEnabled = enabled;
        }
        if (VDBG) log("setUserDataEnable: X enabled=" + enabled);
    }
@@ -468,6 +477,7 @@ public class MobileDataStateTracker implements NetworkStateTracker {
        final AsyncChannel channel = mDataConnectionTrackerAc;
        if (channel != null) {
            channel.sendMessage(CMD_SET_POLICY_DATA_ENABLE, enabled ? ENABLED : DISABLED);
            mPolicyDataEnabled = enabled;
        }
    }

@@ -492,10 +502,12 @@ public class MobileDataStateTracker implements NetworkStateTracker {

    @Override
    public String toString() {
        StringBuffer sb = new StringBuffer("Mobile data state: ");

        sb.append(mMobileDataState);
        return sb.toString();
        final CharArrayWriter writer = new CharArrayWriter();
        final PrintWriter pw = new PrintWriter(writer);
        pw.print("Mobile data state: "); pw.println(mMobileDataState);
        pw.print("Data enabled: user="); pw.print(mUserDataEnabled);
        pw.print(", policy="); pw.println(mPolicyDataEnabled);
        return writer.toString();
    }

   /**
+7 −1
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package android.net;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.SystemClock;
import android.util.Log;
import android.util.SparseBooleanArray;

import com.android.internal.util.Objects;
@@ -38,6 +39,8 @@ import java.util.HashSet;
 * @hide
 */
public class NetworkStats implements Parcelable {
    private static final String TAG = "NetworkStats";

    /** {@link #iface} value when interface details unavailable. */
    public static final String IFACE_ALL = null;
    /** {@link #uid} value when UID details unavailable. */
@@ -397,7 +400,10 @@ public class NetworkStats implements Parcelable {
                if (enforceMonotonic
                        && (entry.rxBytes < 0 || entry.rxPackets < 0 || entry.txBytes < 0
                                || entry.txPackets < 0 || entry.operations < 0)) {
                    throw new IllegalArgumentException("found non-monotonic values");
                    Log.v(TAG, "lhs=" + this);
                    Log.v(TAG, "rhs=" + value);
                    throw new IllegalArgumentException(
                            "found non-monotonic values at lhs[" + i + "] - rhs[" + j + "]");
                }
                if (clampNegative) {
                    entry.rxBytes = Math.max(0, entry.rxBytes);
+6 −6
Original line number Diff line number Diff line
@@ -482,12 +482,12 @@ public class NetworkStatsHistory implements Parcelable {
        for (int i = start; i < bucketCount; i++) {
            pw.print(prefix);
            pw.print("  bucketStart="); pw.print(bucketStart[i]);
            if (activeTime != null) pw.print(" activeTime="); pw.print(activeTime[i]);
            if (rxBytes != null) pw.print(" rxBytes="); pw.print(rxBytes[i]);
            if (rxPackets != null) pw.print(" rxPackets="); pw.print(rxPackets[i]);
            if (txBytes != null) pw.print(" txBytes="); pw.print(txBytes[i]);
            if (txPackets != null) pw.print(" txPackets="); pw.print(txPackets[i]);
            if (operations != null) pw.print(" operations="); pw.print(operations[i]);
            if (activeTime != null) { pw.print(" activeTime="); pw.print(activeTime[i]); }
            if (rxBytes != null) { pw.print(" rxBytes="); pw.print(rxBytes[i]); }
            if (rxPackets != null) { pw.print(" rxPackets="); pw.print(rxPackets[i]); }
            if (txBytes != null) { pw.print(" txBytes="); pw.print(txBytes[i]); }
            if (txPackets != null) { pw.print(" txPackets="); pw.print(txPackets[i]); }
            if (operations != null) { pw.print(" operations="); pw.print(operations[i]); }
            pw.println();
        }
    }
+28 −13
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.server;

import static android.Manifest.permission.DUMP;
import static android.Manifest.permission.MANAGE_NETWORK_POLICY;
import static android.net.NetworkStats.IFACE_ALL;
import static android.net.NetworkStats.SET_DEFAULT;
@@ -51,10 +52,12 @@ import com.google.android.collect.Sets;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.util.ArrayList;
@@ -288,7 +291,6 @@ public class NetworkManagementService extends INetworkManagementService.Stub
        for (INetworkManagementEventObserver obs : mObservers) {
            try {
                obs.limitReached(limitName, iface);
                Slog.d(TAG, "Observer notified limit reached for " + limitName + " " + iface);
            } catch (Exception ex) {
                Slog.w(TAG, "Observer notifier failed", ex);
            }
@@ -1031,7 +1033,6 @@ public class NetworkManagementService extends INetworkManagementService.Stub
        final NetworkStats stats = new NetworkStats(SystemClock.elapsedRealtime(), 6);
        final NetworkStats.Entry entry = new NetworkStats.Entry();

        final HashSet<String> activeIfaces = Sets.newHashSet();
        final ArrayList<String> values = Lists.newArrayList();

        BufferedReader reader = null;
@@ -1057,7 +1058,6 @@ public class NetworkManagementService extends INetworkManagementService.Stub
                    entry.txBytes = Long.parseLong(values.get(9));
                    entry.txPackets = Long.parseLong(values.get(10));

                    activeIfaces.add(entry.iface);
                    stats.addValues(entry);
                } catch (NumberFormatException e) {
                    Slog.w(TAG, "problem parsing stats row '" + line + "': " + e);
@@ -1073,14 +1073,9 @@ public class NetworkManagementService extends INetworkManagementService.Stub
            IoUtils.closeQuietly(reader);
        }

        if (DBG) Slog.d(TAG, "recorded active stats from " + activeIfaces);

        // splice in stats from any disabled ifaces
        // splice in historical stats not reflected in mStatsIface
        if (mBandwidthControlEnabled) {
            final HashSet<String> xtIfaces = Sets.newHashSet(fileListWithoutNull(mStatsXtIface));
            xtIfaces.removeAll(activeIfaces);

            for (String iface : xtIfaces) {
            for (String iface : fileListWithoutNull(mStatsXtIface)) {
                final File ifacePath = new File(mStatsXtIface, iface);

                entry.iface = iface;
@@ -1092,10 +1087,8 @@ public class NetworkManagementService extends INetworkManagementService.Stub
                entry.txBytes = readSingleLongFromFile(new File(ifacePath, "tx_bytes"));
                entry.txPackets = readSingleLongFromFile(new File(ifacePath, "tx_packets"));

                stats.addValues(entry);
                stats.combineValues(entry);
            }

            if (DBG) Slog.d(TAG, "recorded stale stats from " + xtIfaces);
        }

        return stats;
@@ -1583,4 +1576,26 @@ public class NetworkManagementService extends INetworkManagementService.Stub
            mConnector.monitor();
        }
    }

    @Override
    protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
        mContext.enforceCallingOrSelfPermission(DUMP, TAG);

        pw.print("Bandwidth control enabled: "); pw.println(mBandwidthControlEnabled);

        synchronized (mQuotaLock) {
            pw.print("Active quota ifaces: "); pw.println(mActiveQuotaIfaces.toString());
            pw.print("Active alert ifaces: "); pw.println(mActiveAlertIfaces.toString());
        }

        synchronized (mUidRejectOnQuota) {
            pw.print("UID reject on quota ifaces: [");
            final int size = mUidRejectOnQuota.size();
            for (int i = 0; i < size; i++) {
                pw.print(mUidRejectOnQuota.keyAt(i));
                if (i < size - 1) pw.print(",");
            }
            pw.println("]");
        }
    }
}
+4 −5
Original line number Diff line number Diff line
@@ -133,6 +133,7 @@ import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;

import libcore.io.IoUtils;

@@ -766,9 +767,6 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
                    && totalBytes > policy.limitBytes && policy.lastSnooze < start;
            final boolean enabled = !overLimit;

            if (LOGD) {
                Slog.d(TAG, "setting template=" + policy.template + " enabled=" + enabled);
            }
            setNetworkTemplateEnabled(policy.template, enabled);
        }
    }
@@ -835,9 +833,10 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {

            // collect all active ifaces that match this template
            ifaceList.clear();
            for (NetworkIdentity ident : networks.keySet()) {
            for (Map.Entry<NetworkIdentity, String> entry : networks.entrySet()) {
                final NetworkIdentity ident = entry.getKey();
                if (policy.template.matches(ident)) {
                    final String iface = networks.get(ident);
                    final String iface = entry.getValue();
                    ifaceList.add(iface);
                }
            }
Loading