Merge "Add getters to UnderlyingNetworkInfo" am: 32dd7f465d am: 2c04e5abb9

Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1684651

Change-Id: I33d2bbca5a72ab8500a7886073c9f4c4d1b84925
This commit is contained in:
Treehugger Robot
2021-04-29 08:57:50 +00:00
committed by Automerger Merge Worker
3 changed files with 58 additions and 37 deletions

View File

@@ -38,6 +38,7 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.function.Predicate; import java.util.function.Predicate;
@@ -1423,11 +1424,11 @@ public final class NetworkStats implements Parcelable {
* @hide * @hide
*/ */
public void migrateTun(int tunUid, @NonNull String tunIface, public void migrateTun(int tunUid, @NonNull String tunIface,
@NonNull String[] underlyingIfaces) { @NonNull List<String> underlyingIfaces) {
// Combined usage by all apps using VPN. // Combined usage by all apps using VPN.
final Entry tunIfaceTotal = new Entry(); final Entry tunIfaceTotal = new Entry();
// Usage by VPN, grouped by its {@code underlyingIfaces}. // Usage by VPN, grouped by its {@code underlyingIfaces}.
final Entry[] perInterfaceTotal = new Entry[underlyingIfaces.length]; final Entry[] perInterfaceTotal = new Entry[underlyingIfaces.size()];
// Usage by VPN, summed across all its {@code underlyingIfaces}. // Usage by VPN, summed across all its {@code underlyingIfaces}.
final Entry underlyingIfacesTotal = new Entry(); final Entry underlyingIfacesTotal = new Entry();
@@ -1468,7 +1469,7 @@ public final class NetworkStats implements Parcelable {
* {@code underlyingIfaces} * {@code underlyingIfaces}
*/ */
private void tunAdjustmentInit(int tunUid, @NonNull String tunIface, private void tunAdjustmentInit(int tunUid, @NonNull String tunIface,
@NonNull String[] underlyingIfaces, @NonNull Entry tunIfaceTotal, @NonNull List<String> underlyingIfaces, @NonNull Entry tunIfaceTotal,
@NonNull Entry[] perInterfaceTotal, @NonNull Entry underlyingIfacesTotal) { @NonNull Entry[] perInterfaceTotal, @NonNull Entry underlyingIfacesTotal) {
final Entry recycle = new Entry(); final Entry recycle = new Entry();
for (int i = 0; i < size; i++) { for (int i = 0; i < size; i++) {
@@ -1488,8 +1489,8 @@ public final class NetworkStats implements Parcelable {
if (recycle.uid == tunUid) { if (recycle.uid == tunUid) {
// Add up traffic through tunUid's underlying interfaces. // Add up traffic through tunUid's underlying interfaces.
for (int j = 0; j < underlyingIfaces.length; j++) { for (int j = 0; j < underlyingIfaces.size(); j++) {
if (Objects.equals(underlyingIfaces[j], recycle.iface)) { if (Objects.equals(underlyingIfaces.get(j), recycle.iface)) {
perInterfaceTotal[j].add(recycle); perInterfaceTotal[j].add(recycle);
underlyingIfacesTotal.add(recycle); underlyingIfacesTotal.add(recycle);
break; break;
@@ -1515,12 +1516,12 @@ public final class NetworkStats implements Parcelable {
* underlyingIfaces} * underlyingIfaces}
*/ */
private Entry[] addTrafficToApplications(int tunUid, @NonNull String tunIface, private Entry[] addTrafficToApplications(int tunUid, @NonNull String tunIface,
@NonNull String[] underlyingIfaces, @NonNull Entry tunIfaceTotal, @NonNull List<String> underlyingIfaces, @NonNull Entry tunIfaceTotal,
@NonNull Entry[] perInterfaceTotal, @NonNull Entry underlyingIfacesTotal) { @NonNull Entry[] perInterfaceTotal, @NonNull Entry underlyingIfacesTotal) {
// Traffic that should be moved off of each underlying interface for tunUid (see // Traffic that should be moved off of each underlying interface for tunUid (see
// deductTrafficFromVpnApp below). // deductTrafficFromVpnApp below).
final Entry[] moved = new Entry[underlyingIfaces.length]; final Entry[] moved = new Entry[underlyingIfaces.size()];
for (int i = 0; i < underlyingIfaces.length; i++) { for (int i = 0; i < underlyingIfaces.size(); i++) {
moved[i] = new Entry(); moved[i] = new Entry();
} }
@@ -1582,8 +1583,8 @@ public final class NetworkStats implements Parcelable {
} }
// In a second pass, distribute these values across interfaces in the proportion that // In a second pass, distribute these values across interfaces in the proportion that
// each interface represents of the total traffic of the underlying interfaces. // each interface represents of the total traffic of the underlying interfaces.
for (int j = 0; j < underlyingIfaces.length; j++) { for (int j = 0; j < underlyingIfaces.size(); j++) {
tmpEntry.iface = underlyingIfaces[j]; tmpEntry.iface = underlyingIfaces.get(j);
tmpEntry.rxBytes = 0; tmpEntry.rxBytes = 0;
// Reset 'set' to correct value since it gets updated when adding debug info below. // Reset 'set' to correct value since it gets updated when adding debug info below.
tmpEntry.set = set[i]; tmpEntry.set = set[i];
@@ -1638,14 +1639,14 @@ public final class NetworkStats implements Parcelable {
private void deductTrafficFromVpnApp( private void deductTrafficFromVpnApp(
int tunUid, int tunUid,
@NonNull String[] underlyingIfaces, @NonNull List<String> underlyingIfaces,
@NonNull Entry[] moved) { @NonNull Entry[] moved) {
for (int i = 0; i < underlyingIfaces.length; i++) { for (int i = 0; i < underlyingIfaces.size(); i++) {
moved[i].uid = tunUid; moved[i].uid = tunUid;
// Add debug info // Add debug info
moved[i].set = SET_DBG_VPN_OUT; moved[i].set = SET_DBG_VPN_OUT;
moved[i].tag = TAG_NONE; moved[i].tag = TAG_NONE;
moved[i].iface = underlyingIfaces[i]; moved[i].iface = underlyingIfaces.get(i);
moved[i].metered = METERED_ALL; moved[i].metered = METERED_ALL;
moved[i].roaming = ROAMING_ALL; moved[i].roaming = ROAMING_ALL;
moved[i].defaultNetwork = DEFAULT_NETWORK_ALL; moved[i].defaultNetwork = DEFAULT_NETWORK_ALL;
@@ -1658,7 +1659,7 @@ public final class NetworkStats implements Parcelable {
// METERED_NO, which should be the case as it comes directly from the /proc file. // METERED_NO, which should be the case as it comes directly from the /proc file.
// We only blend in the roaming data after applying these adjustments, by checking the // We only blend in the roaming data after applying these adjustments, by checking the
// NetworkIdentity of the underlying iface. // NetworkIdentity of the underlying iface.
final int idxVpnBackground = findIndex(underlyingIfaces[i], tunUid, SET_DEFAULT, final int idxVpnBackground = findIndex(underlyingIfaces.get(i), tunUid, SET_DEFAULT,
TAG_NONE, METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO); TAG_NONE, METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO);
if (idxVpnBackground != -1) { if (idxVpnBackground != -1) {
// Note - tunSubtract also updates moved[i]; whatever traffic that's left is removed // Note - tunSubtract also updates moved[i]; whatever traffic that's left is removed
@@ -1666,7 +1667,7 @@ public final class NetworkStats implements Parcelable {
tunSubtract(idxVpnBackground, this, moved[i]); tunSubtract(idxVpnBackground, this, moved[i]);
} }
final int idxVpnForeground = findIndex(underlyingIfaces[i], tunUid, SET_FOREGROUND, final int idxVpnForeground = findIndex(underlyingIfaces.get(i), tunUid, SET_FOREGROUND,
TAG_NONE, METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO); TAG_NONE, METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO);
if (idxVpnForeground != -1) { if (idxVpnForeground != -1) {
tunSubtract(idxVpnForeground, this, moved[i]); tunSubtract(idxVpnForeground, this, moved[i]);

View File

@@ -37,36 +37,56 @@ import java.util.Objects;
@SystemApi(client = MODULE_LIBRARIES) @SystemApi(client = MODULE_LIBRARIES)
public final class UnderlyingNetworkInfo implements Parcelable { public final class UnderlyingNetworkInfo implements Parcelable {
/** The owner of this network. */ /** The owner of this network. */
public final int ownerUid; private final int mOwnerUid;
/** The interface name of this network. */ /** The interface name of this network. */
@NonNull @NonNull
public final String iface; private final String mIface;
/** The names of the interfaces underlying this network. */ /** The names of the interfaces underlying this network. */
@NonNull @NonNull
public final List<String> underlyingIfaces; private final List<String> mUnderlyingIfaces;
public UnderlyingNetworkInfo(int ownerUid, @NonNull String iface, public UnderlyingNetworkInfo(int ownerUid, @NonNull String iface,
@NonNull List<String> underlyingIfaces) { @NonNull List<String> underlyingIfaces) {
Objects.requireNonNull(iface); Objects.requireNonNull(iface);
Objects.requireNonNull(underlyingIfaces); Objects.requireNonNull(underlyingIfaces);
this.ownerUid = ownerUid; mOwnerUid = ownerUid;
this.iface = iface; mIface = iface;
this.underlyingIfaces = Collections.unmodifiableList(new ArrayList<>(underlyingIfaces)); mUnderlyingIfaces = Collections.unmodifiableList(new ArrayList<>(underlyingIfaces));
} }
private UnderlyingNetworkInfo(@NonNull Parcel in) { private UnderlyingNetworkInfo(@NonNull Parcel in) {
this.ownerUid = in.readInt(); mOwnerUid = in.readInt();
this.iface = in.readString(); mIface = in.readString();
this.underlyingIfaces = new ArrayList<>(); List<String> underlyingIfaces = new ArrayList<>();
in.readList(this.underlyingIfaces, null /*classLoader*/); in.readList(underlyingIfaces, null /*classLoader*/);
mUnderlyingIfaces = Collections.unmodifiableList(underlyingIfaces);
}
/** Get the owner of this network. */
public int getOwnerUid() {
return mOwnerUid;
}
/** Get the interface name of this network. */
@NonNull
public String getIface() {
return mIface;
}
/** Get the names of the interfaces underlying this network. */
@NonNull
public List<String> getUnderlyingIfaces() {
return mUnderlyingIfaces;
} }
@Override @Override
public String toString() { public String toString() {
return "UnderlyingNetworkInfo{" return "UnderlyingNetworkInfo{"
+ "ownerUid=" + ownerUid + "ownerUid=" + mOwnerUid
+ ", iface='" + iface + '\'' + ", iface='" + mIface + '\''
+ ", underlyingIfaces='" + underlyingIfaces.toString() + '\'' + ", underlyingIfaces='" + mUnderlyingIfaces.toString() + '\''
+ '}'; + '}';
} }
@@ -77,9 +97,9 @@ public final class UnderlyingNetworkInfo implements Parcelable {
@Override @Override
public void writeToParcel(@NonNull Parcel dest, int flags) { public void writeToParcel(@NonNull Parcel dest, int flags) {
dest.writeInt(ownerUid); dest.writeInt(mOwnerUid);
dest.writeString(iface); dest.writeString(mIface);
dest.writeList(underlyingIfaces); dest.writeList(mUnderlyingIfaces);
} }
@NonNull @NonNull
@@ -103,13 +123,13 @@ public final class UnderlyingNetworkInfo implements Parcelable {
if (this == o) return true; if (this == o) return true;
if (!(o instanceof UnderlyingNetworkInfo)) return false; if (!(o instanceof UnderlyingNetworkInfo)) return false;
final UnderlyingNetworkInfo that = (UnderlyingNetworkInfo) o; final UnderlyingNetworkInfo that = (UnderlyingNetworkInfo) o;
return ownerUid == that.ownerUid return mOwnerUid == that.getOwnerUid()
&& Objects.equals(iface, that.iface) && Objects.equals(mIface, that.getIface())
&& Objects.equals(underlyingIfaces, that.underlyingIfaces); && Objects.equals(mUnderlyingIfaces, that.getUnderlyingIfaces());
} }
@Override @Override
public int hashCode() { public int hashCode() {
return Objects.hash(ownerUid, iface, underlyingIfaces); return Objects.hash(mOwnerUid, mIface, mUnderlyingIfaces);
} }
} }

View File

@@ -382,8 +382,8 @@ public class NetworkStatsFactory {
// Migrate data usage over a VPN to the TUN network. // Migrate data usage over a VPN to the TUN network.
for (UnderlyingNetworkInfo info : vpnArray) { for (UnderlyingNetworkInfo info : vpnArray) {
delta.migrateTun(info.ownerUid, info.iface, delta.migrateTun(info.getOwnerUid(), info.getIface(),
info.underlyingIfaces.toArray(new String[0])); info.getUnderlyingIfaces());
// Filter out debug entries as that may lead to over counting. // Filter out debug entries as that may lead to over counting.
delta.filterDebugEntries(); delta.filterDebugEntries();
} }