Throttle the rate of MTU_INFO messages.
authorEtienne Dechamps <etienne@edechamps.fr>
Sun, 8 Mar 2015 20:17:27 +0000 (20:17 +0000)
committerEtienne Dechamps <etienne@edechamps.fr>
Sat, 14 Mar 2015 13:39:05 +0000 (13:39 +0000)
This makes sure MTU_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 ca1a5aa6cb04a73e3a658c5a43dd6123a35360f0..ddbc34acd50a49e4e61d6d6dad47d3483816fcbb 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 UDPInfoInterval 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 MTUInfoInterval 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 1ae8f39638c421adb6de99361f74f8b377ccba31..5673686911d797b2aa14b3537b806ec643c4ce55 100644 (file)
@@ -571,6 +571,8 @@ This option controls the initial path MTU to this node.
 .It Va PMTUDiscovery Li = yes | no Po yes Pc
 When this option is enabled, tinc will try to discover the path MTU to this node.
 After the path MTU has been discovered, it will be enforced on the VPN.
+.It Va MTUInfoInterval Li = Ar seconds Pq 5
+The minimum amount of time between sending periodic updates about relay path MTU. Useful for quickly determining MTU to indirect nodes.
 .It Va Port Li = Ar port Pq 655
 The port number on which this tinc daemon is listening for incoming connections,
 which is used if no port number is specified in an
index 5efabf293b0c6c6af45c7aa9971015078baf7dd3..3fe27b6a7ee8c1df232bdfc471d04dff69c55257 100644 (file)
@@ -1333,6 +1333,10 @@ This option controls the initial path MTU to this node.
 When this option is enabled, tinc will try to discover the path MTU to this node.
 After the path MTU has been discovered, it will be enforced on the VPN.
 
+@cindex MTUInfoInterval
+@item MTUInfoInterval = <seconds> (5)
+The minimum amount of time between sending periodic updates about relay path MTU. Useful for quickly determining MTU to indirect nodes.
+
 @cindex Port
 @item Port = <@var{port}> (655)
 This is the port this tinc daemon listens on.
index 5fc976e3e973f102bf0cf09f14129c681ed00c42..1b0294bd40ce299b779a2ba7aa9aaa468d5267d9 100644 (file)
--- a/src/net.h
+++ b/src/net.h
@@ -143,6 +143,7 @@ extern int udp_discovery_keepalive_interval;
 extern int udp_discovery_interval;
 extern int udp_discovery_timeout;
 
+extern int mtu_info_interval;
 extern int udp_info_interval;
 
 extern listen_socket_t listen_socket[MAXSOCKETS];
index 7fd7d42320cbd68e0a326d2250ec976844dfa77e..83fbc2da38a92228b164f60bd83c96a03277378d 100644 (file)
@@ -518,6 +518,7 @@ 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, "MTUInfoInterval"), &mtu_info_interval);
        get_config_int(lookup_config(config_tree, "UDPInfoInterval"), &udp_info_interval);
 
        get_config_bool(lookup_config(config_tree, "DirectOnly"), &directonly);
index 5d7e677efa270a0e3eea3960502a3a2788fb2d53..0800337cf7dee4a910c179dfd4a1317d7e51c8f3 100644 (file)
@@ -95,6 +95,7 @@ typedef struct node_t {
 
        struct timeval mtu_ping_sent;           /* Last time a MTU probe was sent */
 
+       struct timeval mtu_info_sent;           /* Last time a MTU_INFO message was sent */
        struct timeval udp_info_sent;           /* Last time a UDP_INFO message was sent */
 
        length_t maxrecentlen;                  /* Maximum size of recently received packets */
index d76ab0933a21f61c1591fda9602f3714a0727578..6fedc0823b86785224b64a845484ff5c5b4f2ee5 100644 (file)
@@ -31,6 +31,7 @@
 #include "xalloc.h"
 
 int maxoutbufsize = 0;
+int mtu_info_interval = 5;
 int udp_info_interval = 5;
 
 /* Status and error notification routines */
@@ -261,8 +262,15 @@ bool send_mtu_info(node_t *from, node_t *to, int mtu) {
        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->mtu_info_sent, &elapsed);
+               if(elapsed.tv_sec < mtu_info_interval)
+                       return true;
+       }
 
        if((to->nexthop->options >> 24) < 6)
                return true;
@@ -284,6 +292,9 @@ bool send_mtu_info(node_t *from, node_t *to, int mtu) {
                mtu = MIN(mtu, via->nexthop->minmtu);
        }
 
+       if(from == myself)
+               to->mtu_info_sent = now;
+
        /* If none of the conditions above match in the steady state, it means we're using TCP,
           so the MTU is irrelevant. That said, it is still important to honor the MTU that was passed in,
           because other parts of the relay path might be able to use UDP, which means they care about the MTU. */
index 0bb35e7108b52ae937219b68eb1e5d8ab12ad01a..91f63effb08f16789595ea364603f70bb0597d99 100644 (file)
@@ -1371,6 +1371,7 @@ const var_t variables[] = {
        {"UDPDiscoveryKeepaliveInterval", VAR_SERVER},
        {"UDPDiscoveryInterval", VAR_SERVER},
        {"UDPDiscoveryTimeout", VAR_SERVER},
+       {"MTUInfoInterval", VAR_SERVER},
        {"UDPInfoInterval", VAR_SERVER},
        {"UDPRcvBuf", VAR_SERVER},
        {"UDPSndBuf", VAR_SERVER},