Snap for 8981239 from 8da06cba7fdc2d2516545152def34ea4e5eb359b to mainline-tzdata4-release

Change-Id: Ifed2e492b13db71de7763b8a177dc4ded3ce008a
diff --git a/Android.bp b/Android.bp
index 6610ae6..aa0f42d 100644
--- a/Android.bp
+++ b/Android.bp
@@ -153,6 +153,12 @@
     srcs: [
         "apishim/31/**/*.java",
     ],
+    static_libs: [
+        // Libs building against module API can only be linked against when building against
+        // module API (so NetworkStackApi30Shims or NetworkStackApi29Shims can't use it, since they
+        // use system_30 and system_29 respectively).
+        "net-utils-framework-common",
+    ],
     libs: [
         "NetworkStackShimsCommon",
         "NetworkStackApi29Shims",
@@ -169,9 +175,6 @@
     srcs: [
         "apishim/33/**/*.java",
     ],
-    static_libs: [
-        "net-utils-framework-common",
-    ],
     libs: [
         "NetworkStackShimsCommon",
         "NetworkStackApi29Shims",
@@ -189,15 +192,16 @@
 // Shims for APIs being added to the current development version of Android. These APIs are not
 // stable and have no defined version number. These could be called 10000, but they use the next
 // integer so if the next SDK release happens to use that integer, we don't need to rename them.
+// Jarjar rules are generated based on the stable shims, which do not contain this library. As a
+// result, no static_lib that needs jarjar should be used here. In general, static_libs should not
+// be used in this library at all; instead they can be in one of the earlier, shim libraries which
+// are part of the stable shims and scanned when generating jarjar rules.
 java_library {
     name: "NetworkStackApi34Shims",
     defaults: ["NetworkStackShimsDefaults", "ConnectivityNextEnableDefaults"],
     srcs: [
         "apishim/34/**/*.java",
     ],
-    static_libs: [
-        "net-utils-framework-common",
-    ],
     libs: [
         "NetworkStackShimsCommon",
         "NetworkStackApi29Shims",
@@ -353,15 +357,31 @@
     visibility: ["//packages/modules/Connectivity/tests/cts/net"],
 }
 
-filegroup {
+java_genrule {
     name: "NetworkStackJarJarRules",
-    srcs: ["jarjar-rules-shared.txt"],
+    tool_files: [
+        // com.android.networkstack.apishim is already in the target package that is not jarjared,
+        // so it does not matter whether ApiStable or ApiCurrent is used to generate the jarjar
+        // rules. Use ApiStable to be based on most stable release configuration and be buildable
+        // in all branches.
+        ":NetworkStackApiStableLib{.jar}",
+        "jarjar-excludes.txt",
+    ],
+    tools: [
+        "jarjar-rules-generator",
+    ],
+    out: ["NetworkStackJarJarRules.txt"],
+    cmd: "$(location jarjar-rules-generator) " +
+        "--jars $(location :NetworkStackApiStableLib{.jar}) " +
+        "--prefix com.android.networkstack " +
+        "--excludes $(location jarjar-excludes.txt) " +
+        "--output $(out)",
     visibility: [
         "//packages/modules/NetworkStack/tests/unit",
         "//packages/modules/NetworkStack/tests/integration",
         "//packages/modules/Connectivity/tests:__subpackages__",
         "//packages/modules/Connectivity/Tethering/tests/integration",
-    ]
+    ],
 }
 
 // Common defaults for compiling the actual APK, based on the NetworkStackApiXBase android libraries
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index d616750..9fe8b1d 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -58,14 +58,15 @@
              The service is protected by NETWORK_SETTINGS permissions as there is no better
              networking-related permission that exists on Q, is sufficiently protected (signature),
              and can be obtained via shell permissions. -->
-        <service android:name="com.android.server.TestNetworkStackService"
+        <!-- (The name starting with a dot means the package prefix is the APK package name) -->
+        <service android:name=".TestNetworkStackService"
                  android:permission="android.permission.NETWORK_SETTINGS"
                  android:exported="true">
             <intent-filter>
                 <action android:name="android.net.INetworkStackConnector.Test"/>
             </intent-filter>
         </service>
-        <service android:name="com.android.server.connectivity.ipmemorystore.RegularMaintenanceJobService"
+        <service android:name=".ipmemorystore.RegularMaintenanceJobService"
                  android:permission="android.permission.BIND_JOB_SERVICE" >
         </service>
     </application>
diff --git a/AndroidManifest_InProcess.xml b/AndroidManifest_InProcess.xml
index 7934826..40d74a5 100644
--- a/AndroidManifest_InProcess.xml
+++ b/AndroidManifest_InProcess.xml
@@ -33,7 +33,7 @@
                 <action android:name="android.net.INetworkStackConnector.InProcess"/>
             </intent-filter>
         </service>
-        <service android:name="com.android.server.connectivity.ipmemorystore.RegularMaintenanceJobService"
+        <service android:name="com.android.networkstack.ipmemorystore.RegularMaintenanceJobService"
                  android:process="system"
                  android:permission="android.permission.BIND_JOB_SERVICE" >
         </service>
diff --git a/TEST_MAPPING b/TEST_MAPPING
index f7dc8f0..1d0f234 100644
--- a/TEST_MAPPING
+++ b/TEST_MAPPING
@@ -16,9 +16,7 @@
     // so in theory the infra would not need to reinstall/reboot devices to run both.
     {
       "name": "NetworkStackTests[CaptivePortalLoginGoogle.apk+NetworkStackGoogle.apk+com.google.android.resolv.apex+com.google.android.tethering.apex]"
-    }
-  ],
-  "mainline-postsubmit": [
+    },
     {
       "name": "NetworkStackIntegrationTests[CaptivePortalLoginGoogle.apk+NetworkStackGoogle.apk+com.google.android.resolv.apex+com.google.android.tethering.apex]"
     }
diff --git a/common/moduleutils/Android.bp b/common/moduleutils/Android.bp
deleted file mode 100644
index 11b3d6d..0000000
--- a/common/moduleutils/Android.bp
+++ /dev/null
@@ -1,44 +0,0 @@
-//
-// Copyright (C) 2019 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.
-//
-
-// Shared utility sources to be used by multiple network modules
-// TODO: remove all frameworks/base dependencies on packages/modules/NetworkStack and
-// frameworks/base/packages/Tethering by moving these files to frameworks/libs/net.
-package {
-    default_applicable_licenses: ["Android-Apache-2.0"],
-}
-
-filegroup {
-    name: "connectivity-module-utils-srcs",
-    srcs: [
-        "src/android/net/shared/NetdUtils.java",
-    ],
-    visibility: [
-        "//packages/modules/Connectivity/service",
-    ]
-}
-
-// Shared utility sources to be used by tethering modules
-filegroup {
-    name: "tethering-module-utils-srcs",
-    srcs: [
-        "src/android/net/shared/NetdUtils.java",
-    ],
-    visibility: [
-        "//frameworks/base/packages/Tethering",
-        "//packages/modules/Connectivity/Tethering"
-    ],
-}
diff --git a/common/moduleutils/src/android/net/shared/LinkPropertiesParcelableUtil.java b/common/moduleutils/src/android/net/shared/LinkPropertiesParcelableUtil.java
deleted file mode 100644
index 1729da6..0000000
--- a/common/moduleutils/src/android/net/shared/LinkPropertiesParcelableUtil.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (C) 2019 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 android.net.shared;
-
-import android.annotation.Nullable;
-import android.net.LinkProperties;
-import android.net.ProxyInfo;
-
-/**
- * Collection of utility methods to convert to and from stable AIDL parcelables for LinkProperties
- * and its attributes.
- * @hide
- */
-public final class LinkPropertiesParcelableUtil {
-    // Temporary methods to facilitate migrating clients away from LinkPropertiesParcelable
-    // TODO: remove the following methods after migrating clients.
-
-    /**
-     * @deprecated conversion to stable parcelable is no longer necessary.
-     */
-    @Deprecated
-    public static LinkProperties toStableParcelable(@Nullable LinkProperties lp) {
-        return lp;
-    }
-
-    /**
-     * @deprecated conversion to stable parcelable is no longer necessary.
-     */
-    @Deprecated
-    public static ProxyInfo toStableParcelable(@Nullable ProxyInfo info) {
-        return info;
-    }
-}
diff --git a/common/moduleutils/src/android/net/shared/NetdUtils.java b/common/moduleutils/src/android/net/shared/NetdUtils.java
deleted file mode 100644
index f801e16..0000000
--- a/common/moduleutils/src/android/net/shared/NetdUtils.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (C) 2019 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 android.net.shared;
-
-import static android.system.OsConstants.EBUSY;
-
-import android.net.INetd;
-import android.net.TetherConfigParcel;
-import android.os.RemoteException;
-import android.os.ServiceSpecificException;
-import android.os.SystemClock;
-import android.util.Log;
-
-/**
- * Implements common operations on INetd
- * @hide
- */
-public class NetdUtils {
-    private static final String TAG = NetdUtils.class.getSimpleName();
-
-    /** Start tethering. */
-    public static void tetherStart(final INetd netd, final boolean usingLegacyDnsProxy,
-            final String[] dhcpRange) throws RemoteException, ServiceSpecificException {
-        final TetherConfigParcel config = new TetherConfigParcel();
-        config.usingLegacyDnsProxy = usingLegacyDnsProxy;
-        config.dhcpRanges = dhcpRange;
-        netd.tetherStartWithConfiguration(config);
-    }
-
-    /**
-     * Retry Netd#networkAddInterface for EBUSY error code.
-     * If the same interface (e.g., wlan0) is in client mode and then switches to tethered mode.
-     * There can be a race where puts the interface into the local network but interface is still
-     * in use in netd because the ConnectivityService thread hasn't processed the disconnect yet.
-     * See b/158269544 for detail.
-     */
-    private static void networkAddInterface(final INetd netd, final String iface,
-            int maxAttempts, int pollingIntervalMs)
-            throws ServiceSpecificException, RemoteException {
-        for (int i = 1; i <= maxAttempts; i++) {
-            try {
-                netd.networkAddInterface(INetd.LOCAL_NET_ID, iface);
-                return;
-            } catch (ServiceSpecificException e) {
-                if (e.errorCode == EBUSY && i < maxAttempts) {
-                    SystemClock.sleep(pollingIntervalMs);
-                    continue;
-                }
-
-                Log.e(TAG, "Retry Netd#networkAddInterface failure: " + e);
-                throw e;
-            }
-        }
-    }
-
-    /** Reset interface for tethering. */
-    public static void untetherInterface(final INetd netd, String iface)
-            throws RemoteException, ServiceSpecificException {
-        try {
-            netd.tetherInterfaceRemove(iface);
-        } finally {
-            netd.networkRemoveInterface(INetd.LOCAL_NET_ID, iface);
-        }
-    }
-}
diff --git a/common/networkstackclient/src/android/net/shared/ProvisioningConfiguration.java b/common/networkstackclient/src/android/net/shared/ProvisioningConfiguration.java
index 3bf6744..3a2a1bd 100644
--- a/common/networkstackclient/src/android/net/shared/ProvisioningConfiguration.java
+++ b/common/networkstackclient/src/android/net/shared/ProvisioningConfiguration.java
@@ -333,7 +333,7 @@
 
             @Override
             public int hashCode() {
-                return Objects.hash(mId, mPayload);
+                return Objects.hash(mId, Arrays.hashCode(mPayload));
             }
 
             @Override
diff --git a/jarjar-excludes.txt b/jarjar-excludes.txt
new file mode 100644
index 0000000..42a9219
--- /dev/null
+++ b/jarjar-excludes.txt
@@ -0,0 +1,4 @@
+# Services referenced in the manifest. They could be moved to a different package as there are no
+# hardcoded reference to them in AOSP, but it is possible that OEM customizations are relying on
+# the naming.
+com\.android\.server\.NetworkStackService(\$.+)?
diff --git a/jarjar-rules-shared.txt b/jarjar-rules-shared.txt
deleted file mode 100644
index e8c9c19..0000000
--- a/jarjar-rules-shared.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-rule com.android.internal.util.** android.net.networkstack.util.@1
-rule com.google.protobuf.** com.android.networkstack.protobuf.@1
-
-# Classes from net-utils-framework-common
-rule com.android.net.module.util.** com.android.networkstack.util.@1
-
-# Ignore DhcpResultsParcelable, but jarjar DhcpResults
-# TODO: move DhcpResults into services.net and delete from here
-rule android.net.DhcpResultsParcelable* @0
-rule android.net.DhcpResults* android.net.networkstack.DhcpResults@1
-rule android.util.LocalLog* android.net.networkstack.util.LocalLog@1
-
-rule android.util.IndentingPrintWriter* android.net.networkstack.util.AndroidUtilIndentingPrintWriter@1
-
-# Classes from modules-utils-build_system
-rule com.android.modules.utils.build.** com.android.networkstack.utils.build.@1
\ No newline at end of file
diff --git a/jni/network_stack_utils_jni.cpp b/jni/network_stack_utils_jni.cpp
index 63146d8..d7f6d78 100644
--- a/jni/network_stack_utils_jni.cpp
+++ b/jni/network_stack_utils_jni.cpp
@@ -38,7 +38,8 @@
 #include <android/log.h>
 
 namespace android {
-constexpr const char NETWORKSTACKUTILS_PKG_NAME[] = "android/net/util/NetworkStackUtils";
+constexpr const char NETWORKSTACKUTILS_PKG_NAME[] =
+    "com/android/networkstack/util/NetworkStackUtils";
 
 static const uint32_t kEtherTypeOffset = offsetof(ether_header, ether_type);
 static const uint32_t kEtherHeaderLen = sizeof(ether_header);
diff --git a/proguard.flags b/proguard.flags
index 7f8f207..511a6b3 100644
--- a/proguard.flags
+++ b/proguard.flags
@@ -1,14 +1,14 @@
--keepclassmembers class android.net.ip.IpClient {
+-keepclassmembers class com.android.networkstack.android.net.ip.IpClient {
     static final int CMD_*;
     static final int EVENT_*;
 }
 
--keepclassmembers class android.net.dhcp.DhcpClient {
+-keepclassmembers class com.android.networkstack.android.net.dhcp.DhcpClient {
     static final int CMD_*;
     static final int EVENT_*;
 }
 
--keepclassmembers public class * extends com.android.networkstack.util.Struct {
+-keepclassmembers public class * extends com.android.networkstack.com.android.net.module.util.Struct {
     *;
 }
 
@@ -17,4 +17,4 @@
 # This replicates the base proguard rule used by the build by default
 # (proguard_basic_keeps.flags), but needs to be specified here because the
 # com.google.protobuf package is jarjared to the below package.
--keepclassmembers class * extends com.android.networkstack.protobuf.MessageLite { <fields>; }
+-keepclassmembers class * extends com.android.networkstack.com.google.protobuf.MessageLite { <fields>; }
diff --git a/src/android/net/NetworkStackIpMemoryStore.java b/src/android/net/NetworkStackIpMemoryStore.java
index 850faaf..5426db0 100644
--- a/src/android/net/NetworkStackIpMemoryStore.java
+++ b/src/android/net/NetworkStackIpMemoryStore.java
@@ -20,13 +20,15 @@
 
 import androidx.annotation.NonNull;
 
+import com.android.networkstack.ipmemorystore.IpMemoryStoreService;
+
 import java.util.concurrent.ExecutionException;
 import java.util.function.Consumer;
 
 /**
  * service used to communicate with the ip memory store service in network stack,
  * which is running in the same module.
- * @see com.android.server.connectivity.ipmemorystore.IpMemoryStoreService
+ * @see IpMemoryStoreService
  * @hide
  */
 public class NetworkStackIpMemoryStore extends IpMemoryStoreClient {
diff --git a/src/android/net/apf/ApfFilter.java b/src/android/net/apf/ApfFilter.java
index 4d98568..905aa9a 100644
--- a/src/android/net/apf/ApfFilter.java
+++ b/src/android/net/apf/ApfFilter.java
@@ -49,7 +49,6 @@
 import android.net.metrics.ApfStats;
 import android.net.metrics.IpConnectivityLog;
 import android.net.metrics.RaEvent;
-import android.net.util.NetworkStackUtils;
 import android.os.PowerManager;
 import android.os.SystemClock;
 import android.system.ErrnoException;
@@ -67,6 +66,7 @@
 import com.android.net.module.util.CollectionUtils;
 import com.android.net.module.util.ConnectivityUtils;
 import com.android.net.module.util.InterfaceParams;
+import com.android.networkstack.util.NetworkStackUtils;
 
 import java.io.FileDescriptor;
 import java.io.IOException;
@@ -191,7 +191,7 @@
 
     // Thread to listen for RAs.
     @VisibleForTesting
-    class ReceiveThread extends Thread {
+    public class ReceiveThread extends Thread {
         private final byte[] mPacket = new byte[1514];
         private final FileDescriptor mSocket;
         private final long mStart = SystemClock.elapsedRealtime();
@@ -348,9 +348,9 @@
     private final IpConnectivityLog mMetricsLog;
 
     @VisibleForTesting
-    byte[] mHardwareAddress;
+    public byte[] mHardwareAddress;
     @VisibleForTesting
-    ReceiveThread mReceiveThread;
+    public ReceiveThread mReceiveThread;
     @GuardedBy("this")
     private long mUniqueCounter;
     @GuardedBy("this")
@@ -386,7 +386,7 @@
     private int mIPv4PrefixLength;
 
     @VisibleForTesting
-    ApfFilter(Context context, ApfConfiguration config, InterfaceParams ifParams,
+    public ApfFilter(Context context, ApfConfiguration config, InterfaceParams ifParams,
             IpClientCallbacksWrapper ipClientCallback, IpConnectivityLog log) {
         mApfCapabilities = config.apfCapabilities;
         mIpClientCallback = ipClientCallback;
@@ -466,7 +466,7 @@
      * filters to ignore useless RAs.
      */
     @VisibleForTesting
-    void maybeStartFilter() {
+    public void maybeStartFilter() {
         FileDescriptor socket;
         try {
             mHardwareAddress = mInterfaceParams.macAddr.toByteArray();
@@ -546,7 +546,7 @@
 
     // A class to hold information about an RA.
     @VisibleForTesting
-    class Ra {
+    public class Ra {
         // From RFC4861:
         private static final int ICMP6_RA_HEADER_LEN = 16;
         private static final int ICMP6_RA_CHECKSUM_OFFSET =
@@ -771,7 +771,8 @@
         // Buffer.position(int) or due to an invalid-length option) or IndexOutOfBoundsException
         // (from ByteBuffer.get(int) ) if parsing encounters something non-compliant with
         // specifications.
-        Ra(byte[] packet, int length) throws InvalidRaException {
+        @VisibleForTesting
+        public Ra(byte[] packet, int length) throws InvalidRaException {
             if (length < ICMP6_RA_OPTION_OFFSET) {
                 throw new InvalidRaException("Not an ICMP6 router advertisement: too short");
             }
@@ -1619,7 +1620,7 @@
      */
     @GuardedBy("this")
     @VisibleForTesting
-    void installNewProgramLocked() {
+    public void installNewProgramLocked() {
         purgeExpiredRasLocked();
         ArrayList<Ra> rasToFilter = new ArrayList<>();
         final byte[] program;
@@ -1730,7 +1731,7 @@
      * @return a ProcessRaResult enum describing what action was performed.
      */
     @VisibleForTesting
-    synchronized ProcessRaResult processRa(byte[] packet, int length) {
+    public synchronized ProcessRaResult processRa(byte[] packet, int length) {
         if (VDBG) hexDump("Read packet = ", packet, length);
 
         // Have we seen this RA before?
diff --git a/src/android/net/apf/ApfGenerator.java b/src/android/net/apf/ApfGenerator.java
index bf4d910..db51186 100644
--- a/src/android/net/apf/ApfGenerator.java
+++ b/src/android/net/apf/ApfGenerator.java
@@ -16,6 +16,8 @@
 
 package android.net.apf;
 
+import com.android.internal.annotations.VisibleForTesting;
+
 import java.util.ArrayList;
 import java.util.HashMap;
 
@@ -372,7 +374,8 @@
      * {@code version} of the APF interpreter. Throws {@code IllegalInstructionException} if
      * the requested version is unsupported.
      */
-    ApfGenerator(int version) throws IllegalInstructionException {
+    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
+    public ApfGenerator(int version) throws IllegalInstructionException {
         mVersion = version;
         requireApfVersion(MIN_APF_VERSION);
     }
diff --git a/src/android/net/dhcp/DhcpClient.java b/src/android/net/dhcp/DhcpClient.java
index 34c37a2..a540cef 100644
--- a/src/android/net/dhcp/DhcpClient.java
+++ b/src/android/net/dhcp/DhcpClient.java
@@ -31,12 +31,6 @@
 import static android.net.dhcp.DhcpPacket.INADDR_ANY;
 import static android.net.dhcp.DhcpPacket.INADDR_BROADCAST;
 import static android.net.dhcp.DhcpPacket.INFINITE_LEASE;
-import static android.net.util.NetworkStackUtils.DHCP_INIT_REBOOT_VERSION;
-import static android.net.util.NetworkStackUtils.DHCP_IPV6_ONLY_PREFERRED_VERSION;
-import static android.net.util.NetworkStackUtils.DHCP_IP_CONFLICT_DETECT_VERSION;
-import static android.net.util.NetworkStackUtils.DHCP_RAPID_COMMIT_VERSION;
-import static android.net.util.NetworkStackUtils.DHCP_SLOW_RETRANSMISSION_VERSION;
-import static android.net.util.NetworkStackUtils.closeSocketQuietly;
 import static android.net.util.SocketUtils.makePacketSocketAddress;
 import static android.provider.DeviceConfig.NAMESPACE_CONNECTIVITY;
 import static android.system.OsConstants.AF_INET;
@@ -57,6 +51,12 @@
 import static com.android.net.module.util.NetworkStackConstants.IPV4_ADDR_ANY;
 import static com.android.net.module.util.NetworkStackConstants.IPV4_CONFLICT_ANNOUNCE_NUM;
 import static com.android.net.module.util.NetworkStackConstants.IPV4_CONFLICT_PROBE_NUM;
+import static com.android.networkstack.util.NetworkStackUtils.DHCP_INIT_REBOOT_VERSION;
+import static com.android.networkstack.util.NetworkStackUtils.DHCP_IPV6_ONLY_PREFERRED_VERSION;
+import static com.android.networkstack.util.NetworkStackUtils.DHCP_IP_CONFLICT_DETECT_VERSION;
+import static com.android.networkstack.util.NetworkStackUtils.DHCP_RAPID_COMMIT_VERSION;
+import static com.android.networkstack.util.NetworkStackUtils.DHCP_SLOW_RETRANSMISSION_VERSION;
+import static com.android.networkstack.util.NetworkStackUtils.closeSocketQuietly;
 
 import android.content.Context;
 import android.net.DhcpResults;
@@ -74,7 +74,6 @@
 import android.net.metrics.IpConnectivityLog;
 import android.net.networkstack.aidl.dhcp.DhcpOption;
 import android.net.util.HostnameTransliterator;
-import android.net.util.NetworkStackUtils;
 import android.net.util.SocketUtils;
 import android.os.Build;
 import android.os.Handler;
@@ -108,6 +107,7 @@
 import com.android.networkstack.apishim.common.ShimUtils;
 import com.android.networkstack.arp.ArpPacket;
 import com.android.networkstack.metrics.IpProvisioningMetrics;
+import com.android.networkstack.util.NetworkStackUtils;
 
 import java.io.ByteArrayOutputStream;
 import java.io.FileDescriptor;
diff --git a/src/android/net/dhcp/DhcpLease.java b/src/android/net/dhcp/DhcpLease.java
index 0b9cd7c..d440c42 100644
--- a/src/android/net/dhcp/DhcpLease.java
+++ b/src/android/net/dhcp/DhcpLease.java
@@ -142,7 +142,8 @@
 
     @Override
     public int hashCode() {
-        return Objects.hash(mClientId, mHwAddr, mNetAddr, mPrefixLength, mHostname, mExpTime);
+        return Objects.hash(Arrays.hashCode(mClientId), mHwAddr, mNetAddr, mPrefixLength,
+                mHostname, mExpTime);
     }
 
     static String clientIdToString(byte[] bytes) {
diff --git a/src/android/net/dhcp/DhcpServer.java b/src/android/net/dhcp/DhcpServer.java
index c700453..3325e74 100644
--- a/src/android/net/dhcp/DhcpServer.java
+++ b/src/android/net/dhcp/DhcpServer.java
@@ -23,7 +23,6 @@
 import static android.net.dhcp.IDhcpServer.STATUS_INVALID_ARGUMENT;
 import static android.net.dhcp.IDhcpServer.STATUS_SUCCESS;
 import static android.net.dhcp.IDhcpServer.STATUS_UNKNOWN_ERROR;
-import static android.net.util.NetworkStackUtils.DHCP_RAPID_COMMIT_VERSION;
 import static android.provider.DeviceConfig.NAMESPACE_CONNECTIVITY;
 import static android.system.OsConstants.AF_INET;
 import static android.system.OsConstants.IPPROTO_UDP;
@@ -39,6 +38,7 @@
 import static com.android.net.module.util.NetworkStackConstants.IPV4_ADDR_ALL;
 import static com.android.net.module.util.NetworkStackConstants.IPV4_ADDR_ANY;
 import static com.android.net.module.util.NetworkStackConstants.TAG_SYSTEM_DHCP_SERVER;
+import static com.android.networkstack.util.NetworkStackUtils.DHCP_RAPID_COMMIT_VERSION;
 import static com.android.server.util.PermissionUtil.enforceNetworkStackCallingPermission;
 
 import static java.lang.Integer.toUnsignedLong;
@@ -48,7 +48,6 @@
 import android.net.IpPrefix;
 import android.net.MacAddress;
 import android.net.TrafficStats;
-import android.net.util.NetworkStackUtils;
 import android.net.util.SocketUtils;
 import android.os.Handler;
 import android.os.Message;
@@ -68,6 +67,7 @@
 import com.android.internal.util.StateMachine;
 import com.android.net.module.util.DeviceConfigUtils;
 import com.android.net.module.util.SharedLog;
+import com.android.networkstack.util.NetworkStackUtils;
 
 import java.io.FileDescriptor;
 import java.io.IOException;
diff --git a/src/android/net/ip/ConnectivityPacketTracker.java b/src/android/net/ip/ConnectivityPacketTracker.java
index a905315..4b92179 100644
--- a/src/android/net/ip/ConnectivityPacketTracker.java
+++ b/src/android/net/ip/ConnectivityPacketTracker.java
@@ -24,7 +24,6 @@
 import static android.system.OsConstants.SOCK_RAW;
 
 import android.net.util.ConnectivityPacketSummary;
-import android.net.util.NetworkStackUtils;
 import android.os.Handler;
 import android.os.SystemClock;
 import android.system.ErrnoException;
@@ -37,6 +36,7 @@
 import com.android.internal.util.TokenBucket;
 import com.android.net.module.util.InterfaceParams;
 import com.android.net.module.util.PacketReader;
+import com.android.networkstack.util.NetworkStackUtils;
 
 import java.io.FileDescriptor;
 import java.io.IOException;
diff --git a/src/android/net/ip/IpClient.java b/src/android/net/ip/IpClient.java
index ea45851..97c6990 100644
--- a/src/android/net/ip/IpClient.java
+++ b/src/android/net/ip/IpClient.java
@@ -23,9 +23,6 @@
 import static android.net.ip.IIpClient.PROV_IPV6_LINKLOCAL;
 import static android.net.ip.IpReachabilityMonitor.INVALID_REACHABILITY_LOSS_TYPE;
 import static android.net.ip.IpReachabilityMonitor.nudEventTypeToInt;
-import static android.net.util.NetworkStackUtils.IPCLIENT_DISABLE_ACCEPT_RA_VERSION;
-import static android.net.util.NetworkStackUtils.IPCLIENT_GARP_NA_ROAMING_VERSION;
-import static android.net.util.NetworkStackUtils.IPCLIENT_GRATUITOUS_NA_VERSION;
 import static android.net.util.SocketUtils.makePacketSocketAddress;
 import static android.provider.DeviceConfig.NAMESPACE_CONNECTIVITY;
 import static android.system.OsConstants.AF_PACKET;
@@ -38,6 +35,9 @@
 import static com.android.net.module.util.NetworkStackConstants.ETHER_BROADCAST;
 import static com.android.net.module.util.NetworkStackConstants.IPV6_ADDR_ALL_ROUTERS_MULTICAST;
 import static com.android.net.module.util.NetworkStackConstants.VENDOR_SPECIFIC_IE_ID;
+import static com.android.networkstack.util.NetworkStackUtils.IPCLIENT_DISABLE_ACCEPT_RA_VERSION;
+import static com.android.networkstack.util.NetworkStackUtils.IPCLIENT_GARP_NA_ROAMING_VERSION;
+import static com.android.networkstack.util.NetworkStackUtils.IPCLIENT_GRATUITOUS_NA_VERSION;
 import static com.android.server.util.PermissionUtil.enforceNetworkStackCallingPermission;
 
 import android.annotation.SuppressLint;
@@ -73,7 +73,6 @@
 import android.net.shared.ProvisioningConfiguration;
 import android.net.shared.ProvisioningConfiguration.ScanResultInfo;
 import android.net.shared.ProvisioningConfiguration.ScanResultInfo.InformationElement;
-import android.net.util.NetworkStackUtils;
 import android.os.Build;
 import android.os.ConditionVariable;
 import android.os.Handler;
@@ -117,6 +116,7 @@
 import com.android.networkstack.metrics.IpProvisioningMetrics;
 import com.android.networkstack.metrics.NetworkQuirkMetrics;
 import com.android.networkstack.packets.NeighborAdvertisement;
+import com.android.networkstack.util.NetworkStackUtils;
 import com.android.server.NetworkObserverRegistry;
 import com.android.server.NetworkStackService.NetworkStackServiceManager;
 
@@ -507,18 +507,17 @@
 
     // Specific vendor OUI(3 bytes)/vendor specific type(1 byte) pattern for upstream hotspot
     // device detection. Add new byte array pattern below in turn.
-    private static final List<byte[]> METERED_IE_PATTERN_LIST = Collections.unmodifiableList(
-            Arrays.asList(
-                    new byte[] { (byte) 0x00, (byte) 0x17, (byte) 0xf2, (byte) 0x06 }
-    ));
+    private static final List<byte[]> METERED_IE_PATTERN_LIST = Collections.singletonList(
+            new byte[] { (byte) 0x00, (byte) 0x17, (byte) 0xf2, (byte) 0x06 }
+    );
 
     // Allows Wi-Fi to pass in DHCP options when particular vendor-specific IEs are present.
     // Maps each DHCP option code to a list of IEs, any of which will allow that option.
     private static final Map<Byte, List<byte[]>> DHCP_OPTIONS_ALLOWED = Map.of(
-            (byte) 60, Arrays.asList(
+            (byte) 60, Collections.singletonList(
                     // KT OUI: 00:17:C3, type: 17. See b/170928882.
                     new byte[]{ (byte) 0x00, (byte) 0x17, (byte) 0xc3, (byte) 0x11 }),
-            (byte) 77, Arrays.asList(
+            (byte) 77, Collections.singletonList(
                     // KT OUI: 00:17:C3, type: 17. See b/170928882.
                     new byte[]{ (byte) 0x00, (byte) 0x17, (byte) 0xc3, (byte) 0x11 })
     );
@@ -697,7 +696,7 @@
     }
 
     @VisibleForTesting
-    IpClient(Context context, String ifName, IIpClientCallbacks callback,
+    public IpClient(Context context, String ifName, IIpClientCallbacks callback,
             NetworkObserverRegistry observerRegistry, NetworkStackServiceManager nssManager,
             Dependencies deps) {
         super(IpClient.class.getSimpleName() + "." + ifName);
diff --git a/src/android/net/ip/IpClientLinkObserver.java b/src/android/net/ip/IpClientLinkObserver.java
index 56c5293..08226ef 100644
--- a/src/android/net/ip/IpClientLinkObserver.java
+++ b/src/android/net/ip/IpClientLinkObserver.java
@@ -16,7 +16,6 @@
 
 package android.net.ip;
 
-import static android.net.util.NetworkStackUtils.IPCLIENT_PARSE_NETLINK_EVENTS_VERSION;
 import static android.system.OsConstants.AF_INET6;
 import static android.system.OsConstants.AF_UNSPEC;
 import static android.system.OsConstants.IFF_LOOPBACK;
@@ -29,6 +28,7 @@
 import static com.android.net.module.util.netlink.NetlinkConstants.RTPROT_KERNEL;
 import static com.android.net.module.util.netlink.NetlinkConstants.RTPROT_RA;
 import static com.android.net.module.util.netlink.NetlinkConstants.RT_SCOPE_UNIVERSE;
+import static com.android.networkstack.util.NetworkStackUtils.IPCLIENT_PARSE_NETLINK_EVENTS_VERSION;
 
 import android.app.AlarmManager;
 import android.content.Context;
diff --git a/src/android/net/ip/IpReachabilityMonitor.java b/src/android/net/ip/IpReachabilityMonitor.java
index 82eb074..00f6dfa 100644
--- a/src/android/net/ip/IpReachabilityMonitor.java
+++ b/src/android/net/ip/IpReachabilityMonitor.java
@@ -20,9 +20,10 @@
 import static android.net.metrics.IpReachabilityEvent.NUD_FAILED_ORGANIC;
 import static android.net.metrics.IpReachabilityEvent.PROVISIONING_LOST;
 import static android.net.metrics.IpReachabilityEvent.PROVISIONING_LOST_ORGANIC;
-import static android.net.util.NetworkStackUtils.IP_REACHABILITY_MCAST_RESOLICIT_VERSION;
 import static android.provider.DeviceConfig.NAMESPACE_CONNECTIVITY;
 
+import static com.android.networkstack.util.NetworkStackUtils.IP_REACHABILITY_MCAST_RESOLICIT_VERSION;
+
 import android.content.Context;
 import android.net.ConnectivityManager;
 import android.net.INetd;
@@ -175,7 +176,8 @@
      * Encapsulates IpReachabilityMonitor dependencies on systems that hinder unit testing.
      * TODO: consider also wrapping MultinetworkPolicyTracker in this interface.
      */
-    interface Dependencies {
+    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
+    public interface Dependencies {
         void acquireWakeLock(long durationMs);
         IpNeighborMonitor makeIpNeighborMonitor(Handler h, SharedLog log, NeighborEventConsumer cb);
         boolean isFeatureEnabled(Context context, String name, boolean defaultEnabled);
@@ -239,9 +241,9 @@
     }
 
     @VisibleForTesting
-    IpReachabilityMonitor(Context context, InterfaceParams ifParams, Handler h, SharedLog log,
-            Callback callback, boolean usingMultinetworkPolicyTracker, Dependencies dependencies,
-            final IpConnectivityLog metricsLog, final INetd netd) {
+    public IpReachabilityMonitor(Context context, InterfaceParams ifParams, Handler h,
+            SharedLog log, Callback callback, boolean usingMultinetworkPolicyTracker,
+            Dependencies dependencies, final IpConnectivityLog metricsLog, final INetd netd) {
         if (ifParams == null) throw new IllegalArgumentException("null InterfaceParams");
 
         mContext = context;
diff --git a/src/com/android/server/TestNetworkStackService.java b/src/com/android/networkstack/TestNetworkStackService.java
similarity index 93%
rename from src/com/android/server/TestNetworkStackService.java
rename to src/com/android/networkstack/TestNetworkStackService.java
index 23981e5..f34300d 100644
--- a/src/com/android/server/TestNetworkStackService.java
+++ b/src/com/android/networkstack/TestNetworkStackService.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.server;
+package com.android.networkstack;
 
 import static com.android.server.util.PermissionUtil.isDebuggableBuild;
 
@@ -23,6 +23,8 @@
 
 import androidx.annotation.Nullable;
 
+import com.android.server.NetworkStackService;
+
 /**
  * A {@link NetworkStackService} that can only be bound to on debuggable builds.
  */
diff --git a/src/com/android/server/connectivity/ipmemorystore/IpMemoryStoreDatabase.java b/src/com/android/networkstack/ipmemorystore/IpMemoryStoreDatabase.java
similarity index 99%
rename from src/com/android/server/connectivity/ipmemorystore/IpMemoryStoreDatabase.java
rename to src/com/android/networkstack/ipmemorystore/IpMemoryStoreDatabase.java
index f9b6365..8242783 100644
--- a/src/com/android/server/connectivity/ipmemorystore/IpMemoryStoreDatabase.java
+++ b/src/com/android/networkstack/ipmemorystore/IpMemoryStoreDatabase.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.server.connectivity.ipmemorystore;
+package com.android.networkstack.ipmemorystore;
 
 import static com.android.net.module.util.Inet4AddressUtils.inet4AddressToIntHTH;
 import static com.android.net.module.util.Inet4AddressUtils.intToInet4AddressHTH;
diff --git a/src/com/android/server/connectivity/ipmemorystore/IpMemoryStoreService.java b/src/com/android/networkstack/ipmemorystore/IpMemoryStoreService.java
similarity index 98%
rename from src/com/android/server/connectivity/ipmemorystore/IpMemoryStoreService.java
rename to src/com/android/networkstack/ipmemorystore/IpMemoryStoreService.java
index ae9c875..aa7d698 100644
--- a/src/com/android/server/connectivity/ipmemorystore/IpMemoryStoreService.java
+++ b/src/com/android/networkstack/ipmemorystore/IpMemoryStoreService.java
@@ -14,15 +14,15 @@
  * limitations under the License.
  */
 
-package com.android.server.connectivity.ipmemorystore;
+package com.android.networkstack.ipmemorystore;
 
 import static android.net.ipmemorystore.Status.ERROR_DATABASE_CANNOT_BE_OPENED;
 import static android.net.ipmemorystore.Status.ERROR_GENERIC;
 import static android.net.ipmemorystore.Status.ERROR_ILLEGAL_ARGUMENT;
 import static android.net.ipmemorystore.Status.SUCCESS;
 
-import static com.android.server.connectivity.ipmemorystore.IpMemoryStoreDatabase.EXPIRY_ERROR;
-import static com.android.server.connectivity.ipmemorystore.RegularMaintenanceJobService.InterruptMaintenance;
+import static com.android.networkstack.ipmemorystore.IpMemoryStoreDatabase.EXPIRY_ERROR;
+import static com.android.networkstack.ipmemorystore.RegularMaintenanceJobService.InterruptMaintenance;
 
 import android.content.Context;
 import android.database.SQLException;
diff --git a/src/com/android/server/connectivity/ipmemorystore/RegularMaintenanceJobService.java b/src/com/android/networkstack/ipmemorystore/RegularMaintenanceJobService.java
similarity index 98%
rename from src/com/android/server/connectivity/ipmemorystore/RegularMaintenanceJobService.java
rename to src/com/android/networkstack/ipmemorystore/RegularMaintenanceJobService.java
index c8559c8..bc6213c 100644
--- a/src/com/android/server/connectivity/ipmemorystore/RegularMaintenanceJobService.java
+++ b/src/com/android/networkstack/ipmemorystore/RegularMaintenanceJobService.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.server.connectivity.ipmemorystore;
+package com.android.networkstack.ipmemorystore;
 
 import android.app.job.JobInfo;
 import android.app.job.JobParameters;
diff --git a/src/com/android/server/connectivity/ipmemorystore/RelevanceUtils.java b/src/com/android/networkstack/ipmemorystore/RelevanceUtils.java
similarity index 99%
rename from src/com/android/server/connectivity/ipmemorystore/RelevanceUtils.java
rename to src/com/android/networkstack/ipmemorystore/RelevanceUtils.java
index 38d5544..6a0c398 100644
--- a/src/com/android/server/connectivity/ipmemorystore/RelevanceUtils.java
+++ b/src/com/android/networkstack/ipmemorystore/RelevanceUtils.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.server.connectivity.ipmemorystore;
+package com.android.networkstack.ipmemorystore;
 
 import com.android.internal.annotations.VisibleForTesting;
 
diff --git a/src/com/android/server/connectivity/ipmemorystore/StatusAndCount.java b/src/com/android/networkstack/ipmemorystore/StatusAndCount.java
similarity index 93%
rename from src/com/android/server/connectivity/ipmemorystore/StatusAndCount.java
rename to src/com/android/networkstack/ipmemorystore/StatusAndCount.java
index 2cbe843..a6abdba 100644
--- a/src/com/android/server/connectivity/ipmemorystore/StatusAndCount.java
+++ b/src/com/android/networkstack/ipmemorystore/StatusAndCount.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.server.connectivity.ipmemorystore;
+package com.android.networkstack.ipmemorystore;
 
 /**
  * Small data class to wrap a Status and an int.
diff --git a/src/com/android/server/connectivity/ipmemorystore/Utils.java b/src/com/android/networkstack/ipmemorystore/Utils.java
similarity index 96%
rename from src/com/android/server/connectivity/ipmemorystore/Utils.java
rename to src/com/android/networkstack/ipmemorystore/Utils.java
index d8a46ed..c2fb1a4 100644
--- a/src/com/android/server/connectivity/ipmemorystore/Utils.java
+++ b/src/com/android/networkstack/ipmemorystore/Utils.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.server.connectivity.ipmemorystore;
+package com.android.networkstack.ipmemorystore;
 
 import android.net.ipmemorystore.Blob;
 
diff --git a/src/com/android/networkstack/metrics/DataStallDetectionStats.java b/src/com/android/networkstack/metrics/DataStallDetectionStats.java
index 751d98d..e13d2d4 100644
--- a/src/com/android/networkstack/metrics/DataStallDetectionStats.java
+++ b/src/com/android/networkstack/metrics/DataStallDetectionStats.java
@@ -157,8 +157,9 @@
 
     @Override
     public int hashCode() {
-        return Objects.hash(mNetworkType, mEvaluationType, mWifiInfo, mCellularInfo, mDns,
-                mTcpFailRate, mTcpSentSinceLastRecv);
+        return Objects.hash(mNetworkType, mEvaluationType, Arrays.hashCode(mWifiInfo),
+                Arrays.hashCode(mCellularInfo), Arrays.hashCode(mDns), mTcpFailRate,
+                mTcpSentSinceLastRecv);
     }
 
     /**
diff --git a/src/com/android/networkstack/netlink/TcpSocketTracker.java b/src/com/android/networkstack/netlink/TcpSocketTracker.java
index 99d2c13..ec130e6 100644
--- a/src/com/android/networkstack/netlink/TcpSocketTracker.java
+++ b/src/com/android/networkstack/netlink/TcpSocketTracker.java
@@ -43,7 +43,6 @@
 import android.net.INetd;
 import android.net.MarkMaskParcel;
 import android.net.Network;
-import android.net.util.NetworkStackUtils;
 import android.net.util.SocketUtils;
 import android.os.AsyncTask;
 import android.os.Build;
@@ -70,6 +69,7 @@
 import com.android.networkstack.apishim.NetworkShimImpl;
 import com.android.networkstack.apishim.common.ShimUtils;
 import com.android.networkstack.apishim.common.UnsupportedApiLevelException;
+import com.android.networkstack.util.NetworkStackUtils;
 
 import java.io.FileDescriptor;
 import java.io.InterruptedIOException;
diff --git a/src/android/net/util/NetworkStackUtils.java b/src/com/android/networkstack/util/NetworkStackUtils.java
similarity index 98%
rename from src/android/net/util/NetworkStackUtils.java
rename to src/com/android/networkstack/util/NetworkStackUtils.java
index 1730b9d..2ec6841 100755
--- a/src/android/net/util/NetworkStackUtils.java
+++ b/src/com/android/networkstack/util/NetworkStackUtils.java
@@ -14,10 +14,11 @@
  * limitations under the License.
  */
 
-package android.net.util;
+package com.android.networkstack.util;
 
 import android.content.Context;
 import android.net.MacAddress;
+import android.net.util.SocketUtils;
 import android.system.ErrnoException;
 
 import androidx.annotation.NonNull;
diff --git a/src/com/android/server/NetworkStackService.java b/src/com/android/server/NetworkStackService.java
index 1e09f45..368a6d4 100644
--- a/src/com/android/server/NetworkStackService.java
+++ b/src/com/android/server/NetworkStackService.java
@@ -63,8 +63,8 @@
 import com.android.networkstack.NetworkStackNotifier;
 import com.android.networkstack.R;
 import com.android.networkstack.apishim.common.ShimUtils;
+import com.android.networkstack.ipmemorystore.IpMemoryStoreService;
 import com.android.server.connectivity.NetworkMonitor;
-import com.android.server.connectivity.ipmemorystore.IpMemoryStoreService;
 import com.android.server.util.PermissionUtil;
 
 import java.io.FileDescriptor;
@@ -421,8 +421,8 @@
             if (cb != null) cb.onStatusAvailable(0);
         }
 
-        @Override
-        protected void dump(@NonNull FileDescriptor fd, @NonNull PrintWriter fout,
+        @Override @VisibleForTesting(otherwise = VisibleForTesting.PROTECTED)
+        public void dump(@NonNull FileDescriptor fd, @NonNull PrintWriter fout,
                 @Nullable String[] args) {
             checkDumpPermission();
 
diff --git a/src/com/android/server/connectivity/NetworkMonitor.java b/src/com/android/server/connectivity/NetworkMonitor.java
index 84081b5..d98c5e4 100755
--- a/src/com/android/server/connectivity/NetworkMonitor.java
+++ b/src/com/android/server/connectivity/NetworkMonitor.java
@@ -55,24 +55,6 @@
 import static android.net.util.DataStallUtils.DEFAULT_DATA_STALL_VALID_DNS_TIME_THRESHOLD_MS;
 import static android.net.util.DataStallUtils.DEFAULT_DNS_LOG_SIZE;
 import static android.net.util.DataStallUtils.DEFAULT_TCP_POLLING_INTERVAL_MS;
-import static android.net.util.NetworkStackUtils.CAPTIVE_PORTAL_FALLBACK_PROBE_SPECS;
-import static android.net.util.NetworkStackUtils.CAPTIVE_PORTAL_FALLBACK_URL;
-import static android.net.util.NetworkStackUtils.CAPTIVE_PORTAL_HTTPS_URL;
-import static android.net.util.NetworkStackUtils.CAPTIVE_PORTAL_HTTP_URL;
-import static android.net.util.NetworkStackUtils.CAPTIVE_PORTAL_MODE;
-import static android.net.util.NetworkStackUtils.CAPTIVE_PORTAL_MODE_IGNORE;
-import static android.net.util.NetworkStackUtils.CAPTIVE_PORTAL_MODE_PROMPT;
-import static android.net.util.NetworkStackUtils.CAPTIVE_PORTAL_OTHER_FALLBACK_URLS;
-import static android.net.util.NetworkStackUtils.CAPTIVE_PORTAL_OTHER_HTTPS_URLS;
-import static android.net.util.NetworkStackUtils.CAPTIVE_PORTAL_OTHER_HTTP_URLS;
-import static android.net.util.NetworkStackUtils.CAPTIVE_PORTAL_USER_AGENT;
-import static android.net.util.NetworkStackUtils.CAPTIVE_PORTAL_USE_HTTPS;
-import static android.net.util.NetworkStackUtils.DEFAULT_CAPTIVE_PORTAL_DNS_PROBE_TIMEOUT;
-import static android.net.util.NetworkStackUtils.DEFAULT_CAPTIVE_PORTAL_FALLBACK_PROBE_SPECS;
-import static android.net.util.NetworkStackUtils.DEFAULT_CAPTIVE_PORTAL_HTTPS_URLS;
-import static android.net.util.NetworkStackUtils.DEFAULT_CAPTIVE_PORTAL_HTTP_URLS;
-import static android.net.util.NetworkStackUtils.DISMISS_PORTAL_IN_VALIDATED_NETWORK;
-import static android.net.util.NetworkStackUtils.DNS_PROBE_PRIVATE_IP_NO_INTERNET_VERSION;
 import static android.provider.DeviceConfig.NAMESPACE_CONNECTIVITY;
 
 import static com.android.net.module.util.CollectionUtils.isEmpty;
@@ -87,6 +69,24 @@
 import static com.android.networkstack.apishim.ConstantsShim.TRANSPORT_TEST;
 import static com.android.networkstack.util.DnsUtils.PRIVATE_DNS_PROBE_HOST_SUFFIX;
 import static com.android.networkstack.util.DnsUtils.TYPE_ADDRCONFIG;
+import static com.android.networkstack.util.NetworkStackUtils.CAPTIVE_PORTAL_FALLBACK_PROBE_SPECS;
+import static com.android.networkstack.util.NetworkStackUtils.CAPTIVE_PORTAL_FALLBACK_URL;
+import static com.android.networkstack.util.NetworkStackUtils.CAPTIVE_PORTAL_HTTPS_URL;
+import static com.android.networkstack.util.NetworkStackUtils.CAPTIVE_PORTAL_HTTP_URL;
+import static com.android.networkstack.util.NetworkStackUtils.CAPTIVE_PORTAL_MODE;
+import static com.android.networkstack.util.NetworkStackUtils.CAPTIVE_PORTAL_MODE_IGNORE;
+import static com.android.networkstack.util.NetworkStackUtils.CAPTIVE_PORTAL_MODE_PROMPT;
+import static com.android.networkstack.util.NetworkStackUtils.CAPTIVE_PORTAL_OTHER_FALLBACK_URLS;
+import static com.android.networkstack.util.NetworkStackUtils.CAPTIVE_PORTAL_OTHER_HTTPS_URLS;
+import static com.android.networkstack.util.NetworkStackUtils.CAPTIVE_PORTAL_OTHER_HTTP_URLS;
+import static com.android.networkstack.util.NetworkStackUtils.CAPTIVE_PORTAL_USER_AGENT;
+import static com.android.networkstack.util.NetworkStackUtils.CAPTIVE_PORTAL_USE_HTTPS;
+import static com.android.networkstack.util.NetworkStackUtils.DEFAULT_CAPTIVE_PORTAL_DNS_PROBE_TIMEOUT;
+import static com.android.networkstack.util.NetworkStackUtils.DEFAULT_CAPTIVE_PORTAL_FALLBACK_PROBE_SPECS;
+import static com.android.networkstack.util.NetworkStackUtils.DEFAULT_CAPTIVE_PORTAL_HTTPS_URLS;
+import static com.android.networkstack.util.NetworkStackUtils.DEFAULT_CAPTIVE_PORTAL_HTTP_URLS;
+import static com.android.networkstack.util.NetworkStackUtils.DISMISS_PORTAL_IN_VALIDATED_NETWORK;
+import static com.android.networkstack.util.NetworkStackUtils.DNS_PROBE_PRIVATE_IP_NO_INTERNET_VERSION;
 
 import android.app.PendingIntent;
 import android.content.BroadcastReceiver;
@@ -116,7 +116,6 @@
 import android.net.networkstack.aidl.NetworkMonitorParameters;
 import android.net.shared.PrivateDnsConfig;
 import android.net.util.DataStallUtils.EvaluationType;
-import android.net.util.NetworkStackUtils;
 import android.net.util.Stopwatch;
 import android.net.wifi.WifiInfo;
 import android.net.wifi.WifiManager;
@@ -177,6 +176,7 @@
 import com.android.networkstack.metrics.NetworkValidationMetrics;
 import com.android.networkstack.netlink.TcpSocketTracker;
 import com.android.networkstack.util.DnsUtils;
+import com.android.networkstack.util.NetworkStackUtils;
 import com.android.server.NetworkStackService.NetworkStackServiceManager;
 
 import org.json.JSONException;
diff --git a/tests/integration/Android.bp b/tests/integration/Android.bp
index 2bf0529..f21cf33 100644
--- a/tests/integration/Android.bp
+++ b/tests/integration/Android.bp
@@ -78,6 +78,7 @@
     min_sdk_version: "29",
     target_sdk_version: "30",
     jarjar_rules: ":NetworkStackJarJarRules",
+    test_config_template: "AndroidTestTemplate_Integration.xml",
 }
 
 // Network stack next integration tests.
@@ -99,6 +100,7 @@
     platform_apis: true,
     test_suites: ["device-tests"],
     jarjar_rules: ":NetworkStackJarJarRules",
+    test_config_template: "AndroidTestTemplate_Integration.xml",
 }
 
 // Network stack integration root tests.
diff --git a/tests/integration/AndroidTestTemplate_Integration.xml b/tests/integration/AndroidTestTemplate_Integration.xml
new file mode 100644
index 0000000..7ea8ad6
--- /dev/null
+++ b/tests/integration/AndroidTestTemplate_Integration.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2022 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.
+-->
+<configuration description="Test config for {MODULE}">
+    <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
+        <option name="cleanup-apks" value="true" />
+        <option name="test-file-name" value="{MODULE}.apk" />
+    </target_preparer>
+
+    <!-- Needed to push to the app's data directory. Without root, there appears to be no directory
+         that the shell can write to and that the networkstack can read from. -->
+    <target_preparer class="com.android.tradefed.targetprep.RootTargetPreparer"/>
+
+    <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
+        <option name="package" value="com.android.server.networkstack.integrationtests" />
+        <option name="runner" value="androidx.test.runner.AndroidJUnitRunner" />
+        <!-- By default, include and exclude filters go into /data/local/tmp/ajur/, which these
+             tests cannot access because they run in the network_stack selinux context. Move
+             them to the tests' data directory instead.
+
+             This avoids confusing module errors in presubmit when a test fails, the test infra
+             attempts to retry it, but the retry run results in the test process crashing with a
+             permission denial trying to read the exclude file. -->
+        <option name="test-filter-dir" value="/data/data/{PACKAGE}/cache" />
+        <option name="hidden-api-checks" value="false"/>
+    </test>
+</configuration>
diff --git a/tests/integration/AndroidTest_Coverage.xml b/tests/integration/AndroidTest_Coverage.xml
index 3e7361b..1c63a93 100644
--- a/tests/integration/AndroidTest_Coverage.xml
+++ b/tests/integration/AndroidTest_Coverage.xml
@@ -22,6 +22,14 @@
     <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
         <option name="package" value="com.android.server.networkstack.coverage" />
         <option name="runner" value="androidx.test.runner.AndroidJUnitRunner" />
+        <!-- By default, include and exclude filters go into /data/local/tmp/ajur/, which these
+             tests cannot access because they run in the network_stack selinux context. Move
+             them to the tests' data directory instead.
+
+             This avoids confusing module errors in presubmit when a test fails, the test infra
+             attempts to retry it, but the retry run results in the test process crashing with a
+             permission denial trying to read the exclude file. -->
+        <option name="test-filter-dir" value="/data/data/{PACKAGE}/cache" />
         <option name="hidden-api-checks" value="false"/>
         <option name="device-listeners" value="com.android.modules.utils.testing.NativeCoverageHackInstrumentationListener" />
     </test>
diff --git a/tests/integration/common/android/net/ip/IpClientIntegrationTestCommon.java b/tests/integration/common/android/net/ip/IpClientIntegrationTestCommon.java
index ff99bc8..1a4dab1 100644
--- a/tests/integration/common/android/net/ip/IpClientIntegrationTestCommon.java
+++ b/tests/integration/common/android/net/ip/IpClientIntegrationTestCommon.java
@@ -144,7 +144,6 @@
 import android.net.shared.Layer2Information;
 import android.net.shared.ProvisioningConfiguration;
 import android.net.shared.ProvisioningConfiguration.ScanResultInfo;
-import android.net.util.NetworkStackUtils;
 import android.os.Build;
 import android.os.Handler;
 import android.os.HandlerThread;
@@ -180,15 +179,16 @@
 import com.android.networkstack.apishim.ConstantsShim;
 import com.android.networkstack.apishim.common.ShimUtils;
 import com.android.networkstack.arp.ArpPacket;
+import com.android.networkstack.ipmemorystore.IpMemoryStoreService;
 import com.android.networkstack.metrics.IpProvisioningMetrics;
 import com.android.networkstack.metrics.IpReachabilityMonitorMetrics;
 import com.android.networkstack.metrics.NetworkQuirkMetrics;
 import com.android.networkstack.packets.NeighborAdvertisement;
 import com.android.networkstack.packets.NeighborSolicitation;
+import com.android.networkstack.util.NetworkStackUtils;
 import com.android.server.NetworkObserver;
 import com.android.server.NetworkObserverRegistry;
 import com.android.server.NetworkStackService.NetworkStackServiceManager;
-import com.android.server.connectivity.ipmemorystore.IpMemoryStoreService;
 import com.android.testutils.DevSdkIgnoreRule;
 import com.android.testutils.DevSdkIgnoreRule.IgnoreAfter;
 import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo;
@@ -3174,10 +3174,15 @@
         }
         final int after = getNumOpenFds();
 
-        // Check that the number of open fds is the same as before.
-        // If this exact match becomes flaky, we could add some tolerance here (e.g., allow 2-3
-        // extra fds), since it's likely that any leak would at least leak one FD per loop.
-        assertEquals("Fd leak after " + iterations + " iterations: ", before, after);
+        // Check that the number of open fds is the same as before, within some tolerance (e.g.,
+        // garbage collection or other cleanups might have caused an fd to be closed). This
+        // shouldn't make leak detection much less reliable, since it's likely that any leak would
+        // at least leak one FD per loop.
+        final int tolerance = 4;
+        assertTrue(
+                "FD leak detected after " + iterations + " iterations: expected "
+                        + before + " +/- " + tolerance + " fds, found " + after,
+                Math.abs(after - before) <= tolerance);
     }
 
     // TODO: delete when DhcpOption is @JavaOnlyImmutable.
diff --git a/tests/integration/signature/android/net/util/NetworkStackUtilsIntegrationTest.kt b/tests/integration/signature/android/net/util/NetworkStackUtilsIntegrationTest.kt
index 2dd984d..17153de 100644
--- a/tests/integration/signature/android/net/util/NetworkStackUtilsIntegrationTest.kt
+++ b/tests/integration/signature/android/net/util/NetworkStackUtilsIntegrationTest.kt
@@ -33,17 +33,18 @@
 import android.system.OsConstants.IPPROTO_UDP
 import android.system.OsConstants.SOCK_DGRAM
 import android.system.OsConstants.SOCK_NONBLOCK
-import androidx.test.platform.app.InstrumentationRegistry
 import android.system.OsConstants.SOCK_RAW
 import android.system.OsConstants.SOL_SOCKET
 import android.system.OsConstants.SO_RCVTIMEO
 import android.system.StructTimeval
+import androidx.test.platform.app.InstrumentationRegistry
 import com.android.net.module.util.InterfaceParams
 import com.android.net.module.util.Ipv6Utils
 import com.android.net.module.util.NetworkStackConstants.ETHER_ADDR_LEN
 import com.android.net.module.util.NetworkStackConstants.IPV4_ADDR_ANY
 import com.android.net.module.util.NetworkStackConstants.IPV6_ADDR_ALL_NODES_MULTICAST
 import com.android.net.module.util.structs.PrefixInformationOption
+import com.android.networkstack.util.NetworkStackUtils
 import com.android.testutils.ArpRequestFilter
 import com.android.testutils.ETHER_HEADER_LENGTH
 import com.android.testutils.IPV4_HEADER_LENGTH
@@ -56,9 +57,9 @@
 import org.junit.Test
 import java.io.FileDescriptor
 import java.net.Inet4Address
-import kotlin.reflect.KClass
 import java.net.Inet6Address
 import java.nio.ByteBuffer
+import kotlin.reflect.KClass
 import kotlin.test.assertEquals
 import kotlin.test.assertTrue
 import kotlin.test.fail
diff --git a/tests/unit/src/android/net/apf/ApfTest.java b/tests/unit/src/android/net/apf/ApfTest.java
index 6532f95..bf3b87d 100644
--- a/tests/unit/src/android/net/apf/ApfTest.java
+++ b/tests/unit/src/android/net/apf/ApfTest.java
@@ -984,7 +984,7 @@
         }
 
         @Override
-        void maybeStartFilter() {
+        public void maybeStartFilter() {
             mHardwareAddress = MOCK_MAC_ADDR;
             installNewProgramLocked();
 
diff --git a/tests/unit/src/android/net/dhcp/DhcpServerTest.java b/tests/unit/src/android/net/dhcp/DhcpServerTest.java
index 345c341..6d4bc13 100644
--- a/tests/unit/src/android/net/dhcp/DhcpServerTest.java
+++ b/tests/unit/src/android/net/dhcp/DhcpServerTest.java
@@ -23,9 +23,9 @@
 import static android.net.dhcp.DhcpPacket.INADDR_BROADCAST;
 import static android.net.dhcp.DhcpServer.CMD_RECEIVE_PACKET;
 import static android.net.dhcp.IDhcpServer.STATUS_SUCCESS;
-import static android.net.util.NetworkStackUtils.DHCP_RAPID_COMMIT_VERSION;
 
 import static com.android.net.module.util.Inet4AddressUtils.inet4AddressToIntHTH;
+import static com.android.networkstack.util.NetworkStackUtils.DHCP_RAPID_COMMIT_VERSION;
 
 import static junit.framework.Assert.assertEquals;
 import static junit.framework.Assert.assertFalse;
diff --git a/tests/unit/src/android/net/ip/IpClientTest.java b/tests/unit/src/android/net/ip/IpClientTest.java
index b88317a..8efa9ab 100644
--- a/tests/unit/src/android/net/ip/IpClientTest.java
+++ b/tests/unit/src/android/net/ip/IpClientTest.java
@@ -16,9 +16,10 @@
 
 package android.net.ip;
 
-import static android.net.util.NetworkStackUtils.IPCLIENT_PARSE_NETLINK_EVENTS_VERSION;
 import static android.system.OsConstants.RT_SCOPE_UNIVERSE;
 
+import static com.android.networkstack.util.NetworkStackUtils.IPCLIENT_PARSE_NETLINK_EVENTS_VERSION;
+
 import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -69,10 +70,10 @@
 
 import com.android.net.module.util.InterfaceParams;
 import com.android.networkstack.R;
+import com.android.networkstack.ipmemorystore.IpMemoryStoreService;
 import com.android.server.NetworkObserver;
 import com.android.server.NetworkObserverRegistry;
 import com.android.server.NetworkStackService;
-import com.android.server.connectivity.ipmemorystore.IpMemoryStoreService;
 import com.android.testutils.DevSdkIgnoreRule;
 import com.android.testutils.DevSdkIgnoreRule.IgnoreAfter;
 import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo;
diff --git a/tests/unit/src/android/net/ip/IpReachabilityMonitorTest.kt b/tests/unit/src/android/net/ip/IpReachabilityMonitorTest.kt
index a8c5c97..10b55d5 100644
--- a/tests/unit/src/android/net/ip/IpReachabilityMonitorTest.kt
+++ b/tests/unit/src/android/net/ip/IpReachabilityMonitorTest.kt
@@ -24,7 +24,7 @@
 import android.net.LinkProperties
 import android.net.RouteInfo
 import android.net.metrics.IpConnectivityLog
-import android.net.util.NetworkStackUtils.IP_REACHABILITY_MCAST_RESOLICIT_VERSION
+import com.android.networkstack.util.NetworkStackUtils.IP_REACHABILITY_MCAST_RESOLICIT_VERSION
 import android.os.Handler
 import android.os.HandlerThread
 import android.os.MessageQueue
@@ -54,7 +54,6 @@
 import com.android.net.module.util.InterfaceParams
 import com.android.net.module.util.SharedLog
 import com.android.net.module.util.ip.IpNeighborMonitor
-import com.android.net.module.util.ip.IpNeighborMonitor.NeighborEventConsumer
 import com.android.net.module.util.netlink.StructNdMsg.NUD_FAILED
 import com.android.net.module.util.netlink.StructNdMsg.NUD_REACHABLE
 import com.android.net.module.util.netlink.StructNdMsg.NUD_STALE
diff --git a/tests/unit/src/com/android/server/NetworkStackServiceTest.kt b/tests/unit/src/com/android/networkstack/NetworkStackServiceTest.kt
similarity index 98%
rename from tests/unit/src/com/android/server/NetworkStackServiceTest.kt
rename to tests/unit/src/com/android/networkstack/NetworkStackServiceTest.kt
index 40abe9e..4c4864b 100644
--- a/tests/unit/src/com/android/server/NetworkStackServiceTest.kt
+++ b/tests/unit/src/com/android/networkstack/NetworkStackServiceTest.kt
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.server
+package com.android.networkstack
 
 import android.content.Context
 import android.net.IIpMemoryStoreCallbacks
@@ -40,7 +40,7 @@
 import com.android.server.NetworkStackService.NetworkStackConnector
 import com.android.server.NetworkStackService.PermissionChecker
 import com.android.server.connectivity.NetworkMonitor
-import com.android.server.connectivity.ipmemorystore.IpMemoryStoreService
+import com.android.networkstack.ipmemorystore.IpMemoryStoreService
 import com.android.testutils.DevSdkIgnoreRule
 import com.android.testutils.DevSdkIgnoreRule.IgnoreAfter
 import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo
diff --git a/tests/unit/src/com/android/server/connectivity/ipmemorystore/IpMemoryStoreServiceTest.java b/tests/unit/src/com/android/networkstack/ipmemorystore/IpMemoryStoreServiceTest.java
similarity index 99%
rename from tests/unit/src/com/android/server/connectivity/ipmemorystore/IpMemoryStoreServiceTest.java
rename to tests/unit/src/com/android/networkstack/ipmemorystore/IpMemoryStoreServiceTest.java
index 73edcc7..976389e 100644
--- a/tests/unit/src/com/android/server/connectivity/ipmemorystore/IpMemoryStoreServiceTest.java
+++ b/tests/unit/src/com/android/networkstack/ipmemorystore/IpMemoryStoreServiceTest.java
@@ -14,9 +14,9 @@
  * limitations under the License.
  */
 
-package com.android.server.connectivity.ipmemorystore;
+package com.android.networkstack.ipmemorystore;
 
-import static com.android.server.connectivity.ipmemorystore.RegularMaintenanceJobService.InterruptMaintenance;
+import static com.android.networkstack.ipmemorystore.RegularMaintenanceJobService.InterruptMaintenance;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
diff --git a/tests/unit/src/com/android/server/connectivity/ipmemorystore/RelevanceUtilsTests.java b/tests/unit/src/com/android/networkstack/ipmemorystore/RelevanceUtilsTests.java
similarity index 97%
rename from tests/unit/src/com/android/server/connectivity/ipmemorystore/RelevanceUtilsTests.java
rename to tests/unit/src/com/android/networkstack/ipmemorystore/RelevanceUtilsTests.java
index 3d3aabc..86f111d 100644
--- a/tests/unit/src/com/android/server/connectivity/ipmemorystore/RelevanceUtilsTests.java
+++ b/tests/unit/src/com/android/networkstack/ipmemorystore/RelevanceUtilsTests.java
@@ -14,9 +14,9 @@
  * limitations under the License.
  */
 
-package com.android.server.connectivity.ipmemorystore;
+package com.android.networkstack.ipmemorystore;
 
-import static com.android.server.connectivity.ipmemorystore.RelevanceUtils.CAPPED_RELEVANCE;
+import static com.android.networkstack.ipmemorystore.RelevanceUtils.CAPPED_RELEVANCE;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
diff --git a/tests/unit/src/com/android/server/connectivity/NetworkMonitorTest.java b/tests/unit/src/com/android/server/connectivity/NetworkMonitorTest.java
index bf8a6e5..6cc4bfb 100644
--- a/tests/unit/src/com/android/server/connectivity/NetworkMonitorTest.java
+++ b/tests/unit/src/com/android/server/connectivity/NetworkMonitorTest.java
@@ -47,12 +47,6 @@
 import static android.net.util.DataStallUtils.DATA_STALL_EVALUATION_TYPE_DNS;
 import static android.net.util.DataStallUtils.DATA_STALL_EVALUATION_TYPE_TCP;
 import static android.net.util.DataStallUtils.DEFAULT_DATA_STALL_EVALUATION_TYPES;
-import static android.net.util.NetworkStackUtils.CAPTIVE_PORTAL_FALLBACK_PROBE_SPECS;
-import static android.net.util.NetworkStackUtils.CAPTIVE_PORTAL_OTHER_FALLBACK_URLS;
-import static android.net.util.NetworkStackUtils.CAPTIVE_PORTAL_USE_HTTPS;
-import static android.net.util.NetworkStackUtils.DEFAULT_CAPTIVE_PORTAL_DNS_PROBE_TIMEOUT;
-import static android.net.util.NetworkStackUtils.DISMISS_PORTAL_IN_VALIDATED_NETWORK;
-import static android.net.util.NetworkStackUtils.DNS_PROBE_PRIVATE_IP_NO_INTERNET_VERSION;
 import static android.os.Build.VERSION_CODES.S_V2;
 import static android.provider.DeviceConfig.NAMESPACE_CONNECTIVITY;
 
@@ -60,6 +54,12 @@
 import static com.android.net.module.util.NetworkStackConstants.TEST_CAPTIVE_PORTAL_HTTP_URL;
 import static com.android.net.module.util.NetworkStackConstants.TEST_URL_EXPIRATION_TIME;
 import static com.android.networkstack.util.DnsUtils.PRIVATE_DNS_PROBE_HOST_SUFFIX;
+import static com.android.networkstack.util.NetworkStackUtils.CAPTIVE_PORTAL_FALLBACK_PROBE_SPECS;
+import static com.android.networkstack.util.NetworkStackUtils.CAPTIVE_PORTAL_OTHER_FALLBACK_URLS;
+import static com.android.networkstack.util.NetworkStackUtils.CAPTIVE_PORTAL_USE_HTTPS;
+import static com.android.networkstack.util.NetworkStackUtils.DEFAULT_CAPTIVE_PORTAL_DNS_PROBE_TIMEOUT;
+import static com.android.networkstack.util.NetworkStackUtils.DISMISS_PORTAL_IN_VALIDATED_NETWORK;
+import static com.android.networkstack.util.NetworkStackUtils.DNS_PROBE_PRIVATE_IP_NO_INTERNET_VERSION;
 import static com.android.server.connectivity.NetworkMonitor.INITIAL_REEVALUATE_DELAY_MS;
 import static com.android.server.connectivity.NetworkMonitor.extractCharset;