From 4ca1552fd397042892236de097b145e8bd63ae2b Mon Sep 17 00:00:00 2001 From: staphen Date: Fri, 28 Jul 2023 11:57:48 -0400 Subject: [PATCH] Add node function to get peer data --- node/Node.cpp | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++ node/Node.hpp | 1 + 2 files changed, 56 insertions(+) diff --git a/node/Node.cpp b/node/Node.cpp index 5b0fa8cc..64325d2c 100644 --- a/node/Node.cpp +++ b/node/Node.cpp @@ -518,6 +518,61 @@ ZT_PeerList *Node::peers() const return pl; } +ZT_Peer *Node::peer(void *tptr,uint64_t nwid,uint64_t mac) const +{ + MAC macAddress(mac); + Address toZT(macAddress.toAddress(nwid)); + SharedPtr toPeer(RR->topology->getPeer(tptr, toZT)); + if (!toPeer) + return (ZT_Peer *)0; + + char *buf = (char *)::malloc(sizeof(ZT_Peer)); + if (!buf) + return (ZT_Peer *)0; + + ZT_Peer *p = (ZT_Peer *)buf; + p->address = toPeer->address().toInt(); + p->isBonded = 0; + if (toPeer->remoteVersionKnown()) { + p->versionMajor = toPeer->remoteVersionMajor(); + p->versionMinor = toPeer->remoteVersionMinor(); + p->versionRev = toPeer->remoteVersionRevision(); + } + else { + p->versionMajor = -1; + p->versionMinor = -1; + p->versionRev = -1; + } + p->latency = toPeer->latency(_now); + if (p->latency >= 0xffff) + p->latency = -1; + p->role = RR->topology->role(toPeer->identity().address()); + + std::vector< SharedPtr > paths(toPeer->paths(_now)); + SharedPtr bestp(toPeer->getAppropriatePath(_now, false)); + p->pathCount = 0; + for (std::vector< SharedPtr >::iterator path(paths.begin()); path != paths.end(); ++path) { + memcpy(&(p->paths[p->pathCount].address), &((*path)->address()), sizeof(struct sockaddr_storage)); + p->paths[p->pathCount].localSocket = (*path)->localSocket(); + p->paths[p->pathCount].lastSend = (*path)->lastOut(); + p->paths[p->pathCount].lastReceive = (*path)->lastIn(); + p->paths[p->pathCount].trustedPathId = RR->topology->getOutboundPathTrust((*path)->address()); + p->paths[p->pathCount].expired = 0; + p->paths[p->pathCount].preferred = ((*path) == bestp) ? 1 : 0; + p->paths[p->pathCount].scope = (*path)->ipScope(); + ++p->pathCount; + } + if (toPeer->bond()) { + p->isBonded = toPeer->bond(); + p->bondingPolicy = toPeer->bond()->policy(); + p->isHealthy = toPeer->bond()->isHealthy(); + p->numAliveLinks = toPeer->bond()->getNumAliveLinks(); + p->numTotalLinks = toPeer->bond()->getNumTotalLinks(); + } + + return p; +} + ZT_VirtualNetworkConfig *Node::networkConfig(uint64_t nwid) const { Mutex::Lock _l(_networks_m); diff --git a/node/Node.hpp b/node/Node.hpp index 52506ed9..eca71d31 100644 --- a/node/Node.hpp +++ b/node/Node.hpp @@ -92,6 +92,7 @@ public: uint64_t address() const; void status(ZT_NodeStatus *status) const; ZT_PeerList *peers() const; + ZT_Peer *peer(void *tptr,uint64_t nwid,uint64_t mac) const; ZT_VirtualNetworkConfig *networkConfig(uint64_t nwid) const; ZT_VirtualNetworkList *networks() const; void freeQueryResult(void *qr);