Configurable SO_RCVBUF/SO_SNDBUF for the UDP socket
This commit is contained in:
parent
3f410e2f8f
commit
8dfe1b374e
4 changed files with 32 additions and 0 deletions
|
@ -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/
|
.Pa @sysconfdir@/tinc/ Ns Ar NETNAME Ns Pa /hosts/
|
||||||
directory.
|
directory.
|
||||||
Setting this options also implicitly sets StrictSubnets.
|
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
|
.El
|
||||||
|
|
||||||
.Sh HOST CONFIGURATION FILES
|
.Sh HOST CONFIGURATION FILES
|
||||||
|
|
|
@ -111,6 +111,8 @@ extern listen_socket_t listen_socket[MAXSOCKETS];
|
||||||
extern int listen_sockets;
|
extern int listen_sockets;
|
||||||
extern int keyexpires;
|
extern int keyexpires;
|
||||||
extern int keylifetime;
|
extern int keylifetime;
|
||||||
|
extern int udp_rcvbuf;
|
||||||
|
extern int udp_sndbuf;
|
||||||
extern bool do_prune;
|
extern bool do_prune;
|
||||||
extern bool do_purge;
|
extern bool do_purge;
|
||||||
extern char *myport;
|
extern char *myport;
|
||||||
|
|
|
@ -405,6 +405,20 @@ bool setup_myself(void) {
|
||||||
} else
|
} else
|
||||||
maxtimeout = 900;
|
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(get_config_string(lookup_config(config_tree, "AddressFamily"), &afname)) {
|
||||||
if(!strcasecmp(afname, "IPv4"))
|
if(!strcasecmp(afname, "IPv4"))
|
||||||
addressfamily = AF_INET;
|
addressfamily = AF_INET;
|
||||||
|
|
|
@ -44,6 +44,8 @@
|
||||||
int addressfamily = AF_UNSPEC;
|
int addressfamily = AF_UNSPEC;
|
||||||
int maxtimeout = 900;
|
int maxtimeout = 900;
|
||||||
int seconds_till_retry = 5;
|
int seconds_till_retry = 5;
|
||||||
|
int udp_rcvbuf = 0;
|
||||||
|
int udp_sndbuf = 0;
|
||||||
|
|
||||||
listen_socket_t listen_socket[MAXSOCKETS];
|
listen_socket_t listen_socket[MAXSOCKETS];
|
||||||
int listen_sockets;
|
int listen_sockets;
|
||||||
|
@ -261,6 +263,12 @@ int setup_vpn_in_socket(const sockaddr_t *sa) {
|
||||||
option = 1;
|
option = 1;
|
||||||
setsockopt(nfd, SOL_SOCKET, SO_REUSEADDR, (void *)&option, sizeof(option));
|
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 defined(IPPROTO_IPV6) && defined(IPV6_V6ONLY)
|
||||||
if(sa->sa.sa_family == AF_INET6)
|
if(sa->sa.sa_family == AF_INET6)
|
||||||
setsockopt(nfd, IPPROTO_IPV6, IPV6_V6ONLY, (void *)&option, sizeof option);
|
setsockopt(nfd, IPPROTO_IPV6, IPV6_V6ONLY, (void *)&option, sizeof option);
|
||||||
|
|
Loading…
Reference in a new issue