#include <assert.h>
#include <stdint.h>
#include <string.h>
#include <sys/socket.h>
#include <linux/if.h>
#include <linux/if_tun.h>
#include <sys/ioctl.h>
int tuntap_setup(int fd, unsigned char *name, int mode, int packet_info) {
struct ifreq ifr;
memset(&ifr, 0, sizeof ifr);
switch (mode) {
case 1:
ifr.ifr_flags = IFF_TUN;
break;
case 2:
ifr.ifr_flags = IFF_TAP;
break;
default:
assert(0);
}
if (!packet_info) {
ifr.ifr_flags |= IFF_NO_PI;
}
strncpy(ifr.ifr_name, (char *)name, IFNAMSIZ - 1);
int ioresult = ioctl(fd, TUNSETIFF, &ifr);
if (ioresult < 0) {
return ioresult;
}
strncpy((char *)name, ifr.ifr_name, IFNAMSIZ < 32 ? IFNAMSIZ : 32);
name[32] = '\0';
return 0;
}