Throttle the rate of MTU_INFO messages.
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.
This commit is contained in:
parent
467397f25d
commit
76a9be5bce
8 changed files with 24 additions and 3 deletions
|
@ -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];
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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},
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue