diff mbox series

[1/5] ebpf: pass and check RSS key length to the loader

Message ID 20220408122813.1357045-2-maxime.coquelin@redhat.com (mailing list archive)
State New, archived
Headers show
Series Vhost-user: add Virtio RSS support | expand

Commit Message

Maxime Coquelin April 8, 2022, 12:28 p.m. UTC
This patch is preliminary rework to support RSS with
Vhost-user backends. The Vhost-user implementation will
allow RSS hash key of 40 bytes or more as allowed by the
Virtio specification, whereas the eBPF-based Vhost-kernel
solution only supports 40 bytes keys.

This patch adds the RSS key length to the loader, and
validate it is 40 bytes before copying it.

Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com>
---
 ebpf/ebpf_rss-stub.c |  3 ++-
 ebpf/ebpf_rss.c      | 11 +++++++----
 ebpf/ebpf_rss.h      |  3 ++-
 hw/net/virtio-net.c  |  3 ++-
 4 files changed, 13 insertions(+), 7 deletions(-)
diff mbox series

Patch

diff --git a/ebpf/ebpf_rss-stub.c b/ebpf/ebpf_rss-stub.c
index e71e229190..ffc5c5574f 100644
--- a/ebpf/ebpf_rss-stub.c
+++ b/ebpf/ebpf_rss-stub.c
@@ -29,7 +29,8 @@  bool ebpf_rss_load(struct EBPFRSSContext *ctx)
 }
 
 bool ebpf_rss_set_all(struct EBPFRSSContext *ctx, struct EBPFRSSConfig *config,
-                      uint16_t *indirections_table, uint8_t *toeplitz_key)
+                      uint16_t *indirections_table, uint8_t *toeplitz_key,
+                      uint8_t key_len)
 {
     return false;
 }
diff --git a/ebpf/ebpf_rss.c b/ebpf/ebpf_rss.c
index 118c68da83..4a63854175 100644
--- a/ebpf/ebpf_rss.c
+++ b/ebpf/ebpf_rss.c
@@ -110,14 +110,16 @@  static bool ebpf_rss_set_indirections_table(struct EBPFRSSContext *ctx,
 }
 
 static bool ebpf_rss_set_toepliz_key(struct EBPFRSSContext *ctx,
-                                     uint8_t *toeplitz_key)
+                                     uint8_t *toeplitz_key,
+                                     size_t len)
 {
     uint32_t map_key = 0;
 
     /* prepare toeplitz key */
     uint8_t toe[VIRTIO_NET_RSS_MAX_KEY_SIZE] = {};
 
-    if (!ebpf_rss_is_loaded(ctx) || toeplitz_key == NULL) {
+    if (!ebpf_rss_is_loaded(ctx) || toeplitz_key == NULL ||
+            len != VIRTIO_NET_RSS_MAX_KEY_SIZE) {
         return false;
     }
     memcpy(toe, toeplitz_key, VIRTIO_NET_RSS_MAX_KEY_SIZE);
@@ -131,7 +133,8 @@  static bool ebpf_rss_set_toepliz_key(struct EBPFRSSContext *ctx,
 }
 
 bool ebpf_rss_set_all(struct EBPFRSSContext *ctx, struct EBPFRSSConfig *config,
-                      uint16_t *indirections_table, uint8_t *toeplitz_key)
+                      uint16_t *indirections_table, uint8_t *toeplitz_key,
+                      uint8_t key_len)
 {
     if (!ebpf_rss_is_loaded(ctx) || config == NULL ||
         indirections_table == NULL || toeplitz_key == NULL) {
@@ -147,7 +150,7 @@  bool ebpf_rss_set_all(struct EBPFRSSContext *ctx, struct EBPFRSSConfig *config,
         return false;
     }
 
-    if (!ebpf_rss_set_toepliz_key(ctx, toeplitz_key)) {
+    if (!ebpf_rss_set_toepliz_key(ctx, toeplitz_key, key_len)) {
         return false;
     }
 
diff --git a/ebpf/ebpf_rss.h b/ebpf/ebpf_rss.h
index bf3f2572c7..db23ccd25f 100644
--- a/ebpf/ebpf_rss.h
+++ b/ebpf/ebpf_rss.h
@@ -37,7 +37,8 @@  bool ebpf_rss_is_loaded(struct EBPFRSSContext *ctx);
 bool ebpf_rss_load(struct EBPFRSSContext *ctx);
 
 bool ebpf_rss_set_all(struct EBPFRSSContext *ctx, struct EBPFRSSConfig *config,
-                      uint16_t *indirections_table, uint8_t *toeplitz_key);
+                      uint16_t *indirections_table, uint8_t *toeplitz_key,
+                      uint8_t key_len);
 
 void ebpf_rss_unload(struct EBPFRSSContext *ctx);
 
diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
index 1067e72b39..73145d6390 100644
--- a/hw/net/virtio-net.c
+++ b/hw/net/virtio-net.c
@@ -1201,7 +1201,8 @@  static bool virtio_net_attach_epbf_rss(VirtIONet *n)
     rss_data_to_rss_config(&n->rss_data, &config);
 
     if (!ebpf_rss_set_all(&n->ebpf_rss, &config,
-                          n->rss_data.indirections_table, n->rss_data.key)) {
+                          n->rss_data.indirections_table, n->rss_data.key,
+                          VIRTIO_NET_RSS_MAX_KEY_SIZE)) {
         return false;
     }