mirror of
https://github.com/zerotier/ZeroTierOne.git
synced 2025-06-05 03:53:44 +02:00
A bit more IncomingPacket cleanup... almost ready to test, just need OK() handling.
This commit is contained in:
parent
e1882b614b
commit
28646eee0a
1 changed files with 35 additions and 48 deletions
|
@ -34,14 +34,13 @@
|
||||||
#include "Constants.hpp"
|
#include "Constants.hpp"
|
||||||
#include "Defaults.hpp"
|
#include "Defaults.hpp"
|
||||||
#include "RuntimeEnvironment.hpp"
|
#include "RuntimeEnvironment.hpp"
|
||||||
#include "Topology.hpp"
|
|
||||||
#include "IncomingPacket.hpp"
|
#include "IncomingPacket.hpp"
|
||||||
|
#include "Topology.hpp"
|
||||||
#include "Switch.hpp"
|
#include "Switch.hpp"
|
||||||
#include "Peer.hpp"
|
#include "Peer.hpp"
|
||||||
#include "NodeConfig.hpp"
|
#include "NodeConfig.hpp"
|
||||||
#include "Service.hpp"
|
#include "Service.hpp"
|
||||||
#include "SoftwareUpdater.hpp"
|
#include "SoftwareUpdater.hpp"
|
||||||
#include "SHA512.hpp"
|
|
||||||
|
|
||||||
namespace ZeroTier {
|
namespace ZeroTier {
|
||||||
|
|
||||||
|
@ -73,34 +72,20 @@ bool IncomingPacket::tryDecode(const RuntimeEnvironment *RR)
|
||||||
default: // ignore unknown verbs, but if they pass auth check they are still valid
|
default: // ignore unknown verbs, but if they pass auth check they are still valid
|
||||||
peer->receive(RR,_fromSock,_remoteAddress,hops(),packetId(),verb(),0,Packet::VERB_NOP,Utils::now());
|
peer->receive(RR,_fromSock,_remoteAddress,hops(),packetId(),verb(),0,Packet::VERB_NOP,Utils::now());
|
||||||
return true;
|
return true;
|
||||||
case Packet::VERB_HELLO:
|
case Packet::VERB_HELLO: return _doHELLO(RR);
|
||||||
return _doHELLO(RR);
|
case Packet::VERB_ERROR: return _doERROR(RR,peer);
|
||||||
case Packet::VERB_ERROR:
|
case Packet::VERB_OK: return _doOK(RR,peer);
|
||||||
return _doERROR(RR,peer);
|
case Packet::VERB_WHOIS: return _doWHOIS(RR,peer);
|
||||||
case Packet::VERB_OK:
|
case Packet::VERB_RENDEZVOUS: return _doRENDEZVOUS(RR,peer);
|
||||||
return _doOK(RR,peer);
|
case Packet::VERB_FRAME: return _doFRAME(RR,peer);
|
||||||
case Packet::VERB_WHOIS:
|
case Packet::VERB_EXT_FRAME: return _doEXT_FRAME(RR,peer);
|
||||||
return _doWHOIS(RR,peer);
|
case Packet::VERB_P5_MULTICAST_FRAME: return _doP5_MULTICAST_FRAME(RR,peer);
|
||||||
case Packet::VERB_RENDEZVOUS:
|
case Packet::VERB_MULTICAST_LIKE: return _doMULTICAST_LIKE(RR,peer);
|
||||||
return _doRENDEZVOUS(RR,peer);
|
case Packet::VERB_NETWORK_MEMBERSHIP_CERTIFICATE: return _doNETWORK_MEMBERSHIP_CERTIFICATE(RR,peer);
|
||||||
case Packet::VERB_FRAME:
|
case Packet::VERB_NETWORK_CONFIG_REQUEST: return _doNETWORK_CONFIG_REQUEST(RR,peer);
|
||||||
return _doFRAME(RR,peer);
|
case Packet::VERB_NETWORK_CONFIG_REFRESH: return _doNETWORK_CONFIG_REFRESH(RR,peer);
|
||||||
case Packet::VERB_EXT_FRAME:
|
case Packet::VERB_MULTICAST_GATHER: return _doMULTICAST_GATHER(RR,peer);
|
||||||
return _doEXT_FRAME(RR,peer);
|
case Packet::VERB_MULTICAST_FRAME: return _doMULTICAST_FRAME(RR,peer);
|
||||||
case Packet::VERB_P5_MULTICAST_FRAME:
|
|
||||||
return _doP5_MULTICAST_FRAME(RR,peer);
|
|
||||||
case Packet::VERB_MULTICAST_LIKE:
|
|
||||||
return _doMULTICAST_LIKE(RR,peer);
|
|
||||||
case Packet::VERB_NETWORK_MEMBERSHIP_CERTIFICATE:
|
|
||||||
return _doNETWORK_MEMBERSHIP_CERTIFICATE(RR,peer);
|
|
||||||
case Packet::VERB_NETWORK_CONFIG_REQUEST:
|
|
||||||
return _doNETWORK_CONFIG_REQUEST(RR,peer);
|
|
||||||
case Packet::VERB_NETWORK_CONFIG_REFRESH:
|
|
||||||
return _doNETWORK_CONFIG_REFRESH(RR,peer);
|
|
||||||
case Packet::VERB_MULTICAST_GATHER:
|
|
||||||
return _doMULTICAST_GATHER(RR,peer);
|
|
||||||
case Packet::VERB_MULTICAST_FRAME:
|
|
||||||
return _doMULTICAST_FRAME(RR,peer);
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
RR->sw->requestWhois(source());
|
RR->sw->requestWhois(source());
|
||||||
|
@ -147,7 +132,7 @@ bool IncomingPacket::_doERROR(const RuntimeEnvironment *RR,const SharedPtr<Peer>
|
||||||
network->setAccessDenied();
|
network->setAccessDenied();
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
// TODO
|
// TODO -- send and accept these to cancel multicast "LIKE"s
|
||||||
//case Packet::ERROR_UNWANTED_MULTICAST: {
|
//case Packet::ERROR_UNWANTED_MULTICAST: {
|
||||||
//} break;
|
//} break;
|
||||||
|
|
||||||
|
@ -971,26 +956,28 @@ bool IncomingPacket::_doMULTICAST_FRAME(const RuntimeEnvironment *RR,const Share
|
||||||
unsigned int etherType = at<uint16_t>(comLen + ZT_PROTO_VERB_MULTICAST_FRAME_IDX_ETHERTYPE);
|
unsigned int etherType = at<uint16_t>(comLen + ZT_PROTO_VERB_MULTICAST_FRAME_IDX_ETHERTYPE);
|
||||||
unsigned int payloadLen = size() - (comLen + ZT_PROTO_VERB_MULTICAST_FRAME_IDX_FRAME);
|
unsigned int payloadLen = size() - (comLen + ZT_PROTO_VERB_MULTICAST_FRAME_IDX_FRAME);
|
||||||
|
|
||||||
if (!to.mac().isMulticast()) {
|
if (payloadLen) {
|
||||||
TRACE("dropped MULTICAST_FRAME from %s@%s(%s) to %s: destination is unicast, must use FRAME or EXT_FRAME",from.toString().c_str(),peer->address().toString().c_str(),_remoteAddress.toString().c_str(),to.toString().c_str());
|
if (!to.mac().isMulticast()) {
|
||||||
return true;
|
TRACE("dropped MULTICAST_FRAME from %s@%s(%s) to %s: destination is unicast, must use FRAME or EXT_FRAME",from.toString().c_str(),peer->address().toString().c_str(),_remoteAddress.toString().c_str(),to.toString().c_str());
|
||||||
}
|
|
||||||
|
|
||||||
if ((!from)||(from.isMulticast())||(from == network->mac())) {
|
|
||||||
TRACE("dropped MULTICAST_FRAME from %s@%s(%s) to %s: invalid source MAC",from.toString().c_str(),peer->address().toString().c_str(),_remoteAddress.toString().c_str(),to.toString().c_str());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (from != MAC(peer->address(),network->id())) {
|
|
||||||
if (network->permitsBridging(peer->address())) {
|
|
||||||
network->learnBridgeRoute(from,peer->address());
|
|
||||||
} else {
|
|
||||||
TRACE("dropped MULTICAST_FRAME from %s@%s(%s) to %s: sender not allowed to bridge into %.16llx",from.toString().c_str(),peer->address().toString().c_str(),_remoteAddress.toString().c_str(),to.toString().c_str(),network->id());
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
network->tapPut(from,to.mac(),etherType,field(comLen + ZT_PROTO_VERB_MULTICAST_FRAME_IDX_FRAME,payloadLen),payloadLen);
|
if ((!from)||(from.isMulticast())||(from == network->mac())) {
|
||||||
|
TRACE("dropped MULTICAST_FRAME from %s@%s(%s) to %s: invalid source MAC",from.toString().c_str(),peer->address().toString().c_str(),_remoteAddress.toString().c_str(),to.toString().c_str());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (from != MAC(peer->address(),network->id())) {
|
||||||
|
if (network->permitsBridging(peer->address())) {
|
||||||
|
network->learnBridgeRoute(from,peer->address());
|
||||||
|
} else {
|
||||||
|
TRACE("dropped MULTICAST_FRAME from %s@%s(%s) to %s: sender not allowed to bridge into %.16llx",from.toString().c_str(),peer->address().toString().c_str(),_remoteAddress.toString().c_str(),to.toString().c_str(),network->id());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
network->tapPut(from,to.mac(),etherType,field(comLen + ZT_PROTO_VERB_MULTICAST_FRAME_IDX_FRAME,payloadLen),payloadLen);
|
||||||
|
}
|
||||||
|
|
||||||
if (gatherLimit) {
|
if (gatherLimit) {
|
||||||
Packet outp(source(),RR->identity.address(),Packet::VERB_OK);
|
Packet outp(source(),RR->identity.address(),Packet::VERB_OK);
|
||||||
|
|
Loading…
Add table
Reference in a new issue