diff --git a/framework/Android.bp b/framework/Android.bp index 657d5a3d2e..3553c1f053 100644 --- a/framework/Android.bp +++ b/framework/Android.bp @@ -128,6 +128,7 @@ cc_library_static { srcs: [ "jni/android_net_NetworkUtils.cpp", ], + shared_libs: ["libandroid_net"], apex_available: [ "//apex_available:platform", "com.android.tethering", @@ -140,6 +141,7 @@ cc_library_shared { srcs: [ "jni/onload.cpp", ], + shared_libs: ["libandroid"], static_libs: ["libconnectivityframeworkutils"], apex_available: [ "//apex_available:platform", diff --git a/framework/jni/android_net_NetworkUtils.cpp b/framework/jni/android_net_NetworkUtils.cpp index c5b1ff8112..c7c0beee5b 100644 --- a/framework/jni/android_net_NetworkUtils.cpp +++ b/framework/jni/android_net_NetworkUtils.cpp @@ -19,6 +19,7 @@ #include #include +#include #include #include #include @@ -94,14 +95,21 @@ static void android_net_utils_detachBPFFilter(JNIEnv *env, jobject clazz, jobjec } } -static jboolean android_net_utils_bindProcessToNetwork(JNIEnv *env, jobject thiz, jint netId) +static jboolean android_net_utils_bindProcessToNetworkHandle(JNIEnv *env, jobject thiz, + jlong netHandle) { - return (jboolean) !setNetworkForProcess(netId); + return (jboolean) !android_setprocnetwork(netHandle); } -static jint android_net_utils_getBoundNetworkForProcess(JNIEnv *env, jobject thiz) +static jlong android_net_utils_getBoundNetworkHandleForProcess(JNIEnv *env, jobject thiz) { - return getNetworkForProcess(); + net_handle_t network; + if (android_getprocnetwork(&network) != 0) { + jniThrowExceptionFmt(env, "java/lang/IllegalStateException", + "android_getprocnetwork(): %s", strerror(errno)); + return NETWORK_UNSPECIFIED; + } + return (jlong) network; } static jboolean android_net_utils_bindProcessToNetworkForHostResolution(JNIEnv *env, jobject thiz, @@ -255,8 +263,8 @@ static jobject android_net_utils_getTcpRepairWindow(JNIEnv *env, jobject thiz, j // clang-format off static const JNINativeMethod gNetworkUtilMethods[] = { /* name, signature, funcPtr */ - { "bindProcessToNetwork", "(I)Z", (void*) android_net_utils_bindProcessToNetwork }, - { "getBoundNetworkForProcess", "()I", (void*) android_net_utils_getBoundNetworkForProcess }, + { "bindProcessToNetworkHandle", "(J)Z", (void*) android_net_utils_bindProcessToNetworkHandle }, + { "getBoundNetworkHandleForProcess", "()J", (void*) android_net_utils_getBoundNetworkHandleForProcess }, { "bindProcessToNetworkForHostResolution", "(I)Z", (void*) android_net_utils_bindProcessToNetworkForHostResolution }, { "bindSocketToNetwork", "(Ljava/io/FileDescriptor;I)I", (void*) android_net_utils_bindSocketToNetwork }, { "queryUserAccess", "(II)Z", (void*)android_net_utils_queryUserAccess }, diff --git a/framework/src/android/net/NetworkUtils.java b/framework/src/android/net/NetworkUtils.java index c4bebc0a98..16ae55f8c1 100644 --- a/framework/src/android/net/NetworkUtils.java +++ b/framework/src/android/net/NetworkUtils.java @@ -16,6 +16,8 @@ package android.net; +import static android.net.ConnectivityManager.NETID_UNSET; + import android.compat.annotation.UnsupportedAppUsage; import android.os.Build; import android.system.ErrnoException; @@ -55,6 +57,8 @@ public class NetworkUtils { */ public static native void detachBPFFilter(FileDescriptor fd) throws SocketException; + private static native boolean bindProcessToNetworkHandle(long netHandle); + /** * Binds the current process to the network designated by {@code netId}. All sockets created * in the future (and not explicitly bound via a bound {@link SocketFactory} (see @@ -63,13 +67,20 @@ public class NetworkUtils { * is by design so an application doesn't accidentally use sockets it thinks are still bound to * a particular {@code Network}. Passing NETID_UNSET clears the binding. */ - public native static boolean bindProcessToNetwork(int netId); + public static boolean bindProcessToNetwork(int netId) { + return bindProcessToNetworkHandle(new Network(netId).getNetworkHandle()); + } + + private static native long getBoundNetworkHandleForProcess(); /** * Return the netId last passed to {@link #bindProcessToNetwork}, or NETID_UNSET if * {@link #unbindProcessToNetwork} has been called since {@link #bindProcessToNetwork}. */ - public native static int getBoundNetworkForProcess(); + public static int getBoundNetworkForProcess() { + final long netHandle = getBoundNetworkHandleForProcess(); + return netHandle == 0L ? NETID_UNSET : Network.fromNetworkHandle(netHandle).getNetId(); + } /** * Binds host resolutions performed by this process to the network designated by {@code netId}.