On Sun, 18 Sep 2005, Felix Lechner wrote:
Apparently I have the same desire to use a persistent tap0 device with
qemu like you did in April. I can configure tap0 with tunctl and
standard debian networking, but passing that information to qemu is a
riddle to me.
Attached is my patch relative the current CVS.
This patch adds the -tun-dev command line option
-tun-dev name
specifying the TUN/TAP device name to attach to.
In addition the patch fixes the existing -tun-fd option allowing it to be
specified multiple times if desired.
Your patch never made it into version 7.2 (and it does not apply without
errors anymore) which makes me think there is another way to do it.
No, just not many doing this it seems.
Like everybody else, I also thought about a little program similar to
Russell's tundev that opens the interface and passes the fd via command
line option -tun-fd.
To qemu there is no real difference.
However, without patching the -tun-fd option is limited to a single
interface due to a name collision on the internal qemu device name.
What's the right way to do this?
The current configuration options have quite many shortcomings. There is
discussion about rearranging the networking options making configuration
more sane
- TUN/TAP devices
- TUN/TAP file descriptors
- MAC addresses
- user-net
- etc..
There is a very nice proposal by Fabrice on how he likes the command line
to look like making configuration quite sane and flexible, what remains is
for someone to implement this.
http://lists.gnu.org/archive/html/qemu-devel/2005-08/msg00196.html
Regards
Henrik
Index: qemu-doc.texi
===================================================================
RCS file: /cvsroot/qemu/qemu/qemu-doc.texi,v
retrieving revision 1.65
diff -u -r1.65 qemu-doc.texi
--- qemu-doc.texi 28 Jul 2005 22:27:28 -0000 1.65
+++ qemu-doc.texi 18 Sep 2005 20:46:24 -0000
@@ -227,6 +227,11 @@
it. Read @url{http://bellard.org/qemu/tetrinet.html} to have an
example of its use.
[EMAIL PROTECTED] -tun-dev ifname
+
+Set the host TUN/TAP device name. Useful if you use persistent TUN/TAP
+interfaces or host firewalling based on the device name.
+
@item -user-net
Use the user mode network stack. This is the default if no tun/tap
network init script is found.
Index: vl.c
===================================================================
RCS file: /cvsroot/qemu/qemu/vl.c,v
retrieving revision 1.136
diff -u -r1.136 vl.c
--- vl.c 3 Sep 2005 21:33:43 -0000 1.136
+++ vl.c 18 Sep 2005 20:46:24 -0000
@@ -1663,14 +1663,16 @@
}
memset(&ifr, 0, sizeof(ifr));
ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
- pstrcpy(ifr.ifr_name, IFNAMSIZ, "tun%d");
+ if (*ifname)
+ pstrcpy(ifr.ifr_name, IFNAMSIZ, ifname);
+ else
+ pstrcpy(ifr.ifr_name, IFNAMSIZ, "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");
close(fd);
return -1;
}
- printf("Connected to host network interface: %s\n", ifr.ifr_name);
pstrcpy(ifname, ifname_size, ifr.ifr_name);
fcntl(fd, F_SETFL, O_NONBLOCK);
return fd;
@@ -1692,20 +1694,24 @@
static int net_tun_init(NetDriverState *nd)
{
int pid, status;
- char *args[3];
- char **parg;
nd->fd = tun_open(nd->ifname, sizeof(nd->ifname));
if (nd->fd < 0)
return -1;
+ printf("Network %d connected to host network interface: %s\n", nd->index,
nd->ifname);
/* try to launch network init script */
pid = fork();
if (pid >= 0) {
if (pid == 0) {
+ char ifnum[4];
+ char *args[4];
+ char **parg;
+ snprintf(ifnum, sizeof(ifnum), "%d", nd->index);
parg = args;
*parg++ = network_script;
*parg++ = nd->ifname;
+ *parg++ = ifnum;
*parg++ = NULL;
execv(network_script, args);
exit(1);
@@ -1727,7 +1733,7 @@
nd->fd = fd;
nd->send_packet = tun_send_packet;
nd->add_read_packet = tun_add_read_packet;
- pstrcpy(nd->ifname, sizeof(nd->ifname), "tunfd");
+ snprintf(nd->ifname, sizeof(nd->ifname), "tunfd%d", fd);
return 0;
}
@@ -2852,6 +2858,7 @@
"-macaddr addr set the mac address of the first interface\n"
"-n script set tap/tun network init script [default=%s]\n"
"-tun-fd fd use this fd as already opened tap/tun interface\n"
+ "-tun-dev name use this already created tun device\n"
#ifdef CONFIG_SLIRP
"-user-net use user mode network stack [default if no tap/tun
script]\n"
"-tftp prefix allow tftp access to files starting with prefix
[-user-net]\n"
@@ -2941,6 +2948,7 @@
QEMU_OPTION_macaddr,
QEMU_OPTION_n,
QEMU_OPTION_tun_fd,
+ QEMU_OPTION_tun_dev,
QEMU_OPTION_user_net,
QEMU_OPTION_tftp,
QEMU_OPTION_smb,
@@ -3004,6 +3012,7 @@
{ "macaddr", HAS_ARG, QEMU_OPTION_macaddr},
{ "n", HAS_ARG, QEMU_OPTION_n },
{ "tun-fd", HAS_ARG, QEMU_OPTION_tun_fd },
+ { "tun-dev", HAS_ARG, QEMU_OPTION_tun_dev },
#ifdef CONFIG_SLIRP
{ "user-net", 0, QEMU_OPTION_user_net },
{ "tftp", HAS_ARG, QEMU_OPTION_tftp },
@@ -3136,7 +3145,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_fds, tun_fds[MAX_NICS], nb_tun_devices;
int optind;
const char *r, *optarg;
CharDriverState *monitor_hd;
@@ -3191,6 +3200,7 @@
parallel_device_index = 0;
nb_tun_fds = 0;
+ nb_tun_devices = 0;
net_if_type = -1;
nb_nics = 1;
/* default mac address of the first network interface */
@@ -3326,6 +3336,15 @@
}
tun_fds[nb_tun_fds++] = fd;
}
+ }
+ break;
+ case QEMU_OPTION_tun_dev:
+ {
+ net_if_type = NET_IF_TUN;
+ if (nb_tun_devices < MAX_NICS) {
+ pstrcpy(nd_table[nb_tun_devices].ifname,
sizeof(nd_table[nb_tun_devices].ifname), optarg);
+ nb_tun_devices++;
+ }
}
break;
case QEMU_OPTION_cdrom:
_______________________________________________
Qemu-devel mailing list
Qemu-devel@nongnu.org
http://lists.nongnu.org/mailman/listinfo/qemu-devel