From a2a3e540f2d1a507b34eccae26de09066a2a12fa Mon Sep 17 00:00:00 2001 From: Bin Jin Date: Sun, 12 Mar 2017 17:48:20 +0800 Subject: Initial commit --- cbits/tun-linux.c | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 cbits/tun-linux.c (limited to 'cbits/tun-linux.c') diff --git a/cbits/tun-linux.c b/cbits/tun-linux.c new file mode 100644 index 0000000..adbd7c2 --- /dev/null +++ b/cbits/tun-linux.c @@ -0,0 +1,40 @@ +#include + +#include +#include +#include +#include +#include + +#include "tun.h" + +int tun_alloc(const char *dev_name, int threads, int *fds) { + struct ifreq ifr; + int fd, i; + + if (!dev_name) + return -1; + + memset(&ifr, 0, sizeof(ifr)); + + ifr.ifr_flags = IFF_TUN | IFF_NO_PI; + if (threads > 1) + ifr.ifr_flags |= IFF_MULTI_QUEUE; + strncpy(ifr.ifr_name, dev_name, IFNAMSIZ); + + for (i = 0; i < threads; i++) { + if ((fd = open("/dev/net/tun", O_RDWR)) < 0) + goto err; + if (ioctl(fd, TUNSETIFF, (void *)&ifr) != 0) { + close(fd); + goto err; + } + fds[i] = fd; + } + + return threads; +err: + for (--i; i >= 0; i--) + close(fds[i]); + return -1; +} -- cgit v1.2.3-59-g8ed1b