summaryrefslogtreecommitdiff
path: root/node
diff options
context:
space:
mode:
Diffstat (limited to 'node')
-rw-r--r--node/Switch.cpp22
1 files changed, 12 insertions, 10 deletions
diff --git a/node/Switch.cpp b/node/Switch.cpp
index b8181d96..8df7ba04 100644
--- a/node/Switch.cpp
+++ b/node/Switch.cpp
@@ -790,32 +790,34 @@ bool Switch::_trySend(const Packet &packet,bool encrypt,uint64_t nwid)
return false; // we probably just left this network, let its packets die
}
- Path *viaPath = peer->getBestPath(now);
SharedPtr<Peer> relay;
+
+ // Check for a network preferred relay
+ Path *viaPath = peer->getBestPath(now);
if ((!viaPath)&&(network)) {
- // See if this network has a preferred relay (if packet has an associated network)
- unsigned int bestq = ~((unsigned int)0);
+ unsigned int bestq = ~((unsigned int)0); // max unsigned int since quality is lower==better
for(unsigned int ri=0;ri<network->config().staticDeviceCount();++ri) {
const ZT_VirtualNetworkStaticDevice &r = network->config().staticDevice(ri);
if ((r.address != peer->address().toInt())&&((r.flags & ZT_NETWORK_STATIC_DEVICE_IS_RELAY) != 0)) {
SharedPtr<Peer> rp(RR->topology->getPeer(Address(r.address)));
if (rp) {
const unsigned int q = rp->relayQuality(now);
- if (q < bestq) { // SUBTILE: < == don't use these if they are nil quality (unsigned int max), instead use a root
+ if (q < bestq) {
bestq = q;
rp.swap(relay);
}
}
}
}
+ }
- // Otherwise relay off a root server
- if (!relay)
- relay = RR->topology->getBestRoot();
+ // Otherwise relay off a root server
+ if (!relay)
+ relay = RR->topology->getBestRoot();
- if (!(relay)||(!(viaPath = relay->getBestPath(now))))
- return false; // no paths, no root servers?, no relays? :P~~~
- }
+ // No relay or relay has no active paths == :P~~~~
+ if ( (!(relay)) || (!(viaPath = relay->getBestPath(now))) )
+ return false;
if ((network)&&(relay)&&(network->isAllowed(peer))) {
// Push hints for direct connectivity to this peer if we are relaying