From 45d60492a425def70e2ee64de6c36327be429479 Mon Sep 17 00:00:00 2001 From: Matthew Smith Date: Wed, 18 Nov 2020 13:40:31 -0600 Subject: [PATCH] dpdk: patch broken virtio macro Type: fix In DPDK 20.08, the macro ASSIGN_UNLESS_EQUAL(), which is defined in the virtio PMD code, is broken. It does not actually set the variable that is passed in to the value that is passed in. It just assigns the value to a local variable that it declares. This results in virtqueue_clear_net_hdr() failing to clear the fields in the virtio net header. This can cause packets which were sent over an IPsec tunnel and are subsequently transmitted on a virtio interface to have garbage in the virtio net header. Apply a post-20.08 patch from upstream to fix it. Change-Id: Ic53e89d859db628e26a3c1988e53b626fede94d7 Signed-off-by: Matthew Smith --- ...o-fix-variable-assignment-in-helper-macro.patch | 42 ++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 build/external/patches/dpdk_20.08/0001-net-virtio-fix-variable-assignment-in-helper-macro.patch diff --git a/build/external/patches/dpdk_20.08/0001-net-virtio-fix-variable-assignment-in-helper-macro.patch b/build/external/patches/dpdk_20.08/0001-net-virtio-fix-variable-assignment-in-helper-macro.patch new file mode 100644 index 00000000000..a4c00b9f9b1 --- /dev/null +++ b/build/external/patches/dpdk_20.08/0001-net-virtio-fix-variable-assignment-in-helper-macro.patch @@ -0,0 +1,42 @@ +From a1412e05caa2678757156d4de2755ab5140ecc24 Mon Sep 17 00:00:00 2001 +From: Vipul Ashri +Date: Fri, 18 Sep 2020 15:25:04 +0530 +Subject: [PATCH] net/virtio: fix variable assignment in helper macro + +Inside Macro ASSIGN_UNLESS_EQUAL(var, val), assignment to var is always +failing as assignment done using var_ having local scope only. +This leads to TX packets not going out and found broken due to cleanup +malfunctioning. This patch fixes the wrong variable assignment. + +Fixes: 57f90f894588 ("net/virtio: reuse packed ring functions") +Cc: stable@dpdk.org + +Signed-off-by: Vipul Ashri +Acked-by: Andrew Rybchenko +Reviewed-by: Maxime Coquelin +--- + drivers/net/virtio/virtqueue.h | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/drivers/net/virtio/virtqueue.h b/drivers/net/virtio/virtqueue.h +index 105a9c00c..6ed50648c 100644 +--- a/drivers/net/virtio/virtqueue.h ++++ b/drivers/net/virtio/virtqueue.h +@@ -607,10 +607,10 @@ virtqueue_notify(struct virtqueue *vq) + + /* avoid write operation when necessary, to lessen cache issues */ + #define ASSIGN_UNLESS_EQUAL(var, val) do { \ +- typeof(var) var_ = (var); \ +- typeof(val) val_ = (val); \ +- if ((var_) != (val_)) \ +- (var_) = (val_); \ ++ typeof(var) *const var_ = &(var); \ ++ typeof(val) const val_ = (val); \ ++ if (*var_ != val_) \ ++ *var_ = val_; \ + } while (0) + + #define virtqueue_clear_net_hdr(hdr) do { \ +-- +2.18.4 + -- 2.16.6