summaryrefslogtreecommitdiff
path: root/node
diff options
context:
space:
mode:
authorAdam Ierymenko <adam.ierymenko@gmail.com>2015-07-07 11:49:38 -0700
committerAdam Ierymenko <adam.ierymenko@gmail.com>2015-07-07 11:49:38 -0700
commit412389ec755528108e0254e75a9cf43fc53e331a (patch)
treeb709372474eeb9ddb959884d72b551cba34674c3 /node
parentcf6f30963cdf6de47342e6724ebd7f8e8058ad43 (diff)
downloadinfinitytier-412389ec755528108e0254e75a9cf43fc53e331a.tar.gz
infinitytier-412389ec755528108e0254e75a9cf43fc53e331a.zip
Implement ERROR_UNWATNED_MULTICAST
Diffstat (limited to 'node')
-rw-r--r--node/IncomingPacket.cpp5
-rw-r--r--node/Multicaster.cpp14
-rw-r--r--node/Multicaster.hpp9
3 files changed, 27 insertions, 1 deletions
diff --git a/node/IncomingPacket.cpp b/node/IncomingPacket.cpp
index d5b4e9e6..6c3a0932 100644
--- a/node/IncomingPacket.cpp
+++ b/node/IncomingPacket.cpp
@@ -156,7 +156,10 @@ bool IncomingPacket::_doERROR(const RuntimeEnvironment *RR,const SharedPtr<Peer>
} break;
case Packet::ERROR_UNWANTED_MULTICAST: {
- // TODO: unsubscribe
+ uint64_t nwid = at<uint64_t>(ZT_PROTO_VERB_ERROR_IDX_PAYLOAD);
+ MulticastGroup mg(MAC(field(ZT_PROTO_VERB_ERROR_IDX_PAYLOAD + 8,6),6),at<uint32_t>(ZT_PROTO_VERB_ERROR_IDX_PAYLOAD + 14));
+ TRACE("%.16llx: peer %s unsubscrubed from multicast group %s",nwid,peer->address().toString().c_str(),mg.toString().c_str());
+ RR->mc->remove(nwid,mg,peer->address());
} break;
default: break;
diff --git a/node/Multicaster.cpp b/node/Multicaster.cpp
index 3c105236..33424e4a 100644
--- a/node/Multicaster.cpp
+++ b/node/Multicaster.cpp
@@ -61,6 +61,20 @@ void Multicaster::addMultiple(uint64_t now,uint64_t nwid,const MulticastGroup &m
}
}
+void Multicaster::remove(uint64_t nwid,const MulticastGroup &mg,const Address &member)
+{
+ Mutex::Lock _l(_groups_m);
+ std::map< std::pair<uint64_t,MulticastGroup>,MulticastGroupStatus >::iterator g(_groups.find(std::pair<uint64_t,MulticastGroup>(nwid,mg)));
+ if (g != _groups.end()) {
+ for(std::vector<MulticastGroupMember>::iterator m(g->second.members.begin());m!=g->second.members.end();++m) {
+ if (m->address == member) {
+ g->second.members.erase(m);
+ break;
+ }
+ }
+ }
+}
+
unsigned int Multicaster::gather(const Address &queryingPeer,uint64_t nwid,const MulticastGroup &mg,Packet &appendTo,unsigned int limit) const
{
unsigned char *p;
diff --git a/node/Multicaster.hpp b/node/Multicaster.hpp
index c6c93b1f..0dd199f9 100644
--- a/node/Multicaster.hpp
+++ b/node/Multicaster.hpp
@@ -107,6 +107,15 @@ public:
void addMultiple(uint64_t now,uint64_t nwid,const MulticastGroup &mg,const void *addresses,unsigned int count,unsigned int totalKnown);
/**
+ * Remove a multicast group member (if present)
+ *
+ * @param nwid Network ID
+ * @param mg Multicast group
+ * @param member Member to unsubscribe
+ */
+ void remove(uint64_t nwid,const MulticastGroup &mg,const Address &member);
+
+ /**
* Append gather results to a packet by choosing registered multicast recipients at random
*
* This appends the following fields to the packet: