From: Jean-Christian de Rivaz <jc@eclis.ch>
To: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [patch] Linux TUN/TAP driver updates
Date: Sat, 16 Apr 2005 00:40:38 +0200 [thread overview]
Message-ID: <426042E6.4060404@eclis.ch> (raw)
In-Reply-To: <Pine.LNX.4.61.0504151754150.30308@filer.marasystems.com>
[-- Attachment #1: Type: text/plain, Size: 2349 bytes --]
Hi,
This is a good idea. I haved posted a similar patch to this mailing list
the 13 feb 2005 but I have see no reaction at all at this time. Maybe
you can find something usefull in the attached patch to improve the
support of static TUN/TAP. The patch is outdated now, but I can update
it to the current CVS if there is any interrest. Just tell me.
Static TUN is good in the situation where you have a superuser that
manage the interfaces. It set them and assign them to each users. it can
also setup a DHCP server to distribute IP addresses. Users just lunch
quemu with there static TUN in the option and magicaly get a working
network without any need to sudo, setuid or whatever that can have any
security risk.
You can also imagine a virtual machine manager application that setup
the network interfaces and lunch the qemu instances. This is the
direction I like the most.
Have a good day,
--
Henrik Nordstrom a écrit :
> The attached patch updates the Linux TUN/TAP interface
>
> - Allow use of static/persistent TUN/TAP devices, eleminating the need
> to run anything as root when starting qemu.
>
> - A minor bugfix in filedescriptor based TUN/TAP devices to allow more
> than one filedescriptor (was colliding on the qemu internal device name).
>
> - Added the interface index as argument to the ifup script to simplify
> integration.
>
>
> A small howto use persistent TUN/TAP devices:
>
> 1. Grab the tunctl tool from UML.
> <url:http://www.user-mode-linux.org/cvs/tools/tunctl/>
> <url:http://www.fifi.org/cgi-bin/man2html/usr/share/man/man1/tunctl.1.gz>
>
> this small tools allows you to create persistent TAP devices with a
> fixed name on the host. A persistent tap device stays until it is
> manually deleted with tunctl.
>
> 2. Configure the host side of the created TAP devices using your normal
> network setup tools, or the network configuration tools provided by your
> distribution vendor if preferred.
>
> 3. When starting qemu, specify the TAP device names with the new
> -tun-dev qemu command line option.
>
> -tun-dev name use this already created tun device
>
> -tun-dev can be specified multiple times if you want qemu to connect to
> more than one device.
>
> Regards
> Henrik
--
Jean-Christian de Rivaz
[-- Attachment #2: tun.patch --]
[-- Type: text/x-patch, Size: 5683 bytes --]
Index: qemu-doc.texi
===================================================================
RCS file: /cvsroot/qemu/qemu/qemu-doc.texi,v
retrieving revision 1.55
diff -u -r1.55 qemu-doc.texi
--- qemu-doc.texi 10 Feb 2005 21:46:47 -0000 1.55
+++ qemu-doc.texi 13 Feb 2005 01:59:04 -0000
@@ -212,6 +212,22 @@
aa:bb:cc:dd:ee:ff in hexa). The mac address is incremented for each
new network interface.
+@item -tun devname
+Try to use @var{devname} while opening a tap/tun host network interface and use
+it. If it work, the network init script is not executed for this
+interface. If it don't work, the interface will use the name assigned
+by the operating system and the network init script is executed.
+
+This option permit the use of preconfigured interface. For example, as
+root you can assign a tun interface to a user and configure it like this:
+@example
+tunctl -u bob -t tun2
+ifconfig tun2 192.168.2.1
+@end example
+Then bob can use this interface with the option "-tun tun2". Note that
+option permit the use of a DHCP server on the host to configure the
+guest interface.
+
@item -tun-fd fd
Assumes @var{fd} talks to a tap/tun host network interface and use
it. Read @url{http://bellard.org/qemu/tetrinet.html} to have an
Index: vl.c
===================================================================
RCS file: /cvsroot/qemu/qemu/vl.c,v
retrieving revision 1.120
diff -u -r1.120 vl.c
--- vl.c 10 Feb 2005 22:00:06 -0000 1.120
+++ vl.c 13 Feb 2005 01:59:05 -0000
@@ -1600,7 +1600,7 @@
}
memset(&ifr, 0, sizeof(ifr));
ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
- pstrcpy(ifr.ifr_name, IFNAMSIZ, "tun%d");
+ pstrcpy(ifr.ifr_name, IFNAMSIZ, (ifname && *ifname) ? ifname : "tun%d");
ret = ioctl(fd, TUNSETIFF, (void *) &ifr);
if (ret != 0) {
fprintf(stderr, "warning: could not configure /dev/net/tun: no virtual network emulation\n");
@@ -1626,7 +1626,7 @@
qemu_add_fd_read_handler(nd->fd, fd_can_read, fd_read, opaque);
}
-static int net_tun_init(NetDriverState *nd)
+static int net_tun_init(NetDriverState *nd, int script)
{
int pid, status;
char *args[3];
@@ -1637,7 +1637,7 @@
return -1;
/* try to launch network init script */
- pid = fork();
+ pid = script ? fork() : -1;
if (pid >= 0) {
if (pid == 0) {
parg = args;
@@ -2731,6 +2731,7 @@
"-nics n simulate 'n' network cards [default=1]\n"
"-macaddr addr set the mac address of the first interface\n"
"-n script set tap/tun network init script [default=%s]\n"
+ "-tun devname try to use devname while opening tap/tun interface\n"
"-tun-fd fd use this fd as already opened tap/tun interface\n"
#ifdef CONFIG_SLIRP
"-user-net use user mode network stack [default if no tap/tun script]\n"
@@ -2819,6 +2820,7 @@
QEMU_OPTION_nics,
QEMU_OPTION_macaddr,
QEMU_OPTION_n,
+ QEMU_OPTION_tun,
QEMU_OPTION_tun_fd,
QEMU_OPTION_user_net,
QEMU_OPTION_tftp,
@@ -2880,6 +2882,7 @@
{ "nics", HAS_ARG, QEMU_OPTION_nics},
{ "macaddr", HAS_ARG, QEMU_OPTION_macaddr},
{ "n", HAS_ARG, QEMU_OPTION_n },
+ { "tun", HAS_ARG, QEMU_OPTION_tun },
{ "tun-fd", HAS_ARG, QEMU_OPTION_tun_fd },
#ifdef CONFIG_SLIRP
{ "user-net", 0, QEMU_OPTION_user_net },
@@ -2990,7 +2993,7 @@
int cyls, heads, secs, translation;
int start_emulation = 1;
uint8_t macaddr[6];
- int net_if_type, nb_tun_fds, tun_fds[MAX_NICS];
+ int net_if_type, nb_tun, nb_tun_fds, cnt_tun_fds, tun_fds[MAX_NICS];
int optind;
const char *r, *optarg;
CharDriverState *monitor_hd;
@@ -3037,7 +3040,12 @@
parallel_devices[i][0] = '\0';
parallel_device_index = 0;
+ for(i = 0; i < MAX_NICS; i++) {
+ nd_table[i].ifname[0] = '\0';
+ }
+ nb_tun = 0;
nb_tun_fds = 0;
+ cnt_tun_fds = 0;
net_if_type = -1;
nb_nics = 1;
/* default mac address of the first network interface */
@@ -3141,18 +3149,25 @@
case QEMU_OPTION_append:
kernel_cmdline = optarg;
break;
+ case QEMU_OPTION_tun:
+ net_if_type = NET_IF_TUN;
+ if (nb_tun+nb_tun_fds < MAX_NICS) {
+ pstrcpy(nd_table[nb_tun++].ifname, IFNAMSIZ, optarg);
+ }
+ break;
case QEMU_OPTION_tun_fd:
{
const char *p;
int fd;
net_if_type = NET_IF_TUN;
- if (nb_tun_fds < MAX_NICS) {
+ if (nb_tun+nb_tun_fds < MAX_NICS) {
fd = strtol(optarg, (char **)&p, 0);
if (*p != '\0') {
fprintf(stderr, "qemu: invalid fd for network interface %d\n", nb_tun_fds);
exit(1);
}
tun_fds[nb_tun_fds++] = fd;
+ nb_tun++;
}
}
break;
@@ -3426,12 +3441,20 @@
#endif
#if !defined(_WIN32)
case NET_IF_TUN:
- if (i < nb_tun_fds) {
- net_fd_init(nd, tun_fds[i]);
- } else {
- if (net_tun_init(nd) < 0)
- net_dummy_init(nd);
- }
+ if (nd->ifname && *(nd->ifname)) {
+ if (net_tun_init(nd, 0) < 0) {
+ nd->ifname[0] = '\0';
+ if (net_tun_init(nd, 1) < 0)
+ net_dummy_init(nd);
+ }
+ } else {
+ if (cnt_tun_fds < nb_tun_fds) {
+ net_fd_init(nd, tun_fds[cnt_tun_fds++]);
+ } else {
+ if (net_tun_init(nd, 1) < 0)
+ net_dummy_init(nd);
+ }
+ }
break;
#endif
case NET_IF_DUMMY:
next prev parent reply other threads:[~2005-04-15 22:46 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-04-15 16:18 [Qemu-devel] [patch] Linux TUN/TAP driver updates Henrik Nordstrom
2005-04-15 20:07 ` [Qemu-devel] Regarding Linux TUN/TAP Hetz Ben Hamo
2005-04-15 20:18 ` Laurent Amon
2005-04-15 22:33 ` Paul Brook
2005-04-18 15:46 ` Henrik Nordstrom
2005-04-15 22:40 ` Jean-Christian de Rivaz [this message]
2005-04-16 7:00 ` [Qemu-devel] [patch] Linux TUN/TAP driver updates emuls
[not found] <1127063858.9233.116.camel@libretto>
2005-09-18 20:55 ` Henrik Nordstrom
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=426042E6.4060404@eclis.ch \
--to=jc@eclis.ch \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).