VIRTIO_NET_F_HASH_REPORT allows to report hash values calculated on the
host. When VHOST_NET_F_VIRTIO_NET_HDR is employed, it will report no
hash values (i.e., the hash_report member is always set to
VIRTIO_NET_HASH_REPORT_NONE). Otherwise, the values reported by the
underlying socket will be reported.

VIRTIO_NET_F_HASH_REPORT requires VIRTIO_F_VERSION_1.

Signed-off-by: Akihiko Odaki <akihiko.od...@daynix.com>
---
 drivers/vhost/net.c | 16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c
index 9ad37c012189..ed1bf01a7fcf 100644
--- a/drivers/vhost/net.c
+++ b/drivers/vhost/net.c
@@ -73,6 +73,7 @@ enum {
        VHOST_NET_FEATURES = VHOST_FEATURES |
                         (1ULL << VHOST_NET_F_VIRTIO_NET_HDR) |
                         (1ULL << VIRTIO_NET_F_MRG_RXBUF) |
+                        (1ULL << VIRTIO_NET_F_HASH_REPORT) |
                         (1ULL << VIRTIO_F_ACCESS_PLATFORM) |
                         (1ULL << VIRTIO_F_RING_RESET)
 };
@@ -1604,10 +1605,13 @@ static int vhost_net_set_features(struct vhost_net *n, 
u64 features)
        size_t vhost_hlen, sock_hlen, hdr_len;
        int i;
 
-       hdr_len = (features & ((1ULL << VIRTIO_NET_F_MRG_RXBUF) |
-                              (1ULL << VIRTIO_F_VERSION_1))) ?
-                       sizeof(struct virtio_net_hdr_mrg_rxbuf) :
-                       sizeof(struct virtio_net_hdr);
+       if (features & (1ULL << VIRTIO_NET_F_HASH_REPORT))
+               hdr_len = sizeof(struct virtio_net_hdr_v1_hash);
+       else if (features & ((1ULL << VIRTIO_NET_F_MRG_RXBUF) |
+                            (1ULL << VIRTIO_F_VERSION_1)))
+               hdr_len = sizeof(struct virtio_net_hdr_mrg_rxbuf);
+       else
+               hdr_len = sizeof(struct virtio_net_hdr);
        if (features & (1 << VHOST_NET_F_VIRTIO_NET_HDR)) {
                /* vhost provides vnet_hdr */
                vhost_hlen = hdr_len;
@@ -1688,6 +1692,10 @@ static long vhost_net_ioctl(struct file *f, unsigned int 
ioctl,
                        return -EFAULT;
                if (features & ~VHOST_NET_FEATURES)
                        return -EOPNOTSUPP;
+               if ((features & ((1ULL << VIRTIO_F_VERSION_1) |
+                                (1ULL << VIRTIO_NET_F_HASH_REPORT))) ==
+                   (1ULL << VIRTIO_NET_F_HASH_REPORT))
+                       return -EINVAL;
                return vhost_net_set_features(n, features);
        case VHOST_GET_BACKEND_FEATURES:
                features = VHOST_NET_BACKEND_FEATURES;

-- 
2.47.1


Reply via email to