diff options
-rw-r--r-- | node/Peer.hpp | 2 | ||||
-rw-r--r-- | node/Switch.cpp | 10 |
2 files changed, 10 insertions, 2 deletions
diff --git a/node/Peer.hpp b/node/Peer.hpp index 87aea486..294a4913 100644 --- a/node/Peer.hpp +++ b/node/Peer.hpp @@ -162,7 +162,7 @@ public: * * @param now Current time * @param inetAddressFamily Keep this address family alive, or 0 to simply pick current best ignoring family - * @return True if at least one direct path seems alive + * @return True if we have at least one direct path */ bool doPingAndKeepalive(uint64_t now,int inetAddressFamily); diff --git a/node/Switch.cpp b/node/Switch.cpp index 125c4b69..472440d1 100644 --- a/node/Switch.cpp +++ b/node/Switch.cpp @@ -754,7 +754,15 @@ bool Switch::_trySend(const Packet &packet,bool encrypt) const uint64_t now = RR->node->now(); SharedPtr<Path> viaPath(peer->getBestPath(now)); - if ( (!viaPath) || ((!viaPath->alive(now))&&(!RR->topology->isRoot(peer->identity()))) ) { + if ( (viaPath) && (!viaPath->alive(now)) && (!RR->topology->isRoot(peer->identity())) ) { + if ((now - viaPath->lastOut()) > 5000) { + Packet outp(peer->address(),RR->identity.address(),Packet::VERB_ECHO); + outp.armor(peer->key(),true); + viaPath->send(RR,outp.data(),outp.size(),now); + } + viaPath.zero(); + } + if (!viaPath) { SharedPtr<Peer> relay(RR->topology->getBestRoot()); if ( (!relay) || (!(viaPath = relay->getBestPath(now))) ) return false; |