From: Mark McLoughlin <markmc@redhat.com>
To: qemu-devel@nongnu.org
Cc: Mark McLoughlin <markmc@redhat.com>
Subject: [Qemu-devel] [PATCH 11/19] Port -net tap to QemuOpts
Date: Thu, 10 Sep 2009 16:18:53 +0100 [thread overview]
Message-ID: <1252595941-15196-12-git-send-email-markmc@redhat.com> (raw)
In-Reply-To: <1252595941-15196-1-git-send-email-markmc@redhat.com>
Some parameters are not valid with fd=. Rather than having a separate
parameter description table for validating fd=, it's easir to just
check for those invalid parameters later.
Note, the need to possible lookup a file descriptor name from the
monitor is the reason why all these init functions are passed a Monitor
pointer.
Signed-off-by: Mark McLoughlin <markmc@redhat.com>
---
net.c | 219 +++++++++++++++++++++++++++++++++++++++--------------------------
1 files changed, 132 insertions(+), 87 deletions(-)
diff --git a/net.c b/net.c
index aa5a677..55792a5 100644
--- a/net.c
+++ b/net.c
@@ -1377,25 +1377,22 @@ static void tap_send(void *opaque)
*/
#define TAP_DEFAULT_SNDBUF 1024*1024
-static void tap_set_sndbuf(TAPState *s, const char *sndbuf_str, Monitor *mon)
+static void tap_set_sndbuf(TAPState *s, QemuOpts *opts, Monitor *mon)
{
- int sndbuf = TAP_DEFAULT_SNDBUF;
-
- if (sndbuf_str) {
- sndbuf = atoi(sndbuf_str);
- }
+ int sndbuf;
+ sndbuf = qemu_opt_get_size(opts, "sndbuf", TAP_DEFAULT_SNDBUF);
if (!sndbuf) {
sndbuf = INT_MAX;
}
- if (ioctl(s->fd, TUNSETSNDBUF, &sndbuf) == -1 && sndbuf_str) {
+ if (ioctl(s->fd, TUNSETSNDBUF, &sndbuf) == -1 && qemu_opt_get(opts, "sndbuf")) {
config_error(mon, "TUNSETSNDBUF ioctl failed: %s\n",
strerror(errno));
}
}
#else
-static void tap_set_sndbuf(TAPState *s, const char *sndbuf_str, Monitor *mon)
+static void tap_set_sndbuf(TAPState *s, QemuOpts *opts, Monitor *mon)
{
if (sndbuf_str) {
config_error(mon, "No '-net tap,sndbuf=<nbytes>' support available\n");
@@ -2534,6 +2531,86 @@ static int net_init_slirp(QemuOpts *opts, Monitor *mon)
return ret;
}
+#ifdef _WIN32
+static int net_init_tap_win32(QemuOpts *opts, Monitor *mon)
+{
+ VLANState *vlan;
+ const char *name;
+ const char *ifname;
+
+ vlan = qemu_find_vlan(qemu_opt_get_number(opts, "vlan", 0), 1);
+
+ name = qemu_opt_get(opts, "name");
+ ifname = qemu_opt_get(opts, "ifname");
+
+ if (!ifname) {
+ qemu_error("tap: no interface name\n");
+ return -1;
+ }
+
+ if (tap_win32_init(vlan, "tap", name, ifname) == -1)
+ return -1;
+
+ vlan->nb_host_devs++;
+
+ return 0;
+}
+#elif !defined(_AIX)
+static int net_init_tap(QemuOpts *opts, Monitor *mon)
+{
+ VLANState *vlan;
+ const char *name;
+ TAPState *s;
+
+ vlan = qemu_find_vlan(qemu_opt_get_number(opts, "vlan", 0), 1);
+
+ name = qemu_opt_get(opts, "name");
+
+ if (qemu_opt_get(opts, "fd")) {
+ int 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");
+ return -1;
+ }
+
+ fd = net_handle_fd_param(mon, qemu_opt_get(opts, "fd"));
+ if (fd == -1)
+ return -1;
+
+ fcntl(fd, F_SETFL, O_NONBLOCK);
+
+ s = net_tap_fd_init(vlan, "tap", name, fd);
+ if (!s)
+ close(fd);
+ } else {
+ const char *ifname, *script, *downscript;
+
+ ifname = qemu_opt_get(opts, "ifname");
+ script = qemu_opt_get(opts, "script");
+ downscript = qemu_opt_get(opts, "downscript");
+
+ if (!script)
+ script = DEFAULT_NETWORK_SCRIPT;
+ if (!downscript)
+ downscript = DEFAULT_NETWORK_DOWN_SCRIPT;
+
+ s = net_tap_init(vlan, "tap", name, ifname, script, downscript);
+ }
+
+ if (!s)
+ return -1;
+
+ tap_set_sndbuf(s, opts, mon);
+
+ vlan->nb_host_devs++;
+
+ return 0;
+}
+#endif
+
#define NET_COMMON_PARAMS_DESC \
{ \
.name = "type", \
@@ -2651,6 +2728,51 @@ static struct {
{ /* end of list */ }
},
#endif
+#ifdef _WIN32
+ }, {
+ .type = "tap",
+ .init = net_init_tap_win32,
+ .desc = {
+ NET_COMMON_PARAMS_DESC,
+ {
+ .name = "ifname",
+ .type = QEMU_OPT_STRING,
+ .help = "interface name",
+ },
+ { /* end of list */ }
+ },
+#elif !defined(_AIX)
+ }, {
+ .type = "tap",
+ .init = net_init_tap,
+ .desc = {
+ NET_COMMON_PARAMS_DESC,
+ {
+ .name = "fd",
+ .type = QEMU_OPT_STRING,
+ .help = "file descriptor of an already opened tap",
+ }, {
+ .name = "ifname",
+ .type = QEMU_OPT_STRING,
+ .help = "interface name",
+ }, {
+ .name = "script",
+ .type = QEMU_OPT_STRING,
+ .help = "script to initialize the interface",
+ }, {
+ .name = "downscript",
+ .type = QEMU_OPT_STRING,
+ .help = "script to shut down the interface",
+#ifdef TUNSETSNDBUF
+ }, {
+ .name = "sndbuf",
+ .type = QEMU_OPT_SIZE,
+ .help = "send buffer limit"
+#endif
+ },
+ { /* end of list */ }
+ },
+#endif
},
{ /* end of list */ }
};
@@ -2691,7 +2813,8 @@ int net_client_init(Monitor *mon, const char *device, const char *p)
if (!strcmp(device, "none") ||
!strcmp(device, "nic") ||
- !strcmp(device, "user")) {
+ !strcmp(device, "user") ||
+ !strcmp(device, "tap")) {
QemuOpts *opts;
opts = qemu_opts_parse(&qemu_net_opts, p, NULL);
@@ -2729,84 +2852,6 @@ int net_client_init(Monitor *mon, const char *device, const char *p)
ret = 0;
} else
#endif
-#ifdef _WIN32
- if (!strcmp(device, "tap")) {
- static const char * const tap_params[] = {
- "vlan", "name", "ifname", NULL
- };
- char ifname[64];
-
- if (check_params(buf, sizeof(buf), tap_params, p) < 0) {
- config_error(mon, "invalid parameter '%s' in '%s'\n", buf, p);
- ret = -1;
- goto out;
- }
- if (get_param_value(ifname, sizeof(ifname), "ifname", p) <= 0) {
- config_error(mon, "tap: no interface name\n");
- ret = -1;
- goto out;
- }
- vlan->nb_host_devs++;
- ret = tap_win32_init(vlan, device, name, ifname);
- } else
-#elif defined (_AIX)
-#else
- if (!strcmp(device, "tap")) {
- char ifname[64], chkbuf[64];
- char setup_script[1024], down_script[1024];
- TAPState *s;
- int fd;
- vlan->nb_host_devs++;
- if (get_param_value(buf, sizeof(buf), "fd", p) > 0) {
- static const char * const fd_params[] = {
- "vlan", "name", "fd", "sndbuf", NULL
- };
- ret = -1;
- if (check_params(chkbuf, sizeof(chkbuf), fd_params, p) < 0) {
- config_error(mon, "invalid parameter '%s' in '%s'\n", chkbuf, p);
- goto out;
- }
- fd = net_handle_fd_param(mon, buf);
- if (fd == -1) {
- goto out;
- }
- fcntl(fd, F_SETFL, O_NONBLOCK);
- s = net_tap_fd_init(vlan, device, name, fd);
- if (!s) {
- close(fd);
- }
- } else {
- static const char * const tap_params[] = {
- "vlan", "name", "ifname", "script", "downscript", "sndbuf", NULL
- };
- if (check_params(chkbuf, sizeof(chkbuf), tap_params, p) < 0) {
- config_error(mon, "invalid parameter '%s' in '%s'\n", chkbuf, p);
- ret = -1;
- goto out;
- }
- if (get_param_value(ifname, sizeof(ifname), "ifname", p) <= 0) {
- ifname[0] = '\0';
- }
- if (get_param_value(setup_script, sizeof(setup_script), "script", p) == 0) {
- pstrcpy(setup_script, sizeof(setup_script), DEFAULT_NETWORK_SCRIPT);
- }
- if (get_param_value(down_script, sizeof(down_script), "downscript", p) == 0) {
- pstrcpy(down_script, sizeof(down_script), DEFAULT_NETWORK_DOWN_SCRIPT);
- }
- s = net_tap_init(vlan, device, name, ifname, setup_script, down_script);
- }
- if (s != NULL) {
- const char *sndbuf_str = NULL;
- if (get_param_value(buf, sizeof(buf), "sndbuf", p)) {
- sndbuf_str = buf;
- }
- tap_set_sndbuf(s, sndbuf_str, mon);
- ret = 0;
- } else {
- ret = -1;
- }
- } else
-#endif
if (!strcmp(device, "socket")) {
char chkbuf[64];
if (get_param_value(buf, sizeof(buf), "fd", p) > 0) {
--
1.6.2.5
next prev parent reply other threads:[~2009-09-10 15:20 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-09-10 15:18 [Qemu-devel] [PATCH 00/19] Port -net to QemuOpts Mark McLoughlin
2009-09-10 15:18 ` [Qemu-devel] [PATCH 01/19] Suppress more more kraxelisms Mark McLoughlin
2009-09-10 18:02 ` Michael S. Tsirkin
2009-09-10 15:18 ` [Qemu-devel] [PATCH 02/19] Remove bogus error message from qemu_opts_set() Mark McLoughlin
2009-09-10 18:01 ` Michael S. Tsirkin
2009-09-10 15:18 ` [Qemu-devel] [PATCH 03/19] Remove double error message in qemu_option_set() Mark McLoughlin
2009-09-10 18:03 ` Michael S. Tsirkin
2009-09-10 18:36 ` braces [was Re: [Qemu-devel] [PATCH 03/19] Remove double error message in qemu_option_set()] Mark McLoughlin
2009-09-11 5:01 ` Michael S. Tsirkin
2009-09-11 5:50 ` Amit Shah
2009-09-10 15:18 ` [Qemu-devel] [PATCH 04/19] Remove double error message for -device option parsing Mark McLoughlin
[not found] ` <m38wgmhin3.fsf@neno.mitica>
2009-09-10 18:10 ` [Qemu-devel] " Mark McLoughlin
2009-09-10 15:18 ` [Qemu-devel] [PATCH 05/19] Make qemu_opts_parse() handle empty strings Mark McLoughlin
2009-09-10 15:18 ` [Qemu-devel] [PATCH 06/19] Add qemu_opts_validate() for post parsing validation Mark McLoughlin
2009-09-11 7:47 ` Gerd Hoffmann
2009-09-11 12:38 ` Mark McLoughlin
2009-09-11 13:51 ` Gerd Hoffmann
2009-09-10 15:18 ` [Qemu-devel] [PATCH 07/19] Never overwrite a QemuOpt Mark McLoughlin
2009-09-11 7:51 ` Gerd Hoffmann
2009-09-10 15:18 ` [Qemu-devel] [PATCH 08/19] Add qemu_net_opts Mark McLoughlin
2009-09-10 15:18 ` [Qemu-devel] [PATCH 09/19] Port -net none and -net nic to QemuOpts Mark McLoughlin
2009-09-11 7:57 ` Gerd Hoffmann
2009-09-11 12:39 ` Mark McLoughlin
2009-09-10 15:18 ` [Qemu-devel] [PATCH 10/19] Port -net user " Mark McLoughlin
2009-09-10 15:18 ` Mark McLoughlin [this message]
2009-09-10 15:18 ` [Qemu-devel] [PATCH 12/19] Port -net socket " Mark McLoughlin
2009-09-10 15:18 ` [Qemu-devel] [PATCH 13/19] Port -net vde " Mark McLoughlin
2009-09-10 15:18 ` [Qemu-devel] [PATCH 14/19] Port -net dump " Mark McLoughlin
2009-09-10 15:18 ` [Qemu-devel] [PATCH 15/19] Clean up legacy code in net_client_init() Mark McLoughlin
2009-09-10 15:18 ` [Qemu-devel] [PATCH 16/19] Port host_net_add monitor command to QemuOpts Mark McLoughlin
2009-09-10 15:18 ` [Qemu-devel] [PATCH 17/19] Port usb net " Mark McLoughlin
2009-09-10 15:19 ` [Qemu-devel] [PATCH 18/19] Port PCI NIC hotplug " Mark McLoughlin
2009-09-10 15:19 ` [Qemu-devel] [PATCH 19/19] Final net cleanup after conversion " Mark McLoughlin
2009-09-18 12:08 ` [Qemu-devel] [PATCH 00/19] Port -net " Mark McLoughlin
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=1252595941-15196-12-git-send-email-markmc@redhat.com \
--to=markmc@redhat.com \
--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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.