|
@@ -21,8 +21,9 @@
|
|
#include "OutboundMulticast.hpp"
|
|
#include "OutboundMulticast.hpp"
|
|
#include "Switch.hpp"
|
|
#include "Switch.hpp"
|
|
#include "Network.hpp"
|
|
#include "Network.hpp"
|
|
-#include "CertificateOfMembership.hpp"
|
|
|
|
#include "Node.hpp"
|
|
#include "Node.hpp"
|
|
|
|
+#include "Peer.hpp"
|
|
|
|
+#include "Topology.hpp"
|
|
|
|
|
|
namespace ZeroTier {
|
|
namespace ZeroTier {
|
|
|
|
|
|
@@ -30,7 +31,6 @@ void OutboundMulticast::init(
|
|
const RuntimeEnvironment *RR,
|
|
const RuntimeEnvironment *RR,
|
|
uint64_t timestamp,
|
|
uint64_t timestamp,
|
|
uint64_t nwid,
|
|
uint64_t nwid,
|
|
- const CertificateOfMembership *com,
|
|
|
|
unsigned int limit,
|
|
unsigned int limit,
|
|
unsigned int gatherLimit,
|
|
unsigned int gatherLimit,
|
|
const MAC &src,
|
|
const MAC &src,
|
|
@@ -48,7 +48,7 @@ void OutboundMulticast::init(
|
|
if (src) flags |= 0x04;
|
|
if (src) flags |= 0x04;
|
|
|
|
|
|
/*
|
|
/*
|
|
- TRACE(">>MC %.16llx INIT %.16llx/%s limit %u gatherLimit %u from %s to %s length %u com==%d",
|
|
|
|
|
|
+ TRACE(">>MC %.16llx INIT %.16llx/%s limit %u gatherLimit %u from %s to %s length %u",
|
|
(unsigned long long)this,
|
|
(unsigned long long)this,
|
|
nwid,
|
|
nwid,
|
|
dest.toString().c_str(),
|
|
dest.toString().c_str(),
|
|
@@ -56,58 +56,35 @@ void OutboundMulticast::init(
|
|
gatherLimit,
|
|
gatherLimit,
|
|
(src) ? src.toString().c_str() : MAC(RR->identity.address(),nwid).toString().c_str(),
|
|
(src) ? src.toString().c_str() : MAC(RR->identity.address(),nwid).toString().c_str(),
|
|
dest.toString().c_str(),
|
|
dest.toString().c_str(),
|
|
- len,
|
|
|
|
- (com) ? 1 : 0);
|
|
|
|
|
|
+ len);
|
|
*/
|
|
*/
|
|
|
|
|
|
- _packetNoCom.setSource(RR->identity.address());
|
|
|
|
- _packetNoCom.setVerb(Packet::VERB_MULTICAST_FRAME);
|
|
|
|
- _packetNoCom.append((uint64_t)nwid);
|
|
|
|
- _packetNoCom.append(flags);
|
|
|
|
- if (gatherLimit) _packetNoCom.append((uint32_t)gatherLimit);
|
|
|
|
- if (src) src.appendTo(_packetNoCom);
|
|
|
|
- dest.mac().appendTo(_packetNoCom);
|
|
|
|
- _packetNoCom.append((uint32_t)dest.adi());
|
|
|
|
- _packetNoCom.append((uint16_t)etherType);
|
|
|
|
- _packetNoCom.append(payload,len);
|
|
|
|
- _packetNoCom.compress();
|
|
|
|
-
|
|
|
|
- if (com) {
|
|
|
|
- _haveCom = true;
|
|
|
|
- flags |= 0x01;
|
|
|
|
-
|
|
|
|
- _packetWithCom.setSource(RR->identity.address());
|
|
|
|
- _packetWithCom.setVerb(Packet::VERB_MULTICAST_FRAME);
|
|
|
|
- _packetWithCom.append((uint64_t)nwid);
|
|
|
|
- _packetWithCom.append(flags);
|
|
|
|
- com->serialize(_packetWithCom);
|
|
|
|
- if (gatherLimit) _packetWithCom.append((uint32_t)gatherLimit);
|
|
|
|
- if (src) src.appendTo(_packetWithCom);
|
|
|
|
- dest.mac().appendTo(_packetWithCom);
|
|
|
|
- _packetWithCom.append((uint32_t)dest.adi());
|
|
|
|
- _packetWithCom.append((uint16_t)etherType);
|
|
|
|
- _packetWithCom.append(payload,len);
|
|
|
|
- _packetWithCom.compress();
|
|
|
|
- } else _haveCom = false;
|
|
|
|
|
|
+ _packet.setSource(RR->identity.address());
|
|
|
|
+ _packet.setVerb(Packet::VERB_MULTICAST_FRAME);
|
|
|
|
+ _packet.append((uint64_t)nwid);
|
|
|
|
+ _packet.append(flags);
|
|
|
|
+ if (gatherLimit) _packet.append((uint32_t)gatherLimit);
|
|
|
|
+ if (src) src.appendTo(_packet);
|
|
|
|
+ dest.mac().appendTo(_packet);
|
|
|
|
+ _packet.append((uint32_t)dest.adi());
|
|
|
|
+ _packet.append((uint16_t)etherType);
|
|
|
|
+ _packet.append(payload,len);
|
|
|
|
+ _packet.compress();
|
|
}
|
|
}
|
|
|
|
|
|
void OutboundMulticast::sendOnly(const RuntimeEnvironment *RR,const Address &toAddr)
|
|
void OutboundMulticast::sendOnly(const RuntimeEnvironment *RR,const Address &toAddr)
|
|
{
|
|
{
|
|
- if (_haveCom) {
|
|
|
|
- SharedPtr<Peer> peer(RR->topology->getPeer(toAddr));
|
|
|
|
- if ( (!peer) || (peer->needsOurNetworkMembershipCertificate(_nwid,RR->node->now(),true)) ) {
|
|
|
|
- //TRACE(">>MC %.16llx -> %s (with COM)",(unsigned long long)this,toAddr.toString().c_str());
|
|
|
|
- _packetWithCom.newInitializationVector();
|
|
|
|
- _packetWithCom.setDestination(toAddr);
|
|
|
|
- RR->sw->send(_packetWithCom,true,_nwid);
|
|
|
|
- return;
|
|
|
|
- }
|
|
|
|
|
|
+ // TODO: apply Filter
|
|
|
|
+
|
|
|
|
+ SharedPtr<Peer> peer(RR->topology->getPeer(toAddr));
|
|
|
|
+ if (peer) {
|
|
|
|
+ // TODO: push creds if needed
|
|
}
|
|
}
|
|
|
|
|
|
- //TRACE(">>MC %.16llx -> %s (without COM)",(unsigned long long)this,toAddr.toString().c_str());
|
|
|
|
- _packetNoCom.newInitializationVector();
|
|
|
|
- _packetNoCom.setDestination(toAddr);
|
|
|
|
- RR->sw->send(_packetNoCom,true,_nwid);
|
|
|
|
|
|
+ //TRACE(">>MC %.16llx -> %s",(unsigned long long)this,toAddr.toString().c_str());
|
|
|
|
+ _packet.newInitializationVector();
|
|
|
|
+ _packet.setDestination(toAddr);
|
|
|
|
+ RR->sw->send(_packet,true,_nwid);
|
|
}
|
|
}
|
|
|
|
|
|
} // namespace ZeroTier
|
|
} // namespace ZeroTier
|