[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 06/19] net: add a vnet_hdr=on|off parameter
From: |
Mark McLoughlin |
Subject: |
[Qemu-devel] [PATCH 06/19] net: add a vnet_hdr=on|off parameter |
Date: |
Wed, 21 Oct 2009 12:27:45 +0100 |
This allows people to disable the IFF_VNET_HDR flag, e.g. for debugging
purposes or if they know they may migrate the guest to a machine without
IFF_VNET_HDR support.
It also allows making the lack of IFF_VNET_HDR support an error
condition, e.g. in the case where a guest is being migrated from a host
which does support it.
Signed-off-by: Mark McLoughlin <address@hidden>
---
net.c | 42 ++++++++++++++++++++++++++++++++----------
qemu-options.hx | 4 +++-
2 files changed, 35 insertions(+), 11 deletions(-)
diff --git a/net.c b/net.c
index fccabdb..d62ab7b 100644
--- a/net.c
+++ b/net.c
@@ -1479,7 +1479,8 @@ static TAPState *net_tap_fd_init(VLANState *vlan,
}
#if defined (CONFIG_BSD) || defined (__FreeBSD_kernel__)
-static int tap_open(char *ifname, int ifname_size, int *vnet_hdr)
+static int tap_open(char *ifname, int ifname_size,
+ int *vnet_hdr, int vnet_hdr_required)
{
int fd;
char *dev;
@@ -1621,7 +1622,8 @@ static int tap_alloc(char *dev, size_t dev_size)
return tap_fd;
}
-static int tap_open(char *ifname, int ifname_size, int *vnet_hdr)
+static int tap_open(char *ifname, int ifname_size,
+ int *vnet_hdr, int vnet_hdr_required)
{
char dev[10]="";
int fd;
@@ -1634,13 +1636,15 @@ static int tap_open(char *ifname, int ifname_size, int
*vnet_hdr)
return fd;
}
#elif defined (_AIX)
-static int tap_open(char *ifname, int ifname_size, int *vnet_hdr)
+static int tap_open(char *ifname, int ifname_size,
+ int *vnet_hdr, int vnet_hdr_required)
{
fprintf (stderr, "no tap on AIX\n");
return -1;
}
#else
-static int tap_open(char *ifname, int ifname_size, int *vnet_hdr)
+static int tap_open(char *ifname, int ifname_size,
+ int *vnet_hdr, int vnet_hdr_required)
{
struct ifreq ifr;
int fd, ret;
@@ -1653,7 +1657,7 @@ static int tap_open(char *ifname, int ifname_size, int
*vnet_hdr)
memset(&ifr, 0, sizeof(ifr));
ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
- {
+ if (*vnet_hdr) {
unsigned int features;
if (ioctl(fd, TUNGETFEATURES, &features) == 0 &&
@@ -1661,6 +1665,13 @@ static int tap_open(char *ifname, int ifname_size, int
*vnet_hdr)
*vnet_hdr = 1;
ifr.ifr_flags |= IFF_VNET_HDR;
}
+
+ if (vnet_hdr_required && !*vnet_hdr) {
+ qemu_error("vnet_hdr=1 requested, but no kernel "
+ "support for IFF_VNET_HDR available");
+ close(fd);
+ return -1;
+ }
}
if (ifname[0] != '\0')
@@ -1725,7 +1736,7 @@ static int launch_script(const char *setup_script, const
char *ifname, int fd)
static int net_tap_init(QemuOpts *opts, int *vnet_hdr)
{
- int fd;
+ int fd, vnet_hdr_required;
char ifname[128] = {0,};
const char *setup_script;
@@ -1733,8 +1744,14 @@ static int net_tap_init(QemuOpts *opts, int *vnet_hdr)
pstrcpy(ifname, sizeof(ifname), qemu_opt_get(opts, "ifname"));
}
- *vnet_hdr = 0;
- TFR(fd = tap_open(ifname, sizeof(ifname), vnet_hdr));
+ *vnet_hdr = qemu_opt_get_bool(opts, "vnet_hdr", 1);
+ if (qemu_opt_get(opts, "vnet_hdr")) {
+ vnet_hdr_required = *vnet_hdr;
+ } else {
+ vnet_hdr_required = 0;
+ }
+
+ TFR(fd = tap_open(ifname, sizeof(ifname), vnet_hdr, vnet_hdr_required));
if (fd < 0) {
return -1;
}
@@ -2683,8 +2700,9 @@ static int net_init_tap(QemuOpts *opts,
if (qemu_opt_get(opts, "fd")) {
if (qemu_opt_get(opts, "ifname") ||
qemu_opt_get(opts, "script") ||
- qemu_opt_get(opts, "downscript")) {
- qemu_error("ifname=, script= and downscript= is invalid with
fd=\n");
+ qemu_opt_get(opts, "downscript") ||
+ qemu_opt_get(opts, "vnet_hdr")) {
+ qemu_error("ifname=, script=, downscript= and vnet_hdr= is invalid
with fd=\n");
return -1;
}
@@ -3040,6 +3058,10 @@ static struct {
.name = "sndbuf",
.type = QEMU_OPT_SIZE,
.help = "send buffer limit"
+ }, {
+ .name = "vnet_hdr",
+ .type = QEMU_OPT_BOOL,
+ .help = "enable the IFF_VNET_HDR flag on the tap interface"
},
{ /* end of list */ }
},
diff --git a/qemu-options.hx b/qemu-options.hx
index c745e0c..d78b738 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -810,7 +810,7 @@ DEF("net", HAS_ARG, QEMU_OPTION_net,
"-net tap[,vlan=n][,name=str],ifname=name\n"
" connect the host TAP network interface to VLAN 'n'\n"
#else
- "-net
tap[,vlan=n][,name=str][,fd=h][,ifname=name][,script=file][,downscript=dfile][,sndbuf=nbytes]\n"
+ "-net
tap[,vlan=n][,name=str][,fd=h][,ifname=name][,script=file][,downscript=dfile][,sndbuf=nbytes][,vnet_hdr=on|off]\n"
" connect the host TAP network interface to VLAN 'n' and
use the\n"
" network scripts 'file' (default=%s)\n"
" and 'dfile' (default=%s);\n"
@@ -818,6 +818,8 @@ DEF("net", HAS_ARG, QEMU_OPTION_net,
" use 'fd=h' to connect to an already opened TAP
interface\n"
" use 'sndbuf=nbytes' to limit the size of the send buffer;
the\n"
" default of 'sndbuf=1048576' can be disabled using
'sndbuf=0'\n"
+ " use vnet_hdr=off to avoid enabling the IFF_VNET_HDR tap
flag; use\n"
+ " vnet_hdr=on to make the lack of IFF_VNET_HDR support an
error condition\n"
#endif
"-net
socket[,vlan=n][,name=str][,fd=h][,listen=[host]:port][,connect=host:port]\n"
" connect the vlan 'n' to another VLAN using a socket
connection\n"
--
1.6.2.5
- [Qemu-devel] [PATCH 00/19], Mark McLoughlin, 2009/10/21
- [Qemu-devel] [PATCH 03/19] net: make tap_receive() re-use tap_receive_iov() code, Mark McLoughlin, 2009/10/21
- [Qemu-devel] [PATCH 01/19] net: remove unused includes of if_tun.h and if_tap.h, Mark McLoughlin, 2009/10/21
- [Qemu-devel] [PATCH 08/19] net: add tap_has_vnet_hdr() and tap_using_vnet_hdr() APIs, Mark McLoughlin, 2009/10/21
- [Qemu-devel] [PATCH 04/19] net: enable IFF_VNET_HDR on tap fds if available, Mark McLoughlin, 2009/10/21
- [Qemu-devel] [PATCH 02/19] net: import linux tap ioctl definitions, Mark McLoughlin, 2009/10/21
- [Qemu-devel] [PATCH 06/19] net: add a vnet_hdr=on|off parameter,
Mark McLoughlin <=
- [Qemu-devel] [PATCH 07/19] net: add a client type code, Mark McLoughlin, 2009/10/21
- [Qemu-devel] [PATCH 13/19] net: implement tap support for receive_raw(), Mark McLoughlin, 2009/10/21
- [Qemu-devel] [PATCH 05/19] net: refactor tap initialization, Mark McLoughlin, 2009/10/21
- [Qemu-devel] [PATCH 15/19] net: add tap_set_offload(), Mark McLoughlin, 2009/10/21
- [Qemu-devel] [PATCH 14/19] virtio-net: add vnet_hdr support, Mark McLoughlin, 2009/10/21
- [Qemu-devel] [PATCH 19/19] virtio-net: add tap_has_ufo flag to saved state, Mark McLoughlin, 2009/10/21
- [Qemu-devel] [PATCH 10/19] net: add an API for 'raw' packets, Mark McLoughlin, 2009/10/21
- [Qemu-devel] [PATCH 09/19] net: add flags parameter to packet queue interface, Mark McLoughlin, 2009/10/21
- [Qemu-devel] [PATCH 12/19] net: use qemu_send_packet_raw() in qemu_announce_self(), Mark McLoughlin, 2009/10/21
- [Qemu-devel] [PATCH 16/19] virtio-net: enable tap offload if guest supports it, Mark McLoughlin, 2009/10/21