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

Commit 19116294 authored by Yan Yan's avatar Yan Yan
Browse files

[Reland] VCN: Require capability matching on test networks for CTS

This commit updates NetworkPriorityClassifier to also require
capabilty matching on test networks. This allows CTS to select
underlying test networks based on their capabilities. Previously
capability matching was only done cell networks.

To do that this commit adds an abstract method to
VcnUnderlyingNetworkTemplate to retrieve capability requirements
so that the capability match can be done before the matching logic
diverge to different transports.

Bug: 263415068
Test: atest VcnManagerTest (new tests)
Change-Id: I12377cbd1d721c4100a958fd9a0ea56d87351eec
parent dd83a847
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -354,6 +354,7 @@ public final class VcnCellUnderlyingNetworkTemplate extends VcnUnderlyingNetwork
    }

    /** @hide */
    @Override
    public Map<Integer, Integer> getCapabilitiesMatchCriteria() {
        return Collections.unmodifiableMap(new HashMap<>(mCapabilitiesMatchCriteria));
    }
+4 −0
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ import com.android.internal.util.Preconditions;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.Map;
import java.util.Objects;

/**
@@ -307,4 +308,7 @@ public abstract class VcnUnderlyingNetworkTemplate {
    public int getMinExitDownstreamBandwidthKbps() {
        return mMinExitDownstreamBandwidthKbps;
    }

    /** @hide */
    public abstract Map<Integer, Integer> getCapabilitiesMatchCriteria();
}
+11 −0
Original line number Diff line number Diff line
@@ -15,6 +15,9 @@
 */
package android.net.vcn;

import static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET;
import static android.net.vcn.VcnUnderlyingNetworkTemplate.MATCH_ANY;

import static com.android.internal.annotations.VisibleForTesting.Visibility;
import static com.android.server.vcn.util.PersistableBundleUtils.STRING_DESERIALIZER;
import static com.android.server.vcn.util.PersistableBundleUtils.STRING_SERIALIZER;
@@ -23,6 +26,7 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SuppressLint;
import android.net.NetworkCapabilities;
import android.net.vcn.VcnUnderlyingNetworkTemplate.MatchCriteria;
import android.os.PersistableBundle;
import android.util.ArraySet;

@@ -32,6 +36,7 @@ import com.android.server.vcn.util.PersistableBundleUtils;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Map;
import java.util.Objects;
import java.util.Set;

@@ -162,6 +167,12 @@ public final class VcnWifiUnderlyingNetworkTemplate extends VcnUnderlyingNetwork
        return Collections.unmodifiableSet(mSsids);
    }

    /** @hide */
    @Override
    public Map<Integer, Integer> getCapabilitiesMatchCriteria() {
        return Collections.singletonMap(NET_CAPABILITY_INTERNET, MATCH_REQUIRED);
    }

    /** This class is used to incrementally build VcnWifiUnderlyingNetworkTemplate objects. */
    public static final class Builder {
        private int mMeteredMatchCriteria = MATCH_ANY;
+12 −12
Original line number Diff line number Diff line
@@ -171,6 +171,18 @@ class NetworkPriorityClassifier {
            return false;
        }

        for (Map.Entry<Integer, Integer> entry :
                networkPriority.getCapabilitiesMatchCriteria().entrySet()) {
            final int cap = entry.getKey();
            final int matchCriteria = entry.getValue();

            if (matchCriteria == MATCH_REQUIRED && !caps.hasCapability(cap)) {
                return false;
            } else if (matchCriteria == MATCH_FORBIDDEN && caps.hasCapability(cap)) {
                return false;
            }
        }

        if (vcnContext.isInTestMode() && caps.hasTransport(TRANSPORT_TEST)) {
            return true;
        }
@@ -319,18 +331,6 @@ class NetworkPriorityClassifier {
            return false;
        }

        for (Map.Entry<Integer, Integer> entry :
                networkPriority.getCapabilitiesMatchCriteria().entrySet()) {
            final int cap = entry.getKey();
            final int matchCriteria = entry.getValue();

            if (matchCriteria == MATCH_REQUIRED && !caps.hasCapability(cap)) {
                return false;
            } else if (matchCriteria == MATCH_FORBIDDEN && caps.hasCapability(cap)) {
                return false;
            }
        }

        return true;
    }

+5 −2
Original line number Diff line number Diff line
@@ -95,6 +95,7 @@ public class NetworkPriorityClassifierTest {
    private static final NetworkCapabilities WIFI_NETWORK_CAPABILITIES =
            new NetworkCapabilities.Builder()
                    .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
                    .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
                    .setSignalStrength(WIFI_RSSI)
                    .setSsid(SSID)
                    .setLinkUpstreamBandwidthKbps(LINK_UPSTREAM_BANDWIDTH_KBPS)
@@ -509,12 +510,14 @@ public class NetworkPriorityClassifierTest {
            VcnCellUnderlyingNetworkTemplate template, boolean expectMatch) {
        assertEquals(
                expectMatch,
                checkMatchesCellPriorityRule(
                checkMatchesPriorityRule(
                        mVcnContext,
                        template,
                        mCellNetworkRecord,
                        SUB_GROUP,
                        mSubscriptionSnapshot));
                        mSubscriptionSnapshot,
                        null /* currentlySelected */,
                        null /* carrierConfig */));
    }

    @Test