summaryrefslogtreecommitdiff
path: root/node
diff options
context:
space:
mode:
authorAdam Ierymenko <adam.ierymenko@gmail.com>2014-10-03 18:42:41 -0700
committerAdam Ierymenko <adam.ierymenko@gmail.com>2014-10-03 18:42:41 -0700
commit3f7e7e8a88e4edb0a62def5efbe204d22bbff7a4 (patch)
tree2c4803f18fa1468681f567e3b0878ec634e4c90b /node
parent496109fdcc5fc1f38ffbc561aceab8e8bfece03a (diff)
downloadinfinitytier-3f7e7e8a88e4edb0a62def5efbe204d22bbff7a4.tar.gz
infinitytier-3f7e7e8a88e4edb0a62def5efbe204d22bbff7a4.zip
Do not multicast to self.
Diffstat (limited to 'node')
-rw-r--r--node/IncomingPacket.cpp4
-rw-r--r--node/Multicaster.cpp28
-rw-r--r--node/Multicaster.hpp3
3 files changed, 22 insertions, 13 deletions
diff --git a/node/IncomingPacket.cpp b/node/IncomingPacket.cpp
index 01db2db4..72ced7fa 100644
--- a/node/IncomingPacket.cpp
+++ b/node/IncomingPacket.cpp
@@ -925,7 +925,7 @@ bool IncomingPacket::_doMULTICAST_GATHER(const RuntimeEnvironment *RR,const Shar
outp.append(nwid);
mg.mac().appendTo(outp);
outp.append((uint32_t)mg.adi());
- if (RR->mc->gather(RR,nwid,mg,outp,gatherLimit)) {
+ if (RR->mc->gather(RR,peer->address(),nwid,mg,outp,gatherLimit)) {
outp.armor(peer->key(),true);
_fromSock->send(_remoteAddress,outp.data(),outp.size());
}
@@ -1003,7 +1003,7 @@ bool IncomingPacket::_doMULTICAST_FRAME(const RuntimeEnvironment *RR,const Share
to.mac().appendTo(outp);
outp.append((uint32_t)to.adi());
outp.append((unsigned char)0x01); // flag 0x01 = contains gather results
- if (RR->mc->gather(RR,nwid,to,outp,gatherLimit)) {
+ if (RR->mc->gather(RR,peer->address(),nwid,to,outp,gatherLimit)) {
outp.armor(peer->key(),true);
_fromSock->send(_remoteAddress,outp.data(),outp.size());
}
diff --git a/node/Multicaster.cpp b/node/Multicaster.cpp
index cca9d035..b3c0abd8 100644
--- a/node/Multicaster.cpp
+++ b/node/Multicaster.cpp
@@ -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 int n = 0,i,rptr;
+ unsigned int n = 0,i,rptr,skipped = 0;
uint64_t a,done[(ZT_PROTO_MAX_PACKET_LENGTH / 5) + 1];
Mutex::Lock _l(_groups_m);
@@ -90,16 +90,20 @@ restart_member_scan:
// Log that we've picked this one
done[n++] = a;
- // Append to packet
- p = (unsigned char *)appendTo.appendField(ZT_ADDRESS_LENGTH);
- *(p++) = (unsigned char)((a >> 32) & 0xff);
- *(p++) = (unsigned char)((a >> 24) & 0xff);
- *(p++) = (unsigned char)((a >> 16) & 0xff);
- *(p++) = (unsigned char)((a >> 8) & 0xff);
- *p = (unsigned char)(a & 0xff);
+ if (queryingPeer.toInt() == a) {
+ ++skipped;
+ } else {
+ // Append to packet
+ p = (unsigned char *)appendTo.appendField(ZT_ADDRESS_LENGTH);
+ *(p++) = (unsigned char)((a >> 32) & 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;
}
@@ -249,6 +253,10 @@ void Multicaster::_add(uint64_t now,uint64_t nwid,MulticastGroupStatus &gs,const
{
// 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
for(std::vector<MulticastGroupMember>::iterator m(gs.members.begin());m!=gs.members.end();++m) {
if (m->address == member) {
diff --git a/node/Multicaster.hpp b/node/Multicaster.hpp
index ae62456c..1fba5f64 100644
--- a/node/Multicaster.hpp
+++ b/node/Multicaster.hpp
@@ -109,6 +109,7 @@ public:
* If zero is returned, the first two fields will still have been appended.
*
* @param RR Runtime environment
+ * @param queryingPeer Peer asking for gather (to skip in results)
* @param nwid Network ID
* @param mg Multicast group
* @param appendTo Packet to append to
@@ -116,7 +117,7 @@ public:
* @return Number of addresses appended
* @throws std::out_of_range Buffer overflow writing to packet
*/
- unsigned int gather(const RuntimeEnvironment *RR,uint64_t nwid,MulticastGroup &mg,Packet &appendTo,unsigned int limit) const;
+ unsigned int gather(const RuntimeEnvironment *RR,const Address &queryingPeer,uint64_t nwid,MulticastGroup &mg,Packet &appendTo,unsigned int limit) const;
/**
* Send a multicast