All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sameeh Jubran <sameeh@daynix.com>
To: qemu-devel@nongnu.org, Jason Wang <jasowang@redhat.com>
Cc: Yan Vugenfirer <yan@daynix.com>
Subject: [Qemu-devel] [RFC 4/6] virtio-net: implement steering mode feature
Date: Thu, 30 Aug 2018 17:27:06 +0300	[thread overview]
Message-ID: <20180830142708.14311-5-sameeh@daynix.com> (raw)
In-Reply-To: <20180830142708.14311-1-sameeh@daynix.com>

From: Sameeh Jubran <sjubran@redhat.com>

Signed-off-by: Sameeh Jubran <sjubran@redhat.com>
---
 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 */
-- 
2.13.6

  parent reply	other threads:[~2018-08-30 14:43 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-08-30 14:27 [Qemu-devel] [RFC 0/6] Virtio-net: Support RSS Sameeh Jubran
2018-08-30 14:27 ` [Qemu-devel] [RFC 1/6] Add bpf support to qemu Sameeh Jubran
2018-09-03 11:59   ` Daniel P. Berrangé
2018-09-03 12:18     ` Sameeh Jubran
2018-09-03 12:24     ` Peter Maydell
2018-09-03 12:28       ` Sameeh Jubran
2018-09-03 12:29       ` Daniel P. Berrangé
2018-08-30 14:27 ` [Qemu-devel] [RFC 2/6] tap: Add support for bpf ioctls Sameeh Jubran
2018-08-30 15:21   ` Eric Blake
2018-09-03 11:34     ` Sameeh Jubran
2018-09-03  3:24   ` Jason Wang
2018-09-03 11:33     ` Sameeh Jubran
2018-08-30 14:27 ` [Qemu-devel] [RFC 3/6] vhost-net: Expose vhost_net_get_fd Sameeh Jubran
2018-09-03  3:24   ` Jason Wang
2018-09-03 11:56     ` Sameeh Jubran
2018-08-30 14:27 ` Sameeh Jubran [this message]
2018-09-03  3:34   ` [Qemu-devel] [RFC 4/6] virtio-net: implement steering mode feature Jason Wang
2018-09-03 12:51     ` Sameeh Jubran
2018-08-30 14:27 ` [Qemu-devel] [RFC 5/6] virtio-net: steering mode: Implement rss support Sameeh Jubran
2018-09-03  3:48   ` Jason Wang
2018-09-03 11:45     ` Sameeh Jubran
2018-08-30 14:27 ` [Qemu-devel] [RFC 6/6] virtio-net: rss: Add bpf filter Sameeh Jubran
2018-09-03  4:12   ` Jason Wang
2018-09-03 13:16     ` Sameeh Jubran
2018-09-04  3:03       ` Jason Wang
2018-09-03 11:54   ` Daniel P. Berrangé
2018-09-03 12:35     ` Sameeh Jubran
2018-09-03 12:49       ` Daniel P. Berrangé
2018-09-04  3:07     ` Jason Wang
2018-09-04  8:14       ` Daniel P. Berrangé
2018-09-06  5:26         ` Jason Wang
2018-10-04 13:30           ` Daniel P. Berrangé
2018-09-03 12:11   ` Daniel P. Berrangé
2018-09-04 20:11   ` Eric Blake
2018-09-03  4:15 ` [Qemu-devel] [RFC 0/6] Virtio-net: Support RSS Jason Wang
2018-09-03  9:52   ` Sameeh Jubran

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20180830142708.14311-5-sameeh@daynix.com \
    --to=sameeh@daynix.com \
    --cc=jasowang@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=yan@daynix.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.