X-Git-Url: https://www.tinc-vpn.org/git/browse?p=tinc;a=blobdiff_plain;f=src%2Fbsd%2Fdevice.c;h=bbd7c00efaf35e25f84bb416eeb9cd3f6b921de5;hp=ee1c988e3c6d50a25625f7dda76d84e7aed65462;hb=c217d214f4f071c235bc7c463a1da6124e2570a6;hpb=c6830ba821e6387be961ca68b32992382a74a0e9 diff --git a/src/bsd/device.c b/src/bsd/device.c index ee1c988e..bbd7c00e 100644 --- a/src/bsd/device.c +++ b/src/bsd/device.c @@ -1,7 +1,7 @@ /* device.c -- Interaction BSD tun/tap device Copyright (C) 2001-2005 Ivo Timmermans, - 2001-2007 Guus Sliepen + 2001-2009 Guus Sliepen This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -16,8 +16,6 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - - $Id: device.c 1398 2004-11-01 15:18:53Z guus $ */ #include "system.h" @@ -27,6 +25,11 @@ #include "net.h" #include "route.h" #include "utils.h" +#include "xalloc.h" + +#ifdef HAVE_TUNEMU +#include "bsd/tunemu.h" +#endif #define DEFAULT_DEVICE "/dev/tun0" @@ -34,15 +37,20 @@ typedef enum device_type { DEVICE_TYPE_TUN, DEVICE_TYPE_TUNIFHEAD, DEVICE_TYPE_TAP, +#ifdef HAVE_TUNEMU + DEVICE_TYPE_TUNEMU, +#endif } device_type_t; int device_fd = -1; -char *device; -char *iface; -char *device_info; +char *device = NULL; +char *iface = NULL; +static char *device_info = NULL; static int device_total_in = 0; static int device_total_out = 0; -#if defined(HAVE_OPENBSD) || defined(HAVE_FREEBSD) +#if defined(TUNEMU) +static device_type_t device_type = DEVICE_TYPE_TUNEMU; +#elif defined(HAVE_OPENBSD) || defined(HAVE_FREEBSD) static device_type_t device_type = DEVICE_TYPE_TUNIFHEAD; #else static device_type_t device_type = DEVICE_TYPE_TUN; @@ -54,19 +62,18 @@ bool setup_device(void) { cp(); if(!get_config_string(lookup_config(config_tree, "Device"), &device)) - device = DEFAULT_DEVICE; + device = xstrdup(DEFAULT_DEVICE); if(!get_config_string(lookup_config(config_tree, "Interface"), &iface)) - iface = rindex(device, '/') ? rindex(device, '/') + 1 : device; - - if((device_fd = open(device, O_RDWR | O_NONBLOCK)) < 0) { - logger(LOG_ERR, _("Could not open %s: %s"), device, strerror(errno)); - return false; - } + iface = xstrdup(rindex(device, '/') ? rindex(device, '/') + 1 : device); if(get_config_string(lookup_config(config_tree, "DeviceType"), &type)) { if(!strcasecmp(type, "tun")) /* use default */; +#ifdef HAVE_TUNEMU + else if(!strcasecmp(type, "tunemu")) + device_type = DEVICE_TYPE_TUNEMU; +#endif else if(!strcasecmp(type, "tunnohead")) device_type = DEVICE_TYPE_TUN; else if(!strcasecmp(type, "tunifhead")) @@ -82,6 +89,23 @@ bool setup_device(void) { device_type = DEVICE_TYPE_TAP; } + switch(device_type) { +#ifdef HAVE_TUNEMU + case DEVICE_TYPE_TUNEMU: { + char dynamic_name[256] = ""; + device_fd = tunemu_open(dynamic_name); + } + break; +#endif + default: + device_fd = open(device, O_RDWR | O_NONBLOCK); + } + + if(device_fd < 0) { + logger(LOG_ERR, _("Could not open %s: %s"), device, strerror(errno)); + return false; + } + switch(device_type) { default: device_type = DEVICE_TYPE_TUN; @@ -128,6 +152,11 @@ bool setup_device(void) { overwrite_mac = true; device_info = _("Generic BSD tap device"); break; +#ifdef HAVE_TUNEMU + case DEVICE_TYPE_TUNEMU: + device_info = _("BSD tunemu device"); + break; +#endif } logger(LOG_INFO, _("%s is a %s"), device, device_info); @@ -138,7 +167,18 @@ bool setup_device(void) { void close_device(void) { cp(); - close(device_fd); + switch(device_type) { +#ifdef HAVE_TUNEMU + case DEVICE_TYPE_TUNEMU: + tunemu_close(device_fd); + break; +#endif + default: + close(device_fd); + } + + free(device); + free(iface); } bool read_packet(vpn_packet_t *packet) { @@ -148,7 +188,16 @@ bool read_packet(vpn_packet_t *packet) { switch(device_type) { case DEVICE_TYPE_TUN: - if((lenin = read(device_fd, packet->data + 14, MTU - 14)) <= 0) { +#ifdef HAVE_TUNEMU + case DEVICE_TYPE_TUNEMU: + if(device_type == DEVICE_TYPE_TUNEMU) + lenin = tunemu_read(device_fd, packet->data + 14, MTU - 14); + else +#else + lenin = read(device_fd, packet->data + 14, MTU - 14); +#endif + + if(lenin <= 0) { logger(LOG_ERR, _("Error while reading from %s %s: %s"), device_info, device, strerror(errno)); return false; @@ -224,6 +273,7 @@ bool read_packet(vpn_packet_t *packet) { ifdebug(TRAFFIC) logger(LOG_DEBUG, _("Read packet of %d bytes from %s"), packet->len, device_info); + logger(LOG_INFO, "E:fd_read"); return true; } @@ -280,6 +330,16 @@ bool write_packet(vpn_packet_t *packet) } break; +#ifdef HAVE_TUNEMU + case DEVICE_TYPE_TUNEMU: + if(tunemu_write(device_fd, packet->data + 14, packet->len - 14) < 0) { + logger(LOG_ERR, _("Error while writing to %s %s: %s"), device_info, + device, strerror(errno)); + return false; + } + break; +#endif + default: return false; }