Loading core/java/android/net/NetworkUtils.java +0 −7 Original line number Diff line number Diff line Loading @@ -60,13 +60,6 @@ public class NetworkUtils { */ public static native void detachBPFFilter(FileDescriptor fd) throws SocketException; /** * Configures a socket for receiving ICMPv6 router solicitations and sending advertisements. * @param fd the socket's {@link FileDescriptor}. * @param ifIndex the interface index. */ public native static void setupRaSocket(FileDescriptor fd, int ifIndex) throws SocketException; /** * 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 Loading core/jni/android_net_NetUtils.cpp +0 −95 Original line number Diff line number Diff line Loading @@ -24,9 +24,7 @@ #include <linux/tcp.h> #include <net/if.h> #include <netinet/ether.h> #include <netinet/icmp6.h> #include <netinet/ip.h> #include <netinet/ip6.h> #include <netinet/udp.h> #include <android_runtime/AndroidRuntime.h> Loading Loading @@ -102,98 +100,6 @@ static void android_net_utils_detachBPFFilter(JNIEnv *env, jobject clazz, jobjec } } static void android_net_utils_setupRaSocket(JNIEnv *env, jobject clazz, jobject javaFd, jint ifIndex) { static const int kLinkLocalHopLimit = 255; int fd = jniGetFDFromFileDescriptor(env, javaFd); // Set an ICMPv6 filter that only passes Router Solicitations. struct icmp6_filter rs_only; ICMP6_FILTER_SETBLOCKALL(&rs_only); ICMP6_FILTER_SETPASS(ND_ROUTER_SOLICIT, &rs_only); socklen_t len = sizeof(rs_only); if (setsockopt(fd, IPPROTO_ICMPV6, ICMP6_FILTER, &rs_only, len) != 0) { jniThrowExceptionFmt(env, "java/net/SocketException", "setsockopt(ICMP6_FILTER): %s", strerror(errno)); return; } // Most/all of the rest of these options can be set via Java code, but // because we're here on account of setting an icmp6_filter go ahead // and do it all natively for now. // // TODO: Consider moving these out to Java. // Set the multicast hoplimit to 255 (link-local only). int hops = kLinkLocalHopLimit; len = sizeof(hops); if (setsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &hops, len) != 0) { jniThrowExceptionFmt(env, "java/net/SocketException", "setsockopt(IPV6_MULTICAST_HOPS): %s", strerror(errno)); return; } // Set the unicast hoplimit to 255 (link-local only). hops = kLinkLocalHopLimit; len = sizeof(hops); if (setsockopt(fd, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &hops, len) != 0) { jniThrowExceptionFmt(env, "java/net/SocketException", "setsockopt(IPV6_UNICAST_HOPS): %s", strerror(errno)); return; } // Explicitly disable multicast loopback. int off = 0; len = sizeof(off); if (setsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, &off, len) != 0) { jniThrowExceptionFmt(env, "java/net/SocketException", "setsockopt(IPV6_MULTICAST_LOOP): %s", strerror(errno)); return; } // Specify the IPv6 interface to use for outbound multicast. len = sizeof(ifIndex); if (setsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_IF, &ifIndex, len) != 0) { jniThrowExceptionFmt(env, "java/net/SocketException", "setsockopt(IPV6_MULTICAST_IF): %s", strerror(errno)); return; } // Additional options to be considered: // - IPV6_TCLASS // - IPV6_RECVPKTINFO // - IPV6_RECVHOPLIMIT // Bind to [::]. const struct sockaddr_in6 sin6 = { .sin6_family = AF_INET6, .sin6_port = 0, .sin6_flowinfo = 0, .sin6_addr = IN6ADDR_ANY_INIT, .sin6_scope_id = 0, }; auto sa = reinterpret_cast<const struct sockaddr *>(&sin6); len = sizeof(sin6); if (bind(fd, sa, len) != 0) { jniThrowExceptionFmt(env, "java/net/SocketException", "bind(IN6ADDR_ANY): %s", strerror(errno)); return; } // Join the all-routers multicast group, ff02::2%index. struct ipv6_mreq all_rtrs = { .ipv6mr_multiaddr = {{{0xff,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2}}}, .ipv6mr_interface = ifIndex, }; len = sizeof(all_rtrs); if (setsockopt(fd, IPPROTO_IPV6, IPV6_JOIN_GROUP, &all_rtrs, len) != 0) { jniThrowExceptionFmt(env, "java/net/SocketException", "setsockopt(IPV6_JOIN_GROUP): %s", strerror(errno)); return; } } static jboolean android_net_utils_bindProcessToNetwork(JNIEnv *env, jobject thiz, jint netId) { Loading Loading @@ -370,7 +276,6 @@ static const JNINativeMethod gNetworkUtilMethods[] = { { "attachDropAllBPFFilter", "(Ljava/io/FileDescriptor;)V", (void*) android_net_utils_attachDropAllBPFFilter }, { "detachBPFFilter", "(Ljava/io/FileDescriptor;)V", (void*) android_net_utils_detachBPFFilter }, { "getTcpRepairWindow", "(Ljava/io/FileDescriptor;)Landroid/net/TcpRepairWindow;", (void*) android_net_utils_getTcpRepairWindow }, { "setupRaSocket", "(Ljava/io/FileDescriptor;I)V", (void*) android_net_utils_setupRaSocket }, { "resNetworkSend", "(I[BII)Ljava/io/FileDescriptor;", (void*) android_net_utils_resNetworkSend }, { "resNetworkQuery", "(ILjava/lang/String;III)Ljava/io/FileDescriptor;", (void*) android_net_utils_resNetworkQuery }, { "resNetworkResult", "(Ljava/io/FileDescriptor;)Landroid/net/DnsResolver$DnsResponse;", (void*) android_net_utils_resNetworkResult }, Loading packages/Tethering/Android.bp +3 −3 Original line number Diff line number Diff line Loading @@ -45,9 +45,9 @@ android_library { // Due to b/143733063, APK can't access a jni lib that is in APEX (but not in the APK). cc_library { name: "libtetheroffloadjni", name: "libtetherutilsjni", srcs: [ "jni/com_android_server_connectivity_tethering_OffloadHardwareInterface.cpp", "jni/android_net_util_TetheringUtils.cpp", ], shared_libs: [ "libcgrouprc", Loading Loading @@ -87,7 +87,7 @@ java_defaults { "libcgrouprc", "libnativehelper_compat_libc++", "libvndksupport", "libtetheroffloadjni", "libtetherutilsjni", ], resource_dirs: [ "res", Loading packages/Tethering/jni/com_android_server_connectivity_tethering_OffloadHardwareInterface.cpp→packages/Tethering/jni/android_net_util_TetheringUtils.cpp +101 −7 Original line number Diff line number Diff line Loading @@ -19,13 +19,16 @@ #include <hidl/HidlSupport.h> #include <jni.h> #include <nativehelper/JNIHelp.h> #include <nativehelper/ScopedUtfChars.h> #include <linux/netfilter/nfnetlink.h> #include <linux/netlink.h> #include <net/if.h> #include <netinet/icmp6.h> #include <sys/socket.h> #include <android-base/unique_fd.h> #include <android/hardware/tetheroffload/config/1.0/IOffloadConfig.h> #define LOG_TAG "OffloadHardwareInterface" #define LOG_TAG "TetheringUtils" #include <utils/Log.h> namespace android { Loading Loading @@ -87,7 +90,7 @@ hidl_handle handleFromFileDescriptor(base::unique_fd fd) { } // namespace static jboolean android_server_connectivity_tethering_OffloadHardwareInterface_configOffload( static jboolean android_net_util_configOffload( JNIEnv* /* env */) { sp<IOffloadConfig> configInterface = IOffloadConfig::getService(); if (configInterface.get() == nullptr) { Loading Loading @@ -130,18 +133,109 @@ static jboolean android_server_connectivity_tethering_OffloadHardwareInterface_c return rval; } static void android_net_util_setupRaSocket(JNIEnv *env, jobject clazz, jobject javaFd, jint ifIndex) { static const int kLinkLocalHopLimit = 255; int fd = jniGetFDFromFileDescriptor(env, javaFd); // Set an ICMPv6 filter that only passes Router Solicitations. struct icmp6_filter rs_only; ICMP6_FILTER_SETBLOCKALL(&rs_only); ICMP6_FILTER_SETPASS(ND_ROUTER_SOLICIT, &rs_only); socklen_t len = sizeof(rs_only); if (setsockopt(fd, IPPROTO_ICMPV6, ICMP6_FILTER, &rs_only, len) != 0) { jniThrowExceptionFmt(env, "java/net/SocketException", "setsockopt(ICMP6_FILTER): %s", strerror(errno)); return; } // Most/all of the rest of these options can be set via Java code, but // because we're here on account of setting an icmp6_filter go ahead // and do it all natively for now. // Set the multicast hoplimit to 255 (link-local only). int hops = kLinkLocalHopLimit; len = sizeof(hops); if (setsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &hops, len) != 0) { jniThrowExceptionFmt(env, "java/net/SocketException", "setsockopt(IPV6_MULTICAST_HOPS): %s", strerror(errno)); return; } // Set the unicast hoplimit to 255 (link-local only). hops = kLinkLocalHopLimit; len = sizeof(hops); if (setsockopt(fd, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &hops, len) != 0) { jniThrowExceptionFmt(env, "java/net/SocketException", "setsockopt(IPV6_UNICAST_HOPS): %s", strerror(errno)); return; } // Explicitly disable multicast loopback. int off = 0; len = sizeof(off); if (setsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, &off, len) != 0) { jniThrowExceptionFmt(env, "java/net/SocketException", "setsockopt(IPV6_MULTICAST_LOOP): %s", strerror(errno)); return; } // Specify the IPv6 interface to use for outbound multicast. len = sizeof(ifIndex); if (setsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_IF, &ifIndex, len) != 0) { jniThrowExceptionFmt(env, "java/net/SocketException", "setsockopt(IPV6_MULTICAST_IF): %s", strerror(errno)); return; } // Additional options to be considered: // - IPV6_TCLASS // - IPV6_RECVPKTINFO // - IPV6_RECVHOPLIMIT // Bind to [::]. const struct sockaddr_in6 sin6 = { .sin6_family = AF_INET6, .sin6_port = 0, .sin6_flowinfo = 0, .sin6_addr = IN6ADDR_ANY_INIT, .sin6_scope_id = 0, }; auto sa = reinterpret_cast<const struct sockaddr *>(&sin6); len = sizeof(sin6); if (bind(fd, sa, len) != 0) { jniThrowExceptionFmt(env, "java/net/SocketException", "bind(IN6ADDR_ANY): %s", strerror(errno)); return; } // Join the all-routers multicast group, ff02::2%index. struct ipv6_mreq all_rtrs = { .ipv6mr_multiaddr = {{{0xff,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2}}}, .ipv6mr_interface = ifIndex, }; len = sizeof(all_rtrs); if (setsockopt(fd, IPPROTO_IPV6, IPV6_JOIN_GROUP, &all_rtrs, len) != 0) { jniThrowExceptionFmt(env, "java/net/SocketException", "setsockopt(IPV6_JOIN_GROUP): %s", strerror(errno)); return; } } /* * JNI registration. */ static const JNINativeMethod gMethods[] = { /* name, signature, funcPtr */ { "configOffload", "()Z", (void*) android_server_connectivity_tethering_OffloadHardwareInterface_configOffload }, { "configOffload", "()Z", (void*) android_net_util_configOffload }, { "setupRaSocket", "(Ljava/io/FileDescriptor;I)V", (void*) android_net_util_setupRaSocket }, }; int register_android_server_connectivity_tethering_OffloadHardwareInterface(JNIEnv* env) { int register_android_net_util_TetheringUtils(JNIEnv* env) { return jniRegisterNativeMethods(env, "com/android/server/connectivity/tethering/OffloadHardwareInterface", "android/net/util/TetheringUtils", gMethods, NELEM(gMethods)); } Loading @@ -152,7 +246,7 @@ extern "C" jint JNI_OnLoad(JavaVM* vm, void*) { return JNI_ERR; } if (register_android_server_connectivity_tethering_OffloadHardwareInterface(env) < 0) { if (register_android_net_util_TetheringUtils(env) < 0) { return JNI_ERR; } Loading packages/Tethering/src/android/net/ip/RouterAdvertisementDaemon.java +2 −1 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ import android.net.LinkAddress; import android.net.NetworkUtils; import android.net.TrafficStats; import android.net.util.InterfaceParams; import android.net.util.TetheringUtils; import android.system.ErrnoException; import android.system.Os; import android.system.StructTimeval; Loading Loading @@ -613,7 +614,7 @@ public class RouterAdvertisementDaemon { mSocket, SOL_SOCKET, SO_SNDTIMEO, StructTimeval.fromMillis(send_timout_ms)); Os.setsockoptIfreq(mSocket, SOL_SOCKET, SO_BINDTODEVICE, mInterface.name); NetworkUtils.protectFromVpn(mSocket); NetworkUtils.setupRaSocket(mSocket, mInterface.index); TetheringUtils.setupRaSocket(mSocket, mInterface.index); } catch (ErrnoException | IOException e) { Log.e(TAG, "Failed to create RA daemon socket: " + e); return false; Loading Loading
core/java/android/net/NetworkUtils.java +0 −7 Original line number Diff line number Diff line Loading @@ -60,13 +60,6 @@ public class NetworkUtils { */ public static native void detachBPFFilter(FileDescriptor fd) throws SocketException; /** * Configures a socket for receiving ICMPv6 router solicitations and sending advertisements. * @param fd the socket's {@link FileDescriptor}. * @param ifIndex the interface index. */ public native static void setupRaSocket(FileDescriptor fd, int ifIndex) throws SocketException; /** * 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 Loading
core/jni/android_net_NetUtils.cpp +0 −95 Original line number Diff line number Diff line Loading @@ -24,9 +24,7 @@ #include <linux/tcp.h> #include <net/if.h> #include <netinet/ether.h> #include <netinet/icmp6.h> #include <netinet/ip.h> #include <netinet/ip6.h> #include <netinet/udp.h> #include <android_runtime/AndroidRuntime.h> Loading Loading @@ -102,98 +100,6 @@ static void android_net_utils_detachBPFFilter(JNIEnv *env, jobject clazz, jobjec } } static void android_net_utils_setupRaSocket(JNIEnv *env, jobject clazz, jobject javaFd, jint ifIndex) { static const int kLinkLocalHopLimit = 255; int fd = jniGetFDFromFileDescriptor(env, javaFd); // Set an ICMPv6 filter that only passes Router Solicitations. struct icmp6_filter rs_only; ICMP6_FILTER_SETBLOCKALL(&rs_only); ICMP6_FILTER_SETPASS(ND_ROUTER_SOLICIT, &rs_only); socklen_t len = sizeof(rs_only); if (setsockopt(fd, IPPROTO_ICMPV6, ICMP6_FILTER, &rs_only, len) != 0) { jniThrowExceptionFmt(env, "java/net/SocketException", "setsockopt(ICMP6_FILTER): %s", strerror(errno)); return; } // Most/all of the rest of these options can be set via Java code, but // because we're here on account of setting an icmp6_filter go ahead // and do it all natively for now. // // TODO: Consider moving these out to Java. // Set the multicast hoplimit to 255 (link-local only). int hops = kLinkLocalHopLimit; len = sizeof(hops); if (setsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &hops, len) != 0) { jniThrowExceptionFmt(env, "java/net/SocketException", "setsockopt(IPV6_MULTICAST_HOPS): %s", strerror(errno)); return; } // Set the unicast hoplimit to 255 (link-local only). hops = kLinkLocalHopLimit; len = sizeof(hops); if (setsockopt(fd, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &hops, len) != 0) { jniThrowExceptionFmt(env, "java/net/SocketException", "setsockopt(IPV6_UNICAST_HOPS): %s", strerror(errno)); return; } // Explicitly disable multicast loopback. int off = 0; len = sizeof(off); if (setsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, &off, len) != 0) { jniThrowExceptionFmt(env, "java/net/SocketException", "setsockopt(IPV6_MULTICAST_LOOP): %s", strerror(errno)); return; } // Specify the IPv6 interface to use for outbound multicast. len = sizeof(ifIndex); if (setsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_IF, &ifIndex, len) != 0) { jniThrowExceptionFmt(env, "java/net/SocketException", "setsockopt(IPV6_MULTICAST_IF): %s", strerror(errno)); return; } // Additional options to be considered: // - IPV6_TCLASS // - IPV6_RECVPKTINFO // - IPV6_RECVHOPLIMIT // Bind to [::]. const struct sockaddr_in6 sin6 = { .sin6_family = AF_INET6, .sin6_port = 0, .sin6_flowinfo = 0, .sin6_addr = IN6ADDR_ANY_INIT, .sin6_scope_id = 0, }; auto sa = reinterpret_cast<const struct sockaddr *>(&sin6); len = sizeof(sin6); if (bind(fd, sa, len) != 0) { jniThrowExceptionFmt(env, "java/net/SocketException", "bind(IN6ADDR_ANY): %s", strerror(errno)); return; } // Join the all-routers multicast group, ff02::2%index. struct ipv6_mreq all_rtrs = { .ipv6mr_multiaddr = {{{0xff,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2}}}, .ipv6mr_interface = ifIndex, }; len = sizeof(all_rtrs); if (setsockopt(fd, IPPROTO_IPV6, IPV6_JOIN_GROUP, &all_rtrs, len) != 0) { jniThrowExceptionFmt(env, "java/net/SocketException", "setsockopt(IPV6_JOIN_GROUP): %s", strerror(errno)); return; } } static jboolean android_net_utils_bindProcessToNetwork(JNIEnv *env, jobject thiz, jint netId) { Loading Loading @@ -370,7 +276,6 @@ static const JNINativeMethod gNetworkUtilMethods[] = { { "attachDropAllBPFFilter", "(Ljava/io/FileDescriptor;)V", (void*) android_net_utils_attachDropAllBPFFilter }, { "detachBPFFilter", "(Ljava/io/FileDescriptor;)V", (void*) android_net_utils_detachBPFFilter }, { "getTcpRepairWindow", "(Ljava/io/FileDescriptor;)Landroid/net/TcpRepairWindow;", (void*) android_net_utils_getTcpRepairWindow }, { "setupRaSocket", "(Ljava/io/FileDescriptor;I)V", (void*) android_net_utils_setupRaSocket }, { "resNetworkSend", "(I[BII)Ljava/io/FileDescriptor;", (void*) android_net_utils_resNetworkSend }, { "resNetworkQuery", "(ILjava/lang/String;III)Ljava/io/FileDescriptor;", (void*) android_net_utils_resNetworkQuery }, { "resNetworkResult", "(Ljava/io/FileDescriptor;)Landroid/net/DnsResolver$DnsResponse;", (void*) android_net_utils_resNetworkResult }, Loading
packages/Tethering/Android.bp +3 −3 Original line number Diff line number Diff line Loading @@ -45,9 +45,9 @@ android_library { // Due to b/143733063, APK can't access a jni lib that is in APEX (but not in the APK). cc_library { name: "libtetheroffloadjni", name: "libtetherutilsjni", srcs: [ "jni/com_android_server_connectivity_tethering_OffloadHardwareInterface.cpp", "jni/android_net_util_TetheringUtils.cpp", ], shared_libs: [ "libcgrouprc", Loading Loading @@ -87,7 +87,7 @@ java_defaults { "libcgrouprc", "libnativehelper_compat_libc++", "libvndksupport", "libtetheroffloadjni", "libtetherutilsjni", ], resource_dirs: [ "res", Loading
packages/Tethering/jni/com_android_server_connectivity_tethering_OffloadHardwareInterface.cpp→packages/Tethering/jni/android_net_util_TetheringUtils.cpp +101 −7 Original line number Diff line number Diff line Loading @@ -19,13 +19,16 @@ #include <hidl/HidlSupport.h> #include <jni.h> #include <nativehelper/JNIHelp.h> #include <nativehelper/ScopedUtfChars.h> #include <linux/netfilter/nfnetlink.h> #include <linux/netlink.h> #include <net/if.h> #include <netinet/icmp6.h> #include <sys/socket.h> #include <android-base/unique_fd.h> #include <android/hardware/tetheroffload/config/1.0/IOffloadConfig.h> #define LOG_TAG "OffloadHardwareInterface" #define LOG_TAG "TetheringUtils" #include <utils/Log.h> namespace android { Loading Loading @@ -87,7 +90,7 @@ hidl_handle handleFromFileDescriptor(base::unique_fd fd) { } // namespace static jboolean android_server_connectivity_tethering_OffloadHardwareInterface_configOffload( static jboolean android_net_util_configOffload( JNIEnv* /* env */) { sp<IOffloadConfig> configInterface = IOffloadConfig::getService(); if (configInterface.get() == nullptr) { Loading Loading @@ -130,18 +133,109 @@ static jboolean android_server_connectivity_tethering_OffloadHardwareInterface_c return rval; } static void android_net_util_setupRaSocket(JNIEnv *env, jobject clazz, jobject javaFd, jint ifIndex) { static const int kLinkLocalHopLimit = 255; int fd = jniGetFDFromFileDescriptor(env, javaFd); // Set an ICMPv6 filter that only passes Router Solicitations. struct icmp6_filter rs_only; ICMP6_FILTER_SETBLOCKALL(&rs_only); ICMP6_FILTER_SETPASS(ND_ROUTER_SOLICIT, &rs_only); socklen_t len = sizeof(rs_only); if (setsockopt(fd, IPPROTO_ICMPV6, ICMP6_FILTER, &rs_only, len) != 0) { jniThrowExceptionFmt(env, "java/net/SocketException", "setsockopt(ICMP6_FILTER): %s", strerror(errno)); return; } // Most/all of the rest of these options can be set via Java code, but // because we're here on account of setting an icmp6_filter go ahead // and do it all natively for now. // Set the multicast hoplimit to 255 (link-local only). int hops = kLinkLocalHopLimit; len = sizeof(hops); if (setsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &hops, len) != 0) { jniThrowExceptionFmt(env, "java/net/SocketException", "setsockopt(IPV6_MULTICAST_HOPS): %s", strerror(errno)); return; } // Set the unicast hoplimit to 255 (link-local only). hops = kLinkLocalHopLimit; len = sizeof(hops); if (setsockopt(fd, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &hops, len) != 0) { jniThrowExceptionFmt(env, "java/net/SocketException", "setsockopt(IPV6_UNICAST_HOPS): %s", strerror(errno)); return; } // Explicitly disable multicast loopback. int off = 0; len = sizeof(off); if (setsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, &off, len) != 0) { jniThrowExceptionFmt(env, "java/net/SocketException", "setsockopt(IPV6_MULTICAST_LOOP): %s", strerror(errno)); return; } // Specify the IPv6 interface to use for outbound multicast. len = sizeof(ifIndex); if (setsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_IF, &ifIndex, len) != 0) { jniThrowExceptionFmt(env, "java/net/SocketException", "setsockopt(IPV6_MULTICAST_IF): %s", strerror(errno)); return; } // Additional options to be considered: // - IPV6_TCLASS // - IPV6_RECVPKTINFO // - IPV6_RECVHOPLIMIT // Bind to [::]. const struct sockaddr_in6 sin6 = { .sin6_family = AF_INET6, .sin6_port = 0, .sin6_flowinfo = 0, .sin6_addr = IN6ADDR_ANY_INIT, .sin6_scope_id = 0, }; auto sa = reinterpret_cast<const struct sockaddr *>(&sin6); len = sizeof(sin6); if (bind(fd, sa, len) != 0) { jniThrowExceptionFmt(env, "java/net/SocketException", "bind(IN6ADDR_ANY): %s", strerror(errno)); return; } // Join the all-routers multicast group, ff02::2%index. struct ipv6_mreq all_rtrs = { .ipv6mr_multiaddr = {{{0xff,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2}}}, .ipv6mr_interface = ifIndex, }; len = sizeof(all_rtrs); if (setsockopt(fd, IPPROTO_IPV6, IPV6_JOIN_GROUP, &all_rtrs, len) != 0) { jniThrowExceptionFmt(env, "java/net/SocketException", "setsockopt(IPV6_JOIN_GROUP): %s", strerror(errno)); return; } } /* * JNI registration. */ static const JNINativeMethod gMethods[] = { /* name, signature, funcPtr */ { "configOffload", "()Z", (void*) android_server_connectivity_tethering_OffloadHardwareInterface_configOffload }, { "configOffload", "()Z", (void*) android_net_util_configOffload }, { "setupRaSocket", "(Ljava/io/FileDescriptor;I)V", (void*) android_net_util_setupRaSocket }, }; int register_android_server_connectivity_tethering_OffloadHardwareInterface(JNIEnv* env) { int register_android_net_util_TetheringUtils(JNIEnv* env) { return jniRegisterNativeMethods(env, "com/android/server/connectivity/tethering/OffloadHardwareInterface", "android/net/util/TetheringUtils", gMethods, NELEM(gMethods)); } Loading @@ -152,7 +246,7 @@ extern "C" jint JNI_OnLoad(JavaVM* vm, void*) { return JNI_ERR; } if (register_android_server_connectivity_tethering_OffloadHardwareInterface(env) < 0) { if (register_android_net_util_TetheringUtils(env) < 0) { return JNI_ERR; } Loading
packages/Tethering/src/android/net/ip/RouterAdvertisementDaemon.java +2 −1 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ import android.net.LinkAddress; import android.net.NetworkUtils; import android.net.TrafficStats; import android.net.util.InterfaceParams; import android.net.util.TetheringUtils; import android.system.ErrnoException; import android.system.Os; import android.system.StructTimeval; Loading Loading @@ -613,7 +614,7 @@ public class RouterAdvertisementDaemon { mSocket, SOL_SOCKET, SO_SNDTIMEO, StructTimeval.fromMillis(send_timout_ms)); Os.setsockoptIfreq(mSocket, SOL_SOCKET, SO_BINDTODEVICE, mInterface.name); NetworkUtils.protectFromVpn(mSocket); NetworkUtils.setupRaSocket(mSocket, mInterface.index); TetheringUtils.setupRaSocket(mSocket, mInterface.index); } catch (ErrnoException | IOException e) { Log.e(TAG, "Failed to create RA daemon socket: " + e); return false; Loading