if(n->mtuprobes > 32) {
if(!n->minmtu) {
n->mtuprobes = 31;
- timeout = mesh->pinginterval;
+ timeout = mesh->dev_class_traits[n->devclass].pinginterval;
goto end;
}
n->mtuprobes = 1;
n->minmtu = 0;
n->maxmtu = MTU;
+
+ update_node_pmtu(mesh, n);
}
if(n->mtuprobes >= 10 && n->mtuprobes < 32 && !n->minmtu) {
if(n->mtuprobes == 30 || (n->mtuprobes < 30 && n->minmtu >= n->maxmtu)) {
if(n->minmtu > n->maxmtu) {
n->minmtu = n->maxmtu;
+ update_node_pmtu(mesh, n);
} else {
n->maxmtu = n->minmtu;
}
}
if(n->mtuprobes == 31) {
- timeout = mesh->pinginterval;
+ timeout = mesh->dev_class_traits[n->devclass].pinginterval;
goto end;
} else if(n->mtuprobes == 32) {
- timeout = mesh->pingtimeout;
+ timeout = mesh->dev_class_traits[n->devclass].pingtimeout;
}
for(int i = 0; i < 5; i++) {
} else if(n->maxmtu <= n->minmtu) {
len = n->maxmtu;
} else {
- len = n->minmtu + 1 + rand() % (n->maxmtu - n->minmtu);
+ len = n->minmtu + 1 + prng(mesh, n->maxmtu - n->minmtu);
}
if(len < 64) {
end:
timeout_set(&mesh->loop, &n->mtutimeout, &(struct timeval) {
- timeout, rand() % 100000
+ timeout, prng(mesh, TIMER_FUDGE)
});
}
}
static void mtu_probe_h(meshlink_handle_t *mesh, node_t *n, vpn_packet_t *packet, uint16_t len) {
+ if(len < 64) {
+ logger(mesh, MESHLINK_WARNING, "Got too short MTU probe length %d from %s", packet->len, n->name);
+ return;
+ }
+
logger(mesh, MESHLINK_DEBUG, "Got MTU probe length %d from %s", packet->len, n->name);
if(!packet->data[0]) {
if(n->minmtu < len) {
n->minmtu = len;
+ update_node_pmtu(mesh, n);
}
}
}
So we pick a random edge and a random socket. */
int i = 0;
- int j = rand() % n->edge_tree->count;
+ int j = prng(mesh, n->edge_tree->count);
edge_t *candidate = NULL;
for splay_each(edge_t, e, n->edge_tree) {
if(candidate) {
*sa = &candidate->address;
- *sock = rand() % mesh->listen_sockets;
+ *sock = prng(mesh, mesh->listen_sockets);
}
/* Make sure we have a suitable socket for the chosen address */
}
};
- *sock = rand() % mesh->listen_sockets;
+ *sock = prng(mesh, mesh->listen_sockets);
if(mesh->listen_socket[*sock].sa.sa.sa_family == AF_INET6) {
broadcast_ipv6.in6.sin6_port = n->prevedge->address.in.sin_port;
}
bool send_sptps_data(void *handle, uint8_t type, const void *data, size_t len) {
+ assert(handle);
+ assert(data);
+ assert(len);
+
node_t *to = handle;
meshlink_handle_t *mesh = to->mesh;
}
bool receive_sptps_record(void *handle, uint8_t type, const void *data, uint16_t len) {
+ assert(handle);
+ assert(!data || len);
+
node_t *from = handle;
meshlink_handle_t *mesh = from->mesh;