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

Commit c9bacc92 authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge "Fix addRoute replace default route unexpectedly"

parents 6982a7dc 4fe1889b
Loading
Loading
Loading
Loading
+8 −8
Original line number Diff line number Diff line
@@ -690,9 +690,9 @@ public final class LinkProperties implements Parcelable {
            route.getMtu());
    }

    private int findRouteIndexByDestination(RouteInfo route) {
    private int findRouteIndexByRouteKey(RouteInfo route) {
        for (int i = 0; i < mRoutes.size(); i++) {
            if (mRoutes.get(i).isSameDestinationAs(route)) {
            if (mRoutes.get(i).getRouteKey().equals(route.getRouteKey())) {
                return i;
            }
        }
@@ -701,11 +701,11 @@ public final class LinkProperties implements Parcelable {

    /**
     * Adds a {@link RouteInfo} to this {@code LinkProperties}, if a {@link RouteInfo}
     * with the same destination exists with different properties (e.g., different MTU),
     * it will be updated. If the {@link RouteInfo} had an interface name set and
     * that differs from the interface set for this {@code LinkProperties} an
     * {@link IllegalArgumentException} will be thrown.  The proper
     * course is to add either un-named or properly named {@link RouteInfo}.
     * with the same {@link RouteInfo.RouteKey} with different properties
     * (e.g., different MTU), it will be updated. If the {@link RouteInfo} had an
     * interface name set and that differs from the interface set for this
     * {@code LinkProperties} an {@link IllegalArgumentException} will be thrown.
     * The proper course is to add either un-named or properly named {@link RouteInfo}.
     *
     * @param route A {@link RouteInfo} to add to this object.
     * @return {@code true} was added or updated, false otherwise.
@@ -719,7 +719,7 @@ public final class LinkProperties implements Parcelable {
        }
        route = routeWithInterface(route);

        int i = findRouteIndexByDestination(route);
        int i = findRouteIndexByRouteKey(route);
        if (i == -1) {
            // Route was not present. Add it.
            mRoutes.add(route);
+18 −13
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ import android.net.util.NetUtils;
import android.os.Build;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.Pair;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -527,23 +528,27 @@ public final class RouteInfo implements Parcelable {
    }

    /**
     * Compares this RouteInfo object against the specified object and indicates if the
     * destinations of both routes are equal.
     * @return {@code true} if the route destinations are equal, {@code false} otherwise.
     * A helper class that contains the destination and the gateway in a {@code RouteInfo},
     * used by {@link ConnectivityService#updateRoutes} or
     * {@link LinkProperties#addRoute} to calculate the list to be updated.
     *
     * @hide
     */
    public boolean isSameDestinationAs(@Nullable Object obj) {
        if (this == obj) return true;

        if (!(obj instanceof RouteInfo)) return false;

        RouteInfo target = (RouteInfo) obj;

        if (Objects.equals(mDestination, target.getDestination())) {
            return true;
    public static class RouteKey extends Pair<IpPrefix, InetAddress> {
        RouteKey(@NonNull IpPrefix destination, @Nullable InetAddress gateway) {
            super(destination, gateway);
        }
    }
        return false;

    /**
     * Get {@code RouteKey} of this {@code RouteInfo}.
     * @return a {@code RouteKey} object.
     *
     * @hide
     */
    @NonNull
    public RouteKey getRouteKey() {
        return new RouteKey(mDestination, mGateway);
    }

    /**
+5 −6
Original line number Diff line number Diff line
@@ -236,7 +236,6 @@ import java.util.SortedSet;
import java.util.StringJoiner;
import java.util.TreeSet;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Function;

/**
 * @hide
@@ -5982,12 +5981,12 @@ public class ConnectivityService extends IConnectivityManager.Stub
     * @return true if routes changed between oldLp and newLp
     */
    private boolean updateRoutes(LinkProperties newLp, LinkProperties oldLp, int netId) {
        Function<RouteInfo, IpPrefix> getDestination = (r) -> r.getDestination();
        // compare the route diff to determine which routes have been updated
        CompareOrUpdateResult<IpPrefix, RouteInfo> routeDiff = new CompareOrUpdateResult<>(
        final CompareOrUpdateResult<RouteInfo.RouteKey, RouteInfo> routeDiff =
                new CompareOrUpdateResult<>(
                        oldLp != null ? oldLp.getAllRoutes() : null,
                        newLp != null ? newLp.getAllRoutes() : null,
                getDestination);
                        (r) -> r.getRouteKey());

        // add routes before removing old in case it helps with continuous connectivity