|
|
|
@ -49,10 +49,10 @@ Multicaster::~Multicaster() |
|
|
|
{ |
|
|
|
{ |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
unsigned int Multicaster::gather(const RuntimeEnvironment *RR,uint64_t nwid,MulticastGroup &mg,Packet &appendTo,unsigned int limit) const |
|
|
|
unsigned int Multicaster::gather(const RuntimeEnvironment *RR,const Address &queryingPeer,uint64_t nwid,MulticastGroup &mg,Packet &appendTo,unsigned int limit) const |
|
|
|
{ |
|
|
|
{ |
|
|
|
unsigned char *p; |
|
|
|
unsigned char *p; |
|
|
|
unsigned int n = 0,i,rptr; |
|
|
|
unsigned int n = 0,i,rptr,skipped = 0; |
|
|
|
uint64_t a,done[(ZT_PROTO_MAX_PACKET_LENGTH / 5) + 1]; |
|
|
|
uint64_t a,done[(ZT_PROTO_MAX_PACKET_LENGTH / 5) + 1]; |
|
|
|
|
|
|
|
|
|
|
|
Mutex::Lock _l(_groups_m); |
|
|
|
Mutex::Lock _l(_groups_m); |
|
|
|
@ -90,16 +90,20 @@ restart_member_scan: |
|
|
|
// Log that we've picked this one
|
|
|
|
// Log that we've picked this one
|
|
|
|
done[n++] = a; |
|
|
|
done[n++] = a; |
|
|
|
|
|
|
|
|
|
|
|
// Append to packet
|
|
|
|
if (queryingPeer.toInt() == a) { |
|
|
|
p = (unsigned char *)appendTo.appendField(ZT_ADDRESS_LENGTH); |
|
|
|
++skipped; |
|
|
|
*(p++) = (unsigned char)((a >> 32) & 0xff); |
|
|
|
} else { |
|
|
|
*(p++) = (unsigned char)((a >> 24) & 0xff); |
|
|
|
// Append to packet
|
|
|
|
*(p++) = (unsigned char)((a >> 16) & 0xff); |
|
|
|
p = (unsigned char *)appendTo.appendField(ZT_ADDRESS_LENGTH); |
|
|
|
*(p++) = (unsigned char)((a >> 8) & 0xff); |
|
|
|
*(p++) = (unsigned char)((a >> 32) & 0xff); |
|
|
|
*p = (unsigned char)(a & 0xff); |
|
|
|
*(p++) = (unsigned char)((a >> 24) & 0xff); |
|
|
|
|
|
|
|
*(p++) = (unsigned char)((a >> 16) & 0xff); |
|
|
|
|
|
|
|
*(p++) = (unsigned char)((a >> 8) & 0xff); |
|
|
|
|
|
|
|
*p = (unsigned char)(a & 0xff); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
appendTo.setAt(nAt,(uint16_t)n); |
|
|
|
appendTo.setAt(nAt,(uint16_t)(n - skipped)); |
|
|
|
|
|
|
|
|
|
|
|
return n; |
|
|
|
return n; |
|
|
|
} |
|
|
|
} |
|
|
|
@ -249,6 +253,10 @@ void Multicaster::_add(uint64_t now,uint64_t nwid,MulticastGroupStatus &gs,const |
|
|
|
{ |
|
|
|
{ |
|
|
|
// assumes _groups_m is locked
|
|
|
|
// assumes _groups_m is locked
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Do not add self -- even if someone else returns it
|
|
|
|
|
|
|
|
if (member == RR->identity.address()) |
|
|
|
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
|
|
// Update timestamp and learnedFrom if existing
|
|
|
|
// Update timestamp and learnedFrom if existing
|
|
|
|
for(std::vector<MulticastGroupMember>::iterator m(gs.members.begin());m!=gs.members.end();++m) { |
|
|
|
for(std::vector<MulticastGroupMember>::iterator m(gs.members.begin());m!=gs.members.end();++m) { |
|
|
|
if (m->address == member) { |
|
|
|
if (m->address == member) { |
|
|
|
|