--- gvpe/src/device-linux.C 2003/03/01 15:53:03 1.1 +++ gvpe/src/device-linux.C 2004/01/17 01:18:36 1.7 @@ -1,5 +1,6 @@ /* device-linux.C -- Interaction with Linux tun/tap device + Copyright (C) 2003-2004 Marc Lehmann 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 @@ -30,8 +31,10 @@ #include #include +#include + #ifdef LINUX_IF_TUN_H -#include LINUX_IF_TUN_H +# include LINUX_IF_TUN_H #else #include #endif @@ -41,6 +44,17 @@ #include "conf.h" +#if TEST_ETHEREMU +# define IF_istun +# include "ether_emu.C" +#endif + +const char * +tap_device::info () +{ + return _("Linux tun/tap device"); +} + tap_device::tap_device () { struct ifreq ifr; @@ -56,7 +70,11 @@ } memset (&ifr, 0, sizeof (ifr)); +#if TEST_ETHEREMU + ifr.ifr_flags = IFF_TUN | IFF_NO_PI; +#else ifr.ifr_flags = IFF_TAP | IFF_NO_PI; +#endif if (conf.ifname) strncpy (ifr.ifr_name, conf.ifname, IFNAMSIZ); @@ -74,9 +92,8 @@ exit (1); } - if (conf.ifpersist) - if (ioctl (fd, TUNSETPERSIST, 1)) - slog (L_WARN, _("cannot set persistent mode for device %s: %s"), ifrname, strerror (errno)); + if (ioctl (fd, TUNSETPERSIST, conf.ifpersist ? 1 : 0)) + slog (L_WARN, _("cannot set persistency mode for device %s: %s"), ifrname, strerror (errno)); slog (L_DEBUG, _("%s is a %s"), device, info ()); } @@ -91,23 +108,46 @@ { tap_packet *pkt = new tap_packet; +#if TEST_ETHEREMU + pkt->len = read (fd, &((*pkt)[14]), MAX_MTU - 14); +#else pkt->len = read (fd, &((*pkt)[0]), MAX_MTU); +#endif if (pkt->len <= 0) { + delete pkt; slog (L_ERR, _("error while reading from %s %s: %s"), info (), DEFAULT_DEVICE, strerror (errno)); - free (pkt); return 0; } +#if TEST_ETHEREMU + pkt->len += 14; + + // assume ipv4 + (*pkt)[12] = 0x08; + (*pkt)[13] = 0x00; + + if (!ether_emu.tun_to_tap (pkt)) + { + delete pkt; + return 0; + } +#endif + return pkt; } void tap_device::send (tap_packet *pkt) { +#if TEST_ETHEREMU + if (ether_emu.tap_to_tun (pkt) && + write (fd, &((*pkt)[14]), pkt->len - 14) < 0) +#else if (write (fd, &((*pkt)[0]), pkt->len) < 0) +#endif slog (L_ERR, _("can't write to %s %s: %s"), info (), DEFAULT_DEVICE, strerror (errno)); }