From 110904678275be6e26415c44ebdeee61ffa93edf Mon Sep 17 00:00:00 2001 From: Adam Ierymenko Date: Thu, 2 Oct 2014 13:50:37 -0700 Subject: [PATCH] Last steps before test: parse OK(MULTICAST_GATHER) and OK(MULTICAST_FRAME) --- node/IncomingPacket.cpp | 27 +++++++++++++++++++++++++++ node/IncomingPacket.hpp | 4 ++++ node/Multicaster.cpp | 4 +++- node/Packet.hpp | 11 +++++++++++ 4 files changed, 45 insertions(+), 1 deletion(-) diff --git a/node/IncomingPacket.cpp b/node/IncomingPacket.cpp index ef45ddacf..01db2db48 100644 --- a/node/IncomingPacket.cpp +++ b/node/IncomingPacket.cpp @@ -323,9 +323,18 @@ bool IncomingPacket::_doOK(const RuntimeEnvironment *RR,const SharedPtr &p } break; case Packet::VERB_MULTICAST_GATHER: { + 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)); + _parseGatherResults(RR,peer,nwid,mg,ZT_PROTO_VERB_MULTICAST_GATHER__OK__IDX_GATHER_RESULTS); } break; case Packet::VERB_MULTICAST_FRAME: { + unsigned int flags = (*this)[ZT_PROTO_VERB_MULTICAST_FRAME__OK__IDX_FLAGS]; + if ((flags & 0x01) != 0) { + uint64_t nwid = at(ZT_PROTO_VERB_MULTICAST_FRAME__OK__IDX_NETWORK_ID); + MulticastGroup mg(MAC(field(ZT_PROTO_VERB_MULTICAST_FRAME__OK__IDX_MAC,6),6),at(ZT_PROTO_VERB_MULTICAST_FRAME__OK__IDX_ADI)); + _parseGatherResults(RR,peer,nwid,mg,ZT_PROTO_VERB_MULTICAST_FRAME__OK__IDX_GATHER_RESULTS); + } } break; default: break; @@ -1022,4 +1031,22 @@ 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); + const unsigned char *p = (const unsigned char *)data() + offset + 6; + const unsigned char *e = (const unsigned char *)data() + size(); + Address atmp; + uint64_t now = Utils::now(); + for(unsigned int i=0;i e) + break; + atmp.setTo(p,ZT_ADDRESS_LENGTH); + RR->mc->add(now,nwid,mg,peer->address(),atmp); + p = n; + } +} + } // namespace ZeroTier diff --git a/node/IncomingPacket.hpp b/node/IncomingPacket.hpp index 33f12a5f9..5bda2789e 100644 --- a/node/IncomingPacket.hpp +++ b/node/IncomingPacket.hpp @@ -36,6 +36,7 @@ #include "Utils.hpp" #include "SharedPtr.hpp" #include "AtomicCounter.hpp" +#include "MulticastGroup.hpp" #include "Peer.hpp" #include "Socket.hpp" @@ -129,6 +130,9 @@ 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 8e3e3e297..cca9d0356 100644 --- a/node/Multicaster.cpp +++ b/node/Multicaster.cpp @@ -252,8 +252,10 @@ void Multicaster::_add(uint64_t now,uint64_t nwid,MulticastGroupStatus &gs,const // Update timestamp and learnedFrom if existing for(std::vector::iterator m(gs.members.begin());m!=gs.members.end();++m) { if (m->address == member) { + // learnedFrom is NULL (zero) if we've learned this directly via MULTICAST_LIKE, at which + // point this becomes a first-order connection. if (m->learnedFrom) - m->learnedFrom = learnedFrom; // only update with indirect learnedFrom if we've never directly learned from this peer + m->learnedFrom = learnedFrom; m->timestamp = now; return; } diff --git a/node/Packet.hpp b/node/Packet.hpp index 9499c5196..68a4439e2 100644 --- a/node/Packet.hpp +++ b/node/Packet.hpp @@ -292,6 +292,17 @@ #define ZT_PROTO_VERB_NETWORK_CONFIG_REQUEST__OK__IDX_DICT_LEN (ZT_PROTO_VERB_NETWORK_CONFIG_REQUEST__OK__IDX_NETWORK_ID + 8) #define ZT_PROTO_VERB_NETWORK_CONFIG_REQUEST__OK__IDX_DICT (ZT_PROTO_VERB_NETWORK_CONFIG_REQUEST__OK__IDX_DICT_LEN + 2) +#define ZT_PROTO_VERB_MULTICAST_GATHER__OK__IDX_NETWORK_ID (ZT_PROTO_VERB_OK_IDX_PAYLOAD) +#define ZT_PROTO_VERB_MULTICAST_GATHER__OK__IDX_MAC (ZT_PROTO_VERB_MULTICAST_GATHER__OK__IDX_NETWORK_ID + 8) +#define ZT_PROTO_VERB_MULTICAST_GATHER__OK__IDX_ADI (ZT_PROTO_VERB_MULTICAST_GATHER__OK__IDX_MAC + 6) +#define ZT_PROTO_VERB_MULTICAST_GATHER__OK__IDX_GATHER_RESULTS (ZT_PROTO_VERB_MULTICAST_GATHER__OK__IDX_ADI + 4) + +#define ZT_PROTO_VERB_MULTICAST_FRAME__OK__IDX_NETWORK_ID (ZT_PROTO_VERB_OK_IDX_PAYLOAD) +#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_GATHER_RESULTS (ZT_PROTO_VERB_MULTICAST_FRAME__OK__IDX_FLAGS + 1) + // --------------------------------------------------------------------------- namespace ZeroTier {