mirror of
https://github.com/ntop/n2n.git
synced 2024-09-20 00:51:10 +02:00
allowed (temporarily) initially non-resolving supernode names (#701)
This commit is contained in:
parent
c55e3e3246
commit
3c6ab56d3f
|
@ -62,6 +62,7 @@
|
||||||
|
|
||||||
#define SORT_COMMUNITIES_INTERVAL 90 /* sec. until supernode sorts communities' hash list again */
|
#define SORT_COMMUNITIES_INTERVAL 90 /* sec. until supernode sorts communities' hash list again */
|
||||||
|
|
||||||
|
#define AF_INVALID -1 /* to mark a socket invalid by an invalid address family (do not use AF_UNSPEC, it could turn into auto-detect) */
|
||||||
#define N2N_RESOLVE_INTERVAL 300 /* seconds until edge and supernode try to resolve supernode names again */
|
#define N2N_RESOLVE_INTERVAL 300 /* seconds until edge and supernode try to resolve supernode names again */
|
||||||
#define N2N_RESOLVE_CHECK_INTERVAL 30 /* seconds until main loop checking in on changes from resolver thread */
|
#define N2N_RESOLVE_CHECK_INTERVAL 30 /* seconds until main loop checking in on changes from resolver thread */
|
||||||
|
|
||||||
|
|
13
src/edge.c
13
src/edge.c
|
@ -51,6 +51,7 @@ int fetch_and_eventually_process_data (n2n_edge_t *eee, SOCKET sock,
|
||||||
uint8_t *pktbuf, uint16_t *expected, uint16_t *position,
|
uint8_t *pktbuf, uint16_t *expected, uint16_t *position,
|
||||||
time_t now);
|
time_t now);
|
||||||
int resolve_create_thread (n2n_resolve_parameter_t **param, struct peer_info *sn_list);
|
int resolve_create_thread (n2n_resolve_parameter_t **param, struct peer_info *sn_list);
|
||||||
|
int resolve_check (n2n_resolve_parameter_t *param, time_t now);
|
||||||
|
|
||||||
/* ***************************************************** */
|
/* ***************************************************** */
|
||||||
|
|
||||||
|
@ -1023,6 +1024,11 @@ int main (int argc, char* argv[]) {
|
||||||
traceEvent(TRACE_ERROR, "Failed in edge_init");
|
traceEvent(TRACE_ERROR, "Failed in edge_init");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(resolve_create_thread(&(eee->resolve_parameter), eee->conf.supernodes) == 0) {
|
||||||
|
traceEvent(TRACE_NORMAL, "Successfully created resolver thread");
|
||||||
|
}
|
||||||
|
|
||||||
memcpy(&(eee->tuntap_priv_conf), &ec, sizeof(ec));
|
memcpy(&(eee->tuntap_priv_conf), &ec, sizeof(ec));
|
||||||
|
|
||||||
if((0 == strcmp("static", eee->tuntap_priv_conf.ip_mode)) ||
|
if((0 == strcmp("static", eee->tuntap_priv_conf.ip_mode)) ||
|
||||||
|
@ -1168,8 +1174,9 @@ int main (int argc, char* argv[]) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
seek_answer = 1;
|
seek_answer = 1;
|
||||||
|
|
||||||
|
resolve_check(eee->resolve_parameter, now);
|
||||||
}
|
}
|
||||||
// allow a higher number of pings for first regular round of ping
|
// allow a higher number of pings for first regular round of ping
|
||||||
// to quicker get an inital 'supernode selection criterion overview'
|
// to quicker get an inital 'supernode selection criterion overview'
|
||||||
|
@ -1227,10 +1234,6 @@ int main (int argc, char* argv[]) {
|
||||||
traceEvent(TRACE_WARNING, "Running as root is discouraged, check out the -u/-g options");
|
traceEvent(TRACE_WARNING, "Running as root is discouraged, check out the -u/-g options");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if(resolve_create_thread(&(eee->resolve_parameter), eee->conf.supernodes) == 0) {
|
|
||||||
traceEvent(TRACE_NORMAL, "Successfully created resolver thread");
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
signal(SIGPIPE, SIG_IGN);
|
signal(SIGPIPE, SIG_IGN);
|
||||||
signal(SIGTERM, term_handler);
|
signal(SIGTERM, term_handler);
|
||||||
|
|
|
@ -226,7 +226,7 @@ int supernode_connect(n2n_edge_t *eee) {
|
||||||
eee->cb.sock_opened(eee);
|
eee->cb.sock_opened(eee);
|
||||||
|
|
||||||
struct sockaddr_in sock;
|
struct sockaddr_in sock;
|
||||||
sock.sin_family = AF_INET;
|
sock.sin_family = eee->curr_sn->sock.family;
|
||||||
sock.sin_port = htons(eee->curr_sn->sock.port);
|
sock.sin_port = htons(eee->curr_sn->sock.port);
|
||||||
memcpy(&(sock.sin_addr.s_addr), &(eee->curr_sn->sock.addr.v4), IPV4_SIZE);
|
memcpy(&(sock.sin_addr.s_addr), &(eee->curr_sn->sock.addr.v4), IPV4_SIZE);
|
||||||
|
|
||||||
|
@ -3502,10 +3502,10 @@ int edge_conf_add_supernode (n2n_edge_conf_t *conf, const char *ip_and_port) {
|
||||||
sock = (n2n_sock_t*)calloc(1,sizeof(n2n_sock_t));
|
sock = (n2n_sock_t*)calloc(1,sizeof(n2n_sock_t));
|
||||||
rv = supernode2sock(sock, ip_and_port);
|
rv = supernode2sock(sock, ip_and_port);
|
||||||
|
|
||||||
if(rv != 0) {
|
if(rv < -2) { /* we accept resolver failure as it might resolve later */
|
||||||
traceEvent(TRACE_WARNING, "Invalid supernode address");
|
traceEvent(TRACE_WARNING, "Invalid supernode parameter.");
|
||||||
free(sock);
|
free(sock);
|
||||||
return(1);
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
skip_add = SN_ADD;
|
skip_add = SN_ADD;
|
||||||
|
@ -3527,7 +3527,7 @@ int edge_conf_add_supernode (n2n_edge_conf_t *conf, const char *ip_and_port) {
|
||||||
traceEvent(TRACE_NORMAL, "Adding supernode = %s", sn->ip_addr);
|
traceEvent(TRACE_NORMAL, "Adding supernode = %s", sn->ip_addr);
|
||||||
conf->sn_num++;
|
conf->sn_num++;
|
||||||
|
|
||||||
return(0);
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ************************************** */
|
/* ************************************** */
|
||||||
|
|
83
src/n2n.c
83
src/n2n.c
|
@ -260,57 +260,56 @@ char * macaddr_str (macstr_t buf,
|
||||||
int supernode2sock (n2n_sock_t *sn, const n2n_sn_name_t addrIn) {
|
int supernode2sock (n2n_sock_t *sn, const n2n_sn_name_t addrIn) {
|
||||||
|
|
||||||
n2n_sn_name_t addr;
|
n2n_sn_name_t addr;
|
||||||
const char *supernode_host;
|
char *supernode_host;
|
||||||
|
char *supernode_port;
|
||||||
int rv = 0;
|
int rv = 0;
|
||||||
|
int nameerr;
|
||||||
|
const struct addrinfo aihints = {0, PF_INET, 0, 0, 0, NULL, NULL, NULL};
|
||||||
|
struct addrinfo * ainfo = NULL;
|
||||||
|
struct sockaddr_in * saddr;
|
||||||
|
|
||||||
|
sn->family = AF_INVALID;
|
||||||
|
|
||||||
memcpy(addr, addrIn, N2N_EDGE_SN_HOST_SIZE);
|
memcpy(addr, addrIn, N2N_EDGE_SN_HOST_SIZE);
|
||||||
|
|
||||||
supernode_host = strtok(addr, ":");
|
supernode_host = strtok(addr, ":");
|
||||||
|
|
||||||
if(supernode_host) {
|
if(supernode_host) {
|
||||||
char *supernode_port = strtok(NULL, ":");
|
supernode_port = strtok(NULL, ":");
|
||||||
const struct addrinfo aihints = {0, PF_INET, 0, 0, 0, NULL, NULL, NULL};
|
|
||||||
struct addrinfo * ainfo = NULL;
|
|
||||||
int nameerr;
|
|
||||||
|
|
||||||
if(supernode_port) {
|
if(supernode_port) {
|
||||||
sn->port = atoi(supernode_port);
|
sn->port = atoi(supernode_port);
|
||||||
} else {
|
nameerr = getaddrinfo(supernode_host, NULL, &aihints, &ainfo);
|
||||||
traceEvent(TRACE_WARNING, "supernode2sock sees malformed supernode parameter (-l <host:port>) %s %s:%s",
|
if(0 == nameerr) {
|
||||||
addr, supernode_host, supernode_port);
|
/* ainfo s the head of a linked list if non-NULL. */
|
||||||
}
|
if(ainfo && (PF_INET == ainfo->ai_family)) {
|
||||||
|
/* It is definitely and IPv4 address -> sockaddr_in */
|
||||||
nameerr = getaddrinfo(supernode_host, NULL, &aihints, &ainfo);
|
saddr = (struct sockaddr_in *)ainfo->ai_addr;
|
||||||
|
memcpy(sn->addr.v4, &(saddr->sin_addr.s_addr), IPV4_SIZE);
|
||||||
if(0 == nameerr) {
|
sn->family = AF_INET;
|
||||||
struct sockaddr_in * saddr;
|
traceEvent(TRACE_INFO, "supernode2sock successfully resolves supernode IPv4 address for %s", supernode_host);
|
||||||
|
rv = 0;
|
||||||
/* ainfo s the head of a linked list if non-NULL. */
|
} else {
|
||||||
if(ainfo && (PF_INET == ainfo->ai_family)) {
|
/* Should only return IPv4 addresses due to aihints. */
|
||||||
/* It is definitely and IPv4 address -> sockaddr_in */
|
traceEvent(TRACE_WARNING, "supernode2sock fails to resolve supernode IPv4 address for %s", supernode_host);
|
||||||
saddr = (struct sockaddr_in *)ainfo->ai_addr;
|
rv = -1;
|
||||||
|
}
|
||||||
memcpy(sn->addr.v4, &(saddr->sin_addr.s_addr), IPV4_SIZE);
|
|
||||||
sn->family = AF_INET;
|
|
||||||
} else {
|
} else {
|
||||||
/* Should only return IPv4 addresses due to aihints. */
|
traceEvent(TRACE_WARNING, "supernode2sock fails to resolve supernode host %s, %d: %s", supernode_host, nameerr, gai_strerror(nameerr));
|
||||||
traceEvent(TRACE_WARNING, "supernode2sock fails to resolve supernode IPv4 address for %s", supernode_host);
|
rv = -2;
|
||||||
rv = -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
freeaddrinfo(ainfo); /* free everything allocated by getaddrinfo(). */
|
|
||||||
ainfo = NULL;
|
|
||||||
} else {
|
} else {
|
||||||
traceEvent(TRACE_WARNING, "supernode2sock fails to resolve supernode host %s, %d: %s", supernode_host, nameerr, gai_strerror(nameerr));
|
traceEvent(TRACE_WARNING, "supernode2sock sees malformed supernode parameter (-l <host:port>) %s", addrIn);
|
||||||
rv = -2;
|
rv = -3;
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
traceEvent(TRACE_WARNING, "supernode2sock sees wrong supernode parameter (-l <host:port>)");
|
traceEvent(TRACE_WARNING, "supernode2sock sees malformed supernode parameter (-l <host:port>) %s %s:%s",
|
||||||
rv = -3;
|
addr, supernode_host, supernode_port);
|
||||||
|
rv = -4;
|
||||||
}
|
}
|
||||||
|
|
||||||
return(rv);
|
freeaddrinfo(ainfo); /* free everything allocated by getaddrinfo(). */
|
||||||
|
ainfo = NULL;
|
||||||
|
|
||||||
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -319,9 +318,10 @@ void *resolve_thread (void *p) {
|
||||||
#ifdef HAVE_PTHREAD
|
#ifdef HAVE_PTHREAD
|
||||||
n2n_resolve_parameter_t *param = (n2n_resolve_parameter_t*)p;
|
n2n_resolve_parameter_t *param = (n2n_resolve_parameter_t*)p;
|
||||||
n2n_resolve_ip_sock_t *entry, *tmp_entry;
|
n2n_resolve_ip_sock_t *entry, *tmp_entry;
|
||||||
|
int sleep_time = N2N_RESOLVE_INTERVAL / 10; /* initially shorter sleep */
|
||||||
|
|
||||||
while(1) {
|
while(1) {
|
||||||
sleep(N2N_RESOLVE_INTERVAL);
|
sleep(sleep_time);
|
||||||
|
|
||||||
// lock access
|
// lock access
|
||||||
pthread_mutex_lock(¶m->access);
|
pthread_mutex_lock(¶m->access);
|
||||||
|
@ -339,6 +339,15 @@ void *resolve_thread (void *p) {
|
||||||
|
|
||||||
// unlock access
|
// unlock access
|
||||||
pthread_mutex_unlock(¶m->access);
|
pthread_mutex_unlock(¶m->access);
|
||||||
|
|
||||||
|
// determine next sleep duration (shorter if resolver errors occured)
|
||||||
|
sleep_time = N2N_RESOLVE_INTERVAL;
|
||||||
|
HASH_ITER(hh, param->list, entry, tmp_entry) {
|
||||||
|
if(entry->error_code) {
|
||||||
|
sleep_time = N2N_RESOLVE_INTERVAL / 10;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
16
src/sn.c
16
src/sn.c
|
@ -398,25 +398,24 @@ static int setOption (int optkey, char *_optarg, n2n_sn_t *sss) {
|
||||||
length = strlen(_optarg);
|
length = strlen(_optarg);
|
||||||
if(length >= N2N_EDGE_SN_HOST_SIZE) {
|
if(length >= N2N_EDGE_SN_HOST_SIZE) {
|
||||||
traceEvent(TRACE_WARNING, "Size of -l argument too long: %zu. Maximum size is %d", length, N2N_EDGE_SN_HOST_SIZE);
|
traceEvent(TRACE_WARNING, "Size of -l argument too long: %zu. Maximum size is %d", length, N2N_EDGE_SN_HOST_SIZE);
|
||||||
break;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!double_column) {
|
if(!double_column) {
|
||||||
traceEvent(TRACE_WARNING, "Invalid -l format: ignored");
|
traceEvent(TRACE_WARNING, "Invalid -l format: missing port");
|
||||||
return (-1);
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
socket = (n2n_sock_t *)calloc(1, sizeof(n2n_sock_t));
|
socket = (n2n_sock_t *)calloc(1, sizeof(n2n_sock_t));
|
||||||
rv = supernode2sock(socket, _optarg);
|
rv = supernode2sock(socket, _optarg);
|
||||||
|
|
||||||
if(rv != 0) {
|
if(rv < -2) { /* we accept resolver failure as it might resolve later */
|
||||||
traceEvent(TRACE_WARNING, "Invalid socket");
|
traceEvent(TRACE_WARNING, "Invalid supernode parameter.");
|
||||||
free(socket);
|
free(socket);
|
||||||
break;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(sss->federation != NULL) {
|
if(sss->federation != NULL) {
|
||||||
|
|
||||||
skip_add = SN_ADD;
|
skip_add = SN_ADD;
|
||||||
anchor_sn = add_sn_to_list_by_mac_or_sock(&(sss->federation->edges), socket, null_mac, &skip_add);
|
anchor_sn = add_sn_to_list_by_mac_or_sock(&(sss->federation->edges), socket, null_mac, &skip_add);
|
||||||
|
|
||||||
|
@ -567,7 +566,8 @@ static int loadFromCLI (int argc, char * const argv[], n2n_sn_t *sss) {
|
||||||
if(c == 255) {
|
if(c == 255) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
setOption(c, optarg, sss);
|
if(0 != setOption(c, optarg, sss))
|
||||||
|
help(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -1657,6 +1657,8 @@ static int process_udp (n2n_sn_t * sss,
|
||||||
skip--;
|
skip--;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if(peer->sock.family == AF_INVALID)
|
||||||
|
continue; /* do not add unresolved supernodes to payload */
|
||||||
if(memcmp(&(peer->sock), &(ack.sock), sizeof(n2n_sock_t)) == 0) continue; /* a supernode doesn't add itself to the payload */
|
if(memcmp(&(peer->sock), &(ack.sock), sizeof(n2n_sock_t)) == 0) continue; /* a supernode doesn't add itself to the payload */
|
||||||
if((now - peer->last_seen) >= LAST_SEEN_SN_NEW) continue; /* skip long-time-not-seen supernodes.
|
if((now - peer->last_seen) >= LAST_SEEN_SN_NEW) continue; /* skip long-time-not-seen supernodes.
|
||||||
* We need to allow for a little extra time because supernodes sometimes exceed
|
* We need to allow for a little extra time because supernodes sometimes exceed
|
||||||
|
|
Loading…
Reference in New Issue
Block a user