mirror of
https://github.com/zerotier/ZeroTierOne.git
synced 2025-06-05 03:53:44 +02:00
More cleanup, and fix a bug in Multicaster::gather()
This commit is contained in:
parent
22d8aa4dc9
commit
5484cf4309
5 changed files with 17 additions and 22 deletions
|
@ -203,7 +203,7 @@ public:
|
||||||
throw(std::out_of_range)
|
throw(std::out_of_range)
|
||||||
{
|
{
|
||||||
if ((i + sizeof(T)) > _l)
|
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<T *>(_b + i);
|
T *const ZT_VAR_MAY_ALIAS p = reinterpret_cast<T *>(_b + i);
|
||||||
*p = Utils::hton(v);
|
*p = Utils::hton(v);
|
||||||
}
|
}
|
||||||
|
|
|
@ -304,7 +304,9 @@ bool IncomingPacket::_doOK(const RuntimeEnvironment *RR,const SharedPtr<Peer> &p
|
||||||
uint64_t nwid = at<uint64_t>(ZT_PROTO_VERB_MULTICAST_GATHER__OK__IDX_NETWORK_ID);
|
uint64_t nwid = at<uint64_t>(ZT_PROTO_VERB_MULTICAST_GATHER__OK__IDX_NETWORK_ID);
|
||||||
MulticastGroup mg(MAC(field(ZT_PROTO_VERB_MULTICAST_GATHER__OK__IDX_MAC,6),6),at<uint32_t>(ZT_PROTO_VERB_MULTICAST_GATHER__OK__IDX_ADI));
|
MulticastGroup mg(MAC(field(ZT_PROTO_VERB_MULTICAST_GATHER__OK__IDX_MAC,6),6),at<uint32_t>(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());
|
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<uint16_t>(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<uint32_t>(ZT_PROTO_VERB_MULTICAST_GATHER__OK__IDX_GATHER_RESULTS));
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case Packet::VERB_MULTICAST_FRAME: {
|
case Packet::VERB_MULTICAST_FRAME: {
|
||||||
|
@ -319,7 +321,7 @@ bool IncomingPacket::_doOK(const RuntimeEnvironment *RR,const SharedPtr<Peer> &p
|
||||||
if ((flags & 0x01) != 0) {
|
if ((flags & 0x01) != 0) {
|
||||||
// OK(MULTICAST_FRAME) includes certificate of membership update
|
// OK(MULTICAST_FRAME) includes certificate of membership update
|
||||||
CertificateOfMembership com;
|
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> network(RR->nc->network(nwid));
|
SharedPtr<Network> network(RR->nc->network(nwid));
|
||||||
if ((network)&&(com.hasRequiredFields()))
|
if ((network)&&(com.hasRequiredFields()))
|
||||||
network->addMembershipCertificate(com,false);
|
network->addMembershipCertificate(com,false);
|
||||||
|
@ -327,7 +329,10 @@ bool IncomingPacket::_doOK(const RuntimeEnvironment *RR,const SharedPtr<Peer> &p
|
||||||
|
|
||||||
if ((flags & 0x02) != 0) {
|
if ((flags & 0x02) != 0) {
|
||||||
// OK(MULTICAST_FRAME) includes implicit gather results
|
// 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<uint32_t>(offset); offset += 4;
|
||||||
|
unsigned int count = at<uint16_t>(offset); offset += 2;
|
||||||
|
RR->mc->addMultiple(Utils::now(),nwid,mg,peer->address(),field(offset,count * 5),count,totalKnown);
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
|
@ -890,11 +895,4 @@ void IncomingPacket::_sendErrorNeedCertificate(const RuntimeEnvironment *RR,cons
|
||||||
_fromSock->send(_remoteAddress,outp.data(),outp.size());
|
_fromSock->send(_remoteAddress,outp.data(),outp.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
void IncomingPacket::_parseGatherResults(const RuntimeEnvironment *RR,const SharedPtr<Peer> &peer,uint64_t nwid,const MulticastGroup &mg,unsigned int offset)
|
|
||||||
{
|
|
||||||
unsigned int totalKnown = at<uint32_t>(offset);
|
|
||||||
unsigned int count = at<uint16_t>(offset + 4);
|
|
||||||
RR->mc->addMultiple(Utils::now(),nwid,mg,peer->address(),field(offset + 6,count * 5),count,totalKnown);
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace ZeroTier
|
} // namespace ZeroTier
|
||||||
|
|
|
@ -130,9 +130,6 @@ private:
|
||||||
// Send an ERROR_NEED_MEMBERSHIP_CERTIFICATE to a peer indicating that an updated cert is needed to join
|
// 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> &peer,uint64_t nwid);
|
void _sendErrorNeedCertificate(const RuntimeEnvironment *RR,const SharedPtr<Peer> &peer,uint64_t nwid);
|
||||||
|
|
||||||
// Parse gather results for OK(MULTICAST_GATHER) and OK(MULTICAST_FRAME)
|
|
||||||
void _parseGatherResults(const RuntimeEnvironment *RR,const SharedPtr<Peer> &peer,uint64_t nwid,const MulticastGroup &mg,unsigned int offset);
|
|
||||||
|
|
||||||
uint64_t _receiveTime;
|
uint64_t _receiveTime;
|
||||||
SharedPtr<Socket> _fromSock;
|
SharedPtr<Socket> _fromSock;
|
||||||
InetAddress _remoteAddress;
|
InetAddress _remoteAddress;
|
||||||
|
|
|
@ -74,9 +74,14 @@ unsigned int Multicaster::gather(const Address &queryingPeer,uint64_t nwid,const
|
||||||
|
|
||||||
if (!limit)
|
if (!limit)
|
||||||
return 0;
|
return 0;
|
||||||
if (limit > 0xffff) // TODO: multiple return packets not yet supported
|
else if (limit > 0xffff)
|
||||||
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
|
{ // Return myself if I am a member of this group
|
||||||
SharedPtr<Network> network(RR->nc->network(nwid));
|
SharedPtr<Network> network(RR->nc->network(nwid));
|
||||||
if ((network)&&(network->subscribedToMulticastGroup(mg))) {
|
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);
|
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<uint64_t,MulticastGroup>,MulticastGroupStatus >::const_iterator gs(_groups.find(std::pair<uint64_t,MulticastGroup>(nwid,mg)));
|
std::map< std::pair<uint64_t,MulticastGroup>,MulticastGroupStatus >::const_iterator gs(_groups.find(std::pair<uint64_t,MulticastGroup>(nwid,mg)));
|
||||||
if ((gs != _groups.end())&&(!gs->second.members.empty())) {
|
if ((gs != _groups.end())&&(!gs->second.members.empty())) {
|
||||||
totalKnown += (unsigned int)gs->second.members.size();
|
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
|
// Members are returned in random order so that repeated gather queries
|
||||||
// will return different subsets of a large multicast group.
|
// will return different subsets of a large multicast group.
|
||||||
k = 0;
|
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();
|
rptr = (unsigned int)RR->prng->next32();
|
||||||
|
|
||||||
restart_member_scan:
|
restart_member_scan:
|
||||||
|
|
|
@ -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_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_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_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)
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue