diff --git a/Tethering/src/com/android/networkstack/tethering/OffloadHardwareInterface.java b/Tethering/src/com/android/networkstack/tethering/OffloadHardwareInterface.java index 53c80ae123..13a7a22f57 100644 --- a/Tethering/src/com/android/networkstack/tethering/OffloadHardwareInterface.java +++ b/Tethering/src/com/android/networkstack/tethering/OffloadHardwareInterface.java @@ -16,6 +16,7 @@ package com.android.networkstack.tethering; +import static com.android.net.module.util.netlink.NetlinkUtils.SOCKET_RECV_BUFSIZE; import static com.android.net.module.util.netlink.StructNlMsgHdr.NLM_F_DUMP; import static com.android.net.module.util.netlink.StructNlMsgHdr.NLM_F_REQUEST; @@ -198,7 +199,8 @@ public class OffloadHardwareInterface { public NativeHandle createConntrackSocket(final int groups) { final FileDescriptor fd; try { - fd = NetlinkUtils.netlinkSocketForProto(OsConstants.NETLINK_NETFILTER); + fd = NetlinkUtils.netlinkSocketForProto(OsConstants.NETLINK_NETFILTER, + SOCKET_RECV_BUFSIZE); } catch (ErrnoException e) { mLog.e("Unable to create conntrack socket " + e); return null; diff --git a/service-t/src/com/android/server/IpSecXfrmController.java b/service-t/src/com/android/server/IpSecXfrmController.java index c8abd406ca..3cfbf83fe7 100644 --- a/service-t/src/com/android/server/IpSecXfrmController.java +++ b/service-t/src/com/android/server/IpSecXfrmController.java @@ -15,6 +15,7 @@ */ package com.android.server; +import static com.android.net.module.util.netlink.NetlinkUtils.SOCKET_RECV_BUFSIZE; import static com.android.net.module.util.netlink.xfrm.XfrmNetlinkMessage.IPPROTO_ESP; import static com.android.net.module.util.netlink.xfrm.XfrmNetlinkMessage.NETLINK_XFRM; import static com.android.net.module.util.netlink.xfrm.XfrmNetlinkMessage.XFRM_MSG_NEWSA; @@ -106,7 +107,8 @@ public class IpSecXfrmController { public static class Dependencies { /** Get a new XFRM netlink socket and connect it */ public FileDescriptor newNetlinkSocket() throws ErrnoException, SocketException { - final FileDescriptor fd = NetlinkUtils.netlinkSocketForProto(NETLINK_XFRM); + final FileDescriptor fd = + NetlinkUtils.netlinkSocketForProto(NETLINK_XFRM, SOCKET_RECV_BUFSIZE); NetlinkUtils.connectToKernel(fd); return fd; } diff --git a/staticlibs/device/com/android/net/module/util/netlink/InetDiagMessage.java b/staticlibs/device/com/android/net/module/util/netlink/InetDiagMessage.java index b980c7d81d..fecaa09289 100644 --- a/staticlibs/device/com/android/net/module/util/netlink/InetDiagMessage.java +++ b/staticlibs/device/com/android/net/module/util/netlink/InetDiagMessage.java @@ -31,6 +31,7 @@ import static com.android.net.module.util.netlink.NetlinkConstants.stringForAddr import static com.android.net.module.util.netlink.NetlinkConstants.stringForProtocol; import static com.android.net.module.util.netlink.NetlinkUtils.DEFAULT_RECV_BUFSIZE; import static com.android.net.module.util.netlink.NetlinkUtils.IO_TIMEOUT_MS; +import static com.android.net.module.util.netlink.NetlinkUtils.SOCKET_RECV_BUFSIZE; import static com.android.net.module.util.netlink.NetlinkUtils.TCP_ALIVE_STATE_FILTER; import static com.android.net.module.util.netlink.NetlinkUtils.connectToKernel; import static com.android.net.module.util.netlink.StructNlMsgHdr.NLM_F_DUMP; @@ -281,7 +282,7 @@ public class InetDiagMessage extends NetlinkMessage { int uid = INVALID_UID; FileDescriptor fd = null; try { - fd = NetlinkUtils.netlinkSocketForProto(NETLINK_INET_DIAG); + fd = NetlinkUtils.netlinkSocketForProto(NETLINK_INET_DIAG, SOCKET_RECV_BUFSIZE); connectToKernel(fd); uid = lookupUid(protocol, local, remote, fd); } catch (ErrnoException | SocketException | IllegalArgumentException diff --git a/staticlibs/device/com/android/net/module/util/netlink/NetlinkUtils.java b/staticlibs/device/com/android/net/module/util/netlink/NetlinkUtils.java index 81adcd6f29..61d347cd69 100644 --- a/staticlibs/device/com/android/net/module/util/netlink/NetlinkUtils.java +++ b/staticlibs/device/com/android/net/module/util/netlink/NetlinkUtils.java @@ -86,6 +86,7 @@ public class NetlinkUtils { public static final int DEFAULT_RECV_BUFSIZE = 8 * 1024; public static final int SOCKET_RECV_BUFSIZE = 64 * 1024; + public static final int SOCKET_DUMP_RECV_BUFSIZE = 128 * 1024; /** * Return whether the input ByteBuffer contains enough remaining bytes for @@ -160,7 +161,7 @@ public class NetlinkUtils { */ public static void sendOneShotKernelMessage(int nlProto, byte[] msg) throws ErrnoException { final String errPrefix = "Error in NetlinkSocket.sendOneShotKernelMessage"; - final FileDescriptor fd = netlinkSocketForProto(nlProto); + final FileDescriptor fd = netlinkSocketForProto(nlProto, SOCKET_RECV_BUFSIZE); try { connectToKernel(fd); @@ -226,12 +227,18 @@ public class NetlinkUtils { /** * Create netlink socket with the given netlink protocol type. * + * @param nlProto the netlink protocol + * @param bufferSize the receive buffer size to set when the value is not 0 + * * @return fd the fileDescriptor of the socket. * @throws ErrnoException if the FileDescriptor not connect to be created successfully */ - public static FileDescriptor netlinkSocketForProto(int nlProto) throws ErrnoException { + public static FileDescriptor netlinkSocketForProto(int nlProto, int bufferSize) + throws ErrnoException { final FileDescriptor fd = Os.socket(AF_NETLINK, SOCK_DGRAM | SOCK_CLOEXEC, nlProto); - Os.setsockoptInt(fd, SOL_SOCKET, SO_RCVBUF, SOCKET_RECV_BUFSIZE); + if (bufferSize > 0) { + Os.setsockoptInt(fd, SOL_SOCKET, SO_RCVBUF, bufferSize); + } return fd; } @@ -239,7 +246,7 @@ public class NetlinkUtils { * Construct a netlink inet_diag socket. */ public static FileDescriptor createNetLinkInetDiagSocket() throws ErrnoException { - return Os.socket(AF_NETLINK, SOCK_DGRAM | SOCK_CLOEXEC, NETLINK_INET_DIAG); + return netlinkSocketForProto(NETLINK_INET_DIAG, 0); } /** @@ -374,7 +381,7 @@ public class NetlinkUtils { Consumer func) throws SocketException, InterruptedIOException, ErrnoException { // Create socket - final FileDescriptor fd = netlinkSocketForProto(nlFamily); + final FileDescriptor fd = netlinkSocketForProto(nlFamily, SOCKET_DUMP_RECV_BUFSIZE); try { getAndProcessNetlinkDumpMessagesWithFd(fd, dumpRequestMessage, nlFamily, msgClass, func); diff --git a/staticlibs/tests/unit/src/com/android/net/module/util/netlink/NetlinkUtilsTest.java b/staticlibs/tests/unit/src/com/android/net/module/util/netlink/NetlinkUtilsTest.java index 0958f11d2a..b644a53b92 100644 --- a/staticlibs/tests/unit/src/com/android/net/module/util/netlink/NetlinkUtilsTest.java +++ b/staticlibs/tests/unit/src/com/android/net/module/util/netlink/NetlinkUtilsTest.java @@ -21,6 +21,8 @@ import static android.system.OsConstants.AF_INET6; import static android.system.OsConstants.AF_UNSPEC; import static android.system.OsConstants.EACCES; import static android.system.OsConstants.NETLINK_ROUTE; +import static android.system.OsConstants.SOL_SOCKET; +import static android.system.OsConstants.SO_RCVBUF; import static com.android.net.module.util.netlink.NetlinkConstants.RTNL_FAMILY_IP6MR; import static com.android.net.module.util.netlink.NetlinkUtils.DEFAULT_RECV_BUFSIZE; import static com.android.net.module.util.netlink.StructNlMsgHdr.NLM_F_DUMP; @@ -33,6 +35,8 @@ import static org.junit.Assert.fail; import static org.junit.Assume.assumeFalse; import android.content.Context; +import android.net.util.SocketUtils; +import android.os.Build; import android.system.ErrnoException; import android.system.NetlinkSocketAddress; import android.system.Os; @@ -43,6 +47,7 @@ import androidx.test.runner.AndroidJUnit4; import com.android.modules.utils.build.SdkLevel; import com.android.net.module.util.Struct; +import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo; import libcore.io.IoUtils; @@ -204,4 +209,23 @@ public class NetlinkUtilsTest { assertNotNull("Route doesn't contain destination: " + route, route.getDestination()); } } + + @Test @IgnoreUpTo(Build.VERSION_CODES.R) // getsockoptInt requires > R + public void testNetlinkSocketForProto_defaultBufferSize() throws Exception { + final FileDescriptor fd = NetlinkUtils.netlinkSocketForProto(NETLINK_ROUTE, 0); + final int bufferSize = Os.getsockoptInt(fd, SOL_SOCKET, SO_RCVBUF) / 2; + + assertTrue("bufferSize: " + bufferSize, bufferSize > 0); // whatever the default value is + SocketUtils.closeSocket(fd); + } + + @Test @IgnoreUpTo(Build.VERSION_CODES.R) // getsockoptInt requires > R + public void testNetlinkSocketForProto_setBufferSize() throws Exception { + final FileDescriptor fd = NetlinkUtils.netlinkSocketForProto(NETLINK_ROUTE, + 8000); + final int bufferSize = Os.getsockoptInt(fd, SOL_SOCKET, SO_RCVBUF) / 2; + + assertEquals(8000, bufferSize); + SocketUtils.closeSocket(fd); + } } diff --git a/thread/service/java/com/android/server/thread/TunInterfaceController.java b/thread/service/java/com/android/server/thread/TunInterfaceController.java index 7223b2af9e..619a51015b 100644 --- a/thread/service/java/com/android/server/thread/TunInterfaceController.java +++ b/thread/service/java/com/android/server/thread/TunInterfaceController.java @@ -60,7 +60,8 @@ public class TunInterfaceController { public void createTunInterface() throws IOException { mParcelTunFd = ParcelFileDescriptor.adoptFd(nativeCreateTunInterface(mIfName, MTU)); try { - mNetlinkSocket = NetlinkUtils.netlinkSocketForProto(OsConstants.NETLINK_ROUTE); + mNetlinkSocket = + NetlinkUtils.netlinkSocketForProto(OsConstants.NETLINK_ROUTE, 0); } catch (ErrnoException e) { throw new IOException("Failed to create netlink socket", e); }