Throttle the rate of UDP_INFO messages.
authorEtienne Dechamps <etienne@edechamps.fr>
Sun, 8 Mar 2015 19:54:44 +0000 (19:54 +0000)
committerEtienne Dechamps <etienne@edechamps.fr>
Sat, 14 Mar 2015 13:39:05 +0000 (13:39 +0000)
This makes sure UDP_INFO messages are only sent at the maximum rate of
5 per second (by default). As usual with these "probe" mechanisms, the
rate of these messages cannot be higher than the rate of data packets
themselves, since they are sent from the RX path.

bash_completion.d/tinc
doc/tinc.conf.5.in
doc/tinc.texi
src/net.h
src/net_setup.c
src/node.h
src/protocol_misc.c
src/tincctl.c

index 01629afb9f0b614ff663a03fbdf6ff7da271a449..ca1a5aa6cb04a73e3a658c5a43dd6123a35360f0 100644 (file)
@@ -4,7 +4,7 @@ _tinc() {
        cur="${COMP_WORDS[COMP_CWORD]}"
        prev="${COMP_WORDS[COMP_CWORD-1]}"
        opts="-c -d -D -K -n -o -L -R -U --config --no-detach --debug --net --option --mlock --logfile --pidfile --chroot --user --help --version"
-       confvars="Address AddressFamily BindToAddress BindToInterface Broadcast BroadcastSubnet Cipher ClampMSS Compression ConnectTo DecrementTTL Device DeviceStandby DeviceType Digest DirectOnly Ed25519PrivateKeyFile Ed25519PublicKey Ed25519PublicKeyFile ExperimentalProtocol Forwarding GraphDumpFile Hostnames IffOneQueue IndirectData Interface KeyExpire ListenAddress LocalDiscovery MACExpire MACLength MaxOutputBufferSize MaxTimeout Mode Name PMTU PMTUDiscovery PingInterval PingTimeout Port PriorityInheritance PrivateKeyFile ProcessPriority Proxy PublicKeyFile ReplayWindow StrictSubnets Subnet TCPOnly TunnelServer UDPDiscovery UDPDiscoveryKeepaliveInterval UDPDiscoveryInterval UDPDiscoveryTimeout UDPRcvBuf UDPSndBuf VDEGroup VDEPort Weight"
+       confvars="Address AddressFamily BindToAddress BindToInterface Broadcast BroadcastSubnet Cipher ClampMSS Compression ConnectTo DecrementTTL Device DeviceStandby DeviceType Digest DirectOnly Ed25519PrivateKeyFile Ed25519PublicKey Ed25519PublicKeyFile ExperimentalProtocol Forwarding GraphDumpFile Hostnames IffOneQueue IndirectData Interface KeyExpire ListenAddress LocalDiscovery MACExpire MACLength MaxOutputBufferSize MaxTimeout Mode Name PMTU PMTUDiscovery PingInterval PingTimeout Port PriorityInheritance PrivateKeyFile ProcessPriority Proxy PublicKeyFile ReplayWindow StrictSubnets Subnet TCPOnly TunnelServer UDPDiscovery UDPDiscoveryKeepaliveInterval UDPDiscoveryInterval UDPDiscoveryTimeout UDPInfoInterval UDPRcvBuf UDPSndBuf VDEGroup VDEPort Weight"
        commands="add connect debug del disconnect dump edit export export-all generate-ed25519-keys generate-keys generate-rsa-keys get help import info init invite join log network pcap pid purge reload restart retry set start stop top version"
 
        case ${prev} in
index bc481ead83e01a636f241a3edef2e7120ab9e024..1ae8f39638c421adb6de99361f74f8b377ccba31 100644 (file)
@@ -500,6 +500,8 @@ The minimum amount of time between sending UDP ping datagrams to try to establis
 .It Va UDPDiscoveryTimeout Li = Ar seconds Pq 30
 If tinc doesn't receive any UDP ping replies over the specified interval,
 it will assume UDP communication is broken and will fall back to TCP.
+.It Va UDPInfoInterval Li = Ar seconds Pq 5
+The minimum amount of time between sending periodic updates about UDP addresses, which are mostly useful for UDP hole punching.
 .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.
index 581da6eade277fc6b0ab0e6c36dcdfd1bbc2afa5..5efabf293b0c6c6af45c7aa9971015078baf7dd3 100644 (file)
@@ -1253,6 +1253,10 @@ The minimum amount of time between sending UDP ping datagrams to try to establis
 If tinc doesn't receive any UDP ping replies over the specified interval,
 it will assume UDP communication is broken and will fall back to TCP.
 
+@cindex UDPInfoInterval
+@item UDPInfoInterval = <seconds> (5)
+The minimum amount of time between sending periodic updates about UDP addresses, which are mostly useful for UDP hole punching.
+
 @cindex UDPRcvBuf
 @item UDPRcvBuf = <bytes> (OS default)
 Sets the socket receive buffer size for the UDP socket, in bytes.
index cfc44d23d5c77878f1478b46dfeecd106340c8b2..5fc976e3e973f102bf0cf09f14129c681ed00c42 100644 (file)
--- a/src/net.h
+++ b/src/net.h
@@ -143,6 +143,8 @@ extern int udp_discovery_keepalive_interval;
 extern int udp_discovery_interval;
 extern int udp_discovery_timeout;
 
+extern int udp_info_interval;
+
 extern listen_socket_t listen_socket[MAXSOCKETS];
 extern int listen_sockets;
 extern io_t unix_socket;
index d1d5c04be36ff5bfbbe002b106551a789a1635f2..7fd7d42320cbd68e0a326d2250ec976844dfa77e 100644 (file)
@@ -518,6 +518,8 @@ bool setup_myself_reloadable(void) {
        get_config_int(lookup_config(config_tree, "UDPDiscoveryInterval"), &udp_discovery_interval);
        get_config_int(lookup_config(config_tree, "UDPDiscoveryTimeout"), &udp_discovery_timeout);
 
+       get_config_int(lookup_config(config_tree, "UDPInfoInterval"), &udp_info_interval);
+
        get_config_bool(lookup_config(config_tree, "DirectOnly"), &directonly);
        get_config_bool(lookup_config(config_tree, "LocalDiscovery"), &localdiscovery);
 
index 5fe6dfa6786c8dabf1eb44db06e3781ae29f6e3c..5d7e677efa270a0e3eea3960502a3a2788fb2d53 100644 (file)
@@ -95,6 +95,8 @@ typedef struct node_t {
 
        struct timeval mtu_ping_sent;           /* Last time a MTU probe was sent */
 
+       struct timeval udp_info_sent;           /* Last time a UDP_INFO message was sent */
+
        length_t maxrecentlen;                  /* Maximum size of recently received packets */
 
        length_t mtu;                           /* Maximum size of packets to send to this node */
index 5fde83326342b9dd295b4da609623023ee8dd102..d76ab0933a21f61c1591fda9602f3714a0727578 100644 (file)
@@ -31,6 +31,7 @@
 #include "xalloc.h"
 
 int maxoutbufsize = 0;
+int udp_info_interval = 5;
 
 /* Status and error notification routines */
 
@@ -167,8 +168,15 @@ bool send_udp_info(node_t *from, node_t *to) {
        if(!to->status.reachable)
                return true;
 
-       if(from == myself && to->connection)
-               return true;
+       if(from == myself) {
+               if(to->connection)
+                       return true;
+
+               struct timeval elapsed;
+               timersub(&now, &to->udp_info_sent, &elapsed);
+               if(elapsed.tv_sec < udp_info_interval)
+                       return true;
+       }
 
        if((myself->options | from->options | to->options) & OPTION_TCPONLY)
                return true;
@@ -188,6 +196,9 @@ bool send_udp_info(node_t *from, node_t *to) {
        free(from_address);
        free(from_port);
 
+       if(from == myself)
+               to->udp_info_sent = now;
+
        return x;
 }
 
index b36de76d6bf69df3f72e7c0dc2de29ba9513303c..0bb35e7108b52ae937219b68eb1e5d8ab12ad01a 100644 (file)
@@ -1371,6 +1371,7 @@ const var_t variables[] = {
        {"UDPDiscoveryKeepaliveInterval", VAR_SERVER},
        {"UDPDiscoveryInterval", VAR_SERVER},
        {"UDPDiscoveryTimeout", VAR_SERVER},
+       {"UDPInfoInterval", VAR_SERVER},
        {"UDPRcvBuf", VAR_SERVER},
        {"UDPSndBuf", VAR_SERVER},
        {"VDEGroup", VAR_SERVER},