Sponge
CS144's user-space TCP library
libsponge
util
tun.cc
Go to the documentation of this file.
1
#include "
tun.hh
"
2
3
#include "
util.hh
"
4
5
#include <cstring>
6
#include <fcntl.h>
7
#include <linux/if.h>
8
#include <linux/if_tun.h>
9
#include <sys/ioctl.h>
10
11
static
constexpr
const
char
*
CLONEDEV
=
"/dev/net/tun"
;
12
13
using namespace
std
;
14
23
24
TunTapFD::TunTapFD
(
const
string
&devname,
const
bool
is_tun)
25
:
FileDescriptor
(
SystemCall
(
"open"
, open(
CLONEDEV
, O_RDWR))) {
26
struct
ifreq tun_req {};
27
28
tun_req.ifr_flags = (is_tun ? IFF_TUN : IFF_TAP) | IFF_NO_PI;
// tun device with no packetinfo
29
30
// copy devname to ifr_name, making sure to null terminate
31
32
strncpy
(
static_cast<
char
*
>
(tun_req.ifr_name), devname.
data
(), IFNAMSIZ - 1);
33
tun_req.ifr_name[IFNAMSIZ - 1] =
'\0'
;
34
35
SystemCall
(
"ioctl"
, ioctl(
fd_num
(), TUNSETIFF,
static_cast<
void
*
>
(&tun_req)));
36
}
util.hh
SystemCall
SystemCall("socketpair", ::socketpair(AF_UNIX, SOCK_STREAM, 0, fds.data()))
FileDescriptor::fd_num
int fd_num() const
underlying descriptor number
Definition:
file_descriptor.hh:86
CLONEDEV
static constexpr const char * CLONEDEV
Definition:
tun.cc:11
FileDescriptor
A reference-counted handle to a file descriptor.
Definition:
file_descriptor.hh:12
TunTapFD::TunTapFD
TunTapFD(const std::string &devname, const bool is_tun)
Open an existing persistent TUN or TAP device.
Definition:
tun.cc:24
tun.hh
std::strncpy
T strncpy(T... args)
std
std::string::data
T data(T... args)
Generated by
1.8.17