From 110904678275be6e26415c44ebdeee61ffa93edf Mon Sep 17 00:00:00 2001 From: Adam Ierymenko Date: Thu, 2 Oct 2014 13:50:37 -0700 Subject: Last steps before test: parse OK(MULTICAST_GATHER) and OK(MULTICAST_FRAME) --- node/IncomingPacket.cpp | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) (limited to 'node/IncomingPacket.cpp') diff --git a/node/IncomingPacket.cpp b/node/IncomingPacket.cpp index ef45ddac..01db2db4 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 -- cgit v1.2.3