Almost everything for GitHub issue #180 except direct path map setup.
This commit is contained in:
parent
fad9dff2db
commit
79e9a8bcc2
8 changed files with 39 additions and 71 deletions
|
@ -304,16 +304,6 @@
|
||||||
*/
|
*/
|
||||||
#define ZT_ANTIRECURSION_HISTORY_SIZE 16
|
#define ZT_ANTIRECURSION_HISTORY_SIZE 16
|
||||||
|
|
||||||
/**
|
|
||||||
* How often to send LAN beacons
|
|
||||||
*/
|
|
||||||
#define ZT_BEACON_INTERVAL 30000
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Do not respond to any beacon more often than this
|
|
||||||
*/
|
|
||||||
#define ZT_MIN_BEACON_RESPONSE_INTERVAL 2500
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Minimum delay between attempts to confirm new paths to peers (to avoid HELLO flooding)
|
* Minimum delay between attempts to confirm new paths to peers (to avoid HELLO flooding)
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -885,6 +885,36 @@ bool IncomingPacket::_doMULTICAST_FRAME(const RuntimeEnvironment *RR,const Share
|
||||||
|
|
||||||
bool IncomingPacket::_doPUSH_DIRECT_PATHS(const RuntimeEnvironment *RR,const SharedPtr<Peer> &peer)
|
bool IncomingPacket::_doPUSH_DIRECT_PATHS(const RuntimeEnvironment *RR,const SharedPtr<Peer> &peer)
|
||||||
{
|
{
|
||||||
|
try {
|
||||||
|
unsigned int count = at<uint16_t>(ZT_PACKET_IDX_PAYLOAD);
|
||||||
|
unsigned int ptr = ZT_PACKET_IDX_PAYLOAD + 2;
|
||||||
|
|
||||||
|
while (count) { // if ptr overflows Buffer will throw
|
||||||
|
unsigned int flags = (*this)[ptr++];
|
||||||
|
/*int metric = (*this)[ptr++];*/ ++ptr;
|
||||||
|
unsigned int extLen = at<uint16_t>(ptr); ptr += 2;
|
||||||
|
ptr += extLen; // unused right now
|
||||||
|
unsigned int addrType = (*this)[ptr++];
|
||||||
|
unsigned int addrLen = (*this)[ptr++];
|
||||||
|
switch(addrType) {
|
||||||
|
case 4: {
|
||||||
|
InetAddress a(field(ptr,4),4,at<uint16_t>(ptr + 4));
|
||||||
|
if ((flags & (0x01 | 0x02)) == 0)
|
||||||
|
peer->attemptToContactAt(RR,a,RR->node->now());
|
||||||
|
} break;
|
||||||
|
case 6: {
|
||||||
|
InetAddress a(field(ptr,16),16,at<uint16_t>(ptr + 16));
|
||||||
|
if ((flags & (0x01 | 0x02)) == 0)
|
||||||
|
peer->attemptToContactAt(RR,a,RR->node->now());
|
||||||
|
} break;
|
||||||
|
}
|
||||||
|
ptr += addrLen;
|
||||||
|
}
|
||||||
|
} catch (std::exception &exc) {
|
||||||
|
TRACE("dropped PUSH_DIRECT_PATHS from %s(%s): unexpected exception: %s",source().toString().c_str(),_remoteAddress.toString().c_str(),exc.what());
|
||||||
|
} catch ( ... ) {
|
||||||
|
TRACE("dropped PUSH_DIRECT_PATHS from %s(%s): unexpected exception: (unknown)",source().toString().c_str(),_remoteAddress.toString().c_str());
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -78,8 +78,7 @@ Node::Node(
|
||||||
_networks_m(),
|
_networks_m(),
|
||||||
_now(now),
|
_now(now),
|
||||||
_lastPingCheck(0),
|
_lastPingCheck(0),
|
||||||
_lastHousekeepingRun(0),
|
_lastHousekeepingRun(0)
|
||||||
_lastBeacon(0)
|
|
||||||
{
|
{
|
||||||
_newestVersionSeen[0] = ZEROTIER_ONE_VERSION_MAJOR;
|
_newestVersionSeen[0] = ZEROTIER_ONE_VERSION_MAJOR;
|
||||||
_newestVersionSeen[1] = ZEROTIER_ONE_VERSION_MINOR;
|
_newestVersionSeen[1] = ZEROTIER_ONE_VERSION_MINOR;
|
||||||
|
@ -269,19 +268,6 @@ ZT1_ResultCode Node::processBackgroundTasks(uint64_t now,volatile uint64_t *next
|
||||||
_online = ((now - pfunc.lastReceiveFromUpstream) < ZT_PEER_ACTIVITY_TIMEOUT);
|
_online = ((now - pfunc.lastReceiveFromUpstream) < ZT_PEER_ACTIVITY_TIMEOUT);
|
||||||
if (oldOnline != _online)
|
if (oldOnline != _online)
|
||||||
postEvent(_online ? ZT1_EVENT_ONLINE : ZT1_EVENT_OFFLINE);
|
postEvent(_online ? ZT1_EVENT_ONLINE : ZT1_EVENT_OFFLINE);
|
||||||
|
|
||||||
// Send LAN beacons
|
|
||||||
if ((now - _lastBeacon) >= ZT_BEACON_INTERVAL) {
|
|
||||||
_lastBeacon = now;
|
|
||||||
char beacon[13];
|
|
||||||
void *p = beacon;
|
|
||||||
*(reinterpret_cast<uint32_t *>(p)) = RR->prng->next32();
|
|
||||||
p = beacon + 4;
|
|
||||||
*(reinterpret_cast<uint32_t *>(p)) = RR->prng->next32();
|
|
||||||
RR->identity.address().copyTo(beacon + 8,5);
|
|
||||||
RR->antiRec->logOutgoingZT(beacon,13);
|
|
||||||
putPacket(ZT_DEFAULTS.v4Broadcast,beacon,13);
|
|
||||||
}
|
|
||||||
} catch ( ... ) {
|
} catch ( ... ) {
|
||||||
return ZT1_RESULT_FATAL_ERROR_INTERNAL;
|
return ZT1_RESULT_FATAL_ERROR_INTERNAL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -251,7 +251,6 @@ private:
|
||||||
uint64_t _now;
|
uint64_t _now;
|
||||||
uint64_t _lastPingCheck;
|
uint64_t _lastPingCheck;
|
||||||
uint64_t _lastHousekeepingRun;
|
uint64_t _lastHousekeepingRun;
|
||||||
uint64_t _lastBeacon;
|
|
||||||
unsigned int _newestVersionSeen[3]; // major, minor, revision
|
unsigned int _newestVersionSeen[3]; // major, minor, revision
|
||||||
bool _online;
|
bool _online;
|
||||||
};
|
};
|
||||||
|
|
|
@ -233,16 +233,6 @@
|
||||||
*/
|
*/
|
||||||
#define ZT_PROTO_MIN_FRAGMENT_LENGTH ZT_PACKET_FRAGMENT_IDX_PAYLOAD
|
#define ZT_PROTO_MIN_FRAGMENT_LENGTH ZT_PACKET_FRAGMENT_IDX_PAYLOAD
|
||||||
|
|
||||||
/**
|
|
||||||
* DEPRECATED: length of LAN beacon packets
|
|
||||||
*/
|
|
||||||
#define ZT_PROTO_BEACON_LENGTH 13
|
|
||||||
|
|
||||||
/**
|
|
||||||
* DEPRECATED: index of address in a LAN beacon
|
|
||||||
*/
|
|
||||||
#define ZT_PROTO_BEACON_IDX_ADDRESS 8
|
|
||||||
|
|
||||||
// Destination address types from HELLO, OK(HELLO), and other message types
|
// Destination address types from HELLO, OK(HELLO), and other message types
|
||||||
#define ZT_PROTO_DEST_ADDRESS_TYPE_NONE 0
|
#define ZT_PROTO_DEST_ADDRESS_TYPE_NONE 0
|
||||||
#define ZT_PROTO_DEST_ADDRESS_TYPE_ZEROTIER 1 // reserved but unused
|
#define ZT_PROTO_DEST_ADDRESS_TYPE_ZEROTIER 1 // reserved but unused
|
||||||
|
@ -388,16 +378,6 @@ namespace ZeroTier {
|
||||||
*
|
*
|
||||||
* For unencrypted packets, MAC is computed on plaintext. Only HELLO is ever
|
* For unencrypted packets, MAC is computed on plaintext. Only HELLO is ever
|
||||||
* sent in the clear, as it's the "here is my public key" message.
|
* sent in the clear, as it's the "here is my public key" message.
|
||||||
*
|
|
||||||
* Beacon format and beacon packets:
|
|
||||||
* <[8] 8 random bytes>
|
|
||||||
* <[5] sender ZT address>
|
|
||||||
*
|
|
||||||
* A beacon is a 13-byte packet containing only the address of the sender.
|
|
||||||
* Receiving peers may or may not respond to beacons with a HELLO or other
|
|
||||||
* message to initiate direct communication.
|
|
||||||
*
|
|
||||||
* Beacons may be used for direct LAN announcement or NAT traversal.
|
|
||||||
*/
|
*/
|
||||||
class Packet : public Buffer<ZT_PROTO_MAX_PACKET_LENGTH>
|
class Packet : public Buffer<ZT_PROTO_MAX_PACKET_LENGTH>
|
||||||
{
|
{
|
||||||
|
@ -901,6 +881,7 @@ public:
|
||||||
* <[2] length of extended path characteristics or 0 for none>
|
* <[2] length of extended path characteristics or 0 for none>
|
||||||
* <[...] extended path characteristics>
|
* <[...] extended path characteristics>
|
||||||
* <[1] address type>
|
* <[1] address type>
|
||||||
|
* <[1] address length in bytes>
|
||||||
* <[...] address>
|
* <[...] address>
|
||||||
*
|
*
|
||||||
* Path record flags:
|
* Path record flags:
|
||||||
|
|
|
@ -210,9 +210,12 @@ void Peer::doPingAndKeepalive(const RuntimeEnvironment *RR,uint64_t now)
|
||||||
|
|
||||||
void Peer::pushDirectPaths(const RuntimeEnvironment *RR,const std::vector<Path> &dps,uint64_t now,bool force)
|
void Peer::pushDirectPaths(const RuntimeEnvironment *RR,const std::vector<Path> &dps,uint64_t now,bool force)
|
||||||
{
|
{
|
||||||
if (((now - _lastDirectPathPush) >= ZT_DIRECT_PATH_PUSH_INTERVAL)||(force)) {
|
if ((!dps.empty())&&(((now - _lastDirectPathPush) >= ZT_DIRECT_PATH_PUSH_INTERVAL)||(force))) {
|
||||||
_lastDirectPathPush = now;
|
_lastDirectPathPush = now;
|
||||||
|
|
||||||
|
TRACE("pushing %u direct paths to %s",(unsigned int)dps.size(),_id.address().toString().c_str());
|
||||||
|
printf("pushing %u direct paths to %s",(unsigned int)dps.size(),_id.address().toString().c_str());
|
||||||
|
|
||||||
std::vector<Path>::const_iterator p(dps.begin());
|
std::vector<Path>::const_iterator p(dps.begin());
|
||||||
while (p != dps.end()) {
|
while (p != dps.end()) {
|
||||||
Packet outp(_id.address(),RR->identity.address(),Packet::VERB_PUSH_DIRECT_PATHS);
|
Packet outp(_id.address(),RR->identity.address(),Packet::VERB_PUSH_DIRECT_PATHS);
|
||||||
|
@ -254,6 +257,7 @@ void Peer::pushDirectPaths(const RuntimeEnvironment *RR,const std::vector<Path>
|
||||||
outp.append((uint8_t)((p->metric() >= 0) ? ((p->metric() <= 255) ? p->metric() : 255) : 0));
|
outp.append((uint8_t)((p->metric() >= 0) ? ((p->metric() <= 255) ? p->metric() : 255) : 0));
|
||||||
outp.append((uint16_t)0);
|
outp.append((uint16_t)0);
|
||||||
outp.append(addressType);
|
outp.append(addressType);
|
||||||
|
outp.append((addressType == 4) ? 6 : 18);
|
||||||
outp.append(p->address().rawIpData(),((addressType == 4) ? 4 : 16));
|
outp.append(p->address().rawIpData(),((addressType == 4) ? 4 : 16));
|
||||||
outp.append((uint16_t)p->address().port());
|
outp.append((uint16_t)p->address().port());
|
||||||
|
|
||||||
|
|
|
@ -49,8 +49,7 @@
|
||||||
namespace ZeroTier {
|
namespace ZeroTier {
|
||||||
|
|
||||||
Switch::Switch(const RuntimeEnvironment *renv) :
|
Switch::Switch(const RuntimeEnvironment *renv) :
|
||||||
RR(renv),
|
RR(renv)
|
||||||
_lastBeacon(0)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -61,9 +60,7 @@ Switch::~Switch()
|
||||||
void Switch::onRemotePacket(const InetAddress &fromAddr,const void *data,unsigned int len)
|
void Switch::onRemotePacket(const InetAddress &fromAddr,const void *data,unsigned int len)
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
if (len == ZT_PROTO_BEACON_LENGTH) {
|
if (len > ZT_PROTO_MIN_FRAGMENT_LENGTH) {
|
||||||
_handleBeacon(fromAddr,Buffer<ZT_PROTO_BEACON_LENGTH>(data,len));
|
|
||||||
} else if (len > ZT_PROTO_MIN_FRAGMENT_LENGTH) {
|
|
||||||
if (((const unsigned char *)data)[ZT_PACKET_FRAGMENT_IDX_FRAGMENT_INDICATOR] == ZT_PACKET_FRAGMENT_INDICATOR) {
|
if (((const unsigned char *)data)[ZT_PACKET_FRAGMENT_IDX_FRAGMENT_INDICATOR] == ZT_PACKET_FRAGMENT_INDICATOR) {
|
||||||
_handleRemotePacketFragment(fromAddr,data,len);
|
_handleRemotePacketFragment(fromAddr,data,len);
|
||||||
} else if (len >= ZT_PROTO_MIN_PACKET_LENGTH) {
|
} else if (len >= ZT_PROTO_MIN_PACKET_LENGTH) {
|
||||||
|
@ -696,23 +693,6 @@ void Switch::_handleRemotePacketHead(const InetAddress &fromAddr,const void *dat
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Switch::_handleBeacon(const InetAddress &fromAddr,const Buffer<ZT_PROTO_BEACON_LENGTH> &data)
|
|
||||||
{
|
|
||||||
Address beaconAddr(data.field(ZT_PROTO_BEACON_IDX_ADDRESS,ZT_ADDRESS_LENGTH),ZT_ADDRESS_LENGTH);
|
|
||||||
if (beaconAddr == RR->identity.address())
|
|
||||||
return;
|
|
||||||
SharedPtr<Peer> peer(RR->topology->getPeer(beaconAddr));
|
|
||||||
if (peer) {
|
|
||||||
const uint64_t now = RR->node->now();
|
|
||||||
if ((now - _lastBeacon) >= ZT_MIN_BEACON_RESPONSE_INTERVAL) {
|
|
||||||
_lastBeacon = now;
|
|
||||||
Packet outp(peer->address(),RR->identity.address(),Packet::VERB_NOP);
|
|
||||||
outp.armor(peer->key(),false);
|
|
||||||
RR->node->putPacket(fromAddr,outp.data(),outp.size());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Address Switch::_sendWhoisRequest(const Address &addr,const Address *peersAlreadyConsulted,unsigned int numPeersAlreadyConsulted)
|
Address Switch::_sendWhoisRequest(const Address &addr,const Address *peersAlreadyConsulted,unsigned int numPeersAlreadyConsulted)
|
||||||
{
|
{
|
||||||
SharedPtr<Peer> root(RR->topology->getBestRoot(peersAlreadyConsulted,numPeersAlreadyConsulted,false));
|
SharedPtr<Peer> root(RR->topology->getBestRoot(peersAlreadyConsulted,numPeersAlreadyConsulted,false));
|
||||||
|
|
|
@ -183,12 +183,10 @@ public:
|
||||||
private:
|
private:
|
||||||
void _handleRemotePacketFragment(const InetAddress &fromAddr,const void *data,unsigned int len);
|
void _handleRemotePacketFragment(const InetAddress &fromAddr,const void *data,unsigned int len);
|
||||||
void _handleRemotePacketHead(const InetAddress &fromAddr,const void *data,unsigned int len);
|
void _handleRemotePacketHead(const InetAddress &fromAddr,const void *data,unsigned int len);
|
||||||
void _handleBeacon(const InetAddress &fromAddr,const Buffer<ZT_PROTO_BEACON_LENGTH> &data);
|
|
||||||
Address _sendWhoisRequest(const Address &addr,const Address *peersAlreadyConsulted,unsigned int numPeersAlreadyConsulted);
|
Address _sendWhoisRequest(const Address &addr,const Address *peersAlreadyConsulted,unsigned int numPeersAlreadyConsulted);
|
||||||
bool _trySend(const Packet &packet,bool encrypt,uint64_t nwid);
|
bool _trySend(const Packet &packet,bool encrypt,uint64_t nwid);
|
||||||
|
|
||||||
const RuntimeEnvironment *const RR;
|
const RuntimeEnvironment *const RR;
|
||||||
volatile uint64_t _lastBeacon;
|
|
||||||
|
|
||||||
// Outsanding WHOIS requests and how many retries they've undergone
|
// Outsanding WHOIS requests and how many retries they've undergone
|
||||||
struct WhoisRequest
|
struct WhoisRequest
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue