]> git.meshlink.io Git - meshlink/commitdiff
Add meshlink_get_node_tiny(). feature/tiny-support
authorGuus Sliepen <guus@meshlink.io>
Mon, 2 Aug 2021 23:09:45 +0000 (01:09 +0200)
committerGuus Sliepen <guus@meshlink.io>
Mon, 2 Aug 2021 23:09:45 +0000 (01:09 +0200)
This allows querying if a node is connected using the tiny MeshLink
version.

src/meshlink++.h
src/meshlink.c
src/meshlink.h
src/meshlink.sym
src/node.h
src/protocol_auth.c

index 25fd34f3f2c1530c14ad99db328e646d8c81a2ed..fd66399217596e29ef54f85e1bd83d3c425edfaa 100644 (file)
@@ -449,6 +449,18 @@ public:
                return meshlink_get_node_blacklisted(handle, node);
        }
 
+       /// Get the node's tiny status.
+       /** This function returns true if the given node is a tiny node.
+        *  Note that the tiny status of a node will only be known if the node has been reachable at least once.
+        *
+        *  @param node          A pointer to a meshlink::node describing the node.
+        *
+        *  @return              This function returns true if the node is a tiny node.
+        */
+       bool get_node_tiny(node *node) {
+               return meshlink_get_node_tiny(handle, node);
+       }
+
        /// Get a handle for a specific submesh.
        /** This function returns a handle for the submesh with the given name.
         *
index f153f7573419d55d5adbc19114c371aa8da7ad87..71263b910696a4e9531672afec7c8252c4223b82 100644 (file)
@@ -2562,6 +2562,25 @@ dev_class_t meshlink_get_node_dev_class(meshlink_handle_t *mesh, meshlink_node_t
        return devclass;
 }
 
+bool meshlink_get_node_tiny(meshlink_handle_t *mesh, meshlink_node_t *node) {
+       if(!mesh || !node) {
+               meshlink_errno = MESHLINK_EINVAL;
+               return -1;
+       }
+
+       bool tiny;
+
+       if(pthread_mutex_lock(&mesh->mutex) != 0) {
+               abort();
+       }
+
+       tiny = ((node_t *)node)->status.tiny;
+
+       pthread_mutex_unlock(&mesh->mutex);
+
+       return tiny;
+}
+
 bool meshlink_get_node_blacklisted(meshlink_handle_t *mesh, meshlink_node_t *node) {
        if(!mesh) {
                meshlink_errno = MESHLINK_EINVAL;
index a6c5b4b9401a2233808b34914f8d692aa59bb71c..9a887168acd7a56c5c624f88f11e6243201d4d6c 100644 (file)
@@ -835,6 +835,18 @@ struct meshlink_node **meshlink_get_all_nodes_by_blacklisted(struct meshlink_han
  */
 dev_class_t meshlink_get_node_dev_class(struct meshlink_handle *mesh, struct meshlink_node *node) __attribute__((__warn_unused_result__));
 
+/// Get the node's tiny status.
+/** This function returns true if the given node is a tiny node.
+ *  Note that the tiny status of a node will only be known if the node has been reachable at least once.
+ *
+ *  \memberof meshlink_node
+ *  @param mesh          A handle which represents an instance of MeshLink.
+ *  @param node          A pointer to a struct meshlink_node describing the node.
+ *
+ *  @return              This function returns true if the node is a tiny node.
+ */
+bool meshlink_get_node_tiny(struct meshlink_handle *mesh, struct meshlink_node *node) __attribute__((__warn_unused_result__));
+
 /// Get the node's blacklist status.
 /** This function returns the given node is blacklisted.
  *
index 7c4de629c7f21b9531da14e6c90a348a64a4b9bf..f598bcb61b70364de1a493777b1eb3e463b3b8c1 100644 (file)
@@ -51,6 +51,7 @@ meshlink_get_node_blacklisted
 meshlink_get_node_dev_class
 meshlink_get_node_reachability
 meshlink_get_node_submesh
+meshlink_get_node_tiny
 meshlink_get_pmtu
 meshlink_get_port
 meshlink_get_self
index 63f3c2c8bad55132aa694981c702d760777d2b1e..f88cde6893141bbabd7cea1061fe9a039a9b1ab2 100644 (file)
@@ -38,6 +38,7 @@ typedef struct node_status_t {
        uint16_t duplicate: 1;              /* 1 if the node is duplicate, ie. multiple nodes using the same Name are online */
        uint16_t dirty: 1;                  /* 1 if the configuration of the node is dirty and needs to be written out */
        uint16_t want_udp: 1;               /* 1 if we want working UDP because we have data to send */
+       uint16_t tiny: 1;                   /* 1 if this is a tiny node */
 } node_status_t;
 
 #define MAX_RECENT 5
index 80332428fc517ff194c178f1994b6bba9f7245ce..0a107e4c2820f19caa88dea3c6e5f41cab3f99c9 100644 (file)
@@ -380,6 +380,7 @@ bool ack_h(meshlink_handle_t *mesh, connection_t *c, const char *request) {
 
        n->devclass = devclass;
        n->status.dirty = true;
+       n->status.tiny = c->flags & PROTOCOL_TINY;
 
        n->last_successfull_connection = mesh->loop.now.tv_sec;