From patchwork Fri Apr 22 01:39:34 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?b?Tmd1eeG7hW4gVGjDoWkgTmfhu41jIER1eQ==?= X-Patchwork-Id: 92496 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [140.186.70.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 962EE1007DA for ; Fri, 22 Apr 2011 11:39:58 +1000 (EST) Received: from localhost ([::1]:53574 helo=lists2.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QD5Lf-0001u1-6W for incoming@patchwork.ozlabs.org; Thu, 21 Apr 2011 21:39:55 -0400 Received: from eggs.gnu.org ([140.186.70.92]:44665) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QD5LX-0001tw-9W for qemu-devel@nongnu.org; Thu, 21 Apr 2011 21:39:48 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1QD5LV-00030O-Ti for qemu-devel@nongnu.org; Thu, 21 Apr 2011 21:39:47 -0400 Received: from mail-pv0-f173.google.com ([74.125.83.173]:51346) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QD5LV-00030K-Lo for qemu-devel@nongnu.org; Thu, 21 Apr 2011 21:39:45 -0400 Received: by pvg3 with SMTP id 3so174805pvg.4 for ; Thu, 21 Apr 2011 18:39:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:from:to:cc:subject:date:message-id:x-mailer :mime-version:content-type:content-transfer-encoding; bh=YbGC8LlkqHQGfV1uE+Gpflc2Nrnc2FICAVxi6aomr2A=; b=mo0lIagLqdVAc5P7+s4AfiNyEAgZA7pzc1euHZ9BQoRmLowb0T6TZx8D2W/rYFzYkf ytC5dCryjpfT6ZjsC17qZCugFL9CmysBerKoYxnFYwCsdZCzuHmGTVBbFhdP1qsmdhu5 tadlmwX/STDXc56EiErWgg6dgQfuI0fin7vqc= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=from:to:cc:subject:date:message-id:x-mailer:mime-version :content-type:content-transfer-encoding; b=N8ygdC5XQAK7zFd6o1ox4SYAPz9hYmDkprHCt+WFO39mq1ot5kKbFdq4ILpQ9ufacn DV7Qu9lRnQ5/fY6G7N8hGQs5Y0ubjNOfYcRFmOGpMmcuHWZul/NkzhGe3igB5iSPPxkO OTHHlZ3MxftqO3Lewm/4X2/FmyEpOOe5JUpBI= Received: by 10.68.46.196 with SMTP id x4mr846386pbm.376.1303436384019; Thu, 21 Apr 2011 18:39:44 -0700 (PDT) Received: from pclouds@gmail.com ([118.69.34.31]) by mx.google.com with ESMTPS id r6sm1656127pba.63.2011.04.21.18.39.39 (version=TLSv1/SSLv3 cipher=OTHER); Thu, 21 Apr 2011 18:39:42 -0700 (PDT) Received: by pclouds@gmail.com (sSMTP sendmail emulation); Fri, 22 Apr 2011 08:39:36 +0700 From: =?UTF-8?q?Nguy=E1=BB=85n=20Th=C3=A1i=20Ng=E1=BB=8Dc=20Duy?= To: qemu-devel@nongnu.org Date: Fri, 22 Apr 2011 08:39:34 +0700 Message-Id: <1303436374-23606-1-git-send-email-pclouds@gmail.com> X-Mailer: git-send-email 1.7.3.1.256.g2539c.dirty MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 2) X-Received-From: 74.125.83.173 Cc: =?UTF-8?q?Nguy=E1=BB=85n=20Th=C3=A1i=20Ng=E1=BB=8Dc=20Duy?= , Mark McLoughlin , Anthony Liguori Subject: [Qemu-devel] [PATCH] net/socket: remove hardcoded packet size in favor of new mtu parameter X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Also mention the default value 4096. Signed-off-by: Nguyễn Thái Ngọc Duy --- I have a driver that sends 4352 byte packets. Tested with tcp socket only. There's also 4096 byte buffers in vde, but I don't use/test it. net.c | 4 ++++ net/socket.c | 54 ++++++++++++++++++++++++++++++++++++++---------------- qemu-options.hx | 11 +++++++---- 3 files changed, 49 insertions(+), 20 deletions(-) diff --git a/net.c b/net.c index 4f777c3..74dffa3 100644 --- a/net.c +++ b/net.c @@ -1000,6 +1000,10 @@ static const struct { .name = "localaddr", .type = QEMU_OPT_STRING, .help = "source address for multicast packets", + }, { + .name = "mtu", + .type = QEMU_OPT_NUMBER, + .help = "MTU size", }, { /* end of list */ } }, diff --git a/net/socket.c b/net/socket.c index 7337f4f..99a9b39 100644 --- a/net/socket.c +++ b/net/socket.c @@ -38,7 +38,8 @@ typedef struct NetSocketState { int state; /* 0 = getting length, 1 = getting data */ unsigned int index; unsigned int packet_len; - uint8_t buf[4096]; + unsigned int mtu; + uint8_t *buf, *buf1; struct sockaddr_in dgram_dst; /* contains inet host and port destination iff connectionless (SOCK_DGRAM) */ } NetSocketState; @@ -47,6 +48,7 @@ typedef struct NetSocketListenState { char *model; char *name; int fd; + unsigned int mtu; } NetSocketListenState; /* XXX: we consider we can send the whole packet without blocking */ @@ -73,10 +75,10 @@ static void net_socket_send(void *opaque) NetSocketState *s = opaque; int size, err; unsigned l; - uint8_t buf1[4096]; + uint8_t *buf1 = s->buf1; const uint8_t *buf; - size = recv(s->fd, (void *)buf1, sizeof(buf1), 0); + size = recv(s->fd, (void *)buf1, s->mtu, 0); if (size < 0) { err = socket_error(); if (err != EWOULDBLOCK) @@ -111,7 +113,7 @@ static void net_socket_send(void *opaque) l = s->packet_len - s->index; if (l > size) l = size; - if (s->index + l <= sizeof(s->buf)) { + if (s->index + l <= s->mtu) { memcpy(s->buf + s->index, buf, l); } else { fprintf(stderr, "serious error: oversized packet received," @@ -138,7 +140,7 @@ static void net_socket_send_dgram(void *opaque) NetSocketState *s = opaque; int size; - size = recv(s->fd, (void *)s->buf, sizeof(s->buf), 0); + size = recv(s->fd, (void *)s->buf, s->mtu, 0); if (size < 0) return; if (size == 0) { @@ -238,6 +240,7 @@ static NetClientInfo net_dgram_socket_info = { }; static NetSocketState *net_socket_fd_init_dgram(VLANState *vlan, + unsigned int mtu, const char *model, const char *name, int fd, int is_connected) @@ -288,6 +291,10 @@ static NetSocketState *net_socket_fd_init_dgram(VLANState *vlan, s = DO_UPCAST(NetSocketState, nc, nc); + s->mtu = mtu; + s->buf = qemu_malloc(s->mtu); + s->buf1 = qemu_malloc(s->mtu); + s->fd = fd; qemu_set_fd_handler(s->fd, net_socket_send_dgram, NULL, s); @@ -312,6 +319,7 @@ static NetClientInfo net_socket_info = { }; static NetSocketState *net_socket_fd_init_stream(VLANState *vlan, + unsigned int mtu, const char *model, const char *name, int fd, int is_connected) @@ -325,6 +333,10 @@ static NetSocketState *net_socket_fd_init_stream(VLANState *vlan, s = DO_UPCAST(NetSocketState, nc, nc); + s->mtu = mtu; + s->buf = qemu_malloc(s->mtu); + s->buf1 = qemu_malloc(s->mtu); + s->fd = fd; if (is_connected) { @@ -335,7 +347,7 @@ static NetSocketState *net_socket_fd_init_stream(VLANState *vlan, return s; } -static NetSocketState *net_socket_fd_init(VLANState *vlan, +static NetSocketState *net_socket_fd_init(VLANState *vlan, unsigned int mtu, const char *model, const char *name, int fd, int is_connected) { @@ -348,13 +360,16 @@ static NetSocketState *net_socket_fd_init(VLANState *vlan, } switch(so_type) { case SOCK_DGRAM: - return net_socket_fd_init_dgram(vlan, model, name, fd, is_connected); + return net_socket_fd_init_dgram(vlan, mtu, model, name, + fd, is_connected); case SOCK_STREAM: - return net_socket_fd_init_stream(vlan, model, name, fd, is_connected); + return net_socket_fd_init_stream(vlan, mtu, model, name, + fd, is_connected); default: /* who knows ... this could be a eg. a pty, do warn and continue as stream */ fprintf(stderr, "qemu: warning: socket type=%d for fd=%d is not SOCK_DGRAM or SOCK_STREAM\n", so_type, fd); - return net_socket_fd_init_stream(vlan, model, name, fd, is_connected); + return net_socket_fd_init_stream(vlan, mtu, model, name, + fd, is_connected); } return NULL; } @@ -376,7 +391,7 @@ static void net_socket_accept(void *opaque) break; } } - s1 = net_socket_fd_init(s->vlan, s->model, s->name, fd, 1); + s1 = net_socket_fd_init(s->vlan, s->mtu, s->model, s->name, fd, 1); if (!s1) { closesocket(fd); } else { @@ -387,6 +402,7 @@ static void net_socket_accept(void *opaque) } static int net_socket_listen_init(VLANState *vlan, + unsigned int mtu, const char *model, const char *name, const char *host_str) @@ -425,11 +441,13 @@ static int net_socket_listen_init(VLANState *vlan, s->model = qemu_strdup(model); s->name = name ? qemu_strdup(name) : NULL; s->fd = fd; + s->mtu = mtu; qemu_set_fd_handler(fd, net_socket_accept, NULL, s); return 0; } static int net_socket_connect_init(VLANState *vlan, + unsigned int mtu, const char *model, const char *name, const char *host_str) @@ -470,7 +488,7 @@ static int net_socket_connect_init(VLANState *vlan, break; } } - s = net_socket_fd_init(vlan, model, name, fd, connected); + s = net_socket_fd_init(vlan, mtu, model, name, fd, connected); if (!s) return -1; snprintf(s->nc.info_str, sizeof(s->nc.info_str), @@ -480,6 +498,7 @@ static int net_socket_connect_init(VLANState *vlan, } static int net_socket_mcast_init(VLANState *vlan, + unsigned int mtu, const char *model, const char *name, const char *host_str, @@ -505,7 +524,7 @@ static int net_socket_mcast_init(VLANState *vlan, if (fd < 0) return -1; - s = net_socket_fd_init(vlan, model, name, fd, 0); + s = net_socket_fd_init(vlan, mtu, model, name, fd, 0); if (!s) return -1; @@ -523,6 +542,8 @@ int net_init_socket(QemuOpts *opts, const char *name, VLANState *vlan) { + unsigned int mtu = qemu_opt_get_number(opts, "mtu", 4096); + if (qemu_opt_get(opts, "fd")) { int fd; @@ -539,7 +560,7 @@ int net_init_socket(QemuOpts *opts, return -1; } - if (!net_socket_fd_init(vlan, "socket", name, fd, 1)) { + if (!net_socket_fd_init(vlan, mtu, "socket", name, fd, 1)) { close(fd); return -1; } @@ -556,7 +577,7 @@ int net_init_socket(QemuOpts *opts, listen = qemu_opt_get(opts, "listen"); - if (net_socket_listen_init(vlan, "socket", name, listen) == -1) { + if (net_socket_listen_init(vlan, mtu, "socket", name, listen) == -1) { return -1; } } else if (qemu_opt_get(opts, "connect")) { @@ -572,7 +593,7 @@ int net_init_socket(QemuOpts *opts, connect = qemu_opt_get(opts, "connect"); - if (net_socket_connect_init(vlan, "socket", name, connect) == -1) { + if (net_socket_connect_init(vlan, mtu, "socket", name, connect) == -1) { return -1; } } else if (qemu_opt_get(opts, "mcast")) { @@ -588,7 +609,8 @@ int net_init_socket(QemuOpts *opts, mcast = qemu_opt_get(opts, "mcast"); localaddr = qemu_opt_get(opts, "localaddr"); - if (net_socket_mcast_init(vlan, "socket", name, mcast, localaddr) == -1) { + if (net_socket_mcast_init(vlan, mtu, "socket", name, + mcast, localaddr) == -1) { return -1; } } else { diff --git a/qemu-options.hx b/qemu-options.hx index 677c550..abf6045 100644 --- a/qemu-options.hx +++ b/qemu-options.hx @@ -1093,9 +1093,9 @@ DEF("net", HAS_ARG, QEMU_OPTION_net, " use vhostforce=on to force vhost on for non-MSIX virtio guests\n" " use 'vhostfd=h' to connect to an already opened vhost net device\n" #endif - "-net socket[,vlan=n][,name=str][,fd=h][,listen=[host]:port][,connect=host:port]\n" + "-net socket[,vlan=n][,name=str][,fd=h][,listen=[host]:port][,connect=host:port][,mtu=mtu]\n" " connect the vlan 'n' to another VLAN using a socket connection\n" - "-net socket[,vlan=n][,name=str][,fd=h][,mcast=maddr:port[,localaddr=addr]]\n" + "-net socket[,vlan=n][,name=str][,fd=h][,mcast=maddr:port[,localaddr=addr]][,mtu=mtu]\n" " connect the vlan 'n' to multicast maddr and port\n" " use 'localaddr=addr' to specify the host address to send packets from\n" #ifdef CONFIG_VDE @@ -1271,7 +1271,7 @@ qemu linux.img -net nic,vlan=0 -net tap,vlan=0,ifname=tap0 \ -net nic,vlan=1 -net tap,vlan=1,ifname=tap1 @end example -@item -net socket[,vlan=@var{n}][,name=@var{name}][,fd=@var{h}] [,listen=[@var{host}]:@var{port}][,connect=@var{host}:@var{port}] +@item -net socket[,vlan=@var{n}][,name=@var{name}][,fd=@var{h}] [,listen=[@var{host}]:@var{port}][,connect=@var{host}:@var{port}][,mtu=@var{mtu}] Connect the VLAN @var{n} to a remote VLAN in another QEMU virtual machine using a TCP socket connection. If @option{listen} is @@ -1279,6 +1279,8 @@ specified, QEMU waits for incoming connections on @var{port} (@var{host} is optional). @option{connect} is used to connect to another QEMU instance using the @option{listen} option. @option{fd}=@var{h} specifies an already opened TCP socket. +MTU is 4096 by default. If a packet larger than MTU is received, the +connection will be disconnected. Example: @example @@ -1291,11 +1293,12 @@ qemu linux.img -net nic,macaddr=52:54:00:12:34:57 \ -net socket,connect=127.0.0.1:1234 @end example -@item -net socket[,vlan=@var{n}][,name=@var{name}][,fd=@var{h}][,mcast=@var{maddr}:@var{port}[,localaddr=@var{addr}]] +@item -net socket[,vlan=@var{n}][,name=@var{name}][,fd=@var{h}][,mcast=@var{maddr}:@var{port}[,localaddr=@var{addr}]][,mtu=@var{mtu}] Create a VLAN @var{n} shared with another QEMU virtual machines using a UDP multicast socket, effectively making a bus for every QEMU with same multicast address @var{maddr} and @var{port}. +MTU is 4096 by default. NOTES: @enumerate @item