From eab10b649461c6b6103bcd44615710d7a6a3740d Mon Sep 17 00:00:00 2001 From: Guus Sliepen Date: Mon, 9 Oct 2017 21:47:52 +0200 Subject: [PATCH] Add a devtool function to query the status of a given node. --- src/devtools.c | 42 ++++++++++++++++++++++++++++++++++++++++++ src/devtools.h | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+) diff --git a/src/devtools.c b/src/devtools.c index d4c00f13..a1921d8b 100644 --- a/src/devtools.c +++ b/src/devtools.c @@ -237,3 +237,45 @@ done: return result; } + +void devtool_get_node_status(meshlink_handle_t *mesh, meshlink_node_t *node, devtool_node_status_t *status) { + if(!mesh || !node || !status) { + meshlink_errno = MESHLINK_EINVAL; + return; + } + + node_t *internal = (node_t *)node; + + pthread_mutex_lock(&mesh->mesh_mutex); + + status->options = internal->options; + memcpy(&status->status, &internal->status, sizeof status->status); + status->address = internal->address; + status->mtu = internal->mtu; + status->minmtu = internal->minmtu; + status->maxmtu = internal->maxmtu; + status->mtuprobes = internal->mtuprobes; + status->in_packets = internal->in_packets; + status->in_bytes = internal->in_bytes; + status->out_packets = internal->out_packets; + status->out_bytes = internal->out_bytes; + + // Derive UDP connection status + if(internal == mesh->self) { + status->udp_status = DEVTOOL_UDP_WORKING; + } else if(!internal->status.reachable) { + status->udp_status = DEVTOOL_UDP_IMPOSSIBLE; + } else if(!internal->status.validkey) { + status->udp_status = DEVTOOL_UDP_UNKNOWN; + } else if(internal->status.udp_confirmed) { + status->udp_status = DEVTOOL_UDP_WORKING; + } else if(internal->mtuprobes > 30) { + status->udp_status = DEVTOOL_UDP_FAILED; + } else if(internal->mtuprobes > 0) { + status->udp_status = DEVTOOL_UDP_TRYING; + } else { + status->udp_status = DEVTOOL_UDP_UNKNOWN; + } + + pthread_mutex_unlock(&mesh->mesh_mutex); +} diff --git a/src/devtools.h b/src/devtools.h index 76f9ab53..a9badbc5 100644 --- a/src/devtools.h +++ b/src/devtools.h @@ -82,4 +82,42 @@ extern devtool_edge_t *devtool_get_all_edges(meshlink_handle_t *mesh, devtool_ed */ extern bool devtool_export_json_all_edges_state(meshlink_handle_t *mesh, FILE *stream); +/// The status of a node. +typedef struct devtool_node_status devtool_node_status_t; + +/// The status of a node. +struct devtool_node_status { + uint32_t options; + uint32_t status; + sockaddr_t address; + uint16_t mtu; + uint16_t minmtu; + uint16_t maxmtu; + int mtuprobes; + enum { + DEVTOOL_UDP_FAILED = -2, /// UDP tried but failed + DEVTOOL_UDP_IMPOSSIBLE = -1, /// UDP not possible (node unreachable) + DEVTOOL_UDP_UNKNOWN = 0, /// UDP status not known (never tried to communicate with the node) + DEVTOOL_UDP_TRYING, /// UDP detection in progress + DEVTOOL_UDP_WORKING, /// UDP communication established + } udp_status; + uint64_t in_packets; + uint64_t in_bytes; + uint64_t out_packets; + uint64_t out_bytes; +}; + +/// Get the status of a node. +/** This function returns a struct containing extra information about a node. + * The information is a snapshot taken at call time. + * + * @param mesh A handle which represents an instance of MeshLink. + * @param node A pointer to a meshlink_node_t. + * @param status A pointer to a devtools_node_status_t variable that has + * to be provided by the caller. + * The contents of this variable will be changed to reflect + * the current status of the node. + */ +extern void devtool_get_node_status(meshlink_handle_t *mesh, meshlink_node_t *node, devtool_node_status_t *status); + #endif -- 2.39.5