From: Guus Sliepen Date: Mon, 24 Sep 2001 14:12:00 +0000 (+0000) Subject: Not only keep track of nexthop, but also of lastbutonehop. If destination cl X-Git-Tag: release-1.0pre5~70 X-Git-Url: https://www.tinc-vpn.org/git/browse?p=tinc;a=commitdiff_plain;h=24a2c7e51a0b080c4bdb55f697b3f0458ebc3fb1 Not only keep track of nexthop, but also of lastbutonehop. If destination cl wants indirectdata, send it to the lastbutonehop instead, unless it too has requested so, and so on. --- diff --git a/src/connection.h b/src/connection.h index fb7d2797..5d34cd21 100644 --- a/src/connection.h +++ b/src/connection.h @@ -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: connection.h,v 1.1.2.11 2001/07/20 20:25:10 guus Exp $ + $Id: connection.h,v 1.1.2.12 2001/09/24 14:11:59 guus Exp $ */ #ifndef __TINC_CONNECTION_H__ @@ -97,6 +97,7 @@ typedef struct connection_t { char *hischallenge; /* challenge we sent to him */ struct connection_t *nexthop; /* nearest meta-hop in this direction */ + struct connection_t *lastbutonehop; /* meta-hop closest to him */ avl_tree_t *subnet_tree; /* Pointer to a tree of subnets belonging to this connection */ diff --git a/src/net.c b/src/net.c index d25cec75..7a2a8e7f 100644 --- a/src/net.c +++ b/src/net.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: net.c,v 1.35.4.130 2001/09/24 13:31:15 guus Exp $ + $Id: net.c,v 1.35.4.131 2001/09/24 14:12:00 guus Exp $ */ #include "config.h" @@ -230,6 +230,7 @@ cp */ void send_packet(connection_t *cl, vpn_packet_t *packet) { + connection_t *hop; cp if(debug_lvl >= DEBUG_TRAFFIC) syslog(LOG_ERR, _("Sending packet of %d bytes to %s (%s)"), @@ -254,15 +255,28 @@ cp return; } - /* Check if it has to go via TCP or UDP... */ -cp - if((cl->options | myself->options) & OPTION_TCPONLY) + if(myself->options & OPTION_TCPONLY) { - if(send_tcppacket(cl, packet)) - terminate_connection(cl, 1); + if(send_tcppacket(cl->nexthop, packet)) + terminate_connection(cl->nexthop, 1); } else - send_udppacket(cl, packet); + { + if(myself->options & OPTION_INDIRECT) + send_udppacket(cl->nexthop, packet); + else + { + hop = cl; + + while(hop->options & OPTION_INDIRECT) + if(hop->lastbutonehop == myself) + break; + else + hop = hop->lastbutonehop; + + send_udppacket(hop, packet); + } + } } /* Broadcast a packet to all active direct connections */ diff --git a/src/protocol.c b/src/protocol.c index 1d39a83f..e9ee9665 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.105 2001/09/01 12:02:39 guus Exp $ + $Id: protocol.c,v 1.28.4.106 2001/09/24 14:12:00 guus Exp $ */ #include "config.h" @@ -263,6 +263,7 @@ cp cl->allow_request = ALL; cl->nexthop = cl; + cl->lastbutonehop = myself; cl->cipher_pkttype = EVP_bf_cbc(); cl->cipher_pktkeylength = cl->cipher_pkttype->key_len + cl->cipher_pkttype->iv_len; @@ -775,19 +776,19 @@ cp int send_add_host(connection_t *cl, connection_t *other) { cp - return send_request(cl, "%d %s %lx:%d %lx", ADD_HOST, - other->name, other->address, other->port, other->options); + return send_request(cl, "%d %s %lx:%d %lx %s", ADD_HOST, + other->name, other->address, other->port, other->options, other->lastbutonehop->name); } int add_host_h(connection_t *cl) { connection_t *old, *new, *p; - char name[MAX_STRING_SIZE]; + char name[MAX_STRING_SIZE], lastbutone[MAX_STRING_SIZE]; avl_node_t *node; cp new = new_connection(); - if(sscanf(cl->buffer, "%*d "MAX_STRING" %lx:%hd %lx", name, &new->address, &new->port, &new->options) != 4) + if(sscanf(cl->buffer, "%*d "MAX_STRING" %lx:%hd %lx "MAX_STRING, name, &new->address, &new->port, &new->options, lastbutone) != 5) { syslog(LOG_ERR, _("Got bad ADD_HOST from %s (%s)"), cl->name, cl->hostname); return -1; @@ -802,20 +803,35 @@ cp return -1; } + if(check_id(lastbutone)) + { + syslog(LOG_ERR, _("Got bad ADD_HOST from %s (%s): invalid lastbutone name"), cl->name, cl->hostname); + free_connection(new); + return -1; + } + /* Check if somebody tries to add ourself */ if(!strcmp(name, myself->name)) { - syslog(LOG_ERR, _("Warning: got ADD_HOST from %s (%s) for ourself, restarting"), cl->name, cl->hostname); - sighup = 1; + syslog(LOG_ERR, _("Got ADD_HOST from %s (%s) for ourself!"), cl->name, cl->hostname); free_connection(new); - return 0; + return -1; } /* Fill in more of the new connection structure */ new->hostname = hostlookup(htonl(new->address)); + new->lastbutonehop = lookup_id(lastbutone); + + if(!new->lastbutonehop) + { + syslog(LOG_ERR, _("Got bad ADD_HOST from %s (%s): unknown lastbutone"), cl->name, cl->hostname); + free_connection(new); + return -1; + } + /* Check if the new host already exists in the connnection list */ if((old = lookup_id(name))) @@ -864,20 +880,20 @@ cp int send_del_host(connection_t *cl, connection_t *other) { cp - return send_request(cl, "%d %s %lx:%d %lx", DEL_HOST, - other->name, other->address, other->port, other->options); + return send_request(cl, "%d %s %lx:%d %lx %s", DEL_HOST, + other->name, other->address, other->port, other->options, other->lastbutonehop->name); } int del_host_h(connection_t *cl) { - char name[MAX_STRING_SIZE]; + char name[MAX_STRING_SIZE], lastbutone[MAX_STRING_SIZE]; ipv4_t address; port_t port; long int options; connection_t *old, *p; avl_node_t *node; cp - if(sscanf(cl->buffer, "%*d "MAX_STRING" %lx:%hd %lx", name, &address, &port, &options) != 4) + if(sscanf(cl->buffer, "%*d "MAX_STRING" %lx:%hd %lx "MAX_STRING, name, &address, &port, &options, lastbutone) != 5) { syslog(LOG_ERR, _("Got bad DEL_HOST from %s (%s)"), cl->name, cl->hostname); @@ -892,14 +908,19 @@ cp return -1; } + if(check_id(lastbutone)) + { + syslog(LOG_ERR, _("Got bad DEL_HOST from %s (%s): invalid lastbutone name"), cl->name, cl->hostname); + return -1; + } + /* Check if somebody tries to delete ourself */ if(!strcmp(name, myself->name)) { - syslog(LOG_ERR, _("Warning: got DEL_HOST from %s (%s) for ourself, restarting"), + syslog(LOG_ERR, _("Got DEL_HOST from %s (%s) for ourself!"), cl->name, cl->hostname); - sighup = 1; - return 0; + return -1; } /* Check if the deleted host already exists in the connnection list */ @@ -913,7 +934,7 @@ cp /* Check if the rest matches */ - if(address!=old->address || port!=old->port || options!=old->options || cl!=old->nexthop) + if(address!=old->address || port!=old->port || options!=old->options || cl!=old->nexthop || strcmp(lastbutone, old->lastbutonehop->name)) { syslog(LOG_WARNING, _("Got DEL_HOST from %s (%s) for %s which doesn't match"), cl->name, cl->hostname, old->name); return 0; diff --git a/src/protocol.h b/src/protocol.h index c202f5c2..0d163868 100644 --- a/src/protocol.h +++ b/src/protocol.h @@ -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.h,v 1.5.4.21 2001/05/24 21:30:36 guus Exp $ + $Id: protocol.h,v 1.5.4.22 2001/09/24 14:12:00 guus Exp $ */ #ifndef __TINC_PROTOCOL_H__ @@ -30,7 +30,7 @@ incompatible version have different protocols. */ -#define PROT_CURRENT 10 +#define PROT_CURRENT 11 /* Request numbers */