From 5484cf43098048486418803746e1a15e056a8444 Mon Sep 17 00:00:00 2001 From: Adam Ierymenko Date: Wed, 29 Oct 2014 16:24:19 -0700 Subject: [PATCH] More cleanup, and fix a bug in Multicaster::gather() --- node/Buffer.hpp | 2 +- node/IncomingPacket.cpp | 18 ++++++++---------- node/IncomingPacket.hpp | 3 --- node/Multicaster.cpp | 14 +++++++------- node/Packet.hpp | 2 +- 5 files changed, 17 insertions(+), 22 deletions(-) diff --git a/node/Buffer.hpp b/node/Buffer.hpp index 64176e58a..908f36ea5 100644 --- a/node/Buffer.hpp +++ b/node/Buffer.hpp @@ -203,7 +203,7 @@ public: throw(std::out_of_range) { if ((i + sizeof(T)) > _l) - throw std::out_of_range("Buffer: set() beyond end of data"); + throw std::out_of_range("Buffer: setAt() beyond end of data"); T *const ZT_VAR_MAY_ALIAS p = reinterpret_cast(_b + i); *p = Utils::hton(v); } diff --git a/node/IncomingPacket.cpp b/node/IncomingPacket.cpp index f720825b1..172a5d5b7 100644 --- a/node/IncomingPacket.cpp +++ b/node/IncomingPacket.cpp @@ -304,7 +304,9 @@ bool IncomingPacket::_doOK(const RuntimeEnvironment *RR,const SharedPtr &p uint64_t nwid = at(ZT_PROTO_VERB_MULTICAST_GATHER__OK__IDX_NETWORK_ID); MulticastGroup mg(MAC(field(ZT_PROTO_VERB_MULTICAST_GATHER__OK__IDX_MAC,6),6),at(ZT_PROTO_VERB_MULTICAST_GATHER__OK__IDX_ADI)); TRACE("%s(%s): OK(MULTICAST_GATHER) %.16llx/%s length %u",source().toString().c_str(),_remoteAddress.toString().c_str(),nwid,mg.toString().c_str(),size()); - _parseGatherResults(RR,peer,nwid,mg,ZT_PROTO_VERB_MULTICAST_GATHER__OK__IDX_GATHER_RESULTS); + + unsigned int count = at(ZT_PROTO_VERB_MULTICAST_GATHER__OK__IDX_GATHER_RESULTS + 4); + RR->mc->addMultiple(Utils::now(),nwid,mg,peer->address(),field(ZT_PROTO_VERB_MULTICAST_GATHER__OK__IDX_GATHER_RESULTS + 6,count * 5),count,at(ZT_PROTO_VERB_MULTICAST_GATHER__OK__IDX_GATHER_RESULTS)); } break; case Packet::VERB_MULTICAST_FRAME: { @@ -319,7 +321,7 @@ bool IncomingPacket::_doOK(const RuntimeEnvironment *RR,const SharedPtr &p if ((flags & 0x01) != 0) { // OK(MULTICAST_FRAME) includes certificate of membership update CertificateOfMembership com; - offset += com.deserialize(*this,ZT_PROTO_VERB_MULTICAST_FRAME__OK__IDX_PAYLOAD); + offset += com.deserialize(*this,ZT_PROTO_VERB_MULTICAST_FRAME__OK__IDX_COM_AND_GATHER_RESULTS); SharedPtr network(RR->nc->network(nwid)); if ((network)&&(com.hasRequiredFields())) network->addMembershipCertificate(com,false); @@ -327,7 +329,10 @@ bool IncomingPacket::_doOK(const RuntimeEnvironment *RR,const SharedPtr &p if ((flags & 0x02) != 0) { // OK(MULTICAST_FRAME) includes implicit gather results - _parseGatherResults(RR,peer,nwid,mg,offset + ZT_PROTO_VERB_MULTICAST_FRAME__OK__IDX_PAYLOAD); + offset += ZT_PROTO_VERB_MULTICAST_FRAME__OK__IDX_COM_AND_GATHER_RESULTS; + unsigned int totalKnown = at(offset); offset += 4; + unsigned int count = at(offset); offset += 2; + RR->mc->addMultiple(Utils::now(),nwid,mg,peer->address(),field(offset,count * 5),count,totalKnown); } } break; @@ -890,11 +895,4 @@ void IncomingPacket::_sendErrorNeedCertificate(const RuntimeEnvironment *RR,cons _fromSock->send(_remoteAddress,outp.data(),outp.size()); } -void IncomingPacket::_parseGatherResults(const RuntimeEnvironment *RR,const SharedPtr &peer,uint64_t nwid,const MulticastGroup &mg,unsigned int offset) -{ - unsigned int totalKnown = at(offset); - unsigned int count = at(offset + 4); - RR->mc->addMultiple(Utils::now(),nwid,mg,peer->address(),field(offset + 6,count * 5),count,totalKnown); -} - } // namespace ZeroTier diff --git a/node/IncomingPacket.hpp b/node/IncomingPacket.hpp index 5bda2789e..58a5a5428 100644 --- a/node/IncomingPacket.hpp +++ b/node/IncomingPacket.hpp @@ -130,9 +130,6 @@ private: // Send an ERROR_NEED_MEMBERSHIP_CERTIFICATE to a peer indicating that an updated cert is needed to join void _sendErrorNeedCertificate(const RuntimeEnvironment *RR,const SharedPtr &peer,uint64_t nwid); - // Parse gather results for OK(MULTICAST_GATHER) and OK(MULTICAST_FRAME) - void _parseGatherResults(const RuntimeEnvironment *RR,const SharedPtr &peer,uint64_t nwid,const MulticastGroup &mg,unsigned int offset); - uint64_t _receiveTime; SharedPtr _fromSock; InetAddress _remoteAddress; diff --git a/node/Multicaster.cpp b/node/Multicaster.cpp index 77e3af7a0..aa9fef7ba 100644 --- a/node/Multicaster.cpp +++ b/node/Multicaster.cpp @@ -74,9 +74,14 @@ unsigned int Multicaster::gather(const Address &queryingPeer,uint64_t nwid,const if (!limit) return 0; - if (limit > 0xffff) // TODO: multiple return packets not yet supported + else if (limit > 0xffff) limit = 0xffff; + const unsigned int totalAt = appendTo.size(); + appendTo.addSize(4); // sizeof(uint32_t) + const unsigned int addedAt = appendTo.size(); + appendTo.addSize(2); // sizeof(uint16_t) + { // Return myself if I am a member of this group SharedPtr network(RR->nc->network(nwid)); if ((network)&&(network->subscribedToMulticastGroup(mg))) { @@ -88,11 +93,6 @@ unsigned int Multicaster::gather(const Address &queryingPeer,uint64_t nwid,const Mutex::Lock _l(_groups_m); - const unsigned int totalAt = appendTo.size(); - appendTo.addSize(4); // sizeof(uint32_t) - const unsigned int addedAt = appendTo.size(); - appendTo.addSize(2); // sizeof(uint16_t) - std::map< std::pair,MulticastGroupStatus >::const_iterator gs(_groups.find(std::pair(nwid,mg))); if ((gs != _groups.end())&&(!gs->second.members.empty())) { totalKnown += (unsigned int)gs->second.members.size(); @@ -100,7 +100,7 @@ unsigned int Multicaster::gather(const Address &queryingPeer,uint64_t nwid,const // Members are returned in random order so that repeated gather queries // will return different subsets of a large multicast group. k = 0; - while ((added < limit)&&(k < gs->second.members.size())&&((appendTo.size() + ZT_ADDRESS_LENGTH) <= ZT_PROTO_MAX_PACKET_LENGTH)) { + while ((added < limit)&&(k < gs->second.members.size())&&((appendTo.size() + ZT_ADDRESS_LENGTH) <= ZT_UDP_DEFAULT_PAYLOAD_MTU)) { rptr = (unsigned int)RR->prng->next32(); restart_member_scan: diff --git a/node/Packet.hpp b/node/Packet.hpp index 2d2c11e20..35cc5c7d2 100644 --- a/node/Packet.hpp +++ b/node/Packet.hpp @@ -303,7 +303,7 @@ #define ZT_PROTO_VERB_MULTICAST_FRAME__OK__IDX_MAC (ZT_PROTO_VERB_MULTICAST_FRAME__OK__IDX_NETWORK_ID + 8) #define ZT_PROTO_VERB_MULTICAST_FRAME__OK__IDX_ADI (ZT_PROTO_VERB_MULTICAST_FRAME__OK__IDX_MAC + 6) #define ZT_PROTO_VERB_MULTICAST_FRAME__OK__IDX_FLAGS (ZT_PROTO_VERB_MULTICAST_FRAME__OK__IDX_ADI + 4) -#define ZT_PROTO_VERB_MULTICAST_FRAME__OK__IDX_PAYLOAD (ZT_PROTO_VERB_MULTICAST_FRAME__OK__IDX_FLAGS + 1) +#define ZT_PROTO_VERB_MULTICAST_FRAME__OK__IDX_COM_AND_GATHER_RESULTS (ZT_PROTO_VERB_MULTICAST_FRAME__OK__IDX_FLAGS + 1) // ---------------------------------------------------------------------------