Merge "Add getters to UnderlyingNetworkInfo"
This commit is contained in:
@@ -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]);
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user