Message ID | 1363632224-27609-1-git-send-email-sfeldma@cumulusnetworks.com |
---|---|
State | New |
Headers | show |
On Mon, Mar 18, 2013 at 11:43:44AM -0700, sfeldma@cumulusnetworks.com wrote: > From: Scott Feldman <sfeldma@cumulusnetworks.com> > > Socket buffer sizes were hard-coded to 4K for VDE and socket netdevs. Bump this > up to 68K (ala tap netdev) to handle maximum GSO packet size (64k) plus plenty > of room for the ethernet and virtio_net headers. > > Originally, ran into this limitation when using -netdev UDP sockets to connect > VM-to-VM, where VM interface is configure with MTU=9000. (Using virtio_net > NIC model). Test is simple: ping -M do -s 8500 <target>. This test will > attempt to ping with unfragmented packet of given size. Without patch, size > is limited to < 4K (minus protocol hdrs). With patch, ping test works with pkt > size up to 9000 (again, minus protocol hdrs). > > v2: per Stefan, increase buf size to (4096+65536) as done in tap and apply > to vde and socket netdevs. > v1: increase buf size to 12K just for -netdev UDP sockets > > Signed-off-by: Scott Feldman <sfeldma@cumulusnetworks.com> > --- > include/net/net.h | 5 +++++ > net/net.c | 2 +- > net/socket.c | 4 ++-- > net/tap.c | 7 +------ > net/vde.c | 2 +- > 5 files changed, 10 insertions(+), 10 deletions(-) Thanks, applied to my net tree: https://github.com/stefanha/qemu/commits/net Stefan
diff --git a/include/net/net.h b/include/net/net.h index cb049a1..43d85a1 100644 --- a/include/net/net.h +++ b/include/net/net.h @@ -11,6 +11,11 @@ #define MAX_QUEUE_NUM 1024 +/* Maximum GSO packet size (64k) plus plenty of room for + * the ethernet and virtio_net headers + */ +#define NET_BUFSIZE (4096 + 65536) + struct MACAddr { uint8_t a[6]; }; diff --git a/net/net.c b/net/net.c index f3d67f8..7869161 100644 --- a/net/net.c +++ b/net/net.c @@ -497,7 +497,7 @@ ssize_t qemu_send_packet_raw(NetClientState *nc, const uint8_t *buf, int size) static ssize_t nc_sendv_compat(NetClientState *nc, const struct iovec *iov, int iovcnt) { - uint8_t buffer[4096]; + uint8_t buffer[NET_BUFSIZE]; size_t offset; offset = iov_to_buf(iov, iovcnt, 0, buffer, sizeof(buffer)); diff --git a/net/socket.c b/net/socket.c index 396dc8c..d004184 100644 --- a/net/socket.c +++ b/net/socket.c @@ -40,7 +40,7 @@ typedef struct NetSocketState { unsigned int index; unsigned int packet_len; unsigned int send_index; /* number of bytes sent (only SOCK_STREAM) */ - uint8_t buf[4096]; + uint8_t buf[NET_BUFSIZE]; struct sockaddr_in dgram_dst; /* contains inet host and port destination iff connectionless (SOCK_DGRAM) */ IOHandler *send_fn; /* differs between SOCK_STREAM/SOCK_DGRAM */ bool read_poll; /* waiting to receive data? */ @@ -146,7 +146,7 @@ static void net_socket_send(void *opaque) NetSocketState *s = opaque; int size, err; unsigned l; - uint8_t buf1[4096]; + uint8_t buf1[NET_BUFSIZE]; const uint8_t *buf; size = qemu_recv(s->fd, buf1, sizeof(buf1), 0); diff --git a/net/tap.c b/net/tap.c index daab350..75f1146 100644 --- a/net/tap.c +++ b/net/tap.c @@ -44,17 +44,12 @@ #include "hw/vhost_net.h" -/* Maximum GSO packet size (64k) plus plenty of room for - * the ethernet and virtio_net headers - */ -#define TAP_BUFSIZE (4096 + 65536) - typedef struct TAPState { NetClientState nc; int fd; char down_script[1024]; char down_script_arg[128]; - uint8_t buf[TAP_BUFSIZE]; + uint8_t buf[NET_BUFSIZE]; bool read_poll; bool write_poll; bool using_vnet_hdr; diff --git a/net/vde.c b/net/vde.c index 4dea32d..2a619fb 100644 --- a/net/vde.c +++ b/net/vde.c @@ -39,7 +39,7 @@ typedef struct VDEState { static void vde_to_qemu(void *opaque) { VDEState *s = opaque; - uint8_t buf[4096]; + uint8_t buf[NET_BUFSIZE]; int size; size = vde_recv(s->vde, (char *)buf, sizeof(buf), 0);