Snap for 8414339 from 8849c5ef2a3897e6da57fe33819f6a2c463adb2b to tm-qpr1-release

Change-Id: I2fbee81f517a7d05c648723a9b4b05e3c1a0b0bb
diff --git a/Android.bp b/Android.bp
deleted file mode 100644
index c3393bc..0000000
--- a/Android.bp
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright (C) 2014 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Build the java code
-// ============================================================
-
-package {
-    default_applicable_licenses: ["Android-Apache-2.0"],
-}
-
-java_library {
-    name: "ethernet-service",
-    installable: true,
-
-    aidl: {
-        local_include_dirs: ["java"],
-    },
-    srcs: [
-        "java/**/*.java",
-        "java/**/I*.aidl",
-        "java/**/*.logtags",
-    ],
-
-    libs: ["services"],
-}
diff --git a/TEST_MAPPING b/TEST_MAPPING
deleted file mode 100644
index 24c152b..0000000
--- a/TEST_MAPPING
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "presubmit": [
-    {
-      "name": "EthernetServiceTests"
-    }
-  ],
-  "imports": [
-    {
-      "path": "packages/modules/Connectivity"
-    }
-  ]
-}
diff --git a/java/com/android/server/ethernet/EthernetConfigStore.java b/java/com/android/server/ethernet/EthernetConfigStore.java
deleted file mode 100644
index 6b623f4..0000000
--- a/java/com/android/server/ethernet/EthernetConfigStore.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.ethernet;
-
-import android.annotation.Nullable;
-import android.net.IpConfiguration;
-import android.os.Environment;
-import android.util.ArrayMap;
-
-import com.android.server.net.IpConfigStore;
-
-
-/**
- * This class provides an API to store and manage Ethernet network configuration.
- */
-public class EthernetConfigStore {
-    private static final String ipConfigFile = Environment.getDataDirectory() +
-            "/misc/ethernet/ipconfig.txt";
-
-    private IpConfigStore mStore = new IpConfigStore();
-    private ArrayMap<String, IpConfiguration> mIpConfigurations;
-    private IpConfiguration mIpConfigurationForDefaultInterface;
-    private final Object mSync = new Object();
-
-    public EthernetConfigStore() {
-        mIpConfigurations = new ArrayMap<>(0);
-    }
-
-    public void read() {
-        synchronized (mSync) {
-            ArrayMap<String, IpConfiguration> configs =
-                    IpConfigStore.readIpConfigurations(ipConfigFile);
-
-            // This configuration may exist in old file versions when there was only a single active
-            // Ethernet interface.
-            if (configs.containsKey("0")) {
-                mIpConfigurationForDefaultInterface = configs.remove("0");
-            }
-
-            mIpConfigurations = configs;
-        }
-    }
-
-    public void write(String iface, IpConfiguration config) {
-        boolean modified;
-
-        synchronized (mSync) {
-            if (config == null) {
-                modified = mIpConfigurations.remove(iface) != null;
-            } else {
-                IpConfiguration oldConfig = mIpConfigurations.put(iface, config);
-                modified = !config.equals(oldConfig);
-            }
-
-            if (modified) {
-                mStore.writeIpConfigurations(ipConfigFile, mIpConfigurations);
-            }
-        }
-    }
-
-    public ArrayMap<String, IpConfiguration> getIpConfigurations() {
-        synchronized (mSync) {
-            return new ArrayMap<>(mIpConfigurations);
-        }
-    }
-
-    @Nullable
-    public IpConfiguration getIpConfigurationForDefaultInterface() {
-        synchronized (mSync) {
-            return mIpConfigurationForDefaultInterface == null
-                    ? null : new IpConfiguration(mIpConfigurationForDefaultInterface);
-        }
-    }
-}
diff --git a/java/com/android/server/ethernet/EthernetNetworkAgent.java b/java/com/android/server/ethernet/EthernetNetworkAgent.java
deleted file mode 100644
index 57fbce7..0000000
--- a/java/com/android/server/ethernet/EthernetNetworkAgent.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.ethernet;
-
-import android.content.Context;
-import android.net.LinkProperties;
-import android.net.NetworkAgent;
-import android.net.NetworkAgentConfig;
-import android.net.NetworkCapabilities;
-import android.net.NetworkProvider;
-import android.net.NetworkScore;
-import android.os.Looper;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-
-public class EthernetNetworkAgent extends NetworkAgent {
-
-    private static final String TAG = "EthernetNetworkAgent";
-
-    public interface Callbacks {
-        void onNetworkUnwanted();
-    }
-
-    private final Callbacks mCallbacks;
-
-    EthernetNetworkAgent(
-            @NonNull Context context,
-            @NonNull Looper looper,
-            @NonNull NetworkCapabilities nc,
-            @NonNull LinkProperties lp,
-            @NonNull NetworkAgentConfig config,
-            @Nullable NetworkProvider provider,
-            @NonNull Callbacks cb) {
-        super(context, looper, TAG, nc, lp, new NetworkScore.Builder().build(), config, provider);
-        mCallbacks = cb;
-    }
-
-    @Override
-    public void onNetworkUnwanted() {
-        mCallbacks.onNetworkUnwanted();
-    }
-
-    // sendLinkProperties is final in NetworkAgent, so it cannot be mocked.
-    public void sendLinkPropertiesImpl(LinkProperties lp) {
-        sendLinkProperties(lp);
-    }
-
-    public Callbacks getCallbacks() {
-        return mCallbacks;
-    }
-}
diff --git a/java/com/android/server/ethernet/EthernetNetworkFactory.java b/java/com/android/server/ethernet/EthernetNetworkFactory.java
deleted file mode 100644
index 8ce27a6..0000000
--- a/java/com/android/server/ethernet/EthernetNetworkFactory.java
+++ /dev/null
@@ -1,752 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.ethernet;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.content.Context;
-import android.net.ConnectivityManager;
-import android.net.EthernetManager;
-import android.net.EthernetNetworkSpecifier;
-import android.net.IEthernetNetworkManagementListener;
-import android.net.EthernetNetworkManagementException;
-import android.net.IpConfiguration;
-import android.net.IpConfiguration.IpAssignment;
-import android.net.IpConfiguration.ProxySettings;
-import android.net.LinkProperties;
-import android.net.Network;
-import android.net.NetworkAgentConfig;
-import android.net.NetworkCapabilities;
-import android.net.NetworkFactory;
-import android.net.NetworkProvider;
-import android.net.NetworkRequest;
-import android.net.NetworkSpecifier;
-import android.net.ip.IIpClient;
-import android.net.ip.IpClientCallbacks;
-import android.net.ip.IpClientManager;
-import android.net.ip.IpClientUtil;
-import android.net.shared.ProvisioningConfiguration;
-import android.os.ConditionVariable;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.RemoteException;
-import android.text.TextUtils;
-import android.util.AndroidRuntimeException;
-import android.util.Log;
-import android.util.SparseArray;
-
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.util.IndentingPrintWriter;
-import com.android.net.module.util.InterfaceParams;
-
-import java.io.FileDescriptor;
-import java.util.Objects;
-import java.util.concurrent.ConcurrentHashMap;
-
-/**
- * {@link NetworkFactory} that represents Ethernet networks.
- *
- * This class reports a static network score of 70 when it is tracking an interface and that
- * interface's link is up, and a score of 0 otherwise.
- */
-public class EthernetNetworkFactory extends NetworkFactory {
-    private final static String TAG = EthernetNetworkFactory.class.getSimpleName();
-    final static boolean DBG = true;
-
-    private final static int NETWORK_SCORE = 70;
-    private static final String NETWORK_TYPE = "Ethernet";
-
-    private final ConcurrentHashMap<String, NetworkInterfaceState> mTrackingInterfaces =
-            new ConcurrentHashMap<>();
-    private final Handler mHandler;
-    private final Context mContext;
-    final Dependencies mDeps;
-
-    public static class Dependencies {
-        public void makeIpClient(Context context, String iface, IpClientCallbacks callbacks) {
-            IpClientUtil.makeIpClient(context, iface, callbacks);
-        }
-
-        public IpClientManager makeIpClientManager(@NonNull final IIpClient ipClient) {
-            return new IpClientManager(ipClient, TAG);
-        }
-
-        public EthernetNetworkAgent makeEthernetNetworkAgent(Context context, Looper looper,
-                NetworkCapabilities nc, LinkProperties lp, NetworkAgentConfig config,
-                NetworkProvider provider, EthernetNetworkAgent.Callbacks cb) {
-            return new EthernetNetworkAgent(context, looper, nc, lp, config, provider, cb);
-        }
-
-        public InterfaceParams getNetworkInterfaceByName(String name) {
-            return InterfaceParams.getByName(name);
-        }
-    }
-
-    public static class ConfigurationException extends AndroidRuntimeException {
-        public ConfigurationException(String msg) {
-            super(msg);
-        }
-    }
-
-    public EthernetNetworkFactory(Handler handler, Context context) {
-        this(handler, context, new Dependencies());
-    }
-
-    @VisibleForTesting
-    EthernetNetworkFactory(Handler handler, Context context, Dependencies deps) {
-        super(handler.getLooper(), context, NETWORK_TYPE, createDefaultNetworkCapabilities());
-
-        mHandler = handler;
-        mContext = context;
-        mDeps = deps;
-
-        setScoreFilter(NETWORK_SCORE);
-    }
-
-    @Override
-    public boolean acceptRequest(NetworkRequest request) {
-        if (DBG) {
-            Log.d(TAG, "acceptRequest, request: " + request);
-        }
-
-        return networkForRequest(request) != null;
-    }
-
-    @Override
-    protected void needNetworkFor(NetworkRequest networkRequest) {
-        NetworkInterfaceState network = networkForRequest(networkRequest);
-
-        if (network == null) {
-            Log.e(TAG, "needNetworkFor, failed to get a network for " + networkRequest);
-            return;
-        }
-
-        if (++network.refCount == 1) {
-            network.start();
-        }
-    }
-
-    @Override
-    protected void releaseNetworkFor(NetworkRequest networkRequest) {
-        NetworkInterfaceState network = networkForRequest(networkRequest);
-        if (network == null) {
-            Log.e(TAG, "releaseNetworkFor, failed to get a network for " + networkRequest);
-            return;
-        }
-
-        if (--network.refCount == 0) {
-            network.stop();
-        }
-    }
-
-    /**
-     * Returns an array of available interface names. The array is sorted: unrestricted interfaces
-     * goes first, then sorted by name.
-     */
-    String[] getAvailableInterfaces(boolean includeRestricted) {
-        return mTrackingInterfaces.values()
-                .stream()
-                .filter(iface -> !iface.isRestricted() || includeRestricted)
-                .sorted((iface1, iface2) -> {
-                    int r = Boolean.compare(iface1.isRestricted(), iface2.isRestricted());
-                    return r == 0 ? iface1.name.compareTo(iface2.name) : r;
-                })
-                .map(iface -> iface.name)
-                .toArray(String[]::new);
-    }
-
-    void addInterface(@NonNull final String ifaceName, @NonNull final String hwAddress,
-            @NonNull final IpConfiguration ipConfig,
-            @NonNull final NetworkCapabilities capabilities) {
-        if (mTrackingInterfaces.containsKey(ifaceName)) {
-            Log.e(TAG, "Interface with name " + ifaceName + " already exists.");
-            return;
-        }
-
-        final NetworkCapabilities nc = new NetworkCapabilities.Builder(capabilities)
-                .setNetworkSpecifier(new EthernetNetworkSpecifier(ifaceName))
-                .build();
-
-        if (DBG) {
-            Log.d(TAG, "addInterface, iface: " + ifaceName + ", capabilities: " + nc);
-        }
-
-        final NetworkInterfaceState iface = new NetworkInterfaceState(
-                ifaceName, hwAddress, mHandler, mContext, ipConfig, nc, this, mDeps);
-        mTrackingInterfaces.put(ifaceName, iface);
-        updateCapabilityFilter();
-    }
-
-    @VisibleForTesting
-    protected int getInterfaceState(@NonNull String iface) {
-        final NetworkInterfaceState interfaceState = mTrackingInterfaces.get(iface);
-        if (interfaceState == null) {
-            return EthernetManager.STATE_ABSENT;
-        } else if (!interfaceState.mLinkUp) {
-            return EthernetManager.STATE_LINK_DOWN;
-        } else {
-            return EthernetManager.STATE_LINK_UP;
-        }
-    }
-
-    /**
-     * Update a network's configuration and restart it if necessary.
-     *
-     * @param ifaceName the interface name of the network to be updated.
-     * @param ipConfig the desired {@link IpConfiguration} for the given network.
-     * @param capabilities the desired {@link NetworkCapabilities} for the given network. If
-     *                     {@code null} is passed, then the network's current
-     *                     {@link NetworkCapabilities} will be used in support of existing APIs as
-     *                     the public API does not allow this.
-     * @param listener an optional {@link IEthernetNetworkManagementListener} to notify callers of
-     *                 completion.
-     */
-    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
-    protected void updateInterface(@NonNull final String ifaceName,
-            @NonNull final IpConfiguration ipConfig,
-            @Nullable final NetworkCapabilities capabilities,
-            @Nullable final IEthernetNetworkManagementListener listener) {
-        if (!hasInterface(ifaceName)) {
-            maybeSendNetworkManagementCallbackForUntracked(ifaceName, listener);
-            return;
-        }
-
-        final NetworkInterfaceState iface = mTrackingInterfaces.get(ifaceName);
-        iface.updateInterface(ipConfig, capabilities, listener);
-        mTrackingInterfaces.put(ifaceName, iface);
-        updateCapabilityFilter();
-    }
-
-    private static NetworkCapabilities mixInCapabilities(NetworkCapabilities nc,
-            NetworkCapabilities addedNc) {
-       final NetworkCapabilities.Builder builder = new NetworkCapabilities.Builder(nc);
-       for (int transport : addedNc.getTransportTypes()) builder.addTransportType(transport);
-       for (int capability : addedNc.getCapabilities()) builder.addCapability(capability);
-       return builder.build();
-    }
-
-    private void updateCapabilityFilter() {
-        NetworkCapabilities capabilitiesFilter = createDefaultNetworkCapabilities();
-        for (NetworkInterfaceState iface:  mTrackingInterfaces.values()) {
-            capabilitiesFilter = mixInCapabilities(capabilitiesFilter, iface.mCapabilities);
-        }
-
-        if (DBG) Log.d(TAG, "updateCapabilityFilter: " + capabilitiesFilter);
-        setCapabilityFilter(capabilitiesFilter);
-    }
-
-    private static NetworkCapabilities createDefaultNetworkCapabilities() {
-        return NetworkCapabilities.Builder
-                .withoutDefaultCapabilities()
-                .addTransportType(NetworkCapabilities.TRANSPORT_ETHERNET).build();
-    }
-
-    void removeInterface(String interfaceName) {
-        NetworkInterfaceState iface = mTrackingInterfaces.remove(interfaceName);
-        if (iface != null) {
-            iface.maybeSendNetworkManagementCallbackForAbort();
-            iface.stop();
-        }
-
-        updateCapabilityFilter();
-    }
-
-    /** Returns true if state has been modified */
-    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
-    protected boolean updateInterfaceLinkState(@NonNull final String ifaceName, final boolean up,
-            @Nullable final IEthernetNetworkManagementListener listener) {
-        if (!hasInterface(ifaceName)) {
-            maybeSendNetworkManagementCallbackForUntracked(ifaceName, listener);
-            return false;
-        }
-
-        if (DBG) {
-            Log.d(TAG, "updateInterfaceLinkState, iface: " + ifaceName + ", up: " + up);
-        }
-
-        NetworkInterfaceState iface = mTrackingInterfaces.get(ifaceName);
-        return iface.updateLinkState(up, listener);
-    }
-
-    private void maybeSendNetworkManagementCallbackForUntracked(
-            String ifaceName, IEthernetNetworkManagementListener listener) {
-        maybeSendNetworkManagementCallback(listener, null,
-                new EthernetNetworkManagementException(
-                        ifaceName + " can't be updated as it is not available."));
-    }
-
-    @VisibleForTesting
-    protected boolean hasInterface(String ifaceName) {
-        return mTrackingInterfaces.containsKey(ifaceName);
-    }
-
-    private NetworkInterfaceState networkForRequest(NetworkRequest request) {
-        String requestedIface = null;
-
-        NetworkSpecifier specifier = request.getNetworkSpecifier();
-        if (specifier instanceof EthernetNetworkSpecifier) {
-            requestedIface = ((EthernetNetworkSpecifier) specifier)
-                .getInterfaceName();
-        }
-
-        NetworkInterfaceState network = null;
-        if (!TextUtils.isEmpty(requestedIface)) {
-            NetworkInterfaceState n = mTrackingInterfaces.get(requestedIface);
-            if (n != null && request.canBeSatisfiedBy(n.mCapabilities)) {
-                network = n;
-            }
-        } else {
-            for (NetworkInterfaceState n : mTrackingInterfaces.values()) {
-                if (request.canBeSatisfiedBy(n.mCapabilities) && n.mLinkUp) {
-                    network = n;
-                    break;
-                }
-            }
-        }
-
-        if (DBG) {
-            Log.i(TAG, "networkForRequest, request: " + request + ", network: " + network);
-        }
-
-        return network;
-    }
-
-    private static void maybeSendNetworkManagementCallback(
-            @Nullable final IEthernetNetworkManagementListener listener,
-            @Nullable final Network network,
-            @Nullable final EthernetNetworkManagementException e) {
-        if (null == listener) {
-            return;
-        }
-
-        try {
-            listener.onComplete(network, e);
-        } catch (RemoteException re) {
-            Log.e(TAG, "Can't send onComplete for network management callback", re);
-        }
-    }
-
-    @VisibleForTesting
-    static class NetworkInterfaceState {
-        final String name;
-
-        private final String mHwAddress;
-        private final Handler mHandler;
-        private final Context mContext;
-        private final NetworkFactory mNetworkFactory;
-        private final Dependencies mDeps;
-
-        private static String sTcpBufferSizes = null;  // Lazy initialized.
-
-        private boolean mLinkUp;
-        private int mLegacyType;
-        private LinkProperties mLinkProperties = new LinkProperties();
-
-        private volatile @Nullable IpClientManager mIpClient;
-        private @NonNull NetworkCapabilities mCapabilities;
-        private @Nullable EthernetIpClientCallback mIpClientCallback;
-        private @Nullable EthernetNetworkAgent mNetworkAgent;
-        private @Nullable IpConfiguration mIpConfig;
-
-        /**
-         * A map of TRANSPORT_* types to legacy transport types available for each type an ethernet
-         * interface could propagate.
-         *
-         * There are no legacy type equivalents to LOWPAN or WIFI_AWARE. These types are set to
-         * TYPE_NONE to match the behavior of their own network factories.
-         */
-        private static final SparseArray<Integer> sTransports = new SparseArray();
-        static {
-            sTransports.put(NetworkCapabilities.TRANSPORT_ETHERNET,
-                    ConnectivityManager.TYPE_ETHERNET);
-            sTransports.put(NetworkCapabilities.TRANSPORT_BLUETOOTH,
-                    ConnectivityManager.TYPE_BLUETOOTH);
-            sTransports.put(NetworkCapabilities.TRANSPORT_WIFI, ConnectivityManager.TYPE_WIFI);
-            sTransports.put(NetworkCapabilities.TRANSPORT_CELLULAR,
-                    ConnectivityManager.TYPE_MOBILE);
-            sTransports.put(NetworkCapabilities.TRANSPORT_LOWPAN, ConnectivityManager.TYPE_NONE);
-            sTransports.put(NetworkCapabilities.TRANSPORT_WIFI_AWARE,
-                    ConnectivityManager.TYPE_NONE);
-        }
-
-        long refCount = 0;
-
-        private class EthernetIpClientCallback extends IpClientCallbacks {
-            private final ConditionVariable mIpClientStartCv = new ConditionVariable(false);
-            private final ConditionVariable mIpClientShutdownCv = new ConditionVariable(false);
-            @Nullable IEthernetNetworkManagementListener mNetworkManagementListener;
-
-            EthernetIpClientCallback(@Nullable final IEthernetNetworkManagementListener listener) {
-                mNetworkManagementListener = listener;
-            }
-
-            @Override
-            public void onIpClientCreated(IIpClient ipClient) {
-                mIpClient = mDeps.makeIpClientManager(ipClient);
-                mIpClientStartCv.open();
-            }
-
-            private void awaitIpClientStart() {
-                mIpClientStartCv.block();
-            }
-
-            private void awaitIpClientShutdown() {
-                mIpClientShutdownCv.block();
-            }
-
-            @Override
-            public void onProvisioningSuccess(LinkProperties newLp) {
-                mHandler.post(() -> onIpLayerStarted(newLp, mNetworkManagementListener));
-            }
-
-            @Override
-            public void onProvisioningFailure(LinkProperties newLp) {
-                mHandler.post(() -> onIpLayerStopped(mNetworkManagementListener));
-            }
-
-            @Override
-            public void onLinkPropertiesChange(LinkProperties newLp) {
-                mHandler.post(() -> updateLinkProperties(newLp));
-            }
-
-            @Override
-            public void onReachabilityLost(String logMsg) {
-                mHandler.post(() -> updateNeighborLostEvent(logMsg));
-            }
-
-            @Override
-            public void onQuit() {
-                mIpClient = null;
-                mIpClientShutdownCv.open();
-            }
-        }
-
-        NetworkInterfaceState(String ifaceName, String hwAddress, Handler handler, Context context,
-                @NonNull IpConfiguration ipConfig, @NonNull NetworkCapabilities capabilities,
-                NetworkFactory networkFactory, Dependencies deps) {
-            name = ifaceName;
-            mIpConfig = Objects.requireNonNull(ipConfig);
-            mCapabilities = Objects.requireNonNull(capabilities);
-            mLegacyType = getLegacyType(mCapabilities);
-            mHandler = handler;
-            mContext = context;
-            mNetworkFactory = networkFactory;
-            mDeps = deps;
-            mHwAddress = hwAddress;
-        }
-
-        /**
-         * Determines the legacy transport type from a NetworkCapabilities transport type. Defaults
-         * to legacy TYPE_NONE if there is no known conversion
-         */
-        private static int getLegacyType(int transport) {
-            return sTransports.get(transport, ConnectivityManager.TYPE_NONE);
-        }
-
-        private static int getLegacyType(@NonNull final NetworkCapabilities capabilities) {
-            final int[] transportTypes = capabilities.getTransportTypes();
-            if (transportTypes.length > 0) {
-                return getLegacyType(transportTypes[0]);
-            }
-
-            // Should never happen as transport is always one of ETHERNET or a valid override
-            throw new ConfigurationException("Network Capabilities do not have an associated "
-                    + "transport type.");
-        }
-
-        private void setCapabilities(@NonNull final NetworkCapabilities capabilities) {
-            mCapabilities = new NetworkCapabilities(capabilities);
-            mLegacyType = getLegacyType(mCapabilities);
-        }
-
-        void updateInterface(@NonNull final IpConfiguration ipConfig,
-                @Nullable final NetworkCapabilities capabilities,
-                @Nullable final IEthernetNetworkManagementListener listener) {
-            if (DBG) {
-                Log.d(TAG, "updateInterface, iface: " + name
-                        + ", ipConfig: " + ipConfig + ", old ipConfig: " + mIpConfig
-                        + ", capabilities: " + capabilities + ", old capabilities: " + mCapabilities
-                        + ", listener: " + listener
-                );
-            }
-
-            mIpConfig = ipConfig;
-            setCapabilities(capabilities);
-            // Send an abort callback if a request is filed before the previous one has completed.
-            maybeSendNetworkManagementCallbackForAbort();
-            // TODO: Update this logic to only do a restart if required. Although a restart may
-            //  be required due to the capabilities or ipConfiguration values, not all
-            //  capabilities changes require a restart.
-            restart(listener);
-        }
-
-        boolean isRestricted() {
-            return !mCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED);
-        }
-
-        private void start() {
-            start(null);
-        }
-
-        private void start(@Nullable final IEthernetNetworkManagementListener listener) {
-            if (mIpClient != null) {
-                if (DBG) Log.d(TAG, "IpClient already started");
-                return;
-            }
-            if (DBG) {
-                Log.d(TAG, String.format("Starting Ethernet IpClient(%s)", name));
-            }
-
-            mIpClientCallback = new EthernetIpClientCallback(listener);
-            mDeps.makeIpClient(mContext, name, mIpClientCallback);
-            mIpClientCallback.awaitIpClientStart();
-
-            if (sTcpBufferSizes == null) {
-                sTcpBufferSizes = mContext.getResources().getString(
-                        com.android.internal.R.string.config_ethernet_tcp_buffers);
-            }
-            provisionIpClient(mIpClient, mIpConfig, sTcpBufferSizes);
-        }
-
-        void onIpLayerStarted(@NonNull final LinkProperties linkProperties,
-                @Nullable final IEthernetNetworkManagementListener listener) {
-            if(mIpClient == null) {
-                // This call comes from a message posted on the handler thread, but the IpClient has
-                // since been stopped such as may be the case if updateInterfaceLinkState() is
-                // queued on the handler thread prior. As network management callbacks are sent in
-                // stop(), there is no need to send them again here.
-                if (DBG) Log.d(TAG, "IpClient is not initialized.");
-                return;
-            }
-            if (mNetworkAgent != null) {
-                Log.e(TAG, "Already have a NetworkAgent - aborting new request");
-                stop();
-                return;
-            }
-            mLinkProperties = linkProperties;
-
-            // Create our NetworkAgent.
-            final NetworkAgentConfig config = new NetworkAgentConfig.Builder()
-                    .setLegacyType(mLegacyType)
-                    .setLegacyTypeName(NETWORK_TYPE)
-                    .setLegacyExtraInfo(mHwAddress)
-                    .build();
-            mNetworkAgent = mDeps.makeEthernetNetworkAgent(mContext, mHandler.getLooper(),
-                    mCapabilities, mLinkProperties, config, mNetworkFactory.getProvider(),
-                    new EthernetNetworkAgent.Callbacks() {
-                        @Override
-                        public void onNetworkUnwanted() {
-                            // if mNetworkAgent is null, we have already called stop.
-                            if (mNetworkAgent == null) return;
-
-                            if (this == mNetworkAgent.getCallbacks()) {
-                                stop();
-                            } else {
-                                Log.d(TAG, "Ignoring unwanted as we have a more modern " +
-                                        "instance");
-                            }
-                        }
-                    });
-            mNetworkAgent.register();
-            mNetworkAgent.markConnected();
-            realizeNetworkManagementCallback(mNetworkAgent.getNetwork(), null);
-        }
-
-        void onIpLayerStopped(@Nullable final IEthernetNetworkManagementListener listener) {
-            // This cannot happen due to provisioning timeout, because our timeout is 0. It can
-            // happen due to errors while provisioning or on provisioning loss.
-            if(mIpClient == null) {
-                if (DBG) Log.d(TAG, "IpClient is not initialized.");
-                return;
-            }
-            // There is no point in continuing if the interface is gone as stop() will be triggered
-            // by removeInterface() when processed on the handler thread and start() won't
-            // work for a non-existent interface.
-            if (null == mDeps.getNetworkInterfaceByName(name)) {
-                if (DBG) Log.d(TAG, name + " is no longer available.");
-                // Send a callback in case a provisioning request was in progress.
-                maybeSendNetworkManagementCallbackForAbort();
-                return;
-            }
-            restart(listener);
-        }
-
-        private void maybeSendNetworkManagementCallbackForAbort() {
-            realizeNetworkManagementCallback(null,
-                    new EthernetNetworkManagementException(
-                            "The IP provisioning request has been aborted."));
-        }
-
-        // Must be called on the handler thread
-        private void realizeNetworkManagementCallback(@Nullable final Network network,
-                @Nullable final EthernetNetworkManagementException e) {
-            ensureRunningOnEthernetHandlerThread();
-            if (null == mIpClientCallback) {
-                return;
-            }
-
-            EthernetNetworkFactory.maybeSendNetworkManagementCallback(
-                    mIpClientCallback.mNetworkManagementListener, network, e);
-            // Only send a single callback per listener.
-            mIpClientCallback.mNetworkManagementListener = null;
-        }
-
-        private void ensureRunningOnEthernetHandlerThread() {
-            if (mHandler.getLooper().getThread() != Thread.currentThread()) {
-                throw new IllegalStateException(
-                        "Not running on the Ethernet thread: "
-                                + Thread.currentThread().getName());
-            }
-        }
-
-        void updateLinkProperties(LinkProperties linkProperties) {
-            if(mIpClient == null) {
-                if (DBG) Log.d(TAG, "IpClient is not initialized.");
-                return;
-            }
-            mLinkProperties = linkProperties;
-            if (mNetworkAgent != null) {
-                mNetworkAgent.sendLinkPropertiesImpl(linkProperties);
-            }
-        }
-
-        void updateNeighborLostEvent(String logMsg) {
-            if(mIpClient == null) {
-                if (DBG) Log.d(TAG, "IpClient is not initialized.");
-                return;
-            }
-            Log.i(TAG, "updateNeighborLostEvent " + logMsg);
-            // Reachability lost will be seen only if the gateway is not reachable.
-            // Since ethernet FW doesn't have the mechanism to scan for new networks
-            // like WiFi, simply restart.
-            // If there is a better network, that will become default and apps
-            // will be able to use internet. If ethernet gets connected again,
-            // and has backhaul connectivity, it will become default.
-            restart();
-        }
-
-        /** Returns true if state has been modified */
-        boolean updateLinkState(final boolean up,
-                @Nullable final IEthernetNetworkManagementListener listener) {
-            if (mLinkUp == up)  {
-                EthernetNetworkFactory.maybeSendNetworkManagementCallback(listener, null,
-                        new EthernetNetworkManagementException(
-                                "No changes with requested link state " + up + " for " + name));
-                return false;
-            }
-            mLinkUp = up;
-
-            if (!up) { // was up, goes down
-                // Save an instance of the current network to use with the callback before stop().
-                final Network network = mNetworkAgent != null ? mNetworkAgent.getNetwork() : null;
-                // Send an abort on a provisioning request callback if necessary before stopping.
-                maybeSendNetworkManagementCallbackForAbort();
-                stop();
-                // If only setting the interface down, send a callback to signal completion.
-                EthernetNetworkFactory.maybeSendNetworkManagementCallback(listener, network, null);
-            } else { // was down, goes up
-                stop();
-                start(listener);
-            }
-
-            return true;
-        }
-
-        void stop() {
-            // Invalidate all previous start requests
-            if (mIpClient != null) {
-                mIpClient.shutdown();
-                mIpClientCallback.awaitIpClientShutdown();
-                mIpClient = null;
-            }
-            mIpClientCallback = null;
-
-            if (mNetworkAgent != null) {
-                mNetworkAgent.unregister();
-                mNetworkAgent = null;
-            }
-            mLinkProperties.clear();
-        }
-
-        private static void provisionIpClient(@NonNull final IpClientManager ipClient,
-                @NonNull final IpConfiguration config, @NonNull final String tcpBufferSizes) {
-            if (config.getProxySettings() == ProxySettings.STATIC ||
-                    config.getProxySettings() == ProxySettings.PAC) {
-                ipClient.setHttpProxy(config.getHttpProxy());
-            }
-
-            if (!TextUtils.isEmpty(tcpBufferSizes)) {
-                ipClient.setTcpBufferSizes(tcpBufferSizes);
-            }
-
-            ipClient.startProvisioning(createProvisioningConfiguration(config));
-        }
-
-        private static ProvisioningConfiguration createProvisioningConfiguration(
-                @NonNull final IpConfiguration config) {
-            if (config.getIpAssignment() == IpAssignment.STATIC) {
-                return new ProvisioningConfiguration.Builder()
-                        .withStaticConfiguration(config.getStaticIpConfiguration())
-                        .build();
-            }
-            return new ProvisioningConfiguration.Builder()
-                        .withProvisioningTimeoutMs(0)
-                        .build();
-        }
-
-        void restart() {
-            restart(null);
-        }
-
-        void restart(@Nullable final IEthernetNetworkManagementListener listener){
-            if (DBG) Log.d(TAG, "reconnecting Ethernet");
-            stop();
-            start(listener);
-        }
-
-        @Override
-        public String toString() {
-            return getClass().getSimpleName() + "{ "
-                    + "refCount: " + refCount + ", "
-                    + "iface: " + name + ", "
-                    + "up: " + mLinkUp + ", "
-                    + "hwAddress: " + mHwAddress + ", "
-                    + "networkCapabilities: " + mCapabilities + ", "
-                    + "networkAgent: " + mNetworkAgent + ", "
-                    + "ipClient: " + mIpClient + ","
-                    + "linkProperties: " + mLinkProperties
-                    + "}";
-        }
-    }
-
-    void dump(FileDescriptor fd, IndentingPrintWriter pw, String[] args) {
-        super.dump(fd, pw, args);
-        pw.println(getClass().getSimpleName());
-        pw.println("Tracking interfaces:");
-        pw.increaseIndent();
-        for (String iface: mTrackingInterfaces.keySet()) {
-            NetworkInterfaceState ifaceState = mTrackingInterfaces.get(iface);
-            pw.println(iface + ":" + ifaceState);
-            pw.increaseIndent();
-            if (null == ifaceState.mIpClient) {
-                pw.println("IpClient is null");
-            }
-            pw.decreaseIndent();
-        }
-        pw.decreaseIndent();
-    }
-}
diff --git a/java/com/android/server/ethernet/EthernetService.java b/java/com/android/server/ethernet/EthernetService.java
deleted file mode 100644
index e6fee9e..0000000
--- a/java/com/android/server/ethernet/EthernetService.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.ethernet;
-
-import android.content.Context;
-import android.net.INetd;
-import android.os.Handler;
-import android.os.HandlerThread;
-import android.os.IBinder;
-import android.util.Log;
-import com.android.server.SystemService;
-
-import java.util.Objects;
-
-public final class EthernetService extends SystemService {
-
-    private static final String TAG = "EthernetService";
-    private static final String THREAD_NAME = "EthernetServiceThread";
-    private final EthernetServiceImpl mImpl;
-
-    public EthernetService(Context context) {
-        super(context);
-        final HandlerThread handlerThread = new HandlerThread(THREAD_NAME);
-        handlerThread.start();
-        final Handler handler = handlerThread.getThreadHandler();
-        final EthernetNetworkFactory factory = new EthernetNetworkFactory(handler, context);
-        mImpl = new EthernetServiceImpl(
-                context, handler,
-                new EthernetTracker(context, handler, factory, getNetd(context)));
-    }
-
-    private INetd getNetd(Context context) {
-        final INetd netd =
-                INetd.Stub.asInterface((IBinder) context.getSystemService(Context.NETD_SERVICE));
-        Objects.requireNonNull(netd, "could not get netd instance");
-        return netd;
-    }
-
-    @Override
-    public void onStart() {
-        Log.i(TAG, "Registering service " + Context.ETHERNET_SERVICE);
-        publishBinderService(Context.ETHERNET_SERVICE, mImpl);
-    }
-
-    @Override
-    public void onBootPhase(int phase) {
-        if (phase == SystemService.PHASE_SYSTEM_SERVICES_READY) {
-            mImpl.start();
-        }
-    }
-}
diff --git a/java/com/android/server/ethernet/EthernetServiceImpl.java b/java/com/android/server/ethernet/EthernetServiceImpl.java
deleted file mode 100644
index f80f6a0..0000000
--- a/java/com/android/server/ethernet/EthernetServiceImpl.java
+++ /dev/null
@@ -1,253 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.ethernet;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.content.Context;
-import android.content.pm.PackageManager;
-import android.net.IEthernetManager;
-import android.net.IEthernetServiceListener;
-import android.net.IEthernetNetworkManagementListener;
-import android.net.ITetheredInterfaceCallback;
-import android.net.EthernetNetworkUpdateRequest;
-import android.net.IpConfiguration;
-import android.os.Binder;
-import android.os.Handler;
-import android.os.RemoteException;
-import android.util.Log;
-import android.util.PrintWriterPrinter;
-
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.util.IndentingPrintWriter;
-import com.android.net.module.util.PermissionUtils;
-
-import java.io.FileDescriptor;
-import java.io.PrintWriter;
-import java.util.Objects;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-/**
- * EthernetServiceImpl handles remote Ethernet operation requests by implementing
- * the IEthernetManager interface.
- */
-public class EthernetServiceImpl extends IEthernetManager.Stub {
-    private static final String TAG = "EthernetServiceImpl";
-
-    @VisibleForTesting
-    final AtomicBoolean mStarted = new AtomicBoolean(false);
-    private final Context mContext;
-    private final Handler mHandler;
-    private final EthernetTracker mTracker;
-
-    EthernetServiceImpl(@NonNull final Context context, @NonNull final Handler handler,
-            @NonNull final EthernetTracker tracker) {
-        mContext = context;
-        mHandler = handler;
-        mTracker = tracker;
-    }
-
-    private void enforceAutomotiveDevice(final @NonNull String methodName) {
-        PermissionUtils.enforceSystemFeature(mContext, PackageManager.FEATURE_AUTOMOTIVE,
-                methodName + " is only available on automotive devices.");
-    }
-
-    private boolean checkUseRestrictedNetworksPermission() {
-        return PermissionUtils.checkAnyPermissionOf(mContext,
-                android.Manifest.permission.CONNECTIVITY_USE_RESTRICTED_NETWORKS);
-    }
-
-    public void start() {
-        Log.i(TAG, "Starting Ethernet service");
-        mTracker.start();
-        mStarted.set(true);
-    }
-
-    private void logIfEthernetNotStarted() {
-        if (!mStarted.get()) {
-            throw new IllegalStateException("System isn't ready to change ethernet configurations");
-        }
-    }
-
-    @Override
-    public String[] getAvailableInterfaces() throws RemoteException {
-        PermissionUtils.enforceAccessNetworkStatePermission(mContext, TAG);
-        return mTracker.getInterfaces(checkUseRestrictedNetworksPermission());
-    }
-
-    /**
-     * Get Ethernet configuration
-     * @return the Ethernet Configuration, contained in {@link IpConfiguration}.
-     */
-    @Override
-    public IpConfiguration getConfiguration(String iface) {
-        PermissionUtils.enforceAccessNetworkStatePermission(mContext, TAG);
-        if (mTracker.isRestrictedInterface(iface)) {
-            PermissionUtils.enforceRestrictedNetworkPermission(mContext, TAG);
-        }
-
-        return new IpConfiguration(mTracker.getIpConfiguration(iface));
-    }
-
-    /**
-     * Set Ethernet configuration
-     */
-    @Override
-    public void setConfiguration(String iface, IpConfiguration config) {
-        logIfEthernetNotStarted();
-
-        PermissionUtils.enforceNetworkStackPermission(mContext);
-        if (mTracker.isRestrictedInterface(iface)) {
-            PermissionUtils.enforceRestrictedNetworkPermission(mContext, TAG);
-        }
-
-        // TODO: this does not check proxy settings, gateways, etc.
-        // Fix this by making IpConfiguration a complete representation of static configuration.
-        mTracker.updateIpConfiguration(iface, new IpConfiguration(config));
-    }
-
-    /**
-     * Indicates whether given interface is available.
-     */
-    @Override
-    public boolean isAvailable(String iface) {
-        PermissionUtils.enforceAccessNetworkStatePermission(mContext, TAG);
-        if (mTracker.isRestrictedInterface(iface)) {
-            PermissionUtils.enforceRestrictedNetworkPermission(mContext, TAG);
-        }
-
-        return mTracker.isTrackingInterface(iface);
-    }
-
-    /**
-     * Adds a listener.
-     * @param listener A {@link IEthernetServiceListener} to add.
-     */
-    public void addListener(IEthernetServiceListener listener) throws RemoteException {
-        Objects.requireNonNull(listener, "listener must not be null");
-        PermissionUtils.enforceAccessNetworkStatePermission(mContext, TAG);
-        mTracker.addListener(listener, checkUseRestrictedNetworksPermission());
-    }
-
-    /**
-     * Removes a listener.
-     * @param listener A {@link IEthernetServiceListener} to remove.
-     */
-    public void removeListener(IEthernetServiceListener listener) {
-        if (listener == null) {
-            throw new IllegalArgumentException("listener must not be null");
-        }
-        PermissionUtils.enforceAccessNetworkStatePermission(mContext, TAG);
-        mTracker.removeListener(listener);
-    }
-
-    @Override
-    public void setIncludeTestInterfaces(boolean include) {
-        PermissionUtils.enforceNetworkStackPermissionOr(mContext,
-                android.Manifest.permission.NETWORK_SETTINGS);
-        mTracker.setIncludeTestInterfaces(include);
-    }
-
-    @Override
-    public void requestTetheredInterface(ITetheredInterfaceCallback callback) {
-        Objects.requireNonNull(callback, "callback must not be null");
-        PermissionUtils.enforceNetworkStackPermissionOr(mContext,
-                android.Manifest.permission.NETWORK_SETTINGS);
-        mTracker.requestTetheredInterface(callback);
-    }
-
-    @Override
-    public void releaseTetheredInterface(ITetheredInterfaceCallback callback) {
-        Objects.requireNonNull(callback, "callback must not be null");
-        PermissionUtils.enforceNetworkStackPermissionOr(mContext,
-                android.Manifest.permission.NETWORK_SETTINGS);
-        mTracker.releaseTetheredInterface(callback);
-    }
-
-    @Override
-    protected void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
-        final IndentingPrintWriter pw = new IndentingPrintWriter(writer, "  ");
-        if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP)
-                != PackageManager.PERMISSION_GRANTED) {
-            pw.println("Permission Denial: can't dump EthernetService from pid="
-                    + Binder.getCallingPid()
-                    + ", uid=" + Binder.getCallingUid());
-            return;
-        }
-
-        pw.println("Current Ethernet state: ");
-        pw.increaseIndent();
-        mTracker.dump(fd, pw, args);
-        pw.decreaseIndent();
-
-        pw.println("Handler:");
-        pw.increaseIndent();
-        mHandler.dump(new PrintWriterPrinter(pw), "EthernetServiceImpl");
-        pw.decreaseIndent();
-    }
-
-    private void enforceNetworkManagementPermission() {
-        mContext.enforceCallingOrSelfPermission(
-                android.Manifest.permission.MANAGE_ETHERNET_NETWORKS,
-                "EthernetServiceImpl");
-    }
-
-    /**
-     * Validate the state of ethernet for APIs tied to network management.
-     *
-     * @param iface the ethernet interface name to operate on.
-     * @param methodName the name of the calling method.
-     */
-    private void validateNetworkManagementState(@NonNull final String iface,
-            final @NonNull String methodName) {
-        Objects.requireNonNull(iface, "Pass a non-null iface.");
-        Objects.requireNonNull(methodName, "Pass a non-null methodName.");
-
-        enforceAutomotiveDevice(methodName);
-        enforceNetworkManagementPermission();
-        logIfEthernetNotStarted();
-    }
-
-    @Override
-    public void updateConfiguration(@NonNull final String iface,
-            @NonNull final EthernetNetworkUpdateRequest request,
-            @Nullable final IEthernetNetworkManagementListener listener) {
-        Log.i(TAG, "updateConfiguration called with: iface=" + iface
-                + ", request=" + request + ", listener=" + listener);
-        validateNetworkManagementState(iface, "updateConfiguration()");
-        // TODO: validate that iface is listed in overlay config_ethernet_interfaces
-
-        mTracker.updateConfiguration(
-                iface, request.getIpConfiguration(), request.getNetworkCapabilities(), listener);
-    }
-
-    @Override
-    public void connectNetwork(@NonNull final String iface,
-            @Nullable final IEthernetNetworkManagementListener listener) {
-        Log.i(TAG, "connectNetwork called with: iface=" + iface + ", listener=" + listener);
-        validateNetworkManagementState(iface, "connectNetwork()");
-        mTracker.connectNetwork(iface, listener);
-    }
-
-    @Override
-    public void disconnectNetwork(@NonNull final String iface,
-            @Nullable final IEthernetNetworkManagementListener listener) {
-        Log.i(TAG, "disconnectNetwork called with: iface=" + iface + ", listener=" + listener);
-        validateNetworkManagementState(iface, "disconnectNetwork()");
-        mTracker.disconnectNetwork(iface, listener);
-    }
-}
diff --git a/java/com/android/server/ethernet/EthernetTracker.java b/java/com/android/server/ethernet/EthernetTracker.java
deleted file mode 100644
index 794b5d1..0000000
--- a/java/com/android/server/ethernet/EthernetTracker.java
+++ /dev/null
@@ -1,795 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.ethernet;
-
-import static android.net.TestNetworkManager.TEST_TAP_PREFIX;
-
-import static com.android.internal.annotations.VisibleForTesting.Visibility.PACKAGE;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.content.Context;
-import android.net.EthernetManager;
-import android.net.IEthernetServiceListener;
-import android.net.IEthernetNetworkManagementListener;
-import android.net.INetd;
-import android.net.ITetheredInterfaceCallback;
-import android.net.InterfaceConfigurationParcel;
-import android.net.IpConfiguration;
-import android.net.IpConfiguration.IpAssignment;
-import android.net.IpConfiguration.ProxySettings;
-import android.net.LinkAddress;
-import android.net.NetworkCapabilities;
-import android.net.StaticIpConfiguration;
-import android.os.ConditionVariable;
-import android.os.Handler;
-import android.os.RemoteCallbackList;
-import android.os.RemoteException;
-import android.os.ServiceSpecificException;
-import android.text.TextUtils;
-import android.util.ArrayMap;
-import android.util.Log;
-
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.util.IndentingPrintWriter;
-import com.android.net.module.util.BaseNetdUnsolicitedEventListener;
-import com.android.net.module.util.NetdUtils;
-import com.android.net.module.util.PermissionUtils;
-
-import java.io.FileDescriptor;
-import java.net.InetAddress;
-import java.util.ArrayList;
-import java.util.Objects;
-import java.util.concurrent.ConcurrentHashMap;
-
-/**
- * Tracks Ethernet interfaces and manages interface configurations.
- *
- * <p>Interfaces may have different {@link android.net.NetworkCapabilities}. This mapping is defined
- * in {@code config_ethernet_interfaces}. Notably, some interfaces could be marked as restricted by
- * not specifying {@link android.net.NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED} flag.
- * Interfaces could have associated {@link android.net.IpConfiguration}.
- * Ethernet Interfaces may be present at boot time or appear after boot (e.g., for Ethernet adapters
- * connected over USB). This class supports multiple interfaces. When an interface appears on the
- * system (or is present at boot time) this class will start tracking it and bring it up. Only
- * interfaces whose names match the {@code config_ethernet_iface_regex} regular expression are
- * tracked.
- *
- * <p>All public or package private methods must be thread-safe unless stated otherwise.
- */
-@VisibleForTesting(visibility = PACKAGE)
-public class EthernetTracker {
-    private static final int INTERFACE_MODE_CLIENT = 1;
-    private static final int INTERFACE_MODE_SERVER = 2;
-
-    private static final String TAG = EthernetTracker.class.getSimpleName();
-    private static final boolean DBG = EthernetNetworkFactory.DBG;
-
-    private static final String TEST_IFACE_REGEXP = TEST_TAP_PREFIX + "\\d+";
-
-    /**
-     * Interface names we track. This is a product-dependent regular expression, plus,
-     * if setIncludeTestInterfaces is true, any test interfaces.
-     */
-    private String mIfaceMatch;
-    private boolean mIncludeTestInterfaces = false;
-
-    /** Mapping between {iface name | mac address} -> {NetworkCapabilities} */
-    private final ConcurrentHashMap<String, NetworkCapabilities> mNetworkCapabilities =
-            new ConcurrentHashMap<>();
-    private final ConcurrentHashMap<String, IpConfiguration> mIpConfigurations =
-            new ConcurrentHashMap<>();
-
-    private final Context mContext;
-    private final INetd mNetd;
-    private final Handler mHandler;
-    private final EthernetNetworkFactory mFactory;
-    private final EthernetConfigStore mConfigStore;
-
-    private final RemoteCallbackList<IEthernetServiceListener> mListeners =
-            new RemoteCallbackList<>();
-    private final TetheredInterfaceRequestList mTetheredInterfaceRequests =
-            new TetheredInterfaceRequestList();
-
-    // Used only on the handler thread
-    private String mDefaultInterface;
-    private int mDefaultInterfaceMode = INTERFACE_MODE_CLIENT;
-    // Tracks whether clients were notified that the tethered interface is available
-    private boolean mTetheredInterfaceWasAvailable = false;
-    private volatile IpConfiguration mIpConfigForDefaultInterface;
-
-    private class TetheredInterfaceRequestList extends
-            RemoteCallbackList<ITetheredInterfaceCallback> {
-        @Override
-        public void onCallbackDied(ITetheredInterfaceCallback cb, Object cookie) {
-            mHandler.post(EthernetTracker.this::maybeUntetherDefaultInterface);
-        }
-    }
-
-    EthernetTracker(@NonNull final Context context, @NonNull final Handler handler,
-            @NonNull final EthernetNetworkFactory factory, @NonNull final INetd netd) {
-        mContext = context;
-        mHandler = handler;
-        mFactory = factory;
-        mNetd = netd;
-
-        // Interface match regex.
-        updateIfaceMatchRegexp();
-
-        // Read default Ethernet interface configuration from resources
-        final String[] interfaceConfigs = context.getResources().getStringArray(
-                com.android.internal.R.array.config_ethernet_interfaces);
-        for (String strConfig : interfaceConfigs) {
-            parseEthernetConfig(strConfig);
-        }
-
-        mConfigStore = new EthernetConfigStore();
-    }
-
-    void start() {
-        mFactory.register();
-        mConfigStore.read();
-
-        // Default interface is just the first one we want to track.
-        mIpConfigForDefaultInterface = mConfigStore.getIpConfigurationForDefaultInterface();
-        final ArrayMap<String, IpConfiguration> configs = mConfigStore.getIpConfigurations();
-        for (int i = 0; i < configs.size(); i++) {
-            mIpConfigurations.put(configs.keyAt(i), configs.valueAt(i));
-        }
-
-        try {
-            PermissionUtils.enforceNetworkStackPermission(mContext);
-            mNetd.registerUnsolicitedEventListener(new InterfaceObserver());
-        } catch (RemoteException | ServiceSpecificException e) {
-            Log.e(TAG, "Could not register InterfaceObserver " + e);
-        }
-
-        mHandler.post(this::trackAvailableInterfaces);
-    }
-
-    void updateIpConfiguration(String iface, IpConfiguration ipConfiguration) {
-        if (DBG) {
-            Log.i(TAG, "updateIpConfiguration, iface: " + iface + ", cfg: " + ipConfiguration);
-        }
-        writeIpConfiguration(iface, ipConfiguration);
-        mHandler.post(() -> {
-            mFactory.updateInterface(iface, ipConfiguration, null, null);
-            broadcastInterfaceStateChange(iface);
-        });
-    }
-
-    private void writeIpConfiguration(@NonNull final String iface,
-            @NonNull final IpConfiguration ipConfig) {
-        mConfigStore.write(iface, ipConfig);
-        mIpConfigurations.put(iface, ipConfig);
-    }
-
-    private IpConfiguration getIpConfigurationForCallback(String iface, int state) {
-        return (state == EthernetManager.STATE_ABSENT) ? null : getOrCreateIpConfiguration(iface);
-    }
-
-    private void ensureRunningOnEthernetServiceThread() {
-        if (mHandler.getLooper().getThread() != Thread.currentThread()) {
-            throw new IllegalStateException(
-                    "Not running on EthernetService thread: "
-                            + Thread.currentThread().getName());
-        }
-    }
-
-    /**
-     * Broadcast the link state or IpConfiguration change of existing Ethernet interfaces to all
-     * listeners.
-     */
-    protected void broadcastInterfaceStateChange(@NonNull String iface) {
-        ensureRunningOnEthernetServiceThread();
-        final int state = mFactory.getInterfaceState(iface);
-        final int role = getInterfaceRole(iface);
-        final IpConfiguration config = getIpConfigurationForCallback(iface, state);
-        final int n = mListeners.beginBroadcast();
-        for (int i = 0; i < n; i++) {
-            try {
-                mListeners.getBroadcastItem(i).onInterfaceStateChanged(iface, state, role, config);
-            } catch (RemoteException e) {
-                // Do nothing here.
-            }
-        }
-        mListeners.finishBroadcast();
-    }
-
-    /**
-     * Unicast the interface state or IpConfiguration change of existing Ethernet interfaces to a
-     * specific listener.
-     */
-    protected void unicastInterfaceStateChange(@NonNull IEthernetServiceListener listener,
-            @NonNull String iface) {
-        ensureRunningOnEthernetServiceThread();
-        final int state = mFactory.getInterfaceState(iface);
-        final int role = getInterfaceRole(iface);
-        final IpConfiguration config = getIpConfigurationForCallback(iface, state);
-        try {
-            listener.onInterfaceStateChanged(iface, state, role, config);
-        } catch (RemoteException e) {
-            // Do nothing here.
-        }
-    }
-
-    @VisibleForTesting(visibility = PACKAGE)
-    protected void updateConfiguration(@NonNull final String iface,
-            @NonNull final IpConfiguration ipConfig,
-            @NonNull final NetworkCapabilities capabilities,
-            @Nullable final IEthernetNetworkManagementListener listener) {
-        if (DBG) {
-            Log.i(TAG, "updateConfiguration, iface: " + iface + ", capabilities: " + capabilities
-                    + ", ipConfig: " + ipConfig);
-        }
-        final IpConfiguration localIpConfig = new IpConfiguration(ipConfig);
-        writeIpConfiguration(iface, localIpConfig);
-        mNetworkCapabilities.put(iface, capabilities);
-        mHandler.post(() -> {
-            mFactory.updateInterface(iface, localIpConfig, capabilities, listener);
-            broadcastInterfaceStateChange(iface);
-        });
-    }
-
-    @VisibleForTesting(visibility = PACKAGE)
-    protected void connectNetwork(@NonNull final String iface,
-            @Nullable final IEthernetNetworkManagementListener listener) {
-        mHandler.post(() -> updateInterfaceState(iface, true, listener));
-    }
-
-    @VisibleForTesting(visibility = PACKAGE)
-    protected void disconnectNetwork(@NonNull final String iface,
-            @Nullable final IEthernetNetworkManagementListener listener) {
-        mHandler.post(() -> updateInterfaceState(iface, false, listener));
-    }
-
-    IpConfiguration getIpConfiguration(String iface) {
-        return mIpConfigurations.get(iface);
-    }
-
-    @VisibleForTesting(visibility = PACKAGE)
-    protected boolean isTrackingInterface(String iface) {
-        return mFactory.hasInterface(iface);
-    }
-
-    String[] getInterfaces(boolean includeRestricted) {
-        return mFactory.getAvailableInterfaces(includeRestricted);
-    }
-
-    /**
-     * Returns true if given interface was configured as restricted (doesn't have
-     * NET_CAPABILITY_NOT_RESTRICTED) capability. Otherwise, returns false.
-     */
-    boolean isRestrictedInterface(String iface) {
-        final NetworkCapabilities nc = mNetworkCapabilities.get(iface);
-        return nc != null && !nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED);
-    }
-
-    void addListener(IEthernetServiceListener listener, boolean canUseRestrictedNetworks) {
-        mHandler.post(() -> {
-            if (!mListeners.register(listener, new ListenerInfo(canUseRestrictedNetworks))) {
-                // Remote process has already died
-                return;
-            }
-            for (String iface : getInterfaces(canUseRestrictedNetworks)) {
-                unicastInterfaceStateChange(listener, iface);
-            }
-        });
-    }
-
-    void removeListener(IEthernetServiceListener listener) {
-        mHandler.post(() -> mListeners.unregister(listener));
-    }
-
-    public void setIncludeTestInterfaces(boolean include) {
-        mHandler.post(() -> {
-            mIncludeTestInterfaces = include;
-            updateIfaceMatchRegexp();
-            mHandler.post(() -> trackAvailableInterfaces());
-        });
-    }
-
-    public void requestTetheredInterface(ITetheredInterfaceCallback callback) {
-        mHandler.post(() -> {
-            if (!mTetheredInterfaceRequests.register(callback)) {
-                // Remote process has already died
-                return;
-            }
-            if (mDefaultInterfaceMode == INTERFACE_MODE_SERVER) {
-                if (mTetheredInterfaceWasAvailable) {
-                    notifyTetheredInterfaceAvailable(callback, mDefaultInterface);
-                }
-                return;
-            }
-
-            setDefaultInterfaceMode(INTERFACE_MODE_SERVER);
-        });
-    }
-
-    public void releaseTetheredInterface(ITetheredInterfaceCallback callback) {
-        mHandler.post(() -> {
-            mTetheredInterfaceRequests.unregister(callback);
-            maybeUntetherDefaultInterface();
-        });
-    }
-
-    private void notifyTetheredInterfaceAvailable(ITetheredInterfaceCallback cb, String iface) {
-        try {
-            cb.onAvailable(iface);
-        } catch (RemoteException e) {
-            Log.e(TAG, "Error sending tethered interface available callback", e);
-        }
-    }
-
-    private void notifyTetheredInterfaceUnavailable(ITetheredInterfaceCallback cb) {
-        try {
-            cb.onUnavailable();
-        } catch (RemoteException e) {
-            Log.e(TAG, "Error sending tethered interface available callback", e);
-        }
-    }
-
-    private void maybeUntetherDefaultInterface() {
-        if (mTetheredInterfaceRequests.getRegisteredCallbackCount() > 0) return;
-        if (mDefaultInterfaceMode == INTERFACE_MODE_CLIENT) return;
-        setDefaultInterfaceMode(INTERFACE_MODE_CLIENT);
-    }
-
-    private void setDefaultInterfaceMode(int mode) {
-        Log.d(TAG, "Setting default interface mode to " + mode);
-        mDefaultInterfaceMode = mode;
-        if (mDefaultInterface != null) {
-            removeInterface(mDefaultInterface);
-            addInterface(mDefaultInterface);
-        }
-    }
-
-    private int getInterfaceRole(final String iface) {
-        if (!mFactory.hasInterface(iface)) return EthernetManager.ROLE_NONE;
-        final int mode = getInterfaceMode(iface);
-        return (mode == INTERFACE_MODE_CLIENT)
-                ? EthernetManager.ROLE_CLIENT
-                : EthernetManager.ROLE_SERVER;
-    }
-
-    private int getInterfaceMode(final String iface) {
-        if (iface.equals(mDefaultInterface)) {
-            return mDefaultInterfaceMode;
-        }
-        return INTERFACE_MODE_CLIENT;
-    }
-
-    private void removeInterface(String iface) {
-        mFactory.removeInterface(iface);
-        maybeUpdateServerModeInterfaceState(iface, false);
-    }
-
-    private void stopTrackingInterface(String iface) {
-        removeInterface(iface);
-        if (iface.equals(mDefaultInterface)) {
-            mDefaultInterface = null;
-        }
-        broadcastInterfaceStateChange(iface);
-    }
-
-    private void addInterface(String iface) {
-        InterfaceConfigurationParcel config = null;
-        // Bring up the interface so we get link status indications.
-        try {
-            PermissionUtils.enforceNetworkStackPermission(mContext);
-            NetdUtils.setInterfaceUp(mNetd, iface);
-            config = NetdUtils.getInterfaceConfigParcel(mNetd, iface);
-        } catch (IllegalStateException e) {
-            // Either the system is crashing or the interface has disappeared. Just ignore the
-            // error; we haven't modified any state because we only do that if our calls succeed.
-            Log.e(TAG, "Error upping interface " + iface, e);
-        }
-
-        if (config == null) {
-            Log.e(TAG, "Null interface config parcelable for " + iface + ". Bailing out.");
-            return;
-        }
-
-        final String hwAddress = config.hwAddr;
-
-        NetworkCapabilities nc = mNetworkCapabilities.get(iface);
-        if (nc == null) {
-            // Try to resolve using mac address
-            nc = mNetworkCapabilities.get(hwAddress);
-            if (nc == null) {
-                final boolean isTestIface = iface.matches(TEST_IFACE_REGEXP);
-                nc = createDefaultNetworkCapabilities(isTestIface);
-            }
-        }
-
-        final int mode = getInterfaceMode(iface);
-        if (mode == INTERFACE_MODE_CLIENT) {
-            IpConfiguration ipConfiguration = getOrCreateIpConfiguration(iface);
-            Log.d(TAG, "Tracking interface in client mode: " + iface);
-            mFactory.addInterface(iface, hwAddress, ipConfiguration, nc);
-        } else {
-            maybeUpdateServerModeInterfaceState(iface, true);
-        }
-
-        // Note: if the interface already has link (e.g., if we crashed and got
-        // restarted while it was running), we need to fake a link up notification so we
-        // start configuring it.
-        if (NetdUtils.hasFlag(config, "running")) {
-            updateInterfaceState(iface, true);
-        }
-    }
-
-    private void updateInterfaceState(String iface, boolean up) {
-        updateInterfaceState(iface, up, null /* listener */);
-    }
-
-    private void updateInterfaceState(@NonNull final String iface, final boolean up,
-            @Nullable final IEthernetNetworkManagementListener listener) {
-        final int mode = getInterfaceMode(iface);
-        final boolean factoryLinkStateUpdated = (mode == INTERFACE_MODE_CLIENT)
-                && mFactory.updateInterfaceLinkState(iface, up, listener);
-
-        if (factoryLinkStateUpdated) {
-            broadcastInterfaceStateChange(iface);
-        }
-    }
-
-    private void maybeUpdateServerModeInterfaceState(String iface, boolean available) {
-        if (available == mTetheredInterfaceWasAvailable || !iface.equals(mDefaultInterface)) return;
-
-        Log.d(TAG, (available ? "Tracking" : "No longer tracking")
-                + " interface in server mode: " + iface);
-
-        final int pendingCbs = mTetheredInterfaceRequests.beginBroadcast();
-        for (int i = 0; i < pendingCbs; i++) {
-            ITetheredInterfaceCallback item = mTetheredInterfaceRequests.getBroadcastItem(i);
-            if (available) {
-                notifyTetheredInterfaceAvailable(item, iface);
-            } else {
-                notifyTetheredInterfaceUnavailable(item);
-            }
-        }
-        mTetheredInterfaceRequests.finishBroadcast();
-        mTetheredInterfaceWasAvailable = available;
-    }
-
-    private void maybeTrackInterface(String iface) {
-        if (!iface.matches(mIfaceMatch)) {
-            return;
-        }
-
-        // If we don't already track this interface, and if this interface matches
-        // our regex, start tracking it.
-        if (mFactory.hasInterface(iface) || iface.equals(mDefaultInterface)) {
-            if (DBG) Log.w(TAG, "Ignoring already-tracked interface " + iface);
-            return;
-        }
-        if (DBG) Log.i(TAG, "maybeTrackInterface: " + iface);
-
-        // TODO: avoid making an interface default if it has configured NetworkCapabilities.
-        if (mDefaultInterface == null) {
-            mDefaultInterface = iface;
-        }
-
-        if (mIpConfigForDefaultInterface != null) {
-            updateIpConfiguration(iface, mIpConfigForDefaultInterface);
-            mIpConfigForDefaultInterface = null;
-        }
-
-        addInterface(iface);
-
-        broadcastInterfaceStateChange(iface);
-    }
-
-    private void trackAvailableInterfaces() {
-        try {
-            final String[] ifaces = mNetd.interfaceGetList();
-            for (String iface : ifaces) {
-                maybeTrackInterface(iface);
-            }
-        } catch (RemoteException | ServiceSpecificException e) {
-            Log.e(TAG, "Could not get list of interfaces " + e);
-        }
-    }
-
-    private class InterfaceObserver extends BaseNetdUnsolicitedEventListener {
-
-        @Override
-        public void onInterfaceLinkStateChanged(String iface, boolean up) {
-            if (DBG) {
-                Log.i(TAG, "interfaceLinkStateChanged, iface: " + iface + ", up: " + up);
-            }
-            mHandler.post(() -> updateInterfaceState(iface, up));
-        }
-
-        @Override
-        public void onInterfaceAdded(String iface) {
-            if (DBG) {
-                Log.i(TAG, "onInterfaceAdded, iface: " + iface);
-            }
-            mHandler.post(() -> maybeTrackInterface(iface));
-        }
-
-        @Override
-        public void onInterfaceRemoved(String iface) {
-            if (DBG) {
-                Log.i(TAG, "onInterfaceRemoved, iface: " + iface);
-            }
-            mHandler.post(() -> stopTrackingInterface(iface));
-        }
-    }
-
-    private static class ListenerInfo {
-
-        boolean canUseRestrictedNetworks = false;
-
-        ListenerInfo(boolean canUseRestrictedNetworks) {
-            this.canUseRestrictedNetworks = canUseRestrictedNetworks;
-        }
-    }
-
-    /**
-     * Parses an Ethernet interface configuration
-     *
-     * @param configString represents an Ethernet configuration in the following format: {@code
-     * <interface name|mac address>;[Network Capabilities];[IP config];[Override Transport]}
-     */
-    private void parseEthernetConfig(String configString) {
-        final EthernetTrackerConfig config = createEthernetTrackerConfig(configString);
-        NetworkCapabilities nc = createNetworkCapabilities(
-                !TextUtils.isEmpty(config.mCapabilities)  /* clear default capabilities */,
-                config.mCapabilities, config.mTransport).build();
-        mNetworkCapabilities.put(config.mIface, nc);
-
-        if (null != config.mIpConfig) {
-            IpConfiguration ipConfig = parseStaticIpConfiguration(config.mIpConfig);
-            mIpConfigurations.put(config.mIface, ipConfig);
-        }
-    }
-
-    @VisibleForTesting
-    static EthernetTrackerConfig createEthernetTrackerConfig(@NonNull final String configString) {
-        Objects.requireNonNull(configString, "EthernetTrackerConfig requires non-null config");
-        return new EthernetTrackerConfig(configString.split(";", /* limit of tokens */ 4));
-    }
-
-    private static NetworkCapabilities createDefaultNetworkCapabilities(boolean isTestIface) {
-        NetworkCapabilities.Builder builder = createNetworkCapabilities(
-                false /* clear default capabilities */, null, null)
-                .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
-                .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED)
-                .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING)
-                .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_CONGESTED)
-                .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_SUSPENDED)
-                .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED);
-
-        if (isTestIface) {
-            builder.addTransportType(NetworkCapabilities.TRANSPORT_TEST);
-        } else {
-            builder.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
-        }
-
-        return builder.build();
-    }
-
-    /**
-     * Parses a static list of network capabilities
-     *
-     * @param clearDefaultCapabilities Indicates whether or not to clear any default capabilities
-     * @param commaSeparatedCapabilities A comma separated string list of integer encoded
-     *                                   NetworkCapability.NET_CAPABILITY_* values
-     * @param overrideTransport A string representing a single integer encoded override transport
-     *                          type. Must be one of the NetworkCapability.TRANSPORT_*
-     *                          values. TRANSPORT_VPN is not supported. Errors with input
-     *                          will cause the override to be ignored.
-     */
-    @VisibleForTesting
-    static NetworkCapabilities.Builder createNetworkCapabilities(
-            boolean clearDefaultCapabilities, @Nullable String commaSeparatedCapabilities,
-            @Nullable String overrideTransport) {
-
-        final NetworkCapabilities.Builder builder = clearDefaultCapabilities
-                ? NetworkCapabilities.Builder.withoutDefaultCapabilities()
-                : new NetworkCapabilities.Builder();
-
-        // Determine the transport type. If someone has tried to define an override transport then
-        // attempt to add it. Since we can only have one override, all errors with it will
-        // gracefully default back to TRANSPORT_ETHERNET and warn the user. VPN is not allowed as an
-        // override type. Wifi Aware and LoWPAN are currently unsupported as well.
-        int transport = NetworkCapabilities.TRANSPORT_ETHERNET;
-        if (!TextUtils.isEmpty(overrideTransport)) {
-            try {
-                int parsedTransport = Integer.valueOf(overrideTransport);
-                if (parsedTransport == NetworkCapabilities.TRANSPORT_VPN
-                        || parsedTransport == NetworkCapabilities.TRANSPORT_WIFI_AWARE
-                        || parsedTransport == NetworkCapabilities.TRANSPORT_LOWPAN) {
-                    Log.e(TAG, "Override transport '" + parsedTransport + "' is not supported. "
-                            + "Defaulting to TRANSPORT_ETHERNET");
-                } else {
-                    transport = parsedTransport;
-                }
-            } catch (NumberFormatException nfe) {
-                Log.e(TAG, "Override transport type '" + overrideTransport + "' "
-                        + "could not be parsed. Defaulting to TRANSPORT_ETHERNET");
-            }
-        }
-
-        // Apply the transport. If the user supplied a valid number that is not a valid transport
-        // then adding will throw an exception. Default back to TRANSPORT_ETHERNET if that happens
-        try {
-            builder.addTransportType(transport);
-        } catch (IllegalArgumentException iae) {
-            Log.e(TAG, transport + " is not a valid NetworkCapability.TRANSPORT_* value. "
-                    + "Defaulting to TRANSPORT_ETHERNET");
-            builder.addTransportType(NetworkCapabilities.TRANSPORT_ETHERNET);
-        }
-
-        builder.setLinkUpstreamBandwidthKbps(100 * 1000);
-        builder.setLinkDownstreamBandwidthKbps(100 * 1000);
-
-        if (!TextUtils.isEmpty(commaSeparatedCapabilities)) {
-            for (String strNetworkCapability : commaSeparatedCapabilities.split(",")) {
-                if (!TextUtils.isEmpty(strNetworkCapability)) {
-                    try {
-                        builder.addCapability(Integer.valueOf(strNetworkCapability));
-                    } catch (NumberFormatException nfe) {
-                        Log.e(TAG, "Capability '" + strNetworkCapability + "' could not be parsed");
-                    } catch (IllegalArgumentException iae) {
-                        Log.e(TAG, strNetworkCapability + " is not a valid "
-                                + "NetworkCapability.NET_CAPABILITY_* value");
-                    }
-                }
-            }
-        }
-        // Ethernet networks have no way to update the following capabilities, so they always
-        // have them.
-        builder.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING);
-        builder.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_CONGESTED);
-        builder.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_SUSPENDED);
-
-        return builder;
-    }
-
-    /**
-     * Parses static IP configuration.
-     *
-     * @param staticIpConfig represents static IP configuration in the following format: {@code
-     * ip=<ip-address/mask> gateway=<ip-address> dns=<comma-sep-ip-addresses>
-     *     domains=<comma-sep-domains>}
-     */
-    @VisibleForTesting
-    static IpConfiguration parseStaticIpConfiguration(String staticIpConfig) {
-        final StaticIpConfiguration.Builder staticIpConfigBuilder =
-                new StaticIpConfiguration.Builder();
-
-        for (String keyValueAsString : staticIpConfig.trim().split(" ")) {
-            if (TextUtils.isEmpty(keyValueAsString)) continue;
-
-            String[] pair = keyValueAsString.split("=");
-            if (pair.length != 2) {
-                throw new IllegalArgumentException("Unexpected token: " + keyValueAsString
-                        + " in " + staticIpConfig);
-            }
-
-            String key = pair[0];
-            String value = pair[1];
-
-            switch (key) {
-                case "ip":
-                    staticIpConfigBuilder.setIpAddress(new LinkAddress(value));
-                    break;
-                case "domains":
-                    staticIpConfigBuilder.setDomains(value);
-                    break;
-                case "gateway":
-                    staticIpConfigBuilder.setGateway(InetAddress.parseNumericAddress(value));
-                    break;
-                case "dns": {
-                    ArrayList<InetAddress> dnsAddresses = new ArrayList<>();
-                    for (String address: value.split(",")) {
-                        dnsAddresses.add(InetAddress.parseNumericAddress(address));
-                    }
-                    staticIpConfigBuilder.setDnsServers(dnsAddresses);
-                    break;
-                }
-                default : {
-                    throw new IllegalArgumentException("Unexpected key: " + key
-                            + " in " + staticIpConfig);
-                }
-            }
-        }
-        return createIpConfiguration(staticIpConfigBuilder.build());
-    }
-
-    private static IpConfiguration createIpConfiguration(
-            @NonNull final StaticIpConfiguration staticIpConfig) {
-        return new IpConfiguration.Builder().setStaticIpConfiguration(staticIpConfig).build();
-    }
-
-    private IpConfiguration getOrCreateIpConfiguration(String iface) {
-        IpConfiguration ret = mIpConfigurations.get(iface);
-        if (ret != null) return ret;
-        ret = new IpConfiguration();
-        ret.setIpAssignment(IpAssignment.DHCP);
-        ret.setProxySettings(ProxySettings.NONE);
-        return ret;
-    }
-
-    private void updateIfaceMatchRegexp() {
-        final String match = mContext.getResources().getString(
-                com.android.internal.R.string.config_ethernet_iface_regex);
-        mIfaceMatch = mIncludeTestInterfaces
-                ? "(" + match + "|" + TEST_IFACE_REGEXP + ")"
-                : match;
-        Log.d(TAG, "Interface match regexp set to '" + mIfaceMatch + "'");
-    }
-
-    private void postAndWaitForRunnable(Runnable r) {
-        final ConditionVariable cv = new ConditionVariable();
-        if (mHandler.post(() -> {
-            r.run();
-            cv.open();
-        })) {
-            cv.block(2000L);
-        }
-    }
-
-    void dump(FileDescriptor fd, IndentingPrintWriter pw, String[] args) {
-        postAndWaitForRunnable(() -> {
-            pw.println(getClass().getSimpleName());
-            pw.println("Ethernet interface name filter: " + mIfaceMatch);
-            pw.println("Default interface: " + mDefaultInterface);
-            pw.println("Default interface mode: " + mDefaultInterfaceMode);
-            pw.println("Tethered interface requests: "
-                    + mTetheredInterfaceRequests.getRegisteredCallbackCount());
-            pw.println("Listeners: " + mListeners.getRegisteredCallbackCount());
-            pw.println("IP Configurations:");
-            pw.increaseIndent();
-            for (String iface : mIpConfigurations.keySet()) {
-                pw.println(iface + ": " + mIpConfigurations.get(iface));
-            }
-            pw.decreaseIndent();
-            pw.println();
-
-            pw.println("Network Capabilities:");
-            pw.increaseIndent();
-            for (String iface : mNetworkCapabilities.keySet()) {
-                pw.println(iface + ": " + mNetworkCapabilities.get(iface));
-            }
-            pw.decreaseIndent();
-            pw.println();
-
-            mFactory.dump(fd, pw, args);
-        });
-    }
-
-    @VisibleForTesting
-    static class EthernetTrackerConfig {
-        final String mIface;
-        final String mCapabilities;
-        final String mIpConfig;
-        final String mTransport;
-
-        EthernetTrackerConfig(@NonNull final String[] tokens) {
-            Objects.requireNonNull(tokens, "EthernetTrackerConfig requires non-null tokens");
-            mIface = tokens[0];
-            mCapabilities = tokens.length > 1 ? tokens[1] : null;
-            mIpConfig = tokens.length > 2 && !TextUtils.isEmpty(tokens[2]) ? tokens[2] : null;
-            mTransport = tokens.length > 3 ? tokens[3] : null;
-        }
-    }
-}
diff --git a/tests/Android.bp b/tests/Android.bp
deleted file mode 100644
index 28b13c5..0000000
--- a/tests/Android.bp
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright (C) 2018 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-
-package {
-    default_applicable_licenses: ["Android-Apache-2.0"],
-}
-
-android_test {
-    name: "EthernetServiceTests",
-
-    srcs: ["java/**/*.java"],
-
-    certificate: "platform",
-    platform_apis: true,
-
-    libs: [
-        "android.test.runner",
-        "android.test.base",
-        "android.test.mock",
-    ],
-
-    static_libs: [
-        "androidx.test.rules",
-        "ethernet-service",
-        "frameworks-base-testutils",
-        "mockito-target-minus-junit4",
-        "net-tests-utils",
-        "services.core",
-        "services.net",
-    ],
-    test_suites: ["general-tests"],
-}
diff --git a/tests/AndroidManifest.xml b/tests/AndroidManifest.xml
deleted file mode 100644
index cd875b0..0000000
--- a/tests/AndroidManifest.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2018 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.android.server.ethernet.tests">
-
-    <application>
-        <uses-library android:name="android.test.runner" />
-    </application>
-
-    <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
-        android:targetPackage="com.android.server.ethernet.tests"
-        android:label="Ethernet Service Tests" />
-</manifest>
diff --git a/tests/java/com/android/server/ethernet/EthernetNetworkFactoryTest.java b/tests/java/com/android/server/ethernet/EthernetNetworkFactoryTest.java
deleted file mode 100644
index 61425bf..0000000
--- a/tests/java/com/android/server/ethernet/EthernetNetworkFactoryTest.java
+++ /dev/null
@@ -1,780 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.ethernet;
-
-import static com.android.testutils.DevSdkIgnoreRuleKt.SC_V2;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.ArgumentMatchers.argThat;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.ArgumentMatchers.same;
-import static org.mockito.Mockito.clearInvocations;
-import static org.mockito.Mockito.doAnswer;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.annotation.NonNull;
-import android.app.test.MockAnswerUtil.AnswerWithArguments;
-import android.content.Context;
-import android.content.res.Resources;
-import android.net.ConnectivityManager;
-import android.net.EthernetNetworkSpecifier;
-import android.net.IEthernetNetworkManagementListener;
-import android.net.EthernetNetworkManagementException;
-import android.net.IpConfiguration;
-import android.net.LinkAddress;
-import android.net.LinkProperties;
-import android.net.Network;
-import android.net.NetworkAgentConfig;
-import android.net.NetworkCapabilities;
-import android.net.NetworkProvider;
-import android.net.NetworkRequest;
-import android.net.StaticIpConfiguration;
-import android.net.ip.IpClientCallbacks;
-import android.net.ip.IpClientManager;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.Looper;
-import android.os.test.TestLooper;
-import android.util.Pair;
-
-import androidx.test.filters.SmallTest;
-import androidx.test.runner.AndroidJUnit4;
-
-import com.android.internal.R;
-import com.android.net.module.util.InterfaceParams;
-
-import com.android.testutils.DevSdkIgnoreRule;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-import java.util.Objects;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.TimeUnit;
-
-@RunWith(AndroidJUnit4.class)
-@SmallTest
-public class EthernetNetworkFactoryTest {
-    private static final int TIMEOUT_MS = 2_000;
-    private static final String TEST_IFACE = "test123";
-    private static final IEthernetNetworkManagementListener NULL_LISTENER = null;
-    private static final String IP_ADDR = "192.0.2.2/25";
-    private static final LinkAddress LINK_ADDR = new LinkAddress(IP_ADDR);
-    private static final String HW_ADDR = "01:02:03:04:05:06";
-    private TestLooper mLooper;
-    private Handler mHandler;
-    private EthernetNetworkFactory mNetFactory = null;
-    private IpClientCallbacks mIpClientCallbacks;
-    @Mock private Context mContext;
-    @Mock private Resources mResources;
-    @Mock private EthernetNetworkFactory.Dependencies mDeps;
-    @Mock private IpClientManager mIpClient;
-    @Mock private EthernetNetworkAgent mNetworkAgent;
-    @Mock private InterfaceParams mInterfaceParams;
-    @Mock private Network mMockNetwork;
-
-    @Before
-    public void setUp() throws Exception {
-        MockitoAnnotations.initMocks(this);
-        setupNetworkAgentMock();
-        setupIpClientMock();
-        setupContext();
-    }
-
-    //TODO: Move away from usage of TestLooper in order to move this logic back into @Before.
-    private void initEthernetNetworkFactory() {
-        mLooper = new TestLooper();
-        mHandler = new Handler(mLooper.getLooper());
-        mNetFactory = new EthernetNetworkFactory(mHandler, mContext, mDeps);
-    }
-
-    private void setupNetworkAgentMock() {
-        when(mDeps.makeEthernetNetworkAgent(any(), any(), any(), any(), any(), any(), any()))
-                .thenAnswer(new AnswerWithArguments() {
-                                       public EthernetNetworkAgent answer(
-                                               Context context,
-                                               Looper looper,
-                                               NetworkCapabilities nc,
-                                               LinkProperties lp,
-                                               NetworkAgentConfig config,
-                                               NetworkProvider provider,
-                                               EthernetNetworkAgent.Callbacks cb) {
-                                           when(mNetworkAgent.getCallbacks()).thenReturn(cb);
-                                           when(mNetworkAgent.getNetwork())
-                                                   .thenReturn(mMockNetwork);
-                                           return mNetworkAgent;
-                                       }
-                                   }
-        );
-    }
-
-    private void setupIpClientMock() throws Exception {
-        doAnswer(inv -> {
-            // these tests only support one concurrent IpClient, so make sure we do not accidentally
-            // create a mess.
-            assertNull("An IpClient has already been created.", mIpClientCallbacks);
-
-            mIpClientCallbacks = inv.getArgument(2);
-            mIpClientCallbacks.onIpClientCreated(null);
-            mLooper.dispatchAll();
-            return null;
-        }).when(mDeps).makeIpClient(any(Context.class), anyString(), any());
-
-        doAnswer(inv -> {
-            mIpClientCallbacks.onQuit();
-            mLooper.dispatchAll();
-            mIpClientCallbacks = null;
-            return null;
-        }).when(mIpClient).shutdown();
-
-        when(mDeps.makeIpClientManager(any())).thenReturn(mIpClient);
-    }
-
-    private void triggerOnProvisioningSuccess() {
-        mIpClientCallbacks.onProvisioningSuccess(new LinkProperties());
-        mLooper.dispatchAll();
-    }
-
-    private void triggerOnProvisioningFailure() {
-        mIpClientCallbacks.onProvisioningFailure(new LinkProperties());
-        mLooper.dispatchAll();
-    }
-
-    private void triggerOnReachabilityLost() {
-        mIpClientCallbacks.onReachabilityLost("ReachabilityLost");
-        mLooper.dispatchAll();
-    }
-
-    private void setupContext() {
-        when(mContext.getResources()).thenReturn(mResources);
-        when(mResources.getString(R.string.config_ethernet_tcp_buffers)).thenReturn("");
-    }
-
-    @After
-    public void tearDown() {
-        // looper is shared with the network agents, so there may still be messages to dispatch on
-        // tear down.
-        mLooper.dispatchAll();
-    }
-
-    private NetworkCapabilities createDefaultFilterCaps() {
-        return NetworkCapabilities.Builder.withoutDefaultCapabilities()
-                .addTransportType(NetworkCapabilities.TRANSPORT_ETHERNET)
-                .build();
-    }
-
-    private NetworkCapabilities.Builder createInterfaceCapsBuilder(final int transportType) {
-        return new NetworkCapabilities.Builder()
-                .addTransportType(transportType)
-                .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
-                .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED);
-    }
-
-    private NetworkRequest.Builder createDefaultRequestBuilder() {
-        return new NetworkRequest.Builder()
-                .addTransportType(NetworkCapabilities.TRANSPORT_ETHERNET)
-                .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
-    }
-
-    private NetworkRequest createDefaultRequest() {
-        return createDefaultRequestBuilder().build();
-    }
-
-    private IpConfiguration createDefaultIpConfig() {
-        IpConfiguration ipConfig = new IpConfiguration();
-        ipConfig.setIpAssignment(IpConfiguration.IpAssignment.DHCP);
-        ipConfig.setProxySettings(IpConfiguration.ProxySettings.NONE);
-        return ipConfig;
-    }
-
-    /**
-     * Create an {@link IpConfiguration} with an associated {@link StaticIpConfiguration}.
-     *
-     * @return {@link IpConfiguration} with its {@link StaticIpConfiguration} set.
-     */
-    private IpConfiguration createStaticIpConfig() {
-        final IpConfiguration ipConfig = new IpConfiguration();
-        ipConfig.setIpAssignment(IpConfiguration.IpAssignment.STATIC);
-        ipConfig.setStaticIpConfiguration(
-                new StaticIpConfiguration.Builder().setIpAddress(LINK_ADDR).build());
-        return ipConfig;
-    }
-
-    // creates an interface with provisioning in progress (since updating the interface link state
-    // automatically starts the provisioning process)
-    private void createInterfaceUndergoingProvisioning(String iface) {
-        // Default to the ethernet transport type.
-        createInterfaceUndergoingProvisioning(iface, NetworkCapabilities.TRANSPORT_ETHERNET);
-    }
-
-    private void createInterfaceUndergoingProvisioning(
-            @NonNull final String iface, final int transportType) {
-        final IpConfiguration ipConfig = createDefaultIpConfig();
-        mNetFactory.addInterface(iface, HW_ADDR, ipConfig,
-                createInterfaceCapsBuilder(transportType).build());
-        assertTrue(mNetFactory.updateInterfaceLinkState(iface, true, NULL_LISTENER));
-        verifyStart(ipConfig);
-        clearInvocations(mDeps);
-        clearInvocations(mIpClient);
-    }
-
-    // creates a provisioned interface
-    private void createAndVerifyProvisionedInterface(String iface) throws Exception {
-        // Default to the ethernet transport type.
-        createAndVerifyProvisionedInterface(iface, NetworkCapabilities.TRANSPORT_ETHERNET,
-                ConnectivityManager.TYPE_ETHERNET);
-    }
-
-    private void createVerifyAndRemoveProvisionedInterface(final int transportType,
-            final int expectedLegacyType) throws Exception {
-        createAndVerifyProvisionedInterface(TEST_IFACE, transportType,
-                expectedLegacyType);
-        mNetFactory.removeInterface(TEST_IFACE);
-    }
-
-    private void createAndVerifyProvisionedInterface(
-            @NonNull final String iface, final int transportType, final int expectedLegacyType)
-            throws Exception {
-        createInterfaceUndergoingProvisioning(iface, transportType);
-        triggerOnProvisioningSuccess();
-        // provisioning succeeded, verify that the network agent is created, registered, marked
-        // as connected and legacy type are correctly set.
-        final ArgumentCaptor<NetworkCapabilities> ncCaptor = ArgumentCaptor.forClass(
-                NetworkCapabilities.class);
-        verify(mDeps).makeEthernetNetworkAgent(any(), any(), ncCaptor.capture(), any(),
-                argThat(x -> x.getLegacyType() == expectedLegacyType), any(), any());
-        assertEquals(
-                new EthernetNetworkSpecifier(iface), ncCaptor.getValue().getNetworkSpecifier());
-        verifyNetworkAgentRegistersAndConnects();
-        clearInvocations(mDeps);
-        clearInvocations(mNetworkAgent);
-    }
-
-    // creates an unprovisioned interface
-    private void createUnprovisionedInterface(String iface) throws Exception {
-        // the only way to create an unprovisioned interface is by calling needNetworkFor
-        // followed by releaseNetworkFor which will stop the NetworkAgent and IpClient. When
-        // EthernetNetworkFactory#updateInterfaceLinkState(iface, true) is called, the interface
-        // is automatically provisioned even if nobody has ever called needNetworkFor
-        createAndVerifyProvisionedInterface(iface);
-
-        // Interface is already provisioned, so startProvisioning / register should not be called
-        // again
-        mNetFactory.needNetworkFor(createDefaultRequest());
-        verify(mIpClient, never()).startProvisioning(any());
-        verify(mNetworkAgent, never()).register();
-
-        mNetFactory.releaseNetworkFor(createDefaultRequest());
-        verifyStop();
-
-        clearInvocations(mIpClient);
-        clearInvocations(mNetworkAgent);
-    }
-
-    @Test
-    public void testAcceptRequest() throws Exception {
-        initEthernetNetworkFactory();
-        createInterfaceUndergoingProvisioning(TEST_IFACE);
-        assertTrue(mNetFactory.acceptRequest(createDefaultRequest()));
-
-        NetworkRequest wifiRequest = createDefaultRequestBuilder()
-                .removeTransportType(NetworkCapabilities.TRANSPORT_ETHERNET)
-                .addTransportType(NetworkCapabilities.TRANSPORT_WIFI).build();
-        assertFalse(mNetFactory.acceptRequest(wifiRequest));
-    }
-
-    @Test
-    public void testUpdateInterfaceLinkStateForActiveProvisioningInterface() throws Exception {
-        initEthernetNetworkFactory();
-        createInterfaceUndergoingProvisioning(TEST_IFACE);
-        final TestNetworkManagementListener listener = new TestNetworkManagementListener();
-
-        // verify that the IpClient gets shut down when interface state changes to down.
-        final boolean ret =
-                mNetFactory.updateInterfaceLinkState(TEST_IFACE, false /* up */, listener);
-
-        assertTrue(ret);
-        verify(mIpClient).shutdown();
-        assertSuccessfulListener(listener, null);
-    }
-
-    @Test
-    public void testUpdateInterfaceLinkStateForProvisionedInterface() throws Exception {
-        initEthernetNetworkFactory();
-        createAndVerifyProvisionedInterface(TEST_IFACE);
-        final TestNetworkManagementListener listener = new TestNetworkManagementListener();
-
-        final boolean ret =
-                mNetFactory.updateInterfaceLinkState(TEST_IFACE, false /* up */, listener);
-
-        assertTrue(ret);
-        verifyStop();
-        assertSuccessfulListener(listener, mMockNetwork);
-    }
-
-    @Test
-    public void testUpdateInterfaceLinkStateForUnprovisionedInterface() throws Exception {
-        initEthernetNetworkFactory();
-        createUnprovisionedInterface(TEST_IFACE);
-        final TestNetworkManagementListener listener = new TestNetworkManagementListener();
-
-        final boolean ret =
-                mNetFactory.updateInterfaceLinkState(TEST_IFACE, false /* up */, listener);
-
-        assertTrue(ret);
-        // There should not be an active IPClient or NetworkAgent.
-        verify(mDeps, never()).makeIpClient(any(), any(), any());
-        verify(mDeps, never())
-                .makeEthernetNetworkAgent(any(), any(), any(), any(), any(), any(), any());
-        assertSuccessfulListener(listener, null);
-    }
-
-    @Test
-    public void testUpdateInterfaceLinkStateForNonExistingInterface() throws Exception {
-        initEthernetNetworkFactory();
-        final TestNetworkManagementListener listener = new TestNetworkManagementListener();
-
-        // if interface was never added, link state cannot be updated.
-        final boolean ret =
-                mNetFactory.updateInterfaceLinkState(TEST_IFACE, true /* up */, listener);
-
-        assertFalse(ret);
-        verifyNoStopOrStart();
-        assertFailedListener(listener, "can't be updated as it is not available");
-    }
-
-    @Test
-    public void testUpdateInterfaceLinkStateWithNoChanges() throws Exception {
-        initEthernetNetworkFactory();
-        createAndVerifyProvisionedInterface(TEST_IFACE);
-        final TestNetworkManagementListener listener = new TestNetworkManagementListener();
-
-        final boolean ret =
-                mNetFactory.updateInterfaceLinkState(TEST_IFACE, true /* up */, listener);
-
-        assertFalse(ret);
-        verifyNoStopOrStart();
-        assertFailedListener(listener, "No changes");
-    }
-
-    @Test
-    public void testNeedNetworkForOnProvisionedInterface() throws Exception {
-        initEthernetNetworkFactory();
-        createAndVerifyProvisionedInterface(TEST_IFACE);
-        mNetFactory.needNetworkFor(createDefaultRequest());
-        verify(mIpClient, never()).startProvisioning(any());
-    }
-
-    @Test
-    public void testNeedNetworkForOnUnprovisionedInterface() throws Exception {
-        initEthernetNetworkFactory();
-        createUnprovisionedInterface(TEST_IFACE);
-        mNetFactory.needNetworkFor(createDefaultRequest());
-        verify(mIpClient).startProvisioning(any());
-
-        triggerOnProvisioningSuccess();
-        verifyNetworkAgentRegistersAndConnects();
-    }
-
-    @Test
-    public void testNeedNetworkForOnInterfaceUndergoingProvisioning() throws Exception {
-        initEthernetNetworkFactory();
-        createInterfaceUndergoingProvisioning(TEST_IFACE);
-        mNetFactory.needNetworkFor(createDefaultRequest());
-        verify(mIpClient, never()).startProvisioning(any());
-
-        triggerOnProvisioningSuccess();
-        verifyNetworkAgentRegistersAndConnects();
-    }
-
-    @Test
-    public void testProvisioningLoss() throws Exception {
-        initEthernetNetworkFactory();
-        when(mDeps.getNetworkInterfaceByName(TEST_IFACE)).thenReturn(mInterfaceParams);
-        createAndVerifyProvisionedInterface(TEST_IFACE);
-
-        triggerOnProvisioningFailure();
-        verifyStop();
-        // provisioning loss should trigger a retry, since the interface is still there
-        verify(mIpClient).startProvisioning(any());
-    }
-
-    @Test
-    public void testProvisioningLossForDisappearedInterface() throws Exception {
-        initEthernetNetworkFactory();
-        // mocked method returns null by default, but just to be explicit in the test:
-        when(mDeps.getNetworkInterfaceByName(eq(TEST_IFACE))).thenReturn(null);
-
-        createAndVerifyProvisionedInterface(TEST_IFACE);
-        triggerOnProvisioningFailure();
-
-        // the interface disappeared and getNetworkInterfaceByName returns null, we should not retry
-        verify(mIpClient, never()).startProvisioning(any());
-        verifyNoStopOrStart();
-    }
-
-    private void verifyNoStopOrStart() {
-        verify(mNetworkAgent, never()).register();
-        verify(mIpClient, never()).shutdown();
-        verify(mNetworkAgent, never()).unregister();
-        verify(mIpClient, never()).startProvisioning(any());
-    }
-
-    @Test
-    public void testIpClientIsNotStartedWhenLinkIsDown() throws Exception {
-        initEthernetNetworkFactory();
-        createUnprovisionedInterface(TEST_IFACE);
-        mNetFactory.updateInterfaceLinkState(TEST_IFACE, false, NULL_LISTENER);
-
-        mNetFactory.needNetworkFor(createDefaultRequest());
-
-        verify(mDeps, never()).makeIpClient(any(), any(), any());
-
-        // BUG(b/191854824): requesting a network with a specifier (Android Auto use case) should
-        // not start an IpClient when the link is down, but fixing this may make matters worse by
-        // tiggering b/197548738.
-        NetworkRequest specificNetRequest = new NetworkRequest.Builder()
-                .addTransportType(NetworkCapabilities.TRANSPORT_ETHERNET)
-                .setNetworkSpecifier(new EthernetNetworkSpecifier(TEST_IFACE))
-                .build();
-        mNetFactory.needNetworkFor(specificNetRequest);
-        mNetFactory.releaseNetworkFor(specificNetRequest);
-
-        mNetFactory.updateInterfaceLinkState(TEST_IFACE, true, NULL_LISTENER);
-        // TODO: change to once when b/191854824 is fixed.
-        verify(mDeps, times(2)).makeIpClient(any(), eq(TEST_IFACE), any());
-    }
-
-    @Test
-    public void testLinkPropertiesChanged() throws Exception {
-        initEthernetNetworkFactory();
-        createAndVerifyProvisionedInterface(TEST_IFACE);
-
-        LinkProperties lp = new LinkProperties();
-        mIpClientCallbacks.onLinkPropertiesChange(lp);
-        mLooper.dispatchAll();
-        verify(mNetworkAgent).sendLinkPropertiesImpl(same(lp));
-    }
-
-    @Test
-    public void testNetworkUnwanted() throws Exception {
-        initEthernetNetworkFactory();
-        createAndVerifyProvisionedInterface(TEST_IFACE);
-
-        mNetworkAgent.getCallbacks().onNetworkUnwanted();
-        mLooper.dispatchAll();
-        verifyStop();
-    }
-
-    @Test
-    public void testNetworkUnwantedWithStaleNetworkAgent() throws Exception {
-        initEthernetNetworkFactory();
-        // ensures provisioning is restarted after provisioning loss
-        when(mDeps.getNetworkInterfaceByName(TEST_IFACE)).thenReturn(mInterfaceParams);
-        createAndVerifyProvisionedInterface(TEST_IFACE);
-
-        EthernetNetworkAgent.Callbacks oldCbs = mNetworkAgent.getCallbacks();
-        // replace network agent in EthernetNetworkFactory
-        // Loss of provisioning will restart the ip client and network agent.
-        triggerOnProvisioningFailure();
-        verify(mDeps).makeIpClient(any(), any(), any());
-
-        triggerOnProvisioningSuccess();
-        verify(mDeps).makeEthernetNetworkAgent(any(), any(), any(), any(), any(), any(), any());
-
-        // verify that unwanted is ignored
-        clearInvocations(mIpClient);
-        clearInvocations(mNetworkAgent);
-        oldCbs.onNetworkUnwanted();
-        verify(mIpClient, never()).shutdown();
-        verify(mNetworkAgent, never()).unregister();
-    }
-
-    @Test
-    public void testTransportOverrideIsCorrectlySet() throws Exception {
-        initEthernetNetworkFactory();
-        // createProvisionedInterface() has verifications in place for transport override
-        // functionality which for EthernetNetworkFactory is network score and legacy type mappings.
-        createVerifyAndRemoveProvisionedInterface(NetworkCapabilities.TRANSPORT_ETHERNET,
-                ConnectivityManager.TYPE_ETHERNET);
-        createVerifyAndRemoveProvisionedInterface(NetworkCapabilities.TRANSPORT_BLUETOOTH,
-                ConnectivityManager.TYPE_BLUETOOTH);
-        createVerifyAndRemoveProvisionedInterface(NetworkCapabilities.TRANSPORT_WIFI,
-                ConnectivityManager.TYPE_WIFI);
-        createVerifyAndRemoveProvisionedInterface(NetworkCapabilities.TRANSPORT_CELLULAR,
-                ConnectivityManager.TYPE_MOBILE);
-        createVerifyAndRemoveProvisionedInterface(NetworkCapabilities.TRANSPORT_LOWPAN,
-                ConnectivityManager.TYPE_NONE);
-        createVerifyAndRemoveProvisionedInterface(NetworkCapabilities.TRANSPORT_WIFI_AWARE,
-                ConnectivityManager.TYPE_NONE);
-        createVerifyAndRemoveProvisionedInterface(NetworkCapabilities.TRANSPORT_TEST,
-                ConnectivityManager.TYPE_NONE);
-    }
-
-    @Test
-    public void testReachabilityLoss() throws Exception {
-        initEthernetNetworkFactory();
-        createAndVerifyProvisionedInterface(TEST_IFACE);
-
-        triggerOnReachabilityLost();
-
-        // Reachability loss should trigger a stop and start, since the interface is still there
-        verifyRestart(createDefaultIpConfig());
-    }
-
-    @Test
-    public void testIgnoreOnIpLayerStartedCallbackAfterIpClientHasStopped() throws Exception {
-        initEthernetNetworkFactory();
-        createAndVerifyProvisionedInterface(TEST_IFACE);
-        mIpClientCallbacks.onProvisioningFailure(new LinkProperties());
-        mIpClientCallbacks.onProvisioningSuccess(new LinkProperties());
-        mLooper.dispatchAll();
-        verifyStop();
-
-        // ipClient has been shut down first, we should not retry
-        verify(mIpClient, never()).startProvisioning(any());
-        verify(mNetworkAgent, never()).register();
-    }
-
-    @Test
-    public void testIgnoreOnIpLayerStoppedCallbackAfterIpClientHasStopped() throws Exception {
-        initEthernetNetworkFactory();
-        createAndVerifyProvisionedInterface(TEST_IFACE);
-        when(mDeps.getNetworkInterfaceByName(TEST_IFACE)).thenReturn(mInterfaceParams);
-        mIpClientCallbacks.onProvisioningFailure(new LinkProperties());
-        mIpClientCallbacks.onProvisioningFailure(new LinkProperties());
-        mLooper.dispatchAll();
-        verifyStop();
-
-        // ipClient has been shut down first, we should not retry
-        verify(mIpClient).startProvisioning(any());
-    }
-
-    @Test
-    public void testIgnoreLinkPropertiesCallbackAfterIpClientHasStopped() throws Exception {
-        initEthernetNetworkFactory();
-        createAndVerifyProvisionedInterface(TEST_IFACE);
-        LinkProperties lp = new LinkProperties();
-
-        // The test requires the two proceeding methods to happen one after the other in ENF and
-        // verifies onLinkPropertiesChange doesn't complete execution for a downed interface.
-        // Posting is necessary as updateInterfaceLinkState with false will set mIpClientCallbacks
-        // to null which will throw an NPE in the test if executed synchronously.
-        mHandler.post(() -> mNetFactory.updateInterfaceLinkState(TEST_IFACE, false, NULL_LISTENER));
-        mIpClientCallbacks.onLinkPropertiesChange(lp);
-        mLooper.dispatchAll();
-
-        verifyStop();
-        // ipClient has been shut down first, we should not update
-        verify(mNetworkAgent, never()).sendLinkPropertiesImpl(same(lp));
-    }
-
-    @Test
-    public void testIgnoreNeighborLossCallbackAfterIpClientHasStopped() throws Exception {
-        initEthernetNetworkFactory();
-        createAndVerifyProvisionedInterface(TEST_IFACE);
-
-        // The test requires the two proceeding methods to happen one after the other in ENF and
-        // verifies onReachabilityLost doesn't complete execution for a downed interface.
-        // Posting is necessary as updateInterfaceLinkState with false will set mIpClientCallbacks
-        // to null which will throw an NPE in the test if executed synchronously.
-        mHandler.post(() -> mNetFactory.updateInterfaceLinkState(TEST_IFACE, false, NULL_LISTENER));
-        mIpClientCallbacks.onReachabilityLost("Neighbor Lost");
-        mLooper.dispatchAll();
-
-        verifyStop();
-        // ipClient has been shut down first, we should not update
-        verify(mIpClient, never()).startProvisioning(any());
-        verify(mNetworkAgent, never()).register();
-    }
-
-    private void verifyRestart(@NonNull final IpConfiguration ipConfig) {
-        verifyStop();
-        verifyStart(ipConfig);
-    }
-
-    private void verifyStart(@NonNull final IpConfiguration ipConfig) {
-        verify(mDeps).makeIpClient(any(Context.class), anyString(), any());
-        verify(mIpClient).startProvisioning(
-                argThat(x -> Objects.equals(x.mStaticIpConfig, ipConfig.getStaticIpConfiguration()))
-        );
-    }
-
-    private void verifyStop() {
-        verify(mIpClient).shutdown();
-        verify(mNetworkAgent).unregister();
-    }
-
-    private void verifyNetworkAgentRegistersAndConnects() {
-        verify(mNetworkAgent).register();
-        verify(mNetworkAgent).markConnected();
-    }
-
-    private static final class TestNetworkManagementListener
-            implements IEthernetNetworkManagementListener {
-        private final CompletableFuture<Pair<Network, EthernetNetworkManagementException>> mDone
-                = new CompletableFuture<>();
-
-        @Override
-        public void onComplete(final Network network,
-                final EthernetNetworkManagementException exception) {
-            mDone.complete(new Pair<>(network, exception));
-        }
-
-        Pair<Network, EthernetNetworkManagementException> expectOnComplete() throws Exception {
-            return mDone.get(TIMEOUT_MS, TimeUnit.MILLISECONDS);
-        }
-
-        @Override
-        public IBinder asBinder() {
-            return null;
-        }
-    }
-
-    @Test
-    public void testUpdateInterfaceCallsListenerCorrectlyOnSuccess() throws Exception {
-        initEthernetNetworkFactory();
-        createAndVerifyProvisionedInterface(TEST_IFACE);
-        final NetworkCapabilities capabilities = createDefaultFilterCaps();
-        final IpConfiguration ipConfiguration = createStaticIpConfig();
-        final TestNetworkManagementListener listener = new TestNetworkManagementListener();
-
-        mNetFactory.updateInterface(TEST_IFACE, ipConfiguration, capabilities, listener);
-        triggerOnProvisioningSuccess();
-
-        assertSuccessfulListener(listener, mMockNetwork);
-    }
-
-    @DevSdkIgnoreRule.IgnoreUpTo(SC_V2) // TODO: Use to Build.VERSION_CODES.SC_V2 when available
-    @Test
-    public void testUpdateInterfaceAbortsOnConcurrentRemoveInterface() throws Exception {
-        initEthernetNetworkFactory();
-        verifyNetworkManagementCallIsAbortedWhenInterrupted(
-                TEST_IFACE,
-                () -> mNetFactory.removeInterface(TEST_IFACE));
-    }
-
-    @DevSdkIgnoreRule.IgnoreUpTo(SC_V2) // TODO: Use to Build.VERSION_CODES.SC_V2 when available
-    @Test
-    public void testUpdateInterfaceAbortsOnConcurrentUpdateInterfaceLinkState() throws Exception {
-        initEthernetNetworkFactory();
-        verifyNetworkManagementCallIsAbortedWhenInterrupted(
-                TEST_IFACE,
-                () -> mNetFactory.updateInterfaceLinkState(TEST_IFACE, false, NULL_LISTENER));
-    }
-
-    @DevSdkIgnoreRule.IgnoreUpTo(SC_V2) // TODO: Use to Build.VERSION_CODES.SC_V2 when available
-    @Test
-    public void testUpdateInterfaceCallsListenerCorrectlyOnConcurrentRequests() throws Exception {
-        initEthernetNetworkFactory();
-        final NetworkCapabilities capabilities = createDefaultFilterCaps();
-        final IpConfiguration ipConfiguration = createStaticIpConfig();
-        final TestNetworkManagementListener successfulListener =
-                new TestNetworkManagementListener();
-
-        // If two calls come in before the first one completes, the first listener will be aborted
-        // and the second one will be successful.
-        verifyNetworkManagementCallIsAbortedWhenInterrupted(
-                TEST_IFACE,
-                () -> {
-                    mNetFactory.updateInterface(
-                            TEST_IFACE, ipConfiguration, capabilities, successfulListener);
-                    triggerOnProvisioningSuccess();
-                });
-
-        assertSuccessfulListener(successfulListener, mMockNetwork);
-    }
-
-    private void assertSuccessfulListener(
-            @NonNull final TestNetworkManagementListener successfulListener,
-            @NonNull final Network expectedNetwork) throws Exception {
-        final Pair<Network, EthernetNetworkManagementException> successfulResult =
-                successfulListener.expectOnComplete();
-        assertEquals(expectedNetwork, successfulResult.first);
-        assertNull(successfulResult.second);
-    }
-
-    private void assertFailedListener(@NonNull final TestNetworkManagementListener failedListener,
-            @NonNull final String errMsg)
-            throws Exception {
-        final Pair<Network, EthernetNetworkManagementException> failedResult =
-                failedListener.expectOnComplete();
-        assertNull(failedResult.first);
-        assertNotNull(failedResult.second);
-        assertTrue(failedResult.second.getMessage().contains(errMsg));
-    }
-
-    private void verifyNetworkManagementCallIsAbortedWhenInterrupted(
-            @NonNull final String iface,
-            @NonNull final Runnable interruptingRunnable) throws Exception {
-        createAndVerifyProvisionedInterface(iface);
-        final NetworkCapabilities capabilities = createDefaultFilterCaps();
-        final IpConfiguration ipConfiguration = createStaticIpConfig();
-        final TestNetworkManagementListener failedListener = new TestNetworkManagementListener();
-
-        // An active update request will be aborted on interrupt prior to provisioning completion.
-        mNetFactory.updateInterface(iface, ipConfiguration, capabilities, failedListener);
-        interruptingRunnable.run();
-
-        assertFailedListener(failedListener, "aborted");
-    }
-
-    @Test
-    public void testUpdateInterfaceRestartsAgentCorrectly() throws Exception {
-        initEthernetNetworkFactory();
-        createAndVerifyProvisionedInterface(TEST_IFACE);
-        final NetworkCapabilities capabilities = createDefaultFilterCaps();
-        final IpConfiguration ipConfiguration = createStaticIpConfig();
-        final TestNetworkManagementListener listener = new TestNetworkManagementListener();
-
-        mNetFactory.updateInterface(TEST_IFACE, ipConfiguration, capabilities, listener);
-        triggerOnProvisioningSuccess();
-
-        listener.expectOnComplete();
-        verify(mDeps).makeEthernetNetworkAgent(any(), any(),
-                eq(capabilities), any(), any(), any(), any());
-        verifyRestart(ipConfiguration);
-    }
-
-    @Test
-    public void testUpdateInterfaceForNonExistingInterface() throws Exception {
-        initEthernetNetworkFactory();
-        // No interface exists due to not calling createAndVerifyProvisionedInterface(...).
-        final NetworkCapabilities capabilities = createDefaultFilterCaps();
-        final IpConfiguration ipConfiguration = createStaticIpConfig();
-        final TestNetworkManagementListener listener = new TestNetworkManagementListener();
-
-        mNetFactory.updateInterface(TEST_IFACE, ipConfiguration, capabilities, listener);
-
-        verifyNoStopOrStart();
-        assertFailedListener(listener, "can't be updated as it is not available");
-    }
-}
diff --git a/tests/java/com/android/server/ethernet/EthernetServiceImplTest.java b/tests/java/com/android/server/ethernet/EthernetServiceImplTest.java
deleted file mode 100644
index e74a5a3..0000000
--- a/tests/java/com/android/server/ethernet/EthernetServiceImplTest.java
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.ethernet;
-
-import static org.junit.Assert.assertThrows;
-
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.doThrow;
-import static org.mockito.Mockito.verify;
-
-import android.Manifest;
-import android.annotation.NonNull;
-import android.content.Context;
-import android.content.pm.PackageManager;
-import android.net.IEthernetNetworkManagementListener;
-import android.net.EthernetNetworkUpdateRequest;
-import android.net.IpConfiguration;
-import android.net.NetworkCapabilities;
-import android.os.Handler;
-
-import androidx.test.filters.SmallTest;
-import androidx.test.runner.AndroidJUnit4;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-@RunWith(AndroidJUnit4.class)
-@SmallTest
-public class EthernetServiceImplTest {
-    private static final String TEST_IFACE = "test123";
-    private static final EthernetNetworkUpdateRequest UPDATE_REQUEST =
-            new EthernetNetworkUpdateRequest.Builder()
-                    .setIpConfiguration(new IpConfiguration())
-                    .setNetworkCapabilities(new NetworkCapabilities.Builder().build())
-                    .build();
-    private static final IEthernetNetworkManagementListener NULL_LISTENER = null;
-    private EthernetServiceImpl mEthernetServiceImpl;
-    @Mock private Context mContext;
-    @Mock private Handler mHandler;
-    @Mock private EthernetTracker mEthernetTracker;
-    @Mock private PackageManager mPackageManager;
-
-    @Before
-    public void setup() {
-        MockitoAnnotations.initMocks(this);
-        doReturn(mPackageManager).when(mContext).getPackageManager();
-        mEthernetServiceImpl = new EthernetServiceImpl(mContext, mHandler, mEthernetTracker);
-        mEthernetServiceImpl.mStarted.set(true);
-        toggleAutomotiveFeature(true);
-        shouldTrackIface(TEST_IFACE, true);
-    }
-
-    private void toggleAutomotiveFeature(final boolean isEnabled) {
-        doReturn(isEnabled)
-                .when(mPackageManager).hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE);
-    }
-
-    private void shouldTrackIface(@NonNull final String iface, final boolean shouldTrack) {
-        doReturn(shouldTrack).when(mEthernetTracker).isTrackingInterface(iface);
-    }
-
-    @Test
-    public void testSetConfigurationRejectsWhenEthNotStarted() {
-        mEthernetServiceImpl.mStarted.set(false);
-        assertThrows(IllegalStateException.class, () -> {
-            mEthernetServiceImpl.setConfiguration("" /* iface */, new IpConfiguration());
-        });
-    }
-
-    @Test
-    public void testUpdateConfigurationRejectsWhenEthNotStarted() {
-        mEthernetServiceImpl.mStarted.set(false);
-        assertThrows(IllegalStateException.class, () -> {
-            mEthernetServiceImpl.updateConfiguration(
-                    "" /* iface */, UPDATE_REQUEST, null /* listener */);
-        });
-    }
-
-    @Test
-    public void testConnectNetworkRejectsWhenEthNotStarted() {
-        mEthernetServiceImpl.mStarted.set(false);
-        assertThrows(IllegalStateException.class, () -> {
-            mEthernetServiceImpl.connectNetwork("" /* iface */, null /* listener */);
-        });
-    }
-
-    @Test
-    public void testDisconnectNetworkRejectsWhenEthNotStarted() {
-        mEthernetServiceImpl.mStarted.set(false);
-        assertThrows(IllegalStateException.class, () -> {
-            mEthernetServiceImpl.disconnectNetwork("" /* iface */, null /* listener */);
-        });
-    }
-
-    @Test
-    public void testUpdateConfigurationRejectsNullIface() {
-        assertThrows(NullPointerException.class, () -> {
-            mEthernetServiceImpl.updateConfiguration(null, UPDATE_REQUEST, NULL_LISTENER);
-        });
-    }
-
-    @Test
-    public void testConnectNetworkRejectsNullIface() {
-        assertThrows(NullPointerException.class, () -> {
-            mEthernetServiceImpl.connectNetwork(null /* iface */, NULL_LISTENER);
-        });
-    }
-
-    @Test
-    public void testDisconnectNetworkRejectsNullIface() {
-        assertThrows(NullPointerException.class, () -> {
-            mEthernetServiceImpl.disconnectNetwork(null /* iface */, NULL_LISTENER);
-        });
-    }
-
-    @Test
-    public void testUpdateConfigurationRejectsWithoutAutomotiveFeature() {
-        toggleAutomotiveFeature(false);
-        assertThrows(UnsupportedOperationException.class, () -> {
-            mEthernetServiceImpl.updateConfiguration(TEST_IFACE, UPDATE_REQUEST, NULL_LISTENER);
-        });
-    }
-
-    @Test
-    public void testConnectNetworkRejectsWithoutAutomotiveFeature() {
-        toggleAutomotiveFeature(false);
-        assertThrows(UnsupportedOperationException.class, () -> {
-            mEthernetServiceImpl.connectNetwork("" /* iface */, NULL_LISTENER);
-        });
-    }
-
-    @Test
-    public void testDisconnectNetworkRejectsWithoutAutomotiveFeature() {
-        toggleAutomotiveFeature(false);
-        assertThrows(UnsupportedOperationException.class, () -> {
-            mEthernetServiceImpl.disconnectNetwork("" /* iface */, NULL_LISTENER);
-        });
-    }
-
-    private void denyManageEthPermission() {
-        doThrow(new SecurityException("")).when(mContext)
-                .enforceCallingOrSelfPermission(
-                        eq(Manifest.permission.MANAGE_ETHERNET_NETWORKS), anyString());
-    }
-
-    @Test
-    public void testUpdateConfigurationRejectsWithoutManageEthPermission() {
-        denyManageEthPermission();
-        assertThrows(SecurityException.class, () -> {
-            mEthernetServiceImpl.updateConfiguration(TEST_IFACE, UPDATE_REQUEST, NULL_LISTENER);
-        });
-    }
-
-    @Test
-    public void testConnectNetworkRejectsWithoutManageEthPermission() {
-        denyManageEthPermission();
-        assertThrows(SecurityException.class, () -> {
-            mEthernetServiceImpl.connectNetwork(TEST_IFACE, NULL_LISTENER);
-        });
-    }
-
-    @Test
-    public void testDisconnectNetworkRejectsWithoutManageEthPermission() {
-        denyManageEthPermission();
-        assertThrows(SecurityException.class, () -> {
-            mEthernetServiceImpl.disconnectNetwork(TEST_IFACE, NULL_LISTENER);
-        });
-    }
-
-    @Test
-    public void testUpdateConfiguration() {
-        mEthernetServiceImpl.updateConfiguration(TEST_IFACE, UPDATE_REQUEST, NULL_LISTENER);
-        verify(mEthernetTracker).updateConfiguration(
-                eq(TEST_IFACE),
-                eq(UPDATE_REQUEST.getIpConfiguration()),
-                eq(UPDATE_REQUEST.getNetworkCapabilities()), eq(NULL_LISTENER));
-    }
-
-    @Test
-    public void testConnectNetwork() {
-        mEthernetServiceImpl.connectNetwork(TEST_IFACE, NULL_LISTENER);
-        verify(mEthernetTracker).connectNetwork(eq(TEST_IFACE), eq(NULL_LISTENER));
-    }
-
-    @Test
-    public void testDisconnectNetwork() {
-        mEthernetServiceImpl.disconnectNetwork(TEST_IFACE, NULL_LISTENER);
-        verify(mEthernetTracker).disconnectNetwork(eq(TEST_IFACE), eq(NULL_LISTENER));
-    }
-}
diff --git a/tests/java/com/android/server/ethernet/EthernetTrackerTest.java b/tests/java/com/android/server/ethernet/EthernetTrackerTest.java
deleted file mode 100644
index e1a1a8e..0000000
--- a/tests/java/com/android/server/ethernet/EthernetTrackerTest.java
+++ /dev/null
@@ -1,358 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.ethernet;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertThrows;
-import static org.junit.Assert.fail;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyBoolean;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.net.InetAddresses;
-import android.net.IEthernetNetworkManagementListener;
-import android.net.INetd;
-import android.net.IpConfiguration;
-import android.net.IpConfiguration.IpAssignment;
-import android.net.IpConfiguration.ProxySettings;
-import android.net.LinkAddress;
-import android.net.NetworkCapabilities;
-import android.net.StaticIpConfiguration;
-import android.os.HandlerThread;
-
-import androidx.test.filters.SmallTest;
-import androidx.test.runner.AndroidJUnit4;
-
-import com.android.internal.R;
-import com.android.testutils.HandlerUtils;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-import java.net.InetAddress;
-import java.util.ArrayList;
-
-@SmallTest
-@RunWith(AndroidJUnit4.class)
-public class EthernetTrackerTest {
-    private static final String TEST_IFACE = "test123";
-    private static final int TIMEOUT_MS = 1_000;
-    private static final String THREAD_NAME = "EthernetServiceThread";
-    private static final IEthernetNetworkManagementListener NULL_LISTENER = null;
-    private EthernetTracker tracker;
-    private HandlerThread mHandlerThread;
-    @Mock private Context mContext;
-    @Mock private EthernetNetworkFactory mFactory;
-    @Mock private INetd mNetd;
-    @Mock Resources mResources;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-        initMockResources();
-        when(mFactory.updateInterfaceLinkState(anyString(), anyBoolean(), any())).thenReturn(false);
-        mHandlerThread = new HandlerThread(THREAD_NAME);
-        mHandlerThread.start();
-        tracker = new EthernetTracker(mContext, mHandlerThread.getThreadHandler(), mFactory, mNetd);
-    }
-
-    @After
-    public void cleanUp() {
-        mHandlerThread.quitSafely();
-    }
-
-    private void initMockResources() {
-        doReturn("").when(mResources).getString(R.string.config_ethernet_iface_regex);
-        doReturn(new String[0]).when(mResources).getStringArray(R.array.config_ethernet_interfaces);
-        doReturn(mResources).when(mContext).getResources();
-    }
-
-    private void waitForIdle() {
-        HandlerUtils.waitForIdle(mHandlerThread, TIMEOUT_MS);
-    }
-
-    /**
-     * Test: Creation of various valid static IP configurations
-     */
-    @Test
-    public void createStaticIpConfiguration() {
-        // Empty gives default StaticIPConfiguration object
-        assertStaticConfiguration(new StaticIpConfiguration(), "");
-
-        // Setting only the IP address properly cascades and assumes defaults
-        assertStaticConfiguration(new StaticIpConfiguration.Builder()
-                .setIpAddress(new LinkAddress("192.0.2.10/24")).build(), "ip=192.0.2.10/24");
-
-        final ArrayList<InetAddress> dnsAddresses = new ArrayList<>();
-        dnsAddresses.add(InetAddresses.parseNumericAddress("4.4.4.4"));
-        dnsAddresses.add(InetAddresses.parseNumericAddress("8.8.8.8"));
-        // Setting other fields properly cascades them
-        assertStaticConfiguration(new StaticIpConfiguration.Builder()
-                .setIpAddress(new LinkAddress("192.0.2.10/24"))
-                .setDnsServers(dnsAddresses)
-                .setGateway(InetAddresses.parseNumericAddress("192.0.2.1"))
-                .setDomains("android").build(),
-                "ip=192.0.2.10/24 dns=4.4.4.4,8.8.8.8 gateway=192.0.2.1 domains=android");
-
-        // Verify order doesn't matter
-        assertStaticConfiguration(new StaticIpConfiguration.Builder()
-                .setIpAddress(new LinkAddress("192.0.2.10/24"))
-                .setDnsServers(dnsAddresses)
-                .setGateway(InetAddresses.parseNumericAddress("192.0.2.1"))
-                .setDomains("android").build(),
-                "domains=android ip=192.0.2.10/24 gateway=192.0.2.1 dns=4.4.4.4,8.8.8.8 ");
-    }
-
-    /**
-     * Test: Attempt creation of various bad static IP configurations
-     */
-    @Test
-    public void createStaticIpConfiguration_Bad() {
-        assertStaticConfigurationFails("ip=192.0.2.1/24 gateway= blah=20.20.20.20");  // Unknown key
-        assertStaticConfigurationFails("ip=192.0.2.1");  // mask is missing
-        assertStaticConfigurationFails("ip=a.b.c");  // not a valid ip address
-        assertStaticConfigurationFails("dns=4.4.4.4,1.2.3.A");  // not valid ip address in dns
-        assertStaticConfigurationFails("=");  // Key and value is empty
-        assertStaticConfigurationFails("ip=");  // Value is empty
-        assertStaticConfigurationFails("ip=192.0.2.1/24 gateway=");  // Gateway is empty
-    }
-
-    private void assertStaticConfigurationFails(String config) {
-        try {
-            EthernetTracker.parseStaticIpConfiguration(config);
-            fail("Expected to fail: " + config);
-        } catch (IllegalArgumentException e) {
-            // expected
-        }
-    }
-
-    private void assertStaticConfiguration(StaticIpConfiguration expectedStaticIpConfig,
-                String configAsString) {
-        final IpConfiguration expectedIpConfiguration = new IpConfiguration();
-        expectedIpConfiguration.setIpAssignment(IpAssignment.STATIC);
-        expectedIpConfiguration.setProxySettings(ProxySettings.NONE);
-        expectedIpConfiguration.setStaticIpConfiguration(expectedStaticIpConfig);
-
-        assertEquals(expectedIpConfiguration,
-                EthernetTracker.parseStaticIpConfiguration(configAsString));
-    }
-
-    private NetworkCapabilities.Builder makeEthernetCapabilitiesBuilder(boolean clearAll) {
-        final NetworkCapabilities.Builder builder =
-                clearAll ? NetworkCapabilities.Builder.withoutDefaultCapabilities()
-                        : new NetworkCapabilities.Builder();
-        return builder.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING)
-                .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_CONGESTED)
-                .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_SUSPENDED);
-    }
-
-    /**
-     * Test: Attempt to create a capabilties with various valid sets of capabilities/transports
-     */
-    @Test
-    public void createNetworkCapabilities() {
-
-        // Particularly common expected results
-        NetworkCapabilities defaultEthernetCleared =
-                makeEthernetCapabilitiesBuilder(true /* clearAll */)
-                        .setLinkUpstreamBandwidthKbps(100000)
-                        .setLinkDownstreamBandwidthKbps(100000)
-                        .addTransportType(NetworkCapabilities.TRANSPORT_ETHERNET)
-                        .build();
-
-        NetworkCapabilities ethernetClearedWithCommonCaps =
-                makeEthernetCapabilitiesBuilder(true /* clearAll */)
-                        .setLinkUpstreamBandwidthKbps(100000)
-                        .setLinkDownstreamBandwidthKbps(100000)
-                        .addTransportType(NetworkCapabilities.TRANSPORT_ETHERNET)
-                        .addCapability(12)
-                        .addCapability(13)
-                        .addCapability(14)
-                        .addCapability(15)
-                        .build();
-
-        // Empty capabilities and transports lists with a "please clear defaults" should
-        // yield an empty capabilities set with TRANPORT_ETHERNET
-        assertParsedNetworkCapabilities(defaultEthernetCleared, true, "", "");
-
-        // Empty capabilities and transports without the clear defaults flag should return the
-        // default capabilities set with TRANSPORT_ETHERNET
-        assertParsedNetworkCapabilities(
-                makeEthernetCapabilitiesBuilder(false /* clearAll */)
-                        .setLinkUpstreamBandwidthKbps(100000)
-                        .setLinkDownstreamBandwidthKbps(100000)
-                        .addTransportType(NetworkCapabilities.TRANSPORT_ETHERNET)
-                        .build(),
-                false, "", "");
-
-        // A list of capabilities without the clear defaults flag should return the default
-        // capabilities, mixed with the desired capabilities, and TRANSPORT_ETHERNET
-        assertParsedNetworkCapabilities(
-                makeEthernetCapabilitiesBuilder(false /* clearAll */)
-                        .setLinkUpstreamBandwidthKbps(100000)
-                        .setLinkDownstreamBandwidthKbps(100000)
-                        .addTransportType(NetworkCapabilities.TRANSPORT_ETHERNET)
-                        .addCapability(11)
-                        .addCapability(12)
-                        .build(),
-                false, "11,12", "");
-
-        // Adding a list of capabilities with a clear defaults will leave exactly those capabilities
-        // with a default TRANSPORT_ETHERNET since no overrides are specified
-        assertParsedNetworkCapabilities(ethernetClearedWithCommonCaps, true, "12,13,14,15", "");
-
-        // Adding any invalid capabilities to the list will cause them to be ignored
-        assertParsedNetworkCapabilities(ethernetClearedWithCommonCaps, true, "12,13,14,15,65,73", "");
-        assertParsedNetworkCapabilities(ethernetClearedWithCommonCaps, true, "12,13,14,15,abcdefg", "");
-
-        // Adding a valid override transport will remove the default TRANSPORT_ETHERNET transport
-        // and apply only the override to the capabiltities object
-        assertParsedNetworkCapabilities(
-                makeEthernetCapabilitiesBuilder(true /* clearAll */)
-                        .setLinkUpstreamBandwidthKbps(100000)
-                        .setLinkDownstreamBandwidthKbps(100000)
-                        .addTransportType(0)
-                        .build(),
-                true, "", "0");
-        assertParsedNetworkCapabilities(
-                makeEthernetCapabilitiesBuilder(true /* clearAll */)
-                        .setLinkUpstreamBandwidthKbps(100000)
-                        .setLinkDownstreamBandwidthKbps(100000)
-                        .addTransportType(1)
-                        .build(),
-                true, "", "1");
-        assertParsedNetworkCapabilities(
-                makeEthernetCapabilitiesBuilder(true /* clearAll */)
-                        .setLinkUpstreamBandwidthKbps(100000)
-                        .setLinkDownstreamBandwidthKbps(100000)
-                        .addTransportType(2)
-                        .build(),
-                true, "", "2");
-        assertParsedNetworkCapabilities(
-                makeEthernetCapabilitiesBuilder(true /* clearAll */)
-                        .setLinkUpstreamBandwidthKbps(100000)
-                        .setLinkDownstreamBandwidthKbps(100000)
-                        .addTransportType(3)
-                        .build(),
-                true, "", "3");
-
-        // "4" is TRANSPORT_VPN, which is unsupported. Should default back to TRANPORT_ETHERNET
-        assertParsedNetworkCapabilities(defaultEthernetCleared, true, "", "4");
-
-        // "5" is TRANSPORT_WIFI_AWARE, which is currently supported due to no legacy TYPE_NONE
-        // conversion. When that becomes available, this test must be updated
-        assertParsedNetworkCapabilities(defaultEthernetCleared, true, "", "5");
-
-        // "6" is TRANSPORT_LOWPAN, which is currently supported due to no legacy TYPE_NONE
-        // conversion. When that becomes available, this test must be updated
-        assertParsedNetworkCapabilities(defaultEthernetCleared, true, "", "6");
-
-        // Adding an invalid override transport will leave the transport as TRANSPORT_ETHERNET
-        assertParsedNetworkCapabilities(defaultEthernetCleared,true, "", "100");
-        assertParsedNetworkCapabilities(defaultEthernetCleared, true, "", "abcdefg");
-
-        // Ensure the adding of both capabilities and transports work
-        assertParsedNetworkCapabilities(
-                makeEthernetCapabilitiesBuilder(true /* clearAll */)
-                        .setLinkUpstreamBandwidthKbps(100000)
-                        .setLinkDownstreamBandwidthKbps(100000)
-                        .addCapability(12)
-                        .addCapability(13)
-                        .addCapability(14)
-                        .addCapability(15)
-                        .addTransportType(3)
-                        .build(),
-                true, "12,13,14,15", "3");
-
-        // Ensure order does not matter for capability list
-        assertParsedNetworkCapabilities(ethernetClearedWithCommonCaps, true, "13,12,15,14", "");
-    }
-
-    private void assertParsedNetworkCapabilities(NetworkCapabilities expectedNetworkCapabilities,
-            boolean clearCapabilties, String configCapabiltiies,String configTransports) {
-        assertEquals(expectedNetworkCapabilities,
-                EthernetTracker.createNetworkCapabilities(clearCapabilties, configCapabiltiies,
-                        configTransports).build());
-    }
-
-    @Test
-    public void testCreateEthernetTrackerConfigReturnsCorrectValue() {
-        final String capabilities = "2";
-        final String ipConfig = "3";
-        final String transport = "4";
-        final String configString = String.join(";", TEST_IFACE, capabilities, ipConfig, transport);
-
-        final EthernetTracker.EthernetTrackerConfig config =
-                EthernetTracker.createEthernetTrackerConfig(configString);
-
-        assertEquals(TEST_IFACE, config.mIface);
-        assertEquals(capabilities, config.mCapabilities);
-        assertEquals(ipConfig, config.mIpConfig);
-        assertEquals(transport, config.mTransport);
-    }
-
-    @Test
-    public void testCreateEthernetTrackerConfigThrowsNpeWithNullInput() {
-        assertThrows(NullPointerException.class,
-                () -> EthernetTracker.createEthernetTrackerConfig(null));
-    }
-
-    @Test
-    public void testUpdateConfiguration() {
-        final NetworkCapabilities capabilities = new NetworkCapabilities.Builder().build();
-        final LinkAddress linkAddr = new LinkAddress("192.0.2.2/25");
-        final StaticIpConfiguration staticIpConfig =
-                new StaticIpConfiguration.Builder().setIpAddress(linkAddr).build();
-        final IpConfiguration ipConfig =
-                new IpConfiguration.Builder().setStaticIpConfiguration(staticIpConfig).build();
-        final IEthernetNetworkManagementListener listener = null;
-
-        tracker.updateConfiguration(TEST_IFACE, ipConfig, capabilities, listener);
-        waitForIdle();
-
-        verify(mFactory).updateInterface(
-                eq(TEST_IFACE), eq(ipConfig), eq(capabilities), eq(listener));
-    }
-
-    @Test
-    public void testConnectNetworkCorrectlyCallsFactory() {
-        tracker.connectNetwork(TEST_IFACE, NULL_LISTENER);
-        waitForIdle();
-
-        verify(mFactory).updateInterfaceLinkState(eq(TEST_IFACE), eq(true /* up */),
-                eq(NULL_LISTENER));
-    }
-
-    @Test
-    public void testDisconnectNetworkCorrectlyCallsFactory() {
-        tracker.disconnectNetwork(TEST_IFACE, NULL_LISTENER);
-        waitForIdle();
-
-        verify(mFactory).updateInterfaceLinkState(eq(TEST_IFACE), eq(false /* up */),
-                eq(NULL_LISTENER));
-    }
-}