#define MSG_NOSIGNAL 0
#endif
-int addressfamily = AF_UNSPEC;
-int seconds_till_retry = 5;
-int max_connection_burst = 100;
+static const int max_connection_burst = 100;
/* Setup sockets */
#endif
#if defined(IP_MTU_DISCOVER) && defined(IP_PMTUDISC_DO)
-
- if(mesh->self->options & OPTION_PMTU_DISCOVERY) {
- option = IP_PMTUDISC_DO;
- setsockopt(nfd, IPPROTO_IP, IP_MTU_DISCOVER, (void *)&option, sizeof(option));
- }
-
+ option = IP_PMTUDISC_DO;
+ setsockopt(nfd, IPPROTO_IP, IP_MTU_DISCOVER, (void *)&option, sizeof(option));
#elif defined(IP_DONTFRAGMENT)
-
- if(mesh->self->options & OPTION_PMTU_DISCOVERY) {
- option = 1;
- setsockopt(nfd, IPPROTO_IP, IP_DONTFRAGMENT, (void *)&option, sizeof(option));
- }
-
-#else
-#warning No way to disable IPv4 fragmentation
+ option = 1;
+ setsockopt(nfd, IPPROTO_IP, IP_DONTFRAGMENT, (void *)&option, sizeof(option));
#endif
#if defined(IPV6_MTU_DISCOVER) && defined(IPV6_PMTUDISC_DO)
-
- if(mesh->self->options & OPTION_PMTU_DISCOVERY) {
- option = IPV6_PMTUDISC_DO;
- setsockopt(nfd, IPPROTO_IPV6, IPV6_MTU_DISCOVER, (void *)&option, sizeof(option));
- }
-
+ option = IPV6_PMTUDISC_DO;
+ setsockopt(nfd, IPPROTO_IPV6, IPV6_MTU_DISCOVER, (void *)&option, sizeof(option));
#elif defined(IPV6_DONTFRAG)
-
- if(mesh->self->options & OPTION_PMTU_DISCOVERY) {
- option = 1;
- setsockopt(nfd, IPPROTO_IPV6, IPV6_DONTFRAG, (void *)&option, sizeof(option));
- }
-
-#else
-#warning No way to disable IPv6 fragmentation
+ option = 1;
+ setsockopt(nfd, IPPROTO_IPV6, IPV6_DONTFRAG, (void *)&option, sizeof(option));
#endif
if(bind(nfd, &sa->sa, SALEN(sa->sa))) {
/* Now that there is a working socket, fill in the rest and register this connection. */
c->status.connecting = true;
+ c->status.initiator = true;
c->name = xstrdup(outgoing->node->name);
c->last_ping_time = mesh->loop.now.tv_sec;
}
/// Delayed close of a filedescriptor.
-static void tarpit(int fd) {
- static int pits[10] = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
- static int next_pit = 0;
+static void tarpit(meshlink_handle_t *mesh, int fd) {
+ if(!fd) {
+ return;
+ }
- if(pits[next_pit] != -1) {
- closesocket(pits[next_pit]);
+ if(mesh->pits[mesh->next_pit]) {
+ closesocket(mesh->pits[mesh->next_pit]);
}
- pits[next_pit++] = fd;
+ mesh->pits[mesh->next_pit++] = fd;
- if(next_pit >= (int)(sizeof pits / sizeof pits[0])) {
- next_pit = 0;
+ if(mesh->next_pit >= (int)(sizeof mesh->pits / sizeof mesh->pits[0])) {
+ mesh->next_pit = 0;
}
}
/* Rate limit incoming connections to max_connection_burst/second. */
- static int connection_burst;
- static int connection_burst_time;
-
- if(mesh->loop.now.tv_sec != connection_burst_time) {
- connection_burst_time = mesh->loop.now.tv_sec;
- connection_burst = 0;
+ if(mesh->loop.now.tv_sec != mesh->connection_burst_time) {
+ mesh->connection_burst_time = mesh->loop.now.tv_sec;
+ mesh->connection_burst = 0;
}
- if(connection_burst >= max_connection_burst) {
- tarpit(fd);
+ if(mesh->connection_burst >= max_connection_burst) {
+ tarpit(mesh, fd);
return;
}
- connection_burst++;
+ mesh->connection_burst++;
// Accept the new connection