/* tunctl.c - Control tap/tun network devices. * * Copyright 2016 Rob Landley <rob@landley.net> * * See http://kernel.org/doc/Documentation/networking/tuntap.txt * * This is useful for things like "kvm -netdev tap" and containers. * See https://landley.net/lxc/02-networking.html for example usage. * * todo: bridge mode * -b bridge daemon (forwards packets between NAME and NAME2 interfaces) USE_TUNCTL(NEWTOY(tunctl, "<1>1t|d|u:T[!td]", TOYFLAG_USR|TOYFLAG_BIN)) config TUNCTL bool "tunctl" default y help usage: tunctl [-dtT] [-u USER] NAME Create and delete tun/tap virtual ethernet devices. -T Use tap (ethernet frames) instead of tun (ip packets) -d Delete tun/tap device -t Create tun/tap device -u Set owner (user who can read/write device without root access) */ #define FOR_tunctl #include "toys.h" #include <linux/if_tun.h> GLOBALS( char *u; ) void tunctl_main(void) { struct ifreq *ifr = (void *)toybuf; uid_t u = TT.u ? xgetuid(TT.u) : 0; int fd = xopen("/dev/net/tun", O_RDWR); // Associate filehandle with device ifr->ifr_flags = ((toys.optflags&FLAG_T) ? IFF_TUN : IFF_TAP)|IFF_NO_PI; strncpy(ifr->ifr_name, *toys.optargs, sizeof(ifr->ifr_name)); xioctl(fd, TUNSETIFF, toybuf); if (toys.optflags&FLAG_t) { xioctl(fd, TUNSETPERSIST, (void *)1); xioctl(fd, TUNSETOWNER, (void *)(long)u); } else xioctl(fd, TUNSETPERSIST, (void *)0); }