From 0df0ff6de70393680cea81ad696d9d74b75f88da Mon Sep 17 00:00:00 2001
From: Mark McLoughlin <markmc@redhat.com>
Date: Thu, 18 Jun 2009 18:21:34 +0100
Subject: [PATCH] net: add '-net tap,sndbuf=nbytes'

---
 net.c           | 26 ++++++++++++++++++++++----
 qemu-options.hx |  9 ++++++++-
 2 files changed, 30 insertions(+), 5 deletions(-)

diff --git a/net.c b/net.c
index 21710b7..1586c68 100644
--- a/net.c
+++ b/net.c
@@ -1162,6 +1162,18 @@ static void tap_send(void *opaque)
     } while (size > 0);
 }
 
+static void tap_set_sndbuf(TAPState *s, int sndbuf, Monitor *mon)
+{
+#ifdef TUNSETSNDBUF
+    if (ioctl(s->fd, TUNSETSNDBUF, &sndbuf) == -1) {
+        config_error(mon, "TUNSETSNDBUF ioctl failed: %s\n",
+                     strerror(errno));
+    }
+#else
+    config_error(mon, "No '-net tap,sndbuf=<nbytes>' support available\n");
+#endif
+}
+
 static void tap_cleanup(VLANClientState *vc)
 {
     TAPState *s = vc->opaque;
@@ -2141,9 +2153,6 @@ void qemu_check_nic_model_list(NICInfo *nd, const char * const *models,
 
 int net_client_init(Monitor *mon, const char *device, const char *p)
 {
-    static const char * const fd_params[] = {
-        "vlan", "name", "fd", NULL
-    };
     char buf[1024];
     int vlan_id, ret;
     VLANState *vlan;
@@ -2298,6 +2307,9 @@ int net_client_init(Monitor *mon, const char *device, const char *p)
         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
+            };
             if (check_params(chkbuf, sizeof(chkbuf), fd_params, p) < 0) {
                 config_error(mon, "invalid parameter '%s' in '%s'\n", chkbuf, p);
                 ret = -1;
@@ -2308,7 +2320,7 @@ int net_client_init(Monitor *mon, const char *device, const char *p)
             s = net_tap_fd_init(vlan, device, name, fd);
         } else {
             static const char * const tap_params[] = {
-                "vlan", "name", "ifname", "script", "downscript", NULL
+                "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);
@@ -2327,6 +2339,9 @@ int net_client_init(Monitor *mon, const char *device, const char *p)
             s = net_tap_init(vlan, device, name, ifname, setup_script, down_script);
         }
         if (s != NULL) {
+            if (get_param_value(buf, sizeof(buf), "sndbuf", p)) {
+                tap_set_sndbuf(s, atoi(buf), mon);
+            }
             ret = 0;
         } else {
             ret = -1;
@@ -2336,6 +2351,9 @@ int net_client_init(Monitor *mon, const char *device, const char *p)
     if (!strcmp(device, "socket")) {
         char chkbuf[64];
         if (get_param_value(buf, sizeof(buf), "fd", p) > 0) {
+            static const char * const fd_params[] = {
+                "vlan", "name", "fd", NULL
+            };
             int fd;
             if (check_params(chkbuf, sizeof(chkbuf), fd_params, p) < 0) {
                 config_error(mon, "invalid parameter '%s' in '%s'\n", chkbuf, p);
diff --git a/qemu-options.hx b/qemu-options.hx
index fdeda10..503da33 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -747,12 +747,19 @@ 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]\n"
+    "-net tap[,vlan=n][,name=str][,fd=h][,ifname=name][,script=file][,downscript=dfile]"
+#ifdef TUNSETSNDBUF
+    "[,sndbuf=nbytes]"
+#endif
+    "\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"
     "                use '[down]script=no' to disable script execution;\n"
     "                use 'fd=h' to connect to an already opened TAP interface\n"
+#ifdef TUNSETSNDBUF
+    "                use 'sndbuf=nbytes' to limit the size of the send buffer\n"
+#endif
 #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"
--
libgit2 0.23.3