Merge "Add NDK API for getprocnetwork"
This commit is contained in:
@@ -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",
|
||||
|
||||
@@ -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 },
|
||||
|
||||
@@ -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}.
|
||||
|
||||
Reference in New Issue
Block a user