From 482ddc46a62b9a6b8bd615fd35b2bac6d3b7d841 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Fri, 25 Apr 2014 00:56:07 +0200 Subject: fastd_peer_claim_address: add parameter to allow claiming addresses of established peers --- src/fastd.c | 2 +- src/peer.c | 7 ++++++- src/peer.h | 2 +- src/protocols/ec25519_fhmqvc/handshake.c | 2 +- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/fastd.c b/src/fastd.c index 5c63ec6..3ee445a 100644 --- a/src/fastd.c +++ b/src/fastd.c @@ -412,7 +412,7 @@ static void send_handshake(fastd_peer_t *peer) { return; } - fastd_peer_claim_address(peer, NULL, NULL, &peer->next_remote->addresses[peer->next_remote->current_address]); + fastd_peer_claim_address(peer, NULL, NULL, &peer->next_remote->addresses[peer->next_remote->current_address], false); fastd_peer_reset_socket(peer); } diff --git a/src/peer.c b/src/peer.c index feacc73..2d4b8bf 100644 --- a/src/peer.c +++ b/src/peer.c @@ -447,7 +447,7 @@ bool fastd_peer_matches_address(const fastd_peer_t *peer, const fastd_peer_addre return false; } -bool fastd_peer_claim_address(fastd_peer_t *new_peer, fastd_socket_t *sock, const fastd_peer_address_t *local_addr, const fastd_peer_address_t *remote_addr) { +bool fastd_peer_claim_address(fastd_peer_t *new_peer, fastd_socket_t *sock, const fastd_peer_address_t *local_addr, const fastd_peer_address_t *remote_addr, bool force) { if (remote_addr->sa.sa_family == AF_UNSPEC) { if (fastd_peer_is_established(new_peer)) fastd_peer_reset(new_peer); @@ -466,6 +466,11 @@ bool fastd_peer_claim_address(fastd_peer_t *new_peer, fastd_socket_t *sock, cons } if (fastd_peer_address_equal(&peer->address, remote_addr)) { + if (!force && fastd_peer_is_established(peer)) { + reset_peer_address(new_peer); + return false; + } + reset_peer_address(peer); break; } diff --git a/src/peer.h b/src/peer.h index 8496ee7..41cee20 100644 --- a/src/peer.h +++ b/src/peer.h @@ -139,7 +139,7 @@ bool fastd_peer_may_connect(fastd_peer_t *peer); void fastd_peer_handle_resolve(fastd_peer_t *peer, fastd_remote_t *remote, size_t n_addresses, const fastd_peer_address_t *addresses); bool fastd_peer_owns_address(const fastd_peer_t *peer, const fastd_peer_address_t *addr); bool fastd_peer_matches_address(const fastd_peer_t *peer, const fastd_peer_address_t *addr); -bool fastd_peer_claim_address(fastd_peer_t *peer, fastd_socket_t *sock, const fastd_peer_address_t *local_addr, const fastd_peer_address_t *remote_addr); +bool fastd_peer_claim_address(fastd_peer_t *peer, fastd_socket_t *sock, const fastd_peer_address_t *local_addr, const fastd_peer_address_t *remote_addr, bool force); void fastd_peer_reset_socket(fastd_peer_t *peer); void fastd_peer_schedule_handshake(fastd_peer_t *peer, int delay); fastd_peer_t* fastd_peer_find_by_id(uint64_t id); diff --git a/src/protocols/ec25519_fhmqvc/handshake.c b/src/protocols/ec25519_fhmqvc/handshake.c index 444ce32..7e893c8 100644 --- a/src/protocols/ec25519_fhmqvc/handshake.c +++ b/src/protocols/ec25519_fhmqvc/handshake.c @@ -135,7 +135,7 @@ static bool establish(fastd_peer_t *peer, const fastd_method_info_t *method, fas pr_verbose("%I authorized as %P", remote_addr, peer); - if (!fastd_peer_claim_address(peer, sock, local_addr, remote_addr)) { + if (!fastd_peer_claim_address(peer, sock, local_addr, remote_addr, true)) { pr_warn("can't establish session with %P[%I] as the address is used by another peer", peer, remote_addr); fastd_peer_reset(peer); return false; -- cgit v1.2.3