Fix for V4/V6 stable addressing.

This commit is contained in:
Adam Ierymenko 2015-10-19 14:04:36 -07:00
parent 3adb183c5f
commit 584072fa6a
2 changed files with 27 additions and 6 deletions

View File

@ -197,10 +197,11 @@ public:
if (!stableEndpoint4) {
if (addr.ss_family == AF_INET)
stableEndpoint4 = addr;
} else if (!stableEndpoint6) {
}
if (!stableEndpoint6) {
if (addr.ss_family == AF_INET6)
stableEndpoint6 = addr;
} else break; // have both!
}
}
break;
}
@ -223,10 +224,29 @@ public:
if (upstream) {
// "Upstream" devices are roots and relays and get special treatment -- they stay alive
// forever and we try to keep (if available) both IPv4 and IPv6 channels open to them.
if ((!p->doPingAndKeepalive(RR,_now,AF_INET))&&(stableEndpoint4))
p->attemptToContactAt(RR,InetAddress(),stableEndpoint4,_now);
if ((!p->doPingAndKeepalive(RR,_now,AF_INET6))&&(stableEndpoint6))
p->attemptToContactAt(RR,InetAddress(),stableEndpoint6,_now);
bool needToContactIndirect = true;
if (!p->doPingAndKeepalive(RR,_now,AF_INET)) {
if (stableEndpoint4) {
needToContactIndirect = false;
p->attemptToContactAt(RR,InetAddress(),stableEndpoint4,_now);
}
} else needToContactIndirect = false;
if (!p->doPingAndKeepalive(RR,_now,AF_INET6)) {
if (stableEndpoint6) {
needToContactIndirect = false;
p->attemptToContactAt(RR,InetAddress(),stableEndpoint6,_now);
}
} else needToContactIndirect = false;
if (needToContactIndirect) {
// If this is an upstream and we have no stable endpoint for either IPv4 or IPv6,
// send a NOP indirectly if possible to see if we can get to this peer in any
// way whatsoever. This will e.g. find network preferred relays that lack
// stable endpoints by using root servers.
Packet outp(p->address(),RR->identity.address(),Packet::VERB_NOP);
RR->sw->send(outp,true,0);
}
lastReceiveFromUpstream = std::max(p->lastReceive(),lastReceiveFromUpstream);
} else if (p->alive(_now)) {
// Normal nodes get their preferred link kept alive if the node has generated frame traffic recently

View File

@ -205,6 +205,7 @@ bool Peer::doPingAndKeepalive(const RuntimeEnvironment *RR,uint64_t now,int inet
}
return true;
}
return false;
}