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

Commit 48e1a31d authored by Benedict Wong's avatar Benedict Wong Committed by Automerger Merge Worker
Browse files

Merge "Add API for VCN configuration of UDP port 4500 NAT Timeouts" am: c1bd0480

parents 445fe0aa c1bd0480
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -27345,6 +27345,7 @@ package android.net.vcn {
    method @NonNull public int[] getExposedCapabilities();
    method @NonNull public int[] getExposedCapabilities();
    method @NonNull public String getGatewayConnectionName();
    method @NonNull public String getGatewayConnectionName();
    method @IntRange(from=0x500) public int getMaxMtu();
    method @IntRange(from=0x500) public int getMaxMtu();
    method public int getMinUdpPort4500NatTimeoutSeconds();
    method @NonNull public long[] getRetryIntervalsMillis();
    method @NonNull public long[] getRetryIntervalsMillis();
    method @NonNull public java.util.List<android.net.vcn.VcnUnderlyingNetworkTemplate> getVcnUnderlyingNetworkPriorities();
    method @NonNull public java.util.List<android.net.vcn.VcnUnderlyingNetworkTemplate> getVcnUnderlyingNetworkPriorities();
    method public boolean hasGatewayOption(int);
    method public boolean hasGatewayOption(int);
@@ -27359,6 +27360,7 @@ package android.net.vcn {
    method @NonNull public android.net.vcn.VcnGatewayConnectionConfig.Builder removeExposedCapability(int);
    method @NonNull public android.net.vcn.VcnGatewayConnectionConfig.Builder removeExposedCapability(int);
    method @NonNull public android.net.vcn.VcnGatewayConnectionConfig.Builder removeGatewayOption(int);
    method @NonNull public android.net.vcn.VcnGatewayConnectionConfig.Builder removeGatewayOption(int);
    method @NonNull public android.net.vcn.VcnGatewayConnectionConfig.Builder setMaxMtu(@IntRange(from=0x500) int);
    method @NonNull public android.net.vcn.VcnGatewayConnectionConfig.Builder setMaxMtu(@IntRange(from=0x500) int);
    method @NonNull public android.net.vcn.VcnGatewayConnectionConfig.Builder setMinUdpPort4500NatTimeoutSeconds(@IntRange(from=0x78) int);
    method @NonNull public android.net.vcn.VcnGatewayConnectionConfig.Builder setRetryIntervalsMillis(@NonNull long[]);
    method @NonNull public android.net.vcn.VcnGatewayConnectionConfig.Builder setRetryIntervalsMillis(@NonNull long[]);
    method @NonNull public android.net.vcn.VcnGatewayConnectionConfig.Builder setVcnUnderlyingNetworkPriorities(@NonNull java.util.List<android.net.vcn.VcnUnderlyingNetworkTemplate>);
    method @NonNull public android.net.vcn.VcnGatewayConnectionConfig.Builder setVcnUnderlyingNetworkPriorities(@NonNull java.util.List<android.net.vcn.VcnUnderlyingNetworkTemplate>);
  }
  }
+59 −0
Original line number Original line Diff line number Diff line
@@ -81,6 +81,12 @@ import java.util.concurrent.TimeUnit;
 * </ul>
 * </ul>
 */
 */
public final class VcnGatewayConnectionConfig {
public final class VcnGatewayConnectionConfig {
    /** @hide */
    public static final int MIN_UDP_PORT_4500_NAT_TIMEOUT_UNSET = -1;

    /** @hide */
    public static final int MIN_UDP_PORT_4500_NAT_TIMEOUT_SECONDS = 120;

    // TODO: Use MIN_MTU_V6 once it is public, @hide
    // TODO: Use MIN_MTU_V6 once it is public, @hide
    @VisibleForTesting(visibility = Visibility.PRIVATE)
    @VisibleForTesting(visibility = Visibility.PRIVATE)
    static final int MIN_MTU_V6 = 1280;
    static final int MIN_MTU_V6 = 1280;
@@ -225,6 +231,10 @@ public final class VcnGatewayConnectionConfig {
    private static final String RETRY_INTERVAL_MS_KEY = "mRetryIntervalsMs";
    private static final String RETRY_INTERVAL_MS_KEY = "mRetryIntervalsMs";
    @NonNull private final long[] mRetryIntervalsMs;
    @NonNull private final long[] mRetryIntervalsMs;


    private static final String MIN_UDP_PORT_4500_NAT_TIMEOUT_SECONDS_KEY =
            "mMinUdpPort4500NatTimeoutSeconds";
    private final int mMinUdpPort4500NatTimeoutSeconds;

    private static final String GATEWAY_OPTIONS_KEY = "mGatewayOptions";
    private static final String GATEWAY_OPTIONS_KEY = "mGatewayOptions";
    @NonNull private final Set<Integer> mGatewayOptions;
    @NonNull private final Set<Integer> mGatewayOptions;


@@ -236,12 +246,14 @@ public final class VcnGatewayConnectionConfig {
            @NonNull List<VcnUnderlyingNetworkTemplate> underlyingNetworkTemplates,
            @NonNull List<VcnUnderlyingNetworkTemplate> underlyingNetworkTemplates,
            @NonNull long[] retryIntervalsMs,
            @NonNull long[] retryIntervalsMs,
            @IntRange(from = MIN_MTU_V6) int maxMtu,
            @IntRange(from = MIN_MTU_V6) int maxMtu,
            @NonNull int minUdpPort4500NatTimeoutSeconds,
            @NonNull Set<Integer> gatewayOptions) {
            @NonNull Set<Integer> gatewayOptions) {
        mGatewayConnectionName = gatewayConnectionName;
        mGatewayConnectionName = gatewayConnectionName;
        mTunnelConnectionParams = tunnelConnectionParams;
        mTunnelConnectionParams = tunnelConnectionParams;
        mExposedCapabilities = new TreeSet(exposedCapabilities);
        mExposedCapabilities = new TreeSet(exposedCapabilities);
        mRetryIntervalsMs = retryIntervalsMs;
        mRetryIntervalsMs = retryIntervalsMs;
        mMaxMtu = maxMtu;
        mMaxMtu = maxMtu;
        mMinUdpPort4500NatTimeoutSeconds = minUdpPort4500NatTimeoutSeconds;
        mGatewayOptions = Collections.unmodifiableSet(new ArraySet(gatewayOptions));
        mGatewayOptions = Collections.unmodifiableSet(new ArraySet(gatewayOptions));


        mUnderlyingNetworkTemplates = new ArrayList<>(underlyingNetworkTemplates);
        mUnderlyingNetworkTemplates = new ArrayList<>(underlyingNetworkTemplates);
@@ -301,6 +313,10 @@ public final class VcnGatewayConnectionConfig {


        mRetryIntervalsMs = in.getLongArray(RETRY_INTERVAL_MS_KEY);
        mRetryIntervalsMs = in.getLongArray(RETRY_INTERVAL_MS_KEY);
        mMaxMtu = in.getInt(MAX_MTU_KEY);
        mMaxMtu = in.getInt(MAX_MTU_KEY);
        mMinUdpPort4500NatTimeoutSeconds =
                in.getInt(
                        MIN_UDP_PORT_4500_NAT_TIMEOUT_SECONDS_KEY,
                        MIN_UDP_PORT_4500_NAT_TIMEOUT_UNSET);


        validate();
        validate();
    }
    }
@@ -323,6 +339,12 @@ public final class VcnGatewayConnectionConfig {
        Preconditions.checkArgument(
        Preconditions.checkArgument(
                mMaxMtu >= MIN_MTU_V6, "maxMtu must be at least IPv6 min MTU (1280)");
                mMaxMtu >= MIN_MTU_V6, "maxMtu must be at least IPv6 min MTU (1280)");


        Preconditions.checkArgument(
                mMinUdpPort4500NatTimeoutSeconds == MIN_UDP_PORT_4500_NAT_TIMEOUT_UNSET
                        || mMinUdpPort4500NatTimeoutSeconds
                                >= MIN_UDP_PORT_4500_NAT_TIMEOUT_SECONDS,
                "minUdpPort4500NatTimeoutSeconds must be at least 120s");

        for (int option : mGatewayOptions) {
        for (int option : mGatewayOptions) {
            validateGatewayOption(option);
            validateGatewayOption(option);
        }
        }
@@ -451,6 +473,15 @@ public final class VcnGatewayConnectionConfig {
        return mMaxMtu;
        return mMaxMtu;
    }
    }


    /**
     * Retrieves the maximum supported IKEv2/IPsec NATT keepalive timeout.
     *
     * @see Builder#setMinUdpPort4500NatTimeoutSeconds(int)
     */
    public int getMinUdpPort4500NatTimeoutSeconds() {
        return mMinUdpPort4500NatTimeoutSeconds;
    }

    /**
    /**
     * Checks if the given VCN gateway option is enabled.
     * Checks if the given VCN gateway option is enabled.
     *
     *
@@ -496,6 +527,7 @@ public final class VcnGatewayConnectionConfig {
        result.putPersistableBundle(GATEWAY_OPTIONS_KEY, gatewayOptionsBundle);
        result.putPersistableBundle(GATEWAY_OPTIONS_KEY, gatewayOptionsBundle);
        result.putLongArray(RETRY_INTERVAL_MS_KEY, mRetryIntervalsMs);
        result.putLongArray(RETRY_INTERVAL_MS_KEY, mRetryIntervalsMs);
        result.putInt(MAX_MTU_KEY, mMaxMtu);
        result.putInt(MAX_MTU_KEY, mMaxMtu);
        result.putInt(MIN_UDP_PORT_4500_NAT_TIMEOUT_SECONDS_KEY, mMinUdpPort4500NatTimeoutSeconds);


        return result;
        return result;
    }
    }
@@ -509,6 +541,7 @@ public final class VcnGatewayConnectionConfig {
                mUnderlyingNetworkTemplates,
                mUnderlyingNetworkTemplates,
                Arrays.hashCode(mRetryIntervalsMs),
                Arrays.hashCode(mRetryIntervalsMs),
                mMaxMtu,
                mMaxMtu,
                mMinUdpPort4500NatTimeoutSeconds,
                mGatewayOptions);
                mGatewayOptions);
    }
    }


@@ -525,6 +558,7 @@ public final class VcnGatewayConnectionConfig {
                && mUnderlyingNetworkTemplates.equals(rhs.mUnderlyingNetworkTemplates)
                && mUnderlyingNetworkTemplates.equals(rhs.mUnderlyingNetworkTemplates)
                && Arrays.equals(mRetryIntervalsMs, rhs.mRetryIntervalsMs)
                && Arrays.equals(mRetryIntervalsMs, rhs.mRetryIntervalsMs)
                && mMaxMtu == rhs.mMaxMtu
                && mMaxMtu == rhs.mMaxMtu
                && mMinUdpPort4500NatTimeoutSeconds == rhs.mMinUdpPort4500NatTimeoutSeconds
                && mGatewayOptions.equals(rhs.mGatewayOptions);
                && mGatewayOptions.equals(rhs.mGatewayOptions);
    }
    }


@@ -542,6 +576,7 @@ public final class VcnGatewayConnectionConfig {


        @NonNull private long[] mRetryIntervalsMs = DEFAULT_RETRY_INTERVALS_MS;
        @NonNull private long[] mRetryIntervalsMs = DEFAULT_RETRY_INTERVALS_MS;
        private int mMaxMtu = DEFAULT_MAX_MTU;
        private int mMaxMtu = DEFAULT_MAX_MTU;
        private int mMinUdpPort4500NatTimeoutSeconds = MIN_UDP_PORT_4500_NAT_TIMEOUT_UNSET;


        @NonNull private final Set<Integer> mGatewayOptions = new ArraySet<>();
        @NonNull private final Set<Integer> mGatewayOptions = new ArraySet<>();


@@ -702,6 +737,29 @@ public final class VcnGatewayConnectionConfig {
            return this;
            return this;
        }
        }


        /**
         * Sets the maximum supported IKEv2/IPsec NATT keepalive timeout.
         *
         * <p>This is used as a power-optimization hint for other IKEv2/IPsec use cases (e.g. VPNs,
         * or IWLAN) to reduce the necessary keepalive frequency, thus conserving power and data.
         *
         * @param minUdpPort4500NatTimeoutSeconds the maximum keepalive timeout supported by the VCN
         *     Gateway Connection, generally the minimum duration a NAT mapping is cached on the VCN
         *     Gateway.
         * @return this {@link Builder} instance, for chaining
         */
        @NonNull
        public Builder setMinUdpPort4500NatTimeoutSeconds(
                @IntRange(from = MIN_UDP_PORT_4500_NAT_TIMEOUT_SECONDS)
                        int minUdpPort4500NatTimeoutSeconds) {
            Preconditions.checkArgument(
                    minUdpPort4500NatTimeoutSeconds >= MIN_UDP_PORT_4500_NAT_TIMEOUT_SECONDS,
                    "Timeout must be at least 120s");

            mMinUdpPort4500NatTimeoutSeconds = minUdpPort4500NatTimeoutSeconds;
            return this;
        }

        /**
        /**
         * Enables the specified VCN gateway option.
         * Enables the specified VCN gateway option.
         *
         *
@@ -744,6 +802,7 @@ public final class VcnGatewayConnectionConfig {
                    mUnderlyingNetworkTemplates,
                    mUnderlyingNetworkTemplates,
                    mRetryIntervalsMs,
                    mRetryIntervalsMs,
                    mMaxMtu,
                    mMaxMtu,
                    mMinUdpPort4500NatTimeoutSeconds,
                    mGatewayOptions);
                    mGatewayOptions);
        }
        }
    }
    }
+43 −10
Original line number Original line Diff line number Diff line
@@ -17,6 +17,7 @@
package android.net.vcn;
package android.net.vcn;


import static android.net.NetworkCapabilities.REDACT_FOR_NETWORK_SETTINGS;
import static android.net.NetworkCapabilities.REDACT_FOR_NETWORK_SETTINGS;
import static android.net.vcn.VcnGatewayConnectionConfig.MIN_UDP_PORT_4500_NAT_TIMEOUT_UNSET;
import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;


import android.annotation.NonNull;
import android.annotation.NonNull;
@@ -49,18 +50,29 @@ import java.util.Objects;
public class VcnTransportInfo implements TransportInfo, Parcelable {
public class VcnTransportInfo implements TransportInfo, Parcelable {
    @Nullable private final WifiInfo mWifiInfo;
    @Nullable private final WifiInfo mWifiInfo;
    private final int mSubId;
    private final int mSubId;
    private final int mMinUdpPort4500NatTimeoutSeconds;


    public VcnTransportInfo(@NonNull WifiInfo wifiInfo) {
    public VcnTransportInfo(@NonNull WifiInfo wifiInfo) {
        this(wifiInfo, INVALID_SUBSCRIPTION_ID);
        this(wifiInfo, INVALID_SUBSCRIPTION_ID, MIN_UDP_PORT_4500_NAT_TIMEOUT_UNSET);
    }

    public VcnTransportInfo(@NonNull WifiInfo wifiInfo, int minUdpPort4500NatTimeoutSeconds) {
        this(wifiInfo, INVALID_SUBSCRIPTION_ID, minUdpPort4500NatTimeoutSeconds);
    }
    }


    public VcnTransportInfo(int subId) {
    public VcnTransportInfo(int subId) {
        this(null /* wifiInfo */, subId);
        this(null /* wifiInfo */, subId, MIN_UDP_PORT_4500_NAT_TIMEOUT_UNSET);
    }
    }


    private VcnTransportInfo(@Nullable WifiInfo wifiInfo, int subId) {
    public VcnTransportInfo(int subId, int minUdpPort4500NatTimeoutSeconds) {
        this(null /* wifiInfo */, subId, minUdpPort4500NatTimeoutSeconds);
    }

    private VcnTransportInfo(
            @Nullable WifiInfo wifiInfo, int subId, int minUdpPort4500NatTimeoutSeconds) {
        mWifiInfo = wifiInfo;
        mWifiInfo = wifiInfo;
        mSubId = subId;
        mSubId = subId;
        mMinUdpPort4500NatTimeoutSeconds = minUdpPort4500NatTimeoutSeconds;
    }
    }


    /**
    /**
@@ -88,16 +100,28 @@ public class VcnTransportInfo implements TransportInfo, Parcelable {
        return mSubId;
        return mSubId;
    }
    }


    /**
     * Get the VCN provided UDP port 4500 NAT timeout
     *
     * @return the UDP 4500 NAT timeout, or
     *     VcnGatewayConnectionConfig.MIN_UDP_PORT_4500_NAT_TIMEOUT_UNSET if not set.
     */
    public int getMinUdpPort4500NatTimeoutSeconds() {
        return mMinUdpPort4500NatTimeoutSeconds;
    }

    @Override
    @Override
    public int hashCode() {
    public int hashCode() {
        return Objects.hash(mWifiInfo, mSubId);
        return Objects.hash(mWifiInfo, mSubId, mMinUdpPort4500NatTimeoutSeconds);
    }
    }


    @Override
    @Override
    public boolean equals(Object o) {
    public boolean equals(Object o) {
        if (!(o instanceof VcnTransportInfo)) return false;
        if (!(o instanceof VcnTransportInfo)) return false;
        final VcnTransportInfo that = (VcnTransportInfo) o;
        final VcnTransportInfo that = (VcnTransportInfo) o;
        return Objects.equals(mWifiInfo, that.mWifiInfo) && mSubId == that.mSubId;
        return Objects.equals(mWifiInfo, that.mWifiInfo)
                && mSubId == that.mSubId
                && mMinUdpPort4500NatTimeoutSeconds == that.mMinUdpPort4500NatTimeoutSeconds;
    }
    }


    /** {@inheritDoc} */
    /** {@inheritDoc} */
@@ -110,11 +134,14 @@ public class VcnTransportInfo implements TransportInfo, Parcelable {
    @NonNull
    @NonNull
    public TransportInfo makeCopy(long redactions) {
    public TransportInfo makeCopy(long redactions) {
        if ((redactions & NetworkCapabilities.REDACT_FOR_NETWORK_SETTINGS) != 0) {
        if ((redactions & NetworkCapabilities.REDACT_FOR_NETWORK_SETTINGS) != 0) {
            return new VcnTransportInfo(null, INVALID_SUBSCRIPTION_ID);
            return new VcnTransportInfo(
                    null, INVALID_SUBSCRIPTION_ID, MIN_UDP_PORT_4500_NAT_TIMEOUT_UNSET);
        }
        }


        return new VcnTransportInfo(
        return new VcnTransportInfo(
                (mWifiInfo == null) ? null : mWifiInfo.makeCopy(redactions), mSubId);
                (mWifiInfo == null) ? null : mWifiInfo.makeCopy(redactions),
                mSubId,
                mMinUdpPort4500NatTimeoutSeconds);
    }
    }


    @Override
    @Override
@@ -134,6 +161,7 @@ public class VcnTransportInfo implements TransportInfo, Parcelable {
    public void writeToParcel(@NonNull Parcel dest, int flags) {
    public void writeToParcel(@NonNull Parcel dest, int flags) {
        dest.writeInt(mSubId);
        dest.writeInt(mSubId);
        dest.writeParcelable(mWifiInfo, flags);
        dest.writeParcelable(mWifiInfo, flags);
        dest.writeInt(mMinUdpPort4500NatTimeoutSeconds);
    }
    }


    @Override
    @Override
@@ -146,16 +174,21 @@ public class VcnTransportInfo implements TransportInfo, Parcelable {
            new Creator<VcnTransportInfo>() {
            new Creator<VcnTransportInfo>() {
                public VcnTransportInfo createFromParcel(Parcel in) {
                public VcnTransportInfo createFromParcel(Parcel in) {
                    final int subId = in.readInt();
                    final int subId = in.readInt();
                    final WifiInfo wifiInfo = in.readParcelable(null, android.net.wifi.WifiInfo.class);
                    final WifiInfo wifiInfo =
                            in.readParcelable(null, android.net.wifi.WifiInfo.class);
                    final int minUdpPort4500NatTimeoutSeconds = in.readInt();


                    // If all fields are their null values, return null TransportInfo to avoid
                    // If all fields are their null values, return null TransportInfo to avoid
                    // leaking information about this being a VCN Network (instead of macro
                    // leaking information about this being a VCN Network (instead of macro
                    // cellular, etc)
                    // cellular, etc)
                    if (wifiInfo == null && subId == INVALID_SUBSCRIPTION_ID) {
                    if (wifiInfo == null
                            && subId == INVALID_SUBSCRIPTION_ID
                            && minUdpPort4500NatTimeoutSeconds
                                    == MIN_UDP_PORT_4500_NAT_TIMEOUT_UNSET) {
                        return null;
                        return null;
                    }
                    }


                    return new VcnTransportInfo(wifiInfo, subId);
                    return new VcnTransportInfo(wifiInfo, subId, minUdpPort4500NatTimeoutSeconds);
                }
                }


                public VcnTransportInfo[] newArray(int size) {
                public VcnTransportInfo[] newArray(int size) {
+8 −2
Original line number Original line Diff line number Diff line
@@ -2255,12 +2255,18 @@ public class VcnGatewayConnection extends StateMachine {
            if (underlyingCaps.hasTransport(TRANSPORT_WIFI)
            if (underlyingCaps.hasTransport(TRANSPORT_WIFI)
                    && underlyingCaps.getTransportInfo() instanceof WifiInfo) {
                    && underlyingCaps.getTransportInfo() instanceof WifiInfo) {
                final WifiInfo wifiInfo = (WifiInfo) underlyingCaps.getTransportInfo();
                final WifiInfo wifiInfo = (WifiInfo) underlyingCaps.getTransportInfo();
                builder.setTransportInfo(new VcnTransportInfo(wifiInfo));
                builder.setTransportInfo(
                        new VcnTransportInfo(
                                wifiInfo,
                                gatewayConnectionConfig.getMinUdpPort4500NatTimeoutSeconds()));
            } else if (underlyingCaps.hasTransport(TRANSPORT_CELLULAR)
            } else if (underlyingCaps.hasTransport(TRANSPORT_CELLULAR)
                    && underlyingCaps.getNetworkSpecifier() instanceof TelephonyNetworkSpecifier) {
                    && underlyingCaps.getNetworkSpecifier() instanceof TelephonyNetworkSpecifier) {
                final TelephonyNetworkSpecifier telNetSpecifier =
                final TelephonyNetworkSpecifier telNetSpecifier =
                        (TelephonyNetworkSpecifier) underlyingCaps.getNetworkSpecifier();
                        (TelephonyNetworkSpecifier) underlyingCaps.getNetworkSpecifier();
                builder.setTransportInfo(new VcnTransportInfo(telNetSpecifier.getSubscriptionId()));
                builder.setTransportInfo(
                        new VcnTransportInfo(
                                telNetSpecifier.getSubscriptionId(),
                                gatewayConnectionConfig.getMinUdpPort4500NatTimeoutSeconds()));
            } else {
            } else {
                Slog.wtf(
                Slog.wtf(
                        TAG,
                        TAG,
+4 −1
Original line number Original line Diff line number Diff line
@@ -82,6 +82,7 @@ public class VcnGatewayConnectionConfigTest {
                TimeUnit.MINUTES.toMillis(30)
                TimeUnit.MINUTES.toMillis(30)
            };
            };
    public static final int MAX_MTU = 1360;
    public static final int MAX_MTU = 1360;
    public static final int MIN_UDP_PORT_4500_NAT_TIMEOUT = 120;


    private static final Set<Integer> GATEWAY_OPTIONS =
    private static final Set<Integer> GATEWAY_OPTIONS =
            Collections.singleton(VCN_GATEWAY_OPTION_ENABLE_DATA_STALL_RECOVERY_WITH_MOBILITY);
            Collections.singleton(VCN_GATEWAY_OPTION_ENABLE_DATA_STALL_RECOVERY_WITH_MOBILITY);
@@ -104,7 +105,9 @@ public class VcnGatewayConnectionConfigTest {
    public static VcnGatewayConnectionConfig buildTestConfig(
    public static VcnGatewayConnectionConfig buildTestConfig(
            List<VcnUnderlyingNetworkTemplate> nwTemplates) {
            List<VcnUnderlyingNetworkTemplate> nwTemplates) {
        final VcnGatewayConnectionConfig.Builder builder =
        final VcnGatewayConnectionConfig.Builder builder =
                newBuilder().setVcnUnderlyingNetworkPriorities(nwTemplates);
                newBuilder()
                        .setVcnUnderlyingNetworkPriorities(nwTemplates)
                        .setMinUdpPort4500NatTimeoutSeconds(MIN_UDP_PORT_4500_NAT_TIMEOUT);


        return buildTestConfigWithExposedCaps(builder, EXPOSED_CAPS);
        return buildTestConfigWithExposedCaps(builder, EXPOSED_CAPS);
    }
    }
Loading