instrumentation improvement
Some checks failed
/ build_macos (push) Has been cancelled
/ build_windows (push) Has been cancelled
/ build_ubuntu (push) Has been cancelled

This commit is contained in:
eerieaerial 2025-05-01 20:39:24 +04:00
parent 083b833bf8
commit 5fb3f5c228
4 changed files with 100 additions and 17 deletions

View file

@ -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());
}

View file

@ -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;
}

View file

@ -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
}
}

View file

@ -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();