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.
This commit is contained in:
parent
154733927a
commit
24a2c7e51a
4 changed files with 62 additions and 26 deletions
|
@ -17,7 +17,7 @@
|
||||||
along with this program; if not, write to the Free Software
|
along with this program; if not, write to the Free Software
|
||||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
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__
|
#ifndef __TINC_CONNECTION_H__
|
||||||
|
@ -97,6 +97,7 @@ typedef struct connection_t {
|
||||||
char *hischallenge; /* challenge we sent to him */
|
char *hischallenge; /* challenge we sent to him */
|
||||||
|
|
||||||
struct connection_t *nexthop; /* nearest meta-hop in this direction */
|
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 */
|
avl_tree_t *subnet_tree; /* Pointer to a tree of subnets belonging to this connection */
|
||||||
|
|
||||||
|
|
28
src/net.c
28
src/net.c
|
@ -17,7 +17,7 @@
|
||||||
along with this program; if not, write to the Free Software
|
along with this program; if not, write to the Free Software
|
||||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
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"
|
#include "config.h"
|
||||||
|
@ -230,6 +230,7 @@ cp
|
||||||
*/
|
*/
|
||||||
void send_packet(connection_t *cl, vpn_packet_t *packet)
|
void send_packet(connection_t *cl, vpn_packet_t *packet)
|
||||||
{
|
{
|
||||||
|
connection_t *hop;
|
||||||
cp
|
cp
|
||||||
if(debug_lvl >= DEBUG_TRAFFIC)
|
if(debug_lvl >= DEBUG_TRAFFIC)
|
||||||
syslog(LOG_ERR, _("Sending packet of %d bytes to %s (%s)"),
|
syslog(LOG_ERR, _("Sending packet of %d bytes to %s (%s)"),
|
||||||
|
@ -254,15 +255,28 @@ cp
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check if it has to go via TCP or UDP... */
|
if(myself->options & OPTION_TCPONLY)
|
||||||
cp
|
|
||||||
if((cl->options | myself->options) & OPTION_TCPONLY)
|
|
||||||
{
|
{
|
||||||
if(send_tcppacket(cl, packet))
|
if(send_tcppacket(cl->nexthop, packet))
|
||||||
terminate_connection(cl, 1);
|
terminate_connection(cl->nexthop, 1);
|
||||||
}
|
}
|
||||||
else
|
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 */
|
/* Broadcast a packet to all active direct connections */
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
along with this program; if not, write to the Free Software
|
along with this program; if not, write to the Free Software
|
||||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
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"
|
#include "config.h"
|
||||||
|
@ -263,6 +263,7 @@ cp
|
||||||
|
|
||||||
cl->allow_request = ALL;
|
cl->allow_request = ALL;
|
||||||
cl->nexthop = cl;
|
cl->nexthop = cl;
|
||||||
|
cl->lastbutonehop = myself;
|
||||||
cl->cipher_pkttype = EVP_bf_cbc();
|
cl->cipher_pkttype = EVP_bf_cbc();
|
||||||
cl->cipher_pktkeylength = cl->cipher_pkttype->key_len + cl->cipher_pkttype->iv_len;
|
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)
|
int send_add_host(connection_t *cl, connection_t *other)
|
||||||
{
|
{
|
||||||
cp
|
cp
|
||||||
return send_request(cl, "%d %s %lx:%d %lx", ADD_HOST,
|
return send_request(cl, "%d %s %lx:%d %lx %s", ADD_HOST,
|
||||||
other->name, other->address, other->port, other->options);
|
other->name, other->address, other->port, other->options, other->lastbutonehop->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
int add_host_h(connection_t *cl)
|
int add_host_h(connection_t *cl)
|
||||||
{
|
{
|
||||||
connection_t *old, *new, *p;
|
connection_t *old, *new, *p;
|
||||||
char name[MAX_STRING_SIZE];
|
char name[MAX_STRING_SIZE], lastbutone[MAX_STRING_SIZE];
|
||||||
avl_node_t *node;
|
avl_node_t *node;
|
||||||
cp
|
cp
|
||||||
new = new_connection();
|
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);
|
syslog(LOG_ERR, _("Got bad ADD_HOST from %s (%s)"), cl->name, cl->hostname);
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -802,20 +803,35 @@ cp
|
||||||
return -1;
|
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 */
|
/* Check if somebody tries to add ourself */
|
||||||
|
|
||||||
if(!strcmp(name, myself->name))
|
if(!strcmp(name, myself->name))
|
||||||
{
|
{
|
||||||
syslog(LOG_ERR, _("Warning: got ADD_HOST from %s (%s) for ourself, restarting"), cl->name, cl->hostname);
|
syslog(LOG_ERR, _("Got ADD_HOST from %s (%s) for ourself!"), cl->name, cl->hostname);
|
||||||
sighup = 1;
|
|
||||||
free_connection(new);
|
free_connection(new);
|
||||||
return 0;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Fill in more of the new connection structure */
|
/* Fill in more of the new connection structure */
|
||||||
|
|
||||||
new->hostname = hostlookup(htonl(new->address));
|
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 */
|
/* Check if the new host already exists in the connnection list */
|
||||||
|
|
||||||
if((old = lookup_id(name)))
|
if((old = lookup_id(name)))
|
||||||
|
@ -864,20 +880,20 @@ cp
|
||||||
int send_del_host(connection_t *cl, connection_t *other)
|
int send_del_host(connection_t *cl, connection_t *other)
|
||||||
{
|
{
|
||||||
cp
|
cp
|
||||||
return send_request(cl, "%d %s %lx:%d %lx", DEL_HOST,
|
return send_request(cl, "%d %s %lx:%d %lx %s", DEL_HOST,
|
||||||
other->name, other->address, other->port, other->options);
|
other->name, other->address, other->port, other->options, other->lastbutonehop->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
int del_host_h(connection_t *cl)
|
int del_host_h(connection_t *cl)
|
||||||
{
|
{
|
||||||
char name[MAX_STRING_SIZE];
|
char name[MAX_STRING_SIZE], lastbutone[MAX_STRING_SIZE];
|
||||||
ipv4_t address;
|
ipv4_t address;
|
||||||
port_t port;
|
port_t port;
|
||||||
long int options;
|
long int options;
|
||||||
connection_t *old, *p;
|
connection_t *old, *p;
|
||||||
avl_node_t *node;
|
avl_node_t *node;
|
||||||
cp
|
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)"),
|
syslog(LOG_ERR, _("Got bad DEL_HOST from %s (%s)"),
|
||||||
cl->name, cl->hostname);
|
cl->name, cl->hostname);
|
||||||
|
@ -892,14 +908,19 @@ cp
|
||||||
return -1;
|
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 */
|
/* Check if somebody tries to delete ourself */
|
||||||
|
|
||||||
if(!strcmp(name, myself->name))
|
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);
|
cl->name, cl->hostname);
|
||||||
sighup = 1;
|
return -1;
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check if the deleted host already exists in the connnection list */
|
/* Check if the deleted host already exists in the connnection list */
|
||||||
|
@ -913,7 +934,7 @@ cp
|
||||||
|
|
||||||
/* Check if the rest matches */
|
/* 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);
|
syslog(LOG_WARNING, _("Got DEL_HOST from %s (%s) for %s which doesn't match"), cl->name, cl->hostname, old->name);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
along with this program; if not, write to the Free Software
|
along with this program; if not, write to the Free Software
|
||||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
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__
|
#ifndef __TINC_PROTOCOL_H__
|
||||||
|
@ -30,7 +30,7 @@
|
||||||
incompatible version have different protocols.
|
incompatible version have different protocols.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define PROT_CURRENT 10
|
#define PROT_CURRENT 11
|
||||||
|
|
||||||
/* Request numbers */
|
/* Request numbers */
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue