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/ | ||||
| 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 | ||||
|  |  | |||
|  | @ -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; | ||||
|  |  | |||
|  | @ -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; | ||||
|  |  | |||
|  | @ -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); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue