aboutsummaryrefslogtreecommitdiff
path: root/net.c
diff options
context:
space:
mode:
authorMark McLoughlin <markmc@redhat.com>2009-10-22 17:43:36 +0100
committerAnthony Liguori <aliguori@us.ibm.com>2009-10-27 12:29:00 -0500
commit424a7f9674bb801c62b7855a8132d14ef25a36e1 (patch)
tree9f74f32c588de69e09a47bc637837fcff299abf8 /net.c
parent8e0f8e5bf8fd483dd28329055336cf895b74c89f (diff)
net: refactor tap initialization
Re-factor things so that there is only one call site for net_tap_fd_init(). Two concerns about the QemuOpts usage here - firstly, we set the script arguments to their default value and, secondly, we set the ifname value to the name allocated by the kernel if none is supplied. Are we okay with such things ending up in writeconfig output? Signed-off-by: Mark McLoughlin <markmc@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Diffstat (limited to 'net.c')
-rw-r--r--net.c97
1 files changed, 52 insertions, 45 deletions
diff --git a/net.c b/net.c
index f4cf2c549d..8d35b91de5 100644
--- a/net.c
+++ b/net.c
@@ -1490,7 +1490,6 @@ static TAPState *net_tap_fd_init(VLANState *vlan,
tap_receive, tap_receive_iov,
tap_cleanup, s);
tap_read_poll(s, 1);
- snprintf(s->vc->info_str, sizeof(s->vc->info_str), "fd=%d", fd);
return s;
}
@@ -1739,38 +1738,34 @@ static int launch_script(const char *setup_script, const char *ifname, int fd)
return -1;
}
-static TAPState *net_tap_init(VLANState *vlan, const char *model,
- const char *name, const char *ifname1,
- const char *setup_script, const char *down_script)
+static int net_tap_init(QemuOpts *opts, int *vnet_hdr)
{
- TAPState *s;
- int fd, vnet_hdr;
- char ifname[128];
+ int fd;
+ char ifname[128] = {0,};
+ const char *setup_script;
- if (ifname1 != NULL)
- pstrcpy(ifname, sizeof(ifname), ifname1);
- else
- ifname[0] = '\0';
- vnet_hdr = 0;
- TFR(fd = tap_open(ifname, sizeof(ifname), &vnet_hdr));
- if (fd < 0)
- return NULL;
+ if (qemu_opt_get(opts, "ifname")) {
+ pstrcpy(ifname, sizeof(ifname), qemu_opt_get(opts, "ifname"));
+ }
- if (!setup_script || !strcmp(setup_script, "no"))
- setup_script = "";
- if (setup_script[0] != '\0' &&
- launch_script(setup_script, ifname, fd)) {
- return NULL;
+ *vnet_hdr = 0;
+ TFR(fd = tap_open(ifname, sizeof(ifname), vnet_hdr));
+ if (fd < 0) {
+ return -1;
}
- s = net_tap_fd_init(vlan, model, name, fd, vnet_hdr);
- snprintf(s->vc->info_str, sizeof(s->vc->info_str),
- "ifname=%s,script=%s,downscript=%s",
- ifname, setup_script, down_script);
- if (down_script && strcmp(down_script, "no")) {
- snprintf(s->down_script, sizeof(s->down_script), "%s", down_script);
- snprintf(s->down_script_arg, sizeof(s->down_script_arg), "%s", ifname);
+
+ setup_script = qemu_opt_get(opts, "script");
+ if (setup_script &&
+ setup_script[0] != '\0' &&
+ strcmp(setup_script, "no") != 0 &&
+ launch_script(setup_script, ifname, fd)) {
+ close(fd);
+ return -1;
}
- return s;
+
+ qemu_opt_set(opts, "ifname", ifname);
+
+ return fd;
}
#endif /* !_WIN32 */
@@ -2698,10 +2693,9 @@ static int net_init_tap(QemuOpts *opts,
VLANState *vlan)
{
TAPState *s;
+ int fd, vnet_hdr;
if (qemu_opt_get(opts, "fd")) {
- int fd;
-
if (qemu_opt_get(opts, "ifname") ||
qemu_opt_get(opts, "script") ||
qemu_opt_get(opts, "downscript")) {
@@ -2716,28 +2710,22 @@ static int net_init_tap(QemuOpts *opts,
fcntl(fd, F_SETFL, O_NONBLOCK);
- s = net_tap_fd_init(vlan, "tap", name, fd, tap_probe_vnet_hdr(fd));
- if (!s) {
- close(fd);
- }
+ vnet_hdr = tap_probe_vnet_hdr(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 (!qemu_opt_get(opts, "script")) {
+ qemu_opt_set(opts, "script", DEFAULT_NETWORK_SCRIPT);
}
- if (!downscript) {
- downscript = DEFAULT_NETWORK_DOWN_SCRIPT;
+
+ if (!qemu_opt_get(opts, "downscript")) {
+ qemu_opt_set(opts, "downscript", DEFAULT_NETWORK_DOWN_SCRIPT);
}
- s = net_tap_init(vlan, "tap", name, ifname, script, downscript);
+ fd = net_tap_init(opts, &vnet_hdr);
}
+ s = net_tap_fd_init(vlan, "tap", name, fd, vnet_hdr);
if (!s) {
+ close(fd);
return -1;
}
@@ -2745,6 +2733,25 @@ static int net_init_tap(QemuOpts *opts,
return -1;
}
+ if (qemu_opt_get(opts, "fd")) {
+ snprintf(s->vc->info_str, sizeof(s->vc->info_str), "fd=%d", 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");
+
+ snprintf(s->vc->info_str, sizeof(s->vc->info_str),
+ "ifname=%s,script=%s,downscript=%s",
+ ifname, script, downscript);
+
+ if (strcmp(downscript, "no") != 0) {
+ snprintf(s->down_script, sizeof(s->down_script), "%s", downscript);
+ snprintf(s->down_script_arg, sizeof(s->down_script_arg), "%s", ifname);
+ }
+ }
+
if (vlan) {
vlan->nb_host_devs++;
}