X-Git-Url: https://www.tinc-vpn.org/git/browse?p=tinc;a=blobdiff_plain;f=src%2Fprotocol.c;h=3c20f3b2762a8f06efedeafbee2a85cdf519eb3d;hp=6740cb0d30ede6ef0a1ecc3cad79f17da049b05f;hb=1a1ebefd572c18d6af187750847b024ce07551ae;hpb=e8e7379311ca3bf6e1fdd7d0f477a43e510e2317 diff --git a/src/protocol.c b/src/protocol.c index 6740cb0d..3c20f3b2 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.15 2000/06/29 13:04:15 guus Exp $ + $Id: protocol.c,v 1.28.4.19 2000/06/30 21:03:51 guus Exp $ */ #include "config.h" @@ -391,6 +391,7 @@ cp int basic_info_h(conn_list_t *cl) { + conn_list_t *old; cp if(debug_lvl > 1) syslog(LOG_DEBUG, _("Got BASIC_INFO from %s"), cl->real_hostname); @@ -413,12 +414,29 @@ cp if(cl->status.outgoing) { + /* First check if the host we connected to is already in our + connection list. If so, we are probably making a loop, which + is not desirable. + */ + + if(old=lookup_conn(cl->vpn_ip)) + { + if(debug_lvl>0) + syslog(LOG_NOTICE, _("Uplink %s (%s) is already in our connection list"), + cl->vpn_hostname, cl->real_hostname); + cl->status.outgoing = 0; + old->status.outgoing = 1; + terminate_connection(cl); + return 0; + } + if(setup_vpn_connection(cl) < 0) return -1; send_basic_info(cl); } else { + if(setup_vpn_connection(cl) < 0) return -1; send_passphrase(cl); @@ -471,7 +489,8 @@ cp if(verify_passphrase(cl, g_n)) { /* intruder! */ - syslog(LOG_ERR, _("Intruder: passphrase does not match!")); + syslog(LOG_ERR, _("Intruder from %s: passphrase for %s does not match!"), + cl->real_hostname, cl->vpn_hostname); return -1; } @@ -483,12 +502,18 @@ cp /* Okay, before we active the connection, we check if there is another entry in the connection list with the same vpn_ip. If so, it presumably is an - old connection that has timed out but we don't know it yet. Because our - conn_list entry is not active, lookup_conn will skip ourself. */ + old connection that has timed out but we don't know it yet. + */ while(old = lookup_conn(cl->vpn_ip)) - terminate_connection(old); - + { + if(debug_lvl > 1) + syslog(LOG_NOTICE, _("Removing old entry for %s at %s in favour of new connection from %s"), + cl->vpn_hostname, old->real_hostname, cl->real_hostname); + old->status.active = 0; + terminate_connection(old); + } + cl->status.active = 1; if(debug_lvl > 0) @@ -511,7 +536,8 @@ cp cl->status.active = 1; - syslog(LOG_NOTICE, _("Connection with %s (%s) activated"), + if(debug_lvl > 0) + syslog(LOG_NOTICE, _("Connection with %s (%s) activated"), cl->vpn_hostname, cl->real_hostname); notify_others(cl, NULL, send_add_host); @@ -538,11 +564,6 @@ cp cl->status.termreq = 1; - if(cl->status.active) - notify_others(cl, NULL, send_del_host); - - cl->status.active = 0; - terminate_connection(cl); cp return 0; @@ -594,6 +615,15 @@ cp return 0; } + /* Connections lists are really messed up if this happens */ + if(vpn_ip == myself->vpn_ip) + { + syslog(LOG_ERR, _("Warning: got DEL_HOST from %s (%s) for ourself, restarting"), + cl->vpn_hostname, cl->real_hostname); + sighup = 1; + return 0; + } + if(debug_lvl > 1) syslog(LOG_DEBUG, _("Got DEL_HOST for %s (%s) from %s (%s)"), fw->vpn_hostname, fw->real_hostname, cl->vpn_hostname, cl->real_hostname); @@ -672,8 +702,33 @@ cp return -1; } - while(old = lookup_conn(vpn_ip)) - terminate_connection(old); + if(old = lookup_conn(vpn_ip)) + { + if((real_ip==old->real_ip) && (vpn_mask==old->vpn_mask) && (port==old->port)) + { + if(debug_lvl>1) + syslog(LOG_NOTICE, _("Got duplicate ADD_HOST for %s (%s) from %s (%s)"), + old->vpn_hostname, old->real_hostname, cl->vpn_hostname, cl->real_hostname); + goto skip_add_host; /* One goto a day keeps the deeply nested if constructions away. */ + } + else + { + if(debug_lvl>1) + syslog(LOG_NOTICE, _("Removing old entry for %s (%s)"), + old->vpn_hostname, old->real_hostname); + old->status.active = 0; + terminate_connection(old); + } + } + + /* Connections lists are really messed up if this happens */ + if(vpn_ip == myself->vpn_ip) + { + syslog(LOG_ERR, _("Warning: got ADD_HOST from %s (%s) for ourself, restarting"), + cl->vpn_hostname, cl->real_hostname); + sighup = 1; + return 0; + } ncn = new_conn_list(); ncn->real_ip = real_ip; @@ -692,6 +747,8 @@ cp syslog(LOG_DEBUG, _("Got ADD_HOST for %s (%s) from %s (%s)"), ncn->vpn_hostname, ncn->real_hostname, cl->vpn_hostname, cl->real_hostname); +skip_add_host: + notify_others(ncn, cl, send_add_host); cp return 0;