X-Git-Url: https://tinc-vpn.org/git/browse?p=tinc;a=blobdiff_plain;f=src%2Fprotocol.c;h=6cb8037940f7296a1be2c99a5dacda3929f19864;hp=2744592ef20a77f96ebfbc340b0adaf2af851b2c;hb=54b756f7dfb71c5622b7738fd449e126da959864;hpb=87ad5c97a9a73a65050ad7adce34503f856d8665 diff --git a/src/protocol.c b/src/protocol.c index 2744592e..6cb80379 100644 --- a/src/protocol.c +++ b/src/protocol.c @@ -17,7 +17,7 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - $Id: protocol.c,v 1.28.4.113 2001/10/30 12:59:12 guus Exp $ + $Id: protocol.c,v 1.28.4.116 2001/10/31 20:02:06 guus Exp $ */ #include "config.h" @@ -232,11 +232,11 @@ cp syslog(LOG_ERR, _("Peer %s had unknown identity (%s)"), c->hostname, c->name); return -1; } + } - if(read_rsa_public_key(c)) - { - return -1; - } + if(read_rsa_public_key(c)) + { + return -1; } c->allow_request = METAKEY; @@ -606,7 +606,7 @@ cp */ - /* Create a edge_t for this connection */ + /* Create an edge_t for this connection */ c->edge = new_edge(); @@ -682,7 +682,7 @@ cp /* Run MST and SSSP algorithms */ mst_kruskal(); - sssp_bfs(); + sssp_bfs(0); cp return 0; } @@ -874,6 +874,11 @@ cp if(n) { /* Check if it matches */ + + if(n->address != address || n->port != port) + syslog(LOG_DEBUG, _("Got %s from %s (%s) for %s which does not match existing entry"), "ADD_NODE", c->name, c->hostname, n->name); + + return 0; } else { @@ -951,8 +956,7 @@ cp if(address != n->address || port != n->port) { - syslog(LOG_WARNING, _("Got %s from %s (%s) for %s which doesn't match"), "DEL_NODE", c->name, c->hostname, n->name); - return 0; + syslog(LOG_WARNING, _("Got %s from %s (%s) for %s which does not match existing entry"), "DEL_NODE", c->name, c->hostname, n->name); } /* Tell the rest about the deleted node */ @@ -967,6 +971,9 @@ cp /* Delete the node */ node_del(n); + + mst_kruskal(); + sssp_bfs(0); cp return 0; } @@ -1029,13 +1036,19 @@ cp return -1; } - /* Check if node already exists */ + /* Check if edge already exists */ e = lookup_edge(from, to); if(e) { - /* Check if it matches */ + if(e->weight != weight || e->options != options) + { + syslog(LOG_ERR, _("Got %s from %s (%s) which does not match existing entry"), "ADD_EDGE", c->name, c->hostname); + return -1; + } + + return 0; } else { @@ -1059,7 +1072,7 @@ cp /* Run MST before or after we tell the rest? */ mst_kruskal(); - sssp_bfs(); + sssp_bfs(0); cp return 0; } @@ -1067,8 +1080,8 @@ cp int send_del_edge(connection_t *c, edge_t *e) { cp - return send_request(c, "%d %s %s %lx", DEL_EDGE, - e->from->name, e->to->name, e->options); + return send_request(c, "%d %s %s %lx %d", DEL_EDGE, + e->from->name, e->to->name, e->options, e->weight); } int del_edge_h(connection_t *c) @@ -1078,10 +1091,11 @@ int del_edge_h(connection_t *c) char to_name[MAX_STRING_SIZE]; node_t *from, *to; long int options; + int weight; connection_t *other; avl_node_t *node; cp - if(sscanf(c->buffer, "%*d "MAX_STRING" "MAX_STRING" %lx", from_name, to_name, &options) != 3) + if(sscanf(c->buffer, "%*d "MAX_STRING" "MAX_STRING" %lx %d", from_name, to_name, &options, &weight) != 4) { syslog(LOG_ERR, _("Got bad %s from %s (%s)"), "DEL_EDGE", c->name, c->hostname); @@ -1126,7 +1140,11 @@ cp if(e) { - /* Check if it matches */ + if(e->weight != weight || e->options != options) + { + syslog(LOG_ERR, _("Got %s from %s (%s) which does not match existing entry"), "ADD_EDGE", c->name, c->hostname); + return -1; + } } else { @@ -1150,7 +1168,7 @@ cp /* Run MST before or after we tell the rest? */ mst_kruskal(); - sssp_bfs(); + sssp_bfs(1); cp return 0; }