@@ -890,20 +890,23 @@
#endif
}
-static void
-socket_set_buffers(socket_descriptor_t fd, const struct socket_buffer_size *sbs)
+void
+socket_set_buffers(socket_descriptor_t fd, const struct socket_buffer_size *sbs,
+ bool reduce_size)
{
if (sbs)
{
const int sndbuf_old = socket_get_sndbuf(fd);
const int rcvbuf_old = socket_get_rcvbuf(fd);
- if (sbs->sndbuf)
+ if (sbs->sndbuf
+ && (reduce_size || sndbuf_old < sbs->sndbuf))
{
socket_set_sndbuf(fd, sbs->sndbuf);
}
- if (sbs->rcvbuf)
+ if (sbs->rcvbuf
+ && (reduce_size || rcvbuf_old < sbs->rcvbuf))
{
socket_set_rcvbuf(fd, sbs->rcvbuf);
}
@@ -986,7 +989,7 @@
{
ls->socket_buffer_sizes.sndbuf = sndbuf;
ls->socket_buffer_sizes.rcvbuf = rcvbuf;
- socket_set_buffers(ls->sd, &ls->socket_buffer_sizes);
+ socket_set_buffers(ls->sd, &ls->socket_buffer_sizes, true);
}
}
@@ -1136,7 +1139,7 @@
sock->info.af = addr->ai_family;
/* set socket buffers based on --sndbuf and --rcvbuf options */
- socket_set_buffers(sock->sd, &sock->socket_buffer_sizes);
+ socket_set_buffers(sock->sd, &sock->socket_buffer_sizes, true);
/* set socket to --mark packets with given value */
socket_set_mark(sock->sd, sock->mark);
@@ -157,6 +157,18 @@
int sndbuf;
};
+/**
+ * Sets the receive and send buffer sizes of a socket descriptor.
+ *
+ * @param fd The socket to modify
+ * @param sbs new sizes.
+ * @param reduce_size apply the new size even if smaller than current one
+ */
+void
+socket_set_buffers(socket_descriptor_t fd,
+ const struct socket_buffer_size *sbs,
+ bool reduce_size);
+
/*
* This is the main socket structure used by OpenVPN. The SOCKET_
* defines try to abstract away our implementation differences between
@@ -35,6 +35,7 @@
#include "wfp_block.h"
#include "argv.h"
#include "options.h"
+#include "socket.h"
#if defined(AF_UNIX) && !defined(WIN32)
/* Windows does implement some AF_UNIX functionality but key features
@@ -80,6 +81,13 @@
return;
}
+
+ /* Ensure that the buffer sizes are decently sized. Otherwise macOS will
+ * just have 2048 */
+ struct socket_buffer_size newsizes = {65536, 65536 };
+ socket_set_buffers(fds[0], &newsizes, false);
+ socket_set_buffers(fds[1], &newsizes, false);
+
/* Use the first file descriptor for our side and avoid passing it
* to the child */
tt->fd = fds[1];
Attention is currently required from: flichtenheld. Hello flichtenheld, I'd like you to do a code review. Please visit http://gerrit.openvpn.net/c/openvpn/+/754?usp=email to review the following change. Change subject: Ensure that the AF_UNIX socket pair has at least 65k of buffer space ...................................................................... Ensure that the AF_UNIX socket pair has at least 65k of buffer space Without this change, pinging a lwipovpn client with something like a 3000 byte payload on macOS often fails as the default buffer sizes on macOS are 2048 for send and 4096 for receive. Change-Id: Ice015df81543c01094479929f0cb3075ca4f3813 Signed-off-by: Arne Schwabe <arne@rfc2549.org> --- M src/openvpn/socket.c M src/openvpn/socket.h M src/openvpn/tun_afunix.c 3 files changed, 29 insertions(+), 6 deletions(-) git pull ssh://gerrit.openvpn.net:29418/openvpn refs/changes/54/754/1