From 8dfe1b374e165ecba5d3ae324ee834d337476be8 Mon Sep 17 00:00:00 2001 From: Brandon L Black Date: Sat, 13 Nov 2010 12:05:49 -0600 Subject: [PATCH] Configurable SO_RCVBUF/SO_SNDBUF for the UDP socket --- doc/tinc.conf.5.in | 8 ++++++++ src/net.h | 2 ++ src/net_setup.c | 14 ++++++++++++++ src/net_socket.c | 8 ++++++++ 4 files changed, 32 insertions(+) diff --git a/doc/tinc.conf.5.in b/doc/tinc.conf.5.in index 01f7f810..66aee4b6 100644 --- a/doc/tinc.conf.5.in +++ b/doc/tinc.conf.5.in @@ -356,6 +356,14 @@ and will only allow connections with nodes for which host config files are prese .Pa @sysconfdir@/tinc/ Ns Ar NETNAME Ns Pa /hosts/ directory. Setting this options also implicitly sets StrictSubnets. + +.It Va UDPRcvBuf Li = Ar bytes Pq OS default +Sets the socket receive buffer size for the UDP socket, in bytes. +If unset, the default buffer size will be used by the operating system. + +.It Va UDPSndBuf Li = Ar bytes Pq OS default +Sets the socket send buffer size for the UDP socket, in bytes. +If unset, the default buffer size will be used by the operating system. .El .Sh HOST CONFIGURATION FILES diff --git a/src/net.h b/src/net.h index eae979cd..8c92fc3e 100644 --- a/src/net.h +++ b/src/net.h @@ -111,6 +111,8 @@ extern listen_socket_t listen_socket[MAXSOCKETS]; extern int listen_sockets; extern int keyexpires; extern int keylifetime; +extern int udp_rcvbuf; +extern int udp_sndbuf; extern bool do_prune; extern bool do_purge; extern char *myport; diff --git a/src/net_setup.c b/src/net_setup.c index f4e56378..e7d3e40b 100644 --- a/src/net_setup.c +++ b/src/net_setup.c @@ -405,6 +405,20 @@ bool setup_myself(void) { } else maxtimeout = 900; + if(get_config_int(lookup_config(config_tree, "UDPRcvBuf"), &udp_rcvbuf)) { + if(udp_rcvbuf <= 0) { + logger(LOG_ERR, "UDPRcvBuf cannot be negative!"); + return false; + } + } + + if(get_config_int(lookup_config(config_tree, "UDPSndBuf"), &udp_sndbuf)) { + if(udp_sndbuf <= 0) { + logger(LOG_ERR, "UDPSndBuf cannot be negative!"); + return false; + } + } + if(get_config_string(lookup_config(config_tree, "AddressFamily"), &afname)) { if(!strcasecmp(afname, "IPv4")) addressfamily = AF_INET; diff --git a/src/net_socket.c b/src/net_socket.c index 762c0a22..20029e87 100644 --- a/src/net_socket.c +++ b/src/net_socket.c @@ -44,6 +44,8 @@ int addressfamily = AF_UNSPEC; int maxtimeout = 900; int seconds_till_retry = 5; +int udp_rcvbuf = 0; +int udp_sndbuf = 0; listen_socket_t listen_socket[MAXSOCKETS]; int listen_sockets; @@ -261,6 +263,12 @@ int setup_vpn_in_socket(const sockaddr_t *sa) { option = 1; setsockopt(nfd, SOL_SOCKET, SO_REUSEADDR, (void *)&option, sizeof(option)); + if(udp_rcvbuf && setsockopt(nfd, SOL_SOCKET, SO_RCVBUF, (void *)&udp_rcvbuf, sizeof(udp_rcvbuf))) + logger(LOG_WARNING, "Can't set UDP SO_RCVBUF to %i: %s", option, strerror(errno)); + + if(udp_sndbuf && setsockopt(nfd, SOL_SOCKET, SO_SNDBUF, (void *)&udp_sndbuf, sizeof(udp_sndbuf))) + logger(LOG_WARNING, "Can't set UDP SO_SNDBUF to %i: %s", option, strerror(errno)); + #if defined(IPPROTO_IPV6) && defined(IPV6_V6ONLY) if(sa->sa.sa_family == AF_INET6) setsockopt(nfd, IPPROTO_IPV6, IPV6_V6ONLY, (void *)&option, sizeof option); -- 2.20.1