instrumentation improvement
This commit is contained in:
parent
083b833bf8
commit
5fb3f5c228
4 changed files with 100 additions and 17 deletions
|
@ -19,6 +19,7 @@
|
|||
#include "../include/ZeroTierOne.h"
|
||||
|
||||
#include "Constants.hpp"
|
||||
#include "Identity.hpp"
|
||||
#include "RuntimeEnvironment.hpp"
|
||||
#include "IncomingPacket.hpp"
|
||||
#include "Topology.hpp"
|
||||
|
@ -62,6 +63,7 @@ bool IncomingPacket::tryDecode(const RuntimeEnvironment *RR,void *tPtr,int32_t f
|
|||
return true;
|
||||
}
|
||||
} else if ((c == ZT_PROTO_CIPHER_SUITE__C25519_POLY1305_NONE)&&(verb() == Packet::VERB_HELLO)) {
|
||||
CT("INCOMING CLEARTEXT HELLO");
|
||||
// Only HELLO is allowed in the clear, but will still have a MAC
|
||||
return _doHELLO(RR,tPtr,false);
|
||||
}
|
||||
|
@ -89,66 +91,87 @@ bool IncomingPacket::tryDecode(const RuntimeEnvironment *RR,void *tPtr,int32_t f
|
|||
//case Packet::VERB_NOP:
|
||||
default: // ignore unknown verbs, but if they pass auth check they are "received"
|
||||
Metrics::pkt_nop_in++;
|
||||
CT("UNKNOWN VERB");
|
||||
peer->received(tPtr,_path,hops(),packetId(),payloadLength(),v,0,Packet::VERB_NOP,false,0,ZT_QOS_NO_FLOW);
|
||||
break;
|
||||
case Packet::VERB_HELLO:
|
||||
CT("INCOMING HELLO");
|
||||
r = _doHELLO(RR, tPtr, true);
|
||||
break;
|
||||
case Packet::VERB_ACK:
|
||||
CT("INCOMING VERB_ACK");
|
||||
r = _doACK(RR, tPtr, peer);
|
||||
break;
|
||||
case Packet::VERB_QOS_MEASUREMENT:
|
||||
CT("INCOMING QOS_MEASUREMENT");
|
||||
r = _doQOS_MEASUREMENT(RR, tPtr, peer);
|
||||
break;
|
||||
case Packet::VERB_ERROR:
|
||||
CT("INCOMING ERROR");
|
||||
r = _doERROR(RR, tPtr, peer);
|
||||
break;
|
||||
case Packet::VERB_OK:
|
||||
CT("INCOMING OK");
|
||||
r = _doOK(RR, tPtr, peer);
|
||||
break;
|
||||
case Packet::VERB_WHOIS:
|
||||
CT("INCOMING WHOIS");
|
||||
r = _doWHOIS(RR, tPtr, peer);
|
||||
break;
|
||||
case Packet::VERB_RENDEZVOUS:
|
||||
CT("INCOMING RENDEZVOUS");
|
||||
r = _doRENDEZVOUS(RR, tPtr, peer);
|
||||
break;
|
||||
case Packet::VERB_FRAME:
|
||||
CT("INCOMING FRAME");
|
||||
r = _doFRAME(RR, tPtr, peer, flowId);
|
||||
break;
|
||||
case Packet::VERB_EXT_FRAME:
|
||||
CT("INCOMING EXT_FRAME");
|
||||
r = _doEXT_FRAME(RR, tPtr, peer, flowId);
|
||||
break;
|
||||
case Packet::VERB_ECHO:
|
||||
CT("INCOMING ECHO");
|
||||
r = _doECHO(RR, tPtr, peer);
|
||||
break;
|
||||
case Packet::VERB_MULTICAST_LIKE:
|
||||
CT("INCOMING MULTICAST_LIKE");
|
||||
r = _doMULTICAST_LIKE(RR, tPtr, peer);
|
||||
break;
|
||||
case Packet::VERB_NETWORK_CREDENTIALS:
|
||||
CT("INCOMING NETWORK_CREDENTIALS");
|
||||
r = _doNETWORK_CREDENTIALS(RR, tPtr, peer);
|
||||
break;
|
||||
case Packet::VERB_NETWORK_CONFIG_REQUEST:
|
||||
CT("INCOMING CONFIG_REQUEST");
|
||||
r = _doNETWORK_CONFIG_REQUEST(RR, tPtr, peer);
|
||||
break;
|
||||
case Packet::VERB_NETWORK_CONFIG:
|
||||
CT("INCOMING NETWORK_CONFIG");
|
||||
r = _doNETWORK_CONFIG(RR, tPtr, peer);
|
||||
break;
|
||||
case Packet::VERB_MULTICAST_GATHER:
|
||||
CT("INCOMING MULTICAST_GATHER");
|
||||
r = _doMULTICAST_GATHER(RR, tPtr, peer);
|
||||
break;
|
||||
case Packet::VERB_MULTICAST_FRAME:
|
||||
CT("INCOMING MULTICAST_FRAME");
|
||||
r = _doMULTICAST_FRAME(RR, tPtr, peer);
|
||||
break;
|
||||
case Packet::VERB_PUSH_DIRECT_PATHS:
|
||||
CT("INCOMING PUSH_DIRECT_PATHS");
|
||||
r = _doPUSH_DIRECT_PATHS(RR, tPtr, peer);
|
||||
break;
|
||||
case Packet::VERB_USER_MESSAGE:
|
||||
CT("INCOMING USER_MESSAGE");
|
||||
r = _doUSER_MESSAGE(RR, tPtr, peer);
|
||||
break;
|
||||
case Packet::VERB_REMOTE_TRACE:
|
||||
CT("INCOMING REMOTE_TRACE");
|
||||
r = _doREMOTE_TRACE(RR, tPtr, peer);
|
||||
break;
|
||||
case Packet::VERB_PATH_NEGOTIATION_REQUEST:
|
||||
CT("INCOMING PATH_NEGOTIATION_REQUEST");
|
||||
r = _doPATH_NEGOTIATION_REQUEST(RR, tPtr, peer);
|
||||
break;
|
||||
}
|
||||
|
@ -158,6 +181,7 @@ bool IncomingPacket::tryDecode(const RuntimeEnvironment *RR,void *tPtr,int32_t f
|
|||
}
|
||||
return false;
|
||||
} else {
|
||||
CT("REQUESTING WHOIS");
|
||||
RR->sw->requestWhois(tPtr,RR->node->now(),sourceAddress);
|
||||
return false;
|
||||
}
|
||||
|
@ -375,7 +399,9 @@ bool IncomingPacket::_doHELLO(const RuntimeEnvironment *RR,void *tPtr,const bool
|
|||
const int64_t timestamp = at<int64_t>(ZT_PROTO_VERB_HELLO_IDX_TIMESTAMP);
|
||||
Identity id;
|
||||
unsigned int ptr = ZT_PROTO_VERB_HELLO_IDX_IDENTITY + id.deserialize(*this,ZT_PROTO_VERB_HELLO_IDX_IDENTITY);
|
||||
|
||||
char buf[64];
|
||||
id.address().toString(buf);
|
||||
CT("HELLO FROM %s", buf);
|
||||
if (protoVersion < ZT_PROTO_VERSION_MIN) {
|
||||
RR->t->incomingPacketDroppedHELLO(tPtr,_path,pid,fromAddress,"protocol version too old");
|
||||
return true;
|
||||
|
@ -408,7 +434,8 @@ bool IncomingPacket::_doHELLO(const RuntimeEnvironment *RR,void *tPtr,const bool
|
|||
outp.armor(key,true,peer->aesKeysIfSupported());
|
||||
Metrics::pkt_error_out++;
|
||||
Metrics::pkt_error_identity_collision_out++;
|
||||
CT("UNPROCESSED");
|
||||
outp.destination().toString(buf);
|
||||
CT("UNPROCESSED, packetId: %lx, address: %s", outp.packetId(), buf);
|
||||
_path->send(RR,tPtr,outp.data(),outp.size(),RR->node->now());
|
||||
} else {
|
||||
RR->t->incomingPacketMessageAuthenticationFailure(tPtr,_path,pid,fromAddress,hops(),"invalid MAC");
|
||||
|
@ -567,7 +594,8 @@ bool IncomingPacket::_doHELLO(const RuntimeEnvironment *RR,void *tPtr,const bool
|
|||
outp.armor(peer->key(),true,peer->aesKeysIfSupported());
|
||||
peer->recordOutgoingPacket(_path,outp.packetId(),outp.payloadLength(),outp.verb(),ZT_QOS_NO_FLOW,now);
|
||||
Metrics::pkt_ok_out++;
|
||||
CT("UNPROCESSED, packetId: %lx", outp.packetId());
|
||||
outp.destination().toString(buf);
|
||||
CT("UNPROCESSED, packetId: %lx, address: %s", outp.packetId(), buf);
|
||||
_path->send(RR,tPtr,outp.data(),outp.size(),now);
|
||||
|
||||
peer->setRemoteVersion(protoVersion,vMajor,vMinor,vRevision); // important for this to go first so received() knows the version
|
||||
|
@ -638,10 +666,14 @@ bool IncomingPacket::_doOK(const RuntimeEnvironment *RR,void *tPtr,const SharedP
|
|||
if (RR->topology->isUpstream(peer->identity())) {
|
||||
const Identity id(*this,ZT_PROTO_VERB_WHOIS__OK__IDX_IDENTITY);
|
||||
RR->sw->doAnythingWaitingForPeer(tPtr,RR->topology->addPeer(tPtr,SharedPtr<Peer>(new Peer(RR,RR->identity,id))));
|
||||
char buf[64];
|
||||
id.address().toString(buf);
|
||||
CT("GOT OK REPLY TO WHOIS %s", buf);
|
||||
}
|
||||
break;
|
||||
|
||||
case Packet::VERB_NETWORK_CONFIG_REQUEST: {
|
||||
CT("GOT OK REPLY TO NETWORK_CONFIG_REQUEST");
|
||||
networkId = at<uint64_t>(ZT_PROTO_VERB_OK_IDX_PAYLOAD);
|
||||
const SharedPtr<Network> network(RR->node->network(networkId));
|
||||
if (network) {
|
||||
|
@ -650,6 +682,7 @@ bool IncomingPacket::_doOK(const RuntimeEnvironment *RR,void *tPtr,const SharedP
|
|||
} break;
|
||||
|
||||
case Packet::VERB_MULTICAST_GATHER: {
|
||||
CT("GOT OK REPLY TO MULTICAST_GATHER");
|
||||
networkId = at<uint64_t>(ZT_PROTO_VERB_MULTICAST_GATHER__OK__IDX_NETWORK_ID);
|
||||
const SharedPtr<Network> network(RR->node->network(networkId));
|
||||
if (network) {
|
||||
|
@ -660,6 +693,7 @@ bool IncomingPacket::_doOK(const RuntimeEnvironment *RR,void *tPtr,const SharedP
|
|||
} break;
|
||||
|
||||
case Packet::VERB_MULTICAST_FRAME: {
|
||||
CT("GOT OK REPLY TO MULTICAST_FRAME");
|
||||
const unsigned int flags = (*this)[ZT_PROTO_VERB_MULTICAST_FRAME__OK__IDX_FLAGS];
|
||||
networkId = at<uint64_t>(ZT_PROTO_VERB_MULTICAST_FRAME__OK__IDX_NETWORK_ID);
|
||||
const MulticastGroup mg(MAC(field(ZT_PROTO_VERB_MULTICAST_FRAME__OK__IDX_MAC,6),6),at<uint32_t>(ZT_PROTO_VERB_MULTICAST_FRAME__OK__IDX_ADI));
|
||||
|
@ -714,6 +748,9 @@ bool IncomingPacket::_doWHOIS(const RuntimeEnvironment *RR,void *tPtr,const Shar
|
|||
while ((ptr + ZT_ADDRESS_LENGTH) <= size()) {
|
||||
const Address addr(field(ptr,ZT_ADDRESS_LENGTH),ZT_ADDRESS_LENGTH);
|
||||
ptr += ZT_ADDRESS_LENGTH;
|
||||
char buf[64];
|
||||
addr.toString(buf);
|
||||
CT("GOT WHOIS REQUEST ON %s", buf);
|
||||
|
||||
const Identity id(RR->topology->getIdentity(tPtr,addr));
|
||||
if (id) {
|
||||
|
@ -728,7 +765,9 @@ bool IncomingPacket::_doWHOIS(const RuntimeEnvironment *RR,void *tPtr,const Shar
|
|||
if (count > 0) {
|
||||
Metrics::pkt_ok_out++;
|
||||
outp.armor(peer->key(),true,peer->aesKeysIfSupported());
|
||||
CT("UNPROCESSED");
|
||||
char buf[64];
|
||||
outp.destination().toString(buf);
|
||||
CT("WHOIS REPLY, packetId: %lx, address: %s", outp.packetId(), buf);
|
||||
_path->send(RR,tPtr,outp.data(),outp.size(),RR->node->now());
|
||||
}
|
||||
|
||||
|
@ -959,7 +998,9 @@ bool IncomingPacket::_doEXT_FRAME(const RuntimeEnvironment *RR,void *tPtr,const
|
|||
outp.armor(peer->key(),true,peer->aesKeysIfSupported());
|
||||
peer->recordOutgoingPacket(_path,outp.packetId(),outp.payloadLength(),outp.verb(),ZT_QOS_NO_FLOW,now);
|
||||
Metrics::pkt_ok_out++;
|
||||
CT("UNPROCESSED");
|
||||
char buf[64];
|
||||
outp.destination().toString(buf);
|
||||
CT("UNPROCESSED, packetId: %lx, address: %s", outp.packetId(), buf);
|
||||
_path->send(RR,tPtr,outp.data(),outp.size(),RR->node->now());
|
||||
}
|
||||
|
||||
|
@ -989,7 +1030,9 @@ bool IncomingPacket::_doECHO(const RuntimeEnvironment *RR,void *tPtr,const Share
|
|||
outp.armor(peer->key(),true,peer->aesKeysIfSupported());
|
||||
peer->recordOutgoingPacket(_path,outp.packetId(),outp.payloadLength(),outp.verb(),ZT_QOS_NO_FLOW,now);
|
||||
Metrics::pkt_ok_out++;
|
||||
CT("UNPROCESSED, packetID: %lx", outp.packetId());
|
||||
char buf[64];
|
||||
outp.destination().toString(buf);
|
||||
CT("UNPROCESSED, packetId: %lx, address: %s", outp.packetId(), buf);
|
||||
_path->send(RR,tPtr,outp.data(),outp.size(),RR->node->now());
|
||||
|
||||
peer->received(tPtr,_path,hops(),pid,payloadLength(),Packet::VERB_ECHO,0,Packet::VERB_NOP,false,0,ZT_QOS_NO_FLOW);
|
||||
|
@ -1186,7 +1229,9 @@ bool IncomingPacket::_doNETWORK_CONFIG_REQUEST(const RuntimeEnvironment *RR,void
|
|||
outp.armor(peer->key(),true,peer->aesKeysIfSupported());
|
||||
Metrics::pkt_error_out++;
|
||||
Metrics::pkt_error_unsupported_op_out++;
|
||||
CT("UNPROCESSED");
|
||||
char buf[64];
|
||||
outp.destination().toString(buf);
|
||||
CT("UNPROCESSED, packetId: %lx, address: %s", outp.packetId(), buf);
|
||||
_path->send(RR,tPtr,outp.data(),outp.size(),RR->node->now());
|
||||
}
|
||||
|
||||
|
@ -1211,7 +1256,9 @@ bool IncomingPacket::_doNETWORK_CONFIG(const RuntimeEnvironment *RR,void *tPtr,c
|
|||
outp.armor(peer->key(),true,peer->aesKeysIfSupported());
|
||||
peer->recordOutgoingPacket(_path,outp.packetId(),outp.payloadLength(),outp.verb(),ZT_QOS_NO_FLOW,now);
|
||||
Metrics::pkt_ok_out++;
|
||||
CT("UNPROCESSED");
|
||||
char buf[64];
|
||||
outp.destination().toString(buf);
|
||||
CT("UNPROCESSED, packetId: %lx, address: %s", outp.packetId(), buf);
|
||||
_path->send(RR,tPtr,outp.data(),outp.size(),RR->node->now());
|
||||
}
|
||||
}
|
||||
|
@ -1255,7 +1302,9 @@ bool IncomingPacket::_doMULTICAST_GATHER(const RuntimeEnvironment *RR,void *tPtr
|
|||
outp.armor(peer->key(),true,peer->aesKeysIfSupported());
|
||||
peer->recordOutgoingPacket(_path,outp.packetId(),outp.payloadLength(),outp.verb(),ZT_QOS_NO_FLOW,now);
|
||||
Metrics::pkt_ok_out++;
|
||||
CT("UNPROCESSED");
|
||||
char buf[64];
|
||||
outp.destination().toString(buf);
|
||||
CT("UNPROCESSED, packetId: %lx, address: %s", outp.packetId(), buf);
|
||||
_path->send(RR,tPtr,outp.data(),outp.size(),now);
|
||||
}
|
||||
}
|
||||
|
@ -1329,7 +1378,9 @@ bool IncomingPacket::_doMULTICAST_FRAME(const RuntimeEnvironment *RR,void *tPtr,
|
|||
const uint8_t *const frameData = (const uint8_t *)field(offset + ZT_PROTO_VERB_MULTICAST_FRAME_IDX_FRAME,frameLen);
|
||||
|
||||
if ((flags & 0x08)&&(network->config().isMulticastReplicator(RR->identity.address()))) {
|
||||
CT("UNPROCESSED");
|
||||
char buf[64];
|
||||
peer->address().toString(buf);
|
||||
CT("UNPROCESSED MULTICAST, address: %s", buf);
|
||||
RR->mc->send(tPtr,RR->node->now(),network,peer->address(),to,from,etherType,frameData,frameLen);
|
||||
}
|
||||
|
||||
|
@ -1361,7 +1412,9 @@ bool IncomingPacket::_doMULTICAST_FRAME(const RuntimeEnvironment *RR,void *tPtr,
|
|||
outp.armor(peer->key(),true,peer->aesKeysIfSupported());
|
||||
peer->recordOutgoingPacket(_path,outp.packetId(),outp.payloadLength(),outp.verb(),ZT_QOS_NO_FLOW,now);
|
||||
Metrics::pkt_ok_out++;
|
||||
CT("UNPROCESSED");
|
||||
char buf[64];
|
||||
outp.destination().toString(buf);
|
||||
CT("UNPROCESSED, packetId: %lx, address: %s", outp.packetId(), buf);
|
||||
_path->send(RR,tPtr,outp.data(),outp.size(),RR->node->now());
|
||||
}
|
||||
}
|
||||
|
@ -1504,7 +1557,9 @@ void IncomingPacket::_sendErrorNeedCredentials(const RuntimeEnvironment *RR,void
|
|||
outp.armor(peer->key(),true,peer->aesKeysIfSupported());
|
||||
Metrics::pkt_error_out++;
|
||||
Metrics::pkt_error_need_membership_cert_out++;
|
||||
CT("UNPROCESSED");
|
||||
char buf[64];
|
||||
outp.destination().toString(buf);
|
||||
CT("UNPROCESSED, packetId: %lx, address: %s", outp.packetId(), buf);
|
||||
_path->send(RR,tPtr,outp.data(),outp.size(),RR->node->now());
|
||||
}
|
||||
|
||||
|
|
|
@ -201,7 +201,9 @@ void Multicaster::send(
|
|||
}
|
||||
outp.armor(bestMulticastReplicator->key(),true,bestMulticastReplicator->aesKeysIfSupported());
|
||||
Metrics::pkt_multicast_frame_out++;
|
||||
CT("UNPROCESSED");
|
||||
char buf[64];
|
||||
outp.destination().toString(buf);
|
||||
CT("UNPROCESSED MULTICAST, packetId: %lx, address: %s", outp.packetId(), buf);
|
||||
bestMulticastReplicatorPath->send(RR,tPtr,outp.data(),outp.size(),now);
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -248,7 +248,9 @@ void Peer::received(
|
|||
outp->compress();
|
||||
outp->armor(_key,true,aesKeysIfSupported());
|
||||
Metrics::pkt_push_direct_paths_out++;
|
||||
CT("UNPROCESSED, packetId: %lx", outp->packetId());
|
||||
char buf[64];
|
||||
outp->destination().toString(buf);
|
||||
CT("UNPROCESSED, packetId: %lx, address: %s", outp->packetId(), buf);
|
||||
path->send(RR,tPtr,outp->data(),outp->size(),now);
|
||||
}
|
||||
delete outp;
|
||||
|
@ -395,7 +397,9 @@ void Peer::introduce(void *const tPtr,const int64_t now,const SharedPtr<Peer> &o
|
|||
}
|
||||
outp.armor(_key,true,aesKeysIfSupported());
|
||||
Metrics::pkt_rendezvous_out++;
|
||||
CT("UNPROCESSED");
|
||||
char buf[64];
|
||||
outp.destination().toString(buf);
|
||||
CT("UNPROCESSED, packetId: %lx, address: %s", outp.packetId(), buf);
|
||||
_paths[mine].p->send(RR,tPtr,outp.data(),outp.size(),now);
|
||||
} else {
|
||||
Packet outp(other->_id.address(),RR->identity.address(),Packet::VERB_RENDEZVOUS);
|
||||
|
@ -411,7 +415,9 @@ void Peer::introduce(void *const tPtr,const int64_t now,const SharedPtr<Peer> &o
|
|||
}
|
||||
outp.armor(other->_key,true,other->aesKeysIfSupported());
|
||||
Metrics::pkt_rendezvous_out++;
|
||||
CT("UNPROCESSED");
|
||||
char buf[64];
|
||||
outp.destination().toString(buf);
|
||||
CT("UNPROCESSED, packetId: %lx, address: %s", outp.packetId(), buf);
|
||||
other->_paths[theirs].p->send(RR,tPtr,outp.data(),outp.size(),now);
|
||||
}
|
||||
++alt;
|
||||
|
@ -460,7 +466,9 @@ void Peer::sendHELLO(void *tPtr,const int64_t localSocket,const InetAddress &atA
|
|||
RR->node->putPacket(tPtr,RR->node->lowBandwidthModeEnabled() ? localSocket : -1,atAddress,outp.data(),outp.size());
|
||||
} else {
|
||||
RR->node->expectReplyTo(outp.packetId());
|
||||
CT("UNPROCESSED");
|
||||
char buf[64];
|
||||
outp.destination().toString(buf);
|
||||
CT("UNPROCESSED, packetId: %lx, address: %s", outp.packetId(), buf);
|
||||
RR->sw->send(tPtr,outp,false); // false == don't encrypt full payload, but add MAC
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1288,6 +1288,23 @@ void Switch::_sendViaSpecificPath(void *tPtr,SharedPtr<Peer> peer,SharedPtr<Path
|
|||
|
||||
CT("PACKET CONTENTS:");
|
||||
packet.dump();
|
||||
|
||||
const uint8_t * payload = reinterpret_cast<const uint8_t *>(packet.payload());
|
||||
size_t payloadLength = packet.payloadLength();
|
||||
|
||||
Address addr;
|
||||
switch(packet.verb())
|
||||
{
|
||||
case Packet::VERB_WHOIS:
|
||||
addr.setTo(packet.field(ZT_PACKET_IDX_PAYLOAD, ZT_ADDRESS_LENGTH), ZT_ADDRESS_LENGTH);
|
||||
addr.toString((buf));
|
||||
CT("ASKING WHOIS %s", buf);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (trustedPathId) {
|
||||
packet.setTrusted(trustedPathId);
|
||||
} else {
|
||||
|
@ -1296,6 +1313,7 @@ void Switch::_sendViaSpecificPath(void *tPtr,SharedPtr<Peer> peer,SharedPtr<Path
|
|||
}
|
||||
RR->node->expectReplyTo(packet.packetId());
|
||||
}
|
||||
|
||||
CT("PACKET CONTENTS AFTER ENCRYPTION:");
|
||||
packet.dump();
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue