[CLATJ#16] Rename JNI/Dependencies function and improve JNI error handling
- rename JNI functions with prefix native_*
- throw exception while JNI function gets invalid address argument
- throw exception while JNI function returns invalid address
Bug: 212345928
Test: flash and boot
Run "atest ClatCoordinatorTest" in a followup commit
Change-Id: I6745a61525c6f72a61fbde0b21b3f7abcdf2446a
diff --git a/service/jni/com_android_server_connectivity_ClatCoordinator.cpp b/service/jni/com_android_server_connectivity_ClatCoordinator.cpp
index b37827e..a9d7946 100644
--- a/service/jni/com_android_server_connectivity_ClatCoordinator.cpp
+++ b/service/jni/com_android_server_connectivity_ClatCoordinator.cpp
@@ -15,6 +15,7 @@
*/
#include <arpa/inet.h>
+#include <errno.h>
#include <fcntl.h>
#include <linux/if_tun.h>
#include <linux/ioctl.h>
@@ -41,6 +42,7 @@
ScopedUtfChars address(env, v4addr);
in_addr ip;
if (inet_pton(AF_INET, address.c_str(), &ip) != 1) {
+ throwIOException(env, "invalid address", EINVAL);
return nullptr;
}
@@ -58,6 +60,7 @@
char addrstr[INET_ADDRSTRLEN];
if (!inet_ntop(AF_INET, (void*)&v4, addrstr, sizeof(addrstr))) {
+ throwIOException(env, "invalid address", EADDRNOTAVAIL);
return nullptr;
}
return env->NewStringUTF(addrstr);
@@ -98,6 +101,7 @@
char addrstr[INET6_ADDRSTRLEN];
if (!inet_ntop(AF_INET6, (void*)&v6, addrstr, sizeof(addrstr))) {
+ throwIOException(env, "invalid address", EADDRNOTAVAIL);
return nullptr;
}
return env->NewStringUTF(addrstr);
@@ -238,22 +242,22 @@
*/
static const JNINativeMethod gMethods[] = {
/* name, signature, funcPtr */
- {"selectIpv4Address", "(Ljava/lang/String;I)Ljava/lang/String;",
+ {"native_selectIpv4Address", "(Ljava/lang/String;I)Ljava/lang/String;",
(void*)com_android_server_connectivity_ClatCoordinator_selectIpv4Address},
- {"generateIpv6Address",
+ {"native_generateIpv6Address",
"(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;",
(void*)com_android_server_connectivity_ClatCoordinator_generateIpv6Address},
- {"createTunInterface", "(Ljava/lang/String;)I",
+ {"native_createTunInterface", "(Ljava/lang/String;)I",
(void*)com_android_server_connectivity_ClatCoordinator_createTunInterface},
- {"detectMtu", "(Ljava/lang/String;II)I",
+ {"native_detectMtu", "(Ljava/lang/String;II)I",
(void*)com_android_server_connectivity_ClatCoordinator_detectMtu},
- {"openPacketSocket", "()I",
+ {"native_openPacketSocket", "()I",
(void*)com_android_server_connectivity_ClatCoordinator_openPacketSocket},
- {"openRawSocket6", "(I)I",
+ {"native_openRawSocket6", "(I)I",
(void*)com_android_server_connectivity_ClatCoordinator_openRawSocket6},
- {"addAnycastSetsockopt", "(Ljava/io/FileDescriptor;Ljava/lang/String;I)V",
+ {"native_addAnycastSetsockopt", "(Ljava/io/FileDescriptor;Ljava/lang/String;I)V",
(void*)com_android_server_connectivity_ClatCoordinator_addAnycastSetsockopt},
- {"configurePacketSocket", "(Ljava/io/FileDescriptor;Ljava/lang/String;I)V",
+ {"native_configurePacketSocket", "(Ljava/io/FileDescriptor;Ljava/lang/String;I)V",
(void*)com_android_server_connectivity_ClatCoordinator_configurePacketSocket},
};
diff --git a/service/src/com/android/server/connectivity/ClatCoordinator.java b/service/src/com/android/server/connectivity/ClatCoordinator.java
index 2623c50..4d243c4 100644
--- a/service/src/com/android/server/connectivity/ClatCoordinator.java
+++ b/service/src/com/android/server/connectivity/ClatCoordinator.java
@@ -103,64 +103,64 @@
/**
* Create tun interface for a given interface name.
*/
- public int jniCreateTunInterface(@NonNull String tuniface) throws IOException {
- return createTunInterface(tuniface);
+ public int createTunInterface(@NonNull String tuniface) throws IOException {
+ return native_createTunInterface(tuniface);
}
/**
* Pick an IPv4 address for clat.
*/
@NonNull
- public String jniSelectIpv4Address(@NonNull String v4addr, int prefixlen)
+ public String selectIpv4Address(@NonNull String v4addr, int prefixlen)
throws IOException {
- return selectIpv4Address(v4addr, prefixlen);
+ return native_selectIpv4Address(v4addr, prefixlen);
}
/**
* Generate a checksum-neutral IID.
*/
@NonNull
- public String jniGenerateIpv6Address(@NonNull String iface, @NonNull String v4,
+ public String generateIpv6Address(@NonNull String iface, @NonNull String v4,
@NonNull String prefix64) throws IOException {
- return generateIpv6Address(iface, v4, prefix64);
+ return native_generateIpv6Address(iface, v4, prefix64);
}
/**
* Detect MTU.
*/
- public int jniDetectMtu(@NonNull String platSubnet, int platSuffix, int mark)
+ public int detectMtu(@NonNull String platSubnet, int platSuffix, int mark)
throws IOException {
- return detectMtu(platSubnet, platSuffix, mark);
+ return native_detectMtu(platSubnet, platSuffix, mark);
}
/**
* Open packet socket.
*/
- public int jniOpenPacketSocket() throws IOException {
- return openPacketSocket();
+ public int openPacketSocket() throws IOException {
+ return native_openPacketSocket();
}
/**
* Open IPv6 raw socket and set SO_MARK.
*/
- public int jniOpenRawSocket6(int mark) throws IOException {
- return openRawSocket6(mark);
+ public int openRawSocket6(int mark) throws IOException {
+ return native_openRawSocket6(mark);
}
/**
* Add anycast setsockopt.
*/
- public void jniAddAnycastSetsockopt(@NonNull FileDescriptor sock, String v6, int ifindex)
+ public void addAnycastSetsockopt(@NonNull FileDescriptor sock, String v6, int ifindex)
throws IOException {
- addAnycastSetsockopt(sock, v6, ifindex);
+ native_addAnycastSetsockopt(sock, v6, ifindex);
}
/**
* Configure packet socket.
*/
- public void jniConfigurePacketSocket(@NonNull FileDescriptor sock, String v6, int ifindex)
+ public void configurePacketSocket(@NonNull FileDescriptor sock, String v6, int ifindex)
throws IOException {
- configurePacketSocket(sock, v6, ifindex);
+ native_configurePacketSocket(sock, v6, ifindex);
}
}
@@ -203,7 +203,7 @@
// [1] Pick an IPv4 address from 192.0.0.4, 192.0.0.5, 192.0.0.6 ..
final String v4;
try {
- v4 = mDeps.jniSelectIpv4Address(INIT_V4ADDR_STRING, INIT_V4ADDR_PREFIX_LEN);
+ v4 = mDeps.selectIpv4Address(INIT_V4ADDR_STRING, INIT_V4ADDR_PREFIX_LEN);
} catch (IOException e) {
throw new IOException("no IPv4 addresses were available for clat: " + e);
}
@@ -212,7 +212,7 @@
final String pfx96 = nat64Prefix.getAddress().getHostAddress();
final String v6;
try {
- v6 = mDeps.jniGenerateIpv6Address(iface, v4, pfx96);
+ v6 = mDeps.generateIpv6Address(iface, v4, pfx96);
} catch (IOException e) {
throw new IOException("no IPv6 addresses were available for clat: " + e);
}
@@ -222,7 +222,7 @@
final String tunIface = CLAT_PREFIX + iface;
final ParcelFileDescriptor tunFd;
try {
- tunFd = mDeps.adoptFd(mDeps.jniCreateTunInterface(tunIface));
+ tunFd = mDeps.adoptFd(mDeps.createTunInterface(tunIface));
} catch (IOException e) {
throw new IOException("Create tun interface " + tunIface + " failed: " + e);
}
@@ -236,7 +236,7 @@
// Detect ipv4 mtu.
final Integer fwmark = getFwmark(netId);
- final int detectedMtu = mDeps.jniDetectMtu(pfx96,
+ final int detectedMtu = mDeps.detectMtu(pfx96,
ByteBuffer.wrap(GOOGLE_DNS_4.getAddress()).getInt(), fwmark);
final int mtu = adjustMtu(detectedMtu);
Log.i(TAG, "ipv4 mtu is " + mtu);
@@ -270,7 +270,7 @@
// like to use ParcelFileDescriptor to close file descriptor automatically. But ctor
// ParcelFileDescriptor(FileDescriptor fd) is a @hide function. Need to use native file
// descriptor to initialize ParcelFileDescriptor object instead.
- readSock6 = mDeps.adoptFd(mDeps.jniOpenPacketSocket());
+ readSock6 = mDeps.adoptFd(mDeps.openPacketSocket());
} catch (IOException e) {
throw new IOException("Open packet socket failed: " + e);
}
@@ -280,7 +280,7 @@
try {
// Use a JNI call to get native file descriptor instead of Os.socket(). See above
// reason why we use jniOpenPacketSocket6().
- writeSock6 = mDeps.adoptFd(mDeps.jniOpenRawSocket6(fwmark));
+ writeSock6 = mDeps.adoptFd(mDeps.openRawSocket6(fwmark));
} catch (IOException e) {
throw new IOException("Open raw socket failed: " + e);
}
@@ -292,14 +292,14 @@
// Start translating packets to the new prefix.
try {
- mDeps.jniAddAnycastSetsockopt(writeSock6.getFileDescriptor(), v6, ifaceIndex);
+ mDeps.addAnycastSetsockopt(writeSock6.getFileDescriptor(), v6, ifaceIndex);
} catch (IOException e) {
throw new IOException("add anycast sockopt failed: " + e);
}
// Update our packet socket filter to reflect the new 464xlat IP address.
try {
- mDeps.jniConfigurePacketSocket(readSock6.getFileDescriptor(), v6, ifaceIndex);
+ mDeps.configurePacketSocket(readSock6.getFileDescriptor(), v6, ifaceIndex);
} catch (IOException e) {
throw new IOException("configure packet socket failed: " + e);
}
@@ -308,17 +308,17 @@
return null;
}
- private static native String selectIpv4Address(String v4addr, int prefixlen)
+ private static native String native_selectIpv4Address(String v4addr, int prefixlen)
throws IOException;
- private static native String generateIpv6Address(String iface, String v4, String prefix64)
+ private static native String native_generateIpv6Address(String iface, String v4,
+ String prefix64) throws IOException;
+ private static native int native_createTunInterface(String tuniface) throws IOException;
+ private static native int native_detectMtu(String platSubnet, int platSuffix, int mark)
throws IOException;
- private static native int createTunInterface(String tuniface) throws IOException;
- private static native int detectMtu(String platSubnet, int platSuffix, int mark)
- throws IOException;
- private static native int openPacketSocket() throws IOException;
- private static native int openRawSocket6(int mark) throws IOException;
- private static native void addAnycastSetsockopt(FileDescriptor sock, String v6, int ifindex)
- throws IOException;
- private static native void configurePacketSocket(FileDescriptor sock, String v6, int ifindex)
- throws IOException;
+ private static native int native_openPacketSocket() throws IOException;
+ private static native int native_openRawSocket6(int mark) throws IOException;
+ private static native void native_addAnycastSetsockopt(FileDescriptor sock, String v6,
+ int ifindex) throws IOException;
+ private static native void native_configurePacketSocket(FileDescriptor sock, String v6,
+ int ifindex) throws IOException;
}