You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
54 lines
1.4 KiB
54 lines
1.4 KiB
/* 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);
|
|
}
|