Snap for 5180536 from 1fc6d8adf1 to pi-platform-release

Change-Id: I7c5a9c9e96572c32eadd97448c4886f9c9150a19
This commit is contained in:
android-build-team Robot
2019-02-09 02:33:11 +00:00
4 changed files with 49 additions and 27 deletions

View File

@@ -776,14 +776,19 @@ public class NetworkStats implements Parcelable {
* packet needs to be subtracted from the root UID on the base interface both for tx * packet needs to be subtracted from the root UID on the base interface both for tx
* and rx traffic (http://b/12249687, http:/b/33681750). * and rx traffic (http://b/12249687, http:/b/33681750).
* *
* As for eBPF, the per uid stats is collected by different hook, the rx packets on base
* interface will not be counted. Thus, the adjustment on root uid is only needed in tx
* direction.
*
* <p>This method will behave fine if {@code stackedIfaces} is an non-synchronized but add-only * <p>This method will behave fine if {@code stackedIfaces} is an non-synchronized but add-only
* {@code ConcurrentHashMap} * {@code ConcurrentHashMap}
* @param baseTraffic Traffic on the base interfaces. Will be mutated. * @param baseTraffic Traffic on the base interfaces. Will be mutated.
* @param stackedTraffic Stats with traffic stacked on top of our ifaces. Will also be mutated. * @param stackedTraffic Stats with traffic stacked on top of our ifaces. Will also be mutated.
* @param stackedIfaces Mapping ipv6if -> ipv4if interface where traffic is counted on both. * @param stackedIfaces Mapping ipv6if -> ipv4if interface where traffic is counted on both.
* @param useBpfStats True if eBPF is in use.
*/ */
public static void apply464xlatAdjustments(NetworkStats baseTraffic, public static void apply464xlatAdjustments(NetworkStats baseTraffic,
NetworkStats stackedTraffic, Map<String, String> stackedIfaces) { NetworkStats stackedTraffic, Map<String, String> stackedIfaces, boolean useBpfStats) {
// Total 464xlat traffic to subtract from uid 0 on all base interfaces. // Total 464xlat traffic to subtract from uid 0 on all base interfaces.
// stackedIfaces may grow afterwards, but NetworkStats will just be resized automatically. // stackedIfaces may grow afterwards, but NetworkStats will just be resized automatically.
final NetworkStats adjustments = new NetworkStats(0, stackedIfaces.size()); final NetworkStats adjustments = new NetworkStats(0, stackedIfaces.size());
@@ -802,15 +807,20 @@ public class NetworkStats implements Parcelable {
continue; continue;
} }
// Subtract any 464lat traffic seen for the root UID on the current base interface. // Subtract any 464lat traffic seen for the root UID on the current base interface.
// However, for eBPF, the per uid stats is collected by different hook, the rx packets
// on base interface will not be counted. Thus, the adjustment on root uid is only
// needed in tx direction.
adjust.iface = baseIface; adjust.iface = baseIface;
if (!useBpfStats) {
adjust.rxBytes = -(entry.rxBytes + entry.rxPackets * IPV4V6_HEADER_DELTA); adjust.rxBytes = -(entry.rxBytes + entry.rxPackets * IPV4V6_HEADER_DELTA);
adjust.txBytes = -(entry.txBytes + entry.txPackets * IPV4V6_HEADER_DELTA);
adjust.rxPackets = -entry.rxPackets; adjust.rxPackets = -entry.rxPackets;
}
adjust.txBytes = -(entry.txBytes + entry.txPackets * IPV4V6_HEADER_DELTA);
adjust.txPackets = -entry.txPackets; adjust.txPackets = -entry.txPackets;
adjustments.combineValues(adjust); adjustments.combineValues(adjust);
// For 464xlat traffic, xt_qtaguid only counts the bytes of the native IPv4 packet sent // For 464xlat traffic, per uid stats only counts the bytes of the native IPv4 packet
// on the stacked interface with prefix "v4-" and drops the IPv6 header size after // sent on the stacked interface with prefix "v4-" and drops the IPv6 header size after
// unwrapping. To account correctly for on-the-wire traffic, add the 20 additional bytes // unwrapping. To account correctly for on-the-wire traffic, add the 20 additional bytes
// difference for all packets (http://b/12249687, http:/b/33681750). // difference for all packets (http://b/12249687, http:/b/33681750).
entry.rxBytes += entry.rxPackets * IPV4V6_HEADER_DELTA; entry.rxBytes += entry.rxPackets * IPV4V6_HEADER_DELTA;
@@ -829,8 +839,8 @@ public class NetworkStats implements Parcelable {
* base and stacked traffic. * base and stacked traffic.
* @param stackedIfaces Mapping ipv6if -> ipv4if interface where traffic is counted on both. * @param stackedIfaces Mapping ipv6if -> ipv4if interface where traffic is counted on both.
*/ */
public void apply464xlatAdjustments(Map<String, String> stackedIfaces) { public void apply464xlatAdjustments(Map<String, String> stackedIfaces, boolean useBpfStats) {
apply464xlatAdjustments(this, this, stackedIfaces); apply464xlatAdjustments(this, this, stackedIfaces, useBpfStats);
} }
/** /**

View File

@@ -113,11 +113,12 @@ public class NetworkStatsFactory {
/** /**
* Applies 464xlat adjustments with ifaces noted with {@link #noteStackedIface(String, String)}. * Applies 464xlat adjustments with ifaces noted with {@link #noteStackedIface(String, String)}.
* @see NetworkStats#apply464xlatAdjustments(NetworkStats, NetworkStats, Map) * @see NetworkStats#apply464xlatAdjustments(NetworkStats, NetworkStats, Map, boolean)
*/ */
public static void apply464xlatAdjustments(NetworkStats baseTraffic, public static void apply464xlatAdjustments(NetworkStats baseTraffic,
NetworkStats stackedTraffic) { NetworkStats stackedTraffic, boolean useBpfStats) {
NetworkStats.apply464xlatAdjustments(baseTraffic, stackedTraffic, sStackedIfaces); NetworkStats.apply464xlatAdjustments(baseTraffic, stackedTraffic, sStackedIfaces,
useBpfStats);
} }
@VisibleForTesting @VisibleForTesting
@@ -263,7 +264,7 @@ public class NetworkStatsFactory {
// No locking here: apply464xlatAdjustments behaves fine with an add-only ConcurrentHashMap. // No locking here: apply464xlatAdjustments behaves fine with an add-only ConcurrentHashMap.
// TODO: remove this and only apply adjustments in NetworkStatsService. // TODO: remove this and only apply adjustments in NetworkStatsService.
stats.apply464xlatAdjustments(sStackedIfaces); stats.apply464xlatAdjustments(sStackedIfaces, mUseBpfStats);
return stats; return stats;
} }

View File

@@ -175,7 +175,7 @@ static int legacyReadNetworkStatsDetail(std::vector<stats_line>* lines,
} }
} }
s.tag = rawTag >> 32; s.tag = rawTag >> 32;
if (limitTag != -1 && s.tag != limitTag) { if (limitTag != -1 && s.tag != static_cast<uint32_t>(limitTag)) {
//ALOGI("skipping due to tag: %s", buffer); //ALOGI("skipping due to tag: %s", buffer);
continue; continue;
} }
@@ -188,7 +188,7 @@ static int legacyReadNetworkStatsDetail(std::vector<stats_line>* lines,
if (sscanf(pos, "%u %u %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64, if (sscanf(pos, "%u %u %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64,
&s.uid, &s.set, &s.rxBytes, &s.rxPackets, &s.uid, &s.set, &s.rxBytes, &s.rxPackets,
&s.txBytes, &s.txPackets) == 6) { &s.txBytes, &s.txPackets) == 6) {
if (limitUid != -1 && limitUid != s.uid) { if (limitUid != -1 && static_cast<uint32_t>(limitUid) != s.uid) {
//ALOGI("skipping due to uid: %s", buffer); //ALOGI("skipping due to uid: %s", buffer);
continue; continue;
} }

View File

@@ -159,9 +159,11 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
static final boolean LOGD = Log.isLoggable(TAG, Log.DEBUG); static final boolean LOGD = Log.isLoggable(TAG, Log.DEBUG);
static final boolean LOGV = Log.isLoggable(TAG, Log.VERBOSE); static final boolean LOGV = Log.isLoggable(TAG, Log.VERBOSE);
// Perform polling and persist all (FLAG_PERSIST_ALL).
private static final int MSG_PERFORM_POLL = 1; private static final int MSG_PERFORM_POLL = 1;
private static final int MSG_UPDATE_IFACES = 2; private static final int MSG_UPDATE_IFACES = 2;
private static final int MSG_REGISTER_GLOBAL_ALERT = 3; // Perform polling, persist network, and register the global alert again.
private static final int MSG_PERFORM_POLL_REGISTER_ALERT = 3;
/** Flags to control detail level of poll event. */ /** Flags to control detail level of poll event. */
private static final int FLAG_PERSIST_NETWORK = 0x1; private static final int FLAG_PERSIST_NETWORK = 0x1;
@@ -169,6 +171,14 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
private static final int FLAG_PERSIST_ALL = FLAG_PERSIST_NETWORK | FLAG_PERSIST_UID; private static final int FLAG_PERSIST_ALL = FLAG_PERSIST_NETWORK | FLAG_PERSIST_UID;
private static final int FLAG_PERSIST_FORCE = 0x100; private static final int FLAG_PERSIST_FORCE = 0x100;
/**
* When global alert quota is high, wait for this delay before processing each polling,
* and do not schedule further polls once there is already one queued.
* This avoids firing the global alert too often on devices with high transfer speeds and
* high quota.
*/
private static final int PERFORM_POLL_DELAY_MS = 1000;
private static final String TAG_NETSTATS_ERROR = "netstats_error"; private static final String TAG_NETSTATS_ERROR = "netstats_error";
private final Context mContext; private final Context mContext;
@@ -916,7 +926,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
} }
// Create baseline stats // Create baseline stats
mHandler.sendMessage(mHandler.obtainMessage(MSG_PERFORM_POLL, FLAG_PERSIST_ALL)); mHandler.sendMessage(mHandler.obtainMessage(MSG_PERFORM_POLL));
return normalizedRequest; return normalizedRequest;
} }
@@ -1057,13 +1067,12 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG);
if (LIMIT_GLOBAL_ALERT.equals(limitName)) { if (LIMIT_GLOBAL_ALERT.equals(limitName)) {
// kick off background poll to collect network stats; UID stats // kick off background poll to collect network stats unless there is already
// are handled during normal polling interval. // such a call pending; UID stats are handled during normal polling interval.
final int flags = FLAG_PERSIST_NETWORK; if (!mHandler.hasMessages(MSG_PERFORM_POLL_REGISTER_ALERT)) {
mHandler.obtainMessage(MSG_PERFORM_POLL, flags, 0).sendToTarget(); mHandler.sendEmptyMessageDelayed(MSG_PERFORM_POLL_REGISTER_ALERT,
PERFORM_POLL_DELAY_MS);
// re-arm global alert for next update }
mHandler.obtainMessage(MSG_REGISTER_GLOBAL_ALERT).sendToTarget();
} }
} }
}; };
@@ -1613,7 +1622,8 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
// fold tethering stats and operations into uid snapshot // fold tethering stats and operations into uid snapshot
final NetworkStats tetherSnapshot = getNetworkStatsTethering(STATS_PER_UID); final NetworkStats tetherSnapshot = getNetworkStatsTethering(STATS_PER_UID);
tetherSnapshot.filter(UID_ALL, ifaces, TAG_ALL); tetherSnapshot.filter(UID_ALL, ifaces, TAG_ALL);
NetworkStatsFactory.apply464xlatAdjustments(uidSnapshot, tetherSnapshot); NetworkStatsFactory.apply464xlatAdjustments(uidSnapshot, tetherSnapshot,
mUseBpfTrafficStats);
uidSnapshot.combineAllValues(tetherSnapshot); uidSnapshot.combineAllValues(tetherSnapshot);
final TelephonyManager telephonyManager = (TelephonyManager) mContext.getSystemService( final TelephonyManager telephonyManager = (TelephonyManager) mContext.getSystemService(
@@ -1623,7 +1633,8 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
final NetworkStats vtStats = telephonyManager.getVtDataUsage(STATS_PER_UID); final NetworkStats vtStats = telephonyManager.getVtDataUsage(STATS_PER_UID);
if (vtStats != null) { if (vtStats != null) {
vtStats.filter(UID_ALL, ifaces, TAG_ALL); vtStats.filter(UID_ALL, ifaces, TAG_ALL);
NetworkStatsFactory.apply464xlatAdjustments(uidSnapshot, vtStats); NetworkStatsFactory.apply464xlatAdjustments(uidSnapshot, vtStats,
mUseBpfTrafficStats);
uidSnapshot.combineAllValues(vtStats); uidSnapshot.combineAllValues(vtStats);
} }
@@ -1675,15 +1686,15 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
public boolean handleMessage(Message msg) { public boolean handleMessage(Message msg) {
switch (msg.what) { switch (msg.what) {
case MSG_PERFORM_POLL: { case MSG_PERFORM_POLL: {
final int flags = msg.arg1; mService.performPoll(FLAG_PERSIST_ALL);
mService.performPoll(flags);
return true; return true;
} }
case MSG_UPDATE_IFACES: { case MSG_UPDATE_IFACES: {
mService.updateIfaces(null); mService.updateIfaces(null);
return true; return true;
} }
case MSG_REGISTER_GLOBAL_ALERT: { case MSG_PERFORM_POLL_REGISTER_ALERT: {
mService.performPoll(FLAG_PERSIST_NETWORK);
mService.registerGlobalAlert(); mService.registerGlobalAlert();
return true; return true;
} }