--- gvpe/src/device-linux.C 2003/10/14 03:22:09 1.3 +++ gvpe/src/device-linux.C 2004/01/29 18:55:10 1.8 @@ -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 @@ -43,6 +44,11 @@ #include "conf.h" +#if TEST_ETHEREMU +# define IF_istun +# include "ether_emu.C" +#endif + const char * tap_device::info () { @@ -60,11 +66,15 @@ if (fd < 0) { slog (L_ERR, _("could not open device %s: %s"), device, strerror (errno)); - exit (1); + exit (EXIT_FAILURE); } 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); @@ -79,7 +89,7 @@ else { slog (L_CRIT, _("unable to configure tun/tap interface: %s"), strerror (errno)); - exit (1); + exit (EXIT_FAILURE); } if (ioctl (fd, TUNSETPERSIST, conf.ifpersist ? 1 : 0)) @@ -98,7 +108,11 @@ { 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) { @@ -108,13 +122,32 @@ 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)); }