Merge "Add NDK API for getprocnetwork"

This commit is contained in:
Remi NGUYEN VAN
2021-06-03 08:07:23 +00:00
committed by Gerrit Code Review
3 changed files with 29 additions and 8 deletions

View File

@@ -124,6 +124,7 @@ cc_library_static {
srcs: [
"jni/android_net_NetworkUtils.cpp",
],
shared_libs: ["libandroid_net"],
apex_available: [
"//apex_available:platform",
"com.android.tethering",
@@ -136,6 +137,7 @@ cc_library_shared {
srcs: [
"jni/onload.cpp",
],
shared_libs: ["libandroid"],
static_libs: ["libconnectivityframeworkutils"],
apex_available: [
"//apex_available:platform",

View File

@@ -19,6 +19,7 @@
#include <vector>
#include <android/file_descriptor_jni.h>
#include <android/multinetwork.h>
#include <arpa/inet.h>
#include <linux/filter.h>
#include <linux/if_arp.h>
@@ -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,
@@ -250,8 +258,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 },
{ "attachDropAllBPFFilter", "(Ljava/io/FileDescriptor;)V", (void*) android_net_utils_attachDropAllBPFFilter },

View File

@@ -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}.