From patchwork Thu Aug 30 14:27:06 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sameeh Jubran X-Patchwork-Id: 10581929 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 798A3174A for ; Thu, 30 Aug 2018 14:51:34 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 66E5D2C053 for ; Thu, 30 Aug 2018 14:51:34 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 5B2C72C063; Thu, 30 Aug 2018 14:51:34 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI,T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id BE3542C055 for ; Thu, 30 Aug 2018 14:51:33 +0000 (UTC) Received: from localhost ([::1]:49354 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fvOIH-0005xa-00 for patchwork-qemu-devel@patchwork.kernel.org; Thu, 30 Aug 2018 10:51:33 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33417) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fvOAP-000534-Be for qemu-devel@nongnu.org; Thu, 30 Aug 2018 10:43:28 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fvNur-0003dp-Fg for qemu-devel@nongnu.org; Thu, 30 Aug 2018 10:27:22 -0400 Received: from mail-wm0-x243.google.com ([2a00:1450:400c:c09::243]:53111) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fvNur-0003co-4P for qemu-devel@nongnu.org; Thu, 30 Aug 2018 10:27:21 -0400 Received: by mail-wm0-x243.google.com with SMTP id y139-v6so2197903wmc.2 for ; Thu, 30 Aug 2018 07:27:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=daynix-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=iytHfOxkjEX0q08ZncA6wx1hCFumvlH6HUYs4KjsBE0=; b=OyXzWY4/aF3Yvxtyv3jfoAG48QXAtR++V5Bj1VifiazkCjHr+MBDYoVQtHIGNEgHCi WSrWHJ1dqvMng1SA4youRByga1PgYXJre6HQQbO6qoLG2yUQb2nafxIFwuEUDMWhjt61 Kd7vjWbuCiUenoNozbRHz150zYLsfnP4S+Azq+XODea4StopnxgyEuEoe51FZmTcu1t9 m27zIGOBeohY/Hl9DH2X998B01ONgm7MY0XVQqo9bhDGmFB+vMKe3LoqN6WhNElG5l6l gh/9d55vZxpsUQ27nJx36mdOXaW94PPYDnIjQpg4efn6DXl7ecei44ZUworN4KqAkpzT LA2Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=iytHfOxkjEX0q08ZncA6wx1hCFumvlH6HUYs4KjsBE0=; b=evcXgSUlwBqbwttsY+CoNca1rB/aKy0HN9OUpffn+GwLp5AkKrMiTZhoi0pZTkZFb4 LPSADBWON53oVEGnqI3X6OZ7bfAWe+6qeZsVaEwixzOsQPEw87IIWWmSVr8/TR6ZAjVO 9yqamBvDKJJ+o9zedJDFdhs27tueoRd3Gw9ErB9XnGPMVghWjlI64tfRL/Y62Z/MAl7q +oT5yEMi6AiZ4Xmp1pN1SfHlkOTrHSyJpaT68/k6DMeT39BxvOBxzkIjoAdhgWH0qjhV TzepjqNpUPTaDK+RLl0OZ8ni0mLdk1A7oicAzNiB9Zz74FUSSOQEKSvkWfjQg+CCq5IF INVg== X-Gm-Message-State: APzg51BwtG/4vHXQoX1iSOc69TkK4j+HDTkegEUMf2hn9/EUqKlnb9Gi RaGtcARGnbaK12gGctL9YDVON5Js+iU= X-Google-Smtp-Source: ANB0VdZbvikkGlyY9apdXVMGOCsj/C54zH5eTT9mMvxqTbYJfq5ViUBmdc04rBqkNNus1+WXCdldxg== X-Received: by 2002:a1c:9290:: with SMTP id u138-v6mr2111689wmd.52.1535639239263; Thu, 30 Aug 2018 07:27:19 -0700 (PDT) Received: from bark.daynix ([141.226.163.173]) by smtp.gmail.com with ESMTPSA id t4-v6sm10483893wrb.45.2018.08.30.07.27.18 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 30 Aug 2018 07:27:18 -0700 (PDT) From: Sameeh Jubran To: qemu-devel@nongnu.org, Jason Wang Date: Thu, 30 Aug 2018 17:27:06 +0300 Message-Id: <20180830142708.14311-5-sameeh@daynix.com> X-Mailer: git-send-email 2.13.6 In-Reply-To: <20180830142708.14311-1-sameeh@daynix.com> References: <20180830142708.14311-1-sameeh@daynix.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c09::243 Subject: [Qemu-devel] [RFC 4/6] virtio-net: implement steering mode feature X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Yan Vugenfirer Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP From: Sameeh Jubran Signed-off-by: Sameeh Jubran --- hw/net/virtio-net.c | 65 +++++++++++++++++++++++++---- include/hw/virtio/virtio-net.h | 3 ++ include/standard-headers/linux/virtio_net.h | 55 ++++++++++++++++++++++++ 3 files changed, 116 insertions(+), 7 deletions(-) diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c index 90502fca7c..e7c4ce6f66 100644 --- a/hw/net/virtio-net.c +++ b/hw/net/virtio-net.c @@ -972,13 +972,53 @@ static int virtio_net_handle_mq(VirtIONet *n, uint8_t cmd, return VIRTIO_NET_OK; } +static int virtio_net_ctrl_steering_mode(VirtIONet *n, uint8_t cmd, + struct iovec *iov, unsigned int iov_cnt, + struct iovec *iov_in, unsigned int iov_cnt_in, + size_t *size_in) +{ + size_t s; + struct virtio_net_steering_mode sm; + + switch (cmd) { + case VIRTIO_NET_CTRL_SM_GET_SUPPORTED_MODES: + if (!size_in) { + return VIRTIO_NET_ERR; + } + s = iov_from_buf(iov_in, iov_cnt_in, 0, + &n->supported_modes, sizeof(n->supported_modes)); + if (s != sizeof(n->supported_modes) || + !size_in) { + return VIRTIO_NET_ERR; + } + *size_in = s; + break; + case VIRTIO_NET_CTRL_SM_CONTROL: + s = iov_to_buf(iov, iov_cnt, 0, &sm, sizeof(sm) - + sizeof(union command_data)); + if (s != sizeof(sm) - sizeof(union command_data)) { + return VIRTIO_NET_ERR; + } + /* switch (cmd) + { + dafault: + return VIRTIO_NET_ERR; + } */ + break; + default: + return VIRTIO_NET_ERR; + } + + return VIRTIO_NET_OK; +} + static void virtio_net_handle_ctrl(VirtIODevice *vdev, VirtQueue *vq) { VirtIONet *n = VIRTIO_NET(vdev); struct virtio_net_ctrl_hdr ctrl; virtio_net_ctrl_ack status = VIRTIO_NET_ERR; VirtQueueElement *elem; - size_t s; + size_t s, elem_in_size = 0; struct iovec *iov, *iov2; unsigned int iov_cnt; @@ -996,7 +1036,8 @@ static void virtio_net_handle_ctrl(VirtIODevice *vdev, VirtQueue *vq) } iov_cnt = elem->out_num; - iov2 = iov = g_memdup(elem->out_sg, sizeof(struct iovec) * elem->out_num); + iov2 = iov = g_memdup(elem->out_sg, sizeof(struct iovec) * + elem->out_num); s = iov_to_buf(iov, iov_cnt, 0, &ctrl, sizeof(ctrl)); iov_discard_front(&iov, &iov_cnt, sizeof(ctrl)); if (s != sizeof(ctrl)) { @@ -1013,12 +1054,20 @@ static void virtio_net_handle_ctrl(VirtIODevice *vdev, VirtQueue *vq) status = virtio_net_handle_mq(n, ctrl.cmd, iov, iov_cnt); } else if (ctrl.class == VIRTIO_NET_CTRL_GUEST_OFFLOADS) { status = virtio_net_handle_offloads(n, ctrl.cmd, iov, iov_cnt); + } else if (ctrl.class == VIRTIO_NET_CTRL_STEERING_MODE) { + size_t size_in = 0; + status = virtio_net_ctrl_steering_mode(n, ctrl.cmd, iov, iov_cnt, + elem->in_sg, elem->in_num, &size_in); + if (status == VIRTIO_NET_OK && size_in > 0) { + elem_in_size += size_in; + } } - s = iov_from_buf(elem->in_sg, elem->in_num, 0, &status, sizeof(status)); + s = iov_from_buf(elem->in_sg, elem->in_num, elem_in_size, &status, + sizeof(status)); assert(s == sizeof(status)); - - virtqueue_push(vq, elem, sizeof(status)); + elem_in_size += s; + virtqueue_push(vq, elem, elem_in_size); virtio_notify(vdev, vq); g_free(iov2); g_free(elem); @@ -1375,10 +1424,10 @@ static int32_t virtio_net_flush_tx(VirtIONetQueue *q) n->guest_hdr_len, -1); if (out_num == VIRTQUEUE_MAX_SIZE) { goto drop; - } + } out_num += 1; out_sg = sg2; - } + } } /* * If host wants to see the guest header as is, we can @@ -1957,6 +2006,8 @@ static void virtio_net_device_realize(DeviceState *dev, Error **errp) n->host_features |= (1ULL << VIRTIO_NET_F_MTU); } + n->host_features |= (1ULL << VIRTIO_NET_F_CTRL_STEERING_MODE); + if (n->net_conf.duplex_str) { if (strncmp(n->net_conf.duplex_str, "half", 5) == 0) { n->net_conf.duplex = DUPLEX_HALF; diff --git a/include/hw/virtio/virtio-net.h b/include/hw/virtio/virtio-net.h index a7b53edc96..809e85481c 100644 --- a/include/hw/virtio/virtio-net.h +++ b/include/hw/virtio/virtio-net.h @@ -102,6 +102,9 @@ typedef struct VirtIONet { int announce_counter; bool needs_vnet_hdr_swap; bool mtu_bypass_backend; + struct virtio_net_steering_modes supported_modes; + struct virtio_net_steering_modes current_mode; + struct virtio_net_rss_conf *rss_conf; } VirtIONet; void virtio_net_set_netclient_name(VirtIONet *n, const char *name, diff --git a/include/standard-headers/linux/virtio_net.h b/include/standard-headers/linux/virtio_net.h index e9f255ea3f..fa399b97ab 100644 --- a/include/standard-headers/linux/virtio_net.h +++ b/include/standard-headers/linux/virtio_net.h @@ -258,4 +258,59 @@ struct virtio_net_ctrl_mq { #define VIRTIO_NET_CTRL_GUEST_OFFLOADS 5 #define VIRTIO_NET_CTRL_GUEST_OFFLOADS_SET 0 + +#define RSS_HASH_FUNCTION_TOEPLITZ 0x1 +#define RSS_HASH_FUNCTION_SYMMETRIC 0x2 + +// Hash function fields +#define RSS_HASH_FIELDS_IPV4 0x00000100 +#define RSS_HASH_FIELDS_TCP_IPV4 0x00000200 +#define RSS_HASH_FIELDS_IPV6 0x00000400 +#define RSS_HASH_FIELDS_IPV6_EX 0x00000800 +#define RSS_HASH_FIELDS_TCP_IPV6 0x00001000 +#define RSS_HASH_FIELDS_TCP_IPV6_EX 0x00002000 + +struct virtio_net_rss_supported_hash{ +uint32_t hash_function; +}; + +struct virtio_net_rss_conf_ptrs { + uint8_t *hash_key; + uint32_t *indirection_table; +}; + +struct virtio_net_rss_conf { + uint32_t hash_function; + uint32_t hash_function_flags; + uint32_t hash_key_length; + uint32_t indirection_table_length; + struct virtio_net_rss_conf_ptrs ptrs; +}; + +#define VIRTIO_NET_SM_CTRL_RSS_GET_SUPPORTED_FUNCTIONS 0 +#define VIRTIO_NET_SM_CTRL_RSS_SET 1 + + +struct virtio_net_steering_modes { + uint32_t steering_modes; +}; + +union command_data { + struct virtio_net_rss_conf rss; +}; + +struct virtio_net_steering_mode { + uint32_t steering_mode; + uint32_t command; +}; + +#define VIRTIO_NET_F_CTRL_STEERING_MODE 60 + +#define VIRTIO_NET_CTRL_STEERING_MODE 7 +#define VIRTIO_NET_CTRL_SM_GET_SUPPORTED_MODES 0 +#define VIRTIO_NET_CTRL_SM_CONTROL 1 + +#define STEERING_MODE_AUTO 0x1 +#define STEERING_MODE_RSS 0x2 + #endif /* _LINUX_VIRTIO_NET_H */