Browse Source

fine-tuned REGISTER cookie handling (#837)

pull/845/head
Logan oos Even 3 years ago
committed by GitHub
parent
commit
db5adc2038
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 9
      include/n2n_define.h
  2. 1
      include/n2n_typedefs.h
  3. 33
      src/edge_utils.c

9
include/n2n_define.h

@ -165,9 +165,12 @@ enum skip_add{SN_ADD = 0, SN_ADD_SKIP = 1, SN_ADD_ADDED = 2};
#define N2N_PRIVATE_PUBLIC_KEY_SIZE 32 #define N2N_PRIVATE_PUBLIC_KEY_SIZE 32
#define N2N_USER_KEY_LINE_STARTER '*' #define N2N_USER_KEY_LINE_STARTER '*'
#define N2N_MAC_SIZE 6 #define N2N_MAC_SIZE 6
#define N2N_LOCAL_REG_COOKIE 0x00100000 #define N2N_NO_REG_COOKIE 0x00000000
#define N2N_REGULAR_REG_COOKIE 0x01000000 #define N2N_FORWARDED_REG_COOKIE 0x00001000
#define N2N_FORWARDED_REG_COOKIE 0x10000000 #define N2N_PORT_REG_COOKIE 0x00004000
#define N2N_REGULAR_REG_COOKIE 0x00010000
#define N2N_MCAST_REG_COOKIE 0x00400000
#define N2N_LOCAL_REG_COOKIE 0x01000000
#define N2N_DESC_SIZE 16 #define N2N_DESC_SIZE 16
#define N2N_PKT_BUF_SIZE 2048 #define N2N_PKT_BUF_SIZE 2048
#define N2N_SOCKBUF_SIZE 64 /* string representation of INET or INET6 sockets */ #define N2N_SOCKBUF_SIZE 64 /* string representation of INET or INET6 sockets */

1
include/n2n_typedefs.h

@ -437,7 +437,6 @@ struct peer_info {
n2n_sock_t sock; n2n_sock_t sock;
SOCKET socket_fd; SOCKET socket_fd;
n2n_sock_t preferred_sock; n2n_sock_t preferred_sock;
time_t last_local_reg;
n2n_cookie_t last_cookie; n2n_cookie_t last_cookie;
n2n_auth_t auth; n2n_auth_t auth;
int timeout; int timeout;

33
src/edge_utils.c

@ -591,7 +591,7 @@ static void register_with_local_peers (n2n_edge_t * eee) {
/* send registration to the local multicast group */ /* send registration to the local multicast group */
traceEvent(TRACE_DEBUG, "registering with multicast group %s:%u", traceEvent(TRACE_DEBUG, "registering with multicast group %s:%u",
N2N_MULTICAST_GROUP, N2N_MULTICAST_PORT); N2N_MULTICAST_GROUP, N2N_MULTICAST_PORT);
send_register(eee, &(eee->multicast_peer), NULL, N2N_LOCAL_REG_COOKIE); send_register(eee, &(eee->multicast_peer), NULL, N2N_MCAST_REG_COOKIE);
} }
#else #else
traceEvent(TRACE_DEBUG, "multicast peers discovery is disabled, skipping"); traceEvent(TRACE_DEBUG, "multicast peers discovery is disabled, skipping");
@ -688,7 +688,7 @@ static void register_with_new_peer (n2n_edge_t *eee,
(void *) (char *) &eee->conf.register_ttl, (void *) (char *) &eee->conf.register_ttl,
sizeof(eee->conf.register_ttl)); sizeof(eee->conf.register_ttl));
for(; alter > 0; alter--, sock.port++) { for(; alter > 0; alter--, sock.port++) {
send_register(eee, &sock, mac, N2N_REGULAR_REG_COOKIE); send_register(eee, &sock, mac, N2N_PORT_REG_COOKIE);
} }
setsockopt(eee->sock, IPPROTO_IP, IP_TTL, (void *) (char *) &curTTL, sizeof(curTTL)); setsockopt(eee->sock, IPPROTO_IP, IP_TTL, (void *) (char *) &curTTL, sizeof(curTTL));
#endif #endif
@ -739,7 +739,7 @@ static void check_peer_registration_needed (n2n_edge_t *eee,
memcpy(scan->mac_addr, mac, sizeof(n2n_mac_t)); memcpy(scan->mac_addr, mac, sizeof(n2n_mac_t));
HASH_ADD_PEER(eee->known_peers, scan); HASH_ADD_PEER(eee->known_peers, scan);
// reset last_local_reg to allow re-registration // reset last_local_reg to allow re-registration
scan->last_local_reg = 0; scan->last_cookie = N2N_NO_REG_COOKIE;
} }
} }
@ -756,9 +756,8 @@ static void check_peer_registration_needed (n2n_edge_t *eee,
if(via_multicast) if(via_multicast)
scan->local = 1; scan->local = 1;
if(((now - scan->last_seen) > 0 /* >= 1 sec */) if(((now - scan->last_seen) > 0 /* >= 1 sec */)
||(cookie & N2N_LOCAL_REG_COOKIE)) { ||(cookie > scan->last_cookie)) {
/* Don't register too often */ /* Don't register too often */
check_known_peer_sock_change(eee, from_supernode, via_multicast, mac, dev_addr, dev_desc, peer, now); check_known_peer_sock_change(eee, from_supernode, via_multicast, mac, dev_addr, dev_desc, peer, now);
} }
@ -787,7 +786,7 @@ static void peer_set_p2p_confirmed (n2n_edge_t * eee,
scan = find_peer_by_sock(peer, eee->pending_peers); scan = find_peer_by_sock(peer, eee->pending_peers);
// in case of MAC change, reset last_local_reg to allow re-registration // in case of MAC change, reset last_local_reg to allow re-registration
if(scan) if(scan)
scan->last_local_reg = 0; scan->last_cookie = N2N_NO_REG_COOKIE;
} }
if(scan) { if(scan) {
@ -799,20 +798,20 @@ static void peer_set_p2p_confirmed (n2n_edge_t * eee,
free(scan); free(scan);
scan = scan_tmp; scan = scan_tmp;
memcpy(scan->mac_addr, mac, sizeof(n2n_mac_t)); memcpy(scan->mac_addr, mac, sizeof(n2n_mac_t));
// in case of MAC change, reset last_local_reg to allow re-registration // in case of MAC change, reset cookie to allow immediate re-registration
scan->last_local_reg = 0; scan->last_cookie = N2N_NO_REG_COOKIE;
} else { } else {
// ignore regular ACKs's socket update for a while if we have recently received a local (!) ACK // update sock but ...
if(((now - scan->last_local_reg) > REGISTRATION_TIMEOUT) // ... ignore ACKs's (and their socks) from lower ranked inbound ways for a while
||(cookie & N2N_LOCAL_REG_COOKIE)) { if(((now - scan->last_seen) > REGISTRATION_TIMEOUT / 4)
||(cookie > scan->last_cookie)) {
scan->sock = *peer; scan->sock = *peer;
scan->last_cookie = cookie;
} }
} }
HASH_ADD_PEER(eee->known_peers, scan); HASH_ADD_PEER(eee->known_peers, scan);
scan->last_p2p = now; scan->last_p2p = now;
if(cookie & N2N_LOCAL_REG_COOKIE)
scan->last_local_reg = now;
traceEvent(TRACE_DEBUG, "p2p connection established: %s [%s]", traceEvent(TRACE_DEBUG, "p2p connection established: %s [%s]",
macaddr_str(mac_buf, mac), macaddr_str(mac_buf, mac),
@ -1594,7 +1593,7 @@ void update_supernode_reg (n2n_edge_t * eee, time_t now) {
if(eee->sn_wait == 1) if(eee->sn_wait == 1)
HASH_ITER(hh, eee->known_peers, peer, tmp_peer) HASH_ITER(hh, eee->known_peers, peer, tmp_peer)
if((now - peer->last_seen) > REGISTER_SUPER_INTERVAL_DFL) if((now - peer->last_seen) > REGISTER_SUPER_INTERVAL_DFL)
send_register(eee, &(peer->sock), peer->mac_addr, N2N_REGULAR_REG_COOKIE); send_register(eee, &(peer->sock), peer->mac_addr, peer->last_cookie);
eee->sn_wait = 1; eee->sn_wait = 1;
@ -2517,7 +2516,10 @@ void process_udp (n2n_edge_t *eee, const struct sockaddr_in *sender_sock, const
/* Update the sender in peer table entry */ /* Update the sender in peer table entry */
check_peer_registration_needed(eee, from_supernode, via_multicast, check_peer_registration_needed(eee, from_supernode, via_multicast,
pkt.srcMac, N2N_REGULAR_REG_COOKIE, NULL, NULL, orig_sender); pkt.srcMac,
// REVISIT: also consider PORT_REG_COOKIEs when implemented
from_supernode ? N2N_FORWARDED_REG_COOKIE : N2N_REGULAR_REG_COOKIE,
NULL, NULL, orig_sender);
handle_PACKET(eee, from_supernode, &pkt, orig_sender, udp_buf + idx, udp_size - idx); handle_PACKET(eee, from_supernode, &pkt, orig_sender, udp_buf + idx, udp_size - idx);
break; break;
@ -2600,7 +2602,6 @@ void process_udp (n2n_edge_t *eee, const struct sockaddr_in *sender_sock, const
sock_to_cstr(sockbuf1, &sender), sock_to_cstr(sockbuf1, &sender),
(ra.cookie & N2N_LOCAL_REG_COOKIE) ? " (local)" : ""); (ra.cookie & N2N_LOCAL_REG_COOKIE) ? " (local)" : "");
peer_set_p2p_confirmed(eee, ra.srcMac, peer_set_p2p_confirmed(eee, ra.srcMac,
ra.cookie, ra.cookie,
&sender, now); &sender, now);

Loading…
Cancel
Save