timeout_t udp_ping_timeout; /* UDP probe event */
struct timespec last_mtu_probe_sent; /* Time that the last MTU probe was sent */
struct timespec last_udp_probe_sent; /* Time that the last UDP probe was sent */
- int mtuprobes; /* Number of probes */
+ int8_t mtuprobes; /* MTU probes counter */
+ int8_t udpprobes; /* UDP probes counter */
uint16_t last_mtu_len; /* Size of the last sent probe */
uint16_t mtu; /* Maximum size of packets to send to this node */
uint16_t maxmtu; /* Probed maximum MTU */
logger(mesh, MESHLINK_INFO, "Too much time has elapsed since last UDP ping response from %s, stopping UDP communication", n->name);
n->status.udp_confirmed = false;
n->mtuprobes = 0;
+ n->udpprobes = 0;
n->minmtu = 0;
n->maxmtu = MTU;
n->status.udp_confirmed = true;
}
+ n->udpprobes = 0;
+
// Reset the UDP ping timer.
timeout_del(&mesh->loop, &n->udp_ping_timeout);
static void try_udp(meshlink_handle_t *mesh, node_t *n) {
/* Probe request */
+ if(n->udpprobes < -3) {
+ /* We lost three UDP probes, UDP status is no longer unconfirmed */
+ udp_probe_timeout_handler(&mesh->loop, n);
+ }
+
struct timespec elapsed;
+
timespec_sub(&mesh->loop.now, &n->last_udp_probe_sent, &elapsed);
- int interval = n->status.udp_confirmed ? 10 : 2;
+ int interval = (n->status.udp_confirmed && n->udpprobes >= 0) ? 10 : 2;
if(elapsed.tv_sec >= interval) {
n->last_udp_probe_sent = mesh->loop.now;
send_udp_probe_packet(mesh, n, MIN_PROBE_SIZE);
+ n->udpprobes--;
if(!n->status.udp_confirmed && n->prevedge) {
n->status.broadcast = true;