Skip to content

Commit

Permalink
Add support for iPhones and recent iPods.
Browse files Browse the repository at this point in the history
This is a slightly modified patch from Grzegorz Dymarek that allows tinc to use
the tunemu device, which allows tinc to be compiled for iPhones and recent
iPods. To enable support for tunemu, the --enable-tunemu option has to be used
when running the configure script.
  • Loading branch information
gsliepen committed Sep 10, 2009
1 parent ff946d0 commit 4a5d421
Show file tree
Hide file tree
Showing 6 changed files with 503 additions and 9 deletions.
1 change: 1 addition & 0 deletions THANKS
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ We would like to thank the following people for their contributions to tinc:
* Cris van Pelt
* Enrique Zanardi
* Flynn Marquardt
* Grzegorz Dymarek
* Hans Bayle
* Ivo van Dong
* James MacLean
Expand Down
9 changes: 9 additions & 0 deletions configure.in
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,15 @@ case $host_os in
;;
esac

AC_ARG_ENABLE(tunemu,
AS_HELP_STRING([--enable-tunemu], [enable support for the tunemu driver]),
[ AC_DEFINE(ENABLE_TUNEMU, 1, [Support for tunemu])
tunemu=true
]
)

AM_CONDITIONAL(TUNEMU, test "$tunemu" = true)

AC_CACHE_SAVE

if test -d /sw/include ; then
Expand Down
10 changes: 9 additions & 1 deletion src/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -9,17 +9,25 @@ tincd_SOURCES = conf.c connection.c edge.c event.c graph.c logger.c meta.c net.c
net_socket.c netutl.c node.c process.c protocol.c protocol_auth.c protocol_edge.c protocol_misc.c \
protocol_key.c protocol_subnet.c route.c subnet.c tincd.c

if TUNEMU
tincd_SOURCES += bsd/tunemu.c
endif

nodist_tincd_SOURCES = device.c

DEFAULT_INCLUDES =

INCLUDES = @INCLUDES@ -I$(top_builddir) -I$(top_srcdir)/lib

noinst_HEADERS = conf.h connection.h device.h edge.h event.h graph.h logger.h meta.h net.h netutl.h node.h process.h \
protocol.h route.h subnet.h
protocol.h route.h subnet.h bsd/tunemu.h

LIBS = @LIBS@ @LIBINTL@

if TUNEMU
LIBS += -lpcap
endif

tincd_LDADD = \
$(top_builddir)/lib/libvpn.a

Expand Down
74 changes: 66 additions & 8 deletions src/bsd/device.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,19 @@
#include "utils.h"
#include "xalloc.h"

#ifdef HAVE_TUNEMU
#include "bsd/tunemu.h"
#endif

#define DEFAULT_DEVICE "/dev/tun0"

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;
Expand All @@ -43,7 +50,9 @@ 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;
Expand All @@ -60,14 +69,13 @@ bool setup_device(void) {
if(!get_config_string(lookup_config(config_tree, "Interface"), &iface))
iface = xstrdup(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;
}

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"))
Expand All @@ -83,6 +91,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;
Expand Down Expand Up @@ -129,6 +154,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);
Expand All @@ -139,7 +169,15 @@ 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);
Expand All @@ -152,7 +190,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;
Expand Down Expand Up @@ -228,6 +275,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;
}

Expand Down Expand Up @@ -284,6 +332,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;
}
Expand Down
Loading

0 comments on commit 4a5d421

Please sign in to comment.