Adam Ierymenko 11 rokov pred
rodič
commit
0778332747

+ 1 - 1
node/Constants.hpp

@@ -248,7 +248,7 @@
  * Attempts will be made to gather recipients and send until we reach
  * the limit or sending times out.
  */
-#define ZT_MULTICAST_TRANSMIT_TIMEOUT (ZT_MULTICAST_TOPOLOGY_GATHER_DELAY_MIN * 2)
+#define ZT_MULTICAST_TRANSMIT_TIMEOUT 5000
 
 /**
  * Default number of endpoints to implicitly gather from peers with each multicast frame

+ 12 - 7
node/Multicaster.cpp

@@ -38,8 +38,7 @@
 
 namespace ZeroTier {
 
-Multicaster::Multicaster() :
-	_limit(ZT_MULTICAST_DEFAULT_LIMIT)
+Multicaster::Multicaster()
 {
 }
 
@@ -47,7 +46,7 @@ Multicaster::~Multicaster()
 {
 }
 
-void send(const RuntimeEnvironment *RR,uint64_t nwid,unsigned int limit,uint64_t now,const MulticastGroup &mg,const MAC &src,unsigned int etherType,const void *data,unsigned int len)
+void Multicaster::send(const RuntimeEnvironment *RR,uint64_t nwid,unsigned int limit,uint64_t now,const MulticastGroup &mg,const MAC &src,unsigned int etherType,const void *data,unsigned int len)
 {
 	Mutex::Lock _l(_groups_m);
 	MulticastGroupStatus &gs = _groups[mg];
@@ -58,7 +57,7 @@ void send(const RuntimeEnvironment *RR,uint64_t nwid,unsigned int limit,uint64_t
 
 		out.init(now,RR->identity.address(),nwid,ZT_MULTICAST_DEFAULT_IMPLICIT_GATHER,src,mg,etherType,data,len);
 		unsigned int count = 0;
-		for(std::vector<MulticastGroupMember>::const_reverse_iterator m(gs.members.rbegin());m!=gs.members.rend();++gs) {
+		for(std::vector<MulticastGroupMember>::const_reverse_iterator m(gs.members.rbegin());m!=gs.members.rend();++m) {
 			out.sendOnly(*(RR->sw),m->address);
 			if (++count >= limit)
 				break;
@@ -69,7 +68,7 @@ void send(const RuntimeEnvironment *RR,uint64_t nwid,unsigned int limit,uint64_t
 		OutboundMulticast &out = gs.txQueue.back();
 
 		out.init(now,RR->identity.address(),nwid,ZT_MULTICAST_DEFAULT_IMPLICIT_GATHER,src,mg,etherType,data,len);
-		for(std::vector<MulticastGroupMember>::const_reverse_iterator m(gs.members.rbegin());m!=gs.members.rend();++gs)
+		for(std::vector<MulticastGroupMember>::const_reverse_iterator m(gs.members.rbegin());m!=gs.members.rend();++m)
 			out.sendAndLog(*(RR->sw),m->address);
 
 		if ((now - gs.lastExplicitGather) >= ZT_MULTICAST_GATHER_DELAY) {
@@ -121,12 +120,12 @@ void Multicaster::clean(const RuntimeEnvironment *RR,uint64_t now,unsigned int l
 				 * about them minus one day (a large constant) to put these at the bottom of the list.
 				 * List is sorted in ascending order of rank and multicasts are sent last-to-first. */
 				if (writer->learnedFrom) {
-					SharedPtr<Peer> p(RR->topology.getPeer(writer->learnedFrom));
+					SharedPtr<Peer> p(RR->topology->getPeer(writer->learnedFrom));
 					if (p)
 						writer->rank = p->lastUnicastFrame() - ZT_MULTICAST_LIKE_EXPIRE;
 					else writer->rank = writer->timestamp - (86400000 + ZT_MULTICAST_LIKE_EXPIRE);
 				} else {
-					SharedPtr<Peer> p(RR->topology.getPeer(writer->address));
+					SharedPtr<Peer> p(RR->topology->getPeer(writer->address));
 					if (p)
 						writer->rank = p->lastUnicastFrame();
 					else writer->rank = writer->timestamp - 86400000;
@@ -153,6 +152,8 @@ void Multicaster::clean(const RuntimeEnvironment *RR,uint64_t now,unsigned int l
 void Multicaster::_add(const RuntimeEnvironment *RR,uint64_t now,MulticastGroupStatus &gs,const Address &learnedFrom,const Address &member)
 {
 	// assumes _groups_m is locked
+
+	// Update timestamp and learnedFrom if existing
 	for(std::vector<MulticastGroupMember>::iterator m(gs.members.begin());m!=gs.members.end();++m) {
 		if (m->address == member) {
 			if (m->learnedFrom)
@@ -161,6 +162,10 @@ void Multicaster::_add(const RuntimeEnvironment *RR,uint64_t now,MulticastGroupS
 			return;
 		}
 	}
+
+	// If not existing, add to end of list (highest priority) -- these will
+	// be resorted on next clean(). In the future we might want to insert
+	// this somewhere else but we'll try this for now.
 	gs.members.push_back(MulticastGroupMember(member,learnedFrom,now));
 }
 

+ 1 - 1
node/Multicaster.hpp

@@ -92,7 +92,7 @@ public:
 	inline void add(const RuntimeEnvironment *RR,uint64_t now,const MulticastGroup &mg,const Address &learnedFrom,const Address &member)
 	{
 		Mutex::Lock _l(_groups_m);
-		_add(RR,uint64_t now,_groups[mg],learnedFrom,member);
+		_add(RR,now,_groups[mg],learnedFrom,member);
 	}
 
 	/**

+ 59 - 0
node/OutboundMulticast.cpp

@@ -0,0 +1,59 @@
+/*
+ * ZeroTier One - Global Peer to Peer Ethernet
+ * Copyright (C) 2011-2014  ZeroTier Networks LLC
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * --
+ *
+ * ZeroTier may be used and distributed under the terms of the GPLv3, which
+ * are available at: http://www.gnu.org/licenses/gpl-3.0.html
+ *
+ * If you would like to embed ZeroTier into a commercial application or
+ * redistribute it in a modified binary form, please contact ZeroTier Networks
+ * LLC. Start here: http://www.zerotier.com/
+ */
+
+#include "Constants.hpp"
+#include "OutboundMulticast.hpp"
+#include "Switch.hpp"
+
+namespace ZeroTier {
+
+void OutboundMulticast::init(uint64_t timestamp,const Address &self,uint64_t nwid,unsigned int gatherLimit,const MAC &src,const MulticastGroup &dest,unsigned int etherType,const void *payload,unsigned int len)
+{
+	_timestamp = timestamp;
+	_nwid = nwid;
+	_source = src;
+	_destination = dest;
+	_etherType = etherType;
+	_packet.setSource(self);
+	_packet.setVerb(Packet::VERB_MULTICAST_FRAME);
+	_packet.append((uint64_t)nwid);
+	_packet.append((char)0); // 0 flags
+	_packet.append((uint32_t)gatherLimit); // gather limit -- set before send, start with 0
+	_packet.append((uint32_t)dest.adi());
+	dest.mac().appendTo(_packet);
+	src.appendTo(_packet);
+	_packet.append((uint16_t)etherType);
+	_packet.append(payload,len);
+	_packet.compress();
+}
+
+void OutboundMulticast::sendOnly(Switch &sw,const Address &toAddr)
+{
+	sw.send(Packet(_packet,toAddr),true);
+}
+
+} // namespace ZeroTier

+ 6 - 26
node/OutboundMulticast.hpp

@@ -38,10 +38,11 @@
 #include "MulticastGroup.hpp"
 #include "Address.hpp"
 #include "Packet.hpp"
-#include "Switch.hpp"
 
 namespace ZeroTier {
 
+class Switch;
+
 /**
  * An outbound multicast packet
  *
@@ -71,25 +72,7 @@ public:
 	 * @param len Length of data
 	 * @throws std::out_of_range Data too large to fit in a MULTICAST_FRAME
 	 */
-	inline void init(uint64_t timestamp,const Address &self,uint64_t nwid,unsigned int gatherLimit,const MAC &src,const MulticastGroup &dest,unsigned int etherType,const void *payload,unsigned int len)
-	{
-		_timestamp = timestamp;
-		_nwid = nwid;
-		_source = src;
-		_destination = dest;
-		_etherType = etherType;
-		_packet.setSource(self);
-		_packet.setVerb(Packet::VERB_MULTICAST_FRAME);
-		_packet.append((uint64_t)nwid);
-		_packet.append((char)0); // 0 flags
-		_packet.append((uint32_t)gatherLimit); // gather limit -- set before send, start with 0
-		_packet.append((uint32_t)dest.adi());
-		dest.mac().appendTo(_packet);
-		src.appendTo(_packet);
-		_packet.append((uint16_t)etherType);
-		_packet.append(payload,len);
-		_packet.compress();
-	}
+	void init(uint64_t timestamp,const Address &self,uint64_t nwid,unsigned int gatherLimit,const MAC &src,const MulticastGroup &dest,unsigned int etherType,const void *payload,unsigned int len);
 
 	/**
 	 * @return Multicast creation time
@@ -113,10 +96,7 @@ public:
 	 * @param sw Switch instance to send packets
 	 * @param toAddr Destination address
 	 */
-	inline void sendOnly(Switch &sw,const Address &toAddr)
-	{
-		sw.send(Packet(_packet,toAddr),true);
-	}
+	void sendOnly(Switch &sw,const Address &toAddr);
 
 	/**
 	 * Just send and log but do not check sent log
@@ -127,7 +107,7 @@ public:
 	inline void sendAndLog(Switch &sw,const Address &toAddr)
 	{
 		_alreadySentTo.push_back(toAddr);
-		sendOnly(sw,toAddr,gatherLimit);
+		sendOnly(sw,toAddr);
 	}
 
 	/**
@@ -143,7 +123,7 @@ public:
 			if (*a == toAddr)
 				return false;
 		}
-		sendAndLog(sw,toAddr,gatherLimit);
+		sendAndLog(sw,toAddr);
 		return true;
 	}
 

+ 1 - 0
objects.mk

@@ -18,6 +18,7 @@ OBJS=\
 	node/NetworkConfig.o \
 	node/Node.o \
 	node/NodeConfig.o \
+	node/OutboundMulticast.o \
 	node/Packet.o \
 	node/Peer.o \
 	node/Poly1305.o \