]> git.meshlink.io Git - meshlink/blobdiff - src/protocol_edge.c
Merge branch 'master' into 1.1
[meshlink] / src / protocol_edge.c
index f515eeeddbb5307a9756986b976ea5c8313578f3..92d31dbdd889cf35624ac7c28d9ad5f25da4eea0 100644 (file)
@@ -44,7 +44,7 @@ bool send_add_edge(connection_t *c, const edge_t *e) {
 
        sockaddr2str(&e->address, &address, &port);
 
-       x = send_request(c, "%d %lx %s %s %s %s %lx %d", ADD_EDGE, random(),
+       x = send_request(c, "%d %x %s %s %s %s %lx %d", ADD_EDGE, rand(),
                                         e->from->name, e->to->name, address, port,
                                         e->options, e->weight);
        free(address);
@@ -93,6 +93,17 @@ bool add_edge_h(connection_t *c, char *request) {
        /* Lookup nodes */
 
        from = lookup_node(from_name);
+       to = lookup_node(to_name);
+
+       if(tunnelserver &&
+          from != myself && from != c->node &&
+          to != myself && to != c->node) {
+               /* ignore indirect edge registrations for tunnelserver */
+               ifdebug(PROTOCOL) logger(LOG_WARNING,
+                  _("Ignoring indirect %s from %s (%s)"),
+                  "ADD_EDGE", c->name, c->hostname);
+               return true;
+       }
 
        if(!from) {
                from = new_node();
@@ -100,16 +111,12 @@ bool add_edge_h(connection_t *c, char *request) {
                node_add(from);
        }
 
-       to = lookup_node(to_name);
-
        if(!to) {
                to = new_node();
                to->name = xstrdup(to_name);
                node_add(to);
        }
 
-       if(tunnelserver && from != myself && from != c->node && to != myself && to != c->node)
-               return false;
 
        /* Convert addresses */
 
@@ -168,7 +175,7 @@ bool add_edge_h(connection_t *c, char *request) {
 bool send_del_edge(connection_t *c, const edge_t *e) {
        cp();
 
-       return send_request(c, "%d %lx %s %s", DEL_EDGE, random(),
+       return send_request(c, "%d %x %s %s", DEL_EDGE, rand(),
                                                e->from->name, e->to->name);
 }
 
@@ -206,6 +213,17 @@ bool del_edge_h(connection_t *c, char *request) {
        /* Lookup nodes */
 
        from = lookup_node(from_name);
+       to = lookup_node(to_name);
+
+       if(tunnelserver &&
+          from != myself && from != c->node &&
+          to != myself && to != c->node) {
+               /* ignore indirect edge registrations for tunnelserver */
+               ifdebug(PROTOCOL) logger(LOG_WARNING,
+                  _("Ignoring indirect %s from %s (%s)"),
+                  "DEL_EDGE", c->name, c->hostname);
+               return true;
+       }
 
        if(!from) {
                ifdebug(PROTOCOL) logger(LOG_ERR, _("Got %s from %s (%s) which does not appear in the edge tree"),
@@ -213,17 +231,12 @@ bool del_edge_h(connection_t *c, char *request) {
                return true;
        }
 
-       to = lookup_node(to_name);
-
        if(!to) {
                ifdebug(PROTOCOL) logger(LOG_ERR, _("Got %s from %s (%s) which does not appear in the edge tree"),
                                   "DEL_EDGE", c->name, c->hostname);
                return true;
        }
 
-       if(tunnelserver && from != myself && from != c->node && to != myself && to != c->node)
-               return false;
-
        /* Check if edge exists */
 
        e = lookup_edge(from, to);