qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
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:

  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).