diff --git a/net.c b/net.c index 21710b712c4afbeeb93c2093cc589c7914804912..1586c681396f82aa21b1fda12bdeaa62f298a52f 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=' 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 fdeda108844b704ed309797929e331e2e66db2ad..503da332f96a98f93a549dcb8e737bda1747226c 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"