]> git.meshlink.io Git - meshlink/commitdiff
Handle connections from nodes using MeshLink-tiny.
authorGuus Sliepen <guus@meshlink.io>
Tue, 22 Jun 2021 19:41:52 +0000 (21:41 +0200)
committerGuus Sliepen <guus@meshlink.io>
Tue, 22 Jun 2021 19:41:52 +0000 (21:41 +0200)
Add a new flags field to the ID request. Currently this is only set by tiny
nodes. If we see the peer set it, don't send our edges to the peer, and
don't forward any information from other nodes.

src/connection.h
src/meta.c
src/protocol.h
src/protocol_auth.c

index b5ccaed9ec46b299bcf4a89445c1ab221a7e6638..68d9e97143bb5efd2e6dc77fe1ac29e7539962f7 100644 (file)
@@ -78,6 +78,7 @@ typedef struct connection_t {
        ecdsa_t *ecdsa;                 /* his public ECDSA key */
        int protocol_major;             /* used protocol */
        int protocol_minor;             /* used protocol */
+       uint32_t flags;                 /* used protocol flags */
 } connection_t;
 
 void init_connections(struct meshlink_handle *mesh);
index 94aab98136261d46bde95755fe385c0be8fe6b2d..13024677d0bb50f147a738b834682ea2f90f4c89 100644 (file)
@@ -65,7 +65,7 @@ void broadcast_meta(meshlink_handle_t *mesh, connection_t *from, const char *buf
        assert(length);
 
        for list_each(connection_t, c, mesh->connections)
-               if(c != from && c->status.active) {
+               if(c != from && c->status.active && !(c->flags & PROTOCOL_TINY)) {
                        send_meta(mesh, c, buffer, length);
                }
 }
@@ -75,7 +75,7 @@ void broadcast_submesh_meta(meshlink_handle_t *mesh, connection_t *from, const s
        assert(length);
 
        for list_each(connection_t, c, mesh->connections)
-               if(c != from && c->status.active) {
+               if(c != from && c->status.active && !(c->flags & PROTOCOL_TINY)) {
                        if(c->node && submesh_allows_node(s, c->node)) {
                                send_meta(mesh, c, buffer, length);
                        }
index fb1e10960cc25539971a4250f8c9f358a1e87556..05c2203bf70bc791bbb8657e3090191a8aa55e81 100644 (file)
@@ -62,6 +62,10 @@ typedef struct past_request_t {
        time_t firstseen;
 } past_request_t;
 
+/* Protocol support flags */
+
+static const uint32_t PROTOCOL_TINY = 1; // Peer is using meshlink-tiny
+
 /* Maximum size of strings in a request.
  * scanf terminates %2048s with a NUL character,
  * but the NUL character can be written after the 2048th non-NUL character.
index a0d350d5b9ff83700439b02802ad5882c739b668..80332428fc517ff194c178f1994b6bba9f7245ce 100644 (file)
@@ -44,7 +44,7 @@
 extern bool node_write_devclass(meshlink_handle_t *mesh, node_t *n);
 
 bool send_id(meshlink_handle_t *mesh, connection_t *c) {
-       return send_request(mesh, c, NULL, "%d %s %d.%d %s", ID, mesh->self->name, PROT_MAJOR, PROT_MINOR, mesh->appname);
+       return send_request(mesh, c, NULL, "%d %s %d.%d %s %u", ID, mesh->self->name, PROT_MAJOR, PROT_MINOR, mesh->appname, 0);
 }
 
 static bool commit_invitation(meshlink_handle_t *mesh, connection_t *c, const void *data) {
@@ -188,7 +188,7 @@ bool id_h(meshlink_handle_t *mesh, connection_t *c, const char *request) {
 
        char name[MAX_STRING_SIZE];
 
-       if(sscanf(request, "%*d " MAX_STRING " %d.%d", name, &c->protocol_major, &c->protocol_minor) < 2) {
+       if(sscanf(request, "%*d " MAX_STRING " %d.%d %*s %u", name, &c->protocol_major, &c->protocol_minor, &c->flags) < 2) {
                logger(mesh, MESHLINK_ERROR, "Got bad %s from %s", "ID", c->name);
                return false;
        }
@@ -420,7 +420,9 @@ bool ack_h(meshlink_handle_t *mesh, connection_t *c, const char *request) {
 
        /* Send him everything we know */
 
-       send_everything(mesh, c);
+       if(!(c->flags & PROTOCOL_TINY)) {
+               send_everything(mesh, c);
+       }
 
        /* Create an edge_t for this connection */