summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--node/Constants.hpp10
-rw-r--r--node/IncomingPacket.cpp30
-rw-r--r--node/Node.cpp16
-rw-r--r--node/Node.hpp1
-rw-r--r--node/Packet.hpp21
-rw-r--r--node/Peer.cpp6
-rw-r--r--node/Switch.cpp24
-rw-r--r--node/Switch.hpp2
8 files changed, 39 insertions, 71 deletions
diff --git a/node/Constants.hpp b/node/Constants.hpp
index 1f0d8426..d15fef13 100644
--- a/node/Constants.hpp
+++ b/node/Constants.hpp
@@ -305,16 +305,6 @@
#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)
*/
#define ZT_MIN_PATH_CONFIRMATION_INTERVAL 5000
diff --git a/node/IncomingPacket.cpp b/node/IncomingPacket.cpp
index 7634f54f..87669ba7 100644
--- a/node/IncomingPacket.cpp
+++ b/node/IncomingPacket.cpp
@@ -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)
{
+ 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;
}
diff --git a/node/Node.cpp b/node/Node.cpp
index 8eacf753..7c70db97 100644
--- a/node/Node.cpp
+++ b/node/Node.cpp
@@ -78,8 +78,7 @@ Node::Node(
_networks_m(),
_now(now),
_lastPingCheck(0),
- _lastHousekeepingRun(0),
- _lastBeacon(0)
+ _lastHousekeepingRun(0)
{
_newestVersionSeen[0] = ZEROTIER_ONE_VERSION_MAJOR;
_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);
if (oldOnline != _online)
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 ( ... ) {
return ZT1_RESULT_FATAL_ERROR_INTERNAL;
}
diff --git a/node/Node.hpp b/node/Node.hpp
index 5c7cfae2..cd8d68fc 100644
--- a/node/Node.hpp
+++ b/node/Node.hpp
@@ -251,7 +251,6 @@ private:
uint64_t _now;
uint64_t _lastPingCheck;
uint64_t _lastHousekeepingRun;
- uint64_t _lastBeacon;
unsigned int _newestVersionSeen[3]; // major, minor, revision
bool _online;
};
diff --git a/node/Packet.hpp b/node/Packet.hpp
index 9b86709a..50471b06 100644
--- a/node/Packet.hpp
+++ b/node/Packet.hpp
@@ -233,16 +233,6 @@
*/
#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
#define ZT_PROTO_DEST_ADDRESS_TYPE_NONE 0
#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
* 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>
{
@@ -901,6 +881,7 @@ public:
* <[2] length of extended path characteristics or 0 for none>
* <[...] extended path characteristics>
* <[1] address type>
+ * <[1] address length in bytes>
* <[...] address>
*
* Path record flags:
diff --git a/node/Peer.cpp b/node/Peer.cpp
index ec04357a..225fbdef 100644
--- a/node/Peer.cpp
+++ b/node/Peer.cpp
@@ -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)
{
- if (((now - _lastDirectPathPush) >= ZT_DIRECT_PATH_PUSH_INTERVAL)||(force)) {
+ if ((!dps.empty())&&(((now - _lastDirectPathPush) >= ZT_DIRECT_PATH_PUSH_INTERVAL)||(force))) {
_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());
while (p != dps.end()) {
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((uint16_t)0);
outp.append(addressType);
+ outp.append((addressType == 4) ? 6 : 18);
outp.append(p->address().rawIpData(),((addressType == 4) ? 4 : 16));
outp.append((uint16_t)p->address().port());
diff --git a/node/Switch.cpp b/node/Switch.cpp
index 7600624f..6a0b07cd 100644
--- a/node/Switch.cpp
+++ b/node/Switch.cpp
@@ -49,8 +49,7 @@
namespace ZeroTier {
Switch::Switch(const RuntimeEnvironment *renv) :
- RR(renv),
- _lastBeacon(0)
+ RR(renv)
{
}
@@ -61,9 +60,7 @@ Switch::~Switch()
void Switch::onRemotePacket(const InetAddress &fromAddr,const void *data,unsigned int len)
{
try {
- if (len == ZT_PROTO_BEACON_LENGTH) {
- _handleBeacon(fromAddr,Buffer<ZT_PROTO_BEACON_LENGTH>(data,len));
- } else if (len > ZT_PROTO_MIN_FRAGMENT_LENGTH) {
+ if (len > ZT_PROTO_MIN_FRAGMENT_LENGTH) {
if (((const unsigned char *)data)[ZT_PACKET_FRAGMENT_IDX_FRAGMENT_INDICATOR] == ZT_PACKET_FRAGMENT_INDICATOR) {
_handleRemotePacketFragment(fromAddr,data,len);
} 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)
{
SharedPtr<Peer> root(RR->topology->getBestRoot(peersAlreadyConsulted,numPeersAlreadyConsulted,false));
diff --git a/node/Switch.hpp b/node/Switch.hpp
index 0ba4c138..af6e5938 100644
--- a/node/Switch.hpp
+++ b/node/Switch.hpp
@@ -183,12 +183,10 @@ public:
private:
void _handleRemotePacketFragment(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);
bool _trySend(const Packet &packet,bool encrypt,uint64_t nwid);
const RuntimeEnvironment *const RR;
- volatile uint64_t _lastBeacon;
// Outsanding WHOIS requests and how many retries they've undergone
struct WhoisRequest