diff options
-rw-r--r-- | src/peer.c | 19 | ||||
-rw-r--r-- | src/peer.h | 2 | ||||
-rw-r--r-- | src/protocols/ec25519_fhmqvc/handshake.c | 6 |
3 files changed, 23 insertions, 4 deletions
@@ -871,14 +871,29 @@ void fastd_peer_handle_handshake_queue(void) { } /** Marks a peer as established */ -void fastd_peer_set_established(fastd_peer_t *peer) { +bool fastd_peer_set_established(fastd_peer_t *peer) { if (fastd_peer_is_established(peer)) - return; + return true; + + if (!peer->iface) { + const char *ifname = peer->ifname; + + if (!ifname && fastd_config_single_iface()) + ifname = conf.ifname; + + peer->iface = fastd_iface_open(ifname, peer); + if (peer->iface) + on_up(peer, false); + else + return false; + } peer->state = STATE_ESTABLISHED; peer->established = ctx.now; on_establish(peer); pr_info("connection with %P established.", peer); + + return true; } /** Compares two MAC addresses */ @@ -169,7 +169,7 @@ bool fastd_peer_add(fastd_peer_t *peer); void fastd_peer_reset(fastd_peer_t *peer); void fastd_peer_delete(fastd_peer_t *peer); void fastd_peer_free(fastd_peer_t *peer); -void fastd_peer_set_established(fastd_peer_t *peer); +bool fastd_peer_set_established(fastd_peer_t *peer); 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); diff --git a/src/protocols/ec25519_fhmqvc/handshake.c b/src/protocols/ec25519_fhmqvc/handshake.c index 7dda0a1..bbe572d 100644 --- a/src/protocols/ec25519_fhmqvc/handshake.c +++ b/src/protocols/ec25519_fhmqvc/handshake.c @@ -156,9 +156,13 @@ static bool establish(fastd_peer_t *peer, const fastd_method_info_t *method, fas return false; } + if (!fastd_peer_set_established(peer)) { + fastd_peer_reset(peer); + return false; + } + peer->establish_handshake_timeout = ctx.now + MIN_HANDSHAKE_INTERVAL; fastd_peer_seen(peer); - fastd_peer_set_established(peer); pr_verbose("new session with %P established using method `%s'%s.", peer, method->name, salt ? "" : " (compat mode)"); |