From 21027b1d5702c331b1ebb262bb149c75be1f24b1 Mon Sep 17 00:00:00 2001 From: Guus Sliepen Date: Mon, 8 Oct 2001 11:47:55 +0000 Subject: [PATCH] - Renamed lastbutonehop to prevhop. - Added connection_t *via to connection_t, this keeps record of where to send UDP packets to. --- src/connection.c | 6 +++--- src/connection.h | 7 ++++--- src/net.c | 37 ++++++++++++++++--------------------- src/protocol.c | 42 ++++++++++++++++++++++++++---------------- 4 files changed, 49 insertions(+), 43 deletions(-) diff --git a/src/connection.c b/src/connection.c index 946ea5c3..186a60b1 100644 --- a/src/connection.c +++ b/src/connection.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: connection.c,v 1.1.2.16 2001/09/24 14:16:29 guus Exp $ + $Id: connection.c,v 1.1.2.17 2001/10/08 11:47:55 guus Exp $ */ #include "config.h" @@ -248,9 +248,9 @@ cp for(node = id_tree->head; node; node = node->next) { cl = (connection_t *)node->data; - syslog(LOG_DEBUG, _(" %s at %s port %hd options %ld sockets %d, %d status %04x nexthop %s lastbutonehop %s"), + syslog(LOG_DEBUG, _(" %s at %s port %hd options %ld sockets %d, %d status %04x nexthop %s prevhop %s via %s"), cl->name, cl->hostname, cl->port, cl->options, - cl->socket, cl->meta_socket, cl->status, cl->nexthop->name, cl->lastbutonehop->name); + cl->socket, cl->meta_socket, cl->status, cl->nexthop->name, cl->prevhop->name, cl->via->name); } syslog(LOG_DEBUG, _("End of connection list.")); diff --git a/src/connection.h b/src/connection.h index 5d34cd21..a75769bb 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.12 2001/09/24 14:11:59 guus Exp $ + $Id: connection.h,v 1.1.2.13 2001/10/08 11:47:55 guus Exp $ */ #ifndef __TINC_CONNECTION_H__ @@ -96,8 +96,9 @@ typedef struct connection_t { char *mychallenge; /* challenge we received from him */ 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 */ + struct connection_t *nexthop; /* nearest meta-hop from us to him */ + struct connection_t *prevhop; /* nearest meta-hop from him to us */ + struct connection_t *via; /* next hop for UDP packets */ 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 e086d786..fbefa8ca 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.133 2001/09/25 13:39:11 guus Exp $ + $Id: net.c,v 1.35.4.134 2001/10/08 11:47:55 guus Exp $ */ #include "config.h" @@ -230,7 +230,7 @@ cp */ void send_packet(connection_t *cl, vpn_packet_t *packet) { - connection_t *hop; + connection_t *via; cp if(debug_lvl >= DEBUG_TRAFFIC) syslog(LOG_ERR, _("Sending packet of %d bytes to %s (%s)"), @@ -255,28 +255,22 @@ cp return; } - if(myself->options & OPTION_TCPONLY) - { - if(send_tcppacket(cl->nexthop, packet)) - terminate_connection(cl->nexthop, 1); - } + if(cl->via == myself) + via = cl->nexthop; else - { - if(myself->options & OPTION_INDIRECT) - send_udppacket(cl->nexthop, packet); - else - { - hop = cl; + via = cl->via; - while(hop->options & OPTION_INDIRECT) - if(hop->lastbutonehop == myself) - break; - else - hop = hop->lastbutonehop; + if(via != cl && debug_lvl >= DEBUG_TRAFFIC) + syslog(LOG_ERR, _("Sending packet to %s via %s (%s)"), + cl->name, via->name, via->hostname); - send_udppacket(hop, packet); - } + if((myself->options | via->options) & OPTION_TCPONLY) + { + if(send_tcppacket(via, packet)) + terminate_connection(via, 1); } + else + send_udppacket(via, packet); } /* Broadcast a packet to all active direct connections */ @@ -977,7 +971,8 @@ cp /* Done */ myself->nexthop = myself; - myself->lastbutonehop = myself; + myself->prevhop = myself; + myself->via = myself; myself->status.active = 1; id_add(myself); diff --git a/src/protocol.c b/src/protocol.c index e9ee9665..5409fbdb 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.106 2001/09/24 14:12:00 guus Exp $ + $Id: protocol.c,v 1.28.4.107 2001/10/08 11:47:55 guus Exp $ */ #include "config.h" @@ -263,7 +263,7 @@ cp cl->allow_request = ALL; cl->nexthop = cl; - cl->lastbutonehop = myself; + cl->prevhop = myself; cl->cipher_pkttype = EVP_bf_cbc(); cl->cipher_pktkeylength = cl->cipher_pkttype->key_len + cl->cipher_pkttype->iv_len; @@ -289,6 +289,11 @@ cp cl->options |= OPTION_TCPONLY; } + if((myself->options | cl->options) & OPTION_INDIRECT) + cl->via = myself; + else + cl->via = cl; + /* Send him our subnets */ for(node = myself->subnet_tree->head; node; node = node->next) @@ -777,18 +782,18 @@ int send_add_host(connection_t *cl, connection_t *other) { cp return send_request(cl, "%d %s %lx:%d %lx %s", ADD_HOST, - other->name, other->address, other->port, other->options, other->lastbutonehop->name); + other->name, other->address, other->port, other->options, other->prevhop->name); } int add_host_h(connection_t *cl) { connection_t *old, *new, *p; - char name[MAX_STRING_SIZE], lastbutone[MAX_STRING_SIZE]; + char name[MAX_STRING_SIZE], prevhop[MAX_STRING_SIZE]; avl_node_t *node; cp new = new_connection(); - if(sscanf(cl->buffer, "%*d "MAX_STRING" %lx:%hd %lx "MAX_STRING, name, &new->address, &new->port, &new->options, lastbutone) != 5) + if(sscanf(cl->buffer, "%*d "MAX_STRING" %lx:%hd %lx "MAX_STRING, name, &new->address, &new->port, &new->options, prevhop) != 5) { syslog(LOG_ERR, _("Got bad ADD_HOST from %s (%s)"), cl->name, cl->hostname); return -1; @@ -803,9 +808,9 @@ cp return -1; } - if(check_id(lastbutone)) + if(check_id(prevhop)) { - syslog(LOG_ERR, _("Got bad ADD_HOST from %s (%s): invalid lastbutone name"), cl->name, cl->hostname); + syslog(LOG_ERR, _("Got bad ADD_HOST from %s (%s): invalid prevhop name"), cl->name, cl->hostname); free_connection(new); return -1; } @@ -823,11 +828,11 @@ cp new->hostname = hostlookup(htonl(new->address)); - new->lastbutonehop = lookup_id(lastbutone); + new->prevhop = lookup_id(prevhop); - if(!new->lastbutonehop) + if(!new->prevhop) { - syslog(LOG_ERR, _("Got bad ADD_HOST from %s (%s): unknown lastbutone"), cl->name, cl->hostname); + syslog(LOG_ERR, _("Got bad ADD_HOST from %s (%s): unknown prevhop"), cl->name, cl->hostname); free_connection(new); return -1; } @@ -873,6 +878,11 @@ cp new->nexthop = cl; new->cipher_pkttype = EVP_bf_cbc(); new->cipher_pktkeylength = cl->cipher_pkttype->key_len + cl->cipher_pkttype->iv_len; + + if(new->options & OPTION_INDIRECT || new->prevhop->via != new->prevhop) + new->via = new->prevhop->via; + else + new->via = new; cp return 0; } @@ -881,19 +891,19 @@ int send_del_host(connection_t *cl, connection_t *other) { cp return send_request(cl, "%d %s %lx:%d %lx %s", DEL_HOST, - other->name, other->address, other->port, other->options, other->lastbutonehop->name); + other->name, other->address, other->port, other->options, other->prevhop->name); } int del_host_h(connection_t *cl) { - char name[MAX_STRING_SIZE], lastbutone[MAX_STRING_SIZE]; + char name[MAX_STRING_SIZE], prevhop[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 "MAX_STRING, name, &address, &port, &options, lastbutone) != 5) + if(sscanf(cl->buffer, "%*d "MAX_STRING" %lx:%hd %lx "MAX_STRING, name, &address, &port, &options, prevhop) != 5) { syslog(LOG_ERR, _("Got bad DEL_HOST from %s (%s)"), cl->name, cl->hostname); @@ -908,9 +918,9 @@ cp return -1; } - if(check_id(lastbutone)) + if(check_id(prevhop)) { - syslog(LOG_ERR, _("Got bad DEL_HOST from %s (%s): invalid lastbutone name"), cl->name, cl->hostname); + syslog(LOG_ERR, _("Got bad DEL_HOST from %s (%s): invalid prevhop name"), cl->name, cl->hostname); return -1; } @@ -934,7 +944,7 @@ cp /* Check if the rest matches */ - if(address!=old->address || port!=old->port || options!=old->options || cl!=old->nexthop || strcmp(lastbutone, old->lastbutonehop->name)) + if(address!=old->address || port!=old->port || options!=old->options || cl!=old->nexthop || strcmp(prevhop, old->prevhop->name)) { syslog(LOG_WARNING, _("Got DEL_HOST from %s (%s) for %s which doesn't match"), cl->name, cl->hostname, old->name); return 0; -- 2.39.5