X-Git-Url: https://www.tinc-vpn.org/git/browse?p=tinc;a=blobdiff_plain;f=src%2Fnet.c;h=d25cec754897d19546d2819b9a91ef5500f3186c;hp=8352ac54c7bb7c4742ec390f88063cbbd6aa1a82;hb=154733927af0b27cdadb83f03b845301ce8bfbfd;hpb=fcbe215d64d7e2f3b159fff6422d750417877ac4 diff --git a/src/net.c b/src/net.c index 8352ac54..d25cec75 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.126 2001/07/21 20:21:25 guus Exp $ + $Id: net.c,v 1.35.4.130 2001/09/24 13:31:15 guus Exp $ */ #include "config.h" @@ -96,7 +96,6 @@ int total_tap_out = 0; int total_socket_in = 0; int total_socket_out = 0; -config_t *upstreamcfg; int seconds_till_retry = 5; int keylifetime = 0; @@ -204,7 +203,7 @@ cp #ifdef HAVE_SOLARIS if(write(tap_fd, packet->data + 14, packet->len - 14) < 0) - syslog(LOG_ERR, _("Can't write to tun device: %m")); + syslog(LOG_ERR, _("Can't write to tun/tap device: %m")); else total_tap_out += packet->len; #else @@ -360,7 +359,6 @@ cp mymac.net.mac.address.x[5] = 0x00; #ifdef HAVE_LINUX - taptype = TAP_TYPE_ETHERTAP; #ifdef HAVE_TUNTAP /* Ok now check if this is an old ethertap or a new tun/tap thingie */ memset(&ifr, 0, sizeof(ifr)); @@ -371,12 +369,25 @@ cp cp if (!ioctl(tap_fd, TUNSETIFF, (void *) &ifr)) { - syslog(LOG_INFO, _("%s is a new style tun/tap device"), tapfname); + syslog(LOG_INFO, _("%s is a Linux tun/tap device"), tapfname); taptype = TAP_TYPE_TUNTAP; } + else + if (!ioctl(tap_fd, (('T'<< 8) | 202), (void *) &ifr)) + { + syslog(LOG_INFO, _("%s is a Linux tun/tap device"), tapfname); + syslog(LOG_WARNING, _("Old ioctl() request used")); + taptype = TAP_TYPE_TUNTAP; + } + else #endif + { + syslog(LOG_INFO, _("%s is a Linux ethertap device"), tapfname); + taptype = TAP_TYPE_ETHERTAP; + } #endif #ifdef HAVE_FREEBSD + syslog(LOG_INFO, _("%s is a FreeBSD tap device"), tapfname); taptype = TAP_TYPE_TUNTAP; #endif #ifdef HAVE_SOLARIS @@ -412,10 +423,13 @@ cp syslog(LOG_ERR, _("Can't set PPA %d: %m"), ppa); return -1; } + if(ioctl(ip_fd, I_LINK, if_fd) < 0){ syslog(LOG_ERR, _("Can't link TUN device to IP: %m")); return -1; } + + syslog(LOG_INFO, _("%s is a Solaris tun device"), tapfname); #endif cp @@ -639,9 +653,13 @@ cp if((old = lookup_id(name))) { - if(debug_lvl >= DEBUG_CONNECTIONS) - syslog(LOG_NOTICE, _("We are already connected to %s."), name); - old->status.outgoing = 1; + if(!old->status.outgoing) + { + if(debug_lvl >= DEBUG_CONNECTIONS) + syslog(LOG_NOTICE, _("We are already connected to %s."), name); + + old->status.outgoing = 1; + } return 0; } @@ -952,47 +970,44 @@ cp return 0; } +void randomized_alarm(int seconds) +{ + unsigned char r; + RAND_pseudo_bytes(&r, 1); + alarm((seconds * (int)r) / 128 + 1); +} + RETSIGTYPE -sigalrm_handler(int a) +try_outgoing_connections(int a) { config_t const *cfg; + int retry = 0; cp - cfg = get_config_val(upstreamcfg, config_connectto); + cfg = get_config_val(config, config_connectto); - if(!cfg) + while(cfg) { - if(upstreamcfg == config) - { - /* No upstream IP given, we're listen only. */ - signal(SIGALRM, SIG_IGN); - return; - } + if(setup_outgoing_connection(cfg->data.ptr)) /* function returns 0 when there are no problems */ + retry = 1; + cfg = get_config_val(cfg, config_connectto); /* Or else we try the next ConnectTo line */ } - else + + if(retry) { - /* We previously tried all the ConnectTo lines. Now wrap back to the first. */ - cfg = get_config_val(config, config_connectto); + seconds_till_retry += 5; + if(seconds_till_retry > MAXTIMEOUT) /* Don't wait more than MAXTIMEOUT seconds. */ + seconds_till_retry = MAXTIMEOUT; + + syslog(LOG_ERR, _("Failed to setup all outgoing connections, will retry in %d seconds"), + seconds_till_retry); + + /* Randomize timeout to avoid global synchronisation effects */ + randomized_alarm(seconds_till_retry); } - - while(cfg) + else { - upstreamcfg = cfg->next; - if(!setup_outgoing_connection(cfg->data.ptr)) /* function returns 0 when there are no problems */ - { - signal(SIGALRM, SIG_IGN); - return; - } - cfg = get_config_val(upstreamcfg, config_connectto); /* Or else we try the next ConnectTo line */ + seconds_till_retry = 5; } - - signal(SIGALRM, sigalrm_handler); - upstreamcfg = config; - seconds_till_retry += 5; - if(seconds_till_retry > MAXTIMEOUT) /* Don't wait more than MAXTIMEOUT seconds. */ - seconds_till_retry = MAXTIMEOUT; - syslog(LOG_ERR, _("Still failed to connect to other, will retry in %d seconds"), - seconds_till_retry); - alarm(seconds_till_retry); cp } @@ -1026,29 +1041,8 @@ cp if(setup_myself() < 0) return -1; - if(!(cfg = get_config_val(config, config_connectto))) - /* No upstream IP given, we're listen only. */ - return 0; - - while(cfg) - { - upstreamcfg = cfg->next; - if(!setup_outgoing_connection(cfg->data.ptr)) /* function returns 0 when there are no problems */ - return 0; - cfg = get_config_val(upstreamcfg, config_connectto); /* Or else we try the next ConnectTo line */ - } - - if(do_detach) - { - signal(SIGALRM, sigalrm_handler); - upstreamcfg = config; - seconds_till_retry = MAXTIMEOUT; - syslog(LOG_NOTICE, _("Trying to re-establish outgoing connection in %d seconds"), seconds_till_retry); - alarm(seconds_till_retry); - } - else - return -1; - + signal(SIGALRM, try_outgoing_connections); + alarm(5); cp return 0; } @@ -1258,7 +1252,7 @@ cp if(cl->status.outgoing) { cl->status.outgoing = 0; - signal(SIGALRM, sigalrm_handler); + signal(SIGALRM, try_outgoing_connections); alarm(seconds_till_retry); syslog(LOG_NOTICE, _("Trying to re-establish outgoing connection in %d seconds"), seconds_till_retry); } @@ -1362,7 +1356,7 @@ cp if(FD_ISSET(p->meta_socket, f)) if(receive_meta(p) < 0) { - terminate_connection(p, 1); + terminate_connection(p, p->status.meta); return; } }