From: Mark McLoughlin <markmc@redhat.com>
To: qemu-devel@nongnu.org
Cc: Mark McLoughlin <markmc@redhat.com>
Subject: [Qemu-devel] [PATCH 16/24] Port -net tap to QemuOpts
Date: Wed, 23 Sep 2009 11:24:15 +0100 [thread overview]
Message-ID: <1253701463-3134-17-git-send-email-markmc@redhat.com> (raw)
In-Reply-To: <1253701463-3134-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 | 225 ++++++++++++++++++++++++++++++++++++++++-------------------------
1 files changed, 138 insertions(+), 87 deletions(-)
diff --git a/net.c b/net.c
index 5cc72b2..468d25c 100644
--- a/net.c
+++ b/net.c
@@ -1376,25 +1376,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");
@@ -2546,6 +2543,92 @@ 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", \
@@ -2663,6 +2746,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 */ }
};
@@ -2705,7 +2833,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);
@@ -2744,84 +2873,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-23 10:26 UTC|newest]
Thread overview: 58+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-09-23 10:23 [Qemu-devel] [PATCH 00/19 v2] Port -net to QemuOpts Mark McLoughlin
2009-09-23 10:24 ` [Qemu-devel] [PATCH 01/24] Use qemu_strdup() for NICInfo string fields Mark McLoughlin
2009-09-23 10:24 ` [Qemu-devel] [PATCH 02/24] Don't assign a static string to NICInfo::model Mark McLoughlin
2009-09-23 10:24 ` [Qemu-devel] [PATCH 03/24] Make NICInfo string fields non-const Mark McLoughlin
2009-09-23 10:24 ` [Qemu-devel] [PATCH 04/24] Correctly free nd structure Mark McLoughlin
2009-09-23 10:24 ` [Qemu-devel] [PATCH 05/24] Use qemu_strdup() for VLANClientState string fields Mark McLoughlin
2009-09-23 10:24 ` [Qemu-devel] [PATCH 06/24] Fix coding style issue Mark McLoughlin
2009-09-23 10:24 ` [Qemu-devel] [PATCH 07/24] Remove bogus error message from qemu_opts_set() Mark McLoughlin
2009-09-23 10:24 ` [Qemu-devel] [PATCH 08/24] Remove double error message in qemu_option_set() Mark McLoughlin
2009-09-23 10:24 ` [Qemu-devel] [PATCH 09/24] Remove double error message for -device option parsing Mark McLoughlin
2009-09-23 10:24 ` [Qemu-devel] [PATCH 10/24] Make qemu_opts_parse() handle empty strings Mark McLoughlin
2009-09-23 10:24 ` [Qemu-devel] [PATCH 11/24] Add qemu_opts_validate() for post parsing validation Mark McLoughlin
2009-09-23 10:24 ` [Qemu-devel] [PATCH 12/24] Never overwrite a QemuOpt Mark McLoughlin
2009-09-23 10:24 ` [Qemu-devel] [PATCH 13/24] Add qemu_net_opts Mark McLoughlin
2009-09-23 10:24 ` [Qemu-devel] [PATCH 14/24] Port -net none and -net nic to QemuOpts Mark McLoughlin
2009-09-23 10:24 ` [Qemu-devel] [PATCH 15/24] Port -net user " Mark McLoughlin
2009-09-23 10:24 ` Mark McLoughlin [this message]
2009-09-30 19:41 ` [Qemu-devel] [PATCH 16/24] Port -net tap " Anthony Liguori
2009-10-01 6:43 ` Mark McLoughlin
2009-09-23 10:24 ` [Qemu-devel] [PATCH 17/24] Port -net socket " Mark McLoughlin
2009-09-23 10:24 ` [Qemu-devel] [PATCH 18/24] Port -net vde " Mark McLoughlin
2009-09-23 10:24 ` [Qemu-devel] [PATCH 19/24] Port -net dump " Mark McLoughlin
2009-09-23 10:24 ` [Qemu-devel] [PATCH 20/24] Clean up legacy code in net_client_init() Mark McLoughlin
2009-09-23 10:24 ` [Qemu-devel] [PATCH 21/24] Port host_net_add monitor command to QemuOpts Mark McLoughlin
2009-09-23 10:24 ` [Qemu-devel] [PATCH 22/24] Port usb net " Mark McLoughlin
2009-09-23 10:24 ` [Qemu-devel] [PATCH 23/24] Port PCI NIC hotplug " Mark McLoughlin
2009-09-23 10:24 ` [Qemu-devel] [PATCH 24/24] Final net cleanup after conversion " Mark McLoughlin
2009-09-23 15:58 ` [Qemu-devel] [PATCH 00/19 v2] Port -net " Mark McLoughlin
2009-09-30 10:33 ` Mark McLoughlin
2009-10-06 11:16 ` [Qemu-devel] [PATCH 00/19 v3] " Mark McLoughlin
2009-10-06 11:16 ` [Qemu-devel] [PATCH] Register rtc options for -set Mark McLoughlin
2009-10-06 11:16 ` [Qemu-devel] [PATCH] Use qemu_strdup() for NICInfo string fields Mark McLoughlin
2009-10-06 11:16 ` [Qemu-devel] [PATCH] Don't assign a static string to NICInfo::model Mark McLoughlin
2009-10-06 11:16 ` [Qemu-devel] [PATCH] Make NICInfo string fields non-const Mark McLoughlin
2009-10-06 19:19 ` Anthony Liguori
2009-10-06 11:16 ` [Qemu-devel] [PATCH] Move memset() from net_client_uninit() to net_client_init() Mark McLoughlin
2009-10-06 11:16 ` [Qemu-devel] [PATCH] Use qemu_strdup() for VLANClientState string fields Mark McLoughlin
2009-10-06 11:16 ` [Qemu-devel] [PATCH] Make net_client_init() consume slirp_configs even on error Mark McLoughlin
2009-10-06 11:16 ` [Qemu-devel] [PATCH] Don't exit() in config_error() Mark McLoughlin
2009-10-06 11:16 ` [Qemu-devel] [PATCH] Drop config_error(), use qemu_error() instead Mark McLoughlin
2009-10-06 11:16 ` [Qemu-devel] [PATCH] Remove bogus error message from qemu_opts_set() Mark McLoughlin
2009-10-06 11:17 ` [Qemu-devel] [PATCH] Remove double error message in qemu_option_set() Mark McLoughlin
2009-10-06 11:17 ` [Qemu-devel] [PATCH] Remove double error message for -device option parsing Mark McLoughlin
2009-10-06 11:17 ` [Qemu-devel] [PATCH] Make qemu_opts_parse() handle empty strings Mark McLoughlin
2009-10-06 11:17 ` [Qemu-devel] [PATCH] Add qemu_opts_validate() for post parsing validation Mark McLoughlin
2009-10-06 11:17 ` [Qemu-devel] [PATCH] Never overwrite a QemuOpt Mark McLoughlin
2009-10-06 11:17 ` [Qemu-devel] [PATCH] Add qemu_net_opts Mark McLoughlin
2009-10-06 11:17 ` [Qemu-devel] [PATCH] Port -net none and -net nic to QemuOpts Mark McLoughlin
2009-10-06 11:17 ` [Qemu-devel] [PATCH] Port -net user " Mark McLoughlin
2009-10-06 11:17 ` [Qemu-devel] [PATCH] Port -net tap " Mark McLoughlin
2009-10-06 11:17 ` [Qemu-devel] [PATCH] Port -net socket " Mark McLoughlin
2009-10-06 11:17 ` [Qemu-devel] [PATCH] Port -net vde " Mark McLoughlin
2009-10-06 11:17 ` [Qemu-devel] [PATCH] Port -net dump " Mark McLoughlin
2009-10-06 11:17 ` [Qemu-devel] [PATCH] Clean up legacy code in net_client_init() Mark McLoughlin
2009-10-06 11:17 ` [Qemu-devel] [PATCH] Port host_net_add monitor command to QemuOpts Mark McLoughlin
2009-10-06 11:17 ` [Qemu-devel] [PATCH] Port usb net " Mark McLoughlin
2009-10-06 11:17 ` [Qemu-devel] [PATCH] Port PCI NIC hotplug " Mark McLoughlin
2009-10-06 11:17 ` [Qemu-devel] [PATCH] Final net cleanup after conversion " 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=1253701463-3134-17-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.