From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58064) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VrRYI-0003IQ-RD for qemu-devel@nongnu.org; Fri, 13 Dec 2013 07:09:15 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VrRY8-0004A7-Vy for qemu-devel@nongnu.org; Fri, 13 Dec 2013 07:09:06 -0500 Received: from mail-ee0-x231.google.com ([2a00:1450:4013:c00::231]:35502) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VrRY8-00049z-Li for qemu-devel@nongnu.org; Fri, 13 Dec 2013 07:08:56 -0500 Received: by mail-ee0-f49.google.com with SMTP id c41so827911eek.22 for ; Fri, 13 Dec 2013 04:08:56 -0800 (PST) From: Vincenzo Maffione Date: Fri, 13 Dec 2013 13:05:02 +0100 Message-Id: <1386936303-7697-5-git-send-email-v.maffione@gmail.com> In-Reply-To: <1386936303-7697-1-git-send-email-v.maffione@gmail.com> References: <1386936303-7697-1-git-send-email-v.maffione@gmail.com> Subject: [Qemu-devel] [PATCH 4/5] net: add offloadings support to netmap backend List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: aliguori@amazon.com, marcel.a@redhat.com, jasowang@redhat.com, Vincenzo Maffione , lcapitulino@redhat.com, stefanha@redhat.com, dmitry@daynix.com, pbonzini@redhat.com, g.lettieri@iet.unipi.it, rizzo@iet.unipi.it Whit this patch, the netmap backend supports TSO/UFO/CSUM offloadings, and accepts the virtio-net header, similarly to what happens with TAP. The offloading callbacks in the NetClientInfo interface have been implemented. Signed-off-by: Vincenzo Maffione --- net/netmap.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 63 insertions(+), 1 deletion(-) diff --git a/net/netmap.c b/net/netmap.c index 0ccc497..f02a574 100644 --- a/net/netmap.c +++ b/net/netmap.c @@ -54,6 +54,7 @@ typedef struct NetmapState { bool read_poll; bool write_poll; struct iovec iov[IOV_MAX]; + int vnet_hdr_len; /* Current virtio-net header length. */ } NetmapState; #define D(format, ...) \ @@ -274,7 +275,7 @@ static ssize_t netmap_receive_iov(NetClientState *nc, return iov_size(iov, iovcnt); } - i = ring->cur; + last = i = ring->cur; avail = ring->avail; if (avail < iovcnt) { @@ -394,6 +395,60 @@ static void netmap_cleanup(NetClientState *nc) s->me.fd = -1; } +/* Offloading manipulation support callbacks. + * + * Currently we are simply able to pass the virtio-net header + * throughout the VALE switch, without modifying it or interpreting it. + * For this reason we are always able to support TSO/UFO/CSUM and + * different header lengths as long as two virtio-net-header-capable + * VMs are attached to the bridge. + */ +static bool netmap_has_ufo(NetClientState *nc) +{ + return true; +} + +static int netmap_has_vnet_hdr(NetClientState *nc) +{ + return true; +} + +static int netmap_has_vnet_hdr_len(NetClientState *nc, int len) +{ + return len >= 0 && len <= NETMAP_BDG_MAX_OFFSET; +} + +static void netmap_using_vnet_hdr(NetClientState *nc, bool enable) +{ +} + +static void netmap_set_offload(NetClientState *nc, int csum, int tso4, int tso6, + int ecn, int ufo) +{ +} + +static void netmap_set_vnet_hdr_len(NetClientState *nc, int len) +{ + NetmapState *s = DO_UPCAST(NetmapState, nc, nc); + int err; + struct nmreq req; + + /* Issue a NETMAP_BDG_OFFSET command to change the netmap adapter + offset of 'me->ifname'. */ + memset(&req, 0, sizeof(req)); + pstrcpy(req.nr_name, sizeof(req.nr_name), s->me.ifname); + req.nr_version = NETMAP_API; + req.nr_cmd = NETMAP_BDG_OFFSET; + req.nr_arg1 = len; + err = ioctl(s->me.fd, NIOCREGIF, &req); + if (err) { + error_report("Unable to execute NETMAP_BDG_OFFSET on %s: %s", + s->me.ifname, strerror(errno)); + } else { + /* Keep track of the current length, may be usefule in the future. */ + s->vnet_hdr_len = len; + } +} /* NetClientInfo methods */ static NetClientInfo net_netmap_info = { @@ -403,6 +458,12 @@ static NetClientInfo net_netmap_info = { .receive_iov = netmap_receive_iov, .poll = netmap_poll, .cleanup = netmap_cleanup, + .has_ufo = netmap_has_ufo, + .has_vnet_hdr = netmap_has_vnet_hdr, + .has_vnet_hdr_len = netmap_has_vnet_hdr_len, + .using_vnet_hdr = netmap_using_vnet_hdr, + .set_offload = netmap_set_offload, + .set_vnet_hdr_len = netmap_set_vnet_hdr_len, }; /* The exported init function @@ -428,6 +489,7 @@ int net_init_netmap(const NetClientOptions *opts, nc = qemu_new_net_client(&net_netmap_info, peer, "netmap", name); s = DO_UPCAST(NetmapState, nc, nc); s->me = me; + s->vnet_hdr_len = 0; netmap_read_poll(s, true); /* Initially only poll for reads. */ return 0; -- 1.8.5.1