X-Git-Url: https://www.tinc-vpn.org/git/browse?p=tinc;a=blobdiff_plain;f=src%2Fnet.c;h=e086d78633f29af27e9334ed9ffd32e0097164fb;hp=718399159b975a73741c256b065b1598262fe82c;hb=18d1233c40a5705e9123edd6f4c6764a5178003b;hpb=8ed27d40f358581d021319cc26313c9f6ddf9a71 diff --git a/src/net.c b/src/net.c index 71839915..e086d786 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.129 2001/09/01 12:36:06 guus Exp $ + $Id: net.c,v 1.35.4.133 2001/09/25 13:39:11 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 */ @@ -369,18 +383,25 @@ cp cp if (!ioctl(tap_fd, TUNSETIFF, (void *) &ifr)) { - syslog(LOG_INFO, _("%s is a 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 an ethertap device"), tapfname); - taptype = TAP_TYPE_ETHERTAP; - } + { + syslog(LOG_INFO, _("%s is a Linux ethertap device"), tapfname); + taptype = TAP_TYPE_ETHERTAP; + } #endif #ifdef HAVE_FREEBSD - syslog(LOG_INFO, _("%s is a tun/tap device"), tapfname); + syslog(LOG_INFO, _("%s is a FreeBSD tap device"), tapfname); taptype = TAP_TYPE_TUNTAP; #endif #ifdef HAVE_SOLARIS @@ -422,7 +443,7 @@ cp return -1; } - syslog(LOG_INFO, _("%s is a tun/tap device"), tapfname); + syslog(LOG_INFO, _("%s is a Solaris tun device"), tapfname); #endif cp @@ -955,6 +976,8 @@ cp cp /* Done */ + myself->nexthop = myself; + myself->lastbutonehop = myself; myself->status.active = 1; id_add(myself); @@ -982,7 +1005,7 @@ cp { 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 */ + cfg = get_config_val(cfg->next, config_connectto); /* Or else we try the next ConnectTo line */ } if(retry)