Snap for 8426163 from 230e1fb6472342b7bdafe9b94d3387269bfdf62e to mainline-tzdata2-release Change-Id: Ib91e72f39c3acb6e340761ff85367e02b213744f
diff --git a/Android.bp b/Android.bp index 0f577a4..cce44b0 100644 --- a/Android.bp +++ b/Android.bp
@@ -45,6 +45,10 @@ default_applicable_licenses: ["Android-Apache-2.0"], } +// Whether to enable the targets in this file that target current SDKs. +// Set to false in branches like mainline-prod where API classes are too old to build current code. +enable_current_sdk_targets = false + java_defaults { name: "NetworkStackDevApiLevel", min_sdk_version: "29", @@ -53,14 +57,9 @@ java_defaults { name: "NetworkStackReleaseApiLevel", - sdk_version: "module_31", + sdk_version: "system_30", min_sdk_version: "29", - target_sdk_version: "31", - libs: [ - "framework-connectivity", - "framework-statsd", - "framework-wifi", - ] + target_sdk_version: "30", } // Libraries for the API shims @@ -128,6 +127,7 @@ // integer so if the next SDK release happens to use that integer, we don't need to rename them. java_library { name: "NetworkStackApi31Shims", + enabled: enable_current_sdk_targets, defaults: ["NetworkStackShimsDefaults"], srcs: [ "apishim/31/**/*.java", @@ -138,27 +138,6 @@ "NetworkStackApi30Shims", "framework-connectivity", ], - sdk_version: "module_31", - visibility: ["//visibility:private"], -} - - -// 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. -java_library { - name: "NetworkStackApi32Shims", - defaults: ["NetworkStackShimsDefaults"], - srcs: [ - "apishim/32/**/*.java", - ], - libs: [ - "NetworkStackShimsCommon", - "NetworkStackApi29Shims", - "NetworkStackApi30Shims", - "NetworkStackApi31Shims", - "framework-connectivity", - ], sdk_version: "module_current", visibility: ["//visibility:private"], } @@ -168,13 +147,13 @@ // called directly by the networkstack code. java_library { name: "NetworkStackApiCurrentShims", + enabled: enable_current_sdk_targets, defaults: ["NetworkStackShimsDefaults"], static_libs: [ "NetworkStackShimsCommon", "NetworkStackApi29Shims", "NetworkStackApi30Shims", "NetworkStackApi31Shims", - "NetworkStackApi32Shims", ], sdk_version: "module_current", visibility: [ @@ -193,10 +172,9 @@ "NetworkStackShimsCommon", "NetworkStackApi29Shims", "NetworkStackApi30Shims", - "NetworkStackApi31Shims", ], jarjar_rules: "apishim/jarjar-rules-compat.txt", - sdk_version: "module_31", + sdk_version: "system_30", visibility: [ "//packages/modules/Connectivity/Tethering", "//packages/modules/Connectivity/tests/cts/net", @@ -214,8 +192,8 @@ libs: ["unsupportedappusage"], static_libs: [ "androidx.annotation_annotation", - "modules-utils-build_system", "netd_aidl_interface-lateststable-java", + "netlink-client", "networkstack-client", "net-utils-framework-common", // See note on statsprotos when adding/updating proto build rules @@ -223,7 +201,6 @@ "statsprotos", "captiveportal-lib", "net-utils-device-common", - "net-utils-device-common-netlink", ], plugins: ["java_api_finder"], } @@ -238,6 +215,7 @@ ], static_libs: ["NetworkStackApiCurrentShims"], manifest: "AndroidManifestBase.xml", + enabled: enable_current_sdk_targets, visibility: [ "//frameworks/base/tests/net/integration", "//packages/modules/Connectivity/Tethering/tests/integration", @@ -279,7 +257,6 @@ visibility: [ "//packages/modules/NetworkStack/tests/unit", "//packages/modules/NetworkStack/tests/integration", - "//packages/modules/Connectivity/tests:__subpackages__", "//packages/modules/Connectivity/Tethering/tests/integration", ] } @@ -313,10 +290,8 @@ // The permission configuration *must* be included to ensure security of the device // The InProcessNetworkStack goes together with the PlatformCaptivePortalLogin, which replaces // the default CaptivePortalLogin. - required: [ - "PlatformNetworkPermissionConfig", - "PlatformCaptivePortalLogin", - ], + required: ["PlatformNetworkPermissionConfig", "PlatformCaptivePortalLogin"], + enabled: enable_current_sdk_targets, } // Pre-merge the AndroidManifest for NetworkStackNext, so that its manifest can be merged on top @@ -324,7 +299,8 @@ name: "NetworkStackNextManifestBase", defaults: ["NetworkStackAppDefaults", "NetworkStackDevApiLevel"], static_libs: ["NetworkStackApiCurrentLib"], - manifest: "AndroidManifest.xml" + manifest: "AndroidManifest.xml", + enabled: enable_current_sdk_targets, } // NetworkStack build targeting the current API release, for testing on in-development SDK @@ -335,10 +311,8 @@ certificate: "networkstack", manifest: "AndroidManifest_Next.xml", // The permission configuration *must* be included to ensure security of the device - required: [ - "NetworkPermissionConfig", - "privapp_whitelist_com.android.networkstack", - ], + required: ["NetworkPermissionConfig"], + enabled: enable_current_sdk_targets, } // Updatable network stack for finalized API @@ -349,10 +323,7 @@ certificate: "networkstack", manifest: "AndroidManifest.xml", // The permission configuration *must* be included to ensure security of the device - required: [ - "NetworkPermissionConfig", - "privapp_whitelist_com.android.networkstack", - ], + required: ["NetworkPermissionConfig"], updatable: true, } @@ -429,10 +400,7 @@ certificate: "networkstack", manifest: ":NetworkStackTestAndroidManifest", // The permission configuration *must* be included to ensure security of the device - required: [ - "NetworkPermissionConfig", - "privapp_whitelist_com.android.networkstack", - ], + required: ["NetworkPermissionConfig"], } // When adding or modifying protos, the jarjar rules and possibly proguard rules need
diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 8750795..55357a8 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml
@@ -19,9 +19,8 @@ <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.networkstack" android:sharedUserId="android.uid.networkstack" - android:versionCode="319999900" - android:versionName="s_aml_319999900" - coreApp="true" + android:versionCode="309999900" + android:versionName="r_aml_309999900" > <!-- Permissions must be defined here, and not in the base manifest, as the network stack running in the system server process does not need any permission, and having privileged
diff --git a/AndroidManifest_InProcess.xml b/AndroidManifest_InProcess.xml index 6c64d87..2cb146a 100644 --- a/AndroidManifest_InProcess.xml +++ b/AndroidManifest_InProcess.xml
@@ -19,8 +19,7 @@ <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.networkstack.inprocess" android:sharedUserId="android.uid.system" - android:process="system" - coreApp="true"> + android:process="system"> <application> <service android:name="com.android.server.NetworkStackService" android:process="system"
diff --git a/AndroidManifest_Next.xml b/AndroidManifest_Next.xml index 244d465..02fcb64 100644 --- a/AndroidManifest_Next.xml +++ b/AndroidManifest_Next.xml
@@ -17,7 +17,6 @@ <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.networkstack" android:sharedUserId="android.uid.networkstack" - android:versionCode="320000000" - android:versionName="T-next" - coreApp="true"> + android:versionCode="300000000" + android:versionName="R-next"> </manifest>
diff --git a/apishim/29/com/android/networkstack/apishim/api29/ConnectivityManagerShimImpl.java b/apishim/29/com/android/networkstack/apishim/api29/ConnectivityManagerShimImpl.java index 07327be..2ac25af 100644 --- a/apishim/29/com/android/networkstack/apishim/api29/ConnectivityManagerShimImpl.java +++ b/apishim/29/com/android/networkstack/apishim/api29/ConnectivityManagerShimImpl.java
@@ -16,14 +16,8 @@ package com.android.networkstack.apishim.api29; -import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED; -import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_VPN; -import static android.net.NetworkCapabilities.NET_CAPABILITY_TRUSTED; - import android.content.Context; -import android.net.ConnectivityManager; import android.net.ConnectivityManager.NetworkCallback; -import android.net.NetworkCapabilities; import android.net.NetworkRequest; import android.os.Handler; @@ -36,10 +30,7 @@ * Implementation of {@link ConnectivityManagerShim} for API 29. */ public class ConnectivityManagerShimImpl implements ConnectivityManagerShim { - protected final ConnectivityManager mCm; - protected ConnectivityManagerShimImpl(Context context) { - mCm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); - } + protected ConnectivityManagerShimImpl(Context context) {} /** * Get a new instance of {@link ConnectivityManagerShim}. @@ -61,31 +52,12 @@ /** * See android.net.ConnectivityManager#registerSystemDefaultNetworkCallback + * @throws UnsupportedApiLevelException if API is not available in this API level. */ @Override public void registerSystemDefaultNetworkCallback(@NonNull NetworkCallback networkCallback, - @NonNull Handler handler) { - // defaultNetworkRequest is not really a "request", just a way of tracking the system - // default network. It's guaranteed not to actually bring up any networks because it - // should be the same request as the ConnectivityService default request, and thus - // shares fate with it. In API <= R, registerSystemDefaultNetworkCallback is not - // available, and registerDefaultNetworkCallback will not track the system default when - // a VPN applies to the UID of this process. - final NetworkRequest defaultNetworkRequest = makeEmptyCapabilitiesRequest() - .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED) - .addCapability(NetworkCapabilities.NET_CAPABILITY_TRUSTED) - .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN) - .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) - .build(); - mCm.requestNetwork(defaultNetworkRequest, networkCallback, handler); - } - - @NonNull - protected NetworkRequest.Builder makeEmptyCapabilitiesRequest() { - // Q does not have clearCapabilities(), so assume the default capabilities are as below - return new NetworkRequest.Builder() - .removeCapability(NET_CAPABILITY_NOT_RESTRICTED) - .removeCapability(NET_CAPABILITY_TRUSTED) - .removeCapability(NET_CAPABILITY_NOT_VPN); + @NonNull Handler handler) throws UnsupportedApiLevelException { + // Not supported for API 29. + throw new UnsupportedApiLevelException("Not supported in API 29."); } }
diff --git a/apishim/30/com/android/networkstack/apishim/api30/ConnectivityManagerShimImpl.java b/apishim/30/com/android/networkstack/apishim/api30/ConnectivityManagerShimImpl.java index 7c1d786..97f1f60 100644 --- a/apishim/30/com/android/networkstack/apishim/api30/ConnectivityManagerShimImpl.java +++ b/apishim/30/com/android/networkstack/apishim/api30/ConnectivityManagerShimImpl.java
@@ -16,10 +16,10 @@ package com.android.networkstack.apishim.api30; -import static com.android.modules.utils.build.SdkLevel.isAtLeastR; - import android.content.Context; +import android.net.ConnectivityManager; import android.net.ConnectivityManager.NetworkCallback; +import android.net.NetworkCapabilities; import android.net.NetworkRequest; import android.os.Build; import android.os.Handler; @@ -28,24 +28,25 @@ import androidx.annotation.RequiresApi; import com.android.networkstack.apishim.common.ConnectivityManagerShim; +import com.android.networkstack.apishim.common.ShimUtils; import com.android.networkstack.apishim.common.UnsupportedApiLevelException; /** * Implementation of {@link ConnectivityManagerShim} for API 30. */ -@RequiresApi(Build.VERSION_CODES.R) public class ConnectivityManagerShimImpl extends com.android.networkstack.apishim.api29.ConnectivityManagerShimImpl { + protected final ConnectivityManager mCm; protected ConnectivityManagerShimImpl(Context context) { super(context); + mCm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); } /** * Get a new instance of {@link ConnectivityManagerShim}. */ - @RequiresApi(Build.VERSION_CODES.Q) public static ConnectivityManagerShim newInstance(Context context) { - if (!isAtLeastR()) { + if (!ShimUtils.isReleaseOrDevelopmentApiAbove(Build.VERSION_CODES.Q)) { return com.android.networkstack.apishim.api29.ConnectivityManagerShimImpl .newInstance(context); } @@ -64,9 +65,27 @@ throw new UnsupportedApiLevelException("Not supported in API 30."); } - @NonNull + /** + * See android.net.ConnectivityManager#registerSystemDefaultNetworkCallback + * @throws UnsupportedApiLevelException if API is not available in this API level. + */ @Override - protected NetworkRequest.Builder makeEmptyCapabilitiesRequest() { - return new NetworkRequest.Builder().clearCapabilities(); + @RequiresApi(Build.VERSION_CODES.R) + public void registerSystemDefaultNetworkCallback(@NonNull NetworkCallback networkCallback, + @NonNull Handler handler) { + // defaultNetworkRequest is not really a "request", just a way of tracking the system + // default network. It's guaranteed not to actually bring up any networks because it + // should be the same request as the ConnectivityService default request, and thus + // shares fate with it. In API <= R, registerSystemDefaultNetworkCallback is not + // available, and registerDefaultNetworkCallback will not track the system default when + // a VPN applies to the UID of this process. + final NetworkRequest defaultNetworkRequest = new NetworkRequest.Builder() + .clearCapabilities() + .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED) + .addCapability(NetworkCapabilities.NET_CAPABILITY_TRUSTED) + .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN) + .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) + .build(); + mCm.requestNetwork(defaultNetworkRequest, networkCallback, handler); } }
diff --git a/apishim/31/com/android/networkstack/apishim/api31/CaptivePortalDataShimImpl.java b/apishim/31/com/android/networkstack/apishim/CaptivePortalDataShimImpl.java similarity index 98% rename from apishim/31/com/android/networkstack/apishim/api31/CaptivePortalDataShimImpl.java rename to apishim/31/com/android/networkstack/apishim/CaptivePortalDataShimImpl.java index 5ae006b..5af7412 100644 --- a/apishim/31/com/android/networkstack/apishim/api31/CaptivePortalDataShimImpl.java +++ b/apishim/31/com/android/networkstack/apishim/CaptivePortalDataShimImpl.java
@@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.networkstack.apishim.api31; +package com.android.networkstack.apishim; import android.net.CaptivePortalData; import android.net.Uri;
diff --git a/apishim/31/com/android/networkstack/apishim/api31/ConnectivityManagerShimImpl.java b/apishim/31/com/android/networkstack/apishim/ConnectivityManagerShimImpl.java similarity index 98% rename from apishim/31/com/android/networkstack/apishim/api31/ConnectivityManagerShimImpl.java rename to apishim/31/com/android/networkstack/apishim/ConnectivityManagerShimImpl.java index 46de698..0e01c98 100644 --- a/apishim/31/com/android/networkstack/apishim/api31/ConnectivityManagerShimImpl.java +++ b/apishim/31/com/android/networkstack/apishim/ConnectivityManagerShimImpl.java
@@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.networkstack.apishim.api31; +package com.android.networkstack.apishim; import static com.android.modules.utils.build.SdkLevel.isAtLeastS;
diff --git a/apishim/31/com/android/networkstack/apishim/api31/ConstantsShim.java b/apishim/31/com/android/networkstack/apishim/ConstantsShim.java similarity index 96% rename from apishim/31/com/android/networkstack/apishim/api31/ConstantsShim.java rename to apishim/31/com/android/networkstack/apishim/ConstantsShim.java index 95ff072..0184845 100644 --- a/apishim/31/com/android/networkstack/apishim/api31/ConstantsShim.java +++ b/apishim/31/com/android/networkstack/apishim/ConstantsShim.java
@@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.networkstack.apishim.api31; +package com.android.networkstack.apishim; import androidx.annotation.VisibleForTesting;
diff --git a/apishim/31/com/android/networkstack/apishim/api31/NetworkInformationShimImpl.java b/apishim/31/com/android/networkstack/apishim/NetworkInformationShimImpl.java similarity index 94% rename from apishim/31/com/android/networkstack/apishim/api31/NetworkInformationShimImpl.java rename to apishim/31/com/android/networkstack/apishim/NetworkInformationShimImpl.java index a5c9a71..d2615e6 100644 --- a/apishim/31/com/android/networkstack/apishim/api31/NetworkInformationShimImpl.java +++ b/apishim/31/com/android/networkstack/apishim/NetworkInformationShimImpl.java
@@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.networkstack.apishim.api31; +package com.android.networkstack.apishim; import android.net.LinkProperties; import android.net.NetworkCapabilities; @@ -50,7 +50,7 @@ if (!useApiAboveR()) { return com.android.networkstack.apishim.api30.NetworkInformationShimImpl.newInstance(); } - return new NetworkInformationShimImpl(); + return new com.android.networkstack.apishim.NetworkInformationShimImpl(); } @Nullable
diff --git a/apishim/31/com/android/networkstack/apishim/api31/NetworkRequestShimImpl.java b/apishim/31/com/android/networkstack/apishim/NetworkRequestShimImpl.java similarity index 87% rename from apishim/31/com/android/networkstack/apishim/api31/NetworkRequestShimImpl.java rename to apishim/31/com/android/networkstack/apishim/NetworkRequestShimImpl.java index 2dc5d72..ccc8f70 100644 --- a/apishim/31/com/android/networkstack/apishim/api31/NetworkRequestShimImpl.java +++ b/apishim/31/com/android/networkstack/apishim/NetworkRequestShimImpl.java
@@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.networkstack.apishim.api31; +package com.android.networkstack.apishim; import static com.android.modules.utils.build.SdkLevel.isAtLeastS; @@ -58,13 +58,6 @@ } @Override - public NetworkRequest.Builder setIncludeOtherUidNetworks(NetworkRequest.Builder builder, - boolean include) { - builder.setIncludeOtherUidNetworks(include); - return builder; - } - - @Override public NetworkRequest.Builder newBuilder(@NonNull NetworkRequest request) { return new NetworkRequest.Builder(request); }
diff --git a/apishim/31/com/android/networkstack/apishim/api31/NetworkShimImpl.java b/apishim/31/com/android/networkstack/apishim/NetworkShimImpl.java similarity index 95% rename from apishim/31/com/android/networkstack/apishim/api31/NetworkShimImpl.java rename to apishim/31/com/android/networkstack/apishim/NetworkShimImpl.java index eda8e27..0c92391 100644 --- a/apishim/31/com/android/networkstack/apishim/api31/NetworkShimImpl.java +++ b/apishim/31/com/android/networkstack/apishim/NetworkShimImpl.java
@@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.networkstack.apishim.api31; +package com.android.networkstack.apishim; import android.net.Network;
diff --git a/apishim/31/com/android/networkstack/apishim/api31/SettingsShimImpl.java b/apishim/31/com/android/networkstack/apishim/SettingsShimImpl.java similarity index 87% rename from apishim/31/com/android/networkstack/apishim/api31/SettingsShimImpl.java rename to apishim/31/com/android/networkstack/apishim/SettingsShimImpl.java index 1b5cbae..e15872f 100644 --- a/apishim/31/com/android/networkstack/apishim/api31/SettingsShimImpl.java +++ b/apishim/31/com/android/networkstack/apishim/SettingsShimImpl.java
@@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.networkstack.apishim.api31; +package com.android.networkstack.apishim; import android.content.Context; import android.os.Build; @@ -48,7 +48,9 @@ public boolean checkAndNoteWriteSettingsOperation(@NonNull Context context, int uid, @NonNull String callingPackage, @Nullable String callingAttributionTag, boolean throwException) { + // Since checkAndNoteWriteSettingsOperation with callingAttributionTag (S method) is not + // available in AOSP, calling R method (same as API 30 shim) temporary. return Settings.checkAndNoteWriteSettingsOperation(context, uid, callingPackage, - callingAttributionTag, throwException); + throwException); } }
diff --git a/apishim/31/com/android/networkstack/apishim/api31/SocketUtilsShimImpl.java b/apishim/31/com/android/networkstack/apishim/SocketUtilsShimImpl.java similarity index 94% rename from apishim/31/com/android/networkstack/apishim/api31/SocketUtilsShimImpl.java rename to apishim/31/com/android/networkstack/apishim/SocketUtilsShimImpl.java index f5aa80b..483bde0 100644 --- a/apishim/31/com/android/networkstack/apishim/api31/SocketUtilsShimImpl.java +++ b/apishim/31/com/android/networkstack/apishim/SocketUtilsShimImpl.java
@@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.networkstack.apishim.api31; +package com.android.networkstack.apishim; /** * Implementation of {@link NetworkShim} for API 30.
diff --git a/apishim/32/com/android/networkstack/apishim/CaptivePortalDataShimImpl.java b/apishim/32/com/android/networkstack/apishim/CaptivePortalDataShimImpl.java deleted file mode 100644 index 2056b1b..0000000 --- a/apishim/32/com/android/networkstack/apishim/CaptivePortalDataShimImpl.java +++ /dev/null
@@ -1,37 +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.networkstack.apishim; - -import android.net.CaptivePortalData; -import android.os.Build; - -import androidx.annotation.NonNull; -import androidx.annotation.RequiresApi; - -import com.android.networkstack.apishim.common.CaptivePortalDataShim; - -/** - * Compatibility implementation of {@link CaptivePortalDataShim}. - */ -@RequiresApi(Build.VERSION_CODES.S) // Change to T when version code available, and adding T methods -public class CaptivePortalDataShimImpl - extends com.android.networkstack.apishim.api31.CaptivePortalDataShimImpl { - // Currently identical to the API 31 shim, so inherit everything - public CaptivePortalDataShimImpl(@NonNull CaptivePortalData data) { - super(data); - } -}
diff --git a/apishim/32/com/android/networkstack/apishim/ConnectivityManagerShimImpl.java b/apishim/32/com/android/networkstack/apishim/ConnectivityManagerShimImpl.java deleted file mode 100644 index a7aa0c8..0000000 --- a/apishim/32/com/android/networkstack/apishim/ConnectivityManagerShimImpl.java +++ /dev/null
@@ -1,36 +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.networkstack.apishim; - -import android.content.Context; -import android.os.Build; - -import androidx.annotation.RequiresApi; - -import com.android.networkstack.apishim.common.ConnectivityManagerShim; - -/** - * Compatibility implementation of {@link ConnectivityManagerShim}. - */ -@RequiresApi(Build.VERSION_CODES.S) // Change to T when version code available, and adding T methods -public class ConnectivityManagerShimImpl - extends com.android.networkstack.apishim.api31.ConnectivityManagerShimImpl { - // Currently identical to the API 31 shim, so inherit everything - protected ConnectivityManagerShimImpl(Context context) { - super(context); - } -}
diff --git a/apishim/32/com/android/networkstack/apishim/ConstantsShim.java b/apishim/32/com/android/networkstack/apishim/ConstantsShim.java deleted file mode 100644 index 0a5b555..0000000 --- a/apishim/32/com/android/networkstack/apishim/ConstantsShim.java +++ /dev/null
@@ -1,33 +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.networkstack.apishim; - -import androidx.annotation.VisibleForTesting; - -/** - * Utility class for defining and importing constants from the Android platform. - */ -public class ConstantsShim extends com.android.networkstack.apishim.api31.ConstantsShim { - /** - * Constant that callers can use to determine what version of the shim they are using. - * Must be the same as the version of the shims. - * This should only be used by test code. Production code that uses the shims should be using - * the shimmed objects and methods themselves. - */ - @VisibleForTesting - public static final int VERSION = 32; -}
diff --git a/apishim/32/com/android/networkstack/apishim/NetworkInformationShimImpl.java b/apishim/32/com/android/networkstack/apishim/NetworkInformationShimImpl.java deleted file mode 100644 index 28aa75c..0000000 --- a/apishim/32/com/android/networkstack/apishim/NetworkInformationShimImpl.java +++ /dev/null
@@ -1,33 +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.networkstack.apishim; - -import android.os.Build; - -import androidx.annotation.RequiresApi; - -import com.android.networkstack.apishim.common.NetworkInformationShim; - -/** - * Compatibility implementation of {@link NetworkInformationShim}. - */ -@RequiresApi(Build.VERSION_CODES.S) // Change to T when version code available, and adding T methods -public class NetworkInformationShimImpl - extends com.android.networkstack.apishim.api31.NetworkInformationShimImpl { - // Currently identical to the API 31 shim, so inherit everything - protected NetworkInformationShimImpl() {} -}
diff --git a/apishim/32/com/android/networkstack/apishim/NetworkRequestShimImpl.java b/apishim/32/com/android/networkstack/apishim/NetworkRequestShimImpl.java deleted file mode 100644 index 95ae5ba..0000000 --- a/apishim/32/com/android/networkstack/apishim/NetworkRequestShimImpl.java +++ /dev/null
@@ -1,35 +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.networkstack.apishim; - -import android.os.Build; - -import androidx.annotation.RequiresApi; - -import com.android.networkstack.apishim.common.NetworkRequestShim; - -/** - * Implementation of {@link NetworkRequestShim} for API 31. - */ -@RequiresApi(Build.VERSION_CODES.S) // Change to T when version code available, and adding T methods -public class NetworkRequestShimImpl - extends com.android.networkstack.apishim.api31.NetworkRequestShimImpl { - // Currently identical to the API 31 shim, so inherit everything - protected NetworkRequestShimImpl() { - super(); - } -}
diff --git a/apishim/32/com/android/networkstack/apishim/NetworkShimImpl.java b/apishim/32/com/android/networkstack/apishim/NetworkShimImpl.java deleted file mode 100644 index 2e31a78..0000000 --- a/apishim/32/com/android/networkstack/apishim/NetworkShimImpl.java +++ /dev/null
@@ -1,34 +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.networkstack.apishim; - -import android.net.Network; -import android.os.Build; - -import androidx.annotation.NonNull; -import androidx.annotation.RequiresApi; - -/** - * Compatibility implementation of {@link com.android.networkstack.apishim.common.NetworkShim}. - */ -@RequiresApi(Build.VERSION_CODES.S) // Change to T when version code available, and adding T methods -public class NetworkShimImpl extends com.android.networkstack.apishim.api30.NetworkShimImpl { - // Currently, this is the same as the API 31 shim, so inherit everything from that. - protected NetworkShimImpl(@NonNull Network network) { - super(network); - } -}
diff --git a/apishim/32/com/android/networkstack/apishim/SettingsShimImpl.java b/apishim/32/com/android/networkstack/apishim/SettingsShimImpl.java deleted file mode 100644 index 46d2102..0000000 --- a/apishim/32/com/android/networkstack/apishim/SettingsShimImpl.java +++ /dev/null
@@ -1,33 +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.networkstack.apishim; - -import android.os.Build; - -import androidx.annotation.RequiresApi; - -import com.android.networkstack.apishim.common.SettingsShim; - -/** - * Compatibility implementation of {@link SettingsShim} for API 31. - */ -@RequiresApi(Build.VERSION_CODES.S) // Change to T when version code available, and adding T methods -public class SettingsShimImpl - extends com.android.networkstack.apishim.api30.SettingsShimImpl { - // Currently identical to the API 31 shim, so inherit everything - protected SettingsShimImpl() { } -}
diff --git a/apishim/32/com/android/networkstack/apishim/SocketUtilsShimImpl.java b/apishim/32/com/android/networkstack/apishim/SocketUtilsShimImpl.java deleted file mode 100644 index 2f4e500..0000000 --- a/apishim/32/com/android/networkstack/apishim/SocketUtilsShimImpl.java +++ /dev/null
@@ -1,31 +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.networkstack.apishim; - -import android.os.Build; - -import androidx.annotation.RequiresApi; - -/** - * Implementation of {@link com.android.networkstack.apishim.common.SocketUtilsShim}. - */ -@RequiresApi(Build.VERSION_CODES.S) // Change to T when version code available, and adding T methods -public class SocketUtilsShimImpl - extends com.android.networkstack.apishim.api30.SocketUtilsShimImpl { - // Currently, this is the same as the API 31 shim, so inherit everything from that. - protected SocketUtilsShimImpl() {} -}
diff --git a/apishim/common/com/android/networkstack/apishim/common/ConnectivityManagerShim.java b/apishim/common/com/android/networkstack/apishim/common/ConnectivityManagerShim.java index 86d785e..67b3df7 100644 --- a/apishim/common/com/android/networkstack/apishim/common/ConnectivityManagerShim.java +++ b/apishim/common/com/android/networkstack/apishim/common/ConnectivityManagerShim.java
@@ -42,7 +42,8 @@ /** See android.net.ConnectivityManager#registerSystemDefaultNetworkCallback */ void registerSystemDefaultNetworkCallback( - @NonNull NetworkCallback networkCallback, @NonNull Handler handler); + @NonNull NetworkCallback networkCallback, @NonNull Handler handler) + throws UnsupportedApiLevelException; /** See android.net.ConnectivityManager#registerDefaultNetworkCallbackForUid */ default void registerDefaultNetworkCallbackForUid(
diff --git a/apishim/common/com/android/networkstack/apishim/common/NetworkRequestShim.java b/apishim/common/com/android/networkstack/apishim/common/NetworkRequestShim.java index d07d1ae..7d6d7bf 100644 --- a/apishim/common/com/android/networkstack/apishim/common/NetworkRequestShim.java +++ b/apishim/common/com/android/networkstack/apishim/common/NetworkRequestShim.java
@@ -37,14 +37,6 @@ @Nullable Set<Range<Integer>> uids) throws UnsupportedApiLevelException; /** - * See android.net.NetworkRequest.Builder#setIncludeOtherUidNetworks. - */ - default NetworkRequest.Builder setIncludeOtherUidNetworks(NetworkRequest.Builder builder, - boolean include) throws UnsupportedApiLevelException { - throw new UnsupportedApiLevelException("Not supported before API 31."); - } - - /** * See android.net.NetworkRequest.Builder(NetworkRequest). * @throws UnsupportedApiLevelException if API is not available in the API level. */
diff --git a/apishim/jarjar-rules-compat.txt b/apishim/jarjar-rules-compat.txt index 4f34ccb..dba2b49 100644 --- a/apishim/jarjar-rules-compat.txt +++ b/apishim/jarjar-rules-compat.txt
@@ -1,7 +1,7 @@ # jarjar rules to use on API stable builds. # Use the latest stable apishim package as the main apishim package, to replace and avoid building # the unstable, non-compatibility shims. -# Once API 32 is stable, apishim/32/com.android.networkstack.apishim should be moved to the -# com.android.networkstack.apishim.api32 package, a new apishim/33/com.android.networkstack.apishim -# package should be created, and this rule should reference api32. -rule com.android.networkstack.apishim.api31.** com.android.networkstack.apishim.@1 \ No newline at end of file +# Once API 31 is stable, apishim/31/com.android.networkstack.apishim should be moved to the +# com.android.networkstack.apishim.api31 package, a new apishim/32/com.android.networkstack.apishim +# package should be created, and this rule should reference api31. +rule com.android.networkstack.apishim.api30.** com.android.networkstack.apishim.@1 \ No newline at end of file
diff --git a/common/captiveportal/src/android/net/captiveportal/CaptivePortalProbeResult.java b/common/captiveportal/src/android/net/captiveportal/CaptivePortalProbeResult.java index 8b388ad..2ba1dcc 100755 --- a/common/captiveportal/src/android/net/captiveportal/CaptivePortalProbeResult.java +++ b/common/captiveportal/src/android/net/captiveportal/CaptivePortalProbeResult.java
@@ -103,22 +103,11 @@ } public boolean isSuccessful() { - return isSuccessCode(mHttpResponseCode); + return mHttpResponseCode == SUCCESS_CODE; } public boolean isPortal() { - return isPortalCode(mHttpResponseCode); - } - - private static boolean isSuccessCode(int responseCode) { - return responseCode == SUCCESS_CODE; - } - - /** - * @return Whether the specified HTTP return code indicates a captive portal. - */ - public static boolean isPortalCode(int responseCode) { - return !isSuccessCode(responseCode) && (responseCode >= 200) && (responseCode <= 399); + return !isSuccessful() && (mHttpResponseCode >= 200) && (mHttpResponseCode <= 399); } public boolean isFailed() {
diff --git a/common/moduleutils/Android.bp b/common/moduleutils/Android.bp index d90c33d..5d1c9e3 100644 --- a/common/moduleutils/Android.bp +++ b/common/moduleutils/Android.bp
@@ -21,14 +21,21 @@ default_applicable_licenses: ["Android-Apache-2.0"], } -// TODO: remove this filegroup together with services.net filegroup { name: "net-module-utils-srcs", srcs: [ + "src/android/net/util/SharedLog.java", + "src/android/net/shared/InitialConfiguration.java", + "src/android/net/shared/Layer2Information.java", + "src/android/net/shared/LinkPropertiesParcelableUtil.java", + "src/android/net/shared/ParcelableUtil.java", "src/android/net/shared/NetdUtils.java", + "src/android/net/shared/NetworkMonitorUtils.java", + "src/android/net/shared/ParcelableUtil.java", + "src/android/net/shared/PrivateDnsConfig.java", + "src/android/net/shared/ProvisioningConfiguration.java", "src/android/net/shared/RouteUtils.java", "src/android/net/util/InterfaceParams.java", - "src/android/net/util/SharedLog.java", ], visibility: [ "//frameworks/base/services/net", @@ -36,19 +43,6 @@ } filegroup { - name: "connectivity-module-utils-srcs", - srcs: [ - "src/android/net/util/SharedLog.java", - "src/android/net/shared/NetdUtils.java", - "src/android/net/shared/NetworkMonitorUtils.java", - "src/android/net/shared/RouteUtils.java", - ], - visibility: [ - "//packages/modules/Connectivity/service", - ] -} - -filegroup { name: "networkstack-module-utils-srcs", srcs: ["src/**/*.java"], visibility: [ @@ -64,6 +58,7 @@ "src/android/net/ip/InterfaceController.java", "src/android/net/ip/IpNeighborMonitor.java", "src/android/net/ip/NetlinkMonitor.java", + "src/android/net/netlink/*.java", "src/android/net/shared/NetdUtils.java", "src/android/net/shared/RouteUtils.java", "src/android/net/util/InterfaceParams.java",
diff --git a/common/moduleutils/src/android/net/ip/ConntrackMonitor.java b/common/moduleutils/src/android/net/ip/ConntrackMonitor.java index 43005cd..9189002 100644 --- a/common/moduleutils/src/android/net/ip/ConntrackMonitor.java +++ b/common/moduleutils/src/android/net/ip/ConntrackMonitor.java
@@ -16,9 +16,12 @@ package android.net.ip; -import static com.android.net.module.util.netlink.ConntrackMessage.DYING_MASK; -import static com.android.net.module.util.netlink.ConntrackMessage.ESTABLISHED_MASK; +import static android.net.netlink.ConntrackMessage.DYING_MASK; +import static android.net.netlink.ConntrackMessage.ESTABLISHED_MASK; +import android.net.netlink.ConntrackMessage; +import android.net.netlink.NetlinkConstants; +import android.net.netlink.NetlinkMessage; import android.net.util.SharedLog; import android.os.Handler; import android.system.OsConstants; @@ -26,9 +29,6 @@ import androidx.annotation.NonNull; import com.android.internal.annotations.VisibleForTesting; -import com.android.net.module.util.netlink.ConntrackMessage; -import com.android.net.module.util.netlink.NetlinkConstants; -import com.android.net.module.util.netlink.NetlinkMessage; import java.util.Objects; @@ -51,12 +51,6 @@ public static final int NF_NETLINK_CONNTRACK_UPDATE = 2; public static final int NF_NETLINK_CONNTRACK_DESTROY = 4; - // The socket receive buffer size in bytes. If too many conntrack messages are sent too - // quickly, the conntrack messages can overflow the socket receive buffer. This can happen - // if too many connections are disconnected by losing network and so on. Use a large-enough - // buffer to avoid the error ENOBUFS while listening to the conntrack messages. - private static final int SOCKET_RECV_BUFSIZE = 6 * 1024 * 1024; - /** * A class for describing parsed netfilter conntrack events. */ @@ -182,7 +176,7 @@ public ConntrackMonitor(@NonNull Handler h, @NonNull SharedLog log, @NonNull ConntrackEventConsumer cb) { super(h, log, TAG, OsConstants.NETLINK_NETFILTER, NF_NETLINK_CONNTRACK_NEW - | NF_NETLINK_CONNTRACK_UPDATE | NF_NETLINK_CONNTRACK_DESTROY, SOCKET_RECV_BUFSIZE); + | NF_NETLINK_CONNTRACK_UPDATE | NF_NETLINK_CONNTRACK_DESTROY); mConsumer = cb; }
diff --git a/common/moduleutils/src/android/net/ip/IpNeighborMonitor.java b/common/moduleutils/src/android/net/ip/IpNeighborMonitor.java index a16fdf2..b45c061 100644 --- a/common/moduleutils/src/android/net/ip/IpNeighborMonitor.java +++ b/common/moduleutils/src/android/net/ip/IpNeighborMonitor.java
@@ -16,24 +16,22 @@ package android.net.ip; +import static android.net.netlink.NetlinkConstants.RTM_DELNEIGH; +import static android.net.netlink.NetlinkConstants.hexify; +import static android.net.netlink.NetlinkConstants.stringForNlMsgType; import static android.system.OsConstants.NETLINK_ROUTE; -import static com.android.net.module.util.netlink.NetlinkConstants.RTM_DELNEIGH; -import static com.android.net.module.util.netlink.NetlinkConstants.hexify; -import static com.android.net.module.util.netlink.NetlinkConstants.stringForNlMsgType; - import android.net.MacAddress; +import android.net.netlink.NetlinkMessage; +import android.net.netlink.NetlinkSocket; +import android.net.netlink.RtNetlinkNeighborMessage; +import android.net.netlink.StructNdMsg; import android.net.util.SharedLog; import android.os.Handler; import android.system.ErrnoException; import android.system.OsConstants; import android.util.Log; -import com.android.net.module.util.netlink.NetlinkMessage; -import com.android.net.module.util.netlink.NetlinkSocket; -import com.android.net.module.util.netlink.RtNetlinkNeighborMessage; -import com.android.net.module.util.netlink.StructNdMsg; - import java.net.InetAddress; import java.util.StringJoiner;
diff --git a/common/moduleutils/src/android/net/ip/NetlinkMonitor.java b/common/moduleutils/src/android/net/ip/NetlinkMonitor.java index 17157d8..3d314f1 100644 --- a/common/moduleutils/src/android/net/ip/NetlinkMonitor.java +++ b/common/moduleutils/src/android/net/ip/NetlinkMonitor.java
@@ -16,16 +16,16 @@ package android.net.ip; +import static android.net.netlink.NetlinkConstants.hexify; import static android.net.util.SocketUtils.makeNetlinkSocketAddress; import static android.system.OsConstants.AF_NETLINK; import static android.system.OsConstants.SOCK_DGRAM; import static android.system.OsConstants.SOCK_NONBLOCK; -import static android.system.OsConstants.SOL_SOCKET; -import static android.system.OsConstants.SO_RCVBUF; - -import static com.android.net.module.util.netlink.NetlinkConstants.hexify; import android.annotation.NonNull; +import android.net.netlink.NetlinkErrorMessage; +import android.net.netlink.NetlinkMessage; +import android.net.netlink.NetlinkSocket; import android.net.util.SharedLog; import android.net.util.SocketUtils; import android.os.Handler; @@ -35,9 +35,6 @@ import android.util.Log; import com.android.net.module.util.PacketReader; -import com.android.net.module.util.netlink.NetlinkErrorMessage; -import com.android.net.module.util.netlink.NetlinkMessage; -import com.android.net.module.util.netlink.NetlinkSocket; import java.io.FileDescriptor; import java.io.IOException; @@ -59,13 +56,9 @@ protected final String mTag; private final int mFamily; private final int mBindGroups; - private final int mSockRcvbufSize; private static final boolean DBG = false; - // Default socket receive buffer size. This means the specific buffer size is not set. - private static final int DEFAULT_SOCKET_RECV_BUFSIZE = -1; - /** * Constructs a new {@code NetlinkMonitor} instance. * @@ -75,23 +68,14 @@ * @param tag The log tag to use for log messages. * @param family the Netlink socket family to, e.g., {@code NETLINK_ROUTE}. * @param bindGroups the netlink groups to bind to. - * @param sockRcvbufSize the specific socket receive buffer size in bytes. -1 means that don't - * set the specific socket receive buffer size in #createFd and use the default value in - * /proc/sys/net/core/rmem_default file. See SO_RCVBUF in man-pages/socket. */ public NetlinkMonitor(@NonNull Handler h, @NonNull SharedLog log, @NonNull String tag, - int family, int bindGroups, int sockRcvbufSize) { + int family, int bindGroups) { super(h, NetlinkSocket.DEFAULT_RECV_BUFSIZE); mLog = log.forSubComponent(tag); mTag = tag; mFamily = family; mBindGroups = bindGroups; - mSockRcvbufSize = sockRcvbufSize; - } - - public NetlinkMonitor(@NonNull Handler h, @NonNull SharedLog log, @NonNull String tag, - int family, int bindGroups) { - this(h, log, tag, family, bindGroups, DEFAULT_SOCKET_RECV_BUFSIZE); } @Override @@ -100,9 +84,6 @@ try { fd = Os.socket(AF_NETLINK, SOCK_DGRAM | SOCK_NONBLOCK, mFamily); - if (mSockRcvbufSize != DEFAULT_SOCKET_RECV_BUFSIZE) { - Os.setsockoptInt(fd, SOL_SOCKET, SO_RCVBUF, mSockRcvbufSize); - } Os.bind(fd, makeNetlinkSocketAddress(0, mBindGroups)); NetlinkSocket.connectToKernel(fd);
diff --git a/common/networkstackclient/src/android/net/shared/InitialConfiguration.java b/common/moduleutils/src/android/net/shared/InitialConfiguration.java similarity index 100% rename from common/networkstackclient/src/android/net/shared/InitialConfiguration.java rename to common/moduleutils/src/android/net/shared/InitialConfiguration.java
diff --git a/common/networkstackclient/src/android/net/shared/Layer2Information.java b/common/moduleutils/src/android/net/shared/Layer2Information.java similarity index 100% rename from common/networkstackclient/src/android/net/shared/Layer2Information.java rename to common/moduleutils/src/android/net/shared/Layer2Information.java
diff --git a/common/moduleutils/src/android/net/shared/NetworkMonitorUtils.java b/common/moduleutils/src/android/net/shared/NetworkMonitorUtils.java index b151cb9..981a576 100644 --- a/common/moduleutils/src/android/net/shared/NetworkMonitorUtils.java +++ b/common/moduleutils/src/android/net/shared/NetworkMonitorUtils.java
@@ -19,7 +19,6 @@ import static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET; import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED; import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_VPN; -import static android.net.NetworkCapabilities.NET_CAPABILITY_OEM_PAID; import static android.net.NetworkCapabilities.NET_CAPABILITY_TRUSTED; import static android.net.NetworkCapabilities.TRANSPORT_BLUETOOTH; import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR; @@ -28,8 +27,6 @@ import android.net.NetworkCapabilities; -import com.android.modules.utils.build.SdkLevel; - /** @hide */ public class NetworkMonitorUtils { // This class is used by both NetworkMonitor and ConnectivityService, so it cannot use @@ -39,14 +36,6 @@ // TODO: use NetworkCapabilities.TRANSPORT_TEST once NetworkStack builds against API 31. private static final int TRANSPORT_TEST = 7; - // This class is used by both NetworkMonitor and ConnectivityService, so it cannot use - // NetworkStack shims, but at the same time cannot use non-system APIs. - // NET_CAPABILITY_NOT_VCN_MANAGED is system API as of S (so it is enforced to always be 28 and - // can't be changed). - // TODO: use NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED once NetworkStack builds against - // API 31. - public static final int NET_CAPABILITY_NOT_VCN_MANAGED = 28; - // Network conditions broadcast constants public static final String ACTION_NETWORK_CONDITIONS_MEASURED = "android.net.conn.NETWORK_CONDITIONS_MEASURED"; @@ -70,19 +59,18 @@ public static boolean isPrivateDnsValidationRequired(NetworkCapabilities nc) { if (nc == null) return false; - final boolean isVcnManaged = SdkLevel.isAtLeastS() - && !nc.hasCapability(NET_CAPABILITY_NOT_VCN_MANAGED); - final boolean isOemPaid = nc.hasCapability(NET_CAPABILITY_OEM_PAID) - && nc.hasCapability(NET_CAPABILITY_TRUSTED); - final boolean isDefaultCapable = nc.hasCapability(NET_CAPABILITY_NOT_RESTRICTED) - && nc.hasCapability(NET_CAPABILITY_TRUSTED); - // TODO: Consider requiring validation for DUN networks. if (nc.hasCapability(NET_CAPABILITY_INTERNET) - && (isVcnManaged || isOemPaid || isDefaultCapable)) { + && nc.hasCapability(NET_CAPABILITY_NOT_RESTRICTED) + && nc.hasCapability(NET_CAPABILITY_TRUSTED)) { + // Real networks return true; } + // TODO: once TRANSPORT_TEST is @SystemApi in S and S SDK is stable (so constant shims can + // be replaced with the SDK constant that will be inlined), replace isTestNetwork with + // hasTransport(TRANSPORT_TEST) + // Test networks that also have one of the major transport types are attempting to replicate // that transport on a test interface (for example, test ethernet networks with // EthernetManager#setIncludeTestInterfaces). Run validation on them for realistic tests.
diff --git a/common/networkstackclient/src/android/net/shared/ParcelableUtil.java b/common/moduleutils/src/android/net/shared/ParcelableUtil.java similarity index 100% rename from common/networkstackclient/src/android/net/shared/ParcelableUtil.java rename to common/moduleutils/src/android/net/shared/ParcelableUtil.java
diff --git a/common/networkstackclient/src/android/net/shared/PrivateDnsConfig.java b/common/moduleutils/src/android/net/shared/PrivateDnsConfig.java similarity index 100% rename from common/networkstackclient/src/android/net/shared/PrivateDnsConfig.java rename to common/moduleutils/src/android/net/shared/PrivateDnsConfig.java
diff --git a/common/networkstackclient/src/android/net/shared/ProvisioningConfiguration.java b/common/moduleutils/src/android/net/shared/ProvisioningConfiguration.java similarity index 81% rename from common/networkstackclient/src/android/net/shared/ProvisioningConfiguration.java rename to common/moduleutils/src/android/net/shared/ProvisioningConfiguration.java index 3bf6744..d3bc04d 100644 --- a/common/networkstackclient/src/android/net/shared/ProvisioningConfiguration.java +++ b/common/moduleutils/src/android/net/shared/ProvisioningConfiguration.java
@@ -16,17 +16,12 @@ package android.net.shared; -import static android.net.ip.IIpClient.PROV_IPV4_DHCP; -import static android.net.ip.IIpClient.PROV_IPV4_DISABLED; -import static android.net.ip.IIpClient.PROV_IPV4_STATIC; -import static android.net.ip.IIpClient.PROV_IPV6_DISABLED; -import static android.net.ip.IIpClient.PROV_IPV6_LINKLOCAL; -import static android.net.ip.IIpClient.PROV_IPV6_SLAAC; import static android.net.shared.ParcelableUtil.fromParcelableArray; import static android.net.shared.ParcelableUtil.toParcelableArray; import android.annotation.NonNull; import android.annotation.Nullable; +import android.net.INetd; import android.net.InformationElementParcelable; import android.net.Network; import android.net.ProvisioningConfigurationParcelable; @@ -37,8 +32,6 @@ import android.net.networkstack.aidl.dhcp.DhcpOption; import android.util.Log; -import com.android.internal.annotations.VisibleForTesting; - import java.nio.BufferUnderflowException; import java.nio.ByteBuffer; import java.util.ArrayList; @@ -83,17 +76,6 @@ // allowing for 10% jitter. private static final int DEFAULT_TIMEOUT_MS = 18 * 1000; - // TODO: These cannot be imported from INetd.aidl, because networkstack-client cannot depend on - // INetd, as there are users of IpClient that depend on INetd directly (potentially at a - // different version, which is not allowed by the build system). - // Find a better way to express these constants. - public static final int IPV6_ADDR_GEN_MODE_EUI64 = 0; - public static final int IPV6_ADDR_GEN_MODE_STABLE_PRIVACY = 2; - - // ipv4ProvisioningMode and ipv6ProvisioningMode members are introduced since - // networkstack-aidl-interfaces-v12. - public static final int VERSION_ADDED_PROVISIONING_ENUM = 12; - /** * Builder to create a {@link ProvisioningConfiguration}. */ @@ -104,7 +86,7 @@ * Specify that the configuration should not enable IPv4. It is enabled by default. */ public Builder withoutIPv4() { - mConfig.mIPv4ProvisioningMode = PROV_IPV4_DISABLED; + mConfig.mEnableIPv4 = false; return this; } @@ -112,7 +94,7 @@ * Specify that the configuration should not enable IPv6. It is enabled by default. */ public Builder withoutIPv6() { - mConfig.mIPv6ProvisioningMode = PROV_IPV6_DISABLED; + mConfig.mEnableIPv6 = false; return this; } @@ -174,7 +156,6 @@ * Specify a static configuration for provisioning. */ public Builder withStaticConfiguration(StaticIpConfiguration staticConfig) { - mConfig.mIPv4ProvisioningMode = PROV_IPV4_STATIC; mConfig.mStaticIpConfig = staticConfig; return this; } @@ -199,7 +180,7 @@ * Specify that IPv6 address generation should use a random MAC address. */ public Builder withRandomMacAddress() { - mConfig.mIPv6AddrGenMode = IPV6_ADDR_GEN_MODE_EUI64; + mConfig.mIPv6AddrGenMode = INetd.IPV6_ADDR_GEN_MODE_EUI64; return this; } @@ -207,7 +188,7 @@ * Specify that IPv6 address generation should use a stable MAC address. */ public Builder withStableMacAddress() { - mConfig.mIPv6AddrGenMode = IPV6_ADDR_GEN_MODE_STABLE_PRIVACY; + mConfig.mIPv6AddrGenMode = INetd.IPV6_ADDR_GEN_MODE_STABLE_PRIVACY; return this; } @@ -252,32 +233,15 @@ * * @param: options customized DHCP option stable parcelable list. */ - public Builder withDhcpOptions(@Nullable List<DhcpOption> options) { + public Builder withDhcpOptions(List<DhcpOption> options) { mConfig.mDhcpOptions = options; return this; } /** - * Specify that the configuration should enable IPv6 link-local only mode used for - * WiFi Neighbor Aware Networking and other link-local-only technologies. It's not - * used by default, and IPv4 must be disabled when this mode is enabled. - * - * @note This API is only supported since Android T. - */ - public Builder withIpv6LinkLocalOnly() { - mConfig.mIPv6ProvisioningMode = PROV_IPV6_LINKLOCAL; - return this; - } - - /** * Build the configuration using previously specified parameters. */ public ProvisioningConfiguration build() { - if (mConfig.mIPv6ProvisioningMode == PROV_IPV6_LINKLOCAL - && mConfig.mIPv4ProvisioningMode != PROV_IPV4_DISABLED) { - throw new IllegalArgumentException("IPv4 must be disabled in IPv6 link-local" - + "only mode."); - } return new ProvisioningConfiguration(mConfig); } } @@ -463,6 +427,8 @@ } } + public boolean mEnableIPv4 = true; + public boolean mEnableIPv6 = true; public boolean mEnablePreconnection = false; public boolean mUsingMultinetworkPolicyTracker = true; public boolean mUsingIpReachabilityMonitor = true; @@ -471,18 +437,18 @@ public StaticIpConfiguration mStaticIpConfig; public ApfCapabilities mApfCapabilities; public int mProvisioningTimeoutMs = DEFAULT_TIMEOUT_MS; - public int mIPv6AddrGenMode = IPV6_ADDR_GEN_MODE_STABLE_PRIVACY; + public int mIPv6AddrGenMode = INetd.IPV6_ADDR_GEN_MODE_STABLE_PRIVACY; public Network mNetwork = null; public String mDisplayName = null; public ScanResultInfo mScanResultInfo; public Layer2Information mLayer2Info; public List<DhcpOption> mDhcpOptions; - public int mIPv4ProvisioningMode = PROV_IPV4_DHCP; - public int mIPv6ProvisioningMode = PROV_IPV6_SLAAC; public ProvisioningConfiguration() {} // used by Builder public ProvisioningConfiguration(ProvisioningConfiguration other) { + mEnableIPv4 = other.mEnableIPv4; + mEnableIPv6 = other.mEnableIPv6; mEnablePreconnection = other.mEnablePreconnection; mUsingMultinetworkPolicyTracker = other.mUsingMultinetworkPolicyTracker; mUsingIpReachabilityMonitor = other.mUsingIpReachabilityMonitor; @@ -499,8 +465,6 @@ mScanResultInfo = other.mScanResultInfo; mLayer2Info = other.mLayer2Info; mDhcpOptions = other.mDhcpOptions; - mIPv4ProvisioningMode = other.mIPv4ProvisioningMode; - mIPv6ProvisioningMode = other.mIPv6ProvisioningMode; } /** @@ -508,10 +472,8 @@ */ public ProvisioningConfigurationParcelable toStableParcelable() { final ProvisioningConfigurationParcelable p = new ProvisioningConfigurationParcelable(); - p.enableIPv4 = (mIPv4ProvisioningMode != PROV_IPV4_DISABLED); - p.ipv4ProvisioningMode = mIPv4ProvisioningMode; - p.enableIPv6 = (mIPv6ProvisioningMode != PROV_IPV6_DISABLED); - p.ipv6ProvisioningMode = mIPv6ProvisioningMode; + p.enableIPv4 = mEnableIPv4; + p.enableIPv6 = mEnableIPv6; p.enablePreconnection = mEnablePreconnection; p.usingMultinetworkPolicyTracker = mUsingMultinetworkPolicyTracker; p.usingIpReachabilityMonitor = mUsingIpReachabilityMonitor; @@ -533,16 +495,13 @@ /** * Create a ProvisioningConfiguration from a ProvisioningConfigurationParcelable. - * - * @param p stable parcelable instance to be converted to a {@link ProvisioningConfiguration}. - * @param interfaceVersion IIpClientCallbacks interface version called by the remote peer, - * which is used to determine the appropriate parcelable members for - * backwards compatibility. */ public static ProvisioningConfiguration fromStableParcelable( - @Nullable ProvisioningConfigurationParcelable p, int interfaceVersion) { + @Nullable ProvisioningConfigurationParcelable p) { if (p == null) return null; final ProvisioningConfiguration config = new ProvisioningConfiguration(); + config.mEnableIPv4 = p.enableIPv4; + config.mEnableIPv6 = p.enableIPv6; config.mEnablePreconnection = p.enablePreconnection; config.mUsingMultinetworkPolicyTracker = p.usingMultinetworkPolicyTracker; config.mUsingIpReachabilityMonitor = p.usingIpReachabilityMonitor; @@ -559,49 +518,14 @@ config.mScanResultInfo = ScanResultInfo.fromStableParcelable(p.scanResultInfo); config.mLayer2Info = Layer2Information.fromStableParcelable(p.layer2Info); config.mDhcpOptions = (p.options == null) ? null : new ArrayList<>(p.options); - if (interfaceVersion < VERSION_ADDED_PROVISIONING_ENUM) { - config.mIPv4ProvisioningMode = p.enableIPv4 ? PROV_IPV4_DHCP : PROV_IPV4_DISABLED; - config.mIPv6ProvisioningMode = p.enableIPv6 ? PROV_IPV6_SLAAC : PROV_IPV6_DISABLED; - } else { - config.mIPv4ProvisioningMode = p.ipv4ProvisioningMode; - config.mIPv6ProvisioningMode = p.ipv6ProvisioningMode; - } return config; } - @VisibleForTesting - static String ipv4ProvisioningModeToString(int mode) { - switch (mode) { - case PROV_IPV4_DISABLED: - return "disabled"; - case PROV_IPV4_STATIC: - return "static"; - case PROV_IPV4_DHCP: - return "dhcp"; - default: - return "unknown"; - } - } - - @VisibleForTesting - static String ipv6ProvisioningModeToString(int mode) { - switch (mode) { - case PROV_IPV6_DISABLED: - return "disabled"; - case PROV_IPV6_SLAAC: - return "slaac"; - case PROV_IPV6_LINKLOCAL: - return "link-local"; - default: - return "unknown"; - } - } - @Override public String toString() { - final String ipv4ProvisioningMode = ipv4ProvisioningModeToString(mIPv4ProvisioningMode); - final String ipv6ProvisioningMode = ipv6ProvisioningModeToString(mIPv6ProvisioningMode); return new StringJoiner(", ", getClass().getSimpleName() + "{", "}") + .add("mEnableIPv4: " + mEnableIPv4) + .add("mEnableIPv6: " + mEnableIPv6) .add("mEnablePreconnection: " + mEnablePreconnection) .add("mUsingMultinetworkPolicyTracker: " + mUsingMultinetworkPolicyTracker) .add("mUsingIpReachabilityMonitor: " + mUsingIpReachabilityMonitor) @@ -616,8 +540,6 @@ .add("mScanResultInfo: " + mScanResultInfo) .add("mLayer2Info: " + mLayer2Info) .add("mDhcpOptions: " + mDhcpOptions) - .add("mIPv4ProvisioningMode: " + ipv4ProvisioningMode) - .add("mIPv6ProvisioningMode: " + ipv6ProvisioningMode) .toString(); } @@ -647,7 +569,9 @@ public boolean equals(Object obj) { if (!(obj instanceof ProvisioningConfiguration)) return false; final ProvisioningConfiguration other = (ProvisioningConfiguration) obj; - return mEnablePreconnection == other.mEnablePreconnection + return mEnableIPv4 == other.mEnableIPv4 + && mEnableIPv6 == other.mEnableIPv6 + && mEnablePreconnection == other.mEnablePreconnection && mUsingMultinetworkPolicyTracker == other.mUsingMultinetworkPolicyTracker && mUsingIpReachabilityMonitor == other.mUsingIpReachabilityMonitor && mRequestedPreDhcpActionMs == other.mRequestedPreDhcpActionMs @@ -660,9 +584,7 @@ && Objects.equals(mDisplayName, other.mDisplayName) && Objects.equals(mScanResultInfo, other.mScanResultInfo) && Objects.equals(mLayer2Info, other.mLayer2Info) - && dhcpOptionListEquals(mDhcpOptions, other.mDhcpOptions) - && mIPv4ProvisioningMode == other.mIPv4ProvisioningMode - && mIPv6ProvisioningMode == other.mIPv6ProvisioningMode; + && dhcpOptionListEquals(mDhcpOptions, other.mDhcpOptions); } public boolean isValid() {
diff --git a/common/netlinkclient/Android.bp b/common/netlinkclient/Android.bp new file mode 100644 index 0000000..9a60e57 --- /dev/null +++ b/common/netlinkclient/Android.bp
@@ -0,0 +1,33 @@ +// +// 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"], +} + +java_library { + name: "netlink-client", + srcs: [ + "src/**/*.java", + ":framework-annotations", + ], + libs: [ + "androidx.annotation_annotation", + ], + sdk_version: "system_current", + // this is part of updatable modules(NetworkStack) which targets 29(Q) + min_sdk_version: "29", +}
diff --git a/common/netlinkclient/src/android/net/netlink/ConntrackMessage.java b/common/netlinkclient/src/android/net/netlink/ConntrackMessage.java new file mode 100644 index 0000000..cc8bb7e --- /dev/null +++ b/common/netlinkclient/src/android/net/netlink/ConntrackMessage.java
@@ -0,0 +1,552 @@ +/* + * Copyright (C) 2017 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.netlink; + +import static android.net.netlink.StructNlAttr.findNextAttrOfType; +import static android.net.netlink.StructNlAttr.makeNestedType; +import static android.net.netlink.StructNlMsgHdr.NLM_F_ACK; +import static android.net.netlink.StructNlMsgHdr.NLM_F_REPLACE; +import static android.net.netlink.StructNlMsgHdr.NLM_F_REQUEST; +import static android.system.OsConstants.IPPROTO_TCP; +import static android.system.OsConstants.IPPROTO_UDP; + +import static java.nio.ByteOrder.BIG_ENDIAN; + +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.system.OsConstants; + +import com.android.internal.annotations.VisibleForTesting; + +import java.net.Inet4Address; +import java.net.InetAddress; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.Objects; + + +/** + * A NetlinkMessage subclass for netlink conntrack messages. + * + * see also: <linux_src>/include/uapi/linux/netfilter/nfnetlink_conntrack.h + * + * @hide + */ +public class ConntrackMessage extends NetlinkMessage { + public static final int STRUCT_SIZE = StructNlMsgHdr.STRUCT_SIZE + StructNfGenMsg.STRUCT_SIZE; + + // enum ctattr_type + public static final short CTA_TUPLE_ORIG = 1; + public static final short CTA_TUPLE_REPLY = 2; + public static final short CTA_STATUS = 3; + public static final short CTA_TIMEOUT = 7; + + // enum ctattr_tuple + public static final short CTA_TUPLE_IP = 1; + public static final short CTA_TUPLE_PROTO = 2; + + // enum ctattr_ip + public static final short CTA_IP_V4_SRC = 1; + public static final short CTA_IP_V4_DST = 2; + + // enum ctattr_l4proto + public static final short CTA_PROTO_NUM = 1; + public static final short CTA_PROTO_SRC_PORT = 2; + public static final short CTA_PROTO_DST_PORT = 3; + + // enum ip_conntrack_status + public static final int IPS_EXPECTED = 0x00000001; + public static final int IPS_SEEN_REPLY = 0x00000002; + public static final int IPS_ASSURED = 0x00000004; + public static final int IPS_CONFIRMED = 0x00000008; + public static final int IPS_SRC_NAT = 0x00000010; + public static final int IPS_DST_NAT = 0x00000020; + public static final int IPS_SEQ_ADJUST = 0x00000040; + public static final int IPS_SRC_NAT_DONE = 0x00000080; + public static final int IPS_DST_NAT_DONE = 0x00000100; + public static final int IPS_DYING = 0x00000200; + public static final int IPS_FIXED_TIMEOUT = 0x00000400; + public static final int IPS_TEMPLATE = 0x00000800; + public static final int IPS_UNTRACKED = 0x00001000; + public static final int IPS_HELPER = 0x00002000; + public static final int IPS_OFFLOAD = 0x00004000; + public static final int IPS_HW_OFFLOAD = 0x00008000; + + // ip_conntrack_status mask + // Interesting on the NAT conntrack session which has already seen two direction traffic. + // TODO: Probably IPS_{SRC, DST}_NAT_DONE are also interesting. + public static final int ESTABLISHED_MASK = IPS_CONFIRMED | IPS_ASSURED | IPS_SEEN_REPLY + | IPS_SRC_NAT; + // Interesting on the established NAT conntrack session which is dying. + public static final int DYING_MASK = ESTABLISHED_MASK | IPS_DYING; + + /** + * A tuple for the conntrack connection information. + * + * see also CTA_TUPLE_ORIG and CTA_TUPLE_REPLY. + */ + public static class Tuple { + public final Inet4Address srcIp; + public final Inet4Address dstIp; + + // Both port and protocol number are unsigned numbers stored in signed integers, and that + // callers that want to compare them to integers should either cast those integers, or + // convert them to unsigned using Byte.toUnsignedInt() and Short.toUnsignedInt(). + public final short srcPort; + public final short dstPort; + public final byte protoNum; + + public Tuple(TupleIpv4 ip, TupleProto proto) { + this.srcIp = ip.src; + this.dstIp = ip.dst; + this.srcPort = proto.srcPort; + this.dstPort = proto.dstPort; + this.protoNum = proto.protoNum; + } + + @Override + @VisibleForTesting + public boolean equals(Object o) { + if (!(o instanceof Tuple)) return false; + Tuple that = (Tuple) o; + return Objects.equals(this.srcIp, that.srcIp) + && Objects.equals(this.dstIp, that.dstIp) + && this.srcPort == that.srcPort + && this.dstPort == that.dstPort + && this.protoNum == that.protoNum; + } + + @Override + public int hashCode() { + return Objects.hash(srcIp, dstIp, srcPort, dstPort, protoNum); + } + + @Override + public String toString() { + final String srcIpStr = (srcIp == null) ? "null" : srcIp.getHostAddress(); + final String dstIpStr = (dstIp == null) ? "null" : dstIp.getHostAddress(); + final String protoStr = NetlinkConstants.stringForProtocol(protoNum); + + return "Tuple{" + + protoStr + ": " + + srcIpStr + ":" + Short.toUnsignedInt(srcPort) + " -> " + + dstIpStr + ":" + Short.toUnsignedInt(dstPort) + + "}"; + } + } + + /** + * A tuple for the conntrack connection address. + * + * see also CTA_TUPLE_IP. + */ + public static class TupleIpv4 { + public final Inet4Address src; + public final Inet4Address dst; + + public TupleIpv4(Inet4Address src, Inet4Address dst) { + this.src = src; + this.dst = dst; + } + } + + /** + * A tuple for the conntrack connection protocol. + * + * see also CTA_TUPLE_PROTO. + */ + public static class TupleProto { + public final byte protoNum; + public final short srcPort; + public final short dstPort; + + public TupleProto(byte protoNum, short srcPort, short dstPort) { + this.protoNum = protoNum; + this.srcPort = srcPort; + this.dstPort = dstPort; + } + } + + public static byte[] newIPv4TimeoutUpdateRequest( + int proto, Inet4Address src, int sport, Inet4Address dst, int dport, int timeoutSec) { + // *** STYLE WARNING *** + // + // Code below this point uses extra block indentation to highlight the + // packing of nested tuple netlink attribute types. + final StructNlAttr ctaTupleOrig = new StructNlAttr(CTA_TUPLE_ORIG, + new StructNlAttr(CTA_TUPLE_IP, + new StructNlAttr(CTA_IP_V4_SRC, src), + new StructNlAttr(CTA_IP_V4_DST, dst)), + new StructNlAttr(CTA_TUPLE_PROTO, + new StructNlAttr(CTA_PROTO_NUM, (byte) proto), + new StructNlAttr(CTA_PROTO_SRC_PORT, (short) sport, BIG_ENDIAN), + new StructNlAttr(CTA_PROTO_DST_PORT, (short) dport, BIG_ENDIAN))); + + final StructNlAttr ctaTimeout = new StructNlAttr(CTA_TIMEOUT, timeoutSec, BIG_ENDIAN); + + final int payloadLength = ctaTupleOrig.getAlignedLength() + ctaTimeout.getAlignedLength(); + final byte[] bytes = new byte[STRUCT_SIZE + payloadLength]; + final ByteBuffer byteBuffer = ByteBuffer.wrap(bytes); + byteBuffer.order(ByteOrder.nativeOrder()); + + final ConntrackMessage ctmsg = new ConntrackMessage(); + ctmsg.mHeader.nlmsg_len = bytes.length; + ctmsg.mHeader.nlmsg_type = (NetlinkConstants.NFNL_SUBSYS_CTNETLINK << 8) + | NetlinkConstants.IPCTNL_MSG_CT_NEW; + ctmsg.mHeader.nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK | NLM_F_REPLACE; + ctmsg.mHeader.nlmsg_seq = 1; + ctmsg.pack(byteBuffer); + + ctaTupleOrig.pack(byteBuffer); + ctaTimeout.pack(byteBuffer); + + return bytes; + } + + /** + * Parses a netfilter conntrack message from a {@link ByteBuffer}. + * + * @param header the netlink message header. + * @param byteBuffer The buffer from which to parse the netfilter conntrack message. + * @return the parsed netfilter conntrack message, or {@code null} if the netfilter conntrack + * message could not be parsed successfully (for example, if it was truncated). + */ + public static ConntrackMessage parse(StructNlMsgHdr header, ByteBuffer byteBuffer) { + // Just build the netlink header and netfilter header for now and pretend the whole message + // was consumed. + // TODO: Parse the conntrack attributes. + final StructNfGenMsg nfGenMsg = StructNfGenMsg.parse(byteBuffer); + if (nfGenMsg == null) { + return null; + } + + final int baseOffset = byteBuffer.position(); + StructNlAttr nlAttr = findNextAttrOfType(CTA_STATUS, byteBuffer); + int status = 0; + if (nlAttr != null) { + status = nlAttr.getValueAsBe32(0); + } + + byteBuffer.position(baseOffset); + nlAttr = findNextAttrOfType(CTA_TIMEOUT, byteBuffer); + int timeoutSec = 0; + if (nlAttr != null) { + timeoutSec = nlAttr.getValueAsBe32(0); + } + + byteBuffer.position(baseOffset); + nlAttr = findNextAttrOfType(makeNestedType(CTA_TUPLE_ORIG), byteBuffer); + Tuple tupleOrig = null; + if (nlAttr != null) { + tupleOrig = parseTuple(nlAttr.getValueAsByteBuffer()); + } + + byteBuffer.position(baseOffset); + nlAttr = findNextAttrOfType(makeNestedType(CTA_TUPLE_REPLY), byteBuffer); + Tuple tupleReply = null; + if (nlAttr != null) { + tupleReply = parseTuple(nlAttr.getValueAsByteBuffer()); + } + + // Advance to the end of the message. + byteBuffer.position(baseOffset); + final int kMinConsumed = StructNlMsgHdr.STRUCT_SIZE + StructNfGenMsg.STRUCT_SIZE; + final int kAdditionalSpace = NetlinkConstants.alignedLengthOf( + header.nlmsg_len - kMinConsumed); + if (byteBuffer.remaining() < kAdditionalSpace) { + return null; + } + byteBuffer.position(baseOffset + kAdditionalSpace); + + return new ConntrackMessage(header, nfGenMsg, tupleOrig, tupleReply, status, timeoutSec); + } + + /** + * Parses a conntrack tuple from a {@link ByteBuffer}. + * + * The attribute parsing is interesting on: + * - CTA_TUPLE_IP + * CTA_IP_V4_SRC + * CTA_IP_V4_DST + * - CTA_TUPLE_PROTO + * CTA_PROTO_NUM + * CTA_PROTO_SRC_PORT + * CTA_PROTO_DST_PORT + * + * Assume that the minimum size is the sum of CTA_TUPLE_IP (size: 20) and CTA_TUPLE_PROTO + * (size: 28). Here is an example for an expected CTA_TUPLE_ORIG message in raw data: + * +--------------------------------------------------------------------------------------+ + * | CTA_TUPLE_ORIG | + * +--------------------------+-----------------------------------------------------------+ + * | 1400 | nla_len = 20 | + * | 0180 | nla_type = nested CTA_TUPLE_IP | + * | 0800 0100 C0A8500C | nla_type=CTA_IP_V4_SRC, ip=192.168.80.12 | + * | 0800 0200 8C700874 | nla_type=CTA_IP_V4_DST, ip=140.112.8.116 | + * | 1C00 | nla_len = 28 | + * | 0280 | nla_type = nested CTA_TUPLE_PROTO | + * | 0500 0100 06 000000 | nla_type=CTA_PROTO_NUM, proto=IPPROTO_TCP (6) | + * | 0600 0200 F3F1 0000 | nla_type=CTA_PROTO_SRC_PORT, port=62449 (big endian) | + * | 0600 0300 01BB 0000 | nla_type=CTA_PROTO_DST_PORT, port=433 (big endian) | + * +--------------------------+-----------------------------------------------------------+ + * + * The position of the byte buffer doesn't set to the end when the function returns. It is okay + * because the caller ConntrackMessage#parse has passed a copy which is used for this parser + * only. Moreover, the parser behavior is the same as other existing netlink struct class + * parser. Ex: StructInetDiagMsg#parse. + */ + @Nullable + private static Tuple parseTuple(@Nullable ByteBuffer byteBuffer) { + if (byteBuffer == null) return null; + + TupleIpv4 tupleIpv4 = null; + TupleProto tupleProto = null; + + final int baseOffset = byteBuffer.position(); + StructNlAttr nlAttr = findNextAttrOfType(makeNestedType(CTA_TUPLE_IP), byteBuffer); + if (nlAttr != null) { + tupleIpv4 = parseTupleIpv4(nlAttr.getValueAsByteBuffer()); + } + if (tupleIpv4 == null) return null; + + byteBuffer.position(baseOffset); + nlAttr = findNextAttrOfType(makeNestedType(CTA_TUPLE_PROTO), byteBuffer); + if (nlAttr != null) { + tupleProto = parseTupleProto(nlAttr.getValueAsByteBuffer()); + } + if (tupleProto == null) return null; + + return new Tuple(tupleIpv4, tupleProto); + } + + @Nullable + private static Inet4Address castToInet4Address(@Nullable InetAddress address) { + if (address == null || !(address instanceof Inet4Address)) return null; + return (Inet4Address) address; + } + + @Nullable + private static TupleIpv4 parseTupleIpv4(@Nullable ByteBuffer byteBuffer) { + if (byteBuffer == null) return null; + + Inet4Address src = null; + Inet4Address dst = null; + + final int baseOffset = byteBuffer.position(); + StructNlAttr nlAttr = findNextAttrOfType(CTA_IP_V4_SRC, byteBuffer); + if (nlAttr != null) { + src = castToInet4Address(nlAttr.getValueAsInetAddress()); + } + if (src == null) return null; + + byteBuffer.position(baseOffset); + nlAttr = findNextAttrOfType(CTA_IP_V4_DST, byteBuffer); + if (nlAttr != null) { + dst = castToInet4Address(nlAttr.getValueAsInetAddress()); + } + if (dst == null) return null; + + return new TupleIpv4(src, dst); + } + + @Nullable + private static TupleProto parseTupleProto(@Nullable ByteBuffer byteBuffer) { + if (byteBuffer == null) return null; + + byte protoNum = 0; + short srcPort = 0; + short dstPort = 0; + + final int baseOffset = byteBuffer.position(); + StructNlAttr nlAttr = findNextAttrOfType(CTA_PROTO_NUM, byteBuffer); + if (nlAttr != null) { + protoNum = nlAttr.getValueAsByte((byte) 0); + } + if (!(protoNum == IPPROTO_TCP || protoNum == IPPROTO_UDP)) return null; + + byteBuffer.position(baseOffset); + nlAttr = StructNlAttr.findNextAttrOfType(CTA_PROTO_SRC_PORT, byteBuffer); + if (nlAttr != null) { + srcPort = nlAttr.getValueAsBe16((short) 0); + } + if (srcPort == 0) return null; + + byteBuffer.position(baseOffset); + nlAttr = StructNlAttr.findNextAttrOfType(CTA_PROTO_DST_PORT, byteBuffer); + if (nlAttr != null) { + dstPort = nlAttr.getValueAsBe16((short) 0); + } + if (dstPort == 0) return null; + + return new TupleProto(protoNum, srcPort, dstPort); + } + + /** + * Netfilter header. + */ + public final StructNfGenMsg nfGenMsg; + /** + * Original direction conntrack tuple. + * + * The tuple is determined by the parsed attribute value CTA_TUPLE_ORIG, or null if the + * tuple could not be parsed successfully (for example, if it was truncated or absent). + */ + @Nullable + public final Tuple tupleOrig; + /** + * Reply direction conntrack tuple. + * + * The tuple is determined by the parsed attribute value CTA_TUPLE_REPLY, or null if the + * tuple could not be parsed successfully (for example, if it was truncated or absent). + */ + @Nullable + public final Tuple tupleReply; + /** + * Connection status. A bitmask of ip_conntrack_status enum flags. + * + * The status is determined by the parsed attribute value CTA_STATUS, or 0 if the status could + * not be parsed successfully (for example, if it was truncated or absent). For the message + * from kernel, the valid status is non-zero. For the message from user space, the status may + * be 0 (absent). + */ + public final int status; + /** + * Conntrack timeout. + * + * The timeout is determined by the parsed attribute value CTA_TIMEOUT, or 0 if the timeout + * could not be parsed successfully (for example, if it was truncated or absent). For + * IPCTNL_MSG_CT_NEW event, the valid timeout is non-zero. For IPCTNL_MSG_CT_DELETE event, the + * timeout is 0 (absent). + */ + public final int timeoutSec; + + private ConntrackMessage() { + super(new StructNlMsgHdr()); + nfGenMsg = new StructNfGenMsg((byte) OsConstants.AF_INET); + + // This constructor is only used by #newIPv4TimeoutUpdateRequest which doesn't use these + // data member for packing message. Simply fill them to null or 0. + tupleOrig = null; + tupleReply = null; + status = 0; + timeoutSec = 0; + } + + private ConntrackMessage(@NonNull StructNlMsgHdr header, @NonNull StructNfGenMsg nfGenMsg, + @Nullable Tuple tupleOrig, @Nullable Tuple tupleReply, int status, int timeoutSec) { + super(header); + this.nfGenMsg = nfGenMsg; + this.tupleOrig = tupleOrig; + this.tupleReply = tupleReply; + this.status = status; + this.timeoutSec = timeoutSec; + } + + public void pack(ByteBuffer byteBuffer) { + mHeader.pack(byteBuffer); + nfGenMsg.pack(byteBuffer); + } + + public short getMessageType() { + return (short) (getHeader().nlmsg_type & ~(NetlinkConstants.NFNL_SUBSYS_CTNETLINK << 8)); + } + + /** + * Convert an ip conntrack status to a string. + */ + public static String stringForIpConntrackStatus(int flags) { + final StringBuilder sb = new StringBuilder(); + + if ((flags & IPS_EXPECTED) != 0) { + sb.append("IPS_EXPECTED"); + } + if ((flags & IPS_SEEN_REPLY) != 0) { + if (sb.length() > 0) sb.append("|"); + sb.append("IPS_SEEN_REPLY"); + } + if ((flags & IPS_ASSURED) != 0) { + if (sb.length() > 0) sb.append("|"); + sb.append("IPS_ASSURED"); + } + if ((flags & IPS_CONFIRMED) != 0) { + if (sb.length() > 0) sb.append("|"); + sb.append("IPS_CONFIRMED"); + } + if ((flags & IPS_SRC_NAT) != 0) { + if (sb.length() > 0) sb.append("|"); + sb.append("IPS_SRC_NAT"); + } + if ((flags & IPS_DST_NAT) != 0) { + if (sb.length() > 0) sb.append("|"); + sb.append("IPS_DST_NAT"); + } + if ((flags & IPS_SEQ_ADJUST) != 0) { + if (sb.length() > 0) sb.append("|"); + sb.append("IPS_SEQ_ADJUST"); + } + if ((flags & IPS_SRC_NAT_DONE) != 0) { + if (sb.length() > 0) sb.append("|"); + sb.append("IPS_SRC_NAT_DONE"); + } + if ((flags & IPS_DST_NAT_DONE) != 0) { + if (sb.length() > 0) sb.append("|"); + sb.append("IPS_DST_NAT_DONE"); + } + if ((flags & IPS_DYING) != 0) { + if (sb.length() > 0) sb.append("|"); + sb.append("IPS_DYING"); + } + if ((flags & IPS_FIXED_TIMEOUT) != 0) { + if (sb.length() > 0) sb.append("|"); + sb.append("IPS_FIXED_TIMEOUT"); + } + if ((flags & IPS_TEMPLATE) != 0) { + if (sb.length() > 0) sb.append("|"); + sb.append("IPS_TEMPLATE"); + } + if ((flags & IPS_UNTRACKED) != 0) { + if (sb.length() > 0) sb.append("|"); + sb.append("IPS_UNTRACKED"); + } + if ((flags & IPS_HELPER) != 0) { + if (sb.length() > 0) sb.append("|"); + sb.append("IPS_HELPER"); + } + if ((flags & IPS_OFFLOAD) != 0) { + if (sb.length() > 0) sb.append("|"); + sb.append("IPS_OFFLOAD"); + } + if ((flags & IPS_HW_OFFLOAD) != 0) { + if (sb.length() > 0) sb.append("|"); + sb.append("IPS_HW_OFFLOAD"); + } + return sb.toString(); + } + + @Override + public String toString() { + return "ConntrackMessage{" + + "nlmsghdr{" + + (mHeader == null ? "" : mHeader.toString(OsConstants.NETLINK_NETFILTER)) + + "}, " + + "nfgenmsg{" + nfGenMsg + "}, " + + "tuple_orig{" + tupleOrig + "}, " + + "tuple_reply{" + tupleReply + "}, " + + "status{" + status + "(" + stringForIpConntrackStatus(status) + ")" + "}, " + + "timeout_sec{" + Integer.toUnsignedLong(timeoutSec) + "}" + + "}"; + } +}
diff --git a/common/netlinkclient/src/android/net/netlink/InetDiagMessage.java b/common/netlinkclient/src/android/net/netlink/InetDiagMessage.java new file mode 100644 index 0000000..c085123 --- /dev/null +++ b/common/netlinkclient/src/android/net/netlink/InetDiagMessage.java
@@ -0,0 +1,222 @@ +/* + * 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 android.net.netlink; + +import static android.net.netlink.NetlinkConstants.SOCK_DIAG_BY_FAMILY; +import static android.net.netlink.NetlinkSocket.DEFAULT_RECV_BUFSIZE; +import static android.net.netlink.StructNlMsgHdr.NLM_F_DUMP; +import static android.net.netlink.StructNlMsgHdr.NLM_F_REQUEST; +import static android.os.Process.INVALID_UID; +import static android.system.OsConstants.AF_INET; +import static android.system.OsConstants.AF_INET6; +import static android.system.OsConstants.IPPROTO_UDP; +import static android.system.OsConstants.NETLINK_INET_DIAG; + +import android.annotation.Nullable; +import android.net.util.SocketUtils; +import android.system.ErrnoException; +import android.util.Log; + +import java.io.FileDescriptor; +import java.io.IOException; +import java.io.InterruptedIOException; +import java.net.Inet4Address; +import java.net.Inet6Address; +import java.net.InetSocketAddress; +import java.net.SocketException; +import java.net.UnknownHostException; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/** + * A NetlinkMessage subclass for netlink inet_diag messages. + * + * see also: <linux_src>/include/uapi/linux/inet_diag.h + * + * @hide + */ +public class InetDiagMessage extends NetlinkMessage { + public static final String TAG = "InetDiagMessage"; + private static final int TIMEOUT_MS = 500; + + public static byte[] InetDiagReqV2(int protocol, InetSocketAddress local, + InetSocketAddress remote, int family, short flags) { + return InetDiagReqV2(protocol, local, remote, family, flags, 0 /* pad */, + 0 /* idiagExt */, StructInetDiagReqV2.INET_DIAG_REQ_V2_ALL_STATES); + } + + /** + * Construct an inet_diag_req_v2 message. This method will throw {@code NullPointerException} + * if local and remote are not both null or both non-null. + * + * @param protocol the request protocol type. This should be set to one of IPPROTO_TCP, + * IPPROTO_UDP, or IPPROTO_UDPLITE. + * @param local local socket address of the target socket. This will be packed into a + * {@Code StructInetDiagSockId}. Request to diagnose for all sockets if both of + * local or remote address is null. + * @param remote remote socket address of the target socket. This will be packed into a + * {@Code StructInetDiagSockId}. Request to diagnose for all sockets if both of + * local or remote address is null. + * @param family the ip family of the request message. This should be set to either AF_INET or + * AF_INET6 for IPv4 or IPv6 sockets respectively. + * @param flags message flags. See <linux_src>/include/uapi/linux/netlink.h. + * @param pad for raw socket protocol specification. + * @param idiagExt a set of flags defining what kind of extended information to report. + * @param state a bit mask that defines a filter of socket states. + * + * @return bytes array representation of the message + **/ + public static byte[] InetDiagReqV2(int protocol, @Nullable InetSocketAddress local, + @Nullable InetSocketAddress remote, int family, short flags, int pad, int idiagExt, + int state) throws NullPointerException { + final byte[] bytes = new byte[StructNlMsgHdr.STRUCT_SIZE + StructInetDiagReqV2.STRUCT_SIZE]; + final ByteBuffer byteBuffer = ByteBuffer.wrap(bytes); + byteBuffer.order(ByteOrder.nativeOrder()); + + final StructNlMsgHdr nlMsgHdr = new StructNlMsgHdr(); + nlMsgHdr.nlmsg_len = bytes.length; + nlMsgHdr.nlmsg_type = SOCK_DIAG_BY_FAMILY; + nlMsgHdr.nlmsg_flags = flags; + nlMsgHdr.pack(byteBuffer); + final StructInetDiagReqV2 inetDiagReqV2 = + new StructInetDiagReqV2(protocol, local, remote, family, pad, idiagExt, state); + + inetDiagReqV2.pack(byteBuffer); + return bytes; + } + + public StructInetDiagMsg mStructInetDiagMsg; + + private InetDiagMessage(StructNlMsgHdr header) { + super(header); + mStructInetDiagMsg = new StructInetDiagMsg(); + } + + public static InetDiagMessage parse(StructNlMsgHdr header, ByteBuffer byteBuffer) { + final InetDiagMessage msg = new InetDiagMessage(header); + msg.mStructInetDiagMsg = StructInetDiagMsg.parse(byteBuffer); + return msg; + } + + private static int lookupUidByFamily(int protocol, InetSocketAddress local, + InetSocketAddress remote, int family, short flags, + FileDescriptor fd) + throws ErrnoException, InterruptedIOException { + byte[] msg = InetDiagReqV2(protocol, local, remote, family, flags); + NetlinkSocket.sendMessage(fd, msg, 0, msg.length, TIMEOUT_MS); + ByteBuffer response = NetlinkSocket.recvMessage(fd, DEFAULT_RECV_BUFSIZE, TIMEOUT_MS); + + final NetlinkMessage nlMsg = NetlinkMessage.parse(response, NETLINK_INET_DIAG); + final StructNlMsgHdr hdr = nlMsg.getHeader(); + if (hdr.nlmsg_type == NetlinkConstants.NLMSG_DONE) { + return INVALID_UID; + } + if (nlMsg instanceof InetDiagMessage) { + return ((InetDiagMessage) nlMsg).mStructInetDiagMsg.idiag_uid; + } + return INVALID_UID; + } + + private static final int FAMILY[] = {AF_INET6, AF_INET}; + + private static int lookupUid(int protocol, InetSocketAddress local, + InetSocketAddress remote, FileDescriptor fd) + throws ErrnoException, InterruptedIOException { + int uid; + + for (int family : FAMILY) { + /** + * For exact match lookup, swap local and remote for UDP lookups due to kernel + * bug which will not be fixed. See aosp/755889 and + * https://www.mail-archive.com/netdev@vger.kernel.org/msg248638.html + */ + if (protocol == IPPROTO_UDP) { + uid = lookupUidByFamily(protocol, remote, local, family, NLM_F_REQUEST, fd); + } else { + uid = lookupUidByFamily(protocol, local, remote, family, NLM_F_REQUEST, fd); + } + if (uid != INVALID_UID) { + return uid; + } + } + + /** + * For UDP it's possible for a socket to send packets to arbitrary destinations, even if the + * socket is not connected (and even if the socket is connected to a different destination). + * If we want this API to work for such packets, then on miss we need to do a second lookup + * with only the local address and port filled in. + * Always use flags == NLM_F_REQUEST | NLM_F_DUMP for wildcard. + */ + if (protocol == IPPROTO_UDP) { + try { + InetSocketAddress wildcard = new InetSocketAddress( + Inet6Address.getByName("::"), 0); + uid = lookupUidByFamily(protocol, local, wildcard, AF_INET6, + (short) (NLM_F_REQUEST | NLM_F_DUMP), fd); + if (uid != INVALID_UID) { + return uid; + } + wildcard = new InetSocketAddress(Inet4Address.getByName("0.0.0.0"), 0); + uid = lookupUidByFamily(protocol, local, wildcard, AF_INET, + (short) (NLM_F_REQUEST | NLM_F_DUMP), fd); + if (uid != INVALID_UID) { + return uid; + } + } catch (UnknownHostException e) { + Log.e(TAG, e.toString()); + } + } + return INVALID_UID; + } + + /** + * Use an inet_diag socket to look up the UID associated with the input local and remote + * address/port and protocol of a connection. + */ + public static int getConnectionOwnerUid(int protocol, InetSocketAddress local, + InetSocketAddress remote) { + int uid = INVALID_UID; + FileDescriptor fd = null; + try { + fd = NetlinkSocket.forProto(NETLINK_INET_DIAG); + NetlinkSocket.connectToKernel(fd); + uid = lookupUid(protocol, local, remote, fd); + } catch (ErrnoException | SocketException | IllegalArgumentException + | InterruptedIOException e) { + Log.e(TAG, e.toString()); + } finally { + if (fd != null) { + try { + SocketUtils.closeSocket(fd); + } catch (IOException e) { + Log.e(TAG, e.toString()); + } + } + } + return uid; + } + + @Override + public String toString() { + return "InetDiagMessage{ " + + "nlmsghdr{" + + (mHeader == null ? "" : mHeader.toString(NETLINK_INET_DIAG)) + "}, " + + "inet_diag_msg{" + + (mStructInetDiagMsg == null ? "" : mStructInetDiagMsg.toString()) + "} " + + "}"; + } +}
diff --git a/common/netlinkclient/src/android/net/netlink/NdOption.java b/common/netlinkclient/src/android/net/netlink/NdOption.java new file mode 100644 index 0000000..ab9d2e6 --- /dev/null +++ b/common/netlinkclient/src/android/net/netlink/NdOption.java
@@ -0,0 +1,83 @@ +/* + * 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 android.net.netlink; + +import java.nio.ByteBuffer; + +/** + * Base class for IPv6 neighbour discovery options. + */ +public class NdOption { + public static final int STRUCT_SIZE = 2; + + /** The option type. */ + public final byte type; + /** The length of the option in 8-byte units. Actually an unsigned 8-bit integer */ + public final int length; + + /** Constructs a new NdOption. */ + NdOption(byte type, int length) { + this.type = type; + this.length = length; + } + + /** + * Parses a neighbour discovery option. + * + * Parses (and consumes) the option if it is of a known type. If the option is of an unknown + * type, advances the buffer (so the caller can continue parsing if desired) and returns + * {@link #UNKNOWN}. If the option claims a length of 0, returns null because parsing cannot + * continue. + * + * No checks are performed on the length other than ensuring it is not 0, so if a caller wants + * to deal with options that might overflow the structure that contains them, it must explicitly + * set the buffer's limit to the position at which that structure ends. + * + * @param buf the buffer to parse. + * @return a subclass of {@link NdOption}, or {@code null} for an unknown or malformed option. + */ + public static NdOption parse(ByteBuffer buf) { + if (buf == null || buf.remaining() < STRUCT_SIZE) return null; + + // Peek the type without advancing the buffer. + byte type = buf.get(buf.position()); + int length = Byte.toUnsignedInt(buf.get(buf.position() + 1)); + if (length == 0) return null; + + switch (type) { + case StructNdOptPref64.TYPE: + return StructNdOptPref64.parse(buf); + + default: + int newPosition = Math.min(buf.limit(), buf.position() + length * 8); + buf.position(newPosition); + return UNKNOWN; + } + } + + void writeToByteBuffer(ByteBuffer buf) { + buf.put(type); + buf.put((byte) length); + } + + @Override + public String toString() { + return String.format("NdOption(%d, %d)", Byte.toUnsignedInt(type), length); + } + + public static final NdOption UNKNOWN = new NdOption((byte) 0, 0); +}
diff --git a/common/netlinkclient/src/android/net/netlink/NduseroptMessage.java b/common/netlinkclient/src/android/net/netlink/NduseroptMessage.java new file mode 100644 index 0000000..7b976f1 --- /dev/null +++ b/common/netlinkclient/src/android/net/netlink/NduseroptMessage.java
@@ -0,0 +1,141 @@ +/* + * 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 android.net.netlink; + +import static android.system.OsConstants.AF_INET6; + +import androidx.annotation.NonNull; + +import java.net.Inet6Address; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.nio.BufferUnderflowException; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/** + * A NetlinkMessage subclass for RTM_NEWNDUSEROPT messages. + */ +public class NduseroptMessage extends NetlinkMessage { + public static final int STRUCT_SIZE = 16; + + static final int NDUSEROPT_SRCADDR = 1; + + /** The address family. Presumably always AF_INET6. */ + public final byte family; + /** + * The total length in bytes of the options that follow this structure. + * Actually a 16-bit unsigned integer. + */ + public final int opts_len; + /** The interface index on which the options were received. */ + public final int ifindex; + /** The ICMP type of the packet that contained the options. */ + public final byte icmp_type; + /** The ICMP code of the packet that contained the options. */ + public final byte icmp_code; + + /** + * ND option that was in this message. + * Even though the length field is called "opts_len", the kernel only ever sends one option per + * message. It is unlikely that this will ever change as it would break existing userspace code. + * But if it does, we can simply update this code, since userspace is typically newer than the + * kernel. + */ + public final NdOption option; + + /** The IP address that sent the packet containing the option. */ + public final InetAddress srcaddr; + + NduseroptMessage(@NonNull StructNlMsgHdr header, @NonNull ByteBuffer buf) + throws UnknownHostException { + super(header); + + // The structure itself. + buf.order(ByteOrder.nativeOrder()); // Restored in the finally clause inside parse(). + final int start = buf.position(); + family = buf.get(); + buf.get(); // Skip 1 byte of padding. + opts_len = Short.toUnsignedInt(buf.getShort()); + ifindex = buf.getInt(); + icmp_type = buf.get(); + icmp_code = buf.get(); + buf.position(buf.position() + 6); // Skip 6 bytes of padding. + + // The ND option. + // Ensure we don't read past opts_len even if the option length is invalid. + // Note that this check is not really necessary since if the option length is not valid, + // this struct won't be very useful to the caller. + buf.order(ByteOrder.BIG_ENDIAN); + int oldLimit = buf.limit(); + buf.limit(start + STRUCT_SIZE + opts_len); + try { + option = NdOption.parse(buf); + } finally { + buf.limit(oldLimit); + } + + // The source address. + int newPosition = start + STRUCT_SIZE + opts_len; + if (newPosition >= buf.limit()) { + throw new IllegalArgumentException("ND options extend past end of buffer"); + } + buf.position(newPosition); + + StructNlAttr nla = StructNlAttr.parse(buf); + if (nla == null || nla.nla_type != NDUSEROPT_SRCADDR || nla.nla_value == null) { + throw new IllegalArgumentException("Invalid source address in ND useropt"); + } + if (family == AF_INET6) { + // InetAddress.getByAddress only looks at the ifindex if the address type needs one. + srcaddr = Inet6Address.getByAddress(null /* hostname */, nla.nla_value, ifindex); + } else { + srcaddr = InetAddress.getByAddress(nla.nla_value); + } + } + + /** + * Parses a StructNduseroptmsg from a {@link ByteBuffer}. + * + * @param header the netlink message header. + * @param buf The buffer from which to parse the option. The buffer's byte order must be + * {@link java.nio.ByteOrder#BIG_ENDIAN}. + * @return the parsed option, or {@code null} if the option could not be parsed successfully + * (for example, if it was truncated, or if the prefix length code was wrong). + */ + public static NduseroptMessage parse(@NonNull StructNlMsgHdr header, @NonNull ByteBuffer buf) { + if (buf == null || buf.remaining() < STRUCT_SIZE) return null; + ByteOrder oldOrder = buf.order(); + try { + return new NduseroptMessage(header, buf); + } catch (IllegalArgumentException | UnknownHostException | BufferUnderflowException e) { + // Not great, but better than throwing an exception that might crash the caller. + // Convention in this package is that null indicates that the option was truncated, so + // callers must already handle it. + return null; + } finally { + buf.order(oldOrder); + } + } + + @Override + public String toString() { + return String.format("Nduseroptmsg(%d, %d, %d, %d, %d, %s)", + family, opts_len, ifindex, Byte.toUnsignedInt(icmp_type), + Byte.toUnsignedInt(icmp_code), srcaddr.getHostAddress()); + } +}
diff --git a/common/netlinkclient/src/android/net/netlink/NetlinkConstants.java b/common/netlinkclient/src/android/net/netlink/NetlinkConstants.java new file mode 100644 index 0000000..b4d9cc0 --- /dev/null +++ b/common/netlinkclient/src/android/net/netlink/NetlinkConstants.java
@@ -0,0 +1,242 @@ +/* + * Copyright (C) 2015 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.netlink; + +import android.annotation.NonNull; +import android.system.OsConstants; + +import java.nio.ByteBuffer; + + +/** + * Various constants and static helper methods for netlink communications. + * + * Values taken from: + * + * include/uapi/linux/netfilter/nfnetlink.h + * include/uapi/linux/netfilter/nfnetlink_conntrack.h + * include/uapi/linux/netlink.h + * include/uapi/linux/rtnetlink.h + * + * @hide + */ +public class NetlinkConstants { + private NetlinkConstants() {} + + public static final int NLA_ALIGNTO = 4; + /** + * Flag for dumping struct tcp_info. + * Corresponding to enum definition in external/strace/linux/inet_diag.h. + */ + public static final int INET_DIAG_MEMINFO = 1; + + public static final int SOCKDIAG_MSG_HEADER_SIZE = + StructNlMsgHdr.STRUCT_SIZE + StructInetDiagMsg.STRUCT_SIZE; + + public static final int alignedLengthOf(short length) { + final int intLength = (int) length & 0xffff; + return alignedLengthOf(intLength); + } + + public static final int alignedLengthOf(int length) { + if (length <= 0) { return 0; } + return (((length + NLA_ALIGNTO - 1) / NLA_ALIGNTO) * NLA_ALIGNTO); + } + + public static String stringForAddressFamily(int family) { + if (family == OsConstants.AF_INET) { return "AF_INET"; } + if (family == OsConstants.AF_INET6) { return "AF_INET6"; } + if (family == OsConstants.AF_NETLINK) { return "AF_NETLINK"; } + return String.valueOf(family); + } + + public static String stringForProtocol(int protocol) { + if (protocol == OsConstants.IPPROTO_TCP) { return "IPPROTO_TCP"; } + if (protocol == OsConstants.IPPROTO_UDP) { return "IPPROTO_UDP"; } + return String.valueOf(protocol); + } + + public static String hexify(byte[] bytes) { + if (bytes == null) { return "(null)"; } + return toHexString(bytes, 0, bytes.length); + } + + public static String hexify(ByteBuffer buffer) { + if (buffer == null) { return "(null)"; } + return toHexString( + buffer.array(), buffer.position(), buffer.remaining()); + } + + // Known values for struct nlmsghdr nlm_type. + public static final short NLMSG_NOOP = 1; // Nothing + public static final short NLMSG_ERROR = 2; // Error + public static final short NLMSG_DONE = 3; // End of a dump + public static final short NLMSG_OVERRUN = 4; // Data lost + public static final short NLMSG_MAX_RESERVED = 15; // Max reserved value + + public static final short RTM_NEWLINK = 16; + public static final short RTM_DELLINK = 17; + public static final short RTM_GETLINK = 18; + public static final short RTM_SETLINK = 19; + public static final short RTM_NEWADDR = 20; + public static final short RTM_DELADDR = 21; + public static final short RTM_GETADDR = 22; + public static final short RTM_NEWROUTE = 24; + public static final short RTM_DELROUTE = 25; + public static final short RTM_GETROUTE = 26; + public static final short RTM_NEWNEIGH = 28; + public static final short RTM_DELNEIGH = 29; + public static final short RTM_GETNEIGH = 30; + public static final short RTM_NEWRULE = 32; + public static final short RTM_DELRULE = 33; + public static final short RTM_GETRULE = 34; + public static final short RTM_NEWNDUSEROPT = 68; + + // Netfilter netlink message types are presented by two bytes: high byte subsystem and + // low byte operation. See the macro NFNL_SUBSYS_ID and NFNL_MSG_TYPE in + // include/uapi/linux/netfilter/nfnetlink.h + public static final short NFNL_SUBSYS_CTNETLINK = 1; + + public static final short IPCTNL_MSG_CT_NEW = 0; + public static final short IPCTNL_MSG_CT_GET = 1; + public static final short IPCTNL_MSG_CT_DELETE = 2; + public static final short IPCTNL_MSG_CT_GET_CTRZERO = 3; + public static final short IPCTNL_MSG_CT_GET_STATS_CPU = 4; + public static final short IPCTNL_MSG_CT_GET_STATS = 5; + public static final short IPCTNL_MSG_CT_GET_DYING = 6; + public static final short IPCTNL_MSG_CT_GET_UNCONFIRMED = 7; + + /* see include/uapi/linux/sock_diag.h */ + public static final short SOCK_DIAG_BY_FAMILY = 20; + + // Netlink groups. + public static final int RTNLGRP_ND_USEROPT = 20; + public static final int RTMGRP_ND_USEROPT = 1 << (RTNLGRP_ND_USEROPT - 1); + + /** + * Convert a netlink message type to a string for control message. + */ + @NonNull + private static String stringForCtlMsgType(short nlmType) { + switch (nlmType) { + case NLMSG_NOOP: return "NLMSG_NOOP"; + case NLMSG_ERROR: return "NLMSG_ERROR"; + case NLMSG_DONE: return "NLMSG_DONE"; + case NLMSG_OVERRUN: return "NLMSG_OVERRUN"; + default: return "unknown control message type: " + String.valueOf(nlmType); + } + } + + /** + * Convert a netlink message type to a string for NETLINK_ROUTE. + */ + @NonNull + private static String stringForRtMsgType(short nlmType) { + switch (nlmType) { + case RTM_NEWLINK: return "RTM_NEWLINK"; + case RTM_DELLINK: return "RTM_DELLINK"; + case RTM_GETLINK: return "RTM_GETLINK"; + case RTM_SETLINK: return "RTM_SETLINK"; + case RTM_NEWADDR: return "RTM_NEWADDR"; + case RTM_DELADDR: return "RTM_DELADDR"; + case RTM_GETADDR: return "RTM_GETADDR"; + case RTM_NEWROUTE: return "RTM_NEWROUTE"; + case RTM_DELROUTE: return "RTM_DELROUTE"; + case RTM_GETROUTE: return "RTM_GETROUTE"; + case RTM_NEWNEIGH: return "RTM_NEWNEIGH"; + case RTM_DELNEIGH: return "RTM_DELNEIGH"; + case RTM_GETNEIGH: return "RTM_GETNEIGH"; + case RTM_NEWRULE: return "RTM_NEWRULE"; + case RTM_DELRULE: return "RTM_DELRULE"; + case RTM_GETRULE: return "RTM_GETRULE"; + case RTM_NEWNDUSEROPT: return "RTM_NEWNDUSEROPT"; + default: return "unknown RTM type: " + String.valueOf(nlmType); + } + } + + /** + * Convert a netlink message type to a string for NETLINK_INET_DIAG. + */ + @NonNull + private static String stringForInetDiagMsgType(short nlmType) { + switch (nlmType) { + case SOCK_DIAG_BY_FAMILY: return "SOCK_DIAG_BY_FAMILY"; + default: return "unknown SOCK_DIAG type: " + String.valueOf(nlmType); + } + } + + /** + * Convert a netlink message type to a string for NETLINK_NETFILTER. + */ + @NonNull + private static String stringForNfMsgType(short nlmType) { + final byte subsysId = (byte) (nlmType >> 8); + final byte msgType = (byte) nlmType; + switch (subsysId) { + case NFNL_SUBSYS_CTNETLINK: + switch (msgType) { + case IPCTNL_MSG_CT_NEW: return "IPCTNL_MSG_CT_NEW"; + case IPCTNL_MSG_CT_GET: return "IPCTNL_MSG_CT_GET"; + case IPCTNL_MSG_CT_DELETE: return "IPCTNL_MSG_CT_DELETE"; + case IPCTNL_MSG_CT_GET_CTRZERO: return "IPCTNL_MSG_CT_GET_CTRZERO"; + case IPCTNL_MSG_CT_GET_STATS_CPU: return "IPCTNL_MSG_CT_GET_STATS_CPU"; + case IPCTNL_MSG_CT_GET_STATS: return "IPCTNL_MSG_CT_GET_STATS"; + case IPCTNL_MSG_CT_GET_DYING: return "IPCTNL_MSG_CT_GET_DYING"; + case IPCTNL_MSG_CT_GET_UNCONFIRMED: return "IPCTNL_MSG_CT_GET_UNCONFIRMED"; + } + break; + } + return "unknown NETFILTER type: " + String.valueOf(nlmType); + } + + /** + * Convert a netlink message type to a string by netlink family. + */ + @NonNull + public static String stringForNlMsgType(short nlmType, int nlFamily) { + // Reserved control messages. The netlink family is ignored. + // See NLMSG_MIN_TYPE in include/uapi/linux/netlink.h. + if (nlmType <= NLMSG_MAX_RESERVED) return stringForCtlMsgType(nlmType); + + // Netlink family messages. The netlink family is required. Note that the reason for using + // if-statement is that switch-case can't be used because the OsConstants.NETLINK_* are + // not constant. + if (nlFamily == OsConstants.NETLINK_ROUTE) return stringForRtMsgType(nlmType); + if (nlFamily == OsConstants.NETLINK_INET_DIAG) return stringForInetDiagMsgType(nlmType); + if (nlFamily == OsConstants.NETLINK_NETFILTER) return stringForNfMsgType(nlmType); + + return "unknown type: " + String.valueOf(nlmType); + } + + private static final char[] HEX_DIGITS = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + 'A', 'B', 'C', 'D', 'E', 'F' }; + /** + * Convert a byte array to a hexadecimal string. + */ + public static String toHexString(byte[] array, int offset, int length) { + char[] buf = new char[length * 2]; + + int bufIndex = 0; + for (int i = offset; i < offset + length; i++) { + byte b = array[i]; + buf[bufIndex++] = HEX_DIGITS[(b >>> 4) & 0x0F]; + buf[bufIndex++] = HEX_DIGITS[b & 0x0F]; + } + + return new String(buf); + } +}
diff --git a/common/netlinkclient/src/android/net/netlink/NetlinkErrorMessage.java b/common/netlinkclient/src/android/net/netlink/NetlinkErrorMessage.java new file mode 100644 index 0000000..36b02c6 --- /dev/null +++ b/common/netlinkclient/src/android/net/netlink/NetlinkErrorMessage.java
@@ -0,0 +1,58 @@ +/* + * 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.netlink; + +import java.nio.ByteBuffer; + + +/** + * A NetlinkMessage subclass for netlink error messages. + * + * @hide + */ +public class NetlinkErrorMessage extends NetlinkMessage { + + public static NetlinkErrorMessage parse(StructNlMsgHdr header, ByteBuffer byteBuffer) { + final NetlinkErrorMessage errorMsg = new NetlinkErrorMessage(header); + + errorMsg.mNlMsgErr = StructNlMsgErr.parse(byteBuffer); + if (errorMsg.mNlMsgErr == null) { + return null; + } + + return errorMsg; + } + + private StructNlMsgErr mNlMsgErr; + + NetlinkErrorMessage(StructNlMsgHdr header) { + super(header); + mNlMsgErr = null; + } + + public StructNlMsgErr getNlMsgError() { + return mNlMsgErr; + } + + @Override + public String toString() { + return "NetlinkErrorMessage{ " + + "nlmsghdr{" + (mHeader == null ? "" : mHeader.toString()) + "}, " + + "nlmsgerr{" + (mNlMsgErr == null ? "" : mNlMsgErr.toString()) + "} " + + "}"; + } +}
diff --git a/common/netlinkclient/src/android/net/netlink/NetlinkMessage.java b/common/netlinkclient/src/android/net/netlink/NetlinkMessage.java new file mode 100644 index 0000000..ab2c223 --- /dev/null +++ b/common/netlinkclient/src/android/net/netlink/NetlinkMessage.java
@@ -0,0 +1,153 @@ +/* + * 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.netlink; + +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.system.OsConstants; + +import java.nio.ByteBuffer; + + +/** + * NetlinkMessage base class for other, more specific netlink message types. + * + * Classes that extend NetlinkMessage should: + * - implement a public static parse(StructNlMsgHdr, ByteBuffer) method + * - returning either null (parse errors) or a new object of the subclass + * type (cast-able to NetlinkMessage) + * + * NetlinkMessage.parse() should be updated to know which nlmsg_type values + * correspond with which message subclasses. + * + * @hide + */ +public class NetlinkMessage { + private final static String TAG = "NetlinkMessage"; + + /** + * Parsing netlink messages for reserved control message or specific netlink message. The + * netlink family is required for parsing specific netlink message. See man-pages/netlink. + */ + @Nullable + public static NetlinkMessage parse(@NonNull ByteBuffer byteBuffer, int nlFamily) { + final int startPosition = (byteBuffer != null) ? byteBuffer.position() : -1; + final StructNlMsgHdr nlmsghdr = StructNlMsgHdr.parse(byteBuffer); + if (nlmsghdr == null) { + return null; + } + + int payloadLength = NetlinkConstants.alignedLengthOf(nlmsghdr.nlmsg_len); + payloadLength -= StructNlMsgHdr.STRUCT_SIZE; + if (payloadLength < 0 || payloadLength > byteBuffer.remaining()) { + // Malformed message or runt buffer. Pretend the buffer was consumed. + byteBuffer.position(byteBuffer.limit()); + return null; + } + + // Reserved control messages. The netlink family is ignored. + // See NLMSG_MIN_TYPE in include/uapi/linux/netlink.h. + if (nlmsghdr.nlmsg_type <= NetlinkConstants.NLMSG_MAX_RESERVED) { + return parseCtlMessage(nlmsghdr, byteBuffer, payloadLength); + } + + // Netlink family messages. The netlink family is required. Note that the reason for using + // if-statement is that switch-case can't be used because the OsConstants.NETLINK_* are + // not constant. + if (nlFamily == OsConstants.NETLINK_ROUTE) { + return parseRtMessage(nlmsghdr, byteBuffer); + } else if (nlFamily == OsConstants.NETLINK_INET_DIAG) { + return parseInetDiagMessage(nlmsghdr, byteBuffer); + } else if (nlFamily == OsConstants.NETLINK_NETFILTER) { + return parseNfMessage(nlmsghdr, byteBuffer); + } + + return null; + } + + protected StructNlMsgHdr mHeader; + + public NetlinkMessage(StructNlMsgHdr nlmsghdr) { + mHeader = nlmsghdr; + } + + public StructNlMsgHdr getHeader() { + return mHeader; + } + + @Override + public String toString() { + // The netlink family is not provided to StructNlMsgHdr#toString because NetlinkMessage + // doesn't store the information. So the netlink message type can't be transformed into + // a string by StructNlMsgHdr#toString and just keep as an integer. The specific message + // which inherits NetlinkMessage could override NetlinkMessage#toString and provide the + // specific netlink family to StructNlMsgHdr#toString. + return "NetlinkMessage{" + (mHeader == null ? "" : mHeader.toString()) + "}"; + } + + @NonNull + private static NetlinkMessage parseCtlMessage(@NonNull StructNlMsgHdr nlmsghdr, + @NonNull ByteBuffer byteBuffer, int payloadLength) { + switch (nlmsghdr.nlmsg_type) { + case NetlinkConstants.NLMSG_ERROR: + return (NetlinkMessage) NetlinkErrorMessage.parse(nlmsghdr, byteBuffer); + default: { + // Other netlink control messages. Just parse the header for now, + // pretending the whole message was consumed. + byteBuffer.position(byteBuffer.position() + payloadLength); + return new NetlinkMessage(nlmsghdr); + } + } + } + + @Nullable + private static NetlinkMessage parseRtMessage(@NonNull StructNlMsgHdr nlmsghdr, + @NonNull ByteBuffer byteBuffer) { + switch (nlmsghdr.nlmsg_type) { + case NetlinkConstants.RTM_NEWNEIGH: + case NetlinkConstants.RTM_DELNEIGH: + case NetlinkConstants.RTM_GETNEIGH: + return (NetlinkMessage) RtNetlinkNeighborMessage.parse(nlmsghdr, byteBuffer); + case NetlinkConstants.RTM_NEWNDUSEROPT: + return (NetlinkMessage) NduseroptMessage.parse(nlmsghdr, byteBuffer); + default: return null; + } + } + + @Nullable + private static NetlinkMessage parseInetDiagMessage(@NonNull StructNlMsgHdr nlmsghdr, + @NonNull ByteBuffer byteBuffer) { + switch (nlmsghdr.nlmsg_type) { + case NetlinkConstants.SOCK_DIAG_BY_FAMILY: + return (NetlinkMessage) InetDiagMessage.parse(nlmsghdr, byteBuffer); + default: return null; + } + } + + @Nullable + private static NetlinkMessage parseNfMessage(@NonNull StructNlMsgHdr nlmsghdr, + @NonNull ByteBuffer byteBuffer) { + switch (nlmsghdr.nlmsg_type) { + case NetlinkConstants.NFNL_SUBSYS_CTNETLINK << 8 + | NetlinkConstants.IPCTNL_MSG_CT_NEW: + case NetlinkConstants.NFNL_SUBSYS_CTNETLINK << 8 + | NetlinkConstants.IPCTNL_MSG_CT_DELETE: + return (NetlinkMessage) ConntrackMessage.parse(nlmsghdr, byteBuffer); + default: return null; + } + } +}
diff --git a/common/netlinkclient/src/android/net/netlink/NetlinkSocket.java b/common/netlinkclient/src/android/net/netlink/NetlinkSocket.java new file mode 100644 index 0000000..ab4c052 --- /dev/null +++ b/common/netlinkclient/src/android/net/netlink/NetlinkSocket.java
@@ -0,0 +1,158 @@ +/* + * Copyright (C) 2015 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.netlink; + +import static android.net.util.SocketUtils.makeNetlinkSocketAddress; +import static android.system.OsConstants.AF_NETLINK; +import static android.system.OsConstants.EIO; +import static android.system.OsConstants.EPROTO; +import static android.system.OsConstants.ETIMEDOUT; +import static android.system.OsConstants.SOCK_DGRAM; +import static android.system.OsConstants.SOL_SOCKET; +import static android.system.OsConstants.SO_RCVBUF; +import static android.system.OsConstants.SO_RCVTIMEO; +import static android.system.OsConstants.SO_SNDTIMEO; + +import android.net.util.SocketUtils; +import android.system.ErrnoException; +import android.system.Os; +import android.system.StructTimeval; +import android.util.Log; + +import java.io.FileDescriptor; +import java.io.IOException; +import java.io.InterruptedIOException; +import java.net.SocketException; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + + +/** + * NetlinkSocket + * + * A small static class to assist with AF_NETLINK socket operations. + * + * @hide + */ +public class NetlinkSocket { + private static final String TAG = "NetlinkSocket"; + + public static final int DEFAULT_RECV_BUFSIZE = 8 * 1024; + public static final int SOCKET_RECV_BUFSIZE = 64 * 1024; + + public static void sendOneShotKernelMessage(int nlProto, byte[] msg) throws ErrnoException { + final String errPrefix = "Error in NetlinkSocket.sendOneShotKernelMessage"; + final long IO_TIMEOUT = 300L; + + final FileDescriptor fd = forProto(nlProto); + + try { + connectToKernel(fd); + sendMessage(fd, msg, 0, msg.length, IO_TIMEOUT); + final ByteBuffer bytes = recvMessage(fd, DEFAULT_RECV_BUFSIZE, IO_TIMEOUT); + // recvMessage() guaranteed to not return null if it did not throw. + final NetlinkMessage response = NetlinkMessage.parse(bytes, nlProto); + if (response != null && response instanceof NetlinkErrorMessage && + (((NetlinkErrorMessage) response).getNlMsgError() != null)) { + final int errno = ((NetlinkErrorMessage) response).getNlMsgError().error; + if (errno != 0) { + // TODO: consider ignoring EINVAL (-22), which appears to be + // normal when probing a neighbor for which the kernel does + // not already have / no longer has a link layer address. + Log.e(TAG, errPrefix + ", errmsg=" + response.toString()); + // Note: convert kernel errnos (negative) into userspace errnos (positive). + throw new ErrnoException(response.toString(), Math.abs(errno)); + } + } else { + final String errmsg; + if (response == null) { + bytes.position(0); + errmsg = "raw bytes: " + NetlinkConstants.hexify(bytes); + } else { + errmsg = response.toString(); + } + Log.e(TAG, errPrefix + ", errmsg=" + errmsg); + throw new ErrnoException(errmsg, EPROTO); + } + } catch (InterruptedIOException e) { + Log.e(TAG, errPrefix, e); + throw new ErrnoException(errPrefix, ETIMEDOUT, e); + } catch (SocketException e) { + Log.e(TAG, errPrefix, e); + throw new ErrnoException(errPrefix, EIO, e); + } finally { + try { + SocketUtils.closeSocket(fd); + } catch (IOException e) { + // Nothing we can do here + } + } + } + + public static FileDescriptor forProto(int nlProto) throws ErrnoException { + final FileDescriptor fd = Os.socket(AF_NETLINK, SOCK_DGRAM, nlProto); + Os.setsockoptInt(fd, SOL_SOCKET, SO_RCVBUF, SOCKET_RECV_BUFSIZE); + return fd; + } + + public static void connectToKernel(FileDescriptor fd) throws ErrnoException, SocketException { + Os.connect(fd, makeNetlinkSocketAddress(0, 0)); + } + + private static void checkTimeout(long timeoutMs) { + if (timeoutMs < 0) { + throw new IllegalArgumentException("Negative timeouts not permitted"); + } + } + + /** + * Wait up to |timeoutMs| (or until underlying socket error) for a + * netlink message of at most |bufsize| size. + * + * Multi-threaded calls with different timeouts will cause unexpected results. + */ + public static ByteBuffer recvMessage(FileDescriptor fd, int bufsize, long timeoutMs) + throws ErrnoException, IllegalArgumentException, InterruptedIOException { + checkTimeout(timeoutMs); + + Os.setsockoptTimeval(fd, SOL_SOCKET, SO_RCVTIMEO, StructTimeval.fromMillis(timeoutMs)); + + ByteBuffer byteBuffer = ByteBuffer.allocate(bufsize); + int length = Os.read(fd, byteBuffer); + if (length == bufsize) { + Log.w(TAG, "maximum read"); + } + byteBuffer.position(0); + byteBuffer.limit(length); + byteBuffer.order(ByteOrder.nativeOrder()); + return byteBuffer; + } + + /** + * Send a message to a peer to which this socket has previously connected, + * waiting at most |timeoutMs| milliseconds for the send to complete. + * + * Multi-threaded calls with different timeouts will cause unexpected results. + */ + public static int sendMessage( + FileDescriptor fd, byte[] bytes, int offset, int count, long timeoutMs) + throws ErrnoException, IllegalArgumentException, InterruptedIOException { + checkTimeout(timeoutMs); + Os.setsockoptTimeval(fd, SOL_SOCKET, SO_SNDTIMEO, StructTimeval.fromMillis(timeoutMs)); + return Os.write(fd, bytes, offset, count); + } +}
diff --git a/common/netlinkclient/src/android/net/netlink/RtNetlinkNeighborMessage.java b/common/netlinkclient/src/android/net/netlink/RtNetlinkNeighborMessage.java new file mode 100644 index 0000000..099ff07 --- /dev/null +++ b/common/netlinkclient/src/android/net/netlink/RtNetlinkNeighborMessage.java
@@ -0,0 +1,229 @@ +/* + * 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.netlink; + +import static android.net.netlink.StructNlMsgHdr.NLM_F_ACK; +import static android.net.netlink.StructNlMsgHdr.NLM_F_DUMP; +import static android.net.netlink.StructNlMsgHdr.NLM_F_REPLACE; +import static android.net.netlink.StructNlMsgHdr.NLM_F_REQUEST; + +import android.system.OsConstants; + +import java.net.Inet6Address; +import java.net.InetAddress; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + + +/** + * A NetlinkMessage subclass for rtnetlink neighbor messages. + * + * see also: <linux_src>/include/uapi/linux/neighbour.h + * + * @hide + */ +public class RtNetlinkNeighborMessage extends NetlinkMessage { + public static final short NDA_UNSPEC = 0; + public static final short NDA_DST = 1; + public static final short NDA_LLADDR = 2; + public static final short NDA_CACHEINFO = 3; + public static final short NDA_PROBES = 4; + public static final short NDA_VLAN = 5; + public static final short NDA_PORT = 6; + public static final short NDA_VNI = 7; + public static final short NDA_IFINDEX = 8; + public static final short NDA_MASTER = 9; + + public static RtNetlinkNeighborMessage parse(StructNlMsgHdr header, ByteBuffer byteBuffer) { + final RtNetlinkNeighborMessage neighMsg = new RtNetlinkNeighborMessage(header); + + neighMsg.mNdmsg = StructNdMsg.parse(byteBuffer); + if (neighMsg.mNdmsg == null) { + return null; + } + + // Some of these are message-type dependent, and not always present. + final int baseOffset = byteBuffer.position(); + StructNlAttr nlAttr = StructNlAttr.findNextAttrOfType(NDA_DST, byteBuffer); + if (nlAttr != null) { + neighMsg.mDestination = nlAttr.getValueAsInetAddress(); + } + + byteBuffer.position(baseOffset); + nlAttr = StructNlAttr.findNextAttrOfType(NDA_LLADDR, byteBuffer); + if (nlAttr != null) { + neighMsg.mLinkLayerAddr = nlAttr.nla_value; + } + + byteBuffer.position(baseOffset); + nlAttr = StructNlAttr.findNextAttrOfType(NDA_PROBES, byteBuffer); + if (nlAttr != null) { + neighMsg.mNumProbes = nlAttr.getValueAsInt(0); + } + + byteBuffer.position(baseOffset); + nlAttr = StructNlAttr.findNextAttrOfType(NDA_CACHEINFO, byteBuffer); + if (nlAttr != null) { + neighMsg.mCacheInfo = StructNdaCacheInfo.parse(nlAttr.getValueAsByteBuffer()); + } + + final int kMinConsumed = StructNlMsgHdr.STRUCT_SIZE + StructNdMsg.STRUCT_SIZE; + final int kAdditionalSpace = NetlinkConstants.alignedLengthOf( + neighMsg.mHeader.nlmsg_len - kMinConsumed); + if (byteBuffer.remaining() < kAdditionalSpace) { + byteBuffer.position(byteBuffer.limit()); + } else { + byteBuffer.position(baseOffset + kAdditionalSpace); + } + + return neighMsg; + } + + /** + * A convenience method to create an RTM_GETNEIGH request message. + */ + public static byte[] newGetNeighborsRequest(int seqNo) { + final int length = StructNlMsgHdr.STRUCT_SIZE + StructNdMsg.STRUCT_SIZE; + final byte[] bytes = new byte[length]; + final ByteBuffer byteBuffer = ByteBuffer.wrap(bytes); + byteBuffer.order(ByteOrder.nativeOrder()); + + final StructNlMsgHdr nlmsghdr = new StructNlMsgHdr(); + nlmsghdr.nlmsg_len = length; + nlmsghdr.nlmsg_type = NetlinkConstants.RTM_GETNEIGH; + nlmsghdr.nlmsg_flags = NLM_F_REQUEST | NLM_F_DUMP; + nlmsghdr.nlmsg_seq = seqNo; + nlmsghdr.pack(byteBuffer); + + final StructNdMsg ndmsg = new StructNdMsg(); + ndmsg.pack(byteBuffer); + + return bytes; + } + + /** + * A convenience method to create an RTM_NEWNEIGH message, to modify + * the kernel's state information for a specific neighbor. + */ + public static byte[] newNewNeighborMessage( + int seqNo, InetAddress ip, short nudState, int ifIndex, byte[] llAddr) { + final StructNlMsgHdr nlmsghdr = new StructNlMsgHdr(); + nlmsghdr.nlmsg_type = NetlinkConstants.RTM_NEWNEIGH; + nlmsghdr.nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK | NLM_F_REPLACE; + nlmsghdr.nlmsg_seq = seqNo; + + final RtNetlinkNeighborMessage msg = new RtNetlinkNeighborMessage(nlmsghdr); + msg.mNdmsg = new StructNdMsg(); + msg.mNdmsg.ndm_family = + (byte) ((ip instanceof Inet6Address) ? OsConstants.AF_INET6 : OsConstants.AF_INET); + msg.mNdmsg.ndm_ifindex = ifIndex; + msg.mNdmsg.ndm_state = nudState; + msg.mDestination = ip; + msg.mLinkLayerAddr = llAddr; // might be null + + final byte[] bytes = new byte[msg.getRequiredSpace()]; + nlmsghdr.nlmsg_len = bytes.length; + final ByteBuffer byteBuffer = ByteBuffer.wrap(bytes); + byteBuffer.order(ByteOrder.nativeOrder()); + msg.pack(byteBuffer); + return bytes; + } + + private StructNdMsg mNdmsg; + private InetAddress mDestination; + private byte[] mLinkLayerAddr; + private int mNumProbes; + private StructNdaCacheInfo mCacheInfo; + + private RtNetlinkNeighborMessage(StructNlMsgHdr header) { + super(header); + mNdmsg = null; + mDestination = null; + mLinkLayerAddr = null; + mNumProbes = 0; + mCacheInfo = null; + } + + public StructNdMsg getNdHeader() { + return mNdmsg; + } + + public InetAddress getDestination() { + return mDestination; + } + + public byte[] getLinkLayerAddress() { + return mLinkLayerAddr; + } + + public int getProbes() { + return mNumProbes; + } + + public StructNdaCacheInfo getCacheInfo() { + return mCacheInfo; + } + + public int getRequiredSpace() { + int spaceRequired = StructNlMsgHdr.STRUCT_SIZE + StructNdMsg.STRUCT_SIZE; + if (mDestination != null) { + spaceRequired += NetlinkConstants.alignedLengthOf( + StructNlAttr.NLA_HEADERLEN + mDestination.getAddress().length); + } + if (mLinkLayerAddr != null) { + spaceRequired += NetlinkConstants.alignedLengthOf( + StructNlAttr.NLA_HEADERLEN + mLinkLayerAddr.length); + } + // Currently we don't write messages with NDA_PROBES nor NDA_CACHEINFO + // attributes appended. Fix later, if necessary. + return spaceRequired; + } + + private static void packNlAttr(short nlType, byte[] nlValue, ByteBuffer byteBuffer) { + final StructNlAttr nlAttr = new StructNlAttr(); + nlAttr.nla_type = nlType; + nlAttr.nla_value = nlValue; + nlAttr.nla_len = (short) (StructNlAttr.NLA_HEADERLEN + nlAttr.nla_value.length); + nlAttr.pack(byteBuffer); + } + + public void pack(ByteBuffer byteBuffer) { + getHeader().pack(byteBuffer) ; + mNdmsg.pack(byteBuffer); + + if (mDestination != null) { + packNlAttr(NDA_DST, mDestination.getAddress(), byteBuffer); + } + if (mLinkLayerAddr != null) { + packNlAttr(NDA_LLADDR, mLinkLayerAddr, byteBuffer); + } + } + + @Override + public String toString() { + final String ipLiteral = (mDestination == null) ? "" : mDestination.getHostAddress(); + return "RtNetlinkNeighborMessage{ " + + "nlmsghdr{" + + (mHeader == null ? "" : mHeader.toString(OsConstants.NETLINK_ROUTE)) + "}, " + + "ndmsg{" + (mNdmsg == null ? "" : mNdmsg.toString()) + "}, " + + "destination{" + ipLiteral + "} " + + "linklayeraddr{" + NetlinkConstants.hexify(mLinkLayerAddr) + "} " + + "probes{" + mNumProbes + "} " + + "cacheinfo{" + (mCacheInfo == null ? "" : mCacheInfo.toString()) + "} " + + "}"; + } +}
diff --git a/common/netlinkclient/src/android/net/netlink/StructInetDiagMsg.java b/common/netlinkclient/src/android/net/netlink/StructInetDiagMsg.java new file mode 100644 index 0000000..5772a94 --- /dev/null +++ b/common/netlinkclient/src/android/net/netlink/StructInetDiagMsg.java
@@ -0,0 +1,59 @@ +/* + * 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.netlink; + +import java.nio.ByteBuffer; + +/** + * struct inet_diag_msg + * + * see <linux_src>/include/uapi/linux/inet_diag.h + * + * struct inet_diag_msg { + * __u8 idiag_family; + * __u8 idiag_state; + * __u8 idiag_timer; + * __u8 idiag_retrans; + * struct inet_diag_sockid id; + * __u32 idiag_expires; + * __u32 idiag_rqueue; + * __u32 idiag_wqueue; + * __u32 idiag_uid; + * __u32 idiag_inode; + * }; + * + * @hide + */ +public class StructInetDiagMsg { + public static final int STRUCT_SIZE = 4 + StructInetDiagSockId.STRUCT_SIZE + 20; + private static final int IDIAG_UID_OFFSET = StructNlMsgHdr.STRUCT_SIZE + 4 + + StructInetDiagSockId.STRUCT_SIZE + 12; + public int idiag_uid; + + public static StructInetDiagMsg parse(ByteBuffer byteBuffer) { + StructInetDiagMsg struct = new StructInetDiagMsg(); + struct.idiag_uid = byteBuffer.getInt(IDIAG_UID_OFFSET); + return struct; + } + + @Override + public String toString() { + return "StructInetDiagMsg{ " + + "idiag_uid{" + idiag_uid + "}, " + + "}"; + } +}
diff --git a/common/netlinkclient/src/android/net/netlink/StructInetDiagReqV2.java b/common/netlinkclient/src/android/net/netlink/StructInetDiagReqV2.java new file mode 100644 index 0000000..520f0ef --- /dev/null +++ b/common/netlinkclient/src/android/net/netlink/StructInetDiagReqV2.java
@@ -0,0 +1,97 @@ +/* + * 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.netlink; + +import android.annotation.Nullable; + +import java.net.InetSocketAddress; +import java.nio.ByteBuffer; + +/** + * struct inet_diag_req_v2 + * + * see <linux_src>/include/uapi/linux/inet_diag.h + * + * struct inet_diag_req_v2 { + * __u8 sdiag_family; + * __u8 sdiag_protocol; + * __u8 idiag_ext; + * __u8 pad; + * __u32 idiag_states; + * struct inet_diag_sockid id; + * }; + * + * @hide + */ +public class StructInetDiagReqV2 { + public static final int STRUCT_SIZE = 8 + StructInetDiagSockId.STRUCT_SIZE; + + private final byte mSdiagFamily; + private final byte mSdiagProtocol; + private final byte mIdiagExt; + private final byte mPad; + private final StructInetDiagSockId mId; + private final int mState; + public static final int INET_DIAG_REQ_V2_ALL_STATES = (int) 0xffffffff; + + public StructInetDiagReqV2(int protocol, InetSocketAddress local, InetSocketAddress remote, + int family) { + this(protocol, local, remote, family, 0 /* pad */, 0 /* extension */, + INET_DIAG_REQ_V2_ALL_STATES); + } + + public StructInetDiagReqV2(int protocol, @Nullable InetSocketAddress local, + @Nullable InetSocketAddress remote, int family, int pad, int extension, int state) + throws NullPointerException { + mSdiagFamily = (byte) family; + mSdiagProtocol = (byte) protocol; + // Request for all sockets if no specific socket is requested. Specify the local and remote + // socket address information for target request socket. + if ((local == null) != (remote == null)) { + throw new NullPointerException("Local and remote must be both null or both non-null"); + } + mId = ((local != null && remote != null) ? new StructInetDiagSockId(local, remote) : null); + mPad = (byte) pad; + mIdiagExt = (byte) extension; + mState = state; + } + + public void pack(ByteBuffer byteBuffer) { + // The ByteOrder must have already been set by the caller. + byteBuffer.put((byte) mSdiagFamily); + byteBuffer.put((byte) mSdiagProtocol); + byteBuffer.put((byte) mIdiagExt); + byteBuffer.put((byte) mPad); + byteBuffer.putInt(mState); + if (mId != null) mId.pack(byteBuffer); + } + + @Override + public String toString() { + final String familyStr = NetlinkConstants.stringForAddressFamily(mSdiagFamily); + final String protocolStr = NetlinkConstants.stringForAddressFamily(mSdiagProtocol); + + return "StructInetDiagReqV2{ " + + "sdiag_family{" + familyStr + "}, " + + "sdiag_protocol{" + protocolStr + "}, " + + "idiag_ext{" + mIdiagExt + ")}, " + + "pad{" + mPad + "}, " + + "idiag_states{" + Integer.toHexString(mState) + "}, " + + ((mId != null) ? mId.toString() : "inet_diag_sockid=null") + + "}"; + } +}
diff --git a/common/netlinkclient/src/android/net/netlink/StructInetDiagSockId.java b/common/netlinkclient/src/android/net/netlink/StructInetDiagSockId.java new file mode 100644 index 0000000..2e9fa25 --- /dev/null +++ b/common/netlinkclient/src/android/net/netlink/StructInetDiagSockId.java
@@ -0,0 +1,86 @@ +/* + * 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 android.net.netlink; + +import static java.nio.ByteOrder.BIG_ENDIAN; + +import java.net.Inet4Address; +import java.net.InetSocketAddress; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/** + * struct inet_diag_req_v2 + * + * see <linux_src>/include/uapi/linux/inet_diag.h + * + * struct inet_diag_sockid { + * __be16 idiag_sport; + * __be16 idiag_dport; + * __be32 idiag_src[4]; + * __be32 idiag_dst[4]; + * __u32 idiag_if; + * __u32 idiag_cookie[2]; + * #define INET_DIAG_NOCOOKIE (~0U) + * }; + * + * @hide + */ +public class StructInetDiagSockId { + public static final int STRUCT_SIZE = 48; + + private final InetSocketAddress mLocSocketAddress; + private final InetSocketAddress mRemSocketAddress; + private final byte[] INET_DIAG_NOCOOKIE = new byte[]{ + (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, + (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff}; + private final byte[] IPV4_PADDING = new byte[] {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + + public StructInetDiagSockId(InetSocketAddress loc, InetSocketAddress rem) { + mLocSocketAddress = loc; + mRemSocketAddress = rem; + } + + public void pack(ByteBuffer byteBuffer) { + byteBuffer.order(BIG_ENDIAN); + byteBuffer.putShort((short) mLocSocketAddress.getPort()); + byteBuffer.putShort((short) mRemSocketAddress.getPort()); + byteBuffer.put(mLocSocketAddress.getAddress().getAddress()); + if (mLocSocketAddress.getAddress() instanceof Inet4Address) { + byteBuffer.put(IPV4_PADDING); + } + byteBuffer.put(mRemSocketAddress.getAddress().getAddress()); + if (mRemSocketAddress.getAddress() instanceof Inet4Address) { + byteBuffer.put(IPV4_PADDING); + } + byteBuffer.order(ByteOrder.nativeOrder()); + byteBuffer.putInt(0); + byteBuffer.put(INET_DIAG_NOCOOKIE); + } + + @Override + public String toString() { + return "StructInetDiagSockId{ " + + "idiag_sport{" + mLocSocketAddress.getPort() + "}, " + + "idiag_dport{" + mRemSocketAddress.getPort() + "}, " + + "idiag_src{" + mLocSocketAddress.getAddress().getHostAddress() + "}, " + + "idiag_dst{" + mRemSocketAddress.getAddress().getHostAddress() + "}, " + + "idiag_if{" + 0 + "} " + + "idiag_cookie{INET_DIAG_NOCOOKIE}" + + "}"; + } +}
diff --git a/common/netlinkclient/src/android/net/netlink/StructNdMsg.java b/common/netlinkclient/src/android/net/netlink/StructNdMsg.java new file mode 100644 index 0000000..64364df --- /dev/null +++ b/common/netlinkclient/src/android/net/netlink/StructNdMsg.java
@@ -0,0 +1,165 @@ +/* + * 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.netlink; + +import android.system.OsConstants; +import java.nio.ByteBuffer; + + +/** + * struct ndmsg + * + * see: <linux_src>/include/uapi/linux/neighbour.h + * + * @hide + */ +public class StructNdMsg { + // Already aligned. + public static final int STRUCT_SIZE = 12; + + // Neighbor Cache Entry States + public static final short NUD_NONE = 0x00; + public static final short NUD_INCOMPLETE = 0x01; + public static final short NUD_REACHABLE = 0x02; + public static final short NUD_STALE = 0x04; + public static final short NUD_DELAY = 0x08; + public static final short NUD_PROBE = 0x10; + public static final short NUD_FAILED = 0x20; + public static final short NUD_NOARP = 0x40; + public static final short NUD_PERMANENT = 0x80; + + public static String stringForNudState(short nudState) { + switch (nudState) { + case NUD_NONE: return "NUD_NONE"; + case NUD_INCOMPLETE: return "NUD_INCOMPLETE"; + case NUD_REACHABLE: return "NUD_REACHABLE"; + case NUD_STALE: return "NUD_STALE"; + case NUD_DELAY: return "NUD_DELAY"; + case NUD_PROBE: return "NUD_PROBE"; + case NUD_FAILED: return "NUD_FAILED"; + case NUD_NOARP: return "NUD_NOARP"; + case NUD_PERMANENT: return "NUD_PERMANENT"; + default: + return "unknown NUD state: " + String.valueOf(nudState); + } + } + + public static boolean isNudStateConnected(short nudState) { + return ((nudState & (NUD_PERMANENT|NUD_NOARP|NUD_REACHABLE)) != 0); + } + + public static boolean isNudStateValid(short nudState) { + return (isNudStateConnected(nudState) || + ((nudState & (NUD_PROBE|NUD_STALE|NUD_DELAY)) != 0)); + } + + // Neighbor Cache Entry Flags + public static byte NTF_USE = (byte) 0x01; + public static byte NTF_SELF = (byte) 0x02; + public static byte NTF_MASTER = (byte) 0x04; + public static byte NTF_PROXY = (byte) 0x08; + public static byte NTF_ROUTER = (byte) 0x80; + + public static String stringForNudFlags(byte flags) { + final StringBuilder sb = new StringBuilder(); + if ((flags & NTF_USE) != 0) { + sb.append("NTF_USE"); + } + if ((flags & NTF_SELF) != 0) { + if (sb.length() > 0) { sb.append("|"); } + sb.append("NTF_SELF"); + } + if ((flags & NTF_MASTER) != 0) { + if (sb.length() > 0) { sb.append("|"); } + sb.append("NTF_MASTER"); + } + if ((flags & NTF_PROXY) != 0) { + if (sb.length() > 0) { sb.append("|"); + } + sb.append("NTF_PROXY"); } + if ((flags & NTF_ROUTER) != 0) { + if (sb.length() > 0) { sb.append("|"); } + sb.append("NTF_ROUTER"); + } + return sb.toString(); + } + + private static boolean hasAvailableSpace(ByteBuffer byteBuffer) { + return byteBuffer != null && byteBuffer.remaining() >= STRUCT_SIZE; + } + + public static StructNdMsg parse(ByteBuffer byteBuffer) { + if (!hasAvailableSpace(byteBuffer)) { return null; } + + // The ByteOrder must have already been set by the caller. In most + // cases ByteOrder.nativeOrder() is correct, with the possible + // exception of usage within unittests. + final StructNdMsg struct = new StructNdMsg(); + struct.ndm_family = byteBuffer.get(); + final byte pad1 = byteBuffer.get(); + final short pad2 = byteBuffer.getShort(); + struct.ndm_ifindex = byteBuffer.getInt(); + struct.ndm_state = byteBuffer.getShort(); + struct.ndm_flags = byteBuffer.get(); + struct.ndm_type = byteBuffer.get(); + return struct; + } + + public byte ndm_family; + public int ndm_ifindex; + public short ndm_state; + public byte ndm_flags; + public byte ndm_type; + + public StructNdMsg() { + ndm_family = (byte) OsConstants.AF_UNSPEC; + } + + public void pack(ByteBuffer byteBuffer) { + // The ByteOrder must have already been set by the caller. In most + // cases ByteOrder.nativeOrder() is correct, with the exception + // of usage within unittests. + byteBuffer.put(ndm_family); + byteBuffer.put((byte) 0); // pad1 + byteBuffer.putShort((short) 0); // pad2 + byteBuffer.putInt(ndm_ifindex); + byteBuffer.putShort(ndm_state); + byteBuffer.put(ndm_flags); + byteBuffer.put(ndm_type); + } + + public boolean nudConnected() { + return isNudStateConnected(ndm_state); + } + + public boolean nudValid() { + return isNudStateValid(ndm_state); + } + + @Override + public String toString() { + final String stateStr = "" + ndm_state + " (" + stringForNudState(ndm_state) + ")"; + final String flagsStr = "" + ndm_flags + " (" + stringForNudFlags(ndm_flags) + ")"; + return "StructNdMsg{ " + + "family{" + NetlinkConstants.stringForAddressFamily((int) ndm_family) + "}, " + + "ifindex{" + ndm_ifindex + "}, " + + "state{" + stateStr + "}, " + + "flags{" + flagsStr + "}, " + + "type{" + ndm_type + "} " + + "}"; + } +}
diff --git a/common/netlinkclient/src/android/net/netlink/StructNdOptPref64.java b/common/netlinkclient/src/android/net/netlink/StructNdOptPref64.java new file mode 100644 index 0000000..607aaba --- /dev/null +++ b/common/netlinkclient/src/android/net/netlink/StructNdOptPref64.java
@@ -0,0 +1,169 @@ +/* + * 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 android.net.netlink; + +import android.net.IpPrefix; +import android.util.Log; + +import androidx.annotation.NonNull; + +import java.net.Inet6Address; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.nio.ByteBuffer; +import java.util.Objects; + +/** + * The PREF64 router advertisement option. RFC 8781. + * + * 0 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Type | Length | Scaled Lifetime | PLC | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | | + * + + + * | Highest 96 bits of the Prefix | + * + + + * | | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * + */ +public class StructNdOptPref64 extends NdOption { + public static final int STRUCT_SIZE = 16; + public static final int TYPE = 38; + public static final byte LENGTH = 2; + + private static final String TAG = StructNdOptPref64.class.getSimpleName(); + + /** + * How many seconds the prefix is expected to remain valid. + * Valid values are from 0 to 65528 in multiples of 8. + */ + public final int lifetime; + /** The NAT64 prefix. */ + @NonNull public final IpPrefix prefix; + + static int plcToPrefixLength(int plc) { + switch (plc) { + case 0: return 96; + case 1: return 64; + case 2: return 56; + case 3: return 48; + case 4: return 40; + case 5: return 32; + default: + throw new IllegalArgumentException("Invalid prefix length code " + plc); + } + } + + static int prefixLengthToPlc(int prefixLength) { + switch (prefixLength) { + case 96: return 0; + case 64: return 1; + case 56: return 2; + case 48: return 3; + case 40: return 4; + case 32: return 5; + default: + throw new IllegalArgumentException("Invalid prefix length " + prefixLength); + } + } + + /** + * Returns the 2-byte "scaled lifetime and prefix length code" field: 13-bit lifetime, 3-bit PLC + */ + static short getScaledLifetimePlc(int lifetime, int prefixLengthCode) { + return (short) ((lifetime & 0xfff8) | (prefixLengthCode & 0x7)); + } + + public StructNdOptPref64(@NonNull IpPrefix prefix, int lifetime) { + super((byte) TYPE, LENGTH); + + Objects.requireNonNull(prefix, "prefix must not be null"); + if (!(prefix.getAddress() instanceof Inet6Address)) { + throw new IllegalArgumentException("Must be an IPv6 prefix: " + prefix); + } + prefixLengthToPlc(prefix.getPrefixLength()); // Throw if the prefix length is invalid. + this.prefix = prefix; + + if (lifetime < 0 || lifetime > 0xfff8) { + throw new IllegalArgumentException("Invalid lifetime " + lifetime); + } + this.lifetime = lifetime & 0xfff8; + } + + private StructNdOptPref64(@NonNull ByteBuffer buf) { + super(buf.get(), Byte.toUnsignedInt(buf.get())); + if (type != TYPE) throw new IllegalArgumentException("Invalid type " + type); + if (length != LENGTH) throw new IllegalArgumentException("Invalid length " + length); + + int scaledLifetimePlc = Short.toUnsignedInt(buf.getShort()); + lifetime = scaledLifetimePlc & 0xfff8; + + byte[] addressBytes = new byte[16]; + buf.get(addressBytes, 0, 12); + InetAddress addr; + try { + addr = InetAddress.getByAddress(addressBytes); + } catch (UnknownHostException e) { + throw new AssertionError("16-byte array not valid InetAddress?"); + } + prefix = new IpPrefix(addr, plcToPrefixLength(scaledLifetimePlc & 7)); + } + + /** + * Parses an option from a {@link ByteBuffer}. + * + * @param buf The buffer from which to parse the option. The buffer's byte order must be + * {@link java.nio.ByteOrder#BIG_ENDIAN}. + * @return the parsed option, or {@code null} if the option could not be parsed successfully + * (for example, if it was truncated, or if the prefix length code was wrong). + */ + public static StructNdOptPref64 parse(@NonNull ByteBuffer buf) { + if (buf == null || buf.remaining() < STRUCT_SIZE) return null; + try { + return new StructNdOptPref64(buf); + } catch (IllegalArgumentException e) { + // Not great, but better than throwing an exception that might crash the caller. + // Convention in this package is that null indicates that the option was truncated, so + // callers must already handle it. + Log.d(TAG, "Invalid PREF64 option: " + e); + return null; + } + } + + protected void writeToByteBuffer(ByteBuffer buf) { + super.writeToByteBuffer(buf); + buf.putShort(getScaledLifetimePlc(lifetime, prefixLengthToPlc(prefix.getPrefixLength()))); + buf.put(prefix.getRawAddress(), 0, 12); + } + + /** Outputs the wire format of the option to a new big-endian ByteBuffer. */ + public ByteBuffer toByteBuffer() { + ByteBuffer buf = ByteBuffer.allocate(STRUCT_SIZE); + writeToByteBuffer(buf); + buf.flip(); + return buf; + } + + @Override + @NonNull + public String toString() { + return String.format("NdOptPref64(%s, %d)", prefix, lifetime); + } +}
diff --git a/common/netlinkclient/src/android/net/netlink/StructNdaCacheInfo.java b/common/netlinkclient/src/android/net/netlink/StructNdaCacheInfo.java new file mode 100644 index 0000000..16cf563 --- /dev/null +++ b/common/netlinkclient/src/android/net/netlink/StructNdaCacheInfo.java
@@ -0,0 +1,117 @@ +/* + * Copyright (C) 2015 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.netlink; + +import android.system.Os; +import android.system.OsConstants; + +import java.nio.ByteBuffer; + + +/** + * struct nda_cacheinfo + * + * see: <linux_src>/include/uapi/linux/neighbour.h + * + * @hide + */ +public class StructNdaCacheInfo { + // Already aligned. + public static final int STRUCT_SIZE = 16; + + private static boolean hasAvailableSpace(ByteBuffer byteBuffer) { + return byteBuffer != null && byteBuffer.remaining() >= STRUCT_SIZE; + } + + public static StructNdaCacheInfo parse(ByteBuffer byteBuffer) { + if (!hasAvailableSpace(byteBuffer)) { return null; } + + // The ByteOrder must have already been set by the caller. In most + // cases ByteOrder.nativeOrder() is correct, with the possible + // exception of usage within unittests. + final StructNdaCacheInfo struct = new StructNdaCacheInfo(); + struct.ndm_used = byteBuffer.getInt(); + struct.ndm_confirmed = byteBuffer.getInt(); + struct.ndm_updated = byteBuffer.getInt(); + struct.ndm_refcnt = byteBuffer.getInt(); + return struct; + } + + // TODO: investigate whether this can change during device runtime and + // decide what (if anything) should be done about that. + private static final long CLOCK_TICKS_PER_SECOND = Os.sysconf(OsConstants._SC_CLK_TCK); + + private static long ticksToMilliSeconds(int intClockTicks) { + final long longClockTicks = (long) intClockTicks & 0xffffffff; + return (longClockTicks * 1000) / CLOCK_TICKS_PER_SECOND; + } + + /** + * Explanatory notes, for reference. + * + * Before being returned to user space, the neighbor entry times are + * converted to clock_t's like so: + * + * ndm_used = jiffies_to_clock_t(now - neigh->used); + * ndm_confirmed = jiffies_to_clock_t(now - neigh->confirmed); + * ndm_updated = jiffies_to_clock_t(now - neigh->updated); + * + * meaning that these values are expressed as "clock ticks ago". To + * convert these clock ticks to seconds divide by sysconf(_SC_CLK_TCK). + * When _SC_CLK_TCK is 100, for example, the ndm_* times are expressed + * in centiseconds. + * + * These values are unsigned, but fortunately being expressed as "some + * clock ticks ago", these values are typically very small (and + * 2^31 centiseconds = 248 days). + * + * By observation, it appears that: + * ndm_used: the last time ARP/ND took place for this neighbor + * ndm_confirmed: the last time ARP/ND succeeded for this neighbor OR + * higher layer confirmation (TCP or MSG_CONFIRM) + * was received + * ndm_updated: the time when the current NUD state was entered + */ + public int ndm_used; + public int ndm_confirmed; + public int ndm_updated; + public int ndm_refcnt; + + public StructNdaCacheInfo() {} + + public long lastUsed() { + return ticksToMilliSeconds(ndm_used); + } + + public long lastConfirmed() { + return ticksToMilliSeconds(ndm_confirmed); + } + + public long lastUpdated() { + return ticksToMilliSeconds(ndm_updated); + } + + @Override + public String toString() { + return "NdaCacheInfo{ " + + "ndm_used{" + lastUsed() + "}, " + + "ndm_confirmed{" + lastConfirmed() + "}, " + + "ndm_updated{" + lastUpdated() + "}, " + + "ndm_refcnt{" + ndm_refcnt + "} " + + "}"; + } +}
diff --git a/common/netlinkclient/src/android/net/netlink/StructNfGenMsg.java b/common/netlinkclient/src/android/net/netlink/StructNfGenMsg.java new file mode 100644 index 0000000..7f247f5 --- /dev/null +++ b/common/netlinkclient/src/android/net/netlink/StructNfGenMsg.java
@@ -0,0 +1,103 @@ +/* + * Copyright (C) 2017 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.netlink; + +import android.annotation.NonNull; +import android.annotation.Nullable; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.Objects; + + +/** + * struct nfgenmsg + * + * see <linux_src>/include/uapi/linux/netfilter/nfnetlink.h + * + * @hide + */ +public class StructNfGenMsg { + public static final int STRUCT_SIZE = 2 + Short.BYTES; + + public static final int NFNETLINK_V0 = 0; + + final public byte nfgen_family; + final public byte version; + final public short res_id; // N.B.: this is big endian in the kernel + + /** + * Parses a netfilter netlink header from a {@link ByteBuffer}. + * + * @param byteBuffer The buffer from which to parse the netfilter netlink header. + * @return the parsed netfilter netlink header, or {@code null} if the netfilter netlink header + * could not be parsed successfully (for example, if it was truncated). + */ + @Nullable + public static StructNfGenMsg parse(@NonNull ByteBuffer byteBuffer) { + Objects.requireNonNull(byteBuffer); + + if (!hasAvailableSpace(byteBuffer)) return null; + + final byte nfgen_family = byteBuffer.get(); + final byte version = byteBuffer.get(); + + final ByteOrder originalOrder = byteBuffer.order(); + byteBuffer.order(ByteOrder.BIG_ENDIAN); + final short res_id = byteBuffer.getShort(); + byteBuffer.order(originalOrder); + + return new StructNfGenMsg(nfgen_family, version, res_id); + } + + public StructNfGenMsg(byte family, byte ver, short id) { + nfgen_family = family; + version = ver; + res_id = id; + } + + public StructNfGenMsg(byte family) { + nfgen_family = family; + version = (byte) NFNETLINK_V0; + res_id = (short) 0; + } + + public void pack(ByteBuffer byteBuffer) { + byteBuffer.put(nfgen_family); + byteBuffer.put(version); + + final ByteOrder originalOrder = byteBuffer.order(); + byteBuffer.order(ByteOrder.BIG_ENDIAN); + byteBuffer.putShort(res_id); + byteBuffer.order(originalOrder); + } + + private static boolean hasAvailableSpace(@NonNull ByteBuffer byteBuffer) { + return byteBuffer.remaining() >= STRUCT_SIZE; + } + + @Override + public String toString() { + final String familyStr = NetlinkConstants.stringForAddressFamily(nfgen_family); + + return "NfGenMsg{ " + + "nfgen_family{" + familyStr + "}, " + + "version{" + Byte.toUnsignedInt(version) + "}, " + + "res_id{" + Short.toUnsignedInt(res_id) + "} " + + "}"; + } +}
diff --git a/common/netlinkclient/src/android/net/netlink/StructNlAttr.java b/common/netlinkclient/src/android/net/netlink/StructNlAttr.java new file mode 100644 index 0000000..b6e1d3f --- /dev/null +++ b/common/netlinkclient/src/android/net/netlink/StructNlAttr.java
@@ -0,0 +1,284 @@ +/* + * 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.netlink; + +import androidx.annotation.Nullable; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + + +/** + * struct nlattr + * + * see: <linux_src>/include/uapi/linux/netlink.h + * + * @hide + */ +public class StructNlAttr { + // Already aligned. + public static final int NLA_HEADERLEN = 4; + public static final int NLA_F_NESTED = (1 << 15); + + public static short makeNestedType(short type) { + return (short) (type | NLA_F_NESTED); + } + + // Return a (length, type) object only, without consuming any bytes in + // |byteBuffer| and without copying or interpreting any value bytes. + // This is used for scanning over a packed set of struct nlattr's, + // looking for instances of a particular type. + public static StructNlAttr peek(ByteBuffer byteBuffer) { + if (byteBuffer == null || byteBuffer.remaining() < NLA_HEADERLEN) { + return null; + } + final int baseOffset = byteBuffer.position(); + + final StructNlAttr struct = new StructNlAttr(); + final ByteOrder originalOrder = byteBuffer.order(); + byteBuffer.order(ByteOrder.nativeOrder()); + try { + struct.nla_len = byteBuffer.getShort(); + struct.nla_type = byteBuffer.getShort(); + } finally { + byteBuffer.order(originalOrder); + } + + byteBuffer.position(baseOffset); + if (struct.nla_len < NLA_HEADERLEN) { + // Malformed. + return null; + } + return struct; + } + + public static StructNlAttr parse(ByteBuffer byteBuffer) { + final StructNlAttr struct = peek(byteBuffer); + if (struct == null || byteBuffer.remaining() < struct.getAlignedLength()) { + return null; + } + + final int baseOffset = byteBuffer.position(); + byteBuffer.position(baseOffset + NLA_HEADERLEN); + + int valueLen = ((int) struct.nla_len) & 0xffff; + valueLen -= NLA_HEADERLEN; + if (valueLen > 0) { + struct.nla_value = new byte[valueLen]; + byteBuffer.get(struct.nla_value, 0, valueLen); + byteBuffer.position(baseOffset + struct.getAlignedLength()); + } + return struct; + } + + /** + * Find next netlink attribute with a given type from {@link ByteBuffer}. + * + * @param attrType The given netlink attribute type is requested for. + * @param byteBuffer The buffer from which to find the netlink attribute. + * @return the found netlink attribute, or {@code null} if the netlink attribute could not be + * found or parsed successfully (for example, if it was truncated). + */ + @Nullable + public static StructNlAttr findNextAttrOfType(short attrType, + @Nullable ByteBuffer byteBuffer) { + while (byteBuffer != null && byteBuffer.remaining() > 0) { + final StructNlAttr nlAttr = StructNlAttr.peek(byteBuffer); + if (nlAttr == null) { + break; + } + if (nlAttr.nla_type == attrType) { + return StructNlAttr.parse(byteBuffer); + } + if (byteBuffer.remaining() < nlAttr.getAlignedLength()) { + break; + } + byteBuffer.position(byteBuffer.position() + nlAttr.getAlignedLength()); + } + return null; + } + + public short nla_len = (short) NLA_HEADERLEN; + public short nla_type; + public byte[] nla_value; + + public StructNlAttr() {} + + public StructNlAttr(short type, byte value) { + nla_type = type; + setValue(new byte[1]); + nla_value[0] = value; + } + + public StructNlAttr(short type, short value) { + this(type, value, ByteOrder.nativeOrder()); + } + + public StructNlAttr(short type, short value, ByteOrder order) { + nla_type = type; + setValue(new byte[Short.BYTES]); + final ByteBuffer buf = getValueAsByteBuffer(); + final ByteOrder originalOrder = buf.order(); + try { + buf.order(order); + buf.putShort(value); + } finally { + buf.order(originalOrder); + } + } + + public StructNlAttr(short type, int value) { + this(type, value, ByteOrder.nativeOrder()); + } + + public StructNlAttr(short type, int value, ByteOrder order) { + nla_type = type; + setValue(new byte[Integer.BYTES]); + final ByteBuffer buf = getValueAsByteBuffer(); + final ByteOrder originalOrder = buf.order(); + try { + buf.order(order); + buf.putInt(value); + } finally { + buf.order(originalOrder); + } + } + + public StructNlAttr(short type, InetAddress ip) { + nla_type = type; + setValue(ip.getAddress()); + } + + public StructNlAttr(short type, StructNlAttr... nested) { + this(); + nla_type = makeNestedType(type); + + int payloadLength = 0; + for (StructNlAttr nla : nested) payloadLength += nla.getAlignedLength(); + setValue(new byte[payloadLength]); + + final ByteBuffer buf = getValueAsByteBuffer(); + for (StructNlAttr nla : nested) { + nla.pack(buf); + } + } + + public int getAlignedLength() { + return NetlinkConstants.alignedLengthOf(nla_len); + } + + /** + * Get attribute value as BE16. + */ + public short getValueAsBe16(short defaultValue) { + final ByteBuffer byteBuffer = getValueAsByteBuffer(); + if (byteBuffer == null || byteBuffer.remaining() != Short.BYTES) { + return defaultValue; + } + final ByteOrder originalOrder = byteBuffer.order(); + try { + byteBuffer.order(ByteOrder.BIG_ENDIAN); + return byteBuffer.getShort(); + } finally { + byteBuffer.order(originalOrder); + } + } + + public int getValueAsBe32(int defaultValue) { + final ByteBuffer byteBuffer = getValueAsByteBuffer(); + if (byteBuffer == null || byteBuffer.remaining() != Integer.BYTES) { + return defaultValue; + } + final ByteOrder originalOrder = byteBuffer.order(); + try { + byteBuffer.order(ByteOrder.BIG_ENDIAN); + return byteBuffer.getInt(); + } finally { + byteBuffer.order(originalOrder); + } + } + + public ByteBuffer getValueAsByteBuffer() { + if (nla_value == null) { return null; } + final ByteBuffer byteBuffer = ByteBuffer.wrap(nla_value); + // By convention, all buffers in this library are in native byte order because netlink is in + // native byte order. It's the order that is used by NetlinkSocket.recvMessage and the only + // order accepted by NetlinkMessage.parse. + byteBuffer.order(ByteOrder.nativeOrder()); + return byteBuffer; + } + + /** + * Get attribute value as byte. + */ + public byte getValueAsByte(byte defaultValue) { + final ByteBuffer byteBuffer = getValueAsByteBuffer(); + if (byteBuffer == null || byteBuffer.remaining() != Byte.BYTES) { + return defaultValue; + } + return getValueAsByteBuffer().get(); + } + + public int getValueAsInt(int defaultValue) { + final ByteBuffer byteBuffer = getValueAsByteBuffer(); + if (byteBuffer == null || byteBuffer.remaining() != Integer.BYTES) { + return defaultValue; + } + return getValueAsByteBuffer().getInt(); + } + + public InetAddress getValueAsInetAddress() { + if (nla_value == null) { return null; } + + try { + return InetAddress.getByAddress(nla_value); + } catch (UnknownHostException ignored) { + return null; + } + } + + public void pack(ByteBuffer byteBuffer) { + final ByteOrder originalOrder = byteBuffer.order(); + final int originalPosition = byteBuffer.position(); + + byteBuffer.order(ByteOrder.nativeOrder()); + try { + byteBuffer.putShort(nla_len); + byteBuffer.putShort(nla_type); + if (nla_value != null) byteBuffer.put(nla_value); + } finally { + byteBuffer.order(originalOrder); + } + byteBuffer.position(originalPosition + getAlignedLength()); + } + + private void setValue(byte[] value) { + nla_value = value; + nla_len = (short) (NLA_HEADERLEN + ((nla_value != null) ? nla_value.length : 0)); + } + + @Override + public String toString() { + return "StructNlAttr{ " + + "nla_len{" + nla_len + "}, " + + "nla_type{" + nla_type + "}, " + + "nla_value{" + NetlinkConstants.hexify(nla_value) + "}, " + + "}"; + } +}
diff --git a/common/netlinkclient/src/android/net/netlink/StructNlMsgErr.java b/common/netlinkclient/src/android/net/netlink/StructNlMsgErr.java new file mode 100644 index 0000000..9ea4364 --- /dev/null +++ b/common/netlinkclient/src/android/net/netlink/StructNlMsgErr.java
@@ -0,0 +1,68 @@ +/* + * 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.netlink; + +import java.nio.ByteBuffer; + + +/** + * struct nlmsgerr + * + * see <linux_src>/include/uapi/linux/netlink.h + * + * @hide + */ +public class StructNlMsgErr { + public static final int STRUCT_SIZE = Integer.BYTES + StructNlMsgHdr.STRUCT_SIZE; + + public static boolean hasAvailableSpace(ByteBuffer byteBuffer) { + return byteBuffer != null && byteBuffer.remaining() >= STRUCT_SIZE; + } + + public static StructNlMsgErr parse(ByteBuffer byteBuffer) { + if (!hasAvailableSpace(byteBuffer)) { return null; } + + // The ByteOrder must have already been set by the caller. In most + // cases ByteOrder.nativeOrder() is correct, with the exception + // of usage within unittests. + final StructNlMsgErr struct = new StructNlMsgErr(); + struct.error = byteBuffer.getInt(); + struct.msg = StructNlMsgHdr.parse(byteBuffer); + return struct; + } + + public int error; + public StructNlMsgHdr msg; + + public void pack(ByteBuffer byteBuffer) { + // The ByteOrder must have already been set by the caller. In most + // cases ByteOrder.nativeOrder() is correct, with the possible + // exception of usage within unittests. + byteBuffer.putInt(error); + if (msg != null) { + msg.pack(byteBuffer); + } + } + + @Override + public String toString() { + return "StructNlMsgErr{ " + + "error{" + error + "}, " + + "msg{" + (msg == null ? "" : msg.toString()) + "} " + + "}"; + } +}
diff --git a/common/netlinkclient/src/android/net/netlink/StructNlMsgHdr.java b/common/netlinkclient/src/android/net/netlink/StructNlMsgHdr.java new file mode 100644 index 0000000..55a649d --- /dev/null +++ b/common/netlinkclient/src/android/net/netlink/StructNlMsgHdr.java
@@ -0,0 +1,158 @@ +/* + * 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.netlink; + +import android.annotation.NonNull; +import android.annotation.Nullable; + +import java.nio.ByteBuffer; + + +/** + * struct nlmsghdr + * + * see <linux_src>/include/uapi/linux/netlink.h + * + * @hide + */ +public class StructNlMsgHdr { + // Already aligned. + public static final int STRUCT_SIZE = 16; + + public static final short NLM_F_REQUEST = 0x0001; + public static final short NLM_F_MULTI = 0x0002; + public static final short NLM_F_ACK = 0x0004; + public static final short NLM_F_ECHO = 0x0008; + // Flags for a GET request. + public static final short NLM_F_ROOT = 0x0100; + public static final short NLM_F_MATCH = 0x0200; + public static final short NLM_F_DUMP = NLM_F_ROOT|NLM_F_MATCH; + // Flags for a NEW request. + public static final short NLM_F_REPLACE = 0x100; + public static final short NLM_F_EXCL = 0x200; + public static final short NLM_F_CREATE = 0x400; + public static final short NLM_F_APPEND = 0x800; + + // TODO: Probably need to distinguish the flags which have the same value. For example, + // NLM_F_MATCH (0x200) and NLM_F_EXCL (0x200). + public static String stringForNlMsgFlags(short flags) { + final StringBuilder sb = new StringBuilder(); + if ((flags & NLM_F_REQUEST) != 0) { + sb.append("NLM_F_REQUEST"); + } + if ((flags & NLM_F_MULTI) != 0) { + if (sb.length() > 0) { sb.append("|"); } + sb.append("NLM_F_MULTI"); + } + if ((flags & NLM_F_ACK) != 0) { + if (sb.length() > 0) { sb.append("|"); } + sb.append("NLM_F_ACK"); + } + if ((flags & NLM_F_ECHO) != 0) { + if (sb.length() > 0) { sb.append("|"); } + sb.append("NLM_F_ECHO"); + } + if ((flags & NLM_F_ROOT) != 0) { + if (sb.length() > 0) { sb.append("|"); } + sb.append("NLM_F_ROOT"); + } + if ((flags & NLM_F_MATCH) != 0) { + if (sb.length() > 0) { sb.append("|"); } + sb.append("NLM_F_MATCH"); + } + return sb.toString(); + } + + public static boolean hasAvailableSpace(ByteBuffer byteBuffer) { + return byteBuffer != null && byteBuffer.remaining() >= STRUCT_SIZE; + } + + public static StructNlMsgHdr parse(ByteBuffer byteBuffer) { + if (!hasAvailableSpace(byteBuffer)) { return null; } + + // The ByteOrder must have already been set by the caller. In most + // cases ByteOrder.nativeOrder() is correct, with the exception + // of usage within unittests. + final StructNlMsgHdr struct = new StructNlMsgHdr(); + struct.nlmsg_len = byteBuffer.getInt(); + struct.nlmsg_type = byteBuffer.getShort(); + struct.nlmsg_flags = byteBuffer.getShort(); + struct.nlmsg_seq = byteBuffer.getInt(); + struct.nlmsg_pid = byteBuffer.getInt(); + + if (struct.nlmsg_len < STRUCT_SIZE) { + // Malformed. + return null; + } + return struct; + } + + public int nlmsg_len; + public short nlmsg_type; + public short nlmsg_flags; + public int nlmsg_seq; + public int nlmsg_pid; + + public StructNlMsgHdr() { + nlmsg_len = 0; + nlmsg_type = 0; + nlmsg_flags = 0; + nlmsg_seq = 0; + nlmsg_pid = 0; + } + + public void pack(ByteBuffer byteBuffer) { + // The ByteOrder must have already been set by the caller. In most + // cases ByteOrder.nativeOrder() is correct, with the possible + // exception of usage within unittests. + byteBuffer.putInt(nlmsg_len); + byteBuffer.putShort(nlmsg_type); + byteBuffer.putShort(nlmsg_flags); + byteBuffer.putInt(nlmsg_seq); + byteBuffer.putInt(nlmsg_pid); + } + + @Override + public String toString() { + return toString(null /* unknown netlink family */); + } + + /** + * Transform a netlink header into a string. The netlink family is required for transforming + * a netlink type integer into a string. + * @param nlFamily netlink family. Using Integer will not incur autoboxing penalties because + * family values are small, and all Integer objects between -128 and 127 are + * statically cached. See Integer.IntegerCache. + * @return A list of header elements. + */ + @NonNull + public String toString(@Nullable Integer nlFamily) { + final String typeStr = "" + nlmsg_type + + "(" + (nlFamily == null + ? "" : NetlinkConstants.stringForNlMsgType(nlmsg_type, nlFamily)) + + ")"; + final String flagsStr = "" + nlmsg_flags + + "(" + stringForNlMsgFlags(nlmsg_flags) + ")"; + return "StructNlMsgHdr{ " + + "nlmsg_len{" + nlmsg_len + "}, " + + "nlmsg_type{" + typeStr + "}, " + + "nlmsg_flags{" + flagsStr + ")}, " + + "nlmsg_seq{" + nlmsg_seq + "}, " + + "nlmsg_pid{" + nlmsg_pid + "} " + + "}"; + } +}
diff --git a/common/networkstackclient/Android.bp b/common/networkstackclient/Android.bp index c344d07..96ff315 100644 --- a/common/networkstackclient/Android.bp +++ b/common/networkstackclient/Android.bp
@@ -72,7 +72,7 @@ // For framework parcelables. "frameworks/base/core/java", // For API parcelables in connectivity - "packages/modules/Connectivity/framework/aidl-export", + "frameworks/base/packages/Connectivity/framework/aidl-export", "frameworks/native/aidl/binder", // For PersistableBundle.aidl ], srcs: [ @@ -121,7 +121,7 @@ enabled: false, }, }, - imports: ["ipmemorystore-aidl-interfaces-V10"], + imports: ["ipmemorystore-aidl-interfaces"], versions: [ "1", "2", @@ -133,8 +133,6 @@ "8", "9", "10", - "11", - "12", ], // TODO: have tethering depend on networkstack-client and set visibility to private visibility: [ @@ -147,34 +145,25 @@ java_library { name: "networkstack-client", sdk_version: "system_current", - // this is part of updatable modules(NetworkStack) which runs on Q and above + // this is part of updatable modules(NetworkStack) which targets 29(Q) min_sdk_version: "29", srcs: [ ":framework-annotations", - "src/android/net/ip/**/*.java", - "src/android/net/IpMemoryStore.java", "src/android/net/IpMemoryStoreClient.java", "src/android/net/ipmemorystore/**/*.java", - "src/android/net/NetworkMonitorManager.java", "src/android/net/networkstack/**/*.java", "src/android/net/networkstack/aidl/quirks/**/*.java", "src/android/net/shared/**/*.java", - "src/android/net/util/**/*.java", - ], - libs: [ - "net-utils-framework-common", // XXX for IpUtils.java only ], static_libs: [ "ipmemorystore-aidl-interfaces-V10-java", - "networkstack-aidl-interfaces-V12-java", + "networkstack-aidl-interfaces-V10-java", ], visibility: [ - "//frameworks/base/packages/Connectivity/service", + "//frameworks/base/packages/Tethering", "//packages/modules/Connectivity/Tethering", - "//packages/modules/Connectivity/service", "//frameworks/base/services/net", "//frameworks/opt/net/wifi/service", - "//packages/apps/Bluetooth", "//packages/modules/NetworkStack", ], apex_available: [
diff --git a/common/networkstackclient/aidl_api/ipmemorystore-aidl-interfaces/current/android/net/IIpMemoryStore.aidl b/common/networkstackclient/aidl_api/ipmemorystore-aidl-interfaces/current/android/net/IIpMemoryStore.aidl index 048e84c..bf7a26d 100644 --- a/common/networkstackclient/aidl_api/ipmemorystore-aidl-interfaces/current/android/net/IIpMemoryStore.aidl +++ b/common/networkstackclient/aidl_api/ipmemorystore-aidl-interfaces/current/android/net/IIpMemoryStore.aidl
@@ -1,30 +1,14 @@ -/* - * 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. - */ /////////////////////////////////////////////////////////////////////////////// // THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // /////////////////////////////////////////////////////////////////////////////// -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. +// This file is a snapshot of an AIDL interface (or parcelable). Do not try to +// edit this file. It looks like you are doing that because you have modified +// an AIDL interface in a backward-incompatible way, e.g., deleting a function +// from an interface or a field from a parcelable and it broke the build. That +// breakage is intended. // -// You must not make a backward incompatible change to any AIDL file built +// You must not make a backward incompatible changes to the AIDL files built // with the aidl_interface module type with versions property set. The module // type is used to build AIDL files in a way that they can be used across // independently updatable components of the system. If a device is shipped
diff --git a/common/networkstackclient/aidl_api/ipmemorystore-aidl-interfaces/current/android/net/IIpMemoryStoreCallbacks.aidl b/common/networkstackclient/aidl_api/ipmemorystore-aidl-interfaces/current/android/net/IIpMemoryStoreCallbacks.aidl index 7dbbc98..2024391 100644 --- a/common/networkstackclient/aidl_api/ipmemorystore-aidl-interfaces/current/android/net/IIpMemoryStoreCallbacks.aidl +++ b/common/networkstackclient/aidl_api/ipmemorystore-aidl-interfaces/current/android/net/IIpMemoryStoreCallbacks.aidl
@@ -1,30 +1,14 @@ -/* - * 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. - */ /////////////////////////////////////////////////////////////////////////////// // THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // /////////////////////////////////////////////////////////////////////////////// -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. +// This file is a snapshot of an AIDL interface (or parcelable). Do not try to +// edit this file. It looks like you are doing that because you have modified +// an AIDL interface in a backward-incompatible way, e.g., deleting a function +// from an interface or a field from a parcelable and it broke the build. That +// breakage is intended. // -// You must not make a backward incompatible change to any AIDL file built +// You must not make a backward incompatible changes to the AIDL files built // with the aidl_interface module type with versions property set. The module // type is used to build AIDL files in a way that they can be used across // independently updatable components of the system. If a device is shipped
diff --git a/common/networkstackclient/aidl_api/ipmemorystore-aidl-interfaces/current/android/net/ipmemorystore/Blob.aidl b/common/networkstackclient/aidl_api/ipmemorystore-aidl-interfaces/current/android/net/ipmemorystore/Blob.aidl index 4300c83..8a1b57e 100644 --- a/common/networkstackclient/aidl_api/ipmemorystore-aidl-interfaces/current/android/net/ipmemorystore/Blob.aidl +++ b/common/networkstackclient/aidl_api/ipmemorystore-aidl-interfaces/current/android/net/ipmemorystore/Blob.aidl
@@ -1,30 +1,14 @@ -/* - * 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. - */ /////////////////////////////////////////////////////////////////////////////// // THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // /////////////////////////////////////////////////////////////////////////////// -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. +// This file is a snapshot of an AIDL interface (or parcelable). Do not try to +// edit this file. It looks like you are doing that because you have modified +// an AIDL interface in a backward-incompatible way, e.g., deleting a function +// from an interface or a field from a parcelable and it broke the build. That +// breakage is intended. // -// You must not make a backward incompatible change to any AIDL file built +// You must not make a backward incompatible changes to the AIDL files built // with the aidl_interface module type with versions property set. The module // type is used to build AIDL files in a way that they can be used across // independently updatable components of the system. If a device is shipped
diff --git a/common/networkstackclient/aidl_api/ipmemorystore-aidl-interfaces/current/android/net/ipmemorystore/IOnBlobRetrievedListener.aidl b/common/networkstackclient/aidl_api/ipmemorystore-aidl-interfaces/current/android/net/ipmemorystore/IOnBlobRetrievedListener.aidl index 3a263e2..e711272 100644 --- a/common/networkstackclient/aidl_api/ipmemorystore-aidl-interfaces/current/android/net/ipmemorystore/IOnBlobRetrievedListener.aidl +++ b/common/networkstackclient/aidl_api/ipmemorystore-aidl-interfaces/current/android/net/ipmemorystore/IOnBlobRetrievedListener.aidl
@@ -1,30 +1,14 @@ -/* - * 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. - */ /////////////////////////////////////////////////////////////////////////////// // THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // /////////////////////////////////////////////////////////////////////////////// -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. +// This file is a snapshot of an AIDL interface (or parcelable). Do not try to +// edit this file. It looks like you are doing that because you have modified +// an AIDL interface in a backward-incompatible way, e.g., deleting a function +// from an interface or a field from a parcelable and it broke the build. That +// breakage is intended. // -// You must not make a backward incompatible change to any AIDL file built +// You must not make a backward incompatible changes to the AIDL files built // with the aidl_interface module type with versions property set. The module // type is used to build AIDL files in a way that they can be used across // independently updatable components of the system. If a device is shipped
diff --git a/common/networkstackclient/aidl_api/ipmemorystore-aidl-interfaces/current/android/net/ipmemorystore/IOnL2KeyResponseListener.aidl b/common/networkstackclient/aidl_api/ipmemorystore-aidl-interfaces/current/android/net/ipmemorystore/IOnL2KeyResponseListener.aidl index c663ccf..4abecb9 100644 --- a/common/networkstackclient/aidl_api/ipmemorystore-aidl-interfaces/current/android/net/ipmemorystore/IOnL2KeyResponseListener.aidl +++ b/common/networkstackclient/aidl_api/ipmemorystore-aidl-interfaces/current/android/net/ipmemorystore/IOnL2KeyResponseListener.aidl
@@ -1,30 +1,14 @@ -/* - * 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. - */ /////////////////////////////////////////////////////////////////////////////// // THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // /////////////////////////////////////////////////////////////////////////////// -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. +// This file is a snapshot of an AIDL interface (or parcelable). Do not try to +// edit this file. It looks like you are doing that because you have modified +// an AIDL interface in a backward-incompatible way, e.g., deleting a function +// from an interface or a field from a parcelable and it broke the build. That +// breakage is intended. // -// You must not make a backward incompatible change to any AIDL file built +// You must not make a backward incompatible changes to the AIDL files built // with the aidl_interface module type with versions property set. The module // type is used to build AIDL files in a way that they can be used across // independently updatable components of the system. If a device is shipped
diff --git a/common/networkstackclient/aidl_api/ipmemorystore-aidl-interfaces/current/android/net/ipmemorystore/IOnNetworkAttributesRetrievedListener.aidl b/common/networkstackclient/aidl_api/ipmemorystore-aidl-interfaces/current/android/net/ipmemorystore/IOnNetworkAttributesRetrievedListener.aidl index 3740e15..05c48b3 100644 --- a/common/networkstackclient/aidl_api/ipmemorystore-aidl-interfaces/current/android/net/ipmemorystore/IOnNetworkAttributesRetrievedListener.aidl +++ b/common/networkstackclient/aidl_api/ipmemorystore-aidl-interfaces/current/android/net/ipmemorystore/IOnNetworkAttributesRetrievedListener.aidl
@@ -1,30 +1,14 @@ -/* - * 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. - */ /////////////////////////////////////////////////////////////////////////////// // THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // /////////////////////////////////////////////////////////////////////////////// -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. +// This file is a snapshot of an AIDL interface (or parcelable). Do not try to +// edit this file. It looks like you are doing that because you have modified +// an AIDL interface in a backward-incompatible way, e.g., deleting a function +// from an interface or a field from a parcelable and it broke the build. That +// breakage is intended. // -// You must not make a backward incompatible change to any AIDL file built +// You must not make a backward incompatible changes to the AIDL files built // with the aidl_interface module type with versions property set. The module // type is used to build AIDL files in a way that they can be used across // independently updatable components of the system. If a device is shipped
diff --git a/common/networkstackclient/aidl_api/ipmemorystore-aidl-interfaces/current/android/net/ipmemorystore/IOnSameL3NetworkResponseListener.aidl b/common/networkstackclient/aidl_api/ipmemorystore-aidl-interfaces/current/android/net/ipmemorystore/IOnSameL3NetworkResponseListener.aidl index 9d87fbb..0bc8c5e 100644 --- a/common/networkstackclient/aidl_api/ipmemorystore-aidl-interfaces/current/android/net/ipmemorystore/IOnSameL3NetworkResponseListener.aidl +++ b/common/networkstackclient/aidl_api/ipmemorystore-aidl-interfaces/current/android/net/ipmemorystore/IOnSameL3NetworkResponseListener.aidl
@@ -1,30 +1,14 @@ -/* - * 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. - */ /////////////////////////////////////////////////////////////////////////////// // THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // /////////////////////////////////////////////////////////////////////////////// -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. +// This file is a snapshot of an AIDL interface (or parcelable). Do not try to +// edit this file. It looks like you are doing that because you have modified +// an AIDL interface in a backward-incompatible way, e.g., deleting a function +// from an interface or a field from a parcelable and it broke the build. That +// breakage is intended. // -// You must not make a backward incompatible change to any AIDL file built +// You must not make a backward incompatible changes to the AIDL files built // with the aidl_interface module type with versions property set. The module // type is used to build AIDL files in a way that they can be used across // independently updatable components of the system. If a device is shipped
diff --git a/common/networkstackclient/aidl_api/ipmemorystore-aidl-interfaces/current/android/net/ipmemorystore/IOnStatusAndCountListener.aidl b/common/networkstackclient/aidl_api/ipmemorystore-aidl-interfaces/current/android/net/ipmemorystore/IOnStatusAndCountListener.aidl index 1e6a41c..cf30fa1 100644 --- a/common/networkstackclient/aidl_api/ipmemorystore-aidl-interfaces/current/android/net/ipmemorystore/IOnStatusAndCountListener.aidl +++ b/common/networkstackclient/aidl_api/ipmemorystore-aidl-interfaces/current/android/net/ipmemorystore/IOnStatusAndCountListener.aidl
@@ -1,30 +1,14 @@ -/* - * 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. - */ /////////////////////////////////////////////////////////////////////////////// // THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // /////////////////////////////////////////////////////////////////////////////// -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. +// This file is a snapshot of an AIDL interface (or parcelable). Do not try to +// edit this file. It looks like you are doing that because you have modified +// an AIDL interface in a backward-incompatible way, e.g., deleting a function +// from an interface or a field from a parcelable and it broke the build. That +// breakage is intended. // -// You must not make a backward incompatible change to any AIDL file built +// You must not make a backward incompatible changes to the AIDL files built // with the aidl_interface module type with versions property set. The module // type is used to build AIDL files in a way that they can be used across // independently updatable components of the system. If a device is shipped
diff --git a/common/networkstackclient/aidl_api/ipmemorystore-aidl-interfaces/current/android/net/ipmemorystore/IOnStatusListener.aidl b/common/networkstackclient/aidl_api/ipmemorystore-aidl-interfaces/current/android/net/ipmemorystore/IOnStatusListener.aidl index dccdf27..e71de47 100644 --- a/common/networkstackclient/aidl_api/ipmemorystore-aidl-interfaces/current/android/net/ipmemorystore/IOnStatusListener.aidl +++ b/common/networkstackclient/aidl_api/ipmemorystore-aidl-interfaces/current/android/net/ipmemorystore/IOnStatusListener.aidl
@@ -1,30 +1,14 @@ -/* - * 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. - */ /////////////////////////////////////////////////////////////////////////////// // THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // /////////////////////////////////////////////////////////////////////////////// -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. +// This file is a snapshot of an AIDL interface (or parcelable). Do not try to +// edit this file. It looks like you are doing that because you have modified +// an AIDL interface in a backward-incompatible way, e.g., deleting a function +// from an interface or a field from a parcelable and it broke the build. That +// breakage is intended. // -// You must not make a backward incompatible change to any AIDL file built +// You must not make a backward incompatible changes to the AIDL files built // with the aidl_interface module type with versions property set. The module // type is used to build AIDL files in a way that they can be used across // independently updatable components of the system. If a device is shipped
diff --git a/common/networkstackclient/aidl_api/ipmemorystore-aidl-interfaces/current/android/net/ipmemorystore/NetworkAttributesParcelable.aidl b/common/networkstackclient/aidl_api/ipmemorystore-aidl-interfaces/current/android/net/ipmemorystore/NetworkAttributesParcelable.aidl index 227785d..2ac7644 100644 --- a/common/networkstackclient/aidl_api/ipmemorystore-aidl-interfaces/current/android/net/ipmemorystore/NetworkAttributesParcelable.aidl +++ b/common/networkstackclient/aidl_api/ipmemorystore-aidl-interfaces/current/android/net/ipmemorystore/NetworkAttributesParcelable.aidl
@@ -1,30 +1,14 @@ -/* - * 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. - */ /////////////////////////////////////////////////////////////////////////////// // THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // /////////////////////////////////////////////////////////////////////////////// -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. +// This file is a snapshot of an AIDL interface (or parcelable). Do not try to +// edit this file. It looks like you are doing that because you have modified +// an AIDL interface in a backward-incompatible way, e.g., deleting a function +// from an interface or a field from a parcelable and it broke the build. That +// breakage is intended. // -// You must not make a backward incompatible change to any AIDL file built +// You must not make a backward incompatible changes to the AIDL files built // with the aidl_interface module type with versions property set. The module // type is used to build AIDL files in a way that they can be used across // independently updatable components of the system. If a device is shipped
diff --git a/common/networkstackclient/aidl_api/ipmemorystore-aidl-interfaces/current/android/net/ipmemorystore/SameL3NetworkResponseParcelable.aidl b/common/networkstackclient/aidl_api/ipmemorystore-aidl-interfaces/current/android/net/ipmemorystore/SameL3NetworkResponseParcelable.aidl index 377a3ec..42a1feb 100644 --- a/common/networkstackclient/aidl_api/ipmemorystore-aidl-interfaces/current/android/net/ipmemorystore/SameL3NetworkResponseParcelable.aidl +++ b/common/networkstackclient/aidl_api/ipmemorystore-aidl-interfaces/current/android/net/ipmemorystore/SameL3NetworkResponseParcelable.aidl
@@ -1,30 +1,14 @@ -/* - * 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. - */ /////////////////////////////////////////////////////////////////////////////// // THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // /////////////////////////////////////////////////////////////////////////////// -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. +// This file is a snapshot of an AIDL interface (or parcelable). Do not try to +// edit this file. It looks like you are doing that because you have modified +// an AIDL interface in a backward-incompatible way, e.g., deleting a function +// from an interface or a field from a parcelable and it broke the build. That +// breakage is intended. // -// You must not make a backward incompatible change to any AIDL file built +// You must not make a backward incompatible changes to the AIDL files built // with the aidl_interface module type with versions property set. The module // type is used to build AIDL files in a way that they can be used across // independently updatable components of the system. If a device is shipped
diff --git a/common/networkstackclient/aidl_api/ipmemorystore-aidl-interfaces/current/android/net/ipmemorystore/StatusParcelable.aidl b/common/networkstackclient/aidl_api/ipmemorystore-aidl-interfaces/current/android/net/ipmemorystore/StatusParcelable.aidl index 59b96cd..1bea082 100644 --- a/common/networkstackclient/aidl_api/ipmemorystore-aidl-interfaces/current/android/net/ipmemorystore/StatusParcelable.aidl +++ b/common/networkstackclient/aidl_api/ipmemorystore-aidl-interfaces/current/android/net/ipmemorystore/StatusParcelable.aidl
@@ -1,30 +1,14 @@ -/* - * 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. - */ /////////////////////////////////////////////////////////////////////////////// // THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // /////////////////////////////////////////////////////////////////////////////// -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. +// This file is a snapshot of an AIDL interface (or parcelable). Do not try to +// edit this file. It looks like you are doing that because you have modified +// an AIDL interface in a backward-incompatible way, e.g., deleting a function +// from an interface or a field from a parcelable and it broke the build. That +// breakage is intended. // -// You must not make a backward incompatible change to any AIDL file built +// You must not make a backward incompatible changes to the AIDL files built // with the aidl_interface module type with versions property set. The module // type is used to build AIDL files in a way that they can be used across // independently updatable components of the system. If a device is shipped
diff --git a/common/networkstackclient/aidl_api/ipmemorystore-aidl-interfaces/current/android/net/networkstack/aidl/quirks/IPv6ProvisioningLossQuirkParcelable.aidl b/common/networkstackclient/aidl_api/ipmemorystore-aidl-interfaces/current/android/net/networkstack/aidl/quirks/IPv6ProvisioningLossQuirkParcelable.aidl index c01564b..e2ecbb4 100644 --- a/common/networkstackclient/aidl_api/ipmemorystore-aidl-interfaces/current/android/net/networkstack/aidl/quirks/IPv6ProvisioningLossQuirkParcelable.aidl +++ b/common/networkstackclient/aidl_api/ipmemorystore-aidl-interfaces/current/android/net/networkstack/aidl/quirks/IPv6ProvisioningLossQuirkParcelable.aidl
@@ -1,30 +1,14 @@ -/* - * 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. - */ /////////////////////////////////////////////////////////////////////////////// // THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // /////////////////////////////////////////////////////////////////////////////// -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. +// This file is a snapshot of an AIDL interface (or parcelable). Do not try to +// edit this file. It looks like you are doing that because you have modified +// an AIDL interface in a backward-incompatible way, e.g., deleting a function +// from an interface or a field from a parcelable and it broke the build. That +// breakage is intended. // -// You must not make a backward incompatible change to any AIDL file built +// You must not make a backward incompatible changes to the AIDL files built // with the aidl_interface module type with versions property set. The module // type is used to build AIDL files in a way that they can be used across // independently updatable components of the system. If a device is shipped
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/.hash b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/.hash deleted file mode 100644 index 2914d2a..0000000 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/.hash +++ /dev/null
@@ -1 +0,0 @@ -7fecd0a7a6d978705afad88c5e492613cc46e2cb
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/DataStallReportParcelable.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/DataStallReportParcelable.aidl deleted file mode 100644 index 771deda..0000000 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/DataStallReportParcelable.aidl +++ /dev/null
@@ -1,42 +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 perNmissions and - * limitations under the License. - */ -/////////////////////////////////////////////////////////////////////////////// -// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // -/////////////////////////////////////////////////////////////////////////////// - -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. -// -// You must not make a backward incompatible change to any AIDL file built -// with the aidl_interface module type with versions property set. The module -// type is used to build AIDL files in a way that they can be used across -// independently updatable components of the system. If a device is shipped -// with such a backward incompatible change, it has a high risk of breaking -// later when a module using the interface is updated, e.g., Mainline modules. - -package android.net; -@JavaDerive(toString=true) -parcelable DataStallReportParcelable { - long timestampMillis = 0; - int detectionMethod = 1; - int tcpPacketFailRate = 2; - int tcpMetricsCollectionPeriodMillis = 3; - int dnsConsecutiveTimeouts = 4; -}
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/DhcpResultsParcelable.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/DhcpResultsParcelable.aidl deleted file mode 100644 index 31f2194..0000000 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/DhcpResultsParcelable.aidl +++ /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 perNmissions and - * limitations under the License. - */ -/////////////////////////////////////////////////////////////////////////////// -// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // -/////////////////////////////////////////////////////////////////////////////// - -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. -// -// You must not make a backward incompatible change to any AIDL file built -// with the aidl_interface module type with versions property set. The module -// type is used to build AIDL files in a way that they can be used across -// independently updatable components of the system. If a device is shipped -// with such a backward incompatible change, it has a high risk of breaking -// later when a module using the interface is updated, e.g., Mainline modules. - -package android.net; -@JavaDerive(toString=true) -parcelable DhcpResultsParcelable { - android.net.StaticIpConfiguration baseConfiguration; - int leaseDuration; - int mtu; - String serverAddress; - String vendorInfo; - @nullable String serverHostName; - @nullable String captivePortalApiUrl; -}
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/INetworkMonitor.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/INetworkMonitor.aidl deleted file mode 100644 index d92196d..0000000 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/INetworkMonitor.aidl +++ /dev/null
@@ -1,59 +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 perNmissions and - * limitations under the License. - */ -/////////////////////////////////////////////////////////////////////////////// -// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // -/////////////////////////////////////////////////////////////////////////////// - -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. -// -// You must not make a backward incompatible change to any AIDL file built -// with the aidl_interface module type with versions property set. The module -// type is used to build AIDL files in a way that they can be used across -// independently updatable components of the system. If a device is shipped -// with such a backward incompatible change, it has a high risk of breaking -// later when a module using the interface is updated, e.g., Mainline modules. - -package android.net; -/* @hide */ -interface INetworkMonitor { - oneway void start(); - oneway void launchCaptivePortalApp(); - oneway void notifyCaptivePortalAppFinished(int response); - oneway void setAcceptPartialConnectivity(); - oneway void forceReevaluation(int uid); - oneway void notifyPrivateDnsChanged(in android.net.PrivateDnsConfigParcel config); - oneway void notifyDnsResponse(int returnCode); - oneway void notifyNetworkConnected(in android.net.LinkProperties lp, in android.net.NetworkCapabilities nc); - oneway void notifyNetworkDisconnected(); - oneway void notifyLinkPropertiesChanged(in android.net.LinkProperties lp); - oneway void notifyNetworkCapabilitiesChanged(in android.net.NetworkCapabilities nc); - const int NETWORK_TEST_RESULT_VALID = 0; - const int NETWORK_TEST_RESULT_INVALID = 1; - const int NETWORK_TEST_RESULT_PARTIAL_CONNECTIVITY = 2; - const int NETWORK_VALIDATION_RESULT_VALID = 1; - const int NETWORK_VALIDATION_RESULT_PARTIAL = 2; - const int NETWORK_VALIDATION_RESULT_SKIPPED = 4; - const int NETWORK_VALIDATION_PROBE_DNS = 4; - const int NETWORK_VALIDATION_PROBE_HTTP = 8; - const int NETWORK_VALIDATION_PROBE_HTTPS = 16; - const int NETWORK_VALIDATION_PROBE_FALLBACK = 32; - const int NETWORK_VALIDATION_PROBE_PRIVDNS = 64; -}
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/INetworkMonitorCallbacks.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/INetworkMonitorCallbacks.aidl deleted file mode 100644 index 36eda8e..0000000 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/INetworkMonitorCallbacks.aidl +++ /dev/null
@@ -1,46 +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. - */ -/////////////////////////////////////////////////////////////////////////////// -// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // -/////////////////////////////////////////////////////////////////////////////// - -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. -// -// You must not make a backward incompatible change to any AIDL file built -// with the aidl_interface module type with versions property set. The module -// type is used to build AIDL files in a way that they can be used across -// independently updatable components of the system. If a device is shipped -// with such a backward incompatible change, it has a high risk of breaking -// later when a module using the interface is updated, e.g., Mainline modules. - -package android.net; -/* @hide */ -interface INetworkMonitorCallbacks { - oneway void onNetworkMonitorCreated(in android.net.INetworkMonitor networkMonitor) = 0; - oneway void notifyNetworkTested(int testResult, @nullable String redirectUrl) = 1; - oneway void notifyPrivateDnsConfigResolved(in android.net.PrivateDnsConfigParcel config) = 2; - oneway void showProvisioningNotification(String action, String packageName) = 3; - oneway void hideProvisioningNotification() = 4; - oneway void notifyProbeStatusChanged(int probesCompleted, int probesSucceeded) = 5; - oneway void notifyNetworkTestedWithExtras(in android.net.NetworkTestResultParcelable result) = 6; - oneway void notifyDataStallSuspected(in android.net.DataStallReportParcelable report) = 7; - oneway void notifyCaptivePortalDataChanged(in android.net.CaptivePortalData data) = 8; -}
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/INetworkStackConnector.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/INetworkStackConnector.aidl deleted file mode 100644 index 8120ffc..0000000 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/INetworkStackConnector.aidl +++ /dev/null
@@ -1,42 +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 perNmissions and - * limitations under the License. - */ -/////////////////////////////////////////////////////////////////////////////// -// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // -/////////////////////////////////////////////////////////////////////////////// - -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. -// -// You must not make a backward incompatible change to any AIDL file built -// with the aidl_interface module type with versions property set. The module -// type is used to build AIDL files in a way that they can be used across -// independently updatable components of the system. If a device is shipped -// with such a backward incompatible change, it has a high risk of breaking -// later when a module using the interface is updated, e.g., Mainline modules. - -package android.net; -/* @hide */ -interface INetworkStackConnector { - oneway void makeDhcpServer(in String ifName, in android.net.dhcp.DhcpServingParamsParcel params, in android.net.dhcp.IDhcpServerCallbacks cb); - oneway void makeNetworkMonitor(in android.net.Network network, String name, in android.net.INetworkMonitorCallbacks cb); - oneway void makeIpClient(in String ifName, in android.net.ip.IIpClientCallbacks callbacks); - oneway void fetchIpMemoryStore(in android.net.IIpMemoryStoreCallbacks cb); - oneway void allowTestUid(int uid, in android.net.INetworkStackStatusCallback cb); -}
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/INetworkStackStatusCallback.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/INetworkStackStatusCallback.aidl deleted file mode 100644 index 0b6b778..0000000 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/INetworkStackStatusCallback.aidl +++ /dev/null
@@ -1,38 +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. - */ -/////////////////////////////////////////////////////////////////////////////// -// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // -/////////////////////////////////////////////////////////////////////////////// - -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. -// -// You must not make a backward incompatible change to any AIDL file built -// with the aidl_interface module type with versions property set. The module -// type is used to build AIDL files in a way that they can be used across -// independently updatable components of the system. If a device is shipped -// with such a backward incompatible change, it has a high risk of breaking -// later when a module using the interface is updated, e.g., Mainline modules. - -package android.net; -/* @hide */ -interface INetworkStackStatusCallback { - oneway void onStatusAvailable(int statusCode); -}
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/InformationElementParcelable.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/InformationElementParcelable.aidl deleted file mode 100644 index 6103774..0000000 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/InformationElementParcelable.aidl +++ /dev/null
@@ -1,39 +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. - */ -/////////////////////////////////////////////////////////////////////////////// -// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // -/////////////////////////////////////////////////////////////////////////////// - -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. -// -// You must not make a backward incompatible change to any AIDL file built -// with the aidl_interface module type with versions property set. The module -// type is used to build AIDL files in a way that they can be used across -// independently updatable components of the system. If a device is shipped -// with such a backward incompatible change, it has a high risk of breaking -// later when a module using the interface is updated, e.g., Mainline modules. - -package android.net; -@JavaDerive(toString=true) -parcelable InformationElementParcelable { - int id; - byte[] payload; -}
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/InitialConfigurationParcelable.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/InitialConfigurationParcelable.aidl deleted file mode 100644 index 6a597e6..0000000 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/InitialConfigurationParcelable.aidl +++ /dev/null
@@ -1,41 +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. - */ -/////////////////////////////////////////////////////////////////////////////// -// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // -/////////////////////////////////////////////////////////////////////////////// - -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. -// -// You must not make a backward incompatible change to any AIDL file built -// with the aidl_interface module type with versions property set. The module -// type is used to build AIDL files in a way that they can be used across -// independently updatable components of the system. If a device is shipped -// with such a backward incompatible change, it has a high risk of breaking -// later when a module using the interface is updated, e.g., Mainline modules. - -package android.net; -@JavaDerive(toString=true) -parcelable InitialConfigurationParcelable { - android.net.LinkAddress[] ipAddresses; - android.net.IpPrefix[] directlyConnectedRoutes; - String[] dnsServers; - String gateway; -}
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/Layer2InformationParcelable.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/Layer2InformationParcelable.aidl deleted file mode 100644 index 83796ee..0000000 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/Layer2InformationParcelable.aidl +++ /dev/null
@@ -1,40 +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. - */ -/////////////////////////////////////////////////////////////////////////////// -// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // -/////////////////////////////////////////////////////////////////////////////// - -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. -// -// You must not make a backward incompatible change to any AIDL file built -// with the aidl_interface module type with versions property set. The module -// type is used to build AIDL files in a way that they can be used across -// independently updatable components of the system. If a device is shipped -// with such a backward incompatible change, it has a high risk of breaking -// later when a module using the interface is updated, e.g., Mainline modules. - -package android.net; -@JavaDerive(toString=true) -parcelable Layer2InformationParcelable { - String l2Key; - String cluster; - android.net.MacAddress bssid; -}
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/Layer2PacketParcelable.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/Layer2PacketParcelable.aidl deleted file mode 100644 index 4b3fff5..0000000 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/Layer2PacketParcelable.aidl +++ /dev/null
@@ -1,39 +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 perNmissions and - * limitations under the License. - */ -/////////////////////////////////////////////////////////////////////////////// -// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // -/////////////////////////////////////////////////////////////////////////////// - -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. -// -// You must not make a backward incompatible change to any AIDL file built -// with the aidl_interface module type with versions property set. The module -// type is used to build AIDL files in a way that they can be used across -// independently updatable components of the system. If a device is shipped -// with such a backward incompatible change, it has a high risk of breaking -// later when a module using the interface is updated, e.g., Mainline modules. - -package android.net; -@JavaDerive(toString=true) -parcelable Layer2PacketParcelable { - android.net.MacAddress dstMacAddress; - byte[] payload; -}
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/NattKeepalivePacketDataParcelable.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/NattKeepalivePacketDataParcelable.aidl deleted file mode 100644 index 18cf954..0000000 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/NattKeepalivePacketDataParcelable.aidl +++ /dev/null
@@ -1,41 +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. - */ -/////////////////////////////////////////////////////////////////////////////// -// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // -/////////////////////////////////////////////////////////////////////////////// - -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. -// -// You must not make a backward incompatible change to any AIDL file built -// with the aidl_interface module type with versions property set. The module -// type is used to build AIDL files in a way that they can be used across -// independently updatable components of the system. If a device is shipped -// with such a backward incompatible change, it has a high risk of breaking -// later when a module using the interface is updated, e.g., Mainline modules. - -package android.net; -@JavaDerive(toString=true) -parcelable NattKeepalivePacketDataParcelable { - byte[] srcAddress; - int srcPort; - byte[] dstAddress; - int dstPort; -}
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/NetworkTestResultParcelable.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/NetworkTestResultParcelable.aidl deleted file mode 100644 index 4d6d5a2..0000000 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/NetworkTestResultParcelable.aidl +++ /dev/null
@@ -1,42 +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 perNmissions and - * limitations under the License. - */ -/////////////////////////////////////////////////////////////////////////////// -// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // -/////////////////////////////////////////////////////////////////////////////// - -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. -// -// You must not make a backward incompatible change to any AIDL file built -// with the aidl_interface module type with versions property set. The module -// type is used to build AIDL files in a way that they can be used across -// independently updatable components of the system. If a device is shipped -// with such a backward incompatible change, it has a high risk of breaking -// later when a module using the interface is updated, e.g., Mainline modules. - -package android.net; -@JavaDerive(toString=true) -parcelable NetworkTestResultParcelable { - long timestampMillis; - int result; - int probesSucceeded; - int probesAttempted; - String redirectUrl; -}
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/PrivateDnsConfigParcel.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/PrivateDnsConfigParcel.aidl deleted file mode 100644 index 1457caf..0000000 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/PrivateDnsConfigParcel.aidl +++ /dev/null
@@ -1,39 +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. - */ -/////////////////////////////////////////////////////////////////////////////// -// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // -/////////////////////////////////////////////////////////////////////////////// - -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. -// -// You must not make a backward incompatible change to any AIDL file built -// with the aidl_interface module type with versions property set. The module -// type is used to build AIDL files in a way that they can be used across -// independently updatable components of the system. If a device is shipped -// with such a backward incompatible change, it has a high risk of breaking -// later when a module using the interface is updated, e.g., Mainline modules. - -package android.net; -@JavaDerive(toString=true) -parcelable PrivateDnsConfigParcel { - String hostname; - String[] ips; -}
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/ProvisioningConfigurationParcelable.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/ProvisioningConfigurationParcelable.aidl deleted file mode 100644 index 0b7a7a1..0000000 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/ProvisioningConfigurationParcelable.aidl +++ /dev/null
@@ -1,54 +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. -*/ -/////////////////////////////////////////////////////////////////////////////// -// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // -/////////////////////////////////////////////////////////////////////////////// - -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. -// -// You must not make a backward incompatible change to any AIDL file built -// with the aidl_interface module type with versions property set. The module -// type is used to build AIDL files in a way that they can be used across -// independently updatable components of the system. If a device is shipped -// with such a backward incompatible change, it has a high risk of breaking -// later when a module using the interface is updated, e.g., Mainline modules. - -package android.net; -@JavaDerive(toString=true) -parcelable ProvisioningConfigurationParcelable { - boolean enableIPv4; - boolean enableIPv6; - boolean usingMultinetworkPolicyTracker; - boolean usingIpReachabilityMonitor; - int requestedPreDhcpActionMs; - android.net.InitialConfigurationParcelable initialConfig; - android.net.StaticIpConfiguration staticIpConfig; - android.net.apf.ApfCapabilities apfCapabilities; - int provisioningTimeoutMs; - int ipv6AddrGenMode; - android.net.Network network; - String displayName; - boolean enablePreconnection; - @nullable android.net.ScanResultInfoParcelable scanResultInfo; - @nullable android.net.Layer2InformationParcelable layer2Info; - @nullable List<android.net.networkstack.aidl.dhcp.DhcpOption> options; -}
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/ScanResultInfoParcelable.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/ScanResultInfoParcelable.aidl deleted file mode 100644 index 94fc27f..0000000 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/ScanResultInfoParcelable.aidl +++ /dev/null
@@ -1,40 +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. - */ -/////////////////////////////////////////////////////////////////////////////// -// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // -/////////////////////////////////////////////////////////////////////////////// - -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. -// -// You must not make a backward incompatible change to any AIDL file built -// with the aidl_interface module type with versions property set. The module -// type is used to build AIDL files in a way that they can be used across -// independently updatable components of the system. If a device is shipped -// with such a backward incompatible change, it has a high risk of breaking -// later when a module using the interface is updated, e.g., Mainline modules. - -package android.net; -@JavaDerive(toString=true) -parcelable ScanResultInfoParcelable { - String ssid; - String bssid; - android.net.InformationElementParcelable[] informationElements; -}
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/TcpKeepalivePacketDataParcelable.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/TcpKeepalivePacketDataParcelable.aidl deleted file mode 100644 index 0e1c21c..0000000 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/TcpKeepalivePacketDataParcelable.aidl +++ /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. - */ -/////////////////////////////////////////////////////////////////////////////// -// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // -/////////////////////////////////////////////////////////////////////////////// - -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. -// -// You must not make a backward incompatible change to any AIDL file built -// with the aidl_interface module type with versions property set. The module -// type is used to build AIDL files in a way that they can be used across -// independently updatable components of the system. If a device is shipped -// with such a backward incompatible change, it has a high risk of breaking -// later when a module using the interface is updated, e.g., Mainline modules. - -package android.net; -@JavaDerive(toString=true) -parcelable TcpKeepalivePacketDataParcelable { - byte[] srcAddress; - int srcPort; - byte[] dstAddress; - int dstPort; - int seq; - int ack; - int rcvWnd; - int rcvWndScale; - int tos; - int ttl; -}
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/dhcp/DhcpLeaseParcelable.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/dhcp/DhcpLeaseParcelable.aidl deleted file mode 100644 index 3cd8860..0000000 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/dhcp/DhcpLeaseParcelable.aidl +++ /dev/null
@@ -1,43 +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 perNmissions and - * limitations under the License. - */ -/////////////////////////////////////////////////////////////////////////////// -// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // -/////////////////////////////////////////////////////////////////////////////// - -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. -// -// You must not make a backward incompatible change to any AIDL file built -// with the aidl_interface module type with versions property set. The module -// type is used to build AIDL files in a way that they can be used across -// independently updatable components of the system. If a device is shipped -// with such a backward incompatible change, it has a high risk of breaking -// later when a module using the interface is updated, e.g., Mainline modules. - -package android.net.dhcp; -@JavaDerive(toString=true) -parcelable DhcpLeaseParcelable { - byte[] clientId; - byte[] hwAddr; - int netAddr; - int prefixLength; - long expTime; - String hostname; -}
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/dhcp/DhcpServingParamsParcel.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/dhcp/DhcpServingParamsParcel.aidl deleted file mode 100644 index fa412cb..0000000 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/dhcp/DhcpServingParamsParcel.aidl +++ /dev/null
@@ -1,48 +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. - */ -/////////////////////////////////////////////////////////////////////////////// -// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // -/////////////////////////////////////////////////////////////////////////////// - -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. -// -// You must not make a backward incompatible change to any AIDL file built -// with the aidl_interface module type with versions property set. The module -// type is used to build AIDL files in a way that they can be used across -// independently updatable components of the system. If a device is shipped -// with such a backward incompatible change, it has a high risk of breaking -// later when a module using the interface is updated, e.g., Mainline modules. - -package android.net.dhcp; -@JavaDerive(toString=true) -parcelable DhcpServingParamsParcel { - int serverAddr; - int serverAddrPrefixLength; - int[] defaultRouters; - int[] dnsServers; - int[] excludedAddrs; - long dhcpLeaseTimeSecs; - int linkMtu; - boolean metered; - int singleClientAddr = 0; - boolean changePrefixOnDecline = false; -}
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/dhcp/IDhcpEventCallbacks.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/dhcp/IDhcpEventCallbacks.aidl deleted file mode 100644 index 9312f47..0000000 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/dhcp/IDhcpEventCallbacks.aidl +++ /dev/null
@@ -1,38 +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 perNmissions and - * limitations under the License. - */ -/////////////////////////////////////////////////////////////////////////////// -// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // -/////////////////////////////////////////////////////////////////////////////// - -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. -// -// You must not make a backward incompatible change to any AIDL file built -// with the aidl_interface module type with versions property set. The module -// type is used to build AIDL files in a way that they can be used across -// independently updatable components of the system. If a device is shipped -// with such a backward incompatible change, it has a high risk of breaking -// later when a module using the interface is updated, e.g., Mainline modules. - -package android.net.dhcp; -interface IDhcpEventCallbacks { - oneway void onLeasesChanged(in List<android.net.dhcp.DhcpLeaseParcelable> newLeases); - oneway void onNewPrefixRequest(in android.net.IpPrefix currentPrefix); -}
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/dhcp/IDhcpServer.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/dhcp/IDhcpServer.aidl deleted file mode 100644 index 1109f35..0000000 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/dhcp/IDhcpServer.aidl +++ /dev/null
@@ -1,45 +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 perNmissions and - * limitations under the License. - */ -/////////////////////////////////////////////////////////////////////////////// -// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // -/////////////////////////////////////////////////////////////////////////////// - -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. -// -// You must not make a backward incompatible change to any AIDL file built -// with the aidl_interface module type with versions property set. The module -// type is used to build AIDL files in a way that they can be used across -// independently updatable components of the system. If a device is shipped -// with such a backward incompatible change, it has a high risk of breaking -// later when a module using the interface is updated, e.g., Mainline modules. - -package android.net.dhcp; -/* @hide */ -interface IDhcpServer { - oneway void start(in android.net.INetworkStackStatusCallback cb) = 0; - oneway void startWithCallbacks(in android.net.INetworkStackStatusCallback statusCb, in android.net.dhcp.IDhcpEventCallbacks eventCb) = 3; - oneway void updateParams(in android.net.dhcp.DhcpServingParamsParcel params, in android.net.INetworkStackStatusCallback cb) = 1; - oneway void stop(in android.net.INetworkStackStatusCallback cb) = 2; - const int STATUS_UNKNOWN = 0; - const int STATUS_SUCCESS = 1; - const int STATUS_INVALID_ARGUMENT = 2; - const int STATUS_UNKNOWN_ERROR = 3; -}
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/dhcp/IDhcpServerCallbacks.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/dhcp/IDhcpServerCallbacks.aidl deleted file mode 100644 index ab8577c..0000000 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/dhcp/IDhcpServerCallbacks.aidl +++ /dev/null
@@ -1,38 +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 perNmissions and - * limitations under the License. - */ -/////////////////////////////////////////////////////////////////////////////// -// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // -/////////////////////////////////////////////////////////////////////////////// - -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. -// -// You must not make a backward incompatible change to any AIDL file built -// with the aidl_interface module type with versions property set. The module -// type is used to build AIDL files in a way that they can be used across -// independently updatable components of the system. If a device is shipped -// with such a backward incompatible change, it has a high risk of breaking -// later when a module using the interface is updated, e.g., Mainline modules. - -package android.net.dhcp; -/* @hide */ -interface IDhcpServerCallbacks { - oneway void onDhcpServerCreated(int statusCode, in android.net.dhcp.IDhcpServer server); -}
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/ip/IIpClient.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/ip/IIpClient.aidl deleted file mode 100644 index 1fe4c4c..0000000 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/ip/IIpClient.aidl +++ /dev/null
@@ -1,52 +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 perNmissions and - * limitations under the License. - */ -/////////////////////////////////////////////////////////////////////////////// -// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // -/////////////////////////////////////////////////////////////////////////////// - -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. -// -// You must not make a backward incompatible change to any AIDL file built -// with the aidl_interface module type with versions property set. The module -// type is used to build AIDL files in a way that they can be used across -// independently updatable components of the system. If a device is shipped -// with such a backward incompatible change, it has a high risk of breaking -// later when a module using the interface is updated, e.g., Mainline modules. - -package android.net.ip; -/* @hide */ -interface IIpClient { - oneway void completedPreDhcpAction(); - oneway void confirmConfiguration(); - oneway void readPacketFilterComplete(in byte[] data); - oneway void shutdown(); - oneway void startProvisioning(in android.net.ProvisioningConfigurationParcelable req); - oneway void stop(); - oneway void setTcpBufferSizes(in String tcpBufferSizes); - oneway void setHttpProxy(in android.net.ProxyInfo proxyInfo); - oneway void setMulticastFilter(boolean enabled); - oneway void addKeepalivePacketFilter(int slot, in android.net.TcpKeepalivePacketDataParcelable pkt); - oneway void removeKeepalivePacketFilter(int slot); - oneway void setL2KeyAndGroupHint(in String l2Key, in String cluster); - oneway void addNattKeepalivePacketFilter(int slot, in android.net.NattKeepalivePacketDataParcelable pkt); - oneway void notifyPreconnectionComplete(boolean success); - oneway void updateLayer2Information(in android.net.Layer2InformationParcelable info); -}
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/ip/IIpClientCallbacks.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/ip/IIpClientCallbacks.aidl deleted file mode 100644 index 488510d..0000000 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/ip/IIpClientCallbacks.aidl +++ /dev/null
@@ -1,51 +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 perNmissions and - * limitations under the License. - */ -/////////////////////////////////////////////////////////////////////////////// -// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // -/////////////////////////////////////////////////////////////////////////////// - -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. -// -// You must not make a backward incompatible change to any AIDL file built -// with the aidl_interface module type with versions property set. The module -// type is used to build AIDL files in a way that they can be used across -// independently updatable components of the system. If a device is shipped -// with such a backward incompatible change, it has a high risk of breaking -// later when a module using the interface is updated, e.g., Mainline modules. - -package android.net.ip; -/* @hide */ -interface IIpClientCallbacks { - oneway void onIpClientCreated(in android.net.ip.IIpClient ipClient); - oneway void onPreDhcpAction(); - oneway void onPostDhcpAction(); - oneway void onNewDhcpResults(in android.net.DhcpResultsParcelable dhcpResults); - oneway void onProvisioningSuccess(in android.net.LinkProperties newLp); - oneway void onProvisioningFailure(in android.net.LinkProperties newLp); - oneway void onLinkPropertiesChange(in android.net.LinkProperties newLp); - oneway void onReachabilityLost(in String logMsg); - oneway void onQuit(); - oneway void installPacketFilter(in byte[] filter); - oneway void startReadPacketFilter(); - oneway void setFallbackMulticastFilter(boolean enabled); - oneway void setNeighborDiscoveryOffload(boolean enable); - oneway void onPreconnectionStart(in List<android.net.Layer2PacketParcelable> packets); -}
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/networkstack/aidl/dhcp/DhcpOption.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/networkstack/aidl/dhcp/DhcpOption.aidl deleted file mode 100644 index eea3e0d..0000000 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/11/android/net/networkstack/aidl/dhcp/DhcpOption.aidl +++ /dev/null
@@ -1,39 +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 perNmissions and - * limitations under the License. - */ -/////////////////////////////////////////////////////////////////////////////// -// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // -/////////////////////////////////////////////////////////////////////////////// - -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. -// -// You must not make a backward incompatible change to any AIDL file built -// with the aidl_interface module type with versions property set. The module -// type is used to build AIDL files in a way that they can be used across -// independently updatable components of the system. If a device is shipped -// with such a backward incompatible change, it has a high risk of breaking -// later when a module using the interface is updated, e.g., Mainline modules. - -package android.net.networkstack.aidl.dhcp; -@JavaDerive(toString=true) -parcelable DhcpOption { - byte type; - @nullable byte[] value; -}
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/.hash b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/.hash deleted file mode 100644 index e96fe34..0000000 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/.hash +++ /dev/null
@@ -1 +0,0 @@ -ca534b24b8f1e946a36977f391a156016ea7ef4a
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/DataStallReportParcelable.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/DataStallReportParcelable.aidl deleted file mode 100644 index 771deda..0000000 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/DataStallReportParcelable.aidl +++ /dev/null
@@ -1,42 +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 perNmissions and - * limitations under the License. - */ -/////////////////////////////////////////////////////////////////////////////// -// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // -/////////////////////////////////////////////////////////////////////////////// - -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. -// -// You must not make a backward incompatible change to any AIDL file built -// with the aidl_interface module type with versions property set. The module -// type is used to build AIDL files in a way that they can be used across -// independently updatable components of the system. If a device is shipped -// with such a backward incompatible change, it has a high risk of breaking -// later when a module using the interface is updated, e.g., Mainline modules. - -package android.net; -@JavaDerive(toString=true) -parcelable DataStallReportParcelable { - long timestampMillis = 0; - int detectionMethod = 1; - int tcpPacketFailRate = 2; - int tcpMetricsCollectionPeriodMillis = 3; - int dnsConsecutiveTimeouts = 4; -}
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/DhcpResultsParcelable.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/DhcpResultsParcelable.aidl deleted file mode 100644 index 31f2194..0000000 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/DhcpResultsParcelable.aidl +++ /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 perNmissions and - * limitations under the License. - */ -/////////////////////////////////////////////////////////////////////////////// -// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // -/////////////////////////////////////////////////////////////////////////////// - -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. -// -// You must not make a backward incompatible change to any AIDL file built -// with the aidl_interface module type with versions property set. The module -// type is used to build AIDL files in a way that they can be used across -// independently updatable components of the system. If a device is shipped -// with such a backward incompatible change, it has a high risk of breaking -// later when a module using the interface is updated, e.g., Mainline modules. - -package android.net; -@JavaDerive(toString=true) -parcelable DhcpResultsParcelable { - android.net.StaticIpConfiguration baseConfiguration; - int leaseDuration; - int mtu; - String serverAddress; - String vendorInfo; - @nullable String serverHostName; - @nullable String captivePortalApiUrl; -}
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/INetworkMonitor.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/INetworkMonitor.aidl deleted file mode 100644 index d92196d..0000000 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/INetworkMonitor.aidl +++ /dev/null
@@ -1,59 +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 perNmissions and - * limitations under the License. - */ -/////////////////////////////////////////////////////////////////////////////// -// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // -/////////////////////////////////////////////////////////////////////////////// - -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. -// -// You must not make a backward incompatible change to any AIDL file built -// with the aidl_interface module type with versions property set. The module -// type is used to build AIDL files in a way that they can be used across -// independently updatable components of the system. If a device is shipped -// with such a backward incompatible change, it has a high risk of breaking -// later when a module using the interface is updated, e.g., Mainline modules. - -package android.net; -/* @hide */ -interface INetworkMonitor { - oneway void start(); - oneway void launchCaptivePortalApp(); - oneway void notifyCaptivePortalAppFinished(int response); - oneway void setAcceptPartialConnectivity(); - oneway void forceReevaluation(int uid); - oneway void notifyPrivateDnsChanged(in android.net.PrivateDnsConfigParcel config); - oneway void notifyDnsResponse(int returnCode); - oneway void notifyNetworkConnected(in android.net.LinkProperties lp, in android.net.NetworkCapabilities nc); - oneway void notifyNetworkDisconnected(); - oneway void notifyLinkPropertiesChanged(in android.net.LinkProperties lp); - oneway void notifyNetworkCapabilitiesChanged(in android.net.NetworkCapabilities nc); - const int NETWORK_TEST_RESULT_VALID = 0; - const int NETWORK_TEST_RESULT_INVALID = 1; - const int NETWORK_TEST_RESULT_PARTIAL_CONNECTIVITY = 2; - const int NETWORK_VALIDATION_RESULT_VALID = 1; - const int NETWORK_VALIDATION_RESULT_PARTIAL = 2; - const int NETWORK_VALIDATION_RESULT_SKIPPED = 4; - const int NETWORK_VALIDATION_PROBE_DNS = 4; - const int NETWORK_VALIDATION_PROBE_HTTP = 8; - const int NETWORK_VALIDATION_PROBE_HTTPS = 16; - const int NETWORK_VALIDATION_PROBE_FALLBACK = 32; - const int NETWORK_VALIDATION_PROBE_PRIVDNS = 64; -}
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/INetworkMonitorCallbacks.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/INetworkMonitorCallbacks.aidl deleted file mode 100644 index 36eda8e..0000000 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/INetworkMonitorCallbacks.aidl +++ /dev/null
@@ -1,46 +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. - */ -/////////////////////////////////////////////////////////////////////////////// -// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // -/////////////////////////////////////////////////////////////////////////////// - -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. -// -// You must not make a backward incompatible change to any AIDL file built -// with the aidl_interface module type with versions property set. The module -// type is used to build AIDL files in a way that they can be used across -// independently updatable components of the system. If a device is shipped -// with such a backward incompatible change, it has a high risk of breaking -// later when a module using the interface is updated, e.g., Mainline modules. - -package android.net; -/* @hide */ -interface INetworkMonitorCallbacks { - oneway void onNetworkMonitorCreated(in android.net.INetworkMonitor networkMonitor) = 0; - oneway void notifyNetworkTested(int testResult, @nullable String redirectUrl) = 1; - oneway void notifyPrivateDnsConfigResolved(in android.net.PrivateDnsConfigParcel config) = 2; - oneway void showProvisioningNotification(String action, String packageName) = 3; - oneway void hideProvisioningNotification() = 4; - oneway void notifyProbeStatusChanged(int probesCompleted, int probesSucceeded) = 5; - oneway void notifyNetworkTestedWithExtras(in android.net.NetworkTestResultParcelable result) = 6; - oneway void notifyDataStallSuspected(in android.net.DataStallReportParcelable report) = 7; - oneway void notifyCaptivePortalDataChanged(in android.net.CaptivePortalData data) = 8; -}
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/INetworkStackConnector.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/INetworkStackConnector.aidl deleted file mode 100644 index 8120ffc..0000000 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/INetworkStackConnector.aidl +++ /dev/null
@@ -1,42 +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 perNmissions and - * limitations under the License. - */ -/////////////////////////////////////////////////////////////////////////////// -// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // -/////////////////////////////////////////////////////////////////////////////// - -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. -// -// You must not make a backward incompatible change to any AIDL file built -// with the aidl_interface module type with versions property set. The module -// type is used to build AIDL files in a way that they can be used across -// independently updatable components of the system. If a device is shipped -// with such a backward incompatible change, it has a high risk of breaking -// later when a module using the interface is updated, e.g., Mainline modules. - -package android.net; -/* @hide */ -interface INetworkStackConnector { - oneway void makeDhcpServer(in String ifName, in android.net.dhcp.DhcpServingParamsParcel params, in android.net.dhcp.IDhcpServerCallbacks cb); - oneway void makeNetworkMonitor(in android.net.Network network, String name, in android.net.INetworkMonitorCallbacks cb); - oneway void makeIpClient(in String ifName, in android.net.ip.IIpClientCallbacks callbacks); - oneway void fetchIpMemoryStore(in android.net.IIpMemoryStoreCallbacks cb); - oneway void allowTestUid(int uid, in android.net.INetworkStackStatusCallback cb); -}
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/INetworkStackStatusCallback.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/INetworkStackStatusCallback.aidl deleted file mode 100644 index 0b6b778..0000000 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/INetworkStackStatusCallback.aidl +++ /dev/null
@@ -1,38 +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. - */ -/////////////////////////////////////////////////////////////////////////////// -// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // -/////////////////////////////////////////////////////////////////////////////// - -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. -// -// You must not make a backward incompatible change to any AIDL file built -// with the aidl_interface module type with versions property set. The module -// type is used to build AIDL files in a way that they can be used across -// independently updatable components of the system. If a device is shipped -// with such a backward incompatible change, it has a high risk of breaking -// later when a module using the interface is updated, e.g., Mainline modules. - -package android.net; -/* @hide */ -interface INetworkStackStatusCallback { - oneway void onStatusAvailable(int statusCode); -}
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/InformationElementParcelable.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/InformationElementParcelable.aidl deleted file mode 100644 index 6103774..0000000 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/InformationElementParcelable.aidl +++ /dev/null
@@ -1,39 +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. - */ -/////////////////////////////////////////////////////////////////////////////// -// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // -/////////////////////////////////////////////////////////////////////////////// - -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. -// -// You must not make a backward incompatible change to any AIDL file built -// with the aidl_interface module type with versions property set. The module -// type is used to build AIDL files in a way that they can be used across -// independently updatable components of the system. If a device is shipped -// with such a backward incompatible change, it has a high risk of breaking -// later when a module using the interface is updated, e.g., Mainline modules. - -package android.net; -@JavaDerive(toString=true) -parcelable InformationElementParcelable { - int id; - byte[] payload; -}
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/InitialConfigurationParcelable.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/InitialConfigurationParcelable.aidl deleted file mode 100644 index 6a597e6..0000000 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/InitialConfigurationParcelable.aidl +++ /dev/null
@@ -1,41 +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. - */ -/////////////////////////////////////////////////////////////////////////////// -// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // -/////////////////////////////////////////////////////////////////////////////// - -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. -// -// You must not make a backward incompatible change to any AIDL file built -// with the aidl_interface module type with versions property set. The module -// type is used to build AIDL files in a way that they can be used across -// independently updatable components of the system. If a device is shipped -// with such a backward incompatible change, it has a high risk of breaking -// later when a module using the interface is updated, e.g., Mainline modules. - -package android.net; -@JavaDerive(toString=true) -parcelable InitialConfigurationParcelable { - android.net.LinkAddress[] ipAddresses; - android.net.IpPrefix[] directlyConnectedRoutes; - String[] dnsServers; - String gateway; -}
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/Layer2InformationParcelable.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/Layer2InformationParcelable.aidl deleted file mode 100644 index 83796ee..0000000 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/Layer2InformationParcelable.aidl +++ /dev/null
@@ -1,40 +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. - */ -/////////////////////////////////////////////////////////////////////////////// -// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // -/////////////////////////////////////////////////////////////////////////////// - -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. -// -// You must not make a backward incompatible change to any AIDL file built -// with the aidl_interface module type with versions property set. The module -// type is used to build AIDL files in a way that they can be used across -// independently updatable components of the system. If a device is shipped -// with such a backward incompatible change, it has a high risk of breaking -// later when a module using the interface is updated, e.g., Mainline modules. - -package android.net; -@JavaDerive(toString=true) -parcelable Layer2InformationParcelable { - String l2Key; - String cluster; - android.net.MacAddress bssid; -}
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/Layer2PacketParcelable.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/Layer2PacketParcelable.aidl deleted file mode 100644 index 4b3fff5..0000000 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/Layer2PacketParcelable.aidl +++ /dev/null
@@ -1,39 +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 perNmissions and - * limitations under the License. - */ -/////////////////////////////////////////////////////////////////////////////// -// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // -/////////////////////////////////////////////////////////////////////////////// - -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. -// -// You must not make a backward incompatible change to any AIDL file built -// with the aidl_interface module type with versions property set. The module -// type is used to build AIDL files in a way that they can be used across -// independently updatable components of the system. If a device is shipped -// with such a backward incompatible change, it has a high risk of breaking -// later when a module using the interface is updated, e.g., Mainline modules. - -package android.net; -@JavaDerive(toString=true) -parcelable Layer2PacketParcelable { - android.net.MacAddress dstMacAddress; - byte[] payload; -}
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/NattKeepalivePacketDataParcelable.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/NattKeepalivePacketDataParcelable.aidl deleted file mode 100644 index 18cf954..0000000 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/NattKeepalivePacketDataParcelable.aidl +++ /dev/null
@@ -1,41 +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. - */ -/////////////////////////////////////////////////////////////////////////////// -// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // -/////////////////////////////////////////////////////////////////////////////// - -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. -// -// You must not make a backward incompatible change to any AIDL file built -// with the aidl_interface module type with versions property set. The module -// type is used to build AIDL files in a way that they can be used across -// independently updatable components of the system. If a device is shipped -// with such a backward incompatible change, it has a high risk of breaking -// later when a module using the interface is updated, e.g., Mainline modules. - -package android.net; -@JavaDerive(toString=true) -parcelable NattKeepalivePacketDataParcelable { - byte[] srcAddress; - int srcPort; - byte[] dstAddress; - int dstPort; -}
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/NetworkTestResultParcelable.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/NetworkTestResultParcelable.aidl deleted file mode 100644 index 4d6d5a2..0000000 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/NetworkTestResultParcelable.aidl +++ /dev/null
@@ -1,42 +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 perNmissions and - * limitations under the License. - */ -/////////////////////////////////////////////////////////////////////////////// -// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // -/////////////////////////////////////////////////////////////////////////////// - -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. -// -// You must not make a backward incompatible change to any AIDL file built -// with the aidl_interface module type with versions property set. The module -// type is used to build AIDL files in a way that they can be used across -// independently updatable components of the system. If a device is shipped -// with such a backward incompatible change, it has a high risk of breaking -// later when a module using the interface is updated, e.g., Mainline modules. - -package android.net; -@JavaDerive(toString=true) -parcelable NetworkTestResultParcelable { - long timestampMillis; - int result; - int probesSucceeded; - int probesAttempted; - String redirectUrl; -}
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/PrivateDnsConfigParcel.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/PrivateDnsConfigParcel.aidl deleted file mode 100644 index 1457caf..0000000 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/PrivateDnsConfigParcel.aidl +++ /dev/null
@@ -1,39 +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. - */ -/////////////////////////////////////////////////////////////////////////////// -// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // -/////////////////////////////////////////////////////////////////////////////// - -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. -// -// You must not make a backward incompatible change to any AIDL file built -// with the aidl_interface module type with versions property set. The module -// type is used to build AIDL files in a way that they can be used across -// independently updatable components of the system. If a device is shipped -// with such a backward incompatible change, it has a high risk of breaking -// later when a module using the interface is updated, e.g., Mainline modules. - -package android.net; -@JavaDerive(toString=true) -parcelable PrivateDnsConfigParcel { - String hostname; - String[] ips; -}
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/ProvisioningConfigurationParcelable.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/ProvisioningConfigurationParcelable.aidl deleted file mode 100644 index 9ecd110..0000000 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/ProvisioningConfigurationParcelable.aidl +++ /dev/null
@@ -1,62 +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. -*/ -/////////////////////////////////////////////////////////////////////////////// -// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // -/////////////////////////////////////////////////////////////////////////////// - -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. -// -// You must not make a backward incompatible change to any AIDL file built -// with the aidl_interface module type with versions property set. The module -// type is used to build AIDL files in a way that they can be used across -// independently updatable components of the system. If a device is shipped -// with such a backward incompatible change, it has a high risk of breaking -// later when a module using the interface is updated, e.g., Mainline modules. - -package android.net; -@JavaDerive(toString=true) -parcelable ProvisioningConfigurationParcelable { - /** - * @deprecated use ipv4ProvisioningMode instead. - */ - boolean enableIPv4; - /** - * @deprecated use ipv6ProvisioningMode instead. - */ - boolean enableIPv6; - boolean usingMultinetworkPolicyTracker; - boolean usingIpReachabilityMonitor; - int requestedPreDhcpActionMs; - android.net.InitialConfigurationParcelable initialConfig; - android.net.StaticIpConfiguration staticIpConfig; - android.net.apf.ApfCapabilities apfCapabilities; - int provisioningTimeoutMs; - int ipv6AddrGenMode; - android.net.Network network; - String displayName; - boolean enablePreconnection; - @nullable android.net.ScanResultInfoParcelable scanResultInfo; - @nullable android.net.Layer2InformationParcelable layer2Info; - @nullable List<android.net.networkstack.aidl.dhcp.DhcpOption> options; - int ipv4ProvisioningMode; - int ipv6ProvisioningMode; -}
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/ScanResultInfoParcelable.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/ScanResultInfoParcelable.aidl deleted file mode 100644 index 94fc27f..0000000 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/ScanResultInfoParcelable.aidl +++ /dev/null
@@ -1,40 +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. - */ -/////////////////////////////////////////////////////////////////////////////// -// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // -/////////////////////////////////////////////////////////////////////////////// - -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. -// -// You must not make a backward incompatible change to any AIDL file built -// with the aidl_interface module type with versions property set. The module -// type is used to build AIDL files in a way that they can be used across -// independently updatable components of the system. If a device is shipped -// with such a backward incompatible change, it has a high risk of breaking -// later when a module using the interface is updated, e.g., Mainline modules. - -package android.net; -@JavaDerive(toString=true) -parcelable ScanResultInfoParcelable { - String ssid; - String bssid; - android.net.InformationElementParcelable[] informationElements; -}
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/TcpKeepalivePacketDataParcelable.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/TcpKeepalivePacketDataParcelable.aidl deleted file mode 100644 index 0e1c21c..0000000 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/TcpKeepalivePacketDataParcelable.aidl +++ /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. - */ -/////////////////////////////////////////////////////////////////////////////// -// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // -/////////////////////////////////////////////////////////////////////////////// - -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. -// -// You must not make a backward incompatible change to any AIDL file built -// with the aidl_interface module type with versions property set. The module -// type is used to build AIDL files in a way that they can be used across -// independently updatable components of the system. If a device is shipped -// with such a backward incompatible change, it has a high risk of breaking -// later when a module using the interface is updated, e.g., Mainline modules. - -package android.net; -@JavaDerive(toString=true) -parcelable TcpKeepalivePacketDataParcelable { - byte[] srcAddress; - int srcPort; - byte[] dstAddress; - int dstPort; - int seq; - int ack; - int rcvWnd; - int rcvWndScale; - int tos; - int ttl; -}
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/dhcp/DhcpLeaseParcelable.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/dhcp/DhcpLeaseParcelable.aidl deleted file mode 100644 index 3cd8860..0000000 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/dhcp/DhcpLeaseParcelable.aidl +++ /dev/null
@@ -1,43 +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 perNmissions and - * limitations under the License. - */ -/////////////////////////////////////////////////////////////////////////////// -// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // -/////////////////////////////////////////////////////////////////////////////// - -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. -// -// You must not make a backward incompatible change to any AIDL file built -// with the aidl_interface module type with versions property set. The module -// type is used to build AIDL files in a way that they can be used across -// independently updatable components of the system. If a device is shipped -// with such a backward incompatible change, it has a high risk of breaking -// later when a module using the interface is updated, e.g., Mainline modules. - -package android.net.dhcp; -@JavaDerive(toString=true) -parcelable DhcpLeaseParcelable { - byte[] clientId; - byte[] hwAddr; - int netAddr; - int prefixLength; - long expTime; - String hostname; -}
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/dhcp/DhcpServingParamsParcel.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/dhcp/DhcpServingParamsParcel.aidl deleted file mode 100644 index fa412cb..0000000 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/dhcp/DhcpServingParamsParcel.aidl +++ /dev/null
@@ -1,48 +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. - */ -/////////////////////////////////////////////////////////////////////////////// -// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // -/////////////////////////////////////////////////////////////////////////////// - -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. -// -// You must not make a backward incompatible change to any AIDL file built -// with the aidl_interface module type with versions property set. The module -// type is used to build AIDL files in a way that they can be used across -// independently updatable components of the system. If a device is shipped -// with such a backward incompatible change, it has a high risk of breaking -// later when a module using the interface is updated, e.g., Mainline modules. - -package android.net.dhcp; -@JavaDerive(toString=true) -parcelable DhcpServingParamsParcel { - int serverAddr; - int serverAddrPrefixLength; - int[] defaultRouters; - int[] dnsServers; - int[] excludedAddrs; - long dhcpLeaseTimeSecs; - int linkMtu; - boolean metered; - int singleClientAddr = 0; - boolean changePrefixOnDecline = false; -}
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/dhcp/IDhcpEventCallbacks.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/dhcp/IDhcpEventCallbacks.aidl deleted file mode 100644 index 9312f47..0000000 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/dhcp/IDhcpEventCallbacks.aidl +++ /dev/null
@@ -1,38 +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 perNmissions and - * limitations under the License. - */ -/////////////////////////////////////////////////////////////////////////////// -// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // -/////////////////////////////////////////////////////////////////////////////// - -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. -// -// You must not make a backward incompatible change to any AIDL file built -// with the aidl_interface module type with versions property set. The module -// type is used to build AIDL files in a way that they can be used across -// independently updatable components of the system. If a device is shipped -// with such a backward incompatible change, it has a high risk of breaking -// later when a module using the interface is updated, e.g., Mainline modules. - -package android.net.dhcp; -interface IDhcpEventCallbacks { - oneway void onLeasesChanged(in List<android.net.dhcp.DhcpLeaseParcelable> newLeases); - oneway void onNewPrefixRequest(in android.net.IpPrefix currentPrefix); -}
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/dhcp/IDhcpServer.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/dhcp/IDhcpServer.aidl deleted file mode 100644 index 1109f35..0000000 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/dhcp/IDhcpServer.aidl +++ /dev/null
@@ -1,45 +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 perNmissions and - * limitations under the License. - */ -/////////////////////////////////////////////////////////////////////////////// -// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // -/////////////////////////////////////////////////////////////////////////////// - -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. -// -// You must not make a backward incompatible change to any AIDL file built -// with the aidl_interface module type with versions property set. The module -// type is used to build AIDL files in a way that they can be used across -// independently updatable components of the system. If a device is shipped -// with such a backward incompatible change, it has a high risk of breaking -// later when a module using the interface is updated, e.g., Mainline modules. - -package android.net.dhcp; -/* @hide */ -interface IDhcpServer { - oneway void start(in android.net.INetworkStackStatusCallback cb) = 0; - oneway void startWithCallbacks(in android.net.INetworkStackStatusCallback statusCb, in android.net.dhcp.IDhcpEventCallbacks eventCb) = 3; - oneway void updateParams(in android.net.dhcp.DhcpServingParamsParcel params, in android.net.INetworkStackStatusCallback cb) = 1; - oneway void stop(in android.net.INetworkStackStatusCallback cb) = 2; - const int STATUS_UNKNOWN = 0; - const int STATUS_SUCCESS = 1; - const int STATUS_INVALID_ARGUMENT = 2; - const int STATUS_UNKNOWN_ERROR = 3; -}
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/dhcp/IDhcpServerCallbacks.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/dhcp/IDhcpServerCallbacks.aidl deleted file mode 100644 index ab8577c..0000000 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/dhcp/IDhcpServerCallbacks.aidl +++ /dev/null
@@ -1,38 +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 perNmissions and - * limitations under the License. - */ -/////////////////////////////////////////////////////////////////////////////// -// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // -/////////////////////////////////////////////////////////////////////////////// - -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. -// -// You must not make a backward incompatible change to any AIDL file built -// with the aidl_interface module type with versions property set. The module -// type is used to build AIDL files in a way that they can be used across -// independently updatable components of the system. If a device is shipped -// with such a backward incompatible change, it has a high risk of breaking -// later when a module using the interface is updated, e.g., Mainline modules. - -package android.net.dhcp; -/* @hide */ -interface IDhcpServerCallbacks { - oneway void onDhcpServerCreated(int statusCode, in android.net.dhcp.IDhcpServer server); -}
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/ip/IIpClient.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/ip/IIpClient.aidl deleted file mode 100644 index a97511e..0000000 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/ip/IIpClient.aidl +++ /dev/null
@@ -1,58 +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 perNmissions and - * limitations under the License. - */ -/////////////////////////////////////////////////////////////////////////////// -// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // -/////////////////////////////////////////////////////////////////////////////// - -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. -// -// You must not make a backward incompatible change to any AIDL file built -// with the aidl_interface module type with versions property set. The module -// type is used to build AIDL files in a way that they can be used across -// independently updatable components of the system. If a device is shipped -// with such a backward incompatible change, it has a high risk of breaking -// later when a module using the interface is updated, e.g., Mainline modules. - -package android.net.ip; -/* @hide */ -interface IIpClient { - oneway void completedPreDhcpAction(); - oneway void confirmConfiguration(); - oneway void readPacketFilterComplete(in byte[] data); - oneway void shutdown(); - oneway void startProvisioning(in android.net.ProvisioningConfigurationParcelable req); - oneway void stop(); - oneway void setTcpBufferSizes(in String tcpBufferSizes); - oneway void setHttpProxy(in android.net.ProxyInfo proxyInfo); - oneway void setMulticastFilter(boolean enabled); - oneway void addKeepalivePacketFilter(int slot, in android.net.TcpKeepalivePacketDataParcelable pkt); - oneway void removeKeepalivePacketFilter(int slot); - oneway void setL2KeyAndGroupHint(in String l2Key, in String cluster); - oneway void addNattKeepalivePacketFilter(int slot, in android.net.NattKeepalivePacketDataParcelable pkt); - oneway void notifyPreconnectionComplete(boolean success); - oneway void updateLayer2Information(in android.net.Layer2InformationParcelable info); - const int PROV_IPV4_DISABLED = 0; - const int PROV_IPV4_STATIC = 1; - const int PROV_IPV4_DHCP = 2; - const int PROV_IPV6_DISABLED = 0; - const int PROV_IPV6_SLAAC = 1; - const int PROV_IPV6_LINKLOCAL = 2; -}
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/ip/IIpClientCallbacks.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/ip/IIpClientCallbacks.aidl deleted file mode 100644 index 488510d..0000000 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/ip/IIpClientCallbacks.aidl +++ /dev/null
@@ -1,51 +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 perNmissions and - * limitations under the License. - */ -/////////////////////////////////////////////////////////////////////////////// -// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // -/////////////////////////////////////////////////////////////////////////////// - -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. -// -// You must not make a backward incompatible change to any AIDL file built -// with the aidl_interface module type with versions property set. The module -// type is used to build AIDL files in a way that they can be used across -// independently updatable components of the system. If a device is shipped -// with such a backward incompatible change, it has a high risk of breaking -// later when a module using the interface is updated, e.g., Mainline modules. - -package android.net.ip; -/* @hide */ -interface IIpClientCallbacks { - oneway void onIpClientCreated(in android.net.ip.IIpClient ipClient); - oneway void onPreDhcpAction(); - oneway void onPostDhcpAction(); - oneway void onNewDhcpResults(in android.net.DhcpResultsParcelable dhcpResults); - oneway void onProvisioningSuccess(in android.net.LinkProperties newLp); - oneway void onProvisioningFailure(in android.net.LinkProperties newLp); - oneway void onLinkPropertiesChange(in android.net.LinkProperties newLp); - oneway void onReachabilityLost(in String logMsg); - oneway void onQuit(); - oneway void installPacketFilter(in byte[] filter); - oneway void startReadPacketFilter(); - oneway void setFallbackMulticastFilter(boolean enabled); - oneway void setNeighborDiscoveryOffload(boolean enable); - oneway void onPreconnectionStart(in List<android.net.Layer2PacketParcelable> packets); -}
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/networkstack/aidl/dhcp/DhcpOption.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/networkstack/aidl/dhcp/DhcpOption.aidl deleted file mode 100644 index eea3e0d..0000000 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/12/android/net/networkstack/aidl/dhcp/DhcpOption.aidl +++ /dev/null
@@ -1,39 +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 perNmissions and - * limitations under the License. - */ -/////////////////////////////////////////////////////////////////////////////// -// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // -/////////////////////////////////////////////////////////////////////////////// - -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m <name>-update-api`. -// -// You must not make a backward incompatible change to any AIDL file built -// with the aidl_interface module type with versions property set. The module -// type is used to build AIDL files in a way that they can be used across -// independently updatable components of the system. If a device is shipped -// with such a backward incompatible change, it has a high risk of breaking -// later when a module using the interface is updated, e.g., Mainline modules. - -package android.net.networkstack.aidl.dhcp; -@JavaDerive(toString=true) -parcelable DhcpOption { - byte type; - @nullable byte[] value; -}
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/DataStallReportParcelable.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/DataStallReportParcelable.aidl index 771deda..0f860a5 100644 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/DataStallReportParcelable.aidl +++ b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/DataStallReportParcelable.aidl
@@ -1,18 +1,3 @@ -/** - * 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 perNmissions and - * limitations under the License. - */ /////////////////////////////////////////////////////////////////////////////// // THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // ///////////////////////////////////////////////////////////////////////////////
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/DhcpResultsParcelable.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/DhcpResultsParcelable.aidl index 31f2194..4445be7 100644 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/DhcpResultsParcelable.aidl +++ b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/DhcpResultsParcelable.aidl
@@ -1,18 +1,3 @@ -/** - * 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 perNmissions and - * limitations under the License. - */ /////////////////////////////////////////////////////////////////////////////// // THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // ///////////////////////////////////////////////////////////////////////////////
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/INetworkMonitor.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/INetworkMonitor.aidl index d92196d..db9145f 100644 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/INetworkMonitor.aidl +++ b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/INetworkMonitor.aidl
@@ -1,18 +1,3 @@ -/** - * 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 perNmissions and - * limitations under the License. - */ /////////////////////////////////////////////////////////////////////////////// // THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // /////////////////////////////////////////////////////////////////////////////// @@ -50,7 +35,6 @@ const int NETWORK_TEST_RESULT_PARTIAL_CONNECTIVITY = 2; const int NETWORK_VALIDATION_RESULT_VALID = 1; const int NETWORK_VALIDATION_RESULT_PARTIAL = 2; - const int NETWORK_VALIDATION_RESULT_SKIPPED = 4; const int NETWORK_VALIDATION_PROBE_DNS = 4; const int NETWORK_VALIDATION_PROBE_HTTP = 8; const int NETWORK_VALIDATION_PROBE_HTTPS = 16;
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/INetworkMonitorCallbacks.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/INetworkMonitorCallbacks.aidl index 36eda8e..b2685ad 100644 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/INetworkMonitorCallbacks.aidl +++ b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/INetworkMonitorCallbacks.aidl
@@ -1,18 +1,3 @@ -/* - * 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. - */ /////////////////////////////////////////////////////////////////////////////// // THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // ///////////////////////////////////////////////////////////////////////////////
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/INetworkStackConnector.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/INetworkStackConnector.aidl index 8120ffc..396b42a 100644 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/INetworkStackConnector.aidl +++ b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/INetworkStackConnector.aidl
@@ -1,18 +1,3 @@ -/** - * 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 perNmissions and - * limitations under the License. - */ /////////////////////////////////////////////////////////////////////////////// // THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // ///////////////////////////////////////////////////////////////////////////////
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/INetworkStackStatusCallback.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/INetworkStackStatusCallback.aidl index 0b6b778..97c9970 100644 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/INetworkStackStatusCallback.aidl +++ b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/INetworkStackStatusCallback.aidl
@@ -1,18 +1,3 @@ -/* - * 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. - */ /////////////////////////////////////////////////////////////////////////////// // THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // ///////////////////////////////////////////////////////////////////////////////
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/InformationElementParcelable.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/InformationElementParcelable.aidl index 6103774..77fca83 100644 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/InformationElementParcelable.aidl +++ b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/InformationElementParcelable.aidl
@@ -1,18 +1,3 @@ -/* - * 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. - */ /////////////////////////////////////////////////////////////////////////////// // THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // ///////////////////////////////////////////////////////////////////////////////
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/InitialConfigurationParcelable.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/InitialConfigurationParcelable.aidl index 6a597e6..6137305 100644 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/InitialConfigurationParcelable.aidl +++ b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/InitialConfigurationParcelable.aidl
@@ -1,18 +1,3 @@ -/* - * 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. - */ /////////////////////////////////////////////////////////////////////////////// // THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // ///////////////////////////////////////////////////////////////////////////////
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/Layer2InformationParcelable.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/Layer2InformationParcelable.aidl index 83796ee..d3adbb3 100644 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/Layer2InformationParcelable.aidl +++ b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/Layer2InformationParcelable.aidl
@@ -1,18 +1,3 @@ -/* - * 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. - */ /////////////////////////////////////////////////////////////////////////////// // THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // ///////////////////////////////////////////////////////////////////////////////
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/Layer2PacketParcelable.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/Layer2PacketParcelable.aidl index 4b3fff5..b45f6da 100644 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/Layer2PacketParcelable.aidl +++ b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/Layer2PacketParcelable.aidl
@@ -1,18 +1,3 @@ -/** - * 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 perNmissions and - * limitations under the License. - */ /////////////////////////////////////////////////////////////////////////////// // THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // ///////////////////////////////////////////////////////////////////////////////
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/NattKeepalivePacketDataParcelable.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/NattKeepalivePacketDataParcelable.aidl index 18cf954..7634ac9 100644 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/NattKeepalivePacketDataParcelable.aidl +++ b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/NattKeepalivePacketDataParcelable.aidl
@@ -1,18 +1,3 @@ -/* - * 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. - */ /////////////////////////////////////////////////////////////////////////////// // THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // ///////////////////////////////////////////////////////////////////////////////
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/NetworkTestResultParcelable.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/NetworkTestResultParcelable.aidl index 4d6d5a2..1d0bbbe 100644 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/NetworkTestResultParcelable.aidl +++ b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/NetworkTestResultParcelable.aidl
@@ -1,18 +1,3 @@ -/** - * 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 perNmissions and - * limitations under the License. - */ /////////////////////////////////////////////////////////////////////////////// // THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // ///////////////////////////////////////////////////////////////////////////////
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/PrivateDnsConfigParcel.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/PrivateDnsConfigParcel.aidl index 1457caf..c6d6361 100644 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/PrivateDnsConfigParcel.aidl +++ b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/PrivateDnsConfigParcel.aidl
@@ -1,18 +1,3 @@ -/* - * 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. - */ /////////////////////////////////////////////////////////////////////////////// // THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // ///////////////////////////////////////////////////////////////////////////////
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/ProvisioningConfigurationParcelable.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/ProvisioningConfigurationParcelable.aidl index 9ecd110..171817c 100644 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/ProvisioningConfigurationParcelable.aidl +++ b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/ProvisioningConfigurationParcelable.aidl
@@ -1,19 +1,3 @@ -/* -** -** 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. -*/ /////////////////////////////////////////////////////////////////////////////// // THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // /////////////////////////////////////////////////////////////////////////////// @@ -35,13 +19,7 @@ package android.net; @JavaDerive(toString=true) parcelable ProvisioningConfigurationParcelable { - /** - * @deprecated use ipv4ProvisioningMode instead. - */ boolean enableIPv4; - /** - * @deprecated use ipv6ProvisioningMode instead. - */ boolean enableIPv6; boolean usingMultinetworkPolicyTracker; boolean usingIpReachabilityMonitor; @@ -57,6 +35,4 @@ @nullable android.net.ScanResultInfoParcelable scanResultInfo; @nullable android.net.Layer2InformationParcelable layer2Info; @nullable List<android.net.networkstack.aidl.dhcp.DhcpOption> options; - int ipv4ProvisioningMode; - int ipv6ProvisioningMode; }
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/ScanResultInfoParcelable.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/ScanResultInfoParcelable.aidl index 94fc27f..4646ede 100644 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/ScanResultInfoParcelable.aidl +++ b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/ScanResultInfoParcelable.aidl
@@ -1,18 +1,3 @@ -/* - * 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. - */ /////////////////////////////////////////////////////////////////////////////// // THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // ///////////////////////////////////////////////////////////////////////////////
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/TcpKeepalivePacketDataParcelable.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/TcpKeepalivePacketDataParcelable.aidl index 0e1c21c..00f15da 100644 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/TcpKeepalivePacketDataParcelable.aidl +++ b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/TcpKeepalivePacketDataParcelable.aidl
@@ -1,18 +1,3 @@ -/* - * 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. - */ /////////////////////////////////////////////////////////////////////////////// // THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // ///////////////////////////////////////////////////////////////////////////////
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/dhcp/DhcpLeaseParcelable.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/dhcp/DhcpLeaseParcelable.aidl index 3cd8860..b0a0f0f 100644 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/dhcp/DhcpLeaseParcelable.aidl +++ b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/dhcp/DhcpLeaseParcelable.aidl
@@ -1,18 +1,3 @@ -/** - * 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 perNmissions and - * limitations under the License. - */ /////////////////////////////////////////////////////////////////////////////// // THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // ///////////////////////////////////////////////////////////////////////////////
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/dhcp/DhcpServingParamsParcel.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/dhcp/DhcpServingParamsParcel.aidl index fa412cb..d56ef8e 100644 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/dhcp/DhcpServingParamsParcel.aidl +++ b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/dhcp/DhcpServingParamsParcel.aidl
@@ -1,19 +1,3 @@ -/** - * - * 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. - */ /////////////////////////////////////////////////////////////////////////////// // THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // ///////////////////////////////////////////////////////////////////////////////
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/dhcp/IDhcpEventCallbacks.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/dhcp/IDhcpEventCallbacks.aidl index 9312f47..8f3288e 100644 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/dhcp/IDhcpEventCallbacks.aidl +++ b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/dhcp/IDhcpEventCallbacks.aidl
@@ -1,18 +1,3 @@ -/** - * 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 perNmissions and - * limitations under the License. - */ /////////////////////////////////////////////////////////////////////////////// // THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // ///////////////////////////////////////////////////////////////////////////////
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/dhcp/IDhcpServer.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/dhcp/IDhcpServer.aidl index 1109f35..83cebdf 100644 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/dhcp/IDhcpServer.aidl +++ b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/dhcp/IDhcpServer.aidl
@@ -1,18 +1,3 @@ -/** - * 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 perNmissions and - * limitations under the License. - */ /////////////////////////////////////////////////////////////////////////////// // THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // ///////////////////////////////////////////////////////////////////////////////
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/dhcp/IDhcpServerCallbacks.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/dhcp/IDhcpServerCallbacks.aidl index ab8577c..35da06c 100644 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/dhcp/IDhcpServerCallbacks.aidl +++ b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/dhcp/IDhcpServerCallbacks.aidl
@@ -1,18 +1,3 @@ -/** - * 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 perNmissions and - * limitations under the License. - */ /////////////////////////////////////////////////////////////////////////////// // THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // ///////////////////////////////////////////////////////////////////////////////
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/ip/IIpClient.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/ip/IIpClient.aidl index a97511e..5607b2a 100644 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/ip/IIpClient.aidl +++ b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/ip/IIpClient.aidl
@@ -1,18 +1,3 @@ -/** - * 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 perNmissions and - * limitations under the License. - */ /////////////////////////////////////////////////////////////////////////////// // THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // /////////////////////////////////////////////////////////////////////////////// @@ -49,10 +34,4 @@ oneway void addNattKeepalivePacketFilter(int slot, in android.net.NattKeepalivePacketDataParcelable pkt); oneway void notifyPreconnectionComplete(boolean success); oneway void updateLayer2Information(in android.net.Layer2InformationParcelable info); - const int PROV_IPV4_DISABLED = 0; - const int PROV_IPV4_STATIC = 1; - const int PROV_IPV4_DHCP = 2; - const int PROV_IPV6_DISABLED = 0; - const int PROV_IPV6_SLAAC = 1; - const int PROV_IPV6_LINKLOCAL = 2; }
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/ip/IIpClientCallbacks.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/ip/IIpClientCallbacks.aidl index 488510d..9a84784 100644 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/ip/IIpClientCallbacks.aidl +++ b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/ip/IIpClientCallbacks.aidl
@@ -1,18 +1,3 @@ -/** - * 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 perNmissions and - * limitations under the License. - */ /////////////////////////////////////////////////////////////////////////////// // THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // ///////////////////////////////////////////////////////////////////////////////
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/networkstack/aidl/dhcp/DhcpOption.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/networkstack/aidl/dhcp/DhcpOption.aidl index eea3e0d..c97212b 100644 --- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/networkstack/aidl/dhcp/DhcpOption.aidl +++ b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/networkstack/aidl/dhcp/DhcpOption.aidl
@@ -1,18 +1,3 @@ -/** - * 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 perNmissions and - * limitations under the License. - */ /////////////////////////////////////////////////////////////////////////////// // THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // ///////////////////////////////////////////////////////////////////////////////
diff --git a/common/networkstackclient/src/android/net/INetworkMonitor.aidl b/common/networkstackclient/src/android/net/INetworkMonitor.aidl index b124734..3fc81a3 100644 --- a/common/networkstackclient/src/android/net/INetworkMonitor.aidl +++ b/common/networkstackclient/src/android/net/INetworkMonitor.aidl
@@ -44,16 +44,10 @@ // are set, then it's equal to NETWORK_TEST_RESULT_INVALID. If NETWORK_VALIDATION_RESULT_VALID // is set, then the network validates and equal to NETWORK_TEST_RESULT_VALID. If // NETWORK_VALIDATION_RESULT_PARTIAL is set, then the network has partial connectivity which - // is equal to NETWORK_TEST_RESULT_PARTIAL_CONNECTIVITY. Networks receiving validation that both - // do not require validation and are not validated will have NETWORK_VALIDATION_RESULT_SKIPPED - // set. NETWORK_VALIDATION_PROBE_* is set when the specific probe result of the network is - // resolved. + // is equal to NETWORK_TEST_RESULT_PARTIAL_CONNECTIVITY. NETWORK_VALIDATION_PROBE_* is set + // when the specific probe result of the network is resolved. const int NETWORK_VALIDATION_RESULT_VALID = 0x01; const int NETWORK_VALIDATION_RESULT_PARTIAL = 0x02; - const int NETWORK_VALIDATION_RESULT_SKIPPED = 0x04; - - // NETWORK_VALIDATION_RESULT_* and NETWORK_VALIDATION_PROBE_* are independent values sent in - // different ints. const int NETWORK_VALIDATION_PROBE_DNS = 0x04; const int NETWORK_VALIDATION_PROBE_HTTP = 0x08; const int NETWORK_VALIDATION_PROBE_HTTPS = 0x10;
diff --git a/common/networkstackclient/src/android/net/IpMemoryStore.java b/common/networkstackclient/src/android/net/IpMemoryStore.java deleted file mode 100644 index f2c1d35..0000000 --- a/common/networkstackclient/src/android/net/IpMemoryStore.java +++ /dev/null
@@ -1,98 +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; - -import android.annotation.NonNull; -import android.content.Context; -import android.net.networkstack.ModuleNetworkStackClient; -import android.util.Log; - -import com.android.internal.annotations.VisibleForTesting; - -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.atomic.AtomicReference; -import java.util.function.Consumer; - -/** - * Manager class used to communicate with the ip memory store service in the network stack, - * which is running in a separate module. - * @hide -*/ -public class IpMemoryStore extends IpMemoryStoreClient { - private static final String TAG = IpMemoryStore.class.getSimpleName(); - @NonNull private final CompletableFuture<IIpMemoryStore> mService; - @NonNull private final AtomicReference<CompletableFuture<IIpMemoryStore>> mTailNode; - - public IpMemoryStore(@NonNull final Context context) { - super(context); - mService = new CompletableFuture<>(); - mTailNode = new AtomicReference<CompletableFuture<IIpMemoryStore>>(mService); - getModuleNetworkStackClient(context).fetchIpMemoryStore( - new IIpMemoryStoreCallbacks.Stub() { - @Override - public void onIpMemoryStoreFetched(@NonNull final IIpMemoryStore memoryStore) { - mService.complete(memoryStore); - } - - @Override - public int getInterfaceVersion() { - return this.VERSION; - } - - @Override - public String getInterfaceHash() { - return this.HASH; - } - }); - } - - /* - * If the IpMemoryStore is ready, this function will run the request synchronously. - * Otherwise, it will enqueue the requests for execution immediately after the - * service becomes ready. The requests are guaranteed to be executed in the order - * they are sumbitted. - */ - @Override - protected void runWhenServiceReady(Consumer<IIpMemoryStore> cb) throws ExecutionException { - mTailNode.getAndUpdate(future -> future.handle((store, exception) -> { - if (exception != null) { - // this should never happens since we also catch the exception below - Log.wtf(TAG, "Error fetching IpMemoryStore", exception); - return store; - } - - try { - cb.accept(store); - } catch (Exception e) { - Log.wtf(TAG, "Exception occurred: " + e.getMessage()); - } - return store; - })); - } - - @VisibleForTesting - protected ModuleNetworkStackClient getModuleNetworkStackClient(Context context) { - return ModuleNetworkStackClient.getInstance(context); - } - - /** Gets an instance of the memory store */ - @NonNull - public static IpMemoryStore getMemoryStore(final Context context) { - return new IpMemoryStore(context); - } -}
diff --git a/common/networkstackclient/src/android/net/NetworkMonitorManager.java b/common/networkstackclient/src/android/net/NetworkMonitorManager.java deleted file mode 100644 index 0f66981..0000000 --- a/common/networkstackclient/src/android/net/NetworkMonitorManager.java +++ /dev/null
@@ -1,203 +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; - -import android.annotation.Hide; -import android.annotation.NonNull; -import android.os.Binder; -import android.os.RemoteException; -import android.util.Log; - -/** - * A convenience wrapper for INetworkMonitor. - * - * Wraps INetworkMonitor calls, making them a bit more friendly to use. Currently handles: - * - Clearing calling identity - * - Ignoring RemoteExceptions - * - Converting to stable parcelables - * - * By design, all methods on INetworkMonitor are asynchronous oneway IPCs and are thus void. All the - * wrapper methods in this class return a boolean that callers can use to determine whether - * RemoteException was thrown. - */ -@Hide -public class NetworkMonitorManager { - - @NonNull private final INetworkMonitor mNetworkMonitor; - @NonNull private final String mTag; - - public NetworkMonitorManager(@NonNull INetworkMonitor networkMonitorManager, - @NonNull String tag) { - mNetworkMonitor = networkMonitorManager; - mTag = tag; - } - - public NetworkMonitorManager(@NonNull INetworkMonitor networkMonitorManager) { - this(networkMonitorManager, NetworkMonitorManager.class.getSimpleName()); - } - - private void log(String s, Throwable e) { - Log.e(mTag, s, e); - } - - // CHECKSTYLE:OFF Generated code - - public boolean start() { - final long token = Binder.clearCallingIdentity(); - try { - mNetworkMonitor.start(); - return true; - } catch (RemoteException e) { - log("Error in start", e); - return false; - } finally { - Binder.restoreCallingIdentity(token); - } - } - - public boolean launchCaptivePortalApp() { - final long token = Binder.clearCallingIdentity(); - try { - mNetworkMonitor.launchCaptivePortalApp(); - return true; - } catch (RemoteException e) { - log("Error in launchCaptivePortalApp", e); - return false; - } finally { - Binder.restoreCallingIdentity(token); - } - } - - public boolean notifyCaptivePortalAppFinished(int response) { - final long token = Binder.clearCallingIdentity(); - try { - mNetworkMonitor.notifyCaptivePortalAppFinished(response); - return true; - } catch (RemoteException e) { - log("Error in notifyCaptivePortalAppFinished", e); - return false; - } finally { - Binder.restoreCallingIdentity(token); - } - } - - public boolean setAcceptPartialConnectivity() { - final long token = Binder.clearCallingIdentity(); - try { - mNetworkMonitor.setAcceptPartialConnectivity(); - return true; - } catch (RemoteException e) { - log("Error in setAcceptPartialConnectivity", e); - return false; - } finally { - Binder.restoreCallingIdentity(token); - } - } - - public boolean forceReevaluation(int uid) { - final long token = Binder.clearCallingIdentity(); - try { - mNetworkMonitor.forceReevaluation(uid); - return true; - } catch (RemoteException e) { - log("Error in forceReevaluation", e); - return false; - } finally { - Binder.restoreCallingIdentity(token); - } - } - - public boolean notifyPrivateDnsChanged(PrivateDnsConfigParcel config) { - final long token = Binder.clearCallingIdentity(); - try { - mNetworkMonitor.notifyPrivateDnsChanged(config); - return true; - } catch (RemoteException e) { - log("Error in notifyPrivateDnsChanged", e); - return false; - } finally { - Binder.restoreCallingIdentity(token); - } - } - - public boolean notifyDnsResponse(int returnCode) { - final long token = Binder.clearCallingIdentity(); - try { - mNetworkMonitor.notifyDnsResponse(returnCode); - return true; - } catch (RemoteException e) { - log("Error in notifyDnsResponse", e); - return false; - } finally { - Binder.restoreCallingIdentity(token); - } - } - - public boolean notifyNetworkConnected(LinkProperties lp, NetworkCapabilities nc) { - final long token = Binder.clearCallingIdentity(); - try { - mNetworkMonitor.notifyNetworkConnected(lp, nc); - return true; - } catch (RemoteException e) { - log("Error in notifyNetworkConnected", e); - return false; - } finally { - Binder.restoreCallingIdentity(token); - } - } - - public boolean notifyNetworkDisconnected() { - final long token = Binder.clearCallingIdentity(); - try { - mNetworkMonitor.notifyNetworkDisconnected(); - return true; - } catch (RemoteException e) { - log("Error in notifyNetworkDisconnected", e); - return false; - } finally { - Binder.restoreCallingIdentity(token); - } - } - - public boolean notifyLinkPropertiesChanged(LinkProperties lp) { - final long token = Binder.clearCallingIdentity(); - try { - mNetworkMonitor.notifyLinkPropertiesChanged(lp); - return true; - } catch (RemoteException e) { - log("Error in notifyLinkPropertiesChanged", e); - return false; - } finally { - Binder.restoreCallingIdentity(token); - } - } - - public boolean notifyNetworkCapabilitiesChanged(NetworkCapabilities nc) { - final long token = Binder.clearCallingIdentity(); - try { - mNetworkMonitor.notifyNetworkCapabilitiesChanged(nc); - return true; - } catch (RemoteException e) { - log("Error in notifyNetworkCapabilitiesChanged", e); - return false; - } finally { - Binder.restoreCallingIdentity(token); - } - } - - // CHECKSTYLE:ON Generated code -}
diff --git a/common/networkstackclient/src/android/net/ProvisioningConfigurationParcelable.aidl b/common/networkstackclient/src/android/net/ProvisioningConfigurationParcelable.aidl index 54a5729..0aeebcb 100644 --- a/common/networkstackclient/src/android/net/ProvisioningConfigurationParcelable.aidl +++ b/common/networkstackclient/src/android/net/ProvisioningConfigurationParcelable.aidl
@@ -29,9 +29,7 @@ @JavaDerive(toString=true) parcelable ProvisioningConfigurationParcelable { - /** @deprecated use ipv4ProvisioningMode instead. */ boolean enableIPv4; - /** @deprecated use ipv6ProvisioningMode instead. */ boolean enableIPv6; boolean usingMultinetworkPolicyTracker; boolean usingIpReachabilityMonitor; @@ -47,6 +45,4 @@ @nullable ScanResultInfoParcelable scanResultInfo; @nullable Layer2InformationParcelable layer2Info; @nullable List<DhcpOption> options; - int ipv4ProvisioningMode; - int ipv6ProvisioningMode; }
diff --git a/common/networkstackclient/src/android/net/ip/IIpClient.aidl b/common/networkstackclient/src/android/net/ip/IIpClient.aidl index f76a230..029bdb3 100644 --- a/common/networkstackclient/src/android/net/ip/IIpClient.aidl +++ b/common/networkstackclient/src/android/net/ip/IIpClient.aidl
@@ -23,36 +23,6 @@ /** @hide */ oneway interface IIpClient { - /** - * Disable IPv4 provisioning. - */ - const int PROV_IPV4_DISABLED = 0x00; - - /** - * Enable IPv4 provisioning using static IP addresses. - */ - const int PROV_IPV4_STATIC = 0x01; - - /** - * Enable IPv4 provisioning using DHCP. - */ - const int PROV_IPV4_DHCP = 0x02; - - /** - * Disable IPv6 provisioning. - */ - const int PROV_IPV6_DISABLED = 0x00; - - /** - * Enable IPv6 provisioning via SLAAC. - */ - const int PROV_IPV6_SLAAC = 0x01; - - /** - * Enable IPv6 Link-local only. - */ - const int PROV_IPV6_LINKLOCAL = 0x02; - void completedPreDhcpAction(); void confirmConfiguration(); void readPacketFilterComplete(in byte[] data);
diff --git a/common/networkstackclient/src/android/net/ip/IpClientCallbacks.java b/common/networkstackclient/src/android/net/ip/IpClientCallbacks.java deleted file mode 100644 index b17fcaa..0000000 --- a/common/networkstackclient/src/android/net/ip/IpClientCallbacks.java +++ /dev/null
@@ -1,136 +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.ip; - -import android.net.DhcpResultsParcelable; -import android.net.Layer2PacketParcelable; -import android.net.LinkProperties; - -import java.util.List; - -/** - * Callbacks for handling IpClient events. - * - * This is a convenience class to allow clients not to override all methods of IIpClientCallbacks, - * and avoid unparceling arguments. - * These methods are called asynchronously on a Binder thread, as IpClient lives in a different - * process. - * @hide - */ -public class IpClientCallbacks { - - /** - * Callback called upon IpClient creation. - * - * @param ipClient The Binder token to communicate with IpClient. - */ - public void onIpClientCreated(IIpClient ipClient) {} - - /** - * Callback called prior to DHCP discovery/renewal. - * - * <p>In order to receive onPreDhcpAction(), call #withPreDhcpAction() when constructing a - * ProvisioningConfiguration. - * - * <p>Implementations of onPreDhcpAction() must call IpClient#completedPreDhcpAction() to - * indicate that DHCP is clear to proceed. - */ - public void onPreDhcpAction() {} - - /** - * Callback called after DHCP discovery/renewal. - */ - public void onPostDhcpAction() {} - - /** - * Callback called when new DHCP results are available. - * - * <p>This is purely advisory and not an indication of provisioning success or failure. This is - * only here for callers that want to expose DHCPv4 results to other APIs - * (e.g., WifiInfo#setInetAddress). - * - * <p>DHCPv4 or static IPv4 configuration failure or success can be determined by whether or not - * the passed-in DhcpResults object is null. - */ - public void onNewDhcpResults(DhcpResultsParcelable dhcpResults) { - // In general callbacks would not use a parcelable directly (DhcpResultsParcelable), and - // would use a wrapper instead, because of the lack of safety of stable parcelables. But - // there are already two classes in the tree for DHCP information: DhcpInfo and DhcpResults, - // and neither of them exposes an appropriate API (they are bags of mutable fields and can't - // be changed because they are public API and @UnsupportedAppUsage, being no better than the - // stable parcelable). Adding a third class would cost more than the gain considering that - // the only client of this callback is WiFi, which will end up converting the results to - // DhcpInfo anyway. - } - - /** - * Indicates that provisioning was successful. - */ - public void onProvisioningSuccess(LinkProperties newLp) {} - - /** - * Indicates that provisioning failed. - */ - public void onProvisioningFailure(LinkProperties newLp) {} - - /** - * Invoked on LinkProperties changes. - */ - public void onLinkPropertiesChange(LinkProperties newLp) {} - - /**Called when the internal IpReachabilityMonitor (if enabled) has - * detected the loss of a critical number of required neighbors. - */ - public void onReachabilityLost(String logMsg) {} - - /** - * Called when the IpClient state machine terminates. - */ - public void onQuit() {} - - /** - * Called to indicate that a new APF program must be installed to filter incoming packets. - */ - public void installPacketFilter(byte[] filter) {} - - /** - * Called to indicate that the APF Program & data buffer must be read asynchronously from the - * wifi driver. - * - * <p>Due to Wifi HAL limitations, the current implementation only supports dumping the entire - * buffer. In response to this request, the driver returns the data buffer asynchronously - * by sending an IpClient#EVENT_READ_PACKET_FILTER_COMPLETE message. - */ - public void startReadPacketFilter() {} - - /** - * If multicast filtering cannot be accomplished with APF, this function will be called to - * actuate multicast filtering using another means. - */ - public void setFallbackMulticastFilter(boolean enabled) {} - - /** - * Enabled/disable Neighbor Discover offload functionality. This is called, for example, - * whenever 464xlat is being started or stopped. - */ - public void setNeighborDiscoveryOffload(boolean enable) {} - - /** - * Invoked on starting preconnection process. - */ - public void onPreconnectionStart(List<Layer2PacketParcelable> packets) {} -}
diff --git a/common/networkstackclient/src/android/net/ip/IpClientManager.java b/common/networkstackclient/src/android/net/ip/IpClientManager.java deleted file mode 100644 index b45405f..0000000 --- a/common/networkstackclient/src/android/net/ip/IpClientManager.java +++ /dev/null
@@ -1,326 +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.ip; - -import android.annotation.Hide; -import android.annotation.NonNull; -import android.net.NattKeepalivePacketData; -import android.net.ProxyInfo; -import android.net.TcpKeepalivePacketData; -import android.net.TcpKeepalivePacketDataParcelable; -import android.net.shared.Layer2Information; -import android.net.shared.ProvisioningConfiguration; -import android.net.util.KeepalivePacketDataUtil; -import android.os.Binder; -import android.os.RemoteException; -import android.util.Log; - -/** - * A convenience wrapper for IpClient. - * - * Wraps IIpClient calls, making them a bit more friendly to use. Currently handles: - * - Clearing calling identity - * - Ignoring RemoteExceptions - * - Converting to stable parcelables - * - * By design, all methods on IIpClient are asynchronous oneway IPCs and are thus void. All the - * wrapper methods in this class return a boolean that callers can use to determine whether - * RemoteException was thrown. - */ -@Hide -public class IpClientManager { - @NonNull private final IIpClient mIpClient; - @NonNull private final String mTag; - - public IpClientManager(@NonNull IIpClient ipClient, @NonNull String tag) { - mIpClient = ipClient; - mTag = tag; - } - - public IpClientManager(@NonNull IIpClient ipClient) { - this(ipClient, IpClientManager.class.getSimpleName()); - } - - private void log(String s, Throwable e) { - Log.e(mTag, s, e); - } - - /** - * For clients using {@link ProvisioningConfiguration.Builder#withPreDhcpAction()}, must be - * called after {@link IIpClientCallbacks#onPreDhcpAction} to indicate that DHCP is clear to - * proceed. - */ - public boolean completedPreDhcpAction() { - final long token = Binder.clearCallingIdentity(); - try { - mIpClient.completedPreDhcpAction(); - return true; - } catch (RemoteException e) { - log("Error completing PreDhcpAction", e); - return false; - } finally { - Binder.restoreCallingIdentity(token); - } - } - - /** - * Confirm the provisioning configuration. - */ - public boolean confirmConfiguration() { - final long token = Binder.clearCallingIdentity(); - try { - mIpClient.confirmConfiguration(); - return true; - } catch (RemoteException e) { - log("Error confirming IpClient configuration", e); - return false; - } finally { - Binder.restoreCallingIdentity(token); - } - } - - /** - * Indicate that packet filter read is complete. - */ - public boolean readPacketFilterComplete(byte[] data) { - final long token = Binder.clearCallingIdentity(); - try { - mIpClient.readPacketFilterComplete(data); - return true; - } catch (RemoteException e) { - log("Error notifying IpClient of packet filter read", e); - return false; - } finally { - Binder.restoreCallingIdentity(token); - } - } - - /** - * Shut down this IpClient instance altogether. - */ - public boolean shutdown() { - final long token = Binder.clearCallingIdentity(); - try { - mIpClient.shutdown(); - return true; - } catch (RemoteException e) { - log("Error shutting down IpClient", e); - return false; - } finally { - Binder.restoreCallingIdentity(token); - } - } - - /** - * Start provisioning with the provided parameters. - */ - public boolean startProvisioning(ProvisioningConfiguration prov) { - final long token = Binder.clearCallingIdentity(); - try { - mIpClient.startProvisioning(prov.toStableParcelable()); - return true; - } catch (RemoteException e) { - log("Error starting IpClient provisioning", e); - return false; - } finally { - Binder.restoreCallingIdentity(token); - } - } - - /** - * Stop this IpClient. - * - * <p>This does not shut down the StateMachine itself, which is handled by {@link #shutdown()}. - */ - public boolean stop() { - final long token = Binder.clearCallingIdentity(); - try { - mIpClient.stop(); - return true; - } catch (RemoteException e) { - log("Error stopping IpClient", e); - return false; - } finally { - Binder.restoreCallingIdentity(token); - } - } - - /** - * Set the TCP buffer sizes to use. - * - * This may be called, repeatedly, at any time before or after a call to - * #startProvisioning(). The setting is cleared upon calling #stop(). - */ - public boolean setTcpBufferSizes(String tcpBufferSizes) { - final long token = Binder.clearCallingIdentity(); - try { - mIpClient.setTcpBufferSizes(tcpBufferSizes); - return true; - } catch (RemoteException e) { - log("Error setting IpClient TCP buffer sizes", e); - return false; - } finally { - Binder.restoreCallingIdentity(token); - } - } - - /** - * Set the HTTP Proxy configuration to use. - * - * This may be called, repeatedly, at any time before or after a call to - * #startProvisioning(). The setting is cleared upon calling #stop(). - */ - public boolean setHttpProxy(ProxyInfo proxyInfo) { - final long token = Binder.clearCallingIdentity(); - try { - mIpClient.setHttpProxy(proxyInfo); - return true; - } catch (RemoteException e) { - log("Error setting IpClient proxy", e); - return false; - } finally { - Binder.restoreCallingIdentity(token); - } - } - - /** - * Enable or disable the multicast filter. Attempts to use APF to accomplish the filtering, - * if not, Callback.setFallbackMulticastFilter() is called. - */ - public boolean setMulticastFilter(boolean enabled) { - final long token = Binder.clearCallingIdentity(); - try { - mIpClient.setMulticastFilter(enabled); - return true; - } catch (RemoteException e) { - log("Error setting multicast filter", e); - return false; - } finally { - Binder.restoreCallingIdentity(token); - } - } - - /** - * Add a TCP keepalive packet filter before setting up keepalive offload. - */ - public boolean addKeepalivePacketFilter(int slot, TcpKeepalivePacketData pkt) { - return addKeepalivePacketFilter(slot, KeepalivePacketDataUtil.toStableParcelable(pkt)); - } - - /** - * Add a TCP keepalive packet filter before setting up keepalive offload. - * @deprecated This method is for use on pre-S platforms where TcpKeepalivePacketData is not - * system API. On newer platforms use - * addKeepalivePacketFilter(int, TcpKeepalivePacketData) instead. - */ - @Deprecated - public boolean addKeepalivePacketFilter(int slot, TcpKeepalivePacketDataParcelable pkt) { - final long token = Binder.clearCallingIdentity(); - try { - mIpClient.addKeepalivePacketFilter(slot, pkt); - return true; - } catch (RemoteException e) { - log("Error adding Keepalive Packet Filter ", e); - return false; - } finally { - Binder.restoreCallingIdentity(token); - } - } - - /** - * Add a NAT-T keepalive packet filter before setting up keepalive offload. - */ - public boolean addKeepalivePacketFilter(int slot, NattKeepalivePacketData pkt) { - final long token = Binder.clearCallingIdentity(); - try { - mIpClient.addNattKeepalivePacketFilter( - slot, KeepalivePacketDataUtil.toStableParcelable(pkt)); - return true; - } catch (RemoteException e) { - log("Error adding NAT-T Keepalive Packet Filter ", e); - return false; - } finally { - Binder.restoreCallingIdentity(token); - } - } - - /** - * Remove a keepalive packet filter after stopping keepalive offload. - */ - public boolean removeKeepalivePacketFilter(int slot) { - final long token = Binder.clearCallingIdentity(); - try { - mIpClient.removeKeepalivePacketFilter(slot); - return true; - } catch (RemoteException e) { - log("Error removing Keepalive Packet Filter ", e); - return false; - } finally { - Binder.restoreCallingIdentity(token); - } - } - - /** - * Set the L2 key and group hint for storing info into the memory store. - */ - public boolean setL2KeyAndGroupHint(String l2Key, String groupHint) { - final long token = Binder.clearCallingIdentity(); - try { - mIpClient.setL2KeyAndGroupHint(l2Key, groupHint); - return true; - } catch (RemoteException e) { - log("Failed setL2KeyAndGroupHint", e); - return false; - } finally { - Binder.restoreCallingIdentity(token); - } - } - - /** - * Notify IpClient that preconnection is complete and that the link is ready for use. - * The success parameter indicates whether the packets passed in by 'onPreconnectionStart' - * were successfully sent to the network or not. - */ - public boolean notifyPreconnectionComplete(boolean success) { - final long token = Binder.clearCallingIdentity(); - try { - mIpClient.notifyPreconnectionComplete(success); - return true; - } catch (RemoteException e) { - log("Error notifying IpClient Preconnection completed", e); - return false; - } finally { - Binder.restoreCallingIdentity(token); - } - } - - /** - * Update the bssid, L2 key and group hint layer2 information. - */ - public boolean updateLayer2Information(Layer2Information info) { - final long token = Binder.clearCallingIdentity(); - try { - mIpClient.updateLayer2Information(info.toStableParcelable()); - return true; - } catch (RemoteException e) { - log("Error updating layer2 information", e); - return false; - } finally { - Binder.restoreCallingIdentity(token); - } - } -}
diff --git a/common/networkstackclient/src/android/net/ip/IpClientUtil.java b/common/networkstackclient/src/android/net/ip/IpClientUtil.java deleted file mode 100644 index 1b55776..0000000 --- a/common/networkstackclient/src/android/net/ip/IpClientUtil.java +++ /dev/null
@@ -1,204 +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.ip; - -import android.content.Context; -import android.net.DhcpResultsParcelable; -import android.net.Layer2PacketParcelable; -import android.net.LinkProperties; -import android.net.networkstack.ModuleNetworkStackClient; -import android.os.ConditionVariable; - -import java.io.FileDescriptor; -import java.io.PrintWriter; -import java.util.List; - - -/** - * Utilities and wrappers to simplify communication with IpClient, which lives in the NetworkStack - * process. - * - * @hide - */ -public class IpClientUtil { - // TODO: remove with its callers - public static final String DUMP_ARG = "ipclient"; - - /** - * Subclass of {@link IpClientCallbacks} allowing clients to block until provisioning is - * complete with {@link WaitForProvisioningCallbacks#waitForProvisioning()}. - */ - public static class WaitForProvisioningCallbacks extends IpClientCallbacks { - private final ConditionVariable mCV = new ConditionVariable(); - private LinkProperties mCallbackLinkProperties; - - /** - * Block until either {@link #onProvisioningSuccess(LinkProperties)} or - * {@link #onProvisioningFailure(LinkProperties)} is called. - */ - public LinkProperties waitForProvisioning() { - mCV.block(); - return mCallbackLinkProperties; - } - - @Override - public void onProvisioningSuccess(LinkProperties newLp) { - mCallbackLinkProperties = newLp; - mCV.open(); - } - - @Override - public void onProvisioningFailure(LinkProperties newLp) { - mCallbackLinkProperties = null; - mCV.open(); - } - } - - /** - * Create a new IpClient. - * - * <p>This is a convenience method to allow clients to use {@link IpClientCallbacks} instead of - * {@link IIpClientCallbacks}. - * @see {@link ModuleNetworkStackClient#makeIpClient(String, IIpClientCallbacks)} - */ - public static void makeIpClient(Context context, String ifName, IpClientCallbacks callback) { - ModuleNetworkStackClient.getInstance(context) - .makeIpClient(ifName, new IpClientCallbacksProxy(callback)); - } - - /** - * Wrapper to relay calls from {@link IIpClientCallbacks} to {@link IpClientCallbacks}. - */ - private static class IpClientCallbacksProxy extends IIpClientCallbacks.Stub { - protected final IpClientCallbacks mCb; - - /** - * Create a new IpClientCallbacksProxy. - */ - IpClientCallbacksProxy(IpClientCallbacks cb) { - mCb = cb; - } - - @Override - public void onIpClientCreated(IIpClient ipClient) { - mCb.onIpClientCreated(ipClient); - } - - @Override - public void onPreDhcpAction() { - mCb.onPreDhcpAction(); - } - - @Override - public void onPostDhcpAction() { - mCb.onPostDhcpAction(); - } - - // This is purely advisory and not an indication of provisioning - // success or failure. This is only here for callers that want to - // expose DHCPv4 results to other APIs (e.g., WifiInfo#setInetAddress). - // DHCPv4 or static IPv4 configuration failure or success can be - // determined by whether or not the passed-in DhcpResults object is - // null or not. - @Override - public void onNewDhcpResults(DhcpResultsParcelable dhcpResults) { - mCb.onNewDhcpResults(dhcpResults); - } - - @Override - public void onProvisioningSuccess(LinkProperties newLp) { - mCb.onProvisioningSuccess(newLp); - } - @Override - public void onProvisioningFailure(LinkProperties newLp) { - mCb.onProvisioningFailure(newLp); - } - - // Invoked on LinkProperties changes. - @Override - public void onLinkPropertiesChange(LinkProperties newLp) { - mCb.onLinkPropertiesChange(newLp); - } - - // Called when the internal IpReachabilityMonitor (if enabled) has - // detected the loss of a critical number of required neighbors. - @Override - public void onReachabilityLost(String logMsg) { - mCb.onReachabilityLost(logMsg); - } - - // Called when the IpClient state machine terminates. - @Override - public void onQuit() { - mCb.onQuit(); - } - - // Install an APF program to filter incoming packets. - @Override - public void installPacketFilter(byte[] filter) { - mCb.installPacketFilter(filter); - } - - // Asynchronously read back the APF program & data buffer from the wifi driver. - // Due to Wifi HAL limitations, the current implementation only supports dumping the entire - // buffer. In response to this request, the driver returns the data buffer asynchronously - // by sending an IpClient#EVENT_READ_PACKET_FILTER_COMPLETE message. - @Override - public void startReadPacketFilter() { - mCb.startReadPacketFilter(); - } - - // If multicast filtering cannot be accomplished with APF, this function will be called to - // actuate multicast filtering using another means. - @Override - public void setFallbackMulticastFilter(boolean enabled) { - mCb.setFallbackMulticastFilter(enabled); - } - - // Enabled/disable Neighbor Discover offload functionality. This is - // called, for example, whenever 464xlat is being started or stopped. - @Override - public void setNeighborDiscoveryOffload(boolean enable) { - mCb.setNeighborDiscoveryOffload(enable); - } - - // Invoked on starting preconnection process. - @Override - public void onPreconnectionStart(List<Layer2PacketParcelable> packets) { - mCb.onPreconnectionStart(packets); - } - - @Override - public int getInterfaceVersion() { - return this.VERSION; - } - - @Override - public String getInterfaceHash() { - return this.HASH; - } - } - - /** - * Dump logs for the specified IpClient. - * TODO: remove callers and delete - */ - public static void dumpIpClient( - IIpClient connector, FileDescriptor fd, PrintWriter pw, String[] args) { - pw.println("IpClient logs have moved to dumpsys network_stack"); - } -}
diff --git a/common/networkstackclient/src/android/net/util/KeepalivePacketDataUtil.java b/common/networkstackclient/src/android/net/util/KeepalivePacketDataUtil.java deleted file mode 100644 index 5666985..0000000 --- a/common/networkstackclient/src/android/net/util/KeepalivePacketDataUtil.java +++ /dev/null
@@ -1,223 +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.util; - -import static android.net.SocketKeepalive.ERROR_INVALID_IP_ADDRESS; - -import android.annotation.NonNull; -import android.annotation.Nullable; -import android.net.InvalidPacketException; -import android.net.KeepalivePacketData; -import android.net.NattKeepalivePacketData; -import android.net.NattKeepalivePacketDataParcelable; -import android.net.TcpKeepalivePacketData; -import android.net.TcpKeepalivePacketDataParcelable; -import android.os.Build; -import android.system.OsConstants; -import android.util.Log; - -import com.android.net.module.util.IpUtils; - -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; - -/** - * Utility class to convert to/from keepalive data parcelables. - * - * TODO: move to networkstack-client library when it is moved to frameworks/libs/net. - * This class cannot go into other shared libraries as it depends on NetworkStack AIDLs. - * @hide - */ -public final class KeepalivePacketDataUtil { - private static final int IPV4_HEADER_LENGTH = 20; - private static final int IPV6_HEADER_LENGTH = 40; - private static final int TCP_HEADER_LENGTH = 20; - - private static final String TAG = KeepalivePacketDataUtil.class.getSimpleName(); - - /** - * Convert a NattKeepalivePacketData to a NattKeepalivePacketDataParcelable. - */ - @NonNull - public static NattKeepalivePacketDataParcelable toStableParcelable( - @NonNull NattKeepalivePacketData pkt) { - final NattKeepalivePacketDataParcelable parcel = new NattKeepalivePacketDataParcelable(); - final InetAddress srcAddress = pkt.getSrcAddress(); - final InetAddress dstAddress = pkt.getDstAddress(); - parcel.srcAddress = srcAddress.getAddress(); - parcel.srcPort = pkt.getSrcPort(); - parcel.dstAddress = dstAddress.getAddress(); - parcel.dstPort = pkt.getDstPort(); - return parcel; - } - - /** - * Convert a TcpKeepalivePacketData to a TcpKeepalivePacketDataParcelable. - */ - @NonNull - public static TcpKeepalivePacketDataParcelable toStableParcelable( - @NonNull TcpKeepalivePacketData pkt) { - final TcpKeepalivePacketDataParcelable parcel = new TcpKeepalivePacketDataParcelable(); - final InetAddress srcAddress = pkt.getSrcAddress(); - final InetAddress dstAddress = pkt.getDstAddress(); - parcel.srcAddress = srcAddress.getAddress(); - parcel.srcPort = pkt.getSrcPort(); - parcel.dstAddress = dstAddress.getAddress(); - parcel.dstPort = pkt.getDstPort(); - parcel.seq = pkt.getTcpSeq(); - parcel.ack = pkt.getTcpAck(); - parcel.rcvWnd = pkt.getTcpWindow(); - parcel.rcvWndScale = pkt.getTcpWindowScale(); - parcel.tos = pkt.getIpTos(); - parcel.ttl = pkt.getIpTtl(); - return parcel; - } - - /** - * Factory method to create tcp keepalive packet structure. - * @hide - */ - public static TcpKeepalivePacketData fromStableParcelable( - TcpKeepalivePacketDataParcelable tcpDetails) throws InvalidPacketException { - final byte[] packet; - try { - if ((tcpDetails.srcAddress != null) && (tcpDetails.dstAddress != null) - && (tcpDetails.srcAddress.length == 4 /* V4 IP length */) - && (tcpDetails.dstAddress.length == 4 /* V4 IP length */)) { - packet = buildV4Packet(tcpDetails); - } else { - // TODO: support ipv6 - throw new InvalidPacketException(ERROR_INVALID_IP_ADDRESS); - } - return new TcpKeepalivePacketData( - InetAddress.getByAddress(tcpDetails.srcAddress), - tcpDetails.srcPort, - InetAddress.getByAddress(tcpDetails.dstAddress), - tcpDetails.dstPort, - packet, - tcpDetails.seq, tcpDetails.ack, tcpDetails.rcvWnd, tcpDetails.rcvWndScale, - tcpDetails.tos, tcpDetails.ttl); - } catch (UnknownHostException e) { - throw new InvalidPacketException(ERROR_INVALID_IP_ADDRESS); - } - - } - - /** - * Build ipv4 tcp keepalive packet, not including the link-layer header. - */ - // TODO : if this code is ever moved to the network stack, factorize constants with the ones - // over there. - private static byte[] buildV4Packet(TcpKeepalivePacketDataParcelable tcpDetails) { - final int length = IPV4_HEADER_LENGTH + TCP_HEADER_LENGTH; - ByteBuffer buf = ByteBuffer.allocate(length); - buf.order(ByteOrder.BIG_ENDIAN); - buf.put((byte) 0x45); // IP version and IHL - buf.put((byte) tcpDetails.tos); // TOS - buf.putShort((short) length); - buf.putInt(0x00004000); // ID, flags=DF, offset - buf.put((byte) tcpDetails.ttl); // TTL - buf.put((byte) OsConstants.IPPROTO_TCP); - final int ipChecksumOffset = buf.position(); - buf.putShort((short) 0); // IP checksum - buf.put(tcpDetails.srcAddress); - buf.put(tcpDetails.dstAddress); - buf.putShort((short) tcpDetails.srcPort); - buf.putShort((short) tcpDetails.dstPort); - buf.putInt(tcpDetails.seq); // Sequence Number - buf.putInt(tcpDetails.ack); // ACK - buf.putShort((short) 0x5010); // TCP length=5, flags=ACK - buf.putShort((short) (tcpDetails.rcvWnd >> tcpDetails.rcvWndScale)); // Window size - final int tcpChecksumOffset = buf.position(); - buf.putShort((short) 0); // TCP checksum - // URG is not set therefore the urgent pointer is zero. - buf.putShort((short) 0); // Urgent pointer - - buf.putShort(ipChecksumOffset, com.android.net.module.util.IpUtils.ipChecksum(buf, 0)); - buf.putShort(tcpChecksumOffset, IpUtils.tcpChecksum( - buf, 0, IPV4_HEADER_LENGTH, TCP_HEADER_LENGTH)); - - return buf.array(); - } - - // TODO: add buildV6Packet. - - /** - * Get a {@link TcpKeepalivePacketDataParcelable} from {@link KeepalivePacketData}, if the - * generic class actually contains TCP keepalive data. - * - * @deprecated This method is used on R platforms where android.net.TcpKeepalivePacketData was - * not yet system API. Newer platforms should use android.net.TcpKeepalivePacketData directly. - * - * @param data A {@link KeepalivePacketData} that may contain TCP keepalive data. - * @return A parcelable containing TCP keepalive data, or null if the input data does not - * contain TCP keepalive data. - */ - @Deprecated - @SuppressWarnings("AndroidFrameworkCompatChange") // API version check used to Log.wtf - @Nullable - public static TcpKeepalivePacketDataParcelable parseTcpKeepalivePacketData( - @Nullable KeepalivePacketData data) { - if (data == null) return null; - - if (Build.VERSION.SDK_INT > Build.VERSION_CODES.R) { - Log.wtf(TAG, "parseTcpKeepalivePacketData should not be used after R, use " - + "TcpKeepalivePacketData instead."); - } - - // Reconstruct TcpKeepalivePacketData from the packet contained in KeepalivePacketData - final ByteBuffer buffer = ByteBuffer.wrap(data.getPacket()); - buffer.order(ByteOrder.BIG_ENDIAN); - - // Most of the fields are accessible from the KeepalivePacketData superclass: instead of - // using Struct to parse everything, just extract the extra fields necessary for - // TcpKeepalivePacketData. - final int tcpSeq; - final int tcpAck; - final int wndSize; - final int ipTos; - final int ttl; - try { - // This only support IPv4, because TcpKeepalivePacketData only supports IPv4 for R and - // below, and this method should not be used on newer platforms. - tcpSeq = buffer.getInt(IPV4_HEADER_LENGTH + 4); - tcpAck = buffer.getInt(IPV4_HEADER_LENGTH + 8); - wndSize = buffer.getShort(IPV4_HEADER_LENGTH + 14); - ipTos = buffer.get(1); - ttl = buffer.get(8); - } catch (IndexOutOfBoundsException e) { - return null; - } - - final TcpKeepalivePacketDataParcelable p = new TcpKeepalivePacketDataParcelable(); - p.srcAddress = data.getSrcAddress().getAddress(); - p.srcPort = data.getSrcPort(); - p.dstAddress = data.getDstAddress().getAddress(); - p.dstPort = data.getDstPort(); - p.seq = tcpSeq; - p.ack = tcpAck; - // TcpKeepalivePacketData could actually use non-zero wndScale, but this does not affect - // actual functionality as generated packets will be the same (no wndScale option added) - p.rcvWnd = wndSize; - p.rcvWndScale = 0; - p.tos = ipTos; - p.ttl = ttl; - return p; - } -}
diff --git a/lint-baseline-current-lib.xml b/lint-baseline-current-lib.xml index e8cfe3e..f7b00f2 100644 --- a/lint-baseline-current-lib.xml +++ b/lint-baseline-current-lib.xml
@@ -3,6 +3,83 @@ <issue id="NewApi" + message="Call requires API level 31 (current min is 29): `com.android.net.module.util.ConnectivityUtils#addressAndPortToString`" + errorLine1=" ConnectivityUtils.addressAndPortToString(" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="packages/modules/NetworkStack/src/android/net/apf/ApfFilter.java" + line="1032" + column="43"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 31 (current min is 29): `com.android.net.module.util.ConnectivityUtils#addressAndPortToString`" + errorLine1=" ConnectivityUtils.addressAndPortToString(" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="packages/modules/NetworkStack/src/android/net/apf/ApfFilter.java" + line="1034" + column="43"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 31 (current min is 29): `com.android.net.module.util.ConnectivityUtils#addressAndPortToString`" + errorLine1=" ConnectivityUtils.addressAndPortToString(" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="packages/modules/NetworkStack/src/android/net/apf/ApfFilter.java" + line="1087" + column="43"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 31 (current min is 29): `com.android.net.module.util.ConnectivityUtils#addressAndPortToString`" + errorLine1=" ConnectivityUtils.addressAndPortToString(" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="packages/modules/NetworkStack/src/android/net/apf/ApfFilter.java" + line="1089" + column="43"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 31 (current min is 29): `com.android.net.module.util.CollectionUtils#any`" + errorLine1=" final boolean haveKeepaliveResponses = CollectionUtils.any(mKeepalivePackets," + errorLine2=" ~~~"> + <location + file="packages/modules/NetworkStack/src/android/net/apf/ApfFilter.java" + line="1368" + column="64"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 31 (current min is 29): `com.android.net.module.util.CollectionUtils#toIntArray`" + errorLine1=" CollectionUtils.toIntArray(mDnsReturnCode)," + errorLine2=" ~~~~~~~~~~"> + <location + file="packages/modules/NetworkStack/src/com/android/networkstack/metrics/DataStallDetectionStats.java" + line="302" + column="37"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 31 (current min is 29): `com.android.net.module.util.CollectionUtils#toLongArray`" + errorLine1=" CollectionUtils.toLongArray(mDnsTimeStamp)," + errorLine2=" ~~~~~~~~~~~"> + <location + file="packages/modules/NetworkStack/src/com/android/networkstack/metrics/DataStallDetectionStats.java" + line="303" + column="37"/> + </issue> + + <issue + id="NewApi" message="Call requires API level R (current min is 29): `android.net.LinkProperties#getNat64Prefix`" errorLine1=" newLp.setNat64Prefix(netlinkLinkProperties.getNat64Prefix());" errorLine2=" ~~~~~~~~~~~~~~"> @@ -25,6 +102,50 @@ <issue id="NewApi" + message="Call requires API level 31 (current min is 29): `com.android.net.module.util.ConnectivityUtils#saturatedCast`" + errorLine1=" mStatsBuilder.setIpv4LatencyMicros(ConnectivityUtils.saturatedCast(mIpv4Watch.stop()));" + errorLine2=" ~~~~~~~~~~~~~"> + <location + file="packages/modules/NetworkStack/src/com/android/networkstack/metrics/IpProvisioningMetrics.java" + line="74" + column="66"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 31 (current min is 29): `com.android.net.module.util.ConnectivityUtils#saturatedCast`" + errorLine1=" mStatsBuilder.setIpv6LatencyMicros(ConnectivityUtils.saturatedCast(mIpv6Watch.stop()));" + errorLine2=" ~~~~~~~~~~~~~"> + <location + file="packages/modules/NetworkStack/src/com/android/networkstack/metrics/IpProvisioningMetrics.java" + line="83" + column="66"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 31 (current min is 29): `com.android.net.module.util.CollectionUtils#isEmpty`" + errorLine1=" if (isEmpty(mCaptivePortalFallbackSpecs)) {" + errorLine2=" ~~~~~~~"> + <location + file="packages/modules/NetworkStack/src/com/android/server/connectivity/NetworkMonitor.java" + line="2279" + column="13"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 31 (current min is 29): `com.android.net.module.util.ConnectivityUtils#isIPv6ULA`" + errorLine1=" || isIPv6ULA(address)) {" + errorLine2=" ~~~~~~~~~"> + <location + file="packages/modules/NetworkStack/src/com/android/server/connectivity/NetworkMonitor.java" + line="2447" + column="24"/> + </issue> + + <issue + id="NewApi" message="Call requires API level R (current min is 29): `android.telephony.NetworkRegistrationInfo#getCellIdentity`" errorLine1=" nri == null ? null : nri.getCellIdentity());" errorLine2=" ~~~~~~~~~~~~~~~"> @@ -34,4 +155,48 @@ column="46"/> </issue> + <issue + id="NewApi" + message="Call requires API level 31 (current min is 29): `com.android.net.module.util.ConnectivityUtils#saturatedCast`" + errorLine1=" int latencyUs = ConnectivityUtils.saturatedCast(durationUs);" + errorLine2=" ~~~~~~~~~~~~~"> + <location + file="packages/modules/NetworkStack/src/com/android/networkstack/metrics/NetworkValidationMetrics.java" + line="198" + column="43"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 31 (current min is 29): `com.android.net.module.util.ConnectivityUtils#saturatedCast`" + errorLine1=" .setRemainingTtlSecs(ConnectivityUtils.saturatedCast(secondsRemaining))" + errorLine2=" ~~~~~~~~~~~~~"> + <location + file="packages/modules/NetworkStack/src/com/android/networkstack/metrics/NetworkValidationMetrics.java" + line="209" + column="56"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 31 (current min is 29): `com.android.net.module.util.ConnectivityUtils#saturatedCast`" + errorLine1=" ConnectivityUtils.saturatedCast(capportData.getByteLimit() / 1000))" + errorLine2=" ~~~~~~~~~~~~~"> + <location + file="packages/modules/NetworkStack/src/com/android/networkstack/metrics/NetworkValidationMetrics.java" + line="212" + column="43"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 31 (current min is 29): `com.android.net.module.util.ConnectivityUtils#saturatedCast`" + errorLine1=" mStatsBuilder.setLatencyMicros(ConnectivityUtils.saturatedCast(mWatch.stop()));" + errorLine2=" ~~~~~~~~~~~~~"> + <location + file="packages/modules/NetworkStack/src/com/android/networkstack/metrics/NetworkValidationMetrics.java" + line="237" + column="58"/> + </issue> + </issues>
diff --git a/lint-baseline-stable-lib.xml b/lint-baseline-stable-lib.xml index e8cfe3e..f7b00f2 100644 --- a/lint-baseline-stable-lib.xml +++ b/lint-baseline-stable-lib.xml
@@ -3,6 +3,83 @@ <issue id="NewApi" + message="Call requires API level 31 (current min is 29): `com.android.net.module.util.ConnectivityUtils#addressAndPortToString`" + errorLine1=" ConnectivityUtils.addressAndPortToString(" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="packages/modules/NetworkStack/src/android/net/apf/ApfFilter.java" + line="1032" + column="43"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 31 (current min is 29): `com.android.net.module.util.ConnectivityUtils#addressAndPortToString`" + errorLine1=" ConnectivityUtils.addressAndPortToString(" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="packages/modules/NetworkStack/src/android/net/apf/ApfFilter.java" + line="1034" + column="43"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 31 (current min is 29): `com.android.net.module.util.ConnectivityUtils#addressAndPortToString`" + errorLine1=" ConnectivityUtils.addressAndPortToString(" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="packages/modules/NetworkStack/src/android/net/apf/ApfFilter.java" + line="1087" + column="43"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 31 (current min is 29): `com.android.net.module.util.ConnectivityUtils#addressAndPortToString`" + errorLine1=" ConnectivityUtils.addressAndPortToString(" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="packages/modules/NetworkStack/src/android/net/apf/ApfFilter.java" + line="1089" + column="43"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 31 (current min is 29): `com.android.net.module.util.CollectionUtils#any`" + errorLine1=" final boolean haveKeepaliveResponses = CollectionUtils.any(mKeepalivePackets," + errorLine2=" ~~~"> + <location + file="packages/modules/NetworkStack/src/android/net/apf/ApfFilter.java" + line="1368" + column="64"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 31 (current min is 29): `com.android.net.module.util.CollectionUtils#toIntArray`" + errorLine1=" CollectionUtils.toIntArray(mDnsReturnCode)," + errorLine2=" ~~~~~~~~~~"> + <location + file="packages/modules/NetworkStack/src/com/android/networkstack/metrics/DataStallDetectionStats.java" + line="302" + column="37"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 31 (current min is 29): `com.android.net.module.util.CollectionUtils#toLongArray`" + errorLine1=" CollectionUtils.toLongArray(mDnsTimeStamp)," + errorLine2=" ~~~~~~~~~~~"> + <location + file="packages/modules/NetworkStack/src/com/android/networkstack/metrics/DataStallDetectionStats.java" + line="303" + column="37"/> + </issue> + + <issue + id="NewApi" message="Call requires API level R (current min is 29): `android.net.LinkProperties#getNat64Prefix`" errorLine1=" newLp.setNat64Prefix(netlinkLinkProperties.getNat64Prefix());" errorLine2=" ~~~~~~~~~~~~~~"> @@ -25,6 +102,50 @@ <issue id="NewApi" + message="Call requires API level 31 (current min is 29): `com.android.net.module.util.ConnectivityUtils#saturatedCast`" + errorLine1=" mStatsBuilder.setIpv4LatencyMicros(ConnectivityUtils.saturatedCast(mIpv4Watch.stop()));" + errorLine2=" ~~~~~~~~~~~~~"> + <location + file="packages/modules/NetworkStack/src/com/android/networkstack/metrics/IpProvisioningMetrics.java" + line="74" + column="66"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 31 (current min is 29): `com.android.net.module.util.ConnectivityUtils#saturatedCast`" + errorLine1=" mStatsBuilder.setIpv6LatencyMicros(ConnectivityUtils.saturatedCast(mIpv6Watch.stop()));" + errorLine2=" ~~~~~~~~~~~~~"> + <location + file="packages/modules/NetworkStack/src/com/android/networkstack/metrics/IpProvisioningMetrics.java" + line="83" + column="66"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 31 (current min is 29): `com.android.net.module.util.CollectionUtils#isEmpty`" + errorLine1=" if (isEmpty(mCaptivePortalFallbackSpecs)) {" + errorLine2=" ~~~~~~~"> + <location + file="packages/modules/NetworkStack/src/com/android/server/connectivity/NetworkMonitor.java" + line="2279" + column="13"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 31 (current min is 29): `com.android.net.module.util.ConnectivityUtils#isIPv6ULA`" + errorLine1=" || isIPv6ULA(address)) {" + errorLine2=" ~~~~~~~~~"> + <location + file="packages/modules/NetworkStack/src/com/android/server/connectivity/NetworkMonitor.java" + line="2447" + column="24"/> + </issue> + + <issue + id="NewApi" message="Call requires API level R (current min is 29): `android.telephony.NetworkRegistrationInfo#getCellIdentity`" errorLine1=" nri == null ? null : nri.getCellIdentity());" errorLine2=" ~~~~~~~~~~~~~~~"> @@ -34,4 +155,48 @@ column="46"/> </issue> + <issue + id="NewApi" + message="Call requires API level 31 (current min is 29): `com.android.net.module.util.ConnectivityUtils#saturatedCast`" + errorLine1=" int latencyUs = ConnectivityUtils.saturatedCast(durationUs);" + errorLine2=" ~~~~~~~~~~~~~"> + <location + file="packages/modules/NetworkStack/src/com/android/networkstack/metrics/NetworkValidationMetrics.java" + line="198" + column="43"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 31 (current min is 29): `com.android.net.module.util.ConnectivityUtils#saturatedCast`" + errorLine1=" .setRemainingTtlSecs(ConnectivityUtils.saturatedCast(secondsRemaining))" + errorLine2=" ~~~~~~~~~~~~~"> + <location + file="packages/modules/NetworkStack/src/com/android/networkstack/metrics/NetworkValidationMetrics.java" + line="209" + column="56"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 31 (current min is 29): `com.android.net.module.util.ConnectivityUtils#saturatedCast`" + errorLine1=" ConnectivityUtils.saturatedCast(capportData.getByteLimit() / 1000))" + errorLine2=" ~~~~~~~~~~~~~"> + <location + file="packages/modules/NetworkStack/src/com/android/networkstack/metrics/NetworkValidationMetrics.java" + line="212" + column="43"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 31 (current min is 29): `com.android.net.module.util.ConnectivityUtils#saturatedCast`" + errorLine1=" mStatsBuilder.setLatencyMicros(ConnectivityUtils.saturatedCast(mWatch.stop()));" + errorLine2=" ~~~~~~~~~~~~~"> + <location + file="packages/modules/NetworkStack/src/com/android/networkstack/metrics/NetworkValidationMetrics.java" + line="237" + column="58"/> + </issue> + </issues>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index 706f174..e54f11c 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml
@@ -19,7 +19,7 @@ <string name="notification_channel_name_connected" msgid="1795068343200033922">"Godkendelse til loginportal"</string> <string name="notification_channel_description_connected" msgid="7239184168268014518">"De notifikationer, der vises, når enheden er blevet godkendt til et netværk via en loginportal"</string> <string name="notification_channel_name_network_venue_info" msgid="6526543187249265733">"Oplysninger om netværksplacering"</string> - <string name="notification_channel_description_network_venue_info" msgid="5131499595382733605">"Notifikationer, der vises for at indikere, at netværket har en side med oplysninger om lokationen"</string> + <string name="notification_channel_description_network_venue_info" msgid="5131499595382733605">"Notifikationer, der vises for at indikere, at netværket har en side med oplysninger om placeringen"</string> <string name="connected" msgid="4563643884927480998">"Der er oprettet forbindelse"</string> <string name="tap_for_info" msgid="6849746325626883711">"Der er oprettet forbindelse/tryk for at se website"</string> <string name="application_label" msgid="1322847171305285454">"Netværksadministrator"</string>
diff --git a/res/values/config.xml b/res/values/config.xml index 805ca04..d6a11ab 100644 --- a/res/values/config.xml +++ b/res/values/config.xml
@@ -105,20 +105,4 @@ increased until reaching the config_max_retry_timer. --> <integer name="config_evaluating_bandwidth_min_retry_timer_ms"></integer> <integer name="config_evaluating_bandwidth_max_retry_timer_ms"></integer> - - <!-- Whether the APF Filter in the device should filter out IEEE 802.3 Frames - Those frames are identified by the field Eth-type having values - less than 0x600 --> - <bool name="config_apfDrop802_3Frames">true</bool> - - <!-- An array of Denylisted EtherType, packets with EtherTypes within this array - will be dropped - TODO: need to put proper values, these are for testing purposes only --> - <integer-array name="config_apfEthTypeDenyList"> - <item>0x88A2</item> - <item>0x88A4</item> - <item>0x88B8</item> - <item>0x88CD</item> - <item>0x88E3</item> - </integer-array> </resources>
diff --git a/res/values/overlayable.xml b/res/values/overlayable.xml index bfb450e..b2967b9 100644 --- a/res/values/overlayable.xml +++ b/res/values/overlayable.xml
@@ -77,13 +77,6 @@ <item type="integer" name="config_evaluating_bandwidth_timeout_ms"/> <item type="integer" name="config_evaluating_bandwidth_min_retry_timer_ms"/> <item type="integer" name="config_evaluating_bandwidth_max_retry_timer_ms"/> - - <!-- Whether the APF Filter in the device should filter out IEEE 802.3 Frames - Those frames are identified by the field Eth-type having values less than 0x600 --> - <item type="bool" name="config_apfDrop802_3Frames"/> - <!-- An array of Denylisted EtherType, packets with EtherTypes within this array - will be dropped --> - <item type="array" name="config_apfEthTypeDenyList"/> </policy> </overlayable> </resources>
diff --git a/src/android/net/apf/ApfFilter.java b/src/android/net/apf/ApfFilter.java index 7a13392..34469b8 100644 --- a/src/android/net/apf/ApfFilter.java +++ b/src/android/net/apf/ApfFilter.java
@@ -1411,7 +1411,7 @@ // pass // if it's ICMPv6 RS to any: // drop - // if it's ICMPv6 NA to anything in ff02::/120 + // if it's ICMPv6 NA to ff02::1 or ff02::2: // drop // if keepalive ack // drop @@ -1495,7 +1495,7 @@ * <li>Drop all broadcast non-IP non-ARP packets. * <li>Pass all non-ICMPv6 IPv6 packets, * <li>Pass all non-IPv4 and non-IPv6 packets, - * <li>Drop IPv6 ICMPv6 NAs to anything in ff02::/120. + * <li>Drop IPv6 ICMPv6 NAs to ff02::1 or ff02::2. * <li>Drop IPv6 ICMPv6 RSs. * <li>Filter IPv4 packets (see generateIPv4FilterLocked()) * <li>Filter IPv6 packets (see generateIPv6FilterLocked())
diff --git a/src/android/net/dhcp/DhcpPacket.java b/src/android/net/dhcp/DhcpPacket.java index 76dc807..1331a24 100644 --- a/src/android/net/dhcp/DhcpPacket.java +++ b/src/android/net/dhcp/DhcpPacket.java
@@ -403,7 +403,7 @@ // Set in unit tests, to ensure that the test does not break when run on different devices and // on different releases. - static String sTestOverrideVendorId = null; + static String testOverrideVendorId = null; protected DhcpPacket(int transId, short secs, Inet4Address clientIp, Inet4Address yourIp, Inet4Address nextIp, Inet4Address relayIp, @@ -779,7 +779,7 @@ * with the customized option value if any. */ private static String getVendorId(@Nullable List<DhcpOption> customizedClientOptions) { - if (sTestOverrideVendorId != null) return sTestOverrideVendorId; + if (testOverrideVendorId != null) return testOverrideVendorId; String vendorId = "android-dhcp-" + Build.VERSION.RELEASE; if (customizedClientOptions != null) {
diff --git a/src/android/net/ip/IpClient.java b/src/android/net/ip/IpClient.java index 12ab3fd..b03d653 100644 --- a/src/android/net/ip/IpClient.java +++ b/src/android/net/ip/IpClient.java
@@ -18,9 +18,6 @@ import static android.net.RouteInfo.RTN_UNICAST; import static android.net.dhcp.DhcpResultsParcelableUtil.toStableParcelable; -import static android.net.ip.IIpClient.PROV_IPV4_DISABLED; -import static android.net.ip.IIpClient.PROV_IPV6_DISABLED; -import static android.net.ip.IIpClient.PROV_IPV6_LINKLOCAL; 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; @@ -39,7 +36,6 @@ import static com.android.server.util.PermissionUtil.enforceNetworkStackCallingPermission; import android.content.Context; -import android.content.res.Resources; import android.net.ConnectivityManager; import android.net.DhcpResults; import android.net.INetd; @@ -64,7 +60,6 @@ import android.net.metrics.IpManagerEvent; import android.net.networkstack.aidl.dhcp.DhcpOption; import android.net.shared.InitialConfiguration; -import android.net.shared.Layer2Information; import android.net.shared.ProvisioningConfiguration; import android.net.shared.ProvisioningConfiguration.ScanResultInfo; import android.net.shared.ProvisioningConfiguration.ScanResultInfo.InformationElement; @@ -73,7 +68,6 @@ import android.net.util.SharedLog; import android.os.Build; import android.os.ConditionVariable; -import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.os.RemoteException; @@ -100,7 +94,6 @@ import com.android.internal.util.StateMachine; import com.android.internal.util.WakeupMessage; import com.android.net.module.util.DeviceConfigUtils; -import com.android.networkstack.R; import com.android.networkstack.apishim.NetworkInformationShimImpl; import com.android.networkstack.apishim.SocketUtilsShimImpl; import com.android.networkstack.apishim.common.NetworkInformationShim; @@ -152,7 +145,6 @@ * @hide */ public class IpClient extends StateMachine { - private static final String TAG = IpClient.class.getSimpleName(); private static final boolean DBG = false; // For message logging. @@ -400,24 +392,6 @@ log("Failed to call onPreconnectionStart", e); } } - - /** - * Get the version of the IIpClientCallbacks AIDL interface. - */ - public int getInterfaceVersion() { - log("getInterfaceVersion"); - try { - return mCallback.getInterfaceVersion(); - } catch (RemoteException e) { - // This can never happen for callers in the system server, because if the - // system server crashes, then the networkstack will crash as well. But it can - // happen for other callers such as bluetooth or telephony (if it starts to use - // IpClient). 0 will generally work but will assume an old client and disable - // all new features. - log("Failed to call getInterfaceVersion", e); - return 0; - } - } } public static final String DUMP_ARG_CONFIRM = "confirm"; @@ -618,33 +592,11 @@ return new IpConnectivityLog(); } - /** - * Get a NetworkQuirkMetrics instance. - */ public NetworkQuirkMetrics getNetworkQuirkMetrics() { return new NetworkQuirkMetrics(); } /** - * Get a IpReachabilityMonitor instance. - */ - public IpReachabilityMonitor getIpReachabilityMonitor(Context context, - InterfaceParams ifParams, Handler h, SharedLog log, - IpReachabilityMonitor.Callback callback, boolean usingMultinetworkPolicyTracker, - IpReachabilityMonitor.Dependencies deps, final INetd netd) { - return new IpReachabilityMonitor(context, ifParams, h, log, callback, - usingMultinetworkPolicyTracker, deps, netd); - } - - /** - * Get a IpReachabilityMonitor dependencies instance. - */ - public IpReachabilityMonitor.Dependencies getIpReachabilityMonitorDeps(Context context, - String name) { - return IpReachabilityMonitor.Dependencies.makeDefault(context, name); - } - - /** * Return whether a feature guarded by a feature flag is enabled. * @see NetworkStackUtils#isFeatureEnabled(Context, String, String) */ @@ -653,16 +605,6 @@ return DeviceConfigUtils.isFeatureEnabled(context, NAMESPACE_CONNECTIVITY, name, defaultEnabled); } - - /** - * Create an APF filter if apfCapabilities indicates support for packet filtering using - * APF programs. - * @see ApfFilter#maybeCreate - */ - public ApfFilter maybeCreateApfFilter(Context context, ApfFilter.ApfConfiguration config, - InterfaceParams ifParams, IpClientCallbacksWrapper cb) { - return ApfFilter.maybeCreate(context, config, ifParams, cb); - } } public IpClient(Context context, String ifName, IIpClientCallbacks callback, @@ -715,7 +657,7 @@ (ifaceUp) -> sendMessage(EVENT_NETLINK_LINKPROPERTIES_CHANGED, ifaceUp ? ARG_LINKPROP_CHANGED_LINKSTATE_UP : ARG_LINKPROP_CHANGED_LINKSTATE_DOWN), - config, mLog, mDependencies) { + config, mLog) { @Override public void onInterfaceAdded(String iface) { super.onInterfaceAdded(iface); @@ -816,8 +758,7 @@ @Override public void startProvisioning(ProvisioningConfigurationParcelable req) { enforceNetworkStackCallingPermission(); - IpClient.this.startProvisioning(ProvisioningConfiguration.fromStableParcelable(req, - mCallback.getInterfaceVersion())); + IpClient.this.startProvisioning(ProvisioningConfiguration.fromStableParcelable(req)); } @Override public void stop() { @@ -906,7 +847,6 @@ private void stopStateMachineUpdaters() { mObserverRegistry.unregisterObserver(mLinkObserver); - mLinkObserver.clearInterfaceParams(); mLinkObserver.shutdown(); } @@ -920,28 +860,26 @@ false /* defaultEnabled */); } - @VisibleForTesting - static MacAddress getInitialBssid(final Layer2Information layer2Info, - final ScanResultInfo scanResultInfo, boolean isAtLeastS) { - MacAddress bssid = null; + private void setInitialBssid(final ProvisioningConfiguration req) { + final ScanResultInfo scanResultInfo = req.mScanResultInfo; + mCurrentBssid = null; // http://b/185202634 // ScanResultInfo is not populated in some situations. // On S and above, prefer getting the BSSID from the Layer2Info. // On R and below, get the BSSID from the ScanResultInfo and fall back to // getting it from the Layer2Info. This ensures no regressions if any R // devices pass in a null or meaningless BSSID in the Layer2Info. - if (!isAtLeastS && scanResultInfo != null) { + if (!ShimUtils.isAtLeastS() && scanResultInfo != null) { try { - bssid = MacAddress.fromString(scanResultInfo.getBssid()); + mCurrentBssid = MacAddress.fromString(scanResultInfo.getBssid()); } catch (IllegalArgumentException e) { - Log.wtf(TAG, "Invalid BSSID: " + scanResultInfo.getBssid() + Log.wtf(mTag, "Invalid BSSID: " + scanResultInfo.getBssid() + " in provisioning configuration", e); } } - if (bssid == null && layer2Info != null) { - bssid = layer2Info.mBssid; + if (mCurrentBssid == null && req.mLayer2Info != null) { + mCurrentBssid = req.mLayer2Info.mBssid; } - return bssid; } private boolean shouldDisableAcceptRaOnProvisioningLoss() { @@ -972,8 +910,7 @@ return; } - mCurrentBssid = getInitialBssid(req.mLayer2Info, req.mScanResultInfo, - ShimUtils.isAtLeastS()); + setInitialBssid(req); if (req.mLayer2Info != null) { mL2Key = req.mLayer2Info.mL2Key; mCluster = req.mLayer2Info.mCluster; @@ -1250,41 +1187,12 @@ transitionTo(mStoppingState); } - private static boolean hasIpv6LinkLocalInterfaceRoute(final LinkProperties lp) { - for (RouteInfo r : lp.getRoutes()) { - if (r.getDestination().equals(new IpPrefix("fe80::/64")) - && r.getGateway().isAnyLocalAddress()) { - return true; - } - } - return false; - } - - private static boolean hasIpv6LinkLocalAddress(final LinkProperties lp) { - for (LinkAddress address : lp.getLinkAddresses()) { - if (address.isIpv6() && address.getAddress().isLinkLocalAddress()) { - return true; - } - } - return false; - } - - // LinkProperties has a link-local (fe80::xxx) IPv6 address and route to fe80::/64 destination. - private boolean isIpv6LinkLocalProvisioned(final LinkProperties lp) { - if (mConfiguration == null - || mConfiguration.mIPv6ProvisioningMode != PROV_IPV6_LINKLOCAL) return false; - if (hasIpv6LinkLocalAddress(lp) && hasIpv6LinkLocalInterfaceRoute(lp)) return true; - return false; - } - // For now: use WifiStateMachine's historical notion of provisioned. @VisibleForTesting - boolean isProvisioned(final LinkProperties lp, final InitialConfiguration config) { - // For historical reasons, we should connect even if all we have is an IPv4 - // address and nothing else. If IPv6 link-local only mode is enabled and - // it's provisioned without IPv4, then still connecting once IPv6 link-local - // address is ready to use and route to fe80::/64 destination is up. - if (lp.hasIpv4Address() || lp.isProvisioned() || isIpv6LinkLocalProvisioned(lp)) { + static boolean isProvisioned(LinkProperties lp, InitialConfiguration config) { + // For historical reasons, we should connect even if all we have is + // an IPv4 address and nothing else. + if (lp.hasIpv4Address() || lp.isProvisioned()) { return true; } if (config == null) { @@ -1851,7 +1759,7 @@ private boolean startIpReachabilityMonitor() { try { - mIpReachabilityMonitor = mDependencies.getIpReachabilityMonitor( + mIpReachabilityMonitor = new IpReachabilityMonitor( mContext, mInterfaceParams, getHandler(), @@ -1863,7 +1771,6 @@ } }, mConfiguration.mUsingMultinetworkPolicyTracker, - mDependencies.getIpReachabilityMonitorDeps(mContext, mInterfaceParams.name), mNetd); } catch (IllegalArgumentException iae) { // Failed to start IpReachabilityMonitor. Log it and call @@ -1945,7 +1852,7 @@ } if (mIpReachabilityMonitor != null) { - mIpReachabilityMonitor.probeAll(true /* dueToRoam */); + mIpReachabilityMonitor.probeAll(); } // Check whether to refresh previous IP lease on L2 roaming happened. @@ -1970,6 +1877,7 @@ mHasDisabledIpv6OrAcceptRaOnProvLoss = false; mGratuitousNaTargetAddresses.clear(); + mLinkObserver.clearInterfaceParams(); resetLinkProperties(); if (mStartTimeMillis > 0) { // Completed a life-cycle; send a final empty LinkProperties @@ -2041,9 +1949,6 @@ if (mDhcpClient == null) { // There's no DHCPv4 for which to wait; proceed to stopped. deferMessage(obtainMessage(CMD_JUMP_STOPPING_TO_STOPPED)); - } else { - mDhcpClient.sendMessage(DhcpClient.CMD_STOP_DHCP); - mDhcpClient.doQuit(); } // Restore the interface MTU to initial value if it has changed. @@ -2280,14 +2185,6 @@ } } - private boolean isIpv6Enabled() { - return mConfiguration.mIPv6ProvisioningMode != PROV_IPV6_DISABLED; - } - - private boolean isIpv4Enabled() { - return mConfiguration.mIPv4ProvisioningMode != PROV_IPV4_DISABLED; - } - class RunningState extends State { private ConnectivityPacketTracker mPacketTracker; private boolean mDhcpActionInFlight; @@ -2298,19 +2195,10 @@ apfConfig.apfCapabilities = mConfiguration.mApfCapabilities; apfConfig.multicastFilter = mMulticastFiltering; // Get the Configuration for ApfFilter from Context - // Resource settings were moved from ApfCapabilities APIs to NetworkStack resources in S - if (ShimUtils.isReleaseOrDevelopmentApiAbove(Build.VERSION_CODES.R)) { - final Resources res = mContext.getResources(); - apfConfig.ieee802_3Filter = res.getBoolean(R.bool.config_apfDrop802_3Frames); - apfConfig.ethTypeBlackList = res.getIntArray(R.array.config_apfEthTypeDenyList); - } else { - apfConfig.ieee802_3Filter = ApfCapabilities.getApfDrop8023Frames(); - apfConfig.ethTypeBlackList = ApfCapabilities.getApfEtherTypeBlackList(); - } - + apfConfig.ieee802_3Filter = ApfCapabilities.getApfDrop8023Frames(); + apfConfig.ethTypeBlackList = ApfCapabilities.getApfEtherTypeBlackList(); apfConfig.minRdnssLifetimeSec = mMinRdnssLifetimeSec; - mApfFilter = mDependencies.maybeCreateApfFilter(mContext, apfConfig, mInterfaceParams, - mCallback); + mApfFilter = ApfFilter.maybeCreate(mContext, apfConfig, mInterfaceParams, mCallback); // TODO: investigate the effects of any multicast filtering racing/interfering with the // rest of this IP configuration startup. if (mApfFilter == null) { @@ -2320,13 +2208,13 @@ mPacketTracker = createPacketTracker(); if (mPacketTracker != null) mPacketTracker.start(mConfiguration.mDisplayName); - if (isIpv6Enabled() && !startIPv6()) { + if (mConfiguration.mEnableIPv6 && !startIPv6()) { doImmediateProvisioningFailure(IpManagerEvent.ERROR_STARTING_IPV6); enqueueJumpToStoppingState(DisconnectCode.DC_ERROR_STARTING_IPV6); return; } - if (isIpv4Enabled() && !isUsingPreconnection() && !startIPv4()) { + if (mConfiguration.mEnableIPv4 && !isUsingPreconnection() && !startIPv4()) { doImmediateProvisioningFailure(IpManagerEvent.ERROR_STARTING_IPV4); enqueueJumpToStoppingState(DisconnectCode.DC_ERROR_STARTING_IPV4); return; @@ -2357,6 +2245,11 @@ mIpReachabilityMonitor = null; } + if (mDhcpClient != null) { + mDhcpClient.sendMessage(DhcpClient.CMD_STOP_DHCP); + mDhcpClient.doQuit(); + } + if (mPacketTracker != null) { mPacketTracker.stop(); mPacketTracker = null; @@ -2419,7 +2312,7 @@ // a DHCPv4 RENEW. We used to do this on Wi-Fi framework // roams. if (mIpReachabilityMonitor != null) { - mIpReachabilityMonitor.probeAll(false /* dueToRoam */); + mIpReachabilityMonitor.probeAll(); } break;
diff --git a/src/android/net/ip/IpClientLinkObserver.java b/src/android/net/ip/IpClientLinkObserver.java index ff0aafe..cc4a851 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 com.android.net.module.util.NetworkStackConstants.ICMPV6_ROUTER_ADVERTISEMENT; @@ -28,17 +27,16 @@ import android.net.LinkAddress; import android.net.LinkProperties; import android.net.RouteInfo; +import android.net.netlink.NduseroptMessage; +import android.net.netlink.NetlinkConstants; +import android.net.netlink.NetlinkMessage; +import android.net.netlink.StructNdOptPref64; import android.net.util.InterfaceParams; import android.net.util.SharedLog; import android.os.Handler; import android.system.OsConstants; import android.util.Log; -import com.android.net.module.util.netlink.NduseroptMessage; -import com.android.net.module.util.netlink.NetlinkConstants; -import com.android.net.module.util.netlink.NetlinkMessage; -import com.android.net.module.util.netlink.StructNdOptPref64; -import com.android.net.module.util.netlink.StructNdOptRdnss; import com.android.networkstack.apishim.NetworkInformationShimImpl; import com.android.networkstack.apishim.common.NetworkInformationShim; import com.android.server.NetworkObserver; @@ -109,7 +107,6 @@ } } - private final Context mContext; private final String mInterfaceName; private final Callback mCallback; private final LinkProperties mLinkProperties; @@ -118,15 +115,13 @@ private final AlarmManager mAlarmManager; private final Configuration mConfig; private final Handler mHandler; - private final IpClient.Dependencies mDependencies; private final MyNetlinkMonitor mNetlinkMonitor; private static final boolean DBG = false; public IpClientLinkObserver(Context context, Handler h, String iface, Callback callback, - Configuration config, SharedLog log, IpClient.Dependencies deps) { - mContext = context; + Configuration config, SharedLog log) { mInterfaceName = iface; mTag = "NetlinkTracker/" + mInterfaceName; mCallback = callback; @@ -139,7 +134,6 @@ mAlarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); mNetlinkMonitor = new MyNetlinkMonitor(h, log, mTag); mHandler.post(mNetlinkMonitor::start); - mDependencies = deps; } public void shutdown() { @@ -159,11 +153,6 @@ } } - private boolean isNetlinkEventParsingEnabled() { - return mDependencies.isFeatureEnabled(mContext, IPCLIENT_PARSE_NETLINK_EVENTS_VERSION, - false /* default value */); - } - @Override public void onInterfaceRemoved(String iface) { maybeLog("interfaceRemoved", iface); @@ -257,21 +246,17 @@ @Override public void onInterfaceDnsServerInfo(String iface, long lifetime, String[] addresses) { - if (isNetlinkEventParsingEnabled()) return; - if (!mInterfaceName.equals(iface)) return; - maybeLog("interfaceDnsServerInfo", Arrays.toString(addresses)); - updateInterfaceDnsServerInfo(lifetime, addresses); - } - - private void updateInterfaceDnsServerInfo(long lifetime, final String[] addresses) { - final boolean changed = mDnsServerRepository.addServers(lifetime, addresses); - final boolean linkState; - if (changed) { - synchronized (this) { - mDnsServerRepository.setDnsServersOn(mLinkProperties); - linkState = getInterfaceLinkStateLocked(); + if (mInterfaceName.equals(iface)) { + maybeLog("interfaceDnsServerInfo", Arrays.toString(addresses)); + final boolean changed = mDnsServerRepository.addServers(lifetime, addresses); + final boolean linkState; + if (changed) { + synchronized (this) { + mDnsServerRepository.setDnsServersOn(mLinkProperties); + linkState = getInterfaceLinkStateLocked(); + } + mCallback.update(linkState); } - mCallback.update(linkState); } } @@ -423,15 +408,6 @@ updatePref64(opt.prefix, now, expiry); } - private void processRdnssOption(StructNdOptRdnss opt) { - if (!isNetlinkEventParsingEnabled()) return; - final String[] addresses = new String[opt.servers.length]; - for (int i = 0; i < opt.servers.length; i++) { - addresses[i] = opt.servers[i].getHostAddress(); - } - updateInterfaceDnsServerInfo(opt.header.lifetime, addresses); - } - private void processNduseroptMessage(NduseroptMessage msg, final long whenMs) { if (msg.family != AF_INET6 || msg.option == null || msg.ifindex != mIfindex) return; if (msg.icmp_type != (byte) ICMPV6_ROUTER_ADVERTISEMENT) return; @@ -441,12 +417,8 @@ processPref64Option((StructNdOptPref64) msg.option, whenMs); break; - case StructNdOptRdnss.TYPE: - processRdnssOption((StructNdOptRdnss) msg.option); - break; - default: - // TODO: implement DNSSL. + // TODO: implement RDNSS and DNSSL. break; } }
diff --git a/src/android/net/ip/IpReachabilityMonitor.java b/src/android/net/ip/IpReachabilityMonitor.java index 0f199e2..3dbe662 100644 --- a/src/android/net/ip/IpReachabilityMonitor.java +++ b/src/android/net/ip/IpReachabilityMonitor.java
@@ -20,8 +20,6 @@ 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 android.content.Context; import android.net.ConnectivityManager; @@ -32,6 +30,7 @@ import android.net.ip.IpNeighborMonitor.NeighborEventConsumer; import android.net.metrics.IpConnectivityLog; import android.net.metrics.IpReachabilityEvent; +import android.net.netlink.StructNdMsg; import android.net.util.InterfaceParams; import android.net.util.SharedLog; import android.os.ConditionVariable; @@ -41,21 +40,12 @@ import android.os.PowerManager.WakeLock; import android.os.RemoteException; import android.os.SystemClock; -import android.stats.connectivity.IpType; -import android.stats.connectivity.NudEventType; -import android.stats.connectivity.NudNeighborType; import android.text.TextUtils; import android.util.Log; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.Preconditions; -import com.android.net.module.util.DeviceConfigUtils; -import com.android.net.module.util.netlink.StructNdMsg; import com.android.networkstack.R; -import com.android.networkstack.metrics.IpReachabilityMonitorMetrics; import java.io.PrintWriter; import java.net.Inet6Address; @@ -153,10 +143,6 @@ protected static final int MIN_NUD_SOLICIT_NUM = 5; protected static final int MAX_NUD_SOLICIT_INTERVAL_MS = 1000; protected static final int MIN_NUD_SOLICIT_INTERVAL_MS = 750; - protected static final int NUD_MCAST_RESOLICIT_NUM = 3; - private static final int INVALID_NUD_MCAST_RESOLICIT_NUM = -1; - - private static final int INVALID_LEGACY_NUD_FAILURE_TYPE = -1; public interface Callback { /** @@ -175,8 +161,6 @@ interface Dependencies { void acquireWakeLock(long durationMs); IpNeighborMonitor makeIpNeighborMonitor(Handler h, SharedLog log, NeighborEventConsumer cb); - boolean isFeatureEnabled(Context context, String name, boolean defaultEnabled); - IpReachabilityMonitorMetrics getIpReachabilityMonitorMetrics(); static Dependencies makeDefault(Context context, String iface) { final String lockName = TAG + "." + iface; @@ -192,16 +176,6 @@ NeighborEventConsumer cb) { return new IpNeighborMonitor(h, log, cb); } - - public boolean isFeatureEnabled(final Context context, final String name, - boolean defaultEnabled) { - return DeviceConfigUtils.isFeatureEnabled(context, NAMESPACE_CONNECTIVITY, name, - defaultEnabled); - } - - public IpReachabilityMonitorMetrics getIpReachabilityMonitorMetrics() { - return new IpReachabilityMonitorMetrics(); - } }; } } @@ -209,30 +183,25 @@ private final InterfaceParams mInterfaceParams; private final IpNeighborMonitor mIpNeighborMonitor; private final SharedLog mLog; + private final Callback mCallback; private final Dependencies mDependencies; private final boolean mUsingMultinetworkPolicyTracker; private final ConnectivityManager mCm; private final IpConnectivityLog mMetricsLog; private final Context mContext; private final INetd mNetd; - private final IpReachabilityMonitorMetrics mIpReachabilityMetrics; private LinkProperties mLinkProperties = new LinkProperties(); private Map<InetAddress, NeighborEvent> mNeighborWatchList = new HashMap<>(); // Time in milliseconds of the last forced probe request. private volatile long mLastProbeTimeMs; - // Time in milliseconds of the last forced probe request due to roam or CMD_CONFIRM. - private long mLastProbeDueToRoamMs; - private long mLastProbeDueToConfirmMs; private int mNumSolicits; private int mInterSolicitIntervalMs; - @NonNull - private final Callback mCallback; public IpReachabilityMonitor( Context context, InterfaceParams ifParams, Handler h, SharedLog log, Callback callback, - boolean usingMultinetworkPolicyTracker, Dependencies dependencies, final INetd netd) { - this(context, ifParams, h, log, callback, usingMultinetworkPolicyTracker, dependencies, - new IpConnectivityLog(), netd); + boolean usingMultinetworkPolicyTracker, final INetd netd) { + this(context, ifParams, h, log, callback, usingMultinetworkPolicyTracker, + Dependencies.makeDefault(context, ifParams.name), new IpConnectivityLog(), netd); } @VisibleForTesting @@ -256,10 +225,7 @@ // In case the overylaid parameters specify an invalid configuration, set the parameters // to the hardcoded defaults first, then set them to the values used in the steady state. try { - int numResolicits = isMulticastResolicitEnabled() - ? NUD_MCAST_RESOLICIT_NUM - : INVALID_NUD_MCAST_RESOLICIT_NUM; - setNeighborParameters(MIN_NUD_SOLICIT_NUM, MIN_NUD_SOLICIT_INTERVAL_MS, numResolicits); + setNeighborParameters(MIN_NUD_SOLICIT_NUM, MIN_NUD_SOLICIT_INTERVAL_MS); } catch (Exception e) { Log.e(TAG, "Failed to adjust neighbor parameters with hardcoded defaults"); } @@ -275,16 +241,13 @@ // TODO: Consider what to do with other states that are not within // NeighborEvent#isValid() (i.e. NUD_NONE, NUD_INCOMPLETE). if (event.nudState == StructNdMsg.NUD_FAILED) { - // After both unicast probe and multicast probe(if mcast_resolicit is not 0) - // attempts fail, trigger the neighbor lost event and disconnect. mLog.w("ALERT neighbor went from: " + prev + " to: " + event); handleNeighborLost(event); } else if (event.nudState == StructNdMsg.NUD_REACHABLE) { - handleNeighborReachable(prev, event); + maybeRestoreNeighborParameters(); } }); mIpNeighborMonitor.start(); - mIpReachabilityMetrics = dependencies.getIpReachabilityMonitorMetrics(); } public void stop() { @@ -333,33 +296,6 @@ return false; } - private boolean hasDefaultRouterNeighborMacAddressChanged( - @Nullable final NeighborEvent prev, @NonNull final NeighborEvent event) { - if (prev == null || !isNeighborDefaultRouter(event)) return false; - return !event.macAddr.equals(prev.macAddr); - } - - private boolean isNeighborDefaultRouter(@NonNull final NeighborEvent event) { - // For the IPv6 link-local scoped address, equals() works because the NeighborEvent.ip - // doesn't have a scope id and Inet6Address#equals doesn't consider scope id neither. - for (RouteInfo route : mLinkProperties.getRoutes()) { - if (route.isDefaultRoute() && event.ip.equals(route.getGateway())) return true; - } - return false; - } - - private boolean isNeighborDnsServer(@NonNull final NeighborEvent event) { - for (InetAddress dns : mLinkProperties.getDnsServers()) { - if (event.ip.equals(dns)) return true; - } - return false; - } - - private boolean isMulticastResolicitEnabled() { - return mDependencies.isFeatureEnabled(mContext, IP_REACHABILITY_MCAST_RESOLICIT_VERSION, - false /* defaultEnabled */); - } - public void updateLinkProperties(LinkProperties lp) { if (!mInterfaceParams.name.equals(lp.getInterfaceName())) { // TODO: figure out whether / how to cope with interface changes. @@ -397,25 +333,6 @@ if (DBG) { Log.d(TAG, "clear: " + describeWatchList()); } } - private void handleNeighborReachable(@Nullable final NeighborEvent prev, - @NonNull final NeighborEvent event) { - if (isMulticastResolicitEnabled() - && hasDefaultRouterNeighborMacAddressChanged(prev, event)) { - // This implies device has confirmed the neighbor's reachability from - // other states(e.g., NUD_PROBE or NUD_STALE), checking if the mac - // address hasn't changed is required. If Mac address does change, then - // trigger a new neighbor lost event and disconnect. - final String logMsg = "ALERT neighbor: " + event.ip - + " MAC address changed from: " + prev.macAddr - + " to: " + event.macAddr; - mLog.w(logMsg); - mCallback.notifyLost(event.ip, logMsg); - logNudFailed(event, NudEventType.NUD_MAC_ADDRESS_CHANGED); - return; - } - maybeRestoreNeighborParameters(); - } - private void handleNeighborLost(NeighborEvent event) { final LinkProperties whatIfLp = new LinkProperties(mLinkProperties); @@ -449,17 +366,17 @@ final boolean lostProvisioning = (mLinkProperties.isIpv4Provisioned() && !whatIfLp.isIpv4Provisioned()) || (mLinkProperties.isIpv6Provisioned() && !whatIfLp.isIpv6Provisioned()); - final NudEventType type = getNudFailureEventType(isFromProbe(), - isNudFailureDueToRoam(), lostProvisioning); if (lostProvisioning) { final String logMsg = "FAILURE: LOST_PROVISIONING, " + event; Log.w(TAG, logMsg); - // TODO: remove |ip| when the callback signature no longer has - // an InetAddress argument. - mCallback.notifyLost(ip, logMsg); + if (mCallback != null) { + // TODO: remove |ip| when the callback signature no longer has + // an InetAddress argument. + mCallback.notifyLost(ip, logMsg); + } } - logNudFailed(event, type); + logNudFailed(lostProvisioning); } private void maybeRestoreNeighborParameters() { @@ -483,13 +400,7 @@ return !mUsingMultinetworkPolicyTracker || mCm.shouldAvoidBadWifi(); } - /** - * Force probe to verify whether or not the critical on-link neighbours are still reachable. - * - * @param dueToRoam indicate on which situation forced probe has been sent, e.g., on post - * roaming or receiving CMD_CONFIRM from IpClient. - */ - public void probeAll(boolean dueToRoam) { + public void probeAll() { setNeighbourParametersPostRoaming(); final List<InetAddress> ipProbeList = new ArrayList<>(mNeighborWatchList.keySet()); @@ -510,11 +421,6 @@ logEvent(IpReachabilityEvent.PROBE, rval); } mLastProbeTimeMs = SystemClock.elapsedRealtime(); - if (dueToRoam) { - mLastProbeDueToRoamMs = mLastProbeTimeMs; - } else { - mLastProbeDueToConfirmMs = mLastProbeTimeMs; - } } private long getProbeWakeLockDuration() { @@ -544,12 +450,6 @@ private void setNeighborParameters(int numSolicits, int interSolicitIntervalMs) throws RemoteException, IllegalArgumentException { - // Do not set mcast_resolicit param by default. - setNeighborParameters(numSolicits, interSolicitIntervalMs, INVALID_NUD_MCAST_RESOLICIT_NUM); - } - - private void setNeighborParameters(int numSolicits, int interSolicitIntervalMs, - int numResolicits) throws RemoteException, IllegalArgumentException { Preconditions.checkArgument(numSolicits >= MIN_NUD_SOLICIT_NUM, "numSolicits must be at least " + MIN_NUD_SOLICIT_NUM); Preconditions.checkArgument(numSolicits <= MAX_NUD_SOLICIT_NUM, @@ -564,117 +464,32 @@ Integer.toString(interSolicitIntervalMs)); mNetd.setProcSysNet(family, INetd.NEIGH, mInterfaceParams.name, "ucast_solicit", Integer.toString(numSolicits)); - if (numResolicits != INVALID_NUD_MCAST_RESOLICIT_NUM) { - mNetd.setProcSysNet(family, INetd.NEIGH, mInterfaceParams.name, "mcast_resolicit", - Integer.toString(numResolicits)); - } } mNumSolicits = numSolicits; mInterSolicitIntervalMs = interSolicitIntervalMs; } - private boolean isFromProbe() { - final long duration = SystemClock.elapsedRealtime() - mLastProbeTimeMs; - return duration < getProbeWakeLockDuration(); - } - - private boolean isNudFailureDueToRoam() { - if (!isFromProbe()) return false; - - // Check to which probe expiry the curren timestamp gets close when NUD failure event - // happens, theoretically that indicates which probe event(due to roam or CMD_CONFIRM) - // was triggered eariler. - // - // Note that this would be incorrect if the probe or confirm was so long ago that the - // probe duration has already expired. That cannot happen because isFromProbe would return - // false. - final long probeExpiryAfterRoam = mLastProbeDueToRoamMs + getProbeWakeLockDuration(); - final long probeExpiryAfterConfirm = - mLastProbeDueToConfirmMs + getProbeWakeLockDuration(); - final long currentTime = SystemClock.elapsedRealtime(); - return Math.abs(probeExpiryAfterRoam - currentTime) - < Math.abs(probeExpiryAfterConfirm - currentTime); - } - private void logEvent(int probeType, int errorCode) { int eventType = probeType | (errorCode & 0xff); mMetricsLog.log(mInterfaceParams.name, new IpReachabilityEvent(eventType)); } - private void logNudFailed(final NeighborEvent event, final NudEventType type) { - logNeighborLostEvent(event, type); - - // The legacy metrics only record whether the failure came from a probe and whether - // the network is still provisioned. They do not record provisioning failures due to - // multicast resolicits finding that the MAC address has changed. - final int eventType = legacyNudFailureType(type); - if (eventType == INVALID_LEGACY_NUD_FAILURE_TYPE) return; + private void logNudFailed(boolean lostProvisioning) { + long duration = SystemClock.elapsedRealtime() - mLastProbeTimeMs; + boolean isFromProbe = (duration < getProbeWakeLockDuration()); + int eventType = nudFailureEventType(isFromProbe, lostProvisioning); mMetricsLog.log(mInterfaceParams.name, new IpReachabilityEvent(eventType)); } /** - * Returns the neighbor type code corresponding to the given conditions. - */ - private NudNeighborType getNeighborType(final NeighborEvent event) { - final boolean isGateway = isNeighborDefaultRouter(event); - final boolean isDnsServer = isNeighborDnsServer(event); - - if (isGateway && isDnsServer) return NudNeighborType.NUD_NEIGHBOR_BOTH; - if (isGateway && !isDnsServer) return NudNeighborType.NUD_NEIGHBOR_GATEWAY; - if (!isGateway && isDnsServer) return NudNeighborType.NUD_NEIGHBOR_DNS; - return NudNeighborType.NUD_NEIGHBOR_UNKNOWN; - } - - /** * Returns the NUD failure event type code corresponding to the given conditions. */ - private static NudEventType getNudFailureEventType(boolean isFromProbe, boolean isDueToRoam, - boolean isProvisioningLost) { - if (!isFromProbe) { - return isProvisioningLost - ? NudEventType.NUD_ORGANIC_FAILED_CRITICAL - : NudEventType.NUD_ORGANIC_FAILED; - } - return isProvisioningLost - ? isDueToRoam - ? NudEventType.NUD_POST_ROAMING_FAILED_CRITICAL - : NudEventType.NUD_CONFIRM_FAILED_CRITICAL - : isDueToRoam - ? NudEventType.NUD_POST_ROAMING_FAILED - : NudEventType.NUD_CONFIRM_FAILED; - } - - /** - * Log NUD failure metrics with new Westworld APIs while the function using mMetricsLog API - * still sends the legacy metrics, @see #logNudFailed. - */ - private void logNeighborLostEvent(final NeighborEvent event, final NudEventType type) { - final IpType ipType = (event.ip instanceof Inet6Address) ? IpType.IPV6 : IpType.IPV4; - mIpReachabilityMetrics.setNudIpType(ipType); - mIpReachabilityMetrics.setNudNeighborType(getNeighborType(event)); - mIpReachabilityMetrics.setNudEventType(type); - mIpReachabilityMetrics.statsWrite(); - } - - /** - * Returns the NUD failure event type code corresponding to the given conditions. - */ - private static int legacyNudFailureType(final NudEventType type) { - switch (type) { - case NUD_POST_ROAMING_FAILED: - case NUD_CONFIRM_FAILED: - return NUD_FAILED; - case NUD_POST_ROAMING_FAILED_CRITICAL: - case NUD_CONFIRM_FAILED_CRITICAL: - return PROVISIONING_LOST; - case NUD_ORGANIC_FAILED: - return NUD_FAILED_ORGANIC; - case NUD_ORGANIC_FAILED_CRITICAL: - return PROVISIONING_LOST_ORGANIC; - default: - // Do not log legacy event - return INVALID_LEGACY_NUD_FAILURE_TYPE; + private static int nudFailureEventType(boolean isFromProbe, boolean isProvisioningLost) { + if (isFromProbe) { + return isProvisioningLost ? PROVISIONING_LOST : NUD_FAILED; + } else { + return isProvisioningLost ? PROVISIONING_LOST_ORGANIC : NUD_FAILED_ORGANIC; } } }
diff --git a/src/android/net/util/NetworkStackUtils.java b/src/android/net/util/NetworkStackUtils.java index 6dc2a5b..81d0c08 100755 --- a/src/android/net/util/NetworkStackUtils.java +++ b/src/android/net/util/NetworkStackUtils.java
@@ -250,25 +250,11 @@ "ipclient_garp_na_roaming_version"; /** - * Experiment flag to enable parsing netlink events from kernel directly instead from netd aidl - * interface. - */ - public static final String IPCLIENT_PARSE_NETLINK_EVENTS_VERSION = - "ipclient_parse_netlink_events_version"; - - /** * Experiment flag to disable accept_ra parameter when IPv6 provisioning loss happens due to * the default route has gone. */ public static final String IPCLIENT_DISABLE_ACCEPT_RA_VERSION = "ipclient_disable_accept_ra"; - /** - * Experiment flag to enable "mcast_resolicit" neighbor parameter in IpReachabilityMonitor, - * set it to 3 by default. - */ - public static final String IP_REACHABILITY_MCAST_RESOLICIT_VERSION = - "ip_reachability_mcast_resolicit_version"; - static { System.loadLibrary("networkstackutilsjni"); }
diff --git a/src/com/android/networkstack/metrics/IpProvisioningMetrics.java b/src/com/android/networkstack/metrics/IpProvisioningMetrics.java index 5ca996e..b015a51 100644 --- a/src/com/android/networkstack/metrics/IpProvisioningMetrics.java +++ b/src/com/android/networkstack/metrics/IpProvisioningMetrics.java
@@ -157,17 +157,17 @@ mStatsBuilder.setDhcpSession(mDhcpSessionBuilder); mStatsBuilder.setProvisioningDurationMicros(mWatch.stop()); mStatsBuilder.setRandomNumber((int) (Math.random() * 1000)); - final NetworkIpProvisioningReported stats = mStatsBuilder.build(); - final byte[] DhcpSession = stats.getDhcpSession().toByteArray(); + final NetworkIpProvisioningReported Stats = mStatsBuilder.build(); + final byte[] DhcpSession = Stats.getDhcpSession().toByteArray(); NetworkStackStatsLog.write(NetworkStackStatsLog.NETWORK_IP_PROVISIONING_REPORTED, - stats.getTransportType().getNumber(), - stats.getIpv4LatencyMicros(), - stats.getIpv6LatencyMicros(), - stats.getProvisioningDurationMicros(), - stats.getDisconnectCode().getNumber(), + Stats.getTransportType().getNumber(), + Stats.getIpv4LatencyMicros(), + Stats.getIpv6LatencyMicros(), + Stats.getProvisioningDurationMicros(), + Stats.getDisconnectCode().getNumber(), DhcpSession, - stats.getRandomNumber()); + Stats.getRandomNumber()); mWatch.reset(); - return stats; + return Stats; } }
diff --git a/src/com/android/networkstack/metrics/IpReachabilityMonitorMetrics.java b/src/com/android/networkstack/metrics/IpReachabilityMonitorMetrics.java deleted file mode 100644 index 401de4a..0000000 --- a/src/com/android/networkstack/metrics/IpReachabilityMonitorMetrics.java +++ /dev/null
@@ -1,66 +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.networkstack.metrics; - -import android.stats.connectivity.IpType; -import android.stats.connectivity.NudEventType; -import android.stats.connectivity.NudNeighborType; - -/** - * Class to record the network stack IpReachabilityMonitor metrics into statsd. - * - * This class is not thread-safe, and should always be accessed from the same thread. - * - * @hide - */ -public class IpReachabilityMonitorMetrics { - private final NetworkIpReachabilityMonitorReported.Builder mStatsBuilder = - NetworkIpReachabilityMonitorReported.newBuilder(); - - /** - * Write the NUD event type into mStatsBuilder. - */ - public void setNudEventType(final NudEventType type) { - mStatsBuilder.setEventType(type); - } - - /** - * Write the NUD probe type(IPv4 or IPv6) into mStatsBuilder. - */ - public void setNudIpType(final IpType type) { - mStatsBuilder.setIpType(type); - } - - /** - * Write the NUD probe neighbor type into mStatsBuilder. - */ - public void setNudNeighborType(final NudNeighborType type) { - mStatsBuilder.setNeighborType(type); - } - - /** - * Write the NetworkIpReachabilityMonitorReported proto into statsd. - */ - public NetworkIpReachabilityMonitorReported statsWrite() { - final NetworkIpReachabilityMonitorReported stats = mStatsBuilder.build(); - NetworkStackStatsLog.write(NetworkStackStatsLog.NETWORK_IP_REACHABILITY_MONITOR_REPORTED, - stats.getEventType().getNumber(), - stats.getIpType().getNumber(), - stats.getNeighborType().getNumber()); - return stats; - } -}
diff --git a/src/com/android/networkstack/metrics/stats.proto b/src/com/android/networkstack/metrics/stats.proto index c09f082..2b0a704 100644 --- a/src/com/android/networkstack/metrics/stats.proto +++ b/src/com/android/networkstack/metrics/stats.proto
@@ -172,19 +172,3 @@ // Record each Quirk event optional .android.stats.connectivity.NetworkQuirkEvent event = 2; } - -/** - * Logs Neighbor Unreachability Detection probe event. - * Logged from: - * src/com/android/networkstack/metrics/IpReachabilityMonitorMetrics.java - */ -message NetworkIpReachabilityMonitorReported { - // Neighbor Unreachability Detection event. - optional .android.stats.connectivity.NudEventType event_type = 1; - - // NUD probe based on IPv4 ARP or IPv6 ND packet. - optional .android.stats.connectivity.IpType ip_type = 2; - - // NUD neighbor type, default gateway, DNS server or both. - optional .android.stats.connectivity.NudNeighborType neighbor_type = 3; -}
diff --git a/src/com/android/networkstack/netlink/TcpSocketTracker.java b/src/com/android/networkstack/netlink/TcpSocketTracker.java index b5eafd6..770e85a 100644 --- a/src/com/android/networkstack/netlink/TcpSocketTracker.java +++ b/src/com/android/networkstack/netlink/TcpSocketTracker.java
@@ -15,6 +15,13 @@ */ package com.android.networkstack.netlink; +import static android.net.netlink.InetDiagMessage.InetDiagReqV2; +import static android.net.netlink.NetlinkConstants.INET_DIAG_MEMINFO; +import static android.net.netlink.NetlinkConstants.NLMSG_DONE; +import static android.net.netlink.NetlinkConstants.SOCKDIAG_MSG_HEADER_SIZE; +import static android.net.netlink.NetlinkConstants.SOCK_DIAG_BY_FAMILY; +import static android.net.netlink.StructNlMsgHdr.NLM_F_DUMP; +import static android.net.netlink.StructNlMsgHdr.NLM_F_REQUEST; import static android.net.util.DataStallUtils.CONFIG_MIN_PACKETS_THRESHOLD; import static android.net.util.DataStallUtils.CONFIG_TCP_PACKETS_FAIL_PERCENTAGE; import static android.net.util.DataStallUtils.DEFAULT_DATA_STALL_MIN_PACKETS_THRESHOLD; @@ -31,18 +38,14 @@ import static android.system.OsConstants.SOL_SOCKET; import static android.system.OsConstants.SO_SNDTIMEO; -import static com.android.net.module.util.netlink.InetDiagMessage.inetDiagReqV2; -import static com.android.net.module.util.netlink.NetlinkConstants.INET_DIAG_MEMINFO; -import static com.android.net.module.util.netlink.NetlinkConstants.NLMSG_DONE; -import static com.android.net.module.util.netlink.NetlinkConstants.SOCKDIAG_MSG_HEADER_SIZE; -import static com.android.net.module.util.netlink.NetlinkConstants.SOCK_DIAG_BY_FAMILY; -import static com.android.net.module.util.netlink.StructNlMsgHdr.NLM_F_DUMP; -import static com.android.net.module.util.netlink.StructNlMsgHdr.NLM_F_REQUEST; - import android.content.Context; import android.net.INetd; import android.net.MarkMaskParcel; import android.net.Network; +import android.net.netlink.NetlinkConstants; +import android.net.netlink.NetlinkSocket; +import android.net.netlink.StructInetDiagMsg; +import android.net.netlink.StructNlMsgHdr; import android.net.util.NetworkStackUtils; import android.net.util.SocketUtils; import android.os.AsyncTask; @@ -63,10 +66,6 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.net.module.util.DeviceConfigUtils; -import com.android.net.module.util.netlink.NetlinkConstants; -import com.android.net.module.util.netlink.NetlinkSocket; -import com.android.net.module.util.netlink.StructInetDiagMsg; -import com.android.net.module.util.netlink.StructNlMsgHdr; import com.android.networkstack.apishim.NetworkShimImpl; import com.android.networkstack.apishim.common.ShimUtils; import com.android.networkstack.apishim.common.UnsupportedApiLevelException; @@ -115,7 +114,7 @@ * Request to send to kernel to request tcp info. * * Key: Ip family type. - * Value: Bytes array represent the {@Code inetDiagReqV2}. + * Value: Bytes array represent the {@Code InetDiagReqV2}. */ private final SparseArray<byte[]> mSockDiagMsg = new SparseArray<>(); private final Dependencies mDependencies; @@ -161,7 +160,7 @@ for (final int family : ADDRESS_FAMILIES) { mSockDiagMsg.put( family, - inetDiagReqV2(IPPROTO_TCP, + InetDiagReqV2(IPPROTO_TCP, null /* local addr */, null /* remote addr */, family,
diff --git a/src/com/android/networkstack/packets/NeighborAdvertisement.java b/src/com/android/networkstack/packets/NeighborAdvertisement.java index ef38314..e6cdfc8 100644 --- a/src/com/android/networkstack/packets/NeighborAdvertisement.java +++ b/src/com/android/networkstack/packets/NeighborAdvertisement.java
@@ -17,14 +17,13 @@ package com.android.networkstack.packets; import static com.android.net.module.util.NetworkStackConstants.ETHER_HEADER_LEN; -import static com.android.net.module.util.NetworkStackConstants.ICMPV6_NA_HEADER_LEN; +import static com.android.net.module.util.NetworkStackConstants.ICMPV6_HEADER_MIN_LEN; import static com.android.net.module.util.NetworkStackConstants.ICMPV6_ND_OPTION_TLLA; import static com.android.net.module.util.NetworkStackConstants.IPV6_HEADER_LEN; import android.net.MacAddress; import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import com.android.net.module.util.Ipv6Utils; import com.android.net.module.util.Struct; @@ -51,12 +50,12 @@ public final Icmpv6Header icmpv6Hdr; @NonNull public final NaHeader naHdr; - @Nullable + @NonNull public final LlaOption tlla; public NeighborAdvertisement(@NonNull final EthernetHeader ethHdr, @NonNull final Ipv6Header ipv6Hdr, @NonNull final Icmpv6Header icmpv6Hdr, - @NonNull final NaHeader naHdr, @Nullable final LlaOption tlla) { + @NonNull final NaHeader naHdr, @NonNull final LlaOption tlla) { this.ethHdr = ethHdr; this.ipv6Hdr = ipv6Hdr; this.icmpv6Hdr = icmpv6Hdr; @@ -72,7 +71,7 @@ final int ipv6HeaderLen = Struct.getSize(Ipv6Header.class); final int icmpv6HeaderLen = Struct.getSize(Icmpv6Header.class); final int naHeaderLen = Struct.getSize(NaHeader.class); - final int tllaOptionLen = (tlla == null) ? 0 : Struct.getSize(LlaOption.class); + final int tllaOptionLen = Struct.getSize(LlaOption.class); final ByteBuffer packet = ByteBuffer.allocate(etherHeaderLen + ipv6HeaderLen + icmpv6HeaderLen + naHeaderLen + tllaOptionLen); @@ -80,9 +79,7 @@ ipv6Hdr.writeToByteBuffer(packet); icmpv6Hdr.writeToByteBuffer(packet); naHdr.writeToByteBuffer(packet); - if (tlla != null) { - tlla.writeToByteBuffer(packet); - } + tlla.writeToByteBuffer(packet); packet.flip(); return packet; @@ -103,7 +100,7 @@ */ public static NeighborAdvertisement parse(@NonNull final byte[] recvbuf, final int length) throws ParseException { - if (length < ETHER_HEADER_LEN + IPV6_HEADER_LEN + ICMPV6_NA_HEADER_LEN + if (length < ETHER_HEADER_LEN + IPV6_HEADER_LEN + ICMPV6_HEADER_MIN_LEN || recvbuf.length < length) { throw new ParseException("Invalid packet length: " + length); } @@ -114,9 +111,7 @@ final Ipv6Header ipv6Hdr = Struct.parse(Ipv6Header.class, packet); final Icmpv6Header icmpv6Hdr = Struct.parse(Icmpv6Header.class, packet); final NaHeader naHdr = Struct.parse(NaHeader.class, packet); - final LlaOption tlla = (packet.remaining() == 0) - ? null - : Struct.parse(LlaOption.class, packet); + final LlaOption tlla = Struct.parse(LlaOption.class, packet); return new NeighborAdvertisement(ethHdr, ipv6Hdr, icmpv6Hdr, naHdr, tlla); }
diff --git a/src/com/android/networkstack/packets/NeighborSolicitation.java b/src/com/android/networkstack/packets/NeighborSolicitation.java deleted file mode 100644 index 5c3e40a..0000000 --- a/src/com/android/networkstack/packets/NeighborSolicitation.java +++ /dev/null
@@ -1,132 +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.networkstack.packets; - -import static com.android.net.module.util.NetworkStackConstants.ETHER_HEADER_LEN; -import static com.android.net.module.util.NetworkStackConstants.ICMPV6_ND_OPTION_SLLA; -import static com.android.net.module.util.NetworkStackConstants.ICMPV6_NS_HEADER_LEN; -import static com.android.net.module.util.NetworkStackConstants.IPV6_HEADER_LEN; - -import android.net.MacAddress; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import com.android.net.module.util.Ipv6Utils; -import com.android.net.module.util.Struct; -import com.android.net.module.util.structs.EthernetHeader; -import com.android.net.module.util.structs.Icmpv6Header; -import com.android.net.module.util.structs.Ipv6Header; -import com.android.net.module.util.structs.LlaOption; -import com.android.net.module.util.structs.NsHeader; - -import java.net.Inet6Address; -import java.nio.ByteBuffer; - -/** - * Defines basic data and operations needed to build and parse Neighbor Solicitation packet. - * - * @hide - */ -public class NeighborSolicitation { - @NonNull - public final EthernetHeader ethHdr; - @NonNull - public final Ipv6Header ipv6Hdr; - @NonNull - public final Icmpv6Header icmpv6Hdr; - @NonNull - public final NsHeader nsHdr; - @Nullable - public final LlaOption slla; - - public NeighborSolicitation(@NonNull final EthernetHeader ethHdr, - @NonNull final Ipv6Header ipv6Hdr, @NonNull final Icmpv6Header icmpv6Hdr, - @NonNull final NsHeader nsHdr, @Nullable final LlaOption slla) { - this.ethHdr = ethHdr; - this.ipv6Hdr = ipv6Hdr; - this.icmpv6Hdr = icmpv6Hdr; - this.nsHdr = nsHdr; - this.slla = slla; - } - - /** - * Convert a Neighbor Solicitation instance to ByteBuffer. - */ - public ByteBuffer toByteBuffer() { - final int etherHeaderLen = Struct.getSize(EthernetHeader.class); - final int ipv6HeaderLen = Struct.getSize(Ipv6Header.class); - final int icmpv6HeaderLen = Struct.getSize(Icmpv6Header.class); - final int nsHeaderLen = Struct.getSize(NsHeader.class); - final int sllaOptionLen = (slla == null) ? 0 : Struct.getSize(LlaOption.class); - final ByteBuffer packet = ByteBuffer.allocate(etherHeaderLen + ipv6HeaderLen - + icmpv6HeaderLen + nsHeaderLen + sllaOptionLen); - - ethHdr.writeToByteBuffer(packet); - ipv6Hdr.writeToByteBuffer(packet); - icmpv6Hdr.writeToByteBuffer(packet); - nsHdr.writeToByteBuffer(packet); - if (slla != null) { - slla.writeToByteBuffer(packet); - } - packet.flip(); - - return packet; - } - - /** - * Build a Neighbor Solicitation packet from the required specified parameters. - */ - public static ByteBuffer build(@NonNull final MacAddress srcMac, - @NonNull final MacAddress dstMac, @NonNull final Inet6Address srcIp, - @NonNull final Inet6Address dstIp, @NonNull final Inet6Address target) { - final ByteBuffer slla = LlaOption.build((byte) ICMPV6_ND_OPTION_SLLA, srcMac); - return Ipv6Utils.buildNsPacket(srcMac, dstMac, srcIp, dstIp, target, slla); - } - - /** - * Parse a Neighbor Solicitation packet from ByteBuffer. - */ - public static NeighborSolicitation parse(@NonNull final byte[] recvbuf, final int length) - throws ParseException { - if (length < ETHER_HEADER_LEN + IPV6_HEADER_LEN + ICMPV6_NS_HEADER_LEN - || recvbuf.length < length) { - throw new ParseException("Invalid packet length: " + length); - } - final ByteBuffer packet = ByteBuffer.wrap(recvbuf, 0, length); - - // Parse each header and option in Neighbor Solicitation packet in order. - final EthernetHeader ethHdr = Struct.parse(EthernetHeader.class, packet); - final Ipv6Header ipv6Hdr = Struct.parse(Ipv6Header.class, packet); - final Icmpv6Header icmpv6Hdr = Struct.parse(Icmpv6Header.class, packet); - final NsHeader nsHdr = Struct.parse(NsHeader.class, packet); - final LlaOption slla = (packet.remaining() == 0) - ? null - : Struct.parse(LlaOption.class, packet); - - return new NeighborSolicitation(ethHdr, ipv6Hdr, icmpv6Hdr, nsHdr, slla); - } - - /** - * Thrown when parsing Neighbor Solicitation packet failed. - */ - public static class ParseException extends Exception { - ParseException(String message) { - super(message); - } - } -}
diff --git a/src/com/android/server/connectivity/NetworkMonitor.java b/src/com/android/server/connectivity/NetworkMonitor.java index 948ce8d..7bc6a49 100755 --- a/src/com/android/server/connectivity/NetworkMonitor.java +++ b/src/com/android/server/connectivity/NetworkMonitor.java
@@ -16,7 +16,6 @@ package com.android.server.connectivity; -import static android.content.Intent.ACTION_CONFIGURATION_CHANGED; import static android.net.CaptivePortal.APP_RETURN_DISMISSED; import static android.net.CaptivePortal.APP_RETURN_UNWANTED; import static android.net.CaptivePortal.APP_RETURN_WANTED_AS_IS; @@ -32,10 +31,8 @@ import static android.net.INetworkMonitor.NETWORK_VALIDATION_PROBE_HTTPS; import static android.net.INetworkMonitor.NETWORK_VALIDATION_PROBE_PRIVDNS; import static android.net.INetworkMonitor.NETWORK_VALIDATION_RESULT_PARTIAL; -import static android.net.INetworkMonitor.NETWORK_VALIDATION_RESULT_SKIPPED; import static android.net.INetworkMonitor.NETWORK_VALIDATION_RESULT_VALID; import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_METERED; -import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED; import static android.net.captiveportal.CaptivePortalProbeSpec.parseCaptivePortalProbeSpecs; import static android.net.metrics.ValidationProbeEvent.DNS_FAILURE; import static android.net.metrics.ValidationProbeEvent.DNS_SUCCESS; @@ -389,15 +386,10 @@ private static final int CMD_BANDWIDTH_CHECK_COMPLETE = 23; /** - * Message to self to know the bandwidth check has timed out. + * Message to self to know the bandwidth check is timeouted. */ private static final int CMD_BANDWIDTH_CHECK_TIMEOUT = 24; - /** - * Message to self to notify resource configuration is changed. - */ - private static final int EVENT_RESOURCE_CONFIG_CHANGED = 25; - // Start mReevaluateDelayMs at this value and double. @VisibleForTesting static final int INITIAL_REEVALUATE_DELAY_MS = 1000; @@ -422,6 +414,7 @@ private String mPrivateDnsProviderHostname = ""; private final Context mContext; + private final Context mCustomizedContext; private final INetworkMonitorCallbacks mCallback; private final int mCallbackVersion; private final Network mCleartextDnsNetwork; @@ -436,21 +429,13 @@ private final TcpSocketTracker mTcpTracker; // Configuration values for captive portal detection probes. private final String mCaptivePortalUserAgent; - // Configuration values in setting providers for captive portal detection probes - private final String mCaptivePortalHttpsUrlFromSetting; - private final String mCaptivePortalHttpUrlFromSetting; + private final URL[] mCaptivePortalFallbackUrls; + @NonNull + private final URL[] mCaptivePortalHttpUrls; + @NonNull + private final URL[] mCaptivePortalHttpsUrls; @Nullable private final CaptivePortalProbeSpec[] mCaptivePortalFallbackSpecs; - - // The probing URLs may be updated after constructor if system notifies configuration changed. - // Thus, these probing URLs should only be accessed in the StateMachine thread. - @NonNull - private URL[] mCaptivePortalFallbackUrls; - @NonNull - private URL[] mCaptivePortalHttpUrls; - @NonNull - private URL[] mCaptivePortalHttpsUrls; - // Configuration values for network bandwidth check. @Nullable private final String mEvaluatingBandwidthUrl; @@ -524,8 +509,7 @@ private @EvaluationType int mDataStallTypeToCollect; private boolean mAcceptPartialConnectivity = false; private final EvaluationState mEvaluationState = new EvaluationState(); - @NonNull - private final BroadcastReceiver mConfigurationReceiver; + private final boolean mPrivateIpNoInternetEnabled; private final boolean mMetricsEnabled; @@ -589,6 +573,7 @@ mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); mCm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); mNotifier = serviceManager.getNotifier(); + mCustomizedContext = getCustomizedContextOrDefault(); // CHECKSTYLE:OFF IndentationCheck addState(mDefaultState); @@ -603,18 +588,16 @@ setInitialState(mDefaultState); // CHECKSTYLE:ON IndentationCheck - mCaptivePortalHttpsUrlFromSetting = - mDependencies.getSetting(context, CAPTIVE_PORTAL_HTTPS_URL, null); - mCaptivePortalHttpUrlFromSetting = - mDependencies.getSetting(context, CAPTIVE_PORTAL_HTTP_URL, null); mIsCaptivePortalCheckEnabled = getIsCaptivePortalCheckEnabled(); mPrivateIpNoInternetEnabled = getIsPrivateIpNoInternetEnabled(); mMetricsEnabled = deps.isFeatureEnabled(context, NAMESPACE_CONNECTIVITY, NetworkStackUtils.VALIDATION_METRICS_VERSION, true /* defaultEnabled */); mUseHttps = getUseHttpsValidation(); mCaptivePortalUserAgent = getCaptivePortalUserAgent(); - mCaptivePortalFallbackSpecs = - makeCaptivePortalFallbackProbeSpecs(getCustomizedContextOrDefault()); + mCaptivePortalHttpsUrls = makeCaptivePortalHttpsUrls(); + mCaptivePortalHttpUrls = makeCaptivePortalHttpUrls(); + mCaptivePortalFallbackUrls = makeCaptivePortalFallbackUrls(); + mCaptivePortalFallbackSpecs = makeCaptivePortalFallbackProbeSpecs(); mRandom = deps.getRandom(); // TODO: Evaluate to move data stall configuration to a specific class. mConsecutiveDnsTimeoutThreshold = getConsecutiveDnsTimeoutThreshold(); @@ -633,14 +616,7 @@ mEvaluatingBandwidthTimeoutMs = getResIntConfig(mContext, R.integer.config_evaluating_bandwidth_timeout_ms, DEFAULT_EVALUATING_BANDWIDTH_TIMEOUT_MS); - mConfigurationReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - if (ACTION_CONFIGURATION_CHANGED.equals(intent.getAction())) { - sendMessage(EVENT_RESOURCE_CONFIG_CHANGED); - } - } - }; + // Provide empty LinkProperties and NetworkCapabilities to make sure they are never null, // even before notifyNetworkConnected. mLinkProperties = new LinkProperties(); @@ -658,13 +634,6 @@ /** * Request the NetworkMonitor to reevaluate the network. - * - * TODO : refactor reevaluation to introduce rate limiting. If the system finds a network is - * validated but some app can't access their server, or the network is behind a captive portal - * that only lets the validation URL through, apps may be calling reportNetworkConnectivity - * often, causing many revalidation attempts. Meanwhile, reevaluation attempts that result - * from actions that may affect the validation status (e.g. the user just logged in through - * the captive portal app) should never be skipped because of the rate limitation. */ public void forceReevaluation(int responsibleUid) { sendMessage(CMD_FORCE_REEVALUATION, responsibleUid, 0); @@ -702,7 +671,6 @@ (Pair<LinkProperties, NetworkCapabilities>) connectedMsg.obj; mLinkProperties = attrs.first; mNetworkCapabilities = attrs.second; - suppressNotificationIfNetworkRestricted(); } /** @@ -767,12 +735,6 @@ return NetworkMonitorUtils.isPrivateDnsValidationRequired(mNetworkCapabilities); } - private void suppressNotificationIfNetworkRestricted() { - if (!mNetworkCapabilities.hasCapability(NET_CAPABILITY_NOT_RESTRICTED)) { - mDontDisplaySigninNotification = true; - } - } - private void notifyNetworkTested(NetworkTestResultParcelable result) { try { if (mCallbackVersion <= 5) { @@ -891,18 +853,6 @@ // does not entail any real state (hence no enter() or exit() routines). private class DefaultState extends State { @Override - public void enter() { - // Register configuration broadcast here instead of constructor to prevent start() was - // not called yet when the broadcast is received and cause crash. - mContext.registerReceiver(mConfigurationReceiver, - new IntentFilter(ACTION_CONFIGURATION_CHANGED)); - checkAndRenewResourceConfig(); - Log.d(TAG, "Starting on network " + mNetwork - + " with capport HTTPS URL " + Arrays.toString(mCaptivePortalHttpsUrls) - + " and HTTP URL " + Arrays.toString(mCaptivePortalHttpUrls)); - } - - @Override public boolean processMessage(Message message) { switch (message.what) { case CMD_NETWORK_CONNECTED: @@ -957,18 +907,6 @@ // If the user wants to use this network anyway, there is no need to // perform the bandwidth check even if configured. mIsBandwidthCheckPassedOrIgnored = true; - // If the user wants to use this network anyway, it should always - // be reported as validated, but other checks still need to be - // done. For example, it should still validate strict private DNS and - // show a notification if not available, because the network will - // be unusable for this additional reason. - mEvaluationState.setCaptivePortalWantedAsIs(); - // A successful evaluation result should be reported immediately, so - // that the network stack may immediately use the validation in ranking - // without waiting for a possibly long private DNS or bandwidth eval - // step. - mEvaluationState.reportEvaluationResult(NETWORK_VALIDATION_RESULT_VALID, - null); // TODO: Distinguish this from a network that actually validates. // Displaying the "x" on the system UI icon may still be a good idea. transitionTo(mEvaluatingPrivateDnsState); @@ -1046,29 +984,12 @@ break; case EVENT_NETWORK_CAPABILITIES_CHANGED: mNetworkCapabilities = (NetworkCapabilities) message.obj; - suppressNotificationIfNetworkRestricted(); - break; - case EVENT_RESOURCE_CONFIG_CHANGED: - // RRO generation does not happen during package installation and instead after - // the OMS receives the PACKAGE_ADDED event, there is a delay where the old - // idmap is used with the new target package resulting in the incorrect overlay - // is used. Renew the resource if a configuration change is received. - // TODO: Remove it once design to generate the idmaps during package - // installation in overlay manager and package manager is ready. - if (checkAndRenewResourceConfig()) { - sendMessage(CMD_FORCE_REEVALUATION, NO_UID, 1 /* forceAccept */); - } break; default: break; } return HANDLED; } - - @Override - public void exit() { - mContext.unregisterReceiver(mConfigurationReceiver); - } } // Being in the ValidatedState State indicates a Network is: @@ -1359,19 +1280,11 @@ // the network so don't bother validating here. Furthermore sending HTTP // packets over the network may be undesirable, for example an extremely // expensive metered network, or unwanted leaking of the User Agent string. - // Also don't bother validating networks that the user already said they - // wanted as-is. // // On networks that need to support private DNS in strict mode (e.g., VPNs, but // not networks that don't provide Internet access), we still need to perform // private DNS server resolution. - if (mEvaluationState.isCaptivePortalWantedAsIs() - && isPrivateDnsValidationRequired()) { - // Captive portals can only be detected on networks that validate both - // validation and private DNS validation. - validationLog("Captive portal is used as is, resolving private DNS"); - transitionTo(mEvaluatingPrivateDnsState); - } else if (!isValidationRequired()) { + if (!isValidationRequired()) { if (isPrivateDnsValidationRequired()) { validationLog("Network would not satisfy default request, " + "resolving private DNS"); @@ -1389,9 +1302,7 @@ return HANDLED; case CMD_FORCE_REEVALUATION: // The evaluation process restarts via EvaluatingState#enter. - final boolean forceAccept = (message.arg2 != 0); - return forceAccept || shouldAcceptForceRevalidation() - ? NOT_HANDLED : HANDLED; + return shouldAcceptForceRevalidation() ? NOT_HANDLED : HANDLED; // Disable HTTPS probe and transition to EvaluatingPrivateDnsState because: // 1. Network is connected and finish the network validation. // 2. NetworkMonitor detects network is partial connectivity and user accepts it. @@ -1643,13 +1554,8 @@ final int token = ++mProbeToken; final ValidationProperties deps = new ValidationProperties(mNetworkCapabilities); - final URL fallbackUrl = nextFallbackUrl(); - final URL[] httpsUrls = Arrays.copyOf( - mCaptivePortalHttpsUrls, mCaptivePortalHttpsUrls.length); - final URL[] httpUrls = Arrays.copyOf( - mCaptivePortalHttpUrls, mCaptivePortalHttpUrls.length); mThread = new Thread(() -> sendMessage(obtainMessage(CMD_PROBE_COMPLETE, token, 0, - isCaptivePortal(deps, httpsUrls, httpUrls, fallbackUrl)))); + isCaptivePortal(deps)))); mThread.start(); } @@ -2039,24 +1945,18 @@ } final long now = System.currentTimeMillis(); - if (expTime < now || (expTime - now) > TEST_URL_EXPIRATION_MS) { - logw("Skipping test URL with expiration " + expTime + ", now " + now); - return null; - } + if (expTime < now || (expTime - now) > TEST_URL_EXPIRATION_MS) return null; final String strUrl = mDependencies.getDeviceConfigProperty(NAMESPACE_CONNECTIVITY, key, null /* defaultValue */); - if (!isValidTestUrl(strUrl)) { - logw("Skipping invalid test URL " + strUrl); - return null; - } + if (!isValidTestUrl(strUrl)) return null; return makeURL(strUrl); } - private String getCaptivePortalServerHttpsUrl(@NonNull Context context) { - return getSettingFromResource(context, - R.string.config_captive_portal_https_url, mCaptivePortalHttpsUrlFromSetting, - context.getResources().getString( + private String getCaptivePortalServerHttpsUrl() { + return getSettingFromResource(mCustomizedContext, + R.string.config_captive_portal_https_url, CAPTIVE_PORTAL_HTTPS_URL, + mCustomizedContext.getResources().getString( R.string.default_captive_portal_https_url)); } @@ -2133,10 +2033,10 @@ * it has its own updatable strategies to detect captive portals. The framework only advises * on one URL that can be used, while NetworkMonitor may implement more complex logic. */ - public String getCaptivePortalServerHttpUrl(@NonNull Context context) { - return getSettingFromResource(context, - R.string.config_captive_portal_http_url, mCaptivePortalHttpUrlFromSetting, - context.getResources().getString( + public String getCaptivePortalServerHttpUrl() { + return getSettingFromResource(mCustomizedContext, + R.string.config_captive_portal_http_url, CAPTIVE_PORTAL_HTTP_URL, + mCustomizedContext.getResources().getString( R.string.default_captive_portal_http_url)); } @@ -2172,13 +2072,13 @@ } @VisibleForTesting - URL[] makeCaptivePortalFallbackUrls(@NonNull Context context) { + URL[] makeCaptivePortalFallbackUrls() { try { final String firstUrl = mDependencies.getSetting(mContext, CAPTIVE_PORTAL_FALLBACK_URL, null); final URL[] settingProviderUrls = combineCaptivePortalUrls(firstUrl, CAPTIVE_PORTAL_OTHER_FALLBACK_URLS); - return getProbeUrlArrayConfig(context, settingProviderUrls, + return getProbeUrlArrayConfig(settingProviderUrls, R.array.config_captive_portal_fallback_urls, R.array.default_captive_portal_fallback_urls, this::makeURL); @@ -2189,7 +2089,7 @@ } } - private CaptivePortalProbeSpec[] makeCaptivePortalFallbackProbeSpecs(@NonNull Context context) { + private CaptivePortalProbeSpec[] makeCaptivePortalFallbackProbeSpecs() { try { final String settingsValue = mDependencies.getDeviceConfigProperty( NAMESPACE_CONNECTIVITY, CAPTIVE_PORTAL_FALLBACK_PROBE_SPECS, null); @@ -2199,7 +2099,7 @@ ? emptySpecs : parseCaptivePortalProbeSpecs(settingsValue).toArray(emptySpecs); - return getProbeUrlArrayConfig(context, providerValue, + return getProbeUrlArrayConfig(providerValue, R.array.config_captive_portal_fallback_probe_specs, DEFAULT_CAPTIVE_PORTAL_FALLBACK_PROBE_SPECS, CaptivePortalProbeSpec::parseSpecOrNull); @@ -2210,17 +2110,17 @@ } } - private URL[] makeCaptivePortalHttpsUrls(@NonNull Context context) { + private URL[] makeCaptivePortalHttpsUrls() { final URL testUrl = getTestUrl(TEST_CAPTIVE_PORTAL_HTTPS_URL); if (testUrl != null) return new URL[] { testUrl }; - final String firstUrl = getCaptivePortalServerHttpsUrl(context); + final String firstUrl = getCaptivePortalServerHttpsUrl(); try { final URL[] settingProviderUrls = combineCaptivePortalUrls(firstUrl, CAPTIVE_PORTAL_OTHER_HTTPS_URLS); // firstUrl will at least be default configuration, so default value in // getProbeUrlArrayConfig is actually never used. - return getProbeUrlArrayConfig(context, settingProviderUrls, + return getProbeUrlArrayConfig(settingProviderUrls, R.array.config_captive_portal_https_urls, DEFAULT_CAPTIVE_PORTAL_HTTPS_URLS, this::makeURL); } catch (Exception e) { @@ -2231,17 +2131,17 @@ } } - private URL[] makeCaptivePortalHttpUrls(@NonNull Context context) { + private URL[] makeCaptivePortalHttpUrls() { final URL testUrl = getTestUrl(TEST_CAPTIVE_PORTAL_HTTP_URL); if (testUrl != null) return new URL[] { testUrl }; - final String firstUrl = getCaptivePortalServerHttpUrl(context); + final String firstUrl = getCaptivePortalServerHttpUrl(); try { final URL[] settingProviderUrls = combineCaptivePortalUrls(firstUrl, CAPTIVE_PORTAL_OTHER_HTTP_URLS); // firstUrl will at least be default configuration, so default value in // getProbeUrlArrayConfig is actually never used. - return getProbeUrlArrayConfig(context, settingProviderUrls, + return getProbeUrlArrayConfig(settingProviderUrls, R.array.config_captive_portal_http_urls, DEFAULT_CAPTIVE_PORTAL_HTTP_URLS, this::makeURL); } catch (Exception e) { @@ -2269,20 +2169,21 @@ * <p>The configuration resource is prioritized, then the provider value. * @param context The context * @param configResource The resource id for the configuration parameter - * @param settingValue The value in the settings provider + * @param symbol The symbol in the settings provider * @param defaultValue The default value * @return The best available value */ @Nullable private String getSettingFromResource(@NonNull final Context context, - @StringRes int configResource, @NonNull String settingValue, - @NonNull String defaultValue) { + @StringRes int configResource, @NonNull String symbol, @NonNull String defaultValue) { final Resources res = context.getResources(); String setting = res.getString(configResource); if (!TextUtils.isEmpty(setting)) return setting; - if (!TextUtils.isEmpty(settingValue)) return settingValue; + setting = mDependencies.getSetting(context, symbol, null); + + if (!TextUtils.isEmpty(setting)) return setting; return defaultValue; } @@ -2292,20 +2193,17 @@ * * <p>The configuration resource is prioritized, then the provider values, then the default * resource values. - * - * @param context The Context * @param providerValue Values obtained from the setting provider. * @param configResId ID of the configuration resource. * @param defaultResId ID of the default resource. * @param resourceConverter Converter from the resource strings to stored setting class. Null * return values are ignored. */ - private <T> T[] getProbeUrlArrayConfig(@NonNull Context context, @NonNull T[] providerValue, - @ArrayRes int configResId, @ArrayRes int defaultResId, - @NonNull Function<String, T> resourceConverter) { - final Resources res = context.getResources(); - return getProbeUrlArrayConfig(context, providerValue, configResId, - res.getStringArray(defaultResId), resourceConverter); + private <T> T[] getProbeUrlArrayConfig(@NonNull T[] providerValue, @ArrayRes int configResId, + @ArrayRes int defaultResId, @NonNull Function<String, T> resourceConverter) { + final Resources res = mCustomizedContext.getResources(); + return getProbeUrlArrayConfig(providerValue, configResId, res.getStringArray(defaultResId), + resourceConverter); } /** @@ -2313,18 +2211,15 @@ * * <p>The configuration resource is prioritized, then the provider values, then the default * resource values. - * - * @param context The Context * @param providerValue Values obtained from the setting provider. * @param configResId ID of the configuration resource. * @param defaultConfig Values of default configuration. * @param resourceConverter Converter from the resource strings to stored setting class. Null * return values are ignored. */ - private <T> T[] getProbeUrlArrayConfig(@NonNull Context context, @NonNull T[] providerValue, - @ArrayRes int configResId, String[] defaultConfig, - @NonNull Function<String, T> resourceConverter) { - final Resources res = context.getResources(); + private <T> T[] getProbeUrlArrayConfig(@NonNull T[] providerValue, @ArrayRes int configResId, + String[] defaultConfig, @NonNull Function<String, T> resourceConverter) { + final Resources res = mCustomizedContext.getResources(); String[] configValue = res.getStringArray(configResId); if (configValue.length == 0) { @@ -2403,14 +2298,15 @@ } } - private CaptivePortalProbeResult isCaptivePortal(ValidationProperties properties, - URL[] httpsUrls, URL[] httpUrls, URL fallbackUrl) { + private CaptivePortalProbeResult isCaptivePortal(ValidationProperties properties) { if (!mIsCaptivePortalCheckEnabled) { validationLog("Validation disabled."); return CaptivePortalProbeResult.success(CaptivePortalProbeResult.PROBE_UNKNOWN); } URL pacUrl = null; + final URL[] httpsUrls = mCaptivePortalHttpsUrls; + final URL[] httpUrls = mCaptivePortalHttpUrls; // On networks with a PAC instead of fetching a URL that should result in a 204 // response, we instead simply fetch the PAC script. This is done for a few reasons: @@ -2451,7 +2347,7 @@ } else if (mUseHttps && httpsUrls.length == 1 && httpUrls.length == 1) { // Probe results are reported inside sendHttpAndHttpsParallelWithFallbackProbes. result = sendHttpAndHttpsParallelWithFallbackProbes(properties, proxyInfo, - httpsUrls[0], httpUrls[0], fallbackUrl); + httpsUrls[0], httpUrls[0]); } else if (mUseHttps) { // Support result aggregation from multiple Urls. result = sendMultiParallelHttpAndHttpsProbes(properties, proxyInfo, httpsUrls, @@ -2645,17 +2541,8 @@ final CaptivePortalProbeResult probeResult; if (probeSpec == null) { - if (CaptivePortalProbeResult.isPortalCode(httpResponseCode) - && TextUtils.isEmpty(redirectUrl) - && ShimUtils.isAtLeastS()) { - // If a portal is a non-redirect portal (often portals that return HTTP 200 with a - // login page for all HTTP requests), report the probe URL as the login URL starting - // from S (b/172048052). This avoids breaking assumptions that - // [is a portal] is equivalent to [there is a login URL]. - redirectUrl = url.toString(); - } probeResult = new CaptivePortalProbeResult(httpResponseCode, redirectUrl, - url.toString(), 1 << probeType); + url.toString(), 1 << probeType); } else { probeResult = probeSpec.getResult(httpResponseCode, redirectUrl); } @@ -3053,8 +2940,7 @@ } private CaptivePortalProbeResult sendHttpAndHttpsParallelWithFallbackProbes( - ValidationProperties properties, ProxyInfo proxy, URL httpsUrl, URL httpUrl, - URL fallbackUrl) { + ValidationProperties properties, ProxyInfo proxy, URL httpsUrl, URL httpUrl) { // Number of probes to wait for. If a probe completes with a conclusive answer // it shortcuts the latch immediately by forcing the count to 0. final CountDownLatch latch = new CountDownLatch(2); @@ -3100,10 +2986,10 @@ // If a fallback method exists, use it to retry portal detection. // If we have new-style probe specs, use those. Otherwise, use the fallback URLs. final CaptivePortalProbeSpec probeSpec = nextFallbackSpec(); - final URL fallback = (probeSpec != null) ? probeSpec.getUrl() : fallbackUrl; + final URL fallbackUrl = (probeSpec != null) ? probeSpec.getUrl() : nextFallbackUrl(); CaptivePortalProbeResult fallbackProbeResult = null; - if (fallback != null) { - fallbackProbeResult = sendHttpProbe(fallback, PROBE_FALLBACK, probeSpec); + if (fallbackUrl != null) { + fallbackProbeResult = sendHttpProbe(fallbackUrl, PROBE_FALLBACK, probeSpec); reportHttpProbeResult(NETWORK_VALIDATION_PROBE_FALLBACK, fallbackProbeResult); if (fallbackProbeResult.isPortal()) { return fallbackProbeResult; @@ -3275,7 +3161,7 @@ * data to statsd pipeline. * @param stats a {@link DataStallDetectionStats} that contains the detection level * information. - * @param result the network reevaluation result. + * @para result the network reevaluation result. */ public void writeDataStallDetectionStats(@NonNull final DataStallDetectionStats stats, @NonNull final CaptivePortalProbeResult result) { @@ -3485,28 +3371,18 @@ // NETWORK_VALIDATION_RESULT_VALID. But with this scheme, the first two or three validation // reports are all failures, because they are "HTTP succeeded but validation not yet passed", // "HTTP and HTTPS succeeded but validation not yet passed", etc. - // TODO : rename EvaluationState to not contain "State" in the name, as it makes this class - // sound like one of the states of the state machine, which it's not. @VisibleForTesting protected class EvaluationState { // The latest validation result for this network. This is a bitmask of // INetworkMonitor.NETWORK_VALIDATION_RESULT_* constants. private int mEvaluationResult = NETWORK_VALIDATION_RESULT_INVALID; - - - // Set when the captive portal app said this network should be used as is as a result - // of user interaction. The valid bit represents the user's decision to override automatic - // determination of whether the network has access to Internet, so in this case the - // network is always reported as validated. - // TODO : Make ConnectivityService aware of this state, so that it can use the network as - // the default without setting the VALIDATED bit, as it's a bit of a lie. This can't be - // done on Android <= R where CS can't be updated, but it is doable on S+. - private boolean mCaptivePortalWantedAsIs = false; // Indicates which probes have succeeded since clearProbeResults was called. // This is a bitmask of INetworkMonitor.NETWORK_VALIDATION_PROBE_* constants. private int mProbeResults = 0; // A bitmask to record which probes are completed. private int mProbeCompleted = 0; + // The latest redirect URL. + private String mRedirectUrl; protected void clearProbeResults() { mProbeResults = 0; @@ -3540,26 +3416,9 @@ }); } - protected void setCaptivePortalWantedAsIs() { - mCaptivePortalWantedAsIs = true; - } - - protected boolean isCaptivePortalWantedAsIs() { - return mCaptivePortalWantedAsIs; - } - protected void reportEvaluationResult(int result, @Nullable String redirectUrl) { - if (mCaptivePortalWantedAsIs) { - result = NETWORK_VALIDATION_RESULT_VALID; - } else if (!isValidationRequired() && mProbeCompleted == 0 && mCallbackVersion >= 11) { - // If validation is not required AND no probes were attempted, the validation was - // skipped. Report this to ConnectivityService for ConnectivityDiagnostics, but only - // if the platform has callback version 11+, as ConnectivityService must also know - // how to understand this bit. - result |= NETWORK_VALIDATION_RESULT_SKIPPED; - } - mEvaluationResult = result; + mRedirectUrl = redirectUrl; final NetworkTestResultParcelable p = new NetworkTestResultParcelable(); p.result = result; p.probesSucceeded = mProbeResults; @@ -3674,37 +3533,4 @@ && captivePortalDataShim.getUserPortalUrlSource() == ConstantsShim.CAPTIVE_PORTAL_DATA_SOURCE_PASSPOINT; } - - private boolean checkAndRenewResourceConfig() { - boolean reevaluationNeeded = false; - - final Context customizedContext = getCustomizedContextOrDefault(); - final URL[] captivePortalHttpsUrls = makeCaptivePortalHttpsUrls(customizedContext); - if (!Arrays.equals(mCaptivePortalHttpsUrls, captivePortalHttpsUrls)) { - mCaptivePortalHttpsUrls = captivePortalHttpsUrls; - reevaluationNeeded = true; - log("checkAndRenewResourceConfig: update captive portal https urls to " - + Arrays.toString(mCaptivePortalHttpsUrls)); - } - - final URL[] captivePortalHttpUrls = makeCaptivePortalHttpUrls(customizedContext); - if (!Arrays.equals(mCaptivePortalHttpUrls, captivePortalHttpUrls)) { - mCaptivePortalHttpUrls = captivePortalHttpUrls; - reevaluationNeeded = true; - log("checkAndRenewResourceConfig: update captive portal http urls to " - + Arrays.toString(mCaptivePortalHttpUrls)); - } - - final URL[] captivePortalFallbackUrls = makeCaptivePortalFallbackUrls(customizedContext); - if (!Arrays.equals(mCaptivePortalFallbackUrls, captivePortalFallbackUrls)) { - mCaptivePortalFallbackUrls = captivePortalFallbackUrls; - // Reset the index since the array is changed. - mNextFallbackUrlIndex = 0; - reevaluationNeeded = true; - log("checkAndRenewResourceConfig: update captive portal fallback urls to" - + Arrays.toString(mCaptivePortalFallbackUrls)); - } - - return reevaluationNeeded; - } }
diff --git a/tests/integration/Android.bp b/tests/integration/Android.bp index 9137c5c..43a0575 100644 --- a/tests/integration/Android.bp +++ b/tests/integration/Android.bp
@@ -50,6 +50,7 @@ "android.test.base", "android.test.mock", ], + jarjar_rules: ":NetworkStackJarJarRules", visibility: ["//visibility:private"], } @@ -71,8 +72,6 @@ platform_apis: true, test_suites: ["device-tests"], min_sdk_version: "29", - target_sdk_version: "30", - jarjar_rules: ":NetworkStackJarJarRules", } // Network stack next integration tests. @@ -88,7 +87,22 @@ certificate: "networkstack", platform_apis: true, test_suites: ["device-tests"], + enabled: false, // Disabled in mainline-prod +} + +// The static lib needs to be jarjared by each module so they do not conflict with each other +// (e.g. wifi, system server, network stack need to use different package names when including it). +// Apply NetworkStack jarjar rules to the tests as well so classes in NetworkStaticLibTests have the +// same package names as in module code. +android_library { + name: "NetworkStackStaticLibTestsLib", + platform_apis: true, + min_sdk_version: "29", jarjar_rules: ":NetworkStackJarJarRules", + static_libs: [ + "NetworkStaticLibTestsLib", + "NetdStaticLibTestsLib", + ], } // Special version of the network stack tests that includes all tests necessary for code coverage @@ -98,7 +112,6 @@ certificate: "networkstack", platform_apis: true, min_sdk_version: "29", - target_sdk_version: "30", test_suites: ["device-tests", "mts"], test_config: "AndroidTest_Coverage.xml", defaults: ["NetworkStackIntegrationTestsJniDefaults"], @@ -106,10 +119,8 @@ "modules-utils-native-coverage-listener", "NetworkStackTestsLib", "NetworkStackIntegrationTestsLib", - "NetworkStaticLibTestsLib", - "NetdStaticLibTestsLib", + "NetworkStackStaticLibTestsLib", ], compile_multilib: "both", manifest: "AndroidManifest_coverage.xml", - jarjar_rules: ":NetworkStackJarJarRules", }
diff --git a/tests/integration/AndroidManifest.xml b/tests/integration/AndroidManifest.xml index bfd3735..12f5d7d 100644 --- a/tests/integration/AndroidManifest.xml +++ b/tests/integration/AndroidManifest.xml
@@ -16,6 +16,7 @@ <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.server.networkstack.integrationtests" android:sharedUserId="android.uid.networkstack"> + <uses-sdk android:minSdkVersion="29" android:targetSdkVersion="29" /> <!-- Note: do not add any privileged or signature permissions that are granted to the network stack app. Otherwise, the test APK will install, but when the device is
diff --git a/tests/integration/AndroidManifest_coverage.xml b/tests/integration/AndroidManifest_coverage.xml index fc91e59..660e42d 100644 --- a/tests/integration/AndroidManifest_coverage.xml +++ b/tests/integration/AndroidManifest_coverage.xml
@@ -16,6 +16,7 @@ <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.server.networkstack.coverage" android:sharedUserId="android.uid.networkstack"> + <uses-sdk android:minSdkVersion="29" android:targetSdkVersion="29" /> <!-- Note: do not add any privileged or signature permissions that are granted to the network stack app. Otherwise, the test APK will install, but when the device is
diff --git a/tests/integration/src/android/net/ip/IpClientIntegrationTest.kt b/tests/integration/src/android/net/ip/IpClientIntegrationTest.kt index 748ee5a..eb0a799 100644 --- a/tests/integration/src/android/net/ip/IpClientIntegrationTest.kt +++ b/tests/integration/src/android/net/ip/IpClientIntegrationTest.kt
@@ -17,14 +17,8 @@ package android.net.ip import android.net.ipmemorystore.NetworkAttributes -import android.net.ipmemorystore.OnNetworkAttributesRetrievedListener -import android.net.ipmemorystore.Status -import android.net.ipmemorystore.Status.SUCCESS import android.util.ArrayMap -import java.net.Inet6Address -import kotlin.test.assertEquals import org.mockito.Mockito.any -import org.mockito.Mockito.doAnswer import org.mockito.ArgumentCaptor import org.mockito.Mockito.eq import org.mockito.Mockito.never @@ -62,23 +56,4 @@ override fun assertIpMemoryNeverStoreNetworkAttributes(l2Key: String, timeout: Long) { verify(mIpMemoryStore, never()).storeNetworkAttributes(eq(l2Key), any(), any()) } - - override fun assertNotifyNeighborLost(targetIp: Inet6Address) { - val target = ArgumentCaptor.forClass(Inet6Address::class.java) - - verify(mCallback, timeout(TEST_TIMEOUT_MS)).notifyLost(target.capture(), any()) - assertEquals(targetIp, target.getValue()) - } - - override fun assertNeverNotifyNeighborLost() { - verify(mCallback, never()).notifyLost(any(), any()) - } - - override fun storeNetworkAttributes(l2Key: String, na: NetworkAttributes) { - doAnswer { inv -> - val listener = inv.getArgument<OnNetworkAttributesRetrievedListener>(1) - listener.onNetworkAttributesRetrieved(Status(SUCCESS), l2Key, na) - true - }.`when`(mIpMemoryStore).retrieveNetworkAttributes(eq(l2Key), any()) - } }
diff --git a/tests/integration/src/android/net/ip/IpClientIntegrationTestCommon.java b/tests/integration/src/android/net/ip/IpClientIntegrationTestCommon.java index 6ade54f..c121b3d 100644 --- a/tests/integration/src/android/net/ip/IpClientIntegrationTestCommon.java +++ b/tests/integration/src/android/net/ip/IpClientIntegrationTestCommon.java
@@ -27,10 +27,7 @@ import static android.net.dhcp.DhcpPacket.INFINITE_LEASE; import static android.net.dhcp.DhcpPacket.MIN_V6ONLY_WAIT_MS; import static android.net.dhcp.DhcpResultsParcelableUtil.fromStableParcelable; -import static android.net.ip.IpReachabilityMonitor.MIN_NUD_SOLICIT_NUM; -import static android.net.ip.IpReachabilityMonitor.NUD_MCAST_RESOLICIT_NUM; import static android.net.ipmemorystore.Status.SUCCESS; -import static android.net.shared.ProvisioningConfiguration.VERSION_ADDED_PROVISIONING_ENUM; import static android.system.OsConstants.ETH_P_IPV6; import static android.system.OsConstants.IFA_F_TEMPORARY; import static android.system.OsConstants.IPPROTO_ICMPV6; @@ -43,21 +40,15 @@ import static com.android.net.module.util.NetworkStackConstants.ETHER_BROADCAST; import static com.android.net.module.util.NetworkStackConstants.ETHER_HEADER_LEN; import static com.android.net.module.util.NetworkStackConstants.ETHER_TYPE_OFFSET; -import static com.android.net.module.util.NetworkStackConstants.ICMPV6_ND_OPTION_SLLA; import static com.android.net.module.util.NetworkStackConstants.ICMPV6_NEIGHBOR_ADVERTISEMENT; -import static com.android.net.module.util.NetworkStackConstants.ICMPV6_NEIGHBOR_SOLICITATION; import static com.android.net.module.util.NetworkStackConstants.ICMPV6_ROUTER_SOLICITATION; import static com.android.net.module.util.NetworkStackConstants.IPV4_ADDR_ANY; import static com.android.net.module.util.NetworkStackConstants.IPV6_ADDR_ALL_NODES_MULTICAST; import static com.android.net.module.util.NetworkStackConstants.IPV6_ADDR_ALL_ROUTERS_MULTICAST; import static com.android.net.module.util.NetworkStackConstants.IPV6_HEADER_LEN; import static com.android.net.module.util.NetworkStackConstants.IPV6_PROTOCOL_OFFSET; -import static com.android.net.module.util.NetworkStackConstants.NEIGHBOR_ADVERTISEMENT_FLAG_OVERRIDE; -import static com.android.net.module.util.NetworkStackConstants.NEIGHBOR_ADVERTISEMENT_FLAG_ROUTER; -import static com.android.net.module.util.NetworkStackConstants.NEIGHBOR_ADVERTISEMENT_FLAG_SOLICITED; import static com.android.net.module.util.NetworkStackConstants.PIO_FLAG_AUTONOMOUS; import static com.android.net.module.util.NetworkStackConstants.PIO_FLAG_ON_LINK; -import static com.android.testutils.MiscAsserts.assertThrows; import static junit.framework.Assert.fail; @@ -108,7 +99,6 @@ import android.net.LinkProperties; import android.net.MacAddress; import android.net.NetworkStackIpMemoryStore; -import android.net.RouteInfo; import android.net.TestNetworkInterface; import android.net.TestNetworkManager; import android.net.Uri; @@ -118,10 +108,10 @@ import android.net.dhcp.DhcpPacket; import android.net.dhcp.DhcpPacket.ParseException; import android.net.dhcp.DhcpRequestPacket; -import android.net.ip.IpNeighborMonitor.NeighborEventConsumer; import android.net.ipmemorystore.NetworkAttributes; import android.net.ipmemorystore.OnNetworkAttributesRetrievedListener; import android.net.ipmemorystore.Status; +import android.net.netlink.StructNdOptPref64; import android.net.networkstack.TestNetworkStackServiceClient; import android.net.networkstack.aidl.dhcp.DhcpOption; import android.net.shared.Layer2Information; @@ -129,7 +119,6 @@ import android.net.shared.ProvisioningConfiguration.ScanResultInfo; import android.net.util.InterfaceParams; import android.net.util.NetworkStackUtils; -import android.net.util.SharedLog; import android.os.Build; import android.os.Handler; import android.os.HandlerThread; @@ -146,13 +135,12 @@ import androidx.annotation.NonNull; import androidx.test.InstrumentationRegistry; import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; import com.android.internal.util.HexDump; import com.android.internal.util.StateMachine; import com.android.net.module.util.ArrayTrackRecord; import com.android.net.module.util.Ipv6Utils; -import com.android.net.module.util.netlink.StructNdOptPref64; -import com.android.net.module.util.structs.LlaOption; import com.android.net.module.util.structs.PrefixInformationOption; import com.android.net.module.util.structs.RdnssOption; import com.android.networkstack.apishim.CaptivePortalDataShimImpl; @@ -160,10 +148,8 @@ import com.android.networkstack.apishim.common.ShimUtils; import com.android.networkstack.arp.ArpPacket; 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.server.NetworkObserver; import com.android.server.NetworkObserverRegistry; import com.android.server.NetworkStackService.NetworkStackServiceManager; @@ -180,7 +166,6 @@ import org.junit.Test; import org.junit.rules.TestName; import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; import org.mockito.ArgumentCaptor; import org.mockito.InOrder; import org.mockito.Mock; @@ -224,7 +209,7 @@ * * Tests in this class can either be run with signature permissions, or with root access. */ -@RunWith(Parameterized.class) +@RunWith(AndroidJUnit4.class) @SmallTest public abstract class IpClientIntegrationTestCommon { private static final int DATA_BUFFER_LEN = 4096; @@ -247,17 +232,6 @@ @Rule public final TestName mTestNameRule = new TestName(); - // Indicate whether the flag of parsing netlink event is enabled or not. If it's disabled, - // integration test still covers the old codepath(i.e. using NetworkObserver), otherwise, - // test goes through the new codepath(i.e. processRtNetlinkxxx). - @Parameterized.Parameter(0) - public boolean mIsNetlinkEventParseEnabled; - - @Parameterized.Parameters - public static Iterable<? extends Object> data() { - return Arrays.asList(Boolean.valueOf("false"), Boolean.valueOf("true")); - } - /** * Indicates that a test requires signature permissions to run. * @@ -289,8 +263,6 @@ @Mock private PowerManager.WakeLock mTimeoutWakeLock; @Mock protected NetworkStackIpMemoryStore mIpMemoryStore; @Mock private NetworkQuirkMetrics.Dependencies mNetworkQuirkMetricsDeps; - @Mock private IpReachabilityMonitorMetrics mIpReachabilityMonitorMetrics; - @Mock protected IpReachabilityMonitor.Callback mCallback; @Spy private INetd mNetd; private NetworkObserverRegistry mNetworkObserverRegistry; @@ -300,7 +272,7 @@ /***** END signature required test members *****/ - protected IIpClientCallbacks mCb; + private IIpClientCallbacks mCb; private IIpClient mIIpClient; private String mIfaceName; private HandlerThread mPacketReaderThread; @@ -355,10 +327,7 @@ private static final String HOSTNAME = "testhostname"; private static final int TEST_DEFAULT_MTU = 1500; private static final int TEST_MIN_MTU = 1280; - private static final MacAddress ROUTER_MAC = MacAddress.fromString("00:1A:11:22:33:44"); - private static final byte[] ROUTER_MAC_BYTES = ROUTER_MAC.toByteArray(); - private static final Inet6Address ROUTER_LINK_LOCAL = - (Inet6Address) InetAddresses.parseNumericAddress("fe80::1"); + private static final byte[] SERVER_MAC = new byte[] { 0x00, 0x1A, 0x11, 0x22, 0x33, 0x44 }; private static final String TEST_HOST_NAME = "AOSP on Crosshatch"; private static final String TEST_HOST_NAME_TRANSLITERATION = "AOSP-on-Crosshatch"; private static final String TEST_CAPTIVE_PORTAL_URL = "https://example.com/capportapi"; @@ -432,15 +401,6 @@ } @Override - public IpReachabilityMonitor getIpReachabilityMonitor(Context context, - InterfaceParams ifParams, Handler h, SharedLog log, - IpReachabilityMonitor.Callback callback, boolean usingMultinetworkPolicyTracker, - IpReachabilityMonitor.Dependencies deps, final INetd netd) { - return new IpReachabilityMonitor(context, ifParams, h, log, mCallback, - usingMultinetworkPolicyTracker, deps, netd); - } - - @Override public boolean isFeatureEnabled(final Context context, final String name, final boolean defaultEnabled) { return IpClientIntegrationTestCommon.this.isFeatureEnabled(name, defaultEnabled); @@ -480,32 +440,6 @@ } @Override - public IpReachabilityMonitor.Dependencies getIpReachabilityMonitorDeps(Context context, - String name) { - return new IpReachabilityMonitor.Dependencies() { - public void acquireWakeLock(long durationMs) { - // It doesn't matter for the integration test app on whether the wake lock - // is acquired or not. - return; - } - - public IpNeighborMonitor makeIpNeighborMonitor(Handler h, SharedLog log, - NeighborEventConsumer cb) { - return new IpNeighborMonitor(h, log, cb); - } - - public boolean isFeatureEnabled(final Context context, final String name, - boolean defaultEnabled) { - return Dependencies.this.isFeatureEnabled(context, name, defaultEnabled); - } - - public IpReachabilityMonitorMetrics getIpReachabilityMonitorMetrics() { - return mIpReachabilityMonitorMetrics; - } - }; - } - - @Override public int getDeviceConfigPropertyInt(String name, int defaultValue) { Integer value = mIntConfigProperties.get(name); if (value == null) { @@ -536,14 +470,8 @@ protected abstract NetworkAttributes getStoredNetworkAttributes(String l2Key, long timeout); - protected abstract void storeNetworkAttributes(String l2Key, NetworkAttributes na); - protected abstract void assertIpMemoryNeverStoreNetworkAttributes(String l2Key, long timeout); - protected abstract void assertNotifyNeighborLost(Inet6Address targetIp); - - protected abstract void assertNeverNotifyNeighborLost(); - protected final boolean testSkipped() { // TODO: split out a test suite for root tests, and fail hard instead of skipping the test // if it is run on devices where TestNetworkStackServiceClient is not supported @@ -564,14 +492,8 @@ @Before public void setUp() throws Exception { - // Suffix "[0]" or "[1]" is added to the end of test method name after running with - // Parameterized.class, that's intended behavior, to iterate each test method with the - // parameterize value. However, Class#getMethod() throws NoSuchMethodException when - // searching the target test method name due to this change. Just keep the original test - // method name to fix NoSuchMethodException, and find the correct annotation associated - // to test method. - final String testMethodName = mTestNameRule.getMethodName().split("\\[")[0]; - final Method testMethod = IpClientIntegrationTestCommon.class.getMethod(testMethodName); + final Method testMethod = IpClientIntegrationTestCommon.class.getMethod( + mTestNameRule.getMethodName()); mIsSignatureRequiredTest = testMethod.getAnnotation(SignatureRequiredTest.class) != null; assumeFalse(testSkipped()); @@ -584,12 +506,6 @@ } mIIpClient = makeIIpClient(mIfaceName, mCb); - - // Depend on the parameterized value to enable/disable netlink message refactor flag. - // Make sure both of the old codepath(rely on the INetdUnsolicitedEventListener aidl) - // and new codepath(parse netlink event from kernel) will be executed. - setFeatureEnabled(NetworkStackUtils.IPCLIENT_PARSE_NETLINK_EVENTS_VERSION, - mIsNetlinkEventParseEnabled /* default value */); } protected void setUpMocks() throws Exception { @@ -602,7 +518,6 @@ when(mContext.getContentResolver()).thenReturn(mContentResolver); when(mNetworkStackServiceManager.getIpMemoryStoreService()) .thenReturn(mIpMemoryStoreService); - when(mCb.getInterfaceVersion()).thenReturn(VERSION_ADDED_PROVISIONING_ENUM); mDependencies.setDeviceConfigProperty(IpClient.CONFIG_MIN_RDNSS_LIFETIME, 67); mDependencies.setDeviceConfigProperty(DhcpClient.DHCP_RESTART_CONFIG_DELAY, 10); @@ -797,14 +712,6 @@ } } - private NeighborSolicitation parseNeighborSolicitationOrNull(final byte[] packet) { - try { - return NeighborSolicitation.parse(packet, packet.length); - } catch (NeighborSolicitation.ParseException e) { - return null; - } - } - private static ByteBuffer buildDhcpOfferPacket(final DhcpPacket packet, final Inet4Address clientAddress, final Integer leaseTimeSec, final short mtu, final String captivePortalUrl, final Integer ipv6OnlyWaitTime) { @@ -854,7 +761,7 @@ private void sendArpReply(final byte[] clientMac) throws IOException { final ByteBuffer packet = ArpPacket.buildArpPacket(clientMac /* dst */, - ROUTER_MAC_BYTES /* srcMac */, INADDR_ANY.getAddress() /* target IP */, + SERVER_MAC /* src */, INADDR_ANY.getAddress() /* target IP */, clientMac /* target HW address */, CLIENT_ADDR.getAddress() /* sender IP */, (short) ARP_REPLY); mPacketReader.sendResponse(packet); @@ -862,7 +769,7 @@ private void sendArpProbe() throws IOException { final ByteBuffer packet = ArpPacket.buildArpPacket(DhcpPacket.ETHER_BROADCAST /* dst */, - ROUTER_MAC_BYTES /* srcMac */, CLIENT_ADDR.getAddress() /* target IP */, + SERVER_MAC /* src */, CLIENT_ADDR.getAddress() /* target IP */, new byte[ETHER_ADDR_LEN] /* target HW address */, INADDR_ANY.getAddress() /* sender IP */, (short) ARP_REQUEST); mPacketReader.sendResponse(packet); @@ -1551,23 +1458,20 @@ HandlerUtils.waitForIdle(mIpc.getHandler(), TEST_TIMEOUT_MS); } - private boolean isIcmpv6PacketOfType(final byte[] packetBytes, int type) { + private boolean isRouterSolicitation(final byte[] packetBytes) { ByteBuffer packet = ByteBuffer.wrap(packetBytes); return packet.getShort(ETHER_TYPE_OFFSET) == (short) ETH_P_IPV6 && packet.get(ETHER_HEADER_LEN + IPV6_PROTOCOL_OFFSET) == (byte) IPPROTO_ICMPV6 - && packet.get(ETHER_HEADER_LEN + IPV6_HEADER_LEN) == (byte) type; - } - - private boolean isRouterSolicitation(final byte[] packetBytes) { - return isIcmpv6PacketOfType(packetBytes, ICMPV6_ROUTER_SOLICITATION); + && packet.get(ETHER_HEADER_LEN + IPV6_HEADER_LEN) + == (byte) ICMPV6_ROUTER_SOLICITATION; } private boolean isNeighborAdvertisement(final byte[] packetBytes) { - return isIcmpv6PacketOfType(packetBytes, ICMPV6_NEIGHBOR_ADVERTISEMENT); - } - - private boolean isNeighborSolicitation(final byte[] packetBytes) { - return isIcmpv6PacketOfType(packetBytes, ICMPV6_NEIGHBOR_SOLICITATION); + ByteBuffer packet = ByteBuffer.wrap(packetBytes); + return packet.getShort(ETHER_TYPE_OFFSET) == (short) ETH_P_IPV6 + && packet.get(ETHER_HEADER_LEN + IPV6_PROTOCOL_OFFSET) == (byte) IPPROTO_ICMPV6 + && packet.get(ETHER_HEADER_LEN + IPV6_HEADER_LEN) + == (byte) ICMPV6_NEIGHBOR_ADVERTISEMENT; } private NeighborAdvertisement getNextNeighborAdvertisement() throws ParseException { @@ -1580,16 +1484,6 @@ return na; } - private NeighborSolicitation getNextNeighborSolicitation() throws ParseException { - final byte[] packet = mPacketReader.popPacket(PACKET_TIMEOUT_MS, - this::isNeighborSolicitation); - if (packet == null) return null; - - final NeighborSolicitation ns = parseNeighborSolicitationOrNull(packet); - assertNotNull("Invalid neighbour solicitation received", ns); - return ns; - } - private void waitForRouterSolicitation() throws ParseException { assertNotNull("No router solicitation received on interface within timeout", mPacketReader.popPacket(PACKET_TIMEOUT_MS, this::isRouterSolicitation)); @@ -1627,18 +1521,17 @@ return RdnssOption.build(lifetime, servers); } - private static ByteBuffer buildSllaOption() throws Exception { - return LlaOption.build((byte) ICMPV6_ND_OPTION_SLLA, ROUTER_MAC); - } - private static ByteBuffer buildRaPacket(short lifetime, ByteBuffer... options) throws Exception { - final MacAddress dstMac = - NetworkStackUtils.ipv6MulticastToEthernetMulticast(IPV6_ADDR_ALL_ROUTERS_MULTICAST); - return Ipv6Utils.buildRaPacket(ROUTER_MAC /* srcMac */, dstMac, - ROUTER_LINK_LOCAL /* srcIp */, IPV6_ADDR_ALL_NODES_MULTICAST /* dstIp */, - (byte) 0 /* M=0, O=0 */, lifetime, 0 /* Reachable time, unspecified */, - 100 /* Retrans time 100ms */, options); + final MacAddress dstMac = MacAddress.fromString("33:33:00:00:00:01"); + final MacAddress srcMac = MacAddress.fromString("01:02:03:04:05:06"); + final Inet6Address routerLinkLocal = + (Inet6Address) InetAddresses.parseNumericAddress("fe80::1"); + + return Ipv6Utils.buildRaPacket(srcMac, dstMac, routerLinkLocal, + IPV6_ADDR_ALL_NODES_MULTICAST, (byte) 0 /* M=0, O=0 */, lifetime, + 0 /* Reachable time, unspecified */, 100 /* Retrans time 100ms */, + options); } private static ByteBuffer buildRaPacket(ByteBuffer... options) throws Exception { @@ -1682,8 +1575,7 @@ final String dnsServer = "2001:4860:4860::64"; final ByteBuffer pio = buildPioOption(3600, 1800, "2001:db8:1::/64"); final ByteBuffer rdnss = buildRdnssOption(3600, dnsServer); - final ByteBuffer slla = buildSllaOption(); - final ByteBuffer ra = buildRaPacket(pio, rdnss, slla); + final ByteBuffer ra = buildRaPacket(pio, rdnss); return doIpv6OnlyProvisioning(inOrder, ra); } @@ -2108,52 +2000,6 @@ } @Test - @SignatureRequiredTest(reason = "needs mocked alarm and access to IpClient handler thread") - public void testDhcpClientPreconnection_DelayedAbortAndTransitToStoppedState() - throws Exception { - ProvisioningConfiguration config = new ProvisioningConfiguration.Builder() - .withoutIpReachabilityMonitor() - .withPreconnection() - .build(); - setDhcpFeatures(false /* isDhcpLeaseCacheEnabled */, false /* shouldReplyRapidCommitAck */, - false /* isDhcpIpConflictDetectEnabled */, false /* isIPv6OnlyPreferredEnabled */); - startIpClientProvisioning(config); - assertDiscoverPacketOnPreconnectionStart(); - - // IpClient is in the PreconnectingState, simulate provisioning timeout event - // and force IpClient state machine transit to StoppingState. - final ArgumentCaptor<LinkProperties> captor = ArgumentCaptor.forClass(LinkProperties.class); - final OnAlarmListener alarm = expectAlarmSet(null /* inOrder */, "TIMEOUT", 18, - mIpc.getHandler()); - mIpc.getHandler().post(() -> alarm.onAlarm()); - - verify(mCb, timeout(TEST_TIMEOUT_MS)).onProvisioningFailure(captor.capture()); - final LinkProperties lp = captor.getValue(); - assertNotNull(lp); - assertEquals(mIfaceName, lp.getInterfaceName()); - assertEquals(0, lp.getLinkAddresses().size()); - assertEquals(0, lp.getRoutes().size()); - assertEquals(0, lp.getMtu()); - assertEquals(0, lp.getDnsServers().size()); - - // Send preconnection abort message, but IpClient should ignore it at this moment and - // transit to StoppedState finally. - mIpc.notifyPreconnectionComplete(false /* abort */); - mIpc.stop(); - HandlerUtils.waitForIdle(mIpc.getHandler(), TEST_TIMEOUT_MS); - - reset(mCb); - - // Start provisioning again to verify IpClient can process CMD_START correctly at - // StoppedState. - startIpClientProvisioning(false /* isDhcpLeaseCacheEnabled */, - false /* shouldReplyRapidCommitAck */, false /* isPreConnectionEnabled */, - false /* isDhcpIpConflictDetectEnabled */, false /* isIPv6OnlyPreferredEnabled */); - final DhcpPacket discover = getNextDhcpPacket(); - assertTrue(discover instanceof DhcpDiscoverPacket); - } - - @Test public void testDhcpDecline_conflictByArpReply() throws Exception { doIpAddressConflictDetectionTest(true /* causeIpAddressConflict */, false /* shouldReplyRapidCommitAck */, true /* isDhcpIpConflictDetectEnabled */, @@ -2537,8 +2383,7 @@ final String dnsServer = "2001:4860:4860::64"; final ByteBuffer pio = buildPioOption(3600, 1800, "2001:db8:1::/64"); final ByteBuffer rdnss = buildRdnssOption(3600, dnsServer); - final ByteBuffer slla = buildSllaOption(); - final ByteBuffer ra = buildRaPacket(pio, rdnss, slla); + final ByteBuffer ra = buildRaPacket(pio, rdnss); doIpv6OnlyProvisioning(inOrder, ra); @@ -2762,20 +2607,20 @@ verifyDhcpPacketRequestsIPv6OnlyPreferredOption(DhcpRequestPacket.class); } - private void setUpRetrievedNetworkAttributesForInitRebootState() { - final NetworkAttributes na = new NetworkAttributes.Builder() - .setAssignedV4Address(CLIENT_ADDR) - .setAssignedV4AddressExpiry(Long.MAX_VALUE) // lease is always valid - .setMtu(new Integer(TEST_DEFAULT_MTU)) - .setCluster(TEST_CLUSTER) - .setDnsAddresses(Collections.singletonList(SERVER_ADDR)) - .build(); - storeNetworkAttributes(TEST_L2KEY, na); - } - private void startFromInitRebootStateWithIPv6OnlyPreferredOption(final Integer ipv6OnlyWaitTime, final long expectedWaitSecs) throws Exception { - setUpRetrievedNetworkAttributesForInitRebootState(); + doAnswer(invocation -> { + ((OnNetworkAttributesRetrievedListener) invocation.getArgument(1)) + .onNetworkAttributesRetrieved(new Status(SUCCESS), TEST_L2KEY, + new NetworkAttributes.Builder() + .setAssignedV4Address(CLIENT_ADDR) + .setAssignedV4AddressExpiry(Long.MAX_VALUE) // lease is always valid + .setMtu(new Integer(TEST_DEFAULT_MTU)) + .setCluster(TEST_CLUSTER) + .setDnsAddresses(Collections.singletonList(SERVER_ADDR)) + .build()); + return null; + }).when(mIpMemoryStore).retrieveNetworkAttributes(eq(TEST_L2KEY), any()); final ProvisioningConfiguration config = new ProvisioningConfiguration.Builder() .withoutIpReachabilityMonitor() @@ -2902,7 +2747,7 @@ ); private DhcpPacket doCustomizedDhcpOptionsTest(final List<DhcpOption> options, - final ScanResultInfo info, boolean isDhcpLeaseCacheEnabled) throws Exception { + final ScanResultInfo info) throws Exception { ProvisioningConfiguration.Builder prov = new ProvisioningConfiguration.Builder() .withoutIpReachabilityMonitor() .withLayer2Information(new Layer2Information(TEST_L2KEY, TEST_CLUSTER, @@ -2911,7 +2756,7 @@ .withDhcpOptions(options) .withoutIPv6(); - setDhcpFeatures(isDhcpLeaseCacheEnabled, false /* isRapidCommitEnabled */, + setDhcpFeatures(false /* isDhcpLeaseCacheEnabled */, false /* isRapidCommitEnabled */, false /* isDhcpIpConflictDetectEnabled */, false /* isIPv6OnlyPreferredEnabled */); startIpClientProvisioning(prov.build()); @@ -2922,11 +2767,10 @@ } @Test - public void testDiscoverCustomizedDhcpOptions() throws Exception { + public void testCustomizedDhcpOptions() throws Exception { final ScanResultInfo info = makeScanResultInfo(0xdd /* vendor-specificIE */, TEST_OEM_OUI, (byte) 0x17 /* vendor-specific IE type */); - final DhcpPacket packet = doCustomizedDhcpOptionsTest(TEST_OEM_DHCP_OPTIONS, info, - false /* isDhcpLeaseCacheEnabled */); + final DhcpPacket packet = doCustomizedDhcpOptionsTest(TEST_OEM_DHCP_OPTIONS, info); assertTrue(packet instanceof DhcpDiscoverPacket); assertEquals(packet.mVendorId, TEST_OEM_VENDOR_ID); @@ -2934,11 +2778,10 @@ } @Test - public void testDiscoverCustomizedDhcpOptions_nullDhcpOptions() throws Exception { + public void testCustomizedDhcpOptions_nullDhcpOptions() throws Exception { final ScanResultInfo info = makeScanResultInfo(0xdd /* vendor-specificIE */, TEST_OEM_OUI, (byte) 0x17 /* vendor-specific IE type */); - final DhcpPacket packet = doCustomizedDhcpOptionsTest(null /* options */, info, - false /* isDhcpLeaseCacheEnabled */); + final DhcpPacket packet = doCustomizedDhcpOptionsTest(null /* options */, info); assertTrue(packet instanceof DhcpDiscoverPacket); assertEquals(packet.mVendorId, new String("android-dhcp-" + Build.VERSION.RELEASE)); @@ -2946,9 +2789,9 @@ } @Test - public void testDiscoverCustomizedDhcpOptions_nullScanResultInfo() throws Exception { + public void testCustomizedDhcpOptions_nullScanResultInfo() throws Exception { final DhcpPacket packet = doCustomizedDhcpOptionsTest(TEST_OEM_DHCP_OPTIONS, - null /* scanResultInfo */, false /* isDhcpLeaseCacheEnabled */); + null /* scanResultInfo */); assertTrue(packet instanceof DhcpDiscoverPacket); assertEquals(packet.mVendorId, new String("android-dhcp-" + Build.VERSION.RELEASE)); @@ -2956,11 +2799,10 @@ } @Test - public void testDiscoverCustomizedDhcpOptions_disallowedOui() throws Exception { + public void testCustomizedDhcpOptions_disallowedOui() throws Exception { final ScanResultInfo info = makeScanResultInfo(0xdd /* vendor-specificIE */, new byte[]{ 0x00, 0x11, 0x22} /* oui */, (byte) 0x17 /* vendor-specific IE type */); - final DhcpPacket packet = doCustomizedDhcpOptionsTest(TEST_OEM_DHCP_OPTIONS, info, - false /* isDhcpLeaseCacheEnabled */); + final DhcpPacket packet = doCustomizedDhcpOptionsTest(TEST_OEM_DHCP_OPTIONS, info); assertTrue(packet instanceof DhcpDiscoverPacket); assertEquals(packet.mVendorId, new String("android-dhcp-" + Build.VERSION.RELEASE)); @@ -2968,11 +2810,10 @@ } @Test - public void testDiscoverCustomizedDhcpOptions_invalidIeId() throws Exception { + public void testCustomizedDhcpOptions_invalidIeId() throws Exception { final ScanResultInfo info = makeScanResultInfo(0xde /* vendor-specificIE */, TEST_OEM_OUI, (byte) 0x17 /* vendor-specific IE type */); - final DhcpPacket packet = doCustomizedDhcpOptionsTest(TEST_OEM_DHCP_OPTIONS, info, - false /* isDhcpLeaseCacheEnabled */); + final DhcpPacket packet = doCustomizedDhcpOptionsTest(TEST_OEM_DHCP_OPTIONS, info); assertTrue(packet instanceof DhcpDiscoverPacket); assertEquals(packet.mVendorId, new String("android-dhcp-" + Build.VERSION.RELEASE)); @@ -2980,11 +2821,10 @@ } @Test - public void testDiscoverCustomizedDhcpOptions_invalidVendorSpecificType() throws Exception { + public void testCustomizedDhcpOptions_invalidVendorSpecificType() throws Exception { final ScanResultInfo info = makeScanResultInfo(0xdd /* vendor-specificIE */, TEST_OEM_OUI, (byte) 0x10 /* vendor-specific IE type */); - final DhcpPacket packet = doCustomizedDhcpOptionsTest(TEST_OEM_DHCP_OPTIONS, info, - false /* isDhcpLeaseCacheEnabled */); + final DhcpPacket packet = doCustomizedDhcpOptionsTest(TEST_OEM_DHCP_OPTIONS, info); assertTrue(packet instanceof DhcpDiscoverPacket); assertEquals(packet.mVendorId, new String("android-dhcp-" + Build.VERSION.RELEASE)); @@ -2992,7 +2832,7 @@ } @Test - public void testDisoverCustomizedDhcpOptions_disallowedOption() throws Exception { + public void testCustomizedDhcpOptions_disallowedOption() throws Exception { final List<DhcpOption> options = Arrays.asList( makeDhcpOption((byte) 60, TEST_OEM_VENDOR_ID.getBytes()), makeDhcpOption((byte) 77, TEST_OEM_USER_CLASS_INFO), @@ -3000,8 +2840,7 @@ makeDhcpOption((byte) 26, HexDump.toByteArray(TEST_DEFAULT_MTU))); final ScanResultInfo info = makeScanResultInfo(0xdd /* vendor-specificIE */, TEST_OEM_OUI, (byte) 0x17 /* vendor-specific IE type */); - final DhcpPacket packet = doCustomizedDhcpOptionsTest(options, info, - false /* isDhcpLeaseCacheEnabled */); + final DhcpPacket packet = doCustomizedDhcpOptionsTest(options, info); assertTrue(packet instanceof DhcpDiscoverPacket); assertEquals(packet.mVendorId, TEST_OEM_VENDOR_ID); @@ -3010,7 +2849,7 @@ } @Test - public void testDiscoverCustomizedDhcpOptions_disallowedParamRequestOption() throws Exception { + public void testCustomizedDhcpOptions_disallowedParamRequestOption() throws Exception { final List<DhcpOption> options = Arrays.asList( makeDhcpOption((byte) 60, TEST_OEM_VENDOR_ID.getBytes()), makeDhcpOption((byte) 77, TEST_OEM_USER_CLASS_INFO), @@ -3018,8 +2857,7 @@ makeDhcpOption((byte) 42, null)); final ScanResultInfo info = makeScanResultInfo(0xdd /* vendor-specificIE */, TEST_OEM_OUI, (byte) 0x17 /* vendor-specific IE type */); - final DhcpPacket packet = doCustomizedDhcpOptionsTest(options, info, - false /* isDhcpLeaseCacheEnabled */); + final DhcpPacket packet = doCustomizedDhcpOptionsTest(options, info); assertTrue(packet instanceof DhcpDiscoverPacket); assertEquals(packet.mVendorId, TEST_OEM_VENDOR_ID); @@ -3027,160 +2865,6 @@ assertFalse(packet.hasRequestedParam((byte) 42 /* NTP_SERVER */)); } - @Test - public void testDiscoverCustomizedDhcpOptions_ParameterRequestListOnly() throws Exception { - final List<DhcpOption> options = Arrays.asList( - // DHCP_USER_CLASS - makeDhcpOption((byte) 77, null)); - final ScanResultInfo info = makeScanResultInfo(0xdd /* vendor-specificIE */, TEST_OEM_OUI, - (byte) 0x17 /* vendor-specific IE type */); - final DhcpPacket packet = doCustomizedDhcpOptionsTest(options, info, - false /* isDhcpLeaseCacheEnabled */); - - assertTrue(packet instanceof DhcpDiscoverPacket); - assertTrue(packet.hasRequestedParam((byte) 77 /* DHCP_USER_CLASS */)); - assertNull(packet.mUserClass); - } - - @Test - public void testRequestCustomizedDhcpOptions() throws Exception { - setUpRetrievedNetworkAttributesForInitRebootState(); - - final ScanResultInfo info = makeScanResultInfo(0xdd /* vendor-specificIE */, TEST_OEM_OUI, - (byte) 0x17 /* vendor-specific IE type */); - final DhcpPacket packet = doCustomizedDhcpOptionsTest(TEST_OEM_DHCP_OPTIONS, info, - true /* isDhcpLeaseCacheEnabled */); - - assertTrue(packet instanceof DhcpRequestPacket); - assertEquals(packet.mVendorId, TEST_OEM_VENDOR_ID); - assertArrayEquals(packet.mUserClass, TEST_OEM_USER_CLASS_INFO); - } - - @Test - public void testRequestCustomizedDhcpOptions_nullDhcpOptions() throws Exception { - setUpRetrievedNetworkAttributesForInitRebootState(); - - final ScanResultInfo info = makeScanResultInfo(0xdd /* vendor-specificIE */, TEST_OEM_OUI, - (byte) 0x17 /* vendor-specific IE type */); - final DhcpPacket packet = doCustomizedDhcpOptionsTest(null /* options */, info, - true /* isDhcpLeaseCacheEnabled */); - - assertTrue(packet instanceof DhcpRequestPacket); - assertEquals(packet.mVendorId, new String("android-dhcp-" + Build.VERSION.RELEASE)); - assertNull(packet.mUserClass); - } - - @Test - public void testRequestCustomizedDhcpOptions_nullScanResultInfo() throws Exception { - setUpRetrievedNetworkAttributesForInitRebootState(); - - final DhcpPacket packet = doCustomizedDhcpOptionsTest(TEST_OEM_DHCP_OPTIONS, - null /* scanResultInfo */, true /* isDhcpLeaseCacheEnabled */); - - assertTrue(packet instanceof DhcpRequestPacket); - assertEquals(packet.mVendorId, new String("android-dhcp-" + Build.VERSION.RELEASE)); - assertNull(packet.mUserClass); - } - - @Test - public void testRequestCustomizedDhcpOptions_disallowedOui() throws Exception { - setUpRetrievedNetworkAttributesForInitRebootState(); - - final ScanResultInfo info = makeScanResultInfo(0xdd /* vendor-specificIE */, - new byte[]{ 0x00, 0x11, 0x22} /* oui */, (byte) 0x17 /* vendor-specific IE type */); - final DhcpPacket packet = doCustomizedDhcpOptionsTest(TEST_OEM_DHCP_OPTIONS, info, - true /* isDhcpLeaseCacheEnabled */); - - assertTrue(packet instanceof DhcpRequestPacket); - assertEquals(packet.mVendorId, new String("android-dhcp-" + Build.VERSION.RELEASE)); - assertNull(packet.mUserClass); - } - - @Test - public void testRequestCustomizedDhcpOptions_invalidIeId() throws Exception { - setUpRetrievedNetworkAttributesForInitRebootState(); - - final ScanResultInfo info = makeScanResultInfo(0xde /* vendor-specificIE */, TEST_OEM_OUI, - (byte) 0x17 /* vendor-specific IE type */); - final DhcpPacket packet = doCustomizedDhcpOptionsTest(TEST_OEM_DHCP_OPTIONS, info, - true /* isDhcpLeaseCacheEnabled */); - - assertTrue(packet instanceof DhcpRequestPacket); - assertEquals(packet.mVendorId, new String("android-dhcp-" + Build.VERSION.RELEASE)); - assertNull(packet.mUserClass); - } - - @Test - public void testRequestCustomizedDhcpOptions_invalidVendorSpecificType() throws Exception { - setUpRetrievedNetworkAttributesForInitRebootState(); - - final ScanResultInfo info = makeScanResultInfo(0xdd /* vendor-specificIE */, TEST_OEM_OUI, - (byte) 0x10 /* vendor-specific IE type */); - final DhcpPacket packet = doCustomizedDhcpOptionsTest(TEST_OEM_DHCP_OPTIONS, info, - true /* isDhcpLeaseCacheEnabled */); - - assertTrue(packet instanceof DhcpRequestPacket); - assertEquals(packet.mVendorId, new String("android-dhcp-" + Build.VERSION.RELEASE)); - assertNull(packet.mUserClass); - } - - @Test - public void testRequestCustomizedDhcpOptions_disallowedOption() throws Exception { - setUpRetrievedNetworkAttributesForInitRebootState(); - - final List<DhcpOption> options = Arrays.asList( - makeDhcpOption((byte) 60, TEST_OEM_VENDOR_ID.getBytes()), - makeDhcpOption((byte) 77, TEST_OEM_USER_CLASS_INFO), - // Option 26: MTU - makeDhcpOption((byte) 26, HexDump.toByteArray(TEST_DEFAULT_MTU))); - final ScanResultInfo info = makeScanResultInfo(0xdd /* vendor-specificIE */, TEST_OEM_OUI, - (byte) 0x17 /* vendor-specific IE type */); - final DhcpPacket packet = doCustomizedDhcpOptionsTest(options, info, - true /* isDhcpLeaseCacheEnabled */); - - assertTrue(packet instanceof DhcpRequestPacket); - assertEquals(packet.mVendorId, TEST_OEM_VENDOR_ID); - assertArrayEquals(packet.mUserClass, TEST_OEM_USER_CLASS_INFO); - assertNull(packet.mMtu); - } - - @Test - public void testRequestCustomizedDhcpOptions_disallowedParamRequestOption() throws Exception { - setUpRetrievedNetworkAttributesForInitRebootState(); - - final List<DhcpOption> options = Arrays.asList( - makeDhcpOption((byte) 60, TEST_OEM_VENDOR_ID.getBytes()), - makeDhcpOption((byte) 77, TEST_OEM_USER_CLASS_INFO), - // NTP_SERVER - makeDhcpOption((byte) 42, null)); - final ScanResultInfo info = makeScanResultInfo(0xdd /* vendor-specificIE */, TEST_OEM_OUI, - (byte) 0x17 /* vendor-specific IE type */); - final DhcpPacket packet = doCustomizedDhcpOptionsTest(options, info, - true /* isDhcpLeaseCacheEnabled */); - - assertTrue(packet instanceof DhcpRequestPacket); - assertEquals(packet.mVendorId, TEST_OEM_VENDOR_ID); - assertArrayEquals(packet.mUserClass, TEST_OEM_USER_CLASS_INFO); - assertFalse(packet.hasRequestedParam((byte) 42 /* NTP_SERVER */)); - } - - @Test - public void testRequestCustomizedDhcpOptions_ParameterRequestListOnly() throws Exception { - setUpRetrievedNetworkAttributesForInitRebootState(); - - final List<DhcpOption> options = Arrays.asList( - // DHCP_USER_CLASS - makeDhcpOption((byte) 77, null)); - final ScanResultInfo info = makeScanResultInfo(0xdd /* vendor-specificIE */, TEST_OEM_OUI, - (byte) 0x17 /* vendor-specific IE type */); - final DhcpPacket packet = doCustomizedDhcpOptionsTest(options, info, - true /* isDhcpLeaseCacheEnabled */); - - assertTrue(packet instanceof DhcpRequestPacket); - assertTrue(packet.hasRequestedParam((byte) 77 /* DHCP_USER_CLASS */)); - assertNull(packet.mUserClass); - } - private void assertGratuitousNa(final NeighborAdvertisement na) throws Exception { final MacAddress etherMulticast = NetworkStackUtils.ipv6MulticastToEthernetMulticast(IPV6_ADDR_ALL_ROUTERS_MULTICAST); @@ -3281,7 +2965,7 @@ @Test public void testGratuitousArpAndNaAfterRoaming_disableExpFlag() throws Exception { startGratuitousArpAndNaAfterRoamingTest(false /* isGratuitousArpNaRoamingEnabled */, - true /* hasIpv4 */, true /* hasIpv6 */); + true /* hasIpv6 */, true /* hasIpv6 */); performDualStackProvisioning(); forceLayer2Roaming(); @@ -3324,206 +3008,118 @@ assertEquals(1, arpList.size()); } - private void assertNeighborSolicitation(final NeighborSolicitation ns, - final Inet6Address target) { - assertEquals(ETH_P_IPV6, ns.ethHdr.etherType); - assertEquals(IPPROTO_ICMPV6, ns.ipv6Hdr.nextHeader); - assertEquals(0xff, ns.ipv6Hdr.hopLimit); - assertTrue(ns.ipv6Hdr.srcIp.isLinkLocalAddress()); - assertEquals(ICMPV6_NEIGHBOR_SOLICITATION, ns.icmpv6Hdr.type); - assertEquals(0, ns.icmpv6Hdr.code); - assertEquals(0, ns.nsHdr.reserved); - assertEquals(target, ns.nsHdr.target); - assertEquals(ns.slla.linkLayerAddress, ns.ethHdr.srcMac); - } + private void doInitialBssidSetupTest(final Layer2Information layer2Info, + final ScanResultInfo scanResultInfo) throws Exception { + ProvisioningConfiguration.Builder prov = new ProvisioningConfiguration.Builder() + .withoutIpReachabilityMonitor() + .withLayer2Information(layer2Info) + .withScanResultInfo(scanResultInfo) + .withDisplayName("\"0001docomo\"") + .withoutIPv6(); - private void assertUnicastNeighborSolicitation(final NeighborSolicitation ns, - final MacAddress dstMac, final Inet6Address dstIp, final Inet6Address target) { - assertEquals(dstMac, ns.ethHdr.dstMac); - assertEquals(dstIp, ns.ipv6Hdr.dstIp); - assertNeighborSolicitation(ns, target); - } + setDhcpFeatures(false /* isDhcpLeaseCacheEnabled */, true /* shouldReplyRapidCommitAck */, + false /* isDhcpIpConflictDetectEnabled */, false /* isIPv6OnlyPreferredEnabled */); + startIpClientProvisioning(prov.build()); - private void assertMulticastNeighborSolicitation(final NeighborSolicitation ns, - final Inet6Address target) { - final MacAddress etherMulticast = - NetworkStackUtils.ipv6MulticastToEthernetMulticast(ns.ipv6Hdr.dstIp); - assertEquals(etherMulticast, ns.ethHdr.dstMac); - assertTrue(ns.ipv6Hdr.dstIp.isMulticastAddress()); - assertNeighborSolicitation(ns, target); - } - - private NeighborSolicitation waitForUnicastNeighborSolicitation(final MacAddress dstMac, - final Inet6Address dstIp, final Inet6Address targetIp) throws Exception { - NeighborSolicitation ns; - while ((ns = getNextNeighborSolicitation()) != null) { - // Filter out the NSes used for duplicate address detetction, the target address - // is the global IPv6 address inside these NSes. - if (ns.nsHdr.target.isLinkLocalAddress()) break; - } - assertNotNull("No unicast Neighbor solicitation received on interface within timeout", ns); - assertUnicastNeighborSolicitation(ns, dstMac, dstIp, targetIp); - return ns; - } - - private List<NeighborSolicitation> waitForMultipleNeighborSolicitations() throws Exception { - NeighborSolicitation ns; - final List<NeighborSolicitation> nsList = new ArrayList<NeighborSolicitation>(); - while ((ns = getNextNeighborSolicitation()) != null) { - // Filter out the NSes used for duplicate address detetction, the target address - // is the global IPv6 address inside these NSes. - if (ns.nsHdr.target.isLinkLocalAddress()) { - nsList.add(ns); - } - } - assertFalse(nsList.isEmpty()); - return nsList; - } - - // Override this function with disabled experiment flag by default, in order not to - // affect those tests which are just related to basic IpReachabilityMonitor infra. - private void prepareIpReachabilityMonitorTest() throws Exception { - prepareIpReachabilityMonitorTest(false /* isMulticastResolicitEnabled */); - } - - private void prepareIpReachabilityMonitorTest(boolean isMulticastResolicitEnabled) - throws Exception { - final ScanResultInfo info = makeScanResultInfo(TEST_DEFAULT_SSID, TEST_DEFAULT_BSSID); - ProvisioningConfiguration config = new ProvisioningConfiguration.Builder() - .withLayer2Information(new Layer2Information(TEST_L2KEY, TEST_CLUSTER, - MacAddress.fromString(TEST_DEFAULT_BSSID))) - .withScanResultInfo(info) - .withDisplayName(TEST_DEFAULT_SSID) - .withoutIPv4() - .build(); - setFeatureEnabled(NetworkStackUtils.IP_REACHABILITY_MCAST_RESOLICIT_VERSION, - isMulticastResolicitEnabled); - startIpClientProvisioning(config); - verify(mCb, timeout(TEST_TIMEOUT_MS)).setFallbackMulticastFilter(false); - doIpv6OnlyProvisioning(); - - // Simulate the roaming. + handleDhcpPackets(true /* isSuccessLease */, TEST_LEASE_DURATION_S, + true /* shouldReplyRapidCommitAck */, TEST_DEFAULT_MTU, null /* serverSentUrl */); + verifyIPv4OnlyProvisioningSuccess(Collections.singletonList(CLIENT_ADDR)); forceLayer2Roaming(); } - @Test - public void testIpReachabilityMonitor_probeFailed() throws Exception { - prepareIpReachabilityMonitorTest(); + @Test @IgnoreUpTo(Build.VERSION_CODES.R) + public void testSetInitialBssidFromLayer2Info() throws Exception { + final Layer2Information layer2Info = new Layer2Information(TEST_L2KEY, TEST_CLUSTER, + MacAddress.fromString(TEST_DEFAULT_BSSID)); - final List<NeighborSolicitation> nsList = waitForMultipleNeighborSolicitations(); - assertEquals(MIN_NUD_SOLICIT_NUM, nsList.size()); - for (NeighborSolicitation ns : nsList) { - assertUnicastNeighborSolicitation(ns, ROUTER_MAC /* dstMac */, - ROUTER_LINK_LOCAL /* dstIp */, ROUTER_LINK_LOCAL /* targetIp */); - } - assertNotifyNeighborLost(ROUTER_LINK_LOCAL /* targetIp */); + doInitialBssidSetupTest(layer2Info, null /* scanResultInfo */); + + // Initial BSSID comes from layer2Info, it's different with target roaming bssid, + // then verify that DHCPREQUEST packet is sent after roaming. + final DhcpPacket packet = getNextDhcpPacket(); + assertTrue(packet instanceof DhcpRequestPacket); } - @Test - public void testIpReachabilityMonitor_probeReachable() throws Exception { - prepareIpReachabilityMonitorTest(); + @Test @IgnoreUpTo(Build.VERSION_CODES.R) + public void testSetInitialBssidFromLayer2Info_NullBssid() throws Exception { + final Layer2Information layer2Info = new Layer2Information(TEST_L2KEY, TEST_CLUSTER, + null /* bssid */); + final ScanResultInfo scanResultInfo = + makeScanResultInfo(TEST_DEFAULT_SSID, TEST_DHCP_ROAM_BSSID); - final NeighborSolicitation ns = waitForUnicastNeighborSolicitation(ROUTER_MAC /* dstMac */, - ROUTER_LINK_LOCAL /* dstIp */, ROUTER_LINK_LOCAL /* targetIp */); + doInitialBssidSetupTest(layer2Info, scanResultInfo); - // Reply Neighbor Advertisement and check notifyLost callback won't be triggered. - int flag = NEIGHBOR_ADVERTISEMENT_FLAG_ROUTER | NEIGHBOR_ADVERTISEMENT_FLAG_SOLICITED; - final ByteBuffer na = NeighborAdvertisement.build(ROUTER_MAC /* srcMac */, - ns.ethHdr.srcMac /* dstMac */, ROUTER_LINK_LOCAL /* srcIp */, - ns.ipv6Hdr.srcIp /* dstIp */, flag, ROUTER_LINK_LOCAL /* target */); - mPacketReader.sendResponse(na); - assertNeverNotifyNeighborLost(); + // Initial BSSID comes from layer2Info, it's null, no DHCPREQUEST packet + // will be sent after roaming. + final DhcpPacket packet = getNextDhcpPacket(TEST_TIMEOUT_MS); + assertNull(packet); } - @Test - public void testIpReachabilityMonitor_mcastResoclicitProbeFailed() throws Exception { - prepareIpReachabilityMonitorTest(true /* isMulticastResolicitEnabled */); + @Test @IgnoreUpTo(Build.VERSION_CODES.R) + public void testSetInitialBssidFromLayer2Info_SameRoamingBssid() throws Exception { + final Layer2Information layer2Info = new Layer2Information(TEST_L2KEY, TEST_CLUSTER, + MacAddress.fromString(TEST_DHCP_ROAM_BSSID)); - final List<NeighborSolicitation> nsList = waitForMultipleNeighborSolicitations(); - int expectedSize = MIN_NUD_SOLICIT_NUM + NUD_MCAST_RESOLICIT_NUM; - assertEquals(expectedSize, nsList.size()); // 5 unicast NSes + 3 multicast NSes - for (NeighborSolicitation ns : nsList.subList(0, MIN_NUD_SOLICIT_NUM)) { - assertUnicastNeighborSolicitation(ns, ROUTER_MAC /* dstMac */, - ROUTER_LINK_LOCAL /* dstIp */, ROUTER_LINK_LOCAL /* targetIp */); - } - for (NeighborSolicitation ns : nsList.subList(MIN_NUD_SOLICIT_NUM, nsList.size())) { - assertMulticastNeighborSolicitation(ns, ROUTER_LINK_LOCAL /* targetIp */); - } - assertNotifyNeighborLost(ROUTER_LINK_LOCAL /* targetIp */); + doInitialBssidSetupTest(layer2Info, null /* scanResultInfo */); + + // Initial BSSID comes from layer2Info, it's same with target roaming bssid, + // no DHCPREQUEST packet will be sent after roaming. + final DhcpPacket packet = getNextDhcpPacket(TEST_TIMEOUT_MS); + assertNull(packet); } - @Test - public void testIpReachabilityMonitor_mcastResoclicitProbeReachableWithSameLinkLayerAddress() + @Test @IgnoreAfter(Build.VERSION_CODES.R) + public void testSetInitialBssidFromScanResultInfo() throws Exception { + final ScanResultInfo scanResultInfo = + makeScanResultInfo(TEST_DEFAULT_SSID, TEST_DEFAULT_BSSID); + + doInitialBssidSetupTest(null /* layer2Info */, scanResultInfo); + + // Initial BSSID comes from ScanResultInfo, it's different with target roaming bssid, + // then verify that DHCPREQUEST packet is sent after roaming. + final DhcpPacket packet = getNextDhcpPacket(); + assertTrue(packet instanceof DhcpRequestPacket); + } + + @Test @IgnoreAfter(Build.VERSION_CODES.R) + public void testSetInitialBssidFromScanResultInfo_SameRoamingBssid() throws Exception { + final ScanResultInfo scanResultInfo = + makeScanResultInfo(TEST_DEFAULT_SSID, TEST_DHCP_ROAM_BSSID); + + doInitialBssidSetupTest(null /* layer2Info */, scanResultInfo); + + // Initial BSSID comes from ScanResultInfo, it's same with target roaming bssid, + // no DHCPREQUEST packet will be sent after roaming. + final DhcpPacket packet = getNextDhcpPacket(TEST_TIMEOUT_MS); + assertNull(packet); + } + + @Test @IgnoreAfter(Build.VERSION_CODES.R) + public void testSetInitialBssidFromScanResultInfo_BrokenInitialBssid() throws Exception { + final ScanResultInfo scanResultInfo = + makeScanResultInfo(TEST_DEFAULT_SSID, "00:11:22:33:44:"); + + doInitialBssidSetupTest(null /* layer2Info */, scanResultInfo); + + // Initial BSSID comes from ScanResultInfo, it's broken MAC address format and fallback + // to null layer2Info, no DHCPREQUEST packet will be sent after roaming. + final DhcpPacket packet = getNextDhcpPacket(TEST_TIMEOUT_MS); + assertNull(packet); + } + + @Test @IgnoreAfter(Build.VERSION_CODES.R) + public void testSetInitialBssidFromScanResultInfo_BrokenInitialBssidFallback() throws Exception { - prepareIpReachabilityMonitorTest(true /* isMulticastResolicitEnabled */); + final Layer2Information layer2Info = new Layer2Information(TEST_L2KEY, TEST_CLUSTER, + MacAddress.fromString(TEST_DEFAULT_BSSID)); + final ScanResultInfo scanResultInfo = + makeScanResultInfo(TEST_DEFAULT_SSID, "00:11:22:33:44:"); - final NeighborSolicitation ns = waitForUnicastNeighborSolicitation(ROUTER_MAC /* dstMac */, - ROUTER_LINK_LOCAL /* dstIp */, ROUTER_LINK_LOCAL /* targetIp */); + doInitialBssidSetupTest(layer2Info, scanResultInfo); - // Reply Neighbor Advertisement and check notifyLost callback won't be triggered. - int flag = NEIGHBOR_ADVERTISEMENT_FLAG_ROUTER | NEIGHBOR_ADVERTISEMENT_FLAG_SOLICITED; - final ByteBuffer na = NeighborAdvertisement.build(ROUTER_MAC /* srcMac */, - ns.ethHdr.srcMac /* dstMac */, ROUTER_LINK_LOCAL /* srcIp */, - ns.ipv6Hdr.srcIp /* dstIp */, flag, ROUTER_LINK_LOCAL /* target */); - mPacketReader.sendResponse(na); - assertNeverNotifyNeighborLost(); - } - - @Test - public void testIpReachabilityMonitor_mcastResoclicitProbeReachableWithDiffLinkLayerAddress() - throws Exception { - prepareIpReachabilityMonitorTest(true /* isMulticastResolicitEnabled */); - - final NeighborSolicitation ns = waitForUnicastNeighborSolicitation(ROUTER_MAC /* dstMac */, - ROUTER_LINK_LOCAL /* dstIp */, ROUTER_LINK_LOCAL /* targetIp */); - - // Reply Neighbor Advertisement with a different link-layer address and check notifyLost - // callback will be triggered. Override flag must be set, which indicates that the - // advertisement should override an existing cache entry and update the cached link-layer - // address, otherwise, kernel won't transit to REACHABLE state with a different link-layer - // address. - int flag = NEIGHBOR_ADVERTISEMENT_FLAG_ROUTER | NEIGHBOR_ADVERTISEMENT_FLAG_SOLICITED - | NEIGHBOR_ADVERTISEMENT_FLAG_OVERRIDE; - final MacAddress newMac = MacAddress.fromString("00:1a:11:22:33:55"); - final ByteBuffer na = NeighborAdvertisement.build(newMac /* srcMac */, - ns.ethHdr.srcMac /* dstMac */, ROUTER_LINK_LOCAL /* srcIp */, - ns.ipv6Hdr.srcIp /* dstIp */, flag, ROUTER_LINK_LOCAL /* target */); - mPacketReader.sendResponse(na); - assertNotifyNeighborLost(ROUTER_LINK_LOCAL /* targetIp */); - } - - @Test - public void testIPv6LinkLocalOnly() throws Exception { - ProvisioningConfiguration config = new ProvisioningConfiguration.Builder() - .withoutIPv4() - .withIpv6LinkLocalOnly() - .withRandomMacAddress() - .build(); - startIpClientProvisioning(config); - - final ArgumentCaptor<LinkProperties> captor = ArgumentCaptor.forClass(LinkProperties.class); - verify(mCb, timeout(TEST_TIMEOUT_MS)).onProvisioningSuccess(captor.capture()); - final LinkProperties lp = captor.getValue(); - assertNotNull(lp); - assertEquals(0, lp.getDnsServers().size()); - final List<LinkAddress> addresses = lp.getLinkAddresses(); - assertEquals(1, addresses.size()); - assertTrue(addresses.get(0).getAddress().isLinkLocalAddress()); - assertEquals(1, lp.getRoutes().size()); - final RouteInfo route = lp.getRoutes().get(0); - assertNotNull(route); - assertTrue(route.getDestination().equals(new IpPrefix("fe80::/64"))); - assertTrue(route.getGateway().isAnyLocalAddress()); - } - - @Test - public void testIPv6LinkLocalOnly_enableBothIPv4andIPv6LinkLocalOnly() throws Exception { - assertThrows(IllegalArgumentException.class, - () -> new ProvisioningConfiguration.Builder() - .withoutIpReachabilityMonitor() - .withIpv6LinkLocalOnly() - .withRandomMacAddress() - .build() - ); + // Initial BSSID comes from ScanResultInfo, it's broken MAC address format and fallback + // to check layer2Info, then verify DHCPREQUEST packet will be sent after roaming. + final DhcpPacket packet = getNextDhcpPacket(); + assertTrue(packet instanceof DhcpRequestPacket); } }
diff --git a/tests/integration/src/android/net/ip/IpClientRootTest.kt b/tests/integration/src/android/net/ip/IpClientRootTest.kt index d861639..68d8aab 100644 --- a/tests/integration/src/android/net/ip/IpClientRootTest.kt +++ b/tests/integration/src/android/net/ip/IpClientRootTest.kt
@@ -33,7 +33,6 @@ import androidx.test.platform.app.InstrumentationRegistry import com.android.net.module.util.DeviceConfigUtils import java.lang.System.currentTimeMillis -import java.net.Inet6Address import java.util.concurrent.CompletableFuture import java.util.concurrent.CountDownLatch import java.util.concurrent.TimeUnit @@ -46,8 +45,6 @@ import org.junit.AfterClass import org.junit.BeforeClass import org.mockito.ArgumentCaptor -import org.mockito.Mockito.anyString -import org.mockito.Mockito.never import org.mockito.Mockito.timeout import org.mockito.Mockito.verify @@ -153,7 +150,6 @@ IIpClientCallbacks.Stub(), IIpClientCallbacks by base { // asBinder is implemented by both base class and delegate: specify explicitly override fun asBinder() = super.asBinder() - override fun getInterfaceVersion() = IIpClientCallbacks.VERSION } @After @@ -264,16 +260,4 @@ mStore.retrieveNetworkAttributes(l2Key, listener) assertNull(listener.getBlockingNetworkAttributes(timeout)) } - - override fun assertNotifyNeighborLost(targetIp: Inet6Address) { - verify(mCb, timeout(TEST_TIMEOUT_MS)).onReachabilityLost(anyString()) - } - - override fun assertNeverNotifyNeighborLost() { - verify(mCb, never()).onReachabilityLost(anyString()) - } - - override fun storeNetworkAttributes(l2Key: String, na: NetworkAttributes) { - mStore.storeNetworkAttributes(l2Key, na, null /* listener */) - } }
diff --git a/tests/integration/src/android/net/netlink/InetDiagSocketIntegrationTest.java b/tests/integration/src/android/net/netlink/InetDiagSocketIntegrationTest.java index 0329fab..e474d8a 100644 --- a/tests/integration/src/android/net/netlink/InetDiagSocketIntegrationTest.java +++ b/tests/integration/src/android/net/netlink/InetDiagSocketIntegrationTest.java
@@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.net.module.util.netlink; +package android.net.netlink; import static android.system.OsConstants.AF_INET; import static android.system.OsConstants.AF_INET6;
diff --git a/tests/unit/Android.bp b/tests/unit/Android.bp index fa054fe..e308b96 100644 --- a/tests/unit/Android.bp +++ b/tests/unit/Android.bp
@@ -36,10 +36,7 @@ "android.test.base", "android.test.mock", ], - defaults: [ - "framework-connectivity-test-defaults", - "libnetworkstackutilsjni_deps" - ], + defaults: ["libnetworkstackutilsjni_deps"], jni_libs: [ // For mockito extended "libdexmakerjvmtiagent", @@ -47,6 +44,7 @@ "libnetworkstackutilsjni", ], jni_uses_sdk_apis: true, + jarjar_rules: ":NetworkStackJarJarRules", } // Tests for NetworkStackNext. @@ -60,7 +58,7 @@ defaults: ["NetworkStackTestsDefaults"], static_libs: ["NetworkStackApiCurrentLib"], compile_multilib: "both", // Workaround for b/147785146 for mainline-presubmit - jarjar_rules: ":NetworkStackJarJarRules", + enabled: false, // Disabled in mainline-prod } // Library containing the unit tests. This is used by the coverage test target to pull in the @@ -73,8 +71,8 @@ static_libs: ["NetworkStackApiStableLib"], visibility: [ "//packages/modules/NetworkStack/tests/integration", - "//packages/modules/Connectivity/tests:__subpackages__", - "//packages/modules/Connectivity/Tethering/tests:__subpackages__", + "//frameworks/base/packages/Tethering/tests/integration", + "//packages/modules/Connectivity/Tethering/tests/integration", ] } @@ -87,7 +85,6 @@ defaults: ["NetworkStackTestsDefaults"], static_libs: ["NetworkStackApiStableLib"], compile_multilib: "both", - jarjar_rules: ":NetworkStackJarJarRules", } // Additional dependencies of libnetworkstackutilsjni that are not provided by the system when
diff --git a/tests/unit/lint-baseline.xml b/tests/unit/lint-baseline.xml index 0bfcaa9..ededbea 100644 --- a/tests/unit/lint-baseline.xml +++ b/tests/unit/lint-baseline.xml
@@ -3,6 +3,105 @@ <issue id="NewApi" + message="Call requires API level R (current min is 29): `new android.net.NetworkCapabilities`" + errorLine1=" private static final NetworkCapabilities CELL_METERED_CAPABILITIES = new NetworkCapabilities()" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="packages/modules/NetworkStack/tests/unit/src/com/android/server/connectivity/NetworkMonitorTest.java" + line="297" + column="74"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 29): `new android.net.NetworkCapabilities`" + errorLine1=" new NetworkCapabilities()" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="packages/modules/NetworkStack/tests/unit/src/com/android/server/connectivity/NetworkMonitorTest.java" + line="302" + column="13"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 29): `new android.net.NetworkCapabilities`" + errorLine1=" new NetworkCapabilities()" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="packages/modules/NetworkStack/tests/unit/src/com/android/server/connectivity/NetworkMonitorTest.java" + line="308" + column="13"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 29): `new android.net.NetworkCapabilities`" + errorLine1=" new NetworkCapabilities().addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR);" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="packages/modules/NetworkStack/tests/unit/src/com/android/server/connectivity/NetworkMonitorTest.java" + line="314" + column="13"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 29): `new android.net.NetworkCapabilities`" + errorLine1=" final NetworkCapabilities nc = new NetworkCapabilities()" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="packages/modules/NetworkStack/tests/unit/src/com/android/server/connectivity/NetworkMonitorTest.java" + line="670" + column="40"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 29): `new android.net.NetworkCapabilities`" + errorLine1=" final NetworkCapabilities nc = new NetworkCapabilities()" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="packages/modules/NetworkStack/tests/unit/src/com/android/server/connectivity/NetworkMonitorTest.java" + line="690" + column="40"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 29): `new android.net.NetworkCapabilities`" + errorLine1=" final NetworkCapabilities meteredCap = new NetworkCapabilities()" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="packages/modules/NetworkStack/tests/unit/src/com/android/server/connectivity/NetworkMonitorTest.java" + line="726" + column="48"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 29): `new android.net.NetworkCapabilities`" + errorLine1=" final NetworkCapabilities nonMeteredCap = new NetworkCapabilities()" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="packages/modules/NetworkStack/tests/unit/src/com/android/server/connectivity/NetworkMonitorTest.java" + line="746" + column="51"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 29): `new android.net.NetworkCapabilities`" + errorLine1=" final NetworkCapabilities nc = new NetworkCapabilities()" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~"> + <location + file="packages/modules/NetworkStack/tests/unit/src/com/android/server/connectivity/NetworkMonitorTest.java" + line="2149" + column="40"/> + </issue> + + <issue + id="NewApi" message="Call requires API level R (current min is 29): `android.net.NetworkCapabilities()`" errorLine1=" private val EMPTY_CAPABILITIES = NetworkCapabilities()" errorLine2=" ~~~~~~~~~~~~~~~~~~~~~"> @@ -78,4 +177,81 @@ column="14"/> </issue> + <issue + id="NewApi" + message="Call requires API level R (current min is 29): `android.net.NetworkCapabilities()`" + errorLine1=" mCallback.onCapabilitiesChanged(net2097, NetworkCapabilities())" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~"> + <location + file="packages/modules/NetworkStack/tests/unit/src/android/net/testutils/TestableNetworkCallbackTest.kt" + line="59" + column="50"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 29): `android.net.NetworkCapabilities()`" + errorLine1=" mCallback.onCapabilitiesChanged(net2098, NetworkCapabilities())" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~"> + <location + file="packages/modules/NetworkStack/tests/unit/src/android/net/testutils/TestableNetworkCallbackTest.kt" + line="71" + column="50"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 29): `android.net.NetworkCapabilities()`" + errorLine1=" val meteredNc = NetworkCapabilities()" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~"> + <location + file="packages/modules/NetworkStack/tests/unit/src/android/net/testutils/TestableNetworkCallbackTest.kt" + line="108" + column="25"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 29): `android.net.NetworkCapabilities()`" + errorLine1=" val unmeteredNc = NetworkCapabilities().addCapability(NOT_METERED)" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~"> + <location + file="packages/modules/NetworkStack/tests/unit/src/android/net/testutils/TestableNetworkCallbackTest.kt" + line="109" + column="27"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 29): `android.net.NetworkCapabilities()`" + errorLine1=" val netCaps = NetworkCapabilities().addTransportType(CELLULAR)" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~"> + <location + file="packages/modules/NetworkStack/tests/unit/src/android/net/testutils/TestableNetworkCallbackTest.kt" + line="130" + column="23"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 29): `android.net.NetworkCapabilities()`" + errorLine1=" val netCaps = NetworkCapabilities().addCapability(NOT_METERED).addTransportType(WIFI)" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~"> + <location + file="packages/modules/NetworkStack/tests/unit/src/android/net/testutils/TestableNetworkCallbackTest.kt" + line="152" + column="23"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level R (current min is 29): `android.net.NetworkCapabilities()`" + errorLine1=" "CapabilitiesChanged" -> cb.onCapabilitiesChanged(net, NetworkCapabilities())" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~"> + <location + file="packages/modules/NetworkStack/tests/unit/src/android/net/testutils/TestableNetworkCallbackTest.kt" + line="279" + column="68"/> + </issue> + </issues>
diff --git a/tests/unit/src/android/net/dhcp/DhcpPacketTest.java b/tests/unit/src/android/net/dhcp/DhcpPacketTest.java index 1a1f6c3..d0c49d3 100644 --- a/tests/unit/src/android/net/dhcp/DhcpPacketTest.java +++ b/tests/unit/src/android/net/dhcp/DhcpPacketTest.java
@@ -96,12 +96,12 @@ @Before public void setUp() { - DhcpPacket.sTestOverrideVendorId = "android-dhcp-???"; + DhcpPacket.testOverrideVendorId = "android-dhcp-???"; } @After public void tearDown() { - DhcpPacket.sTestOverrideVendorId = null; + DhcpPacket.testOverrideVendorId = null; } class TestDhcpPacket extends DhcpPacket {
diff --git a/tests/unit/src/android/net/ip/ConntrackMonitorTest.java b/tests/unit/src/android/net/ip/ConntrackMonitorTest.java index fc0d52b..6e9078e 100644 --- a/tests/unit/src/android/net/ip/ConntrackMonitorTest.java +++ b/tests/unit/src/android/net/ip/ConntrackMonitorTest.java
@@ -16,16 +16,15 @@ package android.net.ip; import static android.net.ip.ConntrackMonitor.ConntrackEvent; +import static android.net.netlink.ConntrackMessage.Tuple; +import static android.net.netlink.ConntrackMessage.TupleIpv4; +import static android.net.netlink.ConntrackMessage.TupleProto; +import static android.net.netlink.NetlinkConstants.IPCTNL_MSG_CT_DELETE; +import static android.net.netlink.NetlinkConstants.IPCTNL_MSG_CT_NEW; import static android.system.OsConstants.AF_UNIX; import static android.system.OsConstants.IPPROTO_TCP; import static android.system.OsConstants.SOCK_DGRAM; -import static com.android.net.module.util.netlink.ConntrackMessage.Tuple; -import static com.android.net.module.util.netlink.ConntrackMessage.TupleIpv4; -import static com.android.net.module.util.netlink.ConntrackMessage.TupleProto; -import static com.android.net.module.util.netlink.NetlinkConstants.IPCTNL_MSG_CT_DELETE; -import static com.android.net.module.util.netlink.NetlinkConstants.IPCTNL_MSG_CT_NEW; - import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.fail; @@ -34,6 +33,8 @@ import static org.mockito.Mockito.verify; import android.net.InetAddresses; +import android.net.netlink.NetlinkConstants; +import android.net.netlink.NetlinkSocket; import android.net.util.SharedLog; import android.os.ConditionVariable; import android.os.Handler; @@ -45,9 +46,6 @@ import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; -import com.android.net.module.util.netlink.NetlinkConstants; -import com.android.net.module.util.netlink.NetlinkSocket; - import libcore.util.HexEncoding; import org.junit.After;
diff --git a/tests/unit/src/android/net/ip/IpClientTest.java b/tests/unit/src/android/net/ip/IpClientTest.java index 95fe93a..e991ea7 100644 --- a/tests/unit/src/android/net/ip/IpClientTest.java +++ b/tests/unit/src/android/net/ip/IpClientTest.java
@@ -18,15 +18,12 @@ import static android.system.OsConstants.RT_SCOPE_UNIVERSE; -import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.mockito.Mockito.any; import static org.mockito.Mockito.anyString; -import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.eq; import static org.mockito.Mockito.never; import static org.mockito.Mockito.reset; @@ -51,32 +48,22 @@ import android.net.MacAddress; import android.net.NetworkStackIpMemoryStore; import android.net.RouteInfo; -import android.net.apf.ApfCapabilities; -import android.net.apf.ApfFilter.ApfConfiguration; import android.net.ipmemorystore.NetworkAttributes; import android.net.metrics.IpConnectivityLog; import android.net.shared.InitialConfiguration; -import android.net.shared.Layer2Information; import android.net.shared.ProvisioningConfiguration; -import android.net.shared.ProvisioningConfiguration.ScanResultInfo; import android.net.util.InterfaceParams; -import android.os.Build; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; -import com.android.networkstack.R; 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; import com.android.testutils.HandlerUtils; import org.junit.Before; -import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; @@ -86,12 +73,9 @@ import java.net.Inet4Address; import java.net.Inet6Address; import java.net.InetAddress; -import java.nio.ByteBuffer; import java.util.Arrays; -import java.util.Collections; import java.util.HashSet; import java.util.List; -import java.util.Random; import java.util.Set; @@ -101,9 +85,6 @@ @RunWith(AndroidJUnit4.class) @SmallTest public class IpClientTest { - @Rule - public final DevSdkIgnoreRule mIgnoreRule = new DevSdkIgnoreRule(); - private static final String VALID = "VALID"; private static final String INVALID = "INVALID"; private static final String TEST_IFNAME = "test_wlan0"; @@ -113,9 +94,6 @@ private static final int TEST_TIMEOUT_MS = 400; private static final String TEST_L2KEY = "some l2key"; private static final String TEST_CLUSTER = "some cluster"; - private static final String TEST_SSID = "test_ssid"; - private static final String TEST_BSSID = "00:11:22:33:44:55"; - private static final String TEST_BSSID2 = "00:1A:11:22:33:44"; private static final String TEST_GLOBAL_ADDRESS = "1234:4321::548d:2db2:4fcf:ef75/64"; private static final String[] TEST_LOCAL_ADDRESSES = { @@ -431,7 +409,6 @@ @Test public void testIsProvisioned() throws Exception { - final IpClient ipc = makeIpClient(TEST_IFNAME); InitialConfiguration empty = conf(links(), prefixes()); IsProvisionedTestCase[] testcases = { // nothing @@ -463,7 +440,7 @@ }; for (IsProvisionedTestCase testcase : testcases) { - if (ipc.isProvisioned(testcase.lp, testcase.config) != testcase.isProvisioned) { + if (IpClient.isProvisioned(testcase.lp, testcase.config) != testcase.isProvisioned) { fail(testcase.errorMessage()); } } @@ -654,183 +631,6 @@ return out; } - private ApfConfiguration verifyApfFilterCreatedOnStart(IpClient ipc) { - ProvisioningConfiguration config = new ProvisioningConfiguration.Builder() - .withoutIPv4() - .withoutIpReachabilityMonitor() - .withInitialConfiguration( - conf(links(TEST_LOCAL_ADDRESSES), prefixes(TEST_PREFIXES), ips())) - .withApfCapabilities(new ApfCapabilities( - 4 /* version */, 4096 /* maxProgramSize */, 4 /* format */)) - .build(); - - ipc.startProvisioning(config); - final ArgumentCaptor<ApfConfiguration> configCaptor = ArgumentCaptor.forClass( - ApfConfiguration.class); - verify(mDependencies, timeout(TEST_TIMEOUT_MS)).maybeCreateApfFilter( - any(), configCaptor.capture(), any(), any()); - - return configCaptor.getValue(); - } - - @Test @IgnoreAfter(Build.VERSION_CODES.R) - public void testApfConfiguration_R() throws Exception { - final IpClient ipc = makeIpClient(TEST_IFNAME); - final ApfConfiguration config = verifyApfFilterCreatedOnStart(ipc); - - assertEquals(ApfCapabilities.getApfDrop8023Frames(), config.ieee802_3Filter); - assertArrayEquals(ApfCapabilities.getApfEtherTypeBlackList(), config.ethTypeBlackList); - - verify(mResources, never()).getBoolean(R.bool.config_apfDrop802_3Frames); - verify(mResources, never()).getIntArray(R.array.config_apfEthTypeDenyList); - - verifyShutdown(ipc); - } - - @Test @IgnoreUpTo(Build.VERSION_CODES.R) - public void testApfConfiguration() throws Exception { - doReturn(true).when(mResources).getBoolean(R.bool.config_apfDrop802_3Frames); - final int[] ethTypeDenyList = new int[] { 0x88A2, 0x88A4 }; - doReturn(ethTypeDenyList).when(mResources).getIntArray( - R.array.config_apfEthTypeDenyList); - - final IpClient ipc = makeIpClient(TEST_IFNAME); - final ApfConfiguration config = verifyApfFilterCreatedOnStart(ipc); - - assertTrue(config.ieee802_3Filter); - assertArrayEquals(ethTypeDenyList, config.ethTypeBlackList); - - verifyShutdown(ipc); - } - - @Test @IgnoreUpTo(Build.VERSION_CODES.R) - public void testApfConfiguration_NoApfDrop8023Frames() throws Exception { - doReturn(false).when(mResources).getBoolean(R.bool.config_apfDrop802_3Frames); - final int[] ethTypeDenyList = new int[] { 0x88A3, 0x88A5 }; - doReturn(ethTypeDenyList).when(mResources).getIntArray( - R.array.config_apfEthTypeDenyList); - - final IpClient ipc = makeIpClient(TEST_IFNAME); - final ApfConfiguration config = verifyApfFilterCreatedOnStart(ipc); - - assertFalse(config.ieee802_3Filter); - assertArrayEquals(ethTypeDenyList, config.ethTypeBlackList); - - verifyShutdown(ipc); - } - - private ScanResultInfo makeScanResultInfo(final String ssid, final String bssid) { - final ByteBuffer payload = ByteBuffer.allocate(14 /* oui + type + data */); - final byte[] data = new byte[10]; - new Random().nextBytes(data); - payload.put(new byte[] { 0x00, 0x1A, 0x11 }); - payload.put((byte) 0x06); - payload.put(data); - - final ScanResultInfo.InformationElement ie = - new ScanResultInfo.InformationElement(0xdd /* IE id */, payload); - return new ScanResultInfo(ssid, bssid, Collections.singletonList(ie)); - } - - @Test - public void testGetInitialBssidOnSOrAbove() throws Exception { - final IpClient ipc = makeIpClient(TEST_IFNAME); - final Layer2Information layer2Info = new Layer2Information(TEST_L2KEY, TEST_CLUSTER, - MacAddress.fromString(TEST_BSSID)); - final ScanResultInfo scanResultInfo = makeScanResultInfo(TEST_SSID, TEST_BSSID2); - final MacAddress bssid = ipc.getInitialBssid(layer2Info, scanResultInfo, - true /* isAtLeastS */); - assertEquals(bssid, MacAddress.fromString(TEST_BSSID)); - } - - @Test - public void testGetInitialBssidOnSOrAbove_NullScanReqsultInfo() throws Exception { - final IpClient ipc = makeIpClient(TEST_IFNAME); - final Layer2Information layer2Info = new Layer2Information(TEST_L2KEY, TEST_CLUSTER, - MacAddress.fromString(TEST_BSSID)); - final MacAddress bssid = ipc.getInitialBssid(layer2Info, null /* ScanResultInfo */, - true /* isAtLeastS */); - assertEquals(bssid, MacAddress.fromString(TEST_BSSID)); - } - - @Test - public void testGetInitialBssidOnSOrAbove_NullBssid() throws Exception { - final IpClient ipc = makeIpClient(TEST_IFNAME); - final Layer2Information layer2Info = new Layer2Information(TEST_L2KEY, TEST_CLUSTER, - null /* bssid */); - final ScanResultInfo scanResultInfo = makeScanResultInfo(TEST_SSID, TEST_BSSID); - final MacAddress bssid = ipc.getInitialBssid(layer2Info, scanResultInfo, - true /* isAtLeastS */); - assertNull(bssid); - } - - @Test - public void testGetInitialBssidOnSOrAbove_NullLayer2Info() throws Exception { - final IpClient ipc = makeIpClient(TEST_IFNAME); - final ScanResultInfo scanResultInfo = makeScanResultInfo(TEST_SSID, TEST_BSSID); - final MacAddress bssid = ipc.getInitialBssid(null /* layer2Info */, scanResultInfo, - true /* isAtLeastS */); - assertNull(bssid); - } - - @Test - public void testGetInitialBssidBeforeS() throws Exception { - final IpClient ipc = makeIpClient(TEST_IFNAME); - final Layer2Information layer2Info = new Layer2Information(TEST_L2KEY, TEST_CLUSTER, - MacAddress.fromString(TEST_BSSID2)); - final ScanResultInfo scanResultInfo = makeScanResultInfo(TEST_SSID, TEST_BSSID); - final MacAddress bssid = ipc.getInitialBssid(layer2Info, scanResultInfo, - false /* isAtLeastS */); - assertEquals(bssid, MacAddress.fromString(TEST_BSSID)); - } - - @Test - public void testGetInitialBssidBeforeS_NullLayer2Info() throws Exception { - final IpClient ipc = makeIpClient(TEST_IFNAME); - final ScanResultInfo scanResultInfo = makeScanResultInfo(TEST_SSID, TEST_BSSID); - final MacAddress bssid = ipc.getInitialBssid(null /* layer2Info */, scanResultInfo, - false /* isAtLeastS */); - assertEquals(bssid, MacAddress.fromString(TEST_BSSID)); - } - - @Test - public void testGetInitialBssidBeforeS_BrokenInitialBssid() throws Exception { - final IpClient ipc = makeIpClient(TEST_IFNAME); - final ScanResultInfo scanResultInfo = makeScanResultInfo(TEST_SSID, "00:11:22:33:44:"); - final MacAddress bssid = ipc.getInitialBssid(null /* layer2Info */, scanResultInfo, - false /* isAtLeastS */); - assertNull(bssid); - } - - @Test - public void testGetInitialBssidBeforeS_BrokenInitialBssidFallback() throws Exception { - final IpClient ipc = makeIpClient(TEST_IFNAME); - final Layer2Information layer2Info = new Layer2Information(TEST_L2KEY, TEST_CLUSTER, - MacAddress.fromString(TEST_BSSID)); - final ScanResultInfo scanResultInfo = makeScanResultInfo(TEST_SSID, "00:11:22:33:44:"); - final MacAddress bssid = ipc.getInitialBssid(layer2Info, scanResultInfo, - false /* isAtLeastS */); - assertEquals(bssid, MacAddress.fromString(TEST_BSSID)); - } - - @Test - public void testGetInitialBssidBeforeS_NullScanResultInfoFallback() throws Exception { - final IpClient ipc = makeIpClient(TEST_IFNAME); - final Layer2Information layer2Info = new Layer2Information(TEST_L2KEY, TEST_CLUSTER, - MacAddress.fromString(TEST_BSSID)); - final MacAddress bssid = ipc.getInitialBssid(layer2Info, null /* scanResultInfo */, - false /* isAtLeastS */); - assertEquals(bssid, MacAddress.fromString(TEST_BSSID)); - } - - @Test - public void testGetInitialBssidBeforeS_NullScanResultInfoAndLayer2Info() throws Exception { - final IpClient ipc = makeIpClient(TEST_IFNAME); - final MacAddress bssid = ipc.getInitialBssid(null /* layer2Info */, - null /* scanResultInfo */, false /* isAtLeastS */); - assertNull(bssid); - } - interface Fn<A,B> { B call(A a) throws Exception; }
diff --git a/tests/unit/src/android/net/ip/IpReachabilityMonitorTest.kt b/tests/unit/src/android/net/ip/IpReachabilityMonitorTest.kt index ea8f1da..863e268 100644 --- a/tests/unit/src/android/net/ip/IpReachabilityMonitorTest.kt +++ b/tests/unit/src/android/net/ip/IpReachabilityMonitorTest.kt
@@ -16,7 +16,6 @@ package android.net.ip import android.content.Context -import android.net.ip.IpNeighborMonitor.NeighborEventConsumer import android.net.INetd import android.net.InetAddresses.parseNumericAddress import android.net.IpPrefix @@ -24,37 +23,19 @@ import android.net.LinkProperties import android.net.RouteInfo import android.net.metrics.IpConnectivityLog +import android.net.netlink.StructNdMsg.NUD_FAILED +import android.net.netlink.StructNdMsg.NUD_STALE +import android.net.netlink.makeNewNeighMessage import android.net.util.InterfaceParams -import android.net.util.NetworkStackUtils.IP_REACHABILITY_MCAST_RESOLICIT_VERSION import android.net.util.SharedLog import android.os.Handler import android.os.HandlerThread import android.os.MessageQueue import android.os.MessageQueue.OnFileDescriptorEventListener -import android.stats.connectivity.IpType -import android.stats.connectivity.IpType.IPV4 -import android.stats.connectivity.IpType.IPV6 -import android.stats.connectivity.NudEventType -import android.stats.connectivity.NudEventType.NUD_CONFIRM_FAILED -import android.stats.connectivity.NudEventType.NUD_CONFIRM_FAILED_CRITICAL -import android.stats.connectivity.NudEventType.NUD_MAC_ADDRESS_CHANGED -import android.stats.connectivity.NudEventType.NUD_POST_ROAMING_FAILED -import android.stats.connectivity.NudEventType.NUD_POST_ROAMING_FAILED_CRITICAL -import android.stats.connectivity.NudEventType.NUD_ORGANIC_FAILED -import android.stats.connectivity.NudEventType.NUD_ORGANIC_FAILED_CRITICAL -import android.stats.connectivity.NudNeighborType -import android.stats.connectivity.NudNeighborType.NUD_NEIGHBOR_BOTH -import android.stats.connectivity.NudNeighborType.NUD_NEIGHBOR_DNS -import android.stats.connectivity.NudNeighborType.NUD_NEIGHBOR_GATEWAY import android.system.ErrnoException import android.system.OsConstants.EAGAIN import androidx.test.filters.SmallTest import androidx.test.runner.AndroidJUnit4 -import com.android.networkstack.metrics.IpReachabilityMonitorMetrics -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 -import com.android.testutils.makeNewNeighMessage import com.android.testutils.waitForIdle import org.junit.After import org.junit.Before @@ -62,15 +43,12 @@ import org.junit.runner.RunWith import org.mockito.ArgumentCaptor import org.mockito.ArgumentMatchers.any -import org.mockito.ArgumentMatchers.anyBoolean import org.mockito.ArgumentMatchers.anyInt -import org.mockito.ArgumentMatchers.anyObject import org.mockito.ArgumentMatchers.anyString import org.mockito.ArgumentMatchers.eq import org.mockito.Mockito.doAnswer import org.mockito.Mockito.doReturn import org.mockito.Mockito.mock -import org.mockito.Mockito.never import org.mockito.Mockito.timeout import org.mockito.Mockito.verify import java.io.FileDescriptor @@ -88,20 +66,12 @@ private val TEST_IPV4_GATEWAY = parseNumericAddress("192.168.222.3") as Inet4Address private val TEST_IPV6_GATEWAY = parseNumericAddress("2001:db8::1") as Inet6Address -// IPv4 gateway is also DNS server. -private val TEST_IPV4_GATEWAY_DNS = parseNumericAddress("192.168.222.100") as Inet4Address - private val TEST_IPV4_LINKADDR = LinkAddress("192.168.222.123/24") private val TEST_IPV6_LINKADDR = LinkAddress("2001:db8::123/64") -private val TEST_IPV6_LINKLOCAL_LINKADDR = LinkAddress("fe80::123/64") -private val TEST_IPV6_LINKLOCAL_GATEWAY = parseNumericAddress("fe80::1") as Inet6Address -private val TEST_IPV6_LINKLOCAL_SCOPED_GATEWAY = parseNumericAddress("fe80::1%21") as Inet6Address - // DNSes inside IP prefix private val TEST_IPV4_DNS = parseNumericAddress("192.168.222.1") as Inet4Address private val TEST_IPV6_DNS = parseNumericAddress("2001:db8::321") as Inet6Address -private val TEST_IPV6_DNS2 = parseNumericAddress("2001:db8::456") as Inet6Address private val TEST_IFACE = InterfaceParams("fake0", 21, null) private val TEST_LINK_PROPERTIES = LinkProperties().apply { @@ -121,54 +91,6 @@ addDnsServer(TEST_IPV6_DNS) } -private val TEST_IPV4_ONLY_LINK_PROPERTIES = LinkProperties().apply { - interfaceName = TEST_IFACE.name - addLinkAddress(TEST_IPV4_LINKADDR) - - // Add on link routes - addRoute(RouteInfo(TEST_IPV4_LINKADDR, null /* gateway */, TEST_IFACE.name)) - - // Add default routes - addRoute(RouteInfo(IpPrefix(parseNumericAddress("0.0.0.0"), 0), TEST_IPV4_GATEWAY_DNS)) - - addDnsServer(TEST_IPV4_GATEWAY_DNS) -} - -private val TEST_IPV6_LINKLOCAL_SCOPED_LINK_PROPERTIES = LinkProperties().apply { - interfaceName = TEST_IFACE.name - addLinkAddress(TEST_IPV6_LINKADDR) - addLinkAddress(TEST_IPV6_LINKLOCAL_LINKADDR) - - // Add on link routes - addRoute(RouteInfo(TEST_IPV6_LINKADDR, null /* gateway */, TEST_IFACE.name)) - addRoute(RouteInfo(TEST_IPV6_LINKLOCAL_LINKADDR, null /* gateway */, TEST_IFACE.name)) - - // Add default routes - addRoute(RouteInfo(IpPrefix(parseNumericAddress("::"), 0), TEST_IPV6_LINKLOCAL_SCOPED_GATEWAY)) - - addDnsServer(TEST_IPV6_DNS) -} - -private val TEST_DUAL_LINK_PROPERTIES = LinkProperties().apply { - interfaceName = TEST_IFACE.name - addLinkAddress(TEST_IPV4_LINKADDR) - addLinkAddress(TEST_IPV6_LINKADDR) - addLinkAddress(TEST_IPV6_LINKLOCAL_LINKADDR) - - // Add on link routes - addRoute(RouteInfo(TEST_IPV4_LINKADDR, null /* gateway */, TEST_IFACE.name)) - addRoute(RouteInfo(TEST_IPV6_LINKADDR, null /* gateway */, TEST_IFACE.name)) - addRoute(RouteInfo(TEST_IPV6_LINKLOCAL_LINKADDR, null /* gateway */, TEST_IFACE.name)) - - // Add default routes - addRoute(RouteInfo(IpPrefix(parseNumericAddress("0.0.0.0"), 0), TEST_IPV4_GATEWAY)) - addRoute(RouteInfo(IpPrefix(parseNumericAddress("::"), 0), TEST_IPV6_LINKLOCAL_SCOPED_GATEWAY)) - - addDnsServer(TEST_IPV4_DNS) - addDnsServer(TEST_IPV6_DNS) - addDnsServer(TEST_IPV6_DNS2) -} - /** * Tests for IpReachabilityMonitor. */ @@ -182,7 +104,6 @@ private val netd = mock(INetd::class.java) private val fd = mock(FileDescriptor::class.java) private val metricsLog = mock(IpConnectivityLog::class.java) - private val mIpReachabilityMonitorMetrics = mock(IpReachabilityMonitorMetrics::class.java) private val handlerThread = HandlerThread(IpReachabilityMonitorTest::class.simpleName) private val handler by lazy { Handler(handlerThread.looper) } @@ -250,8 +171,6 @@ neighborMonitor = TestIpNeighborMonitor(handler, log, cb, fd) neighborMonitor }.`when`(dependencies).makeIpNeighborMonitor(any(), any(), any()) - doReturn(mIpReachabilityMonitorMetrics) - .`when`(dependencies).getIpReachabilityMonitorMetrics() val monitorFuture = CompletableFuture<IpReachabilityMonitor>() // IpReachabilityMonitor needs to be started from the handler thread @@ -288,8 +207,8 @@ verify(callback, timeout(TEST_TIMEOUT_MS)).notifyLost(eq(TEST_IPV4_DNS), anyString()) } - private fun runLoseProvisioningTest(newLp: LinkProperties, lostNeighbor: InetAddress) { - reachabilityMonitor.updateLinkProperties(newLp) + private fun runLoseProvisioningTest(lostNeighbor: InetAddress) { + reachabilityMonitor.updateLinkProperties(TEST_LINK_PROPERTIES) neighborMonitor.enqueuePacket(makeNewNeighMessage(TEST_IPV4_GATEWAY, NUD_STALE)) neighborMonitor.enqueuePacket(makeNewNeighMessage(TEST_IPV6_GATEWAY, NUD_STALE)) @@ -300,261 +219,23 @@ verify(callback, timeout(TEST_TIMEOUT_MS)).notifyLost(eq(lostNeighbor), anyString()) } - private fun verifyNudFailureMetrics( - eventType: NudEventType, - ipType: IpType, - lostNeighborType: NudNeighborType - ) { - verify(mIpReachabilityMonitorMetrics, timeout(TEST_TIMEOUT_MS)).setNudIpType(eq(ipType)) - verify(mIpReachabilityMonitorMetrics, timeout(TEST_TIMEOUT_MS)) - .setNudEventType(eq(eventType)) - verify(mIpReachabilityMonitorMetrics, timeout(TEST_TIMEOUT_MS)) - .setNudNeighborType(eq(lostNeighborType)) - } - - // Verify if the notifyLost will be called when one neighbor has lost but it's still - // provisioned. - private fun runLoseNeighborStillProvisionedTest( - newLp: LinkProperties, - lostNeighbor: InetAddress, - eventType: NudEventType, - ipType: IpType, - lostNeighborType: NudNeighborType - ) { - reachabilityMonitor.updateLinkProperties(newLp) - - neighborMonitor.enqueuePacket(makeNewNeighMessage(lostNeighbor, NUD_FAILED)) - handlerThread.waitForIdle(TEST_TIMEOUT_MS) - verify(callback, never()).notifyLost(any(), anyString()) - verifyNudFailureMetrics(eventType, ipType, lostNeighborType) - } - - private fun runNeighborReachableButMacAddrChangedTest( - newLp: LinkProperties, - neighbor: InetAddress, - ipType: IpType - ) { - doReturn(true).`when`(dependencies).isFeatureEnabled(anyObject(), - eq(IP_REACHABILITY_MCAST_RESOLICIT_VERSION), anyBoolean()) - - reachabilityMonitor.updateLinkProperties(newLp) - - neighborMonitor.enqueuePacket(makeNewNeighMessage(neighbor, NUD_REACHABLE, - "001122334455" /* oldMac */)) - handlerThread.waitForIdle(TEST_TIMEOUT_MS) - verify(callback, never()).notifyLost(eq(neighbor), anyString()) - - reachabilityMonitor.probeAll(true /* dueToRoam */) - - neighborMonitor.enqueuePacket(makeNewNeighMessage(neighbor, NUD_REACHABLE, - "1122334455aa" /* newMac */)) - verify(callback, timeout(TEST_TIMEOUT_MS)).notifyLost(eq(neighbor), anyString()) - verifyNudFailureMetrics(NUD_MAC_ADDRESS_CHANGED, ipType, NUD_NEIGHBOR_GATEWAY) - } - @Test fun testLoseProvisioning_Ipv4DnsLost() { - runLoseProvisioningTest(TEST_LINK_PROPERTIES, TEST_IPV4_DNS) + runLoseProvisioningTest(TEST_IPV4_DNS) } @Test fun testLoseProvisioning_Ipv6DnsLost() { - runLoseProvisioningTest(TEST_LINK_PROPERTIES, TEST_IPV6_DNS) + runLoseProvisioningTest(TEST_IPV6_DNS) } @Test fun testLoseProvisioning_Ipv4GatewayLost() { - runLoseProvisioningTest(TEST_LINK_PROPERTIES, TEST_IPV4_GATEWAY) + runLoseProvisioningTest(TEST_IPV4_GATEWAY) } @Test fun testLoseProvisioning_Ipv6GatewayLost() { - runLoseProvisioningTest(TEST_LINK_PROPERTIES, TEST_IPV6_GATEWAY) + runLoseProvisioningTest(TEST_IPV6_GATEWAY) } - - private fun runNudProbeFailureMetricsTest( - lp: LinkProperties, - lostNeighbor: InetAddress, - eventType: NudEventType, - ipType: IpType, - lostNeighborType: NudNeighborType - ) { - runLoseProvisioningTest(lp, lostNeighbor) - verifyNudFailureMetrics(eventType, ipType, lostNeighborType) - } - - @Test - fun testNudProbeFailedMetrics_Ipv6GatewayLostPostRoaming() { - reachabilityMonitor.probeAll(true /* dueToRoam */) - runNudProbeFailureMetricsTest(TEST_LINK_PROPERTIES, TEST_IPV6_GATEWAY, - NUD_POST_ROAMING_FAILED_CRITICAL, IPV6, NUD_NEIGHBOR_GATEWAY) - } - - @Test - fun testNudProbeFailedMetrics_Ipv4GatewayLostPostRoaming() { - reachabilityMonitor.probeAll(true /* dueToRoam */) - runNudProbeFailureMetricsTest(TEST_LINK_PROPERTIES, TEST_IPV4_GATEWAY, - NUD_POST_ROAMING_FAILED_CRITICAL, IPV4, NUD_NEIGHBOR_GATEWAY) - } - - @Test - fun testNudProbeFailedMetrics_Ipv6DnsLostPostRoaming() { - reachabilityMonitor.probeAll(true /* dueToRoam */) - runNudProbeFailureMetricsTest(TEST_LINK_PROPERTIES, TEST_IPV6_DNS, - NUD_POST_ROAMING_FAILED_CRITICAL, IPV6, NUD_NEIGHBOR_DNS) - } - - @Test - fun testNudProbeFailedMetrics_Ipv4DnsLostPostRoaming() { - reachabilityMonitor.probeAll(true /* dueToRoam */) - runNudProbeFailureMetricsTest(TEST_LINK_PROPERTIES, TEST_IPV4_DNS, - NUD_POST_ROAMING_FAILED_CRITICAL, IPV4, NUD_NEIGHBOR_DNS) - } - - @Test - fun testNudProbeFailedMetrics_IPv4BothGatewayAndDnsLostPostRoaming() { - reachabilityMonitor.probeAll(true /* dueToRoam */) - runNudProbeFailureMetricsTest(TEST_IPV4_ONLY_LINK_PROPERTIES, TEST_IPV4_GATEWAY_DNS, - NUD_POST_ROAMING_FAILED_CRITICAL, IPV4, NUD_NEIGHBOR_BOTH) - } - - @Test - fun testNudProbeFailedMetrics_IPv6LinklocalScopedGatewayLostPostRoaming() { - reachabilityMonitor.probeAll(true /* dueToRoam */) - runNudProbeFailureMetricsTest(TEST_IPV6_LINKLOCAL_SCOPED_LINK_PROPERTIES, - TEST_IPV6_LINKLOCAL_SCOPED_GATEWAY, NUD_POST_ROAMING_FAILED_CRITICAL, IPV6, - NUD_NEIGHBOR_GATEWAY) - } - - @Test - fun testNudProbeFailedMetrics_Ipv6GatewayLostAfterConfirm() { - reachabilityMonitor.probeAll(false /* dueToRoam */) - runNudProbeFailureMetricsTest(TEST_LINK_PROPERTIES, TEST_IPV6_GATEWAY, - NUD_CONFIRM_FAILED_CRITICAL, IPV6, NUD_NEIGHBOR_GATEWAY) - } - - @Test - fun testNudProbeFailedMetrics_Ipv4GatewayLostAfterConfirm() { - reachabilityMonitor.probeAll(false /* dueToRoam */) - runNudProbeFailureMetricsTest(TEST_LINK_PROPERTIES, TEST_IPV4_GATEWAY, - NUD_CONFIRM_FAILED_CRITICAL, IPV4, NUD_NEIGHBOR_GATEWAY) - } - - @Test - fun testNudProbeFailedMetrics_Ipv6DnsLostAfterConfirm() { - reachabilityMonitor.probeAll(false /* dueToRoam */) - runNudProbeFailureMetricsTest(TEST_LINK_PROPERTIES, TEST_IPV6_DNS, - NUD_CONFIRM_FAILED_CRITICAL, IPV6, NUD_NEIGHBOR_DNS) - } - - @Test - fun testNudProbeFailedMetrics_Ipv4DnsLostAfterConfirm() { - reachabilityMonitor.probeAll(false /* dueToRoam */) - runNudProbeFailureMetricsTest(TEST_LINK_PROPERTIES, TEST_IPV4_DNS, - NUD_CONFIRM_FAILED_CRITICAL, IPV4, NUD_NEIGHBOR_DNS) - } - - @Test - fun testNudProbeFailedMetrics_IPv4BothGatewayAndDnsLostAfterConfirm() { - reachabilityMonitor.probeAll(false /* dueToRoam */) - runNudProbeFailureMetricsTest(TEST_IPV4_ONLY_LINK_PROPERTIES, TEST_IPV4_GATEWAY_DNS, - NUD_CONFIRM_FAILED_CRITICAL, IPV4, NUD_NEIGHBOR_BOTH) - } - - @Test - fun testNudProbeFailedMetrics_IPv6LinklocalScopedGatewayLostAfterConfirm() { - reachabilityMonitor.probeAll(false /* dueToRoam */) - runNudProbeFailureMetricsTest(TEST_IPV6_LINKLOCAL_SCOPED_LINK_PROPERTIES, - TEST_IPV6_LINKLOCAL_SCOPED_GATEWAY, NUD_CONFIRM_FAILED_CRITICAL, IPV6, - NUD_NEIGHBOR_GATEWAY) - } - - @Test - fun testNudProbeFailedMetrics_IPv6GatewayLostOrganic() { - runNudProbeFailureMetricsTest(TEST_LINK_PROPERTIES, TEST_IPV6_GATEWAY, - NUD_ORGANIC_FAILED_CRITICAL, IPV6, NUD_NEIGHBOR_GATEWAY) - } - - @Test - fun testNudProbeFailedMetrics_IPv4GatewayLostOrganic() { - runNudProbeFailureMetricsTest(TEST_LINK_PROPERTIES, TEST_IPV4_GATEWAY, - NUD_ORGANIC_FAILED_CRITICAL, IPV4, NUD_NEIGHBOR_GATEWAY) - } - - @Test - fun testNudProbeFailedMetrics_IPv6DnsLostOrganic() { - runNudProbeFailureMetricsTest(TEST_LINK_PROPERTIES, TEST_IPV6_DNS, - NUD_ORGANIC_FAILED_CRITICAL, IPV6, NUD_NEIGHBOR_DNS) - } - - @Test - fun testNudProbeFailedMetrics_IPv4DnsLostOrganic() { - runNudProbeFailureMetricsTest(TEST_LINK_PROPERTIES, TEST_IPV4_DNS, - NUD_ORGANIC_FAILED_CRITICAL, IPV4, NUD_NEIGHBOR_DNS) - } - - @Test - fun testNudProbeFailedMetrics_IPv4BothGatewayAndDnsLostOrganic() { - runNudProbeFailureMetricsTest(TEST_IPV4_ONLY_LINK_PROPERTIES, TEST_IPV4_GATEWAY_DNS, - NUD_ORGANIC_FAILED_CRITICAL, IPV4, NUD_NEIGHBOR_BOTH) - } - - @Test - fun testNudProbeFailedMetrics_IPv6LinklocalScopedGatewayLostOrganic() { - runNudProbeFailureMetricsTest(TEST_IPV6_LINKLOCAL_SCOPED_LINK_PROPERTIES, - TEST_IPV6_LINKLOCAL_SCOPED_GATEWAY, NUD_ORGANIC_FAILED_CRITICAL, IPV6, - NUD_NEIGHBOR_GATEWAY) - } - - @Test - fun testNudProbeFailedMetrics_IPv6OneDnsNeighborLostPostRoaming() { - reachabilityMonitor.probeAll(true /* dueToRoam */) - runLoseNeighborStillProvisionedTest(TEST_DUAL_LINK_PROPERTIES, TEST_IPV6_DNS, - NUD_POST_ROAMING_FAILED, IPV6, NUD_NEIGHBOR_DNS) - } - - @Test - fun testNudProbeFailedMetrics_IPv6OneDnsNeighborLostAfterConfirm() { - reachabilityMonitor.probeAll(false /* dueToRoam */) - runLoseNeighborStillProvisionedTest(TEST_DUAL_LINK_PROPERTIES, TEST_IPV6_DNS, - NUD_CONFIRM_FAILED, IPV6, NUD_NEIGHBOR_DNS) - } - - @Test - fun testNudProbeFailedMetrics_IPv6OneDnsNeighborLostOrganic() { - runLoseNeighborStillProvisionedTest(TEST_DUAL_LINK_PROPERTIES, TEST_IPV6_DNS, - NUD_ORGANIC_FAILED, IPV6, NUD_NEIGHBOR_DNS) - } - - @Test - fun testNudProbeFailedMetrics_multipleProbesFromRoamFirst() { - reachabilityMonitor.probeAll(true /* dueToRoam */) - handlerThread.waitForIdle(TEST_TIMEOUT_MS) - Thread.sleep(2) - reachabilityMonitor.probeAll(false /* dueToRoam */) - runLoseProvisioningTest(TEST_LINK_PROPERTIES, TEST_IPV6_GATEWAY) - - verifyNudFailureMetrics(NUD_POST_ROAMING_FAILED_CRITICAL, IPV6, NUD_NEIGHBOR_GATEWAY) - } - - @Test - fun testNudProbeFailedMetrics_multipleProbesFromConfirmFirst() { - reachabilityMonitor.probeAll(false /* dueToRoam */) - handlerThread.waitForIdle(TEST_TIMEOUT_MS) - Thread.sleep(2) - reachabilityMonitor.probeAll(true /* dueToRoam */) - runLoseProvisioningTest(TEST_LINK_PROPERTIES, TEST_IPV6_GATEWAY) - - verifyNudFailureMetrics(NUD_CONFIRM_FAILED_CRITICAL, IPV6, NUD_NEIGHBOR_GATEWAY) - } - - @Test - fun testNudProbeFailedMetrics_defaultIPv6GatewayMacAddrChanged() { - runNeighborReachableButMacAddrChangedTest(TEST_LINK_PROPERTIES, TEST_IPV6_GATEWAY, IPV6) - } - - @Test - fun testNudProbeFailedMetrics_defaultIPv4GatewayMacAddrChanged() { - runNeighborReachableButMacAddrChangedTest(TEST_LINK_PROPERTIES, TEST_IPV4_GATEWAY, IPV4) - } -} +} \ No newline at end of file
diff --git a/tests/unit/src/android/net/netlink/ConntrackMessageTest.java b/tests/unit/src/android/net/netlink/ConntrackMessageTest.java new file mode 100644 index 0000000..2e8d184 --- /dev/null +++ b/tests/unit/src/android/net/netlink/ConntrackMessageTest.java
@@ -0,0 +1,433 @@ +/* + * Copyright (C) 2017 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.netlink; + +import static android.net.netlink.NetlinkConstants.IPCTNL_MSG_CT_NEW; +import static android.net.netlink.NetlinkConstants.NFNL_SUBSYS_CTNETLINK; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assume.assumeTrue; + +import android.system.OsConstants; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + +import libcore.util.HexEncoding; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.net.Inet4Address; +import java.net.InetAddress; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.Arrays; + +@RunWith(AndroidJUnit4.class) +@SmallTest +public class ConntrackMessageTest { + private static final boolean USING_LE = (ByteOrder.nativeOrder() == ByteOrder.LITTLE_ENDIAN); + + private short makeCtType(short msgType) { + return (short) (NFNL_SUBSYS_CTNETLINK << 8 | (byte) msgType); + } + + // Example 1: TCP (192.168.43.209, 44333) -> (23.211.13.26, 443) + public static final String CT_V4UPDATE_TCP_HEX = + // struct nlmsghdr + "50000000" + // length = 80 + "0001" + // type = (1 << 8) | 0 + "0501" + // flags + "01000000" + // seqno = 1 + "00000000" + // pid = 0 + // struct nfgenmsg + "02" + // nfgen_family = AF_INET + "00" + // version = NFNETLINK_V0 + "0000" + // res_id + // struct nlattr + "3400" + // nla_len = 52 + "0180" + // nla_type = nested CTA_TUPLE_ORIG + // struct nlattr + "1400" + // nla_len = 20 + "0180" + // nla_type = nested CTA_TUPLE_IP + "0800 0100 C0A82BD1" + // nla_type=CTA_IP_V4_SRC, ip=192.168.43.209 + "0800 0200 17D30D1A" + // nla_type=CTA_IP_V4_DST, ip=23.211.13.26 + // struct nlattr + "1C00" + // nla_len = 28 + "0280" + // nla_type = nested CTA_TUPLE_PROTO + "0500 0100 06 000000" + // nla_type=CTA_PROTO_NUM, proto=6 + "0600 0200 AD2D 0000" + // nla_type=CTA_PROTO_SRC_PORT, port=44333 (big endian) + "0600 0300 01BB 0000" + // nla_type=CTA_PROTO_DST_PORT, port=443 (big endian) + // struct nlattr + "0800" + // nla_len = 8 + "0700" + // nla_type = CTA_TIMEOUT + "00069780"; // nla_value = 432000 (big endian) + public static final byte[] CT_V4UPDATE_TCP_BYTES = + HexEncoding.decode(CT_V4UPDATE_TCP_HEX.replaceAll(" ", "").toCharArray(), false); + + private byte[] makeIPv4TimeoutUpdateRequestTcp() throws Exception { + return ConntrackMessage.newIPv4TimeoutUpdateRequest( + OsConstants.IPPROTO_TCP, + (Inet4Address) InetAddress.getByName("192.168.43.209"), 44333, + (Inet4Address) InetAddress.getByName("23.211.13.26"), 443, + 432000); + } + + // Example 2: UDP (100.96.167.146, 37069) -> (216.58.197.10, 443) + public static final String CT_V4UPDATE_UDP_HEX = + // struct nlmsghdr + "50000000" + // length = 80 + "0001" + // type = (1 << 8) | 0 + "0501" + // flags + "01000000" + // seqno = 1 + "00000000" + // pid = 0 + // struct nfgenmsg + "02" + // nfgen_family = AF_INET + "00" + // version = NFNETLINK_V0 + "0000" + // res_id + // struct nlattr + "3400" + // nla_len = 52 + "0180" + // nla_type = nested CTA_TUPLE_ORIG + // struct nlattr + "1400" + // nla_len = 20 + "0180" + // nla_type = nested CTA_TUPLE_IP + "0800 0100 6460A792" + // nla_type=CTA_IP_V4_SRC, ip=100.96.167.146 + "0800 0200 D83AC50A" + // nla_type=CTA_IP_V4_DST, ip=216.58.197.10 + // struct nlattr + "1C00" + // nla_len = 28 + "0280" + // nla_type = nested CTA_TUPLE_PROTO + "0500 0100 11 000000" + // nla_type=CTA_PROTO_NUM, proto=17 + "0600 0200 90CD 0000" + // nla_type=CTA_PROTO_SRC_PORT, port=37069 (big endian) + "0600 0300 01BB 0000" + // nla_type=CTA_PROTO_DST_PORT, port=443 (big endian) + // struct nlattr + "0800" + // nla_len = 8 + "0700" + // nla_type = CTA_TIMEOUT + "000000B4"; // nla_value = 180 (big endian) + public static final byte[] CT_V4UPDATE_UDP_BYTES = + HexEncoding.decode(CT_V4UPDATE_UDP_HEX.replaceAll(" ", "").toCharArray(), false); + + private byte[] makeIPv4TimeoutUpdateRequestUdp() throws Exception { + return ConntrackMessage.newIPv4TimeoutUpdateRequest( + OsConstants.IPPROTO_UDP, + (Inet4Address) InetAddress.getByName("100.96.167.146"), 37069, + (Inet4Address) InetAddress.getByName("216.58.197.10"), 443, + 180); + } + + @Test + public void testConntrackMakeIPv4TcpTimeoutUpdate() throws Exception { + assumeTrue(USING_LE); + + final byte[] tcp = makeIPv4TimeoutUpdateRequestTcp(); + assertArrayEquals(CT_V4UPDATE_TCP_BYTES, tcp); + } + + @Test + public void testConntrackParseIPv4TcpTimeoutUpdate() throws Exception { + assumeTrue(USING_LE); + + final byte[] tcp = makeIPv4TimeoutUpdateRequestTcp(); + final ByteBuffer byteBuffer = ByteBuffer.wrap(tcp); + byteBuffer.order(ByteOrder.nativeOrder()); + final NetlinkMessage msg = NetlinkMessage.parse(byteBuffer, OsConstants.NETLINK_NETFILTER); + assertNotNull(msg); + assertTrue(msg instanceof ConntrackMessage); + final ConntrackMessage conntrackMessage = (ConntrackMessage) msg; + + final StructNlMsgHdr hdr = conntrackMessage.getHeader(); + assertNotNull(hdr); + assertEquals(80, hdr.nlmsg_len); + assertEquals(makeCtType(IPCTNL_MSG_CT_NEW), hdr.nlmsg_type); + assertEquals((short) (StructNlMsgHdr.NLM_F_REPLACE | StructNlMsgHdr.NLM_F_REQUEST + | StructNlMsgHdr.NLM_F_ACK), hdr.nlmsg_flags); + assertEquals(1, hdr.nlmsg_seq); + assertEquals(0, hdr.nlmsg_pid); + + final StructNfGenMsg nfmsgHdr = conntrackMessage.nfGenMsg; + assertNotNull(nfmsgHdr); + assertEquals((byte) OsConstants.AF_INET, nfmsgHdr.nfgen_family); + assertEquals((byte) StructNfGenMsg.NFNETLINK_V0, nfmsgHdr.version); + assertEquals((short) 0, nfmsgHdr.res_id); + + assertEquals(InetAddress.parseNumericAddress("192.168.43.209"), + conntrackMessage.tupleOrig.srcIp); + assertEquals(InetAddress.parseNumericAddress("23.211.13.26"), + conntrackMessage.tupleOrig.dstIp); + assertEquals((byte) OsConstants.IPPROTO_TCP, conntrackMessage.tupleOrig.protoNum); + assertEquals((short) 44333, conntrackMessage.tupleOrig.srcPort); + assertEquals((short) 443, conntrackMessage.tupleOrig.dstPort); + + assertNull(conntrackMessage.tupleReply); + + assertEquals(0 /* absent */, conntrackMessage.status); + assertEquals(432000, conntrackMessage.timeoutSec); + } + + @Test + public void testConntrackMakeIPv4UdpTimeoutUpdate() throws Exception { + assumeTrue(USING_LE); + + final byte[] udp = makeIPv4TimeoutUpdateRequestUdp(); + assertArrayEquals(CT_V4UPDATE_UDP_BYTES, udp); + } + + @Test + public void testConntrackParseIPv4UdpTimeoutUpdate() throws Exception { + assumeTrue(USING_LE); + + final byte[] udp = makeIPv4TimeoutUpdateRequestUdp(); + final ByteBuffer byteBuffer = ByteBuffer.wrap(udp); + byteBuffer.order(ByteOrder.nativeOrder()); + final NetlinkMessage msg = NetlinkMessage.parse(byteBuffer, OsConstants.NETLINK_NETFILTER); + assertNotNull(msg); + assertTrue(msg instanceof ConntrackMessage); + final ConntrackMessage conntrackMessage = (ConntrackMessage) msg; + + final StructNlMsgHdr hdr = conntrackMessage.getHeader(); + assertNotNull(hdr); + assertEquals(80, hdr.nlmsg_len); + assertEquals(makeCtType(IPCTNL_MSG_CT_NEW), hdr.nlmsg_type); + assertEquals((short) (StructNlMsgHdr.NLM_F_REPLACE | StructNlMsgHdr.NLM_F_REQUEST + | StructNlMsgHdr.NLM_F_ACK), hdr.nlmsg_flags); + assertEquals(1, hdr.nlmsg_seq); + assertEquals(0, hdr.nlmsg_pid); + + final StructNfGenMsg nfmsgHdr = conntrackMessage.nfGenMsg; + assertNotNull(nfmsgHdr); + assertEquals((byte) OsConstants.AF_INET, nfmsgHdr.nfgen_family); + assertEquals((byte) StructNfGenMsg.NFNETLINK_V0, nfmsgHdr.version); + assertEquals((short) 0, nfmsgHdr.res_id); + + assertEquals(InetAddress.parseNumericAddress("100.96.167.146"), + conntrackMessage.tupleOrig.srcIp); + assertEquals(InetAddress.parseNumericAddress("216.58.197.10"), + conntrackMessage.tupleOrig.dstIp); + assertEquals((byte) OsConstants.IPPROTO_UDP, conntrackMessage.tupleOrig.protoNum); + assertEquals((short) 37069, conntrackMessage.tupleOrig.srcPort); + assertEquals((short) 443, conntrackMessage.tupleOrig.dstPort); + + assertNull(conntrackMessage.tupleReply); + + assertEquals(0 /* absent */, conntrackMessage.status); + assertEquals(180, conntrackMessage.timeoutSec); + } + + public static final String CT_V4NEW_TCP_HEX = + // CHECKSTYLE:OFF IndentationCheck + // struct nlmsghdr + "8C000000" + // length = 140 + "0001" + // type = NFNL_SUBSYS_CTNETLINK (1) << 8 | IPCTNL_MSG_CT_NEW (0) + "0006" + // flags = NLM_F_CREATE (1 << 10) | NLM_F_EXCL (1 << 9) + "00000000" + // seqno = 0 + "00000000" + // pid = 0 + // struct nfgenmsg + "02" + // nfgen_family = AF_INET + "00" + // version = NFNETLINK_V0 + "1234" + // res_id = 0x1234 (big endian) + // struct nlattr + "3400" + // nla_len = 52 + "0180" + // nla_type = nested CTA_TUPLE_ORIG + // struct nlattr + "1400" + // nla_len = 20 + "0180" + // nla_type = nested CTA_TUPLE_IP + "0800 0100 C0A8500C" + // nla_type=CTA_IP_V4_SRC, ip=192.168.80.12 + "0800 0200 8C700874" + // nla_type=CTA_IP_V4_DST, ip=140.112.8.116 + // struct nlattr + "1C00" + // nla_len = 28 + "0280" + // nla_type = nested CTA_TUPLE_PROTO + "0500 0100 06 000000" + // nla_type=CTA_PROTO_NUM, proto=IPPROTO_TCP (6) + "0600 0200 F3F1 0000" + // nla_type=CTA_PROTO_SRC_PORT, port=62449 (big endian) + "0600 0300 01BB 0000" + // nla_type=CTA_PROTO_DST_PORT, port=443 (big endian) + // struct nlattr + "3400" + // nla_len = 52 + "0280" + // nla_type = nested CTA_TUPLE_REPLY + // struct nlattr + "1400" + // nla_len = 20 + "0180" + // nla_type = nested CTA_TUPLE_IP + "0800 0100 8C700874" + // nla_type=CTA_IP_V4_SRC, ip=140.112.8.116 + "0800 0200 6451B301" + // nla_type=CTA_IP_V4_DST, ip=100.81.179.1 + // struct nlattr + "1C00" + // nla_len = 28 + "0280" + // nla_type = nested CTA_TUPLE_PROTO + "0500 0100 06 000000" + // nla_type=CTA_PROTO_NUM, proto=IPPROTO_TCP (6) + "0600 0200 01BB 0000" + // nla_type=CTA_PROTO_SRC_PORT, port=443 (big endian) + "0600 0300 F3F1 0000" + // nla_type=CTA_PROTO_DST_PORT, port=62449 (big endian) + // struct nlattr + "0800" + // nla_len = 8 + "0300" + // nla_type = CTA_STATUS + "00000198" + // nla_value = 0b110011000 (big endian) + // IPS_CONFIRMED (1 << 3) | IPS_SRC_NAT (1 << 4) | + // IPS_SRC_NAT_DONE (1 << 7) | IPS_DST_NAT_DONE (1 << 8) + // struct nlattr + "0800" + // nla_len = 8 + "0700" + // nla_type = CTA_TIMEOUT + "00000078"; // nla_value = 120 (big endian) + // CHECKSTYLE:ON IndentationCheck + public static final byte[] CT_V4NEW_TCP_BYTES = + HexEncoding.decode(CT_V4NEW_TCP_HEX.replaceAll(" ", "").toCharArray(), false); + + @Test + public void testParseCtNew() { + assumeTrue(USING_LE); + + final ByteBuffer byteBuffer = ByteBuffer.wrap(CT_V4NEW_TCP_BYTES); + byteBuffer.order(ByteOrder.nativeOrder()); + final NetlinkMessage msg = NetlinkMessage.parse(byteBuffer, OsConstants.NETLINK_NETFILTER); + assertNotNull(msg); + assertTrue(msg instanceof ConntrackMessage); + final ConntrackMessage conntrackMessage = (ConntrackMessage) msg; + + final StructNlMsgHdr hdr = conntrackMessage.getHeader(); + assertNotNull(hdr); + assertEquals(140, hdr.nlmsg_len); + assertEquals(makeCtType(IPCTNL_MSG_CT_NEW), hdr.nlmsg_type); + assertEquals((short) (StructNlMsgHdr.NLM_F_CREATE | StructNlMsgHdr.NLM_F_EXCL), + hdr.nlmsg_flags); + assertEquals(0, hdr.nlmsg_seq); + assertEquals(0, hdr.nlmsg_pid); + + final StructNfGenMsg nfmsgHdr = conntrackMessage.nfGenMsg; + assertNotNull(nfmsgHdr); + assertEquals((byte) OsConstants.AF_INET, nfmsgHdr.nfgen_family); + assertEquals((byte) StructNfGenMsg.NFNETLINK_V0, nfmsgHdr.version); + assertEquals((short) 0x1234, nfmsgHdr.res_id); + + assertEquals(InetAddress.parseNumericAddress("192.168.80.12"), + conntrackMessage.tupleOrig.srcIp); + assertEquals(InetAddress.parseNumericAddress("140.112.8.116"), + conntrackMessage.tupleOrig.dstIp); + assertEquals((byte) OsConstants.IPPROTO_TCP, conntrackMessage.tupleOrig.protoNum); + assertEquals((short) 62449, conntrackMessage.tupleOrig.srcPort); + assertEquals((short) 443, conntrackMessage.tupleOrig.dstPort); + + assertEquals(InetAddress.parseNumericAddress("140.112.8.116"), + conntrackMessage.tupleReply.srcIp); + assertEquals(InetAddress.parseNumericAddress("100.81.179.1"), + conntrackMessage.tupleReply.dstIp); + assertEquals((byte) OsConstants.IPPROTO_TCP, conntrackMessage.tupleReply.protoNum); + assertEquals((short) 443, conntrackMessage.tupleReply.srcPort); + assertEquals((short) 62449, conntrackMessage.tupleReply.dstPort); + + assertEquals(0x198, conntrackMessage.status); + assertEquals(120, conntrackMessage.timeoutSec); + } + + @Test + public void testParseTruncation() { + assumeTrue(USING_LE); + + // Expect no crash while parsing the truncated message which has been truncated to every + // length between 0 and its full length - 1. + for (int len = 0; len < CT_V4NEW_TCP_BYTES.length; len++) { + final byte[] truncated = Arrays.copyOfRange(CT_V4NEW_TCP_BYTES, 0, len); + + final ByteBuffer byteBuffer = ByteBuffer.wrap(truncated); + byteBuffer.order(ByteOrder.nativeOrder()); + final NetlinkMessage msg = NetlinkMessage.parse(byteBuffer, + OsConstants.NETLINK_NETFILTER); + } + } + + @Test + public void testParseTruncationWithInvalidByte() { + assumeTrue(USING_LE); + + // Expect no crash while parsing the message which is truncated by invalid bytes. The + // message has been truncated to every length between 0 and its full length - 1. + for (byte invalid : new byte[]{(byte) 0x00, (byte) 0xff}) { + for (int len = 0; len < CT_V4NEW_TCP_BYTES.length; len++) { + final byte[] truncated = new byte[CT_V4NEW_TCP_BYTES.length]; + Arrays.fill(truncated, (byte) invalid); + System.arraycopy(CT_V4NEW_TCP_BYTES, 0, truncated, 0, len); + + final ByteBuffer byteBuffer = ByteBuffer.wrap(truncated); + byteBuffer.order(ByteOrder.nativeOrder()); + final NetlinkMessage msg = NetlinkMessage.parse(byteBuffer, + OsConstants.NETLINK_NETFILTER); + } + } + } + + // Malformed conntrack messages. + public static final String CT_MALFORMED_HEX = + // CHECKSTYLE:OFF IndentationCheck + // <-- nlmsghr -->|<-nfgenmsg->|<-- CTA_TUPLE_ORIG -->| + // CTA_TUPLE_ORIG has no nla_value. + "18000000 0001 0006 00000000 00000000 02 00 0000 0400 0180" + // nested CTA_TUPLE_IP has no nla_value. + + "1C000000 0001 0006 00000000 00000000 02 00 0000 0800 0180 0400 0180" + // nested CTA_IP_V4_SRC has no nla_value. + + "20000000 0001 0006 00000000 00000000 02 00 0000 0C00 0180 0800 0180 0400 0100" + // nested CTA_TUPLE_PROTO has no nla_value. + // <-- nlmsghr -->|<-nfgenmsg->|<-- CTA_TUPLE_ORIG + + "30000000 0001 0006 00000000 00000000 02 00 0000 1C00 0180 1400 0180 0800 0100" + // -->| + + "C0A8500C 0800 0200 8C700874 0400 0280"; + // CHECKSTYLE:ON IndentationCheck + public static final byte[] CT_MALFORMED_BYTES = + HexEncoding.decode(CT_MALFORMED_HEX.replaceAll(" ", "").toCharArray(), false); + + @Test + public void testParseMalformation() { + assumeTrue(USING_LE); + + final ByteBuffer byteBuffer = ByteBuffer.wrap(CT_MALFORMED_BYTES); + byteBuffer.order(ByteOrder.nativeOrder()); + + // Expect no crash while parsing the malformed message. + int messageCount = 0; + while (byteBuffer.remaining() > 0) { + final NetlinkMessage msg = NetlinkMessage.parse(byteBuffer, + OsConstants.NETLINK_NETFILTER); + messageCount++; + } + assertEquals(4, messageCount); + } + + @Test + public void testToString() { + assumeTrue(USING_LE); + + final ByteBuffer byteBuffer = ByteBuffer.wrap(CT_V4NEW_TCP_BYTES); + byteBuffer.order(ByteOrder.nativeOrder()); + final NetlinkMessage msg = NetlinkMessage.parse(byteBuffer, OsConstants.NETLINK_NETFILTER); + assertNotNull(msg); + assertTrue(msg instanceof ConntrackMessage); + final ConntrackMessage conntrackMessage = (ConntrackMessage) msg; + + // Bug: "nlmsg_flags{1536(NLM_F_MATCH))" is not correct because StructNlMsgHdr + // #stringForNlMsgFlags can't convert all flags (ex: NLM_F_CREATE) and can't distinguish + // the flags which have the same value (ex: NLM_F_MATCH <0x200> and NLM_F_EXCL <0x200>). + // The flags output string should be "NLM_F_CREATE|NLM_F_EXCL" in this case. + // TODO: correct the flag converted string once #stringForNlMsgFlags does. + final String expected = "" + + "ConntrackMessage{" + + "nlmsghdr{StructNlMsgHdr{ nlmsg_len{140}, nlmsg_type{256(IPCTNL_MSG_CT_NEW)}, " + + "nlmsg_flags{1536(NLM_F_MATCH))}, nlmsg_seq{0}, nlmsg_pid{0} }}, " + + "nfgenmsg{NfGenMsg{ nfgen_family{AF_INET}, version{0}, res_id{4660} }}, " + + "tuple_orig{Tuple{IPPROTO_TCP: 192.168.80.12:62449 -> 140.112.8.116:443}}, " + + "tuple_reply{Tuple{IPPROTO_TCP: 140.112.8.116:443 -> 100.81.179.1:62449}}, " + + "status{408(IPS_CONFIRMED|IPS_SRC_NAT|IPS_SRC_NAT_DONE|IPS_DST_NAT_DONE)}, " + + "timeout_sec{120}}"; + assertEquals(expected, conntrackMessage.toString()); + } +}
diff --git a/tests/unit/src/android/net/netlink/InetDiagSocketTest.java b/tests/unit/src/android/net/netlink/InetDiagSocketTest.java new file mode 100644 index 0000000..fcc85a2 --- /dev/null +++ b/tests/unit/src/android/net/netlink/InetDiagSocketTest.java
@@ -0,0 +1,267 @@ +/* + * 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 android.net.netlink; + +import static android.net.netlink.StructNlMsgHdr.NLM_F_DUMP; +import static android.net.netlink.StructNlMsgHdr.NLM_F_REQUEST; +import static android.system.OsConstants.AF_INET; +import static android.system.OsConstants.AF_INET6; +import static android.system.OsConstants.IPPROTO_TCP; +import static android.system.OsConstants.IPPROTO_UDP; +import static android.system.OsConstants.NETLINK_INET_DIAG; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + +import libcore.util.HexEncoding; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +@RunWith(AndroidJUnit4.class) +@SmallTest +public class InetDiagSocketTest { + // Hexadecimal representation of InetDiagReqV2 request. + private static final String INET_DIAG_REQ_V2_UDP_INET4_HEX = + // struct nlmsghdr + "48000000" + // length = 72 + "1400" + // type = SOCK_DIAG_BY_FAMILY + "0103" + // flags = NLM_F_REQUEST | NLM_F_DUMP + "00000000" + // seqno + "00000000" + // pid (0 == kernel) + // struct inet_diag_req_v2 + "02" + // family = AF_INET + "11" + // protcol = IPPROTO_UDP + "00" + // idiag_ext + "00" + // pad + "ffffffff" + // idiag_states + // inet_diag_sockid + "a5de" + // idiag_sport = 42462 + "b971" + // idiag_dport = 47473 + "0a006402000000000000000000000000" + // idiag_src = 10.0.100.2 + "08080808000000000000000000000000" + // idiag_dst = 8.8.8.8 + "00000000" + // idiag_if + "ffffffffffffffff"; // idiag_cookie = INET_DIAG_NOCOOKIE + private static final byte[] INET_DIAG_REQ_V2_UDP_INET4_BYTES = + HexEncoding.decode(INET_DIAG_REQ_V2_UDP_INET4_HEX.toCharArray(), false); + + @Test + public void testInetDiagReqV2UdpInet4() throws Exception { + InetSocketAddress local = new InetSocketAddress(InetAddress.getByName("10.0.100.2"), + 42462); + InetSocketAddress remote = new InetSocketAddress(InetAddress.getByName("8.8.8.8"), + 47473); + final byte[] msg = InetDiagMessage.InetDiagReqV2(IPPROTO_UDP, local, remote, AF_INET, + (short) (NLM_F_REQUEST | NLM_F_DUMP)); + assertArrayEquals(INET_DIAG_REQ_V2_UDP_INET4_BYTES, msg); + } + + // Hexadecimal representation of InetDiagReqV2 request. + private static final String INET_DIAG_REQ_V2_TCP_INET6_HEX = + // struct nlmsghdr + "48000000" + // length = 72 + "1400" + // type = SOCK_DIAG_BY_FAMILY + "0100" + // flags = NLM_F_REQUEST + "00000000" + // seqno + "00000000" + // pid (0 == kernel) + // struct inet_diag_req_v2 + "0a" + // family = AF_INET6 + "06" + // protcol = IPPROTO_TCP + "00" + // idiag_ext + "00" + // pad + "ffffffff" + // idiag_states + // inet_diag_sockid + "a5de" + // idiag_sport = 42462 + "b971" + // idiag_dport = 47473 + "fe8000000000000086c9b2fffe6aed4b" + // idiag_src = fe80::86c9:b2ff:fe6a:ed4b + "08080808000000000000000000000000" + // idiag_dst = 8.8.8.8 + "00000000" + // idiag_if + "ffffffffffffffff"; // idiag_cookie = INET_DIAG_NOCOOKIE + private static final byte[] INET_DIAG_REQ_V2_TCP_INET6_BYTES = + HexEncoding.decode(INET_DIAG_REQ_V2_TCP_INET6_HEX.toCharArray(), false); + + @Test + public void testInetDiagReqV2TcpInet6() throws Exception { + InetSocketAddress local = new InetSocketAddress( + InetAddress.getByName("fe80::86c9:b2ff:fe6a:ed4b"), 42462); + InetSocketAddress remote = new InetSocketAddress(InetAddress.getByName("8.8.8.8"), + 47473); + byte[] msg = InetDiagMessage.InetDiagReqV2(IPPROTO_TCP, local, remote, AF_INET6, + NLM_F_REQUEST); + + assertArrayEquals(INET_DIAG_REQ_V2_TCP_INET6_BYTES, msg); + } + + // Hexadecimal representation of InetDiagReqV2 request with extension, INET_DIAG_INFO. + private static final String INET_DIAG_REQ_V2_TCP_INET_INET_DIAG_HEX = + // struct nlmsghdr + "48000000" + // length = 72 + "1400" + // type = SOCK_DIAG_BY_FAMILY + "0100" + // flags = NLM_F_REQUEST + "00000000" + // seqno + "00000000" + // pid (0 == kernel) + // struct inet_diag_req_v2 + "02" + // family = AF_INET + "06" + // protcol = IPPROTO_TCP + "02" + // idiag_ext = INET_DIAG_INFO + "00" + // pad + "ffffffff" + // idiag_states + // inet_diag_sockid + "3039" + // idiag_sport = 12345 + "d431" + // idiag_dport = 54321 + "01020304000000000000000000000000" + // idiag_src = 1.2.3.4 + "08080404000000000000000000000000" + // idiag_dst = 8.8.4.4 + "00000000" + // idiag_if + "ffffffffffffffff"; // idiag_cookie = INET_DIAG_NOCOOKIE + + private static final byte[] INET_DIAG_REQ_V2_TCP_INET_INET_DIAG_BYTES = + HexEncoding.decode(INET_DIAG_REQ_V2_TCP_INET_INET_DIAG_HEX.toCharArray(), false); + private static final int TCP_ALL_STATES = 0xffffffff; + @Test + public void testInetDiagReqV2TcpInetWithExt() throws Exception { + InetSocketAddress local = new InetSocketAddress( + InetAddress.getByName("1.2.3.4"), 12345); + InetSocketAddress remote = new InetSocketAddress(InetAddress.getByName("8.8.4.4"), + 54321); + byte[] msg = InetDiagMessage.InetDiagReqV2(IPPROTO_TCP, local, remote, AF_INET, + NLM_F_REQUEST, 0 /* pad */, 2 /* idiagExt */, TCP_ALL_STATES); + + assertArrayEquals(INET_DIAG_REQ_V2_TCP_INET_INET_DIAG_BYTES, msg); + + local = new InetSocketAddress( + InetAddress.getByName("fe80::86c9:b2ff:fe6a:ed4b"), 42462); + remote = new InetSocketAddress(InetAddress.getByName("8.8.8.8"), + 47473); + msg = InetDiagMessage.InetDiagReqV2(IPPROTO_TCP, local, remote, AF_INET6, + NLM_F_REQUEST, 0 /* pad */, 0 /* idiagExt */, TCP_ALL_STATES); + + assertArrayEquals(INET_DIAG_REQ_V2_TCP_INET6_BYTES, msg); + } + + // Hexadecimal representation of InetDiagReqV2 request with no socket specified. + private static final String INET_DIAG_REQ_V2_TCP_INET6_NO_ID_SPECIFIED_HEX = + // struct nlmsghdr + "48000000" + // length = 72 + "1400" + // type = SOCK_DIAG_BY_FAMILY + "0100" + // flags = NLM_F_REQUEST + "00000000" + // seqno + "00000000" + // pid (0 == kernel) + // struct inet_diag_req_v2 + "0a" + // family = AF_INET6 + "06" + // protcol = IPPROTO_TCP + "00" + // idiag_ext + "00" + // pad + "ffffffff" + // idiag_states + // inet_diag_sockid + "0000" + // idiag_sport + "0000" + // idiag_dport + "00000000000000000000000000000000" + // idiag_src + "00000000000000000000000000000000" + // idiag_dst + "00000000" + // idiag_if + "0000000000000000"; // idiag_cookie + + private static final byte[] INET_DIAG_REQ_V2_TCP_INET6_NO_ID_SPECIFED_BYTES = + HexEncoding.decode(INET_DIAG_REQ_V2_TCP_INET6_NO_ID_SPECIFIED_HEX.toCharArray(), false); + + @Test + public void testInetDiagReqV2TcpInet6NoIdSpecified() throws Exception { + InetSocketAddress local = new InetSocketAddress( + InetAddress.getByName("fe80::fe6a:ed4b"), 12345); + InetSocketAddress remote = new InetSocketAddress(InetAddress.getByName("8.8.4.4"), + 54321); + // Verify no socket specified if either local or remote socket address is null. + byte[] msgExt = InetDiagMessage.InetDiagReqV2(IPPROTO_TCP, null, null, AF_INET6, + NLM_F_REQUEST, 0 /* pad */, 0 /* idiagExt */, TCP_ALL_STATES); + byte[] msg; + try { + msg = InetDiagMessage.InetDiagReqV2(IPPROTO_TCP, null, remote, AF_INET6, + NLM_F_REQUEST); + fail("Both remote and local should be null, expected UnknownHostException"); + } catch (NullPointerException e) { + } + + try { + msg = InetDiagMessage.InetDiagReqV2(IPPROTO_TCP, local, null, AF_INET6, + NLM_F_REQUEST, 0 /* pad */, 0 /* idiagExt */, TCP_ALL_STATES); + fail("Both remote and local should be null, expected UnknownHostException"); + } catch (NullPointerException e) { + } + + msg = InetDiagMessage.InetDiagReqV2(IPPROTO_TCP, null, null, AF_INET6, + NLM_F_REQUEST, 0 /* pad */, 0 /* idiagExt */, TCP_ALL_STATES); + assertArrayEquals(INET_DIAG_REQ_V2_TCP_INET6_NO_ID_SPECIFED_BYTES, msg); + assertArrayEquals(INET_DIAG_REQ_V2_TCP_INET6_NO_ID_SPECIFED_BYTES, msgExt); + } + + // Hexadecimal representation of InetDiagReqV2 request. + private static final String INET_DIAG_MSG_HEX = + // struct nlmsghdr + "58000000" + // length = 88 + "1400" + // type = SOCK_DIAG_BY_FAMILY + "0200" + // flags = NLM_F_MULTI + "00000000" + // seqno + "f5220000" + // pid (0 == kernel) + // struct inet_diag_msg + "0a" + // family = AF_INET6 + "01" + // idiag_state + "00" + // idiag_timer + "00" + // idiag_retrans + // inet_diag_sockid + "a817" + // idiag_sport = 43031 + "960f" + // idiag_dport = 38415 + "fe8000000000000086c9b2fffe6aed4b" + // idiag_src = fe80::86c9:b2ff:fe6a:ed4b + "00000000000000000000ffff08080808" + // idiag_dst = 8.8.8.8 + "00000000" + // idiag_if + "ffffffffffffffff" + // idiag_cookie = INET_DIAG_NOCOOKIE + "00000000" + // idiag_expires + "00000000" + // idiag_rqueue + "00000000" + // idiag_wqueue + "a3270000" + // idiag_uid + "A57E1900"; // idiag_inode + private static final byte[] INET_DIAG_MSG_BYTES = + HexEncoding.decode(INET_DIAG_MSG_HEX.toCharArray(), false); + + @Test + public void testParseInetDiagResponse() throws Exception { + final ByteBuffer byteBuffer = ByteBuffer.wrap(INET_DIAG_MSG_BYTES); + byteBuffer.order(ByteOrder.LITTLE_ENDIAN); + final NetlinkMessage msg = NetlinkMessage.parse(byteBuffer, NETLINK_INET_DIAG); + assertNotNull(msg); + + assertTrue(msg instanceof InetDiagMessage); + final InetDiagMessage inetDiagMsg = (InetDiagMessage) msg; + assertEquals(10147, inetDiagMsg.mStructInetDiagMsg.idiag_uid); + + final StructNlMsgHdr hdr = inetDiagMsg.getHeader(); + assertNotNull(hdr); + assertEquals(NetlinkConstants.SOCK_DIAG_BY_FAMILY, hdr.nlmsg_type); + assertEquals(StructNlMsgHdr.NLM_F_MULTI, hdr.nlmsg_flags); + assertEquals(0, hdr.nlmsg_seq); + assertEquals(8949, hdr.nlmsg_pid); + } +}
diff --git a/tests/unit/src/android/net/netlink/NduseroptMessageTest.java b/tests/unit/src/android/net/netlink/NduseroptMessageTest.java new file mode 100644 index 0000000..b070d61 --- /dev/null +++ b/tests/unit/src/android/net/netlink/NduseroptMessageTest.java
@@ -0,0 +1,246 @@ +/* + * 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 android.net.netlink; + +import static android.net.InetAddresses.parseNumericAddress; +import static android.system.OsConstants.AF_INET6; +import static android.system.OsConstants.NETLINK_ROUTE; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +import android.net.IpPrefix; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + +import libcore.util.HexEncoding; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.net.InetAddress; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +@RunWith(AndroidJUnit4.class) +@SmallTest +public class NduseroptMessageTest { + + private static final byte ICMP_TYPE_RA = (byte) 134; + + private static final int IFINDEX1 = 15715755; + private static final int IFINDEX2 = 1431655765; + + // IPv6, 0 bytes of options, interface index 15715755, type 134 (RA), code 0, padding. + private static final String HDR_EMPTY = "0a00" + "0000" + "abcdef00" + "8600000000000000"; + + // IPv6, 16 bytes of options, interface index 1431655765, type 134 (RA), code 0, padding. + private static final String HDR_16BYTE = "0a00" + "1000" + "55555555" + "8600000000000000"; + + // IPv6, 32 bytes of options, interface index 1431655765, type 134 (RA), code 0, padding. + private static final String HDR_32BYTE = "0a00" + "2000" + "55555555" + "8600000000000000"; + + // PREF64 option, 2001:db8:3:4:5:6::/96, lifetime=10064 + private static final String OPT_PREF64 = "2602" + "2750" + "20010db80003000400050006"; + + // Length 20, NDUSEROPT_SRCADDR, fe80:2:3:4:5:6:7:8 + private static final String NLA_SRCADDR = "1400" + "0100" + "fe800002000300040005000600070008"; + + private static final InetAddress SADDR1 = parseNumericAddress("fe80:2:3:4:5:6:7:8%" + IFINDEX1); + private static final InetAddress SADDR2 = parseNumericAddress("fe80:2:3:4:5:6:7:8%" + IFINDEX2); + + private static final String MSG_EMPTY = HDR_EMPTY + NLA_SRCADDR; + private static final String MSG_PREF64 = HDR_16BYTE + OPT_PREF64 + NLA_SRCADDR; + + @Test + public void testParsing() { + NduseroptMessage msg = parseNduseroptMessage(toBuffer(MSG_EMPTY)); + assertMatches(AF_INET6, 0, IFINDEX1, ICMP_TYPE_RA, (byte) 0, SADDR1, msg); + assertNull(msg.option); + + msg = parseNduseroptMessage(toBuffer(MSG_PREF64)); + assertMatches(AF_INET6, 16, IFINDEX2, ICMP_TYPE_RA, (byte) 0, SADDR2, msg); + assertPref64Option("2001:db8:3:4:5:6::/96", msg.option); + } + + @Test + public void testParseWithinNetlinkMessage() throws Exception { + // A NduseroptMessage inside a netlink message. Ensure that it parses the same way both by + // parsing the netlink message via NetlinkMessage.parse() and by parsing the option itself + // with NduseroptMessage.parse(). + final String hexBytes = + "44000000440000000000000000000000" // len=68, RTM_NEWNDUSEROPT + + "0A0010001E0000008600000000000000" // IPv6, opt_bytes=16, ifindex=30, RA + + "260202580064FF9B0000000000000000" // pref64, prefix=64:ff9b::/96, 600 + + "14000100FE800000000000000250B6FFFEB7C499"; // srcaddr=fe80::250:b6ff:feb7:c499 + + ByteBuffer buf = toBuffer(hexBytes); + assertEquals(68, buf.limit()); + buf.order(ByteOrder.nativeOrder()); + + NetlinkMessage nlMsg = NetlinkMessage.parse(buf, NETLINK_ROUTE); + assertNotNull(nlMsg); + assertTrue(nlMsg instanceof NduseroptMessage); + + NduseroptMessage msg = (NduseroptMessage) nlMsg; + InetAddress srcaddr = InetAddress.getByName("fe80::250:b6ff:feb7:c499%30"); + assertMatches(AF_INET6, 16, 30, ICMP_TYPE_RA, (byte) 0, srcaddr, msg); + assertPref64Option("64:ff9b::/96", msg.option); + + final String hexBytesWithoutHeader = hexBytes.substring(StructNlMsgHdr.STRUCT_SIZE * 2); + ByteBuffer bufWithoutHeader = toBuffer(hexBytesWithoutHeader); + assertEquals(52, bufWithoutHeader.limit()); + msg = parseNduseroptMessage(bufWithoutHeader); + assertMatches(AF_INET6, 16, 30, ICMP_TYPE_RA, (byte) 0, srcaddr, msg); + assertPref64Option("64:ff9b::/96", msg.option); + } + + @Test + public void testParseUnknownOptionWithinNetlinkMessage() throws Exception { + final String hexBytes = + "4C0000004400000000000000000000000" + + "A0018001E0000008600000000000000" + + "1903000000001770FD123456789000000000000000000001" // RDNSS option + + "14000100FE800000000000000250B6FFFEB7C499"; + + ByteBuffer buf = toBuffer(hexBytes); + assertEquals(76, buf.limit()); + buf.order(ByteOrder.nativeOrder()); + + NetlinkMessage nlMsg = NetlinkMessage.parse(buf, NETLINK_ROUTE); + assertNotNull(nlMsg); + assertTrue(nlMsg instanceof NduseroptMessage); + + NduseroptMessage msg = (NduseroptMessage) nlMsg; + InetAddress srcaddr = InetAddress.getByName("fe80::250:b6ff:feb7:c499%30"); + assertMatches(AF_INET6, 24, 30, ICMP_TYPE_RA, (byte) 0, srcaddr, msg); + assertEquals(NdOption.UNKNOWN, msg.option); + } + + @Test + public void testUnknownOption() { + ByteBuffer buf = toBuffer(MSG_PREF64); + // Replace the PREF64 option type (38) with an unknown option number. + final int optionStart = NduseroptMessage.STRUCT_SIZE; + assertEquals(38, buf.get(optionStart)); + buf.put(optionStart, (byte) 42); + + NduseroptMessage msg = parseNduseroptMessage(buf); + assertMatches(AF_INET6, 16, IFINDEX2, ICMP_TYPE_RA, (byte) 0, SADDR2, msg); + assertEquals(NdOption.UNKNOWN, msg.option); + + buf.flip(); + assertEquals(42, buf.get(optionStart)); + buf.put(optionStart, (byte) 38); + + msg = parseNduseroptMessage(buf); + assertMatches(AF_INET6, 16, IFINDEX2, ICMP_TYPE_RA, (byte) 0, SADDR2, msg); + assertPref64Option("2001:db8:3:4:5:6::/96", msg.option); + } + + @Test + public void testZeroLengthOption() { + // Make sure an unknown option with a 0-byte length is ignored and parsing continues with + // the address, which comes after it. + final String hexString = HDR_16BYTE + "00000000000000000000000000000000" + NLA_SRCADDR; + ByteBuffer buf = toBuffer(hexString); + assertEquals(52, buf.limit()); + NduseroptMessage msg = parseNduseroptMessage(buf); + assertMatches(AF_INET6, 16, IFINDEX2, ICMP_TYPE_RA, (byte) 0, SADDR2, msg); + assertNull(msg.option); + } + + @Test + public void testTooLongOption() { + // Make sure that if an option's length is too long, it's ignored and parsing continues with + // the address, which comes after it. + final String hexString = HDR_16BYTE + "26030000000000000000000000000000" + NLA_SRCADDR; + ByteBuffer buf = toBuffer(hexString); + assertEquals(52, buf.limit()); + NduseroptMessage msg = parseNduseroptMessage(buf); + assertMatches(AF_INET6, 16, IFINDEX2, ICMP_TYPE_RA, (byte) 0, SADDR2, msg); + assertNull(msg.option); + } + + @Test + public void testOptionsTooLong() { + // Header claims 32 bytes of options. Buffer ends before options end. + String hexString = HDR_32BYTE + OPT_PREF64; + ByteBuffer buf = toBuffer(hexString); + assertEquals(32, buf.limit()); + assertNull(NduseroptMessage.parse(toBuffer(hexString), NETLINK_ROUTE)); + + // Header claims 32 bytes of options. Buffer ends at end of options with no source address. + hexString = HDR_32BYTE + OPT_PREF64 + OPT_PREF64; + buf = toBuffer(hexString); + assertEquals(48, buf.limit()); + assertNull(NduseroptMessage.parse(toBuffer(hexString), NETLINK_ROUTE)); + } + + @Test + public void testTruncation() { + final int optLen = MSG_PREF64.length() / 2; // 1 byte = 2 hex chars + for (int len = 0; len < optLen; len++) { + ByteBuffer buf = toBuffer(MSG_PREF64.substring(0, len * 2)); + NduseroptMessage msg = parseNduseroptMessage(buf); + if (len < optLen) { + assertNull(msg); + } else { + assertNotNull(msg); + assertPref64Option("2001:db8:3:4:5:6::/96", msg.option); + } + } + } + + @Test + public void testToString() { + NduseroptMessage msg = parseNduseroptMessage(toBuffer(MSG_PREF64)); + assertNotNull(msg); + assertEquals("Nduseroptmsg(10, 16, 1431655765, 134, 0, fe80:2:3:4:5:6:7:8%1431655765)", + msg.toString()); + } + + // Convenience method to parse a NduseroptMessage that's not part of a netlink message. + private NduseroptMessage parseNduseroptMessage(ByteBuffer buf) { + return NduseroptMessage.parse(null, buf); + } + + private ByteBuffer toBuffer(String hexString) { + return ByteBuffer.wrap(HexEncoding.decode(hexString)); + } + + private void assertMatches(int family, int optsLen, int ifindex, byte icmpType, + byte icmpCode, InetAddress srcaddr, NduseroptMessage msg) { + assertNotNull(msg); + assertEquals(family, msg.family); + assertEquals(ifindex, msg.ifindex); + assertEquals(optsLen, msg.opts_len); + assertEquals(icmpType, msg.icmp_type); + assertEquals(icmpCode, msg.icmp_code); + assertEquals(srcaddr, msg.srcaddr); + } + + private void assertPref64Option(String prefix, NdOption opt) { + assertNotNull(opt); + assertTrue(opt instanceof StructNdOptPref64); + StructNdOptPref64 pref64Opt = (StructNdOptPref64) opt; + assertEquals(new IpPrefix(prefix), pref64Opt.prefix); + } +}
diff --git a/tests/unit/src/android/net/netlink/NetlinkConstantsTest.java b/tests/unit/src/android/net/netlink/NetlinkConstantsTest.java new file mode 100644 index 0000000..131feeb --- /dev/null +++ b/tests/unit/src/android/net/netlink/NetlinkConstantsTest.java
@@ -0,0 +1,131 @@ +/* + * 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 android.net.netlink; + +import static android.net.netlink.NetlinkConstants.IPCTNL_MSG_CT_DELETE; +import static android.net.netlink.NetlinkConstants.IPCTNL_MSG_CT_GET; +import static android.net.netlink.NetlinkConstants.IPCTNL_MSG_CT_GET_CTRZERO; +import static android.net.netlink.NetlinkConstants.IPCTNL_MSG_CT_GET_DYING; +import static android.net.netlink.NetlinkConstants.IPCTNL_MSG_CT_GET_STATS; +import static android.net.netlink.NetlinkConstants.IPCTNL_MSG_CT_GET_STATS_CPU; +import static android.net.netlink.NetlinkConstants.IPCTNL_MSG_CT_GET_UNCONFIRMED; +import static android.net.netlink.NetlinkConstants.IPCTNL_MSG_CT_NEW; +import static android.net.netlink.NetlinkConstants.NFNL_SUBSYS_CTNETLINK; +import static android.net.netlink.NetlinkConstants.NLMSG_DONE; +import static android.net.netlink.NetlinkConstants.NLMSG_ERROR; +import static android.net.netlink.NetlinkConstants.NLMSG_NOOP; +import static android.net.netlink.NetlinkConstants.NLMSG_OVERRUN; +import static android.net.netlink.NetlinkConstants.RTM_DELADDR; +import static android.net.netlink.NetlinkConstants.RTM_DELLINK; +import static android.net.netlink.NetlinkConstants.RTM_DELNEIGH; +import static android.net.netlink.NetlinkConstants.RTM_DELROUTE; +import static android.net.netlink.NetlinkConstants.RTM_DELRULE; +import static android.net.netlink.NetlinkConstants.RTM_GETADDR; +import static android.net.netlink.NetlinkConstants.RTM_GETLINK; +import static android.net.netlink.NetlinkConstants.RTM_GETNEIGH; +import static android.net.netlink.NetlinkConstants.RTM_GETROUTE; +import static android.net.netlink.NetlinkConstants.RTM_GETRULE; +import static android.net.netlink.NetlinkConstants.RTM_NEWADDR; +import static android.net.netlink.NetlinkConstants.RTM_NEWLINK; +import static android.net.netlink.NetlinkConstants.RTM_NEWNDUSEROPT; +import static android.net.netlink.NetlinkConstants.RTM_NEWNEIGH; +import static android.net.netlink.NetlinkConstants.RTM_NEWROUTE; +import static android.net.netlink.NetlinkConstants.RTM_NEWRULE; +import static android.net.netlink.NetlinkConstants.RTM_SETLINK; +import static android.net.netlink.NetlinkConstants.SOCK_DIAG_BY_FAMILY; +import static android.net.netlink.NetlinkConstants.stringForNlMsgType; +import static android.system.OsConstants.NETLINK_INET_DIAG; +import static android.system.OsConstants.NETLINK_NETFILTER; +import static android.system.OsConstants.NETLINK_ROUTE; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(AndroidJUnit4.class) +@SmallTest +public class NetlinkConstantsTest { + private static final short UNKNOWN_FAMILY = 1234; + + private short makeCtType(short msgType) { + return (short) (NFNL_SUBSYS_CTNETLINK << 8 | (byte) msgType); + } + + @Test + public void testStringForNlMsgType() { + assertEquals("RTM_NEWLINK", stringForNlMsgType(RTM_NEWLINK, NETLINK_ROUTE)); + assertEquals("RTM_DELLINK", stringForNlMsgType(RTM_DELLINK, NETLINK_ROUTE)); + assertEquals("RTM_GETLINK", stringForNlMsgType(RTM_GETLINK, NETLINK_ROUTE)); + assertEquals("RTM_SETLINK", stringForNlMsgType(RTM_SETLINK, NETLINK_ROUTE)); + assertEquals("RTM_NEWADDR", stringForNlMsgType(RTM_NEWADDR, NETLINK_ROUTE)); + assertEquals("RTM_DELADDR", stringForNlMsgType(RTM_DELADDR, NETLINK_ROUTE)); + assertEquals("RTM_GETADDR", stringForNlMsgType(RTM_GETADDR, NETLINK_ROUTE)); + assertEquals("RTM_NEWROUTE", stringForNlMsgType(RTM_NEWROUTE, NETLINK_ROUTE)); + assertEquals("RTM_DELROUTE", stringForNlMsgType(RTM_DELROUTE, NETLINK_ROUTE)); + assertEquals("RTM_GETROUTE", stringForNlMsgType(RTM_GETROUTE, NETLINK_ROUTE)); + assertEquals("RTM_NEWNEIGH", stringForNlMsgType(RTM_NEWNEIGH, NETLINK_ROUTE)); + assertEquals("RTM_DELNEIGH", stringForNlMsgType(RTM_DELNEIGH, NETLINK_ROUTE)); + assertEquals("RTM_GETNEIGH", stringForNlMsgType(RTM_GETNEIGH, NETLINK_ROUTE)); + assertEquals("RTM_NEWRULE", stringForNlMsgType(RTM_NEWRULE, NETLINK_ROUTE)); + assertEquals("RTM_DELRULE", stringForNlMsgType(RTM_DELRULE, NETLINK_ROUTE)); + assertEquals("RTM_GETRULE", stringForNlMsgType(RTM_GETRULE, NETLINK_ROUTE)); + assertEquals("RTM_NEWNDUSEROPT", stringForNlMsgType(RTM_NEWNDUSEROPT, NETLINK_ROUTE)); + + assertEquals("SOCK_DIAG_BY_FAMILY", + stringForNlMsgType(SOCK_DIAG_BY_FAMILY, NETLINK_INET_DIAG)); + + assertEquals("IPCTNL_MSG_CT_NEW", + stringForNlMsgType(makeCtType(IPCTNL_MSG_CT_NEW), NETLINK_NETFILTER)); + assertEquals("IPCTNL_MSG_CT_GET", + stringForNlMsgType(makeCtType(IPCTNL_MSG_CT_GET), NETLINK_NETFILTER)); + assertEquals("IPCTNL_MSG_CT_DELETE", + stringForNlMsgType(makeCtType(IPCTNL_MSG_CT_DELETE), NETLINK_NETFILTER)); + assertEquals("IPCTNL_MSG_CT_GET_CTRZERO", + stringForNlMsgType(makeCtType(IPCTNL_MSG_CT_GET_CTRZERO), NETLINK_NETFILTER)); + assertEquals("IPCTNL_MSG_CT_GET_STATS_CPU", + stringForNlMsgType(makeCtType(IPCTNL_MSG_CT_GET_STATS_CPU), NETLINK_NETFILTER)); + assertEquals("IPCTNL_MSG_CT_GET_STATS", + stringForNlMsgType(makeCtType(IPCTNL_MSG_CT_GET_STATS), NETLINK_NETFILTER)); + assertEquals("IPCTNL_MSG_CT_GET_DYING", + stringForNlMsgType(makeCtType(IPCTNL_MSG_CT_GET_DYING), NETLINK_NETFILTER)); + assertEquals("IPCTNL_MSG_CT_GET_UNCONFIRMED", + stringForNlMsgType(makeCtType(IPCTNL_MSG_CT_GET_UNCONFIRMED), NETLINK_NETFILTER)); + } + + @Test + public void testStringForNlMsgType_ControlMessage() { + for (int family : new int[]{NETLINK_ROUTE, NETLINK_INET_DIAG, NETLINK_NETFILTER}) { + assertEquals("NLMSG_NOOP", stringForNlMsgType(NLMSG_NOOP, family)); + assertEquals("NLMSG_ERROR", stringForNlMsgType(NLMSG_ERROR, family)); + assertEquals("NLMSG_DONE", stringForNlMsgType(NLMSG_DONE, family)); + assertEquals("NLMSG_OVERRUN", stringForNlMsgType(NLMSG_OVERRUN, family)); + } + } + + @Test + public void testStringForNlMsgType_UnknownFamily() { + assertTrue(stringForNlMsgType(RTM_NEWLINK, UNKNOWN_FAMILY).startsWith("unknown")); + assertTrue(stringForNlMsgType(SOCK_DIAG_BY_FAMILY, UNKNOWN_FAMILY).startsWith("unknown")); + assertTrue(stringForNlMsgType(makeCtType(IPCTNL_MSG_CT_NEW), UNKNOWN_FAMILY) + .startsWith("unknown")); + } +}
diff --git a/tests/unit/src/android/net/netlink/NetlinkErrorMessageTest.java b/tests/unit/src/android/net/netlink/NetlinkErrorMessageTest.java new file mode 100644 index 0000000..345622f --- /dev/null +++ b/tests/unit/src/android/net/netlink/NetlinkErrorMessageTest.java
@@ -0,0 +1,95 @@ +/* + * Copyright (C) 2015 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.netlink; + +import static android.net.netlink.StructNlMsgHdr.NLM_F_ACK; +import static android.net.netlink.StructNlMsgHdr.NLM_F_REPLACE; +import static android.net.netlink.StructNlMsgHdr.NLM_F_REQUEST; +import static android.system.OsConstants.NETLINK_ROUTE; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import android.net.netlink.NetlinkConstants; +import android.net.netlink.NetlinkErrorMessage; +import android.net.netlink.NetlinkMessage; +import android.net.netlink.StructNlMsgErr; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + +import libcore.util.HexEncoding; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +@RunWith(AndroidJUnit4.class) +@SmallTest +public class NetlinkErrorMessageTest { + private final String TAG = "NetlinkErrorMessageTest"; + + // Hexadecimal representation of packet capture. + public static final String NLM_ERROR_OK_HEX = + // struct nlmsghdr + "24000000" + // length = 36 + "0200" + // type = 2 (NLMSG_ERROR) + "0000" + // flags + "26350000" + // seqno + "64100000" + // pid = userspace process + // error integer + "00000000" + // "errno" (0 == OK) + // struct nlmsghdr + "30000000" + // length (48) of original request + "1C00" + // type = 28 (RTM_NEWNEIGH) + "0501" + // flags (NLM_F_REQUEST | NLM_F_ACK | NLM_F_REPLACE) + "26350000" + // seqno + "00000000"; // pid = kernel + public static final byte[] NLM_ERROR_OK = + HexEncoding.decode(NLM_ERROR_OK_HEX.toCharArray(), false); + + @Test + public void testParseNlmErrorOk() { + final ByteBuffer byteBuffer = ByteBuffer.wrap(NLM_ERROR_OK); + byteBuffer.order(ByteOrder.LITTLE_ENDIAN); // For testing. + final NetlinkMessage msg = NetlinkMessage.parse(byteBuffer, NETLINK_ROUTE); + assertNotNull(msg); + assertTrue(msg instanceof NetlinkErrorMessage); + final NetlinkErrorMessage errorMsg = (NetlinkErrorMessage) msg; + + final StructNlMsgHdr hdr = errorMsg.getHeader(); + assertNotNull(hdr); + assertEquals(36, hdr.nlmsg_len); + assertEquals(NetlinkConstants.NLMSG_ERROR, hdr.nlmsg_type); + assertEquals(0, hdr.nlmsg_flags); + assertEquals(13606, hdr.nlmsg_seq); + assertEquals(4196, hdr.nlmsg_pid); + + final StructNlMsgErr err = errorMsg.getNlMsgError(); + assertNotNull(err); + assertEquals(0, err.error); + assertNotNull(err.msg); + assertEquals(48, err.msg.nlmsg_len); + assertEquals(NetlinkConstants.RTM_NEWNEIGH, err.msg.nlmsg_type); + assertEquals((NLM_F_REQUEST | NLM_F_ACK | NLM_F_REPLACE), err.msg.nlmsg_flags); + assertEquals(13606, err.msg.nlmsg_seq); + assertEquals(0, err.msg.nlmsg_pid); + } +}
diff --git a/tests/unit/src/android/net/netlink/NetlinkSocketTest.java b/tests/unit/src/android/net/netlink/NetlinkSocketTest.java new file mode 100644 index 0000000..5716803 --- /dev/null +++ b/tests/unit/src/android/net/netlink/NetlinkSocketTest.java
@@ -0,0 +1,106 @@ +/* + * Copyright (C) 2015 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.netlink; + +import static android.net.netlink.NetlinkSocket.DEFAULT_RECV_BUFSIZE; +import static android.system.OsConstants.NETLINK_ROUTE; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import android.net.netlink.NetlinkSocket; +import android.net.netlink.RtNetlinkNeighborMessage; +import android.net.netlink.StructNlMsgHdr; +import android.system.NetlinkSocketAddress; +import android.system.Os; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + +import libcore.io.IoUtils; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.io.FileDescriptor; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +@RunWith(AndroidJUnit4.class) +@SmallTest +public class NetlinkSocketTest { + private final String TAG = "NetlinkSocketTest"; + + @Test + public void testBasicWorkingGetNeighborsQuery() throws Exception { + final FileDescriptor fd = NetlinkSocket.forProto(NETLINK_ROUTE); + assertNotNull(fd); + + NetlinkSocket.connectToKernel(fd); + + final NetlinkSocketAddress localAddr = (NetlinkSocketAddress) Os.getsockname(fd); + assertNotNull(localAddr); + assertEquals(0, localAddr.getGroupsMask()); + assertTrue(0 != localAddr.getPortId()); + + final int TEST_SEQNO = 5; + final byte[] req = RtNetlinkNeighborMessage.newGetNeighborsRequest(TEST_SEQNO); + assertNotNull(req); + + final long TIMEOUT = 500; + assertEquals(req.length, NetlinkSocket.sendMessage(fd, req, 0, req.length, TIMEOUT)); + + int neighMessageCount = 0; + int doneMessageCount = 0; + + while (doneMessageCount == 0) { + ByteBuffer response = NetlinkSocket.recvMessage(fd, DEFAULT_RECV_BUFSIZE, TIMEOUT); + assertNotNull(response); + assertTrue(StructNlMsgHdr.STRUCT_SIZE <= response.limit()); + assertEquals(0, response.position()); + assertEquals(ByteOrder.nativeOrder(), response.order()); + + // Verify the messages at least appears minimally reasonable. + while (response.remaining() > 0) { + final NetlinkMessage msg = NetlinkMessage.parse(response, NETLINK_ROUTE); + assertNotNull(msg); + final StructNlMsgHdr hdr = msg.getHeader(); + assertNotNull(hdr); + + if (hdr.nlmsg_type == NetlinkConstants.NLMSG_DONE) { + doneMessageCount++; + continue; + } + + assertEquals(NetlinkConstants.RTM_NEWNEIGH, hdr.nlmsg_type); + assertTrue(msg instanceof RtNetlinkNeighborMessage); + assertTrue((hdr.nlmsg_flags & StructNlMsgHdr.NLM_F_MULTI) != 0); + assertEquals(TEST_SEQNO, hdr.nlmsg_seq); + assertEquals(localAddr.getPortId(), hdr.nlmsg_pid); + + neighMessageCount++; + } + } + + assertEquals(1, doneMessageCount); + // TODO: make sure this test passes sanely in airplane mode. + assertTrue(neighMessageCount > 0); + + IoUtils.closeQuietly(fd); + } +}
diff --git a/tests/unit/src/android/net/netlink/NetlinkTestUtils.kt b/tests/unit/src/android/net/netlink/NetlinkTestUtils.kt new file mode 100644 index 0000000..3b485eb --- /dev/null +++ b/tests/unit/src/android/net/netlink/NetlinkTestUtils.kt
@@ -0,0 +1,102 @@ +/* + * 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. + */ + +@file:JvmName("NetlinkTestUtils") + +package android.net.netlink + +import android.net.netlink.NetlinkConstants.RTM_DELNEIGH +import android.net.netlink.NetlinkConstants.RTM_NEWNEIGH +import libcore.util.HexEncoding +import libcore.util.HexEncoding.encodeToString +import java.net.Inet6Address +import java.net.InetAddress + +/** + * Make a RTM_NEWNEIGH netlink message. + */ +fun makeNewNeighMessage( + neighAddr: InetAddress, + nudState: Short +) = makeNeighborMessage( + neighAddr = neighAddr, + type = RTM_NEWNEIGH, + nudState = nudState +) + +/** + * Make a RTM_DELNEIGH netlink message. + */ +fun makeDelNeighMessage( + neighAddr: InetAddress, + nudState: Short +) = makeNeighborMessage( + neighAddr = neighAddr, + type = RTM_DELNEIGH, + nudState = nudState +) + +private fun makeNeighborMessage( + neighAddr: InetAddress, + type: Short, + nudState: Short +) = HexEncoding.decode( + /* ktlint-disable indent */ + // -- struct nlmsghdr -- + // length = 88 or 76: + (if (neighAddr is Inet6Address) "58000000" else "4c000000") + + type.toLEHex() + // type + "0000" + // flags + "00000000" + // seqno + "00000000" + // pid (0 == kernel) + // struct ndmsg + // family (AF_INET6 or AF_INET) + (if (neighAddr is Inet6Address) "0a" else "02") + + "00" + // pad1 + "0000" + // pad2 + "15000000" + // interface index (21 == wlan0, on test device) + nudState.toLEHex() + // NUD state + "00" + // flags + "01" + // type + // -- struct nlattr: NDA_DST -- + // length = 20 or 8: + (if (neighAddr is Inet6Address) "1400" else "0800") + + "0100" + // type (1 == NDA_DST, for neighbor messages) + // IP address: + encodeToString(neighAddr.address) + + // -- struct nlattr: NDA_LLADDR -- + "0a00" + // length = 10 + "0200" + // type (2 == NDA_LLADDR, for neighbor messages) + "00005e000164" + // MAC Address (== 00:00:5e:00:01:64) + "0000" + // padding, for 4 byte alignment + // -- struct nlattr: NDA_PROBES -- + "0800" + // length = 8 + "0400" + // type (4 == NDA_PROBES, for neighbor messages) + "01000000" + // number of probes + // -- struct nlattr: NDA_CACHEINFO -- + "1400" + // length = 20 + "0300" + // type (3 == NDA_CACHEINFO, for neighbor messages) + "05190000" + // ndm_used, as "clock ticks ago" + "05190000" + // ndm_confirmed, as "clock ticks ago" + "190d0000" + // ndm_updated, as "clock ticks ago" + "00000000", // ndm_refcnt + false /* allowSingleChar */) + /* ktlint-enable indent */ + +/** + * Convert a [Short] to a little-endian hex string. + */ +private fun Short.toLEHex() = String.format("%04x", java.lang.Short.reverseBytes(this))
diff --git a/tests/unit/src/android/net/netlink/RtNetlinkNeighborMessageTest.java b/tests/unit/src/android/net/netlink/RtNetlinkNeighborMessageTest.java new file mode 100644 index 0000000..a1f1d44 --- /dev/null +++ b/tests/unit/src/android/net/netlink/RtNetlinkNeighborMessageTest.java
@@ -0,0 +1,211 @@ +/* + * 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.netlink; + +import static android.net.netlink.NetlinkTestUtils.makeDelNeighMessage; +import static android.net.netlink.NetlinkTestUtils.makeNewNeighMessage; +import static android.net.netlink.StructNdMsg.NUD_STALE; +import static android.system.OsConstants.NETLINK_ROUTE; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import android.net.InetAddresses; +import android.net.netlink.NetlinkConstants; +import android.net.netlink.NetlinkMessage; +import android.net.netlink.RtNetlinkNeighborMessage; +import android.net.netlink.StructNdMsg; +import android.net.netlink.StructNlMsgHdr; +import android.system.OsConstants; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + +import libcore.util.HexEncoding; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.net.Inet4Address; +import java.net.InetAddress; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.Arrays; + +@RunWith(AndroidJUnit4.class) +@SmallTest +public class RtNetlinkNeighborMessageTest { + private final String TAG = "RtNetlinkNeighborMessageTest"; + + public static final byte[] RTM_DELNEIGH = makeDelNeighMessage( + InetAddresses.parseNumericAddress("192.168.159.254"), NUD_STALE); + + public static final byte[] RTM_NEWNEIGH = makeNewNeighMessage( + InetAddresses.parseNumericAddress("fe80::86c9:b2ff:fe6a:ed4b"), NUD_STALE); + + // An example of the full response from an RTM_GETNEIGH query. + private static final String RTM_GETNEIGH_RESPONSE_HEX = + // <-- struct nlmsghr -->|<-- struct ndmsg -->|<-- struct nlattr: NDA_DST -->|<-- NDA_LLADDR -->|<-- NDA_PROBES -->|<-- NDA_CACHEINFO -->| + "58000000 1c00 0200 00000000 3e2b0000 0a 00 0000 15000000 4000 00 05 1400 0100 ff020000000000000000000000000001 0a00 0200 333300000001 0000 0800 0400 00000000 1400 0300 a2280000 32110000 32110000 01000000" + + "58000000 1c00 0200 00000000 3e2b0000 0a 00 0000 15000000 4000 00 05 1400 0100 ff0200000000000000000001ff000001 0a00 0200 3333ff000001 0000 0800 0400 00000000 1400 0300 0d280000 9d100000 9d100000 00000000" + + "58000000 1c00 0200 00000000 3e2b0000 0a 00 0000 15000000 0400 80 01 1400 0100 20010db800040ca00000000000000001 0a00 0200 84c9b26aed4b 0000 0800 0400 04000000 1400 0300 90100000 90100000 90080000 01000000" + + "58000000 1c00 0200 00000000 3e2b0000 0a 00 0000 15000000 4000 00 05 1400 0100 ff0200000000000000000001ff47da19 0a00 0200 3333ff47da19 0000 0800 0400 00000000 1400 0300 a1280000 31110000 31110000 01000000" + + "58000000 1c00 0200 00000000 3e2b0000 0a 00 0000 14000000 4000 00 05 1400 0100 ff020000000000000000000000000016 0a00 0200 333300000016 0000 0800 0400 00000000 1400 0300 912a0000 21130000 21130000 00000000" + + "58000000 1c00 0200 00000000 3e2b0000 0a 00 0000 14000000 4000 00 05 1400 0100 ff0200000000000000000001ffeace3b 0a00 0200 3333ffeace3b 0000 0800 0400 00000000 1400 0300 922a0000 22130000 22130000 00000000" + + "58000000 1c00 0200 00000000 3e2b0000 0a 00 0000 15000000 4000 00 05 1400 0100 ff0200000000000000000001ff5c2a83 0a00 0200 3333ff5c2a83 0000 0800 0400 00000000 1400 0300 391c0000 c9040000 c9040000 01000000" + + "58000000 1c00 0200 00000000 3e2b0000 0a 00 0000 01000000 4000 00 02 1400 0100 00000000000000000000000000000000 0a00 0200 000000000000 0000 0800 0400 00000000 1400 0300 cd180200 5d010200 5d010200 08000000" + + "58000000 1c00 0200 00000000 3e2b0000 0a 00 0000 15000000 4000 00 05 1400 0100 ff020000000000000000000000000002 0a00 0200 333300000002 0000 0800 0400 00000000 1400 0300 352a0000 c5120000 c5120000 00000000" + + "58000000 1c00 0200 00000000 3e2b0000 0a 00 0000 15000000 4000 00 05 1400 0100 ff020000000000000000000000000016 0a00 0200 333300000016 0000 0800 0400 00000000 1400 0300 982a0000 28130000 28130000 00000000" + + "58000000 1c00 0200 00000000 3e2b0000 0a 00 0000 15000000 0800 80 01 1400 0100 fe8000000000000086c9b2fffe6aed4b 0a00 0200 84c9b26aed4b 0000 0800 0400 00000000 1400 0300 23000000 24000000 57000000 13000000" + + "58000000 1c00 0200 00000000 3e2b0000 0a 00 0000 15000000 4000 00 05 1400 0100 ff0200000000000000000001ffeace3b 0a00 0200 3333ffeace3b 0000 0800 0400 00000000 1400 0300 992a0000 29130000 29130000 01000000" + + "58000000 1c00 0200 00000000 3e2b0000 0a 00 0000 14000000 4000 00 05 1400 0100 ff020000000000000000000000000002 0a00 0200 333300000002 0000 0800 0400 00000000 1400 0300 2e2a0000 be120000 be120000 00000000" + + "44000000 1c00 0200 00000000 3e2b0000 02 00 0000 18000000 4000 00 03 0800 0100 00000000 0400 0200 0800 0400 00000000 1400 0300 75280000 05110000 05110000 22000000"; + public static final byte[] RTM_GETNEIGH_RESPONSE = + HexEncoding.decode(RTM_GETNEIGH_RESPONSE_HEX.replaceAll(" ", "").toCharArray(), false); + + @Test + public void testParseRtmDelNeigh() { + final ByteBuffer byteBuffer = ByteBuffer.wrap(RTM_DELNEIGH); + byteBuffer.order(ByteOrder.LITTLE_ENDIAN); // For testing. + final NetlinkMessage msg = NetlinkMessage.parse(byteBuffer, NETLINK_ROUTE); + assertNotNull(msg); + assertTrue(msg instanceof RtNetlinkNeighborMessage); + final RtNetlinkNeighborMessage neighMsg = (RtNetlinkNeighborMessage) msg; + + final StructNlMsgHdr hdr = neighMsg.getHeader(); + assertNotNull(hdr); + assertEquals(76, hdr.nlmsg_len); + assertEquals(NetlinkConstants.RTM_DELNEIGH, hdr.nlmsg_type); + assertEquals(0, hdr.nlmsg_flags); + assertEquals(0, hdr.nlmsg_seq); + assertEquals(0, hdr.nlmsg_pid); + + final StructNdMsg ndmsgHdr = neighMsg.getNdHeader(); + assertNotNull(ndmsgHdr); + assertEquals((byte) OsConstants.AF_INET, ndmsgHdr.ndm_family); + assertEquals(21, ndmsgHdr.ndm_ifindex); + assertEquals(NUD_STALE, ndmsgHdr.ndm_state); + final InetAddress destination = neighMsg.getDestination(); + assertNotNull(destination); + assertEquals(InetAddress.parseNumericAddress("192.168.159.254"), destination); + } + + @Test + public void testParseRtmNewNeigh() { + final ByteBuffer byteBuffer = ByteBuffer.wrap(RTM_NEWNEIGH); + byteBuffer.order(ByteOrder.LITTLE_ENDIAN); // For testing. + final NetlinkMessage msg = NetlinkMessage.parse(byteBuffer, NETLINK_ROUTE); + assertNotNull(msg); + assertTrue(msg instanceof RtNetlinkNeighborMessage); + final RtNetlinkNeighborMessage neighMsg = (RtNetlinkNeighborMessage) msg; + + final StructNlMsgHdr hdr = neighMsg.getHeader(); + assertNotNull(hdr); + assertEquals(88, hdr.nlmsg_len); + assertEquals(NetlinkConstants.RTM_NEWNEIGH, hdr.nlmsg_type); + assertEquals(0, hdr.nlmsg_flags); + assertEquals(0, hdr.nlmsg_seq); + assertEquals(0, hdr.nlmsg_pid); + + final StructNdMsg ndmsgHdr = neighMsg.getNdHeader(); + assertNotNull(ndmsgHdr); + assertEquals((byte) OsConstants.AF_INET6, ndmsgHdr.ndm_family); + assertEquals(21, ndmsgHdr.ndm_ifindex); + assertEquals(NUD_STALE, ndmsgHdr.ndm_state); + final InetAddress destination = neighMsg.getDestination(); + assertNotNull(destination); + assertEquals(InetAddress.parseNumericAddress("fe80::86c9:b2ff:fe6a:ed4b"), destination); + } + + @Test + public void testParseRtmGetNeighResponse() { + final ByteBuffer byteBuffer = ByteBuffer.wrap(RTM_GETNEIGH_RESPONSE); + byteBuffer.order(ByteOrder.LITTLE_ENDIAN); // For testing. + + int messageCount = 0; + while (byteBuffer.remaining() > 0) { + final NetlinkMessage msg = NetlinkMessage.parse(byteBuffer, NETLINK_ROUTE); + assertNotNull(msg); + assertTrue(msg instanceof RtNetlinkNeighborMessage); + final RtNetlinkNeighborMessage neighMsg = (RtNetlinkNeighborMessage) msg; + + final StructNlMsgHdr hdr = neighMsg.getHeader(); + assertNotNull(hdr); + assertEquals(NetlinkConstants.RTM_NEWNEIGH, hdr.nlmsg_type); + assertEquals(StructNlMsgHdr.NLM_F_MULTI, hdr.nlmsg_flags); + assertEquals(0, hdr.nlmsg_seq); + assertEquals(11070, hdr.nlmsg_pid); + + final int probes = neighMsg.getProbes(); + assertTrue("Unexpected number of probes. Got " + probes + ", max=5", + probes < 5); + final int ndm_refcnt = neighMsg.getCacheInfo().ndm_refcnt; + assertTrue("nda_cacheinfo has unexpectedly high ndm_refcnt: " + ndm_refcnt, + ndm_refcnt < 0x100); + + messageCount++; + } + // TODO: add more detailed spot checks. + assertEquals(14, messageCount); + } + + @Test + public void testCreateRtmNewNeighMessage() { + final int seqNo = 2635; + final int ifIndex = 14; + final byte[] llAddr = + new byte[] { (byte) 1, (byte) 2, (byte) 3, (byte) 4, (byte) 5, (byte) 6 }; + + // Hexadecimal representation of our created packet. + final String expectedNewNeighHex = + // struct nlmsghdr + "30000000" + // length = 48 + "1c00" + // type = 28 (RTM_NEWNEIGH) + "0501" + // flags (NLM_F_REQUEST | NLM_F_ACK | NLM_F_REPLACE) + "4b0a0000" + // seqno + "00000000" + // pid (0 == kernel) + // struct ndmsg + "02" + // family + "00" + // pad1 + "0000" + // pad2 + "0e000000" + // interface index (14) + "0800" + // NUD state (0x08 == NUD_DELAY) + "00" + // flags + "00" + // type + // struct nlattr: NDA_DST + "0800" + // length = 8 + "0100" + // type (1 == NDA_DST, for neighbor messages) + "7f000001" + // IPv4 address (== 127.0.0.1) + // struct nlattr: NDA_LLADDR + "0a00" + // length = 10 + "0200" + // type (2 == NDA_LLADDR, for neighbor messages) + "010203040506" + // MAC Address (== 01:02:03:04:05:06) + "0000"; // padding, for 4 byte alignment + final byte[] expectedNewNeigh = + HexEncoding.decode(expectedNewNeighHex.toCharArray(), false); + + final byte[] bytes = RtNetlinkNeighborMessage.newNewNeighborMessage( + seqNo, Inet4Address.LOOPBACK, StructNdMsg.NUD_DELAY, ifIndex, llAddr); + if (!Arrays.equals(expectedNewNeigh, bytes)) { + assertEquals(expectedNewNeigh.length, bytes.length); + for (int i = 0; i < Math.min(expectedNewNeigh.length, bytes.length); i++) { + assertEquals(expectedNewNeigh[i], bytes[i]); + } + } + } +}
diff --git a/tests/unit/src/android/net/netlink/StructNdOptPref64Test.java b/tests/unit/src/android/net/netlink/StructNdOptPref64Test.java new file mode 100644 index 0000000..0f3020d --- /dev/null +++ b/tests/unit/src/android/net/netlink/StructNdOptPref64Test.java
@@ -0,0 +1,201 @@ +/* + * 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.netlink; + +import static android.net.netlink.StructNdOptPref64.getScaledLifetimePlc; +import static android.net.netlink.StructNdOptPref64.plcToPrefixLength; +import static android.net.netlink.StructNdOptPref64.prefixLengthToPlc; + +import static com.android.testutils.MiscAsserts.assertThrows; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; + +import android.net.IpPrefix; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + +import libcore.util.HexEncoding; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.net.InetAddress; +import java.nio.ByteBuffer; + +@RunWith(AndroidJUnit4.class) +@SmallTest +public class StructNdOptPref64Test { + + private static final String PREFIX1 = "64:ff9b::"; + private static final String PREFIX2 = "2001:db8:1:2:3:64::"; + + private static byte[] prefixBytes(String addrString) throws Exception { + InetAddress addr = InetAddress.getByName(addrString); + byte[] prefixBytes = new byte[12]; + System.arraycopy(addr.getAddress(), 0, prefixBytes, 0, 12); + return prefixBytes; + } + + private static IpPrefix prefix(String addrString, int prefixLength) throws Exception { + return new IpPrefix(InetAddress.getByName(addrString), prefixLength); + } + + private void assertPref64OptMatches(int lifetime, IpPrefix prefix, StructNdOptPref64 opt) { + assertEquals(StructNdOptPref64.TYPE, opt.type); + assertEquals(2, opt.length); + assertEquals(lifetime, opt.lifetime); + assertEquals(prefix, opt.prefix); + } + + private void assertToByteBufferMatches(StructNdOptPref64 opt, String expected) { + String actual = HexEncoding.encodeToString(opt.toByteBuffer().array()); + assertEquals(expected, actual); + } + + private ByteBuffer makeNdOptPref64(int lifetime, byte[] prefix, int prefixLengthCode) { + if (prefix.length != 12) throw new IllegalArgumentException("Prefix must be 12 bytes"); + + ByteBuffer buf = ByteBuffer.allocate(16) + .put((byte) StructNdOptPref64.TYPE) + .put((byte) StructNdOptPref64.LENGTH) + .putShort(getScaledLifetimePlc(lifetime, prefixLengthCode)) + .put(prefix, 0, 12); + + buf.flip(); + return buf; + } + + @Test + public void testParseCannedOption() throws Exception { + String hexBytes = "2602" // type=38, len=2 (16 bytes) + + "0088" // lifetime=136, PLC=0 (/96) + + "20010DB80003000400050006"; // 2001:db8:3:4:5:6/96 + byte[] rawBytes = HexEncoding.decode(hexBytes); + StructNdOptPref64 opt = StructNdOptPref64.parse(ByteBuffer.wrap(rawBytes)); + assertPref64OptMatches(136, prefix("2001:DB8:3:4:5:6::", 96), opt); + assertToByteBufferMatches(opt, hexBytes); + + hexBytes = "2602" // type=38, len=2 (16 bytes) + + "2752" // lifetime=10064, PLC=2 (/56) + + "0064FF9B0000000000000000"; // 64:ff9b::/56 + rawBytes = HexEncoding.decode(hexBytes); + opt = StructNdOptPref64.parse(ByteBuffer.wrap(rawBytes)); + assertPref64OptMatches(10064, prefix("64:FF9B::", 56), opt); + assertToByteBufferMatches(opt, hexBytes); + } + + @Test + public void testParsing() throws Exception { + // Valid. + ByteBuffer buf = makeNdOptPref64(600, prefixBytes(PREFIX1), 0); + StructNdOptPref64 opt = StructNdOptPref64.parse(buf); + assertPref64OptMatches(600, prefix(PREFIX1, 96), opt); + + // Valid, zero lifetime, /64. + buf = makeNdOptPref64(0, prefixBytes(PREFIX1), 1); + opt = StructNdOptPref64.parse(buf); + assertPref64OptMatches(0, prefix(PREFIX1, 64), opt); + + // Valid, low lifetime, /56. + buf = makeNdOptPref64(8, prefixBytes(PREFIX2), 2); + opt = StructNdOptPref64.parse(buf); + assertPref64OptMatches(8, prefix(PREFIX2, 56), opt); + assertEquals(new IpPrefix("2001:db8:1::/56"), opt.prefix); // Prefix is truncated. + + // Valid, maximum lifetime, /32. + buf = makeNdOptPref64(65528, prefixBytes(PREFIX2), 5); + opt = StructNdOptPref64.parse(buf); + assertPref64OptMatches(65528, prefix(PREFIX2, 32), opt); + assertEquals(new IpPrefix("2001:db8::/32"), opt.prefix); // Prefix is truncated. + + // Lifetime not divisible by 8. + buf = makeNdOptPref64(300, prefixBytes(PREFIX2), 0); + opt = StructNdOptPref64.parse(buf); + assertPref64OptMatches(296, prefix(PREFIX2, 96), opt); + + // Invalid prefix length codes. + buf = makeNdOptPref64(600, prefixBytes(PREFIX1), 6); + assertNull(StructNdOptPref64.parse(buf)); + buf = makeNdOptPref64(600, prefixBytes(PREFIX1), 7); + assertNull(StructNdOptPref64.parse(buf)); + + // Truncated to varying lengths... + buf = makeNdOptPref64(600, prefixBytes(PREFIX1), 3); + final int len = buf.limit(); + for (int i = 0; i < buf.limit() - 1; i++) { + buf.flip(); + buf.limit(i); + assertNull("Option truncated to " + i + " bytes, should have returned null", + StructNdOptPref64.parse(buf)); + } + buf.flip(); + buf.limit(len); + // ... but otherwise OK. + opt = StructNdOptPref64.parse(buf); + assertPref64OptMatches(600, prefix(PREFIX1, 48), opt); + } + + @Test + public void testToString() throws Exception { + ByteBuffer buf = makeNdOptPref64(600, prefixBytes(PREFIX1), 4); + StructNdOptPref64 opt = StructNdOptPref64.parse(buf); + assertPref64OptMatches(600, prefix(PREFIX1, 40), opt); + assertEquals("NdOptPref64(64:ff9b::/40, 600)", opt.toString()); + } + + private void assertInvalidPlc(int plc) { + assertThrows(IllegalArgumentException.class, () -> plcToPrefixLength(plc)); + } + + @Test + public void testPrefixLengthToPlc() { + for (int i = 0; i < 6; i++) { + assertEquals(i, prefixLengthToPlc(plcToPrefixLength(i))); + } + assertInvalidPlc(-1); + assertInvalidPlc(6); + assertInvalidPlc(7); + assertEquals(0, prefixLengthToPlc(96)); + } + + + private void assertInvalidParameters(IpPrefix prefix, int lifetime) { + assertThrows(IllegalArgumentException.class, () -> new StructNdOptPref64(prefix, lifetime)); + } + + @Test + public void testToByteBuffer() throws Exception { + final IpPrefix prefix1 = prefix(PREFIX1, 56); + final IpPrefix prefix2 = prefix(PREFIX2, 96); + + StructNdOptPref64 opt = new StructNdOptPref64(prefix1, 600); + assertToByteBufferMatches(opt, "2602025A0064FF9B0000000000000000"); + assertEquals(new IpPrefix("64:ff9b::/56"), opt.prefix); + assertEquals(600, opt.lifetime); + + opt = new StructNdOptPref64(prefix2, 65519); + assertToByteBufferMatches(opt, "2602FFE820010DB80001000200030064"); + assertEquals(new IpPrefix("2001:db8:1:2:3:64::/96"), opt.prefix); + assertEquals(65512, opt.lifetime); + + assertInvalidParameters(prefix1, 65535); + assertInvalidParameters(prefix2, -1); + assertInvalidParameters(prefix("1.2.3.4", 32), 600); + } +}
diff --git a/tests/unit/src/android/net/netlink/StructNlMsgHdrTest.java b/tests/unit/src/android/net/netlink/StructNlMsgHdrTest.java new file mode 100644 index 0000000..b44b31d --- /dev/null +++ b/tests/unit/src/android/net/netlink/StructNlMsgHdrTest.java
@@ -0,0 +1,102 @@ +/* + * 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 android.net.netlink; + +import static org.junit.Assert.fail; + +import android.system.OsConstants; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(AndroidJUnit4.class) +@SmallTest +public class StructNlMsgHdrTest { + + public static final short TEST_NLMSG_LEN = 16; + public static final short TEST_NLMSG_FLAGS = StructNlMsgHdr.NLM_F_REQUEST + | StructNlMsgHdr.NLM_F_MULTI | StructNlMsgHdr.NLM_F_ACK | StructNlMsgHdr.NLM_F_ECHO; + public static final short TEST_NLMSG_SEQ = 1234; + public static final short TEST_NLMSG_PID = 5678; + + // Checking the header string nlmsg_{len, ..} of the number can make sure that the checking + // number comes from the expected element. + // TODO: Verify more flags once StructNlMsgHdr can distinguish the flags which have the same + // value. For example, NLM_F_MATCH (0x200) and NLM_F_EXCL (0x200) can't be distinguished. + // See StructNlMsgHdrTest#stringForNlMsgFlags. + public static final String TEST_NLMSG_LEN_STR = "nlmsg_len{16}"; + public static final String TEST_NLMSG_FLAGS_STR = + "NLM_F_REQUEST|NLM_F_MULTI|NLM_F_ACK|NLM_F_ECHO"; + public static final String TEST_NLMSG_SEQ_STR = "nlmsg_seq{1234}"; + public static final String TEST_NLMSG_PID_STR = "nlmsg_pid{5678}"; + + private StructNlMsgHdr makeStructNlMsgHdr(short type) { + final StructNlMsgHdr struct = new StructNlMsgHdr(); + struct.nlmsg_len = TEST_NLMSG_LEN; + struct.nlmsg_type = type; + struct.nlmsg_flags = TEST_NLMSG_FLAGS; + struct.nlmsg_seq = TEST_NLMSG_SEQ; + struct.nlmsg_pid = TEST_NLMSG_PID; + return struct; + } + + private static void assertContains(String actualValue, String expectedSubstring) { + if (actualValue.contains(expectedSubstring)) return; + fail("\"" + actualValue + "\" does not contain \"" + expectedSubstring + "\""); + } + + @Test + public void testToString() { + StructNlMsgHdr struct = makeStructNlMsgHdr(NetlinkConstants.RTM_NEWADDR); + String s = struct.toString(); + assertContains(s, TEST_NLMSG_LEN_STR); + assertContains(s, TEST_NLMSG_FLAGS_STR); + assertContains(s, TEST_NLMSG_SEQ_STR); + assertContains(s, TEST_NLMSG_PID_STR); + assertContains(s, "nlmsg_type{20()}"); + + struct = makeStructNlMsgHdr(NetlinkConstants.SOCK_DIAG_BY_FAMILY); + s = struct.toString(); + assertContains(s, TEST_NLMSG_LEN_STR); + assertContains(s, TEST_NLMSG_FLAGS_STR); + assertContains(s, TEST_NLMSG_SEQ_STR); + assertContains(s, TEST_NLMSG_PID_STR); + assertContains(s, "nlmsg_type{20()}"); + } + + @Test + public void testToStringWithNetlinkFamily() { + StructNlMsgHdr struct = makeStructNlMsgHdr(NetlinkConstants.RTM_NEWADDR); + String s = struct.toString(OsConstants.NETLINK_ROUTE); + assertContains(s, TEST_NLMSG_LEN_STR); + assertContains(s, TEST_NLMSG_FLAGS_STR); + assertContains(s, TEST_NLMSG_SEQ_STR); + assertContains(s, TEST_NLMSG_PID_STR); + assertContains(s, "nlmsg_type{20(RTM_NEWADDR)}"); + + struct = makeStructNlMsgHdr(NetlinkConstants.SOCK_DIAG_BY_FAMILY); + s = struct.toString(OsConstants.NETLINK_INET_DIAG); + assertContains(s, TEST_NLMSG_LEN_STR); + assertContains(s, TEST_NLMSG_FLAGS_STR); + assertContains(s, TEST_NLMSG_SEQ_STR); + assertContains(s, TEST_NLMSG_PID_STR); + assertContains(s, "nlmsg_type{20(SOCK_DIAG_BY_FAMILY)}"); + } +}
diff --git a/tests/unit/src/android/net/shared/ProvisioningConfigurationTest.java b/tests/unit/src/android/net/shared/ProvisioningConfigurationTest.java index 716abaa..436b81a 100644 --- a/tests/unit/src/android/net/shared/ProvisioningConfigurationTest.java +++ b/tests/unit/src/android/net/shared/ProvisioningConfigurationTest.java
@@ -17,22 +17,12 @@ package android.net.shared; import static android.net.InetAddresses.parseNumericAddress; -import static android.net.ip.IIpClient.PROV_IPV4_DHCP; -import static android.net.ip.IIpClient.PROV_IPV4_DISABLED; -import static android.net.ip.IIpClient.PROV_IPV4_STATIC; -import static android.net.ip.IIpClient.PROV_IPV6_DISABLED; -import static android.net.ip.IIpClient.PROV_IPV6_LINKLOCAL; -import static android.net.ip.IIpClient.PROV_IPV6_SLAAC; import static android.net.shared.ProvisioningConfiguration.fromStableParcelable; -import static android.net.shared.ProvisioningConfiguration.ipv4ProvisioningModeToString; -import static android.net.shared.ProvisioningConfiguration.ipv6ProvisioningModeToString; import static com.android.testutils.MiscAsserts.assertFieldCountEquals; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertTrue; import android.net.LinkAddress; import android.net.MacAddress; @@ -86,66 +76,32 @@ return options; } - private ProvisioningConfiguration makeTestProvisioningConfiguration() { - final ProvisioningConfiguration config = new ProvisioningConfiguration(); - config.mUsingMultinetworkPolicyTracker = true; - config.mUsingIpReachabilityMonitor = true; - config.mRequestedPreDhcpActionMs = 42; - config.mInitialConfig = new InitialConfiguration(); - config.mInitialConfig.ipAddresses.add( - new LinkAddress(parseNumericAddress("192.168.42.42"), 24)); - config.mStaticIpConfig = new StaticIpConfiguration(); - config.mStaticIpConfig.ipAddress = - new LinkAddress(parseNumericAddress("2001:db8::42"), 90); - // Not testing other InitialConfig or StaticIpConfig members: they have their own unit tests - config.mApfCapabilities = new ApfCapabilities(1, 2, 3); - config.mProvisioningTimeoutMs = 4200; - config.mIPv6AddrGenMode = 123; - config.mNetwork = new Network(321); - config.mDisplayName = "test_config"; - config.mEnablePreconnection = false; - config.mScanResultInfo = makeScanResultInfo("ssid"); - config.mLayer2Info = new Layer2Information("some l2key", "some cluster", - MacAddress.fromString("00:01:02:03:04:05")); - config.mDhcpOptions = makeCustomizedDhcpOptions((byte) 60, - new String("android-dhcp-11").getBytes()); - config.mIPv4ProvisioningMode = PROV_IPV4_DHCP; - config.mIPv6ProvisioningMode = PROV_IPV6_SLAAC; - return config; - } - - private ProvisioningConfigurationParcelable makeTestProvisioningConfigurationParcelable() { - final ProvisioningConfigurationParcelable p = new ProvisioningConfigurationParcelable(); - p.enableIPv4 = true; - p.enableIPv6 = true; - p.usingMultinetworkPolicyTracker = true; - p.usingIpReachabilityMonitor = true; - p.requestedPreDhcpActionMs = 42; - final InitialConfiguration initialConfig = new InitialConfiguration(); - initialConfig.ipAddresses.add( - new LinkAddress(parseNumericAddress("192.168.42.42"), 24)); - p.initialConfig = initialConfig.toStableParcelable(); - p.staticIpConfig = new StaticIpConfiguration(); - p.staticIpConfig.ipAddress = - new LinkAddress(parseNumericAddress("2001:db8::42"), 90); - p.apfCapabilities = new ApfCapabilities(1, 2, 3); - p.provisioningTimeoutMs = 4200; - p.ipv6AddrGenMode = 123; - p.network = new Network(321); - p.displayName = "test_config"; - p.enablePreconnection = false; - final ScanResultInfo scanResultInfo = makeScanResultInfo("ssid"); - p.scanResultInfo = scanResultInfo.toStableParcelable(); - final Layer2Information layer2Info = new Layer2Information("some l2key", "some cluster", - MacAddress.fromString("00:01:02:03:04:05")); - p.layer2Info = layer2Info.toStableParcelable(); - p.options = makeCustomizedDhcpOptions((byte) 60, new String("android-dhcp-11").getBytes()); - return p; - } - @Before public void setUp() { - mConfig = makeTestProvisioningConfiguration(); + mConfig = new ProvisioningConfiguration(); + mConfig.mEnableIPv4 = true; + mConfig.mEnableIPv6 = true; + mConfig.mUsingMultinetworkPolicyTracker = true; + mConfig.mUsingIpReachabilityMonitor = true; + mConfig.mRequestedPreDhcpActionMs = 42; + mConfig.mInitialConfig = new InitialConfiguration(); + mConfig.mInitialConfig.ipAddresses.add( + new LinkAddress(parseNumericAddress("192.168.42.42"), 24)); + mConfig.mStaticIpConfig = new StaticIpConfiguration(); + mConfig.mStaticIpConfig.ipAddress = + new LinkAddress(parseNumericAddress("2001:db8::42"), 90); + // Not testing other InitialConfig or StaticIpConfig members: they have their own unit tests + mConfig.mApfCapabilities = new ApfCapabilities(1, 2, 3); + mConfig.mProvisioningTimeoutMs = 4200; + mConfig.mIPv6AddrGenMode = 123; + mConfig.mNetwork = new Network(321); + mConfig.mDisplayName = "test_config"; + mConfig.mEnablePreconnection = false; + mConfig.mScanResultInfo = makeScanResultInfo("ssid"); + mConfig.mLayer2Info = new Layer2Information("some l2key", "some cluster", + MacAddress.fromString("00:01:02:03:04:05")); + mConfig.mDhcpOptions = makeCustomizedDhcpOptions((byte) 60, + new String("android-dhcp-11").getBytes()); // Any added field must be included in equals() to be tested properly assertFieldCountEquals(16, ProvisioningConfiguration.class); } @@ -197,43 +153,9 @@ doParcelUnparcelTest(); } - @Test - public void testParcelUnparcel_DisabledIpProvisioningMode() { - mConfig.mIPv4ProvisioningMode = PROV_IPV4_DISABLED; - mConfig.mIPv6ProvisioningMode = PROV_IPV6_DISABLED; - doParcelUnparcelTest(); - - assertFalse(mConfig.toStableParcelable().enableIPv4); - assertFalse(mConfig.toStableParcelable().enableIPv6); - } - - @Test - public void testParcelUnparcel_enabledIpProvisioningMode() { - mConfig.mIPv4ProvisioningMode = PROV_IPV4_DHCP; - mConfig.mIPv6ProvisioningMode = PROV_IPV6_SLAAC; - doParcelUnparcelTest(); - - assertTrue(mConfig.toStableParcelable().enableIPv4); - assertTrue(mConfig.toStableParcelable().enableIPv6); - } - - @Test - public void testParcelUnparcel_IpProvisioningModefromOldStableParcelable() { - final ProvisioningConfigurationParcelable p = makeTestProvisioningConfigurationParcelable(); - final ProvisioningConfiguration unparceled = fromStableParcelable(p, - 11 /* interface version */); - assertEquals(mConfig, unparceled); - } - - @Test - public void testParcelUnparcel_WithIpv6LinkLocalOnly() { - mConfig.mIPv6ProvisioningMode = PROV_IPV6_LINKLOCAL; - doParcelUnparcelTest(); - } - private void doParcelUnparcelTest() { final ProvisioningConfiguration unparceled = - fromStableParcelable(mConfig.toStableParcelable(), 12 /* interface version */); + fromStableParcelable(mConfig.toStableParcelable()); assertEquals(mConfig, unparceled); } @@ -241,6 +163,8 @@ public void testEquals() { assertEquals(mConfig, new ProvisioningConfiguration(mConfig)); + assertNotEqualsAfterChange(c -> c.mEnableIPv4 = false); + assertNotEqualsAfterChange(c -> c.mEnableIPv6 = false); assertNotEqualsAfterChange(c -> c.mUsingMultinetworkPolicyTracker = false); assertNotEqualsAfterChange(c -> c.mUsingIpReachabilityMonitor = false); assertNotEqualsAfterChange(c -> c.mRequestedPreDhcpActionMs++); @@ -274,10 +198,6 @@ new String("vendor-class-identifier").getBytes())); assertNotEqualsAfterChange(c -> c.mDhcpOptions = makeCustomizedDhcpOptions((byte) 77, new String("vendor-class-identifier").getBytes())); - assertNotEqualsAfterChange(c -> c.mIPv4ProvisioningMode = PROV_IPV4_DISABLED); - assertNotEqualsAfterChange(c -> c.mIPv4ProvisioningMode = PROV_IPV4_STATIC); - assertNotEqualsAfterChange(c -> c.mIPv6ProvisioningMode = PROV_IPV6_DISABLED); - assertNotEqualsAfterChange(c -> c.mIPv6ProvisioningMode = PROV_IPV6_LINKLOCAL); assertFieldCountEquals(16, ProvisioningConfiguration.class); } @@ -303,8 +223,7 @@ + " android.net.Layer2InformationParcelable{l2Key: some l2key," + " cluster: some cluster, bssid: %s}," + " options: [android.net.networkstack.aidl.dhcp.DhcpOption{type: 60," - + " value: [97, 110, 100, 114, 111, 105, 100, 45, 100, 104, 99, 112, 45, 49, 49]}]," - + " ipv4ProvisioningMode: 2, ipv6ProvisioningMode: 1}"; + + " value: [97, 110, 100, 114, 111, 105, 100, 45, 100, 104, 99, 112, 45, 49, 49]}]}"; @Test public void testParcelableToString() { @@ -316,17 +235,4 @@ expected = String.format(TEMPLATE, "null"); assertEquals(expected, parcelWithNull.toString()); } - - @Test - public void testIpProvisioningModeToString() { - assertEquals("disabled", ipv4ProvisioningModeToString(PROV_IPV4_DISABLED)); - assertEquals("static", ipv4ProvisioningModeToString(PROV_IPV4_STATIC)); - assertEquals("dhcp", ipv4ProvisioningModeToString(PROV_IPV4_DHCP)); - assertEquals("unknown", ipv4ProvisioningModeToString(0x03 /* unknown mode */)); - - assertEquals("disabled", ipv6ProvisioningModeToString(PROV_IPV6_DISABLED)); - assertEquals("slaac", ipv6ProvisioningModeToString(PROV_IPV6_SLAAC)); - assertEquals("link-local", ipv6ProvisioningModeToString(PROV_IPV6_LINKLOCAL)); - assertEquals("unknown", ipv6ProvisioningModeToString(0x03 /* unknown mode */)); - } }
diff --git a/tests/unit/src/android/net/testutils/TestableNetworkCallbackTest.kt b/tests/unit/src/android/net/testutils/TestableNetworkCallbackTest.kt index 5ca20d8..5b91985 100644 --- a/tests/unit/src/android/net/testutils/TestableNetworkCallbackTest.kt +++ b/tests/unit/src/android/net/testutils/TestableNetworkCallbackTest.kt
@@ -1,6 +1,5 @@ package android.net.testutils -import android.annotation.SuppressLint import android.net.LinkAddress import android.net.LinkProperties import android.net.Network @@ -8,15 +7,6 @@ import com.android.testutils.ConcurrentInterpreter import com.android.testutils.InterpretMatcher import com.android.testutils.RecorderCallback.CallbackEntry -import com.android.testutils.RecorderCallback.CallbackEntry.Companion.AVAILABLE -import com.android.testutils.RecorderCallback.CallbackEntry.Companion.BLOCKED_STATUS -import com.android.testutils.RecorderCallback.CallbackEntry.Companion.LINK_PROPERTIES_CHANGED -import com.android.testutils.RecorderCallback.CallbackEntry.Companion.LOSING -import com.android.testutils.RecorderCallback.CallbackEntry.Companion.NETWORK_CAPS_UPDATED -import com.android.testutils.RecorderCallback.CallbackEntry.Companion.LOST -import com.android.testutils.RecorderCallback.CallbackEntry.Companion.RESUMED -import com.android.testutils.RecorderCallback.CallbackEntry.Companion.SUSPENDED -import com.android.testutils.RecorderCallback.CallbackEntry.Companion.UNAVAILABLE import com.android.testutils.RecorderCallback.CallbackEntry.Available import com.android.testutils.RecorderCallback.CallbackEntry.BlockedStatus import com.android.testutils.RecorderCallback.CallbackEntry.CapabilitiesChanged @@ -43,7 +33,6 @@ const val TEST_INTERFACE_NAME = "testInterfaceName" @RunWith(JUnit4::class) -@SuppressLint("NewApi") // Uses hidden APIs, which the linter would identify as missing APIs. class TestableNetworkCallbackTest { private lateinit var mCallback: TestableNetworkCallback @@ -113,20 +102,6 @@ } @Test - fun testAssertNoCallbackThat() { - val net = Network(101) - mCallback.assertNoCallbackThat { it is Available } - mCallback.onAvailable(net) - // Expect no blocked status change. Receive other callback does not fail the test. - mCallback.assertNoCallbackThat { it is BlockedStatus } - mCallback.onBlockedStatusChanged(net, true) - assertFails { mCallback.assertNoCallbackThat { it is BlockedStatus } } - mCallback.onBlockedStatusChanged(net, false) - mCallback.onCapabilitiesChanged(net, NetworkCapabilities()) - assertFails { mCallback.assertNoCallbackThat { it is CapabilitiesChanged } } - } - - @Test fun testCapabilitiesWithAndWithout() { val net = Network(101) val matcher = makeHasNetwork(101) @@ -270,41 +245,6 @@ onBlockedStatus(199) | poll(1) = BlockedStatus(199) time 0..3 """) } - - @Test - fun testEventuallyExpect() { - // TODO: Current test does not verify the inline one. Also verify the behavior after - // aligning two eventuallyExpect() - val net1 = Network(100) - val net2 = Network(101) - mCallback.onAvailable(net1) - mCallback.onCapabilitiesChanged(net1, NetworkCapabilities()) - mCallback.onLinkPropertiesChanged(net1, LinkProperties()) - mCallback.eventuallyExpect(LINK_PROPERTIES_CHANGED) { - net1.equals(it.network) - } - // No further new callback. Expect no callback. - assertFails { mCallback.eventuallyExpect(LINK_PROPERTIES_CHANGED) } - - // Verify no predicate set. - mCallback.onAvailable(net2) - mCallback.onLinkPropertiesChanged(net2, LinkProperties()) - mCallback.onBlockedStatusChanged(net1, false) - mCallback.eventuallyExpect(BLOCKED_STATUS) { net1.equals(it.network) } - // Verify no callback received if the callback does not happen. - assertFails { mCallback.eventuallyExpect(LOSING) } - } - - @Test - fun testEventuallyExpectOnMultiThreads() { - TNCInterpreter.interpretTestSpec(initial = mCallback, lineShift = 1, - threadTransform = { cb -> cb.createLinkedCopy() }, spec = """ - onAvailable(100) | eventually(CapabilitiesChanged(100), 1) fails - sleep ; onCapabilitiesChanged(100) | eventually(CapabilitiesChanged(100), 2) - onAvailable(101) ; onBlockedStatus(101) | eventually(BlockedStatus(100), 2) fails - onSuspended(100) ; sleep ; onLost(100) | eventually(Lost(100), 2) - """) - } } private object TNCInterpreter : ConcurrentInterpreter<TestableNetworkCallback>(interpretTable) @@ -314,7 +254,6 @@ return CallbackEntry::class.sealedSubclasses.first { it.simpleName == name } } -@SuppressLint("NewApi") // Uses hidden APIs, which the linter would identify as missing APIs. private val interpretTable = listOf<InterpretMatcher<TestableNetworkCallback>>( // Interpret "Available(xx)" as "call to onAvailable with netId xx", and likewise for // all callback types. This is implemented above by enumerating the subclasses of @@ -350,26 +289,5 @@ }, Regex("""poll\((\d+)\)""") to { i, cb, t -> cb.pollForNextCallback(t.timeArg(1)) - }, - // Interpret "eventually(Available(xx), timeout)" as calling eventuallyExpect that expects - // CallbackEntry.AVAILABLE with netId of xx within timeout*INTERPRET_TIME_UNIT timeout, and - // likewise for all callback types. - Regex("""eventually\(($EntryList)\((\d+)\),\s+(\d+)\)""") to { i, cb, t -> - val net = Network(t.intArg(2)) - val timeout = t.timeArg(3) - when (t.strArg(1)) { - "Available" -> cb.eventuallyExpect(AVAILABLE, timeout) { net == it.network } - "Suspended" -> cb.eventuallyExpect(SUSPENDED, timeout) { net == it.network } - "Resumed" -> cb.eventuallyExpect(RESUMED, timeout) { net == it.network } - "Losing" -> cb.eventuallyExpect(LOSING, timeout) { net == it.network } - "Lost" -> cb.eventuallyExpect(LOST, timeout) { net == it.network } - "Unavailable" -> cb.eventuallyExpect(UNAVAILABLE, timeout) { net == it.network } - "BlockedStatus" -> cb.eventuallyExpect(BLOCKED_STATUS, timeout) { net == it.network } - "CapabilitiesChanged" -> - cb.eventuallyExpect(NETWORK_CAPS_UPDATED, timeout) { net == it.network } - "LinkPropertiesChanged" -> - cb.eventuallyExpect(LINK_PROPERTIES_CHANGED, timeout) { net == it.network } - else -> fail("Unknown callback type") - } } )
diff --git a/tests/unit/src/com/android/networkstack/metrics/NetworkIpReachabilityMonitorMetricsTest.java b/tests/unit/src/com/android/networkstack/metrics/NetworkIpReachabilityMonitorMetricsTest.java deleted file mode 100644 index 45592aa..0000000 --- a/tests/unit/src/com/android/networkstack/metrics/NetworkIpReachabilityMonitorMetricsTest.java +++ /dev/null
@@ -1,72 +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.networkstack.metrics; - -import android.stats.connectivity.IpType; -import android.stats.connectivity.NudEventType; -import android.stats.connectivity.NudNeighborType; - -import static org.junit.Assert.assertEquals; - -import androidx.test.filters.SmallTest; -import androidx.test.runner.AndroidJUnit4; - -import org.junit.Test; -import org.junit.runner.RunWith; - -/** - * Tests for IpReachabilityMonitorMetrics. - */ -@RunWith(AndroidJUnit4.class) -@SmallTest -public class NetworkIpReachabilityMonitorMetricsTest { - @Test - public void testIpReachabilityMonitorMetrics_setIpType() throws Exception { - NetworkIpReachabilityMonitorReported mStats; - final IpReachabilityMonitorMetrics mMetrics = new IpReachabilityMonitorMetrics(); - - for (IpType ip : IpType.values()) { - mMetrics.setNudIpType(ip); - mStats = mMetrics.statsWrite(); - assertEquals(ip, mStats.getIpType()); - } - } - - @Test - public void testIpReachabilityMonitorMetrics_setNeighborType() throws Exception { - NetworkIpReachabilityMonitorReported mStats; - final IpReachabilityMonitorMetrics mMetrics = new IpReachabilityMonitorMetrics(); - - for (NudNeighborType neighborType : NudNeighborType.values()) { - mMetrics.setNudNeighborType(neighborType); - mStats = mMetrics.statsWrite(); - assertEquals(neighborType, mStats.getNeighborType()); - } - } - - @Test - public void testIpReachabilityMonitorMetrics_setEventType() { - NetworkIpReachabilityMonitorReported mStats; - final IpReachabilityMonitorMetrics mMetrics = new IpReachabilityMonitorMetrics(); - - for (NudEventType type : NudEventType.values()) { - mMetrics.setNudEventType(type); - mStats = mMetrics.statsWrite(); - assertEquals(type, mStats.getEventType()); - } - } -}
diff --git a/tests/unit/src/com/android/networkstack/netlink/TcpSocketTrackerTest.java b/tests/unit/src/com/android/networkstack/netlink/TcpSocketTrackerTest.java index 198ac99..8fbe0c4 100644 --- a/tests/unit/src/com/android/networkstack/netlink/TcpSocketTrackerTest.java +++ b/tests/unit/src/com/android/networkstack/netlink/TcpSocketTrackerTest.java
@@ -16,6 +16,7 @@ package com.android.networkstack.netlink; +import static android.net.netlink.NetlinkConstants.SOCKDIAG_MSG_HEADER_SIZE; import static android.net.util.DataStallUtils.CONFIG_TCP_PACKETS_FAIL_PERCENTAGE; import static android.net.util.DataStallUtils.DEFAULT_TCP_PACKETS_FAIL_PERCENTAGE; import static android.provider.DeviceConfig.NAMESPACE_CONNECTIVITY; @@ -25,7 +26,6 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession; -import static com.android.net.module.util.netlink.NetlinkConstants.SOCKDIAG_MSG_HEADER_SIZE; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertFalse; @@ -43,6 +43,7 @@ import android.net.INetd; import android.net.MarkMaskParcel; import android.net.Network; +import android.net.netlink.StructNlMsgHdr; import android.os.Build; import android.util.Log; import android.util.Log.TerribleFailureHandler; @@ -50,7 +51,6 @@ import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; -import com.android.net.module.util.netlink.StructNlMsgHdr; import com.android.networkstack.apishim.ConstantsShim; import com.android.networkstack.apishim.NetworkShimImpl; import com.android.testutils.DevSdkIgnoreRule;
diff --git a/tests/unit/src/com/android/networkstack/packets/NeighborAdvertisementTest.java b/tests/unit/src/com/android/networkstack/packets/NeighborAdvertisementTest.java index c689d7b..3317b2b 100644 --- a/tests/unit/src/com/android/networkstack/packets/NeighborAdvertisementTest.java +++ b/tests/unit/src/com/android/networkstack/packets/NeighborAdvertisementTest.java
@@ -19,7 +19,6 @@ import static android.system.OsConstants.ETH_P_IPV6; import static android.system.OsConstants.IPPROTO_ICMPV6; -import static com.android.net.module.util.NetworkStackConstants.ICMPV6_ND_OPTION_TLLA; import static com.android.net.module.util.NetworkStackConstants.ICMPV6_NEIGHBOR_ADVERTISEMENT; import static com.android.net.module.util.NetworkStackConstants.IPV6_ADDR_ALL_ROUTERS_MULTICAST; import static com.android.testutils.MiscAsserts.assertThrows; @@ -91,41 +90,6 @@ // Link-Layer address (byte) 0xea, (byte) 0xbe, (byte) 0x11, (byte) 0x25, (byte) 0xc1, (byte) 0x25, }; - private static final byte[] TEST_GRATUITOUS_NA_WITHOUT_TLLA = new byte[] { - // dst mac address - (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, - // src mac address - (byte) 0xea, (byte) 0xbe, (byte) 0x11, (byte) 0x25, (byte) 0xc1, (byte) 0x25, - // ether type - (byte) 0x86, (byte) 0xdd, - // version, priority and flow label - (byte) 0x60, (byte) 0x00, (byte) 0x00, (byte) 0x00, - // length - (byte) 0x00, (byte) 0x20, - // next header - (byte) 0x3a, - // hop limit - (byte) 0xff, - // source address - (byte) 0xfe, (byte) 0x80, (byte) 0x00, (byte) 0x00, - (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, - (byte) 0xdf, (byte) 0xd9, (byte) 0x50, (byte) 0xa0, - (byte) 0xcc, (byte) 0x7b, (byte) 0x7d, (byte) 0x6d, - // destination address - (byte) 0xff, (byte) 0x02, (byte) 0x00, (byte) 0x00, - (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, - (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, - (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x02, - // ICMP type, code, checksum - (byte) 0x88, (byte) 0x00, (byte) 0x3a, (byte) 0x3c, - // flags - (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, - // target address - (byte) 0x20, (byte) 0x01, (byte) 0x0d, (byte) 0xb8, - (byte) 0x00, (byte) 0x01, (byte) 0x00, (byte) 0x00, - (byte) 0xc9, (byte) 0x28, (byte) 0x25, (byte) 0x0d, - (byte) 0xb9, (byte) 0x0c, (byte) 0x31, (byte) 0x78, - }; private static final byte[] TEST_GRATUITOUS_NA_LESS_LENGTH = new byte[] { // dst mac address (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, @@ -151,10 +115,6 @@ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x02, - // ICMP type, code, checksum - (byte) 0x88, (byte) 0x00, (byte) 0x3a, (byte) 0x3c, - // flags - (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, }; private static final byte[] TEST_GRATUITOUS_NA_TRUNCATED = new byte[] { // dst mac address @@ -192,7 +152,7 @@ (byte) 0xb9, (byte) 0x0c, (byte) 0x31, (byte) 0x78, // TLLA option (byte) 0x02, (byte) 0x01, - // truncatd Link-Layer address: 4bytes + // Link-Layer address (byte) 0xea, (byte) 0xbe, (byte) 0x11, (byte) 0x25, }; @@ -205,8 +165,11 @@ assertArrayEquals(na.array(), TEST_GRATUITOUS_NA); } - private void assertNeighborAdvertisement(final NeighborAdvertisement na, - boolean hasTllaOption) { + @Test + public void testGratuitousNa_parse() throws Exception { + final NeighborAdvertisement na = NeighborAdvertisement.parse(TEST_GRATUITOUS_NA, + TEST_GRATUITOUS_NA.length); + assertArrayEquals(TEST_SOURCE_MAC_ADDR, na.ethHdr.srcMac.toByteArray()); assertArrayEquals(TEST_DST_MAC_ADDR, na.ethHdr.dstMac.toByteArray()); assertEquals(ETH_P_IPV6, na.ethHdr.etherType); @@ -218,46 +181,20 @@ assertEquals(0, na.icmpv6Hdr.code); assertEquals(0, na.naHdr.flags); assertEquals(TEST_TARGET_ADDR, na.naHdr.target); - if (hasTllaOption) { - assertEquals(ICMPV6_ND_OPTION_TLLA, na.tlla.type); - assertEquals(1, na.tlla.length); - assertArrayEquals(TEST_SOURCE_MAC_ADDR, na.tlla.linkLayerAddress.toByteArray()); - } - } + assertEquals(2, na.tlla.type); + assertEquals(1, na.tlla.length); + assertArrayEquals(TEST_SOURCE_MAC_ADDR, na.tlla.linkLayerAddress.toByteArray()); - @Test - public void testGratuitousNa_parse() throws Exception { - final NeighborAdvertisement na = NeighborAdvertisement.parse(TEST_GRATUITOUS_NA, - TEST_GRATUITOUS_NA.length); - - assertNeighborAdvertisement(na, true /* hasTllaOption */); assertArrayEquals(TEST_GRATUITOUS_NA, na.toByteBuffer().array()); } @Test - public void testGratuitousNa_parseWithoutTllaOption() throws Exception { - final NeighborAdvertisement na = - NeighborAdvertisement.parse(TEST_GRATUITOUS_NA_WITHOUT_TLLA, - TEST_GRATUITOUS_NA_WITHOUT_TLLA.length); - - assertNeighborAdvertisement(na, false /* hasTllaOption */); - assertArrayEquals(TEST_GRATUITOUS_NA_WITHOUT_TLLA, na.toByteBuffer().array()); - } - - @Test - public void testGratuitousNa_zeroPacketLength() throws Exception { + public void testGratuitousNa_invalidByteBufferParameters() throws Exception { assertThrows(NeighborAdvertisement.ParseException.class, () -> NeighborAdvertisement.parse(TEST_GRATUITOUS_NA, 0)); } @Test - public void testGratuitousNa_invalidByteBufferLength() throws Exception { - assertThrows(NeighborAdvertisement.ParseException.class, - () -> NeighborAdvertisement.parse(TEST_GRATUITOUS_NA_TRUNCATED, - TEST_GRATUITOUS_NA.length)); - } - - @Test public void testGratuitousNa_lessPacketLength() throws Exception { assertThrows(NeighborAdvertisement.ParseException.class, () -> NeighborAdvertisement.parse(TEST_GRATUITOUS_NA_LESS_LENGTH,
diff --git a/tests/unit/src/com/android/networkstack/packets/NeighborSolicitationTest.java b/tests/unit/src/com/android/networkstack/packets/NeighborSolicitationTest.java deleted file mode 100644 index 18a3ef3..0000000 --- a/tests/unit/src/com/android/networkstack/packets/NeighborSolicitationTest.java +++ /dev/null
@@ -1,273 +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.networkstack.packets; - -import static android.system.OsConstants.ETH_P_IPV6; -import static android.system.OsConstants.IPPROTO_ICMPV6; - -import static com.android.net.module.util.NetworkStackConstants.ICMPV6_ND_OPTION_SLLA; -import static com.android.net.module.util.NetworkStackConstants.ICMPV6_NEIGHBOR_SOLICITATION; -import static com.android.testutils.MiscAsserts.assertThrows; - -import static org.junit.Assert.assertArrayEquals; -import static org.junit.Assert.assertEquals; - -import android.net.InetAddresses; -import android.net.MacAddress; - -import androidx.test.filters.SmallTest; -import androidx.test.runner.AndroidJUnit4; - -import org.junit.Test; -import org.junit.runner.RunWith; - -import java.net.Inet6Address; -import java.nio.ByteBuffer; - -@RunWith(AndroidJUnit4.class) -@SmallTest -public final class NeighborSolicitationTest { - private static final Inet6Address TEST_SRC_ADDR = - (Inet6Address) InetAddresses.parseNumericAddress("fe80::d419:d664:df38:2f65"); - private static final Inet6Address TEST_DST_ADDR = - (Inet6Address) InetAddresses.parseNumericAddress("fe80::200:1a:1122:3344"); - private static final Inet6Address TEST_TARGET_ADDR = - (Inet6Address) InetAddresses.parseNumericAddress("fe80::200:1a:1122:3344"); - private static final byte[] TEST_SOURCE_MAC_ADDR = new byte[] { - (byte) 0x06, (byte) 0x5a, (byte) 0xac, (byte) 0x02, (byte) 0x61, (byte) 0x11, - }; - private static final byte[] TEST_DST_MAC_ADDR = new byte[] { - (byte) 0x00, (byte) 0x1a, (byte) 0x11, (byte) 0x22, (byte) 0x33, (byte) 0x44, - }; - private static final byte[] TEST_NEIGHBOR_SOLICITATION = new byte[] { - // dst mac address - (byte) 0x00, (byte) 0x1a, (byte) 0x11, (byte) 0x22, (byte) 0x33, (byte) 0x44, - // src mac address - (byte) 0x06, (byte) 0x5a, (byte) 0xac, (byte) 0x02, (byte) 0x61, (byte) 0x11, - // ether type - (byte) 0x86, (byte) 0xdd, - // version, priority and flow label - (byte) 0x60, (byte) 0x00, (byte) 0x00, (byte) 0x00, - // length - (byte) 0x00, (byte) 0x20, - // next header - (byte) 0x3a, - // hop limit - (byte) 0xff, - // source address - (byte) 0xfe, (byte) 0x80, (byte) 0x00, (byte) 0x00, - (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, - (byte) 0xd4, (byte) 0x19, (byte) 0xd6, (byte) 0x64, - (byte) 0xdf, (byte) 0x38, (byte) 0x2f, (byte) 0x65, - // destination address - (byte) 0xfe, (byte) 0x80, (byte) 0x00, (byte) 0x00, - (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, - (byte) 0x02, (byte) 0x00, (byte) 0x00, (byte) 0x1a, - (byte) 0x11, (byte) 0x22, (byte) 0x33, (byte) 0x44, - // ICMP type, code, checksum - (byte) 0x87, (byte) 0x00, (byte) 0x22, (byte) 0x96, - // reserved - (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, - // target address - (byte) 0xfe, (byte) 0x80, (byte) 0x00, (byte) 0x00, - (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, - (byte) 0x02, (byte) 0x00, (byte) 0x00, (byte) 0x1a, - (byte) 0x11, (byte) 0x22, (byte) 0x33, (byte) 0x44, - // slla option - (byte) 0x01, (byte) 0x01, - // link-layer address - (byte) 0x06, (byte) 0x5a, (byte) 0xac, (byte) 0x02, - (byte) 0x61, (byte) 0x11, - }; - private static final byte[] TEST_NEIGHBOR_SOLICITATION_WITHOUT_SLLA = new byte[] { - // dst mac address - (byte) 0x00, (byte) 0x1a, (byte) 0x11, (byte) 0x22, (byte) 0x33, (byte) 0x44, - // src mac address - (byte) 0x06, (byte) 0x5a, (byte) 0xac, (byte) 0x02, (byte) 0x61, (byte) 0x11, - // ether type - (byte) 0x86, (byte) 0xdd, - // version, priority and flow label - (byte) 0x60, (byte) 0x00, (byte) 0x00, (byte) 0x00, - // length - (byte) 0x00, (byte) 0x20, - // next header - (byte) 0x3a, - // hop limit - (byte) 0xff, - // source address - (byte) 0xfe, (byte) 0x80, (byte) 0x00, (byte) 0x00, - (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, - (byte) 0xd4, (byte) 0x19, (byte) 0xd6, (byte) 0x64, - (byte) 0xdf, (byte) 0x38, (byte) 0x2f, (byte) 0x65, - // destination address - (byte) 0xfe, (byte) 0x80, (byte) 0x00, (byte) 0x00, - (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, - (byte) 0x02, (byte) 0x00, (byte) 0x00, (byte) 0x1a, - (byte) 0x11, (byte) 0x22, (byte) 0x33, (byte) 0x44, - // ICMP type, code, checksum - (byte) 0x87, (byte) 0x00, (byte) 0x22, (byte) 0x96, - // reserved - (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, - // target address - (byte) 0xfe, (byte) 0x80, (byte) 0x00, (byte) 0x00, - (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, - (byte) 0x02, (byte) 0x00, (byte) 0x00, (byte) 0x1a, - (byte) 0x11, (byte) 0x22, (byte) 0x33, (byte) 0x44, - }; - private static final byte[] TEST_NEIGHBOR_SOLICITATION_LESS_LENGTH = new byte[] { - // dst mac address - (byte) 0x00, (byte) 0x1a, (byte) 0x11, (byte) 0x22, (byte) 0x33, (byte) 0x44, - // src mac address - (byte) 0x06, (byte) 0x5a, (byte) 0xac, (byte) 0x02, (byte) 0x61, (byte) 0x11, - // ether type - (byte) 0x86, (byte) 0xdd, - // version, priority and flow label - (byte) 0x60, (byte) 0x00, (byte) 0x00, (byte) 0x00, - // length - (byte) 0x00, (byte) 0x20, - // next header - (byte) 0x3a, - // hop limit - (byte) 0xff, - // source address - (byte) 0xfe, (byte) 0x80, (byte) 0x00, (byte) 0x00, - (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, - (byte) 0xd4, (byte) 0x19, (byte) 0xd6, (byte) 0x64, - (byte) 0xdf, (byte) 0x38, (byte) 0x2f, (byte) 0x65, - // destination address - (byte) 0xfe, (byte) 0x80, (byte) 0x00, (byte) 0x00, - (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, - (byte) 0x02, (byte) 0x00, (byte) 0x00, (byte) 0x1a, - (byte) 0x11, (byte) 0x22, (byte) 0x33, (byte) 0x44, - // ICMP type, code, checksum - (byte) 0x87, (byte) 0x00, (byte) 0x22, (byte) 0x96, - // reserved - (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, - }; - private static final byte[] TEST_NEIGHBOR_SOLICITATION_TRUNCATED = new byte[] { - // dst mac address - (byte) 0x00, (byte) 0x1a, (byte) 0x11, (byte) 0x22, (byte) 0x33, (byte) 0x44, - // src mac address - (byte) 0x06, (byte) 0x5a, (byte) 0xac, (byte) 0x02, (byte) 0x61, (byte) 0x11, - // ether type - (byte) 0x86, (byte) 0xdd, - // version, priority and flow label - (byte) 0x60, (byte) 0x00, (byte) 0x00, (byte) 0x00, - // length - (byte) 0x00, (byte) 0x20, - // next header - (byte) 0x3a, - // hop limit - (byte) 0xff, - // source address - (byte) 0xfe, (byte) 0x80, (byte) 0x00, (byte) 0x00, - (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, - (byte) 0xd4, (byte) 0x19, (byte) 0xd6, (byte) 0x64, - (byte) 0xdf, (byte) 0x38, (byte) 0x2f, (byte) 0x65, - // destination address - (byte) 0xfe, (byte) 0x80, (byte) 0x00, (byte) 0x00, - (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, - (byte) 0x02, (byte) 0x00, (byte) 0x00, (byte) 0x1a, - (byte) 0x11, (byte) 0x22, (byte) 0x33, (byte) 0x44, - // ICMP type, code, checksum - (byte) 0x87, (byte) 0x00, (byte) 0x22, (byte) 0x96, - // reserved - (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, - // target address - (byte) 0xfe, (byte) 0x80, (byte) 0x00, (byte) 0x00, - (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, - (byte) 0x02, (byte) 0x00, (byte) 0x00, (byte) 0x1a, - (byte) 0x11, (byte) 0x22, (byte) 0x33, (byte) 0x44, - // slla option - (byte) 0x01, (byte) 0x01, - // truncatd link-layer address: 4bytes - (byte) 0x06, (byte) 0x5a, (byte) 0xac, (byte) 0x02, - }; - - @Test - public void testNeighborSolicitation_build() throws Exception { - final ByteBuffer ns = NeighborSolicitation.build( - MacAddress.fromBytes(TEST_SOURCE_MAC_ADDR), - MacAddress.fromBytes(TEST_DST_MAC_ADDR), - TEST_SRC_ADDR, TEST_DST_ADDR, TEST_TARGET_ADDR); - assertArrayEquals(ns.array(), TEST_NEIGHBOR_SOLICITATION); - } - - private void assertNeighborSolicitation(final NeighborSolicitation ns, boolean hasSllaOption) { - assertArrayEquals(TEST_SOURCE_MAC_ADDR, ns.ethHdr.srcMac.toByteArray()); - assertArrayEquals(TEST_DST_MAC_ADDR, ns.ethHdr.dstMac.toByteArray()); - assertEquals(ETH_P_IPV6, ns.ethHdr.etherType); - assertEquals(IPPROTO_ICMPV6, ns.ipv6Hdr.nextHeader); - assertEquals(0xff, ns.ipv6Hdr.hopLimit); - assertEquals(TEST_DST_ADDR, ns.ipv6Hdr.dstIp); - assertEquals(TEST_SRC_ADDR, ns.ipv6Hdr.srcIp); - assertEquals(ICMPV6_NEIGHBOR_SOLICITATION, ns.icmpv6Hdr.type); - assertEquals(0, ns.icmpv6Hdr.code); - assertEquals(TEST_TARGET_ADDR, ns.nsHdr.target); - if (hasSllaOption) { - assertEquals(ICMPV6_ND_OPTION_SLLA, ns.slla.type); - assertEquals(1, ns.slla.length); - assertEquals(MacAddress.fromBytes(TEST_SOURCE_MAC_ADDR), ns.slla.linkLayerAddress); - } - } - - @Test - public void testNeighborSolicitation_parse() throws Exception { - final NeighborSolicitation ns = NeighborSolicitation.parse(TEST_NEIGHBOR_SOLICITATION, - TEST_NEIGHBOR_SOLICITATION.length); - - assertNeighborSolicitation(ns, true /* hasSllaOption */); - assertArrayEquals(TEST_NEIGHBOR_SOLICITATION, ns.toByteBuffer().array()); - } - - @Test - public void testNeighborSolicitation_parseWithoutSllaOption() throws Exception { - final NeighborSolicitation ns = - NeighborSolicitation.parse(TEST_NEIGHBOR_SOLICITATION_WITHOUT_SLLA, - TEST_NEIGHBOR_SOLICITATION_WITHOUT_SLLA.length); - - assertNeighborSolicitation(ns, false /* hasSllaOption */); - assertArrayEquals(TEST_NEIGHBOR_SOLICITATION_WITHOUT_SLLA, ns.toByteBuffer().array()); - } - - @Test - public void testNeighborSolicitation_invalidPacketLength() throws Exception { - assertThrows(NeighborSolicitation.ParseException.class, - () -> NeighborSolicitation.parse(TEST_NEIGHBOR_SOLICITATION, 0)); - } - - @Test - public void testNeighborSolicitation_invalidByteBufferLength() throws Exception { - assertThrows(NeighborSolicitation.ParseException.class, - () -> NeighborSolicitation.parse(TEST_NEIGHBOR_SOLICITATION_TRUNCATED, - TEST_NEIGHBOR_SOLICITATION.length)); - } - - @Test - public void testNeighborSolicitation_lessPacketLength() throws Exception { - assertThrows(NeighborSolicitation.ParseException.class, - () -> NeighborSolicitation.parse(TEST_NEIGHBOR_SOLICITATION_LESS_LENGTH, - TEST_NEIGHBOR_SOLICITATION_LESS_LENGTH.length)); - } - - @Test - public void testNeighborSolicitation_truncatedPacket() throws Exception { - assertThrows(IllegalArgumentException.class, - () -> NeighborSolicitation.parse(TEST_NEIGHBOR_SOLICITATION_TRUNCATED, - TEST_NEIGHBOR_SOLICITATION_TRUNCATED.length)); - } -}
diff --git a/tests/unit/src/com/android/server/NetworkStackServiceTest.kt b/tests/unit/src/com/android/server/NetworkStackServiceTest.kt index cf65cd7..b32a419 100644 --- a/tests/unit/src/com/android/server/NetworkStackServiceTest.kt +++ b/tests/unit/src/com/android/server/NetworkStackServiceTest.kt
@@ -43,6 +43,7 @@ import com.android.testutils.DevSdkIgnoreRule import com.android.testutils.DevSdkIgnoreRule.IgnoreAfter import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo +import com.android.testutils.ExceptionUtils import com.android.testutils.assertThrows import org.junit.Rule import org.junit.Test @@ -206,10 +207,10 @@ verify(mockDhcpCb, times(2)).onDhcpServerCreated(eq(IDhcpServer.STATUS_SUCCESS), any()) // allowTestUid does not need to record the caller's version - assertThrows(SecurityException::class.java) { + assertThrows(SecurityException::class.java, ExceptionUtils.ThrowingRunnable { // Should throw because the test does not run as root connector.allowTestUid(Process.myUid(), null) - } + }) // Verify all methods were covered by the test (5 methods + getVersion + getHash) assertEquals(7, INetworkStackConnector::class.declaredMemberFunctions.count {
diff --git a/tests/unit/src/com/android/server/connectivity/NetworkMonitorTest.java b/tests/unit/src/com/android/server/connectivity/NetworkMonitorTest.java index ff43325..f010007 100644 --- a/tests/unit/src/com/android/server/connectivity/NetworkMonitorTest.java +++ b/tests/unit/src/com/android/server/connectivity/NetworkMonitorTest.java
@@ -16,9 +16,7 @@ package com.android.server.connectivity; -import static android.content.Intent.ACTION_CONFIGURATION_CHANGED; import static android.net.CaptivePortal.APP_RETURN_DISMISSED; -import static android.net.CaptivePortal.APP_RETURN_WANTED_AS_IS; import static android.net.DnsResolver.TYPE_A; import static android.net.DnsResolver.TYPE_AAAA; import static android.net.INetworkMonitor.NETWORK_VALIDATION_PROBE_DNS; @@ -27,14 +25,9 @@ import static android.net.INetworkMonitor.NETWORK_VALIDATION_PROBE_HTTPS; import static android.net.INetworkMonitor.NETWORK_VALIDATION_PROBE_PRIVDNS; import static android.net.INetworkMonitor.NETWORK_VALIDATION_RESULT_PARTIAL; -import static android.net.INetworkMonitor.NETWORK_VALIDATION_RESULT_SKIPPED; import static android.net.INetworkMonitor.NETWORK_VALIDATION_RESULT_VALID; import static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET; import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_METERED; -import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED; -import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED; -import static android.net.NetworkCapabilities.NET_CAPABILITY_OEM_PAID; -import static android.net.NetworkCapabilities.NET_CAPABILITY_TRUSTED; import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR; import static android.net.NetworkCapabilities.TRANSPORT_VPN; import static android.net.NetworkCapabilities.TRANSPORT_WIFI; @@ -98,7 +91,6 @@ import static java.util.stream.Collectors.toList; import android.annotation.NonNull; -import android.annotation.SuppressLint; import android.content.BroadcastReceiver; import android.content.Context; import android.content.ContextWrapper; @@ -163,7 +155,6 @@ import com.android.server.connectivity.nano.DnsEvent; import com.android.server.connectivity.nano.WifiData; import com.android.testutils.DevSdkIgnoreRule; -import com.android.testutils.DevSdkIgnoreRule.IgnoreAfter; import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo; import com.android.testutils.HandlerUtils; @@ -210,7 +201,6 @@ @RunWith(AndroidJUnit4.class) @SmallTest -@SuppressLint("NewApi") // Uses hidden APIs, which the linter would identify as missing APIs. public class NetworkMonitorTest { private static final String LOCATION_HEADER = "location"; private static final String CONTENT_TYPE_HEADER = "Content-Type"; @@ -325,14 +315,6 @@ private static final NetworkCapabilities CELL_NO_INTERNET_CAPABILITIES = new NetworkCapabilities().addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR); - private static final NetworkCapabilities WIFI_OEM_PAID_CAPABILITIES = - new NetworkCapabilities() - .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) - .addCapability(NET_CAPABILITY_INTERNET) - .addCapability(NET_CAPABILITY_NOT_METERED) - .addCapability(NET_CAPABILITY_OEM_PAID) - .removeCapability(NET_CAPABILITY_NOT_RESTRICTED); - /** * Fakes DNS responses. * @@ -590,7 +572,7 @@ } private void resetCallbacks() { - resetCallbacks(11); + resetCallbacks(6); } private void resetCallbacks(int interfaceVersion) { @@ -638,7 +620,6 @@ @Override protected void onQuitting() { - super.onQuitting(); assertTrue(mCreatedNetworkMonitors.remove(this)); mQuitCv.open(); } @@ -865,6 +846,7 @@ @Test public void testGetHttpProbeUrl() { + final WrappedNetworkMonitor wnm = makeCellNotMeteredNetworkMonitor(); // If config_captive_portal_http_url is set and the global setting is set, the config is // used. doReturn(TEST_HTTP_URL).when(mResources).getString(R.string.config_captive_portal_http_url); @@ -872,21 +854,16 @@ R.string.default_captive_portal_http_url); when(mDependencies.getSetting(any(), eq(Settings.Global.CAPTIVE_PORTAL_HTTP_URL), any())) .thenReturn(TEST_HTTP_OTHER_URL1); - final WrappedNetworkMonitor wnm = makeCellNotMeteredNetworkMonitor(); - assertEquals(TEST_HTTP_URL, wnm.getCaptivePortalServerHttpUrl(mContext)); + assertEquals(TEST_HTTP_URL, wnm.getCaptivePortalServerHttpUrl()); // If config_captive_portal_http_url is unset and the global setting is set, the global // setting is used. doReturn(null).when(mResources).getString(R.string.config_captive_portal_http_url); - assertEquals(TEST_HTTP_OTHER_URL1, wnm.getCaptivePortalServerHttpUrl(mContext)); + assertEquals(TEST_HTTP_OTHER_URL1, wnm.getCaptivePortalServerHttpUrl()); // If both config_captive_portal_http_url and global setting are unset, - // default_captive_portal_http_url is used. But the global setting will only be read in the - // constructor. + // default_captive_portal_http_url is used. when(mDependencies.getSetting(any(), eq(Settings.Global.CAPTIVE_PORTAL_HTTP_URL), any())) .thenReturn(null); - assertEquals(TEST_HTTP_OTHER_URL1, wnm.getCaptivePortalServerHttpUrl(mContext)); - // default_captive_portal_http_url is used when the configuration is applied in new NM. - final WrappedNetworkMonitor wnm2 = makeCellNotMeteredNetworkMonitor(); - assertEquals(TEST_HTTP_OTHER_URL2, wnm2.getCaptivePortalServerHttpUrl(mContext)); + assertEquals(TEST_HTTP_OTHER_URL2, wnm.getCaptivePortalServerHttpUrl()); } @Test @@ -943,57 +920,6 @@ } } - @Test - public void testConfigurationChange_BeforeNMConnected() throws Exception { - final WrappedNetworkMonitor nm = new WrappedNetworkMonitor(); - final ArgumentCaptor<BroadcastReceiver> receiverCaptor = - ArgumentCaptor.forClass(BroadcastReceiver.class); - - // Verify configuration change receiver is registered after start(). - verify(mContext, never()).registerReceiver(receiverCaptor.capture(), - argThat(receiver -> ACTION_CONFIGURATION_CHANGED.equals(receiver.getAction(0)))); - nm.start(); - mCreatedNetworkMonitors.add(nm); - HandlerUtils.waitForIdle(nm.getHandler(), HANDLER_TIMEOUT_MS); - verify(mContext, times(1)).registerReceiver(receiverCaptor.capture(), - argThat(receiver -> ACTION_CONFIGURATION_CHANGED.equals(receiver.getAction(0)))); - // Update a new URL and send a configuration change - doReturn(TEST_HTTPS_OTHER_URL1).when(mResources).getString( - R.string.config_captive_portal_https_url); - receiverCaptor.getValue().onReceive(mContext, new Intent(ACTION_CONFIGURATION_CHANGED)); - HandlerUtils.waitForIdle(nm.getHandler(), HANDLER_TIMEOUT_MS); - // Should stay in default state before receiving CMD_NETWORK_CONNECTED - verify(mOtherHttpsConnection1, never()).getResponseCode(); - } - - @Test - public void testIsCaptivePortal_ConfigurationChange_RenewUrls() throws Exception { - setStatus(mHttpsConnection, 204); - final NetworkMonitor nm = runValidatedNetworkTest(); - final ArgumentCaptor<BroadcastReceiver> receiverCaptor = - ArgumentCaptor.forClass(BroadcastReceiver.class); - verify(mContext, times(1)).registerReceiver(receiverCaptor.capture(), - argThat(receiver -> ACTION_CONFIGURATION_CHANGED.equals(receiver.getAction(0)))); - - resetCallbacks(); - // New URLs with partial connectivity - doReturn(TEST_HTTPS_OTHER_URL1).when(mResources).getString( - R.string.config_captive_portal_https_url); - doReturn(TEST_HTTP_OTHER_URL1).when(mResources).getString( - R.string.config_captive_portal_http_url); - setStatus(mOtherHttpsConnection1, 500); - setStatus(mOtherHttpConnection1, 204); - - // Receive configuration. Expect a reevaluation triggered. - receiverCaptor.getValue().onReceive(mContext, new Intent(ACTION_CONFIGURATION_CHANGED)); - - HandlerUtils.waitForIdle(nm.getHandler(), HANDLER_TIMEOUT_MS); - verifyNetworkTested(NETWORK_VALIDATION_RESULT_PARTIAL, - NETWORK_VALIDATION_PROBE_DNS | NETWORK_VALIDATION_PROBE_HTTP); - verify(mOtherHttpsConnection1, times(1)).getResponseCode(); - verify(mOtherHttpConnection1, times(1)).getResponseCode(); - } - private CellInfoGsm makeTestCellInfoGsm(String mcc) throws Exception { final CellInfoGsm info = new CellInfoGsm(); final CellIdentityGsm ci = makeCellIdentityGsm(0, 0, 0, 0, mcc, "01", "", ""); @@ -1024,7 +950,7 @@ public void testMakeFallbackUrls() throws Exception { final WrappedNetworkMonitor wnm = makeCellNotMeteredNetworkMonitor(); // Value exist in setting provider. - URL[] urls = wnm.makeCaptivePortalFallbackUrls(mContext); + URL[] urls = wnm.makeCaptivePortalFallbackUrls(); assertEquals(urls[0].toString(), TEST_FALLBACK_URL); // Clear setting provider value. Verify it to get configuration from resource instead. @@ -1032,13 +958,13 @@ // Verify that getting resource with exception. when(mResources.getStringArray(R.array.config_captive_portal_fallback_urls)) .thenThrow(Resources.NotFoundException.class); - urls = wnm.makeCaptivePortalFallbackUrls(mContext); + urls = wnm.makeCaptivePortalFallbackUrls(); assertEquals(urls.length, 0); // Verify resource return 2 different URLs. doReturn(new String[] {"http://testUrl1.com", "http://testUrl2.com"}).when(mResources) .getStringArray(R.array.config_captive_portal_fallback_urls); - urls = wnm.makeCaptivePortalFallbackUrls(mContext); + urls = wnm.makeCaptivePortalFallbackUrls(); assertEquals(urls.length, 2); assertEquals("http://testUrl1.com", urls[0].toString()); assertEquals("http://testUrl2.com", urls[1].toString()); @@ -1049,7 +975,7 @@ setupNoSimCardNeighborMcc(); doReturn(new String[] {"http://testUrl3.com"}).when(mMccResource) .getStringArray(R.array.config_captive_portal_fallback_urls); - urls = wnm.makeCaptivePortalFallbackUrls(mContext); + urls = wnm.makeCaptivePortalFallbackUrls(); assertEquals(urls.length, 2); assertEquals("http://testUrl1.com", urls[0].toString()); assertEquals("http://testUrl2.com", urls[1].toString()); @@ -1062,7 +988,7 @@ doReturn(new String[] {"http://testUrl.com"}).when(mMccResource) .getStringArray(R.array.config_captive_portal_fallback_urls); final WrappedNetworkMonitor wnm = makeCellNotMeteredNetworkMonitor(); - final URL[] urls = wnm.makeCaptivePortalFallbackUrls(mMccContext); + final URL[] urls = wnm.makeCaptivePortalFallbackUrls(); assertEquals(urls.length, 1); assertEquals("http://testUrl.com", urls[0].toString()); } @@ -1142,34 +1068,6 @@ runPortalNetworkTest(); } - @Test - public void testIsCaptivePortal_Http200EmptyResponse() throws Exception { - setSslException(mHttpsConnection); - setStatus(mHttpConnection, 200); - // Invalid if there is no content (can't login to an empty page) - runNetworkTest(VALIDATION_RESULT_INVALID, 0 /* probesSucceeded */, null); - verify(mCallbacks, never()).showProvisioningNotification(any(), any()); - } - - private void doCaptivePortal200ResponseTest(String expectedRedirectUrl) throws Exception { - setSslException(mHttpsConnection); - setStatus(mHttpConnection, 200); - doReturn(100L).when(mHttpConnection).getContentLengthLong(); - // Redirect URL was null before S - runNetworkTest(VALIDATION_RESULT_PORTAL, 0 /* probesSucceeded */, expectedRedirectUrl); - verify(mCallbacks, timeout(HANDLER_TIMEOUT_MS)).showProvisioningNotification(any(), any()); - } - - @Test @IgnoreAfter(Build.VERSION_CODES.R) - public void testIsCaptivePortal_HttpProbeIs200Portal_R() throws Exception { - doCaptivePortal200ResponseTest(null); - } - - @Test @IgnoreUpTo(Build.VERSION_CODES.R) - public void testIsCaptivePortal_HttpProbeIs200Portal() throws Exception { - doCaptivePortal200ResponseTest(TEST_HTTP_URL); - } - private void setupPrivateIpResponse(String privateAddr) throws Exception { setSslException(mHttpsConnection); setPortal302(mHttpConnection); @@ -1853,105 +1751,25 @@ runFailedNetworkTest(); } - private void doValidationSkippedTest(NetworkCapabilities nc, int validationResult) - throws Exception { - runNetworkTest(TEST_LINK_PROPERTIES, nc, validationResult, - 0 /* probesSucceeded */, null /* redirectUrl */); + @Test + public void testNoInternetCapabilityValidated() throws Exception { + runNetworkTest(TEST_LINK_PROPERTIES, CELL_NO_INTERNET_CAPABILITIES, + NETWORK_VALIDATION_RESULT_VALID, 0 /* probesSucceeded */, null /* redirectUrl */); verify(mCleartextDnsNetwork, never()).openConnection(any()); } @Test - public void testNoInternetCapabilityValidated() throws Exception { - doValidationSkippedTest(CELL_NO_INTERNET_CAPABILITIES, - NETWORK_VALIDATION_RESULT_VALID | NETWORK_VALIDATION_RESULT_SKIPPED); - } - - @Test - public void testNoInternetCapabilityValidated_OlderPlatform() throws Exception { - // Before callbacks version 11, NETWORK_VALIDATION_RESULT_SKIPPED is not sent - resetCallbacks(10); - doValidationSkippedTest(CELL_NO_INTERNET_CAPABILITIES, NETWORK_VALIDATION_RESULT_VALID); - } - - @Test - public void testNoTrustedCapabilityValidated() throws Exception { - // Cannot use the NetworkCapabilities builder on Q - final NetworkCapabilities nc = new NetworkCapabilities() - .addCapability(NET_CAPABILITY_INTERNET) - .removeCapability(NET_CAPABILITY_TRUSTED) - .addTransportType(TRANSPORT_CELLULAR); - if (ShimUtils.isAtLeastS()) { - nc.addCapability(NET_CAPABILITY_NOT_VCN_MANAGED); - } - doValidationSkippedTest(nc, - NETWORK_VALIDATION_RESULT_VALID | NETWORK_VALIDATION_RESULT_SKIPPED); - } - - @Test - public void testRestrictedCapabilityValidated() throws Exception { - // Cannot use the NetworkCapabilities builder on Q - final NetworkCapabilities nc = new NetworkCapabilities() - .addCapability(NET_CAPABILITY_INTERNET) - .removeCapability(NET_CAPABILITY_NOT_RESTRICTED) - .addTransportType(TRANSPORT_CELLULAR); - if (ShimUtils.isAtLeastS()) { - nc.addCapability(NET_CAPABILITY_NOT_VCN_MANAGED); - } - doValidationSkippedTest(nc, - NETWORK_VALIDATION_RESULT_VALID | NETWORK_VALIDATION_RESULT_SKIPPED); - } - - private NetworkCapabilities getVcnUnderlyingCarrierWifiCaps() { - // Must be called from within the test because NOT_VCN_MANAGED is an invalid capability - // value up to Android R. Thus, this must be guarded by an SDK check in tests that use this. - return new NetworkCapabilities.Builder() - .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) - .removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED) - .removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED) - .removeCapability(NetworkCapabilities.NET_CAPABILITY_TRUSTED) - .addCapability(NET_CAPABILITY_INTERNET) - .build(); - } - - @Test - public void testVcnUnderlyingNetwork() throws Exception { - assumeTrue(ShimUtils.isAtLeastS()); - setStatus(mHttpsConnection, 204); - setStatus(mHttpConnection, 204); - - final NetworkMonitor nm = runNetworkTest( - TEST_LINK_PROPERTIES, getVcnUnderlyingCarrierWifiCaps(), - NETWORK_VALIDATION_RESULT_VALID, - NETWORK_VALIDATION_PROBE_DNS | NETWORK_VALIDATION_PROBE_HTTPS, - null /* redirectUrl */); - assertEquals(NETWORK_VALIDATION_RESULT_VALID, - nm.getEvaluationState().getEvaluationResult()); - } - - @Test - public void testVcnUnderlyingNetworkBadNetwork() throws Exception { - assumeTrue(ShimUtils.isAtLeastS()); - setSslException(mHttpsConnection); - setStatus(mHttpConnection, 500); - setStatus(mFallbackConnection, 404); - - final NetworkMonitor nm = runNetworkTest( - TEST_LINK_PROPERTIES, getVcnUnderlyingCarrierWifiCaps(), - VALIDATION_RESULT_INVALID, 0 /* probesSucceeded */, null /* redirectUrl */); - assertEquals(VALIDATION_RESULT_INVALID, - nm.getEvaluationState().getEvaluationResult()); - } - - public void setupAndLaunchCaptivePortalApp(final NetworkMonitor nm) throws Exception { + public void testLaunchCaptivePortalApp() throws Exception { setSslException(mHttpsConnection); setPortal302(mHttpConnection); when(mHttpConnection.getHeaderField(eq("location"))).thenReturn(TEST_LOGIN_URL); + final NetworkMonitor nm = makeMonitor(CELL_METERED_CAPABILITIES); notifyNetworkConnected(nm, CELL_METERED_CAPABILITIES); verify(mCallbacks, timeout(HANDLER_TIMEOUT_MS).times(1)) .showProvisioningNotification(any(), any()); - assertCaptivePortalAppReceiverRegistered(true /* isPortal */); + assertEquals(1, mRegisteredReceivers.size()); // Check that startCaptivePortalApp sends the expected intent. nm.launchCaptivePortalApp(); @@ -1972,49 +1790,17 @@ final String redirectUrl = bundle.getString(ConnectivityManager.EXTRA_CAPTIVE_PORTAL_URL); assertEquals(TEST_HTTP_URL, redirectUrl); - resetCallbacks(); - } - - @Test - public void testCaptivePortalLogin() throws Exception { - final NetworkMonitor nm = makeMonitor(CELL_METERED_CAPABILITIES); - setupAndLaunchCaptivePortalApp(nm); - // Have the app report that the captive portal is dismissed, and check that we revalidate. setStatus(mHttpsConnection, 204); setStatus(mHttpConnection, 204); + resetCallbacks(); nm.notifyCaptivePortalAppFinished(APP_RETURN_DISMISSED); verify(mCallbacks, timeout(HANDLER_TIMEOUT_MS).atLeastOnce()) .notifyNetworkTestedWithExtras(matchNetworkTestResultParcelable( NETWORK_VALIDATION_RESULT_VALID, NETWORK_VALIDATION_PROBE_DNS | NETWORK_VALIDATION_PROBE_HTTP)); - assertCaptivePortalAppReceiverRegistered(false /* isPortal */); - } - - @Test - public void testCaptivePortalUseAsIs() throws Exception { - final NetworkMonitor nm = makeMonitor(CELL_METERED_CAPABILITIES); - setupAndLaunchCaptivePortalApp(nm); - - // The user decides this network is wanted as is, either by encountering an SSL error or - // encountering an unknown scheme and then deciding to continue through the browser, or by - // selecting this option through the options menu. - nm.notifyCaptivePortalAppFinished(APP_RETURN_WANTED_AS_IS); - // The captive portal is still closed, but the network validates since the user said so. - verify(mCallbacks, timeout(HANDLER_TIMEOUT_MS).atLeastOnce()) - .notifyNetworkTestedWithExtras(matchNetworkTestResultParcelable( - NETWORK_VALIDATION_RESULT_VALID, 0 /* probesSucceeded */)); - resetCallbacks(); - - // Revalidate. - nm.forceReevaluation(0 /* responsibleUid */); - - // The network should still be valid. - verify(mCallbacks, timeout(HANDLER_TIMEOUT_MS).atLeastOnce()) - .notifyNetworkTestedWithExtras(matchNetworkTestResultParcelable( - NETWORK_VALIDATION_RESULT_VALID, 0 /* probesSucceeded */, - TEST_LOGIN_URL)); + assertEquals(0, mRegisteredReceivers.size()); } @Test @@ -2575,7 +2361,7 @@ verify(mCallbacks, timeout(HANDLER_TIMEOUT_MS).times(1)) .showProvisioningNotification(any(), any()); - assertCaptivePortalAppReceiverRegistered(true /* isPortal */); + assertEquals(1, mRegisteredReceivers.size()); // Check that startCaptivePortalApp sends the expected intent. nm.launchCaptivePortalApp(); @@ -2797,7 +2583,7 @@ monitor.notifyNetworkConnected(linkProperties, networkCapabilities); verify(mCallbacks, timeout(HANDLER_TIMEOUT_MS).times(1)) .showProvisioningNotification(any(), any()); - assertCaptivePortalAppReceiverRegistered(true /* isPortal */); + assertEquals(1, mRegisteredReceivers.size()); verifyNetworkTested(VALIDATION_RESULT_PORTAL, 0 /* probesSucceeded */, TEST_LOGIN_URL); // Force reevaluation and confirm that the network is still captive @@ -2818,64 +2604,6 @@ ConnectivityManager.EXTRA_NETWORK)).netId)); } - @Test - public void testOemPaidNetworkValidated() throws Exception { - setValidProbes(); - - final NetworkMonitor nm = runNetworkTest(TEST_LINK_PROPERTIES, - WIFI_OEM_PAID_CAPABILITIES, - NETWORK_VALIDATION_RESULT_VALID, - NETWORK_VALIDATION_PROBE_DNS | NETWORK_VALIDATION_PROBE_HTTPS, - null /* redirectUrl */); - assertEquals(NETWORK_VALIDATION_RESULT_VALID, - nm.getEvaluationState().getEvaluationResult()); - } - - @Test - public void testOemPaidNetwork_AllProbesFailed() throws Exception { - setSslException(mHttpsConnection); - setStatus(mHttpConnection, 500); - setStatus(mFallbackConnection, 404); - - runNetworkTest(TEST_LINK_PROPERTIES, - WIFI_OEM_PAID_CAPABILITIES, - VALIDATION_RESULT_INVALID, 0 /* probesSucceeded */, null /* redirectUrl */); - } - - @Test - public void testOemPaidNetworkNoInternetCapabilityValidated() throws Exception { - setSslException(mHttpsConnection); - setStatus(mHttpConnection, 500); - setStatus(mFallbackConnection, 404); - - final NetworkCapabilities networkCapabilities = - new NetworkCapabilities(WIFI_OEM_PAID_CAPABILITIES); - networkCapabilities.removeCapability(NET_CAPABILITY_INTERNET); - - final int validationResult = - NETWORK_VALIDATION_RESULT_VALID | NETWORK_VALIDATION_RESULT_SKIPPED; - runNetworkTest(TEST_LINK_PROPERTIES, networkCapabilities, - validationResult, 0 /* probesSucceeded */, null /* redirectUrl */); - - verify(mCleartextDnsNetwork, never()).openConnection(any()); - verify(mHttpsConnection, never()).getResponseCode(); - verify(mHttpConnection, never()).getResponseCode(); - verify(mFallbackConnection, never()).getResponseCode(); - } - - @Test - public void testOemPaidNetwork_CaptivePortalNotLaunched() throws Exception { - setSslException(mHttpsConnection); - setStatus(mFallbackConnection, 404); - setPortal302(mHttpConnection); - - runNetworkTest(TEST_LINK_PROPERTIES, WIFI_OEM_PAID_CAPABILITIES, - VALIDATION_RESULT_PORTAL, 0 /* probesSucceeded */, - TEST_LOGIN_URL); - - verify(mCallbacks, never()).showProvisioningNotification(any(), any()); - } - private void setupResourceForMultipleProbes() { // Configure the resource to send multiple probe. when(mResources.getStringArray(R.array.config_captive_portal_https_urls)) @@ -2960,21 +2688,21 @@ private NetworkMonitor runPortalNetworkTest() throws RemoteException { final NetworkMonitor nm = runNetworkTest(VALIDATION_RESULT_PORTAL, 0 /* probesSucceeded */, TEST_LOGIN_URL); - assertCaptivePortalAppReceiverRegistered(true /* isPortal */); + assertEquals(1, mRegisteredReceivers.size()); return nm; } private NetworkMonitor runNoValidationNetworkTest() throws RemoteException { final NetworkMonitor nm = runNetworkTest(NETWORK_VALIDATION_RESULT_VALID, 0 /* probesSucceeded */, null /* redirectUrl */); - assertCaptivePortalAppReceiverRegistered(false /* isPortal */); + assertEquals(0, mRegisteredReceivers.size()); return nm; } private NetworkMonitor runFailedNetworkTest() throws RemoteException { final NetworkMonitor nm = runNetworkTest( VALIDATION_RESULT_INVALID, 0 /* probesSucceeded */, null /* redirectUrl */); - assertCaptivePortalAppReceiverRegistered(false /* isPortal */); + assertEquals(0, mRegisteredReceivers.size()); return nm; } @@ -2982,7 +2710,7 @@ throws RemoteException { final NetworkMonitor nm = runNetworkTest(NETWORK_VALIDATION_RESULT_PARTIAL, probesSucceeded, null /* redirectUrl */); - assertCaptivePortalAppReceiverRegistered(false /* isPortal */); + assertEquals(0, mRegisteredReceivers.size()); return nm; } @@ -3114,13 +2842,5 @@ private DataStallReportParcelable matchTcpDataStallParcelable() { return argThat(p -> (p.detectionMethod & ConstantsShim.DETECTION_METHOD_TCP_METRICS) != 0); } - - private void assertCaptivePortalAppReceiverRegistered(boolean isPortal) { - // There will be configuration change receiver registered after NetworkMonitor being - // started. If captive portal app receiver is registered, then the size of the registered - // receivers will be 2. Otherwise, mRegisteredReceivers should only contain 1 configuration - // change receiver. - assertEquals(isPortal ? 2 : 1, mRegisteredReceivers.size()); - } }