qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Sasha Levin <levinsasha928@gmail.com>
To: qemu-devel@nongnu.org
Cc: swoop3r@gmx.de, Anthony Liguori <aliguori@us.ibm.com>,
	Sasha Levin <levinsasha928@gmail.com>
Subject: [Qemu-devel] [PATCH v2] tap: Add optional parameters to up/down script
Date: Fri, 30 Sep 2011 12:45:21 +0300	[thread overview]
Message-ID: <1317375921-19336-1-git-send-email-levinsasha928@gmail.com> (raw)

This allows the user to add custom parameters to the up or down
scripts.

Extra parameters are useful in more complex networking scenarios
where we would like to configure network devices when starting
or stopping the guest.

Cc: Anthony Liguori <aliguori@us.ibm.com>
Signed-off-by: Sasha Levin <levinsasha928@gmail.com>
---
 net.c     |    8 ++++++++
 net/tap.c |   45 ++++++++++++++++++++++++++++++++++++---------
 2 files changed, 44 insertions(+), 9 deletions(-)

diff --git a/net.c b/net.c
index d05930c..bb27598 100644
--- a/net.c
+++ b/net.c
@@ -952,10 +952,18 @@ static const struct {
                 .type = QEMU_OPT_STRING,
                 .help = "script to initialize the interface",
             }, {
+                .name = "scriptparams",
+                .type = QEMU_OPT_STRING,
+                .help = "parameters for the initialization script",
+            }, {
                 .name = "downscript",
                 .type = QEMU_OPT_STRING,
                 .help = "script to shut down the interface",
             }, {
+                .name = "downscriptparams",
+                .type = QEMU_OPT_STRING,
+                .help = "parameters for the deinitialization script",
+            }, {
                 .name = "sndbuf",
                 .type = QEMU_OPT_SIZE,
                 .help = "send buffer limit"
diff --git a/net/tap.c b/net/tap.c
index 1f26dc9..f2f1fe5 100644
--- a/net/tap.c
+++ b/net/tap.c
@@ -53,6 +53,7 @@ typedef struct TAPState {
     int fd;
     char down_script[1024];
     char down_script_arg[128];
+    char down_script_params[1024];
     uint8_t buf[TAP_BUFSIZE];
     unsigned int read_poll : 1;
     unsigned int write_poll : 1;
@@ -62,7 +63,8 @@ typedef struct TAPState {
     unsigned host_vnet_hdr_len;
 } TAPState;
 
-static int launch_script(const char *setup_script, const char *ifname, int fd);
+static int launch_script(const char *setup_script, const char *ifname,
+                         const char *params, int fd);
 
 static int tap_can_send(void *opaque);
 static void tap_send(void *opaque);
@@ -287,7 +289,8 @@ static void tap_cleanup(VLANClientState *nc)
     qemu_purge_queued_packets(nc);
 
     if (s->down_script[0])
-        launch_script(s->down_script, s->down_script_arg, s->fd);
+        launch_script(s->down_script, s->down_script_arg,
+                      s->down_script_params, s->fd);
 
     tap_read_poll(s, 0);
     tap_write_poll(s, 0);
@@ -344,11 +347,12 @@ static TAPState *net_tap_fd_init(VLANState *vlan,
     return s;
 }
 
-static int launch_script(const char *setup_script, const char *ifname, int fd)
+static int launch_script(const char *setup_script, const char *ifname,
+                         const char *params, int fd)
 {
     sigset_t oldmask, mask;
     int pid, status;
-    char *args[3];
+    char *args[4];
     char **parg;
 
     sigemptyset(&mask);
@@ -371,6 +375,7 @@ static int launch_script(const char *setup_script, const char *ifname, int fd)
         parg = args;
         *parg++ = (char *)setup_script;
         *parg++ = (char *)ifname;
+        *parg++ = (char *)params;
         *parg = NULL;
         execv(setup_script, args);
         _exit(1);
@@ -392,7 +397,7 @@ static int net_tap_init(QemuOpts *opts, int *vnet_hdr)
 {
     int fd, vnet_hdr_required;
     char ifname[128] = {0,};
-    const char *setup_script;
+    const char *setup_script, *setup_script_params;
 
     if (qemu_opt_get(opts, "ifname")) {
         pstrcpy(ifname, sizeof(ifname), qemu_opt_get(opts, "ifname"));
@@ -411,10 +416,15 @@ static int net_tap_init(QemuOpts *opts, int *vnet_hdr)
     }
 
     setup_script = qemu_opt_get(opts, "script");
+    setup_script_params = qemu_opt_get(opts, "scriptparams");
+    if (setup_script_params == NULL) {
+        setup_script_params = "";
+    }
+
     if (setup_script &&
         setup_script[0] != '\0' &&
         strcmp(setup_script, "no") != 0 &&
-        launch_script(setup_script, ifname, fd)) {
+        launch_script(setup_script, ifname, setup_script_params, fd)) {
         close(fd);
         return -1;
     }
@@ -432,9 +442,12 @@ int net_init_tap(QemuOpts *opts, Monitor *mon, const char *name, VLANState *vlan
     if (qemu_opt_get(opts, "fd")) {
         if (qemu_opt_get(opts, "ifname") ||
             qemu_opt_get(opts, "script") ||
+            qemu_opt_get(opts, "scriptparams") ||
             qemu_opt_get(opts, "downscript") ||
+            qemu_opt_get(opts, "downscriptparams") ||
             qemu_opt_get(opts, "vnet_hdr")) {
-            error_report("ifname=, script=, downscript= and vnet_hdr= is invalid with fd=");
+            error_report("ifname=, script=, downscript=, scriptparams=, "
+                         "downscriptparams= and vnet_hdr= is invalid with fd=");
             return -1;
         }
 
@@ -455,6 +468,14 @@ int net_init_tap(QemuOpts *opts, Monitor *mon, const char *name, VLANState *vlan
             qemu_opt_set(opts, "downscript", DEFAULT_NETWORK_DOWN_SCRIPT);
         }
 
+        if (!qemu_opt_get(opts, "scriptparams")) {
+            qemu_opt_set(opts, "scriptparams", "");
+        }
+
+        if (!qemu_opt_get(opts, "downscriptparams")) {
+            qemu_opt_set(opts, "downscriptparams", "");
+        }
+
         fd = net_tap_init(opts, &vnet_hdr);
         if (fd == -1) {
             return -1;
@@ -475,18 +496,24 @@ int net_init_tap(QemuOpts *opts, Monitor *mon, const char *name, VLANState *vlan
         snprintf(s->nc.info_str, sizeof(s->nc.info_str), "fd=%d", fd);
     } else {
         const char *ifname, *script, *downscript;
+        const char *scriptparams, *downscriptparams;
 
         ifname     = qemu_opt_get(opts, "ifname");
         script     = qemu_opt_get(opts, "script");
         downscript = qemu_opt_get(opts, "downscript");
+        scriptparams = qemu_opt_get(opts, "scriptparams");
+        downscriptparams = qemu_opt_get(opts, "downscriptparams");
 
         snprintf(s->nc.info_str, sizeof(s->nc.info_str),
-                 "ifname=%s,script=%s,downscript=%s",
-                 ifname, script, downscript);
+                 "ifname=%s,script=%s,scriptparams=%s,downscript=%s,"
+                 "downscriptparams=%s", ifname, script, scriptparams,
+                 downscript, downscriptparams);
 
         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);
+            snprintf(s->down_script_params, sizeof(s->down_script_params), "%s",
+                     downscriptparams);
         }
     }
 
-- 
1.7.6.1

             reply	other threads:[~2011-09-30  9:45 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-09-30  9:45 Sasha Levin [this message]
2011-10-06 10:11 ` [Qemu-devel] [PATCH v2] tap: Add optional parameters to up/down script Thomas Jung

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=1317375921-19336-1-git-send-email-levinsasha928@gmail.com \
    --to=levinsasha928@gmail.com \
    --cc=aliguori@us.ibm.com \
    --cc=qemu-devel@nongnu.org \
    --cc=swoop3r@gmx.de \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).