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

Commit 2d96bac3 authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Add getters to UnderlyingNetworkInfo" am: e2e8b9ce am: b2551d4c

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

Change-Id: I33d2bbca5a72ab8500a7886073c9f4c4d1b84925
parents af1f784e b2551d4c
Loading
Loading
Loading
Loading
+3 −3
Original line number Original line Diff line number Diff line
@@ -89,11 +89,11 @@ package android.net {
  public final class UnderlyingNetworkInfo implements android.os.Parcelable {
  public final class UnderlyingNetworkInfo implements android.os.Parcelable {
    ctor public UnderlyingNetworkInfo(int, @NonNull String, @NonNull java.util.List<java.lang.String>);
    ctor public UnderlyingNetworkInfo(int, @NonNull String, @NonNull java.util.List<java.lang.String>);
    method public int describeContents();
    method public int describeContents();
    method @NonNull public String getIface();
    method public int getOwnerUid();
    method @NonNull public java.util.List<java.lang.String> getUnderlyingIfaces();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.net.UnderlyingNetworkInfo> CREATOR;
    field @NonNull public static final android.os.Parcelable.Creator<android.net.UnderlyingNetworkInfo> CREATOR;
    field @NonNull public final String iface;
    field public final int ownerUid;
    field @NonNull public final java.util.List<java.lang.String> underlyingIfaces;
  }
  }


  public class VpnManager {
  public class VpnManager {
+16 −15
Original line number Original line Diff line number Diff line
@@ -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]);
+40 −20
Original line number Original line Diff line number Diff line
@@ -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);
    }
    }
}
}
+1 −1
Original line number Original line Diff line number Diff line
@@ -91,7 +91,7 @@ public class NetworkStatsBenchmark {
    public void timeMigrateTun(int reps) {
    public void timeMigrateTun(int reps) {
        for (int i = 0; i < reps; i++) {
        for (int i = 0; i < reps; i++) {
            NetworkStats stats = mNetworkStats.clone();
            NetworkStats stats = mNetworkStats.clone();
            stats.migrateTun(TUN_UID, TUN_IFACE, getVpnUnderlyingIfaces());
            stats.migrateTun(TUN_UID, TUN_IFACE, Arrays.asList(getVpnUnderlyingIfaces()));
        }
        }
    }
    }


+1 −1
Original line number Original line Diff line number Diff line
@@ -605,7 +605,7 @@ public class VpnManagerService extends IVpnManager.Stub {
            return null;
            return null;
        } else {
        } else {
            final UnderlyingNetworkInfo info = vpn.getUnderlyingNetworkInfo();
            final UnderlyingNetworkInfo info = vpn.getUnderlyingNetworkInfo();
            return (info == null || info.ownerUid != uid) ? null : vpn;
            return (info == null || info.getOwnerUid() != uid) ? null : vpn;
        }
        }
    }
    }


Loading