Merge "Add NDK API for getprocnetwork" am: ae471dd3f2
Original change: https://android-review.googlesource.com/c/platform/packages/modules/Connectivity/+/1722734 Change-Id: Id05c47d9a6eed0434bdf0c9b9377810036b321c7
This commit is contained in:
@@ -124,6 +124,7 @@ cc_library_static {
|
|||||||
srcs: [
|
srcs: [
|
||||||
"jni/android_net_NetworkUtils.cpp",
|
"jni/android_net_NetworkUtils.cpp",
|
||||||
],
|
],
|
||||||
|
shared_libs: ["libandroid_net"],
|
||||||
apex_available: [
|
apex_available: [
|
||||||
"//apex_available:platform",
|
"//apex_available:platform",
|
||||||
"com.android.tethering",
|
"com.android.tethering",
|
||||||
@@ -136,6 +137,7 @@ cc_library_shared {
|
|||||||
srcs: [
|
srcs: [
|
||||||
"jni/onload.cpp",
|
"jni/onload.cpp",
|
||||||
],
|
],
|
||||||
|
shared_libs: ["libandroid"],
|
||||||
static_libs: ["libconnectivityframeworkutils"],
|
static_libs: ["libconnectivityframeworkutils"],
|
||||||
apex_available: [
|
apex_available: [
|
||||||
"//apex_available:platform",
|
"//apex_available:platform",
|
||||||
|
|||||||
@@ -19,6 +19,7 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include <android/file_descriptor_jni.h>
|
#include <android/file_descriptor_jni.h>
|
||||||
|
#include <android/multinetwork.h>
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
#include <linux/filter.h>
|
#include <linux/filter.h>
|
||||||
#include <linux/if_arp.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,
|
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
|
// clang-format off
|
||||||
static const JNINativeMethod gNetworkUtilMethods[] = {
|
static const JNINativeMethod gNetworkUtilMethods[] = {
|
||||||
/* name, signature, funcPtr */
|
/* name, signature, funcPtr */
|
||||||
{ "bindProcessToNetwork", "(I)Z", (void*) android_net_utils_bindProcessToNetwork },
|
{ "bindProcessToNetworkHandle", "(J)Z", (void*) android_net_utils_bindProcessToNetworkHandle },
|
||||||
{ "getBoundNetworkForProcess", "()I", (void*) android_net_utils_getBoundNetworkForProcess },
|
{ "getBoundNetworkHandleForProcess", "()J", (void*) android_net_utils_getBoundNetworkHandleForProcess },
|
||||||
{ "bindProcessToNetworkForHostResolution", "(I)Z", (void*) android_net_utils_bindProcessToNetworkForHostResolution },
|
{ "bindProcessToNetworkForHostResolution", "(I)Z", (void*) android_net_utils_bindProcessToNetworkForHostResolution },
|
||||||
{ "bindSocketToNetwork", "(Ljava/io/FileDescriptor;I)I", (void*) android_net_utils_bindSocketToNetwork },
|
{ "bindSocketToNetwork", "(Ljava/io/FileDescriptor;I)I", (void*) android_net_utils_bindSocketToNetwork },
|
||||||
{ "attachDropAllBPFFilter", "(Ljava/io/FileDescriptor;)V", (void*) android_net_utils_attachDropAllBPFFilter },
|
{ "attachDropAllBPFFilter", "(Ljava/io/FileDescriptor;)V", (void*) android_net_utils_attachDropAllBPFFilter },
|
||||||
|
|||||||
@@ -16,6 +16,8 @@
|
|||||||
|
|
||||||
package android.net;
|
package android.net;
|
||||||
|
|
||||||
|
import static android.net.ConnectivityManager.NETID_UNSET;
|
||||||
|
|
||||||
import android.compat.annotation.UnsupportedAppUsage;
|
import android.compat.annotation.UnsupportedAppUsage;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.system.ErrnoException;
|
import android.system.ErrnoException;
|
||||||
@@ -55,6 +57,8 @@ public class NetworkUtils {
|
|||||||
*/
|
*/
|
||||||
public static native void detachBPFFilter(FileDescriptor fd) throws SocketException;
|
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
|
* 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
|
* 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
|
* 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.
|
* 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
|
* Return the netId last passed to {@link #bindProcessToNetwork}, or NETID_UNSET if
|
||||||
* {@link #unbindProcessToNetwork} has been called since {@link #bindProcessToNetwork}.
|
* {@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}.
|
* Binds host resolutions performed by this process to the network designated by {@code netId}.
|
||||||
|
|||||||
Reference in New Issue
Block a user