aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Goulet <dgoulet@torproject.org>2022-12-20 09:09:47 -0500
committerDavid Goulet <dgoulet@torproject.org>2022-12-20 09:09:47 -0500
commit713efae94bf3d9038c83f09a6d808b087144a5d6 (patch)
treec9bda863fd96a0878462e97333efea404564478c
parentcfdc9f9d29fb369a139f4a3a35a829ebe66807bb (diff)
parent1d9166c8c915c14f67612ace8a9449aa3049c2f9 (diff)
downloadtor-713efae94bf3d9038c83f09a6d808b087144a5d6.tar.gz
tor-713efae94bf3d9038c83f09a6d808b087144a5d6.zip
Merge branch 'maint-0.4.7'
-rw-r--r--src/core/mainloop/connection.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/src/core/mainloop/connection.c b/src/core/mainloop/connection.c
index 4c9569ad5b..d99498d6be 100644
--- a/src/core/mainloop/connection.c
+++ b/src/core/mainloop/connection.c
@@ -2250,6 +2250,30 @@ connection_connect_sockaddr,(connection_t *conn,
}
#endif
+ /* From ip(7): Inform the kernel to not reserve an ephemeral port when using
+ * bind(2) with a port number of 0. The port will later be automatically
+ * chosen at connect(2) time, in a way that allows sharing a source port as
+ * long as the 4-tuple is unique.
+ *
+ * This is needed for relays using OutboundBindAddresses because the port
+ * value in the bind address is set to 0. */
+#ifdef IP_BIND_ADDRESS_NO_PORT
+ static int try_ip_bind_address_no_port = 1;
+ if (bindaddr && try_ip_bind_address_no_port &&
+ setsockopt(s, SOL_IP, IP_BIND_ADDRESS_NO_PORT, &(int){1}, sizeof(int))) {
+ if (errno == EINVAL) {
+ log_notice(LD_NET, "Tor was built with support for "
+ "IP_BIND_ADDRESS_NO_PORT, but the current kernel "
+ "doesn't support it. This might cause Tor to run out "
+ "of ephemeral ports more quickly.");
+ try_ip_bind_address_no_port = 0;
+ } else {
+ log_warn(LD_NET, "Error setting IP_BIND_ADDRESS_NO_PORT on new "
+ "connection: %s", tor_socket_strerror(errno));
+ }
+ }
+#endif
+
if (bindaddr && bind(s, bindaddr, bindaddr_len) < 0) {
*socket_error = tor_socket_errno(s);
if (ERRNO_IS_EADDRINUSE(*socket_error)) {