Merge "Add NDK API for getprocnetwork" into sc-dev

This commit is contained in:
Remi NGUYEN VAN
2021-03-23 07:11:06 +00:00
committed by Android (Google) Code Review
7 changed files with 55 additions and 12 deletions

View File

@@ -238,6 +238,7 @@ cc_library_shared {
"android.hardware.camera.device@3.2",
"media_permission-aidl-cpp",
"libandroidicu",
"libandroid_net",
"libbpf_android",
"libnetdbpf",
"libnetdutils",

View File

@@ -285,6 +285,7 @@ LIBANDROID {
ATrace_endAsyncSection; # introduced=29
ATrace_setCounter; # introduced=29
android_getaddrinfofornetwork; # introduced=23
android_getprocnetwork; # introduced=31
android_setprocnetwork; # introduced=23
android_setsocknetwork; # introduced=23
android_res_cancel; # introduced=29
@@ -309,4 +310,4 @@ LIBANDROID_PLATFORM {
ASurfaceControlStats_getAcquireTime*;
ASurfaceControlStats_getFrameNumber*;
};
} LIBANDROID;
} LIBANDROID;

View File

@@ -14,6 +14,8 @@ LIBANDROID_NET {
android_res_nquery; # llndk
android_res_nresult; # llndk
android_res_nsend; # llndk
# These functions have been part of the NDK since API 31.
android_getprocnetwork; # llndk
local:
*;
};

View File

@@ -22,12 +22,13 @@
#include <stdlib.h>
#include <sys/limits.h>
// This value MUST be kept in sync with the corresponding value in
// the android.net.Network#getNetworkHandle() implementation.
static const uint32_t kHandleMagic = 0xcafed00d;
static const uint32_t kHandleMagicSize = 32;
static int getnetidfromhandle(net_handle_t handle, unsigned *netid) {
static const uint32_t k32BitMask = 0xffffffff;
// This value MUST be kept in sync with the corresponding value in
// the android.net.Network#getNetworkHandle() implementation.
static const uint32_t kHandleMagic = 0xcafed00d;
// Check for minimum acceptable version of the API in the low bits.
if (handle != NETWORK_UNSPECIFIED &&
@@ -41,6 +42,12 @@ static int getnetidfromhandle(net_handle_t handle, unsigned *netid) {
return 1;
}
static net_handle_t gethandlefromnetid(unsigned netid) {
if (netid == NETID_UNSET) {
return NETWORK_UNSPECIFIED;
}
return (((net_handle_t) netid) << kHandleMagicSize) | kHandleMagic;
}
int android_setsocknetwork(net_handle_t network, int fd) {
unsigned netid;
@@ -72,6 +79,17 @@ int android_setprocnetwork(net_handle_t network) {
return rval;
}
int android_getprocnetwork(net_handle_t *network) {
if (network == NULL) {
errno = EINVAL;
return -1;
}
unsigned netid = getNetworkForProcess();
*network = gethandlefromnetid(netid);
return 0;
}
int android_getaddrinfofornetwork(net_handle_t network,
const char *node, const char *service,
const struct addrinfo *hints, struct addrinfo **res) {

View File

@@ -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",

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

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