From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1D09uF-0004gQ-01 for qemu-devel@nongnu.org; Sat, 12 Feb 2005 21:54:43 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1D09u5-0004dS-Am for qemu-devel@nongnu.org; Sat, 12 Feb 2005 21:54:35 -0500 Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1D09u2-0004Yw-L4 for qemu-devel@nongnu.org; Sat, 12 Feb 2005 21:54:30 -0500 Received: from [144.85.15.72] (helo=mail.eclis.ch) by monty-python.gnu.org with esmtp (Exim 4.34) id 1D09Hr-0006e9-Sx for qemu-devel@nongnu.org; Sat, 12 Feb 2005 21:15:04 -0500 Message-ID: <420EB824.1040407@eclis.ch> Date: Sun, 13 Feb 2005 03:15:00 +0100 From: Jean-Christian de Rivaz MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------050509090109020405090206" Subject: [Qemu-devel] [PATCH] Add -tun option for preconfigured interface Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org This is a multi-part message in MIME format. --------------050509090109020405090206 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit I like that the root on the host OS can assign TUN interface to users and that the root configure it. So the user only use the new -tun option to use the preconfigured TUN interface without the need to execute a trick and unsecure script. Here is the added desciption: ---------------------------------------------------------------------- -tun devname Try to use 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: tunctl -u bob -t tun2 ifconfig tun2 192.168.2.1 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. ---------------------------------------------------------------------- I have also patched the qemu-doc.html but cvs diff don't work with it. I have tryed to be compatible with the -tun-fd option, but this is untested. Also the tun_open() function for BSD system will probably not handle this case as expected. -- Jean-Christian de Rivaz --------------050509090109020405090206 Content-Type: text/x-patch; name="tun.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="tun.patch" 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: --------------050509090109020405090206--