From 0e6db6361ec6793851c506ae7acb763f14a9e446 Mon Sep 17 00:00:00 2001 From: emanuele-f Date: Sat, 8 Jun 2019 17:50:48 +0200 Subject: [PATCH] Fix connection stall when idle p2p refresh occurs The edge received packets from the supernode and thought that the other peer was still active, but the other peer had dropped the p2p connection due to refresh --- edge_utils.c | 5 ++++- n2n.h | 7 ++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/edge_utils.c b/edge_utils.c index f4dc734..95e9334 100644 --- a/edge_utils.c +++ b/edge_utils.c @@ -422,6 +422,9 @@ static void check_peer_registration_needed(n2n_edge_t * eee, /* Already in known_peers. */ time_t now = time(NULL); + if(!from_supernode) + scan->last_p2p = now; + if((now - scan->last_seen) > 0 /* >= 1 sec */) { /* Don't register too often */ check_known_peer_sock_change(eee, from_supernode, mac, peer, now); @@ -1095,7 +1098,7 @@ static int find_peer_destination(n2n_edge_t * eee, if((scan->last_seen > 0) && (memcmp(mac_address, scan->mac_addr, N2N_MAC_SIZE) == 0)) { - if((now - scan->last_seen) >= (scan->timeout / 2)) { + if((now - scan->last_p2p) >= (scan->timeout / 2)) { /* Too much time passed since we saw the peer, need to register again * since the peer address may have changed. */ traceEvent(TRACE_DEBUG, "Refreshing idle known peer"); diff --git a/n2n.h b/n2n.h index 3c7b4da..f37bf15 100644 --- a/n2n.h +++ b/n2n.h @@ -173,6 +173,7 @@ struct peer_info { n2n_sock_t sock; int timeout; time_t last_seen; + time_t last_p2p; }; #define N2N_EDGE_SN_HOST_SIZE 48 @@ -245,7 +246,7 @@ int getTraceLevel(); void traceEvent(int eventTraceLevel, char* file, int line, char * format, ...); /* Tuntap API */ -int tuntap_open(tuntap_dev *device, char *dev, const char *address_mode, char *device_ip, +int tuntap_open(tuntap_dev *device, char *dev, const char *address_mode, char *device_ip, char *device_mask, const char * device_mac, int mtu); int tuntap_read(struct tuntap_dev *tuntap, unsigned char *buf, int len); int tuntap_write(struct tuntap_dev *tuntap, unsigned char *buf, int len); @@ -267,7 +268,7 @@ void print_edge_stats(const n2n_edge_t *eee); char* sock_to_cstr( n2n_sock_str_t out, const n2n_sock_t * sock ); SOCKET open_socket(int local_port, int bind_any); -int sock_equal( const n2n_sock_t * a, +int sock_equal( const n2n_sock_t * a, const n2n_sock_t * b ); /* Operations on peer_info lists. */ @@ -276,7 +277,7 @@ struct peer_info * find_peer_by_mac( struct peer_info * list, void peer_list_add( struct peer_info * * list, struct peer_info * newp ); size_t peer_list_size( const struct peer_info * list ); -size_t purge_peer_list( struct peer_info ** peer_list, +size_t purge_peer_list( struct peer_info ** peer_list, time_t purge_before ); size_t clear_peer_list( struct peer_info ** peer_list ); size_t purge_expired_registrations( struct peer_info ** peer_list, time_t* p_last_purge );