#include #include #include #include #include #include int tun_alloc(char *dev, char *command, char *type) { struct ifreq ifr; int fd, err; if( (fd = open("/dev/net/tun", O_RDWR)) < 0 ) { perror("opening /dev/net/tun for read/write"); return fd; } //Give ifr the proper amount of memory space memset(&ifr, 0, sizeof(ifr)); /* Flags: IFF_TUN - TUN device (no Ethernet headers) * IFF_TAP - TAP device * * IFF_NO_PI - Do not provide packet information */ if (strcmp(type, "TUN") == 0) { ifr.ifr_flags = IFF_TUN; } else { ifr.ifr_flags = IFF_TAP; } //Set device name if( *dev ) { strncpy(ifr.ifr_name, dev, IFNAMSIZ); } //Access file descriptor for TAP/TUN interface if( (err = ioctl(fd, TUNSETIFF, (void *) &ifr)) < 0 ){ close(fd); return err; } //Create interface by enabling persistence on it if (strcmp(command, "create") == 0) { if( (err = ioctl(fd, TUNSETPERSIST, 1)) < 0){ perror("enabling TUNSETPERSIST"); return err; } } //Or delete existing interface by disabling persistence else { if( (err = ioctl(fd, TUNSETPERSIST, 0)) < 0){ perror("disabling TUNSETPERSIST"); return err; } } return fd; } int main(int argc, char* argv[]) { if (argc < 3 || ((strcmp(argv[1], "delete") != 0 && strcmp(argv[1], "create") != 0)) || ((strcmp(argv[3], "TUN") != 0 && strcmp(argv[3], "TAP") != 0))) { printf("Usage: create|delete TUN|TAP\n"); return 0; } char tun_name[IFNAMSIZ]; char tap_name[IFNAMSIZ]; char *a_name; strcpy(tun_name, argv[2]); int response = tun_alloc(tun_name, argv[1], argv[3]); if (response < 0) { printf("Couldn't create interface. Make sure you're running as root\n"); } return 0; }