00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
#include <sys/ioctl.h>
00011
#include <sys/socket.h>
00012
#include "if_tun.h"
00013
#include <linux/if.h>
00014
#include <string.h>
00015
00016
#include "wvlog.h"
00017
#include "wvtundev.h"
00018
00019 WvTunDev::WvTunDev(
const WvIPNet &addr,
int mtu) :
00020
WvFile("/dev/net/tun", O_RDWR)
00021 {
00022 init(addr, mtu);
00023 }
00024
00025
void WvTunDev::init(
const WvIPNet &addr,
int mtu)
00026 {
00027
WvLog log(
"New tundev", WvLog::Debug2);
00028
if (
getfd() < 0)
00029 {
00030
log(
"Could not open /dev/net/tun: %s\n", strerror(errno));
00031 seterr(errno);
00032
return;
00033 }
00034
00035
struct ifreq ifr;
00036 memset(&ifr, 0,
sizeof(ifr));
00037 ifr.ifr_flags =
IFF_NO_PI |
IFF_TUN;
00038
00039
if (ioctl(
getfd(), TUNSETIFF, (
void *) &ifr) < 0 ||
00040 ioctl(
getfd(), TUNSETNOCSUM, 1) < 0)
00041 {
00042
log(
"Could not initialize the interface: %s\n", strerror(errno));
00043
seterr(errno);
00044
return;
00045 }
00046
00047
WvInterface iface(ifr.ifr_name);
00048 iface.
setipaddr(addr);
00049 iface.
setmtu(mtu);
00050 iface.
up(
true);
00051
ifcname = ifr.ifr_name;
00052
log.
app =
ifcname;
00053
00054
log(WvLog::Debug2,
"Now up (%s).\n", addr);
00055 }