diff --git a/net.c b/net.c index 001ebcbc845c0eebed43331514d056402b963591..49f4016cf857077e798b91e306a037f44d24f6b2 100644 --- a/net.c +++ b/net.c @@ -1396,17 +1396,39 @@ static void tap_send(void *opaque) } while (size > 0); } -static void tap_set_sndbuf(TAPState *s, int sndbuf, Monitor *mon) -{ #ifdef TUNSETSNDBUF +/* sndbuf should be set to a value lower than the tx queue + * capacity of any destination network interface. + * Ethernet NICs generally have txqueuelen=1000, so 1Mb is + * a good default, given a 1500 byte MTU. + */ +#define TAP_DEFAULT_SNDBUF 1024*1024 + +static void tap_set_sndbuf(TAPState *s, const char *sndbuf_str, Monitor *mon) +{ + int sndbuf = TAP_DEFAULT_SNDBUF; + + if (sndbuf_str) { + sndbuf = atoi(sndbuf_str); + } + + if (!sndbuf) { + sndbuf = INT_MAX; + } + 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_set_sndbuf(TAPState *s, const char *sndbuf_str, Monitor *mon) +{ + if (sndbuf_str) { + config_error(mon, "No '-net tap,sndbuf=' support available\n"); + } } +#endif /* TUNSETSNDBUF */ static void tap_cleanup(VLANClientState *vc) { @@ -2654,9 +2676,11 @@ 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) { + const char *sndbuf_str = NULL; if (get_param_value(buf, sizeof(buf), "sndbuf", p)) { - tap_set_sndbuf(s, atoi(buf), mon); + sndbuf_str = buf; } + tap_set_sndbuf(s, sndbuf_str, mon); ret = 0; } else { ret = -1; diff --git a/qemu-options.hx b/qemu-options.hx index a94f9d38aa6b7ad992b02fa07184455a481b4966..8947d0539335eba6a1dade038fe5bc5f53fbe939 100644 --- a/qemu-options.hx +++ b/qemu-options.hx @@ -778,7 +778,8 @@ DEF("net", HAS_ARG, QEMU_OPTION_net, " 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" + " use 'sndbuf=nbytes' to limit the size of the send buffer; the\n" + " default of 'sndbuf=1048576' can be disabled using 'sndbuf=0'\n" #endif #endif "-net socket[,vlan=n][,name=str][,fd=h][,listen=[host]:port][,connect=host:port]\n"