virtio: fix the packed ring support 90/39990/2
authorMohsin Kazmi <sykazmi@cisco.com>
Fri, 16 Feb 2024 17:30:41 +0000 (17:30 +0000)
committerBeno�t Ganne <bganne@cisco.com>
Mon, 26 Feb 2024 16:15:48 +0000 (16:15 +0000)
Type: fix

Signed-off-by: Mohsin Kazmi <sykazmi@cisco.com>
Change-Id: If27702d2a9755e0e0a6eaeab4cf26b4974444b44

src/vnet/devices/virtio/node.c

index b329fdd..09478b1 100644 (file)
@@ -206,6 +206,19 @@ virtio_get_len (vnet_virtio_vring_t *vring, const int packed, const int hdr_sz,
     return vring->used->ring[last & mask].len - hdr_sz;
 }
 
+#define virtio_packed_check_n_left(vring, last)                               \
+  do                                                                          \
+    {                                                                         \
+      vnet_virtio_vring_packed_desc_t *d = &vring->packed_desc[last];         \
+      u16 flags = d->flags;                                                   \
+      if ((flags & VRING_DESC_F_AVAIL) != (vring->used_wrap_counter << 7) ||  \
+         (flags & VRING_DESC_F_USED) != (vring->used_wrap_counter << 15))    \
+       {                                                                     \
+         n_left = 0;                                                         \
+       }                                                                     \
+    }                                                                         \
+  while (0)
+
 #define increment_last(last, packed, vring)                                   \
   do                                                                          \
     {                                                                         \
@@ -261,6 +274,11 @@ virtio_device_input_gso_inline (vlib_main_t *vm, vlib_node_runtime_t *node,
   u16 n_left = virtio_n_left_to_process (vring, packed);
   vlib_buffer_t bt = {};
 
+  if (packed)
+    {
+      virtio_packed_check_n_left (vring, last);
+    }
+
   if (n_left == 0)
     return 0;