From: Lennart Poettering Date: Tue, 17 Nov 2020 10:19:24 +0000 (+0100) Subject: resolved: enable TCP_FASTOPEN + TCP_NODELAY on stub TCP socket X-Git-Tag: v248-rc1~65^2~1 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8624f1286a1be8a4013e55b0dccb0813c91063a9;p=thirdparty%2Fsystemd.git resolved: enable TCP_FASTOPEN + TCP_NODELAY on stub TCP socket Latency matters. Four our local DNS stub it's not really that important, but let's still do it, it's basically free after all. --- diff --git a/src/resolve/resolved-dns-stub.c b/src/resolve/resolved-dns-stub.c index 58845ccf8f6..5311bc88743 100644 --- a/src/resolve/resolved-dns-stub.c +++ b/src/resolve/resolved-dns-stub.c @@ -1,6 +1,7 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #include +#include #include "errno-util.h" #include "fd-util.h" @@ -987,6 +988,22 @@ static int set_dns_stub_common_socket_options(int fd, int family) { return 0; } +static int set_dns_stub_common_tcp_socket_options(int fd) { + int r; + + assert(fd >= 0); + + r = setsockopt_int(fd, IPPROTO_TCP, TCP_FASTOPEN, 5); /* Everybody appears to pick qlen=5, let's do the same here. */ + if (r < 0) + log_debug_errno(r, "Failed to enable TCP_FASTOPEN on TCP listening socket, ignoring: %m"); + + r = setsockopt_int(fd, IPPROTO_TCP, TCP_NODELAY, true); + if (r < 0) + log_debug_errno(r, "Failed to enable TCP_NODELAY mode, ignoring: %m"); + + return 0; +} + static int manager_dns_stub_fd(Manager *m, int type) { union sockaddr_union sa = { .in.sin_family = AF_INET, @@ -1010,6 +1027,12 @@ static int manager_dns_stub_fd(Manager *m, int type) { if (r < 0) return r; + if (type == SOCK_STREAM) { + r = set_dns_stub_common_tcp_socket_options(fd); + if (r < 0) + return r; + } + /* Make sure no traffic from outside the local host can leak to onto this socket */ r = socket_bind_to_ifindex(fd, LOOPBACK_IFINDEX); if (r < 0) @@ -1081,6 +1104,12 @@ static int manager_dns_stub_fd_extra(Manager *m, DnsStubListenerExtra *l, int ty if (r < 0) goto fail; + if (type == SOCK_STREAM) { + r = set_dns_stub_common_tcp_socket_options(fd); + if (r < 0) + goto fail; + } + /* Do not set IP_TTL for extra DNS stub listeners, as the address may not be local and in that case * people may want ttl > 1. */